todo-10-tool-registry-management.md 3.8 KB

Todo 10 Tool Registry Management Plan

Status: done

Result

Implemented by subagent and committed as 43b0cc8 feat: add tool registry management.

Main-session verification:

uv run pytest tests/test_event_agent.py tests/test_debug_runtime.py tests/test_websocket_api.py
uv run pytest

Results:

  • focused EventAgent/runtime/WebSocket tests: 20 passed, 1 warning in 0.26s
  • full suite: 23 passed, 1 warning in 0.27s

Goal

Replace the single hardcoded EventAgent tool checkbox with a backend tool registry and UI-managed loaded tools.

Why

The original requirement says the debug page must manage which tools are loaded in EventAgent. The MVP has only one hardcoded handoff_note checkbox and duplicated tool schema logic in runtime. This todo makes tools a backend-owned registry so UI and runtime share the same source of truth.

Scope

This todo covers:

  • A backend registry for available EventAgent tools.
  • An API endpoint that lists available tools and their schema/description.
  • Runtime tool schema lookup through the registry.
  • EventAgent execution through registered handlers.
  • Static UI rendering tool checkboxes from the API.
  • Tests for listing tools, selected-tool behavior, and UI request payload.

This todo does not cover:

  • User-authored Python tool plugins.
  • Persistent tool configuration.
  • Hot-reloading tools from files.
  • Adding tools beyond the existing handoff_note.

Files

  • Create: src/agent_lab/application/tools.py
  • Modify: src/agent_lab/application/event_agent.py
  • Modify: src/agent_lab/application/runtime.py
  • Modify: src/agent_lab/presentation/web.py
  • Modify: src/agent_lab/presentation/static/index.html
  • Modify: src/agent_lab/presentation/static/app.js
  • Modify/add tests in tests/test_event_agent.py, tests/test_debug_runtime.py, and tests/test_websocket_api.py.
  • Do not modify: docs/plans/todos.md.

Design

Create a small registry in application layer:

  • ToolDefinition: name, description, parameters, handler.
  • ToolRegistry.available_tools(): returns serializable public tool metadata.
  • ToolRegistry.chat_tools(enabled_names): returns OpenAI-compatible tool definitions for selected names.
  • ToolRegistry.handle(event): executes a registered tool and returns payload dict.

handoff_note remains the only registered MVP tool. Unknown or disabled tools should still produce tool replies with explicit JSON errors, preserving current runtime behavior.

DebugRuntime should accept an optional registry, defaulting to the built-in registry. EventAgent should also receive that registry. The runtime should stop building tool schemas manually.

GET /api/tools returns:

[
  {
    "name": "handoff_note",
    "description": "Send a note to the event agent.",
    "parameters": { "type": "object", "properties": { "message": { "type": "string" } }, "required": ["message"] }
  }
]

The static UI should fetch /api/tools on load, render a checkbox per tool, and send selected names in event_agent.enabled_tools.

Steps

  1. Add failing tests for:
    • GET /api/tools returns handoff_note metadata.
    • Runtime passes selected tool schemas from registry into ChatAgent.
    • EventAgent returns disabled/unknown errors through the registry path.
    • Static HTML/JS no longer hardcodes a tool-handoff-note checkbox dependency.
  2. Implement application/tools.py.
  3. Refactor EventAgent and DebugRuntime to use ToolRegistry.
  4. Add GET /api/tools.
  5. Update static UI to render tool checkboxes dynamically and preserve default checked state.
  6. Run:

    uv run pytest tests/test_event_agent.py tests/test_debug_runtime.py tests/test_websocket_api.py
    uv run pytest
    

Verification

Expected result:

  • Tool metadata comes from backend API.
  • Runtime and EventAgent use the same registry.
  • UI selected tool list still drives event_agent.enabled_tools.
  • Full suite passes.