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,349 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
E2E tests for Codex agent integration.
|
|
3
|
-
|
|
4
|
-
These tests use the real Codex CLI and require:
|
|
5
|
-
1. @zed-industries/codex-acp installed
|
|
6
|
-
2. Codex authenticated (via browser auth, OPENAI_API_KEY, or CODEX_API_KEY)
|
|
7
|
-
|
|
8
|
-
Run with: RUN_E2E_TESTS=true pytest tests/e2e/test_codex_e2e.py -v
|
|
9
|
-
"""
|
|
10
|
-
|
|
11
|
-
import os
|
|
12
|
-
import shutil
|
|
13
|
-
import tempfile
|
|
14
|
-
|
|
15
|
-
import pytest
|
|
16
|
-
|
|
17
|
-
from acp_factory import AgentFactory, AgentHandle, ExtendedSessionUpdate
|
|
18
|
-
|
|
19
|
-
# Skip all tests if RUN_E2E_TESTS is not set
|
|
20
|
-
pytestmark = pytest.mark.skipif(
|
|
21
|
-
os.environ.get("RUN_E2E_TESTS") != "true",
|
|
22
|
-
reason="E2E tests require RUN_E2E_TESTS=true",
|
|
23
|
-
)
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
@pytest.fixture(scope="module")
|
|
27
|
-
async def agent_handle() -> AgentHandle:
|
|
28
|
-
"""Spawn Codex agent once for the module."""
|
|
29
|
-
handle = await AgentFactory.spawn("codex")
|
|
30
|
-
yield handle
|
|
31
|
-
await handle.close()
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
class TestCodexAgentInitialization:
|
|
35
|
-
"""Tests for agent initialization."""
|
|
36
|
-
|
|
37
|
-
def test_should_have_codex_registered_in_factory(self) -> None:
|
|
38
|
-
"""Codex should be registered in factory."""
|
|
39
|
-
config = AgentFactory.get_config("codex")
|
|
40
|
-
assert config is not None
|
|
41
|
-
assert config.command == "npx"
|
|
42
|
-
assert "@zed-industries/codex-acp" in config.args
|
|
43
|
-
|
|
44
|
-
@pytest.mark.asyncio
|
|
45
|
-
async def test_should_spawn_codex_agent_successfully(
|
|
46
|
-
self, agent_handle: AgentHandle
|
|
47
|
-
) -> None:
|
|
48
|
-
"""Agent should spawn successfully."""
|
|
49
|
-
assert agent_handle is not None
|
|
50
|
-
assert agent_handle.capabilities is not None
|
|
51
|
-
|
|
52
|
-
@pytest.mark.asyncio
|
|
53
|
-
async def test_should_advertise_capabilities(
|
|
54
|
-
self, agent_handle: AgentHandle
|
|
55
|
-
) -> None:
|
|
56
|
-
"""Agent should advertise capabilities."""
|
|
57
|
-
print(f"Codex capabilities: {agent_handle.capabilities}")
|
|
58
|
-
assert agent_handle.capabilities is not None
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
class TestCodexSessionManagement:
|
|
62
|
-
"""Tests for session management."""
|
|
63
|
-
|
|
64
|
-
@pytest.mark.asyncio
|
|
65
|
-
async def test_should_create_a_new_session(
|
|
66
|
-
self, agent_handle: AgentHandle
|
|
67
|
-
) -> None:
|
|
68
|
-
"""Should create a new session."""
|
|
69
|
-
temp_dir = tempfile.mkdtemp(prefix="codex-session-")
|
|
70
|
-
try:
|
|
71
|
-
session = await agent_handle.create_session(temp_dir)
|
|
72
|
-
assert session is not None
|
|
73
|
-
assert session.id is not None
|
|
74
|
-
assert session.cwd == temp_dir
|
|
75
|
-
finally:
|
|
76
|
-
shutil.rmtree(temp_dir, ignore_errors=True)
|
|
77
|
-
|
|
78
|
-
@pytest.mark.asyncio
|
|
79
|
-
async def test_should_create_multiple_sessions(
|
|
80
|
-
self, agent_handle: AgentHandle
|
|
81
|
-
) -> None:
|
|
82
|
-
"""Should create multiple independent sessions."""
|
|
83
|
-
temp_dir = tempfile.mkdtemp(prefix="codex-multi-")
|
|
84
|
-
try:
|
|
85
|
-
session1 = await agent_handle.create_session(temp_dir)
|
|
86
|
-
session2 = await agent_handle.create_session(temp_dir)
|
|
87
|
-
|
|
88
|
-
assert session1.id is not None
|
|
89
|
-
assert session2.id is not None
|
|
90
|
-
assert session1.id != session2.id
|
|
91
|
-
finally:
|
|
92
|
-
shutil.rmtree(temp_dir, ignore_errors=True)
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
class TestCodexBasicPrompting:
|
|
96
|
-
"""Tests for basic prompting functionality."""
|
|
97
|
-
|
|
98
|
-
@pytest.mark.asyncio
|
|
99
|
-
async def test_should_respond_to_a_simple_prompt(
|
|
100
|
-
self, agent_handle: AgentHandle
|
|
101
|
-
) -> None:
|
|
102
|
-
"""Should respond to a simple prompt."""
|
|
103
|
-
temp_dir = tempfile.mkdtemp(prefix="codex-prompt-")
|
|
104
|
-
try:
|
|
105
|
-
session = await agent_handle.create_session(temp_dir)
|
|
106
|
-
updates: list[ExtendedSessionUpdate] = []
|
|
107
|
-
|
|
108
|
-
async for update in session.prompt(
|
|
109
|
-
"What is 2 + 2? Reply with just the number."
|
|
110
|
-
):
|
|
111
|
-
updates.append(update)
|
|
112
|
-
|
|
113
|
-
# Should have received some updates
|
|
114
|
-
assert len(updates) > 0
|
|
115
|
-
|
|
116
|
-
# Check for agent message chunks
|
|
117
|
-
message_chunks = [
|
|
118
|
-
u for u in updates if u.get("sessionUpdate") == "agent_message_chunk"
|
|
119
|
-
]
|
|
120
|
-
assert len(message_chunks) > 0
|
|
121
|
-
finally:
|
|
122
|
-
shutil.rmtree(temp_dir, ignore_errors=True)
|
|
123
|
-
|
|
124
|
-
@pytest.mark.asyncio
|
|
125
|
-
async def test_should_handle_multi_turn_conversation(
|
|
126
|
-
self, agent_handle: AgentHandle
|
|
127
|
-
) -> None:
|
|
128
|
-
"""Should handle multi-turn conversation with context."""
|
|
129
|
-
temp_dir = tempfile.mkdtemp(prefix="codex-multi-turn-")
|
|
130
|
-
try:
|
|
131
|
-
session = await agent_handle.create_session(temp_dir)
|
|
132
|
-
|
|
133
|
-
# First turn
|
|
134
|
-
updates1: list[ExtendedSessionUpdate] = []
|
|
135
|
-
async for update in session.prompt(
|
|
136
|
-
"Remember the word 'banana'. Just say 'I will remember banana'."
|
|
137
|
-
):
|
|
138
|
-
updates1.append(update)
|
|
139
|
-
assert len(updates1) > 0
|
|
140
|
-
|
|
141
|
-
# Second turn - recall
|
|
142
|
-
updates2: list[ExtendedSessionUpdate] = []
|
|
143
|
-
response_text = ""
|
|
144
|
-
async for update in session.prompt(
|
|
145
|
-
"What word did I ask you to remember? Just say the word."
|
|
146
|
-
):
|
|
147
|
-
updates2.append(update)
|
|
148
|
-
if update.get("sessionUpdate") == "agent_message_chunk":
|
|
149
|
-
content = update.get("content", {})
|
|
150
|
-
if isinstance(content, dict) and content.get("type") == "text":
|
|
151
|
-
response_text += content.get("text", "")
|
|
152
|
-
|
|
153
|
-
assert len(updates2) > 0
|
|
154
|
-
assert "banana" in response_text.lower()
|
|
155
|
-
finally:
|
|
156
|
-
shutil.rmtree(temp_dir, ignore_errors=True)
|
|
157
|
-
|
|
158
|
-
@pytest.mark.asyncio
|
|
159
|
-
async def test_should_handle_streaming_responses(
|
|
160
|
-
self, agent_handle: AgentHandle
|
|
161
|
-
) -> None:
|
|
162
|
-
"""Should handle streaming responses."""
|
|
163
|
-
temp_dir = tempfile.mkdtemp(prefix="codex-stream-")
|
|
164
|
-
try:
|
|
165
|
-
session = await agent_handle.create_session(temp_dir)
|
|
166
|
-
updates: list[ExtendedSessionUpdate] = []
|
|
167
|
-
text_content = ""
|
|
168
|
-
|
|
169
|
-
async for update in session.prompt(
|
|
170
|
-
"Count from 1 to 5, each number on a new line."
|
|
171
|
-
):
|
|
172
|
-
updates.append(update)
|
|
173
|
-
if update.get("sessionUpdate") == "agent_message_chunk":
|
|
174
|
-
content = update.get("content", {})
|
|
175
|
-
if isinstance(content, dict) and content.get("type") == "text":
|
|
176
|
-
text_content += content.get("text", "")
|
|
177
|
-
|
|
178
|
-
# Should have multiple streaming chunks
|
|
179
|
-
message_chunks = [
|
|
180
|
-
u for u in updates if u.get("sessionUpdate") == "agent_message_chunk"
|
|
181
|
-
]
|
|
182
|
-
assert len(message_chunks) > 0
|
|
183
|
-
|
|
184
|
-
# Content should include numbers
|
|
185
|
-
assert any(str(n) in text_content for n in range(1, 6))
|
|
186
|
-
finally:
|
|
187
|
-
shutil.rmtree(temp_dir, ignore_errors=True)
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
class TestCodexSessionProperties:
|
|
191
|
-
"""Tests for session properties."""
|
|
192
|
-
|
|
193
|
-
@pytest.mark.asyncio
|
|
194
|
-
async def test_should_have_modes_property(
|
|
195
|
-
self, agent_handle: AgentHandle
|
|
196
|
-
) -> None:
|
|
197
|
-
"""Session should have modes property."""
|
|
198
|
-
temp_dir = tempfile.mkdtemp(prefix="codex-modes-")
|
|
199
|
-
try:
|
|
200
|
-
session = await agent_handle.create_session(temp_dir)
|
|
201
|
-
print(f"Codex session modes: {session.modes}")
|
|
202
|
-
assert session.modes is not None
|
|
203
|
-
finally:
|
|
204
|
-
shutil.rmtree(temp_dir, ignore_errors=True)
|
|
205
|
-
|
|
206
|
-
@pytest.mark.asyncio
|
|
207
|
-
async def test_should_have_models_property(
|
|
208
|
-
self, agent_handle: AgentHandle
|
|
209
|
-
) -> None:
|
|
210
|
-
"""Session should have models property."""
|
|
211
|
-
temp_dir = tempfile.mkdtemp(prefix="codex-models-")
|
|
212
|
-
try:
|
|
213
|
-
session = await agent_handle.create_session(temp_dir)
|
|
214
|
-
print(f"Codex session models: {session.models}")
|
|
215
|
-
assert session.models is not None
|
|
216
|
-
finally:
|
|
217
|
-
shutil.rmtree(temp_dir, ignore_errors=True)
|
|
218
|
-
|
|
219
|
-
@pytest.mark.asyncio
|
|
220
|
-
async def test_should_track_is_processing_state(
|
|
221
|
-
self, agent_handle: AgentHandle
|
|
222
|
-
) -> None:
|
|
223
|
-
"""Session should track isProcessing state."""
|
|
224
|
-
temp_dir = tempfile.mkdtemp(prefix="codex-processing-")
|
|
225
|
-
try:
|
|
226
|
-
session = await agent_handle.create_session(temp_dir)
|
|
227
|
-
|
|
228
|
-
# Initially not processing
|
|
229
|
-
assert session.is_processing is False
|
|
230
|
-
|
|
231
|
-
# Start a prompt and consume it
|
|
232
|
-
async for _ in session.prompt("Say hello"):
|
|
233
|
-
pass
|
|
234
|
-
|
|
235
|
-
# After completion, should not be processing
|
|
236
|
-
assert session.is_processing is False
|
|
237
|
-
finally:
|
|
238
|
-
shutil.rmtree(temp_dir, ignore_errors=True)
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
class TestCodexCapabilities:
|
|
242
|
-
"""Tests for agent capabilities."""
|
|
243
|
-
|
|
244
|
-
@pytest.mark.asyncio
|
|
245
|
-
async def test_should_check_load_session_capability(
|
|
246
|
-
self, agent_handle: AgentHandle
|
|
247
|
-
) -> None:
|
|
248
|
-
"""Should check loadSession capability."""
|
|
249
|
-
load_session = agent_handle.capabilities.get("loadSession")
|
|
250
|
-
print(f"Codex loadSession capability: {load_session}")
|
|
251
|
-
assert isinstance(load_session, bool)
|
|
252
|
-
|
|
253
|
-
@pytest.mark.asyncio
|
|
254
|
-
async def test_should_check_fork_capability(
|
|
255
|
-
self, agent_handle: AgentHandle
|
|
256
|
-
) -> None:
|
|
257
|
-
"""Should check fork capability."""
|
|
258
|
-
session_caps = agent_handle.capabilities.get("sessionCapabilities", {})
|
|
259
|
-
print(f"Codex fork capability: {session_caps.get('fork')}")
|
|
260
|
-
assert agent_handle.capabilities is not None
|
|
261
|
-
|
|
262
|
-
@pytest.mark.asyncio
|
|
263
|
-
async def test_should_load_session_if_capability_is_supported(
|
|
264
|
-
self, agent_handle: AgentHandle
|
|
265
|
-
) -> None:
|
|
266
|
-
"""Should load session if capability is supported."""
|
|
267
|
-
if not agent_handle.capabilities.get("loadSession"):
|
|
268
|
-
pytest.skip("Codex does not support loadSession")
|
|
269
|
-
|
|
270
|
-
temp_dir = tempfile.mkdtemp(prefix="codex-load-")
|
|
271
|
-
try:
|
|
272
|
-
# Create a session first
|
|
273
|
-
original_session = await agent_handle.create_session(temp_dir)
|
|
274
|
-
session_id = original_session.id
|
|
275
|
-
|
|
276
|
-
# Try to load/resume the session
|
|
277
|
-
loaded_session = await agent_handle.load_session(session_id, temp_dir)
|
|
278
|
-
|
|
279
|
-
assert loaded_session.id == session_id
|
|
280
|
-
assert loaded_session.cwd == temp_dir
|
|
281
|
-
finally:
|
|
282
|
-
shutil.rmtree(temp_dir, ignore_errors=True)
|
|
283
|
-
|
|
284
|
-
@pytest.mark.asyncio
|
|
285
|
-
async def test_should_fork_session_if_capability_is_supported(
|
|
286
|
-
self, agent_handle: AgentHandle
|
|
287
|
-
) -> None:
|
|
288
|
-
"""Should fork session if capability is supported."""
|
|
289
|
-
session_caps = agent_handle.capabilities.get("sessionCapabilities", {})
|
|
290
|
-
if not session_caps.get("fork"):
|
|
291
|
-
pytest.skip("Codex does not support forking")
|
|
292
|
-
|
|
293
|
-
temp_dir = tempfile.mkdtemp(prefix="codex-fork-")
|
|
294
|
-
try:
|
|
295
|
-
session = await agent_handle.create_session(temp_dir)
|
|
296
|
-
|
|
297
|
-
# Send a prompt to establish history
|
|
298
|
-
async for _ in session.prompt("Say 'Hello from original'."):
|
|
299
|
-
pass
|
|
300
|
-
|
|
301
|
-
# Fork the session
|
|
302
|
-
forked_session = await session.fork()
|
|
303
|
-
|
|
304
|
-
assert forked_session.id is not None
|
|
305
|
-
assert forked_session.id != session.id
|
|
306
|
-
assert forked_session.cwd == temp_dir
|
|
307
|
-
finally:
|
|
308
|
-
shutil.rmtree(temp_dir, ignore_errors=True)
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
class TestCodexErrorHandling:
|
|
312
|
-
"""Tests for error handling."""
|
|
313
|
-
|
|
314
|
-
@pytest.mark.asyncio
|
|
315
|
-
async def test_should_handle_empty_prompts_gracefully(
|
|
316
|
-
self, agent_handle: AgentHandle
|
|
317
|
-
) -> None:
|
|
318
|
-
"""Should handle empty prompts gracefully."""
|
|
319
|
-
temp_dir = tempfile.mkdtemp(prefix="codex-empty-")
|
|
320
|
-
try:
|
|
321
|
-
session = await agent_handle.create_session(temp_dir)
|
|
322
|
-
|
|
323
|
-
updates: list[ExtendedSessionUpdate] = []
|
|
324
|
-
async for update in session.prompt(""):
|
|
325
|
-
updates.append(update)
|
|
326
|
-
|
|
327
|
-
# Should complete without throwing
|
|
328
|
-
assert isinstance(updates, list)
|
|
329
|
-
finally:
|
|
330
|
-
shutil.rmtree(temp_dir, ignore_errors=True)
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
class TestCodexVsClaudeCodeComparison:
|
|
334
|
-
"""Tests comparing Codex vs Claude Code."""
|
|
335
|
-
|
|
336
|
-
def test_should_have_both_agents_registered(self) -> None:
|
|
337
|
-
"""Both agents should be registered."""
|
|
338
|
-
agents = AgentFactory.list_agents()
|
|
339
|
-
|
|
340
|
-
assert "claude-code" in agents
|
|
341
|
-
assert "codex" in agents
|
|
342
|
-
|
|
343
|
-
@pytest.mark.asyncio
|
|
344
|
-
async def test_should_spawn_codex_agent_successfully(self) -> None:
|
|
345
|
-
"""Should spawn codex agent successfully."""
|
|
346
|
-
handle = await AgentFactory.spawn("codex")
|
|
347
|
-
assert handle is not None
|
|
348
|
-
assert handle.capabilities is not None
|
|
349
|
-
await handle.close()
|
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
"""
|
|
2
|
-
E2E tests for Gemini CLI agent integration.
|
|
3
|
-
|
|
4
|
-
Run with: RUN_E2E_TESTS=true pytest tests/e2e/test_gemini_e2e.py -v
|
|
5
|
-
"""
|
|
6
|
-
|
|
7
|
-
import os
|
|
8
|
-
import shutil
|
|
9
|
-
import tempfile
|
|
10
|
-
|
|
11
|
-
import pytest
|
|
12
|
-
|
|
13
|
-
from acp_factory import AgentFactory, ExtendedSessionUpdate
|
|
14
|
-
|
|
15
|
-
# Skip all tests if RUN_E2E_TESTS is not set
|
|
16
|
-
pytestmark = pytest.mark.skipif(
|
|
17
|
-
os.environ.get("RUN_E2E_TESTS") != "true",
|
|
18
|
-
reason="E2E tests require RUN_E2E_TESTS=true",
|
|
19
|
-
)
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
class TestGeminiAgent:
|
|
23
|
-
"""E2E tests for Gemini agent."""
|
|
24
|
-
|
|
25
|
-
def test_should_have_gemini_registered_in_factory(self) -> None:
|
|
26
|
-
"""Gemini should be registered in factory."""
|
|
27
|
-
config = AgentFactory.get_config("gemini")
|
|
28
|
-
assert config is not None
|
|
29
|
-
assert config.command == "npx"
|
|
30
|
-
assert "@google/gemini-cli" in config.args
|
|
31
|
-
assert "--experimental-acp" in config.args
|
|
32
|
-
|
|
33
|
-
@pytest.mark.asyncio
|
|
34
|
-
async def test_should_spawn_and_create_session(self) -> None:
|
|
35
|
-
"""Should spawn agent and create session."""
|
|
36
|
-
handle = await AgentFactory.spawn("gemini")
|
|
37
|
-
try:
|
|
38
|
-
assert handle is not None
|
|
39
|
-
assert handle.capabilities is not None
|
|
40
|
-
print(f"Gemini capabilities: {handle.capabilities}")
|
|
41
|
-
|
|
42
|
-
temp_dir = tempfile.mkdtemp(prefix="gemini-e2e-")
|
|
43
|
-
try:
|
|
44
|
-
session = await handle.create_session(temp_dir)
|
|
45
|
-
assert session is not None
|
|
46
|
-
assert session.id is not None
|
|
47
|
-
assert session.cwd == temp_dir
|
|
48
|
-
print(f"Session ID: {session.id}")
|
|
49
|
-
print(f"Modes: {session.modes}")
|
|
50
|
-
print(f"Models: {session.models}")
|
|
51
|
-
finally:
|
|
52
|
-
shutil.rmtree(temp_dir, ignore_errors=True)
|
|
53
|
-
finally:
|
|
54
|
-
await handle.close()
|
|
55
|
-
|
|
56
|
-
@pytest.mark.asyncio
|
|
57
|
-
async def test_should_respond_to_simple_prompt(self) -> None:
|
|
58
|
-
"""Should respond to a simple prompt."""
|
|
59
|
-
handle = await AgentFactory.spawn("gemini")
|
|
60
|
-
try:
|
|
61
|
-
temp_dir = tempfile.mkdtemp(prefix="gemini-prompt-")
|
|
62
|
-
try:
|
|
63
|
-
session = await handle.create_session(temp_dir)
|
|
64
|
-
updates: list[ExtendedSessionUpdate] = []
|
|
65
|
-
|
|
66
|
-
async for update in session.prompt(
|
|
67
|
-
"What is 2 + 2? Reply with just the number."
|
|
68
|
-
):
|
|
69
|
-
updates.append(update)
|
|
70
|
-
|
|
71
|
-
# Should have received some updates
|
|
72
|
-
assert len(updates) > 0
|
|
73
|
-
print(f"Received {len(updates)} updates")
|
|
74
|
-
|
|
75
|
-
# Check for agent message chunks (handle both dict and pydantic model)
|
|
76
|
-
message_chunks = [
|
|
77
|
-
u for u in updates
|
|
78
|
-
if (hasattr(u, "session_update") and u.session_update == "agent_message_chunk")
|
|
79
|
-
or (isinstance(u, dict) and u.get("sessionUpdate") == "agent_message_chunk")
|
|
80
|
-
]
|
|
81
|
-
assert len(message_chunks) > 0
|
|
82
|
-
print(f"Got {len(message_chunks)} message chunks")
|
|
83
|
-
finally:
|
|
84
|
-
shutil.rmtree(temp_dir, ignore_errors=True)
|
|
85
|
-
finally:
|
|
86
|
-
await handle.close()
|
|
87
|
-
|
|
88
|
-
@pytest.mark.asyncio
|
|
89
|
-
async def test_should_handle_streaming_responses(self) -> None:
|
|
90
|
-
"""Should handle streaming responses."""
|
|
91
|
-
handle = await AgentFactory.spawn("gemini")
|
|
92
|
-
try:
|
|
93
|
-
temp_dir = tempfile.mkdtemp(prefix="gemini-stream-")
|
|
94
|
-
try:
|
|
95
|
-
session = await handle.create_session(temp_dir)
|
|
96
|
-
updates: list[ExtendedSessionUpdate] = []
|
|
97
|
-
text_content = ""
|
|
98
|
-
|
|
99
|
-
async for update in session.prompt(
|
|
100
|
-
"Count from 1 to 5, each number on a new line."
|
|
101
|
-
):
|
|
102
|
-
updates.append(update)
|
|
103
|
-
# Handle pydantic model
|
|
104
|
-
if hasattr(update, "session_update"):
|
|
105
|
-
if update.session_update == "agent_message_chunk":
|
|
106
|
-
content = getattr(update, "content", None)
|
|
107
|
-
if content and hasattr(content, "type") and content.type == "text":
|
|
108
|
-
text_content += getattr(content, "text", "")
|
|
109
|
-
# Handle dict
|
|
110
|
-
elif isinstance(update, dict) and update.get("sessionUpdate") == "agent_message_chunk":
|
|
111
|
-
content = update.get("content", {})
|
|
112
|
-
if isinstance(content, dict) and content.get("type") == "text":
|
|
113
|
-
text_content += content.get("text", "")
|
|
114
|
-
|
|
115
|
-
# Should have streaming chunks
|
|
116
|
-
message_chunks = [
|
|
117
|
-
u for u in updates
|
|
118
|
-
if (hasattr(u, "session_update") and u.session_update == "agent_message_chunk")
|
|
119
|
-
or (isinstance(u, dict) and u.get("sessionUpdate") == "agent_message_chunk")
|
|
120
|
-
]
|
|
121
|
-
assert len(message_chunks) > 0
|
|
122
|
-
|
|
123
|
-
# Content should include numbers
|
|
124
|
-
assert any(str(n) in text_content for n in range(1, 6))
|
|
125
|
-
print(f"Response text: {text_content[:200]}")
|
|
126
|
-
finally:
|
|
127
|
-
shutil.rmtree(temp_dir, ignore_errors=True)
|
|
128
|
-
finally:
|
|
129
|
-
await handle.close()
|
|
130
|
-
|
|
131
|
-
@pytest.mark.asyncio
|
|
132
|
-
async def test_should_track_is_processing_state(self) -> None:
|
|
133
|
-
"""Session should track isProcessing state."""
|
|
134
|
-
handle = await AgentFactory.spawn("gemini")
|
|
135
|
-
try:
|
|
136
|
-
temp_dir = tempfile.mkdtemp(prefix="gemini-processing-")
|
|
137
|
-
try:
|
|
138
|
-
session = await handle.create_session(temp_dir)
|
|
139
|
-
|
|
140
|
-
# Initially not processing
|
|
141
|
-
assert session.is_processing is False
|
|
142
|
-
|
|
143
|
-
# Start a prompt and consume it
|
|
144
|
-
async for _ in session.prompt("Say hello"):
|
|
145
|
-
pass
|
|
146
|
-
|
|
147
|
-
# After completion, should not be processing
|
|
148
|
-
assert session.is_processing is False
|
|
149
|
-
finally:
|
|
150
|
-
shutil.rmtree(temp_dir, ignore_errors=True)
|
|
151
|
-
finally:
|
|
152
|
-
await handle.close()
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
class TestAllAgentsRegistration:
|
|
156
|
-
"""Tests for agent registration."""
|
|
157
|
-
|
|
158
|
-
def test_should_have_all_agents_registered(self) -> None:
|
|
159
|
-
"""All agents should be registered."""
|
|
160
|
-
agents = AgentFactory.list_agents()
|
|
161
|
-
|
|
162
|
-
assert "claude-code" in agents
|
|
163
|
-
assert "codex" in agents
|
|
164
|
-
assert "gemini" in agents
|
|
165
|
-
assert "opencode" in agents
|