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
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* list_claimable_tasks() MCP Tool
|
|
3
|
+
*
|
|
4
|
+
* Lists tasks available for claiming. Allows agents to preview
|
|
5
|
+
* what's in the task pool before claiming.
|
|
6
|
+
*
|
|
7
|
+
* @module mcp/tools/list_claimable_tasks
|
|
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 ListClaimableTasksSchema = {
|
|
19
|
+
tags: z
|
|
20
|
+
.array(z.string())
|
|
21
|
+
.optional()
|
|
22
|
+
.describe("Only list tasks with at least one matching tag"),
|
|
23
|
+
root_tasks_only: z
|
|
24
|
+
.boolean()
|
|
25
|
+
.optional()
|
|
26
|
+
.describe("Only list root tasks (no parent)"),
|
|
27
|
+
limit: z
|
|
28
|
+
.number()
|
|
29
|
+
.optional()
|
|
30
|
+
.describe("Maximum number of tasks to return (default: 20)"),
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
// =============================================================================
|
|
34
|
+
// Handler
|
|
35
|
+
// =============================================================================
|
|
36
|
+
|
|
37
|
+
export interface ListClaimableTasksDeps {
|
|
38
|
+
taskBackend: TaskBackend;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function createListClaimableTasksHandler(
|
|
42
|
+
_context: ToolContext,
|
|
43
|
+
deps: ListClaimableTasksDeps
|
|
44
|
+
) {
|
|
45
|
+
return async (args: {
|
|
46
|
+
tags?: string[];
|
|
47
|
+
root_tasks_only?: boolean;
|
|
48
|
+
limit?: number;
|
|
49
|
+
}): Promise<{
|
|
50
|
+
tasks: ExtendedTask[];
|
|
51
|
+
count: number;
|
|
52
|
+
message: string;
|
|
53
|
+
}> => {
|
|
54
|
+
if (!deps.taskBackend.listClaimable) {
|
|
55
|
+
return {
|
|
56
|
+
tasks: [],
|
|
57
|
+
count: 0,
|
|
58
|
+
message: "Task backend does not support listClaimable operations",
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const filter: ClaimFilter = {};
|
|
63
|
+
if (args.tags) filter.tags = args.tags;
|
|
64
|
+
if (args.root_tasks_only) filter.rootTasksOnly = args.root_tasks_only;
|
|
65
|
+
|
|
66
|
+
let tasks = await deps.taskBackend.listClaimable(filter);
|
|
67
|
+
|
|
68
|
+
const limit = args.limit ?? 20;
|
|
69
|
+
if (tasks.length > limit) {
|
|
70
|
+
tasks = tasks.slice(0, limit);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return {
|
|
74
|
+
tasks,
|
|
75
|
+
count: tasks.length,
|
|
76
|
+
message:
|
|
77
|
+
tasks.length > 0
|
|
78
|
+
? `Found ${tasks.length} claimable task(s)`
|
|
79
|
+
: "No claimable tasks available",
|
|
80
|
+
};
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// =============================================================================
|
|
85
|
+
// Tool Info
|
|
86
|
+
// =============================================================================
|
|
87
|
+
|
|
88
|
+
export const LIST_CLAIMABLE_TASKS_TOOL_INFO = {
|
|
89
|
+
name: "list_claimable_tasks",
|
|
90
|
+
description:
|
|
91
|
+
"List tasks available for claiming. Shows pending, unblocked, unassigned tasks. Requires task.claim capability.",
|
|
92
|
+
schema: ListClaimableTasksSchema,
|
|
93
|
+
};
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* unclaim_task() MCP Tool
|
|
3
|
+
*
|
|
4
|
+
* Allows agents with `task.claim` capability to release a claimed task
|
|
5
|
+
* back to the pending pool.
|
|
6
|
+
*
|
|
7
|
+
* @module mcp/tools/unclaim_task
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { z } from "zod";
|
|
11
|
+
import type { TaskBackend } from "../../task/backend/types.js";
|
|
12
|
+
import type { ToolContext } from "../types.js";
|
|
13
|
+
|
|
14
|
+
// =============================================================================
|
|
15
|
+
// Schema
|
|
16
|
+
// =============================================================================
|
|
17
|
+
|
|
18
|
+
export const UnclaimTaskSchema = {
|
|
19
|
+
task_id: z.string().describe("ID of the task to unclaim"),
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
// =============================================================================
|
|
23
|
+
// Handler
|
|
24
|
+
// =============================================================================
|
|
25
|
+
|
|
26
|
+
export interface UnclaimTaskDeps {
|
|
27
|
+
taskBackend: TaskBackend;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function createUnclaimTaskHandler(
|
|
31
|
+
_context: ToolContext,
|
|
32
|
+
deps: UnclaimTaskDeps
|
|
33
|
+
) {
|
|
34
|
+
return async (args: {
|
|
35
|
+
task_id: string;
|
|
36
|
+
}): Promise<{
|
|
37
|
+
success: boolean;
|
|
38
|
+
message: string;
|
|
39
|
+
}> => {
|
|
40
|
+
if (!deps.taskBackend.unclaim) {
|
|
41
|
+
return {
|
|
42
|
+
success: false,
|
|
43
|
+
message: "Task backend does not support unclaim operations",
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
try {
|
|
48
|
+
await deps.taskBackend.unclaim(args.task_id);
|
|
49
|
+
return {
|
|
50
|
+
success: true,
|
|
51
|
+
message: `Task ${args.task_id} unclaimed and returned to pending pool`,
|
|
52
|
+
};
|
|
53
|
+
} catch (error) {
|
|
54
|
+
return {
|
|
55
|
+
success: false,
|
|
56
|
+
message: `Failed to unclaim task: ${error instanceof Error ? error.message : String(error)}`,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// =============================================================================
|
|
63
|
+
// Tool Info
|
|
64
|
+
// =============================================================================
|
|
65
|
+
|
|
66
|
+
export const UNCLAIM_TASK_TOOL_INFO = {
|
|
67
|
+
name: "unclaim_task",
|
|
68
|
+
description:
|
|
69
|
+
"Release a claimed task back to the pending pool so another agent can pick it up. Requires task.claim capability.",
|
|
70
|
+
schema: UnclaimTaskSchema,
|
|
71
|
+
};
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metrics Module
|
|
3
|
+
*
|
|
4
|
+
* Computes throughput, utilization, and error metrics from EventStore data.
|
|
5
|
+
* No new events needed — aggregates existing spawn, terminate, task, and
|
|
6
|
+
* status events.
|
|
7
|
+
*
|
|
8
|
+
* @module metrics/metrics
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { EventStore } from "../store/event-store.js";
|
|
12
|
+
import type { Agent } from "../store/types/index.js";
|
|
13
|
+
|
|
14
|
+
// =============================================================================
|
|
15
|
+
// Types
|
|
16
|
+
// =============================================================================
|
|
17
|
+
|
|
18
|
+
export interface ThroughputMetrics {
|
|
19
|
+
/** Tasks completed in the time window */
|
|
20
|
+
tasksCompleted: number;
|
|
21
|
+
|
|
22
|
+
/** Tasks failed in the time window */
|
|
23
|
+
tasksFailed: number;
|
|
24
|
+
|
|
25
|
+
/** Total tasks created in the time window */
|
|
26
|
+
tasksCreated: number;
|
|
27
|
+
|
|
28
|
+
/** Average completion time in ms (completed tasks only) */
|
|
29
|
+
avgCompletionTimeMs: number | null;
|
|
30
|
+
|
|
31
|
+
/** Tasks per minute (completed) */
|
|
32
|
+
completedPerMinute: number;
|
|
33
|
+
|
|
34
|
+
/** Time window start */
|
|
35
|
+
windowStart: number;
|
|
36
|
+
|
|
37
|
+
/** Time window end */
|
|
38
|
+
windowEnd: number;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export interface UtilizationMetrics {
|
|
42
|
+
/** Currently running agents */
|
|
43
|
+
activeAgents: number;
|
|
44
|
+
|
|
45
|
+
/** Total agents spawned in the time window */
|
|
46
|
+
totalSpawned: number;
|
|
47
|
+
|
|
48
|
+
/** Total agents stopped in the time window */
|
|
49
|
+
totalStopped: number;
|
|
50
|
+
|
|
51
|
+
/** Agents by role */
|
|
52
|
+
agentsByRole: Record<string, number>;
|
|
53
|
+
|
|
54
|
+
/** Agents by state */
|
|
55
|
+
agentsByState: Record<string, number>;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export interface ErrorMetrics {
|
|
59
|
+
/** Total errors in the time window */
|
|
60
|
+
totalErrors: number;
|
|
61
|
+
|
|
62
|
+
/** Errors by type */
|
|
63
|
+
errorsByType: Record<string, number>;
|
|
64
|
+
|
|
65
|
+
/** Recent errors (last N) */
|
|
66
|
+
recentErrors: ErrorEntry[];
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export interface ErrorEntry {
|
|
70
|
+
/** Timestamp */
|
|
71
|
+
timestamp: number;
|
|
72
|
+
|
|
73
|
+
/** Agent ID */
|
|
74
|
+
agentId: string;
|
|
75
|
+
|
|
76
|
+
/** Error type/category */
|
|
77
|
+
type: string;
|
|
78
|
+
|
|
79
|
+
/** Error summary */
|
|
80
|
+
summary: string;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// =============================================================================
|
|
84
|
+
// Implementation
|
|
85
|
+
// =============================================================================
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Compute throughput metrics for a time window.
|
|
89
|
+
*
|
|
90
|
+
* @param eventStore - EventStore to query
|
|
91
|
+
* @param windowMs - Time window in milliseconds (default: 5 minutes)
|
|
92
|
+
*/
|
|
93
|
+
export function getThroughputMetrics(
|
|
94
|
+
eventStore: EventStore,
|
|
95
|
+
windowMs: number = 5 * 60 * 1000
|
|
96
|
+
): ThroughputMetrics {
|
|
97
|
+
const now = Date.now();
|
|
98
|
+
const windowStart = now - windowMs;
|
|
99
|
+
|
|
100
|
+
const taskEvents = eventStore.query({
|
|
101
|
+
type: "task",
|
|
102
|
+
after: windowStart,
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
let tasksCompleted = 0;
|
|
106
|
+
let tasksFailed = 0;
|
|
107
|
+
let tasksCreated = 0;
|
|
108
|
+
let totalCompletionTimeMs = 0;
|
|
109
|
+
let completedWithTime = 0;
|
|
110
|
+
|
|
111
|
+
for (const event of taskEvents) {
|
|
112
|
+
const action = event.payload?.action as string | undefined;
|
|
113
|
+
|
|
114
|
+
if (action === "created") {
|
|
115
|
+
tasksCreated++;
|
|
116
|
+
} else if (action === "completed") {
|
|
117
|
+
tasksCompleted++;
|
|
118
|
+
|
|
119
|
+
// Try to compute completion time
|
|
120
|
+
const taskId = event.payload?.task_id as string | undefined;
|
|
121
|
+
if (taskId) {
|
|
122
|
+
const task = eventStore.getTask(taskId);
|
|
123
|
+
if (task?.created_at && task?.completed_at) {
|
|
124
|
+
totalCompletionTimeMs += task.completed_at - task.created_at;
|
|
125
|
+
completedWithTime++;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
} else if (action === "failed") {
|
|
129
|
+
tasksFailed++;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const windowMinutes = windowMs / 60000;
|
|
134
|
+
const completedPerMinute =
|
|
135
|
+
windowMinutes > 0 ? tasksCompleted / windowMinutes : 0;
|
|
136
|
+
|
|
137
|
+
return {
|
|
138
|
+
tasksCompleted,
|
|
139
|
+
tasksFailed,
|
|
140
|
+
tasksCreated,
|
|
141
|
+
avgCompletionTimeMs:
|
|
142
|
+
completedWithTime > 0
|
|
143
|
+
? Math.round(totalCompletionTimeMs / completedWithTime)
|
|
144
|
+
: null,
|
|
145
|
+
completedPerMinute: Math.round(completedPerMinute * 100) / 100,
|
|
146
|
+
windowStart,
|
|
147
|
+
windowEnd: now,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Compute utilization metrics (current snapshot + window).
|
|
153
|
+
*
|
|
154
|
+
* @param eventStore - EventStore to query
|
|
155
|
+
* @param windowMs - Time window for spawn/stop counts (default: 5 minutes)
|
|
156
|
+
*/
|
|
157
|
+
export function getUtilizationMetrics(
|
|
158
|
+
eventStore: EventStore,
|
|
159
|
+
windowMs: number = 5 * 60 * 1000
|
|
160
|
+
): UtilizationMetrics {
|
|
161
|
+
const now = Date.now();
|
|
162
|
+
const windowStart = now - windowMs;
|
|
163
|
+
|
|
164
|
+
// Current agents
|
|
165
|
+
const allAgents = eventStore.listAgents();
|
|
166
|
+
const activeAgents = allAgents.filter(
|
|
167
|
+
(a: Agent) => a.state === "running" || a.state === "spawning"
|
|
168
|
+
);
|
|
169
|
+
|
|
170
|
+
// Agents by role
|
|
171
|
+
const agentsByRole: Record<string, number> = {};
|
|
172
|
+
for (const agent of activeAgents) {
|
|
173
|
+
const role = agent.role ?? "unknown";
|
|
174
|
+
agentsByRole[role] = (agentsByRole[role] ?? 0) + 1;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Agents by state
|
|
178
|
+
const agentsByState: Record<string, number> = {};
|
|
179
|
+
for (const agent of allAgents) {
|
|
180
|
+
agentsByState[agent.state] = (agentsByState[agent.state] ?? 0) + 1;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// Count spawn and terminate events in window
|
|
184
|
+
const spawnEvents = eventStore.query({
|
|
185
|
+
type: "spawn",
|
|
186
|
+
after: windowStart,
|
|
187
|
+
});
|
|
188
|
+
const terminateEvents = eventStore.query({
|
|
189
|
+
type: "terminate",
|
|
190
|
+
after: windowStart,
|
|
191
|
+
});
|
|
192
|
+
|
|
193
|
+
return {
|
|
194
|
+
activeAgents: activeAgents.length,
|
|
195
|
+
totalSpawned: spawnEvents.length,
|
|
196
|
+
totalStopped: terminateEvents.length,
|
|
197
|
+
agentsByRole,
|
|
198
|
+
agentsByState,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* Compute error metrics for a time window.
|
|
204
|
+
*
|
|
205
|
+
* @param eventStore - EventStore to query
|
|
206
|
+
* @param windowMs - Time window in milliseconds (default: 30 minutes)
|
|
207
|
+
* @param maxRecent - Maximum recent errors to return (default: 20)
|
|
208
|
+
*/
|
|
209
|
+
export function getErrorMetrics(
|
|
210
|
+
eventStore: EventStore,
|
|
211
|
+
windowMs: number = 30 * 60 * 1000,
|
|
212
|
+
maxRecent: number = 20
|
|
213
|
+
): ErrorMetrics {
|
|
214
|
+
const now = Date.now();
|
|
215
|
+
const windowStart = now - windowMs;
|
|
216
|
+
|
|
217
|
+
// Query status events that indicate errors
|
|
218
|
+
const statusEvents = eventStore.query({
|
|
219
|
+
type: "status",
|
|
220
|
+
after: windowStart,
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
const errors: ErrorEntry[] = [];
|
|
224
|
+
const errorsByType: Record<string, number> = {};
|
|
225
|
+
|
|
226
|
+
for (const event of statusEvents) {
|
|
227
|
+
const statusType = event.payload?.status_type as string | undefined;
|
|
228
|
+
if (statusType !== "failed") continue;
|
|
229
|
+
|
|
230
|
+
const agentId =
|
|
231
|
+
(event.source as { agent_id?: string })?.agent_id ?? "unknown";
|
|
232
|
+
const summary =
|
|
233
|
+
(event.payload?.summary as string) ?? "Unknown error";
|
|
234
|
+
const errorType =
|
|
235
|
+
(event.payload?.details as Record<string, unknown>)?.signal as string ??
|
|
236
|
+
"agent_failed";
|
|
237
|
+
|
|
238
|
+
errors.push({
|
|
239
|
+
timestamp: event.timestamp,
|
|
240
|
+
agentId,
|
|
241
|
+
type: errorType,
|
|
242
|
+
summary,
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
errorsByType[errorType] = (errorsByType[errorType] ?? 0) + 1;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// Also count task failures
|
|
249
|
+
const taskEvents = eventStore.query({
|
|
250
|
+
type: "task",
|
|
251
|
+
after: windowStart,
|
|
252
|
+
});
|
|
253
|
+
|
|
254
|
+
for (const event of taskEvents) {
|
|
255
|
+
if (event.payload?.action !== "failed") continue;
|
|
256
|
+
|
|
257
|
+
const agentId =
|
|
258
|
+
(event.source as { agent_id?: string })?.agent_id ?? "unknown";
|
|
259
|
+
const taskId = (event.payload?.task_id as string) ?? "unknown";
|
|
260
|
+
|
|
261
|
+
errors.push({
|
|
262
|
+
timestamp: event.timestamp,
|
|
263
|
+
agentId,
|
|
264
|
+
type: "task_failed",
|
|
265
|
+
summary: `Task ${taskId} failed`,
|
|
266
|
+
});
|
|
267
|
+
|
|
268
|
+
errorsByType["task_failed"] = (errorsByType["task_failed"] ?? 0) + 1;
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// Sort by timestamp descending and limit
|
|
272
|
+
errors.sort((a, b) => b.timestamp - a.timestamp);
|
|
273
|
+
const recentErrors = errors.slice(0, maxRecent);
|
|
274
|
+
|
|
275
|
+
return {
|
|
276
|
+
totalErrors: errors.length,
|
|
277
|
+
errorsByType,
|
|
278
|
+
recentErrors,
|
|
279
|
+
};
|
|
280
|
+
}
|
|
@@ -48,6 +48,7 @@ export const TASK_CAPABILITIES = {
|
|
|
48
48
|
ASSIGN: "task.assign" as const,
|
|
49
49
|
UPDATE: "task.update" as const,
|
|
50
50
|
CLOSE: "task.close" as const,
|
|
51
|
+
CLAIM: "task.claim" as const,
|
|
51
52
|
};
|
|
52
53
|
|
|
53
54
|
/** Execution capabilities */
|
|
@@ -101,6 +102,7 @@ export const ALL_CAPABILITIES: Set<Capability> = new Set([
|
|
|
101
102
|
TASK_CAPABILITIES.ASSIGN,
|
|
102
103
|
TASK_CAPABILITIES.UPDATE,
|
|
103
104
|
TASK_CAPABILITIES.CLOSE,
|
|
105
|
+
TASK_CAPABILITIES.CLAIM,
|
|
104
106
|
// Exec
|
|
105
107
|
EXEC_CAPABILITIES.COMMAND,
|
|
106
108
|
EXEC_CAPABILITIES.BUILD,
|
|
@@ -159,6 +161,7 @@ export const CAPABILITY_TOOL_MAP: CapabilityToolMap = {
|
|
|
159
161
|
[TASK_CAPABILITIES.ASSIGN]: ["sudocode_upsert_issue", "assign_task"],
|
|
160
162
|
[TASK_CAPABILITIES.UPDATE]: ["sudocode_upsert_issue", "update_task"],
|
|
161
163
|
[TASK_CAPABILITIES.CLOSE]: ["sudocode_upsert_issue", "close_task"],
|
|
164
|
+
[TASK_CAPABILITIES.CLAIM]: ["claim_task", "unclaim_task", "list_claimable_tasks"],
|
|
162
165
|
|
|
163
166
|
// Execution operations
|
|
164
167
|
[EXEC_CAPABILITIES.COMMAND]: ["bash"],
|
package/src/roles/types.ts
CHANGED
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# Router Module
|
|
2
|
+
|
|
3
|
+
Core internal message routing for macro-agent. Handles all agent-to-agent communication.
|
|
4
|
+
|
|
5
|
+
## Architecture
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
┌─────────────────────────────────────────────────────────────┐
|
|
9
|
+
│ MessageRouter │
|
|
10
|
+
│ │
|
|
11
|
+
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────────┐ │
|
|
12
|
+
│ │ Legacy API │ │ Address API │ │ Status/Events │ │
|
|
13
|
+
│ │ send() │ │ sendTo │ │ emitStatus() │ │
|
|
14
|
+
│ │ sendMessage │ │ Address() │ │ subscribe() │ │
|
|
15
|
+
│ └─────────────┘ └─────────────┘ └─────────────────────┘ │
|
|
16
|
+
│ │ │ │ │
|
|
17
|
+
│ └────────────────┼───────────────────┘ │
|
|
18
|
+
│ ▼ │
|
|
19
|
+
│ ┌─────────────┐ │
|
|
20
|
+
│ │ EventStore │ │
|
|
21
|
+
│ └─────────────┘ │
|
|
22
|
+
└─────────────────────────────────────────────────────────────┘
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Components
|
|
26
|
+
|
|
27
|
+
### MessageRouter (`message-router.ts`)
|
|
28
|
+
|
|
29
|
+
The central routing authority. Two APIs:
|
|
30
|
+
|
|
31
|
+
**Legacy Channel-based** (`send`, `sendMessage`):
|
|
32
|
+
```typescript
|
|
33
|
+
router.send(from, { agent_id: targetId }, content);
|
|
34
|
+
router.send(from, { task_id: taskId }, content);
|
|
35
|
+
router.send(from, { topic: "updates" }, content);
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
**MAP Address-based** (`sendToAddress`):
|
|
39
|
+
```typescript
|
|
40
|
+
router.sendToAddress({
|
|
41
|
+
from: agentId,
|
|
42
|
+
to: { agent: targetId },
|
|
43
|
+
content: "Hello",
|
|
44
|
+
priority: "high",
|
|
45
|
+
});
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Channels (`channels.ts`, `types.ts`)
|
|
49
|
+
|
|
50
|
+
Channel types for legacy routing:
|
|
51
|
+
- `agent_id` - Direct to agent
|
|
52
|
+
- `task_id` - To task's assigned agent
|
|
53
|
+
- `topic` - Pub/sub topic
|
|
54
|
+
- `lineage` - To ancestors
|
|
55
|
+
- `subtree` - To descendants
|
|
56
|
+
- `broadcast` - System-wide
|
|
57
|
+
|
|
58
|
+
### Role Resolution (`role-resolver.ts`)
|
|
59
|
+
|
|
60
|
+
Resolves role-based addresses to agent IDs:
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
const workers = resolveRoleTarget(agentSource, {
|
|
64
|
+
role: "worker",
|
|
65
|
+
scope: "project-1", // Filter by scope membership
|
|
66
|
+
coordinatorId: "coord-1", // Filter by subtree
|
|
67
|
+
});
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Wake Logic (`wake.ts`)
|
|
71
|
+
|
|
72
|
+
Priority-based wake decisions:
|
|
73
|
+
- `urgent` → Interrupt current activity
|
|
74
|
+
- `high` → Inject into session (fallback: interrupt)
|
|
75
|
+
- `normal` → Wake if idle
|
|
76
|
+
- `low` → Queue only
|
|
77
|
+
|
|
78
|
+
### Broadcast (`broadcast.ts`)
|
|
79
|
+
|
|
80
|
+
Fan-out message delivery:
|
|
81
|
+
- `all` - All running agents
|
|
82
|
+
- `coordinators` - Agents with coordinator role
|
|
83
|
+
- `workers` - Agents with worker role
|
|
84
|
+
- `monitors` - Agents with monitor role
|
|
85
|
+
|
|
86
|
+
## Usage
|
|
87
|
+
|
|
88
|
+
```typescript
|
|
89
|
+
import { createMessageRouter } from "./router/message-router.js";
|
|
90
|
+
|
|
91
|
+
const router = createMessageRouter({
|
|
92
|
+
eventStore,
|
|
93
|
+
agentManager,
|
|
94
|
+
federationHandler, // Optional: for cross-system routing
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
// Send to agent
|
|
98
|
+
await router.sendToAddress({
|
|
99
|
+
from: senderId,
|
|
100
|
+
to: { agent: recipientId },
|
|
101
|
+
content: "Hello",
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
// Send to role
|
|
105
|
+
await router.sendToAddress({
|
|
106
|
+
from: senderId,
|
|
107
|
+
to: { role: "worker" },
|
|
108
|
+
content: "Task update",
|
|
109
|
+
});
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## Relationship to Other Routers
|
|
113
|
+
|
|
114
|
+
| Router | Purpose | Entry Point |
|
|
115
|
+
|--------|---------|-------------|
|
|
116
|
+
| **MessageRouter** | Internal agent↔agent | AgentManager, MCP tools |
|
|
117
|
+
| **MAPAdapter** | External MAP clients | WebSocket connections |
|
|
118
|
+
| **TriggerRouter** | External events | Webhooks, cron |
|
|
119
|
+
|
|
120
|
+
MessageRouter is the **core authority** - other routers delegate to it.
|