@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,11 +1,12 @@
|
|
|
1
|
-
import { defineTool, type ExtensionAPI, type ExtensionContext } from "@selesai/code";
|
|
1
|
+
import { BorderedLoader, defineTool, type ExtensionAPI, type ExtensionContext } from "@selesai/code";
|
|
2
2
|
import { StringEnum } from "@earendil-works/pi-ai";
|
|
3
3
|
import { randomUUID } from "crypto";
|
|
4
4
|
import { Type } from "typebox";
|
|
5
5
|
import { Text } from "@earendil-works/pi-tui";
|
|
6
6
|
import { IntercomClient, type SendResult } from "./broker/client.ts";
|
|
7
7
|
import { spawnBrokerIfNeeded } from "./broker/spawn.ts";
|
|
8
|
-
import { SessionListOverlay } from "./ui/session-list.ts";
|
|
8
|
+
import { SessionListOverlay, type SessionListSelection } from "./ui/session-list.ts";
|
|
9
|
+
import { HandoverPicker, type HandoverPickerResult, type RemoteSessionLister } from "./ui/handover-picker.ts";
|
|
9
10
|
import { ComposeOverlay, type ComposeResult } from "./ui/compose.ts";
|
|
10
11
|
import { InlineMessageComponent } from "./ui/inline-message.ts";
|
|
11
12
|
import { getAskTimeoutMs, loadConfig, type IntercomConfig } from "./config.ts";
|
|
@@ -16,6 +17,7 @@ import {
|
|
|
16
17
|
INTERCOM_EXTENSION_REGISTRY_READY_EVENT,
|
|
17
18
|
INTERCOM_OUTBOX_REQUEST_EVENT,
|
|
18
19
|
INTERCOM_OUTBOX_RESULT_EVENT,
|
|
20
|
+
INTERCOM_SESSION_IDENTITY_EVENT,
|
|
19
21
|
type IntercomExtensionChannel,
|
|
20
22
|
type IntercomExtensionEvent,
|
|
21
23
|
type IntercomExtensionOwner,
|
|
@@ -25,12 +27,25 @@ import {
|
|
|
25
27
|
type IntercomOutboxResultCode,
|
|
26
28
|
type IntercomOutboxResultStatus,
|
|
27
29
|
type IntercomOutboxResultV1,
|
|
30
|
+
INTERCOM_RPC_REQUEST_EVENT, INTERCOM_RPC_RESULT_EVENT, INTERCOM_RPC_EVENT,
|
|
31
|
+
intercomRpcTimeout, type IntercomRpcRequest, type IntercomRpcResult,
|
|
32
|
+
type IntercomRpcEventData as IntercomRpcEvent, type IntercomRpcDelivery,
|
|
33
|
+
RELEASE_READINESS_EVENT, answerReleaseReadiness,
|
|
34
|
+
STOP_ALL_BACKGROUND_EVENT, answerStopAllBackground,
|
|
35
|
+
type IntercomSessionIdentityRequestV1,
|
|
28
36
|
} from "./extension-api.ts";
|
|
37
|
+
import { intercomReleaseBlockers, stopIntercom } from "./release-readiness.ts";
|
|
38
|
+
import { isMessage } from "./broker/protocol.ts";
|
|
29
39
|
import { ReplyTracker } from "./reply-tracker.ts";
|
|
30
|
-
import {
|
|
40
|
+
import { homedir } from "node:os";
|
|
41
|
+
import { join as joinPath, resolve as resolvePath } from "node:path";
|
|
31
42
|
import { sameCwd } from "./cwd.ts";
|
|
32
43
|
import { formatContextUsage } from "./format-context.ts";
|
|
33
44
|
import { openProjectPane, resolveTargetInCwd, waitForProjectSession, type ProjectPaneLaunch } from "./project-agent.ts";
|
|
45
|
+
import { relaySenderName } from "./cross-machine-envelope.ts";
|
|
46
|
+
import { runCommand, sendCrossMachine } from "./cross-machine-transport.ts";
|
|
47
|
+
import { listMachineAgents, listSavedMachines, parseCrossMachineTarget } from "./cross-machine-discovery.ts";
|
|
48
|
+
import { formatHandoverMessage, generateHandoverBody, readGitState } from "./handover.ts";
|
|
34
49
|
|
|
35
50
|
const INTERCOM_TOOL_NAME = "intercom";
|
|
36
51
|
const SUBAGENT_CONTROL_INTERCOM_EVENT = "subagent:control-intercom";
|
|
@@ -72,6 +87,25 @@ interface DeliveryTarget {
|
|
|
72
87
|
projectPane?: ProjectPaneLaunch;
|
|
73
88
|
}
|
|
74
89
|
|
|
90
|
+
interface DeliveryRequest {
|
|
91
|
+
to?: string;
|
|
92
|
+
cwd?: string;
|
|
93
|
+
openProjectPaneIfMissing?: boolean;
|
|
94
|
+
focus?: boolean;
|
|
95
|
+
message: string;
|
|
96
|
+
attachments?: Attachment[];
|
|
97
|
+
replyTo?: string;
|
|
98
|
+
supersedes?: string;
|
|
99
|
+
retryOf?: string;
|
|
100
|
+
/** Handovers are always new messages and are not sent once the signal aborts. */
|
|
101
|
+
handover?: boolean;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
interface IntercomToolResult {
|
|
105
|
+
content: Array<{ type: "text"; text: string }>;
|
|
106
|
+
details: Record<string, unknown>;
|
|
107
|
+
}
|
|
108
|
+
|
|
75
109
|
interface OutboxTarget {
|
|
76
110
|
id: string;
|
|
77
111
|
label: string;
|
|
@@ -113,6 +147,25 @@ function getErrorMessage(error: unknown): string {
|
|
|
113
147
|
return error instanceof Error ? error.message : String(error);
|
|
114
148
|
}
|
|
115
149
|
|
|
150
|
+
export function explicitCrossMachineSendRestriction(options: {
|
|
151
|
+
to?: string;
|
|
152
|
+
cwd?: string;
|
|
153
|
+
openProjectPaneIfMissing?: boolean;
|
|
154
|
+
attachments?: readonly unknown[];
|
|
155
|
+
replyTo?: string;
|
|
156
|
+
supersedes?: string;
|
|
157
|
+
retryOf?: string;
|
|
158
|
+
}): string | undefined {
|
|
159
|
+
if (!options.to?.includes("@")) return undefined;
|
|
160
|
+
if (options.cwd || options.openProjectPaneIfMissing) {
|
|
161
|
+
return "Cross-machine send does not support cwd or opening project panes.";
|
|
162
|
+
}
|
|
163
|
+
if (options.replyTo || options.supersedes || options.retryOf || options.attachments?.length) {
|
|
164
|
+
return "Cross-machine send only supports a new text message; attachments, reply relationships, supersede, and retry are not supported.";
|
|
165
|
+
}
|
|
166
|
+
return undefined;
|
|
167
|
+
}
|
|
168
|
+
|
|
116
169
|
function deliveryDetails(result: SendResult): Record<string, unknown> {
|
|
117
170
|
return {
|
|
118
171
|
messageId: result.id,
|
|
@@ -517,6 +570,14 @@ function currentTmuxPane(): string | undefined {
|
|
|
517
570
|
const pane = process.env.TMUX_PANE?.trim();
|
|
518
571
|
return pane ? pane : undefined;
|
|
519
572
|
}
|
|
573
|
+
// Herdr exports a launch-time pane alias to hosted processes. Its visible,
|
|
574
|
+
// workspace-qualified id can change when the pane moves, so registration also
|
|
575
|
+
// carries the stable Pi session file and the broker resolves both against a
|
|
576
|
+
// fresh snapshot. Workspace and tab ids are intentionally never registered.
|
|
577
|
+
function currentHerdrPane(): string | undefined {
|
|
578
|
+
const pane = process.env.HERDR_PANE_ID?.trim();
|
|
579
|
+
return pane ? pane : undefined;
|
|
580
|
+
}
|
|
520
581
|
function formatIntercomContactSnippet(sessionId: string): string {
|
|
521
582
|
return `Use pi-intercom: intercom({ action: "send", to: "${sessionId}", message: "..." })`;
|
|
522
583
|
}
|
|
@@ -528,13 +589,22 @@ function formatSessionLabel(session: SessionInfo, duplicates: Set<string>): stri
|
|
|
528
589
|
? `${session.name} (${session.id.slice(0, 8)})`
|
|
529
590
|
: session.name;
|
|
530
591
|
}
|
|
592
|
+
function formatHerdrLocation(session: SessionInfo): string {
|
|
593
|
+
const location = session.herdrLocation;
|
|
594
|
+
if (!location) return "";
|
|
595
|
+
if (location.status === "not_hosted") return "not under Herdr";
|
|
596
|
+
if (location.status === "unavailable") return `Herdr location unavailable: ${location.reason} (pane ${location.paneId})`;
|
|
597
|
+
return `Herdr ${location.workspace.label} [${location.workspace.id}] / ${location.tab.label} [${location.tab.id}] / pane ${location.paneId}`;
|
|
598
|
+
}
|
|
531
599
|
function formatSessionListRow(session: SessionInfo, currentCwd: string, isSelf: boolean, idPrefix: string): string {
|
|
532
600
|
const name = session.name || "Unnamed session";
|
|
533
601
|
const tags = [isSelf ? "self" : session.cwd === currentCwd ? "same cwd" : undefined, session.status]
|
|
534
602
|
.filter((tag): tag is string => Boolean(tag));
|
|
535
603
|
const suffix = tags.length ? ` [${tags.join(", ")}]` : "";
|
|
536
604
|
const pane = session.tmuxPane ? ` · tmux ${session.tmuxPane}` : "";
|
|
537
|
-
|
|
605
|
+
const herdrLocation = formatHerdrLocation(session);
|
|
606
|
+
const herdr = herdrLocation ? ` · ${herdrLocation}` : "";
|
|
607
|
+
return `• ${name} (${idPrefix}) — ${session.cwd} (${session.model}${formatContextUsage(session)}${pane})${herdr}${suffix}`;
|
|
538
608
|
}
|
|
539
609
|
function previewText(value: unknown, maxLength = 72): string | undefined {
|
|
540
610
|
if (typeof value !== "string") {
|
|
@@ -546,6 +616,9 @@ function previewText(value: unknown, maxLength = 72): string | undefined {
|
|
|
546
616
|
}
|
|
547
617
|
return normalized.length > maxLength ? `${normalized.slice(0, maxLength - 1)}…` : normalized;
|
|
548
618
|
}
|
|
619
|
+
function expandHomePath(path: string): string {
|
|
620
|
+
return path === "~" ? homedir() : path.startsWith("~/") ? joinPath(homedir(), path.slice(2)) : path;
|
|
621
|
+
}
|
|
549
622
|
function firstTextContent(result: { content?: Array<{ type: string; text?: string }> }): string {
|
|
550
623
|
return result.content?.find((item) => item.type === "text" && typeof item.text === "string")?.text?.replace(/\*\*/g, "") ?? "";
|
|
551
624
|
}
|
|
@@ -606,6 +679,27 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
606
679
|
let runtimeStarted = false;
|
|
607
680
|
let runtimeGeneration = 0;
|
|
608
681
|
let agentRunning = false;
|
|
682
|
+
// A wake prompt stays pending until agent_start: Pi marks the run active only after its async
|
|
683
|
+
// preflight. Pi exposes no prompt completion, and a handled or failed preflight never emits
|
|
684
|
+
// agent_start, so the reservation expires after a bounded window instead of latching.
|
|
685
|
+
let idleWakeRequestedAt = 0;
|
|
686
|
+
const idleWakePending = () => idleWakeRequestedAt > 0 && Date.now() - idleWakeRequestedAt < 10_000;
|
|
687
|
+
const heldInboundMessages: InboundMessageEntry[] = [];
|
|
688
|
+
let heldInboundTimer: NodeJS.Timeout | null = null;
|
|
689
|
+
function dropHeldInboundMessage(messageId: string, receipt: { status: MessageReceiptStatus; detail?: string }): boolean {
|
|
690
|
+
const index = heldInboundMessages.findIndex((entry) => entry.message.id === messageId);
|
|
691
|
+
if (index < 0) return false;
|
|
692
|
+
heldInboundMessages.splice(index, 1);
|
|
693
|
+
if (heldInboundMessages.length === 0) clearHeldInboundTimer();
|
|
694
|
+
emitMessageReceipt(messageId, receipt.status, receipt.detail);
|
|
695
|
+
return true;
|
|
696
|
+
}
|
|
697
|
+
function expireHeldInboundMessages(detail: string): void {
|
|
698
|
+
for (const entry of heldInboundMessages.splice(0)) {
|
|
699
|
+
emitMessageReceipt(entry.message.id, "expired", detail);
|
|
700
|
+
}
|
|
701
|
+
clearHeldInboundTimer();
|
|
702
|
+
}
|
|
609
703
|
const activeTools = new Map<string, string>();
|
|
610
704
|
const replyTracker = new ReplyTracker();
|
|
611
705
|
|
|
@@ -615,6 +709,7 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
615
709
|
const pendingOutboxRequests = new Map<string, PendingOutboxRequest>();
|
|
616
710
|
function dismissIncomingAsk(messageId: string): void {
|
|
617
711
|
replyTracker.dismissPendingAsk(messageId);
|
|
712
|
+
dropHeldInboundMessage(messageId, { status: "acknowledged", detail: "answered before injection" });
|
|
618
713
|
}
|
|
619
714
|
function hasSeenInboundMessage(from: SessionInfo, message: Message, now = Date.now()): boolean {
|
|
620
715
|
for (const [key, seenAt] of seenInboundMessages) {
|
|
@@ -648,11 +743,15 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
648
743
|
}
|
|
649
744
|
function handleMessageControl(control: MessageControl): void {
|
|
650
745
|
replyTracker.dismissPendingAsk(control.messageId);
|
|
746
|
+
const supersededDetail = control.supersededBy ? `superseded by ${control.supersededBy}` : undefined;
|
|
747
|
+
if (dropHeldInboundMessage(control.messageId, control.action === "cancel"
|
|
748
|
+
? { status: "cancelled", detail: "dropped before injection" }
|
|
749
|
+
: { status: "superseded", detail: supersededDetail })) return;
|
|
651
750
|
if (control.action === "cancel") {
|
|
652
751
|
emitMessageReceipt(control.messageId, "cancellation_requested", "message may already be injected or processed");
|
|
653
752
|
return;
|
|
654
753
|
}
|
|
655
|
-
emitMessageReceipt(control.messageId, "superseded",
|
|
754
|
+
emitMessageReceipt(control.messageId, "superseded", supersededDetail);
|
|
656
755
|
}
|
|
657
756
|
function latestDeliveryState(messageId: string | null, fallback: string): string {
|
|
658
757
|
if (!messageId) {
|
|
@@ -664,10 +763,11 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
664
763
|
let replyWaiter: {
|
|
665
764
|
from: string;
|
|
666
765
|
replyTo: string;
|
|
766
|
+
startedAt: number;
|
|
667
767
|
resolve: (message: Message) => void;
|
|
668
768
|
reject: (error: Error) => void;
|
|
669
769
|
} | null = null;
|
|
670
|
-
function waitForReply(from: string, replyTo: string, signal?: AbortSignal, cancelOnAbort?: () => void, getDeliveryState: () => string = () => "unknown"): Promise<Message> {
|
|
770
|
+
function waitForReply(from: string, replyTo: string, signal?: AbortSignal, cancelOnAbort?: () => void, getDeliveryState: () => string = () => "unknown", timeoutMs = askTimeoutMs): Promise<Message> {
|
|
671
771
|
if (replyWaiter) {
|
|
672
772
|
return Promise.reject(new Error("Already waiting for a reply"));
|
|
673
773
|
}
|
|
@@ -676,9 +776,9 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
676
776
|
}
|
|
677
777
|
return new Promise((resolve, reject) => {
|
|
678
778
|
const timeout = setTimeout(() => {
|
|
679
|
-
const timeoutDescription =
|
|
779
|
+
const timeoutDescription = timeoutMs % 60000 === 0 ? `${timeoutMs / 60000} minutes` : `${timeoutMs}ms`;
|
|
680
780
|
rejectReplyWaiter(new Error(`No reply from "${from}" for message ${replyTo} within ${timeoutDescription}. Last known delivery state: ${getDeliveryState()}. This waiter timeout is not cancellation; the delivered message may still be queued or actionable in the recipient session.`));
|
|
681
|
-
},
|
|
781
|
+
}, timeoutMs);
|
|
682
782
|
const cleanup = () => {
|
|
683
783
|
clearTimeout(timeout);
|
|
684
784
|
signal?.removeEventListener("abort", onAbort);
|
|
@@ -695,6 +795,7 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
695
795
|
replyWaiter = {
|
|
696
796
|
from,
|
|
697
797
|
replyTo,
|
|
798
|
+
startedAt: Date.now(),
|
|
698
799
|
resolve: (message) => {
|
|
699
800
|
cleanup();
|
|
700
801
|
resolve(message);
|
|
@@ -869,6 +970,8 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
869
970
|
|
|
870
971
|
const identity = buildPresenceIdentity(pi, currentIntercomSessionId ?? currentSessionId);
|
|
871
972
|
const tmuxPane = currentTmuxPane();
|
|
973
|
+
const herdrPaneId = currentHerdrPane();
|
|
974
|
+
const herdrSessionPath = herdrPaneId ? liveContext.sessionManager.getSessionFile() : undefined;
|
|
872
975
|
return {
|
|
873
976
|
...identity,
|
|
874
977
|
cwd: liveContext.cwd,
|
|
@@ -878,6 +981,8 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
878
981
|
lastActivity: Date.now(),
|
|
879
982
|
status: currentStatus(),
|
|
880
983
|
...(tmuxPane ? { tmuxPane } : {}),
|
|
984
|
+
...(herdrPaneId ? { herdrPaneId } : {}),
|
|
985
|
+
...(herdrSessionPath ? { herdrSessionPath } : {}),
|
|
881
986
|
...(localExtensions.size > 0
|
|
882
987
|
? {
|
|
883
988
|
extensions: currentExtensionCapabilities(),
|
|
@@ -1162,6 +1267,126 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
1162
1267
|
}
|
|
1163
1268
|
})();
|
|
1164
1269
|
}
|
|
1270
|
+
function emitRpcEvent(event: IntercomRpcEvent): void {
|
|
1271
|
+
pi.events.emit(INTERCOM_RPC_EVENT, { sessionId: currentSessionId, event });
|
|
1272
|
+
}
|
|
1273
|
+
function emitRpcConnection(connected: boolean, reason?: string): void {
|
|
1274
|
+
emitRpcEvent({ type: "intercom_connection", enabled: config.enabled, connected,
|
|
1275
|
+
sessionId: currentIntercomSessionId, ...(reason ? { reason } : {}) });
|
|
1276
|
+
}
|
|
1277
|
+
const rpcRequests = new Map<string, { controller: AbortController; settle(result: IntercomRpcResult): void }>();
|
|
1278
|
+
function endRpcRequests(): void {
|
|
1279
|
+
for (const [requestId, request] of [...rpcRequests]) {
|
|
1280
|
+
request.settle({ requestId, success: false, error: "Intercom session ended" });
|
|
1281
|
+
request.controller.abort();
|
|
1282
|
+
}
|
|
1283
|
+
}
|
|
1284
|
+
function handleRpcRequest(payload: unknown): void {
|
|
1285
|
+
const request = payload as IntercomRpcRequest;
|
|
1286
|
+
if (!request || typeof request.accept !== "function" || !request.command || !request.signal) return;
|
|
1287
|
+
request.accept();
|
|
1288
|
+
const { requestId, command } = request;
|
|
1289
|
+
const controller = new AbortController();
|
|
1290
|
+
const signal = AbortSignal.any([request.signal, controller.signal]);
|
|
1291
|
+
const generation = runtimeGeneration;
|
|
1292
|
+
const ctx = getLiveContext();
|
|
1293
|
+
const settle = (result: IntercomRpcResult) => {
|
|
1294
|
+
signal.removeEventListener("abort", onAbort);
|
|
1295
|
+
if (!rpcRequests.delete(requestId)) return;
|
|
1296
|
+
pi.events.emit(INTERCOM_RPC_RESULT_EVENT, result);
|
|
1297
|
+
};
|
|
1298
|
+
const onAbort = () => settle({ requestId, success: false, error: "Intercom session ended or request timed out" });
|
|
1299
|
+
rpcRequests.set(requestId, { controller, settle });
|
|
1300
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
1301
|
+
const checkLive = () => {
|
|
1302
|
+
if (signal.aborted || !getLiveContext(ctx, generation)) throw new Error("Intercom session ended or request timed out");
|
|
1303
|
+
};
|
|
1304
|
+
void (async () => {
|
|
1305
|
+
if (!["intercom_status", "intercom_list", "intercom_send", "intercom_ask", "intercom_reply", "intercom_pending"].includes(command.type)) throw new Error("Unknown Intercom RPC command");
|
|
1306
|
+
if (signal.aborted) throw new Error("Intercom request ended");
|
|
1307
|
+
const timeoutMs = intercomRpcTimeout(command);
|
|
1308
|
+
if (command.type === "intercom_status") {
|
|
1309
|
+
return { enabled: config.enabled, connected: Boolean(client?.isConnected()), sessionId: currentIntercomSessionId,
|
|
1310
|
+
...(currentSessionId ? { name: buildPresenceIdentity(pi, currentIntercomSessionId ?? currentSessionId).name } : {}) };
|
|
1311
|
+
}
|
|
1312
|
+
if (!config.enabled) throw new Error("Intercom disabled");
|
|
1313
|
+
checkLive();
|
|
1314
|
+
if (command.type === "intercom_pending") return { asks: replyTracker.listPending() };
|
|
1315
|
+
if (command.type !== "intercom_list") {
|
|
1316
|
+
if (typeof command.message !== "string" || !command.message.trim()) throw new Error("message must be a non-empty string");
|
|
1317
|
+
if (command.to !== undefined && (typeof command.to !== "string" || !command.to.trim())) throw new Error("to must be a non-empty string");
|
|
1318
|
+
if (command.type !== "intercom_reply" && !command.to) throw new Error("to is required");
|
|
1319
|
+
if (command.replyTo !== undefined && (typeof command.replyTo !== "string" || !command.replyTo.trim())) throw new Error("replyTo must be a non-empty string");
|
|
1320
|
+
if (!isMessage({ id: "validation", timestamp: Date.now(), replyTo: command.replyTo,
|
|
1321
|
+
content: { text: command.message, attachments: command.attachments } })) throw new Error("Invalid message or attachments");
|
|
1322
|
+
}
|
|
1323
|
+
const activeClient = await ensureConnected("tool");
|
|
1324
|
+
checkLive();
|
|
1325
|
+
if (command.type === "intercom_list") {
|
|
1326
|
+
const sessions = await activeClient.listSessions();
|
|
1327
|
+
checkLive();
|
|
1328
|
+
return { sessionId: activeClient.sessionId!, sessions };
|
|
1329
|
+
}
|
|
1330
|
+
let replyTo = command.replyTo;
|
|
1331
|
+
let to: string;
|
|
1332
|
+
if (command.type === "intercom_reply") {
|
|
1333
|
+
const target = replyTracker.resolveReplyTarget({ to: command.to, replyTo });
|
|
1334
|
+
to = target.from.id;
|
|
1335
|
+
replyTo = target.message.id;
|
|
1336
|
+
} else {
|
|
1337
|
+
to = await resolveSessionTarget(activeClient, command.to) ?? command.to;
|
|
1338
|
+
if (command.type === "intercom_ask" && !(await activeClient.listSessions()).some(peer => peer.id === to)) {
|
|
1339
|
+
throw new Error("Recipient is not currently connected; blocking asks are not queued");
|
|
1340
|
+
}
|
|
1341
|
+
}
|
|
1342
|
+
checkLive();
|
|
1343
|
+
if (currentSessionTargetMatches(to, to, activeClient)) throw new Error("Cannot message the current session");
|
|
1344
|
+
if (command.type === "intercom_send" && !replyTo) {
|
|
1345
|
+
const mismatch = replyTracker.findActiveReplyTargetMismatch(to);
|
|
1346
|
+
if (mismatch) throw new Error(`Use reply for active ask ${mismatch.message.id}; refusing misdirected send`);
|
|
1347
|
+
replyTo = replyTracker.findUniquePendingAskFrom(to)?.message.id;
|
|
1348
|
+
}
|
|
1349
|
+
if (command.type === "intercom_send" && !command.replyTo && config.confirmSend) {
|
|
1350
|
+
if (!ctx!.hasUI) throw new Error("confirmation_unavailable: confirmSend requires UI");
|
|
1351
|
+
const confirmed = await ctx!.ui.confirm("Send message", `Send to "${command.to}":\n\n${command.message}${command.attachments?.length ? formatAttachments(command.attachments) : ""}`,
|
|
1352
|
+
{ signal, timeout: 30_000 });
|
|
1353
|
+
checkLive();
|
|
1354
|
+
if (!confirmed) throw new Error("Message cancelled by user");
|
|
1355
|
+
}
|
|
1356
|
+
const questionId = randomUUID();
|
|
1357
|
+
let replyPromise: Promise<Message> | undefined;
|
|
1358
|
+
let deliveryState = "created";
|
|
1359
|
+
// Reserve the shared waiter before sending, so a fast reply cannot be lost.
|
|
1360
|
+
if (command.type === "intercom_ask") {
|
|
1361
|
+
if (replyWaiter) throw new Error("Already waiting for a reply");
|
|
1362
|
+
replyPromise = waitForReply(to, questionId, signal, undefined,
|
|
1363
|
+
() => latestDeliveryState(questionId, deliveryState), timeoutMs);
|
|
1364
|
+
replyPromise.catch(() => undefined);
|
|
1365
|
+
}
|
|
1366
|
+
try {
|
|
1367
|
+
checkLive();
|
|
1368
|
+
const result = await activeClient.send(to, { text: command.message, attachments: command.attachments, replyTo,
|
|
1369
|
+
...(replyPromise ? { messageId: questionId, expectsReply: true } : {}) });
|
|
1370
|
+
deliveryState = result.delivery;
|
|
1371
|
+
checkLive();
|
|
1372
|
+
const data: IntercomRpcDelivery = { messageId: result.id, delivered: result.delivered, to, replyTo,
|
|
1373
|
+
delivery: result.delivery, retryable: result.retryable, outcomeKnown: result.outcomeKnown,
|
|
1374
|
+
...(result.code ? { code: result.code } : {}), ...(result.reason ? { reason: result.reason } : {}) };
|
|
1375
|
+
if (!result.delivered) throw new Error(`Message ${result.id} not delivered: ${result.reason ?? result.delivery}`);
|
|
1376
|
+
pi.appendEntry("intercom_sent", { to, message: { text: command.message, attachments: command.attachments, replyTo }, messageId: result.id, timestamp: Date.now() });
|
|
1377
|
+
if (replyTo) dismissIncomingAsk(replyTo);
|
|
1378
|
+
if (!replyPromise) return data;
|
|
1379
|
+
const reply = await replyPromise;
|
|
1380
|
+
checkLive();
|
|
1381
|
+
pi.appendEntry("intercom_received", { from: to, message: reply.content, messageId: reply.id, timestamp: reply.timestamp });
|
|
1382
|
+
return { ...data, reply };
|
|
1383
|
+
} catch (error) {
|
|
1384
|
+
// Only the owner of this waiter may reject it; concurrent asks fail without replacing it.
|
|
1385
|
+
if (replyPromise && replyWaiter?.replyTo === questionId) rejectReplyWaiter(toError(error));
|
|
1386
|
+
throw error;
|
|
1387
|
+
}
|
|
1388
|
+
})().then(data => settle({ requestId, success: true, data }), error => settle({ requestId, success: false, error: getErrorMessage(error) }));
|
|
1389
|
+
}
|
|
1165
1390
|
function shouldTriggerInboundMessage(entry: InboundMessageEntry, forceTrigger = false): boolean {
|
|
1166
1391
|
if (forceTrigger) {
|
|
1167
1392
|
return true;
|
|
@@ -1179,19 +1404,21 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
1179
1404
|
return;
|
|
1180
1405
|
}
|
|
1181
1406
|
const injectedMessage = { ...entry.message, injectedAt: Date.now() };
|
|
1182
|
-
emitMessageReceipt(injectedMessage.id, "injected");
|
|
1183
1407
|
const replyCommand = delivery === "steer" && entry.replyCommand && entry.message.expectsReply
|
|
1184
1408
|
? `intercom({ action: "reply", replyTo: ${JSON.stringify(entry.message.id)}, message: "..." })`
|
|
1185
1409
|
: entry.replyCommand;
|
|
1186
1410
|
const deliveredEntry = { ...entry, message: injectedMessage, replyCommand };
|
|
1187
1411
|
replyTracker.queueTurnContext({ from: entry.from, message: injectedMessage, receivedAt: Date.now() });
|
|
1188
|
-
const senderDisplay =
|
|
1412
|
+
const senderDisplay = injectedMessage.crossMachine
|
|
1413
|
+
? `${relaySenderName(injectedMessage.crossMachine.origin)} · unverified cross-machine`
|
|
1414
|
+
: entry.from.name || entry.from.id.slice(0, 8);
|
|
1189
1415
|
// The tool may be an inactive optional capability: say how to activate it, not just its call.
|
|
1190
1416
|
const activateHint = pi.getActiveTools().includes("intercom")
|
|
1191
1417
|
? ""
|
|
1192
|
-
: ' (not active yet:
|
|
1418
|
+
: ' (not active yet: use codemode searchTools() (or tool_search when enabled) to find and expose "intercom" first)';
|
|
1193
1419
|
const replyInstruction = replyCommand ? `\n\nTo reply, use the intercom tool${activateHint}: ${replyCommand}` : "";
|
|
1194
1420
|
const deliveryMetadata = formatInboundDeliveryMetadata(injectedMessage);
|
|
1421
|
+
const trigger = delivery === "trigger" && shouldTriggerInboundMessage(entry, forceTrigger);
|
|
1195
1422
|
pi.sendMessage(
|
|
1196
1423
|
{
|
|
1197
1424
|
customType: "intercom_message",
|
|
@@ -1199,14 +1426,71 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
1199
1426
|
display: true,
|
|
1200
1427
|
details: deliveredEntry,
|
|
1201
1428
|
},
|
|
1202
|
-
|
|
1203
|
-
? { triggerTurn: true }
|
|
1204
|
-
: { deliverAs: "steer" }
|
|
1429
|
+
trigger ? undefined : { deliverAs: "steer" }
|
|
1205
1430
|
);
|
|
1431
|
+
// Pi skips before_agent_start for sendMessage({ triggerTurn: true }) turns (pi#5581),
|
|
1432
|
+
// so wake an idle session with a user prompt that runs the normal prompt lifecycle.
|
|
1433
|
+
if (trigger && !idleWakePending() && getLiveContext(runtimeContext, generation)?.isIdle()) {
|
|
1434
|
+
idleWakeRequestedAt = Date.now();
|
|
1435
|
+
pi.sendUserMessage("New intercom message above.");
|
|
1436
|
+
}
|
|
1437
|
+
emitMessageReceipt(injectedMessage.id, "injected");
|
|
1206
1438
|
}
|
|
1207
1439
|
function sendIncomingBrokerMessage(entry: InboundMessageEntry, delivery: "trigger" | "steer", generation = runtimeGeneration): void {
|
|
1208
1440
|
sendIncomingMessage(entry, delivery, generation);
|
|
1209
1441
|
}
|
|
1442
|
+
function deliverIncomingBrokerMessage(entry: InboundMessageEntry, ctx: ExtensionContext, generation: number): void {
|
|
1443
|
+
const activeContext = getLiveContext(ctx, generation);
|
|
1444
|
+
if (!activeContext) return;
|
|
1445
|
+
if (!activeContext.isIdle()) {
|
|
1446
|
+
if (!activeContext.hasUI) {
|
|
1447
|
+
const activeClient = client;
|
|
1448
|
+
if (!entry.message.replyTo && activeClient?.isConnected()) {
|
|
1449
|
+
void (async () => {
|
|
1450
|
+
try {
|
|
1451
|
+
const result = await activeClient.send(entry.from.id, {
|
|
1452
|
+
text: "This agent is running in non-interactive mode and cannot respond to intercom messages while it is working. It will continue its current task and exit when done.",
|
|
1453
|
+
replyTo: entry.message.id,
|
|
1454
|
+
});
|
|
1455
|
+
if (result.delivered && getLiveContext(ctx, generation)) dismissIncomingAsk(entry.message.id);
|
|
1456
|
+
} catch {
|
|
1457
|
+
// Best-effort reply; keep the busy non-interactive session running either way.
|
|
1458
|
+
}
|
|
1459
|
+
})();
|
|
1460
|
+
}
|
|
1461
|
+
return;
|
|
1462
|
+
}
|
|
1463
|
+
sendIncomingBrokerMessage(entry, "steer", generation);
|
|
1464
|
+
return;
|
|
1465
|
+
}
|
|
1466
|
+
sendIncomingBrokerMessage(entry, "trigger", generation);
|
|
1467
|
+
}
|
|
1468
|
+
function flushHeldInboundMessages(ctx: ExtensionContext, generation: number): void {
|
|
1469
|
+
if (!getLiveContext(ctx, generation)) return;
|
|
1470
|
+
if (config.busyDelivery === "human-first" && ctx.hasUI) {
|
|
1471
|
+
if (ctx.isIdle() && !idleWakePending() && heldInboundMessages.length > 0) {
|
|
1472
|
+
deliverIncomingBrokerMessage(heldInboundMessages.shift()!, ctx, generation);
|
|
1473
|
+
}
|
|
1474
|
+
if (heldInboundMessages.length === 0) clearHeldInboundTimer();
|
|
1475
|
+
return;
|
|
1476
|
+
}
|
|
1477
|
+
while (heldInboundMessages.length > 0 && (ctx.isIdle() || agentRunning) && getLiveContext(ctx, generation)) {
|
|
1478
|
+
deliverIncomingBrokerMessage(heldInboundMessages.shift()!, ctx, generation);
|
|
1479
|
+
}
|
|
1480
|
+
if (heldInboundMessages.length === 0) clearHeldInboundTimer();
|
|
1481
|
+
}
|
|
1482
|
+
function clearHeldInboundTimer(): void {
|
|
1483
|
+
if (heldInboundTimer) clearInterval(heldInboundTimer);
|
|
1484
|
+
heldInboundTimer = null;
|
|
1485
|
+
}
|
|
1486
|
+
function holdIncomingBrokerMessage(entry: InboundMessageEntry, ctx: ExtensionContext, generation: number): void {
|
|
1487
|
+
heldInboundMessages.push(entry);
|
|
1488
|
+
emitMessageReceipt(entry.message.id, "queued", "held until delivery is safe");
|
|
1489
|
+
if (!heldInboundTimer) {
|
|
1490
|
+
heldInboundTimer = setInterval(() => flushHeldInboundMessages(ctx, generation), 100);
|
|
1491
|
+
heldInboundTimer.unref();
|
|
1492
|
+
}
|
|
1493
|
+
}
|
|
1210
1494
|
function handleIncomingMessage(ctx: ExtensionContext, from: SessionInfo, message: Message): void {
|
|
1211
1495
|
const messageGeneration = runtimeGeneration;
|
|
1212
1496
|
const liveContext = getLiveContext(ctx, messageGeneration);
|
|
@@ -1219,6 +1503,7 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
1219
1503
|
return;
|
|
1220
1504
|
}
|
|
1221
1505
|
const receivedMessage = { ...message, receiverReceivedAt };
|
|
1506
|
+
emitRpcEvent({ type: "intercom_message", from, message: receivedMessage });
|
|
1222
1507
|
emitMessageReceipt(receivedMessage.id, "receiver_received");
|
|
1223
1508
|
if (replyWaiter) {
|
|
1224
1509
|
const senderTarget = from.name || from.id;
|
|
@@ -1235,48 +1520,27 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
1235
1520
|
? formatAttachments(receivedMessage.content.attachments)
|
|
1236
1521
|
: "";
|
|
1237
1522
|
const bodyText = `${receivedMessage.content.text}${attachmentText}`;
|
|
1238
|
-
const replyCommand = config.replyHint && receivedMessage.
|
|
1239
|
-
? `intercom({ action: "
|
|
1240
|
-
:
|
|
1523
|
+
const replyCommand = config.replyHint && receivedMessage.crossMachine
|
|
1524
|
+
? `intercom({ action: "send", to: ${JSON.stringify(relaySenderName(receivedMessage.crossMachine.origin))}, message: "..." })`
|
|
1525
|
+
: config.replyHint && receivedMessage.expectsReply
|
|
1526
|
+
? `intercom({ action: "reply", message: "..." })`
|
|
1527
|
+
: undefined;
|
|
1241
1528
|
replyTracker.recordIncomingMessage(from, receivedMessage, receiverReceivedAt);
|
|
1242
1529
|
emitMessageReceipt(receivedMessage.id, "acknowledged", "accepted by receiver");
|
|
1243
1530
|
const entry = { from, message: receivedMessage, replyCommand, bodyText };
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
if (!activeContext.hasUI) {
|
|
1251
|
-
const activeClient = client;
|
|
1252
|
-
if (!message.replyTo && activeClient?.isConnected()) {
|
|
1253
|
-
try {
|
|
1254
|
-
const result = await activeClient.send(from.id, {
|
|
1255
|
-
text: "This agent is running in non-interactive mode and cannot respond to intercom messages while it is working. It will continue its current task and exit when done.",
|
|
1256
|
-
replyTo: message.id,
|
|
1257
|
-
});
|
|
1258
|
-
if (result.delivered && getLiveContext(liveContext, messageGeneration)) {
|
|
1259
|
-
dismissIncomingAsk(message.id);
|
|
1260
|
-
}
|
|
1261
|
-
} catch {
|
|
1262
|
-
// Best-effort reply; keep the busy non-interactive session running either way.
|
|
1263
|
-
}
|
|
1264
|
-
}
|
|
1265
|
-
return;
|
|
1266
|
-
}
|
|
1267
|
-
sendIncomingBrokerMessage(entry, "steer");
|
|
1268
|
-
return;
|
|
1269
|
-
}
|
|
1270
|
-
if (getLiveContext(liveContext, messageGeneration)) {
|
|
1271
|
-
sendIncomingBrokerMessage(entry, "trigger", messageGeneration);
|
|
1272
|
-
}
|
|
1273
|
-
})();
|
|
1531
|
+
// Busy without an agent run cannot steer; manual compaction can discard an appended custom entry.
|
|
1532
|
+
if (heldInboundMessages.length > 0 || (!liveContext.isIdle() && (!agentRunning || (config.busyDelivery === "human-first" && liveContext.hasUI)))) {
|
|
1533
|
+
holdIncomingBrokerMessage(entry, liveContext, messageGeneration);
|
|
1534
|
+
} else {
|
|
1535
|
+
deliverIncomingBrokerMessage(entry, liveContext, messageGeneration);
|
|
1536
|
+
}
|
|
1274
1537
|
}
|
|
1275
1538
|
function attachClientHandlers(nextClient: IntercomClient): void {
|
|
1276
1539
|
nextClient.onBrokerMessage((message: BrokerMessage) => {
|
|
1277
1540
|
if (client !== nextClient) return;
|
|
1278
1541
|
switch (message.type) {
|
|
1279
1542
|
case "registered": {
|
|
1543
|
+
emitRpcConnection(true);
|
|
1280
1544
|
const supported = message.features?.includes(EXTENSION_BUS_FEATURE) ?? false;
|
|
1281
1545
|
if (supported && localExtensions.size > 0) {
|
|
1282
1546
|
nextClient.updateExtensionCapabilities(currentExtensionCapabilities());
|
|
@@ -1323,7 +1587,12 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
1323
1587
|
...(message.reason ? { reason: message.reason } : {}),
|
|
1324
1588
|
});
|
|
1325
1589
|
break;
|
|
1590
|
+
case "delivered":
|
|
1591
|
+
case "delivery_failed":
|
|
1592
|
+
emitRpcEvent({ type: "intercom_delivery", result: message });
|
|
1593
|
+
break;
|
|
1326
1594
|
case "message_receipt":
|
|
1595
|
+
emitRpcEvent({ type: "intercom_receipt", from: message.from, receipt: message.receipt });
|
|
1327
1596
|
latestOutboundReceipts.set(message.receipt.messageId, {
|
|
1328
1597
|
status: message.receipt.status,
|
|
1329
1598
|
timestamp: message.receipt.timestamp,
|
|
@@ -1334,16 +1603,19 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
1334
1603
|
handleMessageControl(message.control);
|
|
1335
1604
|
break;
|
|
1336
1605
|
case "session_joined":
|
|
1606
|
+
emitRpcEvent({ type: "intercom_session_joined", session: message.session });
|
|
1337
1607
|
for (const namespace of localExtensions.keys()) {
|
|
1338
1608
|
emitLocalExtensionEvent(namespace, { type: "session_joined", session: message.session });
|
|
1339
1609
|
}
|
|
1340
1610
|
break;
|
|
1341
1611
|
case "session_left":
|
|
1612
|
+
emitRpcEvent({ type: "intercom_session_left", sessionId: message.sessionId });
|
|
1342
1613
|
for (const namespace of localExtensions.keys()) {
|
|
1343
1614
|
emitLocalExtensionEvent(namespace, { type: "session_left", sessionId: message.sessionId });
|
|
1344
1615
|
}
|
|
1345
1616
|
break;
|
|
1346
1617
|
case "presence_update":
|
|
1618
|
+
emitRpcEvent({ type: "intercom_presence", session: message.session });
|
|
1347
1619
|
for (const namespace of localExtensions.keys()) {
|
|
1348
1620
|
emitLocalExtensionEvent(namespace, { type: "presence_update", session: message.session });
|
|
1349
1621
|
}
|
|
@@ -1361,6 +1633,8 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
1361
1633
|
if (client !== nextClient) {
|
|
1362
1634
|
return;
|
|
1363
1635
|
}
|
|
1636
|
+
emitRpcConnection(false, error.message);
|
|
1637
|
+
endRpcRequests();
|
|
1364
1638
|
rejectReplyWaiter(new Error(`Disconnected while waiting for reply: ${error.message}`, { cause: error }));
|
|
1365
1639
|
for (const [namespace, extension] of localExtensions) {
|
|
1366
1640
|
extension.owner = undefined;
|
|
@@ -1433,6 +1707,7 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
1433
1707
|
if (reason === "background" && getLiveContext(contextAtStart, generationAtStart)) {
|
|
1434
1708
|
scheduleReconnect();
|
|
1435
1709
|
}
|
|
1710
|
+
if (getLiveContext(contextAtStart, generationAtStart)) emitRpcConnection(false, getErrorMessage(error));
|
|
1436
1711
|
throw toError(error);
|
|
1437
1712
|
} finally {
|
|
1438
1713
|
if (reconnectPromise === nextReconnectPromise) {
|
|
@@ -1524,6 +1799,196 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
1524
1799
|
});
|
|
1525
1800
|
return { id: session.id, label: session.name || session.id, projectPane };
|
|
1526
1801
|
}
|
|
1802
|
+
/** Shared by send, handover, and /handover. Never throws; failures are returned as error results. */
|
|
1803
|
+
async function deliverMessage(
|
|
1804
|
+
connectedClient: IntercomClient,
|
|
1805
|
+
ctx: ExtensionContext,
|
|
1806
|
+
signal: AbortSignal | undefined,
|
|
1807
|
+
request: DeliveryRequest,
|
|
1808
|
+
): Promise<IntercomToolResult> {
|
|
1809
|
+
const { to, cwd, openProjectPaneIfMissing, focus, message, attachments, replyTo, supersedes, retryOf } = request;
|
|
1810
|
+
try {
|
|
1811
|
+
const crossMachineTarget = Boolean(to?.includes("@"));
|
|
1812
|
+
const crossMachineRestriction = explicitCrossMachineSendRestriction({
|
|
1813
|
+
to, cwd, openProjectPaneIfMissing, attachments, replyTo, supersedes, retryOf,
|
|
1814
|
+
});
|
|
1815
|
+
if (crossMachineRestriction) {
|
|
1816
|
+
return {
|
|
1817
|
+
content: [{ type: "text", text: crossMachineRestriction }],
|
|
1818
|
+
details: { error: true, crossMachine: false },
|
|
1819
|
+
};
|
|
1820
|
+
}
|
|
1821
|
+
if (crossMachineTarget) {
|
|
1822
|
+
try {
|
|
1823
|
+
parseCrossMachineTarget(to!);
|
|
1824
|
+
} catch (error) {
|
|
1825
|
+
return {
|
|
1826
|
+
content: [{ type: "text", text: getErrorMessage(error) }],
|
|
1827
|
+
details: { error: true, crossMachine: false },
|
|
1828
|
+
};
|
|
1829
|
+
}
|
|
1830
|
+
}
|
|
1831
|
+
if (openProjectPaneIfMissing && !cwd) {
|
|
1832
|
+
return {
|
|
1833
|
+
content: [{ type: "text", text: "openProjectPaneIfMissing requires a target cwd." }],
|
|
1834
|
+
details: { error: true },
|
|
1835
|
+
};
|
|
1836
|
+
}
|
|
1837
|
+
const confirmSend = !replyTo && config.confirmSend && ctx.hasUI;
|
|
1838
|
+
const attachmentText = attachments?.length ? formatAttachments(attachments) : "";
|
|
1839
|
+
if (confirmSend && cwd && openProjectPaneIfMissing) {
|
|
1840
|
+
const confirmed = await ctx.ui.confirm(
|
|
1841
|
+
"Send message",
|
|
1842
|
+
`Send to "${to ?? cwd}":\n\n${message}${attachmentText}`,
|
|
1843
|
+
);
|
|
1844
|
+
if (!confirmed) {
|
|
1845
|
+
return {
|
|
1846
|
+
content: [{ type: "text", text: "Message cancelled by user" }],
|
|
1847
|
+
details: {},
|
|
1848
|
+
};
|
|
1849
|
+
}
|
|
1850
|
+
}
|
|
1851
|
+
if (confirmSend && crossMachineTarget) {
|
|
1852
|
+
const confirmed = await ctx.ui.confirm("Send message", `Send to "${to}":\n\n${message}`);
|
|
1853
|
+
if (!confirmed) {
|
|
1854
|
+
return {
|
|
1855
|
+
content: [{ type: "text", text: "Message cancelled by user" }],
|
|
1856
|
+
details: {},
|
|
1857
|
+
};
|
|
1858
|
+
}
|
|
1859
|
+
}
|
|
1860
|
+
if (crossMachineTarget) {
|
|
1861
|
+
if (request.handover && signal?.aborted) {
|
|
1862
|
+
return { content: [{ type: "text", text: "Handover was cancelled before delivery." }], details: { error: true } };
|
|
1863
|
+
}
|
|
1864
|
+
const identity = buildPresenceIdentity(pi, connectedClient.sessionId ?? ctx.sessionManager.getSessionId());
|
|
1865
|
+
try {
|
|
1866
|
+
const remote = await sendCrossMachine(to!, message, {
|
|
1867
|
+
name: identity.name,
|
|
1868
|
+
sessionId: connectedClient.sessionId ?? ctx.sessionManager.getSessionId(),
|
|
1869
|
+
machine: config.crossMachine.machineName,
|
|
1870
|
+
}, {
|
|
1871
|
+
remoteCommand: config.crossMachine.remoteCommand,
|
|
1872
|
+
});
|
|
1873
|
+
const remoteTarget = relaySenderName({ name: remote.agent.name, machine: remote.machine.label });
|
|
1874
|
+
pi.appendEntry("intercom_sent", {
|
|
1875
|
+
to: remoteTarget,
|
|
1876
|
+
message: { text: message },
|
|
1877
|
+
timestamp: Date.now(),
|
|
1878
|
+
crossMachine: true,
|
|
1879
|
+
});
|
|
1880
|
+
return {
|
|
1881
|
+
content: [{ type: "text", text: `Message sent to ${remoteTarget} over SSH (origin identity is SSH-asserted)` }],
|
|
1882
|
+
details: { delivered: true, crossMachine: true, machine: remote.machine.label, target: remote.agent.name, trust: "ssh-asserted" },
|
|
1883
|
+
};
|
|
1884
|
+
} catch (remoteError) {
|
|
1885
|
+
return {
|
|
1886
|
+
content: [{ type: "text", text: `Explicit cross-machine message to "${to}" was not delivered: ${getErrorMessage(remoteError)}` }],
|
|
1887
|
+
details: { error: true, crossMachine: false },
|
|
1888
|
+
};
|
|
1889
|
+
}
|
|
1890
|
+
}
|
|
1891
|
+
const target: DeliveryTarget = cwd
|
|
1892
|
+
? await resolveCwdDeliveryTarget(connectedClient, { to, cwd, openProjectPaneIfMissing, focus, signal })
|
|
1893
|
+
: { id: await resolveSessionTarget(connectedClient, to) ?? to!, label: to! };
|
|
1894
|
+
const sendTo = target.id;
|
|
1895
|
+
const targetDisplay = target.projectPane ? target.label : to ?? target.label;
|
|
1896
|
+
if (sendTo === connectedClient.sessionId) {
|
|
1897
|
+
return {
|
|
1898
|
+
content: [{ type: "text", text: "Cannot message the current session" }],
|
|
1899
|
+
details: { error: true },
|
|
1900
|
+
};
|
|
1901
|
+
}
|
|
1902
|
+
const activeReplyMismatch = replyTo ? null : replyTracker.findActiveReplyTargetMismatch(sendTo);
|
|
1903
|
+
if (activeReplyMismatch) {
|
|
1904
|
+
const senderLabel = activeReplyMismatch.from.name || activeReplyMismatch.from.id;
|
|
1905
|
+
return {
|
|
1906
|
+
content: [{ type: "text", text: `This turn is responding to an intercom ask from "${senderLabel}". Use intercom({ action: "reply", message: "..." }) or set replyTo: "${activeReplyMismatch.message.id}". Refusing non-reply send to "${targetDisplay}" to avoid a misdirected reply.` }],
|
|
1907
|
+
details: { error: true, replyTo: activeReplyMismatch.message.id },
|
|
1908
|
+
};
|
|
1909
|
+
}
|
|
1910
|
+
const inferredAsk = replyTo || request.handover ? null : replyTracker.findUniquePendingAskFrom(sendTo);
|
|
1911
|
+
const effectiveReplyTo = replyTo ?? inferredAsk?.message.id;
|
|
1912
|
+
if (confirmSend && !(cwd && openProjectPaneIfMissing)) {
|
|
1913
|
+
const confirmed = await ctx.ui.confirm(
|
|
1914
|
+
"Send message",
|
|
1915
|
+
`Send to "${targetDisplay}":\n\n${message}${attachmentText}`,
|
|
1916
|
+
);
|
|
1917
|
+
if (!confirmed) {
|
|
1918
|
+
return {
|
|
1919
|
+
content: [{ type: "text", text: "Message cancelled by user" }],
|
|
1920
|
+
details: {},
|
|
1921
|
+
};
|
|
1922
|
+
}
|
|
1923
|
+
}
|
|
1924
|
+
if (request.handover && signal?.aborted) {
|
|
1925
|
+
return { content: [{ type: "text", text: "Handover was cancelled before delivery." }], details: { error: true } };
|
|
1926
|
+
}
|
|
1927
|
+
const result = await connectedClient.send(sendTo, {
|
|
1928
|
+
text: message,
|
|
1929
|
+
attachments,
|
|
1930
|
+
replyTo: effectiveReplyTo,
|
|
1931
|
+
supersedes,
|
|
1932
|
+
retryOf,
|
|
1933
|
+
});
|
|
1934
|
+
if (!result.delivered) {
|
|
1935
|
+
const errorText = result.reason ?? "Session may not exist or has disconnected.";
|
|
1936
|
+
return {
|
|
1937
|
+
content: [{ type: "text", text: `Message to "${targetDisplay}" was not delivered: ${errorText}` }],
|
|
1938
|
+
details: deliveryDetails(result),
|
|
1939
|
+
};
|
|
1940
|
+
}
|
|
1941
|
+
pi.appendEntry("intercom_sent", {
|
|
1942
|
+
to: targetDisplay,
|
|
1943
|
+
message: { text: message, attachments, replyTo: effectiveReplyTo, supersedes, retryOf },
|
|
1944
|
+
messageId: result.id,
|
|
1945
|
+
timestamp: Date.now(),
|
|
1946
|
+
});
|
|
1947
|
+
if (effectiveReplyTo) {
|
|
1948
|
+
dismissIncomingAsk(effectiveReplyTo);
|
|
1949
|
+
}
|
|
1950
|
+
return {
|
|
1951
|
+
content: [{
|
|
1952
|
+
type: "text",
|
|
1953
|
+
text: target.projectPane
|
|
1954
|
+
? `Opened Herdr project pane ${target.projectPane.paneId} for ${target.projectPane.projectRoot} and sent message to ${targetDisplay}`
|
|
1955
|
+
: inferredAsk ? `Reply sent to ${targetDisplay} (inferred from pending ask)` : `Message sent to ${targetDisplay}`,
|
|
1956
|
+
}],
|
|
1957
|
+
details: {
|
|
1958
|
+
...deliveryDetails(result),
|
|
1959
|
+
...(effectiveReplyTo ? { replyTo: effectiveReplyTo } : {}),
|
|
1960
|
+
...(target.projectPane ? { openedProjectPane: true, paneId: target.projectPane.paneId, projectRoot: target.projectPane.projectRoot } : {}),
|
|
1961
|
+
},
|
|
1962
|
+
};
|
|
1963
|
+
} catch (error) {
|
|
1964
|
+
return {
|
|
1965
|
+
content: [{ type: "text", text: `Failed to send: ${getErrorMessage(error)}` }],
|
|
1966
|
+
details: { error: true },
|
|
1967
|
+
};
|
|
1968
|
+
}
|
|
1969
|
+
}
|
|
1970
|
+
async function buildHandoverText(
|
|
1971
|
+
connectedClient: IntercomClient,
|
|
1972
|
+
ctx: ExtensionContext,
|
|
1973
|
+
options: { goal?: string; crossMachine: boolean },
|
|
1974
|
+
signal: AbortSignal | undefined,
|
|
1975
|
+
): Promise<string> {
|
|
1976
|
+
const [body, git] = await Promise.all([
|
|
1977
|
+
generateHandoverBody(ctx, options.goal, signal),
|
|
1978
|
+
readGitState(ctx.cwd),
|
|
1979
|
+
]);
|
|
1980
|
+
if (signal?.aborted) {
|
|
1981
|
+
throw new Error("Handover generation was aborted.");
|
|
1982
|
+
}
|
|
1983
|
+
const sessionId = connectedClient.sessionId ?? ctx.sessionManager.getSessionId();
|
|
1984
|
+
return formatHandoverMessage({
|
|
1985
|
+
senderName: pi.getSessionName()?.trim() || sessionId.slice(0, 8),
|
|
1986
|
+
senderCwd: ctx.cwd,
|
|
1987
|
+
sessionFile: options.crossMachine ? undefined : ctx.sessionManager.getSessionFile(),
|
|
1988
|
+
git,
|
|
1989
|
+
body,
|
|
1990
|
+
});
|
|
1991
|
+
}
|
|
1527
1992
|
function deliverLocalSubagentRelayMessage(sender: "subagent-control" | "subagent-result", status: string, messageText: string): void {
|
|
1528
1993
|
const liveContext = getLiveContext();
|
|
1529
1994
|
const now = Date.now();
|
|
@@ -1556,11 +2021,13 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
1556
2021
|
}
|
|
1557
2022
|
function startSessionRuntime(ctx: ExtensionContext): void {
|
|
1558
2023
|
const previousClient = client;
|
|
2024
|
+
endRpcRequests();
|
|
1559
2025
|
failPendingOutboxRequests(runtimeGeneration, "session_ended", "Session replaced");
|
|
1560
2026
|
shuttingDown = false;
|
|
1561
2027
|
disposed = false;
|
|
1562
2028
|
runtimeStarted = true;
|
|
1563
2029
|
runtimeGeneration += 1;
|
|
2030
|
+
idleWakeRequestedAt = 0;
|
|
1564
2031
|
outboxRequestIds.clear();
|
|
1565
2032
|
reconnectAttempt = 0;
|
|
1566
2033
|
clearReconnectTimer();
|
|
@@ -1574,14 +2041,24 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
1574
2041
|
}
|
|
1575
2042
|
runtimeContext = ctx;
|
|
1576
2043
|
currentSessionId = ctx.sessionManager.getSessionId();
|
|
1577
|
-
|
|
2044
|
+
let claimedIntercomSessionId: string | undefined;
|
|
2045
|
+
const identityRequest: IntercomSessionIdentityRequestV1 = {
|
|
2046
|
+
version: 1,
|
|
2047
|
+
claim: (stableId) => {
|
|
2048
|
+
claimedIntercomSessionId ??= (typeof stableId === "string" && stableId.trim()) || undefined;
|
|
2049
|
+
},
|
|
2050
|
+
};
|
|
2051
|
+
pi.events.emit(INTERCOM_SESSION_IDENTITY_EVENT, identityRequest);
|
|
2052
|
+
currentIntercomSessionId = claimedIntercomSessionId ?? resolveConfiguredIntercomSessionId(currentSessionId, config);
|
|
1578
2053
|
publishIntercomSessionId(currentIntercomSessionId);
|
|
2054
|
+
emitRpcConnection(false, "Session started");
|
|
1579
2055
|
currentModel = ctx.model?.id ?? "unknown";
|
|
1580
2056
|
sessionStartedAt = Date.now();
|
|
1581
2057
|
const initialPresenceIdentity = buildPresenceIdentity(pi, currentIntercomSessionId);
|
|
1582
2058
|
lastPresenceName = initialPresenceIdentity.name;
|
|
1583
2059
|
lastPresenceRuntimeFallbackAlias = initialPresenceIdentity.runtimeFallbackAlias;
|
|
1584
2060
|
agentRunning = false;
|
|
2061
|
+
expireHeldInboundMessages("session replaced before injection");
|
|
1585
2062
|
activeTools.clear();
|
|
1586
2063
|
startNamePoll();
|
|
1587
2064
|
const startupGeneration = runtimeGeneration;
|
|
@@ -1695,9 +2172,40 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
1695
2172
|
acknowledge: true,
|
|
1696
2173
|
});
|
|
1697
2174
|
});
|
|
2175
|
+
const unsubscribeRpcRequest = pi.events.on(INTERCOM_RPC_REQUEST_EVENT, handleRpcRequest);
|
|
2176
|
+
// Release readiness (release:readiness:v1): answer only for the session this extension is bound to.
|
|
2177
|
+
const unsubscribeReleaseReadiness = pi.events.on(RELEASE_READINESS_EVENT, (payload) => {
|
|
2178
|
+
answerReleaseReadiness(payload, "intercom", currentSessionId, () => intercomReleaseBlockers({
|
|
2179
|
+
pendingAsks: replyTracker.listPending(),
|
|
2180
|
+
outboundAsk: replyWaiter,
|
|
2181
|
+
pendingOutboxRequests: pendingOutboxRequests.size,
|
|
2182
|
+
}));
|
|
2183
|
+
});
|
|
2184
|
+
// Kill switch (stop_all_background): cancel this session's blocking outbound ask; inbound asks cannot be cancelled by the receiver.
|
|
2185
|
+
const unsubscribeStopAll = pi.events.on(STOP_ALL_BACKGROUND_EVENT, (payload) => {
|
|
2186
|
+
answerStopAllBackground(payload, "intercom", currentSessionId, (request) => stopIntercom({
|
|
2187
|
+
pendingAsks: replyTracker.listPending(),
|
|
2188
|
+
outboundAsk: replyWaiter,
|
|
2189
|
+
cancelOutboundAsk: (ask) => {
|
|
2190
|
+
const activeClient = client;
|
|
2191
|
+
// Broker first (drops the ask edge + pending-ask record), then free the blocked tool call.
|
|
2192
|
+
activeClient?.cancelAsk(ask.replyTo);
|
|
2193
|
+
rejectReplyWaiter(new Error("Cancelled: session background work was stopped"));
|
|
2194
|
+
// Also ask the recipient to drop the ask. Best-effort: it may already be injected or processed.
|
|
2195
|
+
if (!activeClient?.isConnected()) return undefined;
|
|
2196
|
+
return activeClient.cancelMessage(ask.replyTo).then(
|
|
2197
|
+
(result) => result.delivered ? "recipient asked to drop it" : "recipient could not be asked to drop it (it may already be handled)",
|
|
2198
|
+
() => "recipient could not be asked to drop it (it may already be handled)",
|
|
2199
|
+
);
|
|
2200
|
+
},
|
|
2201
|
+
}, request));
|
|
2202
|
+
});
|
|
1698
2203
|
const unsubscribeOutboxRequest = pi.events.on(INTERCOM_OUTBOX_REQUEST_EVENT, handleOutboxRequest);
|
|
1699
2204
|
pi.on("session_start", (_event, ctx) => {
|
|
1700
2205
|
if (!config.enabled) {
|
|
2206
|
+
runtimeContext = ctx;
|
|
2207
|
+
currentSessionId = ctx.sessionManager.getSessionId();
|
|
2208
|
+
emitRpcConnection(false, "Intercom disabled");
|
|
1701
2209
|
return;
|
|
1702
2210
|
}
|
|
1703
2211
|
startSessionRuntime(ctx);
|
|
@@ -1708,6 +2216,11 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
1708
2216
|
unsubscribeSubagentControlIntercom();
|
|
1709
2217
|
unsubscribeSubagentResultIntercom();
|
|
1710
2218
|
unsubscribeOutboxRequest();
|
|
2219
|
+
unsubscribeRpcRequest();
|
|
2220
|
+
unsubscribeReleaseReadiness();
|
|
2221
|
+
unsubscribeStopAll();
|
|
2222
|
+
endRpcRequests();
|
|
2223
|
+
emitRpcConnection(false, "Session shutting down");
|
|
1711
2224
|
shuttingDown = true;
|
|
1712
2225
|
disposed = true;
|
|
1713
2226
|
failPendingOutboxRequests(runtimeGeneration, "session_ended", "Session shutting down");
|
|
@@ -1719,6 +2232,7 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
1719
2232
|
rejectReplyWaiter(new Error("Session shutting down"));
|
|
1720
2233
|
replyTracker.reset();
|
|
1721
2234
|
agentRunning = false;
|
|
2235
|
+
expireHeldInboundMessages("session shut down before injection");
|
|
1722
2236
|
activeTools.clear();
|
|
1723
2237
|
if (client) {
|
|
1724
2238
|
await client.disconnect();
|
|
@@ -1729,17 +2243,27 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
1729
2243
|
currentIntercomSessionId = null;
|
|
1730
2244
|
sessionStartedAt = null;
|
|
1731
2245
|
});
|
|
1732
|
-
pi.on("turn_end", () => {
|
|
2246
|
+
pi.on("turn_end", (event, ctx) => {
|
|
1733
2247
|
if (!getLiveContext()) {
|
|
1734
2248
|
return;
|
|
1735
2249
|
}
|
|
1736
2250
|
replyTracker.endTurn();
|
|
2251
|
+
// Aborted/error turns cannot consume a steer; leave their peers for the idle trigger.
|
|
2252
|
+
if (config.busyDelivery === "human-first" && ctx.hasUI && event.message.role === "assistant"
|
|
2253
|
+
&& event.message.stopReason !== "aborted" && event.message.stopReason !== "error"
|
|
2254
|
+
&& heldInboundMessages.length > 0 && agentRunning
|
|
2255
|
+
&& !ctx.isIdle() && !ctx.hasPendingMessages() && getLiveContext(ctx)) {
|
|
2256
|
+
sendIncomingBrokerMessage(heldInboundMessages.shift()!, "steer", runtimeGeneration);
|
|
2257
|
+
if (heldInboundMessages.length === 0) clearHeldInboundTimer();
|
|
2258
|
+
}
|
|
1737
2259
|
});
|
|
1738
2260
|
pi.on("agent_start", () => {
|
|
2261
|
+
idleWakeRequestedAt = 0;
|
|
1739
2262
|
if (!getLiveContext()) {
|
|
1740
2263
|
return;
|
|
1741
2264
|
}
|
|
1742
2265
|
agentRunning = true;
|
|
2266
|
+
if (runtimeContext) flushHeldInboundMessages(runtimeContext, runtimeGeneration);
|
|
1743
2267
|
activeTools.clear();
|
|
1744
2268
|
syncPresenceStatus();
|
|
1745
2269
|
});
|
|
@@ -1823,11 +2347,7 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
1823
2347
|
label: "Contact Supervisor",
|
|
1824
2348
|
description: "Subagent-only tool for contacting the supervisor agent that delegated this task. Use need_decision when blocked, uncertain, needing approval, or facing a product/API/scope decision before continuing; this waits for the supervisor's reply. Use interview_request when multiple structured questions need supervisor answers; this also waits for a reply. Use progress_update only for meaningful progress or unexpected discoveries that change the plan; this does not wait for a reply. Do not use for routine completion handoffs.",
|
|
1825
2349
|
promptSnippet: "Subagent-only: contact the supervisor for decisions, structured interviews, or meaningful plan-changing updates. Do not use for routine completion handoffs.",
|
|
1826
|
-
|
|
1827
|
-
summary: "Subagent-only channel to ask the supervisor for decisions or send plan-changing updates",
|
|
1828
|
-
aliases: ["contact supervisor", "ask supervisor"],
|
|
1829
|
-
category: "coordination",
|
|
1830
|
-
},
|
|
2350
|
+
exposure: "model-only",
|
|
1831
2351
|
promptGuidelines: [
|
|
1832
2352
|
"Use contact_supervisor with reason='need_decision' when a subagent is blocked, uncertain, needs approval, or faces a product/API/scope decision before continuing.",
|
|
1833
2353
|
"Use contact_supervisor with reason='interview_request' when the child needs multiple structured answers from the supervisor in one blocking exchange.",
|
|
@@ -1976,7 +2496,7 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
1976
2496
|
replyPromise = waitForReply(sendTo, questionId, signal, () => connectedClient.cancelAsk(questionId!), () => latestDeliveryState(questionId, deliveryState));
|
|
1977
2497
|
replyPromise.catch(() => undefined);
|
|
1978
2498
|
if (signal?.aborted) {
|
|
1979
|
-
rejectReplyWaiter(new Error("Cancelled"));
|
|
2499
|
+
if (replyWaiter?.replyTo === questionId) rejectReplyWaiter(new Error("Cancelled"));
|
|
1980
2500
|
try {
|
|
1981
2501
|
await replyPromise;
|
|
1982
2502
|
} catch {
|
|
@@ -1998,7 +2518,7 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
1998
2518
|
deliveryState = sendResult.delivered ? "socket_delivered" : "delivery_failed";
|
|
1999
2519
|
if (!sendResult.delivered) {
|
|
2000
2520
|
const errorText = sendResult.reason ?? "Session may not exist or has disconnected.";
|
|
2001
|
-
rejectReplyWaiter(new Error(`Message to "${metadata.orchestratorTarget}" was not delivered: ${errorText}`));
|
|
2521
|
+
if (replyWaiter?.replyTo === questionId) rejectReplyWaiter(new Error(`Message to "${metadata.orchestratorTarget}" was not delivered: ${errorText}`));
|
|
2002
2522
|
if (replyPromise) {
|
|
2003
2523
|
try {
|
|
2004
2524
|
await replyPromise;
|
|
@@ -2044,7 +2564,7 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
2044
2564
|
: {},
|
|
2045
2565
|
};
|
|
2046
2566
|
} catch (error) {
|
|
2047
|
-
rejectReplyWaiter(toError(error));
|
|
2567
|
+
if (questionId && replyWaiter?.replyTo === questionId) rejectReplyWaiter(toError(error));
|
|
2048
2568
|
if (replyPromise) {
|
|
2049
2569
|
try {
|
|
2050
2570
|
await replyPromise;
|
|
@@ -2058,17 +2578,19 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
2058
2578
|
};
|
|
2059
2579
|
}
|
|
2060
2580
|
},
|
|
2061
|
-
renderCall(args, theme) {
|
|
2581
|
+
renderCall(args, theme, context) {
|
|
2062
2582
|
const reason = typeof args.reason === "string" ? args.reason : "contact";
|
|
2063
|
-
const
|
|
2583
|
+
const messageText = context.expanded && typeof args.message === "string"
|
|
2584
|
+
? args.message
|
|
2585
|
+
: previewText(args.message, 96);
|
|
2064
2586
|
const interview = args.interview && typeof args.interview === "object" ? args.interview as { title?: unknown } : undefined;
|
|
2065
2587
|
let text = theme.fg("toolTitle", theme.bold("contact_supervisor "));
|
|
2066
2588
|
text += theme.fg(reason === "need_decision" ? "warning" : reason === "progress_update" ? "muted" : "accent", reason);
|
|
2067
2589
|
if (typeof interview?.title === "string" && interview.title.trim()) {
|
|
2068
2590
|
text += " " + theme.fg("accent", interview.title.trim());
|
|
2069
2591
|
}
|
|
2070
|
-
if (
|
|
2071
|
-
text += "\n " + theme.fg("dim",
|
|
2592
|
+
if (messageText) {
|
|
2593
|
+
text += "\n " + theme.fg("dim", messageText);
|
|
2072
2594
|
}
|
|
2073
2595
|
return new Text(text, 0, 0);
|
|
2074
2596
|
},
|
|
@@ -2097,11 +2619,7 @@ export default function piIntercomExtension(pi: ExtensionAPI) {
|
|
|
2097
2619
|
pi.registerTool(defineTool({
|
|
2098
2620
|
name: "intercom",
|
|
2099
2621
|
label: "Intercom",
|
|
2100
|
-
|
|
2101
|
-
summary: "Send messages and coordinate with other local Selesai sessions",
|
|
2102
|
-
aliases: ["contact session", "session message", "peer session"],
|
|
2103
|
-
category: "coordination",
|
|
2104
|
-
},
|
|
2622
|
+
exposure: "deferred",
|
|
2105
2623
|
description: `Send a message to another Selesai session running on this machine.
|
|
2106
2624
|
Use this to communicate findings, request help, or coordinate work with other sessions.
|
|
2107
2625
|
|
|
@@ -2116,6 +2634,8 @@ Usage:
|
|
|
2116
2634
|
intercom({ action: "send", to: "name-or-id", message: "..." }) → Send message
|
|
2117
2635
|
intercom({ action: "send", cwd: "/path", openProjectPaneIfMissing: true, message: "..." }) → Open a visible Herdr project pane when needed, then send
|
|
2118
2636
|
intercom({ action: "ask", to: "name-or-id", message: "..." }) → Ask and wait for reply
|
|
2637
|
+
intercom({ action: "handover", to: "name-or-id", message: "next task" }) → Summarize this session and hand it over; the receiver acts on it
|
|
2638
|
+
intercom({ action: "handover", cwd: "/path", openProjectPaneIfMissing: true }) → Hand over to the session in that project, opening a Herdr pane when needed
|
|
2119
2639
|
intercom({ action: "cancel", messageId: "..." }) → Request cancellation of a sent message
|
|
2120
2640
|
intercom({ action: "reply", message: "..." }) → Reply to the active/single pending ask
|
|
2121
2641
|
intercom({ action: "pending" }) → List unresolved inbound asks
|
|
@@ -2124,14 +2644,14 @@ Usage:
|
|
|
2124
2644
|
"Use to coordinate with other local Selesai sessions: list peers, send updates, ask for help, or check intercom connectivity.",
|
|
2125
2645
|
|
|
2126
2646
|
parameters: Type.Object({
|
|
2127
|
-
action: StringEnum(["list", "list-cwd", "send", "ask", "reply", "pending", "status", "cancel"] as const, {
|
|
2128
|
-
description: "Action: 'list', 'list-cwd', 'send', 'ask', 'reply', 'pending', 'status', or 'cancel'",
|
|
2647
|
+
action: StringEnum(["list", "list-cwd", "send", "ask", "handover", "reply", "pending", "status", "cancel"] as const, {
|
|
2648
|
+
description: "Action: 'list', 'list-cwd', 'send', 'ask', 'handover', 'reply', 'pending', 'status', or 'cancel'. 'handover' summarizes this session with the current model and sends it to the target, which acts on it; 'message' is the optional next task.",
|
|
2129
2649
|
}),
|
|
2130
2650
|
to: Type.Optional(Type.String({
|
|
2131
|
-
description: "Target session: name, full session ID, or the short id shown in parentheses by 'list' (a leading ID prefix resolves). For send/ask with cwd, omit to target the sole live session in that cwd or the newly opened project-pane session. For 'reply', disambiguates the pending ask.",
|
|
2651
|
+
description: "Target session: name, full session ID, or the short id shown in parentheses by 'list' (a leading ID prefix resolves). For send/ask/handover with cwd, omit to target the sole live session in that cwd or the newly opened project-pane session. For 'reply', disambiguates the pending ask.",
|
|
2132
2652
|
})),
|
|
2133
2653
|
message: Type.Optional(Type.String({
|
|
2134
|
-
description: "Message to send (for 'send', 'ask', or 'reply' action)",
|
|
2654
|
+
description: "Message to send (for 'send', 'ask', or 'reply' action). For 'handover', the optional next task for the receiver.",
|
|
2135
2655
|
})),
|
|
2136
2656
|
attachments: Type.Optional(Type.Array(Type.Object({
|
|
2137
2657
|
type: StringEnum(["file", "snippet", "context"] as const),
|
|
@@ -2152,10 +2672,10 @@ Usage:
|
|
|
2152
2672
|
description: "Previous message ID this send/ask is a user-authored retry of. Retries always send a new message ID.",
|
|
2153
2673
|
})),
|
|
2154
2674
|
cwd: Type.Optional(Type.String({
|
|
2155
|
-
description: "Working directory filter for 'list-cwd'. For send/ask, scopes target lookup to that directory; omit 'to' to target the sole live peer there. Absolute, or relative to the current session's cwd; '.' means the current cwd.",
|
|
2675
|
+
description: "Working directory filter for 'list-cwd'. For send/ask/handover, scopes target lookup to that directory; omit 'to' to target the sole live peer there. Absolute, or relative to the current session's cwd; '.' means the current cwd.",
|
|
2156
2676
|
})),
|
|
2157
2677
|
openProjectPaneIfMissing: Type.Optional(Type.Boolean({
|
|
2158
|
-
description: "For send/ask with cwd, open a visible Herdr project pane and launch Selesai there when no matching live session is connected.",
|
|
2678
|
+
description: "For send/ask/handover with cwd, open a visible Herdr project pane and launch Selesai there when no matching live session is connected.",
|
|
2159
2679
|
})),
|
|
2160
2680
|
focus: Type.Optional(Type.Boolean({
|
|
2161
2681
|
description: "For openProjectPaneIfMissing, focus the new Herdr pane. Defaults to true.",
|
|
@@ -2200,7 +2720,7 @@ Usage:
|
|
|
2200
2720
|
|
|
2201
2721
|
return {
|
|
2202
2722
|
content: [{ type: "text", text: `${currentSection}\n\n${otherSection}` }],
|
|
2203
|
-
details: {},
|
|
2723
|
+
details: { roster: { peers: otherSessions.length, total: sessions.length } },
|
|
2204
2724
|
};
|
|
2205
2725
|
} catch (error) {
|
|
2206
2726
|
return {
|
|
@@ -2254,7 +2774,7 @@ Usage:
|
|
|
2254
2774
|
|
|
2255
2775
|
return {
|
|
2256
2776
|
content: [{ type: "text", text: `${currentSection}\n\n${otherSection}` }],
|
|
2257
|
-
details: {},
|
|
2777
|
+
details: { roster: { peers: otherSessions.length, total: sessions.length, cwd: filterCwd } },
|
|
2258
2778
|
};
|
|
2259
2779
|
} catch (error) {
|
|
2260
2780
|
return {
|
|
@@ -2299,102 +2819,34 @@ Usage:
|
|
|
2299
2819
|
details: { error: true },
|
|
2300
2820
|
};
|
|
2301
2821
|
}
|
|
2302
|
-
|
|
2303
|
-
|
|
2304
|
-
|
|
2305
|
-
|
|
2306
|
-
|
|
2307
|
-
|
|
2308
|
-
|
|
2309
|
-
const confirmSend = !replyTo && config.confirmSend && ctx.hasUI;
|
|
2310
|
-
const attachmentText = attachments?.length ? formatAttachments(attachments) : "";
|
|
2311
|
-
if (confirmSend && cwd && openProjectPaneIfMissing) {
|
|
2312
|
-
const confirmed = await ctx.ui.confirm(
|
|
2313
|
-
"Send message",
|
|
2314
|
-
`Send to "${to ?? cwd}":\n\n${message}${attachmentText}`,
|
|
2315
|
-
);
|
|
2316
|
-
if (!confirmed) {
|
|
2317
|
-
return {
|
|
2318
|
-
content: [{ type: "text", text: "Message cancelled by user" }],
|
|
2319
|
-
details: {},
|
|
2320
|
-
};
|
|
2321
|
-
}
|
|
2322
|
-
}
|
|
2323
|
-
const target: DeliveryTarget = cwd
|
|
2324
|
-
? await resolveCwdDeliveryTarget(connectedClient, { to, cwd, openProjectPaneIfMissing, focus, signal: _signal })
|
|
2325
|
-
: { id: await resolveSessionTarget(connectedClient, to) ?? to, label: to };
|
|
2326
|
-
const sendTo = target.id;
|
|
2327
|
-
const targetDisplay = target.projectPane ? target.label : to ?? target.label;
|
|
2328
|
-
if (sendTo === connectedClient.sessionId) {
|
|
2329
|
-
return {
|
|
2330
|
-
content: [{ type: "text", text: "Cannot message the current session" }],
|
|
2331
|
-
details: { error: true },
|
|
2332
|
-
};
|
|
2333
|
-
}
|
|
2334
|
-
const activeReplyMismatch = replyTo ? null : replyTracker.findActiveReplyTargetMismatch(sendTo);
|
|
2335
|
-
if (activeReplyMismatch) {
|
|
2336
|
-
const senderLabel = activeReplyMismatch.from.name || activeReplyMismatch.from.id;
|
|
2337
|
-
return {
|
|
2338
|
-
content: [{ type: "text", text: `This turn is responding to an intercom ask from "${senderLabel}". Use intercom({ action: "reply", message: "..." }) or set replyTo: "${activeReplyMismatch.message.id}". Refusing non-reply send to "${targetDisplay}" to avoid a misdirected reply.` }],
|
|
2339
|
-
details: { error: true, replyTo: activeReplyMismatch.message.id },
|
|
2340
|
-
};
|
|
2341
|
-
}
|
|
2342
|
-
const inferredAsk = replyTo ? null : replyTracker.findUniquePendingAskFrom(sendTo);
|
|
2343
|
-
const effectiveReplyTo = replyTo ?? inferredAsk?.message.id;
|
|
2344
|
-
if (confirmSend && !(cwd && openProjectPaneIfMissing)) {
|
|
2345
|
-
const confirmed = await ctx.ui.confirm(
|
|
2346
|
-
"Send message",
|
|
2347
|
-
`Send to "${targetDisplay}":\n\n${message}${attachmentText}`,
|
|
2348
|
-
);
|
|
2349
|
-
if (!confirmed) {
|
|
2350
|
-
return {
|
|
2351
|
-
content: [{ type: "text", text: "Message cancelled by user" }],
|
|
2352
|
-
details: {},
|
|
2353
|
-
};
|
|
2354
|
-
}
|
|
2355
|
-
}
|
|
2356
|
-
const result = await connectedClient.send(sendTo, {
|
|
2357
|
-
text: message,
|
|
2358
|
-
attachments,
|
|
2359
|
-
replyTo: effectiveReplyTo,
|
|
2360
|
-
supersedes,
|
|
2361
|
-
retryOf,
|
|
2362
|
-
});
|
|
2363
|
-
if (!result.delivered) {
|
|
2364
|
-
const errorText = result.reason ?? "Session may not exist or has disconnected.";
|
|
2365
|
-
return {
|
|
2366
|
-
content: [{ type: "text", text: `Message to "${targetDisplay}" was not delivered: ${errorText}` }],
|
|
2367
|
-
details: deliveryDetails(result),
|
|
2368
|
-
};
|
|
2369
|
-
}
|
|
2370
|
-
pi.appendEntry("intercom_sent", {
|
|
2371
|
-
to: targetDisplay,
|
|
2372
|
-
message: { text: message, attachments, replyTo: effectiveReplyTo, supersedes, retryOf },
|
|
2373
|
-
messageId: result.id,
|
|
2374
|
-
timestamp: Date.now(),
|
|
2375
|
-
});
|
|
2376
|
-
if (effectiveReplyTo) {
|
|
2377
|
-
dismissIncomingAsk(effectiveReplyTo);
|
|
2378
|
-
}
|
|
2822
|
+
return deliverMessage(connectedClient, ctx, _signal, {
|
|
2823
|
+
to, cwd, openProjectPaneIfMissing, focus, message, attachments, replyTo, supersedes, retryOf,
|
|
2824
|
+
});
|
|
2825
|
+
}
|
|
2826
|
+
|
|
2827
|
+
case "handover": {
|
|
2828
|
+
if (!to && !cwd) {
|
|
2379
2829
|
return {
|
|
2380
|
-
content: [{
|
|
2381
|
-
|
|
2382
|
-
text: target.projectPane
|
|
2383
|
-
? `Opened Herdr project pane ${target.projectPane.paneId} for ${target.projectPane.projectRoot} and sent message to ${targetDisplay}`
|
|
2384
|
-
: inferredAsk ? `Reply sent to ${targetDisplay} (inferred from pending ask)` : `Message sent to ${targetDisplay}`,
|
|
2385
|
-
}],
|
|
2386
|
-
details: {
|
|
2387
|
-
...deliveryDetails(result),
|
|
2388
|
-
...(effectiveReplyTo ? { replyTo: effectiveReplyTo } : {}),
|
|
2389
|
-
...(target.projectPane ? { openedProjectPane: true, paneId: target.projectPane.paneId, projectRoot: target.projectPane.projectRoot } : {}),
|
|
2390
|
-
},
|
|
2830
|
+
content: [{ type: "text", text: "Missing 'to' or 'cwd' parameter" }],
|
|
2831
|
+
details: { error: true },
|
|
2391
2832
|
};
|
|
2833
|
+
}
|
|
2834
|
+
if (replyTo || supersedes || retryOf || attachments?.length) {
|
|
2835
|
+
return {
|
|
2836
|
+
content: [{ type: "text", text: "Handover always sends a new message; replyTo, supersedes, retryOf, and attachments are not supported." }],
|
|
2837
|
+
details: { error: true },
|
|
2838
|
+
};
|
|
2839
|
+
}
|
|
2840
|
+
let handoverText: string;
|
|
2841
|
+
try {
|
|
2842
|
+
handoverText = await buildHandoverText(connectedClient, ctx, { goal: message, crossMachine: Boolean(to?.includes("@")) }, _signal);
|
|
2392
2843
|
} catch (error) {
|
|
2393
2844
|
return {
|
|
2394
|
-
content: [{ type: "text", text: `
|
|
2845
|
+
content: [{ type: "text", text: `Handover failed: ${getErrorMessage(error)}` }],
|
|
2395
2846
|
details: { error: true },
|
|
2396
2847
|
};
|
|
2397
2848
|
}
|
|
2849
|
+
return deliverMessage(connectedClient, ctx, _signal, { to, cwd, openProjectPaneIfMissing, focus, message: handoverText, handover: true });
|
|
2398
2850
|
}
|
|
2399
2851
|
|
|
2400
2852
|
case "ask": {
|
|
@@ -2478,7 +2930,7 @@ Usage:
|
|
|
2478
2930
|
deliveryState = sendResult.delivery;
|
|
2479
2931
|
if (!sendResult.delivered) {
|
|
2480
2932
|
const errorText = sendResult.reason ?? "Session may not exist or has disconnected.";
|
|
2481
|
-
rejectReplyWaiter(new Error(`Message to "${targetDisplay}" was not delivered: ${errorText}`));
|
|
2933
|
+
if (replyWaiter?.replyTo === questionId) rejectReplyWaiter(new Error(`Message to "${targetDisplay}" was not delivered: ${errorText}`));
|
|
2482
2934
|
if (replyPromise) {
|
|
2483
2935
|
try {
|
|
2484
2936
|
await replyPromise;
|
|
@@ -2513,7 +2965,7 @@ Usage:
|
|
|
2513
2965
|
details: target.projectPane ? { openedProjectPane: true, paneId: target.projectPane.paneId, projectRoot: target.projectPane.projectRoot } : {},
|
|
2514
2966
|
};
|
|
2515
2967
|
} catch (error) {
|
|
2516
|
-
rejectReplyWaiter(toError(error));
|
|
2968
|
+
if (questionId && replyWaiter?.replyTo === questionId) rejectReplyWaiter(toError(error));
|
|
2517
2969
|
if (replyPromise) {
|
|
2518
2970
|
try {
|
|
2519
2971
|
await replyPromise;
|
|
@@ -2625,10 +3077,12 @@ Usage:
|
|
|
2625
3077
|
};
|
|
2626
3078
|
}
|
|
2627
3079
|
},
|
|
2628
|
-
renderCall(args, theme) {
|
|
3080
|
+
renderCall(args, theme, context) {
|
|
2629
3081
|
const action = typeof args.action === "string" ? args.action : "intercom";
|
|
2630
3082
|
const target = typeof args.to === "string" && args.to.trim() ? args.to.trim() : undefined;
|
|
2631
|
-
const
|
|
3083
|
+
const messageText = context.expanded && typeof args.message === "string"
|
|
3084
|
+
? args.message
|
|
3085
|
+
: previewText(args.message, 96);
|
|
2632
3086
|
const attachmentCount = Array.isArray(args.attachments) ? args.attachments.length : 0;
|
|
2633
3087
|
let text = theme.fg("toolTitle", theme.bold("intercom "));
|
|
2634
3088
|
text += theme.fg(action === "ask" ? "warning" : action === "reply" ? "success" : "accent", action);
|
|
@@ -2638,8 +3092,8 @@ Usage:
|
|
|
2638
3092
|
if (attachmentCount > 0) {
|
|
2639
3093
|
text += " " + theme.fg("dim", `(${attachmentCount} attachment${attachmentCount === 1 ? "" : "s"})`);
|
|
2640
3094
|
}
|
|
2641
|
-
if (
|
|
2642
|
-
text += "\n " + theme.fg("dim",
|
|
3095
|
+
if (messageText) {
|
|
3096
|
+
text += "\n " + theme.fg("dim", messageText);
|
|
2643
3097
|
}
|
|
2644
3098
|
return new Text(text, 0, 0);
|
|
2645
3099
|
},
|
|
@@ -2647,9 +3101,17 @@ Usage:
|
|
|
2647
3101
|
if (isPartial) {
|
|
2648
3102
|
return new Text(theme.fg("warning", "Intercom working..."), 0, 0);
|
|
2649
3103
|
}
|
|
2650
|
-
const details = result.details as { delivered?: boolean; error?: boolean; messageId?: string; reason?: string } | undefined;
|
|
3104
|
+
const details = result.details as { delivered?: boolean; error?: boolean; messageId?: string; reason?: string; roster?: { peers: number; total: number; cwd?: string } } | undefined;
|
|
2651
3105
|
const failed = Boolean(context.isError || details?.error === true || details?.delivered === false);
|
|
2652
3106
|
let text = failed ? theme.fg("error", "✗ ") : theme.fg("success", "✓ ");
|
|
3107
|
+
if (details?.roster && !failed && !context.expanded) {
|
|
3108
|
+
// Collapsed rows are display-only; the model still receives the full roster text.
|
|
3109
|
+
const { peers, total, cwd: rosterCwd } = details.roster;
|
|
3110
|
+
const where = rosterCwd ? ` in ${rosterCwd}` : "";
|
|
3111
|
+
text += theme.fg("text", peers === 0 ? `no other sessions${where}` : `${peers} other session${peers === 1 ? "" : "s"}${where}`);
|
|
3112
|
+
text += theme.fg("dim", ` (${total} connected)`);
|
|
3113
|
+
return new Text(text, 0, 0);
|
|
3114
|
+
}
|
|
2653
3115
|
text += theme.fg(failed ? "error" : "text", firstTextContent(result));
|
|
2654
3116
|
if (details?.messageId && !context.expanded) {
|
|
2655
3117
|
text += theme.fg("dim", ` (${details.messageId.slice(0, 8)})`);
|
|
@@ -2744,6 +3206,132 @@ Usage:
|
|
|
2744
3206
|
notifyAliasCommand(liveContext, `Session alias set: ${alias}`, "info", commandGeneration);
|
|
2745
3207
|
}
|
|
2746
3208
|
|
|
3209
|
+
async function runHandoverCommand(args: string, ctx: ExtensionContext): Promise<void> {
|
|
3210
|
+
const commandGeneration = runtimeGeneration;
|
|
3211
|
+
const liveContext = getLiveContext(ctx, commandGeneration);
|
|
3212
|
+
if (!liveContext) return;
|
|
3213
|
+
if (!liveContext.hasUI || (liveContext as ExtensionContext & { mode?: string }).mode !== "tui") {
|
|
3214
|
+
notifyAliasCommand(liveContext, "/handover requires the interactive terminal UI; use the intercom tool's handover action instead.", "error", commandGeneration);
|
|
3215
|
+
return;
|
|
3216
|
+
}
|
|
3217
|
+
const input = args.trim();
|
|
3218
|
+
if (!input) {
|
|
3219
|
+
await openHandoverPicker(liveContext, commandGeneration);
|
|
3220
|
+
return;
|
|
3221
|
+
}
|
|
3222
|
+
const target = input.split(/\s+/, 1)[0]!;
|
|
3223
|
+
const goal = input.slice(target.length).trim() || undefined;
|
|
3224
|
+
const isPath = /^(\/|\.\.?\/|~(\/|$))/.test(target);
|
|
3225
|
+
const request = isPath ? { cwd: expandHomePath(target), openProjectPaneIfMissing: true } : { to: target };
|
|
3226
|
+
await performHandover(liveContext, commandGeneration, request, { goal, crossMachine: !isPath && target.includes("@") });
|
|
3227
|
+
}
|
|
3228
|
+
|
|
3229
|
+
async function openHandoverPicker(ctx: ExtensionContext, generation: number, preselectSessionId?: string): Promise<void> {
|
|
3230
|
+
let pickerClient: IntercomClient;
|
|
3231
|
+
try {
|
|
3232
|
+
pickerClient = await ensureConnected("tool");
|
|
3233
|
+
} catch (error) {
|
|
3234
|
+
notifyIfLive(ctx, `Intercom unavailable: ${getErrorMessage(error)}`, "error", generation);
|
|
3235
|
+
return;
|
|
3236
|
+
}
|
|
3237
|
+
if (!getLiveContext(ctx, generation)) return;
|
|
3238
|
+
syncPresenceIdentity(ctx.sessionManager.getSessionId());
|
|
3239
|
+
|
|
3240
|
+
let sessions: SessionInfo[];
|
|
3241
|
+
try {
|
|
3242
|
+
sessions = await pickerClient.listSessions();
|
|
3243
|
+
} catch (error) {
|
|
3244
|
+
notifyIfLive(ctx, `Failed to list sessions: ${getErrorMessage(error)}`, "error", generation);
|
|
3245
|
+
return;
|
|
3246
|
+
}
|
|
3247
|
+
const currentSession = sessions.find((session) => session.id === pickerClient.sessionId);
|
|
3248
|
+
if (!currentSession) {
|
|
3249
|
+
notifyIfLive(ctx, "Current session is missing from intercom session list", "error", generation);
|
|
3250
|
+
return;
|
|
3251
|
+
}
|
|
3252
|
+
if (!getLiveContext(ctx, generation)) return;
|
|
3253
|
+
|
|
3254
|
+
const discoveryDeps = { run: runCommand, herdrBin: process.env.HERDR_BIN_PATH ?? "herdr" };
|
|
3255
|
+
const lister: RemoteSessionLister = {
|
|
3256
|
+
listMachines: () => listSavedMachines(discoveryDeps),
|
|
3257
|
+
listAgents: (machine) => listMachineAgents(machine, discoveryDeps),
|
|
3258
|
+
};
|
|
3259
|
+
const picked = await ctx.ui.custom<HandoverPickerResult | undefined>(
|
|
3260
|
+
(tui, theme, keybindings, done) => new HandoverPicker(tui, theme, keybindings, { currentSession, sessions, lister, preselectSessionId }, done),
|
|
3261
|
+
{ overlay: true, overlayOptions: { width: 88 } },
|
|
3262
|
+
).catch(() => undefined);
|
|
3263
|
+
if (!picked || !getLiveContext(ctx, generation)) return;
|
|
3264
|
+
|
|
3265
|
+
const { target, goal } = picked;
|
|
3266
|
+
if (target.kind === "local") {
|
|
3267
|
+
await performHandover(ctx, generation, { to: target.session.id }, { goal, crossMachine: false });
|
|
3268
|
+
return;
|
|
3269
|
+
}
|
|
3270
|
+
if (target.kind === "remote") {
|
|
3271
|
+
await performHandover(ctx, generation, { to: target.target }, { goal, crossMachine: true });
|
|
3272
|
+
return;
|
|
3273
|
+
}
|
|
3274
|
+
const path = (await ctx.ui.input("Project path for the new session", "~/dev/project"))?.trim();
|
|
3275
|
+
if (!getLiveContext(ctx, generation)) return;
|
|
3276
|
+
if (!path) {
|
|
3277
|
+
notifyIfLive(ctx, "Handover cancelled", "info", generation);
|
|
3278
|
+
return;
|
|
3279
|
+
}
|
|
3280
|
+
await performHandover(ctx, generation, { cwd: expandHomePath(path), openProjectPaneIfMissing: true }, { goal, crossMachine: false });
|
|
3281
|
+
}
|
|
3282
|
+
|
|
3283
|
+
async function performHandover(
|
|
3284
|
+
ctx: ExtensionContext,
|
|
3285
|
+
generation: number,
|
|
3286
|
+
request: Pick<DeliveryRequest, "to" | "cwd" | "openProjectPaneIfMissing">,
|
|
3287
|
+
options: { goal?: string; crossMachine: boolean },
|
|
3288
|
+
): Promise<void> {
|
|
3289
|
+
let handoverClient: IntercomClient;
|
|
3290
|
+
try {
|
|
3291
|
+
handoverClient = await ensureConnected("tool");
|
|
3292
|
+
} catch (error) {
|
|
3293
|
+
notifyIfLive(ctx, `Intercom unavailable: ${getErrorMessage(error)}`, "error", generation);
|
|
3294
|
+
return;
|
|
3295
|
+
}
|
|
3296
|
+
if (!getLiveContext(ctx, generation)) return;
|
|
3297
|
+
|
|
3298
|
+
const generated = await ctx.ui.custom<{ text: string } | { error: string } | null>((tui, theme, _keybindings, done) => {
|
|
3299
|
+
const loader = new BorderedLoader(tui, theme, "Generating handover...");
|
|
3300
|
+
loader.onAbort = () => done(null);
|
|
3301
|
+
buildHandoverText(handoverClient, ctx, options, loader.signal).then(
|
|
3302
|
+
(text) => done({ text }),
|
|
3303
|
+
(error) => done(loader.signal.aborted ? null : { error: getErrorMessage(error) }),
|
|
3304
|
+
);
|
|
3305
|
+
return loader;
|
|
3306
|
+
});
|
|
3307
|
+
if (!getLiveContext(ctx, generation)) return;
|
|
3308
|
+
if (!generated) {
|
|
3309
|
+
notifyIfLive(ctx, "Handover cancelled", "info", generation);
|
|
3310
|
+
return;
|
|
3311
|
+
}
|
|
3312
|
+
if ("error" in generated) {
|
|
3313
|
+
notifyIfLive(ctx, `Handover failed: ${generated.error}`, "error", generation);
|
|
3314
|
+
return;
|
|
3315
|
+
}
|
|
3316
|
+
|
|
3317
|
+
const edited = await ctx.ui.editor("Edit handover", generated.text);
|
|
3318
|
+
if (!getLiveContext(ctx, generation)) return;
|
|
3319
|
+
if (edited === undefined || !edited.trim()) {
|
|
3320
|
+
notifyIfLive(ctx, "Handover cancelled", "info", generation);
|
|
3321
|
+
return;
|
|
3322
|
+
}
|
|
3323
|
+
|
|
3324
|
+
try {
|
|
3325
|
+
handoverClient = await ensureConnected("tool");
|
|
3326
|
+
} catch (error) {
|
|
3327
|
+
notifyIfLive(ctx, `Intercom unavailable: ${getErrorMessage(error)}`, "error", generation);
|
|
3328
|
+
return;
|
|
3329
|
+
}
|
|
3330
|
+
const result = await deliverMessage(handoverClient, ctx, undefined, { ...request, message: edited, handover: true });
|
|
3331
|
+
const failed = result.details.error === true || result.details.delivered === false;
|
|
3332
|
+
notifyIfLive(ctx, failed ? firstTextContent(result) : `Handover: ${firstTextContent(result)}`, failed ? "error" : "info", generation);
|
|
3333
|
+
}
|
|
3334
|
+
|
|
2747
3335
|
async function openIntercomOverlay(ctx: ExtensionContext): Promise<void> {
|
|
2748
3336
|
const overlayGeneration = runtimeGeneration;
|
|
2749
3337
|
const liveContext = getLiveContext(ctx, overlayGeneration);
|
|
@@ -2780,12 +3368,17 @@ Usage:
|
|
|
2780
3368
|
return;
|
|
2781
3369
|
}
|
|
2782
3370
|
|
|
2783
|
-
const
|
|
3371
|
+
const selection = await ctx.ui.custom<SessionListSelection | undefined>(
|
|
2784
3372
|
(_tui, theme, keybindings, done) => new SessionListOverlay(theme, keybindings, currentSession, sessions, done),
|
|
2785
3373
|
{ overlay: true, overlayOptions: { width: 88 } }
|
|
2786
3374
|
).catch(() => undefined);
|
|
2787
3375
|
|
|
2788
|
-
if (!
|
|
3376
|
+
if (!selection || !getLiveContext(ctx, overlayGeneration)) return;
|
|
3377
|
+
if (selection.action === "handover") {
|
|
3378
|
+
await openHandoverPicker(ctx, overlayGeneration, selection.session.id);
|
|
3379
|
+
return;
|
|
3380
|
+
}
|
|
3381
|
+
const selectedSession = selection.session;
|
|
2789
3382
|
|
|
2790
3383
|
try {
|
|
2791
3384
|
overlayClient = await ensureConnected("overlay");
|
|
@@ -2828,6 +3421,11 @@ Usage:
|
|
|
2828
3421
|
handler: async (args, ctx) => setIntercomAlias(args, ctx),
|
|
2829
3422
|
});
|
|
2830
3423
|
|
|
3424
|
+
pi.registerCommand("handover", {
|
|
3425
|
+
description: "Summarize this session and hand it over to another session (usage: /handover to pick a session, or /handover <target or project path> [next task])",
|
|
3426
|
+
handler: async (args, ctx) => runHandoverCommand(args, ctx),
|
|
3427
|
+
});
|
|
3428
|
+
|
|
2831
3429
|
pi.registerShortcut("alt+m", {
|
|
2832
3430
|
description: "Open session intercom",
|
|
2833
3431
|
handler: async (ctx) => openIntercomOverlay(ctx),
|