@ashx-j/lunr 0.2.21 → 0.2.23
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 +4 -2
- package/README.md +23 -5
- package/dist/builtin-extensions/index.d.ts.map +1 -1
- package/dist/builtin-extensions/index.js +1 -0
- package/dist/builtin-extensions/index.js.map +1 -1
- package/dist/builtin-extensions/lunr-browser.d.ts +9 -0
- package/dist/builtin-extensions/lunr-browser.d.ts.map +1 -0
- package/dist/builtin-extensions/lunr-browser.js +169 -0
- package/dist/builtin-extensions/lunr-browser.js.map +1 -0
- package/dist/builtin-extensions/lunr-todos.d.ts.map +1 -1
- package/dist/builtin-extensions/lunr-todos.js +15 -0
- package/dist/builtin-extensions/lunr-todos.js.map +1 -1
- package/dist/builtin-extensions/pi-intercom/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-intercom/index.js +3 -0
- package/dist/builtin-extensions/pi-intercom/index.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/control-notices.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/control-notices.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/control-notices.js +5 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/control-notices.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.js +18 -5
- package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts +4 -3
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js +3 -0
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/communication.d.ts +17 -0
- package/dist/builtin-extensions/pi-subagents/src/intercom/communication.d.ts.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/intercom/communication.js +45 -0
- package/dist/builtin-extensions/pi-subagents/src/intercom/communication.js.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.js +4 -11
- package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.d.ts +4 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.js +160 -51
- package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-ask.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-ask.js +5 -0
- package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-ask.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-questions.d.ts +2 -0
- package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-questions.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-questions.js +3 -2
- package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-questions.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/auto-drain.d.ts +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/background/auto-drain.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/auto-drain.js +2 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/auto-drain.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.d.ts +3 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.js +11 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.js +41 -3
- package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +4 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.js +3 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-control.d.ts +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-control.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-control.js +3 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-control.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +1 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/communication.d.ts +18 -0
- package/dist/builtin-extensions/pi-subagents/src/tui/communication.d.ts.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/tui/communication.js +48 -0
- package/dist/builtin-extensions/pi-subagents/src/tui/communication.js.map +1 -0
- package/dist/builtin-extensions/pi-web-access/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/index.js +11 -7
- package/dist/builtin-extensions/pi-web-access/index.js.map +1 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +2 -1
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/install-cli.d.ts.map +1 -1
- package/dist/cli/install-cli.js +15 -45
- package/dist/cli/install-cli.js.map +1 -1
- package/dist/core/agent-session-runtime.d.ts +9 -0
- package/dist/core/agent-session-runtime.d.ts.map +1 -1
- package/dist/core/agent-session-runtime.js +126 -29
- package/dist/core/agent-session-runtime.js.map +1 -1
- package/dist/core/agent-session.d.ts +22 -0
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +250 -105
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/browser/network.d.ts +9 -0
- package/dist/core/browser/network.d.ts.map +1 -0
- package/dist/core/browser/network.js +146 -0
- package/dist/core/browser/network.js.map +1 -0
- package/dist/core/browser/runtime.d.ts +24 -0
- package/dist/core/browser/runtime.d.ts.map +1 -0
- package/dist/core/browser/runtime.js +289 -0
- package/dist/core/browser/runtime.js.map +1 -0
- package/dist/core/browser/schema.d.ts +16 -0
- package/dist/core/browser/schema.d.ts.map +1 -0
- package/dist/core/browser/schema.js +36 -0
- package/dist/core/browser/schema.js.map +1 -0
- package/dist/core/browser/settings.d.ts +8 -0
- package/dist/core/browser/settings.d.ts.map +1 -0
- package/dist/core/browser/settings.js +30 -0
- package/dist/core/browser/settings.js.map +1 -0
- package/dist/core/browser/setup.d.ts +2 -0
- package/dist/core/browser/setup.d.ts.map +1 -0
- package/dist/core/browser/setup.js +16 -0
- package/dist/core/browser/setup.js.map +1 -0
- package/dist/core/customize.d.ts.map +1 -1
- package/dist/core/customize.js +15 -14
- package/dist/core/customize.js.map +1 -1
- package/dist/core/export-html/index.d.ts.map +1 -1
- package/dist/core/export-html/index.js +1 -1
- package/dist/core/export-html/index.js.map +1 -1
- package/dist/core/extensions/runner.d.ts +1 -0
- package/dist/core/extensions/runner.d.ts.map +1 -1
- package/dist/core/extensions/runner.js +1 -1
- package/dist/core/extensions/runner.js.map +1 -1
- package/dist/core/extensions/types.d.ts +1 -1
- package/dist/core/extensions/types.d.ts.map +1 -1
- package/dist/core/extensions/types.js.map +1 -1
- package/dist/core/install-features.d.ts.map +1 -1
- package/dist/core/install-features.js +10 -8
- package/dist/core/install-features.js.map +1 -1
- package/dist/core/memory-cap.d.ts.map +1 -1
- package/dist/core/memory-cap.js +5 -3
- package/dist/core/memory-cap.js.map +1 -1
- package/dist/core/model-tiers.d.ts.map +1 -1
- package/dist/core/model-tiers.js +9 -6
- package/dist/core/model-tiers.js.map +1 -1
- package/dist/core/permissions.d.ts.map +1 -1
- package/dist/core/permissions.js +9 -0
- package/dist/core/permissions.js.map +1 -1
- package/dist/core/plan-mode.d.ts.map +1 -1
- package/dist/core/plan-mode.js +3 -0
- package/dist/core/plan-mode.js.map +1 -1
- package/dist/core/process-registry.d.ts.map +1 -1
- package/dist/core/process-registry.js +6 -4
- package/dist/core/process-registry.js.map +1 -1
- package/dist/core/runtime-scope.d.ts +11 -0
- package/dist/core/runtime-scope.d.ts.map +1 -0
- package/dist/core/runtime-scope.js +3 -0
- package/dist/core/runtime-scope.js.map +1 -0
- package/dist/core/sdk.d.ts.map +1 -1
- package/dist/core/sdk.js +13 -0
- package/dist/core/sdk.js.map +1 -1
- package/dist/core/session-handoff.d.ts +35 -0
- package/dist/core/session-handoff.d.ts.map +1 -0
- package/dist/core/session-handoff.js +214 -0
- package/dist/core/session-handoff.js.map +1 -0
- package/dist/core/session-manager.d.ts +20 -0
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +184 -22
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/session-ownership.d.ts +28 -0
- package/dist/core/session-ownership.d.ts.map +1 -0
- package/dist/core/session-ownership.js +138 -0
- package/dist/core/session-ownership.js.map +1 -0
- package/dist/core/session-retention.d.ts.map +1 -1
- package/dist/core/session-retention.js +11 -2
- package/dist/core/session-retention.js.map +1 -1
- package/dist/core/settings-manager.d.ts +11 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +27 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +2 -0
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/subagent-wait-interruption.d.ts +11 -0
- package/dist/core/subagent-wait-interruption.d.ts.map +1 -0
- package/dist/core/subagent-wait-interruption.js +19 -0
- package/dist/core/subagent-wait-interruption.js.map +1 -0
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +7 -2
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/todo-settings.d.ts +5 -0
- package/dist/core/todo-settings.d.ts.map +1 -0
- package/dist/core/todo-settings.js +7 -0
- package/dist/core/todo-settings.js.map +1 -0
- package/dist/core/tools/bash.d.ts.map +1 -1
- package/dist/core/tools/bash.js +4 -4
- package/dist/core/tools/bash.js.map +1 -1
- package/dist/core/tools/edit.d.ts.map +1 -1
- package/dist/core/tools/edit.js +5 -3
- package/dist/core/tools/edit.js.map +1 -1
- package/dist/core/tools/find.d.ts.map +1 -1
- package/dist/core/tools/find.js +4 -4
- package/dist/core/tools/find.js.map +1 -1
- package/dist/core/tools/grep.d.ts.map +1 -1
- package/dist/core/tools/grep.js +4 -4
- package/dist/core/tools/grep.js.map +1 -1
- package/dist/core/tools/ls.d.ts.map +1 -1
- package/dist/core/tools/ls.js +4 -4
- package/dist/core/tools/ls.js.map +1 -1
- package/dist/core/tools/read.d.ts.map +1 -1
- package/dist/core/tools/read.js +4 -4
- package/dist/core/tools/read.js.map +1 -1
- package/dist/core/tools/render-utils.d.ts +14 -5
- package/dist/core/tools/render-utils.d.ts.map +1 -1
- package/dist/core/tools/render-utils.js +34 -7
- package/dist/core/tools/render-utils.js.map +1 -1
- package/dist/core/tools/write.d.ts.map +1 -1
- package/dist/core/tools/write.js +4 -4
- package/dist/core/tools/write.js.map +1 -1
- package/dist/core/usage-service.d.ts.map +1 -1
- package/dist/core/usage-service.js +5 -3
- package/dist/core/usage-service.js.map +1 -1
- package/dist/gateway/adapters/discord.d.ts +12 -1
- package/dist/gateway/adapters/discord.d.ts.map +1 -1
- package/dist/gateway/adapters/discord.js +112 -17
- package/dist/gateway/adapters/discord.js.map +1 -1
- package/dist/gateway/adapters/telegram.d.ts +4 -2
- package/dist/gateway/adapters/telegram.d.ts.map +1 -1
- package/dist/gateway/adapters/telegram.js +34 -11
- package/dist/gateway/adapters/telegram.js.map +1 -1
- package/dist/gateway/agent-bridge.d.ts +14 -3
- package/dist/gateway/agent-bridge.d.ts.map +1 -1
- package/dist/gateway/agent-bridge.js +252 -60
- package/dist/gateway/agent-bridge.js.map +1 -1
- package/dist/gateway/approval.d.ts +1 -0
- package/dist/gateway/approval.d.ts.map +1 -1
- package/dist/gateway/approval.js +60 -18
- package/dist/gateway/approval.js.map +1 -1
- package/dist/gateway/authz.d.ts +2 -0
- package/dist/gateway/authz.d.ts.map +1 -1
- package/dist/gateway/authz.js +13 -0
- package/dist/gateway/authz.js.map +1 -1
- package/dist/gateway/buttons.d.ts +3 -1
- package/dist/gateway/buttons.d.ts.map +1 -1
- package/dist/gateway/buttons.js +18 -3
- package/dist/gateway/buttons.js.map +1 -1
- package/dist/gateway/command.d.ts.map +1 -1
- package/dist/gateway/command.js +49 -4
- package/dist/gateway/command.js.map +1 -1
- package/dist/gateway/commands.d.ts.map +1 -1
- package/dist/gateway/commands.js +18 -3
- package/dist/gateway/commands.js.map +1 -1
- package/dist/gateway/config.d.ts +5 -0
- package/dist/gateway/config.d.ts.map +1 -1
- package/dist/gateway/config.js +5 -0
- package/dist/gateway/config.js.map +1 -1
- package/dist/gateway/conversations.d.ts +14 -0
- package/dist/gateway/conversations.d.ts.map +1 -0
- package/dist/gateway/conversations.js +30 -0
- package/dist/gateway/conversations.js.map +1 -0
- package/dist/gateway/download.d.ts +2 -0
- package/dist/gateway/download.d.ts.map +1 -0
- package/dist/gateway/download.js +36 -0
- package/dist/gateway/download.js.map +1 -0
- package/dist/gateway/index.d.ts.map +1 -1
- package/dist/gateway/index.js +85 -26
- package/dist/gateway/index.js.map +1 -1
- package/dist/gateway/mobile-commands.d.ts +24 -0
- package/dist/gateway/mobile-commands.d.ts.map +1 -0
- package/dist/gateway/mobile-commands.js +422 -0
- package/dist/gateway/mobile-commands.js.map +1 -0
- package/dist/gateway/presenter.d.ts +16 -0
- package/dist/gateway/presenter.d.ts.map +1 -0
- package/dist/gateway/presenter.js +210 -0
- package/dist/gateway/presenter.js.map +1 -0
- package/dist/gateway/router.d.ts +1 -0
- package/dist/gateway/router.d.ts.map +1 -1
- package/dist/gateway/router.js +32 -3
- package/dist/gateway/router.js.map +1 -1
- package/dist/gateway/service.d.ts +46 -0
- package/dist/gateway/service.d.ts.map +1 -0
- package/dist/gateway/service.js +395 -0
- package/dist/gateway/service.js.map +1 -0
- package/dist/gateway/setup.d.ts +4 -0
- package/dist/gateway/setup.d.ts.map +1 -0
- package/dist/gateway/setup.js +146 -0
- package/dist/gateway/setup.js.map +1 -0
- package/dist/gateway/types.d.ts +4 -2
- package/dist/gateway/types.d.ts.map +1 -1
- package/dist/gateway/types.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +2 -1
- package/dist/main.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts +19 -2
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +78 -17
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/copyable-text.d.ts +27 -0
- package/dist/modes/interactive/components/copyable-text.d.ts.map +1 -0
- package/dist/modes/interactive/components/copyable-text.js +156 -0
- package/dist/modes/interactive/components/copyable-text.js.map +1 -0
- package/dist/modes/interactive/components/custom-entry.d.ts +1 -0
- package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-entry.js +8 -0
- package/dist/modes/interactive/components/custom-entry.js.map +1 -1
- package/dist/modes/interactive/components/custom-message.d.ts +1 -0
- package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/custom-message.js +8 -0
- package/dist/modes/interactive/components/custom-message.js.map +1 -1
- package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/session-selector.js +16 -0
- package/dist/modes/interactive/components/session-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +8 -1
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +51 -0
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/thinking-tail.d.ts +9 -2
- package/dist/modes/interactive/components/thinking-tail.d.ts.map +1 -1
- package/dist/modes/interactive/components/thinking-tail.js +43 -1
- package/dist/modes/interactive/components/thinking-tail.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts +4 -3
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +34 -45
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +9 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +267 -44
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/theme/theme.d.ts +1 -0
- package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
- package/dist/modes/interactive/theme/theme.js +23 -0
- package/dist/modes/interactive/theme/theme.js.map +1 -1
- package/dist/node-runtime/agent-session-services-GZVSOGYR.js +49 -0
- package/dist/node-runtime/{builtin-extensions-JCOPAAB5.js → builtin-extensions-QVCXNQT4.js} +6 -5
- package/dist/node-runtime/{chunk-LTYWTR3V.js → chunk-2MI5OPMN.js} +17 -2
- package/dist/node-runtime/{chunk-W3CVH5RX.js → chunk-2TKODGBZ.js} +11 -6
- package/dist/node-runtime/chunk-4EULYYR4.js +62 -0
- package/dist/node-runtime/{chunk-6N22HULO.js → chunk-5D7LC2ZQ.js} +7 -2
- package/dist/node-runtime/{chunk-KBKMCJDU.js → chunk-5ZQXRPMC.js} +19 -4
- package/dist/node-runtime/{chunk-BOHIDQT4.js → chunk-6VYZ5UFP.js} +1 -1
- package/dist/node-runtime/chunk-AZJHNQKQ.js +205 -0
- package/dist/node-runtime/{chunk-A3KMVBZV.js → chunk-BBUVIEZB.js} +1 -10
- package/dist/node-runtime/{chunk-IRPJXI6U.js → chunk-BX2RB477.js} +1 -1
- package/dist/node-runtime/chunk-CCCN2UCX.js +14 -0
- package/dist/node-runtime/{chunk-25I2BHAA.js → chunk-CSUZVNYE.js} +1 -1
- package/dist/node-runtime/chunk-DD5YWFSJ.js +708 -0
- package/dist/node-runtime/chunk-DQMGU675.js +3409 -0
- package/dist/node-runtime/{chunk-QZMODZQ2.js → chunk-E24EO34J.js} +2 -1
- package/dist/node-runtime/chunk-EKVFP6YF.js +355 -0
- package/dist/node-runtime/chunk-GJ2RDBRL.js +672 -0
- package/dist/node-runtime/{chunk-W3SILANP.js → chunk-GMHJCCEN.js} +8 -8
- package/dist/node-runtime/{chunk-DDWHZ633.js → chunk-GS42T6MX.js} +1 -1
- package/dist/node-runtime/chunk-GS66LV4M.js +2830 -0
- package/dist/node-runtime/chunk-H4K3JDRB.js +47 -0
- package/dist/node-runtime/{chunk-2SJB2AWP.js → chunk-HMBGROQK.js} +3 -3
- package/dist/node-runtime/{chunk-GB2MGFLI.js → chunk-HPUP7E4T.js} +216 -201
- package/dist/node-runtime/{chunk-YMEAYRBE.js → chunk-HTFRRDSF.js} +2 -7
- package/dist/node-runtime/{chunk-OPEK5RRY.js → chunk-IF24A3FH.js} +1 -1
- package/dist/node-runtime/chunk-IMLCWLPI.js +9 -0
- package/dist/node-runtime/chunk-KKUTQQV7.js +144 -0
- package/dist/node-runtime/chunk-LFZDVKSP.js +521 -0
- package/dist/node-runtime/{chunk-2BUAYZ7K.js → chunk-LLUIPGDR.js} +581 -197
- package/dist/node-runtime/{chunk-7NBZ5P7I.js → chunk-NAY6UUQZ.js} +1 -1
- package/dist/node-runtime/chunk-OAR4TYZE.js +146 -0
- package/dist/node-runtime/{chunk-STERBGUB.js → chunk-OFKSVRV7.js} +2 -2
- package/dist/node-runtime/{chunk-JZQ7F36T.js → chunk-PCEW76PM.js} +19 -3
- package/dist/node-runtime/{chunk-WLLDXJRT.js → chunk-QAZOULTU.js} +29 -1014
- package/dist/node-runtime/{chunk-6KDIOJL3.js → chunk-QH6YL7VK.js} +3 -3
- package/dist/node-runtime/chunk-R3K2F5GI.js +122 -0
- package/dist/node-runtime/{chunk-RNBHABBA.js → chunk-RDDAZOMU.js} +23 -0
- package/dist/node-runtime/{chunk-SY2TFMLO.js → chunk-RIR5EDDJ.js} +46 -151
- package/dist/node-runtime/chunk-RMQZU2YU.js +117 -0
- package/dist/node-runtime/{chunk-6BEIBLQ3.js → chunk-RWTKOC3B.js} +1 -1
- package/dist/node-runtime/{chunk-G6LRAP36.js → chunk-TQGPP4SC.js} +1 -1
- package/dist/node-runtime/{chunk-Y5KOEMBH.js → chunk-TVJUOJZJ.js} +9 -674
- package/dist/node-runtime/chunk-UAEOTO52.js +119 -0
- package/dist/node-runtime/{chunk-AY6CAJSL.js → chunk-UJOCPOMX.js} +6 -3
- package/dist/node-runtime/chunk-UP2XBVH5.js +40 -0
- package/dist/node-runtime/{chunk-WJVFOIB5.js → chunk-UQUCFAJ3.js} +1 -1
- package/dist/node-runtime/chunk-URD2SLIT.js +1019 -0
- package/dist/node-runtime/chunk-US544NN6.js +13 -0
- package/dist/node-runtime/chunk-UWPJL22I.js +341 -0
- package/dist/node-runtime/{chunk-4I23VTC4.js → chunk-VWCE2HSZ.js} +21 -124
- package/dist/node-runtime/{chunk-VZR3NCM7.js → chunk-W64JC4E7.js} +18 -14
- package/dist/node-runtime/{chunk-AWVD5IEY.js → chunk-X3URCYCU.js} +23 -12
- package/dist/node-runtime/{chunk-GKLEQ3I4.js → chunk-XLTL257W.js} +126 -27
- package/dist/node-runtime/{chunk-WKDK4C5P.js → chunk-YDO2F2IA.js} +38 -164
- package/dist/node-runtime/{chunk-PDNXVXMD.js → chunk-YHQ3NBB3.js} +58 -48
- package/dist/node-runtime/chunk-YPHAIRZT.js +10 -0
- package/dist/node-runtime/cli-runtime.js +2 -2
- package/dist/node-runtime/command-PDVTBRWA.js +45 -0
- package/dist/node-runtime/{commands-MV5KOZ64.js → commands-KAMO2T6P.js} +10 -10
- package/dist/node-runtime/commands-XDCFGIGW.js +36 -0
- package/dist/node-runtime/config-RORQUQFG.js +20 -0
- package/dist/node-runtime/{customize-LF5VST47.js → customize-VFJV3U6A.js} +2 -1
- package/dist/node-runtime/{direct-tool-executor-BK7CLEBX.js → direct-tool-executor-YAVOLDFY.js} +8 -8
- package/dist/node-runtime/{export-html-TEXVV5RP.js → export-html-KSOIMVPI.js} +4 -3
- package/dist/node-runtime/{extension-input-O4HSAEM4.js → extension-input-E7BJZ35H.js} +4 -4
- package/dist/node-runtime/{extension-selector-X5FCX43D.js → extension-selector-WU42XDTU.js} +4 -4
- package/dist/node-runtime/{extract-XLQSJN4V.js → extract-EQJE7FZZ.js} +2 -2
- package/dist/node-runtime/{gateway-BM6NLOH4.js → gateway-AYWM5DIO.js} +275 -994
- package/dist/node-runtime/{gemini-search-U7SUMPQA.js → gemini-search-35OCRFLN.js} +1 -1
- package/dist/node-runtime/{gemini-url-context-PXWCBQHK.js → gemini-url-context-UQY3PHHW.js} +2 -2
- package/dist/node-runtime/index.js +104 -65
- package/dist/node-runtime/{init-3C7Z24OI.js → init-X2LIUB2H.js} +3 -3
- package/dist/node-runtime/{install-cli-EXMJQESX.js → install-cli-3BO4MMQ6.js} +21 -82
- package/dist/node-runtime/interactive-mode-4MFRKAHG.js +72 -0
- package/dist/node-runtime/{interactive-view-ILS6TAN5.js → interactive-view-TUZHCQM3.js} +8 -8
- package/dist/node-runtime/lunr-browser-RYFIIVJN.js +174 -0
- package/dist/node-runtime/{lunr-cron-4VHP4E4B.js → lunr-cron-YWXEPZMQ.js} +19 -5
- package/dist/node-runtime/main.js +44 -31
- package/dist/node-runtime/{memory-cap-3S4XRLNP.js → memory-cap-EL3KL4JJ.js} +2 -1
- package/dist/node-runtime/mobile-commands-LVHDAUDP.js +32 -0
- package/dist/node-runtime/model-runtime-PLQKAG4B.js +16 -0
- package/dist/node-runtime/{model-tiers-NJLHUEGK.js → model-tiers-OU3U5CZG.js} +2 -1
- package/dist/node-runtime/{package-manager-cli-N37546V5.js → package-manager-cli-6GT3Z3CK.js} +22 -15
- package/dist/node-runtime/{pi-intercom-NV2LW6X7.js → pi-intercom-HBPK5HSJ.js} +4 -1
- package/dist/node-runtime/{pi-mcp-adapter-GUFZWW54.js → pi-mcp-adapter-E6WULBKF.js} +4 -4
- package/dist/node-runtime/{pi-subagents-6MUIFNDM.js → pi-subagents-CDWK2AKY.js} +236 -79
- package/dist/node-runtime/{pi-web-access-2CQGFLT2.js → pi-web-access-WTGMNZ32.js} +15 -15
- package/dist/node-runtime/process-registry-4FAKZQOL.js +31 -0
- package/dist/node-runtime/{proxy-modes-V6YVFH3C.js → proxy-modes-OSQCWRBI.js} +9 -9
- package/dist/node-runtime/rpc-entry.js +44 -31
- package/dist/node-runtime/{rpc-mode-W5ZTLTMZ.js → rpc-mode-O3XV4SID.js} +2 -2
- package/dist/node-runtime/runtime-4VA6JKNF.js +373 -0
- package/dist/node-runtime/{runtime-bridges-2VQTLPOZ.js → runtime-bridges-3XUQ46XW.js} +6 -5
- package/dist/node-runtime/service-ISSP6VHE.js +36 -0
- package/dist/node-runtime/session-handoff-HC7R5E24.js +33 -0
- package/dist/node-runtime/{session-manager-E7AREDTV.js → session-manager-CFN4UFM2.js} +2 -1
- package/dist/node-runtime/{session-selector-FJ7M2AIX.js → session-selector-GIM4DHQ2.js} +5 -4
- package/dist/node-runtime/{settings-manager-CUGAZWAB.js → settings-manager-6VEMXRDL.js} +7 -2
- package/dist/node-runtime/setup-5SR2J35A.js +155 -0
- package/dist/node-runtime/setup-JBKOLJ6F.js +18 -0
- package/dist/node-runtime/{subagent-executor-MH4A7CCF.js → subagent-executor-M5VWB3D3.js} +26 -18
- package/dist/node-runtime/theme-UOO5RVFN.js +68 -0
- package/dist/node-runtime/trust-manager-MMISNCYO.js +17 -0
- package/dist/node-runtime/{update-cli-XTZMZGOL.js → update-cli-UVKJWRRJ.js} +7 -2
- package/dist/node-runtime/usage-service-LFB2SWYV.js +37 -0
- package/dist/node-runtime/{video-extract-OYT5WKS5.js → video-extract-OOZHR7SU.js} +2 -2
- package/dist/node-runtime/{youtube-extract-TQYKGFGS.js → youtube-extract-FNPAUNHU.js} +6 -6
- package/docs/browser.md +86 -0
- package/docs/extensions.md +2 -0
- package/docs/features.md +96 -16
- package/docs/interactive-startup.md +2 -1
- package/docs/sessions.md +10 -0
- package/docs/settings.md +2 -0
- package/docs/tui.md +2 -0
- package/docs/usage.md +16 -0
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/package.json +7 -4
- package/scripts/install-browser.mjs +20 -0
- package/dist/node-runtime/agent-session-services-C743TYQE.js +0 -37
- package/dist/node-runtime/chunk-VGYZ3APQ.js +0 -59
- package/dist/node-runtime/chunk-XI77KVKA.js +0 -6009
- package/dist/node-runtime/command-P4NYCJ2M.js +0 -13
- package/dist/node-runtime/interactive-mode-EVVBA64D.js +0 -59
- package/dist/node-runtime/{chunk-UWQYRSYQ.js → chunk-YJMMG7C6.js} +25 -25
- package/dist/node-runtime/{mcp-panel-IIGMXQGP.js → mcp-panel-KTTFXJZ4.js} +3 -3
- package/dist/node-runtime/{src-BPQFJR76.js → src-IVPNZ2BX.js} +9 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-description.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/extension/tool-description.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { SUBAGENT_ASYNC_GUIDANCE } from \"../shared/async-guidance.ts\";\nimport type { ExtensionConfig, ToolDescriptionMode } from \"../shared/types.ts\";\nimport { getAgentDir, getProjectConfigDir } from \"../shared/utils.ts\";\n\nconst CUSTOM_TOOL_DESCRIPTION_FILE = \"subagent-tool-description.md\";\nconst CUSTOM_TOOL_DESCRIPTION_MAX_BYTES = 50 * 1024;\n\nexport const SUBAGENT_TIER_GUIDANCE = `TIER SELECTION:\n• Choose the lowest tier that can reliably complete the task.\n• light: Use for simple, straightforward tasks that require little reasoning. Good for quick checks, finding information, collecting facts for research, inspecting a small amount of code, or verifying a specific fact.\n• standard: Use for moderately difficult work and everyday coding tasks. Good for writing simple code, fixing a clearly described bug, reviewing a focused change, or completing work with clear requirements. Use heavy when the task requires deep architectural understanding or complex reasoning.\n• heavy: Use for complex or ambiguous tasks that require deep reasoning and strong code understanding. Good for implementing complex plans, debugging difficult or poorly understood problems, reviewing large or high-risk changes, and making architectural decisions.`;\n\nexport const SUBAGENT_SAFETY_GUIDANCE = `SAFETY-CRITICAL SUBAGENT GUIDANCE:\n• Prompt children directly. There is no agent roster. Every execution task needs task (the full child prompt) and description (a concise UI label).\n• Every executable child chooses exactly one of tier: \"light\"|\"standard\"|\"heavy\" (default) or model: \"provider/id\" when the user names a model. Do not pass both, and do not use inherit. Missing, disabled, unconfigured, unavailable, or unauthenticated selections fail before launch.\n• Optional thinking (off/minimal/low/medium/high/xhigh/max) is only valid with an explicit model. Tier launches use the configured tier thinking level.\n${SUBAGENT_TIER_GUIDANCE}\n• permissions is \"full\" or \"read-only\". Omitted permissions means full. Plan-mode parents must pass permissions: \"read-only\"; full or omitted launches are rejected.\n• Keep execution and control separate: omit action for SINGLE/PARALLEL/CHAIN execution; use action only for status/interrupt/stop/resume/steer/append-step/doctor/watchdog.status|check|recommend-model/schedule*.\n• ${SUBAGENT_ASYNC_GUIDANCE}\n• Child-safety boundary: ordinary children are not orchestrators and must not run subagents. Only explicitly configured fanout children may use the child-safe subagent tool, still bounded by depth/session limits.\n• Writing/review safety: keep one full-access writer for the same cwd/worktree. Use fresh-context permissions: \"read-only\" children for independent review, then have the parent synthesize and apply fixes as the sole writer unless an isolated worktree was intentionally requested.\n• Artifacts/status essentials: chain outputs live under {chain_dir}; async runs expose asyncId/asyncDir with status.json, events.jsonl, output logs, and status via { action: \"status\", id }. Include output paths and residual risks when reporting results.`;\n\nexport const FULL_SUBAGENT_TOOL_DESCRIPTION = `Delegate work to generic children by prompting them directly. There are no named agent types.\n\nEXECUTION (use exactly ONE mode):\n• SINGLE: { task, description, tier|model, thinking?, permissions? } — one child. Multiple SINGLE calls in the same turn run concurrently; explicit concurrency/run limits still apply.\n• PARALLEL: { tasks: [{task, description, tier|model, thinking?, permissions?, count?, output?, reads?, progress?}, ...], concurrency?: number, worktree?: true } — one-call concurrent execution (default: all tasks at once; worktree: isolate each task in a git worktree)\n• CHAIN: { chain: [{task, description, tier|model, thinking?, permissions?}, {parallel:[{task, description, tier|model, thinking?, permissions?, count:3}]}] } — sequential pipeline with optional parallel fan-out. Use chain when a later child needs an earlier result.\n• description is required, single-line, max 80 characters. It is UI metadata only. task is the complete child prompt.\n• permissions: \"full\" (default) or \"read-only\". Full includes coding tools (read, search, shell, edit, write, web, LSP, MCP) and excludes parent-owned tools (cron, memory, behavior, goals, nested subagents). Plan-mode parents may launch only permissions: \"read-only\".\n• Model selection: pass tier by default (\"light\"|\"standard\"|\"heavy\"). Pass model: \"provider/id\" only when the user specifies a model. Exactly one of tier or model. Optional thinking only with model; tier uses configured thinking. Direct model launches do not require tier mode to be enabled. No inherit and no silent fallback for an explicit model.\n• Children always start with a fresh session (no inherited parent transcript).\n• Optional timeout: { timeoutMs } or { maxRuntimeMs } sets a run-level max runtime for foreground and async/background runs\n\nCHAIN TEMPLATE VARIABLES (use in task and description strings):\n• {task} - The original task/request from the user\n• {previous} - Text response from the previous step (empty for first step)\n• {chain_dir} - Shared directory for chain files (e.g., <tmpdir>/pi-subagents-<scope>/chain-runs/abc123/)\n\nCHAIN EXAMPLES:\n• Sequential: { chain: [{task:\"Analyze {task}\", description:\"Analyze request\", tier:\"standard\"}, {task:\"Plan based on {previous}\", description:\"Draft plan\", tier:\"heavy\"}] }\n• Parallel fan-out: { chain: [{parallel: [{task:\"Check part of {task}\", description:\"Check one part\", tier:\"light\", permissions:\"read-only\", count: 3}]}] }\n• Mixed: { chain: [{task:\"Research {task}\", description:\"Research request\", tier:\"standard\", permissions:\"read-only\"}, {parallel: [{task:\"Review {previous}\", description:\"Review findings\", tier:\"light\", permissions:\"read-only\", count: 2}]}, {task:\"Summarize {previous}\", description:\"Summarize reviews\", tier:\"standard\"}] }\n\nCONTROL (use action field, omit task/chain/tasks):\n• { action: \"watchdog.status\" | \"watchdog.check\" | \"watchdog.recommend-model\" } - inspect the opt-in subagent watchdog and its strong complementary model recommendation (read-only; there is no configure action)\n• { action: \"status\", id: \"...\" } - inspect an async/background run by id or prefix\n• { action: \"status\", view: \"fleet\" } - read-only active foreground/async fleet view with transcript commands\n• { action: \"status\", id: \"...\", view: \"transcript\", index?: 0, lines?: 80 } - tail a run or child output/session transcript\n• { action: \"interrupt\", id?: \"...\" } - soft-interrupt the current child turn and leave the run paused\n• { action: \"stop\", id: \"...\" } - stop a current-session top-level async run; stopped runs finish with state \"stopped\"\n• { action: \"resume\", id: \"...\", message: \"...\", index?: 0 } - interrupt then follow up with a live async child, or revive a completed async/foreground child from its session\n• { action: \"steer\", id: \"...\", message: \"...\", index?: 0 } - await correlated child input acceptance for up to 3 seconds; returns delivered, scheduled, pending, partial, recovered, or failed with a request id. Only top-level single runs may recover after a further 15-second pause/revival bound; chain, parallel, and nested runs never auto-interrupt.\n• subagent_supervisor({ action: \"ask\", id, reason, message, index?, childId? }) - ask one running async child; returns question id immediately. Ask only when the child owns missing context, the answer changes a concrete next decision, and waiting risks block/rework. No broadcast, revive, task replacement, status polling, or micromanagement.\n• subagent_wait({ questionId }) - wait for that supervisor question answer/expiry/cancel. Answers stay separate from final run results.\n• { action: \"append-step\", id: \"...\", chain: [{task:\"Use {previous}\", description:\"Follow-up step\", tier:\"standard\"}] } - append one step to the tail of a running async chain\n\nSCHEDULE (opt-in; requires { \"scheduledRuns\": { \"enabled\": true } } in config.json):\n• { action: \"schedule\", task, description, tier|model, thinking?, permissions?, schedule: \"+10m\" | \"2030-01-01T09:00:00Z\", scheduleName? } - defer a child launch until a future time. Also accepts tasks[] or chain[]. Scheduled runs always launch async with fresh context; they become normal tracked async runs once they fire. Only schedule explicit delayed runs the user asked for.\n• { action: \"schedule-list\" } - list scheduled runs for this session\n• { action: \"schedule-status\", id: \"...\" } - inspect one scheduled run\n• { action: \"schedule-cancel\", id: \"...\" } - cancel a scheduled run before it fires\n\nDIAGNOSTICS:\n• { action: \"doctor\" } - read-only report for runtime paths, sessions, and intercom\n\n${SUBAGENT_SAFETY_GUIDANCE}`;\n\nexport const COMPACT_SUBAGENT_TOOL_DESCRIPTION = `Delegate to generic children by prompting them. Use exactly one mode per call.\n\nEXECUTE:\n• SINGLE {task, description, tier|model, thinking?, permissions?} (same-turn singles overlap); PARALLEL {tasks:[{task,description,tier|model,thinking?,permissions?,count?,output?,reads?,progress?}], concurrency?, worktree?}; CHAIN {chain:[{task,description,tier|model,thinking?,permissions?},{parallel:[...]}]} for sequential work.\n• description is required (single-line, max 80 chars, UI only). task is the full child prompt. permissions omitted = full. Plan-mode parents must pass permissions:\"read-only\".\n• Exactly one of tier:\"light\"|\"standard\"|\"heavy\" (default) or model:\"provider/id\" when the user names a model. thinking only with model. No inherit; fail closed on unavailable selections. Children always start fresh. timeoutMs/maxRuntimeMs apply to foreground and async/background runs.\n${SUBAGENT_TIER_GUIDANCE}\n• Chain templates may use {task}, {previous}, {chain_dir}, and named outputs. Parallel worktree isolation requires a clean git repo.\n• Chain example: { chain: [{task:\"Analyze {task}\", description:\"Analyze request\", tier:\"standard\"}, {parallel: [{task:\"Check {previous}\", description:\"Check prior result\", tier:\"light\", permissions:\"read-only\", count: 3}]}] }\n\nCONTROL:\n• Use action without execution fields: doctor, watchdog.status, watchdog.check, watchdog.recommend-model, status, interrupt, stop, resume, steer, append-step.\n• Async control actions: status, interrupt, stop, resume, steer, append-step. Use stop with an id for current-session top-level async runs. Use status view:\"fleet\" for active-run overview, view:\"transcript\" to tail child output, and steer for acknowledged live guidance. Steering delivery means lunR accepted the correlated user input, not model compliance; use index for a specific child.\n• Opt-in schedule actions: schedule, schedule-list, schedule-status, schedule-cancel. Schedule only explicit delayed runs the user asked for.\n\nASYNC / WAIT:\n• ${SUBAGENT_ASYNC_GUIDANCE}\n• Status and artifacts live under asyncId/asyncDir with status.json, events.jsonl, output logs, session files, and { action:\"status\", id:\"...\" }.\n\nSAFETY:\n• Ordinary children are not orchestrators and must not run subagents. Only explicit fanout children may use child-safe subagent, still bounded by depth/session limits.\n• Keep one full-access writer per cwd/worktree. Use fresh permissions:\"read-only\" review/validation fanout, then synthesize and apply fixes from the parent unless isolated worktrees were intentionally requested.`;\n\nfunction isToolDescriptionMode(value: unknown): value is ToolDescriptionMode {\n\treturn value === \"full\" || value === \"compact\" || value === \"custom\";\n}\n\nfunction warn(options: ToolDescriptionOptions | undefined, message: string): void {\n\t(options?.warn ?? console.warn)(`[pi-subagents] ${message}`);\n}\n\nexport interface ToolDescriptionOptions {\n\tcwd?: string;\n\tagentDir?: string;\n\twarn?: (message: string) => void;\n}\n\nexport function resolveToolDescriptionMode(config: Pick<ExtensionConfig, \"toolDescriptionMode\">, options?: ToolDescriptionOptions): ToolDescriptionMode {\n\tconst mode = config.toolDescriptionMode;\n\tif (mode === undefined) return \"full\";\n\tif (isToolDescriptionMode(mode)) return mode;\n\twarn(options, `Ignoring invalid toolDescriptionMode ${JSON.stringify(mode)}; expected \"full\", \"compact\", or \"custom\".`);\n\treturn \"full\";\n}\n\nfunction customDescriptionPaths(options?: ToolDescriptionOptions): string[] {\n\tconst cwd = options?.cwd ?? process.cwd();\n\tconst agentDir = options?.agentDir ?? getAgentDir();\n\treturn [\n\t\tpath.join(getProjectConfigDir(cwd), CUSTOM_TOOL_DESCRIPTION_FILE),\n\t\tpath.join(agentDir, CUSTOM_TOOL_DESCRIPTION_FILE),\n\t];\n}\n\nfunction renderCustomTemplate(template: string, options?: ToolDescriptionOptions): string {\n\tconst cwd = options?.cwd ?? process.cwd();\n\tconst agentDir = options?.agentDir ?? getAgentDir();\n\tconst projectConfigDir = getProjectConfigDir(cwd);\n\tconst variables: Record<string, () => string> = {\n\t\tfullDescription: () => FULL_SUBAGENT_TOOL_DESCRIPTION,\n\t\tfull: () => FULL_SUBAGENT_TOOL_DESCRIPTION,\n\t\tcompactDescription: () => COMPACT_SUBAGENT_TOOL_DESCRIPTION,\n\t\tcompact: () => COMPACT_SUBAGENT_TOOL_DESCRIPTION,\n\t\tsafetyGuidance: () => SUBAGENT_SAFETY_GUIDANCE,\n\t\tsafety: () => SUBAGENT_SAFETY_GUIDANCE,\n\t\tagentDir: () => agentDir,\n\t\tprojectConfigDir: () => projectConfigDir,\n\t};\n\treturn template.replace(/\\{\\{(\\w+)\\}\\}/g, (raw, name: string) => {\n\t\tconst replacement = variables[name];\n\t\tif (replacement) return replacement();\n\t\twarn(options, `${CUSTOM_TOOL_DESCRIPTION_FILE}: unknown placeholder ${raw} left unchanged.`);\n\t\treturn raw;\n\t});\n}\n\nfunction loadCustomToolDescription(options?: ToolDescriptionOptions): string | undefined {\n\tfor (const filePath of customDescriptionPaths(options)) {\n\t\tlet stat: fs.Stats;\n\t\ttry {\n\t\t\tstat = fs.statSync(filePath);\n\t\t} catch (error) {\n\t\t\tif (typeof error === \"object\" && error !== null && \"code\" in error && (error as NodeJS.ErrnoException).code === \"ENOENT\") continue;\n\t\t\twarn(options, `Failed to inspect custom tool description '${filePath}': ${error instanceof Error ? error.message : String(error)}`);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!stat.isFile()) {\n\t\t\twarn(options, `Ignoring custom tool description '${filePath}' because it is not a file.`);\n\t\t\tcontinue;\n\t\t}\n\t\tif (stat.size > CUSTOM_TOOL_DESCRIPTION_MAX_BYTES) {\n\t\t\twarn(options, `Ignoring custom tool description '${filePath}' because it is larger than ${CUSTOM_TOOL_DESCRIPTION_MAX_BYTES} bytes.`);\n\t\t\tcontinue;\n\t\t}\n\t\ttry {\n\t\t\tconst template = fs.readFileSync(filePath, \"utf-8\").trim();\n\t\t\tif (!template) {\n\t\t\t\twarn(options, `Ignoring empty custom tool description '${filePath}'.`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst rendered = renderCustomTemplate(template, options).trim();\n\t\t\tif (!rendered) {\n\t\t\t\twarn(options, `Ignoring custom tool description '${filePath}' because it rendered empty.`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\treturn rendered;\n\t\t} catch (error) {\n\t\t\twarn(options, `Failed to read custom tool description '${filePath}': ${error instanceof Error ? error.message : String(error)}`);\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction withMandatorySafetyGuidance(description: string): string {\n\tconst customDescription = description\n\t\t.split(SUBAGENT_SAFETY_GUIDANCE)\n\t\t.map((part) => part.trim())\n\t\t.filter(Boolean)\n\t\t.join(\"\\n\\n\");\n\treturn customDescription\n\t\t? `${customDescription}\\n\\n${SUBAGENT_SAFETY_GUIDANCE}`\n\t\t: SUBAGENT_SAFETY_GUIDANCE;\n}\n\nexport function buildSubagentToolDescription(config: Pick<ExtensionConfig, \"toolDescriptionMode\"> = {}, options?: ToolDescriptionOptions): string {\n\tconst mode = resolveToolDescriptionMode(config, options);\n\tlet description: string;\n\tif (mode === \"compact\") {\n\t\tdescription = COMPACT_SUBAGENT_TOOL_DESCRIPTION;\n\t} else if (mode === \"custom\") {\n\t\tconst custom = loadCustomToolDescription(options);\n\t\tif (custom) {\n\t\t\tdescription = withMandatorySafetyGuidance(custom);\n\t\t} else {\n\t\t\twarn(options, `${CUSTOM_TOOL_DESCRIPTION_FILE} was not found or valid for toolDescriptionMode \"custom\"; using full description.`);\n\t\t\tdescription = FULL_SUBAGENT_TOOL_DESCRIPTION;\n\t\t}\n\t} else {\n\t\tdescription = FULL_SUBAGENT_TOOL_DESCRIPTION;\n\t}\n\treturn description;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tool-description.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/extension/tool-description.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AAEtE,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEtE,MAAM,4BAA4B,GAAG,8BAA8B,CAAC;AACpE,MAAM,iCAAiC,GAAG,EAAE,GAAG,IAAI,CAAC;AAEpD,MAAM,CAAC,MAAM,sBAAsB,GAAG;;;;2QAImO,CAAC;AAE1Q,MAAM,CAAC,MAAM,8BAA8B,GAAG,2VAA2V,CAAC;AAE1Y,MAAM,CAAC,MAAM,wBAAwB,GAAG;;;;EAItC,sBAAsB;;;MAGpB,uBAAuB;;;MAGvB,8BAA8B;gQAC4N,CAAC;AAE/P,MAAM,CAAC,MAAM,8BAA8B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA4C5C,wBAAwB,EAAE,CAAC;AAE7B,MAAM,CAAC,MAAM,iCAAiC,GAAG;;;;;;EAM/C,sBAAsB;MACpB,8BAA8B;;;;;;;;;;MAU9B,uBAAuB;;;;;sNAKyL,CAAC;AAErN,SAAS,qBAAqB,CAAC,KAAc,EAAgC;IAC5E,OAAO,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,QAAQ,CAAC;AAAA,CACrE;AAED,SAAS,IAAI,CAAC,OAA2C,EAAE,OAAe,EAAQ;IACjF,CAAC,OAAO,EAAE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,kBAAkB,OAAO,EAAE,CAAC,CAAC;AAAA,CAC7D;AAQD,MAAM,UAAU,0BAA0B,CAAC,MAAoD,EAAE,OAAgC,EAAuB;IACvJ,MAAM,IAAI,GAAG,MAAM,CAAC,mBAAmB,CAAC;IACxC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACtC,IAAI,qBAAqB,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,IAAI,CAAC,OAAO,EAAE,wCAAwC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IACxH,OAAO,MAAM,CAAC;AAAA,CACd;AAED,SAAS,sBAAsB,CAAC,OAAgC,EAAY;IAC3E,MAAM,GAAG,GAAG,OAAO,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1C,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,WAAW,EAAE,CAAC;IACpD,OAAO;QACN,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,4BAA4B,CAAC;QACjE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,4BAA4B,CAAC;KACjD,CAAC;AAAA,CACF;AAED,SAAS,oBAAoB,CAAC,QAAgB,EAAE,OAAgC,EAAU;IACzF,MAAM,GAAG,GAAG,OAAO,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1C,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,WAAW,EAAE,CAAC;IACpD,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,SAAS,GAAiC;QAC/C,eAAe,EAAE,GAAG,EAAE,CAAC,8BAA8B;QACrD,IAAI,EAAE,GAAG,EAAE,CAAC,8BAA8B;QAC1C,kBAAkB,EAAE,GAAG,EAAE,CAAC,iCAAiC;QAC3D,OAAO,EAAE,GAAG,EAAE,CAAC,iCAAiC;QAChD,cAAc,EAAE,GAAG,EAAE,CAAC,wBAAwB;QAC9C,MAAM,EAAE,GAAG,EAAE,CAAC,wBAAwB;QACtC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ;QACxB,gBAAgB,EAAE,GAAG,EAAE,CAAC,gBAAgB;KACxC,CAAC;IACF,OAAO,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,GAAG,EAAE,IAAY,EAAE,EAAE,CAAC;QAChE,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,WAAW;YAAE,OAAO,WAAW,EAAE,CAAC;QACtC,IAAI,CAAC,OAAO,EAAE,GAAG,4BAA4B,yBAAyB,GAAG,kBAAkB,CAAC,CAAC;QAC7F,OAAO,GAAG,CAAC;IAAA,CACX,CAAC,CAAC;AAAA,CACH;AAED,SAAS,yBAAyB,CAAC,OAAgC,EAAsB;IACxF,KAAK,MAAM,QAAQ,IAAI,sBAAsB,CAAC,OAAO,CAAC,EAAE,CAAC;QACxD,IAAI,IAAc,CAAC;QACnB,IAAI,CAAC;YACJ,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,SAAS;YACnI,IAAI,CAAC,OAAO,EAAE,8CAA8C,QAAQ,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACpI,SAAS;QACV,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YACpB,IAAI,CAAC,OAAO,EAAE,qCAAqC,QAAQ,6BAA6B,CAAC,CAAC;YAC1F,SAAS;QACV,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,GAAG,iCAAiC,EAAE,CAAC;YACnD,IAAI,CAAC,OAAO,EAAE,qCAAqC,QAAQ,+BAA+B,iCAAiC,SAAS,CAAC,CAAC;YACtI,SAAS;QACV,CAAC;QACD,IAAI,CAAC;YACJ,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3D,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACf,IAAI,CAAC,OAAO,EAAE,2CAA2C,QAAQ,IAAI,CAAC,CAAC;gBACvE,SAAS;YACV,CAAC;YACD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;YAChE,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACf,IAAI,CAAC,OAAO,EAAE,qCAAqC,QAAQ,8BAA8B,CAAC,CAAC;gBAC3F,SAAS;YACV,CAAC;YACD,OAAO,QAAQ,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,OAAO,EAAE,2CAA2C,QAAQ,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClI,CAAC;IACF,CAAC;IACD,OAAO,SAAS,CAAC;AAAA,CACjB;AAED,SAAS,2BAA2B,CAAC,WAAmB,EAAU;IACjE,MAAM,iBAAiB,GAAG,WAAW;SACnC,KAAK,CAAC,wBAAwB,CAAC;SAC/B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,MAAM,CAAC,CAAC;IACf,OAAO,iBAAiB;QACvB,CAAC,CAAC,GAAG,iBAAiB,OAAO,wBAAwB,EAAE;QACvD,CAAC,CAAC,wBAAwB,CAAC;AAAA,CAC5B;AAED,MAAM,UAAU,4BAA4B,CAAC,MAAM,GAAiD,EAAE,EAAE,OAAgC,EAAU;IACjJ,MAAM,IAAI,GAAG,0BAA0B,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzD,IAAI,WAAmB,CAAC;IACxB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACxB,WAAW,GAAG,iCAAiC,CAAC;IACjD,CAAC;SAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,MAAM,EAAE,CAAC;YACZ,WAAW,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,OAAO,EAAE,GAAG,4BAA4B,mFAAmF,CAAC,CAAC;YAClI,WAAW,GAAG,8BAA8B,CAAC;QAC9C,CAAC;IACF,CAAC;SAAM,CAAC;QACP,WAAW,GAAG,8BAA8B,CAAC;IAC9C,CAAC;IACD,OAAO,WAAW,CAAC;AAAA,CACnB","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { SUBAGENT_ASYNC_GUIDANCE } from \"../shared/async-guidance.ts\";\nimport type { ExtensionConfig, ToolDescriptionMode } from \"../shared/types.ts\";\nimport { getAgentDir, getProjectConfigDir } from \"../shared/utils.ts\";\n\nconst CUSTOM_TOOL_DESCRIPTION_FILE = \"subagent-tool-description.md\";\nconst CUSTOM_TOOL_DESCRIPTION_MAX_BYTES = 50 * 1024;\n\nexport const SUBAGENT_TIER_GUIDANCE = `TIER SELECTION:\n• Choose the lowest tier that can reliably complete the task.\n• light: Use for simple, straightforward tasks that require little reasoning. Good for quick checks, finding information, collecting facts for research, inspecting a small amount of code, or verifying a specific fact.\n• standard: Use for moderately difficult work and everyday coding tasks. Good for writing simple code, fixing a clearly described bug, reviewing a focused change, or completing work with clear requirements. Use heavy when the task requires deep architectural understanding or complex reasoning.\n• heavy: Use for complex or ambiguous tasks that require deep reasoning and strong code understanding. Good for implementing complex plans, debugging difficult or poorly understood problems, reviewing large or high-risk changes, and making architectural decisions.`;\n\nexport const SUBAGENT_COORDINATION_GUIDANCE = \"Define file ownership, local decision authority, and required outputs at launch. Establish shared contracts before dependent parallel work; use chains and artifacts to pass results. Native child intercom reaches the supervisor only, not siblings. Reserve parent relays for actionable exceptions, not routine progress or implementation approvals.\";\n\nexport const SUBAGENT_SAFETY_GUIDANCE = `SAFETY-CRITICAL SUBAGENT GUIDANCE:\n• Prompt children directly. There is no agent roster. Every execution task needs task (the full child prompt) and description (a concise UI label).\n• Every executable child chooses exactly one of tier: \"light\"|\"standard\"|\"heavy\" (default) or model: \"provider/id\" when the user names a model. Do not pass both, and do not use inherit. Missing, disabled, unconfigured, unavailable, or unauthenticated selections fail before launch.\n• Optional thinking (off/minimal/low/medium/high/xhigh/max) is only valid with an explicit model. Tier launches use the configured tier thinking level.\n${SUBAGENT_TIER_GUIDANCE}\n• permissions is \"full\" or \"read-only\". Omitted permissions means full. Plan-mode parents must pass permissions: \"read-only\"; full or omitted launches are rejected.\n• Keep execution and control separate: omit action for SINGLE/PARALLEL/CHAIN execution; use action only for status/interrupt/stop/resume/steer/append-step/doctor/watchdog.status|check|recommend-model/schedule*.\n• ${SUBAGENT_ASYNC_GUIDANCE}\n• Child-safety boundary: ordinary children are not orchestrators and must not run subagents. Only explicitly configured fanout children may use the child-safe subagent tool, still bounded by depth/session limits.\n• Writing/review safety: keep one full-access writer for the same cwd/worktree. Use fresh-context permissions: \"read-only\" children for independent review, then have the parent synthesize and apply fixes as the sole writer unless an isolated worktree was intentionally requested.\n• ${SUBAGENT_COORDINATION_GUIDANCE}\n• Artifacts/status essentials: chain outputs live under {chain_dir}; async runs expose asyncId/asyncDir with status.json, events.jsonl, output logs, and status via { action: \"status\", id }. Include output paths and residual risks when reporting results.`;\n\nexport const FULL_SUBAGENT_TOOL_DESCRIPTION = `Delegate work to generic children by prompting them directly. There are no named agent types.\n\nEXECUTION (use exactly ONE mode):\n• SINGLE: { task, description, tier|model, thinking?, permissions? } — one child. Multiple SINGLE calls in the same turn run concurrently; explicit concurrency/run limits still apply.\n• PARALLEL: { tasks: [{task, description, tier|model, thinking?, permissions?, count?, output?, reads?, progress?}, ...], concurrency?: number, worktree?: true } — one-call concurrent execution (default: all tasks at once; worktree: isolate each task in a git worktree)\n• CHAIN: { chain: [{task, description, tier|model, thinking?, permissions?}, {parallel:[{task, description, tier|model, thinking?, permissions?, count:3}]}] } — sequential pipeline with optional parallel fan-out. Use chain when a later child needs an earlier result.\n• description is required, single-line, max 80 characters. It is UI metadata only. task is the complete child prompt.\n• permissions: \"full\" (default) or \"read-only\". Full includes coding tools (read, search, shell, edit, write, web, LSP, MCP) and excludes parent-owned tools (cron, memory, behavior, goals, nested subagents). Plan-mode parents may launch only permissions: \"read-only\".\n• Model selection: pass tier by default (\"light\"|\"standard\"|\"heavy\"). Pass model: \"provider/id\" only when the user specifies a model. Exactly one of tier or model. Optional thinking only with model; tier uses configured thinking. Direct model launches do not require tier mode to be enabled. No inherit and no silent fallback for an explicit model.\n• Children always start with a fresh session (no inherited parent transcript).\n• Optional timeout: { timeoutMs } or { maxRuntimeMs } sets a run-level max runtime for foreground and async/background runs\n\nCHAIN TEMPLATE VARIABLES (use in task and description strings):\n• {task} - The original task/request from the user\n• {previous} - Text response from the previous step (empty for first step)\n• {chain_dir} - Shared directory for chain files (e.g., <tmpdir>/pi-subagents-<scope>/chain-runs/abc123/)\n\nCHAIN EXAMPLES:\n• Sequential: { chain: [{task:\"Analyze {task}\", description:\"Analyze request\", tier:\"standard\"}, {task:\"Plan based on {previous}\", description:\"Draft plan\", tier:\"heavy\"}] }\n• Parallel fan-out: { chain: [{parallel: [{task:\"Check part of {task}\", description:\"Check one part\", tier:\"light\", permissions:\"read-only\", count: 3}]}] }\n• Mixed: { chain: [{task:\"Research {task}\", description:\"Research request\", tier:\"standard\", permissions:\"read-only\"}, {parallel: [{task:\"Review {previous}\", description:\"Review findings\", tier:\"light\", permissions:\"read-only\", count: 2}]}, {task:\"Summarize {previous}\", description:\"Summarize reviews\", tier:\"standard\"}] }\n\nCONTROL (use action field, omit task/chain/tasks):\n• { action: \"watchdog.status\" | \"watchdog.check\" | \"watchdog.recommend-model\" } - inspect the opt-in subagent watchdog and its strong complementary model recommendation (read-only; there is no configure action)\n• { action: \"status\", id: \"...\" } - inspect an async/background run by id or prefix\n• { action: \"status\", view: \"fleet\" } - read-only active foreground/async fleet view with transcript commands\n• { action: \"status\", id: \"...\", view: \"transcript\", index?: 0, lines?: 80 } - tail a run or child output/session transcript\n• { action: \"interrupt\", id?: \"...\" } - soft-interrupt the current child turn and leave the run paused\n• { action: \"stop\", id: \"...\" } - stop a current-session top-level async run; stopped runs finish with state \"stopped\"\n• { action: \"resume\", id: \"...\", message: \"...\", index?: 0 } - interrupt then follow up with a live async child, or revive a completed async/foreground child from its session\n• { action: \"steer\", id: \"...\", message: \"...\", index?: 0 } - await correlated child input acceptance for up to 3 seconds; returns delivered, scheduled, pending, partial, recovered, or failed with a request id. Only top-level single runs may recover after a further 15-second pause/revival bound; chain, parallel, and nested runs never auto-interrupt.\n• subagent_supervisor({ action: \"ask\", id, reason, message, index?, childId? }) - ask one running async child; returns question id immediately. Ask only when the child owns missing context, the answer changes a concrete next decision, and waiting risks block/rework. No broadcast, revive, task replacement, status polling, or micromanagement.\n• subagent_wait({ questionId }) - wait for that supervisor question answer/expiry/cancel. Answers stay separate from final run results.\n• { action: \"append-step\", id: \"...\", chain: [{task:\"Use {previous}\", description:\"Follow-up step\", tier:\"standard\"}] } - append one step to the tail of a running async chain\n\nSCHEDULE (opt-in; requires { \"scheduledRuns\": { \"enabled\": true } } in config.json):\n• { action: \"schedule\", task, description, tier|model, thinking?, permissions?, schedule: \"+10m\" | \"2030-01-01T09:00:00Z\", scheduleName? } - defer a child launch until a future time. Also accepts tasks[] or chain[]. Scheduled runs always launch async with fresh context; they become normal tracked async runs once they fire. Only schedule explicit delayed runs the user asked for.\n• { action: \"schedule-list\" } - list scheduled runs for this session\n• { action: \"schedule-status\", id: \"...\" } - inspect one scheduled run\n• { action: \"schedule-cancel\", id: \"...\" } - cancel a scheduled run before it fires\n\nDIAGNOSTICS:\n• { action: \"doctor\" } - read-only report for runtime paths, sessions, and intercom\n\n${SUBAGENT_SAFETY_GUIDANCE}`;\n\nexport const COMPACT_SUBAGENT_TOOL_DESCRIPTION = `Delegate to generic children by prompting them. Use exactly one mode per call.\n\nEXECUTE:\n• SINGLE {task, description, tier|model, thinking?, permissions?} (same-turn singles overlap); PARALLEL {tasks:[{task,description,tier|model,thinking?,permissions?,count?,output?,reads?,progress?}], concurrency?, worktree?}; CHAIN {chain:[{task,description,tier|model,thinking?,permissions?},{parallel:[...]}]} for sequential work.\n• description is required (single-line, max 80 chars, UI only). task is the full child prompt. permissions omitted = full. Plan-mode parents must pass permissions:\"read-only\".\n• Exactly one of tier:\"light\"|\"standard\"|\"heavy\" (default) or model:\"provider/id\" when the user names a model. thinking only with model. No inherit; fail closed on unavailable selections. Children always start fresh. timeoutMs/maxRuntimeMs apply to foreground and async/background runs.\n${SUBAGENT_TIER_GUIDANCE}\n• ${SUBAGENT_COORDINATION_GUIDANCE}\n• Chain templates may use {task}, {previous}, {chain_dir}, and named outputs. Parallel worktree isolation requires a clean git repo.\n• Chain example: { chain: [{task:\"Analyze {task}\", description:\"Analyze request\", tier:\"standard\"}, {parallel: [{task:\"Check {previous}\", description:\"Check prior result\", tier:\"light\", permissions:\"read-only\", count: 3}]}] }\n\nCONTROL:\n• Use action without execution fields: doctor, watchdog.status, watchdog.check, watchdog.recommend-model, status, interrupt, stop, resume, steer, append-step.\n• Async control actions: status, interrupt, stop, resume, steer, append-step. Use stop with an id for current-session top-level async runs. Use status view:\"fleet\" for active-run overview, view:\"transcript\" to tail child output, and steer for acknowledged live guidance. Steering delivery means lunR accepted the correlated user input, not model compliance; use index for a specific child.\n• Opt-in schedule actions: schedule, schedule-list, schedule-status, schedule-cancel. Schedule only explicit delayed runs the user asked for.\n\nASYNC / WAIT:\n• ${SUBAGENT_ASYNC_GUIDANCE}\n• Status and artifacts live under asyncId/asyncDir with status.json, events.jsonl, output logs, session files, and { action:\"status\", id:\"...\" }.\n\nSAFETY:\n• Ordinary children are not orchestrators and must not run subagents. Only explicit fanout children may use child-safe subagent, still bounded by depth/session limits.\n• Keep one full-access writer per cwd/worktree. Use fresh permissions:\"read-only\" review/validation fanout, then synthesize and apply fixes from the parent unless isolated worktrees were intentionally requested.`;\n\nfunction isToolDescriptionMode(value: unknown): value is ToolDescriptionMode {\n\treturn value === \"full\" || value === \"compact\" || value === \"custom\";\n}\n\nfunction warn(options: ToolDescriptionOptions | undefined, message: string): void {\n\t(options?.warn ?? console.warn)(`[pi-subagents] ${message}`);\n}\n\nexport interface ToolDescriptionOptions {\n\tcwd?: string;\n\tagentDir?: string;\n\twarn?: (message: string) => void;\n}\n\nexport function resolveToolDescriptionMode(config: Pick<ExtensionConfig, \"toolDescriptionMode\">, options?: ToolDescriptionOptions): ToolDescriptionMode {\n\tconst mode = config.toolDescriptionMode;\n\tif (mode === undefined) return \"full\";\n\tif (isToolDescriptionMode(mode)) return mode;\n\twarn(options, `Ignoring invalid toolDescriptionMode ${JSON.stringify(mode)}; expected \"full\", \"compact\", or \"custom\".`);\n\treturn \"full\";\n}\n\nfunction customDescriptionPaths(options?: ToolDescriptionOptions): string[] {\n\tconst cwd = options?.cwd ?? process.cwd();\n\tconst agentDir = options?.agentDir ?? getAgentDir();\n\treturn [\n\t\tpath.join(getProjectConfigDir(cwd), CUSTOM_TOOL_DESCRIPTION_FILE),\n\t\tpath.join(agentDir, CUSTOM_TOOL_DESCRIPTION_FILE),\n\t];\n}\n\nfunction renderCustomTemplate(template: string, options?: ToolDescriptionOptions): string {\n\tconst cwd = options?.cwd ?? process.cwd();\n\tconst agentDir = options?.agentDir ?? getAgentDir();\n\tconst projectConfigDir = getProjectConfigDir(cwd);\n\tconst variables: Record<string, () => string> = {\n\t\tfullDescription: () => FULL_SUBAGENT_TOOL_DESCRIPTION,\n\t\tfull: () => FULL_SUBAGENT_TOOL_DESCRIPTION,\n\t\tcompactDescription: () => COMPACT_SUBAGENT_TOOL_DESCRIPTION,\n\t\tcompact: () => COMPACT_SUBAGENT_TOOL_DESCRIPTION,\n\t\tsafetyGuidance: () => SUBAGENT_SAFETY_GUIDANCE,\n\t\tsafety: () => SUBAGENT_SAFETY_GUIDANCE,\n\t\tagentDir: () => agentDir,\n\t\tprojectConfigDir: () => projectConfigDir,\n\t};\n\treturn template.replace(/\\{\\{(\\w+)\\}\\}/g, (raw, name: string) => {\n\t\tconst replacement = variables[name];\n\t\tif (replacement) return replacement();\n\t\twarn(options, `${CUSTOM_TOOL_DESCRIPTION_FILE}: unknown placeholder ${raw} left unchanged.`);\n\t\treturn raw;\n\t});\n}\n\nfunction loadCustomToolDescription(options?: ToolDescriptionOptions): string | undefined {\n\tfor (const filePath of customDescriptionPaths(options)) {\n\t\tlet stat: fs.Stats;\n\t\ttry {\n\t\t\tstat = fs.statSync(filePath);\n\t\t} catch (error) {\n\t\t\tif (typeof error === \"object\" && error !== null && \"code\" in error && (error as NodeJS.ErrnoException).code === \"ENOENT\") continue;\n\t\t\twarn(options, `Failed to inspect custom tool description '${filePath}': ${error instanceof Error ? error.message : String(error)}`);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!stat.isFile()) {\n\t\t\twarn(options, `Ignoring custom tool description '${filePath}' because it is not a file.`);\n\t\t\tcontinue;\n\t\t}\n\t\tif (stat.size > CUSTOM_TOOL_DESCRIPTION_MAX_BYTES) {\n\t\t\twarn(options, `Ignoring custom tool description '${filePath}' because it is larger than ${CUSTOM_TOOL_DESCRIPTION_MAX_BYTES} bytes.`);\n\t\t\tcontinue;\n\t\t}\n\t\ttry {\n\t\t\tconst template = fs.readFileSync(filePath, \"utf-8\").trim();\n\t\t\tif (!template) {\n\t\t\t\twarn(options, `Ignoring empty custom tool description '${filePath}'.`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst rendered = renderCustomTemplate(template, options).trim();\n\t\t\tif (!rendered) {\n\t\t\t\twarn(options, `Ignoring custom tool description '${filePath}' because it rendered empty.`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\treturn rendered;\n\t\t} catch (error) {\n\t\t\twarn(options, `Failed to read custom tool description '${filePath}': ${error instanceof Error ? error.message : String(error)}`);\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction withMandatorySafetyGuidance(description: string): string {\n\tconst customDescription = description\n\t\t.split(SUBAGENT_SAFETY_GUIDANCE)\n\t\t.map((part) => part.trim())\n\t\t.filter(Boolean)\n\t\t.join(\"\\n\\n\");\n\treturn customDescription\n\t\t? `${customDescription}\\n\\n${SUBAGENT_SAFETY_GUIDANCE}`\n\t\t: SUBAGENT_SAFETY_GUIDANCE;\n}\n\nexport function buildSubagentToolDescription(config: Pick<ExtensionConfig, \"toolDescriptionMode\"> = {}, options?: ToolDescriptionOptions): string {\n\tconst mode = resolveToolDescriptionMode(config, options);\n\tlet description: string;\n\tif (mode === \"compact\") {\n\t\tdescription = COMPACT_SUBAGENT_TOOL_DESCRIPTION;\n\t} else if (mode === \"custom\") {\n\t\tconst custom = loadCustomToolDescription(options);\n\t\tif (custom) {\n\t\t\tdescription = withMandatorySafetyGuidance(custom);\n\t\t} else {\n\t\t\twarn(options, `${CUSTOM_TOOL_DESCRIPTION_FILE} was not found or valid for toolDescriptionMode \"custom\"; using full description.`);\n\t\t\tdescription = FULL_SUBAGENT_TOOL_DESCRIPTION;\n\t\t}\n\t} else {\n\t\tdescription = FULL_SUBAGENT_TOOL_DESCRIPTION;\n\t}\n\treturn description;\n}\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { SubagentState } from "../shared/types.ts";
|
|
2
|
+
export declare const SUPERVISOR_PROTOCOL_ENV = "PI_SUBAGENT_SUPERVISOR_PROTOCOL";
|
|
3
|
+
export declare const CHILD_DESCRIPTION_ENV = "PI_SUBAGENT_CHILD_DESCRIPTION";
|
|
4
|
+
export declare const SUPERVISOR_PROTOCOL_VERSION = 2;
|
|
5
|
+
export declare const SUPERVISOR_REQUEST_TYPE = "subagent_supervisor_request";
|
|
6
|
+
export declare const SUPERVISOR_PROGRESS_TYPE = "subagent_supervisor_progress";
|
|
7
|
+
export interface SubagentCommunication {
|
|
8
|
+
direction: "from" | "to";
|
|
9
|
+
peer: string;
|
|
10
|
+
message: string;
|
|
11
|
+
kind: "request" | "interview" | "progress" | "handoff" | "question" | "reply" | "answer" | "steer";
|
|
12
|
+
}
|
|
13
|
+
export declare function readCommunication(value: unknown): SubagentCommunication | undefined;
|
|
14
|
+
export declare function supervisorProtocolAvailable(): boolean;
|
|
15
|
+
export declare function resolveCommunicationPeer(state: SubagentState, runId: string, childIndex: number, childId?: string, fallback?: string): string;
|
|
16
|
+
export declare function legacySupervisorBody(content: string): string;
|
|
17
|
+
//# sourceMappingURL=communication.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"communication.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/intercom/communication.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD,eAAO,MAAM,uBAAuB,oCAAoC,CAAC;AACzE,eAAO,MAAM,qBAAqB,kCAAkC,CAAC;AACrE,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAC7C,eAAO,MAAM,uBAAuB,gCAAgC,CAAC;AACrE,eAAO,MAAM,wBAAwB,iCAAiC,CAAC;AAEvE,MAAM,WAAW,qBAAqB;IACrC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC;CACnG;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,GAAG,qBAAqB,GAAG,SAAS,CAOnF;AAED,wBAAgB,2BAA2B,IAAI,OAAO,CAErD;AAED,wBAAgB,wBAAwB,CACvC,KAAK,EAAE,aAAa,EACpB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,MAAM,EAChB,QAAQ,CAAC,EAAE,MAAM,GACf,MAAM,CAiBR;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAK5D","sourcesContent":["import type { SubagentState } from \"../shared/types.ts\";\n\nexport const SUPERVISOR_PROTOCOL_ENV = \"PI_SUBAGENT_SUPERVISOR_PROTOCOL\";\nexport const CHILD_DESCRIPTION_ENV = \"PI_SUBAGENT_CHILD_DESCRIPTION\";\nexport const SUPERVISOR_PROTOCOL_VERSION = 2;\nexport const SUPERVISOR_REQUEST_TYPE = \"subagent_supervisor_request\";\nexport const SUPERVISOR_PROGRESS_TYPE = \"subagent_supervisor_progress\";\n\nexport interface SubagentCommunication {\n\tdirection: \"from\" | \"to\";\n\tpeer: string;\n\tmessage: string;\n\tkind: \"request\" | \"interview\" | \"progress\" | \"handoff\" | \"question\" | \"reply\" | \"answer\" | \"steer\";\n}\n\nexport function readCommunication(value: unknown): SubagentCommunication | undefined {\n\tif (!value || typeof value !== \"object\") return undefined;\n\tconst input = value as Partial<SubagentCommunication>;\n\tif (input.direction !== \"from\" && input.direction !== \"to\") return undefined;\n\tif (typeof input.peer !== \"string\" || typeof input.message !== \"string\") return undefined;\n\tif (![\"request\", \"interview\", \"progress\", \"handoff\", \"question\", \"reply\", \"answer\", \"steer\"].includes(input.kind ?? \"\")) return undefined;\n\treturn input as SubagentCommunication;\n}\n\nexport function supervisorProtocolAvailable(): boolean {\n\treturn process.env[SUPERVISOR_PROTOCOL_ENV] === String(SUPERVISOR_PROTOCOL_VERSION);\n}\n\nexport function resolveCommunicationPeer(\n\tstate: SubagentState,\n\trunId: string,\n\tchildIndex: number,\n\tchildId?: string,\n\tfallback?: string,\n): string {\n\tconst job = state.asyncJobs.get(runId) ?? state.fleetJobs?.get(runId);\n\tconst step = job?.steps?.find((candidate, index) =>\n\t\t(candidate.index ?? index) === childIndex && (!childId || (candidate.childId ?? candidate.agent) === childId),\n\t);\n\tconst label = step?.description ?? (step?.agent !== childId ? step?.agent : undefined);\n\tif (label) {\n\t\tconst duplicates = job?.steps?.filter((candidate) => (candidate.description ?? candidate.agent) === label).length ?? 0;\n\t\treturn duplicates > 1 ? `${label} · ${childIndex + 1}` : label;\n\t}\n\tconst foreground = state.foregroundControls.get(runId);\n\tif (foreground?.currentIndex === childIndex && (!childId || foreground.currentChildId === childId)) {\n\t\tif (foreground.currentAgent && foreground.currentAgent !== childId) return foreground.currentAgent;\n\t}\n\tconst remembered = state.foregroundRuns?.get(runId)?.children.find((child) => child.index === childIndex);\n\tif (remembered?.agent && remembered.agent !== childId) return remembered.agent;\n\treturn fallback?.trim() || `Subagent ${childIndex + 1}`;\n}\n\nexport function legacySupervisorBody(content: string): string {\n\treturn content\n\t\t.replace(/^Subagent (?:progress update\\.|needs a supervisor decision\\.|requests a structured supervisor interview\\.)\\r?\\nRun: [^\\n]*\\r?\\nAgent: [^\\n]*\\r?\\nChild index: [^\\n]*\\r?\\n(?:Child intercom target: [^\\n]*\\r?\\n)?\\r?\\n/, \"\")\n\t\t.replace(/^Subagent answer \\([^\\n]*\\)\\r?\\nRun: [^\\n]*\\r?\\nChild: [^\\n]*\\r?\\nDecision: [^\\n]*\\r?\\n\\r?\\n/, \"\")\n\t\t.replace(/\\r?\\n\\r?\\nReply with: subagent_supervisor\\([^\\n]*\\)\\s*$/, \"\");\n}\n"]}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export const SUPERVISOR_PROTOCOL_ENV = "PI_SUBAGENT_SUPERVISOR_PROTOCOL";
|
|
2
|
+
export const CHILD_DESCRIPTION_ENV = "PI_SUBAGENT_CHILD_DESCRIPTION";
|
|
3
|
+
export const SUPERVISOR_PROTOCOL_VERSION = 2;
|
|
4
|
+
export const SUPERVISOR_REQUEST_TYPE = "subagent_supervisor_request";
|
|
5
|
+
export const SUPERVISOR_PROGRESS_TYPE = "subagent_supervisor_progress";
|
|
6
|
+
export function readCommunication(value) {
|
|
7
|
+
if (!value || typeof value !== "object")
|
|
8
|
+
return undefined;
|
|
9
|
+
const input = value;
|
|
10
|
+
if (input.direction !== "from" && input.direction !== "to")
|
|
11
|
+
return undefined;
|
|
12
|
+
if (typeof input.peer !== "string" || typeof input.message !== "string")
|
|
13
|
+
return undefined;
|
|
14
|
+
if (!["request", "interview", "progress", "handoff", "question", "reply", "answer", "steer"].includes(input.kind ?? ""))
|
|
15
|
+
return undefined;
|
|
16
|
+
return input;
|
|
17
|
+
}
|
|
18
|
+
export function supervisorProtocolAvailable() {
|
|
19
|
+
return process.env[SUPERVISOR_PROTOCOL_ENV] === String(SUPERVISOR_PROTOCOL_VERSION);
|
|
20
|
+
}
|
|
21
|
+
export function resolveCommunicationPeer(state, runId, childIndex, childId, fallback) {
|
|
22
|
+
const job = state.asyncJobs.get(runId) ?? state.fleetJobs?.get(runId);
|
|
23
|
+
const step = job?.steps?.find((candidate, index) => (candidate.index ?? index) === childIndex && (!childId || (candidate.childId ?? candidate.agent) === childId));
|
|
24
|
+
const label = step?.description ?? (step?.agent !== childId ? step?.agent : undefined);
|
|
25
|
+
if (label) {
|
|
26
|
+
const duplicates = job?.steps?.filter((candidate) => (candidate.description ?? candidate.agent) === label).length ?? 0;
|
|
27
|
+
return duplicates > 1 ? `${label} · ${childIndex + 1}` : label;
|
|
28
|
+
}
|
|
29
|
+
const foreground = state.foregroundControls.get(runId);
|
|
30
|
+
if (foreground?.currentIndex === childIndex && (!childId || foreground.currentChildId === childId)) {
|
|
31
|
+
if (foreground.currentAgent && foreground.currentAgent !== childId)
|
|
32
|
+
return foreground.currentAgent;
|
|
33
|
+
}
|
|
34
|
+
const remembered = state.foregroundRuns?.get(runId)?.children.find((child) => child.index === childIndex);
|
|
35
|
+
if (remembered?.agent && remembered.agent !== childId)
|
|
36
|
+
return remembered.agent;
|
|
37
|
+
return fallback?.trim() || `Subagent ${childIndex + 1}`;
|
|
38
|
+
}
|
|
39
|
+
export function legacySupervisorBody(content) {
|
|
40
|
+
return content
|
|
41
|
+
.replace(/^Subagent (?:progress update\.|needs a supervisor decision\.|requests a structured supervisor interview\.)\r?\nRun: [^\n]*\r?\nAgent: [^\n]*\r?\nChild index: [^\n]*\r?\n(?:Child intercom target: [^\n]*\r?\n)?\r?\n/, "")
|
|
42
|
+
.replace(/^Subagent answer \([^\n]*\)\r?\nRun: [^\n]*\r?\nChild: [^\n]*\r?\nDecision: [^\n]*\r?\n\r?\n/, "")
|
|
43
|
+
.replace(/\r?\n\r?\nReply with: subagent_supervisor\([^\n]*\)\s*$/, "");
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=communication.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"communication.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/intercom/communication.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,uBAAuB,GAAG,iCAAiC,CAAC;AACzE,MAAM,CAAC,MAAM,qBAAqB,GAAG,+BAA+B,CAAC;AACrE,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC;AAC7C,MAAM,CAAC,MAAM,uBAAuB,GAAG,6BAA6B,CAAC;AACrE,MAAM,CAAC,MAAM,wBAAwB,GAAG,8BAA8B,CAAC;AASvE,MAAM,UAAU,iBAAiB,CAAC,KAAc,EAAqC;IACpF,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC1D,MAAM,KAAK,GAAG,KAAuC,CAAC;IACtD,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI;QAAE,OAAO,SAAS,CAAC;IAC7E,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IAC1F,IAAI,CAAC,CAAC,SAAS,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,IAAI,EAAE,CAAC;QAAE,OAAO,SAAS,CAAC;IAC1I,OAAO,KAA8B,CAAC;AAAA,CACtC;AAED,MAAM,UAAU,2BAA2B,GAAY;IACtD,OAAO,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,KAAK,MAAM,CAAC,2BAA2B,CAAC,CAAC;AAAA,CACpF;AAED,MAAM,UAAU,wBAAwB,CACvC,KAAoB,EACpB,KAAa,EACb,UAAkB,EAClB,OAAgB,EAChB,QAAiB,EACR;IACT,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;IACtE,MAAM,IAAI,GAAG,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAClD,CAAC,SAAS,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,UAAU,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,OAAO,CAAC,CAC7G,CAAC;IACF,MAAM,KAAK,GAAG,IAAI,EAAE,WAAW,IAAI,CAAC,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACvF,IAAI,KAAK,EAAE,CAAC;QACX,MAAM,UAAU,GAAG,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,WAAW,IAAI,SAAS,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC;QACvH,OAAO,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,OAAM,UAAU,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IAChE,CAAC;IACD,MAAM,UAAU,GAAG,KAAK,CAAC,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACvD,IAAI,UAAU,EAAE,YAAY,KAAK,UAAU,IAAI,CAAC,CAAC,OAAO,IAAI,UAAU,CAAC,cAAc,KAAK,OAAO,CAAC,EAAE,CAAC;QACpG,IAAI,UAAU,CAAC,YAAY,IAAI,UAAU,CAAC,YAAY,KAAK,OAAO;YAAE,OAAO,UAAU,CAAC,YAAY,CAAC;IACpG,CAAC;IACD,MAAM,UAAU,GAAG,KAAK,CAAC,cAAc,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,KAAK,KAAK,UAAU,CAAC,CAAC;IAC1G,IAAI,UAAU,EAAE,KAAK,IAAI,UAAU,CAAC,KAAK,KAAK,OAAO;QAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAC/E,OAAO,QAAQ,EAAE,IAAI,EAAE,IAAI,YAAY,UAAU,GAAG,CAAC,EAAE,CAAC;AAAA,CACxD;AAED,MAAM,UAAU,oBAAoB,CAAC,OAAe,EAAU;IAC7D,OAAO,OAAO;SACZ,OAAO,CAAC,uNAAuN,EAAE,EAAE,CAAC;SACpO,OAAO,CAAC,8FAA8F,EAAE,EAAE,CAAC;SAC3G,OAAO,CAAC,yDAAyD,EAAE,EAAE,CAAC,CAAC;AAAA,CACzE","sourcesContent":["import type { SubagentState } from \"../shared/types.ts\";\n\nexport const SUPERVISOR_PROTOCOL_ENV = \"PI_SUBAGENT_SUPERVISOR_PROTOCOL\";\nexport const CHILD_DESCRIPTION_ENV = \"PI_SUBAGENT_CHILD_DESCRIPTION\";\nexport const SUPERVISOR_PROTOCOL_VERSION = 2;\nexport const SUPERVISOR_REQUEST_TYPE = \"subagent_supervisor_request\";\nexport const SUPERVISOR_PROGRESS_TYPE = \"subagent_supervisor_progress\";\n\nexport interface SubagentCommunication {\n\tdirection: \"from\" | \"to\";\n\tpeer: string;\n\tmessage: string;\n\tkind: \"request\" | \"interview\" | \"progress\" | \"handoff\" | \"question\" | \"reply\" | \"answer\" | \"steer\";\n}\n\nexport function readCommunication(value: unknown): SubagentCommunication | undefined {\n\tif (!value || typeof value !== \"object\") return undefined;\n\tconst input = value as Partial<SubagentCommunication>;\n\tif (input.direction !== \"from\" && input.direction !== \"to\") return undefined;\n\tif (typeof input.peer !== \"string\" || typeof input.message !== \"string\") return undefined;\n\tif (![\"request\", \"interview\", \"progress\", \"handoff\", \"question\", \"reply\", \"answer\", \"steer\"].includes(input.kind ?? \"\")) return undefined;\n\treturn input as SubagentCommunication;\n}\n\nexport function supervisorProtocolAvailable(): boolean {\n\treturn process.env[SUPERVISOR_PROTOCOL_ENV] === String(SUPERVISOR_PROTOCOL_VERSION);\n}\n\nexport function resolveCommunicationPeer(\n\tstate: SubagentState,\n\trunId: string,\n\tchildIndex: number,\n\tchildId?: string,\n\tfallback?: string,\n): string {\n\tconst job = state.asyncJobs.get(runId) ?? state.fleetJobs?.get(runId);\n\tconst step = job?.steps?.find((candidate, index) =>\n\t\t(candidate.index ?? index) === childIndex && (!childId || (candidate.childId ?? candidate.agent) === childId),\n\t);\n\tconst label = step?.description ?? (step?.agent !== childId ? step?.agent : undefined);\n\tif (label) {\n\t\tconst duplicates = job?.steps?.filter((candidate) => (candidate.description ?? candidate.agent) === label).length ?? 0;\n\t\treturn duplicates > 1 ? `${label} · ${childIndex + 1}` : label;\n\t}\n\tconst foreground = state.foregroundControls.get(runId);\n\tif (foreground?.currentIndex === childIndex && (!childId || foreground.currentChildId === childId)) {\n\t\tif (foreground.currentAgent && foreground.currentAgent !== childId) return foreground.currentAgent;\n\t}\n\tconst remembered = state.foregroundRuns?.get(runId)?.children.find((child) => child.index === childIndex);\n\tif (remembered?.agent && remembered.agent !== childId) return remembered.agent;\n\treturn fallback?.trim() || `Subagent ${childIndex + 1}`;\n}\n\nexport function legacySupervisorBody(content: string): string {\n\treturn content\n\t\t.replace(/^Subagent (?:progress update\\.|needs a supervisor decision\\.|requests a structured supervisor interview\\.)\\r?\\nRun: [^\\n]*\\r?\\nAgent: [^\\n]*\\r?\\nChild index: [^\\n]*\\r?\\n(?:Child intercom target: [^\\n]*\\r?\\n)?\\r?\\n/, \"\")\n\t\t.replace(/^Subagent answer \\([^\\n]*\\)\\r?\\nRun: [^\\n]*\\r?\\nChild: [^\\n]*\\r?\\nDecision: [^\\n]*\\r?\\n\\r?\\n/, \"\")\n\t\t.replace(/\\r?\\n\\r?\\nReply with: subagent_supervisor\\([^\\n]*\\)\\s*$/, \"\");\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intercom-bridge.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAwB,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAGpG,eAAO,MAAM,6BAA6B,2CAA2C,CAAC;AAWtF,eAAO,MAAM,sBAAsB,oCAAoC,CAAC;AAaxE,MAAM,WAAW,mBAAmB;IACnC,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,kBAAkB,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,wBAAwB;IACxC,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,kBAAkB,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,0BAA0B,EAAE,OAAO,CAAC;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,0BAA0B;IACnC,MAAM,EAAE,eAAe,CAAC,gBAAgB,CAAC,CAAC;IAC1C,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IACtC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAKvG;AAMD,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAGlG;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,CAG5E;AA2CD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,0BAA0B,GAAG,wBAAwB,CAelG;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,0BAA0B,GAAG,mBAAmB,CAqB5F;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,mBAAmB,GAAG,kBAAkB,CAqBrH","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { ChildRuntimeConfig } from \"../shared/types.ts\";\nimport type { ExtensionConfig, IntercomBridgeConfig, IntercomBridgeMode } from \"../shared/types.ts\";\nimport { getAgentDir } from \"../shared/utils.ts\";\n\nexport const NATIVE_INTERCOM_EXTENSION_DIR = \"native:pi-subagents-supervisor-channel\";\n\nfunction defaultAgentDir(): string {\n\treturn getAgentDir();\n}\n\nfunction defaultSubagentConfigDir(agentDir = defaultAgentDir()): string {\n\treturn path.join(agentDir, \"extensions\", \"subagent\");\n}\n\nconst DEFAULT_INTERCOM_TARGET_PREFIX = \"subagent-chat\";\nexport const INTERCOM_BRIDGE_MARKER = \"Intercom orchestration channel:\";\nconst DEFAULT_INTERCOM_BRIDGE_TEMPLATE = `The inherited thread is reference-only. Do not continue that conversation or send questions, status updates, or completion handoffs to the supervisor in normal assistant text.\n\nUse contact_supervisor first. It resolves the supervisor session \"{orchestratorTarget}\" and run metadata automatically.\n- Need a decision, blocked, approval, or product/API/scope ambiguity: contact_supervisor({ reason: \"need_decision\", message: \"<question>\" })\n- Need structured supervisor input rather than a freeform reply: contact_supervisor({ reason: \"interview_request\", message: \"<what input is needed>\", interview: { title: \"...\", questions: [] } })\n- After contact_supervisor with reason \"need_decision\" or \"interview_request\", stay alive and continue only after the reply arrives. Do not finish your final response with a choose-one question.\n- Do not ask for clarification when the only conflict is review-only/no-edit versus progress-writing or artifact-writing instructions. If an output path is configured but no write-capable tool is available, return the complete artifact in your final response; the runtime will persist it. Do not contact the supervisor merely because you cannot write that output path directly.\n- Meaningful progress or unexpected discoveries that change the plan: contact_supervisor({ reason: \"progress_update\", message: \"UPDATE: <summary>\" })\n- Generic intercom is lower-level plumbing/fallback only: intercom({ action: \"ask\", to: \"{orchestratorTarget}\", message: \"<question>\" })\n\nDo not use contact_supervisor or intercom for routine completion handoffs. If no coordination is needed, return a focused task result.`;\n\nexport interface IntercomBridgeState {\n\tactive: boolean;\n\tmode: IntercomBridgeMode;\n\torchestratorTarget?: string;\n\textensionDir: string;\n\tinstruction: string;\n}\n\nexport interface IntercomBridgeDiagnostic {\n\tactive: boolean;\n\tmode: IntercomBridgeMode;\n\twantsIntercom: boolean;\n\tsupervisorChannelAvailable: boolean;\n\textensionDir: string;\n\torchestratorTarget?: string;\n\treason?: string;\n}\n\ninterface ResolveIntercomBridgeInput {\n\tconfig: ExtensionConfig[\"intercomBridge\"];\n\tcontext: \"fresh\" | \"fork\" | undefined;\n\torchestratorTarget?: string;\n\tsettingsDir?: string;\n\tagentDir?: string;\n}\n\nexport function resolveIntercomSessionTarget(sessionName: string | undefined, sessionId: string): string {\n\tconst trimmedName = sessionName?.trim();\n\tif (trimmedName) return trimmedName;\n\tconst normalizedSessionId = sessionId.startsWith(\"session-\") ? sessionId.slice(\"session-\".length) : sessionId;\n\treturn `${DEFAULT_INTERCOM_TARGET_PREFIX}-${normalizedSessionId.slice(0, 8)}`;\n}\n\nfunction sanitizeIntercomTargetPart(value: string): string {\n\treturn value.trim().toLowerCase().replace(/[^a-z0-9_-]+/g, \"-\").replace(/^-+|-+$/g, \"\") || \"agent\";\n}\n\nexport function resolveSubagentIntercomTarget(runId: string, agent: string, index?: number): string {\n\tconst stepSuffix = index !== undefined ? `-${index + 1}` : \"\";\n\treturn `subagent-${sanitizeIntercomTargetPart(agent)}-${sanitizeIntercomTargetPart(runId)}${stepSuffix}`;\n}\n\nexport function resolveIntercomBridgeMode(value: unknown): IntercomBridgeMode {\n\tif (value === \"off\" || value === \"always\" || value === \"fork-only\") return value;\n\treturn \"always\";\n}\n\nfunction resolveIntercomBridgeConfig(value: ExtensionConfig[\"intercomBridge\"]): Required<IntercomBridgeConfig> {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) {\n\t\treturn { mode: \"always\", instructionFile: \"\" };\n\t}\n\treturn {\n\t\tmode: resolveIntercomBridgeMode(value.mode),\n\t\tinstructionFile: typeof value.instructionFile === \"string\" ? value.instructionFile : \"\",\n\t};\n}\n\nfunction expandTilde(filePath: string): string {\n\treturn filePath.startsWith(\"~/\") ? path.join(os.homedir(), filePath.slice(2)) : filePath;\n}\n\nfunction resolveInstructionTemplate(instructionFile: string, settingsDir: string): string {\n\tif (!instructionFile) return DEFAULT_INTERCOM_BRIDGE_TEMPLATE;\n\tconst expandedPath = expandTilde(instructionFile);\n\tconst resolvedPath = path.isAbsolute(expandedPath)\n\t\t? expandedPath\n\t\t: path.resolve(settingsDir, expandedPath);\n\ttry {\n\t\treturn fs.readFileSync(resolvedPath, \"utf-8\");\n\t} catch (error) {\n\t\tconsole.warn(`Failed to read intercom bridge instructionFile at '${resolvedPath}'. Using default instructions.`, error);\n\t\treturn DEFAULT_INTERCOM_BRIDGE_TEMPLATE;\n\t}\n}\n\nfunction buildIntercomBridgeInstruction(orchestratorTarget: string, template: string): string {\n\tconst instruction = template.replaceAll(\"{orchestratorTarget}\", orchestratorTarget).trim();\n\tif (instruction.startsWith(INTERCOM_BRIDGE_MARKER)) return instruction;\n\treturn `${INTERCOM_BRIDGE_MARKER}\\n${instruction}`;\n}\n\nfunction inactiveReason(mode: IntercomBridgeMode, context: \"fresh\" | \"fork\" | undefined, orchestratorTarget: string | undefined): string | undefined {\n\tif (mode === \"off\") return \"bridge mode is off\";\n\tif (mode === \"fork-only\" && context !== \"fork\") return \"bridge mode is fork-only and context is not fork\";\n\tif (!orchestratorTarget) return \"orchestrator target is not available\";\n\treturn undefined;\n}\n\nexport function diagnoseIntercomBridge(input: ResolveIntercomBridgeInput): IntercomBridgeDiagnostic {\n\tconst config = resolveIntercomBridgeConfig(input.config);\n\tconst mode = config.mode;\n\tconst orchestratorTarget = input.orchestratorTarget?.trim();\n\tconst wantsIntercom = mode !== \"off\" && !(mode === \"fork-only\" && input.context !== \"fork\");\n\tconst reason = inactiveReason(mode, input.context, orchestratorTarget);\n\treturn {\n\t\tactive: reason === undefined,\n\t\tmode,\n\t\twantsIntercom,\n\t\tsupervisorChannelAvailable: true,\n\t\textensionDir: NATIVE_INTERCOM_EXTENSION_DIR,\n\t\t...(orchestratorTarget ? { orchestratorTarget } : {}),\n\t\t...(reason ? { reason } : {}),\n\t};\n}\n\nexport function resolveIntercomBridge(input: ResolveIntercomBridgeInput): IntercomBridgeState {\n\tconst config = resolveIntercomBridgeConfig(input.config);\n\tconst mode = config.mode;\n\tconst orchestratorTarget = input.orchestratorTarget?.trim();\n\tconst agentDir = path.resolve(input.agentDir ?? defaultAgentDir());\n\tconst settingsDir = path.resolve(input.settingsDir ?? defaultSubagentConfigDir(agentDir));\n\tconst defaultInstruction = buildIntercomBridgeInstruction(\n\t\torchestratorTarget || \"{orchestratorTarget}\",\n\t\tDEFAULT_INTERCOM_BRIDGE_TEMPLATE,\n\t);\n\tconst reason = inactiveReason(mode, input.context, orchestratorTarget);\n\tif (reason || !orchestratorTarget) {\n\t\treturn { active: false, mode, extensionDir: NATIVE_INTERCOM_EXTENSION_DIR, instruction: defaultInstruction };\n\t}\n\treturn {\n\t\tactive: true,\n\t\tmode,\n\t\torchestratorTarget,\n\t\textensionDir: NATIVE_INTERCOM_EXTENSION_DIR,\n\t\tinstruction: buildIntercomBridgeInstruction(orchestratorTarget, resolveInstructionTemplate(config.instructionFile, settingsDir)),\n\t};\n}\n\nexport function applyIntercomBridgeToAgent(agent: ChildRuntimeConfig, bridge: IntercomBridgeState): ChildRuntimeConfig {\n\tif (!bridge.active || !bridge.orchestratorTarget) return agent;\n\n\tconst bridgeTools = [\"intercom\", \"contact_supervisor\"];\n\tconst tools = agent.tools\n\t\t? [...agent.tools, ...bridgeTools.filter((tool) => !agent.tools?.includes(tool))]\n\t\t: agent.tools;\n\tconst instruction = bridge.instruction;\n\tconst trimmedPrompt = agent.systemPrompt?.trim() || \"\";\n\tconst systemPrompt = trimmedPrompt.includes(INTERCOM_BRIDGE_MARKER)\n\t\t? trimmedPrompt\n\t\t: trimmedPrompt\n\t\t\t? `${trimmedPrompt}\\n\\n${instruction}`\n\t\t\t: instruction;\n\n\tif (tools === agent.tools && systemPrompt === agent.systemPrompt) return agent;\n\treturn {\n\t\t...agent,\n\t\ttools,\n\t\tsystemPrompt,\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"intercom-bridge.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAwB,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAGpG,eAAO,MAAM,6BAA6B,2CAA2C,CAAC;AAWtF,eAAO,MAAM,sBAAsB,oCAAoC,CAAC;AAMxE,MAAM,WAAW,mBAAmB;IACnC,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,kBAAkB,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,wBAAwB;IACxC,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,kBAAkB,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,0BAA0B,EAAE,OAAO,CAAC;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,0BAA0B;IACnC,MAAM,EAAE,eAAe,CAAC,gBAAgB,CAAC,CAAC;IAC1C,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IACtC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAKvG;AAMD,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAGlG;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,CAG5E;AA2CD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,0BAA0B,GAAG,wBAAwB,CAelG;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,0BAA0B,GAAG,mBAAmB,CAqB5F;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,mBAAmB,GAAG,kBAAkB,CAqBrH","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { ChildRuntimeConfig } from \"../shared/types.ts\";\nimport type { ExtensionConfig, IntercomBridgeConfig, IntercomBridgeMode } from \"../shared/types.ts\";\nimport { getAgentDir } from \"../shared/utils.ts\";\n\nexport const NATIVE_INTERCOM_EXTENSION_DIR = \"native:pi-subagents-supervisor-channel\";\n\nfunction defaultAgentDir(): string {\n\treturn getAgentDir();\n}\n\nfunction defaultSubagentConfigDir(agentDir = defaultAgentDir()): string {\n\treturn path.join(agentDir, \"extensions\", \"subagent\");\n}\n\nconst DEFAULT_INTERCOM_TARGET_PREFIX = \"subagent-chat\";\nexport const INTERCOM_BRIDGE_MARKER = \"Intercom orchestration channel:\";\nconst DEFAULT_INTERCOM_BRIDGE_TEMPLATE = `You own reversible implementation decisions within your assigned scope. Use contact_supervisor for coordination with \"{orchestratorTarget}\"; its tool description defines delivery and reply behavior.\nConsolidate dependency findings into one handoff when another task needs them before completion. Escalate permission, safety, scope changes, or a blocked decision with evidence and your recommended choice. Continue independent work before opening a blocking request.\nNative intercom reaches only the supervisor, not siblings. Use the supplied contracts and artifacts instead of discovering sibling sessions.\nReturn one self-contained final result; the runtime delivers it. If you cannot write a configured output artifact with your available tools, return its complete contents for the runtime to persist.`;\n\nexport interface IntercomBridgeState {\n\tactive: boolean;\n\tmode: IntercomBridgeMode;\n\torchestratorTarget?: string;\n\textensionDir: string;\n\tinstruction: string;\n}\n\nexport interface IntercomBridgeDiagnostic {\n\tactive: boolean;\n\tmode: IntercomBridgeMode;\n\twantsIntercom: boolean;\n\tsupervisorChannelAvailable: boolean;\n\textensionDir: string;\n\torchestratorTarget?: string;\n\treason?: string;\n}\n\ninterface ResolveIntercomBridgeInput {\n\tconfig: ExtensionConfig[\"intercomBridge\"];\n\tcontext: \"fresh\" | \"fork\" | undefined;\n\torchestratorTarget?: string;\n\tsettingsDir?: string;\n\tagentDir?: string;\n}\n\nexport function resolveIntercomSessionTarget(sessionName: string | undefined, sessionId: string): string {\n\tconst trimmedName = sessionName?.trim();\n\tif (trimmedName) return trimmedName;\n\tconst normalizedSessionId = sessionId.startsWith(\"session-\") ? sessionId.slice(\"session-\".length) : sessionId;\n\treturn `${DEFAULT_INTERCOM_TARGET_PREFIX}-${normalizedSessionId.slice(0, 8)}`;\n}\n\nfunction sanitizeIntercomTargetPart(value: string): string {\n\treturn value.trim().toLowerCase().replace(/[^a-z0-9_-]+/g, \"-\").replace(/^-+|-+$/g, \"\") || \"agent\";\n}\n\nexport function resolveSubagentIntercomTarget(runId: string, agent: string, index?: number): string {\n\tconst stepSuffix = index !== undefined ? `-${index + 1}` : \"\";\n\treturn `subagent-${sanitizeIntercomTargetPart(agent)}-${sanitizeIntercomTargetPart(runId)}${stepSuffix}`;\n}\n\nexport function resolveIntercomBridgeMode(value: unknown): IntercomBridgeMode {\n\tif (value === \"off\" || value === \"always\" || value === \"fork-only\") return value;\n\treturn \"always\";\n}\n\nfunction resolveIntercomBridgeConfig(value: ExtensionConfig[\"intercomBridge\"]): Required<IntercomBridgeConfig> {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) {\n\t\treturn { mode: \"always\", instructionFile: \"\" };\n\t}\n\treturn {\n\t\tmode: resolveIntercomBridgeMode(value.mode),\n\t\tinstructionFile: typeof value.instructionFile === \"string\" ? value.instructionFile : \"\",\n\t};\n}\n\nfunction expandTilde(filePath: string): string {\n\treturn filePath.startsWith(\"~/\") ? path.join(os.homedir(), filePath.slice(2)) : filePath;\n}\n\nfunction resolveInstructionTemplate(instructionFile: string, settingsDir: string): string {\n\tif (!instructionFile) return DEFAULT_INTERCOM_BRIDGE_TEMPLATE;\n\tconst expandedPath = expandTilde(instructionFile);\n\tconst resolvedPath = path.isAbsolute(expandedPath)\n\t\t? expandedPath\n\t\t: path.resolve(settingsDir, expandedPath);\n\ttry {\n\t\treturn fs.readFileSync(resolvedPath, \"utf-8\");\n\t} catch (error) {\n\t\tconsole.warn(`Failed to read intercom bridge instructionFile at '${resolvedPath}'. Using default instructions.`, error);\n\t\treturn DEFAULT_INTERCOM_BRIDGE_TEMPLATE;\n\t}\n}\n\nfunction buildIntercomBridgeInstruction(orchestratorTarget: string, template: string): string {\n\tconst instruction = template.replaceAll(\"{orchestratorTarget}\", orchestratorTarget).trim();\n\tif (instruction.startsWith(INTERCOM_BRIDGE_MARKER)) return instruction;\n\treturn `${INTERCOM_BRIDGE_MARKER}\\n${instruction}`;\n}\n\nfunction inactiveReason(mode: IntercomBridgeMode, context: \"fresh\" | \"fork\" | undefined, orchestratorTarget: string | undefined): string | undefined {\n\tif (mode === \"off\") return \"bridge mode is off\";\n\tif (mode === \"fork-only\" && context !== \"fork\") return \"bridge mode is fork-only and context is not fork\";\n\tif (!orchestratorTarget) return \"orchestrator target is not available\";\n\treturn undefined;\n}\n\nexport function diagnoseIntercomBridge(input: ResolveIntercomBridgeInput): IntercomBridgeDiagnostic {\n\tconst config = resolveIntercomBridgeConfig(input.config);\n\tconst mode = config.mode;\n\tconst orchestratorTarget = input.orchestratorTarget?.trim();\n\tconst wantsIntercom = mode !== \"off\" && !(mode === \"fork-only\" && input.context !== \"fork\");\n\tconst reason = inactiveReason(mode, input.context, orchestratorTarget);\n\treturn {\n\t\tactive: reason === undefined,\n\t\tmode,\n\t\twantsIntercom,\n\t\tsupervisorChannelAvailable: true,\n\t\textensionDir: NATIVE_INTERCOM_EXTENSION_DIR,\n\t\t...(orchestratorTarget ? { orchestratorTarget } : {}),\n\t\t...(reason ? { reason } : {}),\n\t};\n}\n\nexport function resolveIntercomBridge(input: ResolveIntercomBridgeInput): IntercomBridgeState {\n\tconst config = resolveIntercomBridgeConfig(input.config);\n\tconst mode = config.mode;\n\tconst orchestratorTarget = input.orchestratorTarget?.trim();\n\tconst agentDir = path.resolve(input.agentDir ?? defaultAgentDir());\n\tconst settingsDir = path.resolve(input.settingsDir ?? defaultSubagentConfigDir(agentDir));\n\tconst defaultInstruction = buildIntercomBridgeInstruction(\n\t\torchestratorTarget || \"{orchestratorTarget}\",\n\t\tDEFAULT_INTERCOM_BRIDGE_TEMPLATE,\n\t);\n\tconst reason = inactiveReason(mode, input.context, orchestratorTarget);\n\tif (reason || !orchestratorTarget) {\n\t\treturn { active: false, mode, extensionDir: NATIVE_INTERCOM_EXTENSION_DIR, instruction: defaultInstruction };\n\t}\n\treturn {\n\t\tactive: true,\n\t\tmode,\n\t\torchestratorTarget,\n\t\textensionDir: NATIVE_INTERCOM_EXTENSION_DIR,\n\t\tinstruction: buildIntercomBridgeInstruction(orchestratorTarget, resolveInstructionTemplate(config.instructionFile, settingsDir)),\n\t};\n}\n\nexport function applyIntercomBridgeToAgent(agent: ChildRuntimeConfig, bridge: IntercomBridgeState): ChildRuntimeConfig {\n\tif (!bridge.active || !bridge.orchestratorTarget) return agent;\n\n\tconst bridgeTools = [\"intercom\", \"contact_supervisor\"];\n\tconst tools = agent.tools\n\t\t? [...agent.tools, ...bridgeTools.filter((tool) => !agent.tools?.includes(tool))]\n\t\t: agent.tools;\n\tconst instruction = bridge.instruction;\n\tconst trimmedPrompt = agent.systemPrompt?.trim() || \"\";\n\tconst systemPrompt = trimmedPrompt.includes(INTERCOM_BRIDGE_MARKER)\n\t\t? trimmedPrompt\n\t\t: trimmedPrompt\n\t\t\t? `${trimmedPrompt}\\n\\n${instruction}`\n\t\t\t: instruction;\n\n\tif (tools === agent.tools && systemPrompt === agent.systemPrompt) return agent;\n\treturn {\n\t\t...agent,\n\t\ttools,\n\t\tsystemPrompt,\n\t};\n}\n"]}
|
|
@@ -12,17 +12,10 @@ function defaultSubagentConfigDir(agentDir = defaultAgentDir()) {
|
|
|
12
12
|
}
|
|
13
13
|
const DEFAULT_INTERCOM_TARGET_PREFIX = "subagent-chat";
|
|
14
14
|
export const INTERCOM_BRIDGE_MARKER = "Intercom orchestration channel:";
|
|
15
|
-
const DEFAULT_INTERCOM_BRIDGE_TEMPLATE = `
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
-
|
|
19
|
-
- Need structured supervisor input rather than a freeform reply: contact_supervisor({ reason: "interview_request", message: "<what input is needed>", interview: { title: "...", questions: [] } })
|
|
20
|
-
- After contact_supervisor with reason "need_decision" or "interview_request", stay alive and continue only after the reply arrives. Do not finish your final response with a choose-one question.
|
|
21
|
-
- Do not ask for clarification when the only conflict is review-only/no-edit versus progress-writing or artifact-writing instructions. If an output path is configured but no write-capable tool is available, return the complete artifact in your final response; the runtime will persist it. Do not contact the supervisor merely because you cannot write that output path directly.
|
|
22
|
-
- Meaningful progress or unexpected discoveries that change the plan: contact_supervisor({ reason: "progress_update", message: "UPDATE: <summary>" })
|
|
23
|
-
- Generic intercom is lower-level plumbing/fallback only: intercom({ action: "ask", to: "{orchestratorTarget}", message: "<question>" })
|
|
24
|
-
|
|
25
|
-
Do not use contact_supervisor or intercom for routine completion handoffs. If no coordination is needed, return a focused task result.`;
|
|
15
|
+
const DEFAULT_INTERCOM_BRIDGE_TEMPLATE = `You own reversible implementation decisions within your assigned scope. Use contact_supervisor for coordination with "{orchestratorTarget}"; its tool description defines delivery and reply behavior.
|
|
16
|
+
Consolidate dependency findings into one handoff when another task needs them before completion. Escalate permission, safety, scope changes, or a blocked decision with evidence and your recommended choice. Continue independent work before opening a blocking request.
|
|
17
|
+
Native intercom reaches only the supervisor, not siblings. Use the supplied contracts and artifacts instead of discovering sibling sessions.
|
|
18
|
+
Return one self-contained final result; the runtime delivers it. If you cannot write a configured output artifact with your available tools, return its complete contents for the runtime to persist.`;
|
|
26
19
|
export function resolveIntercomSessionTarget(sessionName, sessionId) {
|
|
27
20
|
const trimmedName = sessionName?.trim();
|
|
28
21
|
if (trimmedName)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intercom-bridge.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { ChildRuntimeConfig } from \"../shared/types.ts\";\nimport type { ExtensionConfig, IntercomBridgeConfig, IntercomBridgeMode } from \"../shared/types.ts\";\nimport { getAgentDir } from \"../shared/utils.ts\";\n\nexport const NATIVE_INTERCOM_EXTENSION_DIR = \"native:pi-subagents-supervisor-channel\";\n\nfunction defaultAgentDir(): string {\n\treturn getAgentDir();\n}\n\nfunction defaultSubagentConfigDir(agentDir = defaultAgentDir()): string {\n\treturn path.join(agentDir, \"extensions\", \"subagent\");\n}\n\nconst DEFAULT_INTERCOM_TARGET_PREFIX = \"subagent-chat\";\nexport const INTERCOM_BRIDGE_MARKER = \"Intercom orchestration channel:\";\nconst DEFAULT_INTERCOM_BRIDGE_TEMPLATE = `The inherited thread is reference-only. Do not continue that conversation or send questions, status updates, or completion handoffs to the supervisor in normal assistant text.\n\nUse contact_supervisor first. It resolves the supervisor session \"{orchestratorTarget}\" and run metadata automatically.\n- Need a decision, blocked, approval, or product/API/scope ambiguity: contact_supervisor({ reason: \"need_decision\", message: \"<question>\" })\n- Need structured supervisor input rather than a freeform reply: contact_supervisor({ reason: \"interview_request\", message: \"<what input is needed>\", interview: { title: \"...\", questions: [] } })\n- After contact_supervisor with reason \"need_decision\" or \"interview_request\", stay alive and continue only after the reply arrives. Do not finish your final response with a choose-one question.\n- Do not ask for clarification when the only conflict is review-only/no-edit versus progress-writing or artifact-writing instructions. If an output path is configured but no write-capable tool is available, return the complete artifact in your final response; the runtime will persist it. Do not contact the supervisor merely because you cannot write that output path directly.\n- Meaningful progress or unexpected discoveries that change the plan: contact_supervisor({ reason: \"progress_update\", message: \"UPDATE: <summary>\" })\n- Generic intercom is lower-level plumbing/fallback only: intercom({ action: \"ask\", to: \"{orchestratorTarget}\", message: \"<question>\" })\n\nDo not use contact_supervisor or intercom for routine completion handoffs. If no coordination is needed, return a focused task result.`;\n\nexport interface IntercomBridgeState {\n\tactive: boolean;\n\tmode: IntercomBridgeMode;\n\torchestratorTarget?: string;\n\textensionDir: string;\n\tinstruction: string;\n}\n\nexport interface IntercomBridgeDiagnostic {\n\tactive: boolean;\n\tmode: IntercomBridgeMode;\n\twantsIntercom: boolean;\n\tsupervisorChannelAvailable: boolean;\n\textensionDir: string;\n\torchestratorTarget?: string;\n\treason?: string;\n}\n\ninterface ResolveIntercomBridgeInput {\n\tconfig: ExtensionConfig[\"intercomBridge\"];\n\tcontext: \"fresh\" | \"fork\" | undefined;\n\torchestratorTarget?: string;\n\tsettingsDir?: string;\n\tagentDir?: string;\n}\n\nexport function resolveIntercomSessionTarget(sessionName: string | undefined, sessionId: string): string {\n\tconst trimmedName = sessionName?.trim();\n\tif (trimmedName) return trimmedName;\n\tconst normalizedSessionId = sessionId.startsWith(\"session-\") ? sessionId.slice(\"session-\".length) : sessionId;\n\treturn `${DEFAULT_INTERCOM_TARGET_PREFIX}-${normalizedSessionId.slice(0, 8)}`;\n}\n\nfunction sanitizeIntercomTargetPart(value: string): string {\n\treturn value.trim().toLowerCase().replace(/[^a-z0-9_-]+/g, \"-\").replace(/^-+|-+$/g, \"\") || \"agent\";\n}\n\nexport function resolveSubagentIntercomTarget(runId: string, agent: string, index?: number): string {\n\tconst stepSuffix = index !== undefined ? `-${index + 1}` : \"\";\n\treturn `subagent-${sanitizeIntercomTargetPart(agent)}-${sanitizeIntercomTargetPart(runId)}${stepSuffix}`;\n}\n\nexport function resolveIntercomBridgeMode(value: unknown): IntercomBridgeMode {\n\tif (value === \"off\" || value === \"always\" || value === \"fork-only\") return value;\n\treturn \"always\";\n}\n\nfunction resolveIntercomBridgeConfig(value: ExtensionConfig[\"intercomBridge\"]): Required<IntercomBridgeConfig> {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) {\n\t\treturn { mode: \"always\", instructionFile: \"\" };\n\t}\n\treturn {\n\t\tmode: resolveIntercomBridgeMode(value.mode),\n\t\tinstructionFile: typeof value.instructionFile === \"string\" ? value.instructionFile : \"\",\n\t};\n}\n\nfunction expandTilde(filePath: string): string {\n\treturn filePath.startsWith(\"~/\") ? path.join(os.homedir(), filePath.slice(2)) : filePath;\n}\n\nfunction resolveInstructionTemplate(instructionFile: string, settingsDir: string): string {\n\tif (!instructionFile) return DEFAULT_INTERCOM_BRIDGE_TEMPLATE;\n\tconst expandedPath = expandTilde(instructionFile);\n\tconst resolvedPath = path.isAbsolute(expandedPath)\n\t\t? expandedPath\n\t\t: path.resolve(settingsDir, expandedPath);\n\ttry {\n\t\treturn fs.readFileSync(resolvedPath, \"utf-8\");\n\t} catch (error) {\n\t\tconsole.warn(`Failed to read intercom bridge instructionFile at '${resolvedPath}'. Using default instructions.`, error);\n\t\treturn DEFAULT_INTERCOM_BRIDGE_TEMPLATE;\n\t}\n}\n\nfunction buildIntercomBridgeInstruction(orchestratorTarget: string, template: string): string {\n\tconst instruction = template.replaceAll(\"{orchestratorTarget}\", orchestratorTarget).trim();\n\tif (instruction.startsWith(INTERCOM_BRIDGE_MARKER)) return instruction;\n\treturn `${INTERCOM_BRIDGE_MARKER}\\n${instruction}`;\n}\n\nfunction inactiveReason(mode: IntercomBridgeMode, context: \"fresh\" | \"fork\" | undefined, orchestratorTarget: string | undefined): string | undefined {\n\tif (mode === \"off\") return \"bridge mode is off\";\n\tif (mode === \"fork-only\" && context !== \"fork\") return \"bridge mode is fork-only and context is not fork\";\n\tif (!orchestratorTarget) return \"orchestrator target is not available\";\n\treturn undefined;\n}\n\nexport function diagnoseIntercomBridge(input: ResolveIntercomBridgeInput): IntercomBridgeDiagnostic {\n\tconst config = resolveIntercomBridgeConfig(input.config);\n\tconst mode = config.mode;\n\tconst orchestratorTarget = input.orchestratorTarget?.trim();\n\tconst wantsIntercom = mode !== \"off\" && !(mode === \"fork-only\" && input.context !== \"fork\");\n\tconst reason = inactiveReason(mode, input.context, orchestratorTarget);\n\treturn {\n\t\tactive: reason === undefined,\n\t\tmode,\n\t\twantsIntercom,\n\t\tsupervisorChannelAvailable: true,\n\t\textensionDir: NATIVE_INTERCOM_EXTENSION_DIR,\n\t\t...(orchestratorTarget ? { orchestratorTarget } : {}),\n\t\t...(reason ? { reason } : {}),\n\t};\n}\n\nexport function resolveIntercomBridge(input: ResolveIntercomBridgeInput): IntercomBridgeState {\n\tconst config = resolveIntercomBridgeConfig(input.config);\n\tconst mode = config.mode;\n\tconst orchestratorTarget = input.orchestratorTarget?.trim();\n\tconst agentDir = path.resolve(input.agentDir ?? defaultAgentDir());\n\tconst settingsDir = path.resolve(input.settingsDir ?? defaultSubagentConfigDir(agentDir));\n\tconst defaultInstruction = buildIntercomBridgeInstruction(\n\t\torchestratorTarget || \"{orchestratorTarget}\",\n\t\tDEFAULT_INTERCOM_BRIDGE_TEMPLATE,\n\t);\n\tconst reason = inactiveReason(mode, input.context, orchestratorTarget);\n\tif (reason || !orchestratorTarget) {\n\t\treturn { active: false, mode, extensionDir: NATIVE_INTERCOM_EXTENSION_DIR, instruction: defaultInstruction };\n\t}\n\treturn {\n\t\tactive: true,\n\t\tmode,\n\t\torchestratorTarget,\n\t\textensionDir: NATIVE_INTERCOM_EXTENSION_DIR,\n\t\tinstruction: buildIntercomBridgeInstruction(orchestratorTarget, resolveInstructionTemplate(config.instructionFile, settingsDir)),\n\t};\n}\n\nexport function applyIntercomBridgeToAgent(agent: ChildRuntimeConfig, bridge: IntercomBridgeState): ChildRuntimeConfig {\n\tif (!bridge.active || !bridge.orchestratorTarget) return agent;\n\n\tconst bridgeTools = [\"intercom\", \"contact_supervisor\"];\n\tconst tools = agent.tools\n\t\t? [...agent.tools, ...bridgeTools.filter((tool) => !agent.tools?.includes(tool))]\n\t\t: agent.tools;\n\tconst instruction = bridge.instruction;\n\tconst trimmedPrompt = agent.systemPrompt?.trim() || \"\";\n\tconst systemPrompt = trimmedPrompt.includes(INTERCOM_BRIDGE_MARKER)\n\t\t? trimmedPrompt\n\t\t: trimmedPrompt\n\t\t\t? `${trimmedPrompt}\\n\\n${instruction}`\n\t\t\t: instruction;\n\n\tif (tools === agent.tools && systemPrompt === agent.systemPrompt) return agent;\n\treturn {\n\t\t...agent,\n\t\ttools,\n\t\tsystemPrompt,\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"intercom-bridge.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { ChildRuntimeConfig } from \"../shared/types.ts\";\nimport type { ExtensionConfig, IntercomBridgeConfig, IntercomBridgeMode } from \"../shared/types.ts\";\nimport { getAgentDir } from \"../shared/utils.ts\";\n\nexport const NATIVE_INTERCOM_EXTENSION_DIR = \"native:pi-subagents-supervisor-channel\";\n\nfunction defaultAgentDir(): string {\n\treturn getAgentDir();\n}\n\nfunction defaultSubagentConfigDir(agentDir = defaultAgentDir()): string {\n\treturn path.join(agentDir, \"extensions\", \"subagent\");\n}\n\nconst DEFAULT_INTERCOM_TARGET_PREFIX = \"subagent-chat\";\nexport const INTERCOM_BRIDGE_MARKER = \"Intercom orchestration channel:\";\nconst DEFAULT_INTERCOM_BRIDGE_TEMPLATE = `You own reversible implementation decisions within your assigned scope. Use contact_supervisor for coordination with \"{orchestratorTarget}\"; its tool description defines delivery and reply behavior.\nConsolidate dependency findings into one handoff when another task needs them before completion. Escalate permission, safety, scope changes, or a blocked decision with evidence and your recommended choice. Continue independent work before opening a blocking request.\nNative intercom reaches only the supervisor, not siblings. Use the supplied contracts and artifacts instead of discovering sibling sessions.\nReturn one self-contained final result; the runtime delivers it. If you cannot write a configured output artifact with your available tools, return its complete contents for the runtime to persist.`;\n\nexport interface IntercomBridgeState {\n\tactive: boolean;\n\tmode: IntercomBridgeMode;\n\torchestratorTarget?: string;\n\textensionDir: string;\n\tinstruction: string;\n}\n\nexport interface IntercomBridgeDiagnostic {\n\tactive: boolean;\n\tmode: IntercomBridgeMode;\n\twantsIntercom: boolean;\n\tsupervisorChannelAvailable: boolean;\n\textensionDir: string;\n\torchestratorTarget?: string;\n\treason?: string;\n}\n\ninterface ResolveIntercomBridgeInput {\n\tconfig: ExtensionConfig[\"intercomBridge\"];\n\tcontext: \"fresh\" | \"fork\" | undefined;\n\torchestratorTarget?: string;\n\tsettingsDir?: string;\n\tagentDir?: string;\n}\n\nexport function resolveIntercomSessionTarget(sessionName: string | undefined, sessionId: string): string {\n\tconst trimmedName = sessionName?.trim();\n\tif (trimmedName) return trimmedName;\n\tconst normalizedSessionId = sessionId.startsWith(\"session-\") ? sessionId.slice(\"session-\".length) : sessionId;\n\treturn `${DEFAULT_INTERCOM_TARGET_PREFIX}-${normalizedSessionId.slice(0, 8)}`;\n}\n\nfunction sanitizeIntercomTargetPart(value: string): string {\n\treturn value.trim().toLowerCase().replace(/[^a-z0-9_-]+/g, \"-\").replace(/^-+|-+$/g, \"\") || \"agent\";\n}\n\nexport function resolveSubagentIntercomTarget(runId: string, agent: string, index?: number): string {\n\tconst stepSuffix = index !== undefined ? `-${index + 1}` : \"\";\n\treturn `subagent-${sanitizeIntercomTargetPart(agent)}-${sanitizeIntercomTargetPart(runId)}${stepSuffix}`;\n}\n\nexport function resolveIntercomBridgeMode(value: unknown): IntercomBridgeMode {\n\tif (value === \"off\" || value === \"always\" || value === \"fork-only\") return value;\n\treturn \"always\";\n}\n\nfunction resolveIntercomBridgeConfig(value: ExtensionConfig[\"intercomBridge\"]): Required<IntercomBridgeConfig> {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) {\n\t\treturn { mode: \"always\", instructionFile: \"\" };\n\t}\n\treturn {\n\t\tmode: resolveIntercomBridgeMode(value.mode),\n\t\tinstructionFile: typeof value.instructionFile === \"string\" ? value.instructionFile : \"\",\n\t};\n}\n\nfunction expandTilde(filePath: string): string {\n\treturn filePath.startsWith(\"~/\") ? path.join(os.homedir(), filePath.slice(2)) : filePath;\n}\n\nfunction resolveInstructionTemplate(instructionFile: string, settingsDir: string): string {\n\tif (!instructionFile) return DEFAULT_INTERCOM_BRIDGE_TEMPLATE;\n\tconst expandedPath = expandTilde(instructionFile);\n\tconst resolvedPath = path.isAbsolute(expandedPath)\n\t\t? expandedPath\n\t\t: path.resolve(settingsDir, expandedPath);\n\ttry {\n\t\treturn fs.readFileSync(resolvedPath, \"utf-8\");\n\t} catch (error) {\n\t\tconsole.warn(`Failed to read intercom bridge instructionFile at '${resolvedPath}'. Using default instructions.`, error);\n\t\treturn DEFAULT_INTERCOM_BRIDGE_TEMPLATE;\n\t}\n}\n\nfunction buildIntercomBridgeInstruction(orchestratorTarget: string, template: string): string {\n\tconst instruction = template.replaceAll(\"{orchestratorTarget}\", orchestratorTarget).trim();\n\tif (instruction.startsWith(INTERCOM_BRIDGE_MARKER)) return instruction;\n\treturn `${INTERCOM_BRIDGE_MARKER}\\n${instruction}`;\n}\n\nfunction inactiveReason(mode: IntercomBridgeMode, context: \"fresh\" | \"fork\" | undefined, orchestratorTarget: string | undefined): string | undefined {\n\tif (mode === \"off\") return \"bridge mode is off\";\n\tif (mode === \"fork-only\" && context !== \"fork\") return \"bridge mode is fork-only and context is not fork\";\n\tif (!orchestratorTarget) return \"orchestrator target is not available\";\n\treturn undefined;\n}\n\nexport function diagnoseIntercomBridge(input: ResolveIntercomBridgeInput): IntercomBridgeDiagnostic {\n\tconst config = resolveIntercomBridgeConfig(input.config);\n\tconst mode = config.mode;\n\tconst orchestratorTarget = input.orchestratorTarget?.trim();\n\tconst wantsIntercom = mode !== \"off\" && !(mode === \"fork-only\" && input.context !== \"fork\");\n\tconst reason = inactiveReason(mode, input.context, orchestratorTarget);\n\treturn {\n\t\tactive: reason === undefined,\n\t\tmode,\n\t\twantsIntercom,\n\t\tsupervisorChannelAvailable: true,\n\t\textensionDir: NATIVE_INTERCOM_EXTENSION_DIR,\n\t\t...(orchestratorTarget ? { orchestratorTarget } : {}),\n\t\t...(reason ? { reason } : {}),\n\t};\n}\n\nexport function resolveIntercomBridge(input: ResolveIntercomBridgeInput): IntercomBridgeState {\n\tconst config = resolveIntercomBridgeConfig(input.config);\n\tconst mode = config.mode;\n\tconst orchestratorTarget = input.orchestratorTarget?.trim();\n\tconst agentDir = path.resolve(input.agentDir ?? defaultAgentDir());\n\tconst settingsDir = path.resolve(input.settingsDir ?? defaultSubagentConfigDir(agentDir));\n\tconst defaultInstruction = buildIntercomBridgeInstruction(\n\t\torchestratorTarget || \"{orchestratorTarget}\",\n\t\tDEFAULT_INTERCOM_BRIDGE_TEMPLATE,\n\t);\n\tconst reason = inactiveReason(mode, input.context, orchestratorTarget);\n\tif (reason || !orchestratorTarget) {\n\t\treturn { active: false, mode, extensionDir: NATIVE_INTERCOM_EXTENSION_DIR, instruction: defaultInstruction };\n\t}\n\treturn {\n\t\tactive: true,\n\t\tmode,\n\t\torchestratorTarget,\n\t\textensionDir: NATIVE_INTERCOM_EXTENSION_DIR,\n\t\tinstruction: buildIntercomBridgeInstruction(orchestratorTarget, resolveInstructionTemplate(config.instructionFile, settingsDir)),\n\t};\n}\n\nexport function applyIntercomBridgeToAgent(agent: ChildRuntimeConfig, bridge: IntercomBridgeState): ChildRuntimeConfig {\n\tif (!bridge.active || !bridge.orchestratorTarget) return agent;\n\n\tconst bridgeTools = [\"intercom\", \"contact_supervisor\"];\n\tconst tools = agent.tools\n\t\t? [...agent.tools, ...bridgeTools.filter((tool) => !agent.tools?.includes(tool))]\n\t\t: agent.tools;\n\tconst instruction = bridge.instruction;\n\tconst trimmedPrompt = agent.systemPrompt?.trim() || \"\";\n\tconst systemPrompt = trimmedPrompt.includes(INTERCOM_BRIDGE_MARKER)\n\t\t? trimmedPrompt\n\t\t: trimmedPrompt\n\t\t\t? `${trimmedPrompt}\\n\\n${instruction}`\n\t\t\t: instruction;\n\n\tif (tools === agent.tools && systemPrompt === agent.systemPrompt) return agent;\n\treturn {\n\t\t...agent,\n\t\ttools,\n\t\tsystemPrompt,\n\t};\n}\n"]}
|
|
@@ -3,9 +3,11 @@ import { type SubagentState } from "../shared/types.ts";
|
|
|
3
3
|
import { resolveSupervisorChannelDir as resolveQuestionChannelDir } from "./supervisor-questions.ts";
|
|
4
4
|
export declare const NATIVE_SUPERVISOR_TOOL_NAME = "subagent_supervisor";
|
|
5
5
|
export declare const resolveSupervisorChannelDir: typeof resolveQuestionChannelDir;
|
|
6
|
-
type SupervisorReason = "need_decision" | "interview_request" | "progress_update";
|
|
6
|
+
type SupervisorReason = "need_decision" | "interview_request" | "progress_update" | "handoff";
|
|
7
7
|
interface SupervisorRequest {
|
|
8
8
|
type: "subagent.supervisor.request";
|
|
9
|
+
protocolVersion?: number;
|
|
10
|
+
description?: string;
|
|
9
11
|
id: string;
|
|
10
12
|
createdAt: number;
|
|
11
13
|
expiresAt?: number;
|
|
@@ -26,6 +28,7 @@ interface PendingSupervisorRequest extends SupervisorRequest {
|
|
|
26
28
|
requestFile: string;
|
|
27
29
|
}
|
|
28
30
|
export declare function ensureSupervisorChannelDir(channelDir: string): void;
|
|
31
|
+
export declare function registerSupervisorRenderers(pi: ExtensionAPI, state: SubagentState): void;
|
|
29
32
|
export declare function registerNativeSupervisorClient(pi: ExtensionAPI, options?: {
|
|
30
33
|
includeIntercomFallback?: boolean;
|
|
31
34
|
}): void;
|