macro-agent 0.0.10 → 0.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.macro-agent/teams/self-driving/prompts/grinder.md +27 -0
- package/.macro-agent/teams/self-driving/prompts/judge.md +27 -0
- package/.macro-agent/teams/self-driving/prompts/planner.md +33 -0
- package/.macro-agent/teams/self-driving/roles/grinder.yaml +17 -0
- package/.macro-agent/teams/self-driving/roles/judge.yaml +24 -0
- package/.macro-agent/teams/self-driving/roles/planner.yaml +18 -0
- package/.macro-agent/teams/self-driving/team.yaml +103 -0
- package/.macro-agent/teams/structured/prompts/developer.md +26 -0
- package/.macro-agent/teams/structured/prompts/lead.md +25 -0
- package/.macro-agent/teams/structured/prompts/reviewer.md +24 -0
- package/.macro-agent/teams/structured/roles/developer.yaml +12 -0
- package/.macro-agent/teams/structured/roles/lead.yaml +11 -0
- package/.macro-agent/teams/structured/roles/reviewer.yaml +19 -0
- package/.macro-agent/teams/structured/team.yaml +89 -0
- package/.sudocode/issues.jsonl +56 -51
- package/.sudocode/specs.jsonl +8 -1
- package/CLAUDE.md +121 -30
- package/README.md +60 -3
- package/dist/acp/macro-agent.d.ts +4 -0
- package/dist/acp/macro-agent.d.ts.map +1 -1
- package/dist/acp/macro-agent.js +50 -4
- package/dist/acp/macro-agent.js.map +1 -1
- package/dist/acp/session-mapper.d.ts +20 -1
- package/dist/acp/session-mapper.d.ts.map +1 -1
- package/dist/acp/session-mapper.js +90 -1
- package/dist/acp/session-mapper.js.map +1 -1
- package/dist/acp/types.d.ts +24 -1
- package/dist/acp/types.d.ts.map +1 -1
- package/dist/acp/types.js.map +1 -1
- package/dist/agent/agent-manager.d.ts +40 -1
- package/dist/agent/agent-manager.d.ts.map +1 -1
- package/dist/agent/agent-manager.js +172 -8
- package/dist/agent/agent-manager.js.map +1 -1
- package/dist/agent/types.d.ts +22 -0
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/agent/wake.d.ts +15 -0
- package/dist/agent/wake.d.ts.map +1 -1
- package/dist/agent/wake.js +15 -0
- package/dist/agent/wake.js.map +1 -1
- package/dist/agent-detection/command-builder.d.ts +30 -0
- package/dist/agent-detection/command-builder.d.ts.map +1 -0
- package/dist/agent-detection/command-builder.js +71 -0
- package/dist/agent-detection/command-builder.js.map +1 -0
- package/dist/agent-detection/detector.d.ts +84 -0
- package/dist/agent-detection/detector.d.ts.map +1 -0
- package/dist/agent-detection/detector.js +240 -0
- package/dist/agent-detection/detector.js.map +1 -0
- package/dist/agent-detection/index.d.ts +12 -0
- package/dist/agent-detection/index.d.ts.map +1 -0
- package/dist/agent-detection/index.js +14 -0
- package/dist/agent-detection/index.js.map +1 -0
- package/dist/agent-detection/registry.d.ts +53 -0
- package/dist/agent-detection/registry.d.ts.map +1 -0
- package/dist/agent-detection/registry.js +177 -0
- package/dist/agent-detection/registry.js.map +1 -0
- package/dist/agent-detection/types.d.ts +121 -0
- package/dist/agent-detection/types.d.ts.map +1 -0
- package/dist/agent-detection/types.js +20 -0
- package/dist/agent-detection/types.js.map +1 -0
- package/dist/api/server.d.ts +5 -1
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +362 -0
- package/dist/api/server.js.map +1 -1
- package/dist/api/types.d.ts +50 -1
- package/dist/api/types.d.ts.map +1 -1
- package/dist/cli/acp.d.ts +2 -0
- package/dist/cli/acp.d.ts.map +1 -1
- package/dist/cli/acp.js +8 -1
- package/dist/cli/acp.js.map +1 -1
- package/dist/cli/index.js +29 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/mcp.js +38 -0
- package/dist/cli/mcp.js.map +1 -1
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +2 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/project-config.d.ts +46 -0
- package/dist/config/project-config.d.ts.map +1 -0
- package/dist/config/project-config.js +68 -0
- package/dist/config/project-config.js.map +1 -0
- package/dist/lifecycle/cascade.d.ts +1 -1
- package/dist/lifecycle/cascade.d.ts.map +1 -1
- package/dist/lifecycle/handlers/index.d.ts +4 -0
- package/dist/lifecycle/handlers/index.d.ts.map +1 -1
- package/dist/lifecycle/handlers/index.js +2 -0
- package/dist/lifecycle/handlers/index.js.map +1 -1
- package/dist/lifecycle/handlers/worker.d.ts +4 -0
- package/dist/lifecycle/handlers/worker.d.ts.map +1 -1
- package/dist/lifecycle/handlers/worker.js +35 -3
- package/dist/lifecycle/handlers/worker.js.map +1 -1
- package/dist/mail/conversation-map.d.ts +33 -0
- package/dist/mail/conversation-map.d.ts.map +1 -0
- package/dist/mail/conversation-map.js +61 -0
- package/dist/mail/conversation-map.js.map +1 -0
- package/dist/mail/index.d.ts +11 -0
- package/dist/mail/index.d.ts.map +1 -0
- package/dist/mail/index.js +11 -0
- package/dist/mail/index.js.map +1 -0
- package/dist/mail/mail-service.d.ts +85 -0
- package/dist/mail/mail-service.d.ts.map +1 -0
- package/dist/mail/mail-service.js +121 -0
- package/dist/mail/mail-service.js.map +1 -0
- package/dist/mail/stores/eventstore-conversation-store.d.ts +40 -0
- package/dist/mail/stores/eventstore-conversation-store.d.ts.map +1 -0
- package/dist/mail/stores/eventstore-conversation-store.js +131 -0
- package/dist/mail/stores/eventstore-conversation-store.js.map +1 -0
- package/dist/mail/stores/eventstore-participant-store.d.ts +43 -0
- package/dist/mail/stores/eventstore-participant-store.d.ts.map +1 -0
- package/dist/mail/stores/eventstore-participant-store.js +145 -0
- package/dist/mail/stores/eventstore-participant-store.js.map +1 -0
- package/dist/mail/stores/eventstore-thread-store.d.ts +46 -0
- package/dist/mail/stores/eventstore-thread-store.d.ts.map +1 -0
- package/dist/mail/stores/eventstore-thread-store.js +118 -0
- package/dist/mail/stores/eventstore-thread-store.js.map +1 -0
- package/dist/mail/stores/eventstore-turn-store.d.ts +47 -0
- package/dist/mail/stores/eventstore-turn-store.d.ts.map +1 -0
- package/dist/mail/stores/eventstore-turn-store.js +153 -0
- package/dist/mail/stores/eventstore-turn-store.js.map +1 -0
- package/dist/mail/stores/index.d.ts +12 -0
- package/dist/mail/stores/index.d.ts.map +1 -0
- package/dist/mail/stores/index.js +12 -0
- package/dist/mail/stores/index.js.map +1 -0
- package/dist/mail/stores/types.d.ts +146 -0
- package/dist/mail/stores/types.d.ts.map +1 -0
- package/dist/mail/stores/types.js +13 -0
- package/dist/mail/stores/types.js.map +1 -0
- package/dist/mail/turn-recorder.d.ts +30 -0
- package/dist/mail/turn-recorder.d.ts.map +1 -0
- package/dist/mail/turn-recorder.js +98 -0
- package/dist/mail/turn-recorder.js.map +1 -0
- package/dist/map/adapter/acp-over-map.d.ts.map +1 -1
- package/dist/map/adapter/acp-over-map.js +32 -2
- package/dist/map/adapter/acp-over-map.js.map +1 -1
- package/dist/map/adapter/event-translator.d.ts.map +1 -1
- package/dist/map/adapter/event-translator.js +4 -0
- package/dist/map/adapter/event-translator.js.map +1 -1
- package/dist/map/adapter/extensions/agent-detection.d.ts +49 -0
- package/dist/map/adapter/extensions/agent-detection.d.ts.map +1 -0
- package/dist/map/adapter/extensions/agent-detection.js +91 -0
- package/dist/map/adapter/extensions/agent-detection.js.map +1 -0
- package/dist/map/adapter/extensions/index.d.ts +10 -1
- package/dist/map/adapter/extensions/index.d.ts.map +1 -1
- package/dist/map/adapter/extensions/index.js +39 -0
- package/dist/map/adapter/extensions/index.js.map +1 -1
- package/dist/map/adapter/extensions/resume.d.ts +47 -0
- package/dist/map/adapter/extensions/resume.d.ts.map +1 -0
- package/dist/map/adapter/extensions/resume.js +59 -0
- package/dist/map/adapter/extensions/resume.js.map +1 -0
- package/dist/map/adapter/extensions/workspace-files.d.ts +42 -0
- package/dist/map/adapter/extensions/workspace-files.d.ts.map +1 -0
- package/dist/map/adapter/extensions/workspace-files.js +338 -0
- package/dist/map/adapter/extensions/workspace-files.js.map +1 -0
- package/dist/map/adapter/mail-handler-adapter.d.ts +27 -0
- package/dist/map/adapter/mail-handler-adapter.d.ts.map +1 -0
- package/dist/map/adapter/mail-handler-adapter.js +292 -0
- package/dist/map/adapter/mail-handler-adapter.js.map +1 -0
- package/dist/map/adapter/map-adapter.d.ts +34 -10
- package/dist/map/adapter/map-adapter.d.ts.map +1 -1
- package/dist/map/adapter/map-adapter.js +110 -14
- package/dist/map/adapter/map-adapter.js.map +1 -1
- package/dist/map/adapter/rpc-handler.d.ts +4 -1
- package/dist/map/adapter/rpc-handler.d.ts.map +1 -1
- package/dist/map/adapter/rpc-handler.js +6 -0
- package/dist/map/adapter/rpc-handler.js.map +1 -1
- package/dist/map/index.d.ts +1 -0
- package/dist/map/index.d.ts.map +1 -1
- package/dist/map/index.js +2 -0
- package/dist/map/index.js.map +1 -1
- package/dist/map/types.d.ts +3 -1
- package/dist/map/types.d.ts.map +1 -1
- package/dist/map/types.js.map +1 -1
- package/dist/mcp/mcp-server.d.ts +6 -0
- package/dist/mcp/mcp-server.d.ts.map +1 -1
- package/dist/mcp/mcp-server.js +45 -0
- package/dist/mcp/mcp-server.js.map +1 -1
- package/dist/mcp/tools/claim_task.d.ts +35 -0
- package/dist/mcp/tools/claim_task.d.ts.map +1 -0
- package/dist/mcp/tools/claim_task.js +58 -0
- package/dist/mcp/tools/claim_task.js.map +1 -0
- package/dist/mcp/tools/done.d.ts +15 -2
- package/dist/mcp/tools/done.d.ts.map +1 -1
- package/dist/mcp/tools/done.js +45 -10
- package/dist/mcp/tools/done.js.map +1 -1
- package/dist/mcp/tools/list_claimable_tasks.d.ts +38 -0
- package/dist/mcp/tools/list_claimable_tasks.d.ts.map +1 -0
- package/dist/mcp/tools/list_claimable_tasks.js +63 -0
- package/dist/mcp/tools/list_claimable_tasks.js.map +1 -0
- package/dist/mcp/tools/unclaim_task.d.ts +31 -0
- package/dist/mcp/tools/unclaim_task.d.ts.map +1 -0
- package/dist/mcp/tools/unclaim_task.js +47 -0
- package/dist/mcp/tools/unclaim_task.js.map +1 -0
- package/dist/metrics/index.d.ts +2 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +2 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/metrics.d.ts +79 -0
- package/dist/metrics/metrics.d.ts.map +1 -0
- package/dist/metrics/metrics.js +166 -0
- package/dist/metrics/metrics.js.map +1 -0
- package/dist/roles/capabilities.d.ts +1 -0
- package/dist/roles/capabilities.d.ts.map +1 -1
- package/dist/roles/capabilities.js +3 -0
- package/dist/roles/capabilities.js.map +1 -1
- package/dist/roles/types.d.ts +1 -1
- package/dist/roles/types.d.ts.map +1 -1
- package/dist/router/channels.d.ts +2 -4
- package/dist/router/channels.d.ts.map +1 -1
- package/dist/router/channels.js.map +1 -1
- package/dist/router/message-router.d.ts +85 -9
- package/dist/router/message-router.d.ts.map +1 -1
- package/dist/router/message-router.js +203 -14
- package/dist/router/message-router.js.map +1 -1
- package/dist/router/role-resolver.d.ts +10 -1
- package/dist/router/role-resolver.d.ts.map +1 -1
- package/dist/router/role-resolver.js +15 -1
- package/dist/router/role-resolver.js.map +1 -1
- package/dist/router/types.d.ts +30 -1
- package/dist/router/types.d.ts.map +1 -1
- package/dist/router/types.js.map +1 -1
- package/dist/server/combined-server.d.ts +6 -0
- package/dist/server/combined-server.d.ts.map +1 -1
- package/dist/server/combined-server.js +24 -2
- package/dist/server/combined-server.js.map +1 -1
- package/dist/store/event-store.d.ts +14 -1
- package/dist/store/event-store.d.ts.map +1 -1
- package/dist/store/event-store.js +456 -4
- package/dist/store/event-store.js.map +1 -1
- package/dist/store/types/agents.d.ts +1 -1
- package/dist/store/types/agents.d.ts.map +1 -1
- package/dist/store/types/conversations.d.ts +91 -0
- package/dist/store/types/conversations.d.ts.map +1 -0
- package/dist/store/types/conversations.js +8 -0
- package/dist/store/types/conversations.js.map +1 -0
- package/dist/store/types/events.d.ts +1 -1
- package/dist/store/types/events.d.ts.map +1 -1
- package/dist/store/types/events.js.map +1 -1
- package/dist/store/types/index.d.ts +2 -0
- package/dist/store/types/index.d.ts.map +1 -1
- package/dist/store/types/index.js +2 -0
- package/dist/store/types/index.js.map +1 -1
- package/dist/store/types/sessions.d.ts +44 -0
- package/dist/store/types/sessions.d.ts.map +1 -0
- package/dist/store/types/sessions.js +9 -0
- package/dist/store/types/sessions.js.map +1 -0
- package/dist/store/types/tasks.d.ts +2 -0
- package/dist/store/types/tasks.d.ts.map +1 -1
- package/dist/task/backend/memory.d.ts +4 -1
- package/dist/task/backend/memory.d.ts.map +1 -1
- package/dist/task/backend/memory.js +81 -0
- package/dist/task/backend/memory.js.map +1 -1
- package/dist/task/backend/types.d.ts +30 -0
- package/dist/task/backend/types.d.ts.map +1 -1
- package/dist/task/backend/types.js.map +1 -1
- package/dist/teams/index.d.ts +4 -0
- package/dist/teams/index.d.ts.map +1 -0
- package/dist/teams/index.js +4 -0
- package/dist/teams/index.js.map +1 -0
- package/dist/teams/team-loader.d.ts +20 -0
- package/dist/teams/team-loader.d.ts.map +1 -0
- package/dist/teams/team-loader.js +293 -0
- package/dist/teams/team-loader.js.map +1 -0
- package/dist/teams/team-runtime.d.ts +139 -0
- package/dist/teams/team-runtime.d.ts.map +1 -0
- package/dist/teams/team-runtime.js +613 -0
- package/dist/teams/team-runtime.js.map +1 -0
- package/dist/teams/types.d.ts +266 -0
- package/dist/teams/types.d.ts.map +1 -0
- package/dist/teams/types.js +20 -0
- package/dist/teams/types.js.map +1 -0
- package/dist/trigger/router/trigger-router.d.ts +30 -3
- package/dist/trigger/router/trigger-router.d.ts.map +1 -1
- package/dist/trigger/router/trigger-router.js +30 -3
- package/dist/trigger/router/trigger-router.js.map +1 -1
- package/dist/trigger/wake/types.d.ts +31 -5
- package/dist/trigger/wake/types.d.ts.map +1 -1
- package/dist/trigger/wake/types.js +19 -0
- package/dist/trigger/wake/types.js.map +1 -1
- package/dist/workspace/dataplane-adapter.d.ts +1 -1
- package/dist/workspace/dataplane-adapter.d.ts.map +1 -1
- package/dist/workspace/dataplane-adapter.js +1 -1
- package/dist/workspace/dataplane-adapter.js.map +1 -1
- package/dist/workspace/index.d.ts +1 -1
- package/dist/workspace/index.d.ts.map +1 -1
- package/dist/workspace/strategies/index.d.ts +6 -0
- package/dist/workspace/strategies/index.d.ts.map +1 -0
- package/dist/workspace/strategies/index.js +5 -0
- package/dist/workspace/strategies/index.js.map +1 -0
- package/dist/workspace/strategies/optimistic.d.ts +26 -0
- package/dist/workspace/strategies/optimistic.d.ts.map +1 -0
- package/dist/workspace/strategies/optimistic.js +121 -0
- package/dist/workspace/strategies/optimistic.js.map +1 -0
- package/dist/workspace/strategies/queue.d.ts +26 -0
- package/dist/workspace/strategies/queue.d.ts.map +1 -0
- package/dist/workspace/strategies/queue.js +67 -0
- package/dist/workspace/strategies/queue.js.map +1 -0
- package/dist/workspace/strategies/registry.d.ts +37 -0
- package/dist/workspace/strategies/registry.d.ts.map +1 -0
- package/dist/workspace/strategies/registry.js +63 -0
- package/dist/workspace/strategies/registry.js.map +1 -0
- package/dist/workspace/strategies/trunk.d.ts +20 -0
- package/dist/workspace/strategies/trunk.d.ts.map +1 -0
- package/dist/workspace/strategies/trunk.js +108 -0
- package/dist/workspace/strategies/trunk.js.map +1 -0
- package/dist/workspace/strategies/types.d.ts +104 -0
- package/dist/workspace/strategies/types.d.ts.map +1 -0
- package/dist/workspace/strategies/types.js +11 -0
- package/dist/workspace/strategies/types.js.map +1 -0
- package/dist/workspace/types.d.ts +1 -1
- package/dist/workspace/types.d.ts.map +1 -1
- package/dist/workspace/workspace-manager.d.ts +1 -1
- package/dist/workspace/workspace-manager.d.ts.map +1 -1
- package/docs/implementation-details.md +1127 -0
- package/docs/implementation-summary.md +448 -0
- package/docs/mail-integration.md +608 -0
- package/docs/plan-self-driving-support.md +433 -0
- package/docs/spec-self-driving-support.md +462 -0
- package/docs/team-templates.md +860 -0
- package/docs/teams.md +233 -0
- package/package.json +5 -3
- package/src/acp/__tests__/integration.test.ts +161 -1
- package/src/acp/__tests__/macro-agent.test.ts +95 -0
- package/src/acp/__tests__/session-persistence.test.ts +276 -0
- package/src/acp/macro-agent.ts +79 -7
- package/src/acp/session-mapper.ts +108 -1
- package/src/acp/types.ts +33 -1
- package/src/agent/agent-manager.ts +278 -6
- package/src/agent/types.ts +27 -0
- package/src/agent/wake.ts +15 -0
- package/src/agent-detection/__tests__/command-builder.test.ts +336 -0
- package/src/agent-detection/__tests__/detector.test.ts +768 -0
- package/src/agent-detection/__tests__/registry.test.ts +254 -0
- package/src/agent-detection/command-builder.ts +90 -0
- package/src/agent-detection/detector.ts +307 -0
- package/src/agent-detection/index.ts +36 -0
- package/src/agent-detection/registry.ts +200 -0
- package/src/agent-detection/types.ts +184 -0
- package/src/api/__tests__/conversation-api.test.ts +468 -0
- package/src/api/server.ts +425 -1
- package/src/api/types.ts +64 -1
- package/src/cli/acp.ts +9 -1
- package/src/cli/index.ts +44 -0
- package/src/cli/mcp.ts +47 -0
- package/src/config/index.ts +9 -0
- package/src/config/project-config.ts +107 -0
- package/src/lifecycle/cascade.ts +1 -1
- package/src/lifecycle/handlers/index.ts +8 -0
- package/src/lifecycle/handlers/worker.ts +48 -3
- package/src/mail/__tests__/conversation-lifecycle.test.ts +409 -0
- package/src/mail/__tests__/eventstore-stores.test.ts +1073 -0
- package/src/mail/__tests__/mail-full-agent.e2e.test.ts +575 -0
- package/src/mail/__tests__/mail-integration.test.ts +759 -0
- package/src/mail/__tests__/mail-map-protocol.e2e.test.ts +1068 -0
- package/src/mail/__tests__/mail-service.test.ts +506 -0
- package/src/mail/__tests__/turn-recorder.test.ts +328 -0
- package/src/mail/conversation-map.ts +107 -0
- package/src/mail/index.ts +25 -0
- package/src/mail/mail-service.ts +257 -0
- package/src/mail/stores/eventstore-conversation-store.ts +146 -0
- package/src/mail/stores/eventstore-participant-store.ts +172 -0
- package/src/mail/stores/eventstore-thread-store.ts +129 -0
- package/src/mail/stores/eventstore-turn-store.ts +173 -0
- package/src/mail/stores/index.ts +12 -0
- package/src/mail/stores/types.ts +160 -0
- package/src/mail/turn-recorder.ts +124 -0
- package/src/map/README.md +79 -0
- package/src/map/adapter/__tests__/extensions.test.ts +359 -0
- package/src/map/adapter/__tests__/map-adapter.test.ts +90 -0
- package/src/map/adapter/__tests__/workspace-files.test.ts +673 -0
- package/src/map/adapter/acp-over-map.ts +45 -2
- package/src/map/adapter/event-translator.ts +4 -0
- package/src/map/adapter/extensions/agent-detection.ts +201 -0
- package/src/map/adapter/extensions/index.ts +63 -0
- package/src/map/adapter/extensions/resume.ts +114 -0
- package/src/map/adapter/extensions/workspace-files.ts +449 -0
- package/src/map/adapter/mail-handler-adapter.ts +429 -0
- package/src/map/adapter/map-adapter.ts +173 -27
- package/src/map/adapter/rpc-handler.ts +8 -1
- package/src/map/index.ts +3 -0
- package/src/map/types.ts +3 -1
- package/src/mcp/mcp-server.ts +67 -0
- package/src/mcp/tools/claim_task.ts +86 -0
- package/src/mcp/tools/done.ts +59 -10
- package/src/mcp/tools/list_claimable_tasks.ts +93 -0
- package/src/mcp/tools/unclaim_task.ts +71 -0
- package/src/metrics/index.ts +9 -0
- package/src/metrics/metrics.ts +280 -0
- package/src/roles/capabilities.ts +3 -0
- package/src/roles/types.ts +2 -1
- package/src/router/README.md +120 -0
- package/src/router/__tests__/message-router.test.ts +561 -0
- package/src/router/channels.ts +3 -4
- package/src/router/message-router.ts +308 -22
- package/src/router/role-resolver.ts +22 -1
- package/src/router/types.ts +36 -1
- package/src/server/combined-server.ts +36 -2
- package/src/store/README.md +134 -0
- package/src/store/event-store.ts +546 -3
- package/src/store/types/agents.ts +1 -1
- package/src/store/types/conversations.ts +129 -0
- package/src/store/types/events.ts +5 -1
- package/src/store/types/index.ts +2 -0
- package/src/store/types/sessions.ts +53 -0
- package/src/store/types/tasks.ts +3 -0
- package/src/task/backend/memory.ts +116 -0
- package/src/task/backend/types.ts +43 -0
- package/src/teams/__tests__/cross-subsystem.integration.test.ts +983 -0
- package/src/teams/__tests__/e2e/team-runtime.e2e.test.ts +553 -0
- package/src/teams/__tests__/team-system.test.ts +1280 -0
- package/src/teams/index.ts +13 -0
- package/src/teams/team-loader.ts +434 -0
- package/src/teams/team-runtime.ts +727 -0
- package/src/teams/types.ts +377 -0
- package/src/trigger/router/trigger-router.ts +30 -3
- package/src/trigger/wake/types.ts +32 -5
- package/src/trigger/wake/wake-manager.ts +2 -2
- package/src/workspace/dataplane-adapter.ts +1 -1
- package/src/workspace/index.ts +1 -1
- package/src/workspace/strategies/index.ts +18 -0
- package/src/workspace/strategies/optimistic.ts +136 -0
- package/src/workspace/strategies/queue.ts +81 -0
- package/src/workspace/strategies/registry.ts +89 -0
- package/src/workspace/strategies/trunk.ts +123 -0
- package/src/workspace/strategies/types.ts +145 -0
- package/src/workspace/types.ts +1 -1
- package/src/workspace/workspace-manager.ts +1 -1
- package/.claude/settings.local.json +0 -59
- package/dist/map/utils/address-translation.d.ts +0 -99
- package/dist/map/utils/address-translation.d.ts.map +0 -1
- package/dist/map/utils/address-translation.js +0 -285
- package/dist/map/utils/address-translation.js.map +0 -1
- package/dist/map/utils/index.d.ts +0 -7
- package/dist/map/utils/index.d.ts.map +0 -1
- package/dist/map/utils/index.js +0 -7
- package/dist/map/utils/index.js.map +0 -1
- package/openspec/AGENTS.md +0 -456
- package/openspec/changes/archive/2025-12-21-add-mvp-foundation/design.md +0 -128
- package/openspec/changes/archive/2025-12-21-add-mvp-foundation/proposal.md +0 -49
- package/openspec/changes/archive/2025-12-21-add-mvp-foundation/specs/agent-manager/spec.md +0 -150
- package/openspec/changes/archive/2025-12-21-add-mvp-foundation/specs/cli-api/spec.md +0 -258
- package/openspec/changes/archive/2025-12-21-add-mvp-foundation/specs/event-store/spec.md +0 -160
- package/openspec/changes/archive/2025-12-21-add-mvp-foundation/specs/mcp-tools/spec.md +0 -224
- package/openspec/changes/archive/2025-12-21-add-mvp-foundation/specs/message-router/spec.md +0 -153
- package/openspec/changes/archive/2025-12-21-add-mvp-foundation/specs/task-manager/spec.md +0 -136
- package/openspec/changes/archive/2025-12-21-add-mvp-foundation/tasks.md +0 -147
- package/openspec/project.md +0 -31
- package/openspec/specs/agent-manager/spec.md +0 -154
- package/openspec/specs/cli-api/spec.md +0 -262
- package/openspec/specs/event-store/spec.md +0 -164
- package/openspec/specs/mcp-tools/spec.md +0 -228
- package/openspec/specs/message-router/spec.md +0 -157
- package/openspec/specs/task-manager/spec.md +0 -140
- package/references/acp-factory-ref/CHANGELOG.md +0 -33
- package/references/acp-factory-ref/LICENSE +0 -21
- package/references/acp-factory-ref/README.md +0 -341
- package/references/acp-factory-ref/package-lock.json +0 -3102
- package/references/acp-factory-ref/package.json +0 -96
- package/references/acp-factory-ref/python/CHANGELOG.md +0 -33
- package/references/acp-factory-ref/python/LICENSE +0 -21
- package/references/acp-factory-ref/python/Makefile +0 -57
- package/references/acp-factory-ref/python/README.md +0 -253
- package/references/acp-factory-ref/python/pyproject.toml +0 -73
- package/references/acp-factory-ref/python/tests/__init__.py +0 -0
- package/references/acp-factory-ref/python/tests/e2e/__init__.py +0 -1
- package/references/acp-factory-ref/python/tests/e2e/test_codex_e2e.py +0 -349
- package/references/acp-factory-ref/python/tests/e2e/test_gemini_e2e.py +0 -165
- package/references/acp-factory-ref/python/tests/e2e/test_opencode_e2e.py +0 -296
- package/references/acp-factory-ref/python/tests/test_client_handler.py +0 -543
- package/references/acp-factory-ref/python/tests/test_pushable.py +0 -199
- package/references/claude-code-acp/.github/workflows/ci.yml +0 -45
- package/references/claude-code-acp/.github/workflows/publish.yml +0 -34
- package/references/claude-code-acp/.prettierrc.json +0 -4
- package/references/claude-code-acp/CHANGELOG.md +0 -249
- package/references/claude-code-acp/LICENSE +0 -222
- package/references/claude-code-acp/README.md +0 -53
- package/references/claude-code-acp/docs/RELEASES.md +0 -24
- package/references/claude-code-acp/eslint.config.js +0 -48
- package/references/claude-code-acp/package-lock.json +0 -4570
- package/references/claude-code-acp/package.json +0 -88
- package/references/claude-code-acp/scripts/release.sh +0 -119
- package/references/claude-code-acp/src/acp-agent.ts +0 -2065
- package/references/claude-code-acp/src/index.ts +0 -26
- package/references/claude-code-acp/src/lib.ts +0 -38
- package/references/claude-code-acp/src/mcp-server.ts +0 -911
- package/references/claude-code-acp/src/settings.ts +0 -522
- package/references/claude-code-acp/src/tests/.claude/commands/quick-math.md +0 -5
- package/references/claude-code-acp/src/tests/.claude/commands/say-hello.md +0 -6
- package/references/claude-code-acp/src/tests/acp-agent-fork.test.ts +0 -479
- package/references/claude-code-acp/src/tests/acp-agent.test.ts +0 -1502
- package/references/claude-code-acp/src/tests/extract-lines.test.ts +0 -103
- package/references/claude-code-acp/src/tests/fork-session.test.ts +0 -335
- package/references/claude-code-acp/src/tests/replace-and-calculate-location.test.ts +0 -334
- package/references/claude-code-acp/src/tests/settings.test.ts +0 -617
- package/references/claude-code-acp/src/tests/skills-options.test.ts +0 -187
- package/references/claude-code-acp/src/tests/tools.test.ts +0 -318
- package/references/claude-code-acp/src/tests/typescript-declarations.test.ts +0 -558
- package/references/claude-code-acp/src/tools.ts +0 -819
- package/references/claude-code-acp/src/utils.ts +0 -171
- package/references/claude-code-acp/tsconfig.json +0 -18
- package/references/claude-code-acp/vitest.config.ts +0 -19
- package/references/multi-agent-protocol/.sudocode/issues.jsonl +0 -82
- package/references/multi-agent-protocol/.sudocode/specs.jsonl +0 -9
- package/references/multi-agent-protocol/LICENSE +0 -21
- package/references/multi-agent-protocol/README.md +0 -113
- package/references/multi-agent-protocol/docs/00-design-specification.md +0 -460
- package/references/multi-agent-protocol/docs/01-open-questions.md +0 -1050
- package/references/multi-agent-protocol/docs/02-wire-protocol.md +0 -296
- package/references/multi-agent-protocol/docs/03-streaming-semantics.md +0 -252
- package/references/multi-agent-protocol/docs/04-error-handling.md +0 -231
- package/references/multi-agent-protocol/docs/05-connection-model.md +0 -244
- package/references/multi-agent-protocol/docs/06-visibility-permissions.md +0 -243
- package/references/multi-agent-protocol/docs/07-federation.md +0 -259
- package/references/multi-agent-protocol/docs/08-macro-agent-migration.md +0 -253
- package/references/multi-agent-protocol/package-lock.json +0 -3239
- package/references/multi-agent-protocol/package.json +0 -56
- package/references/multi-agent-protocol/schema/meta.json +0 -337
- package/references/multi-agent-protocol/schema/schema.json +0 -1828
|
@@ -1,17 +1,33 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* MAPAdapter -
|
|
2
|
+
* MAPAdapter - External MAP Protocol Interface
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* - Accepts MAP protocol connections from clients, agents, and gateways
|
|
6
|
-
* - Manages participant lifecycle and authentication
|
|
7
|
-
* - Handles subscriptions and event streaming
|
|
8
|
-
* - Dispatches extension method calls
|
|
9
|
-
* - Enforces system-level permissions (Layer 1)
|
|
4
|
+
* ## Routing Architecture Role
|
|
10
5
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
6
|
+
* MAPAdapter is the **external protocol translation layer** for MAP clients.
|
|
7
|
+
* It translates MAP protocol messages into internal routing calls.
|
|
8
|
+
*
|
|
9
|
+
* ```
|
|
10
|
+
* External → MAPAdapter → MessageRouter → EventStore
|
|
11
|
+
* (MAP RPC) (this) (routing) (persistence)
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* **Responsibilities:**
|
|
15
|
+
* - Accept MAP protocol connections (JSON-RPC over WebSocket/streams)
|
|
16
|
+
* - Manage participant lifecycle (connect, disconnect, capabilities)
|
|
17
|
+
* - Handle authentication and permission enforcement (Layer 1)
|
|
18
|
+
* - Translate MAP addresses to internal routing
|
|
19
|
+
* - Stream events to subscribed participants
|
|
20
|
+
* - Dispatch extension method calls (spawn, wake, tasks, etc.)
|
|
21
|
+
*
|
|
22
|
+
* **Delegates to internal components:**
|
|
23
|
+
* - MessageRouter: For message routing and delivery (sendToAddress)
|
|
13
24
|
* - AgentManager: For agent lifecycle operations
|
|
14
|
-
* - EventStore: For event persistence and
|
|
25
|
+
* - EventStore: For event persistence and subscription
|
|
26
|
+
*
|
|
27
|
+
* **Not responsible for:**
|
|
28
|
+
* - Internal agent-to-agent messaging (use MessageRouter directly)
|
|
29
|
+
* - Batch event delivery (use TriggerRouter/WakeManager)
|
|
30
|
+
* - Legacy channel-based routing (use MessageRouter.send())
|
|
15
31
|
*
|
|
16
32
|
* @see specs/s-5qir_map_integration_for_macro_agent.md
|
|
17
33
|
*/
|
|
@@ -34,13 +50,20 @@ import type {
|
|
|
34
50
|
import type {
|
|
35
51
|
ParticipantId,
|
|
36
52
|
ParticipantType,
|
|
53
|
+
ParticipantCapabilities,
|
|
37
54
|
ConnectedParticipant,
|
|
38
55
|
SubscriptionId,
|
|
39
56
|
SubscriptionFilter,
|
|
40
57
|
EventNotification,
|
|
58
|
+
AuthCredentials,
|
|
41
59
|
MAPEventType,
|
|
42
60
|
} from "./types.js";
|
|
43
|
-
import {
|
|
61
|
+
import {
|
|
62
|
+
isAgentAddress,
|
|
63
|
+
type Address,
|
|
64
|
+
type SendOptions,
|
|
65
|
+
type ScopeId,
|
|
66
|
+
} from "../types.js";
|
|
44
67
|
import type { AgentId } from "../../store/types/index.js";
|
|
45
68
|
import {
|
|
46
69
|
createConnectionManager,
|
|
@@ -68,6 +91,7 @@ import type {
|
|
|
68
91
|
MAPPeerConfig,
|
|
69
92
|
} from "../federation/types.js";
|
|
70
93
|
import { ACPOverMAPHandler, type ACPEnvelope } from "./acp-over-map.js";
|
|
94
|
+
import { createMailHandlers } from "./mail-handler-adapter.js";
|
|
71
95
|
|
|
72
96
|
// =============================================================================
|
|
73
97
|
// Connection Session
|
|
@@ -147,6 +171,11 @@ export interface MAPAdapterServices {
|
|
|
147
171
|
* Default working directory for ACP sessions.
|
|
148
172
|
*/
|
|
149
173
|
defaultCwd?: string;
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Mail service for conversation tracking.
|
|
177
|
+
*/
|
|
178
|
+
mailService?: import("../../mail/mail-service.js").MailService;
|
|
150
179
|
}
|
|
151
180
|
|
|
152
181
|
/**
|
|
@@ -196,7 +225,8 @@ export class MAPAdapterImpl implements MAPAdapter {
|
|
|
196
225
|
private readonly services: MAPAdapterServices;
|
|
197
226
|
private readonly acpOverMapHandler: ACPOverMAPHandler | null = null;
|
|
198
227
|
/** Sequence numbers per subscription for proper event ordering */
|
|
199
|
-
private readonly subscriptionSequences: Map<SubscriptionId, number> =
|
|
228
|
+
private readonly subscriptionSequences: Map<SubscriptionId, number> =
|
|
229
|
+
new Map();
|
|
200
230
|
|
|
201
231
|
private running = false;
|
|
202
232
|
|
|
@@ -512,8 +542,7 @@ export class MAPAdapterImpl implements MAPAdapter {
|
|
|
512
542
|
|
|
513
543
|
emitEvent(event: EventNotification): void {
|
|
514
544
|
// Match event against subscriptions
|
|
515
|
-
const { subscriptions: matchingSubs } =
|
|
516
|
-
this.subscriptions.match(event);
|
|
545
|
+
const { subscriptions: matchingSubs } = this.subscriptions.match(event);
|
|
517
546
|
|
|
518
547
|
// Send to each matched subscription with proper SDK format
|
|
519
548
|
// SDK EventNotificationParams: { subscriptionId, sequenceNumber, eventId?, timestamp?, event, causedBy? }
|
|
@@ -528,9 +557,10 @@ export class MAPAdapterImpl implements MAPAdapter {
|
|
|
528
557
|
const params = {
|
|
529
558
|
subscriptionId: subscription.id,
|
|
530
559
|
sequenceNumber: currentSeq,
|
|
531
|
-
eventId: event.eventId,
|
|
560
|
+
eventId: event.eventId, // For deduplication
|
|
532
561
|
timestamp: event.timestamp, // Envelope timestamp
|
|
533
|
-
event: {
|
|
562
|
+
event: {
|
|
563
|
+
// The actual event object
|
|
534
564
|
id: event.eventId,
|
|
535
565
|
type: event.type,
|
|
536
566
|
timestamp: event.timestamp,
|
|
@@ -717,6 +747,14 @@ export class MAPAdapterImpl implements MAPAdapter {
|
|
|
717
747
|
};
|
|
718
748
|
}
|
|
719
749
|
|
|
750
|
+
// Add mail protocol handlers if mail service is available
|
|
751
|
+
if (this.services.mailService) {
|
|
752
|
+
const mailHandlers = createMailHandlers(this.services.mailService);
|
|
753
|
+
for (const [method, handler] of Object.entries(mailHandlers)) {
|
|
754
|
+
handlers[method] = handler;
|
|
755
|
+
}
|
|
756
|
+
}
|
|
757
|
+
|
|
720
758
|
// Capability requirements for methods
|
|
721
759
|
const capabilityRequirements: Record<
|
|
722
760
|
string,
|
|
@@ -829,8 +867,55 @@ export class MAPAdapterImpl implements MAPAdapter {
|
|
|
829
867
|
throw RPCError.notFound("participant", participantId);
|
|
830
868
|
}
|
|
831
869
|
|
|
832
|
-
//
|
|
833
|
-
|
|
870
|
+
// Parse connect request parameters
|
|
871
|
+
const connectParams = params as
|
|
872
|
+
| {
|
|
873
|
+
type?: ParticipantType;
|
|
874
|
+
name?: string;
|
|
875
|
+
credentials?: AuthCredentials;
|
|
876
|
+
}
|
|
877
|
+
| undefined;
|
|
878
|
+
|
|
879
|
+
const requestedType = connectParams?.type ?? participant.type;
|
|
880
|
+
const credentials = connectParams?.credentials;
|
|
881
|
+
|
|
882
|
+
// Handle authentication if handler is configured and credentials provided
|
|
883
|
+
if (this.config.authenticate && credentials) {
|
|
884
|
+
const authResult = await this.config.authenticate(
|
|
885
|
+
requestedType,
|
|
886
|
+
credentials,
|
|
887
|
+
);
|
|
888
|
+
|
|
889
|
+
if (!authResult.allowed) {
|
|
890
|
+
throw RPCError.authenticationFailed(
|
|
891
|
+
authResult.error ?? "Authentication failed",
|
|
892
|
+
);
|
|
893
|
+
}
|
|
894
|
+
|
|
895
|
+
// Update capabilities based on auth result
|
|
896
|
+
const newCapabilities =
|
|
897
|
+
authResult.capabilities ?? this.getDefaultCapabilities(requestedType);
|
|
898
|
+
this.connections.updateCapabilities(participantId, newCapabilities);
|
|
899
|
+
|
|
900
|
+
// Return updated participant info
|
|
901
|
+
const updatedParticipant = this.connections.getParticipant(participantId);
|
|
902
|
+
return {
|
|
903
|
+
participantId: participant.id,
|
|
904
|
+
capabilities: updatedParticipant?.capabilities ?? newCapabilities,
|
|
905
|
+
};
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
// No auth handler or no credentials - use default capabilities for the type
|
|
909
|
+
if (requestedType !== participant.type) {
|
|
910
|
+
const defaultCapabilities = this.getDefaultCapabilities(requestedType);
|
|
911
|
+
this.connections.updateCapabilities(participantId, defaultCapabilities);
|
|
912
|
+
|
|
913
|
+
const updatedParticipant = this.connections.getParticipant(participantId);
|
|
914
|
+
return {
|
|
915
|
+
participantId: participant.id,
|
|
916
|
+
capabilities: updatedParticipant?.capabilities ?? defaultCapabilities,
|
|
917
|
+
};
|
|
918
|
+
}
|
|
834
919
|
|
|
835
920
|
return {
|
|
836
921
|
participantId: participant.id,
|
|
@@ -838,6 +923,53 @@ export class MAPAdapterImpl implements MAPAdapter {
|
|
|
838
923
|
};
|
|
839
924
|
}
|
|
840
925
|
|
|
926
|
+
/**
|
|
927
|
+
* Get default capabilities for a participant type.
|
|
928
|
+
*/
|
|
929
|
+
private getDefaultCapabilities(
|
|
930
|
+
type: ParticipantType,
|
|
931
|
+
): ParticipantCapabilities {
|
|
932
|
+
switch (type) {
|
|
933
|
+
case "agent":
|
|
934
|
+
return (
|
|
935
|
+
this.config.defaultAgentCapabilities ?? {
|
|
936
|
+
canQuery: true,
|
|
937
|
+
canSubscribe: true,
|
|
938
|
+
canMessage: true,
|
|
939
|
+
canSpawn: true,
|
|
940
|
+
canStop: true,
|
|
941
|
+
canManageScopes: true,
|
|
942
|
+
canManageTasks: true,
|
|
943
|
+
canManageFederation: true,
|
|
944
|
+
}
|
|
945
|
+
);
|
|
946
|
+
case "gateway":
|
|
947
|
+
return {
|
|
948
|
+
canQuery: true,
|
|
949
|
+
canSubscribe: true,
|
|
950
|
+
canMessage: true,
|
|
951
|
+
canSpawn: false,
|
|
952
|
+
canStop: false,
|
|
953
|
+
canManageScopes: false,
|
|
954
|
+
canManageTasks: false,
|
|
955
|
+
canManageFederation: true,
|
|
956
|
+
};
|
|
957
|
+
case "client":
|
|
958
|
+
default:
|
|
959
|
+
return (
|
|
960
|
+
this.config.defaultClientCapabilities ?? {
|
|
961
|
+
canQuery: true,
|
|
962
|
+
canSubscribe: true,
|
|
963
|
+
canMessage: true,
|
|
964
|
+
canSpawn: false,
|
|
965
|
+
canStop: false,
|
|
966
|
+
canManageScopes: false,
|
|
967
|
+
canManageTasks: false,
|
|
968
|
+
}
|
|
969
|
+
);
|
|
970
|
+
}
|
|
971
|
+
}
|
|
972
|
+
|
|
841
973
|
private async handleDisconnect(
|
|
842
974
|
participantId: ParticipantId,
|
|
843
975
|
): Promise<{ success: boolean }> {
|
|
@@ -903,8 +1035,15 @@ export class MAPAdapterImpl implements MAPAdapter {
|
|
|
903
1035
|
|
|
904
1036
|
// Check if this is an ACP-over-MAP message
|
|
905
1037
|
// SDK sends ACP envelope directly as payload (not wrapped in content)
|
|
906
|
-
const rawPayload = payload as unknown as
|
|
907
|
-
|
|
1038
|
+
const rawPayload = payload as unknown as
|
|
1039
|
+
| Record<string, unknown>
|
|
1040
|
+
| undefined;
|
|
1041
|
+
if (
|
|
1042
|
+
rawPayload &&
|
|
1043
|
+
typeof rawPayload === "object" &&
|
|
1044
|
+
"acp" in rawPayload &&
|
|
1045
|
+
"acpContext" in rawPayload
|
|
1046
|
+
) {
|
|
908
1047
|
// This is an ACP envelope - route through ACP-over-MAP handler
|
|
909
1048
|
return this.handleACPOverMAP(participantId, to, rawPayload, ctx);
|
|
910
1049
|
}
|
|
@@ -923,7 +1062,9 @@ export class MAPAdapterImpl implements MAPAdapter {
|
|
|
923
1062
|
ctx: HandlerContext,
|
|
924
1063
|
): Promise<SendResult> {
|
|
925
1064
|
if (!this.acpOverMapHandler) {
|
|
926
|
-
throw RPCError.internalError(
|
|
1065
|
+
throw RPCError.internalError(
|
|
1066
|
+
"ACP-over-MAP not available - missing services",
|
|
1067
|
+
);
|
|
927
1068
|
}
|
|
928
1069
|
|
|
929
1070
|
const acp = envelope.acp as {
|
|
@@ -940,7 +1081,9 @@ export class MAPAdapterImpl implements MAPAdapter {
|
|
|
940
1081
|
direction: string;
|
|
941
1082
|
};
|
|
942
1083
|
|
|
943
|
-
console.error(
|
|
1084
|
+
console.error(
|
|
1085
|
+
`[ACP-over-MAP] Received - method=${acp.method} to=${JSON.stringify(to)}`,
|
|
1086
|
+
);
|
|
944
1087
|
|
|
945
1088
|
// For now, we only support messages to specific agents
|
|
946
1089
|
if (!isAgentAddress(to)) {
|
|
@@ -953,7 +1096,12 @@ export class MAPAdapterImpl implements MAPAdapter {
|
|
|
953
1096
|
if (!acp.method) {
|
|
954
1097
|
// This is a response - route it normally
|
|
955
1098
|
console.error(`[ACP-over-MAP] Routing response back`);
|
|
956
|
-
return this.sendMessage(
|
|
1099
|
+
return this.sendMessage(
|
|
1100
|
+
participantId,
|
|
1101
|
+
to,
|
|
1102
|
+
{ content: envelope },
|
|
1103
|
+
undefined,
|
|
1104
|
+
);
|
|
957
1105
|
}
|
|
958
1106
|
|
|
959
1107
|
// Create notification emitter to stream session updates
|
|
@@ -981,7 +1129,7 @@ export class MAPAdapterImpl implements MAPAdapter {
|
|
|
981
1129
|
const responseEnvelope = await this.acpOverMapHandler.processRequest(
|
|
982
1130
|
targetAgentId,
|
|
983
1131
|
acpEnvelope,
|
|
984
|
-
emitNotification
|
|
1132
|
+
emitNotification,
|
|
985
1133
|
);
|
|
986
1134
|
|
|
987
1135
|
console.error(`[ACP-over-MAP] Request processed - method=${acp.method}`);
|
|
@@ -1167,9 +1315,7 @@ export class MAPAdapterImpl implements MAPAdapter {
|
|
|
1167
1315
|
}
|
|
1168
1316
|
}
|
|
1169
1317
|
|
|
1170
|
-
private async handleFederationList(
|
|
1171
|
-
participantId: ParticipantId,
|
|
1172
|
-
): Promise<{
|
|
1318
|
+
private async handleFederationList(participantId: ParticipantId): Promise<{
|
|
1173
1319
|
peers: Array<{ systemId: string; status: string; connectedAt: number }>;
|
|
1174
1320
|
}> {
|
|
1175
1321
|
if (!this.services.federationHandler) {
|
|
@@ -116,6 +116,8 @@ export const MAP_ERRORS = {
|
|
|
116
116
|
RATE_LIMIT_EXCEEDED: -32011,
|
|
117
117
|
/** Resource limit exceeded. */
|
|
118
118
|
RESOURCE_LIMIT_EXCEEDED: -32012,
|
|
119
|
+
/** Authentication failed. */
|
|
120
|
+
AUTHENTICATION_FAILED: -32013,
|
|
119
121
|
/** Invalid address. */
|
|
120
122
|
INVALID_ADDRESS: -32020,
|
|
121
123
|
/** Routing failed. */
|
|
@@ -311,13 +313,14 @@ export class RPCError extends Error {
|
|
|
311
313
|
return new RPCError(MAP_ERRORS.PERMISSION_DENIED, message);
|
|
312
314
|
}
|
|
313
315
|
|
|
314
|
-
static notFound(type: "agent" | "scope" | "subscription" | "participant" | "peer", id: string): RPCError {
|
|
316
|
+
static notFound(type: "agent" | "scope" | "subscription" | "participant" | "peer" | "conversation", id: string): RPCError {
|
|
315
317
|
const codes = {
|
|
316
318
|
agent: MAP_ERRORS.AGENT_NOT_FOUND,
|
|
317
319
|
scope: MAP_ERRORS.SCOPE_NOT_FOUND,
|
|
318
320
|
subscription: MAP_ERRORS.SUBSCRIPTION_NOT_FOUND,
|
|
319
321
|
participant: MAP_ERRORS.PARTICIPANT_NOT_FOUND,
|
|
320
322
|
peer: MAP_ERRORS.NOT_CONNECTED, // Use NOT_CONNECTED for peer not found
|
|
323
|
+
conversation: JSON_RPC_ERRORS.INTERNAL_ERROR,
|
|
321
324
|
};
|
|
322
325
|
return new RPCError(codes[type], `${type} not found: ${id}`);
|
|
323
326
|
}
|
|
@@ -333,6 +336,10 @@ export class RPCError extends Error {
|
|
|
333
336
|
static routingFailed(message: string): RPCError {
|
|
334
337
|
return new RPCError(MAP_ERRORS.ROUTING_FAILED, message);
|
|
335
338
|
}
|
|
339
|
+
|
|
340
|
+
static authenticationFailed(message: string): RPCError {
|
|
341
|
+
return new RPCError(MAP_ERRORS.AUTHENTICATION_FAILED, message);
|
|
342
|
+
}
|
|
336
343
|
}
|
|
337
344
|
|
|
338
345
|
// =============================================================================
|
package/src/map/index.ts
CHANGED
package/src/map/types.ts
CHANGED
|
@@ -337,8 +337,10 @@ export function isFederatedAddress(addr: Address): addr is FederatedAddress {
|
|
|
337
337
|
/**
|
|
338
338
|
* Message priority levels.
|
|
339
339
|
* Higher priority messages may wake sleeping agents.
|
|
340
|
+
* Re-exported from router/types.ts to maintain single source of truth.
|
|
340
341
|
*/
|
|
341
|
-
|
|
342
|
+
import type { MessagePriority } from "../router/types.js";
|
|
343
|
+
export type { MessagePriority };
|
|
342
344
|
|
|
343
345
|
/**
|
|
344
346
|
* Delivery hint for message routing.
|
package/src/mcp/mcp-server.ts
CHANGED
|
@@ -36,6 +36,21 @@ import {
|
|
|
36
36
|
formatInjectContextResult,
|
|
37
37
|
INJECT_CONTEXT_TOOL_INFO,
|
|
38
38
|
} from "./tools/inject_context.js";
|
|
39
|
+
import {
|
|
40
|
+
ClaimTaskSchema,
|
|
41
|
+
createClaimTaskHandler,
|
|
42
|
+
CLAIM_TASK_TOOL_INFO,
|
|
43
|
+
} from "./tools/claim_task.js";
|
|
44
|
+
import {
|
|
45
|
+
UnclaimTaskSchema,
|
|
46
|
+
createUnclaimTaskHandler,
|
|
47
|
+
UNCLAIM_TASK_TOOL_INFO,
|
|
48
|
+
} from "./tools/unclaim_task.js";
|
|
49
|
+
import {
|
|
50
|
+
ListClaimableTasksSchema,
|
|
51
|
+
createListClaimableTasksHandler,
|
|
52
|
+
LIST_CLAIMABLE_TASKS_TOOL_INFO,
|
|
53
|
+
} from "./tools/list_claimable_tasks.js";
|
|
39
54
|
import type { TaskToolProvider } from "../task/backend/types.js";
|
|
40
55
|
import type { RoleRegistry, RoleDefinition } from "../roles/types.js";
|
|
41
56
|
import { DefaultRoleRegistry } from "../roles/registry.js";
|
|
@@ -82,6 +97,12 @@ export interface MCPServices {
|
|
|
82
97
|
taskToolProvider?: TaskToolProvider;
|
|
83
98
|
/** Optional role registry for role-based tool filtering */
|
|
84
99
|
roleRegistry?: RoleRegistry;
|
|
100
|
+
/** Optional task mode from team config (push or pull) */
|
|
101
|
+
taskMode?: "push" | "pull";
|
|
102
|
+
/** Optional integration strategy from team config */
|
|
103
|
+
integrationStrategy?: import("../workspace/strategies/types.js").IntegrationStrategy;
|
|
104
|
+
/** Optional task backend for pull model tools (claim/unclaim) */
|
|
105
|
+
taskBackend?: import("../task/backend/types.js").TaskBackend;
|
|
85
106
|
}
|
|
86
107
|
|
|
87
108
|
// ─────────────────────────────────────────────────────────────────
|
|
@@ -1093,6 +1114,9 @@ export function createMCPServer(
|
|
|
1093
1114
|
agentManager,
|
|
1094
1115
|
messageRouter,
|
|
1095
1116
|
taskManager,
|
|
1117
|
+
roleRegistry,
|
|
1118
|
+
integrationStrategy: services.integrationStrategy,
|
|
1119
|
+
taskMode: services.taskMode,
|
|
1096
1120
|
});
|
|
1097
1121
|
|
|
1098
1122
|
try {
|
|
@@ -1134,6 +1158,49 @@ export function createMCPServer(
|
|
|
1134
1158
|
});
|
|
1135
1159
|
}
|
|
1136
1160
|
|
|
1161
|
+
// ─────────────────────────────────────────────────────────────────
|
|
1162
|
+
// Tools: claim_task, unclaim_task, list_claimable_tasks (pull model)
|
|
1163
|
+
// ─────────────────────────────────────────────────────────────────
|
|
1164
|
+
|
|
1165
|
+
if (services.taskBackend && shouldRegisterTool("claim_task")) {
|
|
1166
|
+
server.registerTool(CLAIM_TASK_TOOL_INFO.name, {
|
|
1167
|
+
description: CLAIM_TASK_TOOL_INFO.description,
|
|
1168
|
+
inputSchema: ClaimTaskSchema,
|
|
1169
|
+
}, async (args) => {
|
|
1170
|
+
const handler = createClaimTaskHandler(context, {
|
|
1171
|
+
taskBackend: services.taskBackend!,
|
|
1172
|
+
});
|
|
1173
|
+
const result = await handler(args as { tags?: string[]; root_tasks_only?: boolean });
|
|
1174
|
+
return { content: [{ type: "text" as const, text: JSON.stringify(result) }] };
|
|
1175
|
+
});
|
|
1176
|
+
}
|
|
1177
|
+
|
|
1178
|
+
if (services.taskBackend && shouldRegisterTool("unclaim_task")) {
|
|
1179
|
+
server.registerTool(UNCLAIM_TASK_TOOL_INFO.name, {
|
|
1180
|
+
description: UNCLAIM_TASK_TOOL_INFO.description,
|
|
1181
|
+
inputSchema: UnclaimTaskSchema,
|
|
1182
|
+
}, async (args) => {
|
|
1183
|
+
const handler = createUnclaimTaskHandler(context, {
|
|
1184
|
+
taskBackend: services.taskBackend!,
|
|
1185
|
+
});
|
|
1186
|
+
const result = await handler(args as { task_id: string });
|
|
1187
|
+
return { content: [{ type: "text" as const, text: JSON.stringify(result) }] };
|
|
1188
|
+
});
|
|
1189
|
+
}
|
|
1190
|
+
|
|
1191
|
+
if (services.taskBackend && shouldRegisterTool("list_claimable_tasks")) {
|
|
1192
|
+
server.registerTool(LIST_CLAIMABLE_TASKS_TOOL_INFO.name, {
|
|
1193
|
+
description: LIST_CLAIMABLE_TASKS_TOOL_INFO.description,
|
|
1194
|
+
inputSchema: ListClaimableTasksSchema,
|
|
1195
|
+
}, async (args) => {
|
|
1196
|
+
const handler = createListClaimableTasksHandler(context, {
|
|
1197
|
+
taskBackend: services.taskBackend!,
|
|
1198
|
+
});
|
|
1199
|
+
const result = await handler(args as { tags?: string[]; root_tasks_only?: boolean; limit?: number });
|
|
1200
|
+
return { content: [{ type: "text" as const, text: JSON.stringify(result) }] };
|
|
1201
|
+
});
|
|
1202
|
+
}
|
|
1203
|
+
|
|
1137
1204
|
// ─────────────────────────────────────────────────────────────────
|
|
1138
1205
|
// Tool: inject_context (always allowed - parent-to-child communication)
|
|
1139
1206
|
// ─────────────────────────────────────────────────────────────────
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* claim_task() MCP Tool
|
|
3
|
+
*
|
|
4
|
+
* Allows agents with `task.claim` capability to claim the next available task.
|
|
5
|
+
* Used in the pull model where agents autonomously pick up work.
|
|
6
|
+
*
|
|
7
|
+
* @module mcp/tools/claim_task
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { z } from "zod";
|
|
11
|
+
import type { TaskBackend, ClaimFilter, ExtendedTask } from "../../task/backend/types.js";
|
|
12
|
+
import type { ToolContext } from "../types.js";
|
|
13
|
+
|
|
14
|
+
// =============================================================================
|
|
15
|
+
// Schema
|
|
16
|
+
// =============================================================================
|
|
17
|
+
|
|
18
|
+
export const ClaimTaskSchema = {
|
|
19
|
+
tags: z
|
|
20
|
+
.array(z.string())
|
|
21
|
+
.optional()
|
|
22
|
+
.describe("Only claim tasks with at least one matching tag"),
|
|
23
|
+
root_tasks_only: z
|
|
24
|
+
.boolean()
|
|
25
|
+
.optional()
|
|
26
|
+
.describe("Only claim root tasks (no parent)"),
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
// =============================================================================
|
|
30
|
+
// Handler
|
|
31
|
+
// =============================================================================
|
|
32
|
+
|
|
33
|
+
export interface ClaimTaskDeps {
|
|
34
|
+
taskBackend: TaskBackend;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export function createClaimTaskHandler(
|
|
38
|
+
context: ToolContext,
|
|
39
|
+
deps: ClaimTaskDeps
|
|
40
|
+
) {
|
|
41
|
+
return async (args: {
|
|
42
|
+
tags?: string[];
|
|
43
|
+
root_tasks_only?: boolean;
|
|
44
|
+
}): Promise<{
|
|
45
|
+
claimed: boolean;
|
|
46
|
+
task?: ExtendedTask;
|
|
47
|
+
message: string;
|
|
48
|
+
}> => {
|
|
49
|
+
if (!deps.taskBackend.claim) {
|
|
50
|
+
return {
|
|
51
|
+
claimed: false,
|
|
52
|
+
message: "Task backend does not support claim operations",
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
const filter: ClaimFilter = {};
|
|
57
|
+
if (args.tags) filter.tags = args.tags;
|
|
58
|
+
if (args.root_tasks_only) filter.rootTasksOnly = args.root_tasks_only;
|
|
59
|
+
|
|
60
|
+
const task = await deps.taskBackend.claim(context.agent_id, filter);
|
|
61
|
+
|
|
62
|
+
if (!task) {
|
|
63
|
+
return {
|
|
64
|
+
claimed: false,
|
|
65
|
+
message: "No claimable tasks available",
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return {
|
|
70
|
+
claimed: true,
|
|
71
|
+
task,
|
|
72
|
+
message: `Claimed task ${task.id}: ${task.description}`,
|
|
73
|
+
};
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// =============================================================================
|
|
78
|
+
// Tool Info
|
|
79
|
+
// =============================================================================
|
|
80
|
+
|
|
81
|
+
export const CLAIM_TASK_TOOL_INFO = {
|
|
82
|
+
name: "claim_task",
|
|
83
|
+
description:
|
|
84
|
+
"Claim the next available task from the task pool. Returns the claimed task or null if none available. Requires task.claim capability.",
|
|
85
|
+
schema: ClaimTaskSchema,
|
|
86
|
+
};
|
package/src/mcp/tools/done.ts
CHANGED
|
@@ -65,6 +65,16 @@ export interface DoneToolDeps {
|
|
|
65
65
|
/** Get merge queue for coordinating worker merges */
|
|
66
66
|
getMergeQueue?(): AllHandlerDeps["mergeQueue"];
|
|
67
67
|
};
|
|
68
|
+
/** Optional RoleRegistry for capability-based done() checks */
|
|
69
|
+
roleRegistry?: import("../../roles/types.js").RoleRegistry;
|
|
70
|
+
/** Optional MailService for recording completion turns */
|
|
71
|
+
mailService?: import("../../mail/mail-service.js").MailService;
|
|
72
|
+
/** Optional ConversationMap for agent-to-conversation lookup */
|
|
73
|
+
conversationMap?: import("../../mail/conversation-map.js").ConversationMap;
|
|
74
|
+
/** Optional integration strategy (from team config) */
|
|
75
|
+
integrationStrategy?: import("../../workspace/strategies/types.js").IntegrationStrategy;
|
|
76
|
+
/** Optional task mode from team config */
|
|
77
|
+
taskMode?: "push" | "pull";
|
|
68
78
|
}
|
|
69
79
|
|
|
70
80
|
// =============================================================================
|
|
@@ -72,11 +82,15 @@ export interface DoneToolDeps {
|
|
|
72
82
|
// =============================================================================
|
|
73
83
|
|
|
74
84
|
/**
|
|
75
|
-
* Check if an agent has the lifecycle.done capability
|
|
85
|
+
* Check if an agent has the lifecycle.done capability.
|
|
86
|
+
*
|
|
87
|
+
* Uses RoleRegistry for capability resolution, supporting both built-in
|
|
88
|
+
* roles and team-defined roles that extend them.
|
|
76
89
|
*/
|
|
77
90
|
export function hasLifecycleDoneCapability(
|
|
78
91
|
eventStore: EventStore,
|
|
79
|
-
agentId: string
|
|
92
|
+
agentId: string,
|
|
93
|
+
roleRegistry?: import("../../roles/types.js").RoleRegistry
|
|
80
94
|
): { hasCapability: boolean; role: string } {
|
|
81
95
|
// Get the agent to find their role
|
|
82
96
|
const agent = eventStore.getAgent(agentId);
|
|
@@ -84,13 +98,15 @@ export function hasLifecycleDoneCapability(
|
|
|
84
98
|
return { hasCapability: false, role: "unknown" };
|
|
85
99
|
}
|
|
86
100
|
|
|
87
|
-
// Get the agent's role (set at spawn time) or default to "worker"
|
|
88
|
-
// In the future, this should query the RoleRegistry for full capability lookup
|
|
89
101
|
const role = agent.role ?? "worker";
|
|
90
102
|
|
|
91
|
-
//
|
|
92
|
-
|
|
93
|
-
|
|
103
|
+
// Use RoleRegistry for capability lookup when available
|
|
104
|
+
if (roleRegistry) {
|
|
105
|
+
const hasCapability = roleRegistry.hasCapability(role, "lifecycle.done");
|
|
106
|
+
return { hasCapability, role };
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Fallback: check base role via prefix match against known built-in roles
|
|
94
110
|
const rolesWithDoneCapability = new Set([
|
|
95
111
|
"worker",
|
|
96
112
|
"worker.resolver",
|
|
@@ -98,7 +114,6 @@ export function hasLifecycleDoneCapability(
|
|
|
98
114
|
"monitor",
|
|
99
115
|
]);
|
|
100
116
|
|
|
101
|
-
// Check exact match or prefix match
|
|
102
117
|
const hasCapability =
|
|
103
118
|
rolesWithDoneCapability.has(role) ||
|
|
104
119
|
rolesWithDoneCapability.has(role.split(".")[0]);
|
|
@@ -158,7 +173,7 @@ export function createDoneHandler(context: ToolContext, deps: DoneToolDeps) {
|
|
|
158
173
|
details?: Record<string, unknown>;
|
|
159
174
|
task_id?: string;
|
|
160
175
|
}): Promise<DoneResult> => {
|
|
161
|
-
const { eventStore, agentManager, messageRouter, taskManager, workspaceManager } = deps;
|
|
176
|
+
const { eventStore, agentManager, messageRouter, taskManager, workspaceManager, roleRegistry, mailService, conversationMap } = deps;
|
|
162
177
|
|
|
163
178
|
// ─────────────────────────────────────────────────────────────────────────
|
|
164
179
|
// Step 1: Check capability
|
|
@@ -166,7 +181,8 @@ export function createDoneHandler(context: ToolContext, deps: DoneToolDeps) {
|
|
|
166
181
|
|
|
167
182
|
const { hasCapability, role } = hasLifecycleDoneCapability(
|
|
168
183
|
eventStore,
|
|
169
|
-
context.agent_id
|
|
184
|
+
context.agent_id,
|
|
185
|
+
roleRegistry
|
|
170
186
|
);
|
|
171
187
|
|
|
172
188
|
if (!hasCapability) {
|
|
@@ -233,6 +249,37 @@ export function createDoneHandler(context: ToolContext, deps: DoneToolDeps) {
|
|
|
233
249
|
// Continue even if emit fails
|
|
234
250
|
}
|
|
235
251
|
|
|
252
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
253
|
+
// Step 4b: Record completion turn and close conversation (Mail)
|
|
254
|
+
// ─────────────────────────────────────────────────────────────────────────
|
|
255
|
+
if (mailService && conversationMap) {
|
|
256
|
+
try {
|
|
257
|
+
const convId = conversationMap.getAgentConversation(context.agent_id);
|
|
258
|
+
if (convId) {
|
|
259
|
+
// Record completion turn
|
|
260
|
+
mailService.recordTurn({
|
|
261
|
+
conversationId: convId,
|
|
262
|
+
participant: context.agent_id,
|
|
263
|
+
contentType: "event",
|
|
264
|
+
content: {
|
|
265
|
+
event: `agent.${args.status}`,
|
|
266
|
+
summary: args.summary,
|
|
267
|
+
details: args.details,
|
|
268
|
+
},
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
// Close the conversation
|
|
272
|
+
mailService.closeConversation({
|
|
273
|
+
conversationId: convId,
|
|
274
|
+
closedBy: context.agent_id,
|
|
275
|
+
reason: args.status,
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
} catch {
|
|
279
|
+
// Never fail done() due to mail errors
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
|
|
236
283
|
// ─────────────────────────────────────────────────────────────────────────
|
|
237
284
|
// Step 5: Dispatch to role-specific handler
|
|
238
285
|
// ─────────────────────────────────────────────────────────────────────────
|
|
@@ -251,6 +298,8 @@ export function createDoneHandler(context: ToolContext, deps: DoneToolDeps) {
|
|
|
251
298
|
getWorkspacePath: workspaceManager
|
|
252
299
|
? (agentId: string) => workspaceManager.getWorkspace(agentId)?.path
|
|
253
300
|
: undefined,
|
|
301
|
+
integrationStrategy: deps.integrationStrategy,
|
|
302
|
+
taskMode: deps.taskMode,
|
|
254
303
|
};
|
|
255
304
|
|
|
256
305
|
const handlerResult = await dispatchDone(
|