macro-agent 0.1.0 → 0.1.2
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/.claude/settings.local.json +3 -1
- package/.sudocode/issues.jsonl +28 -0
- package/.sudocode/specs.jsonl +8 -0
- package/CLAUDE.md +25 -17
- package/README.md +11 -29
- package/dist/acp/macro-agent.d.ts +15 -0
- package/dist/acp/macro-agent.d.ts.map +1 -1
- package/dist/acp/macro-agent.js +131 -35
- package/dist/acp/macro-agent.js.map +1 -1
- package/dist/acp/types.d.ts +32 -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 +65 -1
- package/dist/agent/agent-manager.d.ts.map +1 -1
- package/dist/agent/agent-manager.js +544 -200
- package/dist/agent/agent-manager.js.map +1 -1
- package/dist/agent/types.d.ts +8 -1
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/api/server.d.ts +8 -1
- package/dist/api/server.d.ts.map +1 -1
- package/dist/api/server.js +136 -8
- package/dist/api/server.js.map +1 -1
- package/dist/api/types.d.ts +1 -1
- package/dist/api/types.d.ts.map +1 -1
- package/dist/auth/index.d.ts +2 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +2 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/token.d.ts +41 -0
- package/dist/auth/token.d.ts.map +1 -0
- package/dist/auth/token.js +73 -0
- package/dist/auth/token.js.map +1 -0
- package/dist/cli/acp.d.ts +2 -23
- package/dist/cli/acp.d.ts.map +1 -1
- package/dist/cli/acp.js +197 -61
- package/dist/cli/acp.js.map +1 -1
- package/dist/cli/index.js +152 -16
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/mcp.d.ts +6 -0
- package/dist/cli/mcp.d.ts.map +1 -1
- package/dist/cli/mcp.js +279 -173
- package/dist/cli/mcp.js.map +1 -1
- package/dist/cli/parse-args.d.ts +20 -0
- package/dist/cli/parse-args.d.ts.map +1 -0
- package/dist/cli/parse-args.js +43 -0
- package/dist/cli/parse-args.js.map +1 -0
- package/dist/cli/stable-instance-id.d.ts +8 -0
- package/dist/cli/stable-instance-id.d.ts.map +1 -0
- package/dist/cli/stable-instance-id.js +14 -0
- package/dist/cli/stable-instance-id.js.map +1 -0
- package/dist/config/project-config.d.ts +85 -7
- package/dist/config/project-config.d.ts.map +1 -1
- package/dist/config/project-config.js +133 -20
- package/dist/config/project-config.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/lifecycle/handlers/index.d.ts +7 -3
- package/dist/lifecycle/handlers/index.d.ts.map +1 -1
- package/dist/lifecycle/handlers/index.js +25 -8
- package/dist/lifecycle/handlers/index.js.map +1 -1
- package/dist/lifecycle/types.d.ts +2 -0
- package/dist/lifecycle/types.d.ts.map +1 -1
- package/dist/lifecycle/types.js.map +1 -1
- package/dist/map/adapter/acp-over-map.d.ts +17 -0
- package/dist/map/adapter/acp-over-map.d.ts.map +1 -1
- package/dist/map/adapter/acp-over-map.js +384 -23
- package/dist/map/adapter/acp-over-map.js.map +1 -1
- package/dist/map/adapter/connection-manager.d.ts.map +1 -1
- package/dist/map/adapter/connection-manager.js +3 -0
- package/dist/map/adapter/connection-manager.js.map +1 -1
- package/dist/map/adapter/event-log.d.ts +87 -0
- package/dist/map/adapter/event-log.d.ts.map +1 -0
- package/dist/map/adapter/event-log.js +122 -0
- package/dist/map/adapter/event-log.js.map +1 -0
- package/dist/map/adapter/event-translator.js +6 -6
- package/dist/map/adapter/event-translator.js.map +1 -1
- package/dist/map/adapter/extensions/agent-lifecycle.d.ts +82 -0
- package/dist/map/adapter/extensions/agent-lifecycle.d.ts.map +1 -0
- package/dist/map/adapter/extensions/agent-lifecycle.js +164 -0
- package/dist/map/adapter/extensions/agent-lifecycle.js.map +1 -0
- package/dist/map/adapter/extensions/index.d.ts +13 -1
- package/dist/map/adapter/extensions/index.d.ts.map +1 -1
- package/dist/map/adapter/extensions/index.js +61 -0
- package/dist/map/adapter/extensions/index.js.map +1 -1
- package/dist/map/adapter/extensions/mcp-bridge.d.ts +57 -0
- package/dist/map/adapter/extensions/mcp-bridge.d.ts.map +1 -0
- package/dist/map/adapter/extensions/mcp-bridge.js +745 -0
- package/dist/map/adapter/extensions/mcp-bridge.js.map +1 -0
- package/dist/map/adapter/extensions/rename.d.ts +29 -0
- package/dist/map/adapter/extensions/rename.d.ts.map +1 -0
- package/dist/map/adapter/extensions/rename.js +49 -0
- package/dist/map/adapter/extensions/rename.js.map +1 -0
- package/dist/map/adapter/extensions/streams.d.ts +95 -0
- package/dist/map/adapter/extensions/streams.d.ts.map +1 -0
- package/dist/map/adapter/extensions/streams.js +515 -0
- package/dist/map/adapter/extensions/streams.js.map +1 -0
- package/dist/map/adapter/extensions/task.d.ts.map +1 -1
- package/dist/map/adapter/extensions/task.js +10 -0
- package/dist/map/adapter/extensions/task.js.map +1 -1
- package/dist/map/adapter/extensions/update-metadata.d.ts +29 -0
- package/dist/map/adapter/extensions/update-metadata.d.ts.map +1 -0
- package/dist/map/adapter/extensions/update-metadata.js +67 -0
- package/dist/map/adapter/extensions/update-metadata.js.map +1 -0
- package/dist/map/adapter/index.d.ts +2 -1
- package/dist/map/adapter/index.d.ts.map +1 -1
- package/dist/map/adapter/index.js +10 -2
- package/dist/map/adapter/index.js.map +1 -1
- package/dist/map/adapter/interface.d.ts +2 -0
- package/dist/map/adapter/interface.d.ts.map +1 -1
- package/dist/map/adapter/map-adapter.d.ts +3 -0
- package/dist/map/adapter/map-adapter.d.ts.map +1 -1
- package/dist/map/adapter/map-adapter.js +258 -35
- package/dist/map/adapter/map-adapter.js.map +1 -1
- package/dist/map/adapter/subscription-manager.d.ts.map +1 -1
- package/dist/map/adapter/subscription-manager.js +5 -1
- package/dist/map/adapter/subscription-manager.js.map +1 -1
- package/dist/map/adapter/types.d.ts +3 -1
- package/dist/map/adapter/types.d.ts.map +1 -1
- package/dist/mcp/map-client.d.ts +39 -0
- package/dist/mcp/map-client.d.ts.map +1 -0
- package/dist/mcp/map-client.js +129 -0
- package/dist/mcp/map-client.js.map +1 -0
- package/dist/mcp/mcp-server.d.ts +16 -0
- package/dist/mcp/mcp-server.d.ts.map +1 -1
- package/dist/mcp/mcp-server.js +125 -88
- package/dist/mcp/mcp-server.js.map +1 -1
- package/dist/mcp/tools/done.d.ts.map +1 -1
- package/dist/mcp/tools/done.js +18 -0
- package/dist/mcp/tools/done.js.map +1 -1
- package/dist/mcp/types.d.ts +9 -1
- package/dist/mcp/types.d.ts.map +1 -1
- package/dist/mcp/types.js.map +1 -1
- package/dist/metrics/metrics.js +1 -1
- package/dist/metrics/metrics.js.map +1 -1
- package/dist/roles/builtin/coordinator.d.ts.map +1 -1
- package/dist/roles/builtin/coordinator.js +2 -1
- package/dist/roles/builtin/coordinator.js.map +1 -1
- package/dist/roles/builtin/integrator.d.ts.map +1 -1
- package/dist/roles/builtin/integrator.js +2 -1
- package/dist/roles/builtin/integrator.js.map +1 -1
- package/dist/roles/builtin/worker.d.ts.map +1 -1
- package/dist/roles/builtin/worker.js +3 -1
- package/dist/roles/builtin/worker.js.map +1 -1
- package/dist/roles/capabilities.d.ts +9 -1
- package/dist/roles/capabilities.d.ts.map +1 -1
- package/dist/roles/capabilities.js +27 -7
- package/dist/roles/capabilities.js.map +1 -1
- package/dist/roles/config-loader.d.ts +6 -6
- package/dist/roles/config-loader.d.ts.map +1 -1
- package/dist/roles/config-loader.js +8 -7
- package/dist/roles/config-loader.js.map +1 -1
- package/dist/roles/registry.d.ts +2 -2
- package/dist/roles/registry.js +2 -2
- package/dist/roles/types.d.ts +3 -1
- package/dist/roles/types.d.ts.map +1 -1
- package/dist/server/combined-server.d.ts +28 -1
- package/dist/server/combined-server.d.ts.map +1 -1
- package/dist/server/combined-server.js +111 -8
- package/dist/server/combined-server.js.map +1 -1
- package/dist/store/event-store.d.ts +2 -1
- package/dist/store/event-store.d.ts.map +1 -1
- package/dist/store/event-store.js +80 -24
- package/dist/store/event-store.js.map +1 -1
- package/dist/store/instance.d.ts +1 -1
- package/dist/store/instance.d.ts.map +1 -1
- package/dist/store/instance.js +2 -2
- package/dist/store/instance.js.map +1 -1
- package/dist/store/types/agents.d.ts +23 -0
- package/dist/store/types/agents.d.ts.map +1 -1
- package/dist/store/types/events.d.ts +1 -1
- package/dist/store/types/events.d.ts.map +1 -1
- package/dist/task/backend/index.d.ts +47 -29
- package/dist/task/backend/index.d.ts.map +1 -1
- package/dist/task/backend/index.js +109 -71
- package/dist/task/backend/index.js.map +1 -1
- package/dist/task/backend/memory.d.ts +1 -0
- package/dist/task/backend/memory.d.ts.map +1 -1
- package/dist/task/backend/memory.js +3 -0
- package/dist/task/backend/memory.js.map +1 -1
- package/dist/task/backend/opentasks/backend.d.ts +140 -0
- package/dist/task/backend/opentasks/backend.d.ts.map +1 -0
- package/dist/task/backend/opentasks/backend.js +1023 -0
- package/dist/task/backend/opentasks/backend.js.map +1 -0
- package/dist/task/backend/opentasks/client.d.ts +337 -0
- package/dist/task/backend/opentasks/client.d.ts.map +1 -0
- package/dist/task/backend/opentasks/client.js +225 -0
- package/dist/task/backend/opentasks/client.js.map +1 -0
- package/dist/task/backend/opentasks/daemon-manager.d.ts +89 -0
- package/dist/task/backend/opentasks/daemon-manager.d.ts.map +1 -0
- package/dist/task/backend/opentasks/daemon-manager.js +195 -0
- package/dist/task/backend/opentasks/daemon-manager.js.map +1 -0
- package/dist/task/backend/opentasks/index.d.ts +21 -0
- package/dist/task/backend/opentasks/index.d.ts.map +1 -0
- package/dist/task/backend/opentasks/index.js +21 -0
- package/dist/task/backend/opentasks/index.js.map +1 -0
- package/dist/task/backend/opentasks/mapping.d.ts +48 -0
- package/dist/task/backend/opentasks/mapping.d.ts.map +1 -0
- package/dist/task/backend/opentasks/mapping.js +77 -0
- package/dist/task/backend/opentasks/mapping.js.map +1 -0
- package/dist/task/backend/types.d.ts +33 -53
- package/dist/task/backend/types.d.ts.map +1 -1
- package/dist/task/backend/types.js +7 -11
- package/dist/task/backend/types.js.map +1 -1
- package/dist/task/backend/unified-tool-provider.d.ts +57 -0
- package/dist/task/backend/unified-tool-provider.d.ts.map +1 -0
- package/dist/task/backend/unified-tool-provider.js +623 -0
- package/dist/task/backend/unified-tool-provider.js.map +1 -0
- package/dist/teams/index.d.ts +3 -1
- package/dist/teams/index.d.ts.map +1 -1
- package/dist/teams/index.js +2 -0
- package/dist/teams/index.js.map +1 -1
- package/dist/teams/seed-defaults.d.ts +20 -0
- package/dist/teams/seed-defaults.d.ts.map +1 -0
- package/dist/teams/seed-defaults.js +71 -0
- package/dist/teams/seed-defaults.js.map +1 -0
- package/dist/teams/team-loader.d.ts +7 -3
- package/dist/teams/team-loader.d.ts.map +1 -1
- package/dist/teams/team-loader.js +156 -164
- package/dist/teams/team-loader.js.map +1 -1
- package/dist/teams/team-manager.d.ts +112 -0
- package/dist/teams/team-manager.d.ts.map +1 -0
- package/dist/teams/team-manager.js +305 -0
- package/dist/teams/team-manager.js.map +1 -0
- package/dist/teams/team-runtime.d.ts +125 -19
- package/dist/teams/team-runtime.d.ts.map +1 -1
- package/dist/teams/team-runtime.js +529 -119
- package/dist/teams/team-runtime.js.map +1 -1
- package/dist/teams/types.d.ts +41 -151
- package/dist/teams/types.d.ts.map +1 -1
- package/dist/teams/types.js +2 -3
- package/dist/teams/types.js.map +1 -1
- package/docs/architecture.md +7 -6
- package/docs/configuration.md +26 -62
- package/docs/implementation-details.md +5 -5
- package/docs/implementation-summary.md +17 -17
- package/docs/plan-self-driving-support.md +4 -4
- package/docs/spec-self-driving-support.md +10 -10
- package/docs/team-templates.md +2 -2
- package/docs/teams.md +76 -3
- package/docs/troubleshooting.md +10 -11
- package/package.json +7 -4
- package/references/minimem/.claude/settings.json +7 -0
- package/references/minimem/.sudocode/issues.jsonl +18 -0
- package/references/minimem/.sudocode/specs.jsonl +1 -0
- package/references/minimem/CLAUDE.md +310 -0
- package/references/minimem/README.md +562 -0
- package/references/minimem/claude-plugin/.claude-plugin/plugin.json +10 -0
- package/references/minimem/claude-plugin/.mcp.json +7 -0
- package/references/minimem/claude-plugin/README.md +158 -0
- package/references/minimem/claude-plugin/commands/recall.md +47 -0
- package/references/minimem/claude-plugin/commands/remember.md +41 -0
- package/references/minimem/claude-plugin/hooks/__tests__/hooks.test.ts +272 -0
- package/references/minimem/claude-plugin/hooks/hooks.json +27 -0
- package/references/minimem/claude-plugin/hooks/session-end.sh +86 -0
- package/references/minimem/claude-plugin/hooks/session-start.sh +85 -0
- package/references/minimem/claude-plugin/skills/memory/SKILL.md +108 -0
- package/references/minimem/media/banner.png +0 -0
- package/references/minimem/package-lock.json +5373 -0
- package/references/minimem/package.json +72 -0
- package/references/minimem/scripts/postbuild.js +35 -0
- package/references/minimem/src/__tests__/edge-cases.test.ts +371 -0
- package/references/minimem/src/__tests__/errors.test.ts +265 -0
- package/references/minimem/src/__tests__/helpers.ts +199 -0
- package/references/minimem/src/__tests__/internal.test.ts +407 -0
- package/references/minimem/src/__tests__/knowledge.test.ts +287 -0
- package/references/minimem/src/__tests__/minimem.integration.test.ts +1127 -0
- package/references/minimem/src/__tests__/session.test.ts +190 -0
- package/references/minimem/src/cli/__tests__/commands.test.ts +759 -0
- package/references/minimem/src/cli/commands/__tests__/conflicts.test.ts +141 -0
- package/references/minimem/src/cli/commands/append.ts +76 -0
- package/references/minimem/src/cli/commands/config.ts +262 -0
- package/references/minimem/src/cli/commands/conflicts.ts +413 -0
- package/references/minimem/src/cli/commands/daemon.ts +169 -0
- package/references/minimem/src/cli/commands/index.ts +12 -0
- package/references/minimem/src/cli/commands/init.ts +88 -0
- package/references/minimem/src/cli/commands/mcp.ts +177 -0
- package/references/minimem/src/cli/commands/push-pull.ts +213 -0
- package/references/minimem/src/cli/commands/search.ts +158 -0
- package/references/minimem/src/cli/commands/status.ts +84 -0
- package/references/minimem/src/cli/commands/sync-init.ts +290 -0
- package/references/minimem/src/cli/commands/sync.ts +70 -0
- package/references/minimem/src/cli/commands/upsert.ts +197 -0
- package/references/minimem/src/cli/config.ts +584 -0
- package/references/minimem/src/cli/index.ts +264 -0
- package/references/minimem/src/cli/shared.ts +161 -0
- package/references/minimem/src/cli/sync/__tests__/central.test.ts +152 -0
- package/references/minimem/src/cli/sync/__tests__/conflicts.test.ts +209 -0
- package/references/minimem/src/cli/sync/__tests__/daemon.test.ts +118 -0
- package/references/minimem/src/cli/sync/__tests__/detection.test.ts +207 -0
- package/references/minimem/src/cli/sync/__tests__/integration.test.ts +476 -0
- package/references/minimem/src/cli/sync/__tests__/registry.test.ts +363 -0
- package/references/minimem/src/cli/sync/__tests__/state.test.ts +255 -0
- package/references/minimem/src/cli/sync/__tests__/validation.test.ts +193 -0
- package/references/minimem/src/cli/sync/__tests__/watcher.test.ts +178 -0
- package/references/minimem/src/cli/sync/central.ts +292 -0
- package/references/minimem/src/cli/sync/conflicts.ts +204 -0
- package/references/minimem/src/cli/sync/daemon.ts +407 -0
- package/references/minimem/src/cli/sync/detection.ts +138 -0
- package/references/minimem/src/cli/sync/index.ts +107 -0
- package/references/minimem/src/cli/sync/operations.ts +373 -0
- package/references/minimem/src/cli/sync/registry.ts +279 -0
- package/references/minimem/src/cli/sync/state.ts +355 -0
- package/references/minimem/src/cli/sync/validation.ts +206 -0
- package/references/minimem/src/cli/sync/watcher.ts +234 -0
- package/references/minimem/src/cli/version.ts +34 -0
- package/references/minimem/src/core/index.ts +9 -0
- package/references/minimem/src/core/indexer.ts +628 -0
- package/references/minimem/src/core/searcher.ts +221 -0
- package/references/minimem/src/db/schema.ts +183 -0
- package/references/minimem/src/db/sqlite-vec.ts +24 -0
- package/references/minimem/src/embeddings/__tests__/embeddings.test.ts +431 -0
- package/references/minimem/src/embeddings/batch-gemini.ts +392 -0
- package/references/minimem/src/embeddings/batch-openai.ts +409 -0
- package/references/minimem/src/embeddings/embeddings.ts +434 -0
- package/references/minimem/src/index.ts +109 -0
- package/references/minimem/src/internal.ts +299 -0
- package/references/minimem/src/minimem.ts +1276 -0
- package/references/minimem/src/search/__tests__/hybrid.test.ts +247 -0
- package/references/minimem/src/search/graph.ts +234 -0
- package/references/minimem/src/search/hybrid.ts +151 -0
- package/references/minimem/src/search/search.ts +256 -0
- package/references/minimem/src/server/__tests__/mcp.test.ts +341 -0
- package/references/minimem/src/server/__tests__/tools.test.ts +364 -0
- package/references/minimem/src/server/mcp.ts +326 -0
- package/references/minimem/src/server/tools.ts +720 -0
- package/references/minimem/src/session.ts +460 -0
- package/references/minimem/tsconfig.json +19 -0
- package/references/minimem/tsup.config.ts +26 -0
- package/references/minimem/vitest.config.ts +24 -0
- package/references/openteams/.claude/settings.json +6 -0
- package/references/openteams/README.md +1 -0
- package/references/openteams/SKILL.md +341 -0
- package/references/openteams/design.md +411 -0
- package/references/openteams/examples/bmad-method/prompts/analyst/ROLE.md +16 -0
- package/references/openteams/examples/bmad-method/prompts/analyst/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/prompts/architect/ROLE.md +24 -0
- package/references/openteams/examples/bmad-method/prompts/architect/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/prompts/developer/ROLE.md +25 -0
- package/references/openteams/examples/bmad-method/prompts/developer/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/prompts/master/ROLE.md +21 -0
- package/references/openteams/examples/bmad-method/prompts/master/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/prompts/pm/ROLE.md +20 -0
- package/references/openteams/examples/bmad-method/prompts/pm/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/prompts/qa/ROLE.md +17 -0
- package/references/openteams/examples/bmad-method/prompts/qa/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/prompts/quick-flow-dev/ROLE.md +23 -0
- package/references/openteams/examples/bmad-method/prompts/quick-flow-dev/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/prompts/scrum-master/ROLE.md +27 -0
- package/references/openteams/examples/bmad-method/prompts/scrum-master/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/prompts/tech-writer/ROLE.md +21 -0
- package/references/openteams/examples/bmad-method/prompts/tech-writer/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/prompts/ux-designer/ROLE.md +16 -0
- package/references/openteams/examples/bmad-method/prompts/ux-designer/SOUL.md +5 -0
- package/references/openteams/examples/bmad-method/roles/analyst.yaml +9 -0
- package/references/openteams/examples/bmad-method/roles/architect.yaml +9 -0
- package/references/openteams/examples/bmad-method/roles/developer.yaml +8 -0
- package/references/openteams/examples/bmad-method/roles/master.yaml +8 -0
- package/references/openteams/examples/bmad-method/roles/pm.yaml +9 -0
- package/references/openteams/examples/bmad-method/roles/qa.yaml +8 -0
- package/references/openteams/examples/bmad-method/roles/quick-flow-dev.yaml +8 -0
- package/references/openteams/examples/bmad-method/roles/scrum-master.yaml +9 -0
- package/references/openteams/examples/bmad-method/roles/tech-writer.yaml +8 -0
- package/references/openteams/examples/bmad-method/roles/ux-designer.yaml +8 -0
- package/references/openteams/examples/bmad-method/team.yaml +161 -0
- package/references/openteams/examples/get-shit-done/prompts/codebase-mapper/ROLE.md +17 -0
- package/references/openteams/examples/get-shit-done/prompts/codebase-mapper/SOUL.md +5 -0
- package/references/openteams/examples/get-shit-done/prompts/debugger/ROLE.md +25 -0
- package/references/openteams/examples/get-shit-done/prompts/debugger/SOUL.md +5 -0
- package/references/openteams/examples/get-shit-done/prompts/executor/ROLE.md +34 -0
- package/references/openteams/examples/get-shit-done/prompts/executor/SOUL.md +5 -0
- package/references/openteams/examples/get-shit-done/prompts/integration-checker/ROLE.md +18 -0
- package/references/openteams/examples/get-shit-done/prompts/integration-checker/SOUL.md +3 -0
- package/references/openteams/examples/get-shit-done/prompts/orchestrator/ROLE.md +42 -0
- package/references/openteams/examples/get-shit-done/prompts/orchestrator/SOUL.md +5 -0
- package/references/openteams/examples/get-shit-done/prompts/phase-researcher/ROLE.md +15 -0
- package/references/openteams/examples/get-shit-done/prompts/phase-researcher/SOUL.md +3 -0
- package/references/openteams/examples/get-shit-done/prompts/plan-checker/ROLE.md +17 -0
- package/references/openteams/examples/get-shit-done/prompts/plan-checker/SOUL.md +3 -0
- package/references/openteams/examples/get-shit-done/prompts/planner/ROLE.md +28 -0
- package/references/openteams/examples/get-shit-done/prompts/planner/SOUL.md +5 -0
- package/references/openteams/examples/get-shit-done/prompts/project-researcher/ROLE.md +16 -0
- package/references/openteams/examples/get-shit-done/prompts/project-researcher/SOUL.md +3 -0
- package/references/openteams/examples/get-shit-done/prompts/research-synthesizer/ROLE.md +13 -0
- package/references/openteams/examples/get-shit-done/prompts/research-synthesizer/SOUL.md +3 -0
- package/references/openteams/examples/get-shit-done/prompts/roadmapper/ROLE.md +14 -0
- package/references/openteams/examples/get-shit-done/prompts/roadmapper/SOUL.md +3 -0
- package/references/openteams/examples/get-shit-done/prompts/verifier/ROLE.md +19 -0
- package/references/openteams/examples/get-shit-done/prompts/verifier/SOUL.md +5 -0
- package/references/openteams/examples/get-shit-done/roles/codebase-mapper.yaml +8 -0
- package/references/openteams/examples/get-shit-done/roles/debugger.yaml +8 -0
- package/references/openteams/examples/get-shit-done/roles/executor.yaml +8 -0
- package/references/openteams/examples/get-shit-done/roles/integration-checker.yaml +8 -0
- package/references/openteams/examples/get-shit-done/roles/orchestrator.yaml +9 -0
- package/references/openteams/examples/get-shit-done/roles/phase-researcher.yaml +7 -0
- package/references/openteams/examples/get-shit-done/roles/plan-checker.yaml +8 -0
- package/references/openteams/examples/get-shit-done/roles/planner.yaml +8 -0
- package/references/openteams/examples/get-shit-done/roles/project-researcher.yaml +8 -0
- package/references/openteams/examples/get-shit-done/roles/research-synthesizer.yaml +7 -0
- package/references/openteams/examples/get-shit-done/roles/roadmapper.yaml +7 -0
- package/references/openteams/examples/get-shit-done/roles/verifier.yaml +8 -0
- package/references/openteams/examples/get-shit-done/team.yaml +154 -0
- package/references/openteams/package-lock.json +2181 -0
- package/references/openteams/package.json +48 -0
- package/references/openteams/schema/role.schema.json +125 -0
- package/references/openteams/schema/team.schema.json +284 -0
- package/references/openteams/src/cli/agent.ts +104 -0
- package/references/openteams/src/cli/cli.test.ts +381 -0
- package/references/openteams/src/cli/generate.ts +220 -0
- package/references/openteams/src/cli/message.ts +241 -0
- package/references/openteams/src/cli/task.ts +154 -0
- package/references/openteams/src/cli/team.ts +104 -0
- package/references/openteams/src/cli/template.ts +207 -0
- package/references/openteams/src/cli.ts +45 -0
- package/references/openteams/src/db/database.test.ts +185 -0
- package/references/openteams/src/db/database.ts +240 -0
- package/references/openteams/src/generators/agent-prompt-generator.test.ts +332 -0
- package/references/openteams/src/generators/agent-prompt-generator.ts +521 -0
- package/references/openteams/src/generators/package-generator.test.ts +129 -0
- package/references/openteams/src/generators/package-generator.ts +102 -0
- package/references/openteams/src/generators/skill-generator.test.ts +246 -0
- package/references/openteams/src/generators/skill-generator.ts +374 -0
- package/references/openteams/src/index.ts +104 -0
- package/references/openteams/src/services/agent-service.test.ts +158 -0
- package/references/openteams/src/services/agent-service.ts +84 -0
- package/references/openteams/src/services/communication-service.test.ts +455 -0
- package/references/openteams/src/services/communication-service.ts +371 -0
- package/references/openteams/src/services/message-service.test.ts +342 -0
- package/references/openteams/src/services/message-service.ts +203 -0
- package/references/openteams/src/services/task-service.test.ts +434 -0
- package/references/openteams/src/services/task-service.ts +239 -0
- package/references/openteams/src/services/team-service.test.ts +181 -0
- package/references/openteams/src/services/team-service.ts +139 -0
- package/references/openteams/src/services/template-service.test.ts +306 -0
- package/references/openteams/src/services/template-service.ts +182 -0
- package/references/openteams/src/spawner/acp-factory.ts +96 -0
- package/references/openteams/src/spawner/interface.ts +31 -0
- package/references/openteams/src/spawner/mock.test.ts +93 -0
- package/references/openteams/src/spawner/mock.ts +59 -0
- package/references/openteams/src/template/loader.test.ts +1319 -0
- package/references/openteams/src/template/loader.ts +698 -0
- package/references/openteams/src/template/types.ts +200 -0
- package/references/openteams/src/types.ts +205 -0
- package/references/openteams/tsconfig.json +18 -0
- package/references/openteams/vitest.config.ts +9 -0
- package/references/skill-tree/.claude/settings.json +6 -0
- package/references/skill-tree/.sudocode/issues.jsonl +11 -0
- package/references/skill-tree/.sudocode/specs.jsonl +1 -0
- package/references/skill-tree/CLAUDE.md +150 -0
- package/references/skill-tree/README.md +324 -0
- package/references/skill-tree/docs/GAPS_v1.md +221 -0
- package/references/skill-tree/docs/INTEGRATION_PLAN.md +467 -0
- package/references/skill-tree/docs/TODOS.md +91 -0
- package/references/skill-tree/docs/anthropic_skill_guide.md +1364 -0
- package/references/skill-tree/docs/design/federated-skill-trees.md +524 -0
- package/references/skill-tree/docs/design/multi-agent-sync.md +759 -0
- package/references/skill-tree/docs/scraper/BRAINSTORM.md +583 -0
- package/references/skill-tree/docs/scraper/POC_PLAN.md +420 -0
- package/references/skill-tree/docs/scraper/README.md +170 -0
- package/references/skill-tree/examples/basic-usage.ts +190 -0
- package/references/skill-tree/package-lock.json +1509 -0
- package/references/skill-tree/package.json +66 -0
- package/references/skill-tree/scraper/README.md +123 -0
- package/references/skill-tree/scraper/docs/DESIGN.md +683 -0
- package/references/skill-tree/scraper/docs/PLAN.md +336 -0
- package/references/skill-tree/scraper/drizzle.config.ts +10 -0
- package/references/skill-tree/scraper/package-lock.json +6329 -0
- package/references/skill-tree/scraper/package.json +68 -0
- package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-description.md +7 -0
- package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-name.md +7 -0
- package/references/skill-tree/scraper/test/fixtures/minimal-skill/SKILL.md +27 -0
- package/references/skill-tree/scraper/test/fixtures/skill-json/SKILL.json +21 -0
- package/references/skill-tree/scraper/test/fixtures/skill-with-meta/SKILL.md +54 -0
- package/references/skill-tree/scraper/test/fixtures/skill-with-meta/_meta.json +24 -0
- package/references/skill-tree/scraper/test/fixtures/valid-skill/SKILL.md +93 -0
- package/references/skill-tree/scraper/test/fixtures/valid-skill/_meta.json +22 -0
- package/references/skill-tree/scraper/tsup.config.ts +14 -0
- package/references/skill-tree/scraper/vitest.config.ts +17 -0
- package/references/skill-tree/scripts/convert-to-vitest.ts +166 -0
- package/references/skill-tree/skills/skill-writer/SKILL.md +339 -0
- package/references/skill-tree/skills/skill-writer/references/examples.md +326 -0
- package/references/skill-tree/skills/skill-writer/references/patterns.md +210 -0
- package/references/skill-tree/skills/skill-writer/references/quality-checklist.md +123 -0
- package/references/skill-tree/test/run-all.ts +106 -0
- package/references/skill-tree/test/utils.ts +128 -0
- package/references/skill-tree/vitest.config.ts +16 -0
- package/src/__tests__/e2e/agent-spawn-visibility.e2e.test.ts +761 -0
- package/src/__tests__/e2e/full-agent-conflict-resolution.e2e.test.ts +2 -2
- package/src/__tests__/e2e/mcp-thin-client-bridge.e2e.test.ts +304 -0
- package/src/__tests__/e2e/mcp-tools-available.e2e.test.ts +324 -0
- package/src/__tests__/e2e/multi-agent.e2e.test.ts +5 -5
- package/src/__tests__/e2e/spawn-session-streaming.e2e.test.ts +563 -0
- package/src/acp/__tests__/integration.test.ts +56 -31
- package/src/acp/__tests__/macro-agent.test.ts +16 -7
- package/src/acp/macro-agent.ts +170 -36
- package/src/acp/types.ts +46 -1
- package/src/agent/__tests__/agent-manager.test.ts +228 -2
- package/src/agent/agent-manager.ts +809 -285
- package/src/agent/types.ts +12 -1
- package/src/api/__tests__/server.test.ts +203 -4
- package/src/api/server.ts +169 -10
- package/src/api/types.ts +3 -1
- package/src/auth/__tests__/token.test.ts +100 -0
- package/src/auth/index.ts +1 -0
- package/src/auth/token.ts +82 -0
- package/src/cli/__tests__/acp.test.ts +1 -1
- package/src/cli/__tests__/stable-instance-id.test.ts +1 -1
- package/src/cli/acp.ts +197 -72
- package/src/cli/index.ts +125 -15
- package/src/cli/mcp.ts +315 -197
- package/src/cli/parse-args.ts +54 -0
- package/src/cli/stable-instance-id.ts +14 -0
- package/src/config/project-config.ts +214 -27
- package/src/index.ts +3 -0
- package/src/lifecycle/__tests__/cascade-termination.test.ts +1 -1
- package/src/lifecycle/__tests__/handlers.test.ts +53 -0
- package/src/lifecycle/handlers/index.ts +25 -8
- package/src/lifecycle/types.ts +3 -0
- package/src/map/adapter/__tests__/acp-over-map-cancel.test.ts +22 -4
- package/src/map/adapter/__tests__/acp-over-map-getmodels.test.ts +355 -0
- package/src/map/adapter/__tests__/acp-over-map-history.test.ts +263 -0
- package/src/map/adapter/__tests__/acp-over-map-persistence.e2e.test.ts +1 -1
- package/src/map/adapter/__tests__/event-broadcast.test.ts +420 -0
- package/src/map/adapter/__tests__/event-log.test.ts +527 -0
- package/src/map/adapter/__tests__/event-translator.test.ts +3 -3
- package/src/map/adapter/__tests__/extensions.test.ts +408 -0
- package/src/map/adapter/__tests__/map-adapter.test.ts +99 -0
- package/src/map/adapter/__tests__/mcp-bridge.test.ts +1187 -0
- package/src/map/adapter/__tests__/multi-client-broadcast.test.ts +711 -0
- package/src/map/adapter/__tests__/stream-extensions.test.ts +494 -0
- package/src/map/adapter/__tests__/websocket-integration.test.ts +218 -0
- package/src/map/adapter/acp-over-map.ts +678 -66
- package/src/map/adapter/connection-manager.ts +3 -0
- package/src/map/adapter/event-log.ts +208 -0
- package/src/map/adapter/event-translator.ts +6 -6
- package/src/map/adapter/extensions/agent-lifecycle.ts +267 -0
- package/src/map/adapter/extensions/index.ts +96 -0
- package/src/map/adapter/extensions/mcp-bridge.ts +995 -0
- package/src/map/adapter/extensions/streams.ts +839 -0
- package/src/map/adapter/extensions/task.ts +11 -0
- package/src/map/adapter/extensions/update-metadata.ts +126 -0
- package/src/map/adapter/index.ts +33 -0
- package/src/map/adapter/interface.ts +2 -0
- package/src/map/adapter/map-adapter.ts +312 -47
- package/src/map/adapter/subscription-manager.ts +5 -1
- package/src/map/adapter/types.ts +10 -1
- package/src/mcp/__tests__/map-client.test.ts +386 -0
- package/src/mcp/__tests__/mcp-server-thin-client.test.ts +368 -0
- package/src/mcp/__tests__/mcp-server.test.ts +100 -1
- package/src/mcp/map-client.ts +177 -0
- package/src/mcp/mcp-server.ts +205 -103
- package/src/mcp/tools/done.ts +19 -0
- package/src/mcp/types.ts +6 -1
- package/src/metrics/metrics.ts +1 -1
- package/src/monitor/__tests__/stale-agent-flow.integration.test.ts +1 -1
- package/src/roles/__tests__/config-loader.test.ts +7 -7
- package/src/roles/builtin/coordinator.ts +2 -0
- package/src/roles/builtin/integrator.ts +2 -0
- package/src/roles/builtin/worker.ts +3 -0
- package/src/roles/capabilities.ts +28 -7
- package/src/roles/config-loader.ts +8 -7
- package/src/roles/registry.ts +2 -2
- package/src/roles/types.ts +7 -0
- package/src/server/__tests__/combined-server.test.ts +94 -21
- package/src/server/combined-server.ts +203 -33
- package/src/steering/__tests__/steering-integration.test.ts +1 -1
- package/src/store/__tests__/event-store-oob.test.ts +109 -0
- package/src/store/__tests__/event-store.test.ts +196 -1
- package/src/store/__tests__/instance.test.ts +3 -3
- package/src/store/event-store.ts +92 -23
- package/src/store/instance.ts +2 -2
- package/src/store/types/agents.ts +20 -0
- package/src/store/types/events.ts +1 -1
- package/src/task/backend/__tests__/create-task-backend.test.ts +225 -0
- package/src/task/backend/__tests__/e2e/unified-tool-provider-opentasks.e2e.test.ts +524 -0
- package/src/task/backend/__tests__/memory-pull-mode.test.ts +153 -0
- package/src/task/backend/__tests__/unified-tool-provider.test.ts +579 -0
- package/src/task/backend/index.ts +156 -106
- package/src/task/backend/memory.ts +4 -0
- package/src/task/backend/opentasks/__tests__/backend.test.ts +968 -0
- package/src/task/backend/opentasks/__tests__/daemon-manager.test.ts +406 -0
- package/src/task/backend/opentasks/__tests__/mapping.test.ts +84 -0
- package/src/task/backend/opentasks/__tests__/opentasks-backend.e2e.test.ts +1338 -0
- package/src/task/backend/opentasks/backend.ts +1323 -0
- package/src/task/backend/opentasks/client.ts +652 -0
- package/src/task/backend/opentasks/daemon-manager.ts +256 -0
- package/src/task/backend/opentasks/index.ts +69 -0
- package/src/task/backend/opentasks/mapping.ts +94 -0
- package/src/task/backend/types.ts +42 -66
- package/src/task/backend/unified-tool-provider.ts +779 -0
- package/src/teams/CLAUDE.md +180 -0
- package/src/teams/__tests__/cross-subsystem.integration.test.ts +1 -1
- package/src/teams/__tests__/e2e/workspace-isolation.e2e.test.ts +1263 -0
- package/src/teams/__tests__/team-manager.test.ts +814 -0
- package/src/teams/__tests__/team-system.test.ts +1291 -8
- package/src/teams/index.ts +21 -3
- package/src/teams/seed-defaults.ts +79 -0
- package/src/teams/team-loader.ts +202 -236
- package/src/teams/team-manager.ts +387 -0
- package/src/teams/team-runtime.ts +592 -121
- package/src/teams/types.ts +99 -200
- package/test_fixtures/README.md +2 -3
- package/test_fixtures/fixtures/index.ts +0 -3
- package/test_fixtures/fixtures/projects/project-with-specs.ts +7 -149
- package/test_fixtures/fixtures/repos/index.ts +1 -3
- package/test_fixtures/fixtures/repos/temp-repo-factory.ts +0 -116
- package/test_fixtures/fixtures/repos/types.ts +0 -11
- package/test_fixtures/harness/__tests__/fixtures.test.ts +10 -102
- package/test_fixtures/harness/__tests__/temp-repo-and-simulator.test.ts +0 -33
- package/test_fixtures/harness/simulator/agent-simulator.ts +4 -4
- package/vitest.config.ts +1 -1
- package/vitest.e2e.config.ts +1 -1
- package/vitest.setup.ts +1 -30
- package/.macro-agent/teams/self-driving/prompts/grinder.md +0 -27
- package/.macro-agent/teams/self-driving/prompts/judge.md +0 -27
- package/.macro-agent/teams/self-driving/prompts/planner.md +0 -33
- package/.macro-agent/teams/self-driving/roles/grinder.yaml +0 -17
- package/.macro-agent/teams/self-driving/roles/judge.yaml +0 -24
- package/.macro-agent/teams/self-driving/roles/planner.yaml +0 -18
- package/.macro-agent/teams/self-driving/team.yaml +0 -103
- package/.macro-agent/teams/structured/prompts/developer.md +0 -26
- package/.macro-agent/teams/structured/prompts/lead.md +0 -25
- package/.macro-agent/teams/structured/prompts/reviewer.md +0 -24
- package/.macro-agent/teams/structured/roles/developer.yaml +0 -12
- package/.macro-agent/teams/structured/roles/lead.yaml +0 -11
- package/.macro-agent/teams/structured/roles/reviewer.yaml +0 -19
- package/.macro-agent/teams/structured/team.yaml +0 -89
- package/docs/sudocode-integration.md +0 -383
- package/src/task/backend/__tests__/backend-parity.test.ts +0 -451
- package/src/task/backend/__tests__/tool-provider-edge-cases.test.ts +0 -430
- package/src/task/backend/__tests__/tool-provider.test.ts +0 -983
- package/src/task/backend/sudocode/__tests__/backend-edge-cases.test.ts +0 -575
- package/src/task/backend/sudocode/__tests__/backend.test.ts +0 -1194
- package/src/task/backend/sudocode/__tests__/client-integration.test.ts +0 -418
- package/src/task/backend/sudocode/__tests__/client.test.ts +0 -345
- package/src/task/backend/sudocode/__tests__/e2e/backend.e2e.test.ts +0 -753
- package/src/task/backend/sudocode/__tests__/e2e/server-client.e2e.test.ts +0 -680
- package/src/task/backend/sudocode/__tests__/e2e-workflow.test.ts +0 -666
- package/src/task/backend/sudocode/__tests__/integration/standalone-client.integration.test.ts +0 -396
- package/src/task/backend/sudocode/__tests__/integration/sudocode-cli.integration.test.ts +0 -328
- package/src/task/backend/sudocode/__tests__/integration/test-utils.ts +0 -175
- package/src/task/backend/sudocode/__tests__/mapping-edge-cases.test.ts +0 -265
- package/src/task/backend/sudocode/__tests__/server-client.test.ts +0 -675
- package/src/task/backend/sudocode/__tests__/sync-policy-edge-cases.test.ts +0 -521
- package/src/task/backend/sudocode/__tests__/sync-policy.test.ts +0 -519
- package/src/task/backend/sudocode/__tests__/tools.test.ts +0 -471
- package/src/task/backend/sudocode/backend.ts +0 -1237
- package/src/task/backend/sudocode/client.ts +0 -515
- package/src/task/backend/sudocode/index.ts +0 -120
- package/src/task/backend/sudocode/mapping.ts +0 -93
- package/src/task/backend/sudocode/server-client.ts +0 -522
- package/src/task/backend/sudocode/standalone-client.ts +0 -623
- package/src/task/backend/sudocode/sync-policy.ts +0 -387
- package/src/task/backend/sudocode/tools.ts +0 -896
- package/src/task/backend/tool-provider.ts +0 -506
- package/test_fixtures/fixtures/sudocode/index.ts +0 -29
- package/test_fixtures/fixtures/sudocode/issues.ts +0 -185
- package/test_fixtures/fixtures/sudocode/specs.ts +0 -159
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thin MAP Client
|
|
3
|
+
*
|
|
4
|
+
* Ephemeral WebSocket client for MCP subprocesses to call MAP extension
|
|
5
|
+
* methods on the main server. Each call opens a connection, performs the
|
|
6
|
+
* MAP handshake, sends a single RPC, and disconnects.
|
|
7
|
+
*
|
|
8
|
+
* Uses raw WebSocket + JSON-RPC — not the full MAP ClientConnection SDK,
|
|
9
|
+
* since the SDK's capability negotiation and subscription management
|
|
10
|
+
* overhead is unnecessary for single-RPC ephemeral calls.
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import WebSocket from "ws";
|
|
14
|
+
|
|
15
|
+
// =============================================================================
|
|
16
|
+
// Types
|
|
17
|
+
// =============================================================================
|
|
18
|
+
|
|
19
|
+
interface JsonRpcRequest {
|
|
20
|
+
jsonrpc: "2.0";
|
|
21
|
+
id: number;
|
|
22
|
+
method: string;
|
|
23
|
+
params?: unknown;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
interface JsonRpcResponse {
|
|
27
|
+
jsonrpc: "2.0";
|
|
28
|
+
id: number;
|
|
29
|
+
result?: unknown;
|
|
30
|
+
error?: {
|
|
31
|
+
code: number;
|
|
32
|
+
message: string;
|
|
33
|
+
data?: unknown;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface MapCallOptions {
|
|
38
|
+
/** Timeout in milliseconds (default: 30000) */
|
|
39
|
+
timeoutMs?: number;
|
|
40
|
+
/** Server token for authentication (appended as query param on WebSocket URL) */
|
|
41
|
+
serverToken?: string;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export class MapCallError extends Error {
|
|
45
|
+
readonly code: number;
|
|
46
|
+
readonly data?: unknown;
|
|
47
|
+
|
|
48
|
+
constructor(code: number, message: string, data?: unknown) {
|
|
49
|
+
super(message);
|
|
50
|
+
this.name = "MapCallError";
|
|
51
|
+
this.code = code;
|
|
52
|
+
this.data = data;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// =============================================================================
|
|
57
|
+
// Implementation
|
|
58
|
+
// =============================================================================
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Make a single MAP extension RPC call via ephemeral WebSocket.
|
|
62
|
+
*
|
|
63
|
+
* 1. Opens WebSocket to the MAP endpoint
|
|
64
|
+
* 2. Sends `map/connect` handshake
|
|
65
|
+
* 3. Sends the RPC request
|
|
66
|
+
* 4. Awaits the response
|
|
67
|
+
* 5. Closes the WebSocket
|
|
68
|
+
*
|
|
69
|
+
* @param serverUrl - HTTP URL of the macro-agent server (e.g., "http://localhost:3001")
|
|
70
|
+
* @param method - MAP extension method (e.g., "_macro/mcp/spawn_agent")
|
|
71
|
+
* @param params - Method parameters (includes context)
|
|
72
|
+
* @param options - Timeout and other options
|
|
73
|
+
* @returns The RPC result
|
|
74
|
+
*/
|
|
75
|
+
export async function mapCall<T = unknown>(
|
|
76
|
+
serverUrl: string,
|
|
77
|
+
method: string,
|
|
78
|
+
params?: unknown,
|
|
79
|
+
options?: MapCallOptions
|
|
80
|
+
): Promise<T> {
|
|
81
|
+
const timeoutMs = options?.timeoutMs ?? 30000;
|
|
82
|
+
let wsUrl = serverUrl.replace(/^http/, "ws") + "/map";
|
|
83
|
+
if (options?.serverToken) {
|
|
84
|
+
wsUrl += `?token=${encodeURIComponent(options.serverToken)}`;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
return new Promise<T>((resolve, reject) => {
|
|
88
|
+
let settled = false;
|
|
89
|
+
let nextId = 1;
|
|
90
|
+
let handshakeCompleted = false;
|
|
91
|
+
|
|
92
|
+
const timeout = setTimeout(() => {
|
|
93
|
+
if (!settled) {
|
|
94
|
+
settled = true;
|
|
95
|
+
ws.close();
|
|
96
|
+
reject(new MapCallError(-32000, `MAP call timed out after ${timeoutMs}ms: ${method}`));
|
|
97
|
+
}
|
|
98
|
+
}, timeoutMs);
|
|
99
|
+
|
|
100
|
+
const ws = new WebSocket(wsUrl);
|
|
101
|
+
|
|
102
|
+
ws.on("open", () => {
|
|
103
|
+
// Step 1: Send MAP handshake
|
|
104
|
+
const connectRequest: JsonRpcRequest = {
|
|
105
|
+
jsonrpc: "2.0",
|
|
106
|
+
id: nextId++,
|
|
107
|
+
method: "map/connect",
|
|
108
|
+
params: {
|
|
109
|
+
participantType: "client",
|
|
110
|
+
identity: `mcp-bridge-${Date.now()}`,
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
ws.send(JSON.stringify(connectRequest));
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
ws.on("message", (data) => {
|
|
117
|
+
if (settled) return;
|
|
118
|
+
|
|
119
|
+
let msg: JsonRpcResponse;
|
|
120
|
+
try {
|
|
121
|
+
msg = JSON.parse(data.toString());
|
|
122
|
+
} catch {
|
|
123
|
+
return; // Ignore non-JSON messages
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if (!handshakeCompleted) {
|
|
127
|
+
// This should be the map/connect response
|
|
128
|
+
if (msg.error) {
|
|
129
|
+
settled = true;
|
|
130
|
+
clearTimeout(timeout);
|
|
131
|
+
ws.close();
|
|
132
|
+
reject(new MapCallError(msg.error.code, `MAP handshake failed: ${msg.error.message}`, msg.error.data));
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
handshakeCompleted = true;
|
|
137
|
+
|
|
138
|
+
// Step 2: Send the actual RPC request
|
|
139
|
+
const rpcRequest: JsonRpcRequest = {
|
|
140
|
+
jsonrpc: "2.0",
|
|
141
|
+
id: nextId++,
|
|
142
|
+
method,
|
|
143
|
+
params,
|
|
144
|
+
};
|
|
145
|
+
ws.send(JSON.stringify(rpcRequest));
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// This is the RPC response
|
|
150
|
+
settled = true;
|
|
151
|
+
clearTimeout(timeout);
|
|
152
|
+
ws.close();
|
|
153
|
+
|
|
154
|
+
if (msg.error) {
|
|
155
|
+
reject(new MapCallError(msg.error.code, msg.error.message, msg.error.data));
|
|
156
|
+
} else {
|
|
157
|
+
resolve(msg.result as T);
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
ws.on("error", (err) => {
|
|
162
|
+
if (!settled) {
|
|
163
|
+
settled = true;
|
|
164
|
+
clearTimeout(timeout);
|
|
165
|
+
reject(new MapCallError(-32000, `MAP WebSocket error: ${err.message}`));
|
|
166
|
+
}
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
ws.on("close", () => {
|
|
170
|
+
if (!settled) {
|
|
171
|
+
settled = true;
|
|
172
|
+
clearTimeout(timeout);
|
|
173
|
+
reject(new MapCallError(-32000, "MAP WebSocket closed unexpectedly"));
|
|
174
|
+
}
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
}
|
package/src/mcp/mcp-server.ts
CHANGED
|
@@ -103,6 +103,8 @@ export interface MCPServices {
|
|
|
103
103
|
integrationStrategy?: import("../workspace/strategies/types.js").IntegrationStrategy;
|
|
104
104
|
/** Optional task backend for pull model tools (claim/unclaim) */
|
|
105
105
|
taskBackend?: import("../task/backend/types.js").TaskBackend;
|
|
106
|
+
/** Optional workspace manager for workspace isolation */
|
|
107
|
+
workspaceManager?: import("../workspace/types.js").WorkspaceManager;
|
|
106
108
|
}
|
|
107
109
|
|
|
108
110
|
// ─────────────────────────────────────────────────────────────────
|
|
@@ -224,16 +226,6 @@ const StopAgentSchema = {
|
|
|
224
226
|
.describe("Reason for stopping"),
|
|
225
227
|
};
|
|
226
228
|
|
|
227
|
-
const CreateTaskSchema = {
|
|
228
|
-
description: z.string().describe("Task description"),
|
|
229
|
-
parent_task: z.string().optional().describe("Parent task ID for subtasks"),
|
|
230
|
-
inputs: z.record(z.string(), z.unknown()).optional().describe("Initial inputs for the task"),
|
|
231
|
-
};
|
|
232
|
-
|
|
233
|
-
const GetTaskSchema = {
|
|
234
|
-
task_id: z.string().describe("Task ID to look up"),
|
|
235
|
-
};
|
|
236
|
-
|
|
237
229
|
// ─────────────────────────────────────────────────────────────────
|
|
238
230
|
// Peer Communication Schemas
|
|
239
231
|
// ─────────────────────────────────────────────────────────────────
|
|
@@ -351,6 +343,12 @@ export function createMCPServer(
|
|
|
351
343
|
debugLog(`[MCP spawn_agent] Agent IDs: ${allAgents.map(a => a.id).join(', ')}`);
|
|
352
344
|
}
|
|
353
345
|
|
|
346
|
+
// Inherit the parent's permission mode so sub-agents respect
|
|
347
|
+
// the same mode (e.g., "interactive") set during initialization.
|
|
348
|
+
// Read from env var since the MCP server is a separate process
|
|
349
|
+
// without access to the macro-agent server's in-memory state.
|
|
350
|
+
const parentPermissionMode = process.env.MACRO_PERMISSION_MODE;
|
|
351
|
+
|
|
354
352
|
const spawned = await agentManager.spawn({
|
|
355
353
|
task: args.task,
|
|
356
354
|
parent: context.agent_id,
|
|
@@ -358,6 +356,7 @@ export function createMCPServer(
|
|
|
358
356
|
topics: args.topics ?? [],
|
|
359
357
|
config: args.config,
|
|
360
358
|
cwd: args.cwd ?? context.cwd,
|
|
359
|
+
permissionMode: (parentPermissionMode || undefined) as import("acp-factory").PermissionMode | undefined,
|
|
361
360
|
});
|
|
362
361
|
|
|
363
362
|
return {
|
|
@@ -366,6 +365,7 @@ export function createMCPServer(
|
|
|
366
365
|
type: "text" as const,
|
|
367
366
|
text: JSON.stringify({
|
|
368
367
|
agent_id: spawned.id,
|
|
368
|
+
name: spawned.agent.name,
|
|
369
369
|
task_id: spawned.agent.task_id,
|
|
370
370
|
session_id: spawned.session_id,
|
|
371
371
|
}),
|
|
@@ -511,14 +511,18 @@ export function createMCPServer(
|
|
|
511
511
|
includeAcknowledged: args.include_acknowledged ?? false,
|
|
512
512
|
});
|
|
513
513
|
|
|
514
|
-
const formattedInternalMessages = internalMessages.map((msg) =>
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
514
|
+
const formattedInternalMessages = internalMessages.map((msg) => {
|
|
515
|
+
const fromAgent = msg.from.agent_id ? agentManager.get(msg.from.agent_id) : undefined;
|
|
516
|
+
return {
|
|
517
|
+
id: msg.id,
|
|
518
|
+
from: `agent:${msg.from.agent_id}`,
|
|
519
|
+
from_name: fromAgent?.name,
|
|
520
|
+
content: msg.content.length > 500 ? msg.content.substring(0, 500) : msg.content,
|
|
521
|
+
timestamp: msg.timestamp,
|
|
522
|
+
truncated: msg.truncated || msg.content.length > 500,
|
|
523
|
+
correlation_id: msg.correlation_id,
|
|
524
|
+
};
|
|
525
|
+
});
|
|
522
526
|
|
|
523
527
|
// Get peer messages if peerManager is available
|
|
524
528
|
let formattedPeerMessages: Array<{
|
|
@@ -586,6 +590,7 @@ export function createMCPServer(
|
|
|
586
590
|
const entries: Array<{
|
|
587
591
|
type: "agent" | "task";
|
|
588
592
|
id: string;
|
|
593
|
+
name?: string;
|
|
589
594
|
summary: string;
|
|
590
595
|
state?: string;
|
|
591
596
|
status?: string;
|
|
@@ -612,6 +617,7 @@ export function createMCPServer(
|
|
|
612
617
|
agents = agents.filter(
|
|
613
618
|
(a) =>
|
|
614
619
|
a.id.toLowerCase().includes(search) ||
|
|
620
|
+
a.name?.toLowerCase().includes(search) ||
|
|
615
621
|
a.task?.toLowerCase().includes(search)
|
|
616
622
|
);
|
|
617
623
|
}
|
|
@@ -620,6 +626,7 @@ export function createMCPServer(
|
|
|
620
626
|
entries.push({
|
|
621
627
|
type: "agent",
|
|
622
628
|
id: agent.id,
|
|
629
|
+
name: agent.name,
|
|
623
630
|
summary: agent.task ?? "No task description",
|
|
624
631
|
state: agent.state,
|
|
625
632
|
});
|
|
@@ -703,6 +710,7 @@ export function createMCPServer(
|
|
|
703
710
|
|
|
704
711
|
return {
|
|
705
712
|
agent_id: node.agent.id,
|
|
713
|
+
name: node.agent.name,
|
|
706
714
|
task: node.agent.task ?? "No task",
|
|
707
715
|
state: node.agent.state,
|
|
708
716
|
children: shouldIncludeChildren
|
|
@@ -772,6 +780,7 @@ export function createMCPServer(
|
|
|
772
780
|
type: "text" as const,
|
|
773
781
|
text: JSON.stringify({
|
|
774
782
|
id: agent.id,
|
|
783
|
+
name: agent.name,
|
|
775
784
|
session_id: agent.session_id,
|
|
776
785
|
task: agent.task ?? "No task",
|
|
777
786
|
state: agent.state,
|
|
@@ -817,7 +826,7 @@ export function createMCPServer(
|
|
|
817
826
|
}
|
|
818
827
|
|
|
819
828
|
// Collect all agents that will be stopped (target + descendants)
|
|
820
|
-
const stoppedAgents: AgentId
|
|
829
|
+
const stoppedAgents: Array<{ agent_id: AgentId; name?: string }> = [];
|
|
821
830
|
|
|
822
831
|
async function stopRecursive(agentId: AgentId): Promise<void> {
|
|
823
832
|
const agent = agentManager.get(agentId);
|
|
@@ -829,9 +838,10 @@ export function createMCPServer(
|
|
|
829
838
|
await stopRecursive(child.id);
|
|
830
839
|
}
|
|
831
840
|
|
|
832
|
-
//
|
|
841
|
+
// Capture name before stopping
|
|
842
|
+
const agentName = agent.name;
|
|
833
843
|
await agentManager.terminate(agentId, args.reason ?? "cancelled");
|
|
834
|
-
stoppedAgents.push(agentId);
|
|
844
|
+
stoppedAgents.push({ agent_id: agentId, name: agentName });
|
|
835
845
|
}
|
|
836
846
|
|
|
837
847
|
await stopRecursive(args.agent_id);
|
|
@@ -850,85 +860,6 @@ export function createMCPServer(
|
|
|
850
860
|
});
|
|
851
861
|
}
|
|
852
862
|
|
|
853
|
-
// ─────────────────────────────────────────────────────────────────
|
|
854
|
-
// Tool: create_task (requires task.create capability)
|
|
855
|
-
// ─────────────────────────────────────────────────────────────────
|
|
856
|
-
|
|
857
|
-
if (shouldRegisterTool("create_task")) {
|
|
858
|
-
server.registerTool("create_task", {
|
|
859
|
-
description: "Create a new task",
|
|
860
|
-
inputSchema: CreateTaskSchema,
|
|
861
|
-
}, async (args) => {
|
|
862
|
-
try {
|
|
863
|
-
const task = taskManager.create({
|
|
864
|
-
description: args.description,
|
|
865
|
-
created_by: context.agent_id,
|
|
866
|
-
parent_task: args.parent_task,
|
|
867
|
-
inputs: args.inputs,
|
|
868
|
-
});
|
|
869
|
-
|
|
870
|
-
return {
|
|
871
|
-
content: [
|
|
872
|
-
{
|
|
873
|
-
type: "text" as const,
|
|
874
|
-
text: JSON.stringify({
|
|
875
|
-
task_id: task.id,
|
|
876
|
-
}),
|
|
877
|
-
},
|
|
878
|
-
],
|
|
879
|
-
};
|
|
880
|
-
} catch (error) {
|
|
881
|
-
throw new MCPToolError(
|
|
882
|
-
`Failed to create task: ${error}`,
|
|
883
|
-
"INVALID_INPUT"
|
|
884
|
-
);
|
|
885
|
-
}
|
|
886
|
-
});
|
|
887
|
-
}
|
|
888
|
-
|
|
889
|
-
// ─────────────────────────────────────────────────────────────────
|
|
890
|
-
// Tool: get_task (always allowed - observability)
|
|
891
|
-
// ─────────────────────────────────────────────────────────────────
|
|
892
|
-
|
|
893
|
-
if (shouldRegisterTool("get_task")) {
|
|
894
|
-
server.registerTool("get_task", {
|
|
895
|
-
description: "Get details of a specific task",
|
|
896
|
-
inputSchema: GetTaskSchema,
|
|
897
|
-
}, async (args) => {
|
|
898
|
-
const task = taskManager.get(args.task_id);
|
|
899
|
-
if (!task) {
|
|
900
|
-
throw new MCPToolError(
|
|
901
|
-
`Task not found: ${args.task_id}`,
|
|
902
|
-
"TASK_NOT_FOUND"
|
|
903
|
-
);
|
|
904
|
-
}
|
|
905
|
-
|
|
906
|
-
// Use completed_at, started_at, or created_at as last update
|
|
907
|
-
const updatedAt = task.completed_at ?? task.started_at ?? task.created_at;
|
|
908
|
-
|
|
909
|
-
return {
|
|
910
|
-
content: [
|
|
911
|
-
{
|
|
912
|
-
type: "text" as const,
|
|
913
|
-
text: JSON.stringify({
|
|
914
|
-
id: task.id,
|
|
915
|
-
description: task.description,
|
|
916
|
-
status: task.status,
|
|
917
|
-
assigned_agent: task.assigned_agent,
|
|
918
|
-
parent_task: task.parent_task,
|
|
919
|
-
subtasks: task.subtasks ?? [],
|
|
920
|
-
inputs: task.inputs,
|
|
921
|
-
outputs: task.outputs,
|
|
922
|
-
artifacts: task.artifacts,
|
|
923
|
-
created_at: task.created_at,
|
|
924
|
-
updated_at: updatedAt,
|
|
925
|
-
}),
|
|
926
|
-
},
|
|
927
|
-
],
|
|
928
|
-
};
|
|
929
|
-
});
|
|
930
|
-
}
|
|
931
|
-
|
|
932
863
|
// ─────────────────────────────────────────────────────────────────
|
|
933
864
|
// Tool: send_peer_message (requires msg.send capability)
|
|
934
865
|
// ─────────────────────────────────────────────────────────────────
|
|
@@ -1117,6 +1048,7 @@ export function createMCPServer(
|
|
|
1117
1048
|
roleRegistry,
|
|
1118
1049
|
integrationStrategy: services.integrationStrategy,
|
|
1119
1050
|
taskMode: services.taskMode,
|
|
1051
|
+
workspaceManager: services.workspaceManager,
|
|
1120
1052
|
});
|
|
1121
1053
|
|
|
1122
1054
|
try {
|
|
@@ -1127,6 +1059,14 @@ export function createMCPServer(
|
|
|
1127
1059
|
task_id?: string;
|
|
1128
1060
|
});
|
|
1129
1061
|
|
|
1062
|
+
// Persist events emitted by the done handler (MERGE_REQUEST, WORKER_DONE, etc.)
|
|
1063
|
+
// so the main process polling can see them via EventStore reload.
|
|
1064
|
+
try {
|
|
1065
|
+
await eventStore.persist();
|
|
1066
|
+
} catch {
|
|
1067
|
+
// Best-effort — events may still be picked up on next reload
|
|
1068
|
+
}
|
|
1069
|
+
|
|
1130
1070
|
// If shouldTerminate is true, schedule termination after this tool returns
|
|
1131
1071
|
// The agent will be terminated after the tool execution completes
|
|
1132
1072
|
if (result.shouldTerminate) {
|
|
@@ -1162,7 +1102,7 @@ export function createMCPServer(
|
|
|
1162
1102
|
// Tools: claim_task, unclaim_task, list_claimable_tasks (pull model)
|
|
1163
1103
|
// ─────────────────────────────────────────────────────────────────
|
|
1164
1104
|
|
|
1165
|
-
if (services.taskBackend && shouldRegisterTool("claim_task")) {
|
|
1105
|
+
if (services.taskBackend && services.taskMode === "pull" && shouldRegisterTool("claim_task")) {
|
|
1166
1106
|
server.registerTool(CLAIM_TASK_TOOL_INFO.name, {
|
|
1167
1107
|
description: CLAIM_TASK_TOOL_INFO.description,
|
|
1168
1108
|
inputSchema: ClaimTaskSchema,
|
|
@@ -1175,7 +1115,7 @@ export function createMCPServer(
|
|
|
1175
1115
|
});
|
|
1176
1116
|
}
|
|
1177
1117
|
|
|
1178
|
-
if (services.taskBackend && shouldRegisterTool("unclaim_task")) {
|
|
1118
|
+
if (services.taskBackend && services.taskMode === "pull" && shouldRegisterTool("unclaim_task")) {
|
|
1179
1119
|
server.registerTool(UNCLAIM_TASK_TOOL_INFO.name, {
|
|
1180
1120
|
description: UNCLAIM_TASK_TOOL_INFO.description,
|
|
1181
1121
|
inputSchema: UnclaimTaskSchema,
|
|
@@ -1188,7 +1128,7 @@ export function createMCPServer(
|
|
|
1188
1128
|
});
|
|
1189
1129
|
}
|
|
1190
1130
|
|
|
1191
|
-
if (services.taskBackend && shouldRegisterTool("list_claimable_tasks")) {
|
|
1131
|
+
if (services.taskBackend && services.taskMode === "pull" && shouldRegisterTool("list_claimable_tasks")) {
|
|
1192
1132
|
server.registerTool(LIST_CLAIMABLE_TASKS_TOOL_INFO.name, {
|
|
1193
1133
|
description: LIST_CLAIMABLE_TASKS_TOOL_INFO.description,
|
|
1194
1134
|
inputSchema: ListClaimableTasksSchema,
|
|
@@ -1302,3 +1242,165 @@ export function createMCPServer(
|
|
|
1302
1242
|
close,
|
|
1303
1243
|
};
|
|
1304
1244
|
}
|
|
1245
|
+
|
|
1246
|
+
// ─────────────────────────────────────────────────────────────────
|
|
1247
|
+
// Thin-Client Factory (MAP WebSocket mode)
|
|
1248
|
+
// ─────────────────────────────────────────────────────────────────
|
|
1249
|
+
|
|
1250
|
+
/**
|
|
1251
|
+
* Type for the mapCall function used in thin-client mode.
|
|
1252
|
+
*/
|
|
1253
|
+
export type MapCallFn = <T = unknown>(
|
|
1254
|
+
method: string,
|
|
1255
|
+
params?: unknown,
|
|
1256
|
+
options?: { timeoutMs?: number }
|
|
1257
|
+
) => Promise<T>;
|
|
1258
|
+
|
|
1259
|
+
/**
|
|
1260
|
+
* Creates a thin-client MCP server where every tool handler calls
|
|
1261
|
+
* the main server via MAP WebSocket RPC instead of using local services.
|
|
1262
|
+
*
|
|
1263
|
+
* Tool schemas, descriptions, and role filtering remain the same.
|
|
1264
|
+
* Only the handler bodies change — they forward to `_macro/mcp/*` extensions.
|
|
1265
|
+
*/
|
|
1266
|
+
export function createMCPServerThinClient(
|
|
1267
|
+
context: ToolContext,
|
|
1268
|
+
mapCallFn: MapCallFn,
|
|
1269
|
+
config: MCPServerConfig = {}
|
|
1270
|
+
): MCPServerInstance {
|
|
1271
|
+
const { name = "macro-agent-mcp", version = "1.0.0" } = config;
|
|
1272
|
+
|
|
1273
|
+
const server = new McpServer(
|
|
1274
|
+
{ name, version },
|
|
1275
|
+
{ capabilities: { tools: {} } }
|
|
1276
|
+
);
|
|
1277
|
+
|
|
1278
|
+
/**
|
|
1279
|
+
* Helper: wrap args with agent context for the bridge handler.
|
|
1280
|
+
*/
|
|
1281
|
+
function withContext(args: Record<string, unknown>): Record<string, unknown> {
|
|
1282
|
+
return { ...args, context };
|
|
1283
|
+
}
|
|
1284
|
+
|
|
1285
|
+
/**
|
|
1286
|
+
* Helper: create a tool handler that forwards to a MAP bridge extension.
|
|
1287
|
+
*/
|
|
1288
|
+
function bridgeTool(
|
|
1289
|
+
toolName: string,
|
|
1290
|
+
schema: Record<string, z.ZodTypeAny>,
|
|
1291
|
+
description: string,
|
|
1292
|
+
mapMethod: string,
|
|
1293
|
+
options?: { timeoutMs?: number }
|
|
1294
|
+
) {
|
|
1295
|
+
server.registerTool(toolName, { description, inputSchema: schema }, async (args) => {
|
|
1296
|
+
try {
|
|
1297
|
+
const result = await mapCallFn(mapMethod, withContext(args as Record<string, unknown>), options);
|
|
1298
|
+
return {
|
|
1299
|
+
content: [{ type: "text" as const, text: JSON.stringify(result) }],
|
|
1300
|
+
};
|
|
1301
|
+
} catch (error) {
|
|
1302
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
1303
|
+
throw new MCPToolError(`${toolName} failed: ${message}`, "ROUTING_FAILED");
|
|
1304
|
+
}
|
|
1305
|
+
});
|
|
1306
|
+
}
|
|
1307
|
+
|
|
1308
|
+
// Register all tools pointing to their _macro/mcp/* bridge counterparts
|
|
1309
|
+
|
|
1310
|
+
bridgeTool("spawn_agent", SpawnAgentSchema, "Spawn a child agent to work on a subtask",
|
|
1311
|
+
"_macro/mcp/spawn_agent");
|
|
1312
|
+
|
|
1313
|
+
bridgeTool("emit_status", EmitStatusSchema, "Report a status milestone (started, checkpoint, completed, failed, blocked)",
|
|
1314
|
+
"_macro/mcp/emit_status");
|
|
1315
|
+
|
|
1316
|
+
bridgeTool("send_message", SendMessageSchema, "Send a message to another agent, task, or topic",
|
|
1317
|
+
"_macro/mcp/send_message");
|
|
1318
|
+
|
|
1319
|
+
bridgeTool("check_messages", CheckMessagesSchema, "Check pending messages in your inbox",
|
|
1320
|
+
"_macro/mcp/check_messages");
|
|
1321
|
+
|
|
1322
|
+
bridgeTool("query_index", QueryIndexSchema, "Search for agents and tasks",
|
|
1323
|
+
"_macro/mcp/query_index");
|
|
1324
|
+
|
|
1325
|
+
bridgeTool("get_hierarchy", GetHierarchySchema, "View the agent hierarchy tree",
|
|
1326
|
+
"_macro/mcp/get_hierarchy");
|
|
1327
|
+
|
|
1328
|
+
bridgeTool("get_agent_summary", GetAgentSummarySchema, "Get detailed summary of a specific agent",
|
|
1329
|
+
"_macro/mcp/get_agent_summary");
|
|
1330
|
+
|
|
1331
|
+
bridgeTool("stop_agent", StopAgentSchema, "Stop a child agent in your subtree",
|
|
1332
|
+
"_macro/mcp/stop_agent");
|
|
1333
|
+
|
|
1334
|
+
bridgeTool("done", DoneSchema, DONE_TOOL_INFO.description,
|
|
1335
|
+
"_macro/mcp/done");
|
|
1336
|
+
|
|
1337
|
+
bridgeTool("inject_context", InjectContextSchema, INJECT_CONTEXT_TOOL_INFO.description,
|
|
1338
|
+
"_macro/mcp/inject_context");
|
|
1339
|
+
|
|
1340
|
+
bridgeTool("wait_for_activity", WaitForActivitySchema, WAIT_FOR_ACTIVITY_TOOL_INFO.description,
|
|
1341
|
+
"_macro/mcp/wait_for_activity", { timeoutMs: 65000 }); // Extra buffer for long-poll
|
|
1342
|
+
|
|
1343
|
+
bridgeTool("claim_task", ClaimTaskSchema, CLAIM_TASK_TOOL_INFO.description,
|
|
1344
|
+
"_macro/mcp/claim_task");
|
|
1345
|
+
|
|
1346
|
+
bridgeTool("unclaim_task", UnclaimTaskSchema, UNCLAIM_TASK_TOOL_INFO.description,
|
|
1347
|
+
"_macro/mcp/unclaim_task");
|
|
1348
|
+
|
|
1349
|
+
bridgeTool("list_claimable_tasks", ListClaimableTasksSchema, LIST_CLAIMABLE_TASKS_TOOL_INFO.description,
|
|
1350
|
+
"_macro/mcp/list_claimable_tasks");
|
|
1351
|
+
|
|
1352
|
+
bridgeTool("send_peer_message", SendPeerMessageSchema, "Send a fire-and-forget message to another macro-agent (peer)",
|
|
1353
|
+
"_macro/mcp/send_peer_message");
|
|
1354
|
+
|
|
1355
|
+
bridgeTool("send_peer_request", SendPeerRequestSchema, "Send a request to another macro-agent (peer) and wait for response",
|
|
1356
|
+
"_macro/mcp/send_peer_request");
|
|
1357
|
+
|
|
1358
|
+
bridgeTool("respond_to_peer_request", RespondToPeerRequestSchema, "Respond to an incoming peer request",
|
|
1359
|
+
"_macro/mcp/respond_to_peer_request");
|
|
1360
|
+
|
|
1361
|
+
// ─────────────────────────────────────────────────────────────────
|
|
1362
|
+
// Server Lifecycle
|
|
1363
|
+
// ─────────────────────────────────────────────────────────────────
|
|
1364
|
+
|
|
1365
|
+
let transport: StdioServerTransport | null = null;
|
|
1366
|
+
|
|
1367
|
+
async function start(): Promise<void> {
|
|
1368
|
+
// Discover dynamic task tools from the server before connecting.
|
|
1369
|
+
// This ensures we only register tools the server actually supports
|
|
1370
|
+
// (e.g. memory backend = 4 tools, OpenTasks = 7 tools, none = 0).
|
|
1371
|
+
try {
|
|
1372
|
+
const result = await mapCallFn<{ tools: Array<{ name: string; description: string }> }>(
|
|
1373
|
+
"_macro/mcp/task_tools_list",
|
|
1374
|
+
withContext({})
|
|
1375
|
+
);
|
|
1376
|
+
|
|
1377
|
+
if (result?.tools?.length > 0) {
|
|
1378
|
+
const DynamicTaskParamsSchema = {
|
|
1379
|
+
params: z.record(z.string(), z.unknown()).optional()
|
|
1380
|
+
.describe("Tool parameters (validated by the server-side handler)"),
|
|
1381
|
+
};
|
|
1382
|
+
|
|
1383
|
+
for (const tool of result.tools) {
|
|
1384
|
+
bridgeTool(tool.name, DynamicTaskParamsSchema, tool.description,
|
|
1385
|
+
`_macro/mcp/task_tool/${tool.name}`);
|
|
1386
|
+
}
|
|
1387
|
+
debugLog(`[MCP] Registered ${result.tools.length} dynamic task tools from server`);
|
|
1388
|
+
}
|
|
1389
|
+
} catch (error) {
|
|
1390
|
+
// Server may not support task tools — continue without them
|
|
1391
|
+
debugLog(`[MCP] Failed to discover task tools: ${error instanceof Error ? error.message : error}`);
|
|
1392
|
+
}
|
|
1393
|
+
|
|
1394
|
+
transport = new StdioServerTransport();
|
|
1395
|
+
await server.connect(transport);
|
|
1396
|
+
}
|
|
1397
|
+
|
|
1398
|
+
async function close(): Promise<void> {
|
|
1399
|
+
if (transport) {
|
|
1400
|
+
await server.close();
|
|
1401
|
+
transport = null;
|
|
1402
|
+
}
|
|
1403
|
+
}
|
|
1404
|
+
|
|
1405
|
+
return { server, start, close };
|
|
1406
|
+
}
|
package/src/mcp/tools/done.ts
CHANGED
|
@@ -147,6 +147,13 @@ export function buildLifecycleContext(
|
|
|
147
147
|
streamId = workspace?.streamId;
|
|
148
148
|
}
|
|
149
149
|
|
|
150
|
+
// Fallback: read streamId from env var (set by buildMacroAgentMcp during spawn).
|
|
151
|
+
// WorkspaceManager is not available in MCP subprocesses, but the streamId is
|
|
152
|
+
// needed for MERGE_REQUEST signal details so the team runtime can submit to the merge queue.
|
|
153
|
+
if (!streamId && process.env.MACRO_STREAM_ID) {
|
|
154
|
+
streamId = process.env.MACRO_STREAM_ID;
|
|
155
|
+
}
|
|
156
|
+
|
|
150
157
|
return {
|
|
151
158
|
agentId: toolContext.agent_id,
|
|
152
159
|
role,
|
|
@@ -206,6 +213,18 @@ export function createDoneHandler(context: ToolContext, deps: DoneToolDeps) {
|
|
|
206
213
|
workspaceManager
|
|
207
214
|
);
|
|
208
215
|
|
|
216
|
+
// Resolve capabilities for capability-based handler dispatch (team roles)
|
|
217
|
+
if (roleRegistry) {
|
|
218
|
+
try {
|
|
219
|
+
const resolvedRole = roleRegistry.resolveRole(role);
|
|
220
|
+
if (resolvedRole?.capabilities) {
|
|
221
|
+
lifecycleContext.capabilities = [...resolvedRole.capabilities];
|
|
222
|
+
}
|
|
223
|
+
} catch {
|
|
224
|
+
// Role not in registry — capabilities stay undefined
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
|
|
209
228
|
const cleanupStatus = detectCleanupStatus(lifecycleContext, {
|
|
210
229
|
messageRouter,
|
|
211
230
|
});
|
package/src/mcp/types.ts
CHANGED
|
@@ -196,6 +196,7 @@ export interface GetTaskInput {
|
|
|
196
196
|
*/
|
|
197
197
|
export interface SpawnAgentOutput {
|
|
198
198
|
agent_id: AgentId;
|
|
199
|
+
name?: string;
|
|
199
200
|
task_id: TaskId;
|
|
200
201
|
session_id: string;
|
|
201
202
|
}
|
|
@@ -223,6 +224,7 @@ export interface CheckMessagesOutput {
|
|
|
223
224
|
messages: Array<{
|
|
224
225
|
id: string;
|
|
225
226
|
from: AgentId;
|
|
227
|
+
from_name?: string;
|
|
226
228
|
content: string;
|
|
227
229
|
timestamp: number;
|
|
228
230
|
truncated: boolean;
|
|
@@ -239,6 +241,7 @@ export interface QueryIndexOutput {
|
|
|
239
241
|
entries: Array<{
|
|
240
242
|
type: "agent" | "task";
|
|
241
243
|
id: string;
|
|
244
|
+
name?: string;
|
|
242
245
|
summary: string;
|
|
243
246
|
state?: string;
|
|
244
247
|
status?: string;
|
|
@@ -258,6 +261,7 @@ export interface GetHierarchyOutput {
|
|
|
258
261
|
|
|
259
262
|
export interface HierarchyNode {
|
|
260
263
|
agent_id: AgentId;
|
|
264
|
+
name?: string;
|
|
261
265
|
task: string;
|
|
262
266
|
state: string;
|
|
263
267
|
children: HierarchyNode[];
|
|
@@ -268,6 +272,7 @@ export interface HierarchyNode {
|
|
|
268
272
|
*/
|
|
269
273
|
export interface GetAgentSummaryOutput {
|
|
270
274
|
id: AgentId;
|
|
275
|
+
name?: string;
|
|
271
276
|
session_id: string;
|
|
272
277
|
task: string;
|
|
273
278
|
state: string;
|
|
@@ -286,7 +291,7 @@ export interface GetAgentSummaryOutput {
|
|
|
286
291
|
*/
|
|
287
292
|
export interface StopAgentOutput {
|
|
288
293
|
success: boolean;
|
|
289
|
-
stopped_agents: AgentId
|
|
294
|
+
stopped_agents: Array<{ agent_id: AgentId; name?: string }>;
|
|
290
295
|
}
|
|
291
296
|
|
|
292
297
|
/**
|