@ashx-j/lunr 0.2.11 → 0.2.13
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 +13 -0
- package/README.md +211 -236
- package/dist/builtin-extensions/ashxj-tui.d.ts +3 -0
- package/dist/builtin-extensions/ashxj-tui.d.ts.map +1 -1
- package/dist/builtin-extensions/ashxj-tui.js +28 -11
- package/dist/builtin-extensions/ashxj-tui.js.map +1 -1
- package/dist/builtin-extensions/index.d.ts.map +1 -1
- package/dist/builtin-extensions/index.js +0 -2
- package/dist/builtin-extensions/index.js.map +1 -1
- package/dist/builtin-extensions/lunr-cron.d.ts +1 -1
- package/dist/builtin-extensions/lunr-cron.d.ts.map +1 -1
- package/dist/builtin-extensions/lunr-cron.js +1 -1
- package/dist/builtin-extensions/lunr-cron.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/chain-validation.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/chain-validation.js +3 -3
- package/dist/builtin-extensions/pi-subagents/src/extension/chain-validation.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/doctor.d.ts +0 -2
- package/dist/builtin-extensions/pi-subagents/src/extension/doctor.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/doctor.js +1 -23
- package/dist/builtin-extensions/pi-subagents/src/extension/doctor.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 +6 -7
- 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 +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.js +7 -14
- package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.d.ts +12 -9
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js +38 -34
- 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 +3 -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 +32 -47
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts +7 -10
- 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 +90 -109
- 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-resume.d.ts +3 -2
- 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 +37 -50
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.d.ts +4 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.js +5 -5
- package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.js.map +1 -1
- 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 +31 -13
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts +4 -3
- 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 +48 -20
- 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 +2 -2
- 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 +90 -64
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts +6 -8
- 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 +262 -161
- 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 -1
- 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 +24 -33
- 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 +25 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.d.ts.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.js +51 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.js.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/dynamic-fanout.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/dynamic-fanout.js +20 -3
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/dynamic-fanout.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts +4 -1
- 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 +5 -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 +9 -3
- 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 +2 -2
- 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 +20 -17
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.d.ts +70 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.d.ts.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.js +153 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.js.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/settings.d.ts +13 -8
- package/dist/builtin-extensions/pi-subagents/src/shared/settings.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/settings.js +20 -51
- package/dist/builtin-extensions/pi-subagents/src/shared/settings.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +80 -20
- package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.js +10 -2
- package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts +2 -2
- 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 +20 -32
- 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 +2 -1
- 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 +23 -449
- 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 +2 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js +13 -11
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.d.ts +2 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.js +18 -17
- package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.js.map +1 -1
- package/dist/builtin-extensions/simple-pi-memory.d.ts +2 -2
- package/dist/builtin-extensions/simple-pi-memory.d.ts.map +1 -1
- package/dist/builtin-extensions/simple-pi-memory.js +41 -17
- package/dist/builtin-extensions/simple-pi-memory.js.map +1 -1
- package/dist/catalog/models.json +1 -1
- package/dist/catalog/providers/amazon-bedrock.json +1 -1
- package/dist/catalog/providers/azure-openai-responses.json +1 -1
- package/dist/catalog/providers/cloudflare-ai-gateway.json +1 -1
- package/dist/catalog/providers/cloudflare-workers-ai.json +1 -1
- package/dist/catalog/providers/fireworks.json +1 -1
- package/dist/catalog/providers/github-copilot.json +1 -1
- package/dist/catalog/providers/huggingface.json +1 -1
- package/dist/catalog/providers/minimax-cn.json +1 -1
- package/dist/catalog/providers/minimax.json +1 -1
- package/dist/catalog/providers/mistral.json +1 -1
- package/dist/catalog/providers/nvidia.json +1 -1
- package/dist/catalog/providers/openai.json +1 -1
- package/dist/catalog/providers/opencode-go.json +1 -1
- package/dist/catalog/providers/opencode.json +1 -1
- package/dist/catalog/providers/openrouter.json +1 -1
- package/dist/catalog/providers/qwen-cloud-cn.json +1 -1
- package/dist/catalog/providers/qwen-cloud.json +1 -1
- package/dist/catalog/providers/qwen-token-plan-cn.json +1 -1
- package/dist/catalog/providers/qwen-token-plan.json +1 -1
- package/dist/catalog/providers/together.json +1 -1
- package/dist/catalog/providers/vercel-ai-gateway.json +1 -1
- package/dist/catalog/providers/zai-coding-cn.json +1 -1
- package/dist/catalog/providers/zai.json +1 -1
- package/dist/catalog/publication.json +3 -3
- package/dist/core/agent-session.d.ts +7 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +34 -4
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/context-breakdown.d.ts +3 -1
- package/dist/core/context-breakdown.d.ts.map +1 -1
- package/dist/core/context-breakdown.js +5 -2
- package/dist/core/context-breakdown.js.map +1 -1
- package/dist/core/customize.d.ts +2 -0
- package/dist/core/customize.d.ts.map +1 -1
- package/dist/core/customize.js +6 -0
- package/dist/core/customize.js.map +1 -1
- package/dist/core/memory-cap.d.ts +4 -8
- package/dist/core/memory-cap.d.ts.map +1 -1
- package/dist/core/memory-cap.js +8 -8
- package/dist/core/memory-cap.js.map +1 -1
- package/dist/core/permissions.d.ts +2 -0
- package/dist/core/permissions.d.ts.map +1 -1
- package/dist/core/permissions.js +30 -14
- package/dist/core/permissions.js.map +1 -1
- package/dist/core/plan-mode.d.ts.map +1 -1
- package/dist/core/plan-mode.js +1 -9
- package/dist/core/plan-mode.js.map +1 -1
- package/dist/core/rollback.d.ts.map +1 -1
- package/dist/core/rollback.js +1 -1
- package/dist/core/rollback.js.map +1 -1
- package/dist/core/settings-manager.d.ts +16 -5
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +37 -10
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +1 -5
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/subagent-permission-inherit.d.ts +34 -22
- package/dist/core/subagent-permission-inherit.d.ts.map +1 -1
- package/dist/core/subagent-permission-inherit.js +37 -80
- package/dist/core/subagent-permission-inherit.js.map +1 -1
- package/dist/core/swarm.d.ts.map +1 -1
- package/dist/core/swarm.js +13 -7
- package/dist/core/swarm.js.map +1 -1
- package/dist/core/system-prompt.d.ts +6 -4
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +38 -48
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/usage-adapters/openai-codex.d.ts +1 -1
- package/dist/core/usage-adapters/openai-codex.d.ts.map +1 -1
- package/dist/core/usage-adapters/openai-codex.js +22 -17
- package/dist/core/usage-adapters/openai-codex.js.map +1 -1
- package/dist/core/usage-service.d.ts +10 -1
- package/dist/core/usage-service.d.ts.map +1 -1
- package/dist/core/usage-service.js +17 -6
- package/dist/core/usage-service.js.map +1 -1
- package/dist/gateway/agent-bridge.d.ts.map +1 -1
- package/dist/gateway/agent-bridge.js +1 -4
- package/dist/gateway/agent-bridge.js.map +1 -1
- package/dist/gateway/cron.d.ts.map +1 -1
- package/dist/gateway/cron.js +1 -4
- package/dist/gateway/cron.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +0 -5
- package/dist/main.js.map +1 -1
- package/dist/migrations.d.ts +2 -0
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +21 -0
- package/dist/migrations.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +7 -4
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +122 -162
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/usage-view.d.ts +1 -1
- package/dist/modes/interactive/components/usage-view.d.ts.map +1 -1
- package/dist/modes/interactive/components/usage-view.js +7 -4
- package/dist/modes/interactive/components/usage-view.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +1 -2
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +55 -96
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/skill-tag-autocomplete.d.ts +13 -0
- package/dist/modes/interactive/skill-tag-autocomplete.d.ts.map +1 -0
- package/dist/modes/interactive/skill-tag-autocomplete.js +72 -0
- package/dist/modes/interactive/skill-tag-autocomplete.js.map +1 -0
- package/docs/compaction.md +23 -23
- package/docs/containerization.md +24 -24
- package/docs/custom-provider.md +18 -18
- package/docs/development.md +16 -15
- package/docs/docs.json +6 -2
- package/docs/extensions.md +82 -80
- package/docs/features.md +102 -0
- package/docs/index.md +25 -19
- package/docs/json.md +7 -7
- package/docs/keybindings.md +4 -4
- package/docs/models.md +2 -2
- package/docs/packages.md +38 -42
- package/docs/prompt-templates.md +4 -4
- package/docs/providers.md +22 -10
- package/docs/quickstart.md +81 -46
- package/docs/rpc.md +7 -13
- package/docs/sdk.md +43 -41
- package/docs/security.md +18 -18
- package/docs/session-format.md +9 -9
- package/docs/sessions.md +13 -12
- package/docs/settings.md +63 -24
- package/docs/shell-aliases.md +2 -2
- package/docs/skills.md +21 -11
- package/docs/terminal-setup.md +5 -5
- package/docs/termux.md +7 -7
- package/docs/themes.md +12 -14
- package/docs/tmux.md +4 -4
- package/docs/tui.md +23 -23
- package/docs/usage.md +112 -87
- package/docs/windows.md +10 -2
- package/examples/README.md +3 -1
- package/examples/extensions/README.md +6 -6
- 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/doom-overlay/README.md +2 -2
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/plan-mode/README.md +3 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/subagent/README.md +13 -11
- package/examples/extensions/todo.ts +2 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/examples/sdk/README.md +9 -5
- package/package.json +6 -7
- package/dist/builtin-extensions/lunr-behavior.d.ts +0 -44
- package/dist/builtin-extensions/lunr-behavior.d.ts.map +0 -1
- package/dist/builtin-extensions/lunr-behavior.js +0 -213
- package/dist/builtin-extensions/lunr-behavior.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/agents/context-builder.md +0 -46
- package/dist/builtin-extensions/pi-subagents/agents/deep-researcher.md +0 -36
- package/dist/builtin-extensions/pi-subagents/agents/delegate.md +0 -12
- package/dist/builtin-extensions/pi-subagents/agents/oracle.md +0 -73
- package/dist/builtin-extensions/pi-subagents/agents/planner.md +0 -55
- package/dist/builtin-extensions/pi-subagents/agents/research-writer.md +0 -37
- package/dist/builtin-extensions/pi-subagents/agents/researcher.md +0 -52
- package/dist/builtin-extensions/pi-subagents/agents/reviewer.md +0 -79
- package/dist/builtin-extensions/pi-subagents/agents/scout.md +0 -50
- package/dist/builtin-extensions/pi-subagents/agents/worker.md +0 -55
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.d.ts +0 -20
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.js +0 -1273
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-memory.d.ts +0 -49
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-memory.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-memory.js +0 -252
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-memory.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-scope.d.ts +0 -3
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-scope.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-scope.js +0 -6
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-scope.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-selection.d.ts +0 -3
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-selection.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-selection.js +0 -23
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-selection.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-serializer.d.ts +0 -8
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-serializer.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-serializer.js +0 -143
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-serializer.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agents.d.ts +0 -176
- package/dist/builtin-extensions/pi-subagents/src/agents/agents.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agents.js +0 -1326
- package/dist/builtin-extensions/pi-subagents/src/agents/agents.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/chain-serializer.d.ts +0 -7
- package/dist/builtin-extensions/pi-subagents/src/agents/chain-serializer.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/chain-serializer.js +0 -307
- package/dist/builtin-extensions/pi-subagents/src/agents/chain-serializer.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/identity.d.ts +0 -8
- package/dist/builtin-extensions/pi-subagents/src/agents/identity.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/identity.js +0 -30
- package/dist/builtin-extensions/pi-subagents/src/agents/identity.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/proactive-skills.d.ts +0 -35
- package/dist/builtin-extensions/pi-subagents/src/agents/proactive-skills.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/proactive-skills.js +0 -151
- package/dist/builtin-extensions/pi-subagents/src/agents/proactive-skills.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.d.ts +0 -131
- package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.js +0 -491
- package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.js.map +0 -1
- package/dist/core/behavior-preset.d.ts +0 -60
- package/dist/core/behavior-preset.d.ts.map +0 -1
- package/dist/core/behavior-preset.js +0 -257
- package/dist/core/behavior-preset.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-description.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/extension/tool-description.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { ExtensionConfig, ToolDescriptionMode } from \"../shared/types.ts\";\nimport { getAgentDir, getProjectConfigDir } from \"../shared/utils.ts\";\n\nconst CUSTOM_TOOL_DESCRIPTION_FILE = \"subagent-tool-description.md\";\nconst CUSTOM_TOOL_DESCRIPTION_MAX_BYTES = 50 * 1024;\n\nexport const SUBAGENT_SAFETY_GUIDANCE = `SAFETY-CRITICAL SUBAGENT GUIDANCE:\n• Use { action: \"list\" } before execution and only run executable/non-disabled agents or chains.\n• Keep execution and management separate: omit action for SINGLE/PARALLEL/CHAIN execution; use action only for list/get/models/create/update/delete/status/interrupt/stop/resume/append-step/doctor.\n• Async/background runs: launch with async:true only when work can proceed independently. Do not sleep or poll status just to wait. In an interactive session, normally return control and let Pi wake you; use subagent_wait when this request must run to completion in the current turn or skill. Headless sessions auto-drain current-session work.\n• Child-safety boundary: ordinary child subagents are not orchestrators and must not run subagents. Only explicitly configured fanout children may use the child-safe subagent tool, still bounded by depth/session limits.\n• Writing/review safety: keep one writer for the same cwd/worktree. Use fresh-context read-only reviewers/validators for independent review, then have the parent synthesize and apply fixes as the sole writer unless an isolated worktree was intentionally requested.\n• Artifacts/status essentials: chain outputs live under {chain_dir}; async runs expose asyncId/asyncDir with status.json, events.jsonl, output logs, and status via { action: \"status\", id }. Include output paths and residual risks when reporting results.`;\n\nexport const FULL_SUBAGENT_TOOL_DESCRIPTION = `Delegate to subagents or manage agent definitions.\n\nEXECUTION (use exactly ONE mode):\n• Before executing, use { action: \"list\" } to inspect configured agents/chains. Only execute agents listed as executable/non-disabled.\n• SINGLE: { agent, task? } - one task; omit task for self-contained agents. Multiple SINGLE calls in the same turn run concurrently (capped).\n• CHAIN: { chain: [{agent:\"agent-a\"}, {parallel:[{agent:\"agent-b\",count:3}]}] } - sequential pipeline with optional parallel fan-out. Use chain when a later child needs an earlier result.\n• PARALLEL: { tasks: [{agent,task,count?,output?,reads?,progress?}, ...], concurrency?: number, worktree?: true } - one-call concurrent execution (default: all tasks at once; worktree: isolate each task in a git worktree)\n• Children always start with a fresh session (no inherited parent transcript). Model strings accept a thinking suffix (provider/model:off|minimal|low|medium|high|xhigh|max).\n• Optional timeout: { timeoutMs } or { maxRuntimeMs } sets a run-level max runtime for foreground and async/background runs\n• If { action: \"list\" } shows proactive skill subagent suggestions, consider a small fresh-context fanout for broad tasks where one of those skills would materially help\n\nCHAIN TEMPLATE VARIABLES (use in task strings):\n• {task} - The original task/request from the user\n• {previous} - Text response from the previous step (empty for first step)\n• {chain_dir} - Shared directory for chain files (e.g., <tmpdir>/pi-subagents-<scope>/chain-runs/abc123/)\n\nCHAIN EXAMPLES (quick reference for the nested schema):\n• Sequential: { chain: [{agent:\"agent-a\", task:\"Analyze {task}\"}, {agent:\"agent-b\", task:\"Plan based on {previous}\"}] }\n• Parallel fan-out: { chain: [{parallel: [{agent:\"agent-a\", task:\"Check part of {task}\", count: 3}]}] }\n• Mixed: { chain: [{agent:\"agent-a\", task:\"Research {task}\"}, {parallel: [{agent:\"agent-b\", task:\"Review {previous}\", count: 2}]}, {agent:\"agent-c\", task:\"Summarize {previous}\"}] }\n\nMANAGEMENT (use action field, omit agent/task/chain/tasks):\n• { action: \"list\" } - discover executable agents/chains\n• { action: \"get\", agent: \"name\" } - full detail; packaged agents use dotted runtime names like \"package.agent\"\n• { action: \"models\", agent?: \"name\" } - show the runtime-loaded builtin subagent model mapping, optionally filtered to one builtin\n• { action: \"watchdog.status\" | \"watchdog.check\" | \"watchdog.recommend-model\" } - inspect the opt-in subagent watchdog and its strong complementary model recommendation\n• { action: \"watchdog.configure\", model: \"recommended\" | \"inherit\" | \"provider/model[:thinking]\", scope?: \"session\" | \"user\" | \"project\", target?: \"main\" | \"children\" | \"child\", agent?: \"name\", thinking?: \"inherit\" | \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\" } - configure watchdog model selection; default scope is session, use persistent scopes only when the user asks\n• { action: \"create\", config: { name: \"custom-agent\", package: \"code-analysis\", systemPrompt, systemPromptMode, inheritProjectContext, inheritSkills, acceptance, acceptanceRole: \"read-only\" | \"writer\", ... } }\n• acceptanceRole affects inferred acceptance only, never tool access. Explicit task mutation/no-edit intent wins; omission preserves name heuristics. Update with false or an empty string to clear it.\n• { action: \"update\", agent: \"code-analysis.custom-agent\", config: { package: \"analysis\", ... } } - merge\n• { action: \"delete\", agent: \"code-analysis.custom-agent\" }\n• { action: \"eject\", agent: \"reviewer\", agentScope?: \"user\" | \"project\" } - copy a bundled/package agent to user/project scope as an editable custom file that shadows the original (default scope: user)\n• { action: \"disable\", agent: \"reviewer\", agentScope?: \"user\" | \"project\" } - hide any agent from runtime discovery via a reversible settings override (default scope: user)\n• { action: \"enable\", agent: \"reviewer\", agentScope?: \"user\" | \"project\" } - remove a disabled override and restore discovery\n• { action: \"reset\", agent: \"reviewer\", agentScope?: \"user\" | \"project\" } - delete the scope's custom agent file and/or settings override, restoring the bundled default\n• Use chainName for chain operations; packaged chains also use dotted runtime names\n\nCONTROL:\n• { action: \"status\", id: \"...\" } - inspect an async/background run by id or prefix\n• { action: \"status\", view: \"fleet\" } - read-only active foreground/async fleet view with transcript commands\n• { action: \"status\", id: \"...\", view: \"transcript\", index?: 0, lines?: 80 } - tail a run or child output/session transcript\n• { action: \"interrupt\", id?: \"...\" } - soft-interrupt the current child turn and leave the run paused\n• { action: \"stop\", id: \"...\" } - stop a current-session top-level async run; stopped runs finish with state \"stopped\"\n• { action: \"resume\", id: \"...\", message: \"...\", index?: 0 } - interrupt then follow up with a live async child, or revive a completed async/foreground child from its session\n• { action: \"steer\", id: \"...\", message: \"...\", index?: 0 } - await correlated child-Pi input acceptance for up to 3 seconds; returns delivered, scheduled, pending, partial, recovered, or failed with a request id. Only top-level single runs may recover after a further 15-second pause/revival bound; chain, parallel, and nested runs never auto-interrupt.\n• { action: \"append-step\", id: \"...\", chain: [{agent:\"agent-c\", task:\"Use {previous}\"}] } - append one step to the tail of a running async chain\n\nSCHEDULE (opt-in; requires { \"scheduledRuns\": { \"enabled\": true } } in config.json):\n• { action: \"schedule\", agent, task?, schedule: \"+10m\" | \"2030-01-01T09:00:00Z\", scheduleName? } - defer a subagent launch until a future time. Also accepts tasks[] or chain[]. Scheduled runs always launch async with fresh context; they become normal tracked async runs once they fire. Only schedule explicit delayed runs the user asked for.\n• { action: \"schedule-list\" } - list scheduled runs for this session\n• { action: \"schedule-status\", id: \"...\" } - inspect one scheduled run\n• { action: \"schedule-cancel\", id: \"...\" } - cancel a scheduled run before it fires\n\nDIAGNOSTICS:\n• { action: \"doctor\" } - read-only report for runtime paths, discovery, sessions, and intercom\n\n${SUBAGENT_SAFETY_GUIDANCE}`;\n\nexport const COMPACT_SUBAGENT_TOOL_DESCRIPTION = `Delegate to subagents or manage definitions. Use exactly one mode per call.\n\nEXECUTE:\n• Before execution, call { action: \"list\" }; run only executable/non-disabled configured agents/chains.\n• SINGLE {agent, task?} (same-turn singles overlap); PARALLEL {tasks:[{agent,task,count?,output?,reads?,progress?}], concurrency?, worktree?}; CHAIN {chain:[{agent,task?},{parallel:[...]}]} for sequential work.\n• Children always start with a fresh session. timeoutMs/maxRuntimeMs apply to foreground and async/background runs.\n• Chain templates may use {task}, {previous}, {chain_dir}, and named outputs. Parallel worktree isolation requires a clean git repo.\n• Chain example: { chain: [{agent:\"agent-a\", task:\"Analyze {task}\"}, {parallel: [{agent:\"agent-b\", task:\"Check {previous}\", count: 3}]}] }\n• If list shows proactive skill subagent suggestions, use a small fresh-context fanout only when the task is broad enough.\n\nMANAGE / CONTROL:\n• Use action without execution fields: list, get, models, create, update, delete, eject, disable, enable, reset, doctor, watchdog.status, watchdog.check, watchdog.recommend-model, watchdog.configure.\n• Agent acceptanceRole (read-only or writer) affects inferred acceptance only, never tools. Explicit task intent wins; omission keeps name heuristics. Update with false or an empty string to clear it.\n• Async control actions: status, interrupt, stop, resume, steer, append-step. Use stop with an id for current-session top-level async runs. Use status view:\"fleet\" for active-run overview, view:\"transcript\" to tail child output, and steer for acknowledged live guidance. Steering delivery means Pi accepted the correlated user input, not model compliance; use index for a specific child.\n• Opt-in schedule actions: schedule, schedule-list, schedule-status, schedule-cancel. Schedule only explicit delayed runs the user asked for.\n\nASYNC / WAIT:\n• async:true detaches background work. Do not sleep or poll just to wait. Interactive sessions normally yield for completion notifications; use subagent_wait for run-to-completion turns or skills. Headless sessions auto-drain current-session work.\n• Status and artifacts live under asyncId/asyncDir with status.json, events.jsonl, output logs, session files, and { action:\"status\", id:\"...\" }.\n\nSAFETY:\n• Ordinary child subagents are not orchestrators and must not run subagents. Only explicit fanout children may use child-safe subagent, still bounded by depth/session limits.\n• Keep one writer per cwd/worktree. Use fresh read-only review/validation fanout, then synthesize and apply fixes from the parent unless isolated worktrees were intentionally requested.`;\n\nfunction isToolDescriptionMode(value: unknown): value is ToolDescriptionMode {\n\treturn value === \"full\" || value === \"compact\" || value === \"custom\";\n}\n\nfunction warn(options: ToolDescriptionOptions | undefined, message: string): void {\n\t(options?.warn ?? console.warn)(`[pi-subagents] ${message}`);\n}\n\nexport interface ToolDescriptionOptions {\n\tcwd?: string;\n\tagentDir?: string;\n\twarn?: (message: string) => void;\n}\n\nexport function resolveToolDescriptionMode(config: Pick<ExtensionConfig, \"toolDescriptionMode\">, options?: ToolDescriptionOptions): ToolDescriptionMode {\n\tconst mode = config.toolDescriptionMode;\n\tif (mode === undefined) return \"full\";\n\tif (isToolDescriptionMode(mode)) return mode;\n\twarn(options, `Ignoring invalid toolDescriptionMode ${JSON.stringify(mode)}; expected \"full\", \"compact\", or \"custom\".`);\n\treturn \"full\";\n}\n\nfunction customDescriptionPaths(options?: ToolDescriptionOptions): string[] {\n\tconst cwd = options?.cwd ?? process.cwd();\n\tconst agentDir = options?.agentDir ?? getAgentDir();\n\treturn [\n\t\tpath.join(getProjectConfigDir(cwd), CUSTOM_TOOL_DESCRIPTION_FILE),\n\t\tpath.join(agentDir, CUSTOM_TOOL_DESCRIPTION_FILE),\n\t];\n}\n\nfunction renderCustomTemplate(template: string, options?: ToolDescriptionOptions): string {\n\tconst cwd = options?.cwd ?? process.cwd();\n\tconst agentDir = options?.agentDir ?? getAgentDir();\n\tconst projectConfigDir = getProjectConfigDir(cwd);\n\tconst variables: Record<string, () => string> = {\n\t\tfullDescription: () => FULL_SUBAGENT_TOOL_DESCRIPTION,\n\t\tfull: () => FULL_SUBAGENT_TOOL_DESCRIPTION,\n\t\tcompactDescription: () => COMPACT_SUBAGENT_TOOL_DESCRIPTION,\n\t\tcompact: () => COMPACT_SUBAGENT_TOOL_DESCRIPTION,\n\t\tsafetyGuidance: () => SUBAGENT_SAFETY_GUIDANCE,\n\t\tsafety: () => SUBAGENT_SAFETY_GUIDANCE,\n\t\tagentDir: () => agentDir,\n\t\tprojectConfigDir: () => projectConfigDir,\n\t};\n\treturn template.replace(/\\{\\{(\\w+)\\}\\}/g, (raw, name: string) => {\n\t\tconst replacement = variables[name];\n\t\tif (replacement) return replacement();\n\t\twarn(options, `${CUSTOM_TOOL_DESCRIPTION_FILE}: unknown placeholder ${raw} left unchanged.`);\n\t\treturn raw;\n\t});\n}\n\nfunction loadCustomToolDescription(options?: ToolDescriptionOptions): string | undefined {\n\tfor (const filePath of customDescriptionPaths(options)) {\n\t\tlet stat: fs.Stats;\n\t\ttry {\n\t\t\tstat = fs.statSync(filePath);\n\t\t} catch (error) {\n\t\t\tif (typeof error === \"object\" && error !== null && \"code\" in error && (error as NodeJS.ErrnoException).code === \"ENOENT\") continue;\n\t\t\twarn(options, `Failed to inspect custom tool description '${filePath}': ${error instanceof Error ? error.message : String(error)}`);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!stat.isFile()) {\n\t\t\twarn(options, `Ignoring custom tool description '${filePath}' because it is not a file.`);\n\t\t\tcontinue;\n\t\t}\n\t\tif (stat.size > CUSTOM_TOOL_DESCRIPTION_MAX_BYTES) {\n\t\t\twarn(options, `Ignoring custom tool description '${filePath}' because it is larger than ${CUSTOM_TOOL_DESCRIPTION_MAX_BYTES} bytes.`);\n\t\t\tcontinue;\n\t\t}\n\t\ttry {\n\t\t\tconst template = fs.readFileSync(filePath, \"utf-8\").trim();\n\t\t\tif (!template) {\n\t\t\t\twarn(options, `Ignoring empty custom tool description '${filePath}'.`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst rendered = renderCustomTemplate(template, options).trim();\n\t\t\tif (!rendered) {\n\t\t\t\twarn(options, `Ignoring custom tool description '${filePath}' because it rendered empty.`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\treturn rendered;\n\t\t} catch (error) {\n\t\t\twarn(options, `Failed to read custom tool description '${filePath}': ${error instanceof Error ? error.message : String(error)}`);\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction withMandatorySafetyGuidance(description: string): string {\n\tconst customDescription = description\n\t\t.split(SUBAGENT_SAFETY_GUIDANCE)\n\t\t.map((part) => part.trim())\n\t\t.filter(Boolean)\n\t\t.join(\"\\n\\n\");\n\treturn customDescription\n\t\t? `${customDescription}\\n\\n${SUBAGENT_SAFETY_GUIDANCE}`\n\t\t: SUBAGENT_SAFETY_GUIDANCE;\n}\n\nexport function buildSubagentToolDescription(config: Pick<ExtensionConfig, \"toolDescriptionMode\"> = {}, options?: ToolDescriptionOptions): string {\n\tconst mode = resolveToolDescriptionMode(config, options);\n\tlet description: string;\n\tif (mode === \"compact\") {\n\t\tdescription = COMPACT_SUBAGENT_TOOL_DESCRIPTION;\n\t} else if (mode === \"custom\") {\n\t\tconst custom = loadCustomToolDescription(options);\n\t\tif (custom) {\n\t\t\tdescription = withMandatorySafetyGuidance(custom);\n\t\t} else {\n\t\t\twarn(options, `${CUSTOM_TOOL_DESCRIPTION_FILE} was not found or valid for toolDescriptionMode \"custom\"; using full description.`);\n\t\t\tdescription = FULL_SUBAGENT_TOOL_DESCRIPTION;\n\t\t}\n\t} else {\n\t\tdescription = FULL_SUBAGENT_TOOL_DESCRIPTION;\n\t}\n\t// lunr: append model-tier guidance only when lunR core's tier bridge is registered and enabled.\n\tif (isModelTierModeEnabled()) return `${description}\\n\\n${MODEL_TIER_GUIDANCE}`;\n\treturn description;\n}\n\n// lunr: model tier guidance appended to the subagent tool description when tier mode is on.\nconst MODEL_TIER_GUIDANCE = `MODEL TIERS: Model tiers are enabled. For each subagent choose \\`tier\\`: 'light' for simple lookups/formatting, 'standard' for typical coding tasks, 'heavy' for deep reasoning/complex debugging. An explicit \\`model\\` overrides the tier. Omit both to inherit the parent model.`;\n\n// lunr: check lunR core's model-tier bridge (Symbol.for(\"@lunr/model-tiers\")); absent bridge means tier mode is off.\nfunction isModelTierModeEnabled(): boolean {\n\ttry {\n\t\tconst bridge = (globalThis as Record<symbol, unknown>)[Symbol.for(\"@lunr/model-tiers\")] as\n\t\t\t| { isTierModeEnabled?: () => unknown }\n\t\t\t| undefined;\n\t\treturn typeof bridge?.isTierModeEnabled === \"function\" && bridge.isTierModeEnabled() === true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tool-description.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/extension/tool-description.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEtE,MAAM,4BAA4B,GAAG,8BAA8B,CAAC;AACpE,MAAM,iCAAiC,GAAG,EAAE,GAAG,IAAI,CAAC;AAEpD,MAAM,CAAC,MAAM,wBAAwB,GAAG;;;;;;;gQAOsN,CAAC;AAE/P,MAAM,CAAC,MAAM,8BAA8B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0C5C,wBAAwB,EAAE,CAAC;AAE7B,MAAM,CAAC,MAAM,iCAAiC,GAAG;;;;;;;;;;;;;;;;;;;;sNAoBmK,CAAC;AAErN,SAAS,qBAAqB,CAAC,KAAc,EAAgC;IAC5E,OAAO,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,QAAQ,CAAC;AAAA,CACrE;AAED,SAAS,IAAI,CAAC,OAA2C,EAAE,OAAe,EAAQ;IACjF,CAAC,OAAO,EAAE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,kBAAkB,OAAO,EAAE,CAAC,CAAC;AAAA,CAC7D;AAQD,MAAM,UAAU,0BAA0B,CAAC,MAAoD,EAAE,OAAgC,EAAuB;IACvJ,MAAM,IAAI,GAAG,MAAM,CAAC,mBAAmB,CAAC;IACxC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACtC,IAAI,qBAAqB,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7C,IAAI,CAAC,OAAO,EAAE,wCAAwC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IACxH,OAAO,MAAM,CAAC;AAAA,CACd;AAED,SAAS,sBAAsB,CAAC,OAAgC,EAAY;IAC3E,MAAM,GAAG,GAAG,OAAO,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1C,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,WAAW,EAAE,CAAC;IACpD,OAAO;QACN,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,EAAE,4BAA4B,CAAC;QACjE,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,4BAA4B,CAAC;KACjD,CAAC;AAAA,CACF;AAED,SAAS,oBAAoB,CAAC,QAAgB,EAAE,OAAgC,EAAU;IACzF,MAAM,GAAG,GAAG,OAAO,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IAC1C,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,WAAW,EAAE,CAAC;IACpD,MAAM,gBAAgB,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,SAAS,GAAiC;QAC/C,eAAe,EAAE,GAAG,EAAE,CAAC,8BAA8B;QACrD,IAAI,EAAE,GAAG,EAAE,CAAC,8BAA8B;QAC1C,kBAAkB,EAAE,GAAG,EAAE,CAAC,iCAAiC;QAC3D,OAAO,EAAE,GAAG,EAAE,CAAC,iCAAiC;QAChD,cAAc,EAAE,GAAG,EAAE,CAAC,wBAAwB;QAC9C,MAAM,EAAE,GAAG,EAAE,CAAC,wBAAwB;QACtC,QAAQ,EAAE,GAAG,EAAE,CAAC,QAAQ;QACxB,gBAAgB,EAAE,GAAG,EAAE,CAAC,gBAAgB;KACxC,CAAC;IACF,OAAO,QAAQ,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,GAAG,EAAE,IAAY,EAAE,EAAE,CAAC;QAChE,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,WAAW;YAAE,OAAO,WAAW,EAAE,CAAC;QACtC,IAAI,CAAC,OAAO,EAAE,GAAG,4BAA4B,yBAAyB,GAAG,kBAAkB,CAAC,CAAC;QAC7F,OAAO,GAAG,CAAC;IAAA,CACX,CAAC,CAAC;AAAA,CACH;AAED,SAAS,yBAAyB,CAAC,OAAgC,EAAsB;IACxF,KAAK,MAAM,QAAQ,IAAI,sBAAsB,CAAC,OAAO,CAAC,EAAE,CAAC;QACxD,IAAI,IAAc,CAAC;QACnB,IAAI,CAAC;YACJ,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC9B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,SAAS;YACnI,IAAI,CAAC,OAAO,EAAE,8CAA8C,QAAQ,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACpI,SAAS;QACV,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YACpB,IAAI,CAAC,OAAO,EAAE,qCAAqC,QAAQ,6BAA6B,CAAC,CAAC;YAC1F,SAAS;QACV,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,GAAG,iCAAiC,EAAE,CAAC;YACnD,IAAI,CAAC,OAAO,EAAE,qCAAqC,QAAQ,+BAA+B,iCAAiC,SAAS,CAAC,CAAC;YACtI,SAAS;QACV,CAAC;QACD,IAAI,CAAC;YACJ,MAAM,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;YAC3D,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACf,IAAI,CAAC,OAAO,EAAE,2CAA2C,QAAQ,IAAI,CAAC,CAAC;gBACvE,SAAS;YACV,CAAC;YACD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;YAChE,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACf,IAAI,CAAC,OAAO,EAAE,qCAAqC,QAAQ,8BAA8B,CAAC,CAAC;gBAC3F,SAAS;YACV,CAAC;YACD,OAAO,QAAQ,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,OAAO,EAAE,2CAA2C,QAAQ,MAAM,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClI,CAAC;IACF,CAAC;IACD,OAAO,SAAS,CAAC;AAAA,CACjB;AAED,SAAS,2BAA2B,CAAC,WAAmB,EAAU;IACjE,MAAM,iBAAiB,GAAG,WAAW;SACnC,KAAK,CAAC,wBAAwB,CAAC;SAC/B,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,MAAM,CAAC,CAAC;IACf,OAAO,iBAAiB;QACvB,CAAC,CAAC,GAAG,iBAAiB,OAAO,wBAAwB,EAAE;QACvD,CAAC,CAAC,wBAAwB,CAAC;AAAA,CAC5B;AAED,MAAM,UAAU,4BAA4B,CAAC,MAAM,GAAiD,EAAE,EAAE,OAAgC,EAAU;IACjJ,MAAM,IAAI,GAAG,0BAA0B,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzD,IAAI,WAAmB,CAAC;IACxB,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACxB,WAAW,GAAG,iCAAiC,CAAC;IACjD,CAAC;SAAM,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,yBAAyB,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,MAAM,EAAE,CAAC;YACZ,WAAW,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,OAAO,EAAE,GAAG,4BAA4B,mFAAmF,CAAC,CAAC;YAClI,WAAW,GAAG,8BAA8B,CAAC;QAC9C,CAAC;IACF,CAAC;SAAM,CAAC;QACP,WAAW,GAAG,8BAA8B,CAAC;IAC9C,CAAC;IACD,gGAAgG;IAChG,IAAI,sBAAsB,EAAE;QAAE,OAAO,GAAG,WAAW,OAAO,mBAAmB,EAAE,CAAC;IAChF,OAAO,WAAW,CAAC;AAAA,CACnB;AAED,4FAA4F;AAC5F,MAAM,mBAAmB,GAAG,qRAAqR,CAAC;AAElT,qHAAqH;AACrH,SAAS,sBAAsB,GAAY;IAC1C,IAAI,CAAC;QACJ,MAAM,MAAM,GAAI,UAAsC,CAAC,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAE1E,CAAC;QACb,OAAO,OAAO,MAAM,EAAE,iBAAiB,KAAK,UAAU,IAAI,MAAM,CAAC,iBAAiB,EAAE,KAAK,IAAI,CAAC;IAC/F,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAC;IACd,CAAC;AAAA,CACD","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { ExtensionConfig, ToolDescriptionMode } from \"../shared/types.ts\";\nimport { getAgentDir, getProjectConfigDir } from \"../shared/utils.ts\";\n\nconst CUSTOM_TOOL_DESCRIPTION_FILE = \"subagent-tool-description.md\";\nconst CUSTOM_TOOL_DESCRIPTION_MAX_BYTES = 50 * 1024;\n\nexport const SUBAGENT_SAFETY_GUIDANCE = `SAFETY-CRITICAL SUBAGENT GUIDANCE:\n• Prompt children directly. There is no agent roster. Every execution task needs task (the full child prompt) and description (a concise UI label).\n• permissions is \"full\" or \"read-only\". Omitted permissions means full. Plan-mode parents must pass permissions: \"read-only\"; full or omitted launches are rejected.\n• Keep execution and control separate: omit action for SINGLE/PARALLEL/CHAIN execution; use action only for status/interrupt/stop/resume/steer/append-step/doctor/watchdog.*/schedule*.\n• Async/background runs: launch with async:true only when work can proceed independently. Do not sleep or poll status just to wait. In an interactive session, normally return control and let lunR wake you; use subagent_wait when this request must run to completion in the current turn or skill. Headless sessions auto-drain current-session work.\n• Child-safety boundary: ordinary children are not orchestrators and must not run subagents. Only explicitly configured fanout children may use the child-safe subagent tool, still bounded by depth/session limits.\n• Writing/review safety: keep one full-access writer for the same cwd/worktree. Use fresh-context permissions: \"read-only\" children for independent review, then have the parent synthesize and apply fixes as the sole writer unless an isolated worktree was intentionally requested.\n• Artifacts/status essentials: chain outputs live under {chain_dir}; async runs expose asyncId/asyncDir with status.json, events.jsonl, output logs, and status via { action: \"status\", id }. Include output paths and residual risks when reporting results.`;\n\nexport const FULL_SUBAGENT_TOOL_DESCRIPTION = `Delegate work to generic children by prompting them directly. There are no named agent types.\n\nEXECUTION (use exactly ONE mode):\n• SINGLE: { task, description, permissions? } — one child. Multiple SINGLE calls in the same turn run concurrently; explicit concurrency/run limits still apply.\n• PARALLEL: { tasks: [{task, description, permissions?, count?, output?, reads?, progress?}, ...], concurrency?: number, worktree?: true } — one-call concurrent execution (default: all tasks at once; worktree: isolate each task in a git worktree)\n• CHAIN: { chain: [{task, description, permissions?}, {parallel:[{task, description, permissions?, count:3}]}] } — sequential pipeline with optional parallel fan-out. Use chain when a later child needs an earlier result.\n• description is required, single-line, max 80 characters. It is UI metadata only. task is the complete child prompt.\n• permissions: \"full\" (default) or \"read-only\". Full includes coding tools (read, search, shell, edit, write, web, LSP, MCP) and excludes parent-owned tools (cron, memory, behavior, goals, nested subagents). Plan-mode parents may launch only permissions: \"read-only\".\n• Children always start with a fresh session (no inherited parent transcript). Model strings accept a thinking suffix (provider/model:off|minimal|low|medium|high|xhigh|max).\n• Optional timeout: { timeoutMs } or { maxRuntimeMs } sets a run-level max runtime for foreground and async/background runs\n\nCHAIN TEMPLATE VARIABLES (use in task and description strings):\n• {task} - The original task/request from the user\n• {previous} - Text response from the previous step (empty for first step)\n• {chain_dir} - Shared directory for chain files (e.g., <tmpdir>/pi-subagents-<scope>/chain-runs/abc123/)\n\nCHAIN EXAMPLES:\n• Sequential: { chain: [{task:\"Analyze {task}\", description:\"Analyze request\"}, {task:\"Plan based on {previous}\", description:\"Draft plan\"}] }\n• Parallel fan-out: { chain: [{parallel: [{task:\"Check part of {task}\", description:\"Check one part\", permissions:\"read-only\", count: 3}]}] }\n• Mixed: { chain: [{task:\"Research {task}\", description:\"Research request\", permissions:\"read-only\"}, {parallel: [{task:\"Review {previous}\", description:\"Review findings\", permissions:\"read-only\", count: 2}]}, {task:\"Summarize {previous}\", description:\"Summarize reviews\"}] }\n\nCONTROL (use action field, omit task/chain/tasks):\n• { action: \"watchdog.status\" | \"watchdog.check\" | \"watchdog.recommend-model\" } - inspect the opt-in subagent watchdog and its strong complementary model recommendation\n• { action: \"watchdog.configure\", model: \"recommended\" | \"inherit\" | \"provider/model[:thinking]\", scope?: \"session\" | \"user\" | \"project\", target?: \"main\" | \"children\", thinking?: \"inherit\" | \"off\" | \"minimal\" | \"low\" | \"medium\" | \"high\" | \"xhigh\" | \"max\" } - configure watchdog model selection; default scope is session, use persistent scopes only when the user asks\n• { action: \"status\", id: \"...\" } - inspect an async/background run by id or prefix\n• { action: \"status\", view: \"fleet\" } - read-only active foreground/async fleet view with transcript commands\n• { action: \"status\", id: \"...\", view: \"transcript\", index?: 0, lines?: 80 } - tail a run or child output/session transcript\n• { action: \"interrupt\", id?: \"...\" } - soft-interrupt the current child turn and leave the run paused\n• { action: \"stop\", id: \"...\" } - stop a current-session top-level async run; stopped runs finish with state \"stopped\"\n• { action: \"resume\", id: \"...\", message: \"...\", index?: 0 } - interrupt then follow up with a live async child, or revive a completed async/foreground child from its session\n• { action: \"steer\", id: \"...\", message: \"...\", index?: 0 } - await correlated child input acceptance for up to 3 seconds; returns delivered, scheduled, pending, partial, recovered, or failed with a request id. Only top-level single runs may recover after a further 15-second pause/revival bound; chain, parallel, and nested runs never auto-interrupt.\n• { action: \"append-step\", id: \"...\", chain: [{task:\"Use {previous}\", description:\"Follow-up step\"}] } - append one step to the tail of a running async chain\n\nSCHEDULE (opt-in; requires { \"scheduledRuns\": { \"enabled\": true } } in config.json):\n• { action: \"schedule\", task, description, permissions?, schedule: \"+10m\" | \"2030-01-01T09:00:00Z\", scheduleName? } - defer a child launch until a future time. Also accepts tasks[] or chain[]. Scheduled runs always launch async with fresh context; they become normal tracked async runs once they fire. Only schedule explicit delayed runs the user asked for.\n• { action: \"schedule-list\" } - list scheduled runs for this session\n• { action: \"schedule-status\", id: \"...\" } - inspect one scheduled run\n• { action: \"schedule-cancel\", id: \"...\" } - cancel a scheduled run before it fires\n\nDIAGNOSTICS:\n• { action: \"doctor\" } - read-only report for runtime paths, sessions, and intercom\n\n${SUBAGENT_SAFETY_GUIDANCE}`;\n\nexport const COMPACT_SUBAGENT_TOOL_DESCRIPTION = `Delegate to generic children by prompting them. Use exactly one mode per call.\n\nEXECUTE:\n• SINGLE {task, description, permissions?} (same-turn singles overlap); PARALLEL {tasks:[{task,description,permissions?,count?,output?,reads?,progress?}], concurrency?, worktree?}; CHAIN {chain:[{task,description,permissions?},{parallel:[...]}]} for sequential work.\n• description is required (single-line, max 80 chars, UI only). task is the full child prompt. permissions omitted = full. Plan-mode parents must pass permissions:\"read-only\".\n• Children always start with a fresh session. timeoutMs/maxRuntimeMs apply to foreground and async/background runs.\n• Chain templates may use {task}, {previous}, {chain_dir}, and named outputs. Parallel worktree isolation requires a clean git repo.\n• Chain example: { chain: [{task:\"Analyze {task}\", description:\"Analyze request\"}, {parallel: [{task:\"Check {previous}\", description:\"Check prior result\", permissions:\"read-only\", count: 3}]}] }\n\nCONTROL:\n• Use action without execution fields: doctor, watchdog.status, watchdog.check, watchdog.recommend-model, watchdog.configure, status, interrupt, stop, resume, steer, append-step.\n• Async control actions: status, interrupt, stop, resume, steer, append-step. Use stop with an id for current-session top-level async runs. Use status view:\"fleet\" for active-run overview, view:\"transcript\" to tail child output, and steer for acknowledged live guidance. Steering delivery means lunR accepted the correlated user input, not model compliance; use index for a specific child.\n• Opt-in schedule actions: schedule, schedule-list, schedule-status, schedule-cancel. Schedule only explicit delayed runs the user asked for.\n\nASYNC / WAIT:\n• async:true detaches background work. Do not sleep or poll just to wait. Interactive sessions normally yield for completion notifications; use subagent_wait for run-to-completion turns or skills. Headless sessions auto-drain current-session work.\n• Status and artifacts live under asyncId/asyncDir with status.json, events.jsonl, output logs, session files, and { action:\"status\", id:\"...\" }.\n\nSAFETY:\n• Ordinary children are not orchestrators and must not run subagents. Only explicit fanout children may use child-safe subagent, still bounded by depth/session limits.\n• Keep one full-access writer per cwd/worktree. Use fresh permissions:\"read-only\" review/validation fanout, then synthesize and apply fixes from the parent unless isolated worktrees were intentionally requested.`;\n\nfunction isToolDescriptionMode(value: unknown): value is ToolDescriptionMode {\n\treturn value === \"full\" || value === \"compact\" || value === \"custom\";\n}\n\nfunction warn(options: ToolDescriptionOptions | undefined, message: string): void {\n\t(options?.warn ?? console.warn)(`[pi-subagents] ${message}`);\n}\n\nexport interface ToolDescriptionOptions {\n\tcwd?: string;\n\tagentDir?: string;\n\twarn?: (message: string) => void;\n}\n\nexport function resolveToolDescriptionMode(config: Pick<ExtensionConfig, \"toolDescriptionMode\">, options?: ToolDescriptionOptions): ToolDescriptionMode {\n\tconst mode = config.toolDescriptionMode;\n\tif (mode === undefined) return \"full\";\n\tif (isToolDescriptionMode(mode)) return mode;\n\twarn(options, `Ignoring invalid toolDescriptionMode ${JSON.stringify(mode)}; expected \"full\", \"compact\", or \"custom\".`);\n\treturn \"full\";\n}\n\nfunction customDescriptionPaths(options?: ToolDescriptionOptions): string[] {\n\tconst cwd = options?.cwd ?? process.cwd();\n\tconst agentDir = options?.agentDir ?? getAgentDir();\n\treturn [\n\t\tpath.join(getProjectConfigDir(cwd), CUSTOM_TOOL_DESCRIPTION_FILE),\n\t\tpath.join(agentDir, CUSTOM_TOOL_DESCRIPTION_FILE),\n\t];\n}\n\nfunction renderCustomTemplate(template: string, options?: ToolDescriptionOptions): string {\n\tconst cwd = options?.cwd ?? process.cwd();\n\tconst agentDir = options?.agentDir ?? getAgentDir();\n\tconst projectConfigDir = getProjectConfigDir(cwd);\n\tconst variables: Record<string, () => string> = {\n\t\tfullDescription: () => FULL_SUBAGENT_TOOL_DESCRIPTION,\n\t\tfull: () => FULL_SUBAGENT_TOOL_DESCRIPTION,\n\t\tcompactDescription: () => COMPACT_SUBAGENT_TOOL_DESCRIPTION,\n\t\tcompact: () => COMPACT_SUBAGENT_TOOL_DESCRIPTION,\n\t\tsafetyGuidance: () => SUBAGENT_SAFETY_GUIDANCE,\n\t\tsafety: () => SUBAGENT_SAFETY_GUIDANCE,\n\t\tagentDir: () => agentDir,\n\t\tprojectConfigDir: () => projectConfigDir,\n\t};\n\treturn template.replace(/\\{\\{(\\w+)\\}\\}/g, (raw, name: string) => {\n\t\tconst replacement = variables[name];\n\t\tif (replacement) return replacement();\n\t\twarn(options, `${CUSTOM_TOOL_DESCRIPTION_FILE}: unknown placeholder ${raw} left unchanged.`);\n\t\treturn raw;\n\t});\n}\n\nfunction loadCustomToolDescription(options?: ToolDescriptionOptions): string | undefined {\n\tfor (const filePath of customDescriptionPaths(options)) {\n\t\tlet stat: fs.Stats;\n\t\ttry {\n\t\t\tstat = fs.statSync(filePath);\n\t\t} catch (error) {\n\t\t\tif (typeof error === \"object\" && error !== null && \"code\" in error && (error as NodeJS.ErrnoException).code === \"ENOENT\") continue;\n\t\t\twarn(options, `Failed to inspect custom tool description '${filePath}': ${error instanceof Error ? error.message : String(error)}`);\n\t\t\tcontinue;\n\t\t}\n\t\tif (!stat.isFile()) {\n\t\t\twarn(options, `Ignoring custom tool description '${filePath}' because it is not a file.`);\n\t\t\tcontinue;\n\t\t}\n\t\tif (stat.size > CUSTOM_TOOL_DESCRIPTION_MAX_BYTES) {\n\t\t\twarn(options, `Ignoring custom tool description '${filePath}' because it is larger than ${CUSTOM_TOOL_DESCRIPTION_MAX_BYTES} bytes.`);\n\t\t\tcontinue;\n\t\t}\n\t\ttry {\n\t\t\tconst template = fs.readFileSync(filePath, \"utf-8\").trim();\n\t\t\tif (!template) {\n\t\t\t\twarn(options, `Ignoring empty custom tool description '${filePath}'.`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst rendered = renderCustomTemplate(template, options).trim();\n\t\t\tif (!rendered) {\n\t\t\t\twarn(options, `Ignoring custom tool description '${filePath}' because it rendered empty.`);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\treturn rendered;\n\t\t} catch (error) {\n\t\t\twarn(options, `Failed to read custom tool description '${filePath}': ${error instanceof Error ? error.message : String(error)}`);\n\t\t}\n\t}\n\treturn undefined;\n}\n\nfunction withMandatorySafetyGuidance(description: string): string {\n\tconst customDescription = description\n\t\t.split(SUBAGENT_SAFETY_GUIDANCE)\n\t\t.map((part) => part.trim())\n\t\t.filter(Boolean)\n\t\t.join(\"\\n\\n\");\n\treturn customDescription\n\t\t? `${customDescription}\\n\\n${SUBAGENT_SAFETY_GUIDANCE}`\n\t\t: SUBAGENT_SAFETY_GUIDANCE;\n}\n\nexport function buildSubagentToolDescription(config: Pick<ExtensionConfig, \"toolDescriptionMode\"> = {}, options?: ToolDescriptionOptions): string {\n\tconst mode = resolveToolDescriptionMode(config, options);\n\tlet description: string;\n\tif (mode === \"compact\") {\n\t\tdescription = COMPACT_SUBAGENT_TOOL_DESCRIPTION;\n\t} else if (mode === \"custom\") {\n\t\tconst custom = loadCustomToolDescription(options);\n\t\tif (custom) {\n\t\t\tdescription = withMandatorySafetyGuidance(custom);\n\t\t} else {\n\t\t\twarn(options, `${CUSTOM_TOOL_DESCRIPTION_FILE} was not found or valid for toolDescriptionMode \"custom\"; using full description.`);\n\t\t\tdescription = FULL_SUBAGENT_TOOL_DESCRIPTION;\n\t\t}\n\t} else {\n\t\tdescription = FULL_SUBAGENT_TOOL_DESCRIPTION;\n\t}\n\t// lunr: append model-tier guidance only when lunR core's tier bridge is registered and enabled.\n\tif (isModelTierModeEnabled()) return `${description}\\n\\n${MODEL_TIER_GUIDANCE}`;\n\treturn description;\n}\n\n// lunr: model tier guidance appended to the subagent tool description when tier mode is on.\nconst MODEL_TIER_GUIDANCE = `MODEL TIERS: Model tiers are enabled. For each subagent choose \\`tier\\`: 'light' for simple lookups/formatting, 'standard' for typical coding tasks, 'heavy' for deep reasoning/complex debugging. An explicit \\`model\\` overrides the tier. Omit both to inherit the parent model.`;\n\n// lunr: check lunR core's model-tier bridge (Symbol.for(\"@lunr/model-tiers\")); absent bridge means tier mode is off.\nfunction isModelTierModeEnabled(): boolean {\n\ttry {\n\t\tconst bridge = (globalThis as Record<symbol, unknown>)[Symbol.for(\"@lunr/model-tiers\")] as\n\t\t\t| { isTierModeEnabled?: () => unknown }\n\t\t\t| undefined;\n\t\treturn typeof bridge?.isTierModeEnabled === \"function\" && bridge.isTierModeEnabled() === true;\n\t} catch {\n\t\treturn false;\n\t}\n}\n"]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { ChildRuntimeConfig } from "../shared/types.ts";
|
|
2
2
|
import type { ExtensionConfig, IntercomBridgeMode } from "../shared/types.ts";
|
|
3
3
|
export declare const NATIVE_INTERCOM_EXTENSION_DIR = "native:pi-subagents-supervisor-channel";
|
|
4
4
|
export declare const INTERCOM_BRIDGE_MARKER = "Intercom orchestration channel:";
|
|
@@ -30,6 +30,6 @@ export declare function resolveSubagentIntercomTarget(runId: string, agent: stri
|
|
|
30
30
|
export declare function resolveIntercomBridgeMode(value: unknown): IntercomBridgeMode;
|
|
31
31
|
export declare function diagnoseIntercomBridge(input: ResolveIntercomBridgeInput): IntercomBridgeDiagnostic;
|
|
32
32
|
export declare function resolveIntercomBridge(input: ResolveIntercomBridgeInput): IntercomBridgeState;
|
|
33
|
-
export declare function applyIntercomBridgeToAgent(agent:
|
|
33
|
+
export declare function applyIntercomBridgeToAgent(agent: ChildRuntimeConfig, bridge: IntercomBridgeState): ChildRuntimeConfig;
|
|
34
34
|
export {};
|
|
35
35
|
//# sourceMappingURL=intercom-bridge.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intercom-bridge.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,eAAe,EAAwB,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAGpG,eAAO,MAAM,6BAA6B,2CAA2C,CAAC;AAWtF,eAAO,MAAM,sBAAsB,oCAAoC,CAAC;AAaxE,MAAM,WAAW,mBAAmB;IACnC,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,kBAAkB,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,wBAAwB;IACxC,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,kBAAkB,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,0BAA0B,EAAE,OAAO,CAAC;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,0BAA0B;IACnC,MAAM,EAAE,eAAe,CAAC,gBAAgB,CAAC,CAAC;IAC1C,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IACtC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAKvG;AAMD,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAGlG;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,CAG5E;AA2CD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,0BAA0B,GAAG,wBAAwB,CAelG;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,0BAA0B,GAAG,mBAAmB,CAqB5F;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,mBAAmB,GAAG,WAAW,CAqBvG","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { AgentConfig } from \"../agents/agents.ts\";\nimport type { ExtensionConfig, IntercomBridgeConfig, IntercomBridgeMode } from \"../shared/types.ts\";\nimport { getAgentDir } from \"../shared/utils.ts\";\n\nexport const NATIVE_INTERCOM_EXTENSION_DIR = \"native:pi-subagents-supervisor-channel\";\n\nfunction defaultAgentDir(): string {\n\treturn getAgentDir();\n}\n\nfunction defaultSubagentConfigDir(agentDir = defaultAgentDir()): string {\n\treturn path.join(agentDir, \"extensions\", \"subagent\");\n}\n\nconst DEFAULT_INTERCOM_TARGET_PREFIX = \"subagent-chat\";\nexport const INTERCOM_BRIDGE_MARKER = \"Intercom orchestration channel:\";\nconst DEFAULT_INTERCOM_BRIDGE_TEMPLATE = `The inherited thread is reference-only. Do not continue that conversation or send questions, status updates, or completion handoffs to the supervisor in normal assistant text.\n\nUse contact_supervisor first. It resolves the supervisor session \"{orchestratorTarget}\" and run metadata automatically.\n- Need a decision, blocked, approval, or product/API/scope ambiguity: contact_supervisor({ reason: \"need_decision\", message: \"<question>\" })\n- Need structured supervisor input rather than a freeform reply: contact_supervisor({ reason: \"interview_request\", message: \"<what input is needed>\", interview: { title: \"...\", questions: [] } })\n- After contact_supervisor with reason \"need_decision\" or \"interview_request\", stay alive and continue only after the reply arrives. Do not finish your final response with a choose-one question.\n- Do not ask for clarification when the only conflict is review-only/no-edit versus progress-writing or artifact-writing instructions. If an output path is configured but no write-capable tool is available, return the complete artifact in your final response; the runtime will persist it. Do not contact the supervisor merely because you cannot write that output path directly.\n- Meaningful progress or unexpected discoveries that change the plan: contact_supervisor({ reason: \"progress_update\", message: \"UPDATE: <summary>\" })\n- Generic intercom is lower-level plumbing/fallback only: intercom({ action: \"ask\", to: \"{orchestratorTarget}\", message: \"<question>\" })\n\nDo not use contact_supervisor or intercom for routine completion handoffs. If no coordination is needed, return a focused task result.`;\n\nexport interface IntercomBridgeState {\n\tactive: boolean;\n\tmode: IntercomBridgeMode;\n\torchestratorTarget?: string;\n\textensionDir: string;\n\tinstruction: string;\n}\n\nexport interface IntercomBridgeDiagnostic {\n\tactive: boolean;\n\tmode: IntercomBridgeMode;\n\twantsIntercom: boolean;\n\tsupervisorChannelAvailable: boolean;\n\textensionDir: string;\n\torchestratorTarget?: string;\n\treason?: string;\n}\n\ninterface ResolveIntercomBridgeInput {\n\tconfig: ExtensionConfig[\"intercomBridge\"];\n\tcontext: \"fresh\" | \"fork\" | undefined;\n\torchestratorTarget?: string;\n\tsettingsDir?: string;\n\tagentDir?: string;\n}\n\nexport function resolveIntercomSessionTarget(sessionName: string | undefined, sessionId: string): string {\n\tconst trimmedName = sessionName?.trim();\n\tif (trimmedName) return trimmedName;\n\tconst normalizedSessionId = sessionId.startsWith(\"session-\") ? sessionId.slice(\"session-\".length) : sessionId;\n\treturn `${DEFAULT_INTERCOM_TARGET_PREFIX}-${normalizedSessionId.slice(0, 8)}`;\n}\n\nfunction sanitizeIntercomTargetPart(value: string): string {\n\treturn value.trim().toLowerCase().replace(/[^a-z0-9_-]+/g, \"-\").replace(/^-+|-+$/g, \"\") || \"agent\";\n}\n\nexport function resolveSubagentIntercomTarget(runId: string, agent: string, index?: number): string {\n\tconst stepSuffix = index !== undefined ? `-${index + 1}` : \"\";\n\treturn `subagent-${sanitizeIntercomTargetPart(agent)}-${sanitizeIntercomTargetPart(runId)}${stepSuffix}`;\n}\n\nexport function resolveIntercomBridgeMode(value: unknown): IntercomBridgeMode {\n\tif (value === \"off\" || value === \"always\" || value === \"fork-only\") return value;\n\treturn \"always\";\n}\n\nfunction resolveIntercomBridgeConfig(value: ExtensionConfig[\"intercomBridge\"]): Required<IntercomBridgeConfig> {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) {\n\t\treturn { mode: \"always\", instructionFile: \"\" };\n\t}\n\treturn {\n\t\tmode: resolveIntercomBridgeMode(value.mode),\n\t\tinstructionFile: typeof value.instructionFile === \"string\" ? value.instructionFile : \"\",\n\t};\n}\n\nfunction expandTilde(filePath: string): string {\n\treturn filePath.startsWith(\"~/\") ? path.join(os.homedir(), filePath.slice(2)) : filePath;\n}\n\nfunction resolveInstructionTemplate(instructionFile: string, settingsDir: string): string {\n\tif (!instructionFile) return DEFAULT_INTERCOM_BRIDGE_TEMPLATE;\n\tconst expandedPath = expandTilde(instructionFile);\n\tconst resolvedPath = path.isAbsolute(expandedPath)\n\t\t? expandedPath\n\t\t: path.resolve(settingsDir, expandedPath);\n\ttry {\n\t\treturn fs.readFileSync(resolvedPath, \"utf-8\");\n\t} catch (error) {\n\t\tconsole.warn(`Failed to read intercom bridge instructionFile at '${resolvedPath}'. Using default instructions.`, error);\n\t\treturn DEFAULT_INTERCOM_BRIDGE_TEMPLATE;\n\t}\n}\n\nfunction buildIntercomBridgeInstruction(orchestratorTarget: string, template: string): string {\n\tconst instruction = template.replaceAll(\"{orchestratorTarget}\", orchestratorTarget).trim();\n\tif (instruction.startsWith(INTERCOM_BRIDGE_MARKER)) return instruction;\n\treturn `${INTERCOM_BRIDGE_MARKER}\\n${instruction}`;\n}\n\nfunction inactiveReason(mode: IntercomBridgeMode, context: \"fresh\" | \"fork\" | undefined, orchestratorTarget: string | undefined): string | undefined {\n\tif (mode === \"off\") return \"bridge mode is off\";\n\tif (mode === \"fork-only\" && context !== \"fork\") return \"bridge mode is fork-only and context is not fork\";\n\tif (!orchestratorTarget) return \"orchestrator target is not available\";\n\treturn undefined;\n}\n\nexport function diagnoseIntercomBridge(input: ResolveIntercomBridgeInput): IntercomBridgeDiagnostic {\n\tconst config = resolveIntercomBridgeConfig(input.config);\n\tconst mode = config.mode;\n\tconst orchestratorTarget = input.orchestratorTarget?.trim();\n\tconst wantsIntercom = mode !== \"off\" && !(mode === \"fork-only\" && input.context !== \"fork\");\n\tconst reason = inactiveReason(mode, input.context, orchestratorTarget);\n\treturn {\n\t\tactive: reason === undefined,\n\t\tmode,\n\t\twantsIntercom,\n\t\tsupervisorChannelAvailable: true,\n\t\textensionDir: NATIVE_INTERCOM_EXTENSION_DIR,\n\t\t...(orchestratorTarget ? { orchestratorTarget } : {}),\n\t\t...(reason ? { reason } : {}),\n\t};\n}\n\nexport function resolveIntercomBridge(input: ResolveIntercomBridgeInput): IntercomBridgeState {\n\tconst config = resolveIntercomBridgeConfig(input.config);\n\tconst mode = config.mode;\n\tconst orchestratorTarget = input.orchestratorTarget?.trim();\n\tconst agentDir = path.resolve(input.agentDir ?? defaultAgentDir());\n\tconst settingsDir = path.resolve(input.settingsDir ?? defaultSubagentConfigDir(agentDir));\n\tconst defaultInstruction = buildIntercomBridgeInstruction(\n\t\torchestratorTarget || \"{orchestratorTarget}\",\n\t\tDEFAULT_INTERCOM_BRIDGE_TEMPLATE,\n\t);\n\tconst reason = inactiveReason(mode, input.context, orchestratorTarget);\n\tif (reason || !orchestratorTarget) {\n\t\treturn { active: false, mode, extensionDir: NATIVE_INTERCOM_EXTENSION_DIR, instruction: defaultInstruction };\n\t}\n\treturn {\n\t\tactive: true,\n\t\tmode,\n\t\torchestratorTarget,\n\t\textensionDir: NATIVE_INTERCOM_EXTENSION_DIR,\n\t\tinstruction: buildIntercomBridgeInstruction(orchestratorTarget, resolveInstructionTemplate(config.instructionFile, settingsDir)),\n\t};\n}\n\nexport function applyIntercomBridgeToAgent(agent: AgentConfig, bridge: IntercomBridgeState): AgentConfig {\n\tif (!bridge.active || !bridge.orchestratorTarget) return agent;\n\n\tconst bridgeTools = [\"intercom\", \"contact_supervisor\"];\n\tconst tools = agent.tools\n\t\t? [...agent.tools, ...bridgeTools.filter((tool) => !agent.tools?.includes(tool))]\n\t\t: agent.tools;\n\tconst instruction = bridge.instruction;\n\tconst trimmedPrompt = agent.systemPrompt?.trim() || \"\";\n\tconst systemPrompt = trimmedPrompt.includes(INTERCOM_BRIDGE_MARKER)\n\t\t? trimmedPrompt\n\t\t: trimmedPrompt\n\t\t\t? `${trimmedPrompt}\\n\\n${instruction}`\n\t\t\t: instruction;\n\n\tif (tools === agent.tools && systemPrompt === agent.systemPrompt) return agent;\n\treturn {\n\t\t...agent,\n\t\ttools,\n\t\tsystemPrompt,\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"intercom-bridge.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAwB,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAGpG,eAAO,MAAM,6BAA6B,2CAA2C,CAAC;AAWtF,eAAO,MAAM,sBAAsB,oCAAoC,CAAC;AAaxE,MAAM,WAAW,mBAAmB;IACnC,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,kBAAkB,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,wBAAwB;IACxC,MAAM,EAAE,OAAO,CAAC;IAChB,IAAI,EAAE,kBAAkB,CAAC;IACzB,aAAa,EAAE,OAAO,CAAC;IACvB,0BAA0B,EAAE,OAAO,CAAC;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,0BAA0B;IACnC,MAAM,EAAE,eAAe,CAAC,gBAAgB,CAAC,CAAC;IAC1C,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IACtC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,4BAA4B,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAKvG;AAMD,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAGlG;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,kBAAkB,CAG5E;AA2CD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,0BAA0B,GAAG,wBAAwB,CAelG;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,0BAA0B,GAAG,mBAAmB,CAqB5F;AAED,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,kBAAkB,EAAE,MAAM,EAAE,mBAAmB,GAAG,kBAAkB,CAqBrH","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { ChildRuntimeConfig } from \"../shared/types.ts\";\nimport type { ExtensionConfig, IntercomBridgeConfig, IntercomBridgeMode } from \"../shared/types.ts\";\nimport { getAgentDir } from \"../shared/utils.ts\";\n\nexport const NATIVE_INTERCOM_EXTENSION_DIR = \"native:pi-subagents-supervisor-channel\";\n\nfunction defaultAgentDir(): string {\n\treturn getAgentDir();\n}\n\nfunction defaultSubagentConfigDir(agentDir = defaultAgentDir()): string {\n\treturn path.join(agentDir, \"extensions\", \"subagent\");\n}\n\nconst DEFAULT_INTERCOM_TARGET_PREFIX = \"subagent-chat\";\nexport const INTERCOM_BRIDGE_MARKER = \"Intercom orchestration channel:\";\nconst DEFAULT_INTERCOM_BRIDGE_TEMPLATE = `The inherited thread is reference-only. Do not continue that conversation or send questions, status updates, or completion handoffs to the supervisor in normal assistant text.\n\nUse contact_supervisor first. It resolves the supervisor session \"{orchestratorTarget}\" and run metadata automatically.\n- Need a decision, blocked, approval, or product/API/scope ambiguity: contact_supervisor({ reason: \"need_decision\", message: \"<question>\" })\n- Need structured supervisor input rather than a freeform reply: contact_supervisor({ reason: \"interview_request\", message: \"<what input is needed>\", interview: { title: \"...\", questions: [] } })\n- After contact_supervisor with reason \"need_decision\" or \"interview_request\", stay alive and continue only after the reply arrives. Do not finish your final response with a choose-one question.\n- Do not ask for clarification when the only conflict is review-only/no-edit versus progress-writing or artifact-writing instructions. If an output path is configured but no write-capable tool is available, return the complete artifact in your final response; the runtime will persist it. Do not contact the supervisor merely because you cannot write that output path directly.\n- Meaningful progress or unexpected discoveries that change the plan: contact_supervisor({ reason: \"progress_update\", message: \"UPDATE: <summary>\" })\n- Generic intercom is lower-level plumbing/fallback only: intercom({ action: \"ask\", to: \"{orchestratorTarget}\", message: \"<question>\" })\n\nDo not use contact_supervisor or intercom for routine completion handoffs. If no coordination is needed, return a focused task result.`;\n\nexport interface IntercomBridgeState {\n\tactive: boolean;\n\tmode: IntercomBridgeMode;\n\torchestratorTarget?: string;\n\textensionDir: string;\n\tinstruction: string;\n}\n\nexport interface IntercomBridgeDiagnostic {\n\tactive: boolean;\n\tmode: IntercomBridgeMode;\n\twantsIntercom: boolean;\n\tsupervisorChannelAvailable: boolean;\n\textensionDir: string;\n\torchestratorTarget?: string;\n\treason?: string;\n}\n\ninterface ResolveIntercomBridgeInput {\n\tconfig: ExtensionConfig[\"intercomBridge\"];\n\tcontext: \"fresh\" | \"fork\" | undefined;\n\torchestratorTarget?: string;\n\tsettingsDir?: string;\n\tagentDir?: string;\n}\n\nexport function resolveIntercomSessionTarget(sessionName: string | undefined, sessionId: string): string {\n\tconst trimmedName = sessionName?.trim();\n\tif (trimmedName) return trimmedName;\n\tconst normalizedSessionId = sessionId.startsWith(\"session-\") ? sessionId.slice(\"session-\".length) : sessionId;\n\treturn `${DEFAULT_INTERCOM_TARGET_PREFIX}-${normalizedSessionId.slice(0, 8)}`;\n}\n\nfunction sanitizeIntercomTargetPart(value: string): string {\n\treturn value.trim().toLowerCase().replace(/[^a-z0-9_-]+/g, \"-\").replace(/^-+|-+$/g, \"\") || \"agent\";\n}\n\nexport function resolveSubagentIntercomTarget(runId: string, agent: string, index?: number): string {\n\tconst stepSuffix = index !== undefined ? `-${index + 1}` : \"\";\n\treturn `subagent-${sanitizeIntercomTargetPart(agent)}-${sanitizeIntercomTargetPart(runId)}${stepSuffix}`;\n}\n\nexport function resolveIntercomBridgeMode(value: unknown): IntercomBridgeMode {\n\tif (value === \"off\" || value === \"always\" || value === \"fork-only\") return value;\n\treturn \"always\";\n}\n\nfunction resolveIntercomBridgeConfig(value: ExtensionConfig[\"intercomBridge\"]): Required<IntercomBridgeConfig> {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) {\n\t\treturn { mode: \"always\", instructionFile: \"\" };\n\t}\n\treturn {\n\t\tmode: resolveIntercomBridgeMode(value.mode),\n\t\tinstructionFile: typeof value.instructionFile === \"string\" ? value.instructionFile : \"\",\n\t};\n}\n\nfunction expandTilde(filePath: string): string {\n\treturn filePath.startsWith(\"~/\") ? path.join(os.homedir(), filePath.slice(2)) : filePath;\n}\n\nfunction resolveInstructionTemplate(instructionFile: string, settingsDir: string): string {\n\tif (!instructionFile) return DEFAULT_INTERCOM_BRIDGE_TEMPLATE;\n\tconst expandedPath = expandTilde(instructionFile);\n\tconst resolvedPath = path.isAbsolute(expandedPath)\n\t\t? expandedPath\n\t\t: path.resolve(settingsDir, expandedPath);\n\ttry {\n\t\treturn fs.readFileSync(resolvedPath, \"utf-8\");\n\t} catch (error) {\n\t\tconsole.warn(`Failed to read intercom bridge instructionFile at '${resolvedPath}'. Using default instructions.`, error);\n\t\treturn DEFAULT_INTERCOM_BRIDGE_TEMPLATE;\n\t}\n}\n\nfunction buildIntercomBridgeInstruction(orchestratorTarget: string, template: string): string {\n\tconst instruction = template.replaceAll(\"{orchestratorTarget}\", orchestratorTarget).trim();\n\tif (instruction.startsWith(INTERCOM_BRIDGE_MARKER)) return instruction;\n\treturn `${INTERCOM_BRIDGE_MARKER}\\n${instruction}`;\n}\n\nfunction inactiveReason(mode: IntercomBridgeMode, context: \"fresh\" | \"fork\" | undefined, orchestratorTarget: string | undefined): string | undefined {\n\tif (mode === \"off\") return \"bridge mode is off\";\n\tif (mode === \"fork-only\" && context !== \"fork\") return \"bridge mode is fork-only and context is not fork\";\n\tif (!orchestratorTarget) return \"orchestrator target is not available\";\n\treturn undefined;\n}\n\nexport function diagnoseIntercomBridge(input: ResolveIntercomBridgeInput): IntercomBridgeDiagnostic {\n\tconst config = resolveIntercomBridgeConfig(input.config);\n\tconst mode = config.mode;\n\tconst orchestratorTarget = input.orchestratorTarget?.trim();\n\tconst wantsIntercom = mode !== \"off\" && !(mode === \"fork-only\" && input.context !== \"fork\");\n\tconst reason = inactiveReason(mode, input.context, orchestratorTarget);\n\treturn {\n\t\tactive: reason === undefined,\n\t\tmode,\n\t\twantsIntercom,\n\t\tsupervisorChannelAvailable: true,\n\t\textensionDir: NATIVE_INTERCOM_EXTENSION_DIR,\n\t\t...(orchestratorTarget ? { orchestratorTarget } : {}),\n\t\t...(reason ? { reason } : {}),\n\t};\n}\n\nexport function resolveIntercomBridge(input: ResolveIntercomBridgeInput): IntercomBridgeState {\n\tconst config = resolveIntercomBridgeConfig(input.config);\n\tconst mode = config.mode;\n\tconst orchestratorTarget = input.orchestratorTarget?.trim();\n\tconst agentDir = path.resolve(input.agentDir ?? defaultAgentDir());\n\tconst settingsDir = path.resolve(input.settingsDir ?? defaultSubagentConfigDir(agentDir));\n\tconst defaultInstruction = buildIntercomBridgeInstruction(\n\t\torchestratorTarget || \"{orchestratorTarget}\",\n\t\tDEFAULT_INTERCOM_BRIDGE_TEMPLATE,\n\t);\n\tconst reason = inactiveReason(mode, input.context, orchestratorTarget);\n\tif (reason || !orchestratorTarget) {\n\t\treturn { active: false, mode, extensionDir: NATIVE_INTERCOM_EXTENSION_DIR, instruction: defaultInstruction };\n\t}\n\treturn {\n\t\tactive: true,\n\t\tmode,\n\t\torchestratorTarget,\n\t\textensionDir: NATIVE_INTERCOM_EXTENSION_DIR,\n\t\tinstruction: buildIntercomBridgeInstruction(orchestratorTarget, resolveInstructionTemplate(config.instructionFile, settingsDir)),\n\t};\n}\n\nexport function applyIntercomBridgeToAgent(agent: ChildRuntimeConfig, bridge: IntercomBridgeState): ChildRuntimeConfig {\n\tif (!bridge.active || !bridge.orchestratorTarget) return agent;\n\n\tconst bridgeTools = [\"intercom\", \"contact_supervisor\"];\n\tconst tools = agent.tools\n\t\t? [...agent.tools, ...bridgeTools.filter((tool) => !agent.tools?.includes(tool))]\n\t\t: agent.tools;\n\tconst instruction = bridge.instruction;\n\tconst trimmedPrompt = agent.systemPrompt?.trim() || \"\";\n\tconst systemPrompt = trimmedPrompt.includes(INTERCOM_BRIDGE_MARKER)\n\t\t? trimmedPrompt\n\t\t: trimmedPrompt\n\t\t\t? `${trimmedPrompt}\\n\\n${instruction}`\n\t\t\t: instruction;\n\n\tif (tools === agent.tools && systemPrompt === agent.systemPrompt) return agent;\n\treturn {\n\t\t...agent,\n\t\ttools,\n\t\tsystemPrompt,\n\t};\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"intercom-bridge.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { AgentConfig } from \"../agents/agents.ts\";\nimport type { ExtensionConfig, IntercomBridgeConfig, IntercomBridgeMode } from \"../shared/types.ts\";\nimport { getAgentDir } from \"../shared/utils.ts\";\n\nexport const NATIVE_INTERCOM_EXTENSION_DIR = \"native:pi-subagents-supervisor-channel\";\n\nfunction defaultAgentDir(): string {\n\treturn getAgentDir();\n}\n\nfunction defaultSubagentConfigDir(agentDir = defaultAgentDir()): string {\n\treturn path.join(agentDir, \"extensions\", \"subagent\");\n}\n\nconst DEFAULT_INTERCOM_TARGET_PREFIX = \"subagent-chat\";\nexport const INTERCOM_BRIDGE_MARKER = \"Intercom orchestration channel:\";\nconst DEFAULT_INTERCOM_BRIDGE_TEMPLATE = `The inherited thread is reference-only. Do not continue that conversation or send questions, status updates, or completion handoffs to the supervisor in normal assistant text.\n\nUse contact_supervisor first. It resolves the supervisor session \"{orchestratorTarget}\" and run metadata automatically.\n- Need a decision, blocked, approval, or product/API/scope ambiguity: contact_supervisor({ reason: \"need_decision\", message: \"<question>\" })\n- Need structured supervisor input rather than a freeform reply: contact_supervisor({ reason: \"interview_request\", message: \"<what input is needed>\", interview: { title: \"...\", questions: [] } })\n- After contact_supervisor with reason \"need_decision\" or \"interview_request\", stay alive and continue only after the reply arrives. Do not finish your final response with a choose-one question.\n- Do not ask for clarification when the only conflict is review-only/no-edit versus progress-writing or artifact-writing instructions. If an output path is configured but no write-capable tool is available, return the complete artifact in your final response; the runtime will persist it. Do not contact the supervisor merely because you cannot write that output path directly.\n- Meaningful progress or unexpected discoveries that change the plan: contact_supervisor({ reason: \"progress_update\", message: \"UPDATE: <summary>\" })\n- Generic intercom is lower-level plumbing/fallback only: intercom({ action: \"ask\", to: \"{orchestratorTarget}\", message: \"<question>\" })\n\nDo not use contact_supervisor or intercom for routine completion handoffs. If no coordination is needed, return a focused task result.`;\n\nexport interface IntercomBridgeState {\n\tactive: boolean;\n\tmode: IntercomBridgeMode;\n\torchestratorTarget?: string;\n\textensionDir: string;\n\tinstruction: string;\n}\n\nexport interface IntercomBridgeDiagnostic {\n\tactive: boolean;\n\tmode: IntercomBridgeMode;\n\twantsIntercom: boolean;\n\tsupervisorChannelAvailable: boolean;\n\textensionDir: string;\n\torchestratorTarget?: string;\n\treason?: string;\n}\n\ninterface ResolveIntercomBridgeInput {\n\tconfig: ExtensionConfig[\"intercomBridge\"];\n\tcontext: \"fresh\" | \"fork\" | undefined;\n\torchestratorTarget?: string;\n\tsettingsDir?: string;\n\tagentDir?: string;\n}\n\nexport function resolveIntercomSessionTarget(sessionName: string | undefined, sessionId: string): string {\n\tconst trimmedName = sessionName?.trim();\n\tif (trimmedName) return trimmedName;\n\tconst normalizedSessionId = sessionId.startsWith(\"session-\") ? sessionId.slice(\"session-\".length) : sessionId;\n\treturn `${DEFAULT_INTERCOM_TARGET_PREFIX}-${normalizedSessionId.slice(0, 8)}`;\n}\n\nfunction sanitizeIntercomTargetPart(value: string): string {\n\treturn value.trim().toLowerCase().replace(/[^a-z0-9_-]+/g, \"-\").replace(/^-+|-+$/g, \"\") || \"agent\";\n}\n\nexport function resolveSubagentIntercomTarget(runId: string, agent: string, index?: number): string {\n\tconst stepSuffix = index !== undefined ? `-${index + 1}` : \"\";\n\treturn `subagent-${sanitizeIntercomTargetPart(agent)}-${sanitizeIntercomTargetPart(runId)}${stepSuffix}`;\n}\n\nexport function resolveIntercomBridgeMode(value: unknown): IntercomBridgeMode {\n\tif (value === \"off\" || value === \"always\" || value === \"fork-only\") return value;\n\treturn \"always\";\n}\n\nfunction resolveIntercomBridgeConfig(value: ExtensionConfig[\"intercomBridge\"]): Required<IntercomBridgeConfig> {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) {\n\t\treturn { mode: \"always\", instructionFile: \"\" };\n\t}\n\treturn {\n\t\tmode: resolveIntercomBridgeMode(value.mode),\n\t\tinstructionFile: typeof value.instructionFile === \"string\" ? value.instructionFile : \"\",\n\t};\n}\n\nfunction expandTilde(filePath: string): string {\n\treturn filePath.startsWith(\"~/\") ? path.join(os.homedir(), filePath.slice(2)) : filePath;\n}\n\nfunction resolveInstructionTemplate(instructionFile: string, settingsDir: string): string {\n\tif (!instructionFile) return DEFAULT_INTERCOM_BRIDGE_TEMPLATE;\n\tconst expandedPath = expandTilde(instructionFile);\n\tconst resolvedPath = path.isAbsolute(expandedPath)\n\t\t? expandedPath\n\t\t: path.resolve(settingsDir, expandedPath);\n\ttry {\n\t\treturn fs.readFileSync(resolvedPath, \"utf-8\");\n\t} catch (error) {\n\t\tconsole.warn(`Failed to read intercom bridge instructionFile at '${resolvedPath}'. Using default instructions.`, error);\n\t\treturn DEFAULT_INTERCOM_BRIDGE_TEMPLATE;\n\t}\n}\n\nfunction buildIntercomBridgeInstruction(orchestratorTarget: string, template: string): string {\n\tconst instruction = template.replaceAll(\"{orchestratorTarget}\", orchestratorTarget).trim();\n\tif (instruction.startsWith(INTERCOM_BRIDGE_MARKER)) return instruction;\n\treturn `${INTERCOM_BRIDGE_MARKER}\\n${instruction}`;\n}\n\nfunction inactiveReason(mode: IntercomBridgeMode, context: \"fresh\" | \"fork\" | undefined, orchestratorTarget: string | undefined): string | undefined {\n\tif (mode === \"off\") return \"bridge mode is off\";\n\tif (mode === \"fork-only\" && context !== \"fork\") return \"bridge mode is fork-only and context is not fork\";\n\tif (!orchestratorTarget) return \"orchestrator target is not available\";\n\treturn undefined;\n}\n\nexport function diagnoseIntercomBridge(input: ResolveIntercomBridgeInput): IntercomBridgeDiagnostic {\n\tconst config = resolveIntercomBridgeConfig(input.config);\n\tconst mode = config.mode;\n\tconst orchestratorTarget = input.orchestratorTarget?.trim();\n\tconst wantsIntercom = mode !== \"off\" && !(mode === \"fork-only\" && input.context !== \"fork\");\n\tconst reason = inactiveReason(mode, input.context, orchestratorTarget);\n\treturn {\n\t\tactive: reason === undefined,\n\t\tmode,\n\t\twantsIntercom,\n\t\tsupervisorChannelAvailable: true,\n\t\textensionDir: NATIVE_INTERCOM_EXTENSION_DIR,\n\t\t...(orchestratorTarget ? { orchestratorTarget } : {}),\n\t\t...(reason ? { reason } : {}),\n\t};\n}\n\nexport function resolveIntercomBridge(input: ResolveIntercomBridgeInput): IntercomBridgeState {\n\tconst config = resolveIntercomBridgeConfig(input.config);\n\tconst mode = config.mode;\n\tconst orchestratorTarget = input.orchestratorTarget?.trim();\n\tconst agentDir = path.resolve(input.agentDir ?? defaultAgentDir());\n\tconst settingsDir = path.resolve(input.settingsDir ?? defaultSubagentConfigDir(agentDir));\n\tconst defaultInstruction = buildIntercomBridgeInstruction(\n\t\torchestratorTarget || \"{orchestratorTarget}\",\n\t\tDEFAULT_INTERCOM_BRIDGE_TEMPLATE,\n\t);\n\tconst reason = inactiveReason(mode, input.context, orchestratorTarget);\n\tif (reason || !orchestratorTarget) {\n\t\treturn { active: false, mode, extensionDir: NATIVE_INTERCOM_EXTENSION_DIR, instruction: defaultInstruction };\n\t}\n\treturn {\n\t\tactive: true,\n\t\tmode,\n\t\torchestratorTarget,\n\t\textensionDir: NATIVE_INTERCOM_EXTENSION_DIR,\n\t\tinstruction: buildIntercomBridgeInstruction(orchestratorTarget, resolveInstructionTemplate(config.instructionFile, settingsDir)),\n\t};\n}\n\nexport function applyIntercomBridgeToAgent(agent: AgentConfig, bridge: IntercomBridgeState): AgentConfig {\n\tif (!bridge.active || !bridge.orchestratorTarget) return agent;\n\n\tconst bridgeTools = [\"intercom\", \"contact_supervisor\"];\n\tconst tools = agent.tools\n\t\t? [...agent.tools, ...bridgeTools.filter((tool) => !agent.tools?.includes(tool))]\n\t\t: agent.tools;\n\tconst instruction = bridge.instruction;\n\tconst trimmedPrompt = agent.systemPrompt?.trim() || \"\";\n\tconst systemPrompt = trimmedPrompt.includes(INTERCOM_BRIDGE_MARKER)\n\t\t? trimmedPrompt\n\t\t: trimmedPrompt\n\t\t\t? `${trimmedPrompt}\\n\\n${instruction}`\n\t\t\t: instruction;\n\n\tif (tools === agent.tools && systemPrompt === agent.systemPrompt) return agent;\n\treturn {\n\t\t...agent,\n\t\ttools,\n\t\tsystemPrompt,\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"intercom-bridge.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport type { ChildRuntimeConfig } from \"../shared/types.ts\";\nimport type { ExtensionConfig, IntercomBridgeConfig, IntercomBridgeMode } from \"../shared/types.ts\";\nimport { getAgentDir } from \"../shared/utils.ts\";\n\nexport const NATIVE_INTERCOM_EXTENSION_DIR = \"native:pi-subagents-supervisor-channel\";\n\nfunction defaultAgentDir(): string {\n\treturn getAgentDir();\n}\n\nfunction defaultSubagentConfigDir(agentDir = defaultAgentDir()): string {\n\treturn path.join(agentDir, \"extensions\", \"subagent\");\n}\n\nconst DEFAULT_INTERCOM_TARGET_PREFIX = \"subagent-chat\";\nexport const INTERCOM_BRIDGE_MARKER = \"Intercom orchestration channel:\";\nconst DEFAULT_INTERCOM_BRIDGE_TEMPLATE = `The inherited thread is reference-only. Do not continue that conversation or send questions, status updates, or completion handoffs to the supervisor in normal assistant text.\n\nUse contact_supervisor first. It resolves the supervisor session \"{orchestratorTarget}\" and run metadata automatically.\n- Need a decision, blocked, approval, or product/API/scope ambiguity: contact_supervisor({ reason: \"need_decision\", message: \"<question>\" })\n- Need structured supervisor input rather than a freeform reply: contact_supervisor({ reason: \"interview_request\", message: \"<what input is needed>\", interview: { title: \"...\", questions: [] } })\n- After contact_supervisor with reason \"need_decision\" or \"interview_request\", stay alive and continue only after the reply arrives. Do not finish your final response with a choose-one question.\n- Do not ask for clarification when the only conflict is review-only/no-edit versus progress-writing or artifact-writing instructions. If an output path is configured but no write-capable tool is available, return the complete artifact in your final response; the runtime will persist it. Do not contact the supervisor merely because you cannot write that output path directly.\n- Meaningful progress or unexpected discoveries that change the plan: contact_supervisor({ reason: \"progress_update\", message: \"UPDATE: <summary>\" })\n- Generic intercom is lower-level plumbing/fallback only: intercom({ action: \"ask\", to: \"{orchestratorTarget}\", message: \"<question>\" })\n\nDo not use contact_supervisor or intercom for routine completion handoffs. If no coordination is needed, return a focused task result.`;\n\nexport interface IntercomBridgeState {\n\tactive: boolean;\n\tmode: IntercomBridgeMode;\n\torchestratorTarget?: string;\n\textensionDir: string;\n\tinstruction: string;\n}\n\nexport interface IntercomBridgeDiagnostic {\n\tactive: boolean;\n\tmode: IntercomBridgeMode;\n\twantsIntercom: boolean;\n\tsupervisorChannelAvailable: boolean;\n\textensionDir: string;\n\torchestratorTarget?: string;\n\treason?: string;\n}\n\ninterface ResolveIntercomBridgeInput {\n\tconfig: ExtensionConfig[\"intercomBridge\"];\n\tcontext: \"fresh\" | \"fork\" | undefined;\n\torchestratorTarget?: string;\n\tsettingsDir?: string;\n\tagentDir?: string;\n}\n\nexport function resolveIntercomSessionTarget(sessionName: string | undefined, sessionId: string): string {\n\tconst trimmedName = sessionName?.trim();\n\tif (trimmedName) return trimmedName;\n\tconst normalizedSessionId = sessionId.startsWith(\"session-\") ? sessionId.slice(\"session-\".length) : sessionId;\n\treturn `${DEFAULT_INTERCOM_TARGET_PREFIX}-${normalizedSessionId.slice(0, 8)}`;\n}\n\nfunction sanitizeIntercomTargetPart(value: string): string {\n\treturn value.trim().toLowerCase().replace(/[^a-z0-9_-]+/g, \"-\").replace(/^-+|-+$/g, \"\") || \"agent\";\n}\n\nexport function resolveSubagentIntercomTarget(runId: string, agent: string, index?: number): string {\n\tconst stepSuffix = index !== undefined ? `-${index + 1}` : \"\";\n\treturn `subagent-${sanitizeIntercomTargetPart(agent)}-${sanitizeIntercomTargetPart(runId)}${stepSuffix}`;\n}\n\nexport function resolveIntercomBridgeMode(value: unknown): IntercomBridgeMode {\n\tif (value === \"off\" || value === \"always\" || value === \"fork-only\") return value;\n\treturn \"always\";\n}\n\nfunction resolveIntercomBridgeConfig(value: ExtensionConfig[\"intercomBridge\"]): Required<IntercomBridgeConfig> {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) {\n\t\treturn { mode: \"always\", instructionFile: \"\" };\n\t}\n\treturn {\n\t\tmode: resolveIntercomBridgeMode(value.mode),\n\t\tinstructionFile: typeof value.instructionFile === \"string\" ? value.instructionFile : \"\",\n\t};\n}\n\nfunction expandTilde(filePath: string): string {\n\treturn filePath.startsWith(\"~/\") ? path.join(os.homedir(), filePath.slice(2)) : filePath;\n}\n\nfunction resolveInstructionTemplate(instructionFile: string, settingsDir: string): string {\n\tif (!instructionFile) return DEFAULT_INTERCOM_BRIDGE_TEMPLATE;\n\tconst expandedPath = expandTilde(instructionFile);\n\tconst resolvedPath = path.isAbsolute(expandedPath)\n\t\t? expandedPath\n\t\t: path.resolve(settingsDir, expandedPath);\n\ttry {\n\t\treturn fs.readFileSync(resolvedPath, \"utf-8\");\n\t} catch (error) {\n\t\tconsole.warn(`Failed to read intercom bridge instructionFile at '${resolvedPath}'. Using default instructions.`, error);\n\t\treturn DEFAULT_INTERCOM_BRIDGE_TEMPLATE;\n\t}\n}\n\nfunction buildIntercomBridgeInstruction(orchestratorTarget: string, template: string): string {\n\tconst instruction = template.replaceAll(\"{orchestratorTarget}\", orchestratorTarget).trim();\n\tif (instruction.startsWith(INTERCOM_BRIDGE_MARKER)) return instruction;\n\treturn `${INTERCOM_BRIDGE_MARKER}\\n${instruction}`;\n}\n\nfunction inactiveReason(mode: IntercomBridgeMode, context: \"fresh\" | \"fork\" | undefined, orchestratorTarget: string | undefined): string | undefined {\n\tif (mode === \"off\") return \"bridge mode is off\";\n\tif (mode === \"fork-only\" && context !== \"fork\") return \"bridge mode is fork-only and context is not fork\";\n\tif (!orchestratorTarget) return \"orchestrator target is not available\";\n\treturn undefined;\n}\n\nexport function diagnoseIntercomBridge(input: ResolveIntercomBridgeInput): IntercomBridgeDiagnostic {\n\tconst config = resolveIntercomBridgeConfig(input.config);\n\tconst mode = config.mode;\n\tconst orchestratorTarget = input.orchestratorTarget?.trim();\n\tconst wantsIntercom = mode !== \"off\" && !(mode === \"fork-only\" && input.context !== \"fork\");\n\tconst reason = inactiveReason(mode, input.context, orchestratorTarget);\n\treturn {\n\t\tactive: reason === undefined,\n\t\tmode,\n\t\twantsIntercom,\n\t\tsupervisorChannelAvailable: true,\n\t\textensionDir: NATIVE_INTERCOM_EXTENSION_DIR,\n\t\t...(orchestratorTarget ? { orchestratorTarget } : {}),\n\t\t...(reason ? { reason } : {}),\n\t};\n}\n\nexport function resolveIntercomBridge(input: ResolveIntercomBridgeInput): IntercomBridgeState {\n\tconst config = resolveIntercomBridgeConfig(input.config);\n\tconst mode = config.mode;\n\tconst orchestratorTarget = input.orchestratorTarget?.trim();\n\tconst agentDir = path.resolve(input.agentDir ?? defaultAgentDir());\n\tconst settingsDir = path.resolve(input.settingsDir ?? defaultSubagentConfigDir(agentDir));\n\tconst defaultInstruction = buildIntercomBridgeInstruction(\n\t\torchestratorTarget || \"{orchestratorTarget}\",\n\t\tDEFAULT_INTERCOM_BRIDGE_TEMPLATE,\n\t);\n\tconst reason = inactiveReason(mode, input.context, orchestratorTarget);\n\tif (reason || !orchestratorTarget) {\n\t\treturn { active: false, mode, extensionDir: NATIVE_INTERCOM_EXTENSION_DIR, instruction: defaultInstruction };\n\t}\n\treturn {\n\t\tactive: true,\n\t\tmode,\n\t\torchestratorTarget,\n\t\textensionDir: NATIVE_INTERCOM_EXTENSION_DIR,\n\t\tinstruction: buildIntercomBridgeInstruction(orchestratorTarget, resolveInstructionTemplate(config.instructionFile, settingsDir)),\n\t};\n}\n\nexport function applyIntercomBridgeToAgent(agent: ChildRuntimeConfig, bridge: IntercomBridgeState): ChildRuntimeConfig {\n\tif (!bridge.active || !bridge.orchestratorTarget) return agent;\n\n\tconst bridgeTools = [\"intercom\", \"contact_supervisor\"];\n\tconst tools = agent.tools\n\t\t? [...agent.tools, ...bridgeTools.filter((tool) => !agent.tools?.includes(tool))]\n\t\t: agent.tools;\n\tconst instruction = bridge.instruction;\n\tconst trimmedPrompt = agent.systemPrompt?.trim() || \"\";\n\tconst systemPrompt = trimmedPrompt.includes(INTERCOM_BRIDGE_MARKER)\n\t\t? trimmedPrompt\n\t\t: trimmedPrompt\n\t\t\t? `${trimmedPrompt}\\n\\n${instruction}`\n\t\t\t: instruction;\n\n\tif (tools === agent.tools && systemPrompt === agent.systemPrompt) return agent;\n\treturn {\n\t\t...agent,\n\t\ttools,\n\t\tsystemPrompt,\n\t};\n}\n"]}
|
|
@@ -2,13 +2,12 @@
|
|
|
2
2
|
* Async execution logic for subagent tool
|
|
3
3
|
*/
|
|
4
4
|
import type { ExtensionAPI } from "@ashx-j/lunr";
|
|
5
|
-
import type { AgentConfig } from "../../agents/agents.ts";
|
|
6
5
|
import { type ChainStep } from "../../shared/settings.ts";
|
|
7
6
|
import type { RunnerStep } from "../shared/parallel-utils.ts";
|
|
8
7
|
import { type AvailableModelInfo, type ParentModel } from "../shared/model-fallback.ts";
|
|
9
8
|
import type { ModelScopeConfig } from "../shared/model-scope.ts";
|
|
10
9
|
import { buildWorkflowGraphSnapshot } from "../shared/workflow-graph.ts";
|
|
11
|
-
import { type AcceptanceInput, type ArtifactConfig, type Details, type MaxOutputConfig, type NestedRouteInfo, type ResolvedControlConfig, type ResolvedTurnBudget, type ResolvedToolBudget, type SubagentRunMode } from "../../shared/types.ts";
|
|
10
|
+
import { type AcceptanceInput, type ArtifactConfig, type ChildSpec, type Details, type MaxOutputConfig, type NestedRouteInfo, type ResolvedControlConfig, type ResolvedTurnBudget, type ResolvedToolBudget, type SubagentRunMode } from "../../shared/types.ts";
|
|
12
11
|
import type { ImportedAsyncRoot } from "./chain-root-attachment.ts";
|
|
13
12
|
import type { SessionLeaseRequest } from "../shared/session-lease.ts";
|
|
14
13
|
interface AsyncExecutionContext {
|
|
@@ -33,7 +32,6 @@ interface AsyncChainParams {
|
|
|
33
32
|
label?: string;
|
|
34
33
|
};
|
|
35
34
|
resultMode?: Exclude<SubagentRunMode, "single">;
|
|
36
|
-
agents: AgentConfig[];
|
|
37
35
|
ctx: AsyncExecutionContext;
|
|
38
36
|
availableModels?: AvailableModelInfo[];
|
|
39
37
|
cwd?: string;
|
|
@@ -44,7 +42,7 @@ interface AsyncChainParams {
|
|
|
44
42
|
sessionRoot?: string;
|
|
45
43
|
chainSkills?: string[];
|
|
46
44
|
sessionFilesByFlatIndex?: (string | undefined)[];
|
|
47
|
-
thinkingOverridesByFlatIndex?: (
|
|
45
|
+
thinkingOverridesByFlatIndex?: (string | false | undefined)[];
|
|
48
46
|
progressDir?: string;
|
|
49
47
|
dynamicFanoutMaxItems?: number;
|
|
50
48
|
maxSubagentDepth: number;
|
|
@@ -65,11 +63,9 @@ interface AsyncChainParams {
|
|
|
65
63
|
globalConcurrencyLimit?: number;
|
|
66
64
|
}
|
|
67
65
|
interface AsyncSingleParams {
|
|
68
|
-
|
|
69
|
-
task?: string;
|
|
66
|
+
spec: ChildSpec;
|
|
70
67
|
/** Raw caller-facing goal used only by the started event. */
|
|
71
68
|
goal?: string;
|
|
72
|
-
agentConfig: AgentConfig;
|
|
73
69
|
ctx: AsyncExecutionContext;
|
|
74
70
|
cwd?: string;
|
|
75
71
|
maxOutput?: MaxOutputConfig;
|
|
@@ -85,7 +81,7 @@ interface AsyncSingleParams {
|
|
|
85
81
|
outputMode?: "inline" | "file-only";
|
|
86
82
|
outputBaseDir?: string;
|
|
87
83
|
modelOverride?: string;
|
|
88
|
-
thinkingOverride?:
|
|
84
|
+
thinkingOverride?: string | false;
|
|
89
85
|
availableModels?: AvailableModelInfo[];
|
|
90
86
|
maxSubagentDepth: number;
|
|
91
87
|
waitToolEnabled?: boolean;
|
|
@@ -120,13 +116,12 @@ export interface AsyncRunnerStepBuildParams {
|
|
|
120
116
|
label?: string;
|
|
121
117
|
};
|
|
122
118
|
resultMode?: SubagentRunMode;
|
|
123
|
-
agents: AgentConfig[];
|
|
124
119
|
ctx: AsyncExecutionContext;
|
|
125
120
|
availableModels?: AvailableModelInfo[];
|
|
126
121
|
cwd?: string;
|
|
127
122
|
chainSkills?: string[];
|
|
128
123
|
sessionFilesByFlatIndex?: (string | undefined)[];
|
|
129
|
-
thinkingOverridesByFlatIndex?: (
|
|
124
|
+
thinkingOverridesByFlatIndex?: (string | false | undefined)[];
|
|
130
125
|
progressDir?: string;
|
|
131
126
|
dynamicFanoutMaxItems?: number;
|
|
132
127
|
maxSubagentDepth: number;
|
|
@@ -137,6 +132,8 @@ export interface AsyncRunnerStepBuildParams {
|
|
|
137
132
|
validateOutputBindings?: boolean;
|
|
138
133
|
toolBudget?: ResolvedToolBudget;
|
|
139
134
|
configToolBudget?: ResolvedToolBudget;
|
|
135
|
+
/** Optional collision-free ChildSpec id namespace for steps appended to a live run. */
|
|
136
|
+
childIdRunId?: string;
|
|
140
137
|
}
|
|
141
138
|
export type AsyncRunnerStepBuildResult = {
|
|
142
139
|
steps: RunnerStep[];
|