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,228 +0,0 @@
|
|
|
1
|
-
# mcp-tools Specification
|
|
2
|
-
|
|
3
|
-
## Purpose
|
|
4
|
-
TBD - created by archiving change add-mvp-foundation. Update Purpose after archive.
|
|
5
|
-
## Requirements
|
|
6
|
-
### Requirement: MCP Server Setup
|
|
7
|
-
|
|
8
|
-
The system SHALL provide an MCP server that exposes multi-agent tools to agents.
|
|
9
|
-
|
|
10
|
-
#### Scenario: Start MCP server
|
|
11
|
-
- **GIVEN** the multi-agent system is initialized
|
|
12
|
-
- **WHEN** the MCP server is started
|
|
13
|
-
- **THEN** the server registers all available tools
|
|
14
|
-
- **AND** agents can discover tools via the MCP protocol
|
|
15
|
-
|
|
16
|
-
#### Scenario: Tool context injection
|
|
17
|
-
- **GIVEN** an agent with id 'agent_1' and session 'sess_123'
|
|
18
|
-
- **WHEN** the agent calls any MCP tool
|
|
19
|
-
- **THEN** the tool handler receives context { agent_id: 'agent_1', session_id: 'sess_123' }
|
|
20
|
-
- **AND** the tool can use this context for authorization and attribution
|
|
21
|
-
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
### Requirement: spawn_agent Tool
|
|
25
|
-
|
|
26
|
-
The system SHALL provide a tool for agents to spawn child agents.
|
|
27
|
-
|
|
28
|
-
#### Scenario: Spawn child agent
|
|
29
|
-
- **GIVEN** an agent 'manager_1' calls spawn_agent
|
|
30
|
-
- **WHEN** spawn_agent({ task: 'Implement feature X' }) is invoked
|
|
31
|
-
- **THEN** a new agent is spawned with parent 'manager_1'
|
|
32
|
-
- **AND** the tool returns { agent_id, task_id }
|
|
33
|
-
|
|
34
|
-
#### Scenario: Spawn with subscribe_parent false
|
|
35
|
-
- **GIVEN** an agent calls spawn_agent with fire-and-forget intent
|
|
36
|
-
- **WHEN** spawn_agent({ task: 'Background task', subscribe_parent: false }) is invoked
|
|
37
|
-
- **THEN** the parent is NOT subscribed to the child's subtree
|
|
38
|
-
- **AND** the child operates independently
|
|
39
|
-
|
|
40
|
-
#### Scenario: Spawn with custom config
|
|
41
|
-
- **GIVEN** an agent needs a specific model for a child
|
|
42
|
-
- **WHEN** spawn_agent({ task: 'Complex analysis', config: { model: 'claude-opus-4-20250514' } }) is invoked
|
|
43
|
-
- **THEN** the child agent uses the specified model
|
|
44
|
-
|
|
45
|
-
---
|
|
46
|
-
|
|
47
|
-
### Requirement: emit_status Tool
|
|
48
|
-
|
|
49
|
-
The system SHALL provide a tool for agents to report status milestones.
|
|
50
|
-
|
|
51
|
-
#### Scenario: Emit started status
|
|
52
|
-
- **GIVEN** agent 'worker_1' beginning work
|
|
53
|
-
- **WHEN** emit_status({ status_type: 'started', summary: 'Beginning implementation' }) is invoked
|
|
54
|
-
- **THEN** a status event is emitted with source agent_id 'worker_1'
|
|
55
|
-
- **AND** the tool returns { event_id }
|
|
56
|
-
|
|
57
|
-
#### Scenario: Emit checkpoint status
|
|
58
|
-
- **GIVEN** agent 'worker_1' reaching a milestone
|
|
59
|
-
- **WHEN** emit_status({ status_type: 'checkpoint', summary: '50% complete', details: { progress: '50%' } }) is invoked
|
|
60
|
-
- **THEN** the status event includes the details
|
|
61
|
-
- **AND** subscribers (e.g., parent) receive the update
|
|
62
|
-
|
|
63
|
-
#### Scenario: Emit completed status
|
|
64
|
-
- **GIVEN** agent 'worker_1' finishing work
|
|
65
|
-
- **WHEN** emit_status({ status_type: 'completed', summary: 'Task finished', details: { artifacts: [...] } }) is invoked
|
|
66
|
-
- **THEN** the completion is recorded
|
|
67
|
-
- **AND** the agent's task status is updated
|
|
68
|
-
|
|
69
|
-
---
|
|
70
|
-
|
|
71
|
-
### Requirement: send_message Tool
|
|
72
|
-
|
|
73
|
-
The system SHALL provide a tool for agents to send messages.
|
|
74
|
-
|
|
75
|
-
#### Scenario: Send direct message
|
|
76
|
-
- **GIVEN** agent 'agent_1' wants to message 'agent_2'
|
|
77
|
-
- **WHEN** send_message({ to: { agent_id: 'agent_2' }, content: 'Need your input' }) is invoked
|
|
78
|
-
- **THEN** the message is routed to agent_2
|
|
79
|
-
- **AND** the tool returns { message_id }
|
|
80
|
-
|
|
81
|
-
#### Scenario: Send message to topic
|
|
82
|
-
- **GIVEN** agent 'agent_1' wants to broadcast to a topic
|
|
83
|
-
- **WHEN** send_message({ to: { topic: 'discoveries' }, content: 'Found issue X' }) is invoked
|
|
84
|
-
- **THEN** all agents subscribed to 'discoveries' receive the message
|
|
85
|
-
|
|
86
|
-
#### Scenario: Send reply with correlation
|
|
87
|
-
- **GIVEN** agent received message 'msg_123'
|
|
88
|
-
- **WHEN** send_message({ to: { agent_id: 'sender' }, content: 'Response', correlation_id: 'msg_123' }) is invoked
|
|
89
|
-
- **THEN** the response is threaded with the original message
|
|
90
|
-
|
|
91
|
-
---
|
|
92
|
-
|
|
93
|
-
### Requirement: check_messages Tool
|
|
94
|
-
|
|
95
|
-
The system SHALL provide a tool for agents to check their message queue.
|
|
96
|
-
|
|
97
|
-
#### Scenario: Check messages with default limit
|
|
98
|
-
- **GIVEN** agent 'agent_1' has pending messages
|
|
99
|
-
- **WHEN** check_messages({}) is invoked by agent_1
|
|
100
|
-
- **THEN** up to 10 messages are returned (default limit)
|
|
101
|
-
- **AND** messages include id, from, content, timestamp, truncated flag
|
|
102
|
-
|
|
103
|
-
#### Scenario: Check messages with custom limit
|
|
104
|
-
- **GIVEN** agent 'agent_1' has many pending messages
|
|
105
|
-
- **WHEN** check_messages({ limit: 5 }) is invoked
|
|
106
|
-
- **THEN** only 5 messages are returned
|
|
107
|
-
|
|
108
|
-
#### Scenario: No pending messages
|
|
109
|
-
- **GIVEN** agent 'agent_1' has no pending messages
|
|
110
|
-
- **WHEN** check_messages({}) is invoked
|
|
111
|
-
- **THEN** an empty messages array is returned
|
|
112
|
-
|
|
113
|
-
---
|
|
114
|
-
|
|
115
|
-
### Requirement: query_index Tool
|
|
116
|
-
|
|
117
|
-
The system SHALL provide a tool for agents to search for agents and tasks.
|
|
118
|
-
|
|
119
|
-
#### Scenario: Query running agents
|
|
120
|
-
- **GIVEN** multiple agents in various states
|
|
121
|
-
- **WHEN** query_index({ type: 'agents', filter: { state: 'running' } }) is invoked
|
|
122
|
-
- **THEN** only running agents are returned
|
|
123
|
-
- **AND** the tool returns { entries, total, has_more }
|
|
124
|
-
|
|
125
|
-
#### Scenario: Query tasks by status
|
|
126
|
-
- **GIVEN** tasks in various statuses
|
|
127
|
-
- **WHEN** query_index({ type: 'tasks', filter: { status: 'in_progress' } }) is invoked
|
|
128
|
-
- **THEN** only in-progress tasks are returned
|
|
129
|
-
|
|
130
|
-
#### Scenario: Search with text query
|
|
131
|
-
- **GIVEN** agents and tasks with various descriptions
|
|
132
|
-
- **WHEN** query_index({ type: 'all', search: 'authentication' }) is invoked
|
|
133
|
-
- **THEN** entries matching 'authentication' are returned
|
|
134
|
-
- **AND** results are sorted by relevance/recency
|
|
135
|
-
|
|
136
|
-
---
|
|
137
|
-
|
|
138
|
-
### Requirement: get_hierarchy Tool
|
|
139
|
-
|
|
140
|
-
The system SHALL provide a tool for agents to view the agent tree.
|
|
141
|
-
|
|
142
|
-
#### Scenario: Get full hierarchy
|
|
143
|
-
- **GIVEN** a multi-level agent hierarchy
|
|
144
|
-
- **WHEN** get_hierarchy({}) is invoked
|
|
145
|
-
- **THEN** the complete tree from head manager is returned
|
|
146
|
-
- **AND** each node includes agent_id, task, state, children
|
|
147
|
-
|
|
148
|
-
#### Scenario: Get hierarchy from specific root
|
|
149
|
-
- **GIVEN** agent 'manager_1' with children
|
|
150
|
-
- **WHEN** get_hierarchy({ root: 'manager_1' }) is invoked
|
|
151
|
-
- **THEN** only the subtree under manager_1 is returned
|
|
152
|
-
|
|
153
|
-
#### Scenario: Get hierarchy with depth limit
|
|
154
|
-
- **GIVEN** a deep hierarchy
|
|
155
|
-
- **WHEN** get_hierarchy({ depth: 2 }) is invoked
|
|
156
|
-
- **THEN** only 2 levels of the hierarchy are returned
|
|
157
|
-
|
|
158
|
-
---
|
|
159
|
-
|
|
160
|
-
### Requirement: get_agent_summary Tool
|
|
161
|
-
|
|
162
|
-
The system SHALL provide a tool for quick agent lookup.
|
|
163
|
-
|
|
164
|
-
#### Scenario: Get agent summary
|
|
165
|
-
- **GIVEN** agent 'worker_1' exists with recent activity
|
|
166
|
-
- **WHEN** get_agent_summary({ agent_id: 'worker_1' }) is invoked
|
|
167
|
-
- **THEN** the summary includes id, session_id, task, state, parent, children_count, last_activity, recent_status
|
|
168
|
-
|
|
169
|
-
#### Scenario: Get non-existent agent
|
|
170
|
-
- **GIVEN** no agent with id 'nonexistent'
|
|
171
|
-
- **WHEN** get_agent_summary({ agent_id: 'nonexistent' }) is invoked
|
|
172
|
-
- **THEN** an error is returned indicating agent not found
|
|
173
|
-
|
|
174
|
-
---
|
|
175
|
-
|
|
176
|
-
### Requirement: stop_agent Tool
|
|
177
|
-
|
|
178
|
-
The system SHALL provide a tool for agents to terminate their children.
|
|
179
|
-
|
|
180
|
-
#### Scenario: Stop own child
|
|
181
|
-
- **GIVEN** agent 'manager_1' spawned 'worker_1'
|
|
182
|
-
- **WHEN** manager_1 invokes stop_agent({ agent_id: 'worker_1' })
|
|
183
|
-
- **THEN** worker_1 is terminated with reason 'stopped'
|
|
184
|
-
- **AND** the tool returns { success: true }
|
|
185
|
-
|
|
186
|
-
#### Scenario: Stop grandchild
|
|
187
|
-
- **GIVEN** hierarchy: manager_1 → worker_1 → helper_1
|
|
188
|
-
- **WHEN** manager_1 invokes stop_agent({ agent_id: 'helper_1' })
|
|
189
|
-
- **THEN** helper_1 is terminated (manager_1 owns the subtree)
|
|
190
|
-
|
|
191
|
-
#### Scenario: Cannot stop agent outside subtree
|
|
192
|
-
- **GIVEN** agent 'agent_A' not in 'agent_B's subtree
|
|
193
|
-
- **WHEN** agent_B invokes stop_agent({ agent_id: 'agent_A' })
|
|
194
|
-
- **THEN** the operation fails with error 'Cannot stop agent outside your subtree'
|
|
195
|
-
|
|
196
|
-
---
|
|
197
|
-
|
|
198
|
-
### Requirement: create_task Tool
|
|
199
|
-
|
|
200
|
-
The system SHALL provide a tool for agents to create explicit tasks.
|
|
201
|
-
|
|
202
|
-
#### Scenario: Create task
|
|
203
|
-
- **GIVEN** agent 'manager_1' wants to create a task
|
|
204
|
-
- **WHEN** create_task({ description: 'Review code changes' }) is invoked by manager_1
|
|
205
|
-
- **THEN** a new task is created with created_by: 'manager_1'
|
|
206
|
-
- **AND** the tool returns { task_id }
|
|
207
|
-
|
|
208
|
-
#### Scenario: Create subtask
|
|
209
|
-
- **GIVEN** parent task 'task_1' exists
|
|
210
|
-
- **WHEN** create_task({ description: 'Subtask', parent_task: 'task_1' }) is invoked
|
|
211
|
-
- **THEN** the task is created with parent_task reference
|
|
212
|
-
|
|
213
|
-
---
|
|
214
|
-
|
|
215
|
-
### Requirement: get_task Tool
|
|
216
|
-
|
|
217
|
-
The system SHALL provide a tool for agents to lookup task details.
|
|
218
|
-
|
|
219
|
-
#### Scenario: Get task details
|
|
220
|
-
- **GIVEN** task 'task_1' exists
|
|
221
|
-
- **WHEN** get_task({ task_id: 'task_1' }) is invoked
|
|
222
|
-
- **THEN** the full task record is returned including description, status, assigned_agent, inputs, outputs, artifacts
|
|
223
|
-
|
|
224
|
-
#### Scenario: Get non-existent task
|
|
225
|
-
- **GIVEN** no task with id 'nonexistent'
|
|
226
|
-
- **WHEN** get_task({ task_id: 'nonexistent' }) is invoked
|
|
227
|
-
- **THEN** an error is returned indicating task not found
|
|
228
|
-
|
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
# message-router Specification
|
|
2
|
-
|
|
3
|
-
## Purpose
|
|
4
|
-
TBD - created by archiving change add-mvp-foundation. Update Purpose after archive.
|
|
5
|
-
## Requirements
|
|
6
|
-
### Requirement: Message Sending
|
|
7
|
-
|
|
8
|
-
The system SHALL route messages to recipients based on target specification.
|
|
9
|
-
|
|
10
|
-
#### Scenario: Send direct message to agent
|
|
11
|
-
- **GIVEN** agents 'sender_1' and 'recipient_1' exist
|
|
12
|
-
- **WHEN** send({ from: { agent_id: 'sender_1' }, to: { agent_id: 'recipient_1' }, content: 'Hello' }) is called
|
|
13
|
-
- **THEN** a message event is emitted
|
|
14
|
-
- **AND** the message appears in recipient_1's pending queue
|
|
15
|
-
- **AND** the function returns the message with id and timestamp
|
|
16
|
-
|
|
17
|
-
#### Scenario: Send message to task
|
|
18
|
-
- **GIVEN** task 'task_1' assigned to agent 'worker_1'
|
|
19
|
-
- **WHEN** send({ from: { agent_id: 'sender_1' }, to: { task_id: 'task_1' }, content: 'Status update needed' }) is called
|
|
20
|
-
- **THEN** the message is routed to 'worker_1' (the assigned agent)
|
|
21
|
-
- **AND** the message appears in worker_1's pending queue
|
|
22
|
-
|
|
23
|
-
#### Scenario: Send message to topic
|
|
24
|
-
- **GIVEN** agents 'agent_1' and 'agent_2' subscribed to topic 'errors'
|
|
25
|
-
- **WHEN** send({ from: { agent_id: 'sender_1' }, to: { topic: 'errors' }, content: 'Error detected' }) is called
|
|
26
|
-
- **THEN** the message appears in both agent_1's and agent_2's pending queues
|
|
27
|
-
|
|
28
|
-
#### Scenario: Send message with correlation_id
|
|
29
|
-
- **GIVEN** an original message with id 'msg_123'
|
|
30
|
-
- **WHEN** send({ from: { agent_id: 'responder' }, to: { agent_id: 'requester' }, content: 'Response', correlation_id: 'msg_123' }) is called
|
|
31
|
-
- **THEN** the message includes correlation_id 'msg_123' for threading
|
|
32
|
-
|
|
33
|
-
---
|
|
34
|
-
|
|
35
|
-
### Requirement: Message Retrieval
|
|
36
|
-
|
|
37
|
-
The system SHALL allow agents to retrieve their pending messages.
|
|
38
|
-
|
|
39
|
-
#### Scenario: Get pending messages
|
|
40
|
-
- **GIVEN** agent 'agent_1' has 3 pending messages
|
|
41
|
-
- **WHEN** getMessages('agent_1') is called
|
|
42
|
-
- **THEN** all 3 messages are returned in chronological order
|
|
43
|
-
- **AND** each message includes id, from, content, timestamp
|
|
44
|
-
|
|
45
|
-
#### Scenario: Get messages with limit
|
|
46
|
-
- **GIVEN** agent 'agent_1' has 10 pending messages
|
|
47
|
-
- **WHEN** getMessages('agent_1', { limit: 5 }) is called
|
|
48
|
-
- **THEN** only the 5 oldest messages are returned
|
|
49
|
-
|
|
50
|
-
#### Scenario: Get full message content
|
|
51
|
-
- **GIVEN** a message 'msg_1' with truncated content in the queue
|
|
52
|
-
- **WHEN** getFullMessage('msg_1') is called
|
|
53
|
-
- **THEN** the complete message content is returned
|
|
54
|
-
|
|
55
|
-
#### Scenario: Empty message queue
|
|
56
|
-
- **GIVEN** agent 'agent_1' has no pending messages
|
|
57
|
-
- **WHEN** getMessages('agent_1') is called
|
|
58
|
-
- **THEN** an empty array is returned
|
|
59
|
-
|
|
60
|
-
---
|
|
61
|
-
|
|
62
|
-
### Requirement: Subscription Management
|
|
63
|
-
|
|
64
|
-
The system SHALL manage agent subscriptions to message channels.
|
|
65
|
-
|
|
66
|
-
#### Scenario: Subscribe to topic
|
|
67
|
-
- **GIVEN** agent 'agent_1' with no topic subscriptions
|
|
68
|
-
- **WHEN** subscribe('agent_1', { type: 'topic', target: 'discoveries' }) is called
|
|
69
|
-
- **THEN** agent_1 is subscribed to topic 'discoveries'
|
|
70
|
-
- **AND** future messages to topic 'discoveries' are routed to agent_1
|
|
71
|
-
|
|
72
|
-
#### Scenario: Subscribe to agent channel
|
|
73
|
-
- **GIVEN** agent 'agent_1'
|
|
74
|
-
- **WHEN** subscribe('agent_1', { type: 'agent', target: 'agent_1' }) is called
|
|
75
|
-
- **THEN** agent_1 receives direct messages addressed to it
|
|
76
|
-
|
|
77
|
-
#### Scenario: Subscribe to subtree
|
|
78
|
-
- **GIVEN** manager 'manager_1' spawned child 'child_1'
|
|
79
|
-
- **WHEN** subscribe('manager_1', { type: 'subtree', target: 'child_1' }) is called
|
|
80
|
-
- **THEN** manager_1 receives all events from child_1 and its descendants
|
|
81
|
-
|
|
82
|
-
#### Scenario: Unsubscribe from topic
|
|
83
|
-
- **GIVEN** agent 'agent_1' subscribed to topic 'updates'
|
|
84
|
-
- **WHEN** unsubscribe('agent_1', { type: 'topic', target: 'updates' }) is called
|
|
85
|
-
- **THEN** agent_1 no longer receives messages to topic 'updates'
|
|
86
|
-
|
|
87
|
-
#### Scenario: Get agent subscriptions
|
|
88
|
-
- **GIVEN** agent 'agent_1' with multiple subscriptions
|
|
89
|
-
- **WHEN** getSubscriptions('agent_1') is called
|
|
90
|
-
- **THEN** all subscriptions are returned as an array of { type, target }
|
|
91
|
-
|
|
92
|
-
---
|
|
93
|
-
|
|
94
|
-
### Requirement: Automatic Subscription Setup
|
|
95
|
-
|
|
96
|
-
The system SHALL configure default subscriptions when agents spawn.
|
|
97
|
-
|
|
98
|
-
#### Scenario: Default subscriptions on spawn
|
|
99
|
-
- **GIVEN** spawning agent 'child_1' with parent 'parent_1'
|
|
100
|
-
- **WHEN** default subscriptions are set up
|
|
101
|
-
- **THEN** child_1 is subscribed to { type: 'agent', target: 'child_1' }
|
|
102
|
-
- **AND** child_1 is subscribed to { type: 'lineage', target: 'child_1' }
|
|
103
|
-
- **AND** if task_id provided, child_1 is subscribed to { type: 'task', target: task_id }
|
|
104
|
-
|
|
105
|
-
#### Scenario: Parent subtree subscription
|
|
106
|
-
- **GIVEN** spawning agent 'child_1' with parent 'parent_1' and subscribe_parent: true
|
|
107
|
-
- **WHEN** default subscriptions are set up
|
|
108
|
-
- **THEN** parent_1 is subscribed to { type: 'subtree', target: 'child_1' }
|
|
109
|
-
|
|
110
|
-
#### Scenario: Skip parent subscription
|
|
111
|
-
- **GIVEN** spawning agent 'child_1' with parent 'parent_1' and subscribe_parent: false
|
|
112
|
-
- **WHEN** default subscriptions are set up
|
|
113
|
-
- **THEN** parent_1 is NOT subscribed to child_1's subtree
|
|
114
|
-
|
|
115
|
-
---
|
|
116
|
-
|
|
117
|
-
### Requirement: Status Event Routing
|
|
118
|
-
|
|
119
|
-
The system SHALL route status events to appropriate subscribers.
|
|
120
|
-
|
|
121
|
-
#### Scenario: Route status to parent
|
|
122
|
-
- **GIVEN** agent 'child_1' with parent 'parent_1' subscribed to subtree
|
|
123
|
-
- **WHEN** child_1 emits a status event (e.g., 'checkpoint')
|
|
124
|
-
- **THEN** the status event appears in parent_1's message queue
|
|
125
|
-
- **AND** the event includes agent_id, task_id, status_type, summary
|
|
126
|
-
|
|
127
|
-
#### Scenario: Route completed status
|
|
128
|
-
- **GIVEN** agent 'worker_1' with manager 'manager_1' subscribed to subtree
|
|
129
|
-
- **WHEN** worker_1 emits status { status_type: 'completed', summary: 'Task done' }
|
|
130
|
-
- **THEN** manager_1 receives the completion notification
|
|
131
|
-
- **AND** can query worker_1 for detailed results
|
|
132
|
-
|
|
133
|
-
#### Scenario: Route failed status
|
|
134
|
-
- **GIVEN** agent 'worker_1' with manager 'manager_1' subscribed to subtree
|
|
135
|
-
- **WHEN** worker_1 emits status { status_type: 'failed', summary: 'Error occurred' }
|
|
136
|
-
- **THEN** manager_1 receives the failure notification
|
|
137
|
-
- **AND** the event includes error details for manager to decide on recovery
|
|
138
|
-
|
|
139
|
-
---
|
|
140
|
-
|
|
141
|
-
### Requirement: Message Truncation
|
|
142
|
-
|
|
143
|
-
The system SHALL truncate large messages in the queue with reference to full content.
|
|
144
|
-
|
|
145
|
-
#### Scenario: Truncate large message
|
|
146
|
-
- **GIVEN** a message with content exceeding the configured limit (e.g., 1000 tokens)
|
|
147
|
-
- **WHEN** the message is added to a recipient's queue
|
|
148
|
-
- **THEN** the queued message content is truncated
|
|
149
|
-
- **AND** the message is marked with truncated: true
|
|
150
|
-
- **AND** the full content is retrievable via getFullMessage(message_id)
|
|
151
|
-
|
|
152
|
-
#### Scenario: Small message not truncated
|
|
153
|
-
- **GIVEN** a message with content under the configured limit
|
|
154
|
-
- **WHEN** the message is added to a recipient's queue
|
|
155
|
-
- **THEN** the full content is included
|
|
156
|
-
- **AND** the message is marked with truncated: false
|
|
157
|
-
|
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
# task-manager Specification
|
|
2
|
-
|
|
3
|
-
## Purpose
|
|
4
|
-
TBD - created by archiving change add-mvp-foundation. Update Purpose after archive.
|
|
5
|
-
## Requirements
|
|
6
|
-
### Requirement: Task Creation
|
|
7
|
-
|
|
8
|
-
The system SHALL create tasks with unique IDs and emit task events.
|
|
9
|
-
|
|
10
|
-
#### Scenario: Create a new task
|
|
11
|
-
- **GIVEN** an initialized TaskManager
|
|
12
|
-
- **WHEN** create({ description: 'Implement user authentication', created_by: 'agent_1' }) is called
|
|
13
|
-
- **THEN** a unique task_id is generated
|
|
14
|
-
- **AND** a task event with action 'created' is emitted
|
|
15
|
-
- **AND** the task appears in the tasks view with status 'pending'
|
|
16
|
-
- **AND** the function returns the new task record
|
|
17
|
-
|
|
18
|
-
#### Scenario: Create task with inputs
|
|
19
|
-
- **GIVEN** an initialized TaskManager
|
|
20
|
-
- **WHEN** create({ description: 'Review PR #123', created_by: 'manager_1', inputs: { pr_number: 123, repo: 'my-repo' } }) is called
|
|
21
|
-
- **THEN** the task is created with the provided inputs
|
|
22
|
-
- **AND** the inputs are stored in the task record
|
|
23
|
-
|
|
24
|
-
---
|
|
25
|
-
|
|
26
|
-
### Requirement: Task Retrieval
|
|
27
|
-
|
|
28
|
-
The system SHALL support retrieving tasks by ID and filtering.
|
|
29
|
-
|
|
30
|
-
#### Scenario: Get task by ID
|
|
31
|
-
- **GIVEN** a task 'task_1' exists
|
|
32
|
-
- **WHEN** get('task_1') is called
|
|
33
|
-
- **THEN** the full task record is returned including id, description, status, assigned_agent, timestamps
|
|
34
|
-
|
|
35
|
-
#### Scenario: Get non-existent task
|
|
36
|
-
- **GIVEN** no task with id 'nonexistent'
|
|
37
|
-
- **WHEN** get('nonexistent') is called
|
|
38
|
-
- **THEN** null is returned
|
|
39
|
-
|
|
40
|
-
#### Scenario: List tasks with status filter
|
|
41
|
-
- **GIVEN** tasks in various statuses (pending, in_progress, completed)
|
|
42
|
-
- **WHEN** list({ status: 'in_progress' }) is called
|
|
43
|
-
- **THEN** only tasks with status 'in_progress' are returned
|
|
44
|
-
|
|
45
|
-
#### Scenario: List tasks by assigned agent
|
|
46
|
-
- **GIVEN** agent 'worker_1' assigned to tasks 'task_1' and 'task_2'
|
|
47
|
-
- **WHEN** list({ assigned_agent: 'worker_1' }) is called
|
|
48
|
-
- **THEN** both 'task_1' and 'task_2' are returned
|
|
49
|
-
|
|
50
|
-
---
|
|
51
|
-
|
|
52
|
-
### Requirement: Task Assignment
|
|
53
|
-
|
|
54
|
-
The system SHALL support assigning and unassigning agents to tasks.
|
|
55
|
-
|
|
56
|
-
#### Scenario: Assign agent to task
|
|
57
|
-
- **GIVEN** a task 'task_1' in 'pending' status
|
|
58
|
-
- **WHEN** assign('task_1', 'worker_1') is called
|
|
59
|
-
- **THEN** a task event with action 'assigned' is emitted
|
|
60
|
-
- **AND** the task's assigned_agent is set to 'worker_1'
|
|
61
|
-
- **AND** the task's status changes to 'assigned'
|
|
62
|
-
- **AND** an entry is added to the task's agent_history
|
|
63
|
-
|
|
64
|
-
#### Scenario: Assign with role
|
|
65
|
-
- **GIVEN** a task 'task_1' in 'pending' status
|
|
66
|
-
- **WHEN** assign('task_1', 'reviewer_1', 'reviewer') is called
|
|
67
|
-
- **THEN** the agent_history entry includes role 'reviewer'
|
|
68
|
-
|
|
69
|
-
#### Scenario: Unassign agent from task
|
|
70
|
-
- **GIVEN** a task 'task_1' assigned to 'worker_1'
|
|
71
|
-
- **WHEN** unassign('task_1', 'worker_1') is called
|
|
72
|
-
- **THEN** a task event with action 'unassigned' is emitted
|
|
73
|
-
- **AND** the task's assigned_agent is cleared
|
|
74
|
-
- **AND** the agent_history entry's ended_at is set
|
|
75
|
-
|
|
76
|
-
---
|
|
77
|
-
|
|
78
|
-
### Requirement: Task Status Updates
|
|
79
|
-
|
|
80
|
-
The system SHALL support updating task status with appropriate transitions.
|
|
81
|
-
|
|
82
|
-
#### Scenario: Start task
|
|
83
|
-
- **GIVEN** a task 'task_1' in 'assigned' status
|
|
84
|
-
- **WHEN** updateStatus('task_1', 'in_progress') is called
|
|
85
|
-
- **THEN** a task event with action 'status_change' is emitted
|
|
86
|
-
- **AND** the task's status changes to 'in_progress'
|
|
87
|
-
- **AND** started_at is set if not already set
|
|
88
|
-
|
|
89
|
-
#### Scenario: Complete task
|
|
90
|
-
- **GIVEN** a task 'task_1' in 'in_progress' status
|
|
91
|
-
- **WHEN** updateStatus('task_1', 'completed') is called
|
|
92
|
-
- **THEN** a task event with action 'completed' is emitted
|
|
93
|
-
- **AND** the task's status changes to 'completed'
|
|
94
|
-
- **AND** completed_at is set to current timestamp
|
|
95
|
-
|
|
96
|
-
#### Scenario: Fail task
|
|
97
|
-
- **GIVEN** a task 'task_1' in 'in_progress' status
|
|
98
|
-
- **WHEN** updateStatus('task_1', 'failed') is called
|
|
99
|
-
- **THEN** a task event with action 'failed' is emitted
|
|
100
|
-
- **AND** the task's status changes to 'failed'
|
|
101
|
-
|
|
102
|
-
---
|
|
103
|
-
|
|
104
|
-
### Requirement: Task Updates
|
|
105
|
-
|
|
106
|
-
The system SHALL support updating task metadata.
|
|
107
|
-
|
|
108
|
-
#### Scenario: Update task outputs
|
|
109
|
-
- **GIVEN** a task 'task_1' in 'in_progress' status
|
|
110
|
-
- **WHEN** update('task_1', { outputs: { result: 'success', files_changed: 5 } }) is called
|
|
111
|
-
- **THEN** the task's outputs are updated
|
|
112
|
-
- **AND** the change is reflected in the tasks view
|
|
113
|
-
|
|
114
|
-
#### Scenario: Add artifact to task
|
|
115
|
-
- **GIVEN** a task 'task_1'
|
|
116
|
-
- **WHEN** update('task_1', { artifacts: [{ type: 'file', ref: 'src/auth.ts' }] }) is called
|
|
117
|
-
- **THEN** the artifact is added to the task's artifacts array
|
|
118
|
-
|
|
119
|
-
---
|
|
120
|
-
|
|
121
|
-
### Requirement: Subtask Management
|
|
122
|
-
|
|
123
|
-
The system SHALL support hierarchical task decomposition.
|
|
124
|
-
|
|
125
|
-
#### Scenario: Create subtask
|
|
126
|
-
- **GIVEN** a parent task 'task_1'
|
|
127
|
-
- **WHEN** createSubtask('task_1', { description: 'Implement JWT validation', created_by: 'manager_1' }) is called
|
|
128
|
-
- **THEN** a new task is created with parent_task set to 'task_1'
|
|
129
|
-
- **AND** the new task_id is added to task_1's subtasks array
|
|
130
|
-
|
|
131
|
-
#### Scenario: Get subtasks
|
|
132
|
-
- **GIVEN** task 'task_1' with subtasks 'task_2' and 'task_3'
|
|
133
|
-
- **WHEN** getSubtasks('task_1') is called
|
|
134
|
-
- **THEN** both 'task_2' and 'task_3' task records are returned
|
|
135
|
-
|
|
136
|
-
#### Scenario: Subtask status rollup
|
|
137
|
-
- **GIVEN** task 'task_1' with subtasks 'task_2' (completed) and 'task_3' (in_progress)
|
|
138
|
-
- **WHEN** querying task 'task_1'
|
|
139
|
-
- **THEN** the parent task can derive aggregate status from subtask statuses
|
|
140
|
-
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
# Changelog
|
|
2
|
-
|
|
3
|
-
All notable changes to this project will be documented in this file.
|
|
4
|
-
|
|
5
|
-
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
|
-
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
-
|
|
8
|
-
## [Unreleased]
|
|
9
|
-
|
|
10
|
-
## [0.1.0] - 2024-XX-XX
|
|
11
|
-
|
|
12
|
-
### Added
|
|
13
|
-
|
|
14
|
-
- Initial release
|
|
15
|
-
- `AgentFactory` for registering and spawning agents
|
|
16
|
-
- `AgentHandle` for managing agent processes
|
|
17
|
-
- `Session` for interacting with agent sessions
|
|
18
|
-
- Pre-registered `claude-code` agent
|
|
19
|
-
- Streaming responses via async iterators
|
|
20
|
-
- Permission handling modes: `auto-approve`, `auto-deny`, `callback`, `interactive`
|
|
21
|
-
- Interactive permission requests as session updates
|
|
22
|
-
- `session.interruptWith()` for interrupting and redirecting agents
|
|
23
|
-
- `session.fork()` for creating independent session copies (experimental)
|
|
24
|
-
- `agentHandle.forkSession()` for forking by session ID (experimental)
|
|
25
|
-
- `session.addContext()` stub for future mid-execution messaging
|
|
26
|
-
- Custom file read/write handlers
|
|
27
|
-
- Terminal operation handlers
|
|
28
|
-
- MCP server support
|
|
29
|
-
- Full TypeScript type exports
|
|
30
|
-
|
|
31
|
-
### Dependencies
|
|
32
|
-
|
|
33
|
-
- `@agentclientprotocol/sdk` ^0.10.0
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2025 Sudocode AI
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|