be: catalog snapshot collector + GET /roster/assistant/catalog #1211

Closed
opened 2026-05-15 17:02:01 +00:00 by architect · 2 comments
Collaborator

Context

Part of the Agents Roster AI Assistant feature. The assistant must only propose skills/MCPs that exist in the current deployment, and must clearly flag any MCP requiring additional setup. To do that, the model call needs a catalog snapshot of what's actually installed.

This ticket is the catalog producer: it enumerates the world the assistant is allowed to draw from, hashes it, and exposes it both as a standalone endpoint (FE can display "you'd need to add MCP X") and as the input to the prompt builder.

Scope

Collector

A service-side function collectCatalog(): CatalogSnapshot that enumerates:

  • Skills — read from the live skills registry (whatever loads skills today; mirror that source)
  • MCP servers — both configured (set up by operator) and known-but-unconfigured (so assistant can suggest them with setup_required: true)
  • Tools — the built-in tool set; flag sensitive ones (Bash, Write, Edit, etc.)
  • Model tiers — current allow-list

Output matches CatalogSnapshot from #1210. The hash field is a stable digest of the snapshot contents — used to detect drift mid-session.

Endpoint

GET /roster/assistant/catalog returns the current CatalogSnapshot. No auth beyond whatever the rest of the roster API already enforces.

Caching

Snapshot is memoized in-process. Invalidated when:

  • A new MCP is configured (hook into existing MCP config write path)
  • A skill is added/removed (hook into skills registry)
  • TTL fallback: 5 minutes

Deliverables

  • collectCatalog() implementation + unit tests with fixture registries
  • GET /roster/assistant/catalog route + integration test
  • Invalidation hooks wired to MCP and skills mutations
  • catalog_hash is stable across calls when nothing changed, and changes when anything does

Notes for implementer

Don't reinvent registry access — find where skills and MCPs are already enumerated for the existing roster page and reuse those code paths.


Depends on: #1210 (uses CatalogSnapshot type)
Blocks: assistant prompt ticket (needs catalog input)

## Context Part of the **Agents Roster AI Assistant** feature. The assistant must only propose skills/MCPs that exist in the current deployment, and must clearly flag any MCP requiring additional setup. To do that, the model call needs a **catalog snapshot** of what's actually installed. This ticket is the catalog producer: it enumerates the world the assistant is allowed to draw from, hashes it, and exposes it both as a standalone endpoint (FE can display "you'd need to add MCP X") and as the input to the prompt builder. ## Scope ### Collector A service-side function `collectCatalog(): CatalogSnapshot` that enumerates: - **Skills** — read from the live skills registry (whatever loads skills today; mirror that source) - **MCP servers** — both *configured* (set up by operator) and *known-but-unconfigured* (so assistant can suggest them with `setup_required: true`) - **Tools** — the built-in tool set; flag sensitive ones (Bash, Write, Edit, etc.) - **Model tiers** — current allow-list Output matches `CatalogSnapshot` from #1210. The `hash` field is a stable digest of the snapshot contents — used to detect drift mid-session. ### Endpoint `GET /roster/assistant/catalog` returns the current `CatalogSnapshot`. No auth beyond whatever the rest of the roster API already enforces. ### Caching Snapshot is memoized in-process. Invalidated when: - A new MCP is configured (hook into existing MCP config write path) - A skill is added/removed (hook into skills registry) - TTL fallback: 5 minutes ## Deliverables - [ ] `collectCatalog()` implementation + unit tests with fixture registries - [ ] `GET /roster/assistant/catalog` route + integration test - [ ] Invalidation hooks wired to MCP and skills mutations - [ ] `catalog_hash` is stable across calls when nothing changed, and changes when anything does ## Notes for implementer Don't reinvent registry access — find where skills and MCPs are already enumerated for the existing roster page and reuse those code paths. --- **Depends on**: #1210 (uses `CatalogSnapshot` type) **Blocks**: assistant prompt ticket (needs catalog input)
Author
Collaborator

🤖 Auto-assigned to code-lead (heuristic: area:agents → code-lead (architecture-touching)). Reply /unassign to reroute.

🤖 Auto-assigned to **code-lead** (heuristic: area:agents → code-lead (architecture-touching)). Reply `/unassign` to reroute.
Collaborator

🦵 @charles kicked the queue — re-running implement on @code-lead.

🦵 @charles kicked the queue — re-running implement on @code-lead.
Sign in to join this conversation.
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
charles/agent-hooks#1211
No description provided.