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,608 @@
|
|
|
1
|
+
# Mail Protocol Integration Guide
|
|
2
|
+
|
|
3
|
+
This document describes how to integrate the MAP Mail Protocol into macro-agent, enabling structured conversation tracking across the agent hierarchy.
|
|
4
|
+
|
|
5
|
+
## Background
|
|
6
|
+
|
|
7
|
+
### What Mail Adds
|
|
8
|
+
|
|
9
|
+
macro-agent already coordinates multiple agents with message routing, status events, and lifecycle signals. Mail adds a **structured conversation layer** on top:
|
|
10
|
+
|
|
11
|
+
- **Conversations** — Named, stateful containers grouping related interactions (e.g., one per user session or delegated task)
|
|
12
|
+
- **Turns** — Ordered records of every message, status update, and tool call within a conversation
|
|
13
|
+
- **Threads** — Sub-conversations for branching discussions within a conversation
|
|
14
|
+
- **Participants** — Tracked membership with roles and permissions per conversation
|
|
15
|
+
|
|
16
|
+
Today, macro-agent's `conversationHistory[]` is a flat array on the API server with no structure. Internal agent-to-agent messages flow through the MessageRouter but aren't linked to any conversation context. Mail gives all of this a shared identity.
|
|
17
|
+
|
|
18
|
+
### What Doesn't Change
|
|
19
|
+
|
|
20
|
+
- Agent spawning still uses acp-factory
|
|
21
|
+
- The role system (worker, integrator, coordinator, monitor) stays the same
|
|
22
|
+
- Workspace isolation and merge queue are unaffected
|
|
23
|
+
- MCP remains the agent-facing tool interface
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Current Architecture vs Mail
|
|
28
|
+
|
|
29
|
+
| macro-agent today | With mail | What changes |
|
|
30
|
+
|---|---|---|
|
|
31
|
+
| `conversationHistory[]` flat array | `Conversation` with ordered `Turn[]` | Structured, queryable, has lifecycle |
|
|
32
|
+
| `MessageRouter.send()` fire-and-forget | `send()` with `mail` meta → auto-recorded turn | Messages become conversation turns |
|
|
33
|
+
| `emit_status()` broadcast | `recordTurn(contentType: 'event')` | Status events linked to conversations |
|
|
34
|
+
| `correlation_id` for reply threading | `threadId` within conversation | Threads are first-class, nestable |
|
|
35
|
+
| `done()` summary string | `closeConversation()` with summary | Completion tied to conversation lifecycle |
|
|
36
|
+
| No cross-session history | `listTurns()`, `replayConversation()` | Full audit trail per conversation |
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Integration Strategy
|
|
41
|
+
|
|
42
|
+
The recommended approach is **incremental overlay** — keep the existing MessageRouter and EventStore, add mail as a parallel tracking layer. This avoids a risky rewrite while getting mail benefits immediately.
|
|
43
|
+
|
|
44
|
+
### Dependencies
|
|
45
|
+
|
|
46
|
+
Add the MAP SDK as a dependency:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
npm install @anthropic-ai/multi-agent-protocol
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
The key imports:
|
|
53
|
+
|
|
54
|
+
```typescript
|
|
55
|
+
import {
|
|
56
|
+
MAPServer,
|
|
57
|
+
type ConversationManager,
|
|
58
|
+
type TurnManager,
|
|
59
|
+
type ThreadManager,
|
|
60
|
+
} from '@anthropic-ai/multi-agent-protocol/server';
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Or, if connecting to an external MAP server instead of embedding one:
|
|
64
|
+
|
|
65
|
+
```typescript
|
|
66
|
+
import { AgentConnection } from '@anthropic-ai/multi-agent-protocol';
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
|
|
71
|
+
## Phase 1: Conversation Lifecycle on API Server
|
|
72
|
+
|
|
73
|
+
**Goal**: Each user chat session gets a mail conversation. User messages and head manager responses become turns.
|
|
74
|
+
|
|
75
|
+
### Changes to `src/api/server.ts`
|
|
76
|
+
|
|
77
|
+
Replace the flat `conversationHistory[]` with a mail-backed conversation:
|
|
78
|
+
|
|
79
|
+
```typescript
|
|
80
|
+
// Before
|
|
81
|
+
interface ServerState {
|
|
82
|
+
conversationHistory: Array<{
|
|
83
|
+
role: 'user' | 'assistant';
|
|
84
|
+
content: string;
|
|
85
|
+
agent_id?: string;
|
|
86
|
+
timestamp: number;
|
|
87
|
+
}>;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// After
|
|
91
|
+
interface ServerState {
|
|
92
|
+
activeConversationId: string | null;
|
|
93
|
+
mailServer: MAPServer; // or external connection
|
|
94
|
+
}
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
#### On system init (`POST /api/init`)
|
|
98
|
+
|
|
99
|
+
Create or configure the mail server:
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
const mailServer = new MAPServer({
|
|
103
|
+
name: 'macro-agent',
|
|
104
|
+
mail: { enabled: true },
|
|
105
|
+
});
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
#### On user message (`POST /api/conversation/message`)
|
|
109
|
+
|
|
110
|
+
```typescript
|
|
111
|
+
// Create conversation on first message (or reuse active one)
|
|
112
|
+
if (!state.activeConversationId) {
|
|
113
|
+
const result = await mailServer.conversations.create({
|
|
114
|
+
type: 'user-session',
|
|
115
|
+
subject: body.message.slice(0, 80),
|
|
116
|
+
createdBy: 'user',
|
|
117
|
+
});
|
|
118
|
+
state.activeConversationId = result.id;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Record user message as turn
|
|
122
|
+
await mailServer.turns.add({
|
|
123
|
+
conversationId: state.activeConversationId,
|
|
124
|
+
participant: 'user',
|
|
125
|
+
contentType: 'text',
|
|
126
|
+
content: { text: body.message },
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
// ... prompt head manager ...
|
|
130
|
+
|
|
131
|
+
// Record assistant response as turn
|
|
132
|
+
await mailServer.turns.add({
|
|
133
|
+
conversationId: state.activeConversationId,
|
|
134
|
+
participant: state.headManagerId,
|
|
135
|
+
contentType: 'text',
|
|
136
|
+
content: { text: responseContent },
|
|
137
|
+
});
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
#### On history query (`GET /api/conversation/history`)
|
|
141
|
+
|
|
142
|
+
```typescript
|
|
143
|
+
const { turns } = await mailServer.turns.list(
|
|
144
|
+
state.activeConversationId,
|
|
145
|
+
{ order: 'asc', limit, offset }
|
|
146
|
+
);
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
### New module: `src/mail/mail-service.ts`
|
|
150
|
+
|
|
151
|
+
A thin wrapper that owns the MAPServer instance and exposes conversation operations:
|
|
152
|
+
|
|
153
|
+
```typescript
|
|
154
|
+
export interface MailService {
|
|
155
|
+
/** Create a new conversation */
|
|
156
|
+
createConversation(opts: {
|
|
157
|
+
type: string;
|
|
158
|
+
subject: string;
|
|
159
|
+
createdBy: string;
|
|
160
|
+
parentConversationId?: string;
|
|
161
|
+
}): Promise<{ conversationId: string }>;
|
|
162
|
+
|
|
163
|
+
/** Record a turn */
|
|
164
|
+
recordTurn(opts: {
|
|
165
|
+
conversationId: string;
|
|
166
|
+
participant: string;
|
|
167
|
+
contentType: string;
|
|
168
|
+
content: unknown;
|
|
169
|
+
threadId?: string;
|
|
170
|
+
}): Promise<{ turnId: string }>;
|
|
171
|
+
|
|
172
|
+
/** Close a conversation */
|
|
173
|
+
closeConversation(opts: {
|
|
174
|
+
conversationId: string;
|
|
175
|
+
closedBy: string;
|
|
176
|
+
summary?: string;
|
|
177
|
+
}): Promise<void>;
|
|
178
|
+
|
|
179
|
+
/** List turns for a conversation */
|
|
180
|
+
listTurns(conversationId: string, opts?: {
|
|
181
|
+
limit?: number;
|
|
182
|
+
order?: 'asc' | 'desc';
|
|
183
|
+
threadId?: string;
|
|
184
|
+
}): Promise<Turn[]>;
|
|
185
|
+
|
|
186
|
+
/** Get or create conversation for a session */
|
|
187
|
+
getOrCreateSessionConversation(sessionKey: string): Promise<string>;
|
|
188
|
+
}
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
This keeps the rest of macro-agent decoupled from MAP internals.
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## Phase 2: Mail Context in MessageRouter
|
|
196
|
+
|
|
197
|
+
**Goal**: When messages flow between agents, mail context (conversationId, threadId) travels with them. Turns are auto-recorded.
|
|
198
|
+
|
|
199
|
+
### Changes to `src/router/types.ts`
|
|
200
|
+
|
|
201
|
+
Add mail context to the message types:
|
|
202
|
+
|
|
203
|
+
```typescript
|
|
204
|
+
export interface SendMessageRequest {
|
|
205
|
+
from: MessageSender;
|
|
206
|
+
to: MessageTarget;
|
|
207
|
+
content: string;
|
|
208
|
+
correlation_id?: string;
|
|
209
|
+
priority?: MessagePriority;
|
|
210
|
+
// New: mail context
|
|
211
|
+
mail?: {
|
|
212
|
+
conversationId: string;
|
|
213
|
+
threadId?: string;
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
export interface SentMessage {
|
|
218
|
+
id: EventId;
|
|
219
|
+
from: MessageSender;
|
|
220
|
+
to: MessageTarget;
|
|
221
|
+
content: string;
|
|
222
|
+
timestamp: Timestamp;
|
|
223
|
+
correlation_id?: string;
|
|
224
|
+
// New: mail context preserved
|
|
225
|
+
mail?: {
|
|
226
|
+
conversationId: string;
|
|
227
|
+
threadId?: string;
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
export interface ReceivedMessage {
|
|
232
|
+
id: EventId;
|
|
233
|
+
from: EventSource;
|
|
234
|
+
content: string;
|
|
235
|
+
timestamp: Timestamp;
|
|
236
|
+
truncated: boolean;
|
|
237
|
+
correlation_id?: string;
|
|
238
|
+
// New: mail context for receivers
|
|
239
|
+
mail?: {
|
|
240
|
+
conversationId: string;
|
|
241
|
+
threadId?: string;
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
### Changes to `src/router/message-router.ts`
|
|
247
|
+
|
|
248
|
+
In the `send()` method, after routing the message, record a turn if mail context is present:
|
|
249
|
+
|
|
250
|
+
```typescript
|
|
251
|
+
async send(request: SendMessageRequest): Promise<SentMessage> {
|
|
252
|
+
// ... existing routing logic ...
|
|
253
|
+
|
|
254
|
+
// Record turn if mail context present
|
|
255
|
+
if (request.mail?.conversationId && this.mailService) {
|
|
256
|
+
try {
|
|
257
|
+
await this.mailService.recordTurn({
|
|
258
|
+
conversationId: request.mail.conversationId,
|
|
259
|
+
participant: request.from.agent_id,
|
|
260
|
+
contentType: 'data',
|
|
261
|
+
content: { message: request.content },
|
|
262
|
+
threadId: request.mail.threadId,
|
|
263
|
+
});
|
|
264
|
+
} catch (err) {
|
|
265
|
+
// Never fail message delivery due to mail errors
|
|
266
|
+
console.warn('Mail turn recording failed:', err);
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
return sentMessage;
|
|
271
|
+
}
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
The `mail` field flows through to `ReceivedMessage` so receiving agents can see and forward it.
|
|
275
|
+
|
|
276
|
+
### Conversation-per-Task Pattern
|
|
277
|
+
|
|
278
|
+
When a coordinator spawns a worker for a task, create a child conversation:
|
|
279
|
+
|
|
280
|
+
```typescript
|
|
281
|
+
// In agent-manager.ts spawn()
|
|
282
|
+
if (parentMailContext?.conversationId && this.mailService) {
|
|
283
|
+
const child = await this.mailService.createConversation({
|
|
284
|
+
type: 'agent-task',
|
|
285
|
+
subject: taskDescription,
|
|
286
|
+
createdBy: parentAgentId,
|
|
287
|
+
parentConversationId: parentMailContext.conversationId,
|
|
288
|
+
});
|
|
289
|
+
// Attach to the spawned agent's context
|
|
290
|
+
agentMailContext.set(newAgentId, {
|
|
291
|
+
conversationId: child.conversationId,
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
```
|
|
295
|
+
|
|
296
|
+
This creates a conversation tree:
|
|
297
|
+
```
|
|
298
|
+
User Session (conv-001)
|
|
299
|
+
├── Head Manager delegates to Worker A (conv-002)
|
|
300
|
+
│ └── Worker A's tool calls and results
|
|
301
|
+
├── Head Manager delegates to Worker B (conv-003)
|
|
302
|
+
│ └── Worker B's tool calls and results
|
|
303
|
+
└── Head Manager final response
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
---
|
|
307
|
+
|
|
308
|
+
## Phase 3: MCP Tool Updates
|
|
309
|
+
|
|
310
|
+
**Goal**: Agents can interact with mail through their existing MCP tool interface.
|
|
311
|
+
|
|
312
|
+
### Update `send_message` tool
|
|
313
|
+
|
|
314
|
+
Add optional mail fields:
|
|
315
|
+
|
|
316
|
+
```typescript
|
|
317
|
+
const SendMessageSchema = {
|
|
318
|
+
to: z.object({
|
|
319
|
+
agent_id: z.string().optional(),
|
|
320
|
+
task_id: z.string().optional(),
|
|
321
|
+
topic: z.string().optional(),
|
|
322
|
+
}).describe('Message target'),
|
|
323
|
+
content: z.string().describe('Message content'),
|
|
324
|
+
correlation_id: z.string().optional(),
|
|
325
|
+
// New
|
|
326
|
+
conversation_id: z.string().optional()
|
|
327
|
+
.describe('Conversation ID for mail tracking (auto-set if in conversation context)'),
|
|
328
|
+
thread_id: z.string().optional()
|
|
329
|
+
.describe('Thread ID within conversation'),
|
|
330
|
+
};
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
The handler auto-injects conversation context from the agent's current context if not explicitly provided:
|
|
334
|
+
|
|
335
|
+
```typescript
|
|
336
|
+
// In send_message handler
|
|
337
|
+
const mailContext = args.conversation_id
|
|
338
|
+
? { conversationId: args.conversation_id, threadId: args.thread_id }
|
|
339
|
+
: agentMailContext.get(context.agent_id); // auto from spawn context
|
|
340
|
+
|
|
341
|
+
await messageRouter.send({
|
|
342
|
+
from: { agent_id: context.agent_id },
|
|
343
|
+
to: args.to,
|
|
344
|
+
content: args.content,
|
|
345
|
+
correlation_id: args.correlation_id,
|
|
346
|
+
mail: mailContext,
|
|
347
|
+
});
|
|
348
|
+
```
|
|
349
|
+
|
|
350
|
+
### Update `check_messages` tool
|
|
351
|
+
|
|
352
|
+
Return mail context so agents can forward it:
|
|
353
|
+
|
|
354
|
+
```typescript
|
|
355
|
+
// In response formatting
|
|
356
|
+
messages.map(msg => ({
|
|
357
|
+
id: msg.id,
|
|
358
|
+
from: msg.from,
|
|
359
|
+
content: msg.content,
|
|
360
|
+
timestamp: msg.timestamp,
|
|
361
|
+
conversation_id: msg.mail?.conversationId, // New
|
|
362
|
+
thread_id: msg.mail?.threadId, // New
|
|
363
|
+
}));
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
### New `record_observation` tool
|
|
367
|
+
|
|
368
|
+
For Level 2 (conversation-aware) agents that want to record non-message turns:
|
|
369
|
+
|
|
370
|
+
```typescript
|
|
371
|
+
const RecordObservationSchema = {
|
|
372
|
+
content_type: z.enum(['event', 'tool_call', 'tool_result', 'text'])
|
|
373
|
+
.describe('Type of observation'),
|
|
374
|
+
content: z.record(z.string(), z.unknown())
|
|
375
|
+
.describe('Observation content'),
|
|
376
|
+
conversation_id: z.string().optional()
|
|
377
|
+
.describe('Conversation ID (defaults to agent context)'),
|
|
378
|
+
};
|
|
379
|
+
```
|
|
380
|
+
|
|
381
|
+
This lets agents record tool calls, intermediate results, or status changes as conversation turns without sending messages.
|
|
382
|
+
|
|
383
|
+
### Update `done()` tool
|
|
384
|
+
|
|
385
|
+
When an agent completes, close its conversation:
|
|
386
|
+
|
|
387
|
+
```typescript
|
|
388
|
+
// In done handler, after existing logic
|
|
389
|
+
const agentConvId = agentMailContext.get(context.agent_id);
|
|
390
|
+
if (agentConvId && mailService) {
|
|
391
|
+
// Record completion turn
|
|
392
|
+
await mailService.recordTurn({
|
|
393
|
+
conversationId: agentConvId,
|
|
394
|
+
participant: context.agent_id,
|
|
395
|
+
contentType: 'event',
|
|
396
|
+
content: {
|
|
397
|
+
event: `agent.${args.status}`,
|
|
398
|
+
summary: args.summary,
|
|
399
|
+
details: args.details,
|
|
400
|
+
},
|
|
401
|
+
});
|
|
402
|
+
|
|
403
|
+
// Close the conversation
|
|
404
|
+
await mailService.closeConversation({
|
|
405
|
+
conversationId: agentConvId,
|
|
406
|
+
closedBy: context.agent_id,
|
|
407
|
+
summary: args.summary,
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
---
|
|
413
|
+
|
|
414
|
+
## Phase 4: Agent System Prompt Updates
|
|
415
|
+
|
|
416
|
+
**Goal**: Agents understand mail context and forward it naturally.
|
|
417
|
+
|
|
418
|
+
### Changes to `src/agent/system-prompt.ts`
|
|
419
|
+
|
|
420
|
+
Add a mail section to the system prompt for agents that may receive mail context:
|
|
421
|
+
|
|
422
|
+
#### Workers (Level 1 — pass-through)
|
|
423
|
+
|
|
424
|
+
```
|
|
425
|
+
## Message Context
|
|
426
|
+
|
|
427
|
+
Messages you receive may include a `conversation_id` field. This tracks the
|
|
428
|
+
conversation this work belongs to. When replying or sending messages, include
|
|
429
|
+
the same `conversation_id` to maintain the conversation chain:
|
|
430
|
+
|
|
431
|
+
send_message({ to: { agent_id: "..." }, content: "...", conversation_id: "<from received message>" })
|
|
432
|
+
|
|
433
|
+
If no conversation_id is present, omit it — your message will still be delivered normally.
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
#### Coordinators (Level 3 — orchestrator)
|
|
437
|
+
|
|
438
|
+
```
|
|
439
|
+
## Conversation Tracking
|
|
440
|
+
|
|
441
|
+
When you spawn workers or delegate tasks, the system automatically creates
|
|
442
|
+
child conversations to track their work. You can:
|
|
443
|
+
|
|
444
|
+
- Use `record_observation` to log planning decisions or intermediate analysis
|
|
445
|
+
- Check conversation history via the conversation_id in status updates
|
|
446
|
+
- The `done()` call automatically closes the agent's conversation
|
|
447
|
+
|
|
448
|
+
All agent interactions within a task are recorded as conversation turns,
|
|
449
|
+
giving you a full audit trail of delegated work.
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
---
|
|
453
|
+
|
|
454
|
+
## Phase 5: WebSocket/Observer Integration
|
|
455
|
+
|
|
456
|
+
**Goal**: Dashboard clients can watch conversation turns in real-time.
|
|
457
|
+
|
|
458
|
+
### Changes to `src/api/server.ts` (WebSocket handling)
|
|
459
|
+
|
|
460
|
+
Add a `conversation` subscription channel that forwards mail events:
|
|
461
|
+
|
|
462
|
+
```typescript
|
|
463
|
+
// New WebSocket message types
|
|
464
|
+
type WSMessageType =
|
|
465
|
+
| 'subscribe' | 'unsubscribe'
|
|
466
|
+
| 'agent_update' | 'task_update'
|
|
467
|
+
| 'message' | 'status' | 'error'
|
|
468
|
+
| 'turn_added' // New
|
|
469
|
+
| 'conversation_update' // New
|
|
470
|
+
;
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
When mail events fire, broadcast to subscribed WebSocket clients:
|
|
474
|
+
|
|
475
|
+
```typescript
|
|
476
|
+
mailServer.eventBus.on('mail.turn.added', (event) => {
|
|
477
|
+
broadcast(`conversation:${event.data.conversationId}`, {
|
|
478
|
+
type: 'turn_added',
|
|
479
|
+
data: event.data.turn,
|
|
480
|
+
});
|
|
481
|
+
});
|
|
482
|
+
|
|
483
|
+
mailServer.eventBus.on('mail.closed', (event) => {
|
|
484
|
+
broadcast(`conversation:${event.data.conversationId}`, {
|
|
485
|
+
type: 'conversation_update',
|
|
486
|
+
data: { status: 'closed', summary: event.data.summary },
|
|
487
|
+
});
|
|
488
|
+
});
|
|
489
|
+
```
|
|
490
|
+
|
|
491
|
+
### New REST endpoints
|
|
492
|
+
|
|
493
|
+
```
|
|
494
|
+
GET /api/conversations List conversations
|
|
495
|
+
GET /api/conversations/:id Get conversation details
|
|
496
|
+
GET /api/conversations/:id/turns List turns (paginated)
|
|
497
|
+
GET /api/conversations/:id/threads List threads
|
|
498
|
+
POST /api/conversations/:id/close Close a conversation
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
---
|
|
502
|
+
|
|
503
|
+
## Data Flow: Complete Example
|
|
504
|
+
|
|
505
|
+
Here's how a user request flows through the system with mail enabled:
|
|
506
|
+
|
|
507
|
+
```
|
|
508
|
+
1. User sends "Refactor the auth module" via POST /api/conversation/message
|
|
509
|
+
|
|
510
|
+
2. API Server:
|
|
511
|
+
- Creates conversation conv-001 (type: user-session)
|
|
512
|
+
- Records Turn 1: user text "Refactor the auth module"
|
|
513
|
+
- Prompts Head Manager with mail context { conversationId: conv-001 }
|
|
514
|
+
|
|
515
|
+
3. Head Manager (coordinator):
|
|
516
|
+
- Spawns Worker A for "analyze current auth code"
|
|
517
|
+
→ Creates child conversation conv-002 (parent: conv-001)
|
|
518
|
+
- Spawns Worker B for "write new auth implementation"
|
|
519
|
+
→ Creates child conversation conv-003 (parent: conv-001)
|
|
520
|
+
- Records Turn 2: event { plan: "split into analyze + implement" }
|
|
521
|
+
|
|
522
|
+
4. Worker A receives message with { conversationId: conv-002 }:
|
|
523
|
+
- Records Turn: event { tool: "file_read", file: "src/auth.ts" }
|
|
524
|
+
- Records Turn: event { analysis: "found 3 issues..." }
|
|
525
|
+
- Calls done(status: "completed", summary: "Analysis complete")
|
|
526
|
+
→ Records completion turn, closes conv-002
|
|
527
|
+
- Sends results back to Head Manager with mail context
|
|
528
|
+
|
|
529
|
+
5. Head Manager receives Worker A results:
|
|
530
|
+
- Turn auto-recorded in conv-001 (intercepted from message)
|
|
531
|
+
- Forwards analysis to Worker B via message with conv-003 context
|
|
532
|
+
|
|
533
|
+
6. Worker B completes implementation:
|
|
534
|
+
- Records tool call turns in conv-003
|
|
535
|
+
- Calls done() → closes conv-003
|
|
536
|
+
|
|
537
|
+
7. Head Manager compiles final response:
|
|
538
|
+
- Records Turn: text "Refactored auth module. Changes: ..."
|
|
539
|
+
- Response returned to API Server
|
|
540
|
+
|
|
541
|
+
8. API Server:
|
|
542
|
+
- Records Turn: assistant response in conv-001
|
|
543
|
+
- Returns response to user
|
|
544
|
+
|
|
545
|
+
Conversation tree:
|
|
546
|
+
conv-001 (user-session): 5 turns
|
|
547
|
+
├── conv-002 (agent-task: analyze): 4 turns
|
|
548
|
+
└── conv-003 (agent-task: implement): 6 turns
|
|
549
|
+
```
|
|
550
|
+
|
|
551
|
+
---
|
|
552
|
+
|
|
553
|
+
## File Change Summary
|
|
554
|
+
|
|
555
|
+
| Phase | File | Change |
|
|
556
|
+
|---|---|---|
|
|
557
|
+
| 1 | `package.json` | Add `@anthropic-ai/multi-agent-protocol` dependency |
|
|
558
|
+
| 1 | `src/mail/mail-service.ts` | **New** — MailService wrapper around MAPServer |
|
|
559
|
+
| 1 | `src/mail/index.ts` | **New** — Barrel export |
|
|
560
|
+
| 1 | `src/api/server.ts` | Replace `conversationHistory[]` with mail-backed conversations |
|
|
561
|
+
| 2 | `src/router/types.ts` | Add `mail` field to message types |
|
|
562
|
+
| 2 | `src/router/message-router.ts` | Record turns on send when mail context present |
|
|
563
|
+
| 2 | `src/agent/agent-manager.ts` | Create child conversations on spawn, track agent mail context |
|
|
564
|
+
| 3 | `src/mcp/mcp-server.ts` | Add mail fields to send_message, check_messages; add record_observation tool |
|
|
565
|
+
| 3 | `src/mcp/tools/done.ts` | Record completion turn and close conversation on done() |
|
|
566
|
+
| 4 | `src/agent/system-prompt.ts` | Add mail context instructions per role |
|
|
567
|
+
| 5 | `src/api/server.ts` | Add conversation WebSocket channels and REST endpoints |
|
|
568
|
+
| 5 | `src/api/types.ts` | Add conversation-related API types |
|
|
569
|
+
|
|
570
|
+
---
|
|
571
|
+
|
|
572
|
+
## Configuration
|
|
573
|
+
|
|
574
|
+
Mail is opt-in. Add to macro-agent's config:
|
|
575
|
+
|
|
576
|
+
```typescript
|
|
577
|
+
interface MacroAgentConfig {
|
|
578
|
+
// ... existing config ...
|
|
579
|
+
|
|
580
|
+
/** Enable mail conversation tracking */
|
|
581
|
+
mail?: {
|
|
582
|
+
enabled: boolean;
|
|
583
|
+
/** Connect to external MAP server instead of embedding one */
|
|
584
|
+
serverUrl?: string;
|
|
585
|
+
/** Custom stores for persistence (default: in-memory) */
|
|
586
|
+
stores?: {
|
|
587
|
+
conversations?: ConversationStore;
|
|
588
|
+
turns?: TurnStore;
|
|
589
|
+
threads?: ThreadStore;
|
|
590
|
+
};
|
|
591
|
+
};
|
|
592
|
+
}
|
|
593
|
+
```
|
|
594
|
+
|
|
595
|
+
When `mail.enabled` is false (default), all mail code paths are no-ops and no conversations are created.
|
|
596
|
+
|
|
597
|
+
---
|
|
598
|
+
|
|
599
|
+
## Testing Strategy
|
|
600
|
+
|
|
601
|
+
| Test | What it validates |
|
|
602
|
+
|---|---|
|
|
603
|
+
| `mail-service.test.ts` | MailService CRUD operations |
|
|
604
|
+
| `message-router.test.ts` | Existing tests still pass; new tests for mail context propagation |
|
|
605
|
+
| `api-server.test.ts` | Conversation endpoints return correct turns |
|
|
606
|
+
| `done.test.ts` | done() records completion turn and closes conversation |
|
|
607
|
+
| `mcp-server.test.ts` | send_message passes mail context; record_observation works |
|
|
608
|
+
| `integration.test.ts` | Full flow: user message → spawn → worker done → conversation tree |
|