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,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EventStore-backed TurnStore adapter.
|
|
3
|
+
*
|
|
4
|
+
* Implements the MAP-compatible TurnStore interface by:
|
|
5
|
+
* - append() → emits a `turn` event with action `recorded`
|
|
6
|
+
* - get()/list() → reads from EventStore materialized views
|
|
7
|
+
* - count() → counts turns in materialized view
|
|
8
|
+
*
|
|
9
|
+
* Supports cursor-based pagination and timestamp range queries
|
|
10
|
+
* by post-filtering EventStore results.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import type { EventStore } from "../../store/event-store.js";
|
|
14
|
+
import type { TurnStore, ServerTurn, MAPTurnFilter } from "./types.js";
|
|
15
|
+
import type { ConversationTurn, TurnFilter } from "../../store/types/index.js";
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Convert internal ConversationTurn to MAP ServerTurn.
|
|
19
|
+
*/
|
|
20
|
+
function toServerTurn(turn: ConversationTurn): ServerTurn {
|
|
21
|
+
return {
|
|
22
|
+
id: turn.id,
|
|
23
|
+
conversationId: turn.conversationId,
|
|
24
|
+
participant: turn.participant,
|
|
25
|
+
timestamp: turn.timestamp,
|
|
26
|
+
contentType: turn.contentType,
|
|
27
|
+
content: turn.content,
|
|
28
|
+
threadId: turn.threadId,
|
|
29
|
+
inReplyTo: turn.inReplyTo,
|
|
30
|
+
source:
|
|
31
|
+
turn.sourceType === "intercepted" && turn.sourceMessageId
|
|
32
|
+
? { type: "intercepted", messageId: turn.sourceMessageId }
|
|
33
|
+
: { type: "explicit", method: "mail/turn" },
|
|
34
|
+
metadata: turn.metadata ?? {},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export class EventStoreTurnStore implements TurnStore {
|
|
39
|
+
constructor(private readonly eventStore: EventStore) {}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Append a turn by emitting a turn event.
|
|
43
|
+
*/
|
|
44
|
+
append(turn: ServerTurn): void {
|
|
45
|
+
this.eventStore.emit({
|
|
46
|
+
type: "turn",
|
|
47
|
+
source: { agent_id: turn.participant },
|
|
48
|
+
payload: {
|
|
49
|
+
action: "recorded",
|
|
50
|
+
turn_id: turn.id,
|
|
51
|
+
conversation_id: turn.conversationId,
|
|
52
|
+
participant: turn.participant,
|
|
53
|
+
content_type: turn.contentType,
|
|
54
|
+
content: turn.content,
|
|
55
|
+
thread_id: turn.threadId,
|
|
56
|
+
in_reply_to: turn.inReplyTo,
|
|
57
|
+
source_type: turn.source.type,
|
|
58
|
+
source_message_id:
|
|
59
|
+
turn.source.type === "intercepted"
|
|
60
|
+
? turn.source.messageId
|
|
61
|
+
: undefined,
|
|
62
|
+
metadata: turn.metadata,
|
|
63
|
+
},
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Get a specific turn by ID.
|
|
69
|
+
* Searches across all conversations since we only have the turn ID.
|
|
70
|
+
*/
|
|
71
|
+
get(id: string): ServerTurn | undefined {
|
|
72
|
+
// EventStore's listTurns requires a conversationId.
|
|
73
|
+
// For ID-based lookup, we scan all turns. In practice this is
|
|
74
|
+
// called rarely — most access is via list() with a conversationId.
|
|
75
|
+
//
|
|
76
|
+
// A more efficient approach would be adding a getTurn(id) method
|
|
77
|
+
// to EventStore, but for now this works with the existing interface.
|
|
78
|
+
const allConvIds = this.eventStore
|
|
79
|
+
.listConversations()
|
|
80
|
+
.map((c) => c.id);
|
|
81
|
+
|
|
82
|
+
for (const convId of allConvIds) {
|
|
83
|
+
const turns = this.eventStore.listTurns({ conversationId: convId });
|
|
84
|
+
const turn = turns.find((t) => t.id === id);
|
|
85
|
+
if (turn) return toServerTurn(turn);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return undefined;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* List turns matching filter criteria with pagination.
|
|
93
|
+
*/
|
|
94
|
+
list(filter: MAPTurnFilter): ServerTurn[] {
|
|
95
|
+
// Get all turns for the conversation with basic filters
|
|
96
|
+
const internalFilter: TurnFilter = {
|
|
97
|
+
conversationId: filter.conversationId,
|
|
98
|
+
threadId: filter.threadId,
|
|
99
|
+
contentType: filter.contentTypes?.[0],
|
|
100
|
+
participantId: filter.participantId,
|
|
101
|
+
order: filter.order,
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
let turns = this.eventStore
|
|
105
|
+
.listTurns(internalFilter)
|
|
106
|
+
.map(toServerTurn);
|
|
107
|
+
|
|
108
|
+
// Apply multi-value content type filter
|
|
109
|
+
if (filter.contentTypes && filter.contentTypes.length > 1) {
|
|
110
|
+
turns = turns.filter((t) =>
|
|
111
|
+
filter.contentTypes!.includes(t.contentType)
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Apply timestamp range filters
|
|
116
|
+
if (filter.afterTimestamp !== undefined) {
|
|
117
|
+
turns = turns.filter((t) => t.timestamp > filter.afterTimestamp!);
|
|
118
|
+
}
|
|
119
|
+
if (filter.beforeTimestamp !== undefined) {
|
|
120
|
+
turns = turns.filter((t) => t.timestamp < filter.beforeTimestamp!);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Apply cursor-based pagination
|
|
124
|
+
if (filter.afterTurnId) {
|
|
125
|
+
const idx = turns.findIndex((t) => t.id === filter.afterTurnId);
|
|
126
|
+
if (idx !== -1) {
|
|
127
|
+
turns = turns.slice(idx + 1);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (filter.beforeTurnId) {
|
|
131
|
+
const idx = turns.findIndex((t) => t.id === filter.beforeTurnId);
|
|
132
|
+
if (idx !== -1) {
|
|
133
|
+
turns = turns.slice(0, idx);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Apply limit
|
|
138
|
+
if (filter.limit !== undefined) {
|
|
139
|
+
turns = turns.slice(0, filter.limit);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
return turns;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Delete a specific turn. Not supported — EventStore is append-only.
|
|
147
|
+
*/
|
|
148
|
+
delete(_id: string): boolean {
|
|
149
|
+
return false;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Delete all turns for a conversation. Not supported.
|
|
154
|
+
*/
|
|
155
|
+
deleteByConversation(_conversationId: string): number {
|
|
156
|
+
return 0;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Count turns in a conversation.
|
|
161
|
+
*/
|
|
162
|
+
count(conversationId: string, threadId?: string): number {
|
|
163
|
+
const filter: TurnFilter = { conversationId, threadId };
|
|
164
|
+
return this.eventStore.listTurns(filter).length;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Clear all turns. Not supported — EventStore is append-only.
|
|
169
|
+
*/
|
|
170
|
+
clear(): void {
|
|
171
|
+
// No-op
|
|
172
|
+
}
|
|
173
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EventStore-backed mail store adapters.
|
|
3
|
+
*
|
|
4
|
+
* These implement MAP-compatible store interfaces backed by
|
|
5
|
+
* the EventStore's append-only event log and materialized views.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export * from "./types.js";
|
|
9
|
+
export { EventStoreConversationStore } from "./eventstore-conversation-store.js";
|
|
10
|
+
export { EventStoreTurnStore } from "./eventstore-turn-store.js";
|
|
11
|
+
export { EventStoreThreadStore } from "./eventstore-thread-store.js";
|
|
12
|
+
export { EventStoreParticipantStore } from "./eventstore-participant-store.js";
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MAP-compatible store interfaces for mail.
|
|
3
|
+
*
|
|
4
|
+
* These mirror the store interfaces from the MAP SDK server module
|
|
5
|
+
* (ConversationStore, TurnStore, ThreadStore, ParticipantStore) so that
|
|
6
|
+
* our EventStore-backed implementations can be plugged into MAP handlers.
|
|
7
|
+
*
|
|
8
|
+
* The MAP SDK server module is not exported from the installed package,
|
|
9
|
+
* so we define the interfaces locally. They match the SDK's shapes so
|
|
10
|
+
* swapping to SDK imports is a single-line change per type.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
// =============================================================================
|
|
14
|
+
// Server-side record types (match MAP SDK ServerConversation, etc.)
|
|
15
|
+
// =============================================================================
|
|
16
|
+
|
|
17
|
+
export interface ServerConversation {
|
|
18
|
+
id: string;
|
|
19
|
+
type: string;
|
|
20
|
+
status: string;
|
|
21
|
+
subject?: string;
|
|
22
|
+
participantCount: number;
|
|
23
|
+
parentConversationId?: string;
|
|
24
|
+
parentTurnId?: string;
|
|
25
|
+
createdAt: number;
|
|
26
|
+
updatedAt: number;
|
|
27
|
+
closedAt?: number;
|
|
28
|
+
createdBy: string;
|
|
29
|
+
metadata: Record<string, unknown>;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export interface ServerParticipant {
|
|
33
|
+
id: string;
|
|
34
|
+
conversationId: string;
|
|
35
|
+
type: "user" | "agent" | "system";
|
|
36
|
+
role: string;
|
|
37
|
+
joinedAt: number;
|
|
38
|
+
leftAt?: number;
|
|
39
|
+
permissions: {
|
|
40
|
+
canSend: boolean;
|
|
41
|
+
canObserve: boolean;
|
|
42
|
+
canInvite: boolean;
|
|
43
|
+
canRemove: boolean;
|
|
44
|
+
canCreateThreads: boolean;
|
|
45
|
+
historyAccess: "none" | "from-join" | "full";
|
|
46
|
+
canSeeInternal: boolean;
|
|
47
|
+
};
|
|
48
|
+
agentInfo?: {
|
|
49
|
+
agentId: string;
|
|
50
|
+
name?: string;
|
|
51
|
+
role?: string;
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export interface ServerTurn {
|
|
56
|
+
id: string;
|
|
57
|
+
conversationId: string;
|
|
58
|
+
participant: string;
|
|
59
|
+
timestamp: number;
|
|
60
|
+
contentType: string;
|
|
61
|
+
content: unknown;
|
|
62
|
+
threadId?: string;
|
|
63
|
+
inReplyTo?: string;
|
|
64
|
+
source: { type: "explicit"; method: "mail/turn" } | { type: "intercepted"; messageId: string };
|
|
65
|
+
visibility?: { type: string; [key: string]: unknown };
|
|
66
|
+
status?: string;
|
|
67
|
+
metadata: Record<string, unknown>;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export interface ServerThread {
|
|
71
|
+
id: string;
|
|
72
|
+
conversationId: string;
|
|
73
|
+
parentThreadId?: string;
|
|
74
|
+
subject?: string;
|
|
75
|
+
rootTurnId: string;
|
|
76
|
+
turnCount: number;
|
|
77
|
+
participantCount: number;
|
|
78
|
+
createdAt: number;
|
|
79
|
+
updatedAt: number;
|
|
80
|
+
createdBy: string;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// =============================================================================
|
|
84
|
+
// Filter types (match MAP SDK ConversationFilter, TurnFilter, etc.)
|
|
85
|
+
// =============================================================================
|
|
86
|
+
|
|
87
|
+
export interface MAPConversationFilter {
|
|
88
|
+
type?: string[];
|
|
89
|
+
status?: string[];
|
|
90
|
+
participantId?: string;
|
|
91
|
+
createdAfter?: number;
|
|
92
|
+
createdBefore?: number;
|
|
93
|
+
parentConversationId?: string;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export interface MAPTurnFilter {
|
|
97
|
+
conversationId: string;
|
|
98
|
+
threadId?: string;
|
|
99
|
+
contentTypes?: string[];
|
|
100
|
+
participantId?: string;
|
|
101
|
+
afterTurnId?: string;
|
|
102
|
+
beforeTurnId?: string;
|
|
103
|
+
afterTimestamp?: number;
|
|
104
|
+
beforeTimestamp?: number;
|
|
105
|
+
limit?: number;
|
|
106
|
+
order?: "asc" | "desc";
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export interface MAPThreadFilter {
|
|
110
|
+
conversationId: string;
|
|
111
|
+
parentThreadId?: string;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export interface MAPParticipantFilter {
|
|
115
|
+
conversationId?: string;
|
|
116
|
+
participantId?: string;
|
|
117
|
+
role?: string;
|
|
118
|
+
active?: boolean;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// =============================================================================
|
|
122
|
+
// Store interfaces (match MAP SDK ConversationStore, TurnStore, etc.)
|
|
123
|
+
// =============================================================================
|
|
124
|
+
|
|
125
|
+
export interface ConversationStore {
|
|
126
|
+
save(conversation: ServerConversation): void;
|
|
127
|
+
get(id: string): ServerConversation | undefined;
|
|
128
|
+
list(filter?: MAPConversationFilter): ServerConversation[];
|
|
129
|
+
delete(id: string): boolean;
|
|
130
|
+
clear(): void;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export interface TurnStore {
|
|
134
|
+
append(turn: ServerTurn): void;
|
|
135
|
+
get(id: string): ServerTurn | undefined;
|
|
136
|
+
list(filter: MAPTurnFilter): ServerTurn[];
|
|
137
|
+
delete(id: string): boolean;
|
|
138
|
+
deleteByConversation(conversationId: string): number;
|
|
139
|
+
count(conversationId: string, threadId?: string): number;
|
|
140
|
+
clear(): void;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
export interface ThreadStore {
|
|
144
|
+
save(thread: ServerThread): void;
|
|
145
|
+
get(id: string): ServerThread | undefined;
|
|
146
|
+
list(filter: MAPThreadFilter): ServerThread[];
|
|
147
|
+
delete(id: string): boolean;
|
|
148
|
+
deleteByConversation(conversationId: string): number;
|
|
149
|
+
clear(): void;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export interface ParticipantStore {
|
|
153
|
+
save(participant: ServerParticipant): void;
|
|
154
|
+
get(conversationId: string, participantId: string): ServerParticipant | undefined;
|
|
155
|
+
list(filter: MAPParticipantFilter): ServerParticipant[];
|
|
156
|
+
delete(conversationId: string, participantId: string): boolean;
|
|
157
|
+
deleteByConversation(conversationId: string): number;
|
|
158
|
+
getConversationsForParticipant(participantId: string, active?: boolean): string[];
|
|
159
|
+
clear(): void;
|
|
160
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TurnRecorder — Hierarchy-aware conversation resolution and turn recording.
|
|
3
|
+
*
|
|
4
|
+
* Resolves which conversation a message belongs to based on the
|
|
5
|
+
* relationship between sender and receiver:
|
|
6
|
+
* - Parent→child or child→parent: child's task conversation
|
|
7
|
+
* - Peers (no parent/child relationship): auto-created peer conversation
|
|
8
|
+
*
|
|
9
|
+
* @module mail/turn-recorder
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import type { AgentId } from "../store/types/index.js";
|
|
13
|
+
import type { EventStore } from "../store/event-store.js";
|
|
14
|
+
import type { MailService } from "./mail-service.js";
|
|
15
|
+
import type { ConversationMap } from "./conversation-map.js";
|
|
16
|
+
import type { TurnRecordInfo, TurnRecorderCallback } from "../router/types.js";
|
|
17
|
+
|
|
18
|
+
export interface TurnRecorderDeps {
|
|
19
|
+
mailService: MailService;
|
|
20
|
+
conversationMap: ConversationMap;
|
|
21
|
+
eventStore: EventStore;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Create a TurnRecorderCallback for use with MessageRouter.setTurnRecorder().
|
|
26
|
+
*
|
|
27
|
+
* Resolution algorithm:
|
|
28
|
+
* 1. Get both agents from EventStore
|
|
29
|
+
* 2. If parent→child or child→parent: use child's task conversation
|
|
30
|
+
* 3. If peers: getOrCreatePeerConversation()
|
|
31
|
+
* 4. Record turn with sourceType: 'intercepted'
|
|
32
|
+
*/
|
|
33
|
+
export function createTurnRecorder(deps: TurnRecorderDeps): TurnRecorderCallback {
|
|
34
|
+
const { mailService, conversationMap, eventStore } = deps;
|
|
35
|
+
|
|
36
|
+
return (info: TurnRecordInfo): void => {
|
|
37
|
+
const { from, toAgent, content, messageId } = info;
|
|
38
|
+
|
|
39
|
+
// Resolve conversation based on agent relationship
|
|
40
|
+
const conversationId = resolveConversation(from, toAgent);
|
|
41
|
+
if (!conversationId) return;
|
|
42
|
+
|
|
43
|
+
// Record the turn — never fail core message routing
|
|
44
|
+
try {
|
|
45
|
+
mailService.recordTurn({
|
|
46
|
+
conversationId,
|
|
47
|
+
participant: from,
|
|
48
|
+
contentType: "text",
|
|
49
|
+
content,
|
|
50
|
+
sourceType: "intercepted",
|
|
51
|
+
sourceMessageId: messageId,
|
|
52
|
+
});
|
|
53
|
+
} catch (err) {
|
|
54
|
+
console.warn(`[TurnRecorder] Failed to record turn: ${err}`);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Find the nearest common ancestor of two agents and return its conversation ID.
|
|
60
|
+
* Lineage arrays are ordered root-to-parent: [grandparent, parent].
|
|
61
|
+
*/
|
|
62
|
+
function findNearestCommonAncestorConversation(
|
|
63
|
+
lineageA: AgentId[],
|
|
64
|
+
lineageB: AgentId[]
|
|
65
|
+
): string | undefined {
|
|
66
|
+
// Walk lineages from the end (nearest ancestor) to find the deepest shared ancestor
|
|
67
|
+
const setB = new Set(lineageB);
|
|
68
|
+
for (let i = lineageA.length - 1; i >= 0; i--) {
|
|
69
|
+
if (setB.has(lineageA[i])) {
|
|
70
|
+
// Found nearest common ancestor — look up its conversation
|
|
71
|
+
return (
|
|
72
|
+
conversationMap.getAgentConversation(lineageA[i]) ??
|
|
73
|
+
conversationMap.getSessionConversation(lineageA[i])
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
function resolveConversation(from: AgentId, to: AgentId): string | null {
|
|
81
|
+
const fromAgent = eventStore.getAgent(from);
|
|
82
|
+
const toAgent = eventStore.getAgent(to);
|
|
83
|
+
|
|
84
|
+
// If either agent doesn't exist, skip
|
|
85
|
+
if (!fromAgent || !toAgent) return null;
|
|
86
|
+
|
|
87
|
+
// Check parent→child relationship
|
|
88
|
+
if (fromAgent.parent === to) {
|
|
89
|
+
// from is a child of to — use from's task conversation
|
|
90
|
+
return conversationMap.getAgentConversation(from) ?? null;
|
|
91
|
+
}
|
|
92
|
+
if (toAgent.parent === from) {
|
|
93
|
+
// to is a child of from — use to's task conversation
|
|
94
|
+
return conversationMap.getAgentConversation(to) ?? null;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// Peers — get or create peer conversation
|
|
98
|
+
return conversationMap.getOrCreatePeerConversation(from, to, () => {
|
|
99
|
+
// Find nearest common ancestor's conversation for tree structure
|
|
100
|
+
const parentConversationId = findNearestCommonAncestorConversation(
|
|
101
|
+
fromAgent.lineage,
|
|
102
|
+
toAgent.lineage
|
|
103
|
+
);
|
|
104
|
+
|
|
105
|
+
const { conversationId } = mailService.createConversation({
|
|
106
|
+
type: "peer",
|
|
107
|
+
subject: `Peer: ${from} ↔ ${to}`,
|
|
108
|
+
createdBy: from,
|
|
109
|
+
parentConversationId,
|
|
110
|
+
});
|
|
111
|
+
mailService.joinConversation({
|
|
112
|
+
conversationId,
|
|
113
|
+
participantId: from,
|
|
114
|
+
role: "worker",
|
|
115
|
+
});
|
|
116
|
+
mailService.joinConversation({
|
|
117
|
+
conversationId,
|
|
118
|
+
participantId: to,
|
|
119
|
+
role: "worker",
|
|
120
|
+
});
|
|
121
|
+
return conversationId;
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# MAP Integration Module
|
|
2
|
+
|
|
3
|
+
Multi-Agent Protocol (MAP) integration for macro-agent, enabling standardized communication with external clients, agents, and gateways.
|
|
4
|
+
|
|
5
|
+
## Architecture
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
External Clients → MAPAdapter → MessageRouter → EventStore
|
|
9
|
+
(MAP protocol) (translation) (routing) (persistence)
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Components
|
|
13
|
+
|
|
14
|
+
### Core Types (`types.ts`)
|
|
15
|
+
|
|
16
|
+
Defines MAP-compliant address types for message routing:
|
|
17
|
+
|
|
18
|
+
- **AgentAddress** - `{ agent: AgentId }` - Direct to agent
|
|
19
|
+
- **AgentsAddress** - `{ agents: AgentId[] }` - Multi-agent delivery
|
|
20
|
+
- **TaskAddress** - `{ task: TaskId }` - Route to assigned agent
|
|
21
|
+
- **ScopeAddress** - `{ scope: ScopeId }` - Scope-based pub/sub
|
|
22
|
+
- **RoleAddress** - `{ role: string, within?: ScopeId }` - Role-based fan-out
|
|
23
|
+
- **BroadcastAddress** - `{ broadcast: scope }` - System-wide broadcast
|
|
24
|
+
- **HierarchicalAddress** - Parent/children/ancestors/descendants/siblings
|
|
25
|
+
- **FederatedAddress** - Cross-system routing
|
|
26
|
+
|
|
27
|
+
### Adapter (`adapter/`)
|
|
28
|
+
|
|
29
|
+
The `MAPAdapter` handles external connections:
|
|
30
|
+
|
|
31
|
+
- **Connection Management** - Accept/disconnect participants
|
|
32
|
+
- **Authentication** - Validate credentials, assign capabilities
|
|
33
|
+
- **RPC Handling** - JSON-RPC 2.0 request/response
|
|
34
|
+
- **Subscriptions** - Event streaming to participants
|
|
35
|
+
- **Extensions** - Pluggable method handlers (spawn, wake, tasks)
|
|
36
|
+
|
|
37
|
+
Key files:
|
|
38
|
+
- `map-adapter.ts` - Core adapter implementation
|
|
39
|
+
- `connection-manager.ts` - Participant lifecycle
|
|
40
|
+
- `subscription-manager.ts` - Event subscriptions
|
|
41
|
+
- `rpc-handler.ts` - JSON-RPC processing
|
|
42
|
+
- `extensions/` - Extension method handlers
|
|
43
|
+
|
|
44
|
+
### Federation (`federation/`)
|
|
45
|
+
|
|
46
|
+
Cross-system communication:
|
|
47
|
+
|
|
48
|
+
- **FederationHandler** - Routes messages between MAP systems
|
|
49
|
+
- **PeerManager** - Manages connections to peer systems
|
|
50
|
+
- **SystemId** - Unique system identification (domain/system/instance)
|
|
51
|
+
|
|
52
|
+
## Usage
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
import { createMAPAdapter } from "./map/adapter/index.js";
|
|
56
|
+
|
|
57
|
+
const adapter = createMAPAdapter({
|
|
58
|
+
name: "my-system",
|
|
59
|
+
authenticate: async (type, credentials) => {
|
|
60
|
+
// Validate credentials
|
|
61
|
+
return { allowed: true, capabilities: { canQuery: true } };
|
|
62
|
+
},
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
await adapter.start();
|
|
66
|
+
|
|
67
|
+
// Accept WebSocket connection
|
|
68
|
+
const participant = await adapter.acceptConnection(stream);
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## ID Naming Convention
|
|
72
|
+
|
|
73
|
+
MAP types use clean field names (`agent`, `task`) while internal types use explicit names (`agent_id`, `task_id`). See CLAUDE.md for details.
|
|
74
|
+
|
|
75
|
+
## Related Modules
|
|
76
|
+
|
|
77
|
+
- `router/` - Internal message routing (MessageRouter)
|
|
78
|
+
- `store/` - Event persistence (EventStore)
|
|
79
|
+
- `trigger/` - External event routing (TriggerRouter)
|