macro-agent 0.0.11 → 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 +6 -0
- package/.sudocode/specs.jsonl +7 -0
- package/CLAUDE.md +110 -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 +25 -1
- package/dist/agent/agent-manager.d.ts.map +1 -1
- package/dist/agent/agent-manager.js +93 -7
- 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-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.map +1 -1
- package/dist/api/server.js +95 -0
- package/dist/api/server.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/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 +1 -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/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 +11 -2
- package/dist/mcp/tools/done.d.ts.map +1 -1
- package/dist/mcp/tools/done.js +15 -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/message-router.d.ts +41 -0
- package/dist/router/message-router.d.ts.map +1 -1
- package/dist/router/message-router.js +136 -5
- package/dist/router/message-router.js.map +1 -1
- package/dist/store/event-store.d.ts +8 -1
- package/dist/store/event-store.d.ts.map +1 -1
- package/dist/store/event-store.js +120 -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/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 +1 -0
- package/dist/store/types/index.d.ts.map +1 -1
- package/dist/store/types/index.js +1 -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/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/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 +4 -2
- 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 +158 -6
- package/src/agent/types.ts +27 -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/server.ts +110 -0
- 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/map/adapter/__tests__/extensions.test.ts +359 -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 +1 -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/mcp/mcp-server.ts +67 -0
- package/src/mcp/tools/claim_task.ts +86 -0
- package/src/mcp/tools/done.ts +24 -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/__tests__/message-router.test.ts +561 -0
- package/src/router/message-router.ts +223 -6
- package/src/store/event-store.ts +151 -3
- package/src/store/types/agents.ts +1 -1
- package/src/store/types/events.ts +2 -1
- package/src/store/types/index.ts +1 -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/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/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 -111
- package/references/multi-agent-protocol/.sudocode/specs.jsonl +0 -13
- 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 -496
- 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/docs/09-authentication.md +0 -680
- package/references/multi-agent-protocol/docs/10-mail-protocol.md +0 -553
- package/references/multi-agent-protocol/docs/agent-iam-integration.md +0 -877
- package/references/multi-agent-protocol/docs/agentic-mesh-integration-draft.md +0 -459
- package/references/multi-agent-protocol/docs/git-transport-draft.md +0 -251
- package/references/multi-agent-protocol/docs-site/Gemfile +0 -22
- package/references/multi-agent-protocol/docs-site/README.md +0 -82
- package/references/multi-agent-protocol/docs-site/_config.yml +0 -91
- package/references/multi-agent-protocol/docs-site/_includes/head_custom.html +0 -20
- package/references/multi-agent-protocol/docs-site/_sass/color_schemes/map.scss +0 -42
- package/references/multi-agent-protocol/docs-site/_sass/custom/custom.scss +0 -34
- package/references/multi-agent-protocol/docs-site/examples/full-integration.md +0 -510
- package/references/multi-agent-protocol/docs-site/examples/index.md +0 -138
- package/references/multi-agent-protocol/docs-site/examples/simple-chat.md +0 -282
- package/references/multi-agent-protocol/docs-site/examples/task-queue.md +0 -399
- package/references/multi-agent-protocol/docs-site/getting-started/index.md +0 -98
- package/references/multi-agent-protocol/docs-site/getting-started/installation.md +0 -219
- package/references/multi-agent-protocol/docs-site/getting-started/overview.md +0 -172
- package/references/multi-agent-protocol/docs-site/getting-started/quickstart.md +0 -237
- package/references/multi-agent-protocol/docs-site/index.md +0 -136
- package/references/multi-agent-protocol/docs-site/protocol/authentication.md +0 -391
- package/references/multi-agent-protocol/docs-site/protocol/connection-model.md +0 -376
- package/references/multi-agent-protocol/docs-site/protocol/design.md +0 -284
- package/references/multi-agent-protocol/docs-site/protocol/error-handling.md +0 -312
- package/references/multi-agent-protocol/docs-site/protocol/federation.md +0 -449
- package/references/multi-agent-protocol/docs-site/protocol/index.md +0 -129
- package/references/multi-agent-protocol/docs-site/protocol/permissions.md +0 -398
- package/references/multi-agent-protocol/docs-site/protocol/streaming.md +0 -353
- package/references/multi-agent-protocol/docs-site/protocol/wire-protocol.md +0 -369
- package/references/multi-agent-protocol/docs-site/sdk/api/agent.md +0 -357
- package/references/multi-agent-protocol/docs-site/sdk/api/client.md +0 -380
- package/references/multi-agent-protocol/docs-site/sdk/api/index.md +0 -62
- package/references/multi-agent-protocol/docs-site/sdk/api/server.md +0 -453
- package/references/multi-agent-protocol/docs-site/sdk/api/types.md +0 -468
- package/references/multi-agent-protocol/docs-site/sdk/guides/agent.md +0 -375
- package/references/multi-agent-protocol/docs-site/sdk/guides/authentication.md +0 -405
- package/references/multi-agent-protocol/docs-site/sdk/guides/client.md +0 -352
- package/references/multi-agent-protocol/docs-site/sdk/guides/index.md +0 -89
- package/references/multi-agent-protocol/docs-site/sdk/guides/server.md +0 -360
- package/references/multi-agent-protocol/docs-site/sdk/guides/testing.md +0 -446
- package/references/multi-agent-protocol/docs-site/sdk/guides/transports.md +0 -363
- package/references/multi-agent-protocol/docs-site/sdk/index.md +0 -206
- package/references/multi-agent-protocol/package-lock.json +0 -3886
- package/references/multi-agent-protocol/package.json +0 -56
- package/references/multi-agent-protocol/schema/meta.json +0 -467
- package/references/multi-agent-protocol/schema/schema.json +0 -2558
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project Configuration Loader
|
|
3
|
+
*
|
|
4
|
+
* Reads .macro-agent/config.json for project-level settings.
|
|
5
|
+
*
|
|
6
|
+
* @module config/project-config
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import * as fs from "fs";
|
|
10
|
+
import * as path from "path";
|
|
11
|
+
|
|
12
|
+
// =============================================================================
|
|
13
|
+
// Types
|
|
14
|
+
// =============================================================================
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Project-level configuration schema.
|
|
18
|
+
*
|
|
19
|
+
* Loaded from .macro-agent/config.json in the project root.
|
|
20
|
+
*/
|
|
21
|
+
export interface ProjectConfig {
|
|
22
|
+
/** Team template name to load on startup */
|
|
23
|
+
team?: string;
|
|
24
|
+
|
|
25
|
+
/** Additional project-level settings (extensible) */
|
|
26
|
+
[key: string]: unknown;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// =============================================================================
|
|
30
|
+
// Constants
|
|
31
|
+
// =============================================================================
|
|
32
|
+
|
|
33
|
+
/** Config directory name */
|
|
34
|
+
export const CONFIG_DIR = ".macro-agent";
|
|
35
|
+
|
|
36
|
+
/** Config file name */
|
|
37
|
+
export const CONFIG_FILE = "config.json";
|
|
38
|
+
|
|
39
|
+
// =============================================================================
|
|
40
|
+
// Loader
|
|
41
|
+
// =============================================================================
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Get the project config file path.
|
|
45
|
+
*
|
|
46
|
+
* @param projectPath - Project root directory (default: process.cwd())
|
|
47
|
+
* @returns Absolute path to .macro-agent/config.json
|
|
48
|
+
*/
|
|
49
|
+
export function getProjectConfigPath(projectPath?: string): string {
|
|
50
|
+
const root = projectPath ?? process.cwd();
|
|
51
|
+
return path.join(root, CONFIG_DIR, CONFIG_FILE);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Load project configuration from .macro-agent/config.json.
|
|
56
|
+
*
|
|
57
|
+
* Returns empty config if the file doesn't exist.
|
|
58
|
+
* Throws on invalid JSON.
|
|
59
|
+
*
|
|
60
|
+
* @param projectPath - Project root directory (default: process.cwd())
|
|
61
|
+
* @returns Parsed ProjectConfig
|
|
62
|
+
*/
|
|
63
|
+
export function loadProjectConfig(projectPath?: string): ProjectConfig {
|
|
64
|
+
const configPath = getProjectConfigPath(projectPath);
|
|
65
|
+
|
|
66
|
+
if (!fs.existsSync(configPath)) {
|
|
67
|
+
return {};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
const raw = fs.readFileSync(configPath, "utf-8");
|
|
71
|
+
|
|
72
|
+
try {
|
|
73
|
+
const parsed = JSON.parse(raw);
|
|
74
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
|
|
75
|
+
throw new ProjectConfigError(
|
|
76
|
+
`Config must be a JSON object, got ${Array.isArray(parsed) ? "array" : typeof parsed}`,
|
|
77
|
+
"INVALID_FORMAT",
|
|
78
|
+
configPath
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
return parsed as ProjectConfig;
|
|
82
|
+
} catch (error) {
|
|
83
|
+
if (error instanceof ProjectConfigError) throw error;
|
|
84
|
+
throw new ProjectConfigError(
|
|
85
|
+
`Failed to parse ${configPath}: ${error instanceof Error ? error.message : String(error)}`,
|
|
86
|
+
"PARSE_ERROR",
|
|
87
|
+
configPath
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// =============================================================================
|
|
93
|
+
// Errors
|
|
94
|
+
// =============================================================================
|
|
95
|
+
|
|
96
|
+
export type ProjectConfigErrorCode = "PARSE_ERROR" | "INVALID_FORMAT";
|
|
97
|
+
|
|
98
|
+
export class ProjectConfigError extends Error {
|
|
99
|
+
constructor(
|
|
100
|
+
message: string,
|
|
101
|
+
public readonly code: ProjectConfigErrorCode,
|
|
102
|
+
public readonly configPath: string
|
|
103
|
+
) {
|
|
104
|
+
super(message);
|
|
105
|
+
this.name = "ProjectConfigError";
|
|
106
|
+
}
|
|
107
|
+
}
|
package/src/lifecycle/cascade.ts
CHANGED
|
@@ -30,7 +30,7 @@ import { attemptMerge, abortMerge, getCurrentBranch } from "./cleanup.js";
|
|
|
30
30
|
*/
|
|
31
31
|
export interface CascadeAgent {
|
|
32
32
|
id: AgentId;
|
|
33
|
-
state: "running" | "spawning" | "stopped";
|
|
33
|
+
state: "running" | "spawning" | "stopped" | "failed";
|
|
34
34
|
parent?: AgentId | null;
|
|
35
35
|
}
|
|
36
36
|
|
|
@@ -55,6 +55,12 @@ export interface AllHandlerDeps {
|
|
|
55
55
|
|
|
56
56
|
/** Optional workspace path resolver for integrators */
|
|
57
57
|
getWorkspacePath?: (agentId: string) => string | undefined;
|
|
58
|
+
|
|
59
|
+
/** Optional integration strategy (from team config) */
|
|
60
|
+
integrationStrategy?: import("../../workspace/strategies/types.js").IntegrationStrategy;
|
|
61
|
+
|
|
62
|
+
/** Optional task mode from team config */
|
|
63
|
+
taskMode?: "push" | "pull";
|
|
58
64
|
}
|
|
59
65
|
|
|
60
66
|
// =============================================================================
|
|
@@ -75,6 +81,8 @@ export function createHandlerRegistry(
|
|
|
75
81
|
agentManager: deps.agentManager,
|
|
76
82
|
mergeQueue: deps.mergeQueue,
|
|
77
83
|
getWorkspacePath: deps.getWorkspacePath,
|
|
84
|
+
integrationStrategy: deps.integrationStrategy,
|
|
85
|
+
taskMode: deps.taskMode,
|
|
78
86
|
};
|
|
79
87
|
registry.set("worker", (context, args, cleanupStatus) =>
|
|
80
88
|
handleWorkerDone(context, args, cleanupStatus, workerDeps)
|
|
@@ -60,6 +60,12 @@ export interface WorkerHandlerDeps {
|
|
|
60
60
|
|
|
61
61
|
/** Get workspace path for an agent (for resolver → integrator inline merge) */
|
|
62
62
|
getWorkspacePath?: (agentId: string) => string | undefined;
|
|
63
|
+
|
|
64
|
+
/** Optional integration strategy (from team config) */
|
|
65
|
+
integrationStrategy?: import("../../workspace/strategies/types.js").IntegrationStrategy;
|
|
66
|
+
|
|
67
|
+
/** Optional task mode from team config */
|
|
68
|
+
taskMode?: "push" | "pull";
|
|
63
69
|
}
|
|
64
70
|
|
|
65
71
|
// =============================================================================
|
|
@@ -326,9 +332,42 @@ export async function handleWorkerDone(
|
|
|
326
332
|
`Failed to emit RESOLVER_DONE: ${error instanceof Error ? error.message : "unknown"}`,
|
|
327
333
|
);
|
|
328
334
|
}
|
|
335
|
+
} else if (deps.integrationStrategy) {
|
|
336
|
+
// ───────────────────────────────────────────────────────────────────────
|
|
337
|
+
// Strategy-based integration (team config)
|
|
338
|
+
// ───────────────────────────────────────────────────────────────────────
|
|
339
|
+
try {
|
|
340
|
+
const landResult = await deps.integrationStrategy.land({
|
|
341
|
+
sourceBranch,
|
|
342
|
+
targetBranch,
|
|
343
|
+
workspacePath: context.workspacePath!,
|
|
344
|
+
agentId: context.agentId,
|
|
345
|
+
taskId: context.taskId,
|
|
346
|
+
streamId: context.streamId,
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
if (landResult.status === "landed") {
|
|
350
|
+
cleanupActions.push(
|
|
351
|
+
`Strategy '${deps.integrationStrategy.name}' landed ${sourceBranch} → ${targetBranch}${landResult.commitHash ? ` (${landResult.commitHash.slice(0, 8)})` : ""}${landResult.mergeRequestId ? ` (MR: ${landResult.mergeRequestId})` : ""}`,
|
|
352
|
+
);
|
|
353
|
+
signalsEmitted.push("WORKER_INTEGRATED");
|
|
354
|
+
} else if (landResult.status === "conflict") {
|
|
355
|
+
warnings.push(
|
|
356
|
+
`Strategy '${deps.integrationStrategy.name}' conflict: ${landResult.error ?? "unknown conflict"}`,
|
|
357
|
+
);
|
|
358
|
+
} else {
|
|
359
|
+
warnings.push(
|
|
360
|
+
`Strategy '${deps.integrationStrategy.name}' failed: ${landResult.error ?? "unknown error"}`,
|
|
361
|
+
);
|
|
362
|
+
}
|
|
363
|
+
} catch (strategyError) {
|
|
364
|
+
warnings.push(
|
|
365
|
+
`Integration strategy error: ${strategyError instanceof Error ? strategyError.message : "unknown"}`,
|
|
366
|
+
);
|
|
367
|
+
}
|
|
329
368
|
} else {
|
|
330
369
|
// ───────────────────────────────────────────────────────────────────────
|
|
331
|
-
// Regular workers emit MERGE_REQUEST and submit to queue
|
|
370
|
+
// Regular workers emit MERGE_REQUEST and submit to queue (fallback)
|
|
332
371
|
// ───────────────────────────────────────────────────────────────────────
|
|
333
372
|
try {
|
|
334
373
|
// Emit the signal for notification
|
|
@@ -449,11 +488,17 @@ export async function handleWorkerDone(
|
|
|
449
488
|
}
|
|
450
489
|
|
|
451
490
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
452
|
-
// Return result
|
|
491
|
+
// Return result
|
|
453
492
|
// ─────────────────────────────────────────────────────────────────────────────
|
|
454
493
|
|
|
494
|
+
// In pull mode, completed workers stay alive to claim more tasks
|
|
495
|
+
const shouldTerminate =
|
|
496
|
+
deps.taskMode === "pull" && args.status === "completed"
|
|
497
|
+
? false
|
|
498
|
+
: true;
|
|
499
|
+
|
|
455
500
|
return {
|
|
456
|
-
shouldTerminate
|
|
501
|
+
shouldTerminate,
|
|
457
502
|
signalsEmitted,
|
|
458
503
|
cleanupActions,
|
|
459
504
|
warnings: warnings.length > 0 ? warnings : undefined,
|
|
@@ -10,12 +10,18 @@ import {
|
|
|
10
10
|
unregisterWakeExtension,
|
|
11
11
|
registerWorkspaceExtension,
|
|
12
12
|
unregisterWorkspaceExtension,
|
|
13
|
+
registerResumeExtension,
|
|
14
|
+
unregisterResumeExtension,
|
|
15
|
+
registerAgentDetectionExtensions,
|
|
16
|
+
unregisterAgentDetectionExtensions,
|
|
13
17
|
registerMacroExtensions,
|
|
14
18
|
MACRO_EXTENSION_METHODS,
|
|
15
19
|
EXTENSION_CAPABILITIES,
|
|
16
20
|
type TaskExtensionServices,
|
|
17
21
|
type WakeExtensionServices,
|
|
18
22
|
type WorkspaceExtensionServices,
|
|
23
|
+
type ResumeExtensionServices,
|
|
24
|
+
type AgentDetectionExtensionServices,
|
|
19
25
|
} from "../extensions/index.js";
|
|
20
26
|
import type { MAPAdapter, ExtensionHandler, ExtensionContext } from "../interface.js";
|
|
21
27
|
import type { ParticipantCapabilities } from "../types.js";
|
|
@@ -550,6 +556,341 @@ describe("Workspace Extension", () => {
|
|
|
550
556
|
});
|
|
551
557
|
});
|
|
552
558
|
|
|
559
|
+
// =============================================================================
|
|
560
|
+
// Resume Extension Tests
|
|
561
|
+
// =============================================================================
|
|
562
|
+
|
|
563
|
+
describe("Resume Extension", () => {
|
|
564
|
+
let adapter: MAPAdapter & { handlers: Map<string, ExtensionHandler> };
|
|
565
|
+
let services: ResumeExtensionServices;
|
|
566
|
+
|
|
567
|
+
beforeEach(() => {
|
|
568
|
+
adapter = createMockAdapter();
|
|
569
|
+
|
|
570
|
+
services = {
|
|
571
|
+
getAgent: vi.fn().mockReturnValue({
|
|
572
|
+
id: "agent-1" as AgentId,
|
|
573
|
+
state: "stopped",
|
|
574
|
+
session_id: "session-1",
|
|
575
|
+
}),
|
|
576
|
+
resume: vi.fn().mockResolvedValue({
|
|
577
|
+
id: "agent-1" as AgentId,
|
|
578
|
+
session_id: "session-1",
|
|
579
|
+
}),
|
|
580
|
+
};
|
|
581
|
+
});
|
|
582
|
+
|
|
583
|
+
describe("registration", () => {
|
|
584
|
+
it("registers resume method", () => {
|
|
585
|
+
registerResumeExtension(adapter, services);
|
|
586
|
+
expect(adapter.handlers.has("_macro/resume")).toBe(true);
|
|
587
|
+
});
|
|
588
|
+
|
|
589
|
+
it("unregisters resume method", () => {
|
|
590
|
+
registerResumeExtension(adapter, services);
|
|
591
|
+
unregisterResumeExtension(adapter);
|
|
592
|
+
expect(adapter.handlers.has("_macro/resume")).toBe(false);
|
|
593
|
+
});
|
|
594
|
+
});
|
|
595
|
+
|
|
596
|
+
describe("_macro/resume", () => {
|
|
597
|
+
it("resumes a stopped agent", async () => {
|
|
598
|
+
registerResumeExtension(adapter, services);
|
|
599
|
+
const handler = adapter.handlers.get("_macro/resume")!;
|
|
600
|
+
|
|
601
|
+
const result = await handler(createMockContext(), { agentId: "agent-1" });
|
|
602
|
+
|
|
603
|
+
expect(services.resume).toHaveBeenCalledWith("agent-1");
|
|
604
|
+
expect(result).toEqual({
|
|
605
|
+
success: true,
|
|
606
|
+
agentId: "agent-1",
|
|
607
|
+
sessionId: "session-1",
|
|
608
|
+
});
|
|
609
|
+
});
|
|
610
|
+
|
|
611
|
+
it("resumes a failed agent", async () => {
|
|
612
|
+
(services.getAgent as ReturnType<typeof vi.fn>).mockReturnValue({
|
|
613
|
+
id: "agent-1",
|
|
614
|
+
state: "failed",
|
|
615
|
+
session_id: "session-1",
|
|
616
|
+
});
|
|
617
|
+
|
|
618
|
+
registerResumeExtension(adapter, services);
|
|
619
|
+
const handler = adapter.handlers.get("_macro/resume")!;
|
|
620
|
+
|
|
621
|
+
const result = await handler(createMockContext(), { agentId: "agent-1" });
|
|
622
|
+
|
|
623
|
+
expect(services.resume).toHaveBeenCalledWith("agent-1");
|
|
624
|
+
expect(result).toHaveProperty("success", true);
|
|
625
|
+
});
|
|
626
|
+
|
|
627
|
+
it("throws for missing agentId", async () => {
|
|
628
|
+
registerResumeExtension(adapter, services);
|
|
629
|
+
const handler = adapter.handlers.get("_macro/resume")!;
|
|
630
|
+
|
|
631
|
+
await expect(handler(createMockContext(), {})).rejects.toThrow("agentId is required");
|
|
632
|
+
});
|
|
633
|
+
|
|
634
|
+
it("throws for non-existent agent", async () => {
|
|
635
|
+
(services.getAgent as ReturnType<typeof vi.fn>).mockReturnValue(undefined);
|
|
636
|
+
|
|
637
|
+
registerResumeExtension(adapter, services);
|
|
638
|
+
const handler = adapter.handlers.get("_macro/resume")!;
|
|
639
|
+
|
|
640
|
+
await expect(
|
|
641
|
+
handler(createMockContext(), { agentId: "missing" })
|
|
642
|
+
).rejects.toThrow("not found");
|
|
643
|
+
});
|
|
644
|
+
|
|
645
|
+
it("throws for running agent", async () => {
|
|
646
|
+
(services.getAgent as ReturnType<typeof vi.fn>).mockReturnValue({
|
|
647
|
+
id: "agent-1",
|
|
648
|
+
state: "running",
|
|
649
|
+
});
|
|
650
|
+
|
|
651
|
+
registerResumeExtension(adapter, services);
|
|
652
|
+
const handler = adapter.handlers.get("_macro/resume")!;
|
|
653
|
+
|
|
654
|
+
await expect(
|
|
655
|
+
handler(createMockContext(), { agentId: "agent-1" })
|
|
656
|
+
).rejects.toThrow("only stopped or failed");
|
|
657
|
+
});
|
|
658
|
+
});
|
|
659
|
+
});
|
|
660
|
+
|
|
661
|
+
// =============================================================================
|
|
662
|
+
// Agent Detection Extension Tests
|
|
663
|
+
// =============================================================================
|
|
664
|
+
|
|
665
|
+
describe("Agent Detection Extensions", () => {
|
|
666
|
+
let adapter: MAPAdapter & { handlers: Map<string, ExtensionHandler> };
|
|
667
|
+
let services: AgentDetectionExtensionServices;
|
|
668
|
+
|
|
669
|
+
const mockDetectionResult = {
|
|
670
|
+
agents: [
|
|
671
|
+
{
|
|
672
|
+
id: "claude-code",
|
|
673
|
+
name: "Claude Code",
|
|
674
|
+
installed: true,
|
|
675
|
+
version: "1.2.3",
|
|
676
|
+
path: "/usr/local/bin/claude",
|
|
677
|
+
definition: {
|
|
678
|
+
id: "claude-code",
|
|
679
|
+
name: "Claude Code",
|
|
680
|
+
description: "Anthropic Claude Code CLI",
|
|
681
|
+
binary: "claude",
|
|
682
|
+
versionArgs: ["--version"],
|
|
683
|
+
headless: { promptFlag: "-p", defaultFlags: ["--output-format", "stream-json"] },
|
|
684
|
+
vendor: "Anthropic",
|
|
685
|
+
},
|
|
686
|
+
detectedAt: 1000,
|
|
687
|
+
},
|
|
688
|
+
{
|
|
689
|
+
id: "codex",
|
|
690
|
+
name: "Codex CLI",
|
|
691
|
+
installed: false,
|
|
692
|
+
definition: {
|
|
693
|
+
id: "codex",
|
|
694
|
+
name: "Codex CLI",
|
|
695
|
+
description: "OpenAI Codex CLI",
|
|
696
|
+
binary: "codex",
|
|
697
|
+
versionArgs: ["--version"],
|
|
698
|
+
headless: { subcommand: "exec", promptFlag: "", defaultFlags: ["--full-auto"] },
|
|
699
|
+
vendor: "OpenAI",
|
|
700
|
+
},
|
|
701
|
+
detectedAt: 1000,
|
|
702
|
+
},
|
|
703
|
+
],
|
|
704
|
+
scanned: 2,
|
|
705
|
+
durationMs: 150,
|
|
706
|
+
};
|
|
707
|
+
|
|
708
|
+
beforeEach(() => {
|
|
709
|
+
adapter = createMockAdapter();
|
|
710
|
+
|
|
711
|
+
services = {
|
|
712
|
+
getAvailableAgents: vi.fn().mockResolvedValue(mockDetectionResult),
|
|
713
|
+
isDetecting: vi.fn().mockReturnValue(false),
|
|
714
|
+
getCachedResult: vi.fn().mockReturnValue(null),
|
|
715
|
+
};
|
|
716
|
+
});
|
|
717
|
+
|
|
718
|
+
describe("registration", () => {
|
|
719
|
+
it("registers both agent detection methods", () => {
|
|
720
|
+
registerAgentDetectionExtensions(adapter, services);
|
|
721
|
+
|
|
722
|
+
expect(adapter.handlers.has("_macro/agents/available")).toBe(true);
|
|
723
|
+
expect(adapter.handlers.has("_macro/agents/refresh")).toBe(true);
|
|
724
|
+
});
|
|
725
|
+
|
|
726
|
+
it("unregisters both agent detection methods", () => {
|
|
727
|
+
registerAgentDetectionExtensions(adapter, services);
|
|
728
|
+
unregisterAgentDetectionExtensions(adapter);
|
|
729
|
+
|
|
730
|
+
expect(adapter.handlers.has("_macro/agents/available")).toBe(false);
|
|
731
|
+
expect(adapter.handlers.has("_macro/agents/refresh")).toBe(false);
|
|
732
|
+
});
|
|
733
|
+
});
|
|
734
|
+
|
|
735
|
+
describe("_macro/agents/available", () => {
|
|
736
|
+
it("returns detected agents when no cache exists", async () => {
|
|
737
|
+
registerAgentDetectionExtensions(adapter, services);
|
|
738
|
+
const handler = adapter.handlers.get("_macro/agents/available")!;
|
|
739
|
+
|
|
740
|
+
const result = await handler(createMockContext(), {});
|
|
741
|
+
|
|
742
|
+
expect(services.getAvailableAgents).toHaveBeenCalledWith({
|
|
743
|
+
includeNotInstalled: false,
|
|
744
|
+
});
|
|
745
|
+
expect(result).toHaveProperty("agents");
|
|
746
|
+
expect(result).toHaveProperty("scanned", 2);
|
|
747
|
+
expect(result).toHaveProperty("durationMs", 150);
|
|
748
|
+
expect(result).toHaveProperty("cached", false);
|
|
749
|
+
});
|
|
750
|
+
|
|
751
|
+
it("filters out not-installed agents by default", async () => {
|
|
752
|
+
registerAgentDetectionExtensions(adapter, services);
|
|
753
|
+
const handler = adapter.handlers.get("_macro/agents/available")!;
|
|
754
|
+
|
|
755
|
+
const result = await handler(createMockContext(), {});
|
|
756
|
+
|
|
757
|
+
expect(services.getAvailableAgents).toHaveBeenCalledWith({
|
|
758
|
+
includeNotInstalled: false,
|
|
759
|
+
});
|
|
760
|
+
});
|
|
761
|
+
|
|
762
|
+
it("includes not-installed agents when requested", async () => {
|
|
763
|
+
registerAgentDetectionExtensions(adapter, services);
|
|
764
|
+
const handler = adapter.handlers.get("_macro/agents/available")!;
|
|
765
|
+
|
|
766
|
+
const result = await handler(createMockContext(), {
|
|
767
|
+
includeNotInstalled: true,
|
|
768
|
+
});
|
|
769
|
+
|
|
770
|
+
// No cache, so falls through to getAvailableAgents
|
|
771
|
+
expect(services.getAvailableAgents).toHaveBeenCalledWith({
|
|
772
|
+
includeNotInstalled: true,
|
|
773
|
+
});
|
|
774
|
+
});
|
|
775
|
+
|
|
776
|
+
it("uses cached results when available", async () => {
|
|
777
|
+
(services.getCachedResult as ReturnType<typeof vi.fn>).mockReturnValue(
|
|
778
|
+
mockDetectionResult
|
|
779
|
+
);
|
|
780
|
+
|
|
781
|
+
registerAgentDetectionExtensions(adapter, services);
|
|
782
|
+
const handler = adapter.handlers.get("_macro/agents/available")!;
|
|
783
|
+
|
|
784
|
+
const result = await handler(createMockContext(), {});
|
|
785
|
+
|
|
786
|
+
// Should use cache, not call getAvailableAgents
|
|
787
|
+
expect(services.getAvailableAgents).not.toHaveBeenCalled();
|
|
788
|
+
expect(result).toHaveProperty("cached", true);
|
|
789
|
+
// Default excludes not-installed, so only 1 agent
|
|
790
|
+
expect((result as any).agents).toHaveLength(1);
|
|
791
|
+
expect((result as any).agents[0].id).toBe("claude-code");
|
|
792
|
+
});
|
|
793
|
+
|
|
794
|
+
it("returns all agents from cache when includeNotInstalled is true", async () => {
|
|
795
|
+
(services.getCachedResult as ReturnType<typeof vi.fn>).mockReturnValue(
|
|
796
|
+
mockDetectionResult
|
|
797
|
+
);
|
|
798
|
+
|
|
799
|
+
registerAgentDetectionExtensions(adapter, services);
|
|
800
|
+
const handler = adapter.handlers.get("_macro/agents/available")!;
|
|
801
|
+
|
|
802
|
+
const result = await handler(createMockContext(), {
|
|
803
|
+
includeNotInstalled: true,
|
|
804
|
+
});
|
|
805
|
+
|
|
806
|
+
expect((result as any).agents).toHaveLength(2);
|
|
807
|
+
expect(result).toHaveProperty("cached", true);
|
|
808
|
+
});
|
|
809
|
+
|
|
810
|
+
it("strips binary paths from results", async () => {
|
|
811
|
+
registerAgentDetectionExtensions(adapter, services);
|
|
812
|
+
const handler = adapter.handlers.get("_macro/agents/available")!;
|
|
813
|
+
|
|
814
|
+
const result = await handler(createMockContext(), {});
|
|
815
|
+
|
|
816
|
+
const agents = (result as any).agents;
|
|
817
|
+
for (const agent of agents) {
|
|
818
|
+
expect(agent).not.toHaveProperty("path");
|
|
819
|
+
expect(agent).not.toHaveProperty("definition");
|
|
820
|
+
expect(agent).not.toHaveProperty("detectedAt");
|
|
821
|
+
}
|
|
822
|
+
});
|
|
823
|
+
|
|
824
|
+
it("includes vendor and description in results", async () => {
|
|
825
|
+
registerAgentDetectionExtensions(adapter, services);
|
|
826
|
+
const handler = adapter.handlers.get("_macro/agents/available")!;
|
|
827
|
+
|
|
828
|
+
const result = await handler(createMockContext(), {});
|
|
829
|
+
|
|
830
|
+
const agents = (result as any).agents;
|
|
831
|
+
expect(agents[0]).toHaveProperty("vendor", "Anthropic");
|
|
832
|
+
expect(agents[0]).toHaveProperty("description", "Anthropic Claude Code CLI");
|
|
833
|
+
});
|
|
834
|
+
|
|
835
|
+
it("handles empty params", async () => {
|
|
836
|
+
registerAgentDetectionExtensions(adapter, services);
|
|
837
|
+
const handler = adapter.handlers.get("_macro/agents/available")!;
|
|
838
|
+
|
|
839
|
+
const result = await handler(createMockContext(), null);
|
|
840
|
+
|
|
841
|
+
expect(result).toHaveProperty("agents");
|
|
842
|
+
});
|
|
843
|
+
});
|
|
844
|
+
|
|
845
|
+
describe("_macro/agents/refresh", () => {
|
|
846
|
+
it("forces a fresh detection scan", async () => {
|
|
847
|
+
registerAgentDetectionExtensions(adapter, services);
|
|
848
|
+
const handler = adapter.handlers.get("_macro/agents/refresh")!;
|
|
849
|
+
|
|
850
|
+
const result = await handler(createMockContext(), {});
|
|
851
|
+
|
|
852
|
+
expect(services.getAvailableAgents).toHaveBeenCalledWith({
|
|
853
|
+
refresh: true,
|
|
854
|
+
includeNotInstalled: true,
|
|
855
|
+
});
|
|
856
|
+
expect(result).toHaveProperty("agents");
|
|
857
|
+
expect(result).toHaveProperty("scanned", 2);
|
|
858
|
+
expect(result).toHaveProperty("durationMs", 150);
|
|
859
|
+
});
|
|
860
|
+
|
|
861
|
+
it("always returns all agents including not-installed", async () => {
|
|
862
|
+
registerAgentDetectionExtensions(adapter, services);
|
|
863
|
+
const handler = adapter.handlers.get("_macro/agents/refresh")!;
|
|
864
|
+
|
|
865
|
+
const result = await handler(createMockContext(), {});
|
|
866
|
+
|
|
867
|
+
expect((result as any).agents).toHaveLength(2);
|
|
868
|
+
});
|
|
869
|
+
|
|
870
|
+
it("does not include a cached flag", async () => {
|
|
871
|
+
registerAgentDetectionExtensions(adapter, services);
|
|
872
|
+
const handler = adapter.handlers.get("_macro/agents/refresh")!;
|
|
873
|
+
|
|
874
|
+
const result = await handler(createMockContext(), {});
|
|
875
|
+
|
|
876
|
+
expect(result).not.toHaveProperty("cached");
|
|
877
|
+
});
|
|
878
|
+
|
|
879
|
+
it("strips binary paths from results", async () => {
|
|
880
|
+
registerAgentDetectionExtensions(adapter, services);
|
|
881
|
+
const handler = adapter.handlers.get("_macro/agents/refresh")!;
|
|
882
|
+
|
|
883
|
+
const result = await handler(createMockContext(), {});
|
|
884
|
+
|
|
885
|
+
const agents = (result as any).agents;
|
|
886
|
+
for (const agent of agents) {
|
|
887
|
+
expect(agent).not.toHaveProperty("path");
|
|
888
|
+
expect(agent).not.toHaveProperty("definition");
|
|
889
|
+
}
|
|
890
|
+
});
|
|
891
|
+
});
|
|
892
|
+
});
|
|
893
|
+
|
|
553
894
|
// =============================================================================
|
|
554
895
|
// Combined Registration Tests
|
|
555
896
|
// =============================================================================
|
|
@@ -588,11 +929,23 @@ describe("registerMacroExtensions", () => {
|
|
|
588
929
|
getWorkspace: vi.fn(),
|
|
589
930
|
agentExists: vi.fn(),
|
|
590
931
|
},
|
|
932
|
+
resume: {
|
|
933
|
+
getAgent: vi.fn(),
|
|
934
|
+
resume: vi.fn(),
|
|
935
|
+
},
|
|
936
|
+
agentDetection: {
|
|
937
|
+
getAvailableAgents: vi.fn(),
|
|
938
|
+
isDetecting: vi.fn(),
|
|
939
|
+
getCachedResult: vi.fn(),
|
|
940
|
+
},
|
|
591
941
|
});
|
|
592
942
|
|
|
593
943
|
expect(adapter.handlers.has("_macro/task/list")).toBe(true);
|
|
594
944
|
expect(adapter.handlers.has("_macro/wake")).toBe(true);
|
|
595
945
|
expect(adapter.handlers.has("_macro/workspace/info")).toBe(true);
|
|
946
|
+
expect(adapter.handlers.has("_macro/resume")).toBe(true);
|
|
947
|
+
expect(adapter.handlers.has("_macro/agents/available")).toBe(true);
|
|
948
|
+
expect(adapter.handlers.has("_macro/agents/refresh")).toBe(true);
|
|
596
949
|
});
|
|
597
950
|
});
|
|
598
951
|
|
|
@@ -606,6 +959,9 @@ describe("MACRO_EXTENSION_METHODS", () => {
|
|
|
606
959
|
expect(MACRO_EXTENSION_METHODS).toContain("_macro/task/send");
|
|
607
960
|
expect(MACRO_EXTENSION_METHODS).toContain("_macro/wake");
|
|
608
961
|
expect(MACRO_EXTENSION_METHODS).toContain("_macro/workspace/info");
|
|
962
|
+
expect(MACRO_EXTENSION_METHODS).toContain("_macro/resume");
|
|
963
|
+
expect(MACRO_EXTENSION_METHODS).toContain("_macro/agents/available");
|
|
964
|
+
expect(MACRO_EXTENSION_METHODS).toContain("_macro/agents/refresh");
|
|
609
965
|
});
|
|
610
966
|
});
|
|
611
967
|
|
|
@@ -616,5 +972,8 @@ describe("EXTENSION_CAPABILITIES", () => {
|
|
|
616
972
|
expect(EXTENSION_CAPABILITIES["_macro/task/send"]).toBe("canMessage");
|
|
617
973
|
expect(EXTENSION_CAPABILITIES["_macro/wake"]).toBe("canMessage");
|
|
618
974
|
expect(EXTENSION_CAPABILITIES["_macro/workspace/info"]).toBe("canQuery");
|
|
975
|
+
expect(EXTENSION_CAPABILITIES["_macro/resume"]).toBe("canManageLifecycle");
|
|
976
|
+
expect(EXTENSION_CAPABILITIES["_macro/agents/available"]).toBe("canQuery");
|
|
977
|
+
expect(EXTENSION_CAPABILITIES["_macro/agents/refresh"]).toBe("canQuery");
|
|
619
978
|
});
|
|
620
979
|
});
|