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,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Agent Auto-Detection Types
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for detecting installed CLI coding agents
|
|
5
|
+
* and constructing headless invocation commands.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Headless invocation configuration for a CLI agent.
|
|
9
|
+
*/
|
|
10
|
+
export interface HeadlessConfig {
|
|
11
|
+
/** Subcommand before prompt (e.g., "exec" for codex, "run" for goose) */
|
|
12
|
+
subcommand?: string;
|
|
13
|
+
/** Flag to pass the prompt. Empty string means prompt is positional. */
|
|
14
|
+
promptFlag: string;
|
|
15
|
+
/** Default flags always included in headless mode */
|
|
16
|
+
defaultFlags?: string[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Definition of a known CLI coding agent.
|
|
20
|
+
* Describes how to detect and invoke the agent in headless mode.
|
|
21
|
+
*/
|
|
22
|
+
export interface CLIAgentDefinition {
|
|
23
|
+
/** Unique identifier (e.g., "claude-code", "codex") */
|
|
24
|
+
id: string;
|
|
25
|
+
/** Human-readable display name */
|
|
26
|
+
name: string;
|
|
27
|
+
/** Short description */
|
|
28
|
+
description: string;
|
|
29
|
+
/** The binary/command name to invoke */
|
|
30
|
+
binary: string;
|
|
31
|
+
/** Arguments to check version (typically ["--version"]) */
|
|
32
|
+
versionArgs: string[];
|
|
33
|
+
/** Headless invocation configuration */
|
|
34
|
+
headless: HeadlessConfig;
|
|
35
|
+
/** Flag for model selection (e.g., "--model") */
|
|
36
|
+
modelFlag?: string;
|
|
37
|
+
/** Flag for working directory (e.g., "--cwd", "--path") */
|
|
38
|
+
cwdFlag?: string;
|
|
39
|
+
/** Provider/vendor name */
|
|
40
|
+
vendor: string;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Result of detecting a single CLI agent on the system.
|
|
44
|
+
*/
|
|
45
|
+
export interface DetectedAgent {
|
|
46
|
+
/** Agent definition ID */
|
|
47
|
+
id: string;
|
|
48
|
+
/** Human-readable name */
|
|
49
|
+
name: string;
|
|
50
|
+
/** Whether the binary was found on PATH */
|
|
51
|
+
installed: boolean;
|
|
52
|
+
/** Parsed version string (e.g., "1.2.3") */
|
|
53
|
+
version?: string;
|
|
54
|
+
/** Absolute path to binary */
|
|
55
|
+
path?: string;
|
|
56
|
+
/** The full agent definition (for client display) */
|
|
57
|
+
definition: CLIAgentDefinition;
|
|
58
|
+
/** When detection was performed (epoch ms) */
|
|
59
|
+
detectedAt: number;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Result of a full detection scan across all known agents.
|
|
63
|
+
*/
|
|
64
|
+
export interface DetectionResult {
|
|
65
|
+
/** All agents (installed and not installed) */
|
|
66
|
+
agents: DetectedAgent[];
|
|
67
|
+
/** Number of agents scanned */
|
|
68
|
+
scanned: number;
|
|
69
|
+
/** Detection duration in milliseconds */
|
|
70
|
+
durationMs: number;
|
|
71
|
+
/** Whether detection is still in progress */
|
|
72
|
+
pending?: boolean;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Options for building a spawn command.
|
|
76
|
+
*/
|
|
77
|
+
export interface SpawnCommandOptions {
|
|
78
|
+
/** Model to use (passed via modelFlag) */
|
|
79
|
+
model?: string;
|
|
80
|
+
/** Working directory (passed via cwdFlag) */
|
|
81
|
+
cwd?: string;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Result of building a spawn command.
|
|
85
|
+
*/
|
|
86
|
+
export interface SpawnCommand {
|
|
87
|
+
/** The binary/command to execute */
|
|
88
|
+
command: string;
|
|
89
|
+
/** Arguments to pass to the command */
|
|
90
|
+
args: string[];
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Configuration for the agent detection system.
|
|
94
|
+
*/
|
|
95
|
+
export interface AgentDetectionConfig {
|
|
96
|
+
/** Whether agent detection is enabled (default: true) */
|
|
97
|
+
enabled?: boolean;
|
|
98
|
+
/** Cache TTL in milliseconds (default: 60000) */
|
|
99
|
+
cacheTtlMs?: number;
|
|
100
|
+
/** Timeout for `which` calls in milliseconds (default: 5000) */
|
|
101
|
+
whichTimeoutMs?: number;
|
|
102
|
+
/** Timeout for version checks in milliseconds (default: 10000) */
|
|
103
|
+
versionTimeoutMs?: number;
|
|
104
|
+
/** Additional custom agent definitions to include */
|
|
105
|
+
additionalAgents?: CLIAgentDefinition[];
|
|
106
|
+
/** Agent IDs to exclude from detection */
|
|
107
|
+
disabledAgents?: string[];
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Error codes for agent detection operations.
|
|
111
|
+
*/
|
|
112
|
+
export type AgentDetectionErrorCode = "UNKNOWN_AGENT" | "AGENT_NOT_INSTALLED" | "DETECTION_FAILED" | "DETECTION_TIMEOUT";
|
|
113
|
+
/**
|
|
114
|
+
* Error thrown by agent detection operations.
|
|
115
|
+
*/
|
|
116
|
+
export declare class AgentDetectionError extends Error {
|
|
117
|
+
readonly code: AgentDetectionErrorCode;
|
|
118
|
+
readonly agentId?: string | undefined;
|
|
119
|
+
constructor(message: string, code: AgentDetectionErrorCode, agentId?: string | undefined);
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/agent-detection/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,yEAAyE;IACzE,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,wEAAwE;IACxE,UAAU,EAAE,MAAM,CAAC;IAEnB,qDAAqD;IACrD,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,kBAAkB;IACjC,uDAAuD;IACvD,EAAE,EAAE,MAAM,CAAC;IAEX,kCAAkC;IAClC,IAAI,EAAE,MAAM,CAAC;IAEb,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAC;IAEpB,wCAAwC;IACxC,MAAM,EAAE,MAAM,CAAC;IAEf,2DAA2D;IAC3D,WAAW,EAAE,MAAM,EAAE,CAAC;IAEtB,wCAAwC;IACxC,QAAQ,EAAE,cAAc,CAAC;IAEzB,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,2BAA2B;IAC3B,MAAM,EAAE,MAAM,CAAC;CAChB;AAMD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,0BAA0B;IAC1B,EAAE,EAAE,MAAM,CAAC;IAEX,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IAEb,2CAA2C;IAC3C,SAAS,EAAE,OAAO,CAAC;IAEnB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,8BAA8B;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IAEd,qDAAqD;IACrD,UAAU,EAAE,kBAAkB,CAAC;IAE/B,8CAA8C;IAC9C,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,+CAA+C;IAC/C,MAAM,EAAE,aAAa,EAAE,CAAC;IAExB,+BAA+B;IAC/B,OAAO,EAAE,MAAM,CAAC;IAEhB,yCAAyC;IACzC,UAAU,EAAE,MAAM,CAAC;IAEnB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAMD;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,0CAA0C;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,6CAA6C;IAC7C,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,oCAAoC;IACpC,OAAO,EAAE,MAAM,CAAC;IAEhB,uCAAuC;IACvC,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAMD;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,yDAAyD;IACzD,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,gEAAgE;IAChE,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB,kEAAkE;IAClE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAExC,0CAA0C;IAC1C,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC3B;AAMD;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAC/B,eAAe,GACf,qBAAqB,GACrB,kBAAkB,GAClB,mBAAmB,CAAC;AAExB;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;aAG1B,IAAI,EAAE,uBAAuB;aAC7B,OAAO,CAAC,EAAE,MAAM;gBAFhC,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,uBAAuB,EAC7B,OAAO,CAAC,EAAE,MAAM,YAAA;CAKnC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CLI Agent Auto-Detection Types
|
|
3
|
+
*
|
|
4
|
+
* Type definitions for detecting installed CLI coding agents
|
|
5
|
+
* and constructing headless invocation commands.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Error thrown by agent detection operations.
|
|
9
|
+
*/
|
|
10
|
+
export class AgentDetectionError extends Error {
|
|
11
|
+
code;
|
|
12
|
+
agentId;
|
|
13
|
+
constructor(message, code, agentId) {
|
|
14
|
+
super(message);
|
|
15
|
+
this.code = code;
|
|
16
|
+
this.agentId = agentId;
|
|
17
|
+
this.name = "AgentDetectionError";
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/agent-detection/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAsKH;;GAEG;AACH,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAG1B;IACA;IAHlB,YACE,OAAe,EACC,IAA6B,EAC7B,OAAgB;QAEhC,KAAK,CAAC,OAAO,CAAC,CAAC;QAHC,SAAI,GAAJ,IAAI,CAAyB;QAC7B,YAAO,GAAP,OAAO,CAAS;QAGhC,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF"}
|
package/dist/api/server.d.ts
CHANGED
|
@@ -30,6 +30,10 @@ export interface APIServices {
|
|
|
30
30
|
agentManager: AgentManager;
|
|
31
31
|
taskManager: TaskManager;
|
|
32
32
|
messageRouter: MessageRouter;
|
|
33
|
+
/** Optional mail service for conversation tracking */
|
|
34
|
+
mailService?: import("../mail/mail-service.js").MailService;
|
|
35
|
+
/** Optional conversation map for agent-to-conversation tracking */
|
|
36
|
+
conversationMap?: import("../mail/conversation-map.js").ConversationMap;
|
|
33
37
|
}
|
|
34
38
|
export interface StopOptions {
|
|
35
39
|
/** Force immediate shutdown, skipping grace period */
|
|
@@ -103,7 +107,7 @@ export declare function createAPIServer(services: APIServices, config?: APIServe
|
|
|
103
107
|
* @param config - Configuration options
|
|
104
108
|
* @returns Express app
|
|
105
109
|
*/
|
|
106
|
-
export declare function createAPIApp(services: Pick<APIServices, "eventStore" | "agentManager" | "taskManager" | "messageRouter">, config?: {
|
|
110
|
+
export declare function createAPIApp(services: Pick<APIServices, "eventStore" | "agentManager" | "taskManager" | "messageRouter"> & Pick<Partial<APIServices>, "mailService" | "conversationMap">, config?: {
|
|
107
111
|
cors?: boolean;
|
|
108
112
|
}): Express;
|
|
109
113
|
/**
|
package/dist/api/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/api/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAgB,EAAE,OAAO,EAAmC,MAAM,SAAS,CAAC;AAC5E,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAChD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAEjE,OAAO,KAAK,EACV,YAAY,EAmBZ,SAAS,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/api/server.ts"],"names":[],"mappings":"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"}
|
package/dist/api/server.js
CHANGED
|
@@ -33,6 +33,115 @@ export function createAPISharedState() {
|
|
|
33
33
|
broadcast,
|
|
34
34
|
};
|
|
35
35
|
}
|
|
36
|
+
function conversationToSummary(conv) {
|
|
37
|
+
return {
|
|
38
|
+
id: conv.id,
|
|
39
|
+
type: conv.type,
|
|
40
|
+
status: conv.status,
|
|
41
|
+
subject: conv.subject ?? "",
|
|
42
|
+
created_by: conv.createdBy,
|
|
43
|
+
created_at: conv.createdAt,
|
|
44
|
+
updated_at: conv.updatedAt,
|
|
45
|
+
participant_count: conv.participantCount,
|
|
46
|
+
parent_conversation_id: conv.parentConversationId || undefined,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
function conversationToDetail(conv) {
|
|
50
|
+
return {
|
|
51
|
+
...conversationToSummary(conv),
|
|
52
|
+
closed_at: conv.closedAt || undefined,
|
|
53
|
+
closed_by: conv.closedBy || undefined,
|
|
54
|
+
close_reason: conv.closeReason || undefined,
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function turnToSummary(turn) {
|
|
58
|
+
return {
|
|
59
|
+
id: turn.id,
|
|
60
|
+
conversation_id: turn.conversationId,
|
|
61
|
+
participant: turn.participant,
|
|
62
|
+
content_type: turn.contentType,
|
|
63
|
+
content: turn.content,
|
|
64
|
+
timestamp: turn.timestamp,
|
|
65
|
+
source_type: turn.sourceType || undefined,
|
|
66
|
+
source_message_id: turn.sourceMessageId || undefined,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Register conversation API routes on an Express app.
|
|
71
|
+
* Used by both standalone and shared server modes.
|
|
72
|
+
*/
|
|
73
|
+
function registerConversationRoutes(app, services, sendError) {
|
|
74
|
+
if (!services.mailService)
|
|
75
|
+
return;
|
|
76
|
+
const { mailService } = services;
|
|
77
|
+
// GET /api/conversations - List conversations
|
|
78
|
+
app.get("/api/conversations", (req, res) => {
|
|
79
|
+
const params = req.query;
|
|
80
|
+
let conversations = mailService.listConversations({
|
|
81
|
+
type: params.type,
|
|
82
|
+
status: params.status,
|
|
83
|
+
});
|
|
84
|
+
const total = conversations.length;
|
|
85
|
+
const offset = parseInt(params.offset) || 0;
|
|
86
|
+
const limit = parseInt(params.limit) || 50;
|
|
87
|
+
conversations = conversations.slice(offset, offset + limit);
|
|
88
|
+
const response = {
|
|
89
|
+
conversations: conversations.map(conversationToSummary),
|
|
90
|
+
total,
|
|
91
|
+
};
|
|
92
|
+
res.json(response);
|
|
93
|
+
});
|
|
94
|
+
// GET /api/conversations/:id - Get conversation detail
|
|
95
|
+
app.get("/api/conversations/:id", (req, res) => {
|
|
96
|
+
const conv = mailService.getConversation(req.params.id);
|
|
97
|
+
if (!conv) {
|
|
98
|
+
return sendError(res, 404, "CONVERSATION_NOT_FOUND", `Conversation not found: ${req.params.id}`);
|
|
99
|
+
}
|
|
100
|
+
res.json(conversationToDetail(conv));
|
|
101
|
+
});
|
|
102
|
+
// GET /api/conversations/:id/turns - List turns for a conversation
|
|
103
|
+
app.get("/api/conversations/:id/turns", (req, res) => {
|
|
104
|
+
const conv = mailService.getConversation(req.params.id);
|
|
105
|
+
if (!conv) {
|
|
106
|
+
return sendError(res, 404, "CONVERSATION_NOT_FOUND", `Conversation not found: ${req.params.id}`);
|
|
107
|
+
}
|
|
108
|
+
const turns = mailService.listTurns({ conversationId: req.params.id });
|
|
109
|
+
const limit = parseInt(req.query.limit) || 50;
|
|
110
|
+
const offset = parseInt(req.query.offset) || 0;
|
|
111
|
+
const paged = turns.slice(offset, offset + limit);
|
|
112
|
+
const response = {
|
|
113
|
+
turns: paged.map(turnToSummary),
|
|
114
|
+
total: turns.length,
|
|
115
|
+
};
|
|
116
|
+
res.json(response);
|
|
117
|
+
});
|
|
118
|
+
// POST /api/conversations/:id/close - Close a conversation
|
|
119
|
+
app.post("/api/conversations/:id/close", (req, res) => {
|
|
120
|
+
const conv = mailService.getConversation(req.params.id);
|
|
121
|
+
if (!conv) {
|
|
122
|
+
return sendError(res, 404, "CONVERSATION_NOT_FOUND", `Conversation not found: ${req.params.id}`);
|
|
123
|
+
}
|
|
124
|
+
if (conv.status !== "active") {
|
|
125
|
+
return sendError(res, 400, "ALREADY_CLOSED", `Conversation already ${conv.status}`);
|
|
126
|
+
}
|
|
127
|
+
const body = req.body;
|
|
128
|
+
mailService.closeConversation({
|
|
129
|
+
conversationId: req.params.id,
|
|
130
|
+
closedBy: "api",
|
|
131
|
+
reason: body.reason ?? "completed",
|
|
132
|
+
});
|
|
133
|
+
res.json({ success: true });
|
|
134
|
+
});
|
|
135
|
+
// GET /api/conversations/:id/participants - List participants
|
|
136
|
+
app.get("/api/conversations/:id/participants", (req, res) => {
|
|
137
|
+
const conv = mailService.getConversation(req.params.id);
|
|
138
|
+
if (!conv) {
|
|
139
|
+
return sendError(res, 404, "CONVERSATION_NOT_FOUND", `Conversation not found: ${req.params.id}`);
|
|
140
|
+
}
|
|
141
|
+
const participants = mailService.listParticipants(req.params.id);
|
|
142
|
+
res.json({ participants, total: participants.length });
|
|
143
|
+
});
|
|
144
|
+
}
|
|
36
145
|
// ─────────────────────────────────────────────────────────────────
|
|
37
146
|
// Create API Server
|
|
38
147
|
// ─────────────────────────────────────────────────────────────────
|
|
@@ -177,6 +286,25 @@ export function createAPIServer(services, config = {}) {
|
|
|
177
286
|
state.initialized = true;
|
|
178
287
|
state.headManagerId = headManager.id;
|
|
179
288
|
state.startedAt = Date.now();
|
|
289
|
+
// Create session conversation for mail tracking
|
|
290
|
+
if (services.mailService && services.conversationMap) {
|
|
291
|
+
try {
|
|
292
|
+
const { conversationId } = services.mailService.createConversation({
|
|
293
|
+
type: "session",
|
|
294
|
+
subject: "User session",
|
|
295
|
+
createdBy: "user",
|
|
296
|
+
});
|
|
297
|
+
services.mailService.joinConversation({
|
|
298
|
+
conversationId,
|
|
299
|
+
participantId: headManager.id,
|
|
300
|
+
role: "worker",
|
|
301
|
+
});
|
|
302
|
+
services.conversationMap.setSessionConversation(headManager.id, conversationId);
|
|
303
|
+
}
|
|
304
|
+
catch {
|
|
305
|
+
// Never fail init due to mail errors
|
|
306
|
+
}
|
|
307
|
+
}
|
|
180
308
|
const response = {
|
|
181
309
|
success: true,
|
|
182
310
|
head_manager_id: headManager.id,
|
|
@@ -193,6 +321,101 @@ export function createAPIServer(services, config = {}) {
|
|
|
193
321
|
const status = getStatus();
|
|
194
322
|
res.json(status);
|
|
195
323
|
});
|
|
324
|
+
// GET /api/team - Get active team info
|
|
325
|
+
app.get("/api/team", (_req, res) => {
|
|
326
|
+
// Check for team config in EventStore
|
|
327
|
+
const statusEvents = eventStore.query({ type: "status", limit: 50 });
|
|
328
|
+
const teamConfigEvent = statusEvents.find((e) => e.payload?.team_config != null);
|
|
329
|
+
if (!teamConfigEvent?.payload?.team_config) {
|
|
330
|
+
res.json({ active: false });
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
const tc = teamConfigEvent.payload.team_config;
|
|
334
|
+
res.json({
|
|
335
|
+
active: true,
|
|
336
|
+
name: tc.teamName,
|
|
337
|
+
strategy: tc.strategy,
|
|
338
|
+
taskMode: tc.taskMode,
|
|
339
|
+
enforcement: tc.enforcement,
|
|
340
|
+
});
|
|
341
|
+
});
|
|
342
|
+
// ─────────────────────────────────────────────────────────────────
|
|
343
|
+
// Metrics Endpoints (Phase 5)
|
|
344
|
+
// ─────────────────────────────────────────────────────────────────
|
|
345
|
+
// GET /api/metrics/throughput - Task throughput metrics
|
|
346
|
+
app.get("/api/metrics/throughput", (req, res) => {
|
|
347
|
+
const windowMs = req.query.window_ms
|
|
348
|
+
? Number(req.query.window_ms)
|
|
349
|
+
: 5 * 60 * 1000;
|
|
350
|
+
const after = Date.now() - windowMs;
|
|
351
|
+
const taskEvents = eventStore.query({ type: "task", after });
|
|
352
|
+
let completed = 0, failed = 0, created = 0;
|
|
353
|
+
for (const e of taskEvents) {
|
|
354
|
+
const action = e.payload?.action;
|
|
355
|
+
if (action === "created")
|
|
356
|
+
created++;
|
|
357
|
+
else if (action === "completed")
|
|
358
|
+
completed++;
|
|
359
|
+
else if (action === "failed")
|
|
360
|
+
failed++;
|
|
361
|
+
}
|
|
362
|
+
const windowMin = windowMs / 60000;
|
|
363
|
+
res.json({
|
|
364
|
+
tasksCompleted: completed,
|
|
365
|
+
tasksFailed: failed,
|
|
366
|
+
tasksCreated: created,
|
|
367
|
+
completedPerMinute: windowMin > 0 ? Math.round((completed / windowMin) * 100) / 100 : 0,
|
|
368
|
+
windowMs,
|
|
369
|
+
});
|
|
370
|
+
});
|
|
371
|
+
// GET /api/metrics/utilization - Agent utilization metrics
|
|
372
|
+
app.get("/api/metrics/utilization", (_req, res) => {
|
|
373
|
+
const allAgents = eventStore.listAgents();
|
|
374
|
+
const active = allAgents.filter((a) => a.state === "running" || a.state === "spawning");
|
|
375
|
+
const byRole = {};
|
|
376
|
+
const byState = {};
|
|
377
|
+
for (const a of active) {
|
|
378
|
+
const role = a.role ?? "unknown";
|
|
379
|
+
byRole[role] = (byRole[role] ?? 0) + 1;
|
|
380
|
+
}
|
|
381
|
+
for (const a of allAgents) {
|
|
382
|
+
byState[a.state] = (byState[a.state] ?? 0) + 1;
|
|
383
|
+
}
|
|
384
|
+
res.json({
|
|
385
|
+
activeAgents: active.length,
|
|
386
|
+
totalAgents: allAgents.length,
|
|
387
|
+
agentsByRole: byRole,
|
|
388
|
+
agentsByState: byState,
|
|
389
|
+
});
|
|
390
|
+
});
|
|
391
|
+
// GET /api/metrics/errors - Error metrics
|
|
392
|
+
app.get("/api/metrics/errors", (req, res) => {
|
|
393
|
+
const windowMs = req.query.window_ms
|
|
394
|
+
? Number(req.query.window_ms)
|
|
395
|
+
: 30 * 60 * 1000;
|
|
396
|
+
const limit = req.query.limit ? Number(req.query.limit) : 20;
|
|
397
|
+
const statusEvents = eventStore.query({
|
|
398
|
+
type: "status",
|
|
399
|
+
after: Date.now() - windowMs,
|
|
400
|
+
});
|
|
401
|
+
const errors = [];
|
|
402
|
+
const byType = {};
|
|
403
|
+
for (const e of statusEvents) {
|
|
404
|
+
if (e.payload?.status_type !== "failed")
|
|
405
|
+
continue;
|
|
406
|
+
const agentId = e.source?.agent_id ?? "unknown";
|
|
407
|
+
const summary = e.payload?.summary ?? "Unknown error";
|
|
408
|
+
const errorType = e.payload?.details?.signal ?? "agent_failed";
|
|
409
|
+
errors.push({ timestamp: e.timestamp, agentId, type: errorType, summary });
|
|
410
|
+
byType[errorType] = (byType[errorType] ?? 0) + 1;
|
|
411
|
+
}
|
|
412
|
+
errors.sort((a, b) => b.timestamp - a.timestamp);
|
|
413
|
+
res.json({
|
|
414
|
+
totalErrors: errors.length,
|
|
415
|
+
errorsByType: byType,
|
|
416
|
+
recentErrors: errors.slice(0, limit),
|
|
417
|
+
});
|
|
418
|
+
});
|
|
196
419
|
// POST /api/conversation/message - Send message to head manager
|
|
197
420
|
app.post("/api/conversation/message", async (req, res) => {
|
|
198
421
|
// Reject new messages during shutdown
|
|
@@ -214,6 +437,23 @@ export function createAPIServer(services, config = {}) {
|
|
|
214
437
|
content: body.message,
|
|
215
438
|
timestamp: Date.now(),
|
|
216
439
|
});
|
|
440
|
+
// Record user turn in session conversation
|
|
441
|
+
if (services.mailService && services.conversationMap && state.headManagerId) {
|
|
442
|
+
try {
|
|
443
|
+
const sessionConvId = services.conversationMap.getSessionConversation(state.headManagerId);
|
|
444
|
+
if (sessionConvId) {
|
|
445
|
+
services.mailService.recordTurn({
|
|
446
|
+
conversationId: sessionConvId,
|
|
447
|
+
participant: "user",
|
|
448
|
+
contentType: "text",
|
|
449
|
+
content: body.message,
|
|
450
|
+
});
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
catch {
|
|
454
|
+
// Never fail message handling due to mail errors
|
|
455
|
+
}
|
|
456
|
+
}
|
|
217
457
|
// Broadcast to conversation channel
|
|
218
458
|
broadcastToChannel("conversation", {
|
|
219
459
|
type: "message",
|
|
@@ -253,6 +493,23 @@ export function createAPIServer(services, config = {}) {
|
|
|
253
493
|
agent_id: state.headManagerId,
|
|
254
494
|
timestamp: Date.now(),
|
|
255
495
|
});
|
|
496
|
+
// Record assistant turn in session conversation
|
|
497
|
+
if (services.mailService && services.conversationMap && state.headManagerId) {
|
|
498
|
+
try {
|
|
499
|
+
const sessionConvId = services.conversationMap.getSessionConversation(state.headManagerId);
|
|
500
|
+
if (sessionConvId) {
|
|
501
|
+
services.mailService.recordTurn({
|
|
502
|
+
conversationId: sessionConvId,
|
|
503
|
+
participant: state.headManagerId,
|
|
504
|
+
contentType: "text",
|
|
505
|
+
content: responseContent,
|
|
506
|
+
});
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
catch {
|
|
510
|
+
// Never fail message handling due to mail errors
|
|
511
|
+
}
|
|
512
|
+
}
|
|
256
513
|
// Broadcast response
|
|
257
514
|
broadcastToChannel("conversation", {
|
|
258
515
|
type: "message",
|
|
@@ -450,6 +707,8 @@ export function createAPIServer(services, config = {}) {
|
|
|
450
707
|
sendError(res, 500, "INJECTION_FAILED", `Failed to inject context: ${error}`);
|
|
451
708
|
}
|
|
452
709
|
});
|
|
710
|
+
// Register conversation API routes (if mail service available)
|
|
711
|
+
registerConversationRoutes(app, services, sendError);
|
|
453
712
|
// ─────────────────────────────────────────────────────────────────
|
|
454
713
|
// HTTP Server
|
|
455
714
|
// ─────────────────────────────────────────────────────────────────
|
|
@@ -509,6 +768,30 @@ export function createAPIServer(services, config = {}) {
|
|
|
509
768
|
};
|
|
510
769
|
broadcastToChannel("tasks", update);
|
|
511
770
|
});
|
|
771
|
+
// Listen for conversation changes (if available)
|
|
772
|
+
if (eventStore.onConversationChange) {
|
|
773
|
+
eventStore.onConversationChange((conversationId, conversation) => {
|
|
774
|
+
if (!conversation)
|
|
775
|
+
return;
|
|
776
|
+
const update = {
|
|
777
|
+
type: "conversation_update",
|
|
778
|
+
conversation: conversationToSummary(conversation),
|
|
779
|
+
};
|
|
780
|
+
broadcastToChannel("conversations", update);
|
|
781
|
+
broadcastToChannel(`conversation:${conversationId}`, update);
|
|
782
|
+
});
|
|
783
|
+
}
|
|
784
|
+
// Listen for turn changes (if available)
|
|
785
|
+
if (eventStore.onTurnChange) {
|
|
786
|
+
eventStore.onTurnChange((conversationId, turn) => {
|
|
787
|
+
const update = {
|
|
788
|
+
type: "turn_added",
|
|
789
|
+
conversation_id: conversationId,
|
|
790
|
+
turn: turnToSummary(turn),
|
|
791
|
+
};
|
|
792
|
+
broadcastToChannel(`conversation:${conversationId}`, update);
|
|
793
|
+
});
|
|
794
|
+
}
|
|
512
795
|
// ─────────────────────────────────────────────────────────────────
|
|
513
796
|
// Server Lifecycle
|
|
514
797
|
// ─────────────────────────────────────────────────────────────────
|
|
@@ -762,6 +1045,25 @@ export function createAPIApp(services, config = {}) {
|
|
|
762
1045
|
state.initialized = true;
|
|
763
1046
|
state.headManagerId = headManager.id;
|
|
764
1047
|
state.startedAt = Date.now();
|
|
1048
|
+
// Create session conversation for mail tracking
|
|
1049
|
+
if (services.mailService && services.conversationMap) {
|
|
1050
|
+
try {
|
|
1051
|
+
const { conversationId } = services.mailService.createConversation({
|
|
1052
|
+
type: "session",
|
|
1053
|
+
subject: "User session",
|
|
1054
|
+
createdBy: "user",
|
|
1055
|
+
});
|
|
1056
|
+
services.mailService.joinConversation({
|
|
1057
|
+
conversationId,
|
|
1058
|
+
participantId: headManager.id,
|
|
1059
|
+
role: "worker",
|
|
1060
|
+
});
|
|
1061
|
+
services.conversationMap.setSessionConversation(headManager.id, conversationId);
|
|
1062
|
+
}
|
|
1063
|
+
catch {
|
|
1064
|
+
// Never fail init due to mail errors
|
|
1065
|
+
}
|
|
1066
|
+
}
|
|
765
1067
|
const response = {
|
|
766
1068
|
success: true,
|
|
767
1069
|
head_manager_id: headManager.id,
|
|
@@ -818,6 +1120,23 @@ export function createAPIApp(services, config = {}) {
|
|
|
818
1120
|
content: body.message,
|
|
819
1121
|
timestamp: Date.now(),
|
|
820
1122
|
});
|
|
1123
|
+
// Record user turn in session conversation
|
|
1124
|
+
if (services.mailService && services.conversationMap && state.headManagerId) {
|
|
1125
|
+
try {
|
|
1126
|
+
const sessionConvId = services.conversationMap.getSessionConversation(state.headManagerId);
|
|
1127
|
+
if (sessionConvId) {
|
|
1128
|
+
services.mailService.recordTurn({
|
|
1129
|
+
conversationId: sessionConvId,
|
|
1130
|
+
participant: "user",
|
|
1131
|
+
contentType: "text",
|
|
1132
|
+
content: body.message,
|
|
1133
|
+
});
|
|
1134
|
+
}
|
|
1135
|
+
}
|
|
1136
|
+
catch {
|
|
1137
|
+
// Never fail message handling due to mail errors
|
|
1138
|
+
}
|
|
1139
|
+
}
|
|
821
1140
|
// Broadcast to conversation channel
|
|
822
1141
|
state.broadcast("conversation", {
|
|
823
1142
|
type: "message",
|
|
@@ -857,6 +1176,23 @@ export function createAPIApp(services, config = {}) {
|
|
|
857
1176
|
agent_id: state.headManagerId,
|
|
858
1177
|
timestamp: Date.now(),
|
|
859
1178
|
});
|
|
1179
|
+
// Record assistant turn in session conversation
|
|
1180
|
+
if (services.mailService && services.conversationMap && state.headManagerId) {
|
|
1181
|
+
try {
|
|
1182
|
+
const sessionConvId = services.conversationMap.getSessionConversation(state.headManagerId);
|
|
1183
|
+
if (sessionConvId) {
|
|
1184
|
+
services.mailService.recordTurn({
|
|
1185
|
+
conversationId: sessionConvId,
|
|
1186
|
+
participant: state.headManagerId,
|
|
1187
|
+
contentType: "text",
|
|
1188
|
+
content: responseContent,
|
|
1189
|
+
});
|
|
1190
|
+
}
|
|
1191
|
+
}
|
|
1192
|
+
catch {
|
|
1193
|
+
// Never fail message handling due to mail errors
|
|
1194
|
+
}
|
|
1195
|
+
}
|
|
860
1196
|
// Broadcast response
|
|
861
1197
|
state.broadcast("conversation", {
|
|
862
1198
|
type: "message",
|
|
@@ -1055,6 +1391,8 @@ export function createAPIApp(services, config = {}) {
|
|
|
1055
1391
|
sendError(res, 500, "INJECTION_FAILED", `Failed to inject context: ${error}`);
|
|
1056
1392
|
}
|
|
1057
1393
|
});
|
|
1394
|
+
// Register conversation API routes (if mail service available)
|
|
1395
|
+
registerConversationRoutes(app, services, sendError);
|
|
1058
1396
|
return app;
|
|
1059
1397
|
}
|
|
1060
1398
|
/**
|
|
@@ -1144,6 +1482,30 @@ export function setupAPIWebSocket(wss, services, app) {
|
|
|
1144
1482
|
};
|
|
1145
1483
|
broadcast("tasks", update);
|
|
1146
1484
|
});
|
|
1485
|
+
// Listen for conversation changes (if available)
|
|
1486
|
+
if (eventStore.onConversationChange) {
|
|
1487
|
+
eventStore.onConversationChange((conversationId, conversation) => {
|
|
1488
|
+
if (!conversation)
|
|
1489
|
+
return;
|
|
1490
|
+
const update = {
|
|
1491
|
+
type: "conversation_update",
|
|
1492
|
+
conversation: conversationToSummary(conversation),
|
|
1493
|
+
};
|
|
1494
|
+
broadcast("conversations", update);
|
|
1495
|
+
broadcast(`conversation:${conversationId}`, update);
|
|
1496
|
+
});
|
|
1497
|
+
}
|
|
1498
|
+
// Listen for turn changes (if available)
|
|
1499
|
+
if (eventStore.onTurnChange) {
|
|
1500
|
+
eventStore.onTurnChange((conversationId, turn) => {
|
|
1501
|
+
const update = {
|
|
1502
|
+
type: "turn_added",
|
|
1503
|
+
conversation_id: conversationId,
|
|
1504
|
+
turn: turnToSummary(turn),
|
|
1505
|
+
};
|
|
1506
|
+
broadcast(`conversation:${conversationId}`, update);
|
|
1507
|
+
});
|
|
1508
|
+
}
|
|
1147
1509
|
return {
|
|
1148
1510
|
getConnectionCount() {
|
|
1149
1511
|
return wsClients.size;
|