picoclaw/pkg/tools
沈青川 e414b82ac3
fix(cron): publish agent response to outbound bus for cron-triggered jobs (#2100)
* fix(cron): publish agent response to outbound bus for cron-triggered jobs

When a cron job triggers agent execution via ProcessDirectWithChannel,
the agent response was silently discarded — the code assumed AgentLoop
would auto-publish it, but SendResponse is false on this path.

Delegate to PublishResponseIfNeeded (exported from AgentLoop) so the
response reaches the originating channel (e.g. Telegram) only when the
message tool did not already deliver content in the same round.

Also adds a "directive" message type to CronPayload, allowing cron jobs
to instruct the agent to execute a task rather than echo static text.

* fix(cron): add type validation and directive test coverage

Address reviewer blocking feedback:

1. Server-side whitelist for `type` parameter — the `enum` in
   Parameters() is only an LLM schema hint; any string was persisted.
   Now `addJob` rejects values other than "message" and "directive".

2. Comprehensive test coverage for the directive code path:
   - directive adds prompt prefix to ProcessDirectWithChannel
   - deliver=true + directive routes through agent (not direct publish)
   - directive prompt content, sessionKey, channel, chatID are correct
   - invalid type is rejected; valid types ("", "message", "directive") pass
   - deliver=true message type goes directly to bus (regression)
   - agent error path does not trigger publish (regression)

Also merge the two UpdateJob calls in addJob into one to avoid
redundant disk I/O (non-blocking suggestion from review).

* fix(cron): remove omitempty from CronPayload.Type for consistent JSON

Empty string and "message" are semantically equivalent defaults;
always serializing the field avoids asymmetric JSON output.

* test(cron): remove redundant test, strengthen error path coverage

- Remove ExecuteJobDirectivePassesCorrectContent: its assertions on
  sessionKey/channel/chatID duplicate ExecuteJobPublishesAgentResponse;
  its prompt check duplicates DirectiveAddsPromptPrefix.
- Strengthen DirectiveAddsPromptPrefix with exact prompt match and
  publish response assertion.
- Fix ReturnsErrorWithoutPublish: set non-empty stub response so the
  test verifies the error branch early-return, not the response==""
  guard.

* fix(ci): satisfy golines and gosmopolitan in cron code
2026-03-29 13:47:28 +08:00
..
base.go fix: eliminate data races on shared tool instances (#1080) 2026-03-05 09:57:33 +08:00
cron.go fix(cron): publish agent response to outbound bus for cron-triggered jobs (#2100) 2026-03-29 13:47:28 +08:00
cron_test.go fix(cron): publish agent response to outbound bus for cron-triggered jobs (#2100) 2026-03-29 13:47:28 +08:00
edit.go fix(tools): allow /dev/null redirection and add read/write sandbox split (#967) 2026-03-02 12:22:02 +08:00
edit_test.go fix(security): workspace sandbox avoid time-of-check/time-of-use (TOCTOU) races (#464) 2026-02-23 20:09:53 +11:00
filesystem.go feat(tool): overwrite flag in write_file (#1761) 2026-03-19 11:22:52 +08:00
filesystem_test.go feat(tool): overwrite flag in write_file (#1761) 2026-03-19 11:22:52 +08:00
i2c.go refactor: cleanup dead code and turn on dead code detection in CI (#515) 2026-02-24 21:52:25 +08:00
i2c_linux.go feat(linter): Fix govet linter 2026-02-20 22:35:16 +02:00
i2c_other.go feat(fmt): Run formatters 2026-02-18 21:48:23 +02:00
mcp_tool.go fix(tool): route binary outputs through the media pipeline. 2026-03-22 12:05:28 +01:00
mcp_tool_test.go fix(tool): route binary outputs through the media pipeline. 2026-03-22 12:05:28 +01:00
message.go fix: eliminate data races on shared tool instances (#1080) 2026-03-05 09:57:33 +08:00
message_test.go fix: eliminate data races on shared tool instances (#1080) 2026-03-05 09:57:33 +08:00
normalization.go fix(tool): route binary outputs through the media pipeline. 2026-03-22 12:05:28 +01:00
registry.go Merge pull request #1889 from afjcjsbx/fix/binary-tool-output-handling 2026-03-24 15:37:06 +01:00
registry_test.go fix(tool): route binary outputs through the media pipeline. 2026-03-22 12:05:28 +01:00
result.go Merge branch 'main' into fix/binary-tool-output-handling 2026-03-22 23:08:27 +01:00
result_test.go fix(tool): route binary outputs through the media pipeline. 2026-03-22 12:05:28 +01:00
search_tool.go feat(mcp): tool search tools (#1243) 2026-03-09 18:21:49 +01:00
search_tools_test.go feat(mcp): tool search tools (#1243) 2026-03-09 18:21:49 +01:00
send_file.go Merge branch 'main' into fix/binary-tool-output-handling 2026-03-23 13:16:23 +01:00
send_file_test.go Merge branch 'main' into fix/binary-tool-output-handling 2026-03-23 13:16:23 +01:00
session.go feat(tools): add exec tool enhancement with background execution and PTY support (#1752) 2026-03-25 21:02:49 +08:00
session_process_unix.go feat(tools): add exec tool enhancement with background execution and PTY support (#1752) 2026-03-25 21:02:49 +08:00
session_process_windows.go feat(tools): add exec tool enhancement with background execution and PTY support (#1752) 2026-03-25 21:02:49 +08:00
session_test.go feat(tools): add exec tool enhancement with background execution and PTY support (#1752) 2026-03-25 21:02:49 +08:00
shell.go feat(tools): add exec tool enhancement with background execution and PTY support (#1752) 2026-03-25 21:02:49 +08:00
shell_process_unix.go fix(exec): terminate process tree on timeout 2026-02-18 02:01:29 +08:00
shell_process_windows.go fix(exec): terminate process tree on timeout 2026-02-18 02:01:29 +08:00
shell_test.go feat(tools): add exec tool enhancement with background execution and PTY support (#1752) 2026-03-25 21:02:49 +08:00
shell_timeout_unix_test.go feat(tools): add exec tool enhancement with background execution and PTY support (#1752) 2026-03-25 21:02:49 +08:00
skills_install.go refactor(pkg): move atomic file write to dedicated fileutil package 2026-02-24 23:57:13 +08:00
skills_install_test.go feat(fmt): Fix formatting 2026-02-20 20:03:11 +02:00
skills_search.go feat(fmt): Fix formatting 2026-02-20 20:03:11 +02:00
skills_search_test.go feat(fmt): Fix formatting 2026-02-20 20:03:11 +02:00
spawn.go refactor: improve code readability and consistency across multiple files 2026-03-21 17:12:45 +08:00
spawn_status.go feat(tools): add SpawnStatusTool for reporting subagent statuses (#1540) 2026-03-17 14:41:43 +08:00
spawn_status_test.go feat(tools): add SpawnStatusTool for reporting subagent statuses (#1540) 2026-03-17 14:41:43 +08:00
spawn_test.go fix(tools): prevent nil pointer dereference in spawn tools 2026-03-19 13:51:11 +08:00
spi.go refactor: cleanup dead code and turn on dead code detection in CI (#515) 2026-02-24 21:52:25 +08:00
spi_linux.go feat(fmt): Run formatters 2026-02-18 21:48:23 +02:00
spi_other.go feat(fmt): Run formatters 2026-02-18 21:48:23 +02:00
subagent.go merge: resolve conflicts between refactor/agent and main 2026-03-22 19:21:58 +08:00
subagent_tool_test.go fix(tools): prevent nil pointer dereference in spawn tools 2026-03-19 13:51:11 +08:00
sysproc_unix.go feat(tools): add exec tool enhancement with background execution and PTY support (#1752) 2026-03-25 21:02:49 +08:00
sysproc_windows.go feat(tools): add exec tool enhancement with background execution and PTY support (#1752) 2026-03-25 21:02:49 +08:00
toolloop.go fix(tool): route binary outputs through the media pipeline. 2026-03-22 12:05:28 +01:00
types.go feat(tools): add exec tool enhancement with background execution and PTY support (#1752) 2026-03-25 21:02:49 +08:00
validate.go feat(tools): add tool argument schema validation before execution (#1877) 2026-03-24 18:35:56 +08:00
validate_test.go feat(tools): add tool argument schema validation before execution (#1877) 2026-03-24 18:35:56 +08:00
web.go fix lint 2026-03-26 21:33:43 +01:00
web_test.go feat(tools) range in web_search 2026-03-26 21:02:46 +01:00