@selesai/code 0.13.39 → 0.14.0
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/CHANGELOG.md +3 -0
- package/dist/bun/runtime-setup.js +4 -1
- package/dist/cli/args.d.ts +3 -1
- package/dist/cli/args.js +76 -33
- package/dist/cli/auth-check.d.ts +18 -0
- package/dist/cli/auth-check.js +49 -0
- package/dist/cli/credential-print.d.ts +5 -15
- package/dist/cli/credential-print.js +42 -82
- package/dist/cli/file-processor.d.ts +1 -1
- package/dist/cli/file-processor.js +2 -1
- package/dist/cli/list-models.d.ts +1 -1
- package/dist/cli/list-models.js +2 -2
- package/dist/cli/startup-ui.js +38 -30
- package/dist/config.d.ts +35 -6
- package/dist/config.js +95 -17
- package/dist/core/agent-session-custom-tools.test.js +64 -0
- package/dist/core/agent-session-length-continuation.test.js +7 -3
- package/dist/core/agent-session-runtime.js +2 -2
- package/dist/core/agent-session-services.d.ts +1 -0
- package/dist/core/agent-session-services.js +14 -0
- package/dist/core/agent-session.d.ts +180 -40
- package/dist/core/agent-session.js +1061 -485
- package/dist/core/auth-storage.d.ts +25 -15
- package/dist/core/auth-storage.js +242 -66
- package/dist/core/bash-executor.js +42 -52
- package/dist/core/bug-report.js +1 -1
- package/dist/core/cache-warmer.d.ts +1 -0
- package/dist/core/cache-warmer.js +15 -1
- package/dist/core/compaction/branch-summarization.js +3 -0
- package/dist/core/compaction/compaction.d.ts +3 -1
- package/dist/core/compaction/compaction.js +156 -79
- package/dist/core/compaction/utils.d.ts +2 -1
- package/dist/core/compaction/utils.js +25 -18
- package/dist/core/crash-log.d.ts +5 -0
- package/dist/core/crash-log.js +69 -0
- package/dist/core/defaults.d.ts +1 -1
- package/dist/core/defaults.js +1 -1
- package/dist/core/export-html/template.css +10 -0
- package/dist/core/export-html/template.js +72 -18
- package/dist/core/export-html/tool-renderer.d.ts +3 -3
- package/dist/core/export-html/tool-renderer.js +5 -3
- package/dist/core/extensions/index.d.ts +2 -2
- package/dist/core/extensions/index.js +1 -1
- package/dist/core/extensions/loader.js +138 -55
- package/dist/core/extensions/runner.d.ts +38 -5
- package/dist/core/extensions/runner.js +220 -7
- package/dist/core/extensions/types.d.ts +438 -51
- package/dist/core/extensions/types.js +3 -0
- package/dist/core/extensions/virtual-modules.js +6 -0
- package/dist/core/extensions/wrapper.d.ts +2 -2
- package/dist/core/extensions/wrapper.js +3 -3
- package/dist/core/footer-data-provider.d.ts +1 -1
- package/dist/core/footer-data-provider.js +1 -1
- package/dist/core/handoff.d.ts +0 -1
- package/dist/core/handoff.js +0 -1
- package/dist/core/http-dispatcher.js +5 -0
- package/dist/core/index.d.ts +1 -1
- package/dist/core/intercom-rpc.d.ts +135 -0
- package/dist/core/intercom-rpc.js +64 -0
- package/dist/core/keybindings.d.ts +25 -24
- package/dist/core/keybindings.js +27 -6
- package/dist/core/mcp-servers.d.ts +134 -0
- package/dist/core/mcp-servers.js +223 -0
- package/dist/core/model-config.d.ts +122 -5
- package/dist/core/model-config.js +35 -1
- package/dist/core/model-registry.d.ts +23 -15
- package/dist/core/model-registry.js +46 -22
- package/dist/core/model-resolver.d.ts +6 -5
- package/dist/core/model-resolver.js +51 -21
- package/dist/core/model-runtime.d.ts +73 -14
- package/dist/core/model-runtime.js +398 -104
- package/dist/core/models-store.d.ts +12 -7
- package/dist/core/models-store.js +85 -15
- package/dist/core/nested-tool-calls.d.ts +102 -0
- package/dist/core/nested-tool-calls.js +178 -0
- package/dist/core/package-manager.d.ts +8 -1
- package/dist/core/package-manager.js +144 -61
- package/dist/core/package-manager.test.js +5 -5
- package/dist/core/pi-manifest.d.ts +9 -0
- package/dist/core/pi-manifest.js +25 -0
- package/dist/core/prompt-templates.d.ts +6 -1
- package/dist/core/prompt-templates.js +61 -35
- package/dist/core/provider-composer.d.ts +44 -19
- package/dist/core/provider-composer.js +166 -64
- package/dist/core/radius.d.ts +2 -0
- package/dist/core/radius.js +2 -0
- package/dist/core/release-rpc.d.ts +137 -0
- package/dist/core/release-rpc.js +77 -0
- package/dist/core/remote-catalog-provider.d.ts +8 -1
- package/dist/core/remote-catalog-provider.js +25 -13
- package/dist/core/resource-loader.d.ts +12 -1
- package/dist/core/resource-loader.js +180 -45
- package/dist/core/runtime-credentials.d.ts +5 -5
- package/dist/core/runtime-credentials.js +11 -8
- package/dist/core/sdk.d.ts +16 -7
- package/dist/core/sdk.js +57 -24
- package/dist/core/session-manager.d.ts +45 -9
- package/dist/core/session-manager.js +124 -31
- package/dist/core/settings-diagnostics.d.ts +8 -0
- package/dist/core/settings-diagnostics.js +20 -0
- package/dist/core/settings-manager.d.ts +62 -32
- package/dist/core/settings-manager.js +147 -69
- package/dist/core/skills.d.ts +5 -2
- package/dist/core/skills.js +58 -35
- package/dist/core/slash-commands.js +2 -1
- package/dist/core/source-info.d.ts +8 -0
- package/dist/core/source-info.js +16 -0
- package/dist/core/subagent-rpc.d.ts +110 -0
- package/dist/core/subagent-rpc.js +60 -0
- package/dist/core/system-prompt.d.ts +9 -3
- package/dist/core/system-prompt.js +9 -12
- package/dist/core/system-prompt.test.js +2 -7
- package/dist/core/tools/bash.d.ts +12 -0
- package/dist/core/tools/bash.js +33 -2
- package/dist/core/tools/edit-diff.d.ts +0 -5
- package/dist/core/tools/edit-diff.js +2 -5
- package/dist/core/tools/edit.d.ts +4 -0
- package/dist/core/tools/edit.js +31 -11
- package/dist/core/tools/find.d.ts +7 -0
- package/dist/core/tools/find.js +16 -19
- package/dist/core/tools/grep.d.ts +4 -0
- package/dist/core/tools/grep.js +5 -1
- package/dist/core/tools/index.d.ts +1 -1
- package/dist/core/tools/index.js +11 -2
- package/dist/core/tools/ls.d.ts +4 -0
- package/dist/core/tools/ls.js +5 -1
- package/dist/core/tools/output-accumulator.d.ts +11 -0
- package/dist/core/tools/output-accumulator.js +40 -10
- package/dist/core/tools/read.d.ts +17 -2
- package/dist/core/tools/read.js +23 -2
- package/dist/core/tools/render-utils.d.ts +6 -0
- package/dist/core/tools/render-utils.js +26 -0
- package/dist/core/tools/renderers/bash.js +19 -35
- package/dist/core/tools/renderers/edit.js +5 -4
- package/dist/core/tools/renderers/index.d.ts +2 -2
- package/dist/core/tools/renderers/read.js +3 -2
- package/dist/core/tools/tool-definition-wrapper.d.ts +5 -3
- package/dist/core/tools/tool-definition-wrapper.js +3 -1
- package/dist/core/tools/truncate.d.ts +14 -0
- package/dist/core/tools/truncate.js +29 -0
- package/dist/core/tools/write.d.ts +4 -0
- package/dist/core/tools/write.js +6 -2
- package/dist/core/trust-manager.js +3 -1
- package/dist/core/usage-totals.d.ts +2 -0
- package/dist/core/usage-totals.js +23 -0
- package/dist/core/virtual-models.d.ts +116 -0
- package/dist/core/virtual-models.js +123 -0
- package/dist/defaults/models.json +32 -0
- package/dist/defaults/settings.json +1 -9
- package/dist/extensions/agent-browser.ts +9 -0
- package/dist/extensions/codemode/execute.d.ts +15 -0
- package/dist/extensions/codemode/execute.js +633 -0
- package/dist/extensions/codemode/execute.lazy.d.ts +2 -0
- package/dist/extensions/codemode/execute.lazy.js +2 -0
- package/dist/extensions/codemode/index.d.ts +20 -0
- package/dist/extensions/codemode/index.js +31 -0
- package/dist/extensions/codemode/renderer.d.ts +11 -0
- package/dist/extensions/codemode/renderer.js +136 -0
- package/dist/extensions/codemode/tool.d.ts +129 -0
- package/dist/extensions/codemode/tool.js +275 -0
- package/dist/extensions/context-compaction-reminder.ts +1 -1
- package/dist/extensions/grep-app/index.ts +2 -10
- package/dist/extensions/herdr-agent-state.ts +1 -1
- package/dist/extensions/{pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/index.d.ts → index.d.ts} +0 -1
- package/dist/extensions/index.js +12 -0
- package/dist/extensions/jev/classifier-context.ts +54 -0
- package/dist/extensions/jev/classifier.test.ts +85 -0
- package/dist/extensions/jev/classifier.ts +105 -0
- package/dist/extensions/jev/decisions.test.ts +35 -47
- package/dist/extensions/jev/decisions.ts +58 -104
- package/dist/extensions/jev/test-support.ts +33 -38
- package/dist/extensions/jev-advisory-lifecycle.test.ts +12 -12
- package/dist/extensions/jev-advisory-memory.test.ts +9 -9
- package/dist/extensions/jev-advisory-recommendations.test.ts +8 -8
- package/dist/extensions/jev-ask-tool.test.ts +41 -45
- package/dist/extensions/jev-ask-tool.ts +10 -38
- package/dist/extensions/jev-find-source.test.ts +26 -0
- package/dist/extensions/jev-find-source.ts +58 -19
- package/dist/{core → extensions}/llama/client.d.ts +2 -0
- package/dist/{core → extensions}/llama/client.js +7 -3
- package/dist/{core → extensions}/llama/index.js +13 -2
- package/dist/{core → extensions}/llama/provider.d.ts +1 -1
- package/dist/extensions/llama/provider.js +235 -0
- package/dist/extensions/mcp/cli.d.ts +20 -0
- package/dist/extensions/mcp/cli.js +496 -0
- package/dist/extensions/mcp/cli.lazy.d.ts +2 -0
- package/dist/extensions/mcp/cli.lazy.js +2 -0
- package/dist/extensions/mcp/config.d.ts +83 -0
- package/dist/extensions/mcp/config.js +193 -0
- package/dist/extensions/mcp/index.d.ts +78 -0
- package/dist/extensions/mcp/index.js +1201 -0
- package/dist/extensions/mcp/log.d.ts +15 -0
- package/dist/extensions/mcp/log.js +65 -0
- package/dist/extensions/mcp/oauth.d.ts +97 -0
- package/dist/extensions/mcp/oauth.js +401 -0
- package/dist/extensions/mcp/resources.d.ts +41 -0
- package/dist/extensions/mcp/resources.js +260 -0
- package/dist/extensions/mcp/runtime.d.ts +96 -0
- package/dist/extensions/mcp/runtime.js +412 -0
- package/dist/extensions/mcp/runtime.lazy.d.ts +2 -0
- package/dist/extensions/mcp/runtime.lazy.js +2 -0
- package/dist/extensions/mcp/tools.d.ts +86 -0
- package/dist/extensions/mcp/tools.js +252 -0
- package/dist/extensions/mcp/ui.d.ts +59 -0
- package/dist/extensions/mcp/ui.js +185 -0
- package/dist/extensions/package.json +1 -1
- package/dist/extensions/pi-graft/tools.ts +6 -0
- package/dist/extensions/pi-hermes-memory/CHANGELOG.md +25 -0
- package/dist/extensions/pi-hermes-memory/README.md +140 -4
- package/dist/extensions/pi-hermes-memory/package-lock.json +624 -2720
- package/dist/extensions/pi-hermes-memory/package.json +9 -7
- package/dist/extensions/pi-hermes-memory/scripts/benchmark-memory-startup.mjs +72 -0
- package/dist/extensions/pi-hermes-memory/scripts/check-production-install.mjs +107 -0
- package/dist/extensions/pi-hermes-memory/src/auto-consolidation-warning.ts +2 -1
- package/dist/extensions/pi-hermes-memory/src/config.ts +35 -0
- package/dist/extensions/pi-hermes-memory/src/constants.ts +62 -15
- package/dist/extensions/pi-hermes-memory/src/handlers/auto-consolidate.ts +374 -50
- package/dist/extensions/pi-hermes-memory/src/handlers/background-review.ts +7 -4
- package/dist/extensions/pi-hermes-memory/src/handlers/correction-detector.ts +19 -14
- package/dist/extensions/pi-hermes-memory/src/handlers/insights.ts +75 -1
- package/dist/extensions/pi-hermes-memory/src/handlers/review-memory-ops.ts +322 -22
- package/dist/extensions/pi-hermes-memory/src/handlers/session-backfill.ts +8 -0
- package/dist/extensions/pi-hermes-memory/src/handlers/session-flush.ts +193 -54
- package/dist/extensions/pi-hermes-memory/src/handlers/skills-command.ts +6 -2
- package/dist/extensions/pi-hermes-memory/src/handlers/sync-markdown-memories.ts +33 -5
- package/dist/extensions/pi-hermes-memory/src/index.ts +116 -47
- package/dist/extensions/pi-hermes-memory/src/memory-initialization.ts +101 -0
- package/dist/extensions/pi-hermes-memory/src/store/atomic-lock-coordinator.ts +10 -2
- package/dist/extensions/pi-hermes-memory/src/store/db.ts +34 -9
- package/dist/extensions/pi-hermes-memory/src/store/memory-store.ts +44 -8
- package/dist/extensions/pi-hermes-memory/src/store/schema.ts +3 -1
- package/dist/extensions/pi-hermes-memory/src/store/sqlite-memory-store.ts +141 -0
- package/dist/extensions/pi-hermes-memory/src/store/standing-instructions.ts +17 -6
- package/dist/extensions/pi-hermes-memory/src/tools/memory-search-tool.ts +20 -10
- package/dist/extensions/pi-hermes-memory/src/tools/memory-tool.ts +1 -17
- package/dist/extensions/pi-hermes-memory/src/tools/session-search-tool.ts +2 -10
- package/dist/extensions/pi-hermes-memory/src/tools/skill-tool.ts +4 -8
- package/dist/extensions/pi-hermes-memory/src/types.ts +48 -0
- package/dist/extensions/pi-hermes-memory/tests/config.test.ts +108 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/auto-consolidate.test.ts +1185 -42
- package/dist/extensions/pi-hermes-memory/tests/handlers/insights.test.ts +57 -1
- package/dist/extensions/pi-hermes-memory/tests/handlers/lazy-memory-hooks.test.ts +128 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/review-memory-ops.test.ts +844 -1
- package/dist/extensions/pi-hermes-memory/tests/handlers/session-backfill.test.ts +16 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/session-flush.test.ts +512 -3
- package/dist/extensions/pi-hermes-memory/tests/handlers/skills-command.test.ts +38 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/sync-markdown-memories.test.ts +183 -2
- package/dist/extensions/pi-hermes-memory/tests/handlers/system-prompt.test.ts +1 -3
- package/dist/extensions/pi-hermes-memory/tests/index.test.ts +17 -0
- package/dist/extensions/pi-hermes-memory/tests/integration/corruption-recovery-integration.test.ts +21 -0
- package/dist/extensions/pi-hermes-memory/tests/lazy-startup.test.ts +313 -0
- package/dist/extensions/pi-hermes-memory/tests/memory-initialization.test.ts +182 -0
- package/dist/extensions/pi-hermes-memory/tests/prompt-injection.test.ts +184 -0
- package/dist/extensions/pi-hermes-memory/tests/skill-discovery-contract.test.ts +60 -0
- package/dist/extensions/pi-hermes-memory/tests/store/atomic-lock-lazy-probe.test.ts +80 -0
- package/dist/extensions/pi-hermes-memory/tests/store/db.test.ts +2 -0
- package/dist/extensions/pi-hermes-memory/tests/store/memory-store.test.ts +79 -0
- package/dist/extensions/pi-hermes-memory/tests/store/sqlite-memory-store.test.ts +268 -0
- package/dist/extensions/pi-hermes-memory/tests/store/standing-instructions.test.ts +29 -0
- package/dist/extensions/pi-hermes-memory/tests/store/usage-tracking.test.ts +170 -0
- package/dist/extensions/pi-hermes-memory/tests/tools/memory-search-tool.test.ts +80 -1
- package/dist/extensions/pi-hermes-memory/tests/tools/skill-tool.test.ts +51 -0
- package/dist/extensions/pi-intercom/CHANGELOG.md +66 -0
- package/dist/extensions/pi-intercom/README.md +115 -12
- package/dist/extensions/pi-intercom/broker/broker.ts +304 -24
- package/dist/extensions/pi-intercom/broker/client.ts +9 -2
- package/dist/extensions/pi-intercom/broker/cross-machine-provenance.test.ts +63 -0
- package/dist/extensions/pi-intercom/broker/mailbox-persistence.test.ts +523 -0
- package/dist/extensions/pi-intercom/broker/paths.test.ts +4 -4
- package/dist/extensions/pi-intercom/broker/paths.ts +4 -2
- package/dist/extensions/pi-intercom/broker/protocol.ts +64 -0
- package/dist/extensions/pi-intercom/broker/spawn.test.ts +58 -169
- package/dist/extensions/pi-intercom/broker/spawn.ts +40 -87
- package/dist/extensions/pi-intercom/cli.mjs +6 -0
- package/dist/extensions/pi-intercom/cli.test.ts +428 -0
- package/dist/extensions/pi-intercom/cli.ts +343 -0
- package/dist/extensions/pi-intercom/config.test.ts +61 -1
- package/dist/extensions/pi-intercom/config.ts +53 -2
- package/dist/extensions/pi-intercom/cross-machine-discovery.test.ts +218 -0
- package/dist/extensions/pi-intercom/cross-machine-discovery.ts +140 -0
- package/dist/extensions/pi-intercom/cross-machine-envelope.test.ts +106 -0
- package/dist/extensions/pi-intercom/cross-machine-envelope.ts +92 -0
- package/dist/extensions/pi-intercom/cross-machine-integration.test.ts +25 -0
- package/dist/extensions/pi-intercom/cross-machine-transport.test.ts +106 -0
- package/dist/extensions/pi-intercom/cross-machine-transport.ts +110 -0
- package/dist/extensions/pi-intercom/extension-api.ts +24 -0
- package/dist/extensions/pi-intercom/handover.test.ts +88 -0
- package/dist/extensions/pi-intercom/handover.ts +115 -0
- package/dist/extensions/pi-intercom/herdr-location.test.ts +173 -0
- package/dist/extensions/pi-intercom/herdr-location.ts +137 -0
- package/dist/extensions/pi-intercom/human-priority.pi.test.ts +489 -0
- package/dist/extensions/pi-intercom/index.ts +770 -172
- package/dist/extensions/pi-intercom/intercom.integration.test.ts +869 -21
- package/dist/extensions/pi-intercom/package.json +12 -2
- package/dist/extensions/pi-intercom/project-agent.ts +1 -1
- package/dist/extensions/pi-intercom/release-readiness.test.ts +116 -0
- package/dist/extensions/pi-intercom/release-readiness.ts +93 -0
- package/dist/extensions/pi-intercom/skills/pi-intercom/SKILL.md +26 -2
- package/dist/extensions/pi-intercom/test/handover-picker.test.ts +134 -0
- package/dist/extensions/pi-intercom/test/inline-message.test.ts +43 -0
- package/dist/extensions/pi-intercom/types.d.ts +247 -0
- package/dist/extensions/pi-intercom/types.js +2 -0
- package/dist/extensions/pi-intercom/types.ts +39 -1
- package/dist/extensions/pi-intercom/ui/handover-picker.ts +318 -0
- package/dist/extensions/pi-intercom/ui/inline-message.ts +10 -3
- package/dist/extensions/pi-intercom/ui/session-list.ts +28 -15
- package/dist/extensions/pi-subagents/.github/workflows/release.yml +5 -1
- package/dist/extensions/pi-subagents/.github/workflows/test.yml +188 -18
- package/dist/extensions/pi-subagents/CHANGELOG.md +514 -1
- package/dist/extensions/pi-subagents/README.md +7 -5
- package/dist/extensions/pi-subagents/VISION.md +6 -0
- package/dist/extensions/pi-subagents/agents/reviewer.md +7 -5
- package/dist/extensions/pi-subagents/agents/worker.md +1 -1
- package/dist/extensions/pi-subagents/docs/agents.md +75 -35
- package/dist/extensions/pi-subagents/docs/configuration.md +156 -25
- package/dist/extensions/pi-subagents/docs/extension-api.md +121 -29
- package/dist/extensions/pi-subagents/docs/missions.md +46 -14
- package/dist/extensions/pi-subagents/docs/models.md +22 -84
- package/dist/extensions/pi-subagents/docs/observability.md +57 -24
- package/dist/extensions/pi-subagents/docs/standalone-background.md +59 -0
- package/dist/extensions/pi-subagents/docs/tool-reference.md +167 -116
- package/dist/extensions/pi-subagents/docs/watchdog.md +41 -10
- package/dist/extensions/pi-subagents/docs/workflows.md +239 -163
- package/dist/extensions/pi-subagents/examples/typed-gate/.pi/agents/classifier.md +14 -0
- package/dist/extensions/pi-subagents/examples/typed-gate/README.md +42 -0
- package/dist/extensions/pi-subagents/examples/typed-gate/classify +38 -0
- package/dist/extensions/pi-subagents/examples/typed-gate/workflow.js +32 -0
- package/dist/extensions/pi-subagents/index.ts +11 -3
- package/dist/extensions/pi-subagents/inspector-runner.mjs +3 -3
- package/dist/extensions/pi-subagents/package-lock.json +517 -1129
- package/dist/extensions/pi-subagents/package.json +22 -11
- package/dist/extensions/pi-subagents/prompts/council.md +7 -4
- package/dist/extensions/pi-subagents/prompts/parallel-review.md +2 -2
- package/dist/extensions/pi-subagents/prompts/review-loop.md +2 -2
- package/dist/extensions/pi-subagents/runner-peer-loader.mjs +21 -0
- package/dist/extensions/pi-subagents/runner-peer-preload.mjs +30 -0
- package/dist/extensions/pi-subagents/scripts/build-package.mjs +79 -0
- package/dist/extensions/pi-subagents/skills/council-mode/SKILL.md +2 -2
- package/dist/extensions/pi-subagents/skills/pi-subagents/SKILL.md +46 -27
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/constraints-and-recipes.md +11 -7
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/execution-controls.md +78 -73
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/management-authoring-rpc.md +4 -5
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/multi-lane-orchestration.md +10 -2
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/prompting-and-roles.md +69 -67
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/review-and-validation.md +3 -3
- package/dist/extensions/pi-subagents/src/agents/advertised-agent-prompt.ts +21 -10
- package/dist/extensions/pi-subagents/src/agents/agent-management.ts +113 -113
- package/dist/extensions/pi-subagents/src/agents/agent-memory.ts +91 -4
- package/dist/extensions/pi-subagents/src/agents/agent-serializer.ts +15 -9
- package/dist/extensions/pi-subagents/src/agents/agents.ts +432 -193
- package/dist/extensions/pi-subagents/src/agents/chain-serializer.ts +6 -1
- package/dist/extensions/pi-subagents/src/agents/global-npm-root.ts +58 -0
- package/dist/extensions/pi-subagents/src/agents/proactive-skills.ts +5 -2
- package/dist/extensions/pi-subagents/src/agents/runtime-agent-registry.ts +22 -18
- package/dist/extensions/pi-subagents/src/agents/skills.ts +43 -10
- package/dist/extensions/pi-subagents/src/api/delegation.ts +20 -1
- package/dist/extensions/pi-subagents/src/api/inspectors.ts +27 -0
- package/dist/extensions/pi-subagents/src/api/preflight.ts +140 -62
- package/dist/extensions/pi-subagents/src/api/required-child-extensions.ts +6 -0
- package/dist/extensions/pi-subagents/src/api/shared-types.ts +2 -0
- package/dist/extensions/pi-subagents/src/extension/config.ts +24 -40
- package/dist/extensions/pi-subagents/src/extension/control-notices.ts +4 -1
- package/dist/extensions/pi-subagents/src/extension/doctor.ts +18 -15
- package/dist/extensions/pi-subagents/src/extension/fanout-child.ts +87 -13
- package/dist/extensions/pi-subagents/src/extension/herdr-pi-bridge.ts +162 -0
- package/dist/extensions/pi-subagents/src/extension/index.ts +331 -269
- package/dist/extensions/pi-subagents/src/extension/observability.ts +164 -0
- package/dist/extensions/pi-subagents/src/extension/public-execution.ts +76 -37
- package/dist/extensions/pi-subagents/src/extension/release-readiness.ts +367 -0
- package/dist/extensions/pi-subagents/src/extension/reply-workflow-script.ts +67 -0
- package/dist/extensions/pi-subagents/src/extension/rpc.ts +42 -12
- package/dist/extensions/pi-subagents/src/extension/schemas.ts +116 -205
- package/dist/extensions/pi-subagents/src/extension/subagent-guide.ts +13 -5
- package/dist/extensions/pi-subagents/src/extension/tool-activation.ts +146 -0
- package/dist/extensions/pi-subagents/src/extension/tool-description.ts +77 -90
- package/dist/extensions/pi-subagents/src/extension/upgrade-notice.ts +40 -0
- package/dist/extensions/pi-subagents/src/inspectors/actions.ts +148 -0
- package/dist/extensions/pi-subagents/src/inspectors/ghostty/actions.ts +74 -0
- package/dist/extensions/pi-subagents/src/inspectors/ghostty/plugin.ts +29 -0
- package/dist/extensions/pi-subagents/src/inspectors/herdr/actions.ts +100 -180
- package/dist/extensions/pi-subagents/src/inspectors/herdr/plugin.ts +20 -0
- package/dist/extensions/pi-subagents/src/inspectors/herdr/project-panes.ts +2 -2
- package/dist/extensions/pi-subagents/src/inspectors/{herdr/inspector-runner.ts → inspector-runner.ts} +13 -13
- package/dist/extensions/pi-subagents/src/inspectors/plugins.ts +75 -0
- package/dist/extensions/pi-subagents/src/inspectors/{herdr/session-roots-codec.ts → session-roots-codec.ts} +4 -15
- package/dist/extensions/pi-subagents/src/inspectors/{herdr/shell-command.ts → shell-command.ts} +1 -1
- package/dist/extensions/pi-subagents/src/inspectors/types.ts +51 -0
- package/dist/extensions/pi-subagents/src/integrations/herdr-status.ts +38 -53
- package/dist/extensions/pi-subagents/src/integrations/pi-web-session-liveness.ts +7 -1
- package/dist/extensions/pi-subagents/src/intercom/intercom-bridge.ts +53 -9
- package/dist/extensions/pi-subagents/src/intercom/native-supervisor-channel.ts +69 -55
- package/dist/extensions/pi-subagents/src/intercom/result-intercom.ts +7 -2
- package/dist/extensions/pi-subagents/src/missions/goal-driver.ts +45 -32
- package/dist/extensions/pi-subagents/src/missions/store.ts +11 -2
- package/dist/extensions/pi-subagents/src/missions/workflow-state.ts +1 -44
- package/dist/extensions/pi-subagents/src/policy/authority.ts +5 -1
- package/dist/extensions/pi-subagents/src/profiles/profiles.ts +30 -18
- package/dist/extensions/pi-subagents/src/runs/background/active-async-capacity.ts +59 -9
- package/dist/extensions/pi-subagents/src/runs/background/active-run-index.ts +18 -2
- package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +463 -248
- package/dist/extensions/pi-subagents/src/runs/background/async-job-tracker.ts +112 -66
- package/dist/extensions/pi-subagents/src/runs/background/async-resume.ts +33 -20
- package/dist/extensions/pi-subagents/src/runs/background/async-retention.ts +47 -17
- package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +18 -5
- package/dist/extensions/pi-subagents/src/runs/background/auto-drain.ts +24 -11
- package/dist/extensions/pi-subagents/src/runs/background/await-async-run.ts +78 -0
- package/dist/extensions/pi-subagents/src/runs/background/binary-bootstrap.ts +66 -0
- package/dist/extensions/pi-subagents/src/runs/background/calendar-schedule.ts +90 -0
- package/dist/extensions/pi-subagents/src/runs/background/chain-append.ts +2 -2
- package/dist/extensions/pi-subagents/src/runs/background/chain-root-attachment.ts +19 -38
- package/dist/extensions/pi-subagents/src/runs/background/control-channel.ts +62 -3
- package/dist/extensions/pi-subagents/src/runs/background/fleet-view.ts +82 -10
- package/dist/extensions/pi-subagents/src/runs/background/notify.ts +272 -24
- package/dist/extensions/pi-subagents/src/runs/background/owned-process-tree.ts +30 -3
- package/dist/extensions/pi-subagents/src/runs/background/pid-namespace.ts +18 -0
- package/dist/extensions/pi-subagents/src/runs/background/process-terminal-candidate.ts +98 -0
- package/dist/extensions/pi-subagents/src/runs/background/process-terminal.ts +18 -97
- package/dist/extensions/pi-subagents/src/runs/background/result-delivery-ownership.ts +269 -7
- package/dist/extensions/pi-subagents/src/runs/background/result-files.ts +14 -5
- package/dist/extensions/pi-subagents/src/runs/background/result-watcher.ts +77 -22
- package/dist/extensions/pi-subagents/src/runs/background/retained-children.ts +4 -3
- package/dist/extensions/pi-subagents/src/runs/background/retained-nested-route-tracker.ts +15 -3
- package/dist/extensions/pi-subagents/src/runs/background/run-child-session.ts +126 -45
- package/dist/extensions/pi-subagents/src/runs/background/run-id-resolver.ts +11 -6
- package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +18 -7
- package/dist/extensions/pi-subagents/src/runs/background/runner-aliases.ts +43 -51
- package/dist/extensions/pi-subagents/src/runs/background/runner-child-launch.ts +8 -1
- package/dist/extensions/pi-subagents/src/runs/background/runner-child-sessions.ts +5 -4
- package/dist/extensions/pi-subagents/src/runs/background/runner-http-dispatcher.ts +119 -0
- package/dist/extensions/pi-subagents/src/runs/background/runner-startup-failure.ts +56 -0
- package/dist/extensions/pi-subagents/src/runs/background/scheduled-runs.ts +297 -69
- package/dist/extensions/pi-subagents/src/runs/background/stale-run-reconciler.ts +67 -16
- package/dist/extensions/pi-subagents/src/runs/background/steering.ts +21 -3
- package/dist/extensions/pi-subagents/src/runs/background/subagent-runner-bootstrap.ts +276 -0
- package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +660 -578
- package/dist/extensions/pi-subagents/src/runs/background/subagent-wait.ts +177 -29
- package/dist/extensions/pi-subagents/src/runs/background/wait-completions.ts +77 -28
- package/dist/extensions/pi-subagents/src/runs/background/wait-subscriptions.ts +10 -4
- package/dist/extensions/pi-subagents/src/runs/background/wait-tool.ts +7 -13
- package/dist/extensions/pi-subagents/src/runs/background/workflow-terminal-proof.ts +41 -23
- package/dist/extensions/pi-subagents/src/runs/foreground/async-steering-action.ts +19 -8
- package/dist/extensions/pi-subagents/src/runs/foreground/async-stop-action.ts +130 -7
- package/dist/extensions/pi-subagents/src/runs/foreground/command-action.ts +41 -0
- package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +267 -385
- package/dist/extensions/pi-subagents/src/runs/foreground/foreground-history.ts +4 -2
- package/dist/extensions/pi-subagents/src/runs/foreground/prompt-audit.ts +6 -10
- package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +1158 -413
- package/dist/extensions/pi-subagents/src/runs/foreground/workflow-detach-reconcile.ts +3 -1
- package/dist/extensions/pi-subagents/src/runs/foreground/workflow-foreground-steering.ts +2 -1
- package/dist/extensions/pi-subagents/src/runs/shared/acceptance.ts +200 -74
- package/dist/extensions/pi-subagents/src/runs/shared/async-status-projection.ts +133 -34
- package/dist/extensions/pi-subagents/src/runs/shared/capability-ceiling.ts +6 -1
- package/dist/extensions/pi-subagents/src/runs/shared/child-commands.ts +228 -0
- package/dist/extensions/pi-subagents/src/runs/shared/child-hooks.ts +18 -18
- package/dist/extensions/pi-subagents/src/runs/shared/child-launch-plan.ts +16 -4
- package/dist/extensions/pi-subagents/src/runs/shared/child-launch.ts +55 -12
- package/dist/extensions/pi-subagents/src/runs/shared/child-lifecycle.ts +6 -3
- package/dist/extensions/pi-subagents/src/runs/shared/child-runtime-config.ts +11 -1
- package/dist/extensions/pi-subagents/src/runs/shared/child-session.ts +367 -74
- package/dist/extensions/pi-subagents/src/runs/shared/child-tool-plan.ts +50 -86
- package/dist/extensions/pi-subagents/src/runs/shared/claude-code-adapter.ts +288 -0
- package/dist/extensions/pi-subagents/src/runs/shared/codex-exec-adapter.ts +129 -0
- package/dist/extensions/pi-subagents/src/runs/shared/cursor-agent-adapter.ts +114 -0
- package/dist/extensions/pi-subagents/src/runs/shared/dynamic-fanout.ts +5 -5
- package/dist/extensions/pi-subagents/src/runs/shared/effective-system-prompt.ts +33 -0
- package/dist/extensions/pi-subagents/src/runs/shared/external-cli-contract.ts +49 -10
- package/dist/extensions/pi-subagents/src/runs/shared/external-cli-preflight.ts +61 -9
- package/dist/extensions/pi-subagents/src/runs/shared/external-cli-runner.ts +16 -9
- package/dist/extensions/pi-subagents/src/runs/shared/external-job-bridge.ts +55 -1
- package/dist/extensions/pi-subagents/src/runs/shared/git-environment.ts +1 -1
- package/dist/extensions/pi-subagents/src/runs/shared/herdr-connection.ts +134 -0
- package/dist/extensions/pi-subagents/src/runs/shared/herdr-external-adapters.ts +169 -0
- package/dist/extensions/pi-subagents/src/runs/shared/herdr-machine.ts +279 -0
- package/dist/extensions/pi-subagents/src/runs/shared/herdr-pi-protocol.ts +59 -0
- package/dist/extensions/pi-subagents/src/runs/shared/herdr-placed-run.ts +263 -0
- package/dist/extensions/pi-subagents/src/runs/shared/mcp-config-sources.ts +6 -2
- package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +108 -13
- package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-grant.ts +23 -7
- package/dist/extensions/pi-subagents/src/runs/shared/model-resolution-diagnostic.ts +76 -0
- package/dist/extensions/pi-subagents/src/runs/shared/{model-fallback.ts → model-resolution.ts} +65 -245
- package/dist/extensions/pi-subagents/src/runs/shared/model-scope.ts +30 -11
- package/dist/extensions/pi-subagents/src/runs/shared/nested-events.ts +24 -3
- package/dist/extensions/pi-subagents/src/runs/shared/orca-progress-tabs.ts +5 -4
- package/dist/extensions/pi-subagents/src/runs/shared/parallel-handoff.ts +55 -7
- package/dist/extensions/pi-subagents/src/runs/shared/parallel-utils.ts +14 -4
- package/dist/extensions/pi-subagents/src/runs/shared/partial-output.ts +48 -0
- package/dist/extensions/pi-subagents/src/runs/shared/pi-spawn.ts +12 -4
- package/dist/extensions/pi-subagents/src/runs/shared/run-history.ts +88 -1
- package/dist/extensions/pi-subagents/src/runs/shared/single-output.ts +12 -3
- package/dist/extensions/pi-subagents/src/runs/shared/structured-output.ts +160 -9
- package/dist/extensions/pi-subagents/src/runs/shared/subagent-control.ts +49 -35
- package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +58 -19
- package/dist/extensions/pi-subagents/src/runs/shared/tool-availability.ts +2 -2
- package/dist/extensions/pi-subagents/src/runs/shared/tool-budget.ts +21 -0
- package/dist/extensions/pi-subagents/src/runs/shared/usage-reconciliation.ts +73 -0
- package/dist/extensions/pi-subagents/src/runs/shared/workflow-async-child-guidance.ts +18 -0
- package/dist/extensions/pi-subagents/src/runs/shared/worktree-cleanup-apply.ts +160 -0
- package/dist/extensions/pi-subagents/src/runs/shared/worktree-cleanup-plan.ts +42 -20
- package/dist/extensions/pi-subagents/src/runs/shared/worktree-lock.ts +29 -0
- package/dist/extensions/pi-subagents/src/runs/shared/worktree-setup-command.ts +27 -4
- package/dist/extensions/pi-subagents/src/runs/shared/worktree.ts +94 -26
- package/dist/extensions/pi-subagents/src/shared/child-cache-retention.ts +43 -0
- package/dist/extensions/pi-subagents/src/shared/child-session-name.ts +5 -3
- package/dist/extensions/pi-subagents/src/shared/disabled-features.ts +123 -0
- package/dist/extensions/pi-subagents/src/shared/extension-context.ts +14 -1
- package/dist/extensions/pi-subagents/src/shared/file-lease.ts +74 -0
- package/dist/extensions/pi-subagents/src/shared/fork-context.ts +27 -77
- package/dist/extensions/pi-subagents/src/shared/launch-contract.ts +70 -10
- package/dist/extensions/pi-subagents/src/shared/model-info.ts +10 -1
- package/dist/extensions/pi-subagents/src/shared/opencode-session-headers.ts +30 -0
- package/dist/extensions/pi-subagents/src/shared/owner-record.ts +107 -0
- package/dist/extensions/pi-subagents/src/shared/package-version.ts +17 -0
- package/dist/extensions/pi-subagents/src/shared/parent-wake.ts +66 -0
- package/dist/extensions/pi-subagents/src/shared/process-identity.ts +87 -0
- package/dist/extensions/pi-subagents/src/shared/pruned-fork.ts +71 -58
- package/dist/extensions/pi-subagents/src/shared/required-child-extensions.ts +115 -0
- package/dist/extensions/pi-subagents/src/shared/settings-file-lease.ts +36 -0
- package/dist/extensions/pi-subagents/src/shared/settings.ts +7 -4
- package/dist/extensions/pi-subagents/src/shared/shortcuts.ts +1 -5
- package/dist/extensions/pi-subagents/src/shared/types.ts +155 -48
- package/dist/extensions/pi-subagents/src/slash/delegation-adapters.ts +28 -2
- package/dist/extensions/pi-subagents/src/slash/delegation-request.ts +15 -1
- package/dist/extensions/pi-subagents/src/slash/prompt-template-bridge.ts +19 -4
- package/dist/extensions/pi-subagents/src/slash/prompt-workflows.ts +13 -2
- package/dist/extensions/pi-subagents/src/slash/slash-commands.ts +15 -15
- package/dist/extensions/pi-subagents/src/slash/subagent-cost.ts +46 -9
- package/dist/extensions/pi-subagents/src/slash/subagents-admin.ts +29 -16
- package/dist/extensions/pi-subagents/src/tui/fleet-status.ts +201 -26
- package/dist/extensions/pi-subagents/src/tui/fleet.ts +33 -16
- package/dist/extensions/pi-subagents/src/tui/render.ts +334 -103
- package/dist/extensions/pi-subagents/src/tui/running-tone.ts +28 -0
- package/dist/extensions/pi-subagents/src/watchdog/child-status.ts +27 -28
- package/dist/extensions/pi-subagents/src/watchdog/diff-tool.ts +47 -12
- package/dist/extensions/pi-subagents/src/watchdog/lsp-diagnostics.ts +2 -2
- package/dist/extensions/pi-subagents/src/watchdog/model-selection.ts +22 -2
- package/dist/extensions/pi-subagents/src/watchdog/permission-arbiter.ts +17 -17
- package/dist/extensions/pi-subagents/src/watchdog/register-child.ts +24 -8
- package/dist/extensions/pi-subagents/src/watchdog/register-main.ts +43 -39
- package/dist/extensions/pi-subagents/src/watchdog/render.ts +2 -2
- package/dist/extensions/pi-subagents/src/watchdog/review.ts +127 -78
- package/dist/extensions/pi-subagents/src/watchdog/rules.ts +1 -1
- package/dist/extensions/pi-subagents/src/watchdog/runtime.ts +107 -31
- package/dist/extensions/pi-subagents/src/watchdog/scope.ts +1 -1
- package/dist/extensions/pi-subagents/src/watchdog/settings.ts +22 -14
- package/dist/extensions/pi-subagents/src/watchdog/tool-actions.ts +14 -13
- package/dist/extensions/pi-subagents/src/watchdog/turn-delta.ts +35 -6
- package/dist/extensions/pi-subagents/src/watchdog/types.ts +6 -4
- package/dist/extensions/pi-subagents/src/watchdog/warning-format.ts +2 -2
- package/dist/extensions/pi-subagents/src/workflows/chat-progress.ts +3 -3
- package/dist/extensions/pi-subagents/src/workflows/scripted-workflow.ts +500 -65
- package/dist/extensions/pi-subagents/src/workflows/structured-workflow-scripts.ts +177 -0
- package/dist/extensions/pi-subagents/src/workflows/workflow-checklist.ts +8 -2
- package/dist/extensions/pi-subagents/src/workflows/workflow-child-summary.ts +5 -3
- package/dist/extensions/pi-subagents/src/workflows/workflow-receipt.ts +70 -10
- package/dist/extensions/pi-subagents/src/workflows/workflow-resources.ts +57 -18
- package/dist/extensions/pi-subagents/src/workflows/workflow-reuse.ts +120 -0
- package/dist/extensions/pi-subagents/src/workflows/workflow-revival.ts +123 -0
- package/dist/extensions/pi-subagents/src/workflows/workflow-settlement.ts +5 -2
- package/dist/extensions/pi-subagents/test/fixtures/cwd-workflow-child.ts +37 -0
- package/dist/extensions/pi-subagents/test/fixtures/herdr-allocation-lock-child.ts +16 -0
- package/dist/extensions/pi-subagents/test/fixtures/herdr-provision-child.ts +15 -0
- package/dist/extensions/pi-subagents/test/fixtures/native-nested-wait-provider.ts +76 -0
- package/dist/extensions/pi-subagents/test/fixtures/runner-bootstrap-harness.ts +36 -0
- package/dist/extensions/pi-subagents/test/fixtures/schedule-history-writer.mjs +48 -0
- package/dist/extensions/pi-subagents/test/fixtures/settings-race-writer.mjs +57 -0
- package/dist/extensions/pi-subagents/test/fixtures/workflow-cwd-access-failure.ts +33 -0
- package/dist/extensions/pi-subagents/test/integration/acceptance-file-report.test.ts +40 -7
- package/dist/extensions/pi-subagents/test/integration/async-attention-clearing.test.ts +192 -0
- package/dist/extensions/pi-subagents/test/integration/async-execution.part-1.test.ts +435 -276
- package/dist/extensions/pi-subagents/test/integration/async-execution.part-2.test.ts +435 -397
- package/dist/extensions/pi-subagents/test/integration/async-execution.part-3.test.ts +918 -497
- package/dist/extensions/pi-subagents/test/integration/async-execution.part-4.test.ts +264 -17
- package/dist/extensions/pi-subagents/test/integration/async-job-tracker.test.ts +185 -22
- package/dist/extensions/pi-subagents/test/integration/async-status.test.ts +3 -2
- package/dist/extensions/pi-subagents/test/integration/claude-code-dispatch.test.ts +127 -0
- package/dist/extensions/pi-subagents/test/integration/deadline-checkpoint.test.ts +126 -0
- package/dist/extensions/pi-subagents/test/integration/doctor-executor.test.ts +29 -1
- package/dist/extensions/pi-subagents/test/integration/error-handling.test.ts +88 -0
- package/dist/extensions/pi-subagents/test/integration/external-cli-runner.test.ts +450 -13
- package/dist/extensions/pi-subagents/test/integration/foreign-workflow-steering.test.ts +10 -6
- package/dist/extensions/pi-subagents/test/integration/fork-context-execution.test.ts +105 -86
- package/dist/extensions/pi-subagents/test/integration/in-process-child.test.ts +403 -18
- package/dist/extensions/pi-subagents/test/integration/inline-workflow-visibility.test.ts +351 -0
- package/dist/extensions/pi-subagents/test/integration/intercom-result-delivery.test.ts +195 -10
- package/dist/extensions/pi-subagents/test/integration/model-resolution-diagnostic.test.ts +108 -0
- package/dist/extensions/pi-subagents/test/integration/nested-async-wait.test.ts +61 -0
- package/dist/extensions/pi-subagents/test/integration/orca-progress-tabs.test.ts +5 -4
- package/dist/extensions/pi-subagents/test/integration/recovered-assistant-error.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/integration/render-fork-badge.test.ts +6 -4
- package/dist/extensions/pi-subagents/test/integration/render-widget-mouse.test.ts +84 -0
- package/dist/extensions/pi-subagents/test/integration/render-widget.test.ts +242 -16
- package/dist/extensions/pi-subagents/test/integration/result-publication.test.ts +2 -2
- package/dist/extensions/pi-subagents/test/integration/result-watcher.test.ts +221 -4
- package/dist/extensions/pi-subagents/test/integration/single-execution.part-1.test.ts +1435 -248
- package/dist/extensions/pi-subagents/test/integration/single-execution.part-2.test.ts +454 -515
- package/dist/extensions/pi-subagents/test/integration/slash-commands.test.ts +140 -21
- package/dist/extensions/pi-subagents/test/integration/stop-all-background.test.ts +142 -0
- package/dist/extensions/pi-subagents/test/integration/structured-workflows.test.ts +105 -0
- package/dist/extensions/pi-subagents/test/integration/workflow-result-publication.test.ts +90 -11
- package/dist/extensions/pi-subagents/test/integration/workflow-steer-inbox.test.ts +18 -15
- package/dist/extensions/pi-subagents/test/integration/workflow-worktree-admission.test.ts +100 -0
- package/dist/extensions/pi-subagents/test/smoke/clean-install.mjs +106 -0
- package/dist/extensions/pi-subagents/test/smoke/npm-background.mjs +43 -0
- package/dist/extensions/pi-subagents/test/smoke/packed-runner-selection.mjs +42 -0
- package/dist/extensions/pi-subagents/test/smoke/runner-loader-capability.mjs +50 -0
- package/dist/extensions/pi-subagents/test/smoke/sdk-child.ts +57 -0
- package/dist/extensions/pi-subagents/test/smoke/{pi085-extension.ts → sdk-extension.ts} +2 -2
- package/dist/extensions/pi-subagents/test/smoke/standalone-background.mjs +140 -0
- package/dist/extensions/pi-subagents/test/smoke/standalone-fault.ts +43 -0
- package/dist/extensions/pi-subagents/test/smoke/standalone-matrix.mjs +65 -0
- package/dist/extensions/pi-subagents/test/smoke/standalone-observer.ts +8 -0
- package/dist/extensions/pi-subagents/test/smoke/standalone-parent.ts +220 -0
- package/dist/extensions/pi-subagents/test/smoke/standalone-provider.ts +58 -0
- package/dist/extensions/pi-subagents/test/smoke/standalone-release.json +8 -0
- package/dist/extensions/pi-subagents/test/smoke/standalone-revival.ts +109 -0
- package/dist/extensions/pi-subagents/test/smoke/standalone-shared.ts +79 -0
- package/dist/extensions/pi-subagents/test/smoke/tool-activation.test.ts +128 -0
- package/dist/extensions/pi-subagents/test/support/async-execution-fixture.ts +6 -25
- package/dist/extensions/pi-subagents/test/support/async-result-timeout-evidence.ts +61 -0
- package/dist/extensions/pi-subagents/test/support/fake-child-session.ts +130 -9
- package/dist/extensions/pi-subagents/test/support/foreign-workflow-steer-host.mjs +15 -7
- package/dist/extensions/pi-subagents/test/support/helpers.ts +11 -14
- package/dist/extensions/pi-subagents/test/support/isolated-temp-root.mjs +21 -3
- package/dist/extensions/pi-subagents/test/support/native-peer-loader.mjs +15 -0
- package/dist/extensions/pi-subagents/test/support/node-command.ts +29 -6
- package/dist/extensions/pi-subagents/test/support/notify-diagnostics-fixture.ts +5 -3
- package/dist/extensions/pi-subagents/test/support/single-execution-fixture.ts +7 -15
- package/dist/extensions/pi-subagents/test/support/watchdog-stable-host-loader.mjs +23 -0
- package/dist/extensions/pi-subagents/test/unit/acceptance-compaction.test.ts +3 -3
- package/dist/extensions/pi-subagents/test/unit/acceptance.test.ts +158 -155
- package/dist/extensions/pi-subagents/test/unit/active-async-capacity.test.ts +52 -1
- package/dist/extensions/pi-subagents/test/unit/advertised-agent-prompt.test.ts +21 -17
- package/dist/extensions/pi-subagents/test/unit/advertised-agent-refresh.test.ts +105 -36
- package/dist/extensions/pi-subagents/test/unit/advertisement-barrier.test.ts +151 -0
- package/dist/extensions/pi-subagents/test/unit/agent-disabled.test.ts +1 -2
- package/dist/extensions/pi-subagents/test/unit/agent-eject-disable.test.ts +33 -3
- package/dist/extensions/pi-subagents/test/unit/agent-end-auto-drain.test.ts +149 -0
- package/dist/extensions/pi-subagents/test/unit/agent-exclude-dirs.test.ts +246 -0
- package/dist/extensions/pi-subagents/test/unit/agent-frontmatter.test.ts +62 -87
- package/dist/extensions/pi-subagents/test/unit/agent-global-root-override.test.ts +86 -0
- package/dist/extensions/pi-subagents/test/unit/agent-management.test.ts +398 -48
- package/dist/extensions/pi-subagents/test/unit/agent-memory.test.ts +126 -1
- package/dist/extensions/pi-subagents/test/unit/agent-name-resolution.test.ts +75 -0
- package/dist/extensions/pi-subagents/test/unit/agent-overrides.test.ts +94 -42
- package/dist/extensions/pi-subagents/test/unit/async-execution.test.ts +73 -3
- package/dist/extensions/pi-subagents/test/unit/async-interrupt-action.test.ts +428 -2
- package/dist/extensions/pi-subagents/test/unit/async-permission-session.test.ts +4 -4
- package/dist/extensions/pi-subagents/test/unit/async-recovery-descriptor.test.ts +112 -1
- package/dist/extensions/pi-subagents/test/unit/async-result-timeout-evidence.test.ts +53 -0
- package/dist/extensions/pi-subagents/test/unit/async-resume.test.ts +92 -4
- package/dist/extensions/pi-subagents/test/unit/async-retention.test.ts +58 -6
- package/dist/extensions/pi-subagents/test/unit/async-run-history.test.ts +123 -0
- package/dist/extensions/pi-subagents/test/unit/async-spawn-package-dir.test.ts +203 -0
- package/dist/extensions/pi-subagents/test/unit/async-spawn-preload.test.ts +26 -35
- package/dist/extensions/pi-subagents/test/unit/async-status-projection.test.ts +185 -0
- package/dist/extensions/pi-subagents/test/unit/authority-policy.test.ts +9 -1
- package/dist/extensions/pi-subagents/test/unit/auto-drain.test.ts +106 -1
- package/dist/extensions/pi-subagents/test/unit/await-async-run.test.ts +202 -0
- package/dist/extensions/pi-subagents/test/unit/binary-async-spawn.test.ts +115 -0
- package/dist/extensions/pi-subagents/test/unit/binary-pi-spawn.test.ts +27 -0
- package/dist/extensions/pi-subagents/test/unit/calendar-schedule.test.ts +70 -0
- package/dist/extensions/pi-subagents/test/unit/capability-ceiling-agent-allowlist.test.ts +38 -0
- package/dist/extensions/pi-subagents/test/unit/chain-root-attachment.test.ts +10 -2
- package/dist/extensions/pi-subagents/test/unit/changelog-format.test.ts +11 -0
- package/dist/extensions/pi-subagents/test/unit/child-cache-retention.test.ts +87 -0
- package/dist/extensions/pi-subagents/test/unit/child-commands.test.ts +243 -0
- package/dist/extensions/pi-subagents/test/unit/child-external-job-bridge.test.ts +126 -0
- package/dist/extensions/pi-subagents/test/unit/child-launch-plan.test.ts +12 -1
- package/dist/extensions/pi-subagents/test/unit/child-lifecycle.test.ts +36 -0
- package/dist/extensions/pi-subagents/test/unit/child-runtime-config.test.ts +24 -0
- package/dist/extensions/pi-subagents/test/unit/child-session-commands.test.ts +162 -0
- package/dist/extensions/pi-subagents/test/unit/child-session-host-sdk.test.ts +226 -0
- package/dist/extensions/pi-subagents/test/unit/child-session-parent-providers.test.ts +200 -0
- package/dist/extensions/pi-subagents/test/unit/child-session-queued.test.ts +260 -0
- package/dist/extensions/pi-subagents/test/unit/child-tool-plan-permission-system.test.ts +3 -98
- package/dist/extensions/pi-subagents/test/unit/child-tool-plan.test.ts +222 -1
- package/dist/extensions/pi-subagents/test/unit/claude-code-adapter.test.ts +314 -0
- package/dist/extensions/pi-subagents/test/unit/claude-code-dispatch.test.ts +182 -0
- package/dist/extensions/pi-subagents/test/unit/codex-exec-adapter.test.ts +157 -0
- package/dist/extensions/pi-subagents/test/unit/command-action.test.ts +50 -0
- package/dist/extensions/pi-subagents/test/unit/compaction-resume.test.ts +25 -11
- package/dist/extensions/pi-subagents/test/unit/completion-replay.test.ts +3 -1
- package/dist/extensions/pi-subagents/test/unit/control-channel.test.ts +18 -0
- package/dist/extensions/pi-subagents/test/unit/control-notices.test.ts +7 -1
- package/dist/extensions/pi-subagents/test/unit/cursor-agent-adapter.test.ts +220 -0
- package/dist/extensions/pi-subagents/test/unit/default-extensions.test.ts +104 -32
- package/dist/extensions/pi-subagents/test/unit/delegation-api.test.ts +138 -1
- package/dist/extensions/pi-subagents/test/unit/disabled-features.test.ts +227 -0
- package/dist/extensions/pi-subagents/test/unit/doctor.test.ts +48 -9
- package/dist/extensions/pi-subagents/test/unit/dynamic-fanout.test.ts +7 -4
- package/dist/extensions/pi-subagents/test/unit/extension-lazy-loading.test.ts +21 -0
- package/dist/extensions/pi-subagents/test/unit/extension-maintenance-lifecycle.test.ts +66 -0
- package/dist/extensions/pi-subagents/test/unit/extension-module-preload.test.ts +49 -0
- package/dist/extensions/pi-subagents/test/unit/external-cli-runner.test.ts +104 -3
- package/dist/extensions/pi-subagents/test/unit/file-lease.test.ts +17 -0
- package/dist/extensions/pi-subagents/test/unit/fleet-status.test.ts +316 -0
- package/dist/extensions/pi-subagents/test/unit/fleet.test.ts +58 -7
- package/dist/extensions/pi-subagents/test/unit/fork-context.test.ts +25 -96
- package/dist/extensions/pi-subagents/test/unit/ghostty-inspector.test.ts +92 -0
- package/dist/extensions/pi-subagents/test/unit/global-npm-root.test.ts +108 -0
- package/dist/extensions/pi-subagents/test/unit/herdr-connection.test.ts +43 -0
- package/dist/extensions/pi-subagents/test/unit/herdr-external-adapters.test.ts +89 -0
- package/dist/extensions/pi-subagents/test/unit/herdr-inspector-bootstrap.test.ts +11 -20
- package/dist/extensions/pi-subagents/test/unit/herdr-inspector.test.ts +113 -19
- package/dist/extensions/pi-subagents/test/unit/herdr-machine.test.ts +161 -0
- package/dist/extensions/pi-subagents/test/unit/herdr-native-placement.test.ts +187 -0
- package/dist/extensions/pi-subagents/test/unit/herdr-session-roots-codec.test.ts +7 -12
- package/dist/extensions/pi-subagents/test/unit/herdr-shell-command.test.ts +2 -2
- package/dist/extensions/pi-subagents/test/unit/herdr-status-bridge.test.ts +182 -87
- package/dist/extensions/pi-subagents/test/unit/host-peer-runtime-imports.test.ts +68 -49
- package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +295 -135
- package/dist/extensions/pi-subagents/test/unit/inspect-rpc.test.ts +3 -3
- package/dist/extensions/pi-subagents/test/unit/inspector-authority-policy.test.ts +144 -0
- package/dist/extensions/pi-subagents/test/unit/inspector-registration.test.ts +128 -0
- package/dist/extensions/pi-subagents/test/unit/intercom-bridge.test.ts +49 -1
- package/dist/extensions/pi-subagents/test/unit/mcp-direct-tool-grant.test.ts +74 -1
- package/dist/extensions/pi-subagents/test/unit/mcp-direct-tool-resolution.test.ts +112 -0
- package/dist/extensions/pi-subagents/test/unit/mission-global-projection.test.ts +215 -0
- package/dist/extensions/pi-subagents/test/unit/mission-goal-driver.test.ts +65 -1
- package/dist/extensions/pi-subagents/test/unit/mission-store.test.ts +2 -1
- package/dist/extensions/pi-subagents/test/unit/model-resolution-diagnostic.test.ts +78 -0
- package/dist/extensions/pi-subagents/test/unit/model-resolution.test.ts +153 -0
- package/dist/extensions/pi-subagents/test/unit/model-scope.test.ts +43 -1
- package/dist/extensions/pi-subagents/test/unit/mutation-evidence.test.ts +1 -21
- package/dist/extensions/pi-subagents/test/unit/native-supervisor-channel.test.ts +279 -2
- package/dist/extensions/pi-subagents/test/unit/nested-control-fanout.test.ts +73 -0
- package/dist/extensions/pi-subagents/test/unit/nested-control.test.ts +297 -3
- package/dist/extensions/pi-subagents/test/unit/notify-diagnostics.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/notify.test.ts +431 -23
- package/dist/extensions/pi-subagents/test/unit/observability.test.ts +198 -0
- package/dist/extensions/pi-subagents/test/unit/opencode-session-headers.test.ts +32 -0
- package/dist/extensions/pi-subagents/test/unit/orca-progress-tabs.test.ts +89 -21
- package/dist/extensions/pi-subagents/test/unit/owned-process-tree.test.ts +31 -1
- package/dist/extensions/pi-subagents/test/unit/package-manifest.test.ts +18 -24
- package/dist/extensions/pi-subagents/test/unit/parent-wake.test.ts +206 -0
- package/dist/extensions/pi-subagents/test/unit/partial-output.test.ts +53 -0
- package/dist/extensions/pi-subagents/test/unit/pi-coding-agent-dir.test.ts +216 -32
- package/dist/extensions/pi-subagents/test/unit/pi-spawn-host-root.test.ts +82 -0
- package/dist/extensions/pi-subagents/test/unit/pi-subagents-policy-guidance.test.ts +28 -0
- package/dist/extensions/pi-subagents/test/unit/preflight.test.ts +193 -104
- package/dist/extensions/pi-subagents/test/unit/proactive-skills.test.ts +16 -1
- package/dist/extensions/pi-subagents/test/unit/process-identity.test.ts +75 -0
- package/dist/extensions/pi-subagents/test/unit/process-terminal.test.ts +17 -1
- package/dist/extensions/pi-subagents/test/unit/profiles.test.ts +89 -9
- package/dist/extensions/pi-subagents/test/unit/prompt-audit-optional-peers.test.ts +6 -0
- package/dist/extensions/pi-subagents/test/unit/prompt-audit-provider-routing.test.ts +69 -0
- package/dist/extensions/pi-subagents/test/unit/prompt-template-bridge.test.ts +2 -2
- package/dist/extensions/pi-subagents/test/unit/prompt-workflows.test.ts +23 -1
- package/dist/extensions/pi-subagents/test/unit/pruned-fork.test.ts +117 -3
- package/dist/extensions/pi-subagents/test/unit/public-execution.test.ts +35 -14
- package/dist/extensions/pi-subagents/test/unit/readonly-drain-observation.test.ts +3 -2
- package/dist/extensions/pi-subagents/test/unit/release-readiness.test.ts +715 -0
- package/dist/extensions/pi-subagents/test/unit/render-helpers.test.ts +261 -9
- package/dist/extensions/pi-subagents/test/unit/reply-workflow-script.test.ts +37 -0
- package/dist/extensions/pi-subagents/test/unit/required-child-extensions.test.ts +114 -0
- package/dist/extensions/pi-subagents/test/unit/result-intercom.test.ts +11 -1
- package/dist/extensions/pi-subagents/test/unit/result-takeover.test.ts +332 -0
- package/dist/extensions/pi-subagents/test/unit/retained-children.test.ts +22 -2
- package/dist/extensions/pi-subagents/test/unit/rpc.test.ts +125 -18
- package/dist/extensions/pi-subagents/test/unit/run-child-session.test.ts +230 -0
- package/dist/extensions/pi-subagents/test/unit/run-id-resolver.test.ts +50 -1
- package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +301 -4
- package/dist/extensions/pi-subagents/test/unit/runner-bootstrap.test.ts +182 -0
- package/dist/extensions/pi-subagents/test/unit/runner-http-dispatcher.test.ts +136 -0
- package/dist/extensions/pi-subagents/test/unit/runner-peer-loader.test.ts +68 -0
- package/dist/extensions/pi-subagents/test/unit/runner-peer-symlinks.test.ts +50 -0
- package/dist/extensions/pi-subagents/test/unit/running-tone.test.ts +13 -0
- package/dist/extensions/pi-subagents/test/unit/runtime-agent-registration.test.ts +155 -4
- package/dist/extensions/pi-subagents/test/unit/schedule-claim-initialization.test.ts +71 -0
- package/dist/extensions/pi-subagents/test/unit/schedule-claim-preservation.test.ts +98 -0
- package/dist/extensions/pi-subagents/test/unit/schedule-history-transactions.test.ts +201 -0
- package/dist/extensions/pi-subagents/test/unit/scheduled-mission.test.ts +317 -0
- package/dist/extensions/pi-subagents/test/unit/scheduled-runs.test.ts +412 -11
- package/dist/extensions/pi-subagents/test/unit/scheduled-store-root.test.ts +2 -8
- package/dist/extensions/pi-subagents/test/unit/schemas.test.ts +70 -71
- package/dist/extensions/pi-subagents/test/unit/scripted-workflow.test.ts +748 -5
- package/dist/extensions/pi-subagents/test/unit/session-liveness-delivery.test.ts +337 -0
- package/dist/extensions/pi-subagents/test/unit/settings-atomic-save.test.ts +419 -0
- package/dist/extensions/pi-subagents/test/unit/settings-transactions.test.ts +88 -0
- package/dist/extensions/pi-subagents/test/unit/single-output.test.ts +13 -1
- package/dist/extensions/pi-subagents/test/unit/skills-disable-model-invocation.test.ts +164 -0
- package/dist/extensions/pi-subagents/test/unit/skills-fallback.test.ts +35 -2
- package/dist/extensions/pi-subagents/test/unit/slash-bridge.test.ts +2 -2
- package/dist/extensions/pi-subagents/test/unit/stale-run-reconciler.test.ts +334 -9
- package/dist/extensions/pi-subagents/test/unit/steering-action.test.ts +170 -0
- package/dist/extensions/pi-subagents/test/unit/steering.test.ts +34 -5
- package/dist/extensions/pi-subagents/test/unit/structured-output-validation.test.ts +199 -0
- package/dist/extensions/pi-subagents/test/unit/structured-workflow-resources.test.ts +241 -0
- package/dist/extensions/pi-subagents/test/unit/subagent-control.test.ts +47 -38
- package/dist/extensions/pi-subagents/test/unit/subagent-cost.test.ts +97 -0
- package/dist/extensions/pi-subagents/test/unit/subagent-guide.test.ts +10 -0
- package/dist/extensions/pi-subagents/test/unit/subagent-prompt-runtime.test.ts +343 -44
- package/dist/extensions/pi-subagents/test/unit/subagent-wait.test.ts +410 -11
- package/dist/extensions/pi-subagents/test/unit/supervisor-ask-registration.test.ts +459 -22
- package/dist/extensions/pi-subagents/test/unit/temp-paths.test.ts +43 -3
- package/dist/extensions/pi-subagents/test/unit/timeout-defaults.test.ts +11 -1
- package/dist/extensions/pi-subagents/test/unit/tool-activation-stale-peer.test.ts +32 -0
- package/dist/extensions/pi-subagents/test/unit/tool-activation.test.ts +313 -0
- package/dist/extensions/pi-subagents/test/unit/tool-budget.test.ts +14 -0
- package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +76 -89
- package/dist/extensions/pi-subagents/test/unit/typed-gate-output.test.ts +141 -0
- package/dist/extensions/pi-subagents/test/unit/upgrade-notice.test.ts +31 -0
- package/dist/extensions/pi-subagents/test/unit/usage-reconciliation-owners.test.ts +66 -0
- package/dist/extensions/pi-subagents/test/unit/usage-reconciliation.test.ts +23 -0
- package/dist/extensions/pi-subagents/test/unit/wait-completions.test.ts +195 -1
- package/dist/extensions/pi-subagents/test/unit/wait-subscriptions.test.ts +3 -1
- package/dist/extensions/pi-subagents/test/unit/watchdog-child-status.test.ts +48 -45
- package/dist/extensions/pi-subagents/test/unit/watchdog-compaction-scope.test.ts +94 -0
- package/dist/extensions/pi-subagents/test/unit/watchdog-diff-tool.test.ts +48 -3
- package/dist/extensions/pi-subagents/test/unit/watchdog-native-scheduling.test.ts +107 -0
- package/dist/extensions/pi-subagents/test/unit/watchdog-permission-arbiter.test.ts +95 -7
- package/dist/extensions/pi-subagents/test/unit/watchdog-register-child.test.ts +79 -0
- package/dist/extensions/pi-subagents/test/unit/watchdog-render.test.ts +7 -4
- package/dist/extensions/pi-subagents/test/unit/watchdog-review.test.ts +111 -24
- package/dist/extensions/pi-subagents/test/unit/watchdog-rules.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/watchdog-runtime.test.ts +283 -2
- package/dist/extensions/pi-subagents/test/unit/watchdog-scope.test.ts +3 -0
- package/dist/extensions/pi-subagents/test/unit/watchdog-settings.test.ts +12 -1
- package/dist/extensions/pi-subagents/test/unit/watchdog-stable-host-layout.test.ts +23 -0
- package/dist/extensions/pi-subagents/test/unit/watchdog-tool-actions.test.ts +30 -0
- package/dist/extensions/pi-subagents/test/unit/watchdog-turn-delta.test.ts +39 -2
- package/dist/extensions/pi-subagents/test/unit/widget-nested-render.test.ts +18 -1
- package/dist/extensions/pi-subagents/test/unit/workflow-chat-progress.test.ts +8 -4
- package/dist/extensions/pi-subagents/test/unit/workflow-child-summary.test.ts +10 -0
- package/dist/extensions/pi-subagents/test/unit/workflow-detach-reconcile.test.ts +6 -3
- package/dist/extensions/pi-subagents/test/unit/workflow-launch-params.test.ts +44 -1
- package/dist/extensions/pi-subagents/test/unit/workflow-receipt.test.ts +28 -1
- package/dist/extensions/pi-subagents/test/unit/workflow-revival.test.ts +85 -0
- package/dist/extensions/pi-subagents/test/unit/workflow-scripts-feature.test.ts +177 -0
- package/dist/extensions/pi-subagents/test/unit/workflow-terminal-proof.test.ts +8 -0
- package/dist/extensions/pi-subagents/test/unit/workflow-worktree-admission.test.ts +29 -0
- package/dist/extensions/pi-subagents/test/unit/worktree-cleanup-plan.test.ts +343 -4
- package/dist/extensions/pi-subagents/test/unit/worktree-lock.test.ts +123 -0
- package/dist/extensions/pi-subagents/test/unit/worktree.test.ts +252 -22
- package/dist/extensions/pi-subagents/tsconfig.build.json +13 -0
- package/dist/extensions/pi-tool-display/tests/custom-tool-overrides.test.ts +1 -1
- package/dist/extensions/pi-tool-display/tests/tool-overrides-config.test.ts +1 -1
- package/dist/extensions/pi-tool-display/tests/tool-overrides-mcp.test.ts +24 -1
- package/dist/extensions/pi-tool-display/tests/tool-overrides-registration.test.ts +6 -2
- package/dist/extensions/pi-web-agent/src/extension.ts +1 -5
- package/dist/extensions/pi-zentui/.github/workflows/ci.yml +67 -4
- package/dist/extensions/pi-zentui/AGENTS.md +3 -2
- package/dist/extensions/pi-zentui/README.md +60 -32
- package/dist/extensions/pi-zentui/docs/configuration.md +662 -51
- package/dist/extensions/pi-zentui/docs/footer-format.md +174 -5
- package/dist/extensions/pi-zentui/extensions/zentui/accent-rail-editor.ts +15 -4
- package/dist/extensions/pi-zentui/extensions/zentui/average-token-rate.ts +146 -0
- package/dist/extensions/pi-zentui/extensions/zentui/codex-quota-display.ts +34 -0
- package/dist/extensions/pi-zentui/extensions/zentui/codex-quota.ts +298 -0
- package/dist/extensions/pi-zentui/extensions/zentui/component-colors.ts +172 -0
- package/dist/extensions/pi-zentui/extensions/zentui/component-settings.ts +243 -0
- package/dist/extensions/pi-zentui/extensions/zentui/config.ts +851 -114
- package/dist/extensions/pi-zentui/extensions/zentui/custom-value-colors.ts +93 -0
- package/dist/extensions/pi-zentui/extensions/zentui/custom-variable-demand.ts +61 -0
- package/dist/extensions/pi-zentui/extensions/zentui/custom-variable-format.ts +80 -0
- package/dist/extensions/pi-zentui/extensions/zentui/custom-variables.ts +152 -0
- package/dist/extensions/pi-zentui/extensions/zentui/editor-metadata-format.ts +138 -23
- package/dist/extensions/pi-zentui/extensions/zentui/editor-mouse.ts +89 -0
- package/dist/extensions/pi-zentui/extensions/zentui/extension-status-controller.ts +148 -0
- package/dist/extensions/pi-zentui/extensions/zentui/extension-status-settings.ts +40 -0
- package/dist/extensions/pi-zentui/extensions/zentui/extension-status.ts +109 -1
- package/dist/extensions/pi-zentui/extensions/zentui/footer-format.ts +203 -23
- package/dist/extensions/pi-zentui/extensions/zentui/footer-layout.ts +80 -3
- package/dist/extensions/pi-zentui/extensions/zentui/footer-text.ts +1 -1
- package/dist/extensions/pi-zentui/extensions/zentui/footer.ts +432 -125
- package/dist/extensions/pi-zentui/extensions/zentui/format.ts +92 -4
- package/dist/extensions/pi-zentui/extensions/zentui/git.ts +47 -30
- package/dist/extensions/pi-zentui/extensions/zentui/github-status.ts +575 -0
- package/dist/extensions/pi-zentui/extensions/zentui/host-project-changes.ts +25 -0
- package/dist/extensions/pi-zentui/extensions/zentui/host-template-values.ts +29 -0
- package/dist/extensions/pi-zentui/extensions/zentui/icons.ts +53 -13
- package/dist/extensions/pi-zentui/extensions/zentui/index.ts +778 -258
- package/dist/extensions/pi-zentui/extensions/zentui/interaction-summary.ts +70 -5
- package/dist/extensions/pi-zentui/extensions/zentui/layered-editor.ts +55 -0
- package/dist/extensions/pi-zentui/extensions/zentui/live-context.ts +6 -1
- package/dist/extensions/pi-zentui/extensions/zentui/live-metadata-demand.ts +72 -0
- package/dist/extensions/pi-zentui/extensions/zentui/live-metadata-display.ts +21 -0
- package/dist/extensions/pi-zentui/extensions/zentui/live-metadata.ts +255 -0
- package/dist/extensions/pi-zentui/extensions/zentui/minimalist-editor.ts +476 -36
- package/dist/extensions/pi-zentui/extensions/zentui/minimalist-settings.ts +118 -0
- package/dist/extensions/pi-zentui/extensions/zentui/minimalist-template.ts +177 -0
- package/dist/extensions/pi-zentui/extensions/zentui/omp-editor-frame.ts +148 -0
- package/dist/extensions/pi-zentui/extensions/zentui/omp-statusline.ts +569 -0
- package/dist/extensions/pi-zentui/extensions/zentui/omp-template-lookups.ts +344 -0
- package/dist/extensions/pi-zentui/extensions/zentui/omp-template-metrics.ts +91 -0
- package/dist/extensions/pi-zentui/extensions/zentui/omp-template-modes.ts +323 -0
- package/dist/extensions/pi-zentui/extensions/zentui/omp-ui.ts +210 -0
- package/dist/extensions/pi-zentui/extensions/zentui/package-version.ts +30 -12
- package/dist/extensions/pi-zentui/extensions/zentui/project-demand.ts +46 -0
- package/dist/extensions/pi-zentui/extensions/zentui/project-discovery.ts +58 -0
- package/dist/extensions/pi-zentui/extensions/zentui/project-refresh.ts +10 -3
- package/dist/extensions/pi-zentui/extensions/zentui/project-state.ts +37 -0
- package/dist/extensions/pi-zentui/extensions/zentui/repository-root.ts +1 -0
- package/dist/extensions/pi-zentui/extensions/zentui/runtime.ts +119 -43
- package/dist/extensions/pi-zentui/extensions/zentui/selector-border.ts +40 -29
- package/dist/extensions/pi-zentui/extensions/zentui/settings-command.ts +1268 -722
- package/dist/extensions/pi-zentui/extensions/zentui/settings-keys.ts +59 -0
- package/dist/extensions/pi-zentui/extensions/zentui/settings-list-selection.ts +13 -0
- package/dist/extensions/pi-zentui/extensions/zentui/settings-previews.ts +11 -4
- package/dist/extensions/pi-zentui/extensions/zentui/state.ts +24 -11
- package/dist/extensions/pi-zentui/extensions/zentui/style.ts +6 -0
- package/dist/extensions/pi-zentui/extensions/zentui/telemetry.ts +113 -11
- package/dist/extensions/pi-zentui/extensions/zentui/thinking-experimental.ts +234 -46
- package/dist/extensions/pi-zentui/extensions/zentui/thinking-steps.ts +20 -5
- package/dist/extensions/pi-zentui/extensions/zentui/token-rate.ts +313 -0
- package/dist/extensions/pi-zentui/extensions/zentui/turn-summary-format.ts +59 -0
- package/dist/extensions/pi-zentui/extensions/zentui/turn-summary-rate.ts +52 -0
- package/dist/extensions/pi-zentui/extensions/zentui/ui.ts +640 -172
- package/dist/extensions/pi-zentui/extensions/zentui/user-message-styles.ts +72 -34
- package/dist/extensions/pi-zentui/extensions/zentui/user-message.ts +219 -34
- package/dist/extensions/pi-zentui/extensions/zentui/working-line.ts +495 -119
- package/dist/extensions/pi-zentui/omp.ts +157 -0
- package/dist/extensions/pi-zentui/package-lock.json +3762 -1507
- package/dist/extensions/pi-zentui/package.json +50 -12
- package/dist/extensions/pi-zentui/test/accent-rail-editor.test.ts +13 -2
- package/dist/extensions/pi-zentui/test/average-token-rate.test.ts +297 -0
- package/dist/extensions/pi-zentui/test/behavior-compatibility.mjs +89 -0
- package/dist/extensions/pi-zentui/test/codex-quota-lifecycle.test.ts +284 -0
- package/dist/extensions/pi-zentui/test/codex-quota-rendering.test.ts +466 -0
- package/dist/extensions/pi-zentui/test/codex-quota.test.ts +440 -0
- package/dist/extensions/pi-zentui/test/component-colors.test.ts +554 -0
- package/dist/extensions/pi-zentui/test/component-settings.test.ts +364 -0
- package/dist/extensions/pi-zentui/test/config-component-independence.test.ts +402 -0
- package/dist/extensions/pi-zentui/test/config-extension-status-choice.test.ts +233 -0
- package/dist/extensions/pi-zentui/test/config-hidden-extension-status-colors.test.ts +118 -0
- package/dist/extensions/pi-zentui/test/config-hidden-extension-status-placement.test.ts +142 -0
- package/dist/extensions/pi-zentui/test/config-minimalist-templates.test.ts +240 -0
- package/dist/extensions/pi-zentui/test/config-template-variables.test.ts +85 -0
- package/dist/extensions/pi-zentui/test/config.test.ts +80 -17
- package/dist/extensions/pi-zentui/test/custom-value-colors-integration.test.ts +453 -0
- package/dist/extensions/pi-zentui/test/custom-value-colors.test.ts +399 -0
- package/dist/extensions/pi-zentui/test/custom-variable-alias-prototypes.test.ts +177 -0
- package/dist/extensions/pi-zentui/test/custom-variable-consumers.test.ts +194 -0
- package/dist/extensions/pi-zentui/test/custom-variable-demand.test.ts +169 -0
- package/dist/extensions/pi-zentui/test/custom-variable-probe-reservation.test.ts +141 -0
- package/dist/extensions/pi-zentui/test/custom-variables-lifecycle.integration.test.ts +365 -0
- package/dist/extensions/pi-zentui/test/custom-variables.test.ts +330 -0
- package/dist/extensions/pi-zentui/test/editor-metadata-format.test.ts +121 -0
- package/dist/extensions/pi-zentui/test/editor-mouse.test.ts +507 -0
- package/dist/extensions/pi-zentui/test/editor-viewport-indicators.test.ts +247 -20
- package/dist/extensions/pi-zentui/test/extension-compliance.test.ts +204 -260
- package/dist/extensions/pi-zentui/test/extension-status-controller.test.ts +323 -0
- package/dist/extensions/pi-zentui/test/extension-status-lifecycle.integration.test.ts +466 -0
- package/dist/extensions/pi-zentui/test/extension-status-settings.test.ts +79 -0
- package/dist/extensions/pi-zentui/test/footer-alignment.test.ts +135 -0
- package/dist/extensions/pi-zentui/test/footer-authority.test.ts +69 -0
- package/dist/extensions/pi-zentui/test/footer-auto-compaction.test.ts +148 -0
- package/dist/extensions/pi-zentui/test/footer-format-cache.test.ts +186 -0
- package/dist/extensions/pi-zentui/test/footer-format.test.ts +154 -4
- package/dist/extensions/pi-zentui/test/footer-hidden.test.ts +312 -0
- package/dist/extensions/pi-zentui/test/footer-hyperlink.test.ts +22 -0
- package/dist/extensions/pi-zentui/test/footer-layout.test.ts +80 -0
- package/dist/extensions/pi-zentui/test/footer-thinking-level.test.ts +123 -0
- package/dist/extensions/pi-zentui/test/format.test.ts +75 -1
- package/dist/extensions/pi-zentui/test/git-probes.test.ts +182 -0
- package/dist/extensions/pi-zentui/test/github-status.test.ts +931 -0
- package/dist/extensions/pi-zentui/test/host-template-surfaces.test.ts +287 -0
- package/dist/extensions/pi-zentui/test/icons.test.ts +86 -16
- package/dist/extensions/pi-zentui/test/layered-editor.test.ts +53 -0
- package/dist/extensions/pi-zentui/test/live-context-integration.test.ts +154 -7
- package/dist/extensions/pi-zentui/test/live-context.test.ts +45 -0
- package/dist/extensions/pi-zentui/test/live-metadata-lifecycle.integration.test.ts +963 -0
- package/dist/extensions/pi-zentui/test/live-metadata.test.ts +767 -0
- package/dist/extensions/pi-zentui/test/minimalist-cache-hit-colors.test.ts +183 -0
- package/dist/extensions/pi-zentui/test/minimalist-editor.test.ts +222 -4
- package/dist/extensions/pi-zentui/test/minimalist-settings.test.ts +103 -0
- package/dist/extensions/pi-zentui/test/minimalist-templates.test.ts +489 -0
- package/dist/extensions/pi-zentui/test/omp-editor-composers.test.ts +324 -0
- package/dist/extensions/pi-zentui/test/omp-statusline.test.ts +579 -0
- package/dist/extensions/pi-zentui/test/omp-template-lookups.test.ts +630 -0
- package/dist/extensions/pi-zentui/test/omp-template-metrics.test.ts +72 -0
- package/dist/extensions/pi-zentui/test/omp-template-modes.test.ts +557 -0
- package/dist/extensions/pi-zentui/test/omp-ui.test.ts +93 -0
- package/dist/extensions/pi-zentui/test/package-contents.mjs +1 -0
- package/dist/extensions/pi-zentui/test/pi-version-policy.test.ts +37 -0
- package/dist/extensions/pi-zentui/test/project-demand-integration.test.ts +542 -0
- package/dist/extensions/pi-zentui/test/project-discovery.test.ts +412 -0
- package/dist/extensions/pi-zentui/test/project-refresh.test.ts +44 -0
- package/dist/extensions/pi-zentui/test/project-state.test.ts +38 -1
- package/dist/extensions/pi-zentui/test/responsive-dependencies.test.ts +7 -7
- package/dist/extensions/pi-zentui/test/runtime.test.ts +127 -2
- package/dist/extensions/pi-zentui/test/selesai-v030-gate.json +939 -0
- package/dist/extensions/pi-zentui/test/settings-command.test.ts +1330 -82
- package/dist/extensions/pi-zentui/test/settings-keys.test.ts +41 -0
- package/dist/extensions/pi-zentui/test/settings-list-selection.test.ts +88 -0
- package/dist/extensions/pi-zentui/test/settings-previews.test.ts +4 -1
- package/dist/extensions/pi-zentui/test/state.test.ts +15 -1
- package/dist/extensions/pi-zentui/test/telemetry-lifecycle-integration.test.ts +214 -12
- package/dist/extensions/pi-zentui/test/telemetry-snapshot.test.ts +246 -0
- package/dist/extensions/pi-zentui/test/thinking-experimental-cache.test.ts +246 -0
- package/dist/extensions/pi-zentui/test/thinking-experimental-rows.test.ts +22 -0
- package/dist/extensions/pi-zentui/test/thinking-experimental-tui.mjs +113 -51
- package/dist/extensions/pi-zentui/test/thinking-experimental.test.ts +576 -76
- package/dist/extensions/pi-zentui/test/thinking-steps.test.ts +23 -0
- package/dist/extensions/pi-zentui/test/token-rate.test.ts +450 -0
- package/dist/extensions/pi-zentui/test/turn-summary-format.test.ts +207 -0
- package/dist/extensions/pi-zentui/test/turn-summary-lifecycle.integration.test.ts +72 -5
- package/dist/extensions/pi-zentui/test/turn-summary-rate.test.ts +158 -0
- package/dist/extensions/pi-zentui/test/usage-lifecycle-integration.test.ts +421 -0
- package/dist/extensions/pi-zentui/test/usage-snapshot.test.ts +154 -0
- package/dist/extensions/pi-zentui/test/user-message-cache.test.ts +239 -0
- package/dist/extensions/pi-zentui/test/user-message-native-reduced-capabilities.test.ts +61 -0
- package/dist/extensions/pi-zentui/test/user-message-native.test.ts +447 -0
- package/dist/extensions/pi-zentui/test/user-message-styles.test.ts +2 -2
- package/dist/extensions/pi-zentui/test/working-line-editor-placement.test.ts +317 -0
- package/dist/extensions/pi-zentui/test/working-line-generation-cache.test.ts +238 -0
- package/dist/extensions/pi-zentui/test/working-line-lifecycle.integration.test.ts +674 -179
- package/dist/extensions/pi-zentui/test/working-line-message-ownership.test.ts +239 -0
- package/dist/extensions/pi-zentui/test/working-line-metric-animation.test.ts +284 -0
- package/dist/extensions/pi-zentui/test/working-line-placement.test.ts +298 -0
- package/dist/extensions/pi-zentui/test/working-line.test.ts +386 -18
- package/dist/extensions/pi-zentui/test/wrapped-editor-consumers.integration.test.ts +579 -0
- package/dist/extensions/pi-zentui/test/wrapped-editor-usage.integration.test.ts +298 -0
- package/dist/extensions/pi-zentui/tsconfig.json +1 -1
- package/dist/extensions/pi-zentui/vitest.host.config.ts +33 -0
- package/dist/extensions/question/index.ts +1 -5
- package/dist/extensions/rtk.test.ts +28 -15
- package/dist/extensions/rtk.ts +22 -22
- package/dist/extensions/skills-index/index.test.ts +99 -0
- package/dist/extensions/skills-index/index.ts +105 -0
- package/dist/extensions/skills-index/package.json +9 -0
- package/dist/extensions/tokenin-onboarding.ts +52 -210
- package/dist/extensions/tool-search/index.d.ts +11 -0
- package/dist/extensions/tool-search/index.js +14 -0
- package/dist/extensions/tool-search/tool.d.ts +72 -0
- package/dist/extensions/tool-search/tool.js +188 -0
- package/dist/index.d.ts +21 -9
- package/dist/index.js +17 -5
- package/dist/main.d.ts +10 -0
- package/dist/main.js +107 -43
- package/dist/migrations.js +4 -3
- package/dist/modes/index.d.ts +2 -1
- package/dist/modes/interactive/bug-report.js +4 -0
- package/dist/modes/interactive/components/armin.d.ts +3 -0
- package/dist/modes/interactive/components/armin.js +7 -5
- package/dist/modes/interactive/components/assistant-message.js +1 -1
- package/dist/modes/interactive/components/auth-url.d.ts +13 -0
- package/dist/modes/interactive/components/auth-url.js +36 -0
- package/dist/modes/interactive/components/bash-execution.d.ts +5 -1
- package/dist/modes/interactive/components/bash-execution.js +17 -14
- package/dist/modes/interactive/components/branch-summary-message.d.ts +2 -1
- package/dist/modes/interactive/components/branch-summary-message.js +5 -2
- package/dist/modes/interactive/components/compaction-summary-message.d.ts +2 -1
- package/dist/modes/interactive/components/compaction-summary-message.js +5 -2
- package/dist/modes/interactive/components/config-selector.js +13 -3
- package/dist/modes/interactive/components/custom-editor.js +7 -0
- package/dist/modes/interactive/components/custom-entry.d.ts +3 -1
- package/dist/modes/interactive/components/custom-entry.js +8 -2
- package/dist/modes/interactive/components/custom-message.js +1 -0
- package/dist/modes/interactive/components/first-time-setup.d.ts +4 -4
- package/dist/modes/interactive/components/first-time-setup.js +8 -2
- package/dist/modes/interactive/components/footer.d.ts +7 -0
- package/dist/modes/interactive/components/footer.js +44 -4
- package/dist/modes/interactive/components/index.d.ts +0 -1
- package/dist/modes/interactive/components/index.js +0 -1
- package/dist/modes/interactive/components/login-dialog.d.ts +2 -0
- package/dist/modes/interactive/components/login-dialog.js +11 -5
- package/dist/modes/interactive/components/mermaid.d.ts +10 -0
- package/dist/modes/interactive/components/mermaid.js +74 -0
- package/dist/modes/interactive/components/model-selector.d.ts +14 -9
- package/dist/modes/interactive/components/model-selector.js +79 -31
- package/dist/modes/interactive/components/oauth-selector.d.ts +8 -2
- package/dist/modes/interactive/components/oauth-selector.js +24 -21
- package/dist/modes/interactive/components/pi-logo.d.ts +18 -0
- package/dist/modes/interactive/components/pi-logo.js +36 -0
- package/dist/modes/interactive/components/radius-login-selector.d.ts +14 -0
- package/dist/modes/interactive/components/radius-login-selector.js +84 -0
- package/dist/modes/interactive/components/scoped-models-selector.d.ts +4 -0
- package/dist/modes/interactive/components/scoped-models-selector.js +26 -0
- package/dist/modes/interactive/components/settings-selector.d.ts +8 -11
- package/dist/modes/interactive/components/settings-selector.js +60 -102
- package/dist/modes/interactive/components/skill-invocation-message.d.ts +2 -1
- package/dist/modes/interactive/components/skill-invocation-message.js +5 -2
- package/dist/modes/interactive/components/themed-text.d.ts +16 -0
- package/dist/modes/interactive/components/themed-text.js +28 -0
- package/dist/modes/interactive/components/tool-execution.d.ts +11 -18
- package/dist/modes/interactive/components/tool-execution.js +34 -47
- package/dist/modes/interactive/components/tree-selector.js +7 -0
- package/dist/modes/interactive/components/user-message.d.ts +3 -1
- package/dist/modes/interactive/components/user-message.js +14 -6
- package/dist/modes/interactive/components/visual-truncate.d.ts +27 -3
- package/dist/modes/interactive/components/visual-truncate.js +39 -6
- package/dist/modes/interactive/external-editor.js +2 -1
- package/dist/modes/interactive/interactive-mode.d.ts +41 -8
- package/dist/modes/interactive/interactive-mode.js +854 -492
- package/dist/modes/interactive/program-status-reporter.d.ts +33 -0
- package/dist/modes/interactive/program-status-reporter.js +109 -0
- package/dist/modes/interactive/theme/dark.json +59 -72
- package/dist/modes/interactive/theme/light.json +57 -69
- package/dist/modes/interactive/theme/system-theme.d.ts +54 -0
- package/dist/modes/interactive/theme/system-theme.js +545 -0
- package/dist/modes/interactive/theme/theme-controller.d.ts +46 -6
- package/dist/modes/interactive/theme/theme-controller.js +127 -47
- package/dist/modes/interactive/theme/theme-json.d.ts +1 -0
- package/dist/modes/interactive/theme/theme-json.js +3 -1
- package/dist/modes/interactive/theme/theme-schema.json +7 -2
- package/dist/modes/interactive/theme/theme.d.ts +66 -39
- package/dist/modes/interactive/theme/theme.js +243 -320
- package/dist/modes/interactive/tui-renderer.d.ts +2 -1
- package/dist/modes/interactive/tui-renderer.js +1 -0
- package/dist/modes/json-event.d.ts +33 -0
- package/dist/modes/json-event.js +28 -0
- package/dist/modes/print-mode.js +12 -2
- package/dist/modes/rpc/intercom-bridge.d.ts +14 -0
- package/dist/modes/rpc/intercom-bridge.js +75 -0
- package/dist/modes/rpc/intercom-bridge.test.js +65 -0
- package/dist/modes/rpc/release-bridge.d.ts +35 -0
- package/dist/modes/rpc/release-bridge.js +159 -0
- package/dist/modes/rpc/release-bridge.test.d.ts +1 -0
- package/dist/modes/rpc/release-bridge.test.js +347 -0
- package/dist/modes/rpc/rpc-client.d.ts +43 -27
- package/dist/modes/rpc/rpc-client.js +97 -37
- package/dist/modes/rpc/rpc-intercom-transport.test.d.ts +1 -0
- package/dist/modes/rpc/rpc-intercom-transport.test.js +85 -0
- package/dist/modes/rpc/rpc-mode.d.ts +1 -13
- package/dist/modes/rpc/rpc-mode.js +250 -34
- package/dist/modes/rpc/rpc-release-transport.test.d.ts +1 -0
- package/dist/modes/rpc/rpc-release-transport.test.js +329 -0
- package/dist/modes/rpc/rpc-subagent-transport.test.d.ts +1 -0
- package/dist/modes/rpc/rpc-subagent-transport.test.js +60 -0
- package/dist/modes/rpc/rpc-types.d.ts +22 -23
- package/dist/modes/rpc/rpc-types.js +0 -6
- package/dist/modes/rpc/subagent-bridge.d.ts +23 -0
- package/dist/modes/rpc/subagent-bridge.js +93 -0
- package/dist/modes/rpc/test-fixtures/intercom-host.d.ts +1 -0
- package/dist/modes/rpc/test-fixtures/intercom-host.js +13 -0
- package/dist/package-manager-cli.js +16 -5
- package/dist/rpc-entry.js +1 -0
- package/dist/skills/pi-subagents/SKILL.md +109 -35
- package/dist/skills/pi-subagents/references/constraints-and-recipes.md +38 -238
- package/dist/skills/pi-subagents/references/execution-controls.md +181 -83
- package/dist/skills/pi-subagents/references/management-authoring-rpc.md +9 -9
- package/dist/skills/pi-subagents/references/multi-lane-orchestration.md +24 -2
- package/dist/skills/pi-subagents/references/prompting-and-roles.md +121 -91
- package/dist/skills/pi-subagents/references/review-and-validation.md +73 -0
- package/dist/utils/ansi.d.ts +8 -0
- package/dist/utils/ansi.js +30 -11
- package/dist/utils/clipboard-image.js +14 -17
- package/dist/utils/clipboard.d.ts +2 -0
- package/dist/utils/clipboard.js +17 -11
- package/dist/utils/frontmatter.js +2 -1
- package/dist/utils/image-convert.d.ts +12 -0
- package/dist/utils/image-convert.js +45 -6
- package/dist/utils/image-resize-core.d.ts +12 -0
- package/dist/utils/image-resize-core.js +5 -0
- package/dist/utils/image-resize-worker.js +3 -2
- package/dist/utils/image-resize.js +9 -10
- package/dist/utils/mime.js +1 -1
- package/dist/utils/output-files.d.ts +14 -0
- package/dist/utils/output-files.js +29 -0
- package/dist/utils/paths.d.ts +6 -3
- package/dist/utils/paths.js +28 -5
- package/dist/utils/shell.d.ts +1 -3
- package/dist/utils/shell.js +3 -30
- package/dist/utils/syntax-highlight.d.ts +1 -0
- package/dist/utils/syntax-highlight.js +68 -2
- package/dist/utils/tool-result-images.d.ts +20 -0
- package/dist/utils/tool-result-images.js +47 -0
- package/dist/utils/tools-manager.d.ts +5 -0
- package/dist/utils/tools-manager.js +6 -6
- package/dist/utils/version-check.d.ts +4 -0
- package/dist/utils/version-check.js +20 -2
- package/docs/cli-integration.md +104 -0
- package/docs/cli.md +333 -0
- package/docs/codemode.md +230 -0
- package/docs/configuration.md +47 -0
- package/docs/environment-variables.md +5 -0
- package/docs/extensions.md +107 -30
- package/docs/json.md +8 -4
- package/docs/keybindings.md +10 -10
- package/docs/mcp.md +262 -0
- package/docs/models.md +104 -3
- package/docs/providers.md +20 -2
- package/docs/rpc-subagent.schema.json +491 -0
- package/docs/rpc.md +223 -13
- package/docs/sdk.md +41 -33
- package/docs/security.md +21 -20
- package/docs/settings.md +18 -46
- package/docs/terminal-setup.md +14 -0
- package/docs/virtual-models.md +114 -0
- package/examples/extensions/jev-router.ts +113 -0
- package/examples/extensions/tokenin-usage-widget.ts +124 -0
- package/examples/rpc-client.ts +35 -0
- package/examples/sdk/14-codemode-mcp.ts +67 -0
- package/package.json +16 -8
- package/dist/core/agent-session-auto-handoff.test.js +0 -195
- package/dist/core/built-in-extensions.d.ts +0 -2
- package/dist/core/built-in-extensions.js +0 -2
- package/dist/core/llama/provider.js +0 -143
- package/dist/core/settings-manager-auto-handoff.test.js +0 -53
- package/dist/extensions/capability-gateway/catalog.ts +0 -177
- package/dist/extensions/capability-gateway/index.test.ts +0 -226
- package/dist/extensions/capability-gateway/index.ts +0 -669
- package/dist/extensions/capability-gateway/integration.test.ts +0 -803
- package/dist/extensions/capability-gateway/package.json +0 -16
- package/dist/extensions/capability-gateway/routing.test.ts +0 -574
- package/dist/extensions/capability-gateway/routing.ts +0 -403
- package/dist/extensions/pi-subagents/runner-server-preload.mjs +0 -13
- package/dist/extensions/pi-subagents/src/runs/shared/completion-evidence.ts +0 -89
- package/dist/extensions/pi-subagents/src/runs/shared/completion-guard.ts +0 -259
- package/dist/extensions/pi-subagents/src/runs/shared/llm-intent-arbiter.ts +0 -312
- package/dist/extensions/pi-subagents/src/runs/shared/model-exclusions.ts +0 -374
- package/dist/extensions/pi-subagents/src/runs/shared/readonly-model-continuation.ts +0 -69
- package/dist/extensions/pi-subagents/src/runs/shared/readonly-session-evidence.ts +0 -307
- package/dist/extensions/pi-subagents/src/runs/shared/task-intent.ts +0 -211
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/cli.d.ts +0 -3
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/register-bedrock.d.ts +0 -2
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/restore-sandbox-env.d.ts +0 -17
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/args.d.ts +0 -57
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/config-selector.d.ts +0 -16
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/file-processor.d.ts +0 -15
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/initial-message.d.ts +0 -18
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/list-models.d.ts +0 -9
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/project-trust.d.ts +0 -10
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/session-picker.d.ts +0 -10
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/startup-ui.d.ts +0 -20
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli.d.ts +0 -3
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/config.d.ts +0 -96
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session-runtime.d.ts +0 -119
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session-services.d.ts +0 -85
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session.d.ts +0 -620
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/auth-guidance.d.ts +0 -5
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/auth-storage.d.ts +0 -56
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/bash-executor.d.ts +0 -32
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/cache-stats.d.ts +0 -49
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/branch-summarization.d.ts +0 -93
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/compaction.d.ts +0 -128
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/index.d.ts +0 -7
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/utils.d.ts +0 -38
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/defaults.d.ts +0 -3
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/diagnostics.d.ts +0 -15
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/event-bus.d.ts +0 -9
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/exec.d.ts +0 -29
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/experimental.d.ts +0 -2
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/ansi-to-html.d.ts +0 -22
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/index.d.ts +0 -37
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/tool-renderer.d.ts +0 -34
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/index.d.ts +0 -12
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/loader.d.ts +0 -23
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/runner.d.ts +0 -171
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/types.d.ts +0 -1261
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/wrapper.d.ts +0 -20
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/footer-data-provider.d.ts +0 -54
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/http-dispatcher.d.ts +0 -22
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/index.d.ts +0 -13
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/keybindings.d.ts +0 -358
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/messages.d.ts +0 -77
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-config.d.ts +0 -512
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-registry.d.ts +0 -43
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-resolver.d.ts +0 -121
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-runtime.d.ts +0 -82
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/models-store.d.ts +0 -17
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/output-guard.d.ts +0 -7
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/package-manager.d.ts +0 -210
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/project-trust.d.ts +0 -15
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/prompt-templates.d.ts +0 -54
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/provider-attribution.d.ts +0 -4
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/provider-composer.d.ts +0 -55
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/radius.d.ts +0 -2
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/remote-catalog-provider.d.ts +0 -5
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/resolve-config-value.d.ts +0 -30
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/resource-loader.d.ts +0 -206
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/runtime-credentials.d.ts +0 -15
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/sdk.d.ts +0 -106
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/session-cwd.d.ts +0 -19
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/session-manager.d.ts +0 -356
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/settings-manager.d.ts +0 -297
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/skills.d.ts +0 -60
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/slash-commands.d.ts +0 -15
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/source-info.d.ts +0 -18
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/system-prompt.d.ts +0 -28
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/telemetry.d.ts +0 -3
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/timings.d.ts +0 -10
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/bash.d.ts +0 -68
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/edit-diff.d.ts +0 -106
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/edit.d.ts +0 -51
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/file-mutation-queue.d.ts +0 -6
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/find.d.ts +0 -35
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/grep.d.ts +0 -37
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/index.d.ts +0 -40
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/ls.d.ts +0 -37
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/output-accumulator.d.ts +0 -52
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/path-utils.d.ts +0 -10
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/read.d.ts +0 -35
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/render-utils.d.ts +0 -24
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/tool-definition-wrapper.d.ts +0 -14
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/truncate.d.ts +0 -70
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/write.d.ts +0 -26
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/trust-manager.d.ts +0 -36
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/usage-totals.d.ts +0 -19
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/client.d.ts +0 -61
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/huggingface.d.ts +0 -23
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/index.d.ts +0 -3
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/provider.d.ts +0 -10
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/ui.d.ts +0 -42
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/index.d.ts +0 -35
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/main.d.ts +0 -12
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/migrations.d.ts +0 -33
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/index.d.ts +0 -9
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/armin.d.ts +0 -34
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/assistant-message.d.ts +0 -22
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/bash-execution.d.ts +0 -34
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/bordered-loader.d.ts +0 -16
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/branch-summary-message.d.ts +0 -16
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/compaction-summary-message.d.ts +0 -16
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/config-selector.d.ts +0 -102
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/countdown-timer.d.ts +0 -14
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-editor.d.ts +0 -21
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-entry.d.ts +0 -19
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-message.d.ts +0 -20
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/daxnuts.d.ts +0 -23
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/diff.d.ts +0 -12
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/dynamic-border.d.ts +0 -15
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/earendil-announcement.d.ts +0 -5
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-editor.d.ts +0 -22
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-input.d.ts +0 -23
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-selector.d.ts +0 -26
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/first-time-setup.d.ts +0 -25
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/footer.d.ts +0 -32
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/index.d.ts +0 -34
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/keybinding-hints.d.ts +0 -13
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/login-dialog.d.ts +0 -52
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/model-selector.d.ts +0 -54
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/oauth-selector.d.ts +0 -33
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/scoped-models-selector.d.ts +0 -42
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/session-selector-search.d.ts +0 -23
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/session-selector.d.ts +0 -95
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/settings-selector.d.ts +0 -77
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/show-images-selector.d.ts +0 -10
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/skill-invocation-message.d.ts +0 -17
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/status-indicator.d.ts +0 -28
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/theme-selector.d.ts +0 -11
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/thinking-selector.d.ts +0 -11
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/tool-execution.d.ts +0 -63
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/tree-selector.d.ts +0 -94
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/trust-selector.d.ts +0 -23
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/user-message-selector.d.ts +0 -30
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/user-message.d.ts +0 -14
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/visual-truncate.d.ts +0 -24
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/interactive-mode.d.ts +0 -394
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/model-search.d.ts +0 -12
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/theme/theme-controller.d.ts +0 -29
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/theme/theme.d.ts +0 -120
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/print-mode.d.ts +0 -28
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/jsonl.d.ts +0 -17
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-client.d.ts +0 -246
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-mode.d.ts +0 -20
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-types.d.ts +0 -457
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/package-manager-cli.d.ts +0 -8
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/rpc-entry.d.ts +0 -3
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/ansi.d.ts +0 -2
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/changelog.d.ts +0 -22
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/child-process.d.ts +0 -18
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard-image.d.ts +0 -11
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard-native.d.ts +0 -11
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard.d.ts +0 -4
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/deprecation.d.ts +0 -4
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/exif-orientation.d.ts +0 -5
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/frontmatter.d.ts +0 -8
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/fs-watch.d.ts +0 -5
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/git.d.ts +0 -26
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/html.d.ts +0 -7
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-convert.d.ts +0 -10
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-process.d.ts +0 -18
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize-core.d.ts +0 -30
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize-worker.d.ts +0 -2
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize.d.ts +0 -16
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/json.d.ts +0 -3
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/mime.d.ts +0 -3
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/open-browser.d.ts +0 -9
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/paths.d.ts +0 -31
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/photon.d.ts +0 -21
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/pi-user-agent.d.ts +0 -2
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/shell.d.ts +0 -31
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/sleep.d.ts +0 -5
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/syntax-highlight.d.ts +0 -12
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/tools-manager.d.ts +0 -3
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/version-check.d.ts +0 -15
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/windows-self-update.d.ts +0 -3
- package/dist/extensions/pi-subagents/test/smoke/pi085-child.ts +0 -31
- package/dist/extensions/pi-subagents/test/smoke/pi085-clean-install.mjs +0 -74
- package/dist/extensions/pi-subagents/test/unit/completion-evidence.test.ts +0 -150
- package/dist/extensions/pi-subagents/test/unit/completion-guard.test.ts +0 -766
- package/dist/extensions/pi-subagents/test/unit/llm-intent-arbiter.test.ts +0 -327
- package/dist/extensions/pi-subagents/test/unit/model-exclusions.test.ts +0 -309
- package/dist/extensions/pi-subagents/test/unit/model-fallback.test.ts +0 -1093
- package/dist/extensions/pi-subagents/test/unit/readonly-model-continuation.test.ts +0 -94
- package/dist/extensions/pi-subagents/test/unit/readonly-session-evidence.test.ts +0 -1329
- package/dist/extensions/pi-subagents/test/unit/task-intent.test.ts +0 -153
- package/dist/extensions/pi-zentui/extensions/zentui/accent-rail-layout-patch.ts +0 -457
- package/dist/extensions/pi-zentui/test/accent-rail-layout-patch.test.ts +0 -669
- package/dist/extensions/pi-zentui/test/thinking-experimental-docs.test.ts +0 -51
- package/dist/modes/interactive/components/daxnuts.d.ts +0 -22
- package/dist/modes/interactive/components/daxnuts.js +0 -139
- /package/dist/core/{agent-session-auto-handoff.test.d.ts → agent-session-custom-tools.test.d.ts} +0 -0
- /package/dist/{core → extensions}/llama/huggingface.d.ts +0 -0
- /package/dist/{core → extensions}/llama/huggingface.js +0 -0
- /package/dist/{core → extensions}/llama/index.d.ts +0 -0
- /package/dist/{core → extensions}/llama/ui.d.ts +0 -0
- /package/dist/{core → extensions}/llama/ui.js +0 -0
- /package/dist/{core/settings-manager-auto-handoff.test.d.ts → modes/rpc/intercom-bridge.test.d.ts} +0 -0
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
import test from "node:test";
|
|
2
2
|
import assert from "node:assert/strict";
|
|
3
|
-
import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { chmodSync, existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import { tmpdir } from "node:os";
|
|
6
6
|
import { EventEmitter, once } from "node:events";
|
|
7
7
|
import { spawn, type ChildProcess } from "node:child_process";
|
|
8
|
+
import { pathToFileURL } from "node:url";
|
|
8
9
|
import { ReplyTracker } from "./reply-tracker.ts";
|
|
9
10
|
import type { BrokerMessage, Message, SessionInfo } from "./types.ts";
|
|
10
11
|
import {
|
|
11
12
|
INTERCOM_EXTENSION_REGISTER_EVENT,
|
|
12
13
|
INTERCOM_OUTBOX_REQUEST_EVENT,
|
|
13
14
|
INTERCOM_OUTBOX_RESULT_EVENT,
|
|
15
|
+
INTERCOM_SESSION_IDENTITY_EVENT,
|
|
14
16
|
type IntercomExtensionChannel,
|
|
15
17
|
type IntercomOutboxResultV1,
|
|
18
|
+
type IntercomSessionIdentityRequestV1,
|
|
16
19
|
} from "./extension-api.ts";
|
|
17
20
|
|
|
18
21
|
const repoDir = process.cwd();
|
|
@@ -27,17 +30,29 @@ const childEnvKeys = [
|
|
|
27
30
|
"SELESAI_SUBAGENT_INTERCOM_SESSION_NAME",
|
|
28
31
|
"SELESAI_SUBAGENT_SUPERVISOR_CHANNEL_DIR",
|
|
29
32
|
] as const;
|
|
30
|
-
|
|
33
|
+
// Darwin Unix sockets have a short path limit; its default tmpdir is already ~65 characters.
|
|
34
|
+
const sharedHomeDir = mkdtempSync(path.join(process.platform === "darwin" ? "/tmp" : tmpdir(), "pi-intercom-home-"));
|
|
35
|
+
const previousAgentDir = process.env.SELESAI_CODING_AGENT_DIR;
|
|
36
|
+
process.env.SELESAI_CODING_AGENT_DIR = path.join(sharedHomeDir, ".selesai", "agent");
|
|
31
37
|
const previousHome = process.env.HOME;
|
|
32
38
|
const previousUserProfile = process.env.USERPROFILE;
|
|
39
|
+
const previousHerdrPaneId = process.env.HERDR_PANE_ID;
|
|
33
40
|
process.env.HOME = sharedHomeDir;
|
|
34
41
|
process.env.USERPROFILE = sharedHomeDir;
|
|
42
|
+
// Synthetic extension harnesses are not running in the parent test runner's
|
|
43
|
+
// Herdr pane. Individual Herdr integration cases register an explicit pane id.
|
|
44
|
+
delete process.env.HERDR_PANE_ID;
|
|
35
45
|
const { IntercomClient } = await import("./broker/client.ts");
|
|
36
|
-
const {
|
|
46
|
+
const { getTsxLoaderPath } = await import("./broker/spawn.ts");
|
|
47
|
+
const tsxImportArgs = ["--import", pathToFileURL(getTsxLoaderPath()).href];
|
|
37
48
|
const { getAskTimeoutMs, getConfigPath } = await import("./config.ts");
|
|
38
49
|
process.on("exit", () => {
|
|
50
|
+
if (previousAgentDir === undefined) delete process.env.SELESAI_CODING_AGENT_DIR;
|
|
51
|
+
else process.env.SELESAI_CODING_AGENT_DIR = previousAgentDir;
|
|
39
52
|
process.env.HOME = previousHome;
|
|
40
53
|
process.env.USERPROFILE = previousUserProfile;
|
|
54
|
+
if (previousHerdrPaneId === undefined) delete process.env.HERDR_PANE_ID;
|
|
55
|
+
else process.env.HERDR_PANE_ID = previousHerdrPaneId;
|
|
41
56
|
rmSync(sharedHomeDir, { recursive: true, force: true });
|
|
42
57
|
});
|
|
43
58
|
|
|
@@ -187,6 +202,7 @@ function createExtensionHarness(sessionName: string | (() => string) = "child-wo
|
|
|
187
202
|
let activeToolNames = [...(options.activeTools ?? [])];
|
|
188
203
|
const entries: Array<{ type: string; data: unknown }> = [];
|
|
189
204
|
const sentMessages: Array<{ message: { customType?: string; content?: string; details?: unknown }; options?: { triggerTurn?: boolean; deliverAs?: string }; activeTools: string[] }> = [];
|
|
205
|
+
const userMessages: string[] = [];
|
|
190
206
|
const pi = {
|
|
191
207
|
getSessionName: () => typeof sessionName === "function" ? sessionName() : currentSessionName,
|
|
192
208
|
setSessionName: (name: string) => { currentSessionName = name; },
|
|
@@ -216,6 +232,7 @@ function createExtensionHarness(sessionName: string | (() => string) = "child-wo
|
|
|
216
232
|
sendMessage: (message: { customType?: string; content?: string; details?: unknown }, options?: { triggerTurn?: boolean; deliverAs?: string }) => {
|
|
217
233
|
sentMessages.push({ message, options, activeTools: [...activeToolNames] });
|
|
218
234
|
},
|
|
235
|
+
sendUserMessage: (content: string) => { userMessages.push(content); },
|
|
219
236
|
appendEntry: (type: string, data: unknown) => entries.push({ type, data }),
|
|
220
237
|
};
|
|
221
238
|
const ctx = {
|
|
@@ -235,7 +252,9 @@ function createExtensionHarness(sessionName: string | (() => string) = "child-wo
|
|
|
235
252
|
commands,
|
|
236
253
|
entries,
|
|
237
254
|
sentMessages,
|
|
255
|
+
userMessages,
|
|
238
256
|
getActiveTools: () => pi.getActiveTools(),
|
|
257
|
+
clearLifecycleHandlers: () => lifecycleHandlers.clear(),
|
|
239
258
|
async emitLifecycle(event: string, payload: unknown = {}, eventContext: unknown = ctx) {
|
|
240
259
|
for (const handler of lifecycleHandlers.get(event) ?? []) {
|
|
241
260
|
await handler(payload, eventContext);
|
|
@@ -291,7 +310,7 @@ test("opt-in TCP broker requires endpoint state for health and registration", {
|
|
|
291
310
|
const { createMessageReader, writeMessage } = await import("./broker/framing.ts");
|
|
292
311
|
const agentDir = mkdtempSync(path.join(tmpdir(), "pi-intercom-tcp-agent-"));
|
|
293
312
|
const broker = spawn(process.execPath, [
|
|
294
|
-
|
|
313
|
+
...tsxImportArgs,
|
|
295
314
|
"-e",
|
|
296
315
|
"Object.defineProperty(process, 'platform', { value: 'win32' }); import('./broker/broker.ts').catch((error) => { console.error(error); process.exit(1); });",
|
|
297
316
|
], {
|
|
@@ -405,7 +424,7 @@ test("opt-in TCP broker requires endpoint state for health and registration", {
|
|
|
405
424
|
});
|
|
406
425
|
|
|
407
426
|
async function setupClients() {
|
|
408
|
-
const broker = spawn(process.execPath, [
|
|
427
|
+
const broker = spawn(process.execPath, [...tsxImportArgs, path.join(repoDir, "broker", "broker.ts")], {
|
|
409
428
|
cwd: repoDir,
|
|
410
429
|
env: { ...process.env, HOME: sharedHomeDir, USERPROFILE: sharedHomeDir },
|
|
411
430
|
stdio: ["ignore", "pipe", "pipe"],
|
|
@@ -439,13 +458,19 @@ async function setupClients() {
|
|
|
439
458
|
cleanup: async () => {
|
|
440
459
|
await planner.disconnect().catch(() => undefined);
|
|
441
460
|
await orchestrator.disconnect().catch(() => undefined);
|
|
442
|
-
broker.
|
|
443
|
-
|
|
461
|
+
if (broker.exitCode === null && broker.signalCode === null) {
|
|
462
|
+
const exited = once(broker, "exit").catch(() => undefined);
|
|
463
|
+
broker.kill("SIGTERM");
|
|
464
|
+
await exited;
|
|
465
|
+
}
|
|
444
466
|
},
|
|
445
467
|
};
|
|
446
468
|
} catch (error) {
|
|
447
|
-
broker.
|
|
448
|
-
|
|
469
|
+
if (broker.exitCode === null && broker.signalCode === null) {
|
|
470
|
+
const exited = once(broker, "exit").catch(() => undefined);
|
|
471
|
+
broker.kill("SIGTERM");
|
|
472
|
+
await exited;
|
|
473
|
+
}
|
|
449
474
|
throw error;
|
|
450
475
|
}
|
|
451
476
|
}
|
|
@@ -497,6 +522,14 @@ function waitForOutboxResults(results: IntercomOutboxResultV1[], count: number,
|
|
|
497
522
|
});
|
|
498
523
|
}
|
|
499
524
|
|
|
525
|
+
async function waitForCondition(condition: () => boolean, description: string): Promise<void> {
|
|
526
|
+
const deadline = Date.now() + 3000;
|
|
527
|
+
while (!condition() && Date.now() < deadline) {
|
|
528
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
529
|
+
}
|
|
530
|
+
assert.ok(condition(), `Timed out waiting for ${description}`);
|
|
531
|
+
}
|
|
532
|
+
|
|
500
533
|
async function waitForReplyMessage(messages: Message[], messageId: string, timeoutMs = 3000): Promise<Message> {
|
|
501
534
|
const deadline = Date.now() + timeoutMs;
|
|
502
535
|
while (Date.now() < deadline) {
|
|
@@ -658,7 +691,7 @@ test("broker accepts caller supplied stable IDs across reconnect", { concurrency
|
|
|
658
691
|
});
|
|
659
692
|
|
|
660
693
|
test("broker scopes discovery, routing, mailbox, and presence", { concurrency: false }, async () => {
|
|
661
|
-
const broker = spawn(process.execPath, [
|
|
694
|
+
const broker = spawn(process.execPath, [...tsxImportArgs, path.join(repoDir, "broker", "broker.ts")], {
|
|
662
695
|
cwd: repoDir,
|
|
663
696
|
env: { ...process.env, HOME: sharedHomeDir, USERPROFILE: sharedHomeDir },
|
|
664
697
|
stdio: ["ignore", "pipe", "pipe"],
|
|
@@ -731,8 +764,11 @@ test("broker scopes discovery, routing, mailbox, and presence", { concurrency: f
|
|
|
731
764
|
await waitForReplyMessage(recovered, "alpha-scoped-mailbox");
|
|
732
765
|
} finally {
|
|
733
766
|
await Promise.all(clients.map((client) => client.disconnect().catch(() => undefined)));
|
|
734
|
-
if (broker.exitCode === null && broker.signalCode === null) broker.
|
|
735
|
-
|
|
767
|
+
if (broker.exitCode === null && broker.signalCode === null) if (broker.exitCode === null && broker.signalCode === null) {
|
|
768
|
+
const exited = once(broker, "exit").catch(() => undefined);
|
|
769
|
+
broker.kill("SIGTERM");
|
|
770
|
+
await exited;
|
|
771
|
+
}
|
|
736
772
|
}
|
|
737
773
|
});
|
|
738
774
|
|
|
@@ -908,6 +944,94 @@ test("broker rejects changed message content after a rebound exact-target failur
|
|
|
908
944
|
}
|
|
909
945
|
});
|
|
910
946
|
|
|
947
|
+
test("all-non-Herdr rosters preserve upstream structured and text output without invoking Herdr", { concurrency: false }, async () => {
|
|
948
|
+
const fixtureDir = mkdtempSync(path.join(tmpdir(), "pi-intercom-no-herdr-"));
|
|
949
|
+
const marker = path.join(fixtureDir, "invoked");
|
|
950
|
+
const fixtureBin = path.join(fixtureDir, "herdr-must-not-run");
|
|
951
|
+
writeFileSync(fixtureBin, `#!/bin/sh\ntouch ${JSON.stringify(marker)}\nexit 99\n`);
|
|
952
|
+
chmodSync(fixtureBin, 0o755);
|
|
953
|
+
const previousHerdrBin = process.env.HERDR_BIN;
|
|
954
|
+
process.env.HERDR_BIN = fixtureBin;
|
|
955
|
+
let setup: Awaited<ReturnType<typeof setupClients>>;
|
|
956
|
+
try {
|
|
957
|
+
setup = await setupClients();
|
|
958
|
+
} finally {
|
|
959
|
+
if (previousHerdrBin === undefined) delete process.env.HERDR_BIN;
|
|
960
|
+
else process.env.HERDR_BIN = previousHerdrBin;
|
|
961
|
+
}
|
|
962
|
+
const harness = createExtensionHarness("plain-worker", { sessionId: "plain-worker-session" });
|
|
963
|
+
|
|
964
|
+
try {
|
|
965
|
+
const structured = await setup.planner.listSessions();
|
|
966
|
+
assert.equal(structured.every((session) => !("herdrLocation" in session)), true);
|
|
967
|
+
assert.equal(existsSync(marker), false);
|
|
968
|
+
|
|
969
|
+
const { default: piIntercomExtension } = await import("./index.ts");
|
|
970
|
+
piIntercomExtension(harness.pi as never);
|
|
971
|
+
await harness.emitLifecycle("session_start");
|
|
972
|
+
await waitForSessionByName(setup.planner, "plain-worker");
|
|
973
|
+
const intercomTool = harness.tools.find((tool) => tool.name === "intercom")!;
|
|
974
|
+
const result = await intercomTool.execute("plain-list", { action: "list" }, new AbortController().signal, undefined, harness.ctx);
|
|
975
|
+
const text = result.content.map((part) => part.text).join("\n");
|
|
976
|
+
assert.match(text, /Current session:/);
|
|
977
|
+
assert.match(text, /Other sessions:/);
|
|
978
|
+
assert.doesNotMatch(text, /Herdr|not under/);
|
|
979
|
+
assert.equal(existsSync(marker), false);
|
|
980
|
+
} finally {
|
|
981
|
+
await harness.emitLifecycle("session_shutdown");
|
|
982
|
+
await setup.cleanup();
|
|
983
|
+
rmSync(fixtureDir, { recursive: true, force: true });
|
|
984
|
+
}
|
|
985
|
+
});
|
|
986
|
+
|
|
987
|
+
test("broker resolves a registered Herdr pane through one live snapshot", { concurrency: false }, async () => {
|
|
988
|
+
const fixtureDir = mkdtempSync(path.join(tmpdir(), "pi-intercom-herdr-"));
|
|
989
|
+
const fixtureBin = path.join(fixtureDir, "herdr-fixture");
|
|
990
|
+
writeFileSync(fixtureBin, `#!/usr/bin/env node
|
|
991
|
+
console.log(JSON.stringify({ result: { snapshot: {
|
|
992
|
+
panes: [{ pane_id: "pane-current", tab_id: "tab-current", workspace_id: "workspace-current", agent_session: { kind: "path", source: "herdr:pi", value: "/sessions/worker.jsonl" } }],
|
|
993
|
+
tabs: [{ tab_id: "tab-current", workspace_id: "workspace-current", label: "Review" }],
|
|
994
|
+
workspaces: [{ workspace_id: "workspace-current", label: "Research" }]
|
|
995
|
+
} } }));
|
|
996
|
+
`);
|
|
997
|
+
chmodSync(fixtureBin, 0o755);
|
|
998
|
+
const previousHerdrBin = process.env.HERDR_BIN;
|
|
999
|
+
process.env.HERDR_BIN = fixtureBin;
|
|
1000
|
+
let setup: Awaited<ReturnType<typeof setupClients>>;
|
|
1001
|
+
try {
|
|
1002
|
+
setup = await setupClients();
|
|
1003
|
+
} finally {
|
|
1004
|
+
if (previousHerdrBin === undefined) delete process.env.HERDR_BIN;
|
|
1005
|
+
else process.env.HERDR_BIN = previousHerdrBin;
|
|
1006
|
+
}
|
|
1007
|
+
const worker = new IntercomClient();
|
|
1008
|
+
|
|
1009
|
+
try {
|
|
1010
|
+
await worker.connect({
|
|
1011
|
+
name: "herdr-worker",
|
|
1012
|
+
cwd: repoDir,
|
|
1013
|
+
model: "test-model",
|
|
1014
|
+
pid: process.pid,
|
|
1015
|
+
startedAt: Date.now(),
|
|
1016
|
+
lastActivity: Date.now(),
|
|
1017
|
+
herdrPaneId: "pane-at-launch",
|
|
1018
|
+
herdrSessionPath: "/sessions/worker.jsonl",
|
|
1019
|
+
});
|
|
1020
|
+
const session = await waitForSessionByName(setup.planner, "herdr-worker");
|
|
1021
|
+
assert.deepEqual(session.herdrLocation && { ...session.herdrLocation, refreshedAt: 0 }, {
|
|
1022
|
+
status: "current",
|
|
1023
|
+
workspace: { id: "workspace-current", label: "Research" },
|
|
1024
|
+
tab: { id: "tab-current", label: "Review" },
|
|
1025
|
+
paneId: "pane-current",
|
|
1026
|
+
refreshedAt: 0,
|
|
1027
|
+
});
|
|
1028
|
+
} finally {
|
|
1029
|
+
await worker.disconnect().catch(() => undefined);
|
|
1030
|
+
await setup.cleanup();
|
|
1031
|
+
rmSync(fixtureDir, { recursive: true, force: true });
|
|
1032
|
+
}
|
|
1033
|
+
});
|
|
1034
|
+
|
|
911
1035
|
test("broker propagates a session's tmux pane id into the roster", { concurrency: false }, async () => {
|
|
912
1036
|
const { planner, cleanup } = await setupClients();
|
|
913
1037
|
const worker = new IntercomClient();
|
|
@@ -1314,6 +1438,84 @@ test("extension can pin a restart-stable intercom session id", { concurrency: fa
|
|
|
1314
1438
|
}
|
|
1315
1439
|
});
|
|
1316
1440
|
|
|
1441
|
+
test("a session identity claim sets the intercom id and keeps the readable session name", { concurrency: false }, async () => {
|
|
1442
|
+
const { planner, cleanup } = await setupClients();
|
|
1443
|
+
const { default: piIntercomExtension } = await import("./index.ts");
|
|
1444
|
+
const previousStableId = process.env.PI_INTERCOM_STABLE_ID;
|
|
1445
|
+
const previousPublishedId = process.env.PI_INTERCOM_SESSION_ID;
|
|
1446
|
+
process.env.PI_INTERCOM_STABLE_ID = "process-wide-id";
|
|
1447
|
+
const harness = createExtensionHarness("worker: fix auth refresh", { sessionId: "transient-pi-session" });
|
|
1448
|
+
harness.pi.events.on(INTERCOM_SESSION_IDENTITY_EVENT, (request) => {
|
|
1449
|
+
(request as IntercomSessionIdentityRequestV1).claim(" subagent-worker-run1-1 ");
|
|
1450
|
+
});
|
|
1451
|
+
|
|
1452
|
+
try {
|
|
1453
|
+
piIntercomExtension(harness.pi as never);
|
|
1454
|
+
await harness.emitLifecycle("session_start");
|
|
1455
|
+
const session = await waitForSessionId(planner, "subagent-worker-run1-1");
|
|
1456
|
+
assert.equal(session.name, "worker: fix auth refresh");
|
|
1457
|
+
await harness.emitLifecycle("session_shutdown");
|
|
1458
|
+
} finally {
|
|
1459
|
+
if (previousStableId === undefined) delete process.env.PI_INTERCOM_STABLE_ID;
|
|
1460
|
+
else process.env.PI_INTERCOM_STABLE_ID = previousStableId;
|
|
1461
|
+
if (previousPublishedId === undefined) delete process.env.PI_INTERCOM_SESSION_ID;
|
|
1462
|
+
else process.env.PI_INTERCOM_SESSION_ID = previousPublishedId;
|
|
1463
|
+
await cleanup();
|
|
1464
|
+
}
|
|
1465
|
+
});
|
|
1466
|
+
|
|
1467
|
+
test("intercom handover summarizes the session and delivers it to the target", { concurrency: false }, async () => {
|
|
1468
|
+
const { orchestrator, cleanup } = await setupClients();
|
|
1469
|
+
const { default: piIntercomExtension } = await import("./index.ts");
|
|
1470
|
+
const harness = createExtensionHarness("handover-sender");
|
|
1471
|
+
const modelRequests: Array<{ systemPrompt?: string; messages: Array<{ content: Array<{ text: string }> }> }> = [];
|
|
1472
|
+
const ctx = {
|
|
1473
|
+
...harness.ctx,
|
|
1474
|
+
sessionManager: {
|
|
1475
|
+
...harness.ctx.sessionManager,
|
|
1476
|
+
getSessionFile: () => "/sessions/handover-sender.jsonl",
|
|
1477
|
+
getBranch: () => [{ type: "message", id: "a", parentId: null, timestamp: "2026-09-30T00:00:00.000Z", message: { role: "user", content: "fix the adapter", timestamp: 0 } }],
|
|
1478
|
+
},
|
|
1479
|
+
modelRegistry: {
|
|
1480
|
+
complete: async (_model: unknown, context: (typeof modelRequests)[number]) => {
|
|
1481
|
+
modelRequests.push(context);
|
|
1482
|
+
return { stopReason: "stop", content: [{ type: "text", text: "## Next task\nPort the fix" }] };
|
|
1483
|
+
},
|
|
1484
|
+
},
|
|
1485
|
+
};
|
|
1486
|
+
|
|
1487
|
+
try {
|
|
1488
|
+
piIntercomExtension(harness.pi as never);
|
|
1489
|
+
await harness.emitLifecycle("session_start");
|
|
1490
|
+
const intercomTool = harness.tools.find((tool) => tool.name === "intercom")!;
|
|
1491
|
+
|
|
1492
|
+
const rejected = await intercomTool.execute("handover-reply", { action: "handover", to: "orchestrator", replyTo: "m1" }, new AbortController().signal, undefined, ctx);
|
|
1493
|
+
assert.equal(rejected.details?.error, true);
|
|
1494
|
+
const withAttachment = await intercomTool.execute("handover-attach", { action: "handover", to: "orchestrator", attachments: [{ type: "file", name: "a", content: "b" }] }, new AbortController().signal, undefined, ctx);
|
|
1495
|
+
assert.equal(withAttachment.details?.error, true);
|
|
1496
|
+
assert.equal(modelRequests.length, 0);
|
|
1497
|
+
|
|
1498
|
+
const sender = await waitForSessionByName(orchestrator, "handover-sender");
|
|
1499
|
+
assert.equal((await orchestrator.send(sender.id, { messageId: "handover-pending-ask", text: "What's next?", expectsReply: true })).delivered, true);
|
|
1500
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
1501
|
+
const received = once(orchestrator, "message") as Promise<[SessionInfo, Message]>;
|
|
1502
|
+
const result = await intercomTool.execute("handover", { action: "handover", to: "orchestrator", message: "continue in pi-mcp-adapter" }, new AbortController().signal, undefined, ctx);
|
|
1503
|
+
assert.notEqual(result.details?.error, true);
|
|
1504
|
+
assert.equal(result.details?.delivery, "socket_delivered");
|
|
1505
|
+
assert.equal(result.details?.replyTo, undefined);
|
|
1506
|
+
|
|
1507
|
+
const [, message] = await received;
|
|
1508
|
+
assert.match(message.content.text, /^# Handover from handover-sender\n/);
|
|
1509
|
+
assert.equal(message.replyTo, undefined);
|
|
1510
|
+
assert.match(message.content.text, /Sender session file: \/sessions\/handover-sender\.jsonl/);
|
|
1511
|
+
assert.ok(message.content.text.endsWith("## Next task\nPort the fix"));
|
|
1512
|
+
assert.match(modelRequests[0]!.messages[0]!.content[0]!.text, /fix the adapter[\s\S]*continue in pi-mcp-adapter/);
|
|
1513
|
+
} finally {
|
|
1514
|
+
await harness.emitLifecycle("session_shutdown");
|
|
1515
|
+
await cleanup();
|
|
1516
|
+
}
|
|
1517
|
+
});
|
|
1518
|
+
|
|
1317
1519
|
test("intercom-id inserts a stable handoff snippet into the editor", { concurrency: false }, async () => {
|
|
1318
1520
|
const { cleanup } = await setupClients();
|
|
1319
1521
|
const { default: piIntercomExtension } = await import("./index.ts");
|
|
@@ -1765,6 +1967,36 @@ test("intercom tool renders compact call and result rows", async () => {
|
|
|
1765
1967
|
}, { isPartial: false, expanded: true }, renderTheme, { isError: false, expanded: true }));
|
|
1766
1968
|
assert.match(errorText, /✗ Missing 'to' or 'message' parameter/);
|
|
1767
1969
|
assert.match(errorText, /Reason: Missing target/);
|
|
1970
|
+
|
|
1971
|
+
const roster = {
|
|
1972
|
+
content: [{ type: "text", text: "**Current session:**\n• me\n\n**Other sessions (cwd: /repo):**\n• peer-a\n• peer-b" }],
|
|
1973
|
+
details: { roster: { peers: 2, total: 3, cwd: "/repo" } },
|
|
1974
|
+
};
|
|
1975
|
+
const collapsedRoster = renderToText(intercomTool.renderResult(roster, { isPartial: false, expanded: false }, renderTheme, { isError: false, expanded: false }));
|
|
1976
|
+
assert.equal(collapsedRoster, "✓ 2 other sessions in /repo (3 connected)");
|
|
1977
|
+
const expandedRoster = renderToText(intercomTool.renderResult(roster, { isPartial: false, expanded: true }, renderTheme, { isError: false, expanded: true }));
|
|
1978
|
+
assert.match(expandedRoster, /peer-a\n• peer-b/);
|
|
1979
|
+
});
|
|
1980
|
+
|
|
1981
|
+
test("outgoing tool calls preserve full messages when expanded", async () => {
|
|
1982
|
+
const { default: piIntercomExtension } = await import("./index.ts");
|
|
1983
|
+
await withChildOrchestratorEnv({
|
|
1984
|
+
orchestratorTarget: "orchestrator", runId: "expanded-call-test", agent: "worker", index: "0",
|
|
1985
|
+
}, () => {
|
|
1986
|
+
const harness = createExtensionHarness();
|
|
1987
|
+
piIntercomExtension(harness.pi as never);
|
|
1988
|
+
const message = ` ${"a".repeat(100)}\n\n 中文🧪 tail`;
|
|
1989
|
+
for (const [name, args, title] of [
|
|
1990
|
+
["intercom", { action: "send", to: "planner", message }, "intercom send → planner"],
|
|
1991
|
+
["contact_supervisor", { reason: "progress_update", message }, "contact_supervisor progress_update"],
|
|
1992
|
+
] as const) {
|
|
1993
|
+
const tool = harness.tools.find((candidate) => candidate.name === name)!;
|
|
1994
|
+
assert.ok(tool.renderCall);
|
|
1995
|
+
assert.equal(renderToText(tool.renderCall(args, renderTheme, { expanded: true })), `${title}\n ${message}`);
|
|
1996
|
+
assert.equal(renderToText(tool.renderCall(args, renderTheme, { expanded: false })), `${title}\n ${"a".repeat(95)}…`);
|
|
1997
|
+
assert.equal(args.message, message);
|
|
1998
|
+
}
|
|
1999
|
+
});
|
|
1768
2000
|
});
|
|
1769
2001
|
|
|
1770
2002
|
test("intercom tool result hook marks failed details as errors", async () => {
|
|
@@ -1806,7 +2038,7 @@ test("obsolete toolVisibility config never hides or reveals the intercom tool",
|
|
|
1806
2038
|
custom: async () => {
|
|
1807
2039
|
overlayStep += 1;
|
|
1808
2040
|
return overlayStep === 1
|
|
1809
|
-
? selectedSession
|
|
2041
|
+
? { session: selectedSession, action: "message" }
|
|
1810
2042
|
: { sent: true, messageId: "overlay-message", text: "Hello from the overlay" };
|
|
1811
2043
|
},
|
|
1812
2044
|
},
|
|
@@ -1991,6 +2223,7 @@ test("busy interactive sessions steer top-level asks without aborting", { concur
|
|
|
1991
2223
|
await harness.emitLifecycle("session_start");
|
|
1992
2224
|
|
|
1993
2225
|
const target = await waitForSessionByName(planner, "interactive-worker");
|
|
2226
|
+
await harness.emitLifecycle("agent_start");
|
|
1994
2227
|
|
|
1995
2228
|
const delivered = await planner.send(target.id, {
|
|
1996
2229
|
messageId: 'interactive-busy-"ask',
|
|
@@ -2021,7 +2254,7 @@ test("busy interactive sessions steer top-level asks without aborting", { concur
|
|
|
2021
2254
|
}
|
|
2022
2255
|
});
|
|
2023
2256
|
|
|
2024
|
-
test("idle interactive sessions
|
|
2257
|
+
test("idle interactive sessions wake through a user prompt instead of triggerTurn", { concurrency: false }, async () => {
|
|
2025
2258
|
const { default: piIntercomExtension } = await import("./index.ts");
|
|
2026
2259
|
const { planner, cleanup } = await setupClients();
|
|
2027
2260
|
const harness = createExtensionHarness("idle-trigger-worker", {
|
|
@@ -2038,8 +2271,14 @@ test("idle interactive sessions trigger a new turn immediately", { concurrency:
|
|
|
2038
2271
|
await new Promise((resolve) => setTimeout(resolve, 20));
|
|
2039
2272
|
|
|
2040
2273
|
assert.equal(harness.sentMessages.length, 1);
|
|
2041
|
-
assert.equal(harness.sentMessages[0]?.options
|
|
2042
|
-
assert.
|
|
2274
|
+
assert.equal(harness.sentMessages[0]?.options, undefined, "triggerTurn would bypass before_agent_start");
|
|
2275
|
+
assert.deepEqual(harness.userMessages, ["New intercom message above."]);
|
|
2276
|
+
|
|
2277
|
+
await harness.emitLifecycle("agent_start");
|
|
2278
|
+
await harness.emitLifecycle("agent_end");
|
|
2279
|
+
assert.equal((await planner.send(worker.id, { messageId: "idle-trigger-2", text: "And this" })).delivered, true);
|
|
2280
|
+
await waitForCondition(() => harness.sentMessages.length === 2, "second injected message");
|
|
2281
|
+
assert.equal(harness.userMessages.length, 2, "a started run re-arms the wake");
|
|
2043
2282
|
} finally {
|
|
2044
2283
|
await harness.emitLifecycle("session_shutdown");
|
|
2045
2284
|
await cleanup();
|
|
@@ -2109,6 +2348,7 @@ test("busy interactive sessions steer same-sender messages in sequence order", {
|
|
|
2109
2348
|
piIntercomExtension(harness.pi as never);
|
|
2110
2349
|
await harness.emitLifecycle("session_start");
|
|
2111
2350
|
const worker = await waitForSessionByName(planner, "sequence-worker");
|
|
2351
|
+
await harness.emitLifecycle("agent_start");
|
|
2112
2352
|
const receipts = new Map<string, string[]>();
|
|
2113
2353
|
const unsubscribeReceipts = planner.onMessageReceipt((_from, receipt) => {
|
|
2114
2354
|
const statuses = receipts.get(receipt.messageId) ?? [];
|
|
@@ -2142,6 +2382,208 @@ test("busy interactive sessions steer same-sender messages in sequence order", {
|
|
|
2142
2382
|
}
|
|
2143
2383
|
});
|
|
2144
2384
|
|
|
2385
|
+
for (const outcome of ["success", "failure", "abort", "cancel"]) {
|
|
2386
|
+
test(`busy without an agent run holds inbound messages through compaction ${outcome}`, { concurrency: false }, async () => {
|
|
2387
|
+
const { default: piIntercomExtension } = await import("./index.ts");
|
|
2388
|
+
const { planner, cleanup } = await setupClients();
|
|
2389
|
+
let idle = false;
|
|
2390
|
+
const harness = createExtensionHarness(`compact-${outcome}`, { hasUI: true, isIdle: () => idle });
|
|
2391
|
+
try {
|
|
2392
|
+
piIntercomExtension(harness.pi as never);
|
|
2393
|
+
await harness.emitLifecycle("session_start");
|
|
2394
|
+
const target = await waitForSessionByName(planner, `compact-${outcome}`);
|
|
2395
|
+
const receipts = new Map<string, string[]>();
|
|
2396
|
+
const unsubscribe = planner.onMessageReceipt((_from, receipt) => {
|
|
2397
|
+
const statuses = receipts.get(receipt.messageId) ?? [];
|
|
2398
|
+
statuses.push(receipt.status);
|
|
2399
|
+
receipts.set(receipt.messageId, statuses);
|
|
2400
|
+
});
|
|
2401
|
+
assert.equal((await planner.send(target.id, { messageId: `${outcome}-1`, text: "First held" })).delivered, true);
|
|
2402
|
+
assert.equal((await planner.send(target.id, { messageId: `${outcome}-2`, text: "Second held" })).delivered, true);
|
|
2403
|
+
await waitForCondition(() => receipts.get(`${outcome}-1`)?.includes("queued") === true, "first queued receipt");
|
|
2404
|
+
await waitForCondition(() => receipts.get(`${outcome}-2`)?.includes("queued") === true, "second queued receipt");
|
|
2405
|
+
assert.equal(harness.sentMessages.length, 0);
|
|
2406
|
+
assert.deepEqual(receipts.get(`${outcome}-1`), ["receiver_received", "acknowledged", "queued"]);
|
|
2407
|
+
assert.deepEqual(receipts.get(`${outcome}-2`), ["receiver_received", "acknowledged", "queued"]);
|
|
2408
|
+
// No lifecycle event is needed: Pi becomes idle after success, failure, abort or cancellation.
|
|
2409
|
+
idle = true;
|
|
2410
|
+
await waitForCondition(() => harness.sentMessages.length === 2, "two injected messages");
|
|
2411
|
+
assert.equal(harness.sentMessages.length, 2);
|
|
2412
|
+
assert.match(harness.sentMessages[0]?.message.content ?? "", /First held/);
|
|
2413
|
+
assert.match(harness.sentMessages[1]?.message.content ?? "", /Second held/);
|
|
2414
|
+
assert.deepEqual(harness.sentMessages.map(({ options }) => options), [undefined, undefined]);
|
|
2415
|
+
assert.deepEqual(harness.userMessages, ["New intercom message above."], "one wake covers both messages");
|
|
2416
|
+
await waitForCondition(() => receipts.get(`${outcome}-1`)?.includes("injected") === true, "first injected receipt");
|
|
2417
|
+
await waitForCondition(() => receipts.get(`${outcome}-2`)?.includes("injected") === true, "second injected receipt");
|
|
2418
|
+
assert.deepEqual(receipts.get(`${outcome}-1`), ["receiver_received", "acknowledged", "queued", "injected"]);
|
|
2419
|
+
assert.deepEqual(receipts.get(`${outcome}-2`), ["receiver_received", "acknowledged", "queued", "injected"]);
|
|
2420
|
+
unsubscribe();
|
|
2421
|
+
} finally {
|
|
2422
|
+
await harness.emitLifecycle("session_shutdown");
|
|
2423
|
+
await cleanup();
|
|
2424
|
+
}
|
|
2425
|
+
});
|
|
2426
|
+
}
|
|
2427
|
+
|
|
2428
|
+
test("shutdown discards inbound messages held during compaction", { concurrency: false }, async () => {
|
|
2429
|
+
const { default: piIntercomExtension } = await import("./index.ts");
|
|
2430
|
+
const { planner, cleanup } = await setupClients();
|
|
2431
|
+
let idle = false;
|
|
2432
|
+
const harness = createExtensionHarness("compact-shutdown", { hasUI: true, isIdle: () => idle });
|
|
2433
|
+
const receipts: string[] = [];
|
|
2434
|
+
const unsubscribe = planner.onMessageReceipt((_from, receipt) => {
|
|
2435
|
+
if (receipt.messageId === "compact-shutdown-message") receipts.push(receipt.status);
|
|
2436
|
+
});
|
|
2437
|
+
try {
|
|
2438
|
+
piIntercomExtension(harness.pi as never);
|
|
2439
|
+
await harness.emitLifecycle("session_start");
|
|
2440
|
+
const target = await waitForSessionByName(planner, "compact-shutdown");
|
|
2441
|
+
assert.equal((await planner.send(target.id, { messageId: "compact-shutdown-message", text: "Held" })).delivered, true);
|
|
2442
|
+
await waitForCondition(() => receipts.includes("queued"), "compaction queued receipt");
|
|
2443
|
+
assert.equal(harness.sentMessages.length, 0);
|
|
2444
|
+
await harness.emitLifecycle("session_shutdown");
|
|
2445
|
+
await waitForCondition(() => receipts.includes("expired"), "shutdown expired receipt");
|
|
2446
|
+
idle = true;
|
|
2447
|
+
await new Promise((resolve) => setTimeout(resolve, 150));
|
|
2448
|
+
assert.equal(harness.sentMessages.length, 0);
|
|
2449
|
+
assert.deepEqual(receipts, ["receiver_received", "acknowledged", "queued", "expired"]);
|
|
2450
|
+
} finally {
|
|
2451
|
+
unsubscribe();
|
|
2452
|
+
await cleanup();
|
|
2453
|
+
}
|
|
2454
|
+
});
|
|
2455
|
+
|
|
2456
|
+
test("cancelling a compaction-held message drops it before injection", { concurrency: false }, async () => {
|
|
2457
|
+
const { default: piIntercomExtension } = await import("./index.ts");
|
|
2458
|
+
const { planner, cleanup } = await setupClients();
|
|
2459
|
+
let idle = false;
|
|
2460
|
+
const harness = createExtensionHarness("compact-cancel", { hasUI: true, isIdle: () => idle });
|
|
2461
|
+
const receipts: string[] = [];
|
|
2462
|
+
const unsubscribe = planner.onMessageReceipt((_from, receipt) => {
|
|
2463
|
+
if (receipt.messageId === "compact-cancel-message") receipts.push(receipt.status);
|
|
2464
|
+
});
|
|
2465
|
+
try {
|
|
2466
|
+
piIntercomExtension(harness.pi as never);
|
|
2467
|
+
await harness.emitLifecycle("session_start");
|
|
2468
|
+
const target = await waitForSessionByName(planner, "compact-cancel");
|
|
2469
|
+
assert.equal((await planner.send(target.id, { messageId: "compact-cancel-message", text: "Held" })).delivered, true);
|
|
2470
|
+
await waitForCondition(() => receipts.includes("queued"), "compaction queued receipt");
|
|
2471
|
+
assert.equal((await planner.cancelMessage("compact-cancel-message")).delivered, true);
|
|
2472
|
+
await waitForCondition(() => receipts.includes("cancelled"), "compaction cancelled receipt");
|
|
2473
|
+
idle = true;
|
|
2474
|
+
await new Promise((resolve) => setTimeout(resolve, 150));
|
|
2475
|
+
assert.equal(harness.sentMessages.length, 0);
|
|
2476
|
+
assert.deepEqual(receipts, ["receiver_received", "acknowledged", "queued", "cancelled"]);
|
|
2477
|
+
} finally {
|
|
2478
|
+
unsubscribe();
|
|
2479
|
+
await harness.emitLifecycle("session_shutdown");
|
|
2480
|
+
await cleanup();
|
|
2481
|
+
}
|
|
2482
|
+
});
|
|
2483
|
+
|
|
2484
|
+
test("runtime replacement discards held inbound messages", { concurrency: false }, async () => {
|
|
2485
|
+
const { default: piIntercomExtension } = await import("./index.ts");
|
|
2486
|
+
const { planner, cleanup } = await setupClients();
|
|
2487
|
+
let idle = false;
|
|
2488
|
+
const harness = createExtensionHarness("compact-replacement", { hasUI: true, isIdle: () => idle });
|
|
2489
|
+
try {
|
|
2490
|
+
piIntercomExtension(harness.pi as never);
|
|
2491
|
+
await harness.emitLifecycle("session_start");
|
|
2492
|
+
const target = await waitForSessionByName(planner, "compact-replacement");
|
|
2493
|
+
assert.equal((await planner.send(target.id, { messageId: "compact-replacement-message", text: "Old runtime" })).delivered, true);
|
|
2494
|
+
await new Promise((resolve) => setTimeout(resolve, 20));
|
|
2495
|
+
assert.equal(harness.sentMessages.length, 0);
|
|
2496
|
+
await harness.emitLifecycle("session_start");
|
|
2497
|
+
idle = true;
|
|
2498
|
+
await new Promise((resolve) => setTimeout(resolve, 150));
|
|
2499
|
+
assert.equal(harness.sentMessages.length, 0);
|
|
2500
|
+
} finally {
|
|
2501
|
+
await harness.emitLifecycle("session_shutdown");
|
|
2502
|
+
await cleanup();
|
|
2503
|
+
}
|
|
2504
|
+
});
|
|
2505
|
+
|
|
2506
|
+
test("held inbound messages steer when an agent run is busy after compaction", { concurrency: false }, async () => {
|
|
2507
|
+
const { default: piIntercomExtension } = await import("./index.ts");
|
|
2508
|
+
const { planner, cleanup } = await setupClients();
|
|
2509
|
+
const harness = createExtensionHarness("compact-busy", { hasUI: true, isIdle: () => false });
|
|
2510
|
+
try {
|
|
2511
|
+
piIntercomExtension(harness.pi as never);
|
|
2512
|
+
await harness.emitLifecycle("session_start");
|
|
2513
|
+
const target = await waitForSessionByName(planner, "compact-busy");
|
|
2514
|
+
assert.equal((await planner.send(target.id, { messageId: "compact-busy-message", text: "Steer later" })).delivered, true);
|
|
2515
|
+
await new Promise((resolve) => setTimeout(resolve, 20));
|
|
2516
|
+
assert.equal(harness.sentMessages.length, 0);
|
|
2517
|
+
await harness.emitLifecycle("agent_start");
|
|
2518
|
+
assert.equal(harness.sentMessages.length, 1);
|
|
2519
|
+
assert.equal(harness.sentMessages[0]?.options?.deliverAs, "steer");
|
|
2520
|
+
} finally {
|
|
2521
|
+
await harness.emitLifecycle("session_shutdown");
|
|
2522
|
+
await cleanup();
|
|
2523
|
+
}
|
|
2524
|
+
});
|
|
2525
|
+
|
|
2526
|
+
test("human-first leaves non-UI sessions on the busy auto-reply path after compaction", { concurrency: false }, async () => {
|
|
2527
|
+
await withIntercomConfig({ busyDelivery: "human-first" }, async () => {
|
|
2528
|
+
const { default: piIntercomExtension } = await import("./index.ts");
|
|
2529
|
+
const { planner, cleanup } = await setupClients();
|
|
2530
|
+
const harness = createExtensionHarness("human-first-pipe", { hasUI: false, isIdle: () => false });
|
|
2531
|
+
try {
|
|
2532
|
+
piIntercomExtension(harness.pi as never);
|
|
2533
|
+
await harness.emitLifecycle("session_start");
|
|
2534
|
+
const target = await waitForSessionByName(planner, "human-first-pipe");
|
|
2535
|
+
const askId = "human-first-pipe-ask";
|
|
2536
|
+
const replyPromise = waitForReply(planner, askId, 1000);
|
|
2537
|
+
assert.equal((await planner.send(target.id, { messageId: askId, text: "Still there?", expectsReply: true })).delivered, true);
|
|
2538
|
+
await new Promise((resolve) => setTimeout(resolve, 20));
|
|
2539
|
+
await harness.emitLifecycle("agent_start");
|
|
2540
|
+
const reply = await replyPromise;
|
|
2541
|
+
assert.match(reply.message.content.text, /non-interactive|cannot respond/i);
|
|
2542
|
+
assert.equal(harness.sentMessages.length, 0);
|
|
2543
|
+
} finally {
|
|
2544
|
+
await harness.emitLifecycle("session_shutdown");
|
|
2545
|
+
await cleanup();
|
|
2546
|
+
}
|
|
2547
|
+
});
|
|
2548
|
+
});
|
|
2549
|
+
|
|
2550
|
+
test("human-first releases the next held peer only after the woken run starts", { concurrency: false }, async () => {
|
|
2551
|
+
await withIntercomConfig({ busyDelivery: "human-first" }, async () => {
|
|
2552
|
+
const { default: piIntercomExtension } = await import("./index.ts");
|
|
2553
|
+
const { planner, cleanup } = await setupClients();
|
|
2554
|
+
let idle = false;
|
|
2555
|
+
const harness = createExtensionHarness("human-first-wake", { hasUI: true, isIdle: () => idle });
|
|
2556
|
+
try {
|
|
2557
|
+
piIntercomExtension(harness.pi as never);
|
|
2558
|
+
await harness.emitLifecycle("session_start");
|
|
2559
|
+
const target = await waitForSessionByName(planner, "human-first-wake");
|
|
2560
|
+
await harness.emitLifecycle("agent_start");
|
|
2561
|
+
const queued = new Set<string>();
|
|
2562
|
+
const unsubscribe = planner.onMessageReceipt((_from, receipt) => {
|
|
2563
|
+
if (receipt.status === "queued") queued.add(receipt.messageId);
|
|
2564
|
+
});
|
|
2565
|
+
assert.equal((await planner.send(target.id, { messageId: "peer-a", text: "Peer A" })).delivered, true);
|
|
2566
|
+
assert.equal((await planner.send(target.id, { messageId: "peer-b", text: "Peer B" })).delivered, true);
|
|
2567
|
+
await waitForCondition(() => queued.has("peer-a") && queued.has("peer-b"), "both peers held");
|
|
2568
|
+
unsubscribe();
|
|
2569
|
+
|
|
2570
|
+
// The run ends; the wake prompt's preflight keeps Pi idle across several flush ticks.
|
|
2571
|
+
idle = true;
|
|
2572
|
+
await waitForCondition(() => harness.sentMessages.length === 1, "peer A injected");
|
|
2573
|
+
await new Promise((resolve) => setTimeout(resolve, 350));
|
|
2574
|
+
assert.equal(harness.sentMessages.length, 1, "peer B must wait for a later turn");
|
|
2575
|
+
assert.deepEqual(harness.userMessages, ["New intercom message above."]);
|
|
2576
|
+
|
|
2577
|
+
await harness.emitLifecycle("agent_start");
|
|
2578
|
+
await waitForCondition(() => harness.sentMessages.length === 2, "peer B injected");
|
|
2579
|
+
assert.match(harness.sentMessages[1]?.message.content ?? "", /Peer B/);
|
|
2580
|
+
} finally {
|
|
2581
|
+
await harness.emitLifecycle("session_shutdown");
|
|
2582
|
+
await cleanup();
|
|
2583
|
+
}
|
|
2584
|
+
});
|
|
2585
|
+
});
|
|
2586
|
+
|
|
2145
2587
|
test("explicit cancel acknowledges that a steered inbound message may already be processed", { concurrency: false }, async () => {
|
|
2146
2588
|
const { default: piIntercomExtension } = await import("./index.ts");
|
|
2147
2589
|
const { planner, cleanup } = await setupClients();
|
|
@@ -2155,6 +2597,7 @@ test("explicit cancel acknowledges that a steered inbound message may already be
|
|
|
2155
2597
|
piIntercomExtension(harness.pi as never);
|
|
2156
2598
|
await harness.emitLifecycle("session_start");
|
|
2157
2599
|
const worker = await waitForSessionByName(planner, "cancel-worker");
|
|
2600
|
+
await harness.emitLifecycle("agent_start");
|
|
2158
2601
|
const receipts: string[] = [];
|
|
2159
2602
|
const unsubscribeReceipts = planner.onMessageReceipt((_from, receipt) => {
|
|
2160
2603
|
if (receipt.messageId === "cancel-steered") receipts.push(receipt.status);
|
|
@@ -2197,6 +2640,7 @@ test("intercom cancel action requests cancellation for a sent message", { concur
|
|
|
2197
2640
|
await senderHarness.emitLifecycle("session_start");
|
|
2198
2641
|
await receiverHarness.emitLifecycle("session_start");
|
|
2199
2642
|
await waitForSessionByName(planner, "cancel-tool-worker");
|
|
2643
|
+
await receiverHarness.emitLifecycle("agent_start");
|
|
2200
2644
|
const intercomTool = senderHarness.tools.find((tool) => tool.name === "intercom")!;
|
|
2201
2645
|
|
|
2202
2646
|
const sendResult = await intercomTool.execute("send-before-cancel", { action: "send", to: "cancel-tool-worker", message: "Cancel this through the tool" }, new AbortController().signal, undefined, senderHarness.ctx);
|
|
@@ -2235,6 +2679,7 @@ test("same-sender supersede reports an already-steered inbound message", { concu
|
|
|
2235
2679
|
piIntercomExtension(harness.pi as never);
|
|
2236
2680
|
await harness.emitLifecycle("session_start");
|
|
2237
2681
|
const worker = await waitForSessionByName(planner, "supersede-worker");
|
|
2682
|
+
await harness.emitLifecycle("agent_start");
|
|
2238
2683
|
const receipts = new Map<string, string[]>();
|
|
2239
2684
|
const unsubscribeReceipts = planner.onMessageReceipt((_from, receipt) => {
|
|
2240
2685
|
const statuses = receipts.get(receipt.messageId) ?? [];
|
|
@@ -2290,6 +2735,8 @@ test("supersede is scoped to the same sender and receiver", { concurrency: false
|
|
|
2290
2735
|
await secondHarness.emitLifecycle("session_start");
|
|
2291
2736
|
const first = await waitForSessionByName(planner, "supersede-first");
|
|
2292
2737
|
const second = await waitForSessionByName(planner, "supersede-second");
|
|
2738
|
+
await firstHarness.emitLifecycle("agent_start");
|
|
2739
|
+
await secondHarness.emitLifecycle("agent_start");
|
|
2293
2740
|
|
|
2294
2741
|
assert.equal((await planner.send(first.id, { messageId: "wrong-target-old", text: "Old target" })).delivered, true);
|
|
2295
2742
|
const wrongReceiver = await planner.send(second.id, { messageId: "wrong-target-new", text: "Wrong receiver", supersedes: "wrong-target-old" });
|
|
@@ -2319,6 +2766,7 @@ test("replied steered asks are not injected again after the current turn", { con
|
|
|
2319
2766
|
piIntercomExtension(harness.pi as never);
|
|
2320
2767
|
await harness.emitLifecycle("session_start");
|
|
2321
2768
|
const worker = await waitForSessionByName(planner, "reply-while-busy-worker");
|
|
2769
|
+
await harness.emitLifecycle("agent_start");
|
|
2322
2770
|
|
|
2323
2771
|
const askId = "reply-while-busy-ask";
|
|
2324
2772
|
const replyReceived = waitForReply(planner, askId);
|
|
@@ -2402,7 +2850,7 @@ test("stale overlay work stops after same-session restart", { concurrency: false
|
|
|
2402
2850
|
const plannerSession = await waitForSessionByName(planner, "planner");
|
|
2403
2851
|
await harness.emitLifecycle("session_shutdown");
|
|
2404
2852
|
await harness.emitLifecycle("session_start");
|
|
2405
|
-
resolveFirstCustom(plannerSession);
|
|
2853
|
+
resolveFirstCustom({ session: plannerSession, action: "message" });
|
|
2406
2854
|
await overlayPromise;
|
|
2407
2855
|
|
|
2408
2856
|
assert.equal(customCalls, 1);
|
|
@@ -2425,6 +2873,7 @@ test("steered inbound messages are not reinjected after shutdown", { concurrency
|
|
|
2425
2873
|
piIntercomExtension(harness.pi as never);
|
|
2426
2874
|
await harness.emitLifecycle("session_start");
|
|
2427
2875
|
const target = await waitForSessionByName(planner, "disposed-worker");
|
|
2876
|
+
await harness.emitLifecycle("agent_start");
|
|
2428
2877
|
const receipts: string[] = [];
|
|
2429
2878
|
const unsubscribeReceipts = planner.onMessageReceipt((_from, receipt) => {
|
|
2430
2879
|
if (receipt.messageId === "disposed-ask") receipts.push(receipt.status);
|
|
@@ -2468,6 +2917,7 @@ test("busy non-interactive sessions auto-reply to top-level asks without abortin
|
|
|
2468
2917
|
await harness.emitLifecycle("session_start");
|
|
2469
2918
|
|
|
2470
2919
|
const target = await waitForSessionByName(planner, "pipe-worker");
|
|
2920
|
+
await harness.emitLifecycle("agent_start");
|
|
2471
2921
|
|
|
2472
2922
|
const askId = "pipe-mode-ask";
|
|
2473
2923
|
const replyPromise = waitForReply(planner, askId, 1000);
|
|
@@ -3809,12 +4259,13 @@ test("intercom reply queues mail for a disconnected named sender", { concurrency
|
|
|
3809
4259
|
}
|
|
3810
4260
|
});
|
|
3811
4261
|
|
|
3812
|
-
test("subagent control intercom events
|
|
4262
|
+
test("subagent control intercom events reach the current orchestrator session", async () => {
|
|
3813
4263
|
const { default: piIntercomExtension } = await import("./index.ts");
|
|
3814
4264
|
const events = new EventEmitter();
|
|
3815
4265
|
const sentMessages: Array<{ message: { customType?: string; content?: string }; options?: { triggerTurn?: boolean } }> = [];
|
|
3816
4266
|
const pi = {
|
|
3817
4267
|
getSessionName: () => "orchestrator",
|
|
4268
|
+
getActiveTools: () => ["intercom"],
|
|
3818
4269
|
events: {
|
|
3819
4270
|
on: (channel: string, handler: (payload: unknown) => void) => {
|
|
3820
4271
|
events.on(channel, handler);
|
|
@@ -3844,10 +4295,9 @@ test("subagent control intercom events wake the current orchestrator session", a
|
|
|
3844
4295
|
assert.equal(sentMessages[0]?.message.customType, "intercom_message");
|
|
3845
4296
|
assert.match(sentMessages[0]?.message.content ?? "", /From subagent-control/);
|
|
3846
4297
|
assert.match(sentMessages[0]?.message.content ?? "", /worker needs attention in run 78f659a3/);
|
|
3847
|
-
assert.equal(sentMessages[0]?.options?.triggerTurn, true);
|
|
3848
4298
|
});
|
|
3849
4299
|
|
|
3850
|
-
test("subagent result intercom events
|
|
4300
|
+
test("subagent result intercom events reach the current orchestrator session", async () => {
|
|
3851
4301
|
const { default: piIntercomExtension } = await import("./index.ts");
|
|
3852
4302
|
const events = new EventEmitter();
|
|
3853
4303
|
const sentMessages: Array<{ message: { customType?: string; content?: string }; options?: { triggerTurn?: boolean } }> = [];
|
|
@@ -3855,6 +4305,7 @@ test("subagent result intercom events wake the current orchestrator session", as
|
|
|
3855
4305
|
events.on("subagent:result-intercom-delivery", (payload) => deliveryAcks.push(payload));
|
|
3856
4306
|
const pi = {
|
|
3857
4307
|
getSessionName: () => "orchestrator",
|
|
4308
|
+
getActiveTools: () => ["intercom"],
|
|
3858
4309
|
events: {
|
|
3859
4310
|
on: (channel: string, handler: (payload: unknown) => void) => {
|
|
3860
4311
|
events.on(channel, handler);
|
|
@@ -3885,10 +4336,64 @@ test("subagent result intercom events wake the current orchestrator session", as
|
|
|
3885
4336
|
assert.equal(sentMessages[0]?.message.customType, "intercom_message");
|
|
3886
4337
|
assert.match(sentMessages[0]?.message.content ?? "", /From subagent-result/);
|
|
3887
4338
|
assert.match(sentMessages[0]?.message.content ?? "", /Status: completed/);
|
|
3888
|
-
assert.equal(sentMessages[0]?.options?.triggerTurn, true);
|
|
3889
4339
|
assert.deepEqual(deliveryAcks, [{ requestId: "result-1", delivered: true }]);
|
|
3890
4340
|
});
|
|
3891
4341
|
|
|
4342
|
+
test("subagent relay events wake an idle orchestrator and steer a busy one", { concurrency: false }, async () => {
|
|
4343
|
+
const { default: piIntercomExtension } = await import("./index.ts");
|
|
4344
|
+
const { cleanup } = await setupClients();
|
|
4345
|
+
let idle = true;
|
|
4346
|
+
const harness = createExtensionHarness("relay-orchestrator", { hasUI: true, isIdle: () => idle });
|
|
4347
|
+
try {
|
|
4348
|
+
piIntercomExtension(harness.pi as never);
|
|
4349
|
+
await harness.emitLifecycle("session_start");
|
|
4350
|
+
|
|
4351
|
+
harness.pi.events.emit("subagent:result-intercom", { to: "relay-orchestrator", requestId: "idle-result", message: "subagent result\n\nStatus: completed" });
|
|
4352
|
+
await waitForCondition(() => harness.sentMessages.length === 1, "idle relay message");
|
|
4353
|
+
assert.equal(harness.sentMessages[0]?.options, undefined);
|
|
4354
|
+
assert.deepEqual(harness.userMessages, ["New intercom message above."]);
|
|
4355
|
+
|
|
4356
|
+
await harness.emitLifecycle("agent_start");
|
|
4357
|
+
idle = false;
|
|
4358
|
+
harness.pi.events.emit("subagent:control-intercom", { to: "relay-orchestrator", message: "subagent needs attention" });
|
|
4359
|
+
await waitForCondition(() => harness.sentMessages.length === 2, "busy relay message");
|
|
4360
|
+
assert.equal(harness.sentMessages[1]?.options, undefined, "Pi steers untriggered messages while streaming");
|
|
4361
|
+
assert.equal(harness.userMessages.length, 1, "a busy session must not get a wake prompt");
|
|
4362
|
+
} finally {
|
|
4363
|
+
await harness.emitLifecycle("session_shutdown");
|
|
4364
|
+
await cleanup();
|
|
4365
|
+
}
|
|
4366
|
+
});
|
|
4367
|
+
|
|
4368
|
+
test("a wake prompt that never starts a run stops blocking later wakes after its window", { concurrency: false }, async (t) => {
|
|
4369
|
+
const { default: piIntercomExtension } = await import("./index.ts");
|
|
4370
|
+
const { cleanup } = await setupClients();
|
|
4371
|
+
const realNow = Date.now.bind(Date);
|
|
4372
|
+
let offset = 0;
|
|
4373
|
+
t.mock.method(Date, "now", () => realNow() + offset);
|
|
4374
|
+
const harness = createExtensionHarness("unstarted-wake", { hasUI: true, isIdle: () => true });
|
|
4375
|
+
const relay = (message: string) => harness.pi.events.emit("subagent:control-intercom", { to: "unstarted-wake", message });
|
|
4376
|
+
try {
|
|
4377
|
+
piIntercomExtension(harness.pi as never);
|
|
4378
|
+
await harness.emitLifecycle("session_start");
|
|
4379
|
+
|
|
4380
|
+
// An input handler can handle the wake prompt, so no agent_start follows it.
|
|
4381
|
+
relay("first");
|
|
4382
|
+
await waitForCondition(() => harness.sentMessages.length === 1, "first relay message");
|
|
4383
|
+
relay("second");
|
|
4384
|
+
await waitForCondition(() => harness.sentMessages.length === 2, "second relay message");
|
|
4385
|
+
assert.equal(harness.userMessages.length, 1, "a recent wake may still be starting");
|
|
4386
|
+
|
|
4387
|
+
offset += 10_001;
|
|
4388
|
+
relay("third");
|
|
4389
|
+
await waitForCondition(() => harness.sentMessages.length === 3, "third relay message");
|
|
4390
|
+
assert.equal(harness.userMessages.length, 2, "an expired wake must not block the next one");
|
|
4391
|
+
} finally {
|
|
4392
|
+
await harness.emitLifecycle("session_shutdown");
|
|
4393
|
+
await cleanup();
|
|
4394
|
+
}
|
|
4395
|
+
});
|
|
4396
|
+
|
|
3892
4397
|
test("async ask can be replied to later from the single pending ask fallback", { concurrency: false }, async () => {
|
|
3893
4398
|
const { planner, orchestrator, cleanup } = await setupClients();
|
|
3894
4399
|
const replyTracker = new ReplyTracker();
|
|
@@ -4075,6 +4580,68 @@ test("confirmSend still gates an inferred reply; cancellation preserves the pend
|
|
|
4075
4580
|
});
|
|
4076
4581
|
});
|
|
4077
4582
|
|
|
4583
|
+
test("confirmSend decline blocks explicit cross-machine transport after fail-closed validation", { concurrency: false }, async () => {
|
|
4584
|
+
await withConfirmSendEnabled(async () => {
|
|
4585
|
+
const { cleanup } = await setupClients();
|
|
4586
|
+
const { default: piIntercomExtension } = await import("./index.ts");
|
|
4587
|
+
const temp = mkdtempSync(path.join(repoDir, ".cross-machine-confirm-"));
|
|
4588
|
+
const marker = path.join(temp, "transport-called");
|
|
4589
|
+
const herdr = path.join(temp, "herdr");
|
|
4590
|
+
const previousHerdrBin = process.env.HERDR_BIN_PATH;
|
|
4591
|
+
writeFileSync(herdr, `#!/bin/sh\ntouch ${JSON.stringify(marker)}\nexit 1\n`);
|
|
4592
|
+
chmodSync(herdr, 0o755);
|
|
4593
|
+
process.env.HERDR_BIN_PATH = herdr;
|
|
4594
|
+
const confirmCalls: Array<[string, string]> = [];
|
|
4595
|
+
const harness = createExtensionHarness("cross-machine-confirm-worker", {
|
|
4596
|
+
hasUI: true,
|
|
4597
|
+
ui: {
|
|
4598
|
+
confirm: async (title: string, text: string) => {
|
|
4599
|
+
confirmCalls.push([title, text]);
|
|
4600
|
+
return false;
|
|
4601
|
+
},
|
|
4602
|
+
},
|
|
4603
|
+
});
|
|
4604
|
+
|
|
4605
|
+
try {
|
|
4606
|
+
piIntercomExtension(harness.pi as never);
|
|
4607
|
+
await harness.emitLifecycle("session_start");
|
|
4608
|
+
const intercomTool = harness.tools.find((tool) => tool.name === "intercom")!;
|
|
4609
|
+
|
|
4610
|
+
const unsupported = await intercomTool.execute("remote-unsupported", {
|
|
4611
|
+
action: "send",
|
|
4612
|
+
to: "reviewer@workstation",
|
|
4613
|
+
message: "hello",
|
|
4614
|
+
attachments: [{ type: "snippet", name: "note", content: "body" }],
|
|
4615
|
+
}, new AbortController().signal, undefined, harness.ctx);
|
|
4616
|
+
assert.equal(unsupported.details?.error, true);
|
|
4617
|
+
|
|
4618
|
+
const malformed = await intercomTool.execute("remote-malformed", {
|
|
4619
|
+
action: "send",
|
|
4620
|
+
to: "review er@workstation",
|
|
4621
|
+
message: "hello",
|
|
4622
|
+
}, new AbortController().signal, undefined, harness.ctx);
|
|
4623
|
+
assert.equal(malformed.details?.error, true);
|
|
4624
|
+
assert.equal(confirmCalls.length, 0);
|
|
4625
|
+
|
|
4626
|
+
const declined = await intercomTool.execute("remote-declined", {
|
|
4627
|
+
action: "send",
|
|
4628
|
+
to: "reviewer@workstation",
|
|
4629
|
+
message: "hello",
|
|
4630
|
+
}, new AbortController().signal, undefined, harness.ctx);
|
|
4631
|
+
assert.equal(declined.content[0]?.text, "Message cancelled by user");
|
|
4632
|
+
assert.equal(confirmCalls.length, 1);
|
|
4633
|
+
assert.match(confirmCalls[0]![1], /reviewer@workstation/);
|
|
4634
|
+
assert.equal(existsSync(marker), false);
|
|
4635
|
+
} finally {
|
|
4636
|
+
await harness.emitLifecycle("session_shutdown");
|
|
4637
|
+
await cleanup();
|
|
4638
|
+
if (previousHerdrBin === undefined) delete process.env.HERDR_BIN_PATH;
|
|
4639
|
+
else process.env.HERDR_BIN_PATH = previousHerdrBin;
|
|
4640
|
+
rmSync(temp, { recursive: true, force: true });
|
|
4641
|
+
}
|
|
4642
|
+
});
|
|
4643
|
+
});
|
|
4644
|
+
|
|
4078
4645
|
test("contact_supervisor progress_update stays unthreaded despite a pending ask; a later inferred send resolves it", { concurrency: false }, async () => {
|
|
4079
4646
|
const { orchestrator, cleanup } = await setupClients();
|
|
4080
4647
|
|
|
@@ -4349,3 +4916,284 @@ test("failed delivery from an inferred reply preserves the pending ask", { concu
|
|
|
4349
4916
|
await cleanup();
|
|
4350
4917
|
}
|
|
4351
4918
|
});
|
|
4919
|
+
|
|
4920
|
+
test("structured RPC uses the shared runtime for commands, fast replies, receipts, presence and idle/busy incoming messages", { concurrency: false }, async () => {
|
|
4921
|
+
const { RpcIntercomBridge } = await import("../../modes/rpc/intercom-bridge.ts");
|
|
4922
|
+
const { INTERCOM_RPC_EVENT } = await import("./extension-api.ts");
|
|
4923
|
+
const { default: piIntercomExtension } = await import("./index.ts");
|
|
4924
|
+
const { planner, orchestrator, cleanup } = await setupClients();
|
|
4925
|
+
let idle = true;
|
|
4926
|
+
const harness = createExtensionHarness("rpc-worker", { mode: "rpc", hasUI: true, isIdle: () => idle });
|
|
4927
|
+
const events: Array<{ type: string; [key: string]: unknown }> = [];
|
|
4928
|
+
const bridge = new RpcIntercomBridge(harness.pi.events, event => events.push(event as never), harness.ctx.sessionManager.getSessionId());
|
|
4929
|
+
try {
|
|
4930
|
+
await withIntercomConfig({ inboundTrigger: "always" }, async () => {
|
|
4931
|
+
piIntercomExtension(harness.pi as never);
|
|
4932
|
+
await harness.emitLifecycle("session_start");
|
|
4933
|
+
const self = await waitForSessionByName(planner, "rpc-worker");
|
|
4934
|
+
assert.equal((await bridge.request({ type: "intercom_status" })).success, true);
|
|
4935
|
+
const unknown = await bridge.request({ type: "intercom_arbitrary", to: "planner", message: "must not send" } as never);
|
|
4936
|
+
assert.ok(!unknown.success);
|
|
4937
|
+
assert.match(unknown.error, /Unknown/);
|
|
4938
|
+
const list = await bridge.request({ type: "intercom_list" });
|
|
4939
|
+
assert.ok(list.success && "data" in list && "sessions" in list.data);
|
|
4940
|
+
assert.equal(list.data.sessions.filter(peer => peer.name === "rpc-worker").length, 1);
|
|
4941
|
+
assert.ok(events.some(event => event.type === "intercom_connection" && event.connected === true));
|
|
4942
|
+
const sent = await bridge.request({ type: "intercom_send", to: planner.sessionId!, message: "Desktop update" });
|
|
4943
|
+
assert.ok(sent.success && "data" in sent && "messageId" in sent.data);
|
|
4944
|
+
planner.sendMessageReceipt({ messageId: sent.data.messageId, status: "receiver_received", timestamp: Date.now() });
|
|
4945
|
+
assert.equal((await bridge.request({ type: "intercom_send", to: self.id, message: "self" })).success, false);
|
|
4946
|
+
assert.equal((await bridge.request({ type: "intercom_ask", to: "missing-peer", message: "?", timeoutMs: 100 })).success, false);
|
|
4947
|
+
assert.equal((await bridge.request({ type: "intercom_send", to: planner.sessionId!, message: "", attachments: [] })).success, false);
|
|
4948
|
+
assert.equal((await bridge.request({ type: "intercom_send", to: planner.sessionId!, message: "bad", attachments: [{ type: "invalid", name: "x", content: "x" }] as never })).success, false);
|
|
4949
|
+
const answer = (from: SessionInfo, message: Message) => {
|
|
4950
|
+
if (message.expectsReply && message.content.text === "Fast question") void planner.send(from.id, { text: "Fast answer", replyTo: message.id });
|
|
4951
|
+
};
|
|
4952
|
+
planner.on("message", answer);
|
|
4953
|
+
const asked = await bridge.request({ id: "ask-correlation", type: "intercom_ask", to: planner.sessionId!, message: "Fast question", timeoutMs: 2000 });
|
|
4954
|
+
planner.off("message", answer);
|
|
4955
|
+
assert.ok(asked.success && "data" in asked && "reply" in asked.data);
|
|
4956
|
+
assert.equal(asked.id, "ask-correlation");
|
|
4957
|
+
assert.equal(asked.data.reply.replyTo, asked.data.messageId);
|
|
4958
|
+
assert.equal(asked.data.reply.content.text, "Fast answer");
|
|
4959
|
+
const askId = "rpc-inbound-ask";
|
|
4960
|
+
await planner.send(self.id, { messageId: askId, text: "Inbound", expectsReply: true });
|
|
4961
|
+
await new Promise(resolve => setTimeout(resolve, 30));
|
|
4962
|
+
assert.ok(harness.userMessages.includes("New intercom message above."));
|
|
4963
|
+
assert.ok(harness.sentMessages.every(item => !item.options?.triggerTurn));
|
|
4964
|
+
const pending = await bridge.request({ type: "intercom_pending" });
|
|
4965
|
+
assert.ok(pending.success && "data" in pending && "asks" in pending.data);
|
|
4966
|
+
assert.equal(pending.data.asks[0]?.message.id, askId);
|
|
4967
|
+
const replyReceived = waitForReply(planner, askId);
|
|
4968
|
+
assert.equal((await bridge.request({ type: "intercom_reply", message: "Desktop answer", replyTo: askId })).success, true);
|
|
4969
|
+
assert.equal((await replyReceived).message.content.text, "Desktop answer");
|
|
4970
|
+
idle = false;
|
|
4971
|
+
await harness.emitLifecycle("agent_start");
|
|
4972
|
+
const messagesBefore = harness.sentMessages.length;
|
|
4973
|
+
await orchestrator.send(self.id, { text: "Busy message" });
|
|
4974
|
+
await new Promise(resolve => setTimeout(resolve, 30));
|
|
4975
|
+
assert.equal(harness.sentMessages.length, messagesBefore + 1);
|
|
4976
|
+
assert.equal(harness.sentMessages.at(-1)?.options?.deliverAs, "steer");
|
|
4977
|
+
orchestrator.updatePresence({ status: "thinking" });
|
|
4978
|
+
await new Promise(resolve => setTimeout(resolve, 30));
|
|
4979
|
+
assert.ok(events.some(event => event.type === "intercom_message"));
|
|
4980
|
+
assert.ok(events.some(event => event.type === "intercom_receipt"));
|
|
4981
|
+
assert.ok(events.some(event => event.type === "intercom_delivery"));
|
|
4982
|
+
assert.ok(events.some(event => event.type === "intercom_presence"));
|
|
4983
|
+
await orchestrator.disconnect();
|
|
4984
|
+
await new Promise(resolve => setTimeout(resolve, 30));
|
|
4985
|
+
assert.ok(events.some(event => event.type === "intercom_session_left"));
|
|
4986
|
+
// Duplicate broker messages must not create a second structured incoming event.
|
|
4987
|
+
const incomingCount = events.filter(event => event.type === "intercom_message").length;
|
|
4988
|
+
await planner.send(self.id, { messageId: askId, text: "Inbound", expectsReply: true });
|
|
4989
|
+
await new Promise(resolve => setTimeout(resolve, 30));
|
|
4990
|
+
assert.equal(events.filter(event => event.type === "intercom_message").length, incomingCount);
|
|
4991
|
+
const timedOut = await bridge.request({ type: "intercom_ask", to: planner.sessionId!, message: "Unanswered", timeoutMs: 30 });
|
|
4992
|
+
assert.ok(!timedOut.success);
|
|
4993
|
+
assert.match(timedOut.error, /not cancellation/);
|
|
4994
|
+
const blocked = bridge.request({ type: "intercom_ask", to: planner.sessionId!, message: "Pending at shutdown", timeoutMs: 1000 });
|
|
4995
|
+
await new Promise(resolve => setTimeout(resolve, 30));
|
|
4996
|
+
const competing = await bridge.request({ type: "intercom_ask", to: planner.sessionId!, message: "Competing ask", timeoutMs: 1000 });
|
|
4997
|
+
assert.ok(!competing.success);
|
|
4998
|
+
assert.match(competing.error, /Already waiting/);
|
|
4999
|
+
await harness.emitLifecycle("session_shutdown");
|
|
5000
|
+
assert.equal((await blocked).success, false);
|
|
5001
|
+
assert.equal((await bridge.request({ type: "intercom_list" })).success, false);
|
|
5002
|
+
assert.ok(events.some(event => event.type === "intercom_connection" && event.reason === "Session shutting down"));
|
|
5003
|
+
// Reload installs exactly one listener on the same bus and stale results are ignored.
|
|
5004
|
+
harness.clearLifecycleHandlers();
|
|
5005
|
+
piIntercomExtension(harness.pi as never);
|
|
5006
|
+
await harness.emitLifecycle("session_start");
|
|
5007
|
+
assert.equal((await bridge.request({ type: "intercom_list" })).success, true);
|
|
5008
|
+
await harness.emitLifecycle("session_shutdown");
|
|
5009
|
+
harness.pi.events.emit(INTERCOM_RPC_EVENT, { type: "intercom_connection", enabled: true, connected: false, sessionId: null });
|
|
5010
|
+
});
|
|
5011
|
+
} finally {
|
|
5012
|
+
bridge.dispose();
|
|
5013
|
+
await harness.emitLifecycle("session_shutdown");
|
|
5014
|
+
await cleanup();
|
|
5015
|
+
}
|
|
5016
|
+
});
|
|
5017
|
+
|
|
5018
|
+
test("stop_all_background cancels the blocking outbound ask and reports inbound asks it cannot cancel", { concurrency: false }, async () => {
|
|
5019
|
+
const { RpcIntercomBridge } = await import("../../modes/rpc/intercom-bridge.ts");
|
|
5020
|
+
const { RpcReleaseBridge } = await import("../../modes/rpc/release-bridge.ts");
|
|
5021
|
+
const { default: piIntercomExtension } = await import("./index.ts");
|
|
5022
|
+
const { planner, orchestrator, cleanup } = await setupClients();
|
|
5023
|
+
const harness = createExtensionHarness("stop-all-worker", { mode: "rpc", hasUI: true, isIdle: () => true });
|
|
5024
|
+
const sessionId = harness.ctx.sessionManager.getSessionId();
|
|
5025
|
+
const intercomBridge = new RpcIntercomBridge(harness.pi.events, () => undefined, sessionId);
|
|
5026
|
+
const releaseBridge = new RpcReleaseBridge(harness.pi.events, { version: 1, sessionId, epoch: "e1" });
|
|
5027
|
+
const stopCommand = { type: "stop_all_background" as const, version: 1 as const };
|
|
5028
|
+
try {
|
|
5029
|
+
await withIntercomConfig({ inboundTrigger: "always" }, async () => {
|
|
5030
|
+
piIntercomExtension(harness.pi as never);
|
|
5031
|
+
await harness.emitLifecycle("session_start");
|
|
5032
|
+
const self = await waitForSessionByName(planner, "stop-all-worker");
|
|
5033
|
+
// Idle: nothing to stop, and the intercom contributor answered.
|
|
5034
|
+
const idle = await releaseBridge.stopAll(stopCommand, () => [], () => []);
|
|
5035
|
+
assert.ok(idle.success && idle.command === "stop_all_background");
|
|
5036
|
+
assert.deepEqual(idle.data.stopped, []);
|
|
5037
|
+
|
|
5038
|
+
await planner.send(self.id, { messageId: "stop-all-inbound", text: "Please answer", expectsReply: true });
|
|
5039
|
+
// A different peer than the inbound asker: the broker refuses mutual asks.
|
|
5040
|
+
const blocked = intercomBridge.request({ type: "intercom_ask", to: orchestrator.sessionId!, message: "Pending ask", timeoutMs: 20_000 });
|
|
5041
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
5042
|
+
const reply = await releaseBridge.stopAll(stopCommand, () => [], () => []);
|
|
5043
|
+
assert.ok(reply.success && reply.command === "stop_all_background");
|
|
5044
|
+
const intercomItems = reply.data.stopped.filter(item => item.source === "intercom");
|
|
5045
|
+
const outbound = intercomItems.find(item => item.kind === "outbound_ask");
|
|
5046
|
+
assert.ok(outbound, JSON.stringify(reply.data.stopped));
|
|
5047
|
+
assert.equal(outbound.ok, true);
|
|
5048
|
+
assert.match(outbound.detail, /^Cancelled blocking ask to /);
|
|
5049
|
+
assert.deepEqual(intercomItems.filter(item => item.kind === "inbound_ask").map(item => [item.id, item.ok, item.error]), [["stop-all-inbound", false, "cannot cancel inbound"]]);
|
|
5050
|
+
// The blocked tool call returned with the cancellation instead of waiting for its 20s timeout.
|
|
5051
|
+
const settled = await blocked;
|
|
5052
|
+
assert.equal(settled.success, false);
|
|
5053
|
+
assert.match((settled as { error: string }).error, /Cancelled: session background work was stopped/);
|
|
5054
|
+
// Readiness afterwards has no outbound ask; the inbound ask is still ours to answer.
|
|
5055
|
+
assert.deepEqual(reply.data.remaining.blockers.filter(b => b.source === "intercom").map(b => b.kind), ["inbound_ask"]);
|
|
5056
|
+
// Idempotent: only the inbound ask is reported the second time.
|
|
5057
|
+
const again = await releaseBridge.stopAll(stopCommand, () => [], () => []);
|
|
5058
|
+
assert.ok(again.success && again.command === "stop_all_background");
|
|
5059
|
+
assert.deepEqual(again.data.stopped.map(item => [item.kind, item.ok]), [["inbound_ask", false]]);
|
|
5060
|
+
});
|
|
5061
|
+
} finally {
|
|
5062
|
+
intercomBridge.dispose();
|
|
5063
|
+
releaseBridge.dispose();
|
|
5064
|
+
await harness.emitLifecycle("session_shutdown");
|
|
5065
|
+
await cleanup();
|
|
5066
|
+
}
|
|
5067
|
+
});
|
|
5068
|
+
|
|
5069
|
+
test("structured RPC fails closed for disabled runtime, missing backend, and rejected/unavailable confirmation", { concurrency: false }, async () => {
|
|
5070
|
+
const { RpcIntercomBridge } = await import("../../modes/rpc/intercom-bridge.ts");
|
|
5071
|
+
const { default: piIntercomExtension } = await import("./index.ts");
|
|
5072
|
+
const { planner, cleanup } = await setupClients();
|
|
5073
|
+
try {
|
|
5074
|
+
for (const options of [
|
|
5075
|
+
{ config: { enabled: false }, hasUI: true },
|
|
5076
|
+
{ config: { confirmSend: true }, hasUI: false },
|
|
5077
|
+
{ config: { confirmSend: true }, hasUI: true },
|
|
5078
|
+
]) {
|
|
5079
|
+
const harness = createExtensionHarness("rpc-consent", { mode: "rpc", hasUI: options.hasUI, ui: { confirm: async () => false } });
|
|
5080
|
+
const bridge = new RpcIntercomBridge(harness.pi.events, () => {}, harness.ctx.sessionManager.getSessionId());
|
|
5081
|
+
await withIntercomConfig(options.config, async () => {
|
|
5082
|
+
piIntercomExtension(harness.pi as never);
|
|
5083
|
+
await harness.emitLifecycle("session_start");
|
|
5084
|
+
const sent = await bridge.request({ type: "intercom_send", to: planner.sessionId!, message: "Must not send" });
|
|
5085
|
+
assert.ok(!sent.success);
|
|
5086
|
+
assert.match(sent.error, /disabled|confirmation_unavailable|cancelled/);
|
|
5087
|
+
if (options.config.enabled === false) {
|
|
5088
|
+
const status = await bridge.request({ type: "intercom_status" });
|
|
5089
|
+
assert.ok(status.success && "data" in status && "enabled" in status.data);
|
|
5090
|
+
assert.equal(status.data.enabled, false);
|
|
5091
|
+
}
|
|
5092
|
+
await harness.emitLifecycle("session_shutdown");
|
|
5093
|
+
const missing = await bridge.request({ type: "intercom_list" });
|
|
5094
|
+
assert.ok(!missing.success);
|
|
5095
|
+
assert.match(missing.error, /unavailable/);
|
|
5096
|
+
});
|
|
5097
|
+
bridge.dispose();
|
|
5098
|
+
}
|
|
5099
|
+
} finally { await cleanup(); }
|
|
5100
|
+
});
|
|
5101
|
+
|
|
5102
|
+
test("structured RPC aborts a pending confirmation on disconnect and can reconnect", { concurrency: false }, async () => {
|
|
5103
|
+
const { RpcIntercomBridge } = await import("../../modes/rpc/intercom-bridge.ts");
|
|
5104
|
+
const { default: piIntercomExtension } = await import("./index.ts");
|
|
5105
|
+
const { planner, cleanup } = await setupClients();
|
|
5106
|
+
let confirmSignal: AbortSignal | undefined;
|
|
5107
|
+
let signalAborted = false;
|
|
5108
|
+
let enteredConfirm!: () => void;
|
|
5109
|
+
const confirming = new Promise<void>(resolve => { enteredConfirm = resolve; });
|
|
5110
|
+
const harness = createExtensionHarness("rpc-disconnect-confirm", { mode: "rpc", hasUI: true,
|
|
5111
|
+
ui: { confirm: (_title: string, _message: string, options: { signal: AbortSignal }) => new Promise<boolean>(resolve => {
|
|
5112
|
+
confirmSignal = options.signal;
|
|
5113
|
+
options.signal.addEventListener("abort", () => { signalAborted = true; resolve(false); }, { once: true });
|
|
5114
|
+
enteredConfirm();
|
|
5115
|
+
}) } });
|
|
5116
|
+
const bridge = new RpcIntercomBridge(harness.pi.events, () => {}, harness.ctx.sessionManager.getSessionId());
|
|
5117
|
+
const originalList = IntercomClient.prototype.listSessions;
|
|
5118
|
+
let extensionClient: InstanceType<typeof IntercomClient> | undefined;
|
|
5119
|
+
try {
|
|
5120
|
+
await withIntercomConfig({ confirmSend: true }, async () => {
|
|
5121
|
+
piIntercomExtension(harness.pi as never);
|
|
5122
|
+
await harness.emitLifecycle("session_start");
|
|
5123
|
+
IntercomClient.prototype.listSessions = function (options) {
|
|
5124
|
+
extensionClient = this;
|
|
5125
|
+
return originalList.call(this, options);
|
|
5126
|
+
};
|
|
5127
|
+
assert.equal((await bridge.request({ type: "intercom_list" })).success, true);
|
|
5128
|
+
IntercomClient.prototype.listSessions = originalList;
|
|
5129
|
+
const sent = bridge.request({ type: "intercom_send", to: planner.sessionId!, message: "Do not send after disconnect" });
|
|
5130
|
+
await confirming;
|
|
5131
|
+
assert.ok(confirmSignal && !confirmSignal.aborted);
|
|
5132
|
+
// Destroy the live transport without graceful unregister so the real disconnect handler runs.
|
|
5133
|
+
(extensionClient as unknown as { socket: { destroy(): void } }).socket.destroy();
|
|
5134
|
+
const response = await Promise.race([sent, new Promise<never>((_, reject) => setTimeout(() => reject(new Error("Disconnect did not settle confirmation promptly")), 1000).unref())]);
|
|
5135
|
+
assert.ok(!response.success);
|
|
5136
|
+
assert.match(response.error, /session ended/);
|
|
5137
|
+
assert.equal(signalAborted, true);
|
|
5138
|
+
assert.equal((await bridge.request({ type: "intercom_list" })).success, true);
|
|
5139
|
+
assert.equal(harness.entries.filter(entry => entry.type === "intercom_sent").length, 0);
|
|
5140
|
+
});
|
|
5141
|
+
} finally {
|
|
5142
|
+
IntercomClient.prototype.listSessions = originalList;
|
|
5143
|
+
bridge.dispose();
|
|
5144
|
+
await harness.emitLifecycle("session_shutdown");
|
|
5145
|
+
await cleanup();
|
|
5146
|
+
}
|
|
5147
|
+
});
|
|
5148
|
+
|
|
5149
|
+
test("structured RPC ask survives a concurrent model ask target-resolution failure", { concurrency: false }, async () => {
|
|
5150
|
+
const { RpcIntercomBridge } = await import("../../modes/rpc/intercom-bridge.ts");
|
|
5151
|
+
const { default: piIntercomExtension } = await import("./index.ts");
|
|
5152
|
+
const { planner, cleanup } = await setupClients();
|
|
5153
|
+
const harness = createExtensionHarness("rpc-model-waiter-owner", { mode: "rpc", hasUI: true });
|
|
5154
|
+
const bridge = new RpcIntercomBridge(harness.pi.events, () => {}, harness.ctx.sessionManager.getSessionId());
|
|
5155
|
+
const originalList = IntercomClient.prototype.listSessions;
|
|
5156
|
+
let releaseResolution!: () => void;
|
|
5157
|
+
let startedResolution!: () => void;
|
|
5158
|
+
const resolving = new Promise<void>(resolve => { startedResolution = resolve; });
|
|
5159
|
+
const resolutionGate = new Promise<void>(resolve => { releaseResolution = resolve; });
|
|
5160
|
+
try {
|
|
5161
|
+
piIntercomExtension(harness.pi as never);
|
|
5162
|
+
await harness.emitLifecycle("session_start");
|
|
5163
|
+
assert.equal((await bridge.request({ type: "intercom_list" })).success, true);
|
|
5164
|
+
IntercomClient.prototype.listSessions = async function () {
|
|
5165
|
+
startedResolution();
|
|
5166
|
+
await resolutionGate;
|
|
5167
|
+
throw new Error("Injected model target-resolution failure");
|
|
5168
|
+
};
|
|
5169
|
+
const tool = harness.tools.find(tool => tool.name === "intercom")!;
|
|
5170
|
+
const modelAsk = tool.execute("model-resolution-race", { action: "ask", to: "planner", message: "Model question" }, new AbortController().signal, undefined, harness.ctx);
|
|
5171
|
+
await resolving;
|
|
5172
|
+
IntercomClient.prototype.listSessions = originalList;
|
|
5173
|
+
const rpcQuestion = new Promise<{ from: SessionInfo; message: Message }>(resolve => {
|
|
5174
|
+
const handler = (from: SessionInfo, message: Message) => {
|
|
5175
|
+
if (message.content.text !== "RPC question owns waiter") return;
|
|
5176
|
+
planner.off("message", handler);
|
|
5177
|
+
resolve({ from, message });
|
|
5178
|
+
};
|
|
5179
|
+
planner.on("message", handler);
|
|
5180
|
+
});
|
|
5181
|
+
const rpcAsk = bridge.request({ type: "intercom_ask", to: planner.sessionId!, message: "RPC question owns waiter", timeoutMs: 3000 });
|
|
5182
|
+
const question = await rpcQuestion;
|
|
5183
|
+
releaseResolution();
|
|
5184
|
+
const modelResult = await modelAsk;
|
|
5185
|
+
assert.equal(modelResult.details?.error, true);
|
|
5186
|
+
assert.match(modelResult.content[0].text, /target-resolution failure/);
|
|
5187
|
+
await planner.send(question.from.id, { text: "RPC waiter was preserved", replyTo: question.message.id });
|
|
5188
|
+
const rpcResult = await rpcAsk;
|
|
5189
|
+
assert.ok(rpcResult.success && "data" in rpcResult && "reply" in rpcResult.data);
|
|
5190
|
+
assert.equal(rpcResult.data.reply.content.text, "RPC waiter was preserved");
|
|
5191
|
+
assert.equal(rpcResult.data.reply.replyTo, rpcResult.data.messageId);
|
|
5192
|
+
} finally {
|
|
5193
|
+
releaseResolution?.();
|
|
5194
|
+
IntercomClient.prototype.listSessions = originalList;
|
|
5195
|
+
bridge.dispose();
|
|
5196
|
+
await harness.emitLifecycle("session_shutdown");
|
|
5197
|
+
await cleanup();
|
|
5198
|
+
}
|
|
5199
|
+
});
|