Summary
Third-party plugin developers using self.method for colon-syntax dispatch (e.g., todo_tool:create) will find it is always None. The framework's normalize_tool_request() correctly parses colon-syntax into tool_args["action"], but agent.py never passes this value to self.method.
All core framework tools (scheduler.py, skills_tool.py) already use kwargs.get("action") instead of self.method for dispatch. This convention is not documented anywhere, leading to confusion for plugin developers.
Evidence
Framework code path
helpers/extract_tools.py:38-41 — splits tool_name:action and puts action into tool_args["action"]
agent.py:886 — tool_method = None (initialized, never updated from parsed action)
agent.py:912 — passes method=tool_method (always None) to Tool constructor
helpers/tool.py:22 — self.method = method (always None)
Core tools using the convention
# tools/scheduler.py:26
action = kwargs.get("action") or tool.args.get("action") or ""
# tools/skills_tool.py:95
kwargs.get("action") or self.args.get("action") or ""
What self.method is used for
Only for logging/display in helpers/tool.py:64-67 — formatting the heading string. Never for dispatch.
Suggested Fix
Add a note to the plugin development documentation (_example profile's tool documentation or docs/developer/plugins.md) stating:
Colon-syntax tool dispatch: When using tool_name:action syntax, the action is passed via kwargs.get("action"), not self.method. Use kwargs.get("action") or self.method for maximum compatibility.
Impact
- Third-party plugin developers encounter silently broken dispatch
- No runtime error — tools just return "unknown method" or fall through
- Discovery requires tracing framework source code
Summary
Third-party plugin developers using
self.methodfor colon-syntax dispatch (e.g.,todo_tool:create) will find it is alwaysNone. The framework'snormalize_tool_request()correctly parses colon-syntax intotool_args["action"], butagent.pynever passes this value toself.method.All core framework tools (
scheduler.py,skills_tool.py) already usekwargs.get("action")instead ofself.methodfor dispatch. This convention is not documented anywhere, leading to confusion for plugin developers.Evidence
Framework code path
helpers/extract_tools.py:38-41— splitstool_name:actionand puts action intotool_args["action"]agent.py:886—tool_method = None(initialized, never updated from parsed action)agent.py:912— passesmethod=tool_method(alwaysNone) to Tool constructorhelpers/tool.py:22—self.method = method(alwaysNone)Core tools using the convention
What
self.methodis used forOnly for logging/display in
helpers/tool.py:64-67— formatting the heading string. Never for dispatch.Suggested Fix
Add a note to the plugin development documentation (
_exampleprofile's tool documentation ordocs/developer/plugins.md) stating:Impact