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,377 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Team Template Types
|
|
3
|
+
*
|
|
4
|
+
* TypeScript types for the team manifest schema. Generic multi-agent fields
|
|
5
|
+
* (name, roles, topology, communication) are separated from macro-agent
|
|
6
|
+
* specific extensions under the `macro_agent` namespace for interoperability.
|
|
7
|
+
*
|
|
8
|
+
* @module teams/types
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { RoleDefinition, Capability } from "../roles/types.js";
|
|
12
|
+
|
|
13
|
+
// =============================================================================
|
|
14
|
+
// Core Manifest
|
|
15
|
+
// =============================================================================
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Fully resolved team manifest.
|
|
19
|
+
*
|
|
20
|
+
* Returned by TeamLoader.load() with all inheritance resolved,
|
|
21
|
+
* capabilities computed, and prompts loaded.
|
|
22
|
+
*/
|
|
23
|
+
export interface TeamManifest {
|
|
24
|
+
/** Team name (directory name) */
|
|
25
|
+
name: string;
|
|
26
|
+
|
|
27
|
+
/** Human-readable description */
|
|
28
|
+
description: string;
|
|
29
|
+
|
|
30
|
+
/** Schema version */
|
|
31
|
+
version: number;
|
|
32
|
+
|
|
33
|
+
/** Role names used by this team */
|
|
34
|
+
roles: string[];
|
|
35
|
+
|
|
36
|
+
/** Agent spawn topology */
|
|
37
|
+
topology: TeamTopology;
|
|
38
|
+
|
|
39
|
+
/** Communication topology */
|
|
40
|
+
communication: TeamCommunication;
|
|
41
|
+
|
|
42
|
+
/** macro-agent specific extensions */
|
|
43
|
+
macro_agent: MacroAgentExtensions;
|
|
44
|
+
|
|
45
|
+
// ─────────────────────────────────────────────────────────────
|
|
46
|
+
// Resolved state (populated by TeamLoader, not in YAML)
|
|
47
|
+
// ─────────────────────────────────────────────────────────────
|
|
48
|
+
|
|
49
|
+
/** Resolved role definitions keyed by role name */
|
|
50
|
+
_resolvedRoles: Map<string, ResolvedTeamRole>;
|
|
51
|
+
|
|
52
|
+
/** Loaded prompt contents keyed by file path */
|
|
53
|
+
_loadedPrompts: Map<string, string>;
|
|
54
|
+
|
|
55
|
+
/** Loaded MCP server configs keyed by role name */
|
|
56
|
+
_mcpServers: Map<string, McpServerEntry[]>;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// =============================================================================
|
|
60
|
+
// Topology
|
|
61
|
+
// =============================================================================
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Defines the agent spawn graph for the team.
|
|
65
|
+
*/
|
|
66
|
+
export interface TeamTopology {
|
|
67
|
+
/** The initial agent spawned when the team starts */
|
|
68
|
+
root: TopologyNode;
|
|
69
|
+
|
|
70
|
+
/** Agents spawned alongside root (peers, not children) */
|
|
71
|
+
companions?: TopologyNode[];
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Which roles can spawn which other roles.
|
|
75
|
+
* Translated into capability additions by TeamLoader (RD3).
|
|
76
|
+
*/
|
|
77
|
+
spawn_rules?: Record<string, string[]>;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* A node in the team's spawn topology.
|
|
82
|
+
*/
|
|
83
|
+
export interface TopologyNode {
|
|
84
|
+
/** Role name (must be in manifest.roles) */
|
|
85
|
+
role: string;
|
|
86
|
+
|
|
87
|
+
/** Path to prompt file relative to team directory */
|
|
88
|
+
prompt?: string;
|
|
89
|
+
|
|
90
|
+
/** Agent configuration */
|
|
91
|
+
config?: TopologyNodeConfig;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export interface TopologyNodeConfig {
|
|
95
|
+
/** Model to use (e.g., "sonnet", "haiku", "opus") */
|
|
96
|
+
model?: string;
|
|
97
|
+
|
|
98
|
+
/** Additional key-value config passed to agent */
|
|
99
|
+
[key: string]: unknown;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// =============================================================================
|
|
103
|
+
// Communication
|
|
104
|
+
// =============================================================================
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Communication topology for the team.
|
|
108
|
+
*
|
|
109
|
+
* Declares channels (signal groups), per-role subscriptions,
|
|
110
|
+
* emission restrictions, and routing rules.
|
|
111
|
+
*/
|
|
112
|
+
export interface TeamCommunication {
|
|
113
|
+
/** Named signal channels */
|
|
114
|
+
channels?: Record<string, ChannelDefinition>;
|
|
115
|
+
|
|
116
|
+
/** Per-role subscription declarations */
|
|
117
|
+
subscriptions?: Record<string, ChannelSubscription[]>;
|
|
118
|
+
|
|
119
|
+
/** Per-role emission declarations (which signals a role can emit) */
|
|
120
|
+
emissions?: Record<string, string[]>;
|
|
121
|
+
|
|
122
|
+
/** Routing configuration */
|
|
123
|
+
routing?: CommunicationRouting;
|
|
124
|
+
|
|
125
|
+
/** Enforcement level for communication rules */
|
|
126
|
+
enforcement?: CommunicationEnforcement;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export type CommunicationEnforcement = "strict" | "permissive" | "audit";
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* A named channel grouping related signals.
|
|
133
|
+
*/
|
|
134
|
+
export interface ChannelDefinition {
|
|
135
|
+
/** Human-readable description */
|
|
136
|
+
description?: string;
|
|
137
|
+
|
|
138
|
+
/** Signals in this channel */
|
|
139
|
+
signals: string[];
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* A role's subscription to a channel.
|
|
144
|
+
*/
|
|
145
|
+
export interface ChannelSubscription {
|
|
146
|
+
/** Channel name (must exist in communication.channels) */
|
|
147
|
+
channel: string;
|
|
148
|
+
|
|
149
|
+
/** Specific signals to receive. If omitted, receives all signals in the channel */
|
|
150
|
+
signals?: string[];
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Communication routing configuration.
|
|
155
|
+
*/
|
|
156
|
+
export interface CommunicationRouting {
|
|
157
|
+
/** Status flow direction */
|
|
158
|
+
status?: "upstream";
|
|
159
|
+
|
|
160
|
+
/** Explicit peer connections (non-hierarchical) */
|
|
161
|
+
peers?: PeerConnection[];
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* A peer-to-peer connection between two roles.
|
|
166
|
+
*/
|
|
167
|
+
export interface PeerConnection {
|
|
168
|
+
/** Source role name */
|
|
169
|
+
from: string;
|
|
170
|
+
|
|
171
|
+
/** Target role name */
|
|
172
|
+
to: string;
|
|
173
|
+
|
|
174
|
+
/** Routing mechanism */
|
|
175
|
+
via: "direct" | "topic" | "scope";
|
|
176
|
+
|
|
177
|
+
/** Signals allowed on this connection */
|
|
178
|
+
signals?: string[];
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
// =============================================================================
|
|
182
|
+
// macro-agent Extensions
|
|
183
|
+
// =============================================================================
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* macro-agent specific team configuration.
|
|
187
|
+
*
|
|
188
|
+
* Namespaced under `macro_agent` in team.yaml for interoperability.
|
|
189
|
+
*/
|
|
190
|
+
export interface MacroAgentExtensions {
|
|
191
|
+
/** Task assignment configuration */
|
|
192
|
+
task_assignment?: TaskAssignmentConfig;
|
|
193
|
+
|
|
194
|
+
/** Integration strategy configuration */
|
|
195
|
+
integration?: IntegrationConfig;
|
|
196
|
+
|
|
197
|
+
/** Agent lifecycle configuration */
|
|
198
|
+
lifecycle?: LifecycleConfig;
|
|
199
|
+
|
|
200
|
+
/** Observability configuration */
|
|
201
|
+
observability?: ObservabilityConfig;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
export interface TaskAssignmentConfig {
|
|
205
|
+
/** Assignment mode */
|
|
206
|
+
mode: "push" | "pull";
|
|
207
|
+
|
|
208
|
+
/** Pull-mode specific settings */
|
|
209
|
+
pull?: {
|
|
210
|
+
/** Seconds before idle worker self-terminates */
|
|
211
|
+
idle_timeout_s?: number;
|
|
212
|
+
/** Milliseconds between claim retries */
|
|
213
|
+
claim_retry_delay_ms?: number;
|
|
214
|
+
/** Max concurrent task claims per agent */
|
|
215
|
+
max_concurrent_per_agent?: number;
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
export interface IntegrationConfig {
|
|
220
|
+
/** Strategy name: 'queue' | 'trunk' | 'optimistic' | custom name */
|
|
221
|
+
strategy: string;
|
|
222
|
+
|
|
223
|
+
/** Strategy-specific configuration passed to strategy.initialize() */
|
|
224
|
+
config?: Record<string, unknown>;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
export interface LifecycleConfig {
|
|
228
|
+
/** Session continuation settings */
|
|
229
|
+
continuations?: {
|
|
230
|
+
enabled: boolean;
|
|
231
|
+
max_history_messages?: number;
|
|
232
|
+
checkpoint_interval?: "round_trip" | "none";
|
|
233
|
+
};
|
|
234
|
+
|
|
235
|
+
/** Worker scaling settings */
|
|
236
|
+
scaling?: {
|
|
237
|
+
min_workers?: number;
|
|
238
|
+
max_workers?: number;
|
|
239
|
+
scale_on?: "task_queue_depth" | "manual";
|
|
240
|
+
idle_drain?: boolean;
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
export interface ObservabilityConfig {
|
|
245
|
+
/** Sliding window for metric computation (seconds) */
|
|
246
|
+
metrics_window_s?: number;
|
|
247
|
+
/** Interval between metric snapshots (seconds) */
|
|
248
|
+
snapshot_interval_s?: number;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// =============================================================================
|
|
252
|
+
// Team Role Definition
|
|
253
|
+
// =============================================================================
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Role definition as declared in a team template's roles/*.yaml file.
|
|
257
|
+
*
|
|
258
|
+
* Supports both full replacement and additive/subtractive capability composition.
|
|
259
|
+
*/
|
|
260
|
+
export interface TeamRoleDefinition {
|
|
261
|
+
/** Role name */
|
|
262
|
+
name: string;
|
|
263
|
+
|
|
264
|
+
/** Built-in role to extend */
|
|
265
|
+
extends?: string;
|
|
266
|
+
|
|
267
|
+
/** Display name for UI/logs */
|
|
268
|
+
display_name?: string;
|
|
269
|
+
|
|
270
|
+
/** Human-readable description */
|
|
271
|
+
description?: string;
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Full replacement capability list.
|
|
275
|
+
* Mutually exclusive with add/remove.
|
|
276
|
+
*/
|
|
277
|
+
capabilities?: string[];
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Capabilities to add to the parent role's set.
|
|
281
|
+
* Only valid when `extends` is set.
|
|
282
|
+
*/
|
|
283
|
+
capabilities_add?: string[];
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Capabilities to remove from the parent role's set.
|
|
287
|
+
* Only valid when `extends` is set.
|
|
288
|
+
*/
|
|
289
|
+
capabilities_remove?: string[];
|
|
290
|
+
|
|
291
|
+
/** Path to prompt file relative to team directory */
|
|
292
|
+
prompt?: string;
|
|
293
|
+
|
|
294
|
+
/** macro-agent specific role configuration */
|
|
295
|
+
macro_agent?: TeamRoleMacroAgent;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
export interface TeamRoleMacroAgent {
|
|
299
|
+
/** Workspace configuration */
|
|
300
|
+
workspace?: {
|
|
301
|
+
type?: string;
|
|
302
|
+
branch_pattern?: string;
|
|
303
|
+
cleanup_on_terminate?: boolean;
|
|
304
|
+
};
|
|
305
|
+
|
|
306
|
+
/** Lifecycle configuration */
|
|
307
|
+
lifecycle?: {
|
|
308
|
+
type?: "ephemeral" | "persistent" | "daemon" | "event-driven";
|
|
309
|
+
cascade_terminate?: boolean;
|
|
310
|
+
self_cleanup?: boolean;
|
|
311
|
+
task_bound?: boolean;
|
|
312
|
+
parent_bound?: boolean;
|
|
313
|
+
max_duration_ms?: number;
|
|
314
|
+
};
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// =============================================================================
|
|
318
|
+
// Resolved Types
|
|
319
|
+
// =============================================================================
|
|
320
|
+
|
|
321
|
+
/**
|
|
322
|
+
* A team role with inheritance resolved and capabilities computed.
|
|
323
|
+
*/
|
|
324
|
+
export interface ResolvedTeamRole {
|
|
325
|
+
/** Role name */
|
|
326
|
+
name: string;
|
|
327
|
+
|
|
328
|
+
/** The built-in role this extends */
|
|
329
|
+
baseRole: string;
|
|
330
|
+
|
|
331
|
+
/** Final computed capability set */
|
|
332
|
+
capabilities: Capability[];
|
|
333
|
+
|
|
334
|
+
/** Loaded prompt content (if prompt file specified) */
|
|
335
|
+
prompt?: string;
|
|
336
|
+
|
|
337
|
+
/** Full RoleDefinition for RoleRegistry registration */
|
|
338
|
+
roleDefinition: RoleDefinition;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// =============================================================================
|
|
342
|
+
// MCP Server Config
|
|
343
|
+
// =============================================================================
|
|
344
|
+
|
|
345
|
+
/**
|
|
346
|
+
* MCP server entry from tools/mcp-servers.json.
|
|
347
|
+
* Follows Claude Code's native format.
|
|
348
|
+
*/
|
|
349
|
+
export interface McpServerEntry {
|
|
350
|
+
name: string;
|
|
351
|
+
command: string;
|
|
352
|
+
args?: string[];
|
|
353
|
+
env?: Record<string, string>;
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
// =============================================================================
|
|
357
|
+
// Team Loading Errors
|
|
358
|
+
// =============================================================================
|
|
359
|
+
|
|
360
|
+
export type TeamLoadErrorCode =
|
|
361
|
+
| "MANIFEST_NOT_FOUND"
|
|
362
|
+
| "INVALID_MANIFEST"
|
|
363
|
+
| "ROLE_NOT_FOUND"
|
|
364
|
+
| "PROMPT_NOT_FOUND"
|
|
365
|
+
| "INVALID_COMMUNICATION"
|
|
366
|
+
| "INVALID_ROLE";
|
|
367
|
+
|
|
368
|
+
export class TeamLoadError extends Error {
|
|
369
|
+
constructor(
|
|
370
|
+
message: string,
|
|
371
|
+
public readonly code: TeamLoadErrorCode,
|
|
372
|
+
public readonly teamName?: string
|
|
373
|
+
) {
|
|
374
|
+
super(message);
|
|
375
|
+
this.name = "TeamLoadError";
|
|
376
|
+
}
|
|
377
|
+
}
|
|
@@ -1,8 +1,35 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* TriggerRouter - External Event Routing
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* ## Routing Architecture Role
|
|
5
|
+
*
|
|
6
|
+
* TriggerRouter handles **external system events** (webhooks, cron, etc.)
|
|
7
|
+
* and routes them to appropriate agents using pluggable strategies.
|
|
8
|
+
*
|
|
9
|
+
* ```
|
|
10
|
+
* External Events → TriggerRouter → SystemEventQueue → WakeManager → Agent
|
|
11
|
+
* (webhooks, cron) (this) (queueing) (delivery)
|
|
12
|
+
* ```
|
|
13
|
+
*
|
|
14
|
+
* **Responsibilities:**
|
|
15
|
+
* - Route external events to target agents via configurable strategies
|
|
16
|
+
* - Queue events for deferred delivery (SystemEventQueue)
|
|
17
|
+
* - Support multiple routing strategies (direct, head, role-based, etc.)
|
|
18
|
+
* - Trigger wake cycles for sleeping agents
|
|
19
|
+
*
|
|
20
|
+
* **Routing Strategies:**
|
|
21
|
+
* - direct: Route to specific agent ID
|
|
22
|
+
* - head: Route to coordinator/head of hierarchy
|
|
23
|
+
* - role: Route to agents by role
|
|
24
|
+
* - broadcast: Fan-out to multiple agents
|
|
25
|
+
*
|
|
26
|
+
* **Differs from MessageRouter:**
|
|
27
|
+
* - TriggerRouter: External events → agents (one-way, queued)
|
|
28
|
+
* - MessageRouter: Agent ↔ agent communication (bidirectional, immediate)
|
|
29
|
+
*
|
|
30
|
+
* **Differs from MAPAdapter:**
|
|
31
|
+
* - TriggerRouter: System events (webhooks, cron, internal signals)
|
|
32
|
+
* - MAPAdapter: MAP protocol clients (external agents, UIs)
|
|
6
33
|
*
|
|
7
34
|
* @module trigger/router/trigger-router
|
|
8
35
|
*/
|
|
@@ -4,6 +4,25 @@
|
|
|
4
4
|
* Types for the wake manager that handles polling agents
|
|
5
5
|
* with pending events and delivering them.
|
|
6
6
|
*
|
|
7
|
+
* ## Wake System Architecture
|
|
8
|
+
*
|
|
9
|
+
* There are two wake mechanisms in macro-agent:
|
|
10
|
+
*
|
|
11
|
+
* 1. **Single-Agent Wake** (agent/wake.ts, activity/types.ts)
|
|
12
|
+
* - For immediately waking a single agent with an Activity
|
|
13
|
+
* - Priority-driven (urgent/high/normal/low)
|
|
14
|
+
* - Uses inject/interrupt fallback chain
|
|
15
|
+
* - Returns `WakeResult` (success: boolean, method: WakeMethod)
|
|
16
|
+
*
|
|
17
|
+
* 2. **Batch Wake Cycles** (trigger/wake/*)
|
|
18
|
+
* - For periodic delivery of queued system events
|
|
19
|
+
* - Heartbeat-based polling with coalescing
|
|
20
|
+
* - Processes all agents with pending events
|
|
21
|
+
* - Returns `WakeCycleStatus` (status: ran/skipped/failed)
|
|
22
|
+
*
|
|
23
|
+
* Use single-agent wake for: Immediate message delivery, activity notifications
|
|
24
|
+
* Use batch wake cycles for: Scheduled event delivery, system-wide polling
|
|
25
|
+
*
|
|
7
26
|
* @module trigger/wake/types
|
|
8
27
|
*/
|
|
9
28
|
|
|
@@ -28,9 +47,12 @@ export interface WakeRequest {
|
|
|
28
47
|
}
|
|
29
48
|
|
|
30
49
|
/**
|
|
31
|
-
*
|
|
50
|
+
* Status of a batch wake cycle.
|
|
51
|
+
*
|
|
52
|
+
* Note: This is different from `WakeResult` in activity/types.ts which
|
|
53
|
+
* represents the outcome of waking a single agent.
|
|
32
54
|
*/
|
|
33
|
-
export interface
|
|
55
|
+
export interface WakeCycleStatus {
|
|
34
56
|
status: "ran" | "skipped" | "failed";
|
|
35
57
|
/** Duration if ran */
|
|
36
58
|
durationMs?: number;
|
|
@@ -40,10 +62,15 @@ export interface WakeResult {
|
|
|
40
62
|
wokenAgents?: AgentId[];
|
|
41
63
|
}
|
|
42
64
|
|
|
65
|
+
/**
|
|
66
|
+
* @deprecated Use WakeCycleStatus instead. Renamed for clarity.
|
|
67
|
+
*/
|
|
68
|
+
export type WakeResult = WakeCycleStatus;
|
|
69
|
+
|
|
43
70
|
/**
|
|
44
71
|
* Wake handler function type
|
|
45
72
|
*/
|
|
46
|
-
export type WakeHandler = (opts: { reason?: string }) => Promise<
|
|
73
|
+
export type WakeHandler = (opts: { reason?: string }) => Promise<WakeCycleStatus>;
|
|
47
74
|
|
|
48
75
|
/**
|
|
49
76
|
* Wake manager configuration
|
|
@@ -80,9 +107,9 @@ export interface TriggerWakeManager {
|
|
|
80
107
|
/**
|
|
81
108
|
* Run a single wake cycle immediately
|
|
82
109
|
* @param opts - Optional reason for the cycle
|
|
83
|
-
* @returns Wake
|
|
110
|
+
* @returns Wake cycle status
|
|
84
111
|
*/
|
|
85
|
-
runWakeCycle(opts?: { reason?: string }): Promise<
|
|
112
|
+
runWakeCycle(opts?: { reason?: string }): Promise<WakeCycleStatus>;
|
|
86
113
|
|
|
87
114
|
/**
|
|
88
115
|
* Start the wake manager (enables heartbeat if configured)
|
|
@@ -18,7 +18,7 @@ import type {
|
|
|
18
18
|
TriggerWakeManager,
|
|
19
19
|
WakeManagerConfig,
|
|
20
20
|
WakeRequest,
|
|
21
|
-
|
|
21
|
+
WakeCycleStatus,
|
|
22
22
|
WakeCycleResult,
|
|
23
23
|
AgentDrainResult,
|
|
24
24
|
} from "./types.js";
|
|
@@ -325,7 +325,7 @@ export function createWakeManager(
|
|
|
325
325
|
return pendingReason !== null || Boolean(coalesceTimer) || scheduled;
|
|
326
326
|
},
|
|
327
327
|
|
|
328
|
-
async runWakeCycle(opts?: { reason?: string }): Promise<
|
|
328
|
+
async runWakeCycle(opts?: { reason?: string }): Promise<WakeCycleStatus> {
|
|
329
329
|
if (wakingInProgress) {
|
|
330
330
|
return { status: "skipped", reason: "wake-in-progress" };
|
|
331
331
|
}
|
package/src/workspace/index.ts
CHANGED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export type {
|
|
2
|
+
IntegrationStrategy,
|
|
3
|
+
IntegrationStrategyFactory,
|
|
4
|
+
LandRequest,
|
|
5
|
+
LandResult,
|
|
6
|
+
LandResultStatus,
|
|
7
|
+
QueueStrategyConfig,
|
|
8
|
+
TrunkStrategyConfig,
|
|
9
|
+
OptimisticStrategyConfig,
|
|
10
|
+
} from "./types.js";
|
|
11
|
+
export { QueueIntegrationStrategy } from "./queue.js";
|
|
12
|
+
export { TrunkIntegrationStrategy } from "./trunk.js";
|
|
13
|
+
export { OptimisticIntegrationStrategy } from "./optimistic.js";
|
|
14
|
+
export {
|
|
15
|
+
IntegrationStrategyRegistry,
|
|
16
|
+
createDefaultStrategyRegistry,
|
|
17
|
+
defaultStrategyRegistry,
|
|
18
|
+
} from "./registry.js";
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Optimistic Integration Strategy
|
|
3
|
+
*
|
|
4
|
+
* Push immediately and emit a validation event. Does NOT run build/test —
|
|
5
|
+
* validation is the judge agent's responsibility (RD5).
|
|
6
|
+
*
|
|
7
|
+
* Uses the same rebase-and-retry logic as trunk for handling push conflicts.
|
|
8
|
+
*
|
|
9
|
+
* @module workspace/strategies/optimistic
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { execSync } from "child_process";
|
|
13
|
+
import type {
|
|
14
|
+
IntegrationStrategy,
|
|
15
|
+
LandRequest,
|
|
16
|
+
LandResult,
|
|
17
|
+
OptimisticStrategyConfig,
|
|
18
|
+
} from "./types.js";
|
|
19
|
+
import type { EventStore } from "../../store/event-store.js";
|
|
20
|
+
|
|
21
|
+
export class OptimisticIntegrationStrategy implements IntegrationStrategy {
|
|
22
|
+
readonly name = "optimistic";
|
|
23
|
+
private maxRetries: number;
|
|
24
|
+
private eventStore?: EventStore;
|
|
25
|
+
|
|
26
|
+
constructor(config?: Record<string, unknown>) {
|
|
27
|
+
const typedConfig = config as OptimisticStrategyConfig | undefined;
|
|
28
|
+
this.maxRetries = typedConfig?.maxRetries ?? 3;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Set the EventStore for emitting validation events.
|
|
33
|
+
* Called after construction since EventStore may not be available at strategy creation time.
|
|
34
|
+
*/
|
|
35
|
+
setEventStore(store: EventStore): void {
|
|
36
|
+
this.eventStore = store;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async land(request: LandRequest): Promise<LandResult> {
|
|
40
|
+
const { workspacePath, targetBranch } = request;
|
|
41
|
+
let retryCount = 0;
|
|
42
|
+
|
|
43
|
+
while (retryCount <= this.maxRetries) {
|
|
44
|
+
try {
|
|
45
|
+
// Fetch latest
|
|
46
|
+
this.git(workspacePath, `fetch origin ${targetBranch}`);
|
|
47
|
+
|
|
48
|
+
// Rebase onto latest
|
|
49
|
+
try {
|
|
50
|
+
this.git(workspacePath, `rebase origin/${targetBranch}`);
|
|
51
|
+
} catch {
|
|
52
|
+
try {
|
|
53
|
+
this.git(workspacePath, "rebase --abort");
|
|
54
|
+
} catch {
|
|
55
|
+
/* already clean */
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (retryCount >= this.maxRetries) {
|
|
59
|
+
return {
|
|
60
|
+
status: "conflict",
|
|
61
|
+
retryCount,
|
|
62
|
+
error: `Rebase conflict after ${retryCount + 1} attempts`,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
retryCount++;
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Push optimistically
|
|
70
|
+
try {
|
|
71
|
+
this.git(workspacePath, `push origin HEAD:${targetBranch}`);
|
|
72
|
+
} catch {
|
|
73
|
+
if (retryCount >= this.maxRetries) {
|
|
74
|
+
return {
|
|
75
|
+
status: "conflict",
|
|
76
|
+
retryCount,
|
|
77
|
+
error: `Push rejected after ${retryCount + 1} attempts`,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
retryCount++;
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const commitHash = this.git(workspacePath, "rev-parse HEAD").trim();
|
|
85
|
+
|
|
86
|
+
// Emit validation:requested event (RD5 — judge handles validation)
|
|
87
|
+
if (this.eventStore) {
|
|
88
|
+
try {
|
|
89
|
+
this.eventStore.emit({
|
|
90
|
+
type: "status",
|
|
91
|
+
source: { agent_id: request.agentId },
|
|
92
|
+
payload: {
|
|
93
|
+
status_type: "checkpoint",
|
|
94
|
+
summary: `Validation requested for ${commitHash.slice(0, 8)}`,
|
|
95
|
+
validation_requested: true,
|
|
96
|
+
commitHash,
|
|
97
|
+
sourceBranch: request.sourceBranch,
|
|
98
|
+
targetBranch,
|
|
99
|
+
taskId: request.taskId,
|
|
100
|
+
agentId: request.agentId,
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
} catch {
|
|
104
|
+
// Never fail land() due to event emission failure
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return {
|
|
109
|
+
status: "landed",
|
|
110
|
+
commitHash,
|
|
111
|
+
retryCount,
|
|
112
|
+
};
|
|
113
|
+
} catch (error) {
|
|
114
|
+
return {
|
|
115
|
+
status: "failed",
|
|
116
|
+
retryCount,
|
|
117
|
+
error: `Unexpected error: ${error instanceof Error ? error.message : String(error)}`,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
return {
|
|
123
|
+
status: "failed",
|
|
124
|
+
retryCount,
|
|
125
|
+
error: "Exceeded maximum retries",
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
private git(cwd: string, args: string): string {
|
|
130
|
+
return execSync(`git ${args}`, {
|
|
131
|
+
cwd,
|
|
132
|
+
encoding: "utf-8",
|
|
133
|
+
timeout: 30000,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|