@ashx-j/lunr-dev 0.2.16-dev.9.1 → 0.2.21-dev.12.1
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 +67 -1
- package/README.md +7 -1
- package/dist/builtin-extensions/ashxj-thinking.d.ts +1 -0
- package/dist/builtin-extensions/ashxj-thinking.d.ts.map +1 -1
- package/dist/builtin-extensions/ashxj-thinking.js +44 -19
- package/dist/builtin-extensions/ashxj-thinking.js.map +1 -1
- package/dist/builtin-extensions/index.d.ts.map +1 -1
- package/dist/builtin-extensions/index.js +1 -2
- package/dist/builtin-extensions/index.js.map +1 -1
- package/dist/builtin-extensions/lunr-computer-use.d.ts +3 -0
- package/dist/builtin-extensions/lunr-computer-use.d.ts.map +1 -0
- package/dist/builtin-extensions/lunr-computer-use.js +158 -0
- package/dist/builtin-extensions/lunr-computer-use.js.map +1 -0
- package/dist/builtin-extensions/lunr-todos.d.ts +6 -5
- package/dist/builtin-extensions/lunr-todos.d.ts.map +1 -1
- package/dist/builtin-extensions/lunr-todos.js +9 -7
- package/dist/builtin-extensions/lunr-todos.js.map +1 -1
- package/dist/builtin-extensions/pi-intercom/broker/spawn.d.ts +6 -4
- package/dist/builtin-extensions/pi-intercom/broker/spawn.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-intercom/broker/spawn.js +114 -61
- package/dist/builtin-extensions/pi-intercom/broker/spawn.js.map +1 -1
- package/dist/builtin-extensions/pi-intercom/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-intercom/index.js +360 -351
- package/dist/builtin-extensions/pi-intercom/index.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/index.js +10 -3
- package/dist/builtin-extensions/pi-lsp-extension/src/index.js.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/runtime.d.ts +5 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/runtime.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-lsp-extension/src/runtime.js +26 -4
- package/dist/builtin-extensions/pi-lsp-extension/src/runtime.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/index.js +37 -27
- package/dist/builtin-extensions/pi-mcp-adapter/index.js.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/server-manager.d.ts +6 -1
- package/dist/builtin-extensions/pi-mcp-adapter/server-manager.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js +33 -8
- package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.js +2 -2
- package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts +8 -6
- package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.js +179 -79
- package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.d.ts +18 -8
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js +44 -15
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.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 +24 -14
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.d.ts +8 -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 +247 -18
- package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/result-intercom.d.ts +1 -0
- package/dist/builtin-extensions/pi-subagents/src/intercom/result-intercom.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/result-intercom.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/result-intercom.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-ask.d.ts +29 -0
- package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-ask.d.ts.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-ask.js +179 -0
- package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-ask.js.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-questions.d.ts +89 -0
- package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-questions.d.ts.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-questions.js +541 -0
- package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-questions.js.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts +11 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js +38 -12
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-job-tracker.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-job-tracker.js +3 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-job-tracker.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.d.ts +2 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.js +35 -8
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts +7 -3
- package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js +26 -4
- package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.d.ts +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js +55 -38
- package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts +100 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js +46 -31
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.d.ts +3 -6
- 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 +64 -5
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/top-level-async.d.ts +15 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/background/top-level-async.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/top-level-async.js +14 -4
- package/dist/builtin-extensions/pi-subagents/src/runs/background/top-level-async.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.d.ts +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 +7 -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/chain-execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js +21 -8
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/request-params.d.ts +10 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/request-params.d.ts.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/request-params.js +38 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/request-params.js.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts +0 -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 +74 -41
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.d.ts +2 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.js +75 -18
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.js +2 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts +13 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js +67 -11
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.d.ts +3 -0
- 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 +7 -2
- 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-prompt-runtime.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.js +13 -3
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.js +5 -10
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/async-guidance.d.ts +2 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/async-guidance.d.ts.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/async-guidance.js +3 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/async-guidance.js.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.d.ts +3 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.js +68 -11
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/formatters.d.ts +12 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/formatters.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/formatters.js +21 -2
- package/dist/builtin-extensions/pi-subagents/src/shared/formatters.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +21 -4
- package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/delegation-adapters.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/delegation-adapters.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts +7 -0
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js +11 -7
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts +6 -0
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js +46 -29
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +47 -4
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js +428 -431
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/register-main.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/register-main.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/register-main.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/tool-actions.d.ts +2 -13
- package/dist/builtin-extensions/pi-subagents/src/watchdog/tool-actions.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/tool-actions.js +5 -91
- package/dist/builtin-extensions/pi-subagents/src/watchdog/tool-actions.js.map +1 -1
- package/dist/builtin-extensions/pi-web-access/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-web-access/index.js +103 -102
- package/dist/builtin-extensions/pi-web-access/index.js.map +1 -1
- package/dist/core/agent-session-services.d.ts.map +1 -1
- package/dist/core/agent-session-services.js +1 -1
- package/dist/core/agent-session-services.js.map +1 -1
- package/dist/core/computer-use/adapter.d.ts +23 -0
- package/dist/core/computer-use/adapter.d.ts.map +1 -0
- package/dist/core/computer-use/adapter.js +116 -0
- package/dist/core/computer-use/adapter.js.map +1 -0
- package/dist/core/computer-use/image.d.ts +26 -0
- package/dist/core/computer-use/image.d.ts.map +1 -0
- package/dist/core/computer-use/image.js +64 -0
- package/dist/core/computer-use/image.js.map +1 -0
- package/dist/core/computer-use/lease.d.ts +18 -0
- package/dist/core/computer-use/lease.d.ts.map +1 -0
- package/dist/core/computer-use/lease.js +129 -0
- package/dist/core/computer-use/lease.js.map +1 -0
- package/dist/core/computer-use/macos-runtime.d.ts +14 -0
- package/dist/core/computer-use/macos-runtime.d.ts.map +1 -0
- package/dist/core/computer-use/macos-runtime.js +148 -0
- package/dist/core/computer-use/macos-runtime.js.map +1 -0
- package/dist/core/computer-use/policy.d.ts +19 -0
- package/dist/core/computer-use/policy.d.ts.map +1 -0
- package/dist/core/computer-use/policy.js +62 -0
- package/dist/core/computer-use/policy.js.map +1 -0
- package/dist/core/computer-use/release.generated.d.ts +31 -0
- package/dist/core/computer-use/release.generated.d.ts.map +1 -0
- package/dist/core/computer-use/release.generated.js +36 -0
- package/dist/core/computer-use/release.generated.js.map +1 -0
- package/dist/core/computer-use/runtime.d.ts +13 -0
- package/dist/core/computer-use/runtime.d.ts.map +1 -0
- package/dist/core/computer-use/runtime.js +158 -0
- package/dist/core/computer-use/runtime.js.map +1 -0
- package/dist/core/computer-use/schemas.d.ts +91 -0
- package/dist/core/computer-use/schemas.d.ts.map +1 -0
- package/dist/core/computer-use/schemas.js +71 -0
- package/dist/core/computer-use/schemas.js.map +1 -0
- package/dist/core/computer-use/windows-desktop.d.ts +3 -0
- package/dist/core/computer-use/windows-desktop.d.ts.map +1 -0
- package/dist/core/computer-use/windows-desktop.js +48 -0
- package/dist/core/computer-use/windows-desktop.js.map +1 -0
- package/dist/core/computer-use/workflow.d.ts +32 -0
- package/dist/core/computer-use/workflow.d.ts.map +1 -0
- package/dist/core/computer-use/workflow.js +341 -0
- package/dist/core/computer-use/workflow.js.map +1 -0
- package/dist/core/customize.d.ts +2 -0
- package/dist/core/customize.d.ts.map +1 -1
- package/dist/core/customize.js +3 -0
- package/dist/core/customize.js.map +1 -1
- package/dist/core/keybindings.d.ts +2 -2
- package/dist/core/keybindings.d.ts.map +1 -1
- package/dist/core/keybindings.js +2 -2
- package/dist/core/keybindings.js.map +1 -1
- package/dist/core/model-runtime.d.ts +0 -3
- package/dist/core/model-runtime.d.ts.map +1 -1
- package/dist/core/model-runtime.js +1 -10
- package/dist/core/model-runtime.js.map +1 -1
- package/dist/core/package-manager.d.ts.map +1 -1
- package/dist/core/package-manager.js +1 -1
- package/dist/core/package-manager.js.map +1 -1
- package/dist/core/permissions.d.ts +2 -1
- package/dist/core/permissions.d.ts.map +1 -1
- package/dist/core/permissions.js +31 -11
- package/dist/core/permissions.js.map +1 -1
- package/dist/core/plan-mode.d.ts.map +1 -1
- package/dist/core/plan-mode.js +9 -5
- package/dist/core/plan-mode.js.map +1 -1
- package/dist/core/rollback.d.ts.map +1 -1
- package/dist/core/rollback.js +13 -90
- package/dist/core/rollback.js.map +1 -1
- package/dist/core/runtime-bridges.d.ts.map +1 -1
- package/dist/core/runtime-bridges.js +0 -2
- package/dist/core/runtime-bridges.js.map +1 -1
- package/dist/core/session-manager.d.ts +0 -1
- package/dist/core/session-manager.d.ts.map +1 -1
- package/dist/core/session-manager.js +21 -79
- package/dist/core/session-manager.js.map +1 -1
- package/dist/core/settings-manager.d.ts +10 -0
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +30 -0
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/subagent-cancellation.d.ts +21 -0
- package/dist/core/subagent-cancellation.d.ts.map +1 -0
- package/dist/core/subagent-cancellation.js +53 -0
- package/dist/core/subagent-cancellation.js.map +1 -0
- package/dist/core/subagent-spinner-setting.d.ts +6 -0
- package/dist/core/subagent-spinner-setting.d.ts.map +1 -0
- package/dist/core/subagent-spinner-setting.js +12 -0
- package/dist/core/subagent-spinner-setting.js.map +1 -0
- package/dist/core/subagent-spinner.d.ts +4 -0
- package/dist/core/subagent-spinner.d.ts.map +1 -0
- package/dist/core/subagent-spinner.js +6 -0
- package/dist/core/subagent-spinner.js.map +1 -0
- package/dist/dev-cli.js +0 -0
- package/dist/gateway/agent-bridge.d.ts +6 -1
- package/dist/gateway/agent-bridge.d.ts.map +1 -1
- package/dist/gateway/agent-bridge.js +23 -6
- package/dist/gateway/agent-bridge.js.map +1 -1
- package/dist/gateway/cron.d.ts +1 -1
- package/dist/gateway/cron.d.ts.map +1 -1
- package/dist/gateway/cron.js +23 -7
- package/dist/gateway/cron.js.map +1 -1
- package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
- package/dist/modes/interactive/components/assistant-message.js +12 -18
- package/dist/modes/interactive/components/assistant-message.js.map +1 -1
- package/dist/modes/interactive/components/footer.d.ts +4 -2
- package/dist/modes/interactive/components/footer.d.ts.map +1 -1
- package/dist/modes/interactive/components/footer.js +23 -32
- package/dist/modes/interactive/components/footer.js.map +1 -1
- package/dist/modes/interactive/components/processes-selector.d.ts +2 -3
- package/dist/modes/interactive/components/processes-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/processes-selector.js +5 -10
- package/dist/modes/interactive/components/processes-selector.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +8 -0
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +93 -1
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
- package/dist/modes/interactive/components/tool-execution.js +12 -0
- package/dist/modes/interactive/components/tool-execution.js.map +1 -1
- package/dist/modes/interactive/extension-widget-order.d.ts +8 -0
- package/dist/modes/interactive/extension-widget-order.d.ts.map +1 -0
- package/dist/modes/interactive/extension-widget-order.js +37 -0
- package/dist/modes/interactive/extension-widget-order.js.map +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts +1 -0
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +58 -26
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/thinking-level-slash.d.ts +4 -0
- package/dist/modes/interactive/thinking-level-slash.d.ts.map +1 -0
- package/dist/modes/interactive/thinking-level-slash.js +23 -0
- package/dist/modes/interactive/thinking-level-slash.js.map +1 -0
- package/dist/node-runtime/adapter-AZMY335J.js +279 -0
- package/dist/node-runtime/{agent-session-services-IFJMSX7Z.js → agent-session-services-QANFGM2V.js} +15 -11
- package/dist/node-runtime/{builtin-extensions-LYZ3BFWQ.js → builtin-extensions-SRCYQPZ6.js} +5 -3
- package/dist/node-runtime/chunk-2IDTZAG5.js +1415 -0
- package/dist/node-runtime/chunk-3ONQTOMR.js +68 -0
- package/dist/node-runtime/{chunk-TQNSPERU.js → chunk-5SQDLSZJ.js} +1 -1
- package/dist/node-runtime/chunk-5ZH3ZFIZ.js +308 -0
- package/dist/node-runtime/{chunk-PBC2Y6GS.js → chunk-6UB6NKA3.js} +29 -72
- package/dist/node-runtime/{chunk-A2KQXUJD.js → chunk-7AFOFSDY.js} +1 -1
- package/dist/node-runtime/chunk-A3KMVBZV.js +60 -0
- package/dist/node-runtime/{chunk-N77MY65L.js → chunk-BJ6H7DPI.js} +25 -25
- package/dist/node-runtime/{chunk-PGAJ5MO5.js → chunk-BYQ2MOFI.js} +6 -6
- package/dist/node-runtime/{chunk-QH42CDX3.js → chunk-CZUBYPFP.js} +234 -124
- package/dist/node-runtime/{chunk-LZAW4ZX3.js → chunk-D466UAID.js} +34 -13
- package/dist/node-runtime/{chunk-ZKMFUD3Q.js → chunk-GT5F3OKM.js} +3 -3
- package/dist/node-runtime/chunk-H2BI7G7T.js +73 -0
- package/dist/node-runtime/{chunk-5P7PZMRU.js → chunk-HRS4HMDX.js} +1 -1
- package/dist/node-runtime/{chunk-IPA627GP.js → chunk-HXJS2PJM.js} +4 -4
- package/dist/node-runtime/chunk-JZHEUQRL.js +180 -0
- package/dist/node-runtime/chunk-LISUTZS3.js +19 -0
- package/dist/node-runtime/chunk-LOYUC2ID.js +2185 -0
- package/dist/node-runtime/{chunk-2QKLKMKC.js → chunk-LTXUQJI4.js} +1 -1
- package/dist/node-runtime/{chunk-YF63P5ZT.js → chunk-LTYWTR3V.js} +1 -426
- package/dist/node-runtime/{chunk-MKKH27PH.js → chunk-LWJXTA6Z.js} +274 -2416
- package/dist/node-runtime/chunk-MW2XJZIK.js +108 -0
- package/dist/node-runtime/{chunk-CDFZEWPU.js → chunk-N3PNL74S.js} +537 -262
- package/dist/node-runtime/{chunk-4TLO4PO2.js → chunk-U6C7VTR5.js} +7 -1401
- package/dist/node-runtime/chunk-URD2SLIT.js +1019 -0
- package/dist/node-runtime/{chunk-HQCKFM2O.js → chunk-VGYZ3APQ.js} +3 -0
- package/dist/node-runtime/{chunk-AJX357CL.js → chunk-VQ4UBWSA.js} +30 -1013
- package/dist/node-runtime/{chunk-F4VQFJI2.js → chunk-VTGEKB7R.js} +2 -2
- package/dist/node-runtime/{chunk-AD6VXAO7.js → chunk-VTPM5V35.js} +5 -100
- package/dist/node-runtime/chunk-W3SILANP.js +24 -0
- package/dist/node-runtime/{chunk-WOVTOV5P.js → chunk-XAUQOKYK.js} +421 -63
- package/dist/node-runtime/{chunk-ECD5L7YI.js → chunk-XSRCAQK2.js} +390 -16
- package/dist/node-runtime/{chunk-PCGNAY2O.js → chunk-ZOIIMEN6.js} +54 -433
- package/dist/node-runtime/{chunk-EDBJNRSM.js → chunk-ZVSORYRM.js} +1 -1
- package/dist/node-runtime/cli-runtime.js +1 -1
- package/dist/node-runtime/{command-L3LAHDIH.js → command-ZURZJDXF.js} +1 -1
- package/dist/node-runtime/{commands-RL5YBW5I.js → commands-BZGSLIP7.js} +4 -2
- package/dist/node-runtime/{customize-XEXL2DGQ.js → customize-LF5VST47.js} +1 -1
- package/dist/node-runtime/{direct-tool-executor-JVDXTO7A.js → direct-tool-executor-BSZDHIYR.js} +7 -4
- package/dist/node-runtime/{export-html-KR26FOUZ.js → export-html-E4DT6ZJQ.js} +1 -1
- package/dist/node-runtime/{gateway-X2TI5X7F.js → gateway-FWHRIBK5.js} +24 -369
- package/dist/node-runtime/index.js +49 -42
- package/dist/node-runtime/{init-NJV2T55N.js → init-DVJUAOUO.js} +4 -2
- package/dist/node-runtime/{interactive-mode-KOM35YF2.js → interactive-mode-BBASNWHN.js} +23 -17
- package/dist/node-runtime/{interactive-view-U6OILKF3.js → interactive-view-N6F4KUIT.js} +3 -5
- package/dist/node-runtime/lunr-computer-use-TJNDAMWM.js +135 -0
- package/dist/node-runtime/{lunr-cron-YJ5UHYRD.js → lunr-cron-J64I72C6.js} +7 -1
- package/dist/node-runtime/main.js +25 -20
- package/dist/node-runtime/{mcp-auth-flow-QIXHW6QN.js → mcp-auth-flow-YL6RWPYG.js} +2 -1
- package/dist/node-runtime/{package-manager-cli-TZZHJCVI.js → package-manager-cli-VMYX4Y2S.js} +10 -7
- package/dist/node-runtime/{pi-intercom-EEMBGQID.js → pi-intercom-NV2LW6X7.js} +108 -87
- package/dist/node-runtime/{pi-mcp-adapter-QFB37AVN.js → pi-mcp-adapter-JLB5YL2F.js} +31 -25
- package/dist/node-runtime/{pi-subagents-7XJ4H53P.js → pi-subagents-WEHV3W7H.js} +1321 -631
- package/dist/node-runtime/{pi-web-access-DPGAVKOA.js → pi-web-access-FN5YC5T6.js} +67 -64
- package/dist/node-runtime/{proxy-modes-HEEFK4KC.js → proxy-modes-OR7ISBXK.js} +7 -4
- package/dist/node-runtime/rpc-entry.js +25 -20
- package/dist/node-runtime/runtime-3SB5ATHQ.js +21 -0
- package/dist/node-runtime/{runtime-bridges-PPHNBFWL.js → runtime-bridges-2VQTLPOZ.js} +3 -5
- package/dist/node-runtime/{session-manager-MQNBYACL.js → session-manager-QEMZBMTM.js} +3 -5
- package/dist/node-runtime/{session-selector-5AZLJS6U.js → session-selector-URVJLOTK.js} +2 -2
- package/dist/node-runtime/{settings-manager-5LF2VQWC.js → settings-manager-3CCU326G.js} +4 -1
- package/dist/node-runtime/{src-Y7JSCK64.js → src-BPQFJR76.js} +27 -7
- package/dist/node-runtime/{subagent-executor-5RNDEPIJ.js → subagent-executor-CXKXQDHH.js} +189 -284
- package/dist/node-runtime/{update-cli-A253SZ7P.js → update-cli-NM7B4CKL.js} +4 -1
- package/dist/node-runtime/workflow-C26QCUTW.js +468 -0
- package/dist/rpc.d.ts +3 -0
- package/dist/rpc.d.ts.map +1 -0
- package/dist/rpc.js +18 -0
- package/dist/rpc.js.map +1 -0
- package/dist/startup/interactive-view.d.ts.map +1 -1
- package/dist/startup/interactive-view.js +1 -2
- package/dist/startup/interactive-view.js.map +1 -1
- package/docs/computer-use.md +242 -0
- package/docs/development.md +0 -32
- package/docs/features.md +24 -6
- package/docs/interactive-startup.md +10 -3
- package/docs/keybindings.md +5 -3
- package/docs/settings.md +3 -2
- package/docs/terminal-setup.md +1 -1
- package/docs/usage.md +1 -1
- 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/hidden-thinking-label.ts +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/install-lock/package-lock.json +3827 -0
- package/install-lock/package.json +18 -0
- package/native/computer-use/LICENSE.md +21 -0
- package/npm-shrinkwrap.json +3808 -0
- package/package.json +16 -10
- package/dist/builtin-extensions/lunr-settings-tools.d.ts +0 -4
- package/dist/builtin-extensions/lunr-settings-tools.d.ts.map +0 -1
- package/dist/builtin-extensions/lunr-settings-tools.js +0 -120
- package/dist/builtin-extensions/lunr-settings-tools.js.map +0 -1
- package/dist/core/settings-tools-bridge.d.ts +0 -35
- package/dist/core/settings-tools-bridge.d.ts.map +0 -1
- package/dist/core/settings-tools-bridge.js +0 -56
- package/dist/core/settings-tools-bridge.js.map +0 -1
- package/dist/node-runtime/chunk-AHSTJBIB.js +0 -64
- package/dist/startup/interactive-shell.d.ts +0 -55
- package/dist/startup/interactive-shell.d.ts.map +0 -1
- package/dist/startup/interactive-shell.js +0 -264
- package/dist/startup/interactive-shell.js.map +0 -1
- package/dist/node-runtime/{chunk-YSKSB3BJ.js → chunk-CH6OL6P2.js} +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-manager.js","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-mcp-adapter/server-manager.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport { SSEClientTransport } from \"@modelcontextprotocol/sdk/client/sse.js\";\nimport { UnauthorizedError } from \"@modelcontextprotocol/sdk/client/auth.js\";\nimport type { RequestOptions } from \"@modelcontextprotocol/sdk/shared/protocol.js\";\nimport {\n ElicitationCompleteNotificationSchema,\n type ReadResourceResult,\n type UrlElicitationRequiredError,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type {\n McpTool,\n McpResource,\n ServerDefinition,\n ServerStreamResultPatchNotification,\n Transport,\n} from \"./types.ts\";\nimport { serverStreamResultPatchNotificationSchema } from \"./types.ts\";\nimport { resolveNpxBinary } from \"./npx-resolver.ts\";\nimport { logger } from \"./logger.ts\";\nimport { McpOAuthProvider } from \"./mcp-oauth-provider.ts\";\nimport { extractOAuthConfig, supportsOAuth } from \"./mcp-auth-flow.ts\";\nimport { registerSamplingHandler, type ServerSamplingConfig } from \"./sampling-handler.ts\";\nimport {\n handleUrlElicitation,\n registerElicitationHandler,\n type ServerElicitationConfig,\n} from \"./elicitation-handler.ts\";\nimport { interpolateEnvRecord, resolveBearerToken, resolveConfigPath } from \"./utils.ts\";\nimport { abortable, throwIfAborted } from \"./abort.ts\";\n\ninterface ServerConnection {\n client: Client;\n transport: Transport;\n definition: ServerDefinition;\n tools: McpTool[];\n resources: McpResource[];\n lastUsedAt: number;\n inFlight: number;\n status: \"connected\" | \"closed\" | \"needs-auth\";\n}\n\ntype UiStreamListener = (serverName: string, notification: ServerStreamResultPatchNotification[\"params\"]) => void;\n\nexport class McpServerManager {\n private connections = new Map<string, ServerConnection>();\n private connectPromises = new Map<string, Promise<ServerConnection>>();\n private uiStreamListeners = new Map<string, UiStreamListener>();\n private samplingConfig: ServerSamplingConfig | undefined;\n private elicitationConfig: ServerElicitationConfig | undefined;\n private acceptedUrlElicitations = new Map<string, Set<string>>();\n private defaultRequestTimeoutMs: number | undefined;\n\n /** Default cwd for stdio servers without an explicit config `cwd`. */\n constructor(private readonly defaultCwd?: string) {}\n\n setSamplingConfig(config: ServerSamplingConfig | undefined): void {\n this.samplingConfig = config;\n }\n\n setElicitationConfig(config: ServerElicitationConfig | undefined): void {\n this.elicitationConfig = config;\n }\n\n setDefaultRequestTimeoutMs(timeoutMs: number | undefined): void {\n this.defaultRequestTimeoutMs = normalizeRequestTimeoutMs(timeoutMs);\n }\n\n getRequestOptions(name: string, signal?: AbortSignal): RequestOptions | undefined {\n const connection = this.connections.get(name);\n return this.buildRequestOptions(connection?.definition, signal);\n }\n\n private getResolvedRequestTimeoutMs(definition?: ServerDefinition): number | undefined {\n if (definition?.requestTimeoutMs !== undefined) {\n return normalizeRequestTimeoutMs(definition.requestTimeoutMs);\n }\n return this.defaultRequestTimeoutMs;\n }\n\n private buildRequestOptions(\n definition?: ServerDefinition,\n signal?: AbortSignal,\n ): RequestOptions | undefined {\n const timeout = this.getResolvedRequestTimeoutMs(definition);\n\n if (!signal && timeout === undefined) {\n return undefined;\n }\n\n return {\n ...(signal ? { signal } : {}),\n ...(timeout !== undefined ? { timeout } : {}),\n };\n }\n\n async connect(name: string, definition: ServerDefinition, signal?: AbortSignal): Promise<ServerConnection> {\n throwIfAborted(signal);\n // Dedupe concurrent connection attempts\n if (this.connectPromises.has(name)) {\n return abortable(this.connectPromises.get(name)!, signal);\n }\n\n // Reuse existing connection if healthy\n const existing = this.connections.get(name);\n if (existing?.status === \"connected\") {\n existing.lastUsedAt = Date.now();\n return existing;\n }\n\n const promise = this.createConnection(name, definition, signal);\n this.connectPromises.set(name, promise);\n\n try {\n const connection = await promise;\n this.connections.set(name, connection);\n return connection;\n } finally {\n this.connectPromises.delete(name);\n }\n }\n\n private async createConnection(\n name: string,\n definition: ServerDefinition,\n signal?: AbortSignal,\n ): Promise<ServerConnection> {\n throwIfAborted(signal);\n const client = this.createClient(name);\n\n let transport: Transport;\n\n if (definition.command) {\n let command = definition.command;\n let args = definition.args ?? [];\n\n if (command === \"npx\" || command === \"npm\") {\n const resolved = await resolveNpxBinary(command, args);\n if (resolved) {\n command = resolved.isJs ? \"node\" : resolved.binPath;\n args = resolved.isJs ? [resolved.binPath, ...resolved.extraArgs] : resolved.extraArgs;\n logger.debug(`${name} resolved to ${resolved.binPath} (skipping npm parent)`);\n }\n }\n\n transport = new StdioClientTransport({\n command,\n args,\n env: resolveEnv(definition.env),\n cwd: resolveConfigPath(definition.cwd) ?? this.defaultCwd,\n stderr: definition.debug ? \"inherit\" : \"ignore\",\n });\n } else if (definition.url) {\n // HTTP transport with fallback\n transport = await this.createHttpTransport(definition, name, signal);\n } else {\n throw new Error(`Server ${name} has no command or url`);\n }\n\n const requestOptions = this.buildRequestOptions(definition, signal);\n\n try {\n await client.connect(transport, requestOptions);\n this.attachAdapterNotificationHandlers(name, client);\n\n // Discover tools and resources\n const [tools, resources] = await Promise.all([\n this.fetchAllTools(client, requestOptions),\n this.fetchAllResources(client, requestOptions),\n ]);\n\n return {\n client,\n transport,\n definition,\n tools,\n resources,\n lastUsedAt: Date.now(),\n inFlight: 0,\n status: \"connected\",\n };\n } catch (error) {\n // Check for UnauthorizedError - server requires OAuth\n if (error instanceof UnauthorizedError && supportsOAuth(definition)) {\n // Clean up both client and transport before reporting needs-auth.\n await client.close().catch(() => {});\n await transport.close().catch(() => {});\n\n return {\n client,\n transport,\n definition,\n tools: [],\n resources: [],\n lastUsedAt: Date.now(),\n inFlight: 0,\n status: \"needs-auth\",\n };\n }\n\n // Clean up both client and transport on any error\n await client.close().catch(() => {});\n await transport.close().catch(() => {});\n throw error;\n }\n }\n\n private buildClientCapabilities() {\n return {\n ...(this.samplingConfig ? { sampling: {} } : {}),\n ...(this.elicitationConfig\n ? {\n elicitation: {\n form: {},\n ...(this.elicitationConfig.allowUrl ? { url: {} } : {}),\n },\n }\n : {}),\n };\n }\n\n private createClient(serverName: string): Client {\n const capabilities = this.buildClientCapabilities();\n const client = new Client(\n { name: `pi-mcp-${serverName}`, version: \"1.0.0\" },\n Object.keys(capabilities).length > 0 ? { capabilities } : undefined,\n );\n if (this.samplingConfig) {\n registerSamplingHandler(client, { ...this.samplingConfig, serverName });\n }\n if (this.elicitationConfig) {\n registerElicitationHandler(client, {\n ...this.elicitationConfig,\n serverName,\n onUrlAccepted: elicitationId => this.rememberUrlElicitation(serverName, elicitationId),\n });\n if (this.elicitationConfig.allowUrl) {\n client.setNotificationHandler(ElicitationCompleteNotificationSchema, notification => {\n const accepted = this.acceptedUrlElicitations.get(serverName);\n if (!accepted?.delete(notification.params.elicitationId)) return;\n this.elicitationConfig?.ui.notify(\n `MCP browser interaction for ${serverName} completed. You can retry the tool now.`,\n \"info\",\n );\n });\n }\n }\n return client;\n }\n\n async handleUrlElicitationRequired(\n serverName: string,\n error: UrlElicitationRequiredError,\n ): Promise<\"accept\" | \"decline\" | \"cancel\"> {\n if (!this.elicitationConfig?.allowUrl) return \"cancel\";\n for (const params of error.elicitations) {\n const result = await handleUrlElicitation({\n ...this.elicitationConfig,\n serverName,\n onUrlAccepted: elicitationId => this.rememberUrlElicitation(serverName, elicitationId),\n }, params);\n if (result.action !== \"accept\") return result.action;\n }\n return \"accept\";\n }\n\n private rememberUrlElicitation(serverName: string, elicitationId: string): void {\n let accepted = this.acceptedUrlElicitations.get(serverName);\n if (!accepted) {\n accepted = new Set();\n this.acceptedUrlElicitations.set(serverName, accepted);\n }\n accepted.add(elicitationId);\n }\n\n private async createHttpTransport(\n definition: ServerDefinition,\n serverName: string,\n signal?: AbortSignal,\n ): Promise<Transport> {\n throwIfAborted(signal);\n const url = new URL(definition.url!);\n\n // Build headers first (including any bearer token)\n const headers = resolveHeaders(definition.headers) ?? {};\n\n // For bearer auth, add the token to headers BEFORE creating requestInit\n if (definition.auth === \"bearer\") {\n const token = resolveBearerToken(definition);\n if (token) {\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n }\n\n // Create request init with headers (Authorization now included for bearer auth)\n const requestInit = Object.keys(headers).length > 0 ? { headers } : undefined;\n\n // For OAuth servers, create an auth provider\n let authProvider: McpOAuthProvider | undefined;\n if (supportsOAuth(definition)) {\n const oauthConfig = extractOAuthConfig(definition);\n authProvider = new McpOAuthProvider(\n serverName,\n definition.url!,\n oauthConfig,\n {\n onRedirect: async (_authUrl) => {\n // URL is captured by startAuth, no need to log\n },\n }\n );\n }\n\n // Try StreamableHTTP first (modern MCP servers)\n const streamableTransport = new StreamableHTTPClientTransport(url, {\n requestInit,\n authProvider,\n });\n\n try {\n // Create a test client to verify the transport works\n const testClient = new Client({ name: \"pi-mcp-probe\", version: \"2.1.2\" });\n await testClient.connect(streamableTransport, this.buildRequestOptions(definition, signal));\n await testClient.close().catch(() => {});\n // Close probe transport before creating fresh one\n await streamableTransport.close().catch(() => {});\n\n // StreamableHTTP works - create fresh transport for actual use\n return new StreamableHTTPClientTransport(url, { requestInit, authProvider });\n } catch (error) {\n // StreamableHTTP failed, close and try SSE fallback\n await streamableTransport.close().catch(() => {});\n\n // Host cancellation is not transport capability evidence; do not fall\n // through to SSE when the caller is trying to cancel the connect.\n if (signal?.aborted) {\n throwIfAborted(signal);\n }\n\n // If this was an UnauthorizedError, don't try SSE - the server needs auth\n if (error instanceof UnauthorizedError) {\n throw error;\n }\n\n // SSE is the legacy transport\n return new SSEClientTransport(url, { requestInit, authProvider });\n }\n }\n\n private async fetchAllTools(client: Client, requestOptions?: RequestOptions): Promise<McpTool[]> {\n const allTools: McpTool[] = [];\n let cursor: string | undefined;\n\n do {\n const result = await client.listTools(cursor ? { cursor } : undefined, requestOptions);\n allTools.push(...(result.tools ?? []));\n cursor = result.nextCursor;\n } while (cursor);\n\n return allTools;\n }\n\n private async fetchAllResources(client: Client, requestOptions?: RequestOptions): Promise<McpResource[]> {\n try {\n const allResources: McpResource[] = [];\n let cursor: string | undefined;\n\n do {\n const result = await client.listResources(cursor ? { cursor } : undefined, requestOptions);\n allResources.push(...(result.resources ?? []));\n cursor = result.nextCursor;\n } while (cursor);\n\n return allResources;\n } catch {\n if (requestOptions?.signal?.aborted) {\n throwIfAborted(requestOptions.signal);\n }\n // Server may not support resources\n return [];\n }\n }\n\n private attachAdapterNotificationHandlers(serverName: string, client: Client): void {\n client.setNotificationHandler(serverStreamResultPatchNotificationSchema, (notification) => {\n const listener = this.uiStreamListeners.get(notification.params.streamToken);\n if (!listener) return;\n listener(serverName, notification.params);\n });\n }\n\n registerUiStreamListener(streamToken: string, listener: UiStreamListener): void {\n this.uiStreamListeners.set(streamToken, listener);\n }\n\n removeUiStreamListener(streamToken: string): void {\n this.uiStreamListeners.delete(streamToken);\n }\n\n async readResource(name: string, uri: string, signal?: AbortSignal): Promise<ReadResourceResult> {\n const connection = this.connections.get(name);\n if (!connection || connection.status !== \"connected\") {\n throw new Error(`Server \"${name}\" is not connected`);\n }\n\n try {\n this.touch(name);\n this.incrementInFlight(name);\n return await connection.client.readResource({ uri }, this.getRequestOptions(name, signal));\n } finally {\n this.decrementInFlight(name);\n this.touch(name);\n }\n }\n\n async close(name: string): Promise<void> {\n const connection = this.connections.get(name);\n if (!connection) return;\n\n // Delete from map BEFORE async cleanup to prevent a race where a\n // concurrent connect() creates a new connection that our deferred\n // delete() would then remove, orphaning the new server process.\n connection.status = \"closed\";\n this.connections.delete(name);\n this.acceptedUrlElicitations.delete(name);\n await connection.client.close().catch(() => {});\n await connection.transport.close().catch(() => {});\n }\n\n async closeAll(): Promise<void> {\n const names = [...this.connections.keys()];\n await Promise.all(names.map(name => this.close(name)));\n }\n\n getConnection(name: string): ServerConnection | undefined {\n return this.connections.get(name);\n }\n\n getAllConnections(): Map<string, ServerConnection> {\n return new Map(this.connections);\n }\n\n touch(name: string): void {\n const connection = this.connections.get(name);\n if (connection) {\n connection.lastUsedAt = Date.now();\n }\n }\n\n incrementInFlight(name: string): void {\n const connection = this.connections.get(name);\n if (connection) {\n connection.inFlight = (connection.inFlight ?? 0) + 1;\n }\n }\n\n decrementInFlight(name: string): void {\n const connection = this.connections.get(name);\n if (connection && connection.inFlight) {\n connection.inFlight--;\n }\n }\n\n isIdle(name: string, timeoutMs: number): boolean {\n const connection = this.connections.get(name);\n if (!connection || connection.status !== \"connected\") return false;\n if (connection.inFlight > 0) return false;\n return (Date.now() - connection.lastUsedAt) > timeoutMs;\n }\n}\n\n/**\n * Resolve environment variables with interpolation.\n */\nfunction resolveEnv(env?: Record<string, string>): Record<string, string> {\n // Copy process.env, filtering out undefined values\n const resolved: Record<string, string> = {};\n for (const [key, value] of Object.entries(process.env)) {\n if (value !== undefined) {\n resolved[key] = value;\n }\n }\n\n if (!env) return resolved;\n\n const overrides = interpolateEnvRecord(env);\n return overrides ? { ...resolved, ...overrides } : resolved;\n}\n\n/**\n * Resolve headers with environment variable interpolation.\n */\nfunction resolveHeaders(headers?: Record<string, string>): Record<string, string> | undefined {\n return interpolateEnvRecord(headers);\n}\n\nfunction normalizeRequestTimeoutMs(timeoutMs: number | undefined): number | undefined {\n return typeof timeoutMs === \"number\" && Number.isFinite(timeoutMs) && timeoutMs > 0\n ? timeoutMs\n : undefined;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"server-manager.js","sourceRoot":"","sources":["../../../src/builtin-extensions/pi-mcp-adapter/server-manager.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport { Client } from \"@modelcontextprotocol/sdk/client/index.js\";\nimport { StdioClientTransport } from \"@modelcontextprotocol/sdk/client/stdio.js\";\nimport { StreamableHTTPClientTransport } from \"@modelcontextprotocol/sdk/client/streamableHttp.js\";\nimport { SSEClientTransport } from \"@modelcontextprotocol/sdk/client/sse.js\";\nimport { UnauthorizedError } from \"@modelcontextprotocol/sdk/client/auth.js\";\nimport type { RequestOptions } from \"@modelcontextprotocol/sdk/shared/protocol.js\";\nimport {\n ElicitationCompleteNotificationSchema,\n type ReadResourceResult,\n type UrlElicitationRequiredError,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport type {\n McpTool,\n McpResource,\n ServerDefinition,\n ServerStreamResultPatchNotification,\n Transport,\n} from \"./types.ts\";\nimport { serverStreamResultPatchNotificationSchema } from \"./types.ts\";\nimport { resolveNpxBinary } from \"./npx-resolver.ts\";\nimport { logger } from \"./logger.ts\";\nimport { McpOAuthProvider } from \"./mcp-oauth-provider.ts\";\nimport { extractOAuthConfig, supportsOAuth } from \"./mcp-auth-flow.ts\";\nimport { registerSamplingHandler, type ServerSamplingConfig } from \"./sampling-handler.ts\";\nimport {\n handleUrlElicitation,\n registerElicitationHandler,\n type ServerElicitationConfig,\n} from \"./elicitation-handler.ts\";\nimport { interpolateEnvRecord, resolveBearerToken, resolveConfigPath } from \"./utils.ts\";\nimport { abortable, throwIfAborted } from \"./abort.ts\";\n\ninterface PendingConnection {\n client: Client;\n transport: Transport;\n}\n\ninterface ServerConnection extends PendingConnection {\n definition: ServerDefinition;\n tools: McpTool[];\n resources: McpResource[];\n lastUsedAt: number;\n inFlight: number;\n status: \"connected\" | \"closed\" | \"needs-auth\";\n}\n\ntype UiStreamListener = (serverName: string, notification: ServerStreamResultPatchNotification[\"params\"]) => void;\n\nexport class McpServerManager {\n private connections = new Map<string, ServerConnection>();\n private connectPromises = new Map<string, Promise<ServerConnection>>();\n private pendingConnections = new Map<string, PendingConnection>();\n private closing = false;\n private uiStreamListeners = new Map<string, UiStreamListener>();\n private samplingConfig: ServerSamplingConfig | undefined;\n private elicitationConfig: ServerElicitationConfig | undefined;\n private acceptedUrlElicitations = new Map<string, Set<string>>();\n private defaultRequestTimeoutMs: number | undefined;\n\n /** Default cwd for stdio servers without an explicit config `cwd`. */\n constructor(private readonly defaultCwd?: string) {}\n\n setSamplingConfig(config: ServerSamplingConfig | undefined): void {\n this.samplingConfig = config;\n }\n\n setElicitationConfig(config: ServerElicitationConfig | undefined): void {\n this.elicitationConfig = config;\n }\n\n setDefaultRequestTimeoutMs(timeoutMs: number | undefined): void {\n this.defaultRequestTimeoutMs = normalizeRequestTimeoutMs(timeoutMs);\n }\n\n getRequestOptions(name: string, signal?: AbortSignal): RequestOptions | undefined {\n const connection = this.connections.get(name);\n return this.buildRequestOptions(connection?.definition, signal);\n }\n\n private getResolvedRequestTimeoutMs(definition?: ServerDefinition): number | undefined {\n if (definition?.requestTimeoutMs !== undefined) {\n return normalizeRequestTimeoutMs(definition.requestTimeoutMs);\n }\n return this.defaultRequestTimeoutMs;\n }\n\n private buildRequestOptions(\n definition?: ServerDefinition,\n signal?: AbortSignal,\n ): RequestOptions | undefined {\n const timeout = this.getResolvedRequestTimeoutMs(definition);\n\n if (!signal && timeout === undefined) {\n return undefined;\n }\n\n return {\n ...(signal ? { signal } : {}),\n ...(timeout !== undefined ? { timeout } : {}),\n };\n }\n\n async connect(name: string, definition: ServerDefinition, signal?: AbortSignal): Promise<ServerConnection> {\n throwIfAborted(signal);\n if (this.closing) throw new Error(\"MCP server manager is closed\");\n // Dedupe concurrent connection attempts\n if (this.connectPromises.has(name)) {\n return abortable(this.connectPromises.get(name)!, signal);\n }\n\n // Reuse existing connection if healthy\n const existing = this.connections.get(name);\n if (existing?.status === \"connected\") {\n existing.lastUsedAt = Date.now();\n return existing;\n }\n\n const promise = this.createConnection(name, definition, signal).then(async connection => {\n if (this.closing || signal?.aborted) {\n await this.disposeConnection(connection);\n throwIfAborted(signal);\n throw new Error(\"MCP server manager closed during connection\");\n }\n this.connections.set(name, connection);\n return connection;\n });\n this.connectPromises.set(name, promise);\n\n try {\n return await promise;\n } finally {\n if (this.connectPromises.get(name) === promise) this.connectPromises.delete(name);\n }\n }\n\n private async createConnection(\n name: string,\n definition: ServerDefinition,\n signal?: AbortSignal,\n ): Promise<ServerConnection> {\n throwIfAborted(signal);\n const client = this.createClient(name);\n\n let transport: Transport;\n\n if (definition.command) {\n let command = definition.command;\n let args = definition.args ?? [];\n\n if (command === \"npx\" || command === \"npm\") {\n const resolved = await resolveNpxBinary(command, args);\n if (resolved) {\n command = resolved.isJs ? \"node\" : resolved.binPath;\n args = resolved.isJs ? [resolved.binPath, ...resolved.extraArgs] : resolved.extraArgs;\n logger.debug(`${name} resolved to ${resolved.binPath} (skipping npm parent)`);\n }\n }\n\n transport = new StdioClientTransport({\n command,\n args,\n env: resolveEnv(definition.env),\n cwd: resolveConfigPath(definition.cwd) ?? this.defaultCwd,\n stderr: definition.debug ? \"inherit\" : \"ignore\",\n });\n } else if (definition.url) {\n // HTTP transport with fallback\n transport = await this.createHttpTransport(definition, name, signal);\n } else {\n throw new Error(`Server ${name} has no command or url`);\n }\n\n const requestOptions = this.buildRequestOptions(definition, signal);\n const pending = { client, transport };\n this.pendingConnections.set(name, pending);\n\n try {\n await client.connect(transport, requestOptions);\n this.attachAdapterNotificationHandlers(name, client);\n\n // Discover tools and resources\n const [tools, resources] = await Promise.all([\n this.fetchAllTools(client, requestOptions),\n this.fetchAllResources(client, requestOptions),\n ]);\n\n return {\n client,\n transport,\n definition,\n tools,\n resources,\n lastUsedAt: Date.now(),\n inFlight: 0,\n status: \"connected\",\n };\n } catch (error) {\n // Check for UnauthorizedError - server requires OAuth\n if (error instanceof UnauthorizedError && supportsOAuth(definition)) {\n // Clean up both client and transport before reporting needs-auth.\n await client.close().catch(() => {});\n await transport.close().catch(() => {});\n\n return {\n client,\n transport,\n definition,\n tools: [],\n resources: [],\n lastUsedAt: Date.now(),\n inFlight: 0,\n status: \"needs-auth\",\n };\n }\n\n // Clean up both client and transport on any error\n await client.close().catch(() => {});\n await transport.close().catch(() => {});\n throw error;\n } finally {\n if (this.pendingConnections.get(name) === pending) this.pendingConnections.delete(name);\n }\n }\n\n private buildClientCapabilities() {\n return {\n ...(this.samplingConfig ? { sampling: {} } : {}),\n ...(this.elicitationConfig\n ? {\n elicitation: {\n form: {},\n ...(this.elicitationConfig.allowUrl ? { url: {} } : {}),\n },\n }\n : {}),\n };\n }\n\n private createClient(serverName: string): Client {\n const capabilities = this.buildClientCapabilities();\n const client = new Client(\n { name: `pi-mcp-${serverName}`, version: \"1.0.0\" },\n Object.keys(capabilities).length > 0 ? { capabilities } : undefined,\n );\n if (this.samplingConfig) {\n registerSamplingHandler(client, { ...this.samplingConfig, serverName });\n }\n if (this.elicitationConfig) {\n registerElicitationHandler(client, {\n ...this.elicitationConfig,\n serverName,\n onUrlAccepted: elicitationId => this.rememberUrlElicitation(serverName, elicitationId),\n });\n if (this.elicitationConfig.allowUrl) {\n client.setNotificationHandler(ElicitationCompleteNotificationSchema, notification => {\n const accepted = this.acceptedUrlElicitations.get(serverName);\n if (!accepted?.delete(notification.params.elicitationId)) return;\n this.elicitationConfig?.ui.notify(\n `MCP browser interaction for ${serverName} completed. You can retry the tool now.`,\n \"info\",\n );\n });\n }\n }\n return client;\n }\n\n async handleUrlElicitationRequired(\n serverName: string,\n error: UrlElicitationRequiredError,\n ): Promise<\"accept\" | \"decline\" | \"cancel\"> {\n if (!this.elicitationConfig?.allowUrl) return \"cancel\";\n for (const params of error.elicitations) {\n const result = await handleUrlElicitation({\n ...this.elicitationConfig,\n serverName,\n onUrlAccepted: elicitationId => this.rememberUrlElicitation(serverName, elicitationId),\n }, params);\n if (result.action !== \"accept\") return result.action;\n }\n return \"accept\";\n }\n\n private rememberUrlElicitation(serverName: string, elicitationId: string): void {\n let accepted = this.acceptedUrlElicitations.get(serverName);\n if (!accepted) {\n accepted = new Set();\n this.acceptedUrlElicitations.set(serverName, accepted);\n }\n accepted.add(elicitationId);\n }\n\n private async createHttpTransport(\n definition: ServerDefinition,\n serverName: string,\n signal?: AbortSignal,\n ): Promise<Transport> {\n throwIfAborted(signal);\n const url = new URL(definition.url!);\n\n // Build headers first (including any bearer token)\n const headers = resolveHeaders(definition.headers) ?? {};\n\n // For bearer auth, add the token to headers BEFORE creating requestInit\n if (definition.auth === \"bearer\") {\n const token = resolveBearerToken(definition);\n if (token) {\n headers[\"Authorization\"] = `Bearer ${token}`;\n }\n }\n\n // Create request init with headers (Authorization now included for bearer auth)\n const requestInit = Object.keys(headers).length > 0 ? { headers } : undefined;\n\n // For OAuth servers, create an auth provider\n let authProvider: McpOAuthProvider | undefined;\n if (supportsOAuth(definition)) {\n const oauthConfig = extractOAuthConfig(definition);\n authProvider = new McpOAuthProvider(\n serverName,\n definition.url!,\n oauthConfig,\n {\n onRedirect: async (_authUrl) => {\n // URL is captured by startAuth, no need to log\n },\n }\n );\n }\n\n // Try StreamableHTTP first (modern MCP servers)\n const streamableTransport = new StreamableHTTPClientTransport(url, {\n requestInit,\n authProvider,\n });\n\n try {\n // Create a test client to verify the transport works\n const testClient = new Client({ name: \"pi-mcp-probe\", version: \"2.1.2\" });\n await testClient.connect(streamableTransport, this.buildRequestOptions(definition, signal));\n await testClient.close().catch(() => {});\n // Close probe transport before creating fresh one\n await streamableTransport.close().catch(() => {});\n\n // StreamableHTTP works - create fresh transport for actual use\n return new StreamableHTTPClientTransport(url, { requestInit, authProvider });\n } catch (error) {\n // StreamableHTTP failed, close and try SSE fallback\n await streamableTransport.close().catch(() => {});\n\n // Host cancellation is not transport capability evidence; do not fall\n // through to SSE when the caller is trying to cancel the connect.\n if (signal?.aborted) {\n throwIfAborted(signal);\n }\n\n // If this was an UnauthorizedError, don't try SSE - the server needs auth\n if (error instanceof UnauthorizedError) {\n throw error;\n }\n\n // SSE is the legacy transport\n return new SSEClientTransport(url, { requestInit, authProvider });\n }\n }\n\n private async fetchAllTools(client: Client, requestOptions?: RequestOptions): Promise<McpTool[]> {\n const allTools: McpTool[] = [];\n let cursor: string | undefined;\n\n do {\n const result = await client.listTools(cursor ? { cursor } : undefined, requestOptions);\n allTools.push(...(result.tools ?? []));\n cursor = result.nextCursor;\n } while (cursor);\n\n return allTools;\n }\n\n private async fetchAllResources(client: Client, requestOptions?: RequestOptions): Promise<McpResource[]> {\n try {\n const allResources: McpResource[] = [];\n let cursor: string | undefined;\n\n do {\n const result = await client.listResources(cursor ? { cursor } : undefined, requestOptions);\n allResources.push(...(result.resources ?? []));\n cursor = result.nextCursor;\n } while (cursor);\n\n return allResources;\n } catch {\n if (requestOptions?.signal?.aborted) {\n throwIfAborted(requestOptions.signal);\n }\n // Server may not support resources\n return [];\n }\n }\n\n private attachAdapterNotificationHandlers(serverName: string, client: Client): void {\n client.setNotificationHandler(serverStreamResultPatchNotificationSchema, (notification) => {\n const listener = this.uiStreamListeners.get(notification.params.streamToken);\n if (!listener) return;\n listener(serverName, notification.params);\n });\n }\n\n registerUiStreamListener(streamToken: string, listener: UiStreamListener): void {\n this.uiStreamListeners.set(streamToken, listener);\n }\n\n removeUiStreamListener(streamToken: string): void {\n this.uiStreamListeners.delete(streamToken);\n }\n\n async readResource(name: string, uri: string, signal?: AbortSignal): Promise<ReadResourceResult> {\n const connection = this.connections.get(name);\n if (!connection || connection.status !== \"connected\") {\n throw new Error(`Server \"${name}\" is not connected`);\n }\n\n try {\n this.touch(name);\n this.incrementInFlight(name);\n return await connection.client.readResource({ uri }, this.getRequestOptions(name, signal));\n } finally {\n this.decrementInFlight(name);\n this.touch(name);\n }\n }\n\n private async disposeConnection(connection: PendingConnection): Promise<void> {\n await connection.client.close().catch(() => {});\n await connection.transport.close().catch(() => {});\n }\n\n async close(name: string): Promise<void> {\n const connection = this.connections.get(name);\n if (!connection) return;\n\n // Delete from map BEFORE async cleanup to prevent a race where a\n // concurrent connect() creates a new connection that our deferred\n // delete() would then remove, orphaning the new server process.\n connection.status = \"closed\";\n this.connections.delete(name);\n this.acceptedUrlElicitations.delete(name);\n await this.disposeConnection(connection);\n }\n\n async closeAll(): Promise<void> {\n this.closing = true;\n const names = [...this.connections.keys()];\n const pending = [...this.pendingConnections.values()];\n await Promise.all([\n ...names.map(name => this.close(name)),\n ...pending.map(connection => this.disposeConnection(connection)),\n ]);\n }\n\n getConnection(name: string): ServerConnection | undefined {\n return this.connections.get(name);\n }\n\n getAllConnections(): Map<string, ServerConnection> {\n return new Map(this.connections);\n }\n\n touch(name: string): void {\n const connection = this.connections.get(name);\n if (connection) {\n connection.lastUsedAt = Date.now();\n }\n }\n\n incrementInFlight(name: string): void {\n const connection = this.connections.get(name);\n if (connection) {\n connection.inFlight = (connection.inFlight ?? 0) + 1;\n }\n }\n\n decrementInFlight(name: string): void {\n const connection = this.connections.get(name);\n if (connection && connection.inFlight) {\n connection.inFlight--;\n }\n }\n\n isIdle(name: string, timeoutMs: number): boolean {\n const connection = this.connections.get(name);\n if (!connection || connection.status !== \"connected\") return false;\n if (connection.inFlight > 0) return false;\n return (Date.now() - connection.lastUsedAt) > timeoutMs;\n }\n}\n\n/**\n * Resolve environment variables with interpolation.\n */\nfunction resolveEnv(env?: Record<string, string>): Record<string, string> {\n // Copy process.env, filtering out undefined values\n const resolved: Record<string, string> = {};\n for (const [key, value] of Object.entries(process.env)) {\n if (value !== undefined) {\n resolved[key] = value;\n }\n }\n\n if (!env) return resolved;\n\n const overrides = interpolateEnvRecord(env);\n return overrides ? { ...resolved, ...overrides } : resolved;\n}\n\n/**\n * Resolve headers with environment variable interpolation.\n */\nfunction resolveHeaders(headers?: Record<string, string>): Record<string, string> | undefined {\n return interpolateEnvRecord(headers);\n}\n\nfunction normalizeRequestTimeoutMs(timeoutMs: number | undefined): number | undefined {\n return typeof timeoutMs === \"number\" && Number.isFinite(timeoutMs) && timeoutMs > 0\n ? timeoutMs\n : undefined;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fanout-child.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/extension/fanout-child.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"fanout-child.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/extension/fanout-child.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,iCAAiC,CAAC;AAiIpF,MAAM,CAAC,OAAO,UAAU,oCAAoC,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAyCnF","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { ExtensionAPI, ToolDefinition } from \"@ashx-j/lunr-dev\";\n\nimport { getArtifactsDir } from \"../shared/artifacts.ts\";\nimport { createSubagentExecutor, type SubagentParamsLike } from \"../runs/foreground/subagent-executor.ts\";\nimport { resolveWaitToolConfig } from \"../runs/background/wait-config.ts\";\nimport { normalizeAsyncLaunchConfig } from \"../runs/background/top-level-async.ts\";\nimport { SUBAGENT_CHILD_ENV, SUBAGENT_FANOUT_CHILD_ENV } from \"../runs/shared/pi-args.ts\";\nimport { readNestedControlRequests, resolveNestedRouteFromEnv, writeNestedControlResult } from \"../runs/shared/nested-events.ts\";\nimport { deliverSubagentIntercomMessageEvent } from \"../intercom/result-intercom.ts\";\nimport { resolveSubagentIntercomTarget } from \"../intercom/intercom-bridge.ts\";\nimport { SubagentParams } from \"./schemas.ts\";\nimport { loadConfig } from \"./config.ts\";\nimport { type Details, type SubagentState } from \"../shared/types.ts\";\n\nfunction getSubagentSessionRoot(parentSessionFile: string | null): string {\n\tif (parentSessionFile) {\n\t\tconst baseName = path.basename(parentSessionFile, \".jsonl\");\n\t\tconst sessionsDir = path.dirname(parentSessionFile);\n\t\treturn path.join(sessionsDir, baseName);\n\t}\n\treturn fs.mkdtempSync(path.join(os.tmpdir(), \"pi-subagent-session-\"));\n}\n\nfunction expandTilde(p: string): string {\n\treturn p.startsWith(\"~/\") ? path.join(os.homedir(), p.slice(2)) : p;\n}\n\nfunction createChildSafeState(): SubagentState {\n\treturn {\n\t\tbaseCwd: \"\",\n\t\tcurrentSessionId: null,\n\t\tforegroundSubagentInFlight: 0,\n\t\tsubagentSpawns: { sessionId: null, count: 0 },\n\t\tasyncJobs: new Map(),\n\t\tforegroundRuns: new Map(),\n\t\tforegroundControls: new Map(),\n\t\tlastForegroundControlId: null,\n\t\tpendingForegroundControlNotices: new Map(),\n\t\tcleanupTimers: new Map(),\n\t\tlastUiContext: null,\n\t\tpoller: null,\n\t\tcompletionSeen: new Map(),\n\t\twatcher: null,\n\t\twatcherRestartTimer: null,\n\t\tresultFileCoalescer: {\n\t\t\tschedule: () => false,\n\t\t\tclear: () => {},\n\t\t},\n\t};\n}\n\nfunction startNestedControlInboxListener(pi: ExtensionAPI, state: SubagentState): NodeJS.Timeout | undefined {\n\tlet route;\n\ttry {\n\t\troute = resolveNestedRouteFromEnv();\n\t} catch {\n\t\treturn undefined;\n\t}\n\tif (!route) return undefined;\n\tconst seen = new Set<string>();\n\tconst inFlight = new Set<string>();\n\tconst pendingResults = new Map<string, Parameters<typeof writeNestedControlResult>[1]>();\n\tconst timer = setInterval(() => {\n\t\ttry {\n\t\t\tfor (const request of readNestedControlRequests(route)) {\n\t\t\t\tif (seen.has(request.requestId) || inFlight.has(request.requestId)) continue;\n\t\t\t\tinFlight.add(request.requestId);\n\t\t\t\tvoid (async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlet result = pendingResults.get(request.requestId);\n\t\t\t\t\t\tif (!result) {\n\t\t\t\t\t\t\tlet ok = false;\n\t\t\t\t\t\t\tlet message = \"Control request failed.\";\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst control = state.foregroundControls.get(request.targetRunId);\n\t\t\t\t\t\t\t\tif (!control) {\n\t\t\t\t\t\t\t\t\tmessage = `Nested run ${request.targetRunId} is not active in this fanout child.`;\n\t\t\t\t\t\t\t\t} else if (request.action === \"interrupt\") {\n\t\t\t\t\t\t\t\t\tok = control.interrupt?.() === true;\n\t\t\t\t\t\t\t\t\tmessage = ok\n\t\t\t\t\t\t\t\t\t\t? `Interrupt requested for nested run ${request.targetRunId}.`\n\t\t\t\t\t\t\t\t\t\t: `Nested run ${request.targetRunId} has no active child step to interrupt.`;\n\t\t\t\t\t\t\t\t} else if (!request.message?.trim()) {\n\t\t\t\t\t\t\t\t\tmessage = \"Nested resume requires message.\";\n\t\t\t\t\t\t\t\t} else if (!control.currentChildId && !control.currentAgent) {\n\t\t\t\t\t\t\t\t\tmessage = `Nested run ${request.targetRunId} has no active child message route.`;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tconst index = control.currentIndex ?? 0;\n\t\t\t\t\t\t\t\t\tconst childId = control.currentChildId ?? control.currentAgent!;\n\t\t\t\t\t\t\t\t\tconst target = resolveSubagentIntercomTarget(request.targetRunId, childId, index);\n\t\t\t\t\t\t\t\t\tok = await deliverSubagentIntercomMessageEvent(\n\t\t\t\t\t\t\t\t\t\tpi.events,\n\t\t\t\t\t\t\t\t\t\ttarget,\n\t\t\t\t\t\t\t\t\t\t`Follow-up for nested run ${request.targetRunId} (${control.currentAgent}):\\n\\n${request.message.trim()}`,\n\t\t\t\t\t\t\t\t\t\t500,\n\t\t\t\t\t\t\t\t\t\t{ source: \"nested-resume\", runId: request.targetRunId, agent: control.currentAgent, index },\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tmessage = ok\n\t\t\t\t\t\t\t\t\t\t? `Delivered follow-up to live nested run ${request.targetRunId}.`\n\t\t\t\t\t\t\t\t\t\t: `Nested child intercom target is not registered: ${target}`;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\tmessage = error instanceof Error ? error.message : String(error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tresult = { ts: Date.now(), requestId: request.requestId, targetRunId: request.targetRunId, ok, message };\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\twriteNestedControlResult(route, result);\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tpendingResults.set(request.requestId, result);\n\t\t\t\t\t\t\tconsole.error(`Failed to write nested control result for request '${request.requestId}' targeting '${request.targetRunId}' via inbox '${route.controlInbox}'; keeping request for retry:`, error);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpendingResults.delete(request.requestId);\n\t\t\t\t\t\tseen.add(request.requestId);\n\t\t\t\t\t\ttry { fs.unlinkSync(request.filePath); } catch {}\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tinFlight.delete(request.requestId);\n\t\t\t\t\t}\n\t\t\t\t})();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(`Failed to poll nested control inbox '${route.controlInbox}' for root '${route.rootRunId}':`, error);\n\t\t}\n\t}, 200);\n\ttimer.unref?.();\n\treturn timer;\n}\n\nexport default function registerFanoutChildSubagentExtension(pi: ExtensionAPI): void {\n\tif (process.env[SUBAGENT_CHILD_ENV] !== \"1\" || process.env[SUBAGENT_FANOUT_CHILD_ENV] !== \"1\") return;\n\n\tconst globalStore = globalThis as Record<string, unknown>;\n\tconst registeredKey = \"__piSubagentFanoutChildRegisteredApis\";\n\tconst registeredApis = globalStore[registeredKey] instanceof WeakSet\n\t\t? globalStore[registeredKey] as WeakSet<ExtensionAPI>\n\t\t: new WeakSet<ExtensionAPI>();\n\tglobalStore[registeredKey] = registeredApis;\n\tif (registeredApis.has(pi)) return;\n\tregisteredApis.add(pi);\n\n\tconst config = normalizeAsyncLaunchConfig(loadConfig());\n\tconst state = createChildSafeState();\n\tconst executor = createSubagentExecutor({\n\t\tpi,\n\t\tstate,\n\t\tconfig,\n\t\twaitToolEnabled: resolveWaitToolConfig(config.waitTool).enabled,\n\t\ttempArtifactsDir: getArtifactsDir(null),\n\t\tgetSubagentSessionRoot,\n\t\texpandTilde,\n\t\tallowMutatingManagementActions: false,\n\t});\n\n\tconst tool: ToolDefinition<typeof SubagentParams, Details> = {\n\t\tname: \"subagent\",\n\t\tlabel: \"Subagent\",\n\t\tdescription: [\n\t\t\t\"Delegate to generic children from child-safe fanout mode.\",\n\t\t\t\"Execution uses { task, description, permissions? } (or tasks[] / chain[]).\",\n\t\t\t\"Allowed control actions: status, interrupt, resume, steer, append-step, doctor.\",\n\t\t].join(\"\\n\"),\n\t\tparameters: SubagentParams,\n\t\texecute(id, params, signal, onUpdate, ctx) {\n\t\t\treturn executor.execute(id, params as SubagentParamsLike, signal, onUpdate, ctx);\n\t\t},\n\t};\n\n\tpi.registerTool(tool);\n\tstartNestedControlInboxListener(pi, state);\n}\n"]}
|
|
@@ -5,6 +5,7 @@ import * as path from "node:path";
|
|
|
5
5
|
import { getArtifactsDir } from "../shared/artifacts.js";
|
|
6
6
|
import { createSubagentExecutor } from "../runs/foreground/subagent-executor.js";
|
|
7
7
|
import { resolveWaitToolConfig } from "../runs/background/wait-config.js";
|
|
8
|
+
import { normalizeAsyncLaunchConfig } from "../runs/background/top-level-async.js";
|
|
8
9
|
import { SUBAGENT_CHILD_ENV, SUBAGENT_FANOUT_CHILD_ENV } from "../runs/shared/pi-args.js";
|
|
9
10
|
import { readNestedControlRequests, resolveNestedRouteFromEnv, writeNestedControlResult } from "../runs/shared/nested-events.js";
|
|
10
11
|
import { deliverSubagentIntercomMessageEvent } from "../intercom/result-intercom.js";
|
|
@@ -142,13 +143,12 @@ export default function registerFanoutChildSubagentExtension(pi) {
|
|
|
142
143
|
if (registeredApis.has(pi))
|
|
143
144
|
return;
|
|
144
145
|
registeredApis.add(pi);
|
|
145
|
-
const config = loadConfig();
|
|
146
|
+
const config = normalizeAsyncLaunchConfig(loadConfig());
|
|
146
147
|
const state = createChildSafeState();
|
|
147
148
|
const executor = createSubagentExecutor({
|
|
148
149
|
pi,
|
|
149
150
|
state,
|
|
150
151
|
config,
|
|
151
|
-
asyncByDefault: config.asyncByDefault === true,
|
|
152
152
|
waitToolEnabled: resolveWaitToolConfig(config.waitTool).enabled,
|
|
153
153
|
tempArtifactsDir: getArtifactsDir(null),
|
|
154
154
|
getSubagentSessionRoot,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fanout-child.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/extension/fanout-child.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 { ExtensionAPI, ToolDefinition } from \"@ashx-j/lunr-dev\";\n\nimport { getArtifactsDir } from \"../shared/artifacts.ts\";\nimport { createSubagentExecutor, type SubagentParamsLike } from \"../runs/foreground/subagent-executor.ts\";\nimport { resolveWaitToolConfig } from \"../runs/background/wait-config.ts\";\nimport { SUBAGENT_CHILD_ENV, SUBAGENT_FANOUT_CHILD_ENV } from \"../runs/shared/pi-args.ts\";\nimport { readNestedControlRequests, resolveNestedRouteFromEnv, writeNestedControlResult } from \"../runs/shared/nested-events.ts\";\nimport { deliverSubagentIntercomMessageEvent } from \"../intercom/result-intercom.ts\";\nimport { resolveSubagentIntercomTarget } from \"../intercom/intercom-bridge.ts\";\nimport { SubagentParams } from \"./schemas.ts\";\nimport { loadConfig } from \"./config.ts\";\nimport { type Details, type SubagentState } from \"../shared/types.ts\";\n\nfunction getSubagentSessionRoot(parentSessionFile: string | null): string {\n\tif (parentSessionFile) {\n\t\tconst baseName = path.basename(parentSessionFile, \".jsonl\");\n\t\tconst sessionsDir = path.dirname(parentSessionFile);\n\t\treturn path.join(sessionsDir, baseName);\n\t}\n\treturn fs.mkdtempSync(path.join(os.tmpdir(), \"pi-subagent-session-\"));\n}\n\nfunction expandTilde(p: string): string {\n\treturn p.startsWith(\"~/\") ? path.join(os.homedir(), p.slice(2)) : p;\n}\n\nfunction createChildSafeState(): SubagentState {\n\treturn {\n\t\tbaseCwd: \"\",\n\t\tcurrentSessionId: null,\n\t\tforegroundSubagentInFlight: 0,\n\t\tsubagentSpawns: { sessionId: null, count: 0 },\n\t\tasyncJobs: new Map(),\n\t\tforegroundRuns: new Map(),\n\t\tforegroundControls: new Map(),\n\t\tlastForegroundControlId: null,\n\t\tpendingForegroundControlNotices: new Map(),\n\t\tcleanupTimers: new Map(),\n\t\tlastUiContext: null,\n\t\tpoller: null,\n\t\tcompletionSeen: new Map(),\n\t\twatcher: null,\n\t\twatcherRestartTimer: null,\n\t\tresultFileCoalescer: {\n\t\t\tschedule: () => false,\n\t\t\tclear: () => {},\n\t\t},\n\t};\n}\n\nfunction startNestedControlInboxListener(pi: ExtensionAPI, state: SubagentState): NodeJS.Timeout | undefined {\n\tlet route;\n\ttry {\n\t\troute = resolveNestedRouteFromEnv();\n\t} catch {\n\t\treturn undefined;\n\t}\n\tif (!route) return undefined;\n\tconst seen = new Set<string>();\n\tconst inFlight = new Set<string>();\n\tconst pendingResults = new Map<string, Parameters<typeof writeNestedControlResult>[1]>();\n\tconst timer = setInterval(() => {\n\t\ttry {\n\t\t\tfor (const request of readNestedControlRequests(route)) {\n\t\t\t\tif (seen.has(request.requestId) || inFlight.has(request.requestId)) continue;\n\t\t\t\tinFlight.add(request.requestId);\n\t\t\t\tvoid (async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlet result = pendingResults.get(request.requestId);\n\t\t\t\t\t\tif (!result) {\n\t\t\t\t\t\t\tlet ok = false;\n\t\t\t\t\t\t\tlet message = \"Control request failed.\";\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst control = state.foregroundControls.get(request.targetRunId);\n\t\t\t\t\t\t\t\tif (!control) {\n\t\t\t\t\t\t\t\t\tmessage = `Nested run ${request.targetRunId} is not active in this fanout child.`;\n\t\t\t\t\t\t\t\t} else if (request.action === \"interrupt\") {\n\t\t\t\t\t\t\t\t\tok = control.interrupt?.() === true;\n\t\t\t\t\t\t\t\t\tmessage = ok\n\t\t\t\t\t\t\t\t\t\t? `Interrupt requested for nested run ${request.targetRunId}.`\n\t\t\t\t\t\t\t\t\t\t: `Nested run ${request.targetRunId} has no active child step to interrupt.`;\n\t\t\t\t\t\t\t\t} else if (!request.message?.trim()) {\n\t\t\t\t\t\t\t\t\tmessage = \"Nested resume requires message.\";\n\t\t\t\t\t\t\t\t} else if (!control.currentChildId && !control.currentAgent) {\n\t\t\t\t\t\t\t\t\tmessage = `Nested run ${request.targetRunId} has no active child message route.`;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tconst index = control.currentIndex ?? 0;\n\t\t\t\t\t\t\t\t\tconst childId = control.currentChildId ?? control.currentAgent!;\n\t\t\t\t\t\t\t\t\tconst target = resolveSubagentIntercomTarget(request.targetRunId, childId, index);\n\t\t\t\t\t\t\t\t\tok = await deliverSubagentIntercomMessageEvent(\n\t\t\t\t\t\t\t\t\t\tpi.events,\n\t\t\t\t\t\t\t\t\t\ttarget,\n\t\t\t\t\t\t\t\t\t\t`Follow-up for nested run ${request.targetRunId} (${control.currentAgent}):\\n\\n${request.message.trim()}`,\n\t\t\t\t\t\t\t\t\t\t500,\n\t\t\t\t\t\t\t\t\t\t{ source: \"nested-resume\", runId: request.targetRunId, agent: control.currentAgent, index },\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tmessage = ok\n\t\t\t\t\t\t\t\t\t\t? `Delivered follow-up to live nested run ${request.targetRunId}.`\n\t\t\t\t\t\t\t\t\t\t: `Nested child intercom target is not registered: ${target}`;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\tmessage = error instanceof Error ? error.message : String(error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tresult = { ts: Date.now(), requestId: request.requestId, targetRunId: request.targetRunId, ok, message };\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\twriteNestedControlResult(route, result);\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tpendingResults.set(request.requestId, result);\n\t\t\t\t\t\t\tconsole.error(`Failed to write nested control result for request '${request.requestId}' targeting '${request.targetRunId}' via inbox '${route.controlInbox}'; keeping request for retry:`, error);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpendingResults.delete(request.requestId);\n\t\t\t\t\t\tseen.add(request.requestId);\n\t\t\t\t\t\ttry { fs.unlinkSync(request.filePath); } catch {}\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tinFlight.delete(request.requestId);\n\t\t\t\t\t}\n\t\t\t\t})();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(`Failed to poll nested control inbox '${route.controlInbox}' for root '${route.rootRunId}':`, error);\n\t\t}\n\t}, 200);\n\ttimer.unref?.();\n\treturn timer;\n}\n\nexport default function registerFanoutChildSubagentExtension(pi: ExtensionAPI): void {\n\tif (process.env[SUBAGENT_CHILD_ENV] !== \"1\" || process.env[SUBAGENT_FANOUT_CHILD_ENV] !== \"1\") return;\n\n\tconst globalStore = globalThis as Record<string, unknown>;\n\tconst registeredKey = \"__piSubagentFanoutChildRegisteredApis\";\n\tconst registeredApis = globalStore[registeredKey] instanceof WeakSet\n\t\t? globalStore[registeredKey] as WeakSet<ExtensionAPI>\n\t\t: new WeakSet<ExtensionAPI>();\n\tglobalStore[registeredKey] = registeredApis;\n\tif (registeredApis.has(pi)) return;\n\tregisteredApis.add(pi);\n\n\tconst config = loadConfig();\n\tconst state = createChildSafeState();\n\tconst executor = createSubagentExecutor({\n\t\tpi,\n\t\tstate,\n\t\tconfig,\n\t\tasyncByDefault: config.asyncByDefault === true,\n\t\twaitToolEnabled: resolveWaitToolConfig(config.waitTool).enabled,\n\t\ttempArtifactsDir: getArtifactsDir(null),\n\t\tgetSubagentSessionRoot,\n\t\texpandTilde,\n\t\tallowMutatingManagementActions: false,\n\t});\n\n\tconst tool: ToolDefinition<typeof SubagentParams, Details> = {\n\t\tname: \"subagent\",\n\t\tlabel: \"Subagent\",\n\t\tdescription: [\n\t\t\t\"Delegate to generic children from child-safe fanout mode.\",\n\t\t\t\"Execution uses { task, description, permissions? } (or tasks[] / chain[]).\",\n\t\t\t\"Allowed control actions: status, interrupt, resume, steer, append-step, doctor.\",\n\t\t].join(\"\\n\"),\n\t\tparameters: SubagentParams,\n\t\texecute(id, params, signal, onUpdate, ctx) {\n\t\t\treturn executor.execute(id, params as SubagentParamsLike, signal, onUpdate, ctx);\n\t\t},\n\t};\n\n\tpi.registerTool(tool);\n\tstartNestedControlInboxListener(pi, state);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"fanout-child.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/extension/fanout-child.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 { ExtensionAPI, ToolDefinition } from \"@ashx-j/lunr-dev\";\n\nimport { getArtifactsDir } from \"../shared/artifacts.ts\";\nimport { createSubagentExecutor, type SubagentParamsLike } from \"../runs/foreground/subagent-executor.ts\";\nimport { resolveWaitToolConfig } from \"../runs/background/wait-config.ts\";\nimport { normalizeAsyncLaunchConfig } from \"../runs/background/top-level-async.ts\";\nimport { SUBAGENT_CHILD_ENV, SUBAGENT_FANOUT_CHILD_ENV } from \"../runs/shared/pi-args.ts\";\nimport { readNestedControlRequests, resolveNestedRouteFromEnv, writeNestedControlResult } from \"../runs/shared/nested-events.ts\";\nimport { deliverSubagentIntercomMessageEvent } from \"../intercom/result-intercom.ts\";\nimport { resolveSubagentIntercomTarget } from \"../intercom/intercom-bridge.ts\";\nimport { SubagentParams } from \"./schemas.ts\";\nimport { loadConfig } from \"./config.ts\";\nimport { type Details, type SubagentState } from \"../shared/types.ts\";\n\nfunction getSubagentSessionRoot(parentSessionFile: string | null): string {\n\tif (parentSessionFile) {\n\t\tconst baseName = path.basename(parentSessionFile, \".jsonl\");\n\t\tconst sessionsDir = path.dirname(parentSessionFile);\n\t\treturn path.join(sessionsDir, baseName);\n\t}\n\treturn fs.mkdtempSync(path.join(os.tmpdir(), \"pi-subagent-session-\"));\n}\n\nfunction expandTilde(p: string): string {\n\treturn p.startsWith(\"~/\") ? path.join(os.homedir(), p.slice(2)) : p;\n}\n\nfunction createChildSafeState(): SubagentState {\n\treturn {\n\t\tbaseCwd: \"\",\n\t\tcurrentSessionId: null,\n\t\tforegroundSubagentInFlight: 0,\n\t\tsubagentSpawns: { sessionId: null, count: 0 },\n\t\tasyncJobs: new Map(),\n\t\tforegroundRuns: new Map(),\n\t\tforegroundControls: new Map(),\n\t\tlastForegroundControlId: null,\n\t\tpendingForegroundControlNotices: new Map(),\n\t\tcleanupTimers: new Map(),\n\t\tlastUiContext: null,\n\t\tpoller: null,\n\t\tcompletionSeen: new Map(),\n\t\twatcher: null,\n\t\twatcherRestartTimer: null,\n\t\tresultFileCoalescer: {\n\t\t\tschedule: () => false,\n\t\t\tclear: () => {},\n\t\t},\n\t};\n}\n\nfunction startNestedControlInboxListener(pi: ExtensionAPI, state: SubagentState): NodeJS.Timeout | undefined {\n\tlet route;\n\ttry {\n\t\troute = resolveNestedRouteFromEnv();\n\t} catch {\n\t\treturn undefined;\n\t}\n\tif (!route) return undefined;\n\tconst seen = new Set<string>();\n\tconst inFlight = new Set<string>();\n\tconst pendingResults = new Map<string, Parameters<typeof writeNestedControlResult>[1]>();\n\tconst timer = setInterval(() => {\n\t\ttry {\n\t\t\tfor (const request of readNestedControlRequests(route)) {\n\t\t\t\tif (seen.has(request.requestId) || inFlight.has(request.requestId)) continue;\n\t\t\t\tinFlight.add(request.requestId);\n\t\t\t\tvoid (async () => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tlet result = pendingResults.get(request.requestId);\n\t\t\t\t\t\tif (!result) {\n\t\t\t\t\t\t\tlet ok = false;\n\t\t\t\t\t\t\tlet message = \"Control request failed.\";\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconst control = state.foregroundControls.get(request.targetRunId);\n\t\t\t\t\t\t\t\tif (!control) {\n\t\t\t\t\t\t\t\t\tmessage = `Nested run ${request.targetRunId} is not active in this fanout child.`;\n\t\t\t\t\t\t\t\t} else if (request.action === \"interrupt\") {\n\t\t\t\t\t\t\t\t\tok = control.interrupt?.() === true;\n\t\t\t\t\t\t\t\t\tmessage = ok\n\t\t\t\t\t\t\t\t\t\t? `Interrupt requested for nested run ${request.targetRunId}.`\n\t\t\t\t\t\t\t\t\t\t: `Nested run ${request.targetRunId} has no active child step to interrupt.`;\n\t\t\t\t\t\t\t\t} else if (!request.message?.trim()) {\n\t\t\t\t\t\t\t\t\tmessage = \"Nested resume requires message.\";\n\t\t\t\t\t\t\t\t} else if (!control.currentChildId && !control.currentAgent) {\n\t\t\t\t\t\t\t\t\tmessage = `Nested run ${request.targetRunId} has no active child message route.`;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tconst index = control.currentIndex ?? 0;\n\t\t\t\t\t\t\t\t\tconst childId = control.currentChildId ?? control.currentAgent!;\n\t\t\t\t\t\t\t\t\tconst target = resolveSubagentIntercomTarget(request.targetRunId, childId, index);\n\t\t\t\t\t\t\t\t\tok = await deliverSubagentIntercomMessageEvent(\n\t\t\t\t\t\t\t\t\t\tpi.events,\n\t\t\t\t\t\t\t\t\t\ttarget,\n\t\t\t\t\t\t\t\t\t\t`Follow-up for nested run ${request.targetRunId} (${control.currentAgent}):\\n\\n${request.message.trim()}`,\n\t\t\t\t\t\t\t\t\t\t500,\n\t\t\t\t\t\t\t\t\t\t{ source: \"nested-resume\", runId: request.targetRunId, agent: control.currentAgent, index },\n\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\tmessage = ok\n\t\t\t\t\t\t\t\t\t\t? `Delivered follow-up to live nested run ${request.targetRunId}.`\n\t\t\t\t\t\t\t\t\t\t: `Nested child intercom target is not registered: ${target}`;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\t\tmessage = error instanceof Error ? error.message : String(error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tresult = { ts: Date.now(), requestId: request.requestId, targetRunId: request.targetRunId, ok, message };\n\t\t\t\t\t\t}\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\twriteNestedControlResult(route, result);\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\tpendingResults.set(request.requestId, result);\n\t\t\t\t\t\t\tconsole.error(`Failed to write nested control result for request '${request.requestId}' targeting '${request.targetRunId}' via inbox '${route.controlInbox}'; keeping request for retry:`, error);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpendingResults.delete(request.requestId);\n\t\t\t\t\t\tseen.add(request.requestId);\n\t\t\t\t\t\ttry { fs.unlinkSync(request.filePath); } catch {}\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tinFlight.delete(request.requestId);\n\t\t\t\t\t}\n\t\t\t\t})();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(`Failed to poll nested control inbox '${route.controlInbox}' for root '${route.rootRunId}':`, error);\n\t\t}\n\t}, 200);\n\ttimer.unref?.();\n\treturn timer;\n}\n\nexport default function registerFanoutChildSubagentExtension(pi: ExtensionAPI): void {\n\tif (process.env[SUBAGENT_CHILD_ENV] !== \"1\" || process.env[SUBAGENT_FANOUT_CHILD_ENV] !== \"1\") return;\n\n\tconst globalStore = globalThis as Record<string, unknown>;\n\tconst registeredKey = \"__piSubagentFanoutChildRegisteredApis\";\n\tconst registeredApis = globalStore[registeredKey] instanceof WeakSet\n\t\t? globalStore[registeredKey] as WeakSet<ExtensionAPI>\n\t\t: new WeakSet<ExtensionAPI>();\n\tglobalStore[registeredKey] = registeredApis;\n\tif (registeredApis.has(pi)) return;\n\tregisteredApis.add(pi);\n\n\tconst config = normalizeAsyncLaunchConfig(loadConfig());\n\tconst state = createChildSafeState();\n\tconst executor = createSubagentExecutor({\n\t\tpi,\n\t\tstate,\n\t\tconfig,\n\t\twaitToolEnabled: resolveWaitToolConfig(config.waitTool).enabled,\n\t\ttempArtifactsDir: getArtifactsDir(null),\n\t\tgetSubagentSessionRoot,\n\t\texpandTilde,\n\t\tallowMutatingManagementActions: false,\n\t});\n\n\tconst tool: ToolDefinition<typeof SubagentParams, Details> = {\n\t\tname: \"subagent\",\n\t\tlabel: \"Subagent\",\n\t\tdescription: [\n\t\t\t\"Delegate to generic children from child-safe fanout mode.\",\n\t\t\t\"Execution uses { task, description, permissions? } (or tasks[] / chain[]).\",\n\t\t\t\"Allowed control actions: status, interrupt, resume, steer, append-step, doctor.\",\n\t\t].join(\"\\n\"),\n\t\tparameters: SubagentParams,\n\t\texecute(id, params, signal, onUpdate, ctx) {\n\t\t\treturn executor.execute(id, params as SubagentParamsLike, signal, onUpdate, ctx);\n\t\t},\n\t};\n\n\tpi.registerTool(tool);\n\tstartNestedControlInboxListener(pi, state);\n}\n"]}
|
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Subagent Tool
|
|
3
3
|
*
|
|
4
|
-
* Full-featured subagent with
|
|
5
|
-
* -
|
|
6
|
-
* -
|
|
4
|
+
* Full-featured subagent with foreground and async modes.
|
|
5
|
+
* - Async (default): Background execution, emits events when done
|
|
6
|
+
* - Foreground (async:false or clarify:true): Streams output, renders markdown, tracks usage
|
|
7
7
|
*
|
|
8
8
|
* Modes: single (agent + task), parallel (tasks[]), chain (chain[] with {previous})
|
|
9
|
-
* Toggle: async parameter (default: false, configurable via config.json)
|
|
10
9
|
*
|
|
11
10
|
* Config file: ~/.lunr/agent/extensions/subagent/config.json
|
|
12
|
-
* { "
|
|
11
|
+
* { "maxSubagentDepth": 1, "intercomBridge": { "mode": "always", "instructionFile": "./intercom-bridge.md" }, "worktreeSetupHook": "./scripts/setup-worktree.mjs" }
|
|
13
12
|
*/
|
|
14
13
|
import type { ExtensionAPI } from "@ashx-j/lunr-dev";
|
|
15
14
|
import { Text } from "@ashx-j/lunr-tui";
|
|
15
|
+
import { type SubagentState } from "../shared/types.ts";
|
|
16
16
|
export { loadConfig } from "./config.ts";
|
|
17
|
-
export declare function
|
|
17
|
+
export declare function resolveSubagentActionDisplayTitle(args: any, state: SubagentState): string | undefined;
|
|
18
|
+
export declare function renderSubagentCall(rawArgs: any, theme: any, context: any, options: any): Text;
|
|
19
|
+
export declare function renderSubagentNotify(details: any, theme: any): Text;
|
|
18
20
|
export default function registerSubagentExtension(pi: ExtensionAPI): void;
|
|
19
21
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/extension/index.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;GAYG;AAOH,OAAO,KAAK,EAAE,YAAY,EAAoC,MAAM,iCAAiC,CAAC;AAGtG,OAAO,EAA0B,IAAI,EAAmE,MAAM,wBAAwB,CAAC;AAmDvI,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAwEzC,wBAAgB,kBAAkB,CAAC,IAAI,KAAA,EAAE,KAAK,KAAA,EAAE,OAAO,KAAA,GAAG,IAAI,CAiC7D;AA8FD,MAAM,CAAC,OAAO,UAAU,yBAAyB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA+YxE","sourcesContent":["// @ts-nocheck\n/**\n * Subagent Tool\n *\n * Full-featured subagent with sync and async modes.\n * - Sync (default): Streams output, renders markdown, tracks usage\n * - Async: Background execution, emits events when done\n *\n * Modes: single (agent + task), parallel (tasks[]), chain (chain[] with {previous})\n * Toggle: async parameter (default: false, configurable via config.json)\n *\n * Config file: ~/.lunr/agent/extensions/subagent/config.json\n * { \"asyncByDefault\": true, \"forceTopLevelAsync\": true, \"maxSubagentDepth\": 1, \"intercomBridge\": { \"mode\": \"always\", \"instructionFile\": \"./intercom-bridge.md\" }, \"worktreeSetupHook\": \"./scripts/setup-worktree.mjs\" }\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { AgentToolResult } from \"@ashx-j/lunr-agent\";\nimport type { ExtensionAPI, ExtensionContext, ToolDefinition } from \"@ashx-j/lunr-dev\";\nimport { keyText } from \"../../../../modes/interactive/components/keybinding-hints.ts\";\nimport { awaitWithAbort } from \"../../../../utils/await-with-abort.ts\";\nimport { Box, Container, Spacer, Text, truncateToWidth, visibleWidth, wrapTextWithAnsi, type Component } from \"@ashx-j/lunr-tui\";\n\nimport { cleanupAllArtifactDirs, cleanupOldArtifacts, getArtifactsDir } from \"../shared/artifacts.ts\";\nimport { resolveCurrentSessionId } from \"../shared/session-identity.ts\";\nimport { cleanupOldChainDirs } from \"../shared/settings.ts\";\nimport { clearLegacyResultAnimationTimer, renderSubagentResult, subagentAnimSink } from \"../tui/render.ts\";\nimport { SubagentParams } from \"./schemas.ts\";\nimport { validateChainInput } from \"./chain-validation.ts\";\nimport type { createSubagentExecutor, SubagentParamsLike } from \"../runs/foreground/subagent-executor.ts\";\nimport { createAsyncJobTracker } from \"../runs/background/async-job-tracker.ts\";\nimport { createResultWatcher } from \"../runs/background/result-watcher.ts\";\nimport { createScheduledRunManager } from \"../runs/background/scheduled-runs.ts\";\nimport { registerSlashCommands } from \"../slash/slash-commands.ts\";\nimport { registerPromptTemplateDelegationBridge } from \"../slash/prompt-template-bridge.ts\";\nimport { registerMainWatchdog } from \"../watchdog/register-main.ts\";\nimport { registerSlashSubagentBridge } from \"../slash/slash-bridge.ts\";\nimport { createNativeSupervisorChannel } from \"../intercom/native-supervisor-channel.ts\";\nimport { registerSubagentRpcBridge } from \"./rpc.ts\";\nimport { clearSlashSnapshots, getSlashRenderableSnapshot, resolveSlashMessageDetails, restoreSlashFinalSnapshots, type SlashMessageDetails } from \"../slash/slash-live-state.ts\";\nimport { inspectSubagentStatus } from \"../runs/background/run-status.ts\";\nimport { resolveWaitToolConfig } from \"../runs/background/subagent-wait.ts\";\nimport { registerWaitTool } from \"../runs/background/wait-tool.ts\";\nimport { drainOutstandingWork } from \"../runs/background/auto-drain.ts\";\nimport registerSubagentNotify, { parseSubagentNotifyContent, type SubagentNotifyDetails } from \"../runs/background/notify.ts\";\nimport { formatSteeringNotice, handleSubagentSteeringNotice, SUBAGENT_STEERING_MESSAGE_TYPE, type SubagentSteeringMessageDetails } from \"./steering-notices.ts\";\nimport { SUBAGENT_CHILD_ENV, SUBAGENT_PARENT_SESSION_ENV } from \"../runs/shared/pi-args.ts\";\nimport { formatDuration, shortenPath } from \"../shared/formatters.ts\";\nimport { loadConfig } from \"./config.ts\";\nimport { buildSubagentToolDescription } from \"./tool-description.ts\";\nimport {\n\ttype Details,\n\ttype SubagentState,\n\tASYNC_DIR,\n\tDEFAULT_ARTIFACT_CONFIG,\n\tRESULTS_DIR,\n\tSLASH_RESULT_TYPE,\n\tSLASH_TEXT_RESULT_TYPE,\n\tSUBAGENT_ASYNC_COMPLETE_EVENT,\n\tSUBAGENT_ASYNC_STARTED_EVENT,\n\tSUBAGENT_CONTROL_EVENT,\n\tSUBAGENT_STEERING_NOTICE_EVENT,\n\tWIDGET_KEY,\n} from \"../shared/types.ts\";\nimport {\n\tclearPendingForegroundControlNotices,\n\tformatSubagentControlNotice,\n\thandleSubagentControlNotice,\n\tSUBAGENT_CONTROL_MESSAGE_TYPE,\n\ttype SubagentControlMessageDetails,\n} from \"./control-notices.ts\";\n\nexport { loadConfig } from \"./config.ts\";\n\n/**\n * Derive subagent session base directory from parent session file.\n * If parent session is ~/.lunr/agent/sessions/abc123.jsonl,\n * returns ~/.lunr/agent/sessions/abc123/ as the base.\n * Callers add runId to create the actual session root: abc123/{runId}/\n * Falls back to a unique temp directory if no parent session.\n */\nfunction getSubagentSessionRoot(parentSessionFile: string | null): string {\n\tif (parentSessionFile) {\n\t\tconst baseName = path.basename(parentSessionFile, \".jsonl\");\n\t\tconst sessionsDir = path.dirname(parentSessionFile);\n\t\treturn path.join(sessionsDir, baseName);\n\t}\n\treturn fs.mkdtempSync(path.join(os.tmpdir(), \"pi-subagent-session-\"));\n}\n\nfunction expandTilde(p: string): string {\n\treturn p.startsWith(\"~/\") ? path.join(os.homedir(), p.slice(2)) : p;\n}\n\n/**\n * Create a directory and verify it is actually accessible.\n * On Windows with Azure AD/Entra ID, directories created shortly after\n * wake-from-sleep can end up with broken NTFS ACLs (null DACL) when the\n * cloud SID cannot be resolved without network connectivity. This leaves\n * the directory completely inaccessible to the creating user.\n */\nfunction ensureAccessibleDir(dirPath: string): void {\n\tfs.mkdirSync(dirPath, { recursive: true });\n\ttry {\n\t\tfs.accessSync(dirPath, fs.constants.R_OK | fs.constants.W_OK);\n\t} catch {\n\t\ttry {\n\t\t\tfs.rmSync(dirPath, { recursive: true, force: true });\n\t\t} catch {\n\t\t\t// Best effort: retry mkdir/access even if cleanup fails.\n\t\t}\n\t\tfs.mkdirSync(dirPath, { recursive: true });\n\t\tfs.accessSync(dirPath, fs.constants.R_OK | fs.constants.W_OK);\n\t}\n}\n\nfunction isSlashResultRunning(result: { details?: Details }): boolean {\n\treturn result.details?.progress?.some((entry) => entry.status === \"running\")\n\t\t|| result.details?.results.some((entry) => entry.progress?.status === \"running\")\n\t\t|| false;\n}\n\n// Drives the inline running-indicator braille animation for foreground subagent\n// results. Foreground runs receive progress only on child events, so the glyph\n// (derived from progress fields) would freeze between events. While a result is\n// running we tick a frame counter every 80ms; renderResult registers the\n// running-glyph lines in state.animEntries (via subagentAnimSink) and the timer\n// rewrites just those Text nodes + requests a repaint, instead of invalidate()-ing\n// the whole tool component (a full renderSubagentResult rebuild 12.5x/s made the\n// spinner laggy).\nfunction subagentResultIsRunning(result: { details?: Details }): boolean {\n\treturn result.details?.progress?.some((entry) => entry.status === \"running\")\n\t\t|| result.details?.results.some((entry) => entry.progress?.status === \"running\")\n\t\t|| false;\n}\n\nfunction effectiveParallelTaskCount(tasks: Array<{ count?: unknown }> | undefined): number {\n\tif (!tasks || tasks.length === 0) return 0;\n\treturn tasks.reduce((total, task) => {\n\t\tconst count = typeof task.count === \"number\" && Number.isInteger(task.count) && task.count >= 1 ? task.count : 1;\n\t\treturn total + count;\n\t}, 0);\n}\n\nexport function renderSubagentCall(args, theme, context): Text {\n\tif (args.action) {\n\t\tconst target = args.id || args.runId || \"\";\n\t\treturn new Text(\n\t\t\t`${theme.fg(\"toolTitle\", theme.bold(\"subagent \"))}${args.action}${target ? ` ${theme.fg(\"accent\", target)}` : \"\"}`,\n\t\t\t0,\n\t\t\t0,\n\t\t);\n\t}\n\tconst isParallel = (args.tasks?.length ?? 0) > 0;\n\tconst parallelCount = effectiveParallelTaskCount(args.tasks as Array<{ count?: unknown }> | undefined);\n\tconst asyncLabel = args.async === true && args.clarify !== true ? theme.fg(\"warning\", \" [async]\") : \"\";\n\tif (args.chain?.length) {\n\t\treturn new Text(\n\t\t\t`${theme.fg(\"toolTitle\", theme.bold(\"subagent \"))}chain (${args.chain.length})${asyncLabel}`,\n\t\t\t0,\n\t\t\t0,\n\t\t);\n\t}\n\tif (isParallel) {\n\t\treturn new Text(\n\t\t\t`${theme.fg(\"toolTitle\", theme.bold(\"subagent \"))}parallel (${parallelCount})${asyncLabel}`,\n\t\t\t0,\n\t\t\t0,\n\t\t);\n\t}\n\tconst showDescription = !context?.isPartial && !context?.expanded && !context?.isError;\n\tconst description = showDescription ? theme.fg(\"accent\", args.description || args.task || \"?\") : \"\";\n\treturn new Text(\n\t\t`${theme.fg(\"toolTitle\", theme.bold(description ? \"subagent \" : \"subagent\"))}${description}${asyncLabel}`,\n\t\t0,\n\t\t0,\n\t);\n}\n\nfunction ensureSubagentResultAnimation(context: { state: Record<string, unknown>; invalidate?: () => void; requestRender?: () => void }): void {\n\tconst state = context.state as {\n\t\tsubagentResultAnimationTimer?: ReturnType<typeof setInterval>;\n\t\tframe?: number;\n\t\tanimEntries?: Array<{ text: Text; line: (frame: number, now: number) => string }>;\n\t};\n\tif (state.subagentResultAnimationTimer) return;\n\tif (typeof context.invalidate !== \"function\") return;\n\tif (state.frame === undefined) state.frame = 0;\n\tstate.subagentResultAnimationTimer = setInterval(() => {\n\t\tstate.frame = ((state.frame ?? 0) + 1) % 10;\n\t\ttry {\n\t\t\tconst entries = state.animEntries;\n\t\t\tif (entries?.length && typeof context.requestRender === \"function\") {\n\t\t\t\tconst now = Date.now();\n\t\t\t\tfor (const entry of entries) entry.text.setText(entry.line(state.frame ?? 0, now));\n\t\t\t\tcontext.requestRender();\n\t\t\t} else {\n\t\t\t\tcontext.invalidate();\n\t\t\t}\n\t\t} catch {}\n\t}, 80);\n}\n\nfunction isSlashResultError(result: { details?: Details }): boolean {\n\treturn result.details?.results.some((entry) => entry.exitCode !== 0 && entry.progress?.status !== \"running\") || false;\n}\n\nfunction isStaleExtensionContextError(error: unknown): boolean {\n\treturn error instanceof Error && error.message.includes(\"Extension context no longer active\");\n}\n\nfunction rebuildSlashResultContainer(\n\tcontainer: Container,\n\tresult: AgentToolResult<Details>,\n\toptions: { expanded: boolean },\n\ttheme: ExtensionContext[\"ui\"][\"theme\"],\n): void {\n\tcontainer.clear();\n\tcontainer.addChild(new Spacer(1));\n\tconst boxTheme = isSlashResultRunning(result) ? \"toolPendingBg\" : isSlashResultError(result) ? \"toolErrorBg\" : \"toolSuccessBg\";\n\tconst box = new Box(1, 1, (text: string) => theme.bg(boxTheme, text));\n\tbox.addChild(renderSubagentResult(result, options, theme));\n\tcontainer.addChild(box);\n}\n\nfunction createSlashResultComponent(\n\tdetails: SlashMessageDetails,\n\toptions: { expanded: boolean },\n\ttheme: ExtensionContext[\"ui\"][\"theme\"],\n): Container {\n\tconst container = new Container();\n\tlet lastVersion = -1;\n\tcontainer.render = (width: number): string[] => {\n\t\tconst snapshot = getSlashRenderableSnapshot(details);\n\t\tif (snapshot.version !== lastVersion || isSlashResultRunning(snapshot.result)) {\n\t\t\tlastVersion = snapshot.version;\n\t\t\trebuildSlashResultContainer(container, snapshot.result, options, theme);\n\t\t}\n\t\treturn Container.prototype.render.call(container, width);\n\t};\n\treturn container;\n}\n\nclass SubagentControlNoticeComponent implements Component {\n\tconstructor(\n\t\tprivate readonly details: SubagentControlMessageDetails,\n\t\tprivate readonly theme: ExtensionContext[\"ui\"][\"theme\"],\n\t) {}\n\n\tinvalidate(): void {}\n\n\trender(width: number): string[] {\n\t\tconst eventLabel = this.details.event.type.replaceAll(\"_\", \" \");\n\t\tif (width < 3) return [truncateToWidth(`Subagent ${eventLabel}`, width)];\n\t\tconst bodyWidth = Math.max(1, width - 2);\n\t\tconst borderChar = \"─\";\n\t\tconst header = ` ⚠ Subagent ${eventLabel}: ${this.details.event.agent} `;\n\t\tconst headerText = truncateToWidth(header, bodyWidth, \"\");\n\t\tconst headerPadding = Math.max(0, bodyWidth - visibleWidth(headerText));\n\t\tconst lines = [this.theme.fg(\"accent\", `╭${headerText}${borderChar.repeat(headerPadding)}╮`)];\n\n\t\tfor (const line of wrapTextWithAnsi(formatSubagentControlNotice(this.details), bodyWidth)) {\n\t\t\tconst text = truncateToWidth(line, bodyWidth, \"\");\n\t\t\tconst padding = Math.max(0, bodyWidth - visibleWidth(text));\n\t\t\tlines.push(this.theme.fg(\"accent\", `│${text}${\" \".repeat(padding)}│`));\n\t\t}\n\t\tlines.push(this.theme.fg(\"accent\", `╰${borderChar.repeat(bodyWidth)}╯`));\n\t\treturn lines;\n\t}\n}\n\nexport default function registerSubagentExtension(pi: ExtensionAPI): void {\n\tif (process.env[SUBAGENT_CHILD_ENV] === \"1\") {\n\t\treturn;\n\t}\n\tconst globalStore = globalThis as Record<string, unknown>;\n\tconst runtimeCleanupStoreKey = \"__piSubagentRuntimeCleanup\";\n\tconst previousRuntimeCleanup = globalStore[runtimeCleanupStoreKey];\n\tif (typeof previousRuntimeCleanup === \"function\") {\n\t\ttry {\n\t\t\tpreviousRuntimeCleanup();\n\t\t} catch {\n\t\t\t// Best effort cleanup for stale timers from an older reload.\n\t\t}\n\t}\n\n\tensureAccessibleDir(RESULTS_DIR);\n\tensureAccessibleDir(ASYNC_DIR);\n\tcleanupOldChainDirs();\n\n\tconst config = loadConfig();\n\tconst waitToolConfig = resolveWaitToolConfig(config.waitTool);\n\tconst asyncByDefault = config.asyncByDefault === true;\n\tconst tempArtifactsDir = getArtifactsDir(null);\n\tcleanupAllArtifactDirs(DEFAULT_ARTIFACT_CONFIG.cleanupDays);\n\n\tconst state: SubagentState = {\n\t\tbaseCwd: \"\",\n\t\tcurrentSessionId: null,\n\t\tforegroundSubagentInFlight: 0,\n\t\tsubagentSpawns: { sessionId: null, count: 0 },\n\t\tasyncJobs: new Map(),\n\t\tfleetJobs: new Map(),\n\t\tforegroundRuns: new Map(),\n\t\tforegroundControls: new Map(),\n\t\tlastForegroundControlId: null,\n\t\tpendingForegroundControlNotices: new Map(),\n\t\tcleanupTimers: new Map(),\n\t\tlastUiContext: null,\n\t\tpoller: null,\n\t\tcompletionSeen: new Map(),\n\t\twatcher: null,\n\t\twatcherRestartTimer: null,\n\t\tresultFileCoalescer: {\n\t\t\tschedule: () => false,\n\t\t\tclear: () => {},\n\t\t},\n\t};\n\n\tconst supervisorChannel = createNativeSupervisorChannel(pi, state);\n\tconst mainWatchdog = registerMainWatchdog(pi);\n\tconst { startResultWatcher, primeExistingResults, stopResultWatcher } = createResultWatcher(\n\t\tpi,\n\t\tstate,\n\t\tRESULTS_DIR,\n\t\t10 * 60 * 1000,\n\t);\n\tstartResultWatcher();\n\tprimeExistingResults();\n\n\tlet generation = 0;\n\tlet executorPromise: Promise<ReturnType<typeof createSubagentExecutor>> | undefined;\n\tconst runtimeCleanup = () => {\n\t\tgeneration++;\n\t\texecutorPromise = undefined;\n\t\tmainWatchdog.dispose();\n\t\tstopResultWatcher();\n\t\tscheduledRunManager.stop();\n\t\tsupervisorChannel.dispose();\n\t\tclearPendingForegroundControlNotices(state);\n\t\tif (state.poller) {\n\t\t\tclearInterval(state.poller);\n\t\t\tstate.poller = null;\n\t\t}\n\t};\n\tglobalStore[runtimeCleanupStoreKey] = runtimeCleanup;\n\n\tconst { ensurePoller, refreshWidget, handleStarted, handleComplete, resetJobs, restoreActiveJobs } = createAsyncJobTracker(pi, state, ASYNC_DIR, {\n\t\twidgetEnabled: config.asyncWidget !== false,\n\t});\n\tlet executorExecute: ((id: string, params: SubagentParamsLike, signal: AbortSignal, onUpdate: ((r: AgentToolResult<Details>) => void) | undefined, ctx: ExtensionContext) => Promise<AgentToolResult<Details>>) | undefined;\n\tconst scheduledRunManager = createScheduledRunManager({\n\t\tconfig,\n\t\tlaunch: (params, ctx, signal) => {\n\t\t\tif (!executorExecute) {\n\t\t\t\treturn Promise.resolve({\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Scheduled subagent launch is unavailable (executor not ready).\" }],\n\t\t\t\t\tisError: true,\n\t\t\t\t\tdetails: { mode: \"management\" as const, results: [] },\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn executorExecute(randomUUID(), params, signal, undefined, ctx);\n\t\t},\n\t});\n\tconst executor: ReturnType<typeof createSubagentExecutor> = {\n\t\tasync execute(id, params, signal, onUpdate, ctx) {\n\t\t\tconst currentGeneration = generation;\n\t\t\tsignal?.throwIfAborted();\n\t\t\tif (!executorPromise) {\n\t\t\t\tconst pending = import(\"../runs/foreground/subagent-executor.ts\").then(({ createSubagentExecutor }) => {\n\t\t\t\t\tif (generation !== currentGeneration) throw new Error(\"Subagent session changed before initialization\");\n\t\t\t\t\treturn createSubagentExecutor({\n\t\t\t\t\t\tpi, state, config, asyncByDefault,\n\t\t\t\t\t\twaitToolEnabled: waitToolConfig.enabled,\n\t\t\t\t\t\thandleScheduledRunAction: (params, ctx) => scheduledRunManager.handleToolCall(params, ctx),\n\t\t\t\t\t\twatchdog: mainWatchdog, tempArtifactsDir, getSubagentSessionRoot, expandTilde,\n\t\t\t\t\t});\n\t\t\t\t});\n\t\t\t\texecutorPromise = pending;\n\t\t\t\tvoid pending.catch(() => {\n\t\t\t\t\tif (executorPromise === pending) executorPromise = undefined;\n\t\t\t\t});\n\t\t\t}\n\t\t\tconst ready = await awaitWithAbort(executorPromise, signal);\n\t\t\tsignal?.throwIfAborted();\n\t\t\tif (generation !== currentGeneration) throw new Error(\"Subagent session changed before execution\");\n\t\t\treturn ready.execute(id, params, signal, onUpdate, ctx);\n\t\t},\n\t};\n\texecutorExecute = executor.execute;\n\n\tpi.registerMessageRenderer<SlashMessageDetails>(SLASH_RESULT_TYPE, (message, options, theme) => {\n\t\tconst details = resolveSlashMessageDetails(message.details);\n\t\tif (!details) return undefined;\n\t\treturn createSlashResultComponent(details, options, theme);\n\t});\n\n\tpi.registerMessageRenderer<undefined>(SLASH_TEXT_RESULT_TYPE, (message, _options, _theme) => {\n\t\tconst content = typeof message.content === \"string\"\n\t\t\t? message.content\n\t\t\t: message.content\n\t\t\t\t.filter((entry) => entry.type === \"text\")\n\t\t\t\t.map((entry) => entry.text)\n\t\t\t\t.join(\"\\n\");\n\t\treturn new Text(content, 0, 0);\n\t});\n\n\tpi.registerMessageRenderer<SubagentNotifyDetails>(\"subagent-notify\", (message, options, theme) => {\n\t\tconst content = typeof message.content === \"string\" ? message.content : \"\";\n\t\tconst details = (message.details as SubagentNotifyDetails | undefined) ?? parseSubagentNotifyContent(content);\n\t\tif (!details) return new Text(content, 0, 0);\n\t\tconst icon = details.status === \"completed\"\n\t\t\t? theme.fg(\"success\", \"✓\")\n\t\t\t: details.status === \"paused\"\n\t\t\t\t? theme.fg(\"warning\", \"■\")\n\t\t\t\t: theme.fg(\"error\", \"✗\");\n\t\tconst parts: string[] = [];\n\t\tif (details.taskInfo) parts.push(details.taskInfo);\n\t\tif (details.durationMs !== undefined) parts.push(formatDuration(details.durationMs));\n\t\tconst notifyLabel = details.taskInfo || details.agent || \"child\";\n\t\tlet text = `${icon} ${theme.bold(notifyLabel)} ${theme.fg(\"dim\", details.status)}`;\n\t\tif (parts.length > 0) text += ` ${theme.fg(\"dim\", \"·\")} ${parts.map((part) => theme.fg(\"dim\", part)).join(` ${theme.fg(\"dim\", \"·\")} `)}`;\n\t\tconst trimmedPreview = details.resultPreview.trim();\n\t\tconst previewLines = options.expanded\n\t\t\t? trimmedPreview.split(\"\\n\").filter((line) => line.trim())\n\t\t\t: [trimmedPreview.split(\"\\n\", 1)[0] ?? \"\"].filter((line) => line.trim());\n\t\tfor (const line of previewLines.length > 0 ? previewLines : [\"(no output)\"]) {\n\t\t\ttext += `\\n ${theme.fg(\"dim\", `⎿ ${line}`)}`;\n\t\t}\n\t\tif (!options.expanded && trimmedPreview.includes(\"\\n\")) {\n\t\t\tconst expandKey = keyText(\"app.tools.expand\");\n\t\t\ttext += `\\n ${theme.fg(\"dim\", `${expandKey} full notification`)}`;\n\t\t}\n\t\tif (details.sessionLabel && details.sessionValue) {\n\t\t\ttext += `\\n ${theme.fg(\"muted\", `${details.sessionLabel}: ${shortenPath(details.sessionValue)}`)}`;\n\t\t}\n\t\treturn new Text(text, 0, 0);\n\t});\n\n\tpi.registerMessageRenderer<SubagentSteeringMessageDetails>(SUBAGENT_STEERING_MESSAGE_TYPE, (message, _options, theme) => {\n\t\tconst details = message.details as SubagentSteeringMessageDetails | undefined;\n\t\tif (!details) return undefined;\n\t\treturn new Text(theme.fg(details.state === \"recovered\" ? \"warning\" : \"error\", formatSteeringNotice(details)), 0, 0);\n\t});\n\n\tpi.registerMessageRenderer<SubagentControlMessageDetails>(SUBAGENT_CONTROL_MESSAGE_TYPE, () => undefined);\n\n\tconst executeSubagentCollapsed = (id: string, params: SubagentParamsLike, signal: AbortSignal, onUpdate: ((result: AgentToolResult<Details>) => void) | undefined, ctx: ExtensionContext) => {\n\t\tif (ctx.hasUI) ctx.ui.setToolsExpanded(false);\n\t\treturn executor.execute(id, params, signal, onUpdate, ctx);\n\t};\n\n\tconst slashBridge = registerSlashSubagentBridge({\n\t\tevents: pi.events,\n\t\tgetContext: () => state.lastUiContext,\n\t\texecute: (id, params, signal, onUpdate, ctx) =>\n\t\t\texecuteSubagentCollapsed(id, params, signal, onUpdate, ctx),\n\t});\n\n\tconst promptTemplateBridge = registerPromptTemplateDelegationBridge({\n\t\tevents: pi.events,\n\t\tgetContext: () => state.lastUiContext,\n\t\texecute: (requestId, params, signal, ctx, onUpdate) =>\n\t\t\texecuteSubagentCollapsed(requestId, params, signal, onUpdate, ctx),\n\t});\n\n\tconst rpcBridge = registerSubagentRpcBridge({\n\t\tevents: pi.events,\n\t\tgetContext: () => state.lastUiContext,\n\t\texecute: (id, params, signal, onUpdate, ctx) => executor.execute(id, params, signal, onUpdate, ctx),\n\t});\n\n\tconst tool: ToolDefinition<typeof SubagentParams, Details> = {\n\t\tname: \"subagent\",\n\t\tlabel: \"Subagent\",\n\t\tdescription: buildSubagentToolDescription(config),\n\t\tparameters: SubagentParams,\n\t\t// lunr: same-turn SINGLE calls overlap; sequential work uses chain.\n\t\texecutionMode: \"parallel\",\n\n\t\tprepareArguments(args) {\n\t\t\t// Run friendly chain validation before pi-ai's raw TypeBox schema check\n\t\t\t// so the model sees which property is disallowed, what is allowed, and a\n\t\t\t// valid example instead of `chain.N: must not have additional properties`.\n\t\t\tvalidateChainInput(args);\n\t\t\treturn args as never;\n\t\t},\n\n\t\texecute(id, params, signal, onUpdate, ctx) {\n\t\t\treturn executeSubagentCollapsed(id, params, signal, onUpdate, ctx);\n\t\t},\n\n\t\trenderCall: renderSubagentCall,\n\n\t\trenderResult(result, options, theme, context) {\n\t\t\tif (subagentResultIsRunning(result)) {\n\t\t\t\tensureSubagentResultAnimation(context);\n\t\t\t} else {\n\t\t\t\tclearLegacyResultAnimationTimer(context);\n\t\t\t}\n\t\t\tconst state = context.state as { frame?: number; animEntries?: Array<{ text: Text; line: (frame: number) => string }> };\n\t\t\t// lunr: collect running-glyph line templates while rendering so the\n\t\t\t// animation timer can rewrite them in place (see ensureSubagentResultAnimation).\n\t\t\tconst entries: Array<{ text: Text; line: (frame: number) => string }> = [];\n\t\t\tstate.animEntries = entries;\n\t\t\tsubagentAnimSink.current = entries;\n\t\t\ttry {\n\t\t\t\treturn renderSubagentResult(result, options, theme, state.frame ?? 0);\n\t\t\t} finally {\n\t\t\t\tsubagentAnimSink.current = null;\n\t\t\t}\n\t\t},\n\n\t};\n\n\tpi.registerTool(tool);\n\n\t// lunr: register a callback so toggling model tiers mid-session rebuilds the subagent\n\t// tool description (adds/removes MODEL TIERS guidance) and refreshes the tool registry.\n\tconst modelTierBridge = (globalThis as Record<symbol, unknown>)[Symbol.for(\"@lunr/model-tiers\")] as\n\t\t| { registerToolDescriptionRefresher?: (refresher: () => void) => void }\n\t\t| undefined;\n\tmodelTierBridge?.registerToolDescriptionRefresher?.(() => {\n\t\ttool.description = buildSubagentToolDescription(config);\n\t\t// pi.runtime is not on ExtensionAPI; registerTool refreshes the live registry.\n\t\tpi.registerTool(tool);\n\t});\n\n\tregisterWaitTool(pi, state, waitToolConfig.enabled);\n\n\tpi.on(\"agent_end\", async (_event, ctx) => {\n\t\tif (ctx.hasUI) return;\n\t\tawait drainOutstandingWork({ state, events: pi.events });\n\t});\n\n\tregisterSlashCommands(pi, state);\n\n\tconst eventUnsubscribeStoreKey = \"__piSubagentEventUnsubscribes\";\n\tconst controlNoticeSeenStoreKey = \"__piSubagentVisibleControlNotices\";\n\tconst previousEventUnsubscribes = globalStore[eventUnsubscribeStoreKey];\n\tif (Array.isArray(previousEventUnsubscribes)) {\n\t\tfor (const unsubscribe of previousEventUnsubscribes) {\n\t\t\tif (typeof unsubscribe !== \"function\") continue;\n\t\t\ttry {\n\t\t\t\tunsubscribe();\n\t\t\t} catch {\n\t\t\t\t// Best effort cleanup for stale handlers from an older reload.\n\t\t\t}\n\t\t}\n\t}\n\tregisterSubagentNotify(pi, state, { batchConfig: config.completionBatch });\n\n\tconst existingVisibleControlNotices = globalStore[controlNoticeSeenStoreKey];\n\tconst visibleControlNotices = existingVisibleControlNotices instanceof Set ? existingVisibleControlNotices as Set<string> : new Set<string>();\n\tglobalStore[controlNoticeSeenStoreKey] = visibleControlNotices;\n\tconst controlEventHandler = (payload: unknown) => {\n\t\thandleSubagentControlNotice({\n\t\t\tpi,\n\t\t\tstate,\n\t\t\tvisibleControlNotices,\n\t\t\tdetails: payload as SubagentControlMessageDetails,\n\t\t});\n\t};\n\tconst steeringNoticeHandler = (payload: unknown) => {\n\t\thandleSubagentSteeringNotice({ pi, state, details: payload as SubagentSteeringMessageDetails });\n\t};\n\tconst eventUnsubscribes = [\n\t\tpi.events.on(SUBAGENT_ASYNC_STARTED_EVENT, handleStarted),\n\t\tpi.events.on(SUBAGENT_ASYNC_COMPLETE_EVENT, handleComplete),\n\t\tpi.events.on(SUBAGENT_CONTROL_EVENT, controlEventHandler),\n\t\tpi.events.on(SUBAGENT_STEERING_NOTICE_EVENT, steeringNoticeHandler),\n\t\trpcBridge.dispose,\n\t];\n\tglobalStore[eventUnsubscribeStoreKey] = eventUnsubscribes;\n\n\tpi.on(\"tool_result\", (event, ctx) => {\n\t\tif (event.toolName !== \"subagent\") return;\n\t\tif (!ctx.hasUI) return;\n\t\tstate.lastUiContext = ctx;\n\t\tif (state.asyncJobs.size > 0) {\n\t\t\trefreshWidget(ctx);\n\t\t\tensurePoller();\n\t\t}\n\t});\n\n\tconst cleanupSessionArtifacts = (ctx: ExtensionContext) => {\n\t\ttry {\n\t\t\tconst sessionFile = ctx.sessionManager.getSessionFile();\n\t\t\tif (sessionFile) {\n\t\t\t\tcleanupOldArtifacts(getArtifactsDir(sessionFile), DEFAULT_ARTIFACT_CONFIG.cleanupDays);\n\t\t\t}\n\t\t} catch {\n\t\t\t// Cleanup failures should not block session lifecycle events.\n\t\t}\n\t};\n\n\tconst resetSessionState = (ctx: ExtensionContext) => {\n\t\tgeneration++;\n\t\texecutorPromise = undefined;\n\t\tstate.baseCwd = ctx.cwd;\n\t\tstate.currentSessionId = resolveCurrentSessionId(ctx.sessionManager);\n\t\tstate.subagentSpawns = { sessionId: state.currentSessionId, count: 0 };\n\t\t// Set PI_SUBAGENT_PARENT_SESSION for permission-system forwarding.\n\t\t// Only set in the root session (the interactive UI session), not in\n\t\t// child subagent processes — children inherit the parent's value\n\t\t// through the process environment at spawn time and must not overwrite\n\t\t// it with their own session identity.\n\t\tif (!process.env[SUBAGENT_CHILD_ENV]) {\n\t\t\tconst sessionId = ctx.sessionManager.getSessionId();\n\t\t\tif (sessionId) {\n\t\t\t\tprocess.env[SUBAGENT_PARENT_SESSION_ENV] = sessionId;\n\t\t\t}\n\t\t}\n\t\tstate.lastUiContext = ctx;\n\t\tcleanupSessionArtifacts(ctx);\n\t\tclearPendingForegroundControlNotices(state);\n\t\tresetJobs(ctx);\n\t\trestoreActiveJobs(ctx);\n\t\tscheduledRunManager.bindSession(ctx);\n\t\trestoreSlashFinalSnapshots(ctx.sessionManager.getEntries());\n\t\tprimeExistingResults();\n\t};\n\n\tpi.on(\"session_start\", (_event, ctx) => {\n\t\tresetSessionState(ctx);\n\t\trpcBridge.emitReady(ctx);\n\t\tsupervisorChannel.start();\n\t});\n\n\tpi.on(\"session_shutdown\", () => {\n\t\tgeneration++;\n\t\texecutorPromise = undefined;\n\t\tdelete process.env[SUBAGENT_PARENT_SESSION_ENV];\n\t\tfor (const unsubscribe of eventUnsubscribes) {\n\t\t\ttry {\n\t\t\t\tunsubscribe();\n\t\t\t} catch {\n\t\t\t\t// Best effort cleanup during shutdown.\n\t\t\t}\n\t\t}\n\t\tif (globalStore[eventUnsubscribeStoreKey] === eventUnsubscribes) {\n\t\t\tdelete globalStore[eventUnsubscribeStoreKey];\n\t\t}\n\t\tstopResultWatcher();\n\t\tscheduledRunManager.stop();\n\t\tif (state.poller) clearInterval(state.poller);\n\t\tstate.poller = null;\n\t\tclearPendingForegroundControlNotices(state);\n\t\tfor (const timer of state.cleanupTimers.values()) {\n\t\t\tclearTimeout(timer);\n\t\t}\n\t\tstate.cleanupTimers.clear();\n\t\tstate.asyncJobs.clear();\n\t\tclearSlashSnapshots();\n\t\tslashBridge.cancelAll();\n\t\tslashBridge.dispose();\n\t\tpromptTemplateBridge.cancelAll();\n\t\tpromptTemplateBridge.dispose();\n\t\tsupervisorChannel.dispose();\n\t\tif (globalStore[runtimeCleanupStoreKey] === runtimeCleanup) {\n\t\t\tdelete globalStore[runtimeCleanupStoreKey];\n\t\t}\n\t\ttry {\n\t\t\tif (state.lastUiContext?.hasUI) {\n\t\t\t\tstate.lastUiContext.ui.setWidget(WIDGET_KEY, undefined);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (!isStaleExtensionContextError(error)) throw error;\n\t\t}\n\t});\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/extension/index.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;GAWG;AAQH,OAAO,KAAK,EAAE,YAAY,EAAoC,MAAM,iCAAiC,CAAC;AAEtG,OAAO,EAA0B,IAAI,EAAmE,MAAM,wBAAwB,CAAC;AAqCvI,OAAO,EAGN,KAAK,aAAa,EAYlB,MAAM,oBAAoB,CAAC;AAS5B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAiFzC,wBAAgB,iCAAiC,CAAC,IAAI,KAAA,EAAE,KAAK,EAAE,aAAa,GAAG,MAAM,GAAG,SAAS,CAgBhG;AAED,wBAAgB,kBAAkB,CAAC,OAAO,KAAA,EAAE,KAAK,KAAA,EAAE,OAAO,KAAA,EAAE,OAAO,KAAA,QAkClE;AAED,wBAAgB,oBAAoB,CAAC,OAAO,KAAA,EAAE,KAAK,KAAA,QASlD;AA8FD,MAAM,CAAC,OAAO,UAAU,yBAAyB,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CA8bxE","sourcesContent":["// @ts-nocheck\n/**\n * Subagent Tool\n *\n * Full-featured subagent with foreground and async modes.\n * - Async (default): Background execution, emits events when done\n * - Foreground (async:false or clarify:true): Streams output, renders markdown, tracks usage\n *\n * Modes: single (agent + task), parallel (tasks[]), chain (chain[] with {previous})\n *\n * Config file: ~/.lunr/agent/extensions/subagent/config.json\n * { \"maxSubagentDepth\": 1, \"intercomBridge\": { \"mode\": \"always\", \"instructionFile\": \"./intercom-bridge.md\" }, \"worktreeSetupHook\": \"./scripts/setup-worktree.mjs\" }\n */\n\nimport { randomUUID } from \"node:crypto\";\nimport { createSubagentCancellation, registerSubagentCancellation } from \"../../../../core/subagent-cancellation.ts\";\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { AgentToolResult } from \"@ashx-j/lunr-agent\";\nimport type { ExtensionAPI, ExtensionContext, ToolDefinition } from \"@ashx-j/lunr-dev\";\nimport { awaitWithAbort } from \"../../../../utils/await-with-abort.ts\";\nimport { Box, Container, Spacer, Text, truncateToWidth, visibleWidth, wrapTextWithAnsi, type Component } from \"@ashx-j/lunr-tui\";\n\nimport { cleanupAllArtifactDirs, cleanupOldArtifacts, getArtifactsDir } from \"../shared/artifacts.ts\";\nimport { resolveCurrentSessionId } from \"../shared/session-identity.ts\";\nimport { cleanupOldChainDirs } from \"../shared/settings.ts\";\nimport {\n\tclearLegacyResultAnimationTimer,\n\tdisposeSubagentWidget,\n\trenderSubagentResult,\n\tSUBAGENT_PAINT_INTERVAL_MS,\n\tsubagentAnimSink,\n} from \"../tui/render.ts\";\nimport { SubagentParams } from \"./schemas.ts\";\nimport { validateChainInput } from \"./chain-validation.ts\";\nimport type { createSubagentExecutor, SubagentParamsLike } from \"../runs/foreground/subagent-executor.ts\";\nimport { resolveSubagentRequestParams } from \"../runs/foreground/request-params.ts\";\nimport { createAsyncJobTracker } from \"../runs/background/async-job-tracker.ts\";\nimport { createResultWatcher } from \"../runs/background/result-watcher.ts\";\nimport { createScheduledRunManager } from \"../runs/background/scheduled-runs.ts\";\nimport { isAsyncSubagentExecution, normalizeAsyncLaunchConfig, subagentLaunchRunsAsync } from \"../runs/background/top-level-async.ts\";\nimport { registerSlashCommands } from \"../slash/slash-commands.ts\";\nimport { registerPromptTemplateDelegationBridge } from \"../slash/prompt-template-bridge.ts\";\nimport { registerMainWatchdog } from \"../watchdog/register-main.ts\";\nimport { registerSlashSubagentBridge } from \"../slash/slash-bridge.ts\";\nimport { createNativeSupervisorChannel } from \"../intercom/native-supervisor-channel.ts\";\nimport { registerSubagentRpcBridge } from \"./rpc.ts\";\nimport { clearSlashSnapshots, getSlashRenderableSnapshot, resolveSlashMessageDetails, restoreSlashFinalSnapshots, type SlashMessageDetails } from \"../slash/slash-live-state.ts\";\nimport { inspectSubagentStatus } from \"../runs/background/run-status.ts\";\nimport { resolveWaitToolConfig } from \"../runs/background/subagent-wait.ts\";\nimport { registerWaitTool } from \"../runs/background/wait-tool.ts\";\nimport { drainOutstandingWork } from \"../runs/background/auto-drain.ts\";\nimport registerSubagentNotify, { parseSubagentNotifyContent, type SubagentNotifyDetails } from \"../runs/background/notify.ts\";\nimport { formatSteeringNotice, handleSubagentSteeringNotice, SUBAGENT_STEERING_MESSAGE_TYPE, type SubagentSteeringMessageDetails } from \"./steering-notices.ts\";\nimport { SUBAGENT_CHILD_ENV, SUBAGENT_PARENT_SESSION_ENV } from \"../runs/shared/pi-args.ts\";\n\nimport { loadConfig } from \"./config.ts\";\nimport { buildSubagentToolDescription } from \"./tool-description.ts\";\nimport {\n\ttype AsyncJobState,\n\ttype Details,\n\ttype SubagentState,\n\tASYNC_DIR,\n\tchildRowLabel,\n\tDEFAULT_ARTIFACT_CONFIG,\n\tRESULTS_DIR,\n\tSLASH_RESULT_TYPE,\n\tSLASH_TEXT_RESULT_TYPE,\n\tSUBAGENT_ASYNC_COMPLETE_EVENT,\n\tSUBAGENT_ASYNC_STARTED_EVENT,\n\tSUBAGENT_CONTROL_EVENT,\n\tSUBAGENT_STEERING_NOTICE_EVENT,\n\tWIDGET_KEY,\n} from \"../shared/types.ts\";\nimport {\n\tclearPendingForegroundControlNotices,\n\tformatSubagentControlNotice,\n\thandleSubagentControlNotice,\n\tSUBAGENT_CONTROL_MESSAGE_TYPE,\n\ttype SubagentControlMessageDetails,\n} from \"./control-notices.ts\";\n\nexport { loadConfig } from \"./config.ts\";\n\n/**\n * Derive subagent session base directory from parent session file.\n * If parent session is ~/.lunr/agent/sessions/abc123.jsonl,\n * returns ~/.lunr/agent/sessions/abc123/ as the base.\n * Callers add runId to create the actual session root: abc123/{runId}/\n * Falls back to a unique temp directory if no parent session.\n */\nfunction getSubagentSessionRoot(parentSessionFile: string | null): string {\n\tif (parentSessionFile) {\n\t\tconst baseName = path.basename(parentSessionFile, \".jsonl\");\n\t\tconst sessionsDir = path.dirname(parentSessionFile);\n\t\treturn path.join(sessionsDir, baseName);\n\t}\n\treturn fs.mkdtempSync(path.join(os.tmpdir(), \"pi-subagent-session-\"));\n}\n\nfunction expandTilde(p: string): string {\n\treturn p.startsWith(\"~/\") ? path.join(os.homedir(), p.slice(2)) : p;\n}\n\n/**\n * Create a directory and verify it is actually accessible.\n * On Windows with Azure AD/Entra ID, directories created shortly after\n * wake-from-sleep can end up with broken NTFS ACLs (null DACL) when the\n * cloud SID cannot be resolved without network connectivity. This leaves\n * the directory completely inaccessible to the creating user.\n */\nfunction ensureAccessibleDir(dirPath: string): void {\n\tfs.mkdirSync(dirPath, { recursive: true });\n\ttry {\n\t\tfs.accessSync(dirPath, fs.constants.R_OK | fs.constants.W_OK);\n\t} catch {\n\t\ttry {\n\t\t\tfs.rmSync(dirPath, { recursive: true, force: true });\n\t\t} catch {\n\t\t\t// Best effort: retry mkdir/access even if cleanup fails.\n\t\t}\n\t\tfs.mkdirSync(dirPath, { recursive: true });\n\t\tfs.accessSync(dirPath, fs.constants.R_OK | fs.constants.W_OK);\n\t}\n}\n\nfunction isSlashResultRunning(result: { details?: Details }): boolean {\n\treturn result.details?.progress?.some((entry) => entry.status === \"running\")\n\t\t|| result.details?.results.some((entry) => entry.progress?.status === \"running\")\n\t\t|| false;\n}\n\n// Drives the inline running-indicator braille animation for foreground subagent\n// results. Foreground runs receive progress only on child events, so the glyph\n// (derived from progress fields) would freeze between events. While a result is\n// running we tick a frame counter every 80ms; renderResult registers the\n// running-glyph lines in state.animEntries (via subagentAnimSink) and the timer\n// rewrites just those Text nodes + requests a repaint, instead of invalidate()-ing\n// the whole tool component (a full renderSubagentResult rebuild 12.5x/s made the\n// spinner laggy).\nfunction subagentResultIsRunning(result: { details?: Details }): boolean {\n\treturn result.details?.progress?.some((entry) => entry.status === \"running\")\n\t\t|| result.details?.results.some((entry) => entry.progress?.status === \"running\")\n\t\t|| false;\n}\n\nfunction effectiveParallelTaskCount(tasks: Array<{ count?: unknown }> | undefined): number {\n\tif (!tasks || tasks.length === 0) return 0;\n\treturn tasks.reduce((total, task) => {\n\t\tconst count = typeof task.count === \"number\" && Number.isInteger(task.count) && task.count >= 1 ? task.count : 1;\n\t\treturn total + count;\n\t}, 0);\n}\n\nfunction matchingActionJobs(state: SubagentState, requestedId: string): AsyncJobState[] {\n\tconst jobs = new Map<string, AsyncJobState>();\n\tfor (const job of state.asyncJobs.values()) jobs.set(job.asyncId, job);\n\tfor (const job of state.fleetJobs?.values() ?? []) jobs.set(job.asyncId, job);\n\tconst exact = jobs.get(requestedId);\n\tif (exact) return [exact];\n\treturn [...jobs.values()].filter((job) => job.asyncId.startsWith(requestedId));\n}\n\nexport function resolveSubagentActionDisplayTitle(args, state: SubagentState): string | undefined {\n\tconst requestedId = (args.id || args.runId || \"\").trim();\n\tif (!requestedId) return undefined;\n\tconst matches = matchingActionJobs(state, requestedId);\n\tif (matches.length !== 1) return undefined;\n\tconst job = matches[0]!;\n\tconst steps = job.steps ?? [];\n\tif (Number.isInteger(args.index)) {\n\t\tconst step = steps.find((candidate) => candidate.index === args.index) ?? steps[args.index];\n\t\treturn step ? childRowLabel(step) : undefined;\n\t}\n\tif (steps.length === 1) return childRowLabel(steps[0]!);\n\tif (steps.length > 1) return `${job.mode ?? \"subagent\"} run`;\n\tif (job.agents?.length === 1) return job.agents[0];\n\tif (job.agents?.length) return `${job.mode ?? \"subagent\"} run`;\n\treturn undefined;\n}\n\nexport function renderSubagentCall(rawArgs, theme, context, options) {\n\tconst args = resolveSubagentRequestParams(rawArgs);\n\tif (args.action) {\n\t\tconst resultTitle = context?.result?.details?.displayTitle;\n\t\tconst resolvedTitle = resultTitle || options?.resolveActionTitle?.(args);\n\t\tconst target = resolvedTitle || args.id || args.runId || \"\";\n\t\treturn new Text(\n\t\t\t`${theme.fg(\"toolTitle\", theme.bold(\"subagent \"))}${args.action}${target ? ` ${theme.fg(\"accent\", target)}` : \"\"}`,\n\t\t\t0,\n\t\t\t0,\n\t\t);\n\t}\n\tconst isParallel = (args.tasks?.length ?? 0) > 0;\n\tconst parallelCount = effectiveParallelTaskCount(args.tasks as Array<{ count?: unknown }> | undefined);\n\tconst asyncMark = subagentLaunchRunsAsync(args) ? `${theme.fg(\"warning\", \"async\")} ` : \"\";\n\tif (args.chain?.length) {\n\t\treturn new Text(\n\t\t\t`${theme.fg(\"toolTitle\", theme.bold(\"subagent \"))}${asyncMark}chain (${args.chain.length})`,\n\t\t\t0,\n\t\t\t0,\n\t\t);\n\t}\n\tif (isParallel) {\n\t\treturn new Text(\n\t\t\t`${theme.fg(\"toolTitle\", theme.bold(\"subagent \"))}${asyncMark}parallel (${parallelCount})`,\n\t\t\t0,\n\t\t\t0,\n\t\t);\n\t}\n\tconst showDescription = !context?.result && !context?.isPartial && !context?.expanded && !context?.isError;\n\tconst description = showDescription ? theme.fg(\"accent\", args.description || args.task || \"?\") : \"\";\n\tconst title = theme.fg(\"toolTitle\", theme.bold(\"subagent\"));\n\tconst rest = [asyncMark.trim() ? theme.fg(\"warning\", \"async\") : \"\", description].filter(Boolean).join(\" \");\n\treturn new Text(rest ? `${title} ${rest}` : title, 0, 0);\n}\n\nexport function renderSubagentNotify(details, theme) {\n\tconst status = typeof details?.status === \"string\" ? details.status : \"\";\n\tconst icon = status === \"completed\"\n\t\t? theme.fg(\"success\", \"✓\")\n\t\t: status === \"failed\"\n\t\t\t? theme.fg(\"error\", \"✗\")\n\t\t\t: theme.fg(\"warning\", \"■\");\n\tconst title = details?.agent || \"child\";\n\treturn new Text(`${icon} ${theme.bold(title)} ${theme.fg(\"dim\", status)}`, 0, 0);\n}\n\nfunction ensureSubagentResultAnimation(context: { state: Record<string, unknown>; invalidate?: () => void; requestRender?: () => void }): void {\n\tconst state = context.state as {\n\t\tsubagentResultAnimationTimer?: ReturnType<typeof setInterval>;\n\t\tframe?: number;\n\t\tanimEntries?: Array<{ text: Text; line: (frame: number, now: number) => string }>;\n\t};\n\tif (state.subagentResultAnimationTimer) return;\n\tif (typeof context.invalidate !== \"function\") return;\n\tif (state.frame === undefined) state.frame = 0;\n\tstate.subagentResultAnimationTimer = setInterval(() => {\n\t\tstate.frame = (state.frame ?? 0) + 1;\n\t\ttry {\n\t\t\tconst entries = state.animEntries;\n\t\t\tif (entries?.length && typeof context.requestRender === \"function\") {\n\t\t\t\tconst now = Date.now();\n\t\t\t\tfor (const entry of entries) entry.text.setText(entry.line(state.frame ?? 0, now));\n\t\t\t\tcontext.requestRender();\n\t\t\t} else {\n\t\t\t\tcontext.invalidate();\n\t\t\t}\n\t\t} catch {}\n\t}, SUBAGENT_PAINT_INTERVAL_MS);\n}\n\nfunction isSlashResultError(result: { details?: Details }): boolean {\n\treturn result.details?.results.some((entry) => entry.exitCode !== 0 && entry.progress?.status !== \"running\") || false;\n}\n\nfunction isStaleExtensionContextError(error: unknown): boolean {\n\treturn error instanceof Error && error.message.includes(\"Extension context no longer active\");\n}\n\nfunction rebuildSlashResultContainer(\n\tcontainer: Container,\n\tresult: AgentToolResult<Details>,\n\toptions: { expanded: boolean },\n\ttheme: ExtensionContext[\"ui\"][\"theme\"],\n): void {\n\tcontainer.clear();\n\tcontainer.addChild(new Spacer(1));\n\tconst boxTheme = isSlashResultRunning(result) ? \"toolPendingBg\" : isSlashResultError(result) ? \"toolErrorBg\" : \"toolSuccessBg\";\n\tconst box = new Box(1, 1, (text: string) => theme.bg(boxTheme, text));\n\tbox.addChild(renderSubagentResult(result, options, theme));\n\tcontainer.addChild(box);\n}\n\nfunction createSlashResultComponent(\n\tdetails: SlashMessageDetails,\n\toptions: { expanded: boolean },\n\ttheme: ExtensionContext[\"ui\"][\"theme\"],\n): Container {\n\tconst container = new Container();\n\tlet lastVersion = -1;\n\tcontainer.render = (width: number): string[] => {\n\t\tconst snapshot = getSlashRenderableSnapshot(details);\n\t\tif (snapshot.version !== lastVersion || isSlashResultRunning(snapshot.result)) {\n\t\t\tlastVersion = snapshot.version;\n\t\t\trebuildSlashResultContainer(container, snapshot.result, options, theme);\n\t\t}\n\t\treturn Container.prototype.render.call(container, width);\n\t};\n\treturn container;\n}\n\nclass SubagentControlNoticeComponent implements Component {\n\tconstructor(\n\t\tprivate readonly details: SubagentControlMessageDetails,\n\t\tprivate readonly theme: ExtensionContext[\"ui\"][\"theme\"],\n\t) {}\n\n\tinvalidate(): void {}\n\n\trender(width: number): string[] {\n\t\tconst eventLabel = this.details.event.type.replaceAll(\"_\", \" \");\n\t\tif (width < 3) return [truncateToWidth(`Subagent ${eventLabel}`, width)];\n\t\tconst bodyWidth = Math.max(1, width - 2);\n\t\tconst borderChar = \"─\";\n\t\tconst header = ` ⚠ Subagent ${eventLabel}: ${this.details.event.agent} `;\n\t\tconst headerText = truncateToWidth(header, bodyWidth, \"\");\n\t\tconst headerPadding = Math.max(0, bodyWidth - visibleWidth(headerText));\n\t\tconst lines = [this.theme.fg(\"accent\", `╭${headerText}${borderChar.repeat(headerPadding)}╮`)];\n\n\t\tfor (const line of wrapTextWithAnsi(formatSubagentControlNotice(this.details), bodyWidth)) {\n\t\t\tconst text = truncateToWidth(line, bodyWidth, \"\");\n\t\t\tconst padding = Math.max(0, bodyWidth - visibleWidth(text));\n\t\t\tlines.push(this.theme.fg(\"accent\", `│${text}${\" \".repeat(padding)}│`));\n\t\t}\n\t\tlines.push(this.theme.fg(\"accent\", `╰${borderChar.repeat(bodyWidth)}╯`));\n\t\treturn lines;\n\t}\n}\n\nexport default function registerSubagentExtension(pi: ExtensionAPI): void {\n\tif (process.env[SUBAGENT_CHILD_ENV] === \"1\") {\n\t\treturn;\n\t}\n\tconst globalStore = globalThis as Record<string, unknown>;\n\tconst runtimeCleanupStoreKey = \"__piSubagentRuntimeCleanup\";\n\tconst previousRuntimeCleanup = globalStore[runtimeCleanupStoreKey];\n\tif (typeof previousRuntimeCleanup === \"function\") {\n\t\ttry {\n\t\t\tpreviousRuntimeCleanup();\n\t\t} catch {\n\t\t\t// Best effort cleanup for stale timers from an older reload.\n\t\t}\n\t}\n\n\tensureAccessibleDir(RESULTS_DIR);\n\tensureAccessibleDir(ASYNC_DIR);\n\tcleanupOldChainDirs();\n\n\tconst config = normalizeAsyncLaunchConfig(loadConfig());\n\tconst waitToolConfig = resolveWaitToolConfig(config.waitTool);\n\tconst tempArtifactsDir = getArtifactsDir(null);\n\tcleanupAllArtifactDirs(DEFAULT_ARTIFACT_CONFIG.cleanupDays);\n\n\tconst state: SubagentState = {\n\t\tbaseCwd: \"\",\n\t\tcurrentSessionId: null,\n\t\tsessionGeneration: 0,\n\t\tforegroundSubagentInFlight: 0,\n\t\tsubagentSpawns: { sessionId: null, count: 0 },\n\t\tasyncJobs: new Map(),\n\t\tfleetJobs: new Map(),\n\t\tforegroundRuns: new Map(),\n\t\tforegroundControls: new Map(),\n\t\tlastForegroundControlId: null,\n\t\tpendingForegroundControlNotices: new Map(),\n\t\tcleanupTimers: new Map(),\n\t\tlastUiContext: null,\n\t\tpoller: null,\n\t\tcompletionSeen: new Map(),\n\t\twatcher: null,\n\t\twatcherRestartTimer: null,\n\t\tresultFileCoalescer: {\n\t\t\tschedule: () => false,\n\t\t\tclear: () => {},\n\t\t},\n\t};\n\n\tconst supervisorChannel = createNativeSupervisorChannel(pi, state);\n\tconst mainWatchdog = registerMainWatchdog(pi);\n\tconst { startResultWatcher, primeExistingResults, stopResultWatcher } = createResultWatcher(\n\t\tpi,\n\t\tstate,\n\t\tRESULTS_DIR,\n\t\t10 * 60 * 1000,\n\t);\n\tstartResultWatcher();\n\tprimeExistingResults();\n\n\tlet generation = 0;\n\tlet executorPromise: Promise<ReturnType<typeof createSubagentExecutor>> | undefined;\n\tconst pendingLaunches = new Set<Promise<void>>();\n\tconst pendingAsyncLaunches = new Set<Promise<void>>();\n\tlet unregisterCancellation: (() => void) | undefined;\n\tconst runtimeCleanup = () => {\n\t\tgeneration++;\n\t\tsupervisorChannel.cancelOwnedQuestions(\"parent runtime replaced\");\n\t\tstate.sessionGeneration = (state.sessionGeneration ?? 0) + 1;\n\t\texecutorPromise = undefined;\n\t\tpendingLaunches.clear();\n\t\tpendingAsyncLaunches.clear();\n\t\tunregisterCancellation?.();\n\t\tmainWatchdog.dispose();\n\t\tstopResultWatcher();\n\t\tscheduledRunManager.stop();\n\t\tsupervisorChannel.dispose();\n\t\tclearPendingForegroundControlNotices(state);\n\t\tdisposeSubagentWidget();\n\t\tif (state.poller) {\n\t\t\tclearInterval(state.poller);\n\t\t\tstate.poller = null;\n\t\t}\n\t};\n\tglobalStore[runtimeCleanupStoreKey] = runtimeCleanup;\n\n\tconst { ensurePoller, refreshWidget, handleStarted, handleComplete: trackComplete, resetJobs, restoreActiveJobs } = createAsyncJobTracker(pi, state, ASYNC_DIR, {\n\t\twidgetEnabled: config.asyncWidget !== false,\n\t});\n\tconst handleComplete = (data: unknown) => {\n\t\ttrackComplete(data);\n\t\tconst result = data as { id?: string; sessionId?: string };\n\t\tif (typeof state.currentSessionId === \"string\" && result.sessionId !== state.currentSessionId) return;\n\t\tif (typeof result.id === \"string\" && result.id.trim()) {\n\t\t\tsupervisorChannel.settleRunQuestions(result.id, \"async run settled\");\n\t\t}\n\t};\n\tlet executorExecute: ((id: string, params: SubagentParamsLike, signal: AbortSignal, onUpdate: ((r: AgentToolResult<Details>) => void) | undefined, ctx: ExtensionContext) => Promise<AgentToolResult<Details>>) | undefined;\n\tconst scheduledRunManager = createScheduledRunManager({\n\t\tconfig,\n\t\tlaunch: (params, ctx, signal) => {\n\t\t\tif (!executorExecute) {\n\t\t\t\treturn Promise.resolve({\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Scheduled subagent launch is unavailable (executor not ready).\" }],\n\t\t\t\t\tisError: true,\n\t\t\t\t\tdetails: { mode: \"management\" as const, results: [] },\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn executorExecute(randomUUID(), params, signal, undefined, ctx);\n\t\t},\n\t});\n\tconst executor: ReturnType<typeof createSubagentExecutor> = {\n\t\tasync execute(id, params, signal, onUpdate, ctx) {\n\t\t\tlet resolveLaunchReady!: () => void;\n\t\t\tlet launchReady = false;\n\t\t\tconst launchReadyPromise = new Promise<void>((resolve) => {\n\t\t\t\tresolveLaunchReady = resolve;\n\t\t\t});\n\t\t\tconst markLaunchReady = () => {\n\t\t\t\tif (launchReady) return;\n\t\t\t\tlaunchReady = true;\n\t\t\t\tpendingLaunches.delete(launchReadyPromise);\n\t\t\t\tpendingAsyncLaunches.delete(launchReadyPromise);\n\t\t\t\tresolveLaunchReady();\n\t\t\t};\n\t\t\tpendingLaunches.add(launchReadyPromise);\n\t\t\tif (isAsyncSubagentExecution(resolveSubagentRequestParams(params))) pendingAsyncLaunches.add(launchReadyPromise);\n\t\t\ttry {\n\t\t\t\tconst currentGeneration = generation;\n\t\t\t\tsignal?.throwIfAborted();\n\t\t\t\tif (!executorPromise) {\n\t\t\t\t\tconst pending = import(\"../runs/foreground/subagent-executor.ts\").then(({ createSubagentExecutor }) => {\n\t\t\t\t\t\tif (generation !== currentGeneration) throw new Error(\"Subagent session changed before initialization\");\n\t\t\t\t\t\treturn createSubagentExecutor({\n\t\t\t\t\t\t\tpi, state, config,\n\t\t\t\t\t\t\twaitToolEnabled: waitToolConfig.enabled,\n\t\t\t\t\t\t\thandleScheduledRunAction: (params, ctx) => scheduledRunManager.handleToolCall(params, ctx),\n\t\t\t\t\t\t\twatchdog: mainWatchdog, tempArtifactsDir, getSubagentSessionRoot, expandTilde,\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t\texecutorPromise = pending;\n\t\t\t\t\tvoid pending.catch(() => {\n\t\t\t\t\t\tif (executorPromise === pending) executorPromise = undefined;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tconst ready = await awaitWithAbort(executorPromise, signal);\n\t\t\t\tsignal?.throwIfAborted();\n\t\t\t\tif (generation !== currentGeneration) throw new Error(\"Subagent session changed before execution\");\n\t\t\t\tconst execution = ready.execute(id, params, signal, onUpdate, ctx);\n\t\t\t\tmarkLaunchReady();\n\t\t\t\treturn await execution;\n\t\t\t} finally {\n\t\t\t\tmarkLaunchReady();\n\t\t\t}\n\t\t},\n\t};\n\texecutorExecute = executor.execute;\n\n\tpi.registerMessageRenderer<SlashMessageDetails>(SLASH_RESULT_TYPE, (message, options, theme) => {\n\t\tconst details = resolveSlashMessageDetails(message.details);\n\t\tif (!details) return undefined;\n\t\treturn createSlashResultComponent(details, options, theme);\n\t});\n\n\tpi.registerMessageRenderer<undefined>(SLASH_TEXT_RESULT_TYPE, (message, _options, _theme) => {\n\t\tconst content = typeof message.content === \"string\"\n\t\t\t? message.content\n\t\t\t: message.content\n\t\t\t\t.filter((entry) => entry.type === \"text\")\n\t\t\t\t.map((entry) => entry.text)\n\t\t\t\t.join(\"\\n\");\n\t\treturn new Text(content, 0, 0);\n\t});\n\n\tpi.registerMessageRenderer<SubagentNotifyDetails>(\"subagent-notify\", (message, _options, theme) => {\n\t\tconst content = typeof message.content === \"string\" ? message.content : \"\";\n\t\tconst details = (message.details as SubagentNotifyDetails | undefined) ?? parseSubagentNotifyContent(content);\n\t\tif (!details) return new Text(content, 0, 0);\n\t\treturn renderSubagentNotify(details, theme);\n\t});\n\n\tpi.registerMessageRenderer<SubagentSteeringMessageDetails>(SUBAGENT_STEERING_MESSAGE_TYPE, (message, _options, theme) => {\n\t\tconst details = message.details as SubagentSteeringMessageDetails | undefined;\n\t\tif (!details) return undefined;\n\t\treturn new Text(theme.fg(details.state === \"recovered\" ? \"warning\" : \"error\", formatSteeringNotice(details)), 0, 0);\n\t});\n\n\tpi.registerMessageRenderer<SubagentControlMessageDetails>(SUBAGENT_CONTROL_MESSAGE_TYPE, () => undefined);\n\n\tconst executeSubagentCollapsed = async (id: string, params: SubagentParamsLike, signal: AbortSignal, onUpdate: ((result: AgentToolResult<Details>) => void) | undefined, ctx: ExtensionContext) => {\n\t\tif (ctx.hasUI) ctx.ui.setToolsExpanded(false);\n\t\tconst displayTitle = params.action === \"steer\"\n\t\t\t? resolveSubagentActionDisplayTitle(params, state)\n\t\t\t: undefined;\n\t\tconst result = await executor.execute(id, params, signal, onUpdate, ctx);\n\t\tif (displayTitle && result.details) result.details.displayTitle = displayTitle;\n\t\treturn result;\n\t};\n\n\tconst slashBridge = registerSlashSubagentBridge({\n\t\tevents: pi.events,\n\t\tgetContext: () => state.lastUiContext,\n\t\texecute: (id, params, signal, onUpdate, ctx) =>\n\t\t\texecuteSubagentCollapsed(id, params, signal, onUpdate, ctx),\n\t});\n\n\tconst promptTemplateBridge = registerPromptTemplateDelegationBridge({\n\t\tevents: pi.events,\n\t\tgetContext: () => state.lastUiContext,\n\t\texecute: (requestId, params, signal, ctx, onUpdate) =>\n\t\t\texecuteSubagentCollapsed(requestId, params, signal, onUpdate, ctx),\n\t});\n\n\tconst rpcBridge = registerSubagentRpcBridge({\n\t\tevents: pi.events,\n\t\tgetContext: () => state.lastUiContext,\n\t\texecute: (id, params, signal, onUpdate, ctx) => executor.execute(id, params, signal, onUpdate, ctx),\n\t});\n\n\tconst tool: ToolDefinition<typeof SubagentParams, Details> = {\n\t\tname: \"subagent\",\n\t\tlabel: \"Subagent\",\n\t\tdescription: buildSubagentToolDescription(config),\n\t\tparameters: SubagentParams,\n\t\t// lunr: same-turn SINGLE calls overlap; sequential work uses chain.\n\t\texecutionMode: \"parallel\",\n\n\t\tprepareArguments(args) {\n\t\t\t// Run friendly chain validation before pi-ai's raw TypeBox schema check\n\t\t\t// so the model sees which property is disallowed, what is allowed, and a\n\t\t\t// valid example instead of `chain.N: must not have additional properties`.\n\t\t\tvalidateChainInput(args);\n\t\t\treturn args as never;\n\t\t},\n\n\t\texecute(id, params, signal, onUpdate, ctx) {\n\t\t\treturn executeSubagentCollapsed(id, params, signal, onUpdate, ctx);\n\t\t},\n\n\t\trenderCall: (args, theme, context) => renderSubagentCall(args, theme, context, {\n\t\t\tresolveActionTitle: (params) => resolveSubagentActionDisplayTitle(params, state),\n\t\t}),\n\n\t\trenderResult(result, options, theme, context) {\n\t\t\tif (subagentResultIsRunning(result)) {\n\t\t\t\tensureSubagentResultAnimation(context);\n\t\t\t} else {\n\t\t\t\tclearLegacyResultAnimationTimer(context);\n\t\t\t}\n\t\t\tconst state = context.state as { frame?: number; animEntries?: Array<{ text: Text; line: (frame: number) => string }> };\n\t\t\t// lunr: collect running-glyph line templates while rendering so the\n\t\t\t// animation timer can rewrite them in place (see ensureSubagentResultAnimation).\n\t\t\tconst entries: Array<{ text: Text; line: (frame: number) => string }> = [];\n\t\t\tstate.animEntries = entries;\n\t\t\tsubagentAnimSink.current = entries;\n\t\t\ttry {\n\t\t\t\treturn renderSubagentResult(result, options, theme, state.frame ?? 0);\n\t\t\t} finally {\n\t\t\t\tsubagentAnimSink.current = null;\n\t\t\t}\n\t\t},\n\n\t};\n\n\tpi.registerTool(tool);\n\n\t// lunr: register a callback so model-tier settings changes rebuild the subagent\n\t// tool description and refresh the live registry.\n\tconst modelTierBridge = (globalThis as Record<symbol, unknown>)[Symbol.for(\"@lunr/model-tiers\")] as\n\t\t| { registerToolDescriptionRefresher?: (refresher: () => void) => void }\n\t\t| undefined;\n\tmodelTierBridge?.registerToolDescriptionRefresher?.(() => {\n\t\ttool.description = buildSubagentToolDescription(config);\n\t\t// pi.runtime is not on ExtensionAPI; registerTool refreshes the live registry.\n\t\tpi.registerTool(tool);\n\t});\n\n\tregisterWaitTool(pi, state, waitToolConfig.enabled, async (signal) => {\n\t\tconst launches = [...pendingLaunches];\n\t\tif (launches.length === 0) return;\n\t\tawait awaitWithAbort(Promise.all(launches).then(() => {}), signal);\n\t});\n\n\tpi.on(\"agent_end\", async (_event, ctx) => {\n\t\tif (ctx.hasUI) return;\n\t\tawait drainOutstandingWork({ state, events: pi.events });\n\t});\n\n\tregisterSlashCommands(pi, state);\n\n\tconst eventUnsubscribeStoreKey = \"__piSubagentEventUnsubscribes\";\n\tconst controlNoticeSeenStoreKey = \"__piSubagentVisibleControlNotices\";\n\tconst previousEventUnsubscribes = globalStore[eventUnsubscribeStoreKey];\n\tif (Array.isArray(previousEventUnsubscribes)) {\n\t\tfor (const unsubscribe of previousEventUnsubscribes) {\n\t\t\tif (typeof unsubscribe !== \"function\") continue;\n\t\t\ttry {\n\t\t\t\tunsubscribe();\n\t\t\t} catch {\n\t\t\t\t// Best effort cleanup for stale handlers from an older reload.\n\t\t\t}\n\t\t}\n\t}\n\tregisterSubagentNotify(pi, state, { batchConfig: config.completionBatch });\n\n\tconst existingVisibleControlNotices = globalStore[controlNoticeSeenStoreKey];\n\tconst visibleControlNotices = existingVisibleControlNotices instanceof Set ? existingVisibleControlNotices as Set<string> : new Set<string>();\n\tglobalStore[controlNoticeSeenStoreKey] = visibleControlNotices;\n\tconst controlEventHandler = (payload: unknown) => {\n\t\thandleSubagentControlNotice({\n\t\t\tpi,\n\t\t\tstate,\n\t\t\tvisibleControlNotices,\n\t\t\tdetails: payload as SubagentControlMessageDetails,\n\t\t});\n\t};\n\tconst steeringNoticeHandler = (payload: unknown) => {\n\t\thandleSubagentSteeringNotice({ pi, state, details: payload as SubagentSteeringMessageDetails });\n\t};\n\tconst eventUnsubscribes = [\n\t\tpi.events.on(SUBAGENT_ASYNC_STARTED_EVENT, handleStarted),\n\t\tpi.events.on(SUBAGENT_ASYNC_COMPLETE_EVENT, handleComplete),\n\t\tpi.events.on(SUBAGENT_CONTROL_EVENT, controlEventHandler),\n\t\tpi.events.on(SUBAGENT_STEERING_NOTICE_EVENT, steeringNoticeHandler),\n\t\trpcBridge.dispose,\n\t];\n\tglobalStore[eventUnsubscribeStoreKey] = eventUnsubscribes;\n\n\tpi.on(\"tool_result\", (event, ctx) => {\n\t\tif (event.toolName !== \"subagent\") return;\n\t\tif (!ctx.hasUI) return;\n\t\tstate.lastUiContext = ctx;\n\t\tif (state.asyncJobs.size > 0) {\n\t\t\trefreshWidget(ctx);\n\t\t\tensurePoller();\n\t\t}\n\t});\n\n\tconst cleanupSessionArtifacts = (ctx: ExtensionContext) => {\n\t\ttry {\n\t\t\tconst sessionFile = ctx.sessionManager.getSessionFile();\n\t\t\tif (sessionFile) {\n\t\t\t\tcleanupOldArtifacts(getArtifactsDir(sessionFile), DEFAULT_ARTIFACT_CONFIG.cleanupDays);\n\t\t\t}\n\t\t} catch {\n\t\t\t// Cleanup failures should not block session lifecycle events.\n\t\t}\n\t};\n\n\tconst resetSessionState = (ctx: ExtensionContext) => {\n\t\tgeneration++;\n\t\tsupervisorChannel.cancelOwnedQuestions(\"parent session replaced\");\n\t\tstate.sessionGeneration = (state.sessionGeneration ?? 0) + 1;\n\t\texecutorPromise = undefined;\n\t\tpendingLaunches.clear();\n\t\tpendingAsyncLaunches.clear();\n\t\tunregisterCancellation?.();\n\t\tstate.baseCwd = ctx.cwd;\n\t\tstate.currentSessionId = resolveCurrentSessionId(ctx.sessionManager);\n\t\tstate.subagentSpawns = { sessionId: state.currentSessionId, count: 0 };\n\t\t// Set PI_SUBAGENT_PARENT_SESSION for permission-system forwarding.\n\t\t// Only set in the root session (the interactive UI session), not in\n\t\t// child subagent processes — children inherit the parent's value\n\t\t// through the process environment at spawn time and must not overwrite\n\t\t// it with their own session identity.\n\t\tif (!process.env[SUBAGENT_CHILD_ENV]) {\n\t\t\tconst sessionId = ctx.sessionManager.getSessionId();\n\t\t\tif (sessionId) {\n\t\t\t\tprocess.env[SUBAGENT_PARENT_SESSION_ENV] = sessionId;\n\t\t\t}\n\t\t}\n\t\tstate.lastUiContext = ctx;\n\t\tcleanupSessionArtifacts(ctx);\n\t\tclearPendingForegroundControlNotices(state);\n\t\tresetJobs(ctx);\n\t\trestoreActiveJobs(ctx);\n\t\tconst sessionId = state.currentSessionId;\n\t\tconst sessionGeneration = generation;\n\t\tif (sessionId) unregisterCancellation = registerSubagentCancellation(sessionId, createSubagentCancellation({\n\t\t\tpendingLaunches: pendingAsyncLaunches,\n\t\t\tisCurrent: () => generation === sessionGeneration && state.currentSessionId === sessionId,\n\t\t\tgetActiveRunIds: () => [...state.asyncJobs.values()]\n\t\t\t\t.filter((job) => job.sessionId === sessionId && (job.status === \"queued\" || job.status === \"running\"))\n\t\t\t\t.map((job) => job.asyncId),\n\t\t\tasync stopRun(id) {\n\t\t\t\tconst result = await executor.execute(randomUUID(), { action: \"stop\", id }, new AbortController().signal, undefined, ctx);\n\t\t\t\treturn !result.isError;\n\t\t\t},\n\t\t}));\n\t\tscheduledRunManager.bindSession(ctx);\n\t\trestoreSlashFinalSnapshots(ctx.sessionManager.getEntries());\n\t\tprimeExistingResults();\n\t};\n\n\tpi.on(\"session_start\", (_event, ctx) => {\n\t\tresetSessionState(ctx);\n\t\trpcBridge.emitReady(ctx);\n\t\tsupervisorChannel.start();\n\t});\n\n\tpi.on(\"session_shutdown\", () => {\n\t\tgeneration++;\n\t\tsupervisorChannel.cancelOwnedQuestions(\"parent session shutdown\");\n\t\tstate.sessionGeneration = (state.sessionGeneration ?? 0) + 1;\n\t\texecutorPromise = undefined;\n\t\tpendingLaunches.clear();\n\t\tpendingAsyncLaunches.clear();\n\t\tunregisterCancellation?.();\n\t\tdelete process.env[SUBAGENT_PARENT_SESSION_ENV];\n\t\tfor (const unsubscribe of eventUnsubscribes) {\n\t\t\ttry {\n\t\t\t\tunsubscribe();\n\t\t\t} catch {\n\t\t\t\t// Best effort cleanup during shutdown.\n\t\t\t}\n\t\t}\n\t\tif (globalStore[eventUnsubscribeStoreKey] === eventUnsubscribes) {\n\t\t\tdelete globalStore[eventUnsubscribeStoreKey];\n\t\t}\n\t\tstopResultWatcher();\n\t\tscheduledRunManager.stop();\n\t\tif (state.poller) clearInterval(state.poller);\n\t\tstate.poller = null;\n\t\tclearPendingForegroundControlNotices(state);\n\t\tfor (const timer of state.cleanupTimers.values()) {\n\t\t\tclearTimeout(timer);\n\t\t}\n\t\tstate.cleanupTimers.clear();\n\t\tstate.asyncJobs.clear();\n\t\tclearSlashSnapshots();\n\t\tslashBridge.cancelAll();\n\t\tslashBridge.dispose();\n\t\tpromptTemplateBridge.cancelAll();\n\t\tpromptTemplateBridge.dispose();\n\t\tsupervisorChannel.dispose();\n\t\tif (globalStore[runtimeCleanupStoreKey] === runtimeCleanup) {\n\t\t\tdelete globalStore[runtimeCleanupStoreKey];\n\t\t}\n\t\tdisposeSubagentWidget();\n\t\ttry {\n\t\t\tif (state.lastUiContext?.hasUI) {\n\t\t\t\tstate.lastUiContext.ui.setWidget(WIDGET_KEY, undefined);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tif (!isStaleExtensionContextError(error)) throw error;\n\t\t}\n\t});\n}\n"]}
|