Agent & Finding Tools¶
Agents are auto-registered on first use of any tool that takes an agent parameter; explicit registration adds a display name, type, and metadata. Findings are lightweight progress notes attached to tasks — the coordination-side complement to knowledge notes.
lithos_agent_register¶
Explicitly register an agent (optional — agents auto-register on first use).
lithos_agent_register(id: str, name: str | None = None,
type: str | None = None, metadata: dict | None = None)
| Name | Type | Description |
|---|---|---|
id |
string | Agent identifier (free-form string) |
name |
string | Human-friendly display name |
type |
string | Agent type, e.g. "claude-code", "agent-zero", "openclaw", "custom" |
metadata |
object | Additional metadata (capabilities, version, …) |
Returns: {"success": true, "created": true, "warnings": []} for a new agent; {"success": true, "created": false, "warnings": []} when the agent already existed (metadata updated, last_seen_at refreshed). Emits agent.registered.
Name collisions warn, never block. (since v0.5.0) When another active agent already has the same name (case-insensitive), warnings lists each one — "name 'Researcher' is also used by agent 'claude-code-researcher'". Registration still succeeds: distinct running instances legitimately share a display name. Registering an archived id clears its archived_at.
ID conventions: pick stable, descriptive ids — <harness>-<role> (claude-code-researcher) or <host>-<harness> work well. The id is your identity across knowledge authorship, claims, and findings.
lithos_agent_info¶
Get information about an agent.
Returns: { id, name, type, first_seen_at, last_seen_at, archived_at, metadata }, or null when the agent is unknown (note: not an error envelope). archived_at (since v0.5.0) is null while the agent is active; archived agents stay readable here even though they drop out of lithos_agent_list.
lithos_agent_list¶
List all known agents.
lithos_agent_list(type: str | None = None, active_since: str | None = None,
include_archived: bool = False)
| Name | Type | Description |
|---|---|---|
type |
string | Filter by agent type |
active_since |
string | Only agents seen since (ISO 8601; unparseable → invalid_input) |
include_archived |
bool | (since v0.5.0) Also list agents retired with lithos_agent_archive (default: active only) |
Returns: { "agents": [{ id, name, type, last_seen_at, archived_at }] } — archived_at is null for active agents.
lithos_agent_archive¶
(since v0.5.0) Retire an agent from the roster. Use it to clean up ids that were auto-registered by a single write and never seen again.
| Name | Type | Description |
|---|---|---|
id |
string | Agent to archive |
agent |
string | Agent performing the archive (audit trail; self-archive is allowed) |
Returns: {"success": true, "id": "…", "archived_at": "…", "already_archived": false}; idempotent — a second call returns already_archived: true with the original stamp. Unknown id → {status: "error", code: "agent_not_found"}. Emits agent.archived when newly archived.
What archiving does — and does not — do:
- The agent drops out of
lithos_agent_list(unlessinclude_archived=True) and out of theagentscount inlithos_stats. - Its history is untouched: tasks, claims, findings, and access-log rows still attribute to it, and
lithos_agent_infostill returns it (witharchived_atset). - Any activity resurrects it. Every write by that id — any tool that takes
agent, andlithos_agent_register— clearsarchived_at. "Archived" means exactly "no activity since archiving". This includes tool-name fallback ids such aslithos_edge_upsert, which an un-attributed edge upsert brings back.
lithos_finding_post¶
Post a finding to a task. Findings are the running log of what agents discovered while working a task — post them as you go, not just at the end.
| Name | Type | Description |
|---|---|---|
task_id |
string | Task ID (full id or unambiguous ≥6-char prefix) |
agent |
string | Your agent identifier |
summary |
string | Brief summary of the finding |
knowledge_id |
string | Optional link to a knowledge note (unique note prefix resolves; other values stored as given) |
Returns: {"finding_id": "…", "task_id": "<resolved-full-id>", "title": "…"} — title is null when a full-length task id is unknown (findings may be posted ahead of their task). Emits finding.posted.
Tip
For substantial findings, write a knowledge note first with lithos_write, then post the finding with knowledge_id linking to it — the finding stays scannable and the detail is searchable.
lithos_finding_list¶
List findings for a task.
| Name | Type | Description |
|---|---|---|
task_id |
string | Task ID (full id or unambiguous ≥6-char prefix) |
since |
string | Only findings after this time (ISO 8601; unparseable → invalid_input) |
Returns: { "findings": [{ id, agent, summary, knowledge_id, created_at }] }
Note: lithos_task_reopen auto-posts a durable [Reopened] finding recording the prior terminal status — it will show up in this list.