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
|
@@ -1,479 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Tests for fork-related helper methods in ClaudeAcpAgent.
|
|
3
|
-
*
|
|
4
|
-
* Since the methods are private, we test them by:
|
|
5
|
-
* 1. Creating a test subclass that exposes the private methods
|
|
6
|
-
* 2. Testing the file manipulation logic directly
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import { describe, it, expect, beforeEach, afterEach, vi } from "vitest";
|
|
10
|
-
import { ClaudeAcpAgent } from "../acp-agent.js";
|
|
11
|
-
import type { AgentSideConnection } from "@agentclientprotocol/sdk";
|
|
12
|
-
import * as fs from "node:fs";
|
|
13
|
-
import * as path from "node:path";
|
|
14
|
-
import * as os from "node:os";
|
|
15
|
-
|
|
16
|
-
// Create a test subclass that exposes private methods for testing
|
|
17
|
-
class TestableClaudeAcpAgent extends ClaudeAcpAgent {
|
|
18
|
-
// Expose private methods for testing
|
|
19
|
-
public testExtractInternalSessionId(filePath: string): string | null {
|
|
20
|
-
return (this as any).extractInternalSessionId(filePath);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
public testPromoteToFullSession(filePath: string): boolean {
|
|
24
|
-
return (this as any).promoteToFullSession(filePath);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
public testUpdateSessionIdInFile(filePath: string, newSessionId: string): boolean {
|
|
28
|
-
return (this as any).updateSessionIdInFile(filePath, newSessionId);
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
public testGetSessionDirPath(cwd: string): string {
|
|
32
|
-
return (this as any).getSessionDirPath(cwd);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
public testGetSessionFilePath(sessionId: string, cwd: string): string {
|
|
36
|
-
return (this as any).getSessionFilePath(sessionId, cwd);
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
public async testDiscoverCliSessionId(
|
|
40
|
-
sessionDir: string,
|
|
41
|
-
beforeFiles: Set<string>,
|
|
42
|
-
fallbackId: string,
|
|
43
|
-
timeout?: number
|
|
44
|
-
): Promise<string> {
|
|
45
|
-
return (this as any).discoverCliSessionId(sessionDir, beforeFiles, fallbackId, timeout);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
public async testWaitForSessionFile(filePath: string, timeout: number): Promise<boolean> {
|
|
49
|
-
return (this as any).waitForSessionFile(filePath, timeout);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
describe("ClaudeAcpAgent fork helpers", () => {
|
|
54
|
-
let tempDir: string;
|
|
55
|
-
let agent: TestableClaudeAcpAgent;
|
|
56
|
-
const mockLogger = {
|
|
57
|
-
log: vi.fn(),
|
|
58
|
-
error: vi.fn(),
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
// Create a minimal mock client
|
|
62
|
-
const mockClient = {
|
|
63
|
-
sessionUpdate: vi.fn(),
|
|
64
|
-
readTextFile: vi.fn(),
|
|
65
|
-
writeTextFile: vi.fn(),
|
|
66
|
-
requestPermission: vi.fn(),
|
|
67
|
-
} as unknown as AgentSideConnection;
|
|
68
|
-
|
|
69
|
-
beforeEach(async () => {
|
|
70
|
-
tempDir = await fs.promises.mkdtemp(path.join(os.tmpdir(), "acp-agent-fork-test-"));
|
|
71
|
-
agent = new TestableClaudeAcpAgent(mockClient, mockLogger);
|
|
72
|
-
vi.clearAllMocks();
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
afterEach(async () => {
|
|
76
|
-
await fs.promises.rm(tempDir, { recursive: true, force: true });
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
describe("extractInternalSessionId", () => {
|
|
80
|
-
it("should extract UUID sessionId from valid JSONL file", async () => {
|
|
81
|
-
const filePath = path.join(tempDir, "session.jsonl");
|
|
82
|
-
const sessionId = "12345678-1234-1234-1234-123456789abc";
|
|
83
|
-
|
|
84
|
-
await fs.promises.writeFile(
|
|
85
|
-
filePath,
|
|
86
|
-
JSON.stringify({ sessionId, type: "init" }) + "\n"
|
|
87
|
-
);
|
|
88
|
-
|
|
89
|
-
const result = agent.testExtractInternalSessionId(filePath);
|
|
90
|
-
expect(result).toBe(sessionId);
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
it("should return null for non-existent file", () => {
|
|
94
|
-
const result = agent.testExtractInternalSessionId(path.join(tempDir, "nonexistent.jsonl"));
|
|
95
|
-
expect(result).toBeNull();
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
it("should return null for file without sessionId", async () => {
|
|
99
|
-
const filePath = path.join(tempDir, "session.jsonl");
|
|
100
|
-
await fs.promises.writeFile(
|
|
101
|
-
filePath,
|
|
102
|
-
JSON.stringify({ type: "init" }) + "\n"
|
|
103
|
-
);
|
|
104
|
-
|
|
105
|
-
const result = agent.testExtractInternalSessionId(filePath);
|
|
106
|
-
expect(result).toBeNull();
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
it("should return null for non-UUID sessionId", async () => {
|
|
110
|
-
const filePath = path.join(tempDir, "session.jsonl");
|
|
111
|
-
await fs.promises.writeFile(
|
|
112
|
-
filePath,
|
|
113
|
-
JSON.stringify({ sessionId: "not-a-uuid", type: "init" }) + "\n"
|
|
114
|
-
);
|
|
115
|
-
|
|
116
|
-
const result = agent.testExtractInternalSessionId(filePath);
|
|
117
|
-
expect(result).toBeNull();
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
it("should handle empty file", async () => {
|
|
121
|
-
const filePath = path.join(tempDir, "session.jsonl");
|
|
122
|
-
await fs.promises.writeFile(filePath, "");
|
|
123
|
-
|
|
124
|
-
const result = agent.testExtractInternalSessionId(filePath);
|
|
125
|
-
expect(result).toBeNull();
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
it("should find sessionId from first non-empty line", async () => {
|
|
129
|
-
const filePath = path.join(tempDir, "session.jsonl");
|
|
130
|
-
const sessionId = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee";
|
|
131
|
-
|
|
132
|
-
await fs.promises.writeFile(
|
|
133
|
-
filePath,
|
|
134
|
-
"\n\n" + JSON.stringify({ sessionId, type: "init" }) + "\n"
|
|
135
|
-
);
|
|
136
|
-
|
|
137
|
-
const result = agent.testExtractInternalSessionId(filePath);
|
|
138
|
-
expect(result).toBe(sessionId);
|
|
139
|
-
});
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
describe("promoteToFullSession", () => {
|
|
143
|
-
it("should change isSidechain from true to false", async () => {
|
|
144
|
-
const filePath = path.join(tempDir, "session.jsonl");
|
|
145
|
-
const lines = [
|
|
146
|
-
JSON.stringify({ sessionId: "test-id", isSidechain: true }),
|
|
147
|
-
JSON.stringify({ type: "message", content: "hello" }),
|
|
148
|
-
];
|
|
149
|
-
await fs.promises.writeFile(filePath, lines.join("\n"));
|
|
150
|
-
|
|
151
|
-
const result = agent.testPromoteToFullSession(filePath);
|
|
152
|
-
expect(result).toBe(true);
|
|
153
|
-
|
|
154
|
-
const content = await fs.promises.readFile(filePath, "utf-8");
|
|
155
|
-
const parsedLines = content.split("\n").map(line => JSON.parse(line));
|
|
156
|
-
|
|
157
|
-
expect(parsedLines[0].isSidechain).toBe(false);
|
|
158
|
-
expect(parsedLines[1].content).toBe("hello");
|
|
159
|
-
});
|
|
160
|
-
|
|
161
|
-
it("should return false for non-existent file", () => {
|
|
162
|
-
const result = agent.testPromoteToFullSession(path.join(tempDir, "nonexistent.jsonl"));
|
|
163
|
-
expect(result).toBe(false);
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
it("should preserve other fields when promoting", async () => {
|
|
167
|
-
const filePath = path.join(tempDir, "session.jsonl");
|
|
168
|
-
const original = {
|
|
169
|
-
sessionId: "test-id",
|
|
170
|
-
isSidechain: true,
|
|
171
|
-
cwd: "/some/path",
|
|
172
|
-
model: "claude-3",
|
|
173
|
-
};
|
|
174
|
-
await fs.promises.writeFile(filePath, JSON.stringify(original));
|
|
175
|
-
|
|
176
|
-
agent.testPromoteToFullSession(filePath);
|
|
177
|
-
|
|
178
|
-
const content = await fs.promises.readFile(filePath, "utf-8");
|
|
179
|
-
const parsed = JSON.parse(content);
|
|
180
|
-
|
|
181
|
-
expect(parsed.sessionId).toBe("test-id");
|
|
182
|
-
expect(parsed.isSidechain).toBe(false);
|
|
183
|
-
expect(parsed.cwd).toBe("/some/path");
|
|
184
|
-
expect(parsed.model).toBe("claude-3");
|
|
185
|
-
});
|
|
186
|
-
|
|
187
|
-
it("should handle file without isSidechain field", async () => {
|
|
188
|
-
const filePath = path.join(tempDir, "session.jsonl");
|
|
189
|
-
await fs.promises.writeFile(
|
|
190
|
-
filePath,
|
|
191
|
-
JSON.stringify({ sessionId: "test-id", type: "init" })
|
|
192
|
-
);
|
|
193
|
-
|
|
194
|
-
const result = agent.testPromoteToFullSession(filePath);
|
|
195
|
-
expect(result).toBe(true);
|
|
196
|
-
|
|
197
|
-
const content = await fs.promises.readFile(filePath, "utf-8");
|
|
198
|
-
const parsed = JSON.parse(content);
|
|
199
|
-
expect(parsed.isSidechain).toBeUndefined();
|
|
200
|
-
});
|
|
201
|
-
|
|
202
|
-
it("should log success message", async () => {
|
|
203
|
-
const filePath = path.join(tempDir, "session.jsonl");
|
|
204
|
-
await fs.promises.writeFile(
|
|
205
|
-
filePath,
|
|
206
|
-
JSON.stringify({ sessionId: "test-id", isSidechain: true })
|
|
207
|
-
);
|
|
208
|
-
|
|
209
|
-
agent.testPromoteToFullSession(filePath);
|
|
210
|
-
|
|
211
|
-
expect(mockLogger.log).toHaveBeenCalledWith(
|
|
212
|
-
expect.stringContaining("Promoted sidechain to full session")
|
|
213
|
-
);
|
|
214
|
-
});
|
|
215
|
-
});
|
|
216
|
-
|
|
217
|
-
describe("updateSessionIdInFile", () => {
|
|
218
|
-
it("should update sessionId in all lines", async () => {
|
|
219
|
-
const filePath = path.join(tempDir, "session.jsonl");
|
|
220
|
-
const oldId = "old-session-id";
|
|
221
|
-
const newId = "new-session-id";
|
|
222
|
-
|
|
223
|
-
const lines = [
|
|
224
|
-
JSON.stringify({ sessionId: oldId, type: "init" }),
|
|
225
|
-
JSON.stringify({ sessionId: oldId, type: "message", content: "hello" }),
|
|
226
|
-
JSON.stringify({ sessionId: oldId, type: "tool_use", name: "Read" }),
|
|
227
|
-
];
|
|
228
|
-
await fs.promises.writeFile(filePath, lines.join("\n"));
|
|
229
|
-
|
|
230
|
-
const result = agent.testUpdateSessionIdInFile(filePath, newId);
|
|
231
|
-
expect(result).toBe(true);
|
|
232
|
-
|
|
233
|
-
const content = await fs.promises.readFile(filePath, "utf-8");
|
|
234
|
-
const parsedLines = content.split("\n").map(line => JSON.parse(line));
|
|
235
|
-
|
|
236
|
-
for (const line of parsedLines) {
|
|
237
|
-
expect(line.sessionId).toBe(newId);
|
|
238
|
-
}
|
|
239
|
-
});
|
|
240
|
-
|
|
241
|
-
it("should return false for non-existent file", () => {
|
|
242
|
-
const result = agent.testUpdateSessionIdInFile(
|
|
243
|
-
path.join(tempDir, "nonexistent.jsonl"),
|
|
244
|
-
"new-id"
|
|
245
|
-
);
|
|
246
|
-
expect(result).toBe(false);
|
|
247
|
-
});
|
|
248
|
-
|
|
249
|
-
it("should preserve lines without sessionId", async () => {
|
|
250
|
-
const filePath = path.join(tempDir, "session.jsonl");
|
|
251
|
-
const lines = [
|
|
252
|
-
JSON.stringify({ sessionId: "old-id", type: "init" }),
|
|
253
|
-
JSON.stringify({ type: "comment", text: "no sessionId here" }),
|
|
254
|
-
];
|
|
255
|
-
await fs.promises.writeFile(filePath, lines.join("\n"));
|
|
256
|
-
|
|
257
|
-
agent.testUpdateSessionIdInFile(filePath, "new-id");
|
|
258
|
-
|
|
259
|
-
const content = await fs.promises.readFile(filePath, "utf-8");
|
|
260
|
-
const parsedLines = content.split("\n").map(line => JSON.parse(line));
|
|
261
|
-
|
|
262
|
-
expect(parsedLines[0].sessionId).toBe("new-id");
|
|
263
|
-
expect(parsedLines[1].sessionId).toBeUndefined();
|
|
264
|
-
expect(parsedLines[1].text).toBe("no sessionId here");
|
|
265
|
-
});
|
|
266
|
-
|
|
267
|
-
it("should handle empty lines gracefully", async () => {
|
|
268
|
-
const filePath = path.join(tempDir, "session.jsonl");
|
|
269
|
-
const content = JSON.stringify({ sessionId: "old-id" }) + "\n\n" + JSON.stringify({ sessionId: "old-id" });
|
|
270
|
-
await fs.promises.writeFile(filePath, content);
|
|
271
|
-
|
|
272
|
-
const result = agent.testUpdateSessionIdInFile(filePath, "new-id");
|
|
273
|
-
expect(result).toBe(true);
|
|
274
|
-
|
|
275
|
-
const newContent = await fs.promises.readFile(filePath, "utf-8");
|
|
276
|
-
const lines = newContent.split("\n");
|
|
277
|
-
|
|
278
|
-
expect(JSON.parse(lines[0]).sessionId).toBe("new-id");
|
|
279
|
-
expect(lines[1]).toBe(""); // Empty line preserved
|
|
280
|
-
expect(JSON.parse(lines[2]).sessionId).toBe("new-id");
|
|
281
|
-
});
|
|
282
|
-
|
|
283
|
-
it("should log success message", async () => {
|
|
284
|
-
const filePath = path.join(tempDir, "session.jsonl");
|
|
285
|
-
await fs.promises.writeFile(
|
|
286
|
-
filePath,
|
|
287
|
-
JSON.stringify({ sessionId: "old-id" })
|
|
288
|
-
);
|
|
289
|
-
|
|
290
|
-
agent.testUpdateSessionIdInFile(filePath, "new-id");
|
|
291
|
-
|
|
292
|
-
expect(mockLogger.log).toHaveBeenCalledWith(
|
|
293
|
-
expect.stringContaining("Updated session ID in file")
|
|
294
|
-
);
|
|
295
|
-
});
|
|
296
|
-
});
|
|
297
|
-
|
|
298
|
-
describe("getSessionDirPath", () => {
|
|
299
|
-
it("should compute correct path with cwd hash", () => {
|
|
300
|
-
const result = agent.testGetSessionDirPath("/private/tmp");
|
|
301
|
-
const homeDir = os.homedir();
|
|
302
|
-
|
|
303
|
-
expect(result).toBe(`${homeDir}/.claude/projects/-private-tmp`);
|
|
304
|
-
});
|
|
305
|
-
|
|
306
|
-
it("should replace both / and _ with -", () => {
|
|
307
|
-
// Use tempDir which exists
|
|
308
|
-
const testDir = path.join(tempDir, "my_project");
|
|
309
|
-
fs.mkdirSync(testDir, { recursive: true });
|
|
310
|
-
|
|
311
|
-
const result = agent.testGetSessionDirPath(testDir);
|
|
312
|
-
const realPath = fs.realpathSync(testDir);
|
|
313
|
-
const expectedHash = realPath.replace(/[/_]/g, "-");
|
|
314
|
-
|
|
315
|
-
expect(result).toBe(`${os.homedir()}/.claude/projects/${expectedHash}`);
|
|
316
|
-
});
|
|
317
|
-
|
|
318
|
-
it("should resolve symlinks", () => {
|
|
319
|
-
// /var on macOS is a symlink to /private/var
|
|
320
|
-
const result = agent.testGetSessionDirPath("/var/tmp");
|
|
321
|
-
const homeDir = os.homedir();
|
|
322
|
-
|
|
323
|
-
// Should use the resolved path
|
|
324
|
-
expect(result).toBe(`${homeDir}/.claude/projects/-private-var-tmp`);
|
|
325
|
-
});
|
|
326
|
-
});
|
|
327
|
-
|
|
328
|
-
describe("getSessionFilePath", () => {
|
|
329
|
-
it("should append sessionId.jsonl to session dir", () => {
|
|
330
|
-
const result = agent.testGetSessionFilePath("my-session-id", "/private/tmp");
|
|
331
|
-
const homeDir = os.homedir();
|
|
332
|
-
|
|
333
|
-
expect(result).toBe(`${homeDir}/.claude/projects/-private-tmp/my-session-id.jsonl`);
|
|
334
|
-
});
|
|
335
|
-
});
|
|
336
|
-
|
|
337
|
-
describe("waitForSessionFile", () => {
|
|
338
|
-
it("should return true immediately if file exists", async () => {
|
|
339
|
-
const filePath = path.join(tempDir, "session.jsonl");
|
|
340
|
-
await fs.promises.writeFile(filePath, "{}");
|
|
341
|
-
|
|
342
|
-
const start = Date.now();
|
|
343
|
-
const result = await agent.testWaitForSessionFile(filePath, 1000);
|
|
344
|
-
const elapsed = Date.now() - start;
|
|
345
|
-
|
|
346
|
-
expect(result).toBe(true);
|
|
347
|
-
expect(elapsed).toBeLessThan(200);
|
|
348
|
-
});
|
|
349
|
-
|
|
350
|
-
it("should return true when file appears before timeout", async () => {
|
|
351
|
-
const filePath = path.join(tempDir, "session.jsonl");
|
|
352
|
-
|
|
353
|
-
// Create file after 200ms
|
|
354
|
-
setTimeout(async () => {
|
|
355
|
-
await fs.promises.writeFile(filePath, "{}");
|
|
356
|
-
}, 200);
|
|
357
|
-
|
|
358
|
-
const start = Date.now();
|
|
359
|
-
const result = await agent.testWaitForSessionFile(filePath, 2000);
|
|
360
|
-
const elapsed = Date.now() - start;
|
|
361
|
-
|
|
362
|
-
expect(result).toBe(true);
|
|
363
|
-
expect(elapsed).toBeGreaterThanOrEqual(200);
|
|
364
|
-
expect(elapsed).toBeLessThan(2000);
|
|
365
|
-
});
|
|
366
|
-
|
|
367
|
-
it("should return false when timeout expires", async () => {
|
|
368
|
-
const filePath = path.join(tempDir, "nonexistent.jsonl");
|
|
369
|
-
|
|
370
|
-
const start = Date.now();
|
|
371
|
-
const result = await agent.testWaitForSessionFile(filePath, 300);
|
|
372
|
-
const elapsed = Date.now() - start;
|
|
373
|
-
|
|
374
|
-
expect(result).toBe(false);
|
|
375
|
-
expect(elapsed).toBeGreaterThanOrEqual(300);
|
|
376
|
-
expect(elapsed).toBeLessThan(500);
|
|
377
|
-
});
|
|
378
|
-
});
|
|
379
|
-
|
|
380
|
-
describe("discoverCliSessionId", () => {
|
|
381
|
-
it("should find new agent-xxx file", async () => {
|
|
382
|
-
const sessionDir = path.join(tempDir, "sessions");
|
|
383
|
-
await fs.promises.mkdir(sessionDir, { recursive: true });
|
|
384
|
-
|
|
385
|
-
const beforeFiles = new Set<string>();
|
|
386
|
-
|
|
387
|
-
// Create an agent-xxx file
|
|
388
|
-
const agentFile = "agent-abc123.jsonl";
|
|
389
|
-
await fs.promises.writeFile(path.join(sessionDir, agentFile), "{}");
|
|
390
|
-
|
|
391
|
-
const result = await agent.testDiscoverCliSessionId(sessionDir, beforeFiles, "fallback", 1000);
|
|
392
|
-
|
|
393
|
-
expect(result).toBe("agent-abc123");
|
|
394
|
-
});
|
|
395
|
-
|
|
396
|
-
it("should ignore non-agent files", async () => {
|
|
397
|
-
const sessionDir = path.join(tempDir, "sessions");
|
|
398
|
-
await fs.promises.mkdir(sessionDir, { recursive: true });
|
|
399
|
-
|
|
400
|
-
const beforeFiles = new Set<string>();
|
|
401
|
-
|
|
402
|
-
// Create a UUID-named file (not agent-xxx)
|
|
403
|
-
const uuidFile = "12345678-1234-1234-1234-123456789abc.jsonl";
|
|
404
|
-
await fs.promises.writeFile(path.join(sessionDir, uuidFile), "{}");
|
|
405
|
-
|
|
406
|
-
const result = await agent.testDiscoverCliSessionId(sessionDir, beforeFiles, "fallback", 500);
|
|
407
|
-
|
|
408
|
-
expect(result).toBe("fallback");
|
|
409
|
-
});
|
|
410
|
-
|
|
411
|
-
it("should return fallback when no new files found", async () => {
|
|
412
|
-
const sessionDir = path.join(tempDir, "sessions");
|
|
413
|
-
await fs.promises.mkdir(sessionDir, { recursive: true });
|
|
414
|
-
|
|
415
|
-
const beforeFiles = new Set<string>();
|
|
416
|
-
|
|
417
|
-
const result = await agent.testDiscoverCliSessionId(sessionDir, beforeFiles, "fallback-id", 300);
|
|
418
|
-
|
|
419
|
-
expect(result).toBe("fallback-id");
|
|
420
|
-
});
|
|
421
|
-
|
|
422
|
-
it("should ignore files that existed before", async () => {
|
|
423
|
-
const sessionDir = path.join(tempDir, "sessions");
|
|
424
|
-
await fs.promises.mkdir(sessionDir, { recursive: true });
|
|
425
|
-
|
|
426
|
-
// Create file before
|
|
427
|
-
const existingFile = "agent-existing.jsonl";
|
|
428
|
-
await fs.promises.writeFile(path.join(sessionDir, existingFile), "{}");
|
|
429
|
-
|
|
430
|
-
const beforeFiles = new Set<string>([existingFile]);
|
|
431
|
-
|
|
432
|
-
const result = await agent.testDiscoverCliSessionId(sessionDir, beforeFiles, "fallback", 300);
|
|
433
|
-
|
|
434
|
-
expect(result).toBe("fallback");
|
|
435
|
-
});
|
|
436
|
-
|
|
437
|
-
it("should return newest file when multiple agent files appear", async () => {
|
|
438
|
-
const sessionDir = path.join(tempDir, "sessions");
|
|
439
|
-
await fs.promises.mkdir(sessionDir, { recursive: true });
|
|
440
|
-
|
|
441
|
-
const beforeFiles = new Set<string>();
|
|
442
|
-
|
|
443
|
-
// Create first file - use hex chars to match agent-[a-f0-9]+ pattern
|
|
444
|
-
const firstPath = path.join(sessionDir, "agent-aaa111.jsonl");
|
|
445
|
-
await fs.promises.writeFile(firstPath, "{}");
|
|
446
|
-
|
|
447
|
-
// Wait a bit to ensure different mtime, then create second file
|
|
448
|
-
await new Promise(resolve => setTimeout(resolve, 100));
|
|
449
|
-
const secondPath = path.join(sessionDir, "agent-bbb222.jsonl");
|
|
450
|
-
await fs.promises.writeFile(secondPath, "{}");
|
|
451
|
-
|
|
452
|
-
// Verify files exist before calling discover
|
|
453
|
-
expect(fs.existsSync(firstPath)).toBe(true);
|
|
454
|
-
expect(fs.existsSync(secondPath)).toBe(true);
|
|
455
|
-
|
|
456
|
-
const result = await agent.testDiscoverCliSessionId(sessionDir, beforeFiles, "fallback", 1000);
|
|
457
|
-
|
|
458
|
-
expect(result).toBe("agent-bbb222");
|
|
459
|
-
});
|
|
460
|
-
|
|
461
|
-
it("should handle non-existent session directory initially", async () => {
|
|
462
|
-
const sessionDir = path.join(tempDir, "nonexistent-dir");
|
|
463
|
-
const beforeFiles = new Set<string>();
|
|
464
|
-
|
|
465
|
-
// Start the discovery in parallel with file creation
|
|
466
|
-
const discoverPromise = agent.testDiscoverCliSessionId(sessionDir, beforeFiles, "fallback", 2000);
|
|
467
|
-
|
|
468
|
-
// Create directory and file after 200ms (within the 2000ms timeout)
|
|
469
|
-
// Use hex chars to match agent-[a-f0-9]+ pattern
|
|
470
|
-
await new Promise(resolve => setTimeout(resolve, 200));
|
|
471
|
-
await fs.promises.mkdir(sessionDir, { recursive: true });
|
|
472
|
-
await fs.promises.writeFile(path.join(sessionDir, "agent-ccc333.jsonl"), "{}");
|
|
473
|
-
|
|
474
|
-
const result = await discoverPromise;
|
|
475
|
-
|
|
476
|
-
expect(result).toBe("agent-ccc333");
|
|
477
|
-
});
|
|
478
|
-
});
|
|
479
|
-
});
|