You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
* Optimize tool inventory: merge redundant tools, improve descriptions
Reduce agent tool count from 44 to 41 by merging and removing redundant
tools that caused LLM selection confusion:
- Merge memory_recall into memory_search: add `category` parameter for
structured fact DB filtering, eliminating the confusion between two
tools that both "search memory"
- Merge set_heartbeat into set_cron: add `heartbeat` boolean parameter
to find-and-update existing heartbeat jobs
- Remove vault_status: fully redundant with vault_list
- Remove list_custom_skills: achievable with list_files
Additional improvements:
- Add wait_for_subagent skill for blocking on subagent completion
instead of polling read_shared_state
- Clarify browser_solve_captcha description (auto-detection vs manual)
- Improve list_shared_state description (previews vs full values)
- Improve read_agent_history description (workspace logs, not history)
- Add wait_for_subagent to _UNSAFE_SKILLS (no self-waiting)
- Update all documentation and tests
* Fix lint: break long line in wait_for_subagent return
* Fix bugs and edge cases found in principal review
- Fix wait_for_subagent: check `bb is not None` instead of
`bb.get("exists")` — read_blackboard returns raw BlackboardEntry
dict without an "exists" field, so the success path was dead code
- Fix memory_search category path: return explicit error when category
is set but memory_store is None, even if workspace_manager is
available (previously fell through to workspace search, ignoring
the caller's category filter intent)
- Fix memory_search category path: distinguish empty results (search
worked, nothing matched) from search failure (facts is None)
- Fix set_cron: validate that message is non-empty for non-heartbeat
cron jobs (was previously required, became optional as side effect
of the heartbeat merge)
- Fix vault_tool.py docstring: remove "check" reference to removed
vault_status
Tests added:
- memory_search category + no store + workspace (no fallthrough)
- memory_search category with no matching facts (empty, not error)
- set_cron heartbeat=True creates/updates (3 tests)
- set_cron regular requires non-empty message
- wait_for_subagent with no mesh_client
- wait_for_subagent with blackboard read failure
- wait_for_subagent with blackboard 404 (returns None)
- Clone registry excludes wait_for_subagent
Copy file name to clipboardExpand all lines: docs/agent-tools.md
+3-6Lines changed: 3 additions & 6 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -45,9 +45,8 @@ All agents use a single browser architecture: **Chrome + KasmVNC**. A Chromium i
45
45
46
46
| Tool | Parameters | Description |
47
47
|------|-----------|-------------|
48
-
|`memory_search`|`query`, `max_results`| Hybrid search across workspace files and structured DB |
48
+
|`memory_search`|`query`, `category`, `max_results`| Hybrid search across workspace files and structured DB. Provide `category` to search only the fact database filtered to that category.|
49
49
|`memory_save`|`content`| Save a fact to workspace daily log and structured memory |
50
-
|`memory_recall`|`query`, `category`, `max_results`| Semantic search with optional category filtering |
51
50
52
51
### Mesh / Fleet
53
52
@@ -73,8 +72,7 @@ All agents use a single browser architecture: **Chrome + KasmVNC**. A Chromium i
73
72
74
73
| Tool | Parameters | Description |
75
74
|------|-----------|-------------|
76
-
|`set_cron`|`schedule`, `message`| Schedule a recurring job (cron expression or interval) |
77
-
|`set_heartbeat`|`schedule`| Enable autonomous monitoring (probes run automatically) |
75
+
|`set_cron`|`schedule`, `message`, `heartbeat`| Schedule a recurring job (cron expression or interval). Set `heartbeat=true` to update your autonomous wakeup schedule. |
78
76
|`list_cron`| -- | List scheduled jobs |
79
77
|`remove_cron`|`job_id`| Remove a scheduled job |
80
78
@@ -89,7 +87,6 @@ All agents use a single browser architecture: **Chrome + KasmVNC**. A Chromium i
89
87
| Tool | Parameters | Description |
90
88
|------|-----------|-------------|
91
89
|`create_skill`|`name`, `code`| Write a new Python skill at runtime |
92
-
|`list_custom_skills`| -- | List all custom skills the agent has created |
93
90
|`reload_skills`| -- | Hot-reload all skills from disk |
94
91
|`spawn_agent`|`role`, `system_prompt`, `ttl`| Spawn an ephemeral sub-agent in a new container (default TTL: 3600s) |
95
92
@@ -103,6 +100,7 @@ Lightweight subagents that run inside the same process as the parent agent, shar
103
100
|------|-----------|-------------|
104
101
|`spawn_subagent`|`task`, `role`, `ttl_seconds`| Spawn a lightweight subagent for parallel subtask execution |
105
102
|`list_subagents`| -- | List active subagents spawned by this agent and their status |
103
+
|`wait_for_subagent`|`subagent_id`, `timeout`| Wait for a subagent to complete and return its result |
106
104
107
105
### Credential Vault
108
106
@@ -113,7 +111,6 @@ Agents never see credential values. All operations return opaque `$CRED{name}` h
113
111
|`vault_generate_secret`|`name`, `length`, `charset`| Generate a random secret and store it (returns handle only) |
114
112
|`vault_capture_from_page`|`name`, `selector` or `ref`| Read text from a browser element and store as credential |
115
113
|`vault_list`| -- | List credential names the agent can access (names only, filtered by permissions) |
116
-
|`vault_status`|`name`| Check if an accessible credential exists in the vault |
Copy file name to clipboardExpand all lines: docs/triggering.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -114,7 +114,7 @@ Cron tick
114
114
115
115
```
116
116
Agent: I'll monitor the system every 30 minutes.
117
-
→ set_heartbeat(schedule="every 30m")
117
+
→ set_cron(schedule="every 30m", heartbeat=true)
118
118
```
119
119
120
120
The probes (disk_usage, pending_signals, pending_tasks) run automatically -- you don't need to specify them. Define your escalation rules in `HEARTBEAT.md` instead.
@@ -294,6 +294,6 @@ The watcher polls at a configurable interval, tracks file modification times, an
294
294
| `src/host/server.py` | Webhook endpoints, cron management API |
295
295
| `src/host/orchestrator.py` | Workflow executor (triggered by pub/sub and webhooks) |
296
296
| `src/host/mesh.py` | PubSub system for event-driven triggering |
0 commit comments