@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
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
/**
|
|
3
|
+
* Central permission-to-tool resolver for prompt-driven children.
|
|
4
|
+
*
|
|
5
|
+
* Full access is the coding-tool set (read/search/shell/edit/write/web/LSP/MCP
|
|
6
|
+
* plus output and supervisor coordination). It is not parent-equivalent: cron,
|
|
7
|
+
* memory, goals, plan approval, nested subagent management, and other
|
|
8
|
+
* persistent/user-config tools stay excluded.
|
|
9
|
+
*
|
|
10
|
+
* Read-only drops mutating coding tools from the registry and still runs under
|
|
11
|
+
* Plan mode as defense in depth.
|
|
12
|
+
*/
|
|
13
|
+
/** Parent-owned / persistent tools excluded even from full children. */
|
|
14
|
+
export const PARENT_OWNED_CHILD_TOOLS = [
|
|
15
|
+
"cron",
|
|
16
|
+
"memory_add",
|
|
17
|
+
"memory_remove",
|
|
18
|
+
"memory_load",
|
|
19
|
+
"present_plan",
|
|
20
|
+
"goal_complete",
|
|
21
|
+
"goal_blocked",
|
|
22
|
+
"subagent",
|
|
23
|
+
"subagent_wait",
|
|
24
|
+
];
|
|
25
|
+
/** Mutating coding tools omitted from the read-only child registry. */
|
|
26
|
+
export const READ_ONLY_EXCLUDED_CHILD_TOOLS = [
|
|
27
|
+
"edit",
|
|
28
|
+
"write",
|
|
29
|
+
"code_rewrite",
|
|
30
|
+
"lsp_rename",
|
|
31
|
+
];
|
|
32
|
+
const PARENT_OWNED_SET = new Set(PARENT_OWNED_CHILD_TOOLS);
|
|
33
|
+
const READ_ONLY_SET = new Set(READ_ONLY_EXCLUDED_CHILD_TOOLS);
|
|
34
|
+
export function resolveChildExcludeTools(input) {
|
|
35
|
+
const excluded = new Set(PARENT_OWNED_SET);
|
|
36
|
+
if (input.fanoutAuthorized) {
|
|
37
|
+
excluded.delete("subagent");
|
|
38
|
+
}
|
|
39
|
+
if (input.permissions === "read-only") {
|
|
40
|
+
for (const tool of READ_ONLY_SET)
|
|
41
|
+
excluded.add(tool);
|
|
42
|
+
}
|
|
43
|
+
return [...excluded];
|
|
44
|
+
}
|
|
45
|
+
export function isParentOwnedChildTool(name) {
|
|
46
|
+
return PARENT_OWNED_SET.has(name);
|
|
47
|
+
}
|
|
48
|
+
export function isReadOnlyExcludedChildTool(name) {
|
|
49
|
+
return READ_ONLY_SET.has(name);
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=child-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"child-tools.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/child-tools.ts"],"names":[],"mappings":"AAAA,cAAc;AACd;;;;;;;;;;GAUG;AAIH,wEAAwE;AACxE,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACvC,MAAM;IACN,YAAY;IACZ,eAAe;IACf,aAAa;IACb,cAAc;IACd,eAAe;IACf,cAAc;IACd,UAAU;IACV,eAAe;CACN,CAAC;AAEX,uEAAuE;AACvE,MAAM,CAAC,MAAM,8BAA8B,GAAG;IAC7C,MAAM;IACN,OAAO;IACP,cAAc;IACd,YAAY;CACH,CAAC;AAEX,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAS,wBAAwB,CAAC,CAAC;AACnE,MAAM,aAAa,GAAG,IAAI,GAAG,CAAS,8BAA8B,CAAC,CAAC;AAQtE,MAAM,UAAU,wBAAwB,CAAC,KAAoC,EAAY;IACxF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAS,gBAAgB,CAAC,CAAC;IACnD,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;QAC5B,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC7B,CAAC;IACD,IAAI,KAAK,CAAC,WAAW,KAAK,WAAW,EAAE,CAAC;QACvC,KAAK,MAAM,IAAI,IAAI,aAAa;YAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;AAAA,CACrB;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAY,EAAW;IAC7D,OAAO,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAAA,CAClC;AAED,MAAM,UAAU,2BAA2B,CAAC,IAAY,EAAW;IAClE,OAAO,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAAA,CAC/B","sourcesContent":["// @ts-nocheck\n/**\n * Central permission-to-tool resolver for prompt-driven children.\n *\n * Full access is the coding-tool set (read/search/shell/edit/write/web/LSP/MCP\n * plus output and supervisor coordination). It is not parent-equivalent: cron,\n * memory, goals, plan approval, nested subagent management, and other\n * persistent/user-config tools stay excluded.\n *\n * Read-only drops mutating coding tools from the registry and still runs under\n * Plan mode as defense in depth.\n */\n\nimport type { ChildPermission } from \"../../../../../core/subagent-permission-inherit.ts\";\n\n/** Parent-owned / persistent tools excluded even from full children. */\nexport const PARENT_OWNED_CHILD_TOOLS = [\n\t\"cron\",\n\t\"memory_add\",\n\t\"memory_remove\",\n\t\"memory_load\",\n\t\"present_plan\",\n\t\"goal_complete\",\n\t\"goal_blocked\",\n\t\"subagent\",\n\t\"subagent_wait\",\n] as const;\n\n/** Mutating coding tools omitted from the read-only child registry. */\nexport const READ_ONLY_EXCLUDED_CHILD_TOOLS = [\n\t\"edit\",\n\t\"write\",\n\t\"code_rewrite\",\n\t\"lsp_rename\",\n] as const;\n\nconst PARENT_OWNED_SET = new Set<string>(PARENT_OWNED_CHILD_TOOLS);\nconst READ_ONLY_SET = new Set<string>(READ_ONLY_EXCLUDED_CHILD_TOOLS);\n\nexport interface ResolveChildExcludeToolsInput {\n\tpermissions: ChildPermission;\n\t/** Dynamic fanout children may keep the child-safe subagent tool. */\n\tfanoutAuthorized?: boolean;\n}\n\nexport function resolveChildExcludeTools(input: ResolveChildExcludeToolsInput): string[] {\n\tconst excluded = new Set<string>(PARENT_OWNED_SET);\n\tif (input.fanoutAuthorized) {\n\t\texcluded.delete(\"subagent\");\n\t}\n\tif (input.permissions === \"read-only\") {\n\t\tfor (const tool of READ_ONLY_SET) excluded.add(tool);\n\t}\n\treturn [...excluded];\n}\n\nexport function isParentOwnedChildTool(name: string): boolean {\n\treturn PARENT_OWNED_SET.has(name);\n}\n\nexport function isReadOnlyExcludedChildTool(name: string): boolean {\n\treturn READ_ONLY_SET.has(name);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamic-fanout.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/dynamic-fanout.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport type { DynamicParallelStep, ParallelTaskItem } from \"../../shared/settings.ts\";\nimport type { ArtifactPaths, ChainOutputMap, JsonSchemaObject, SingleResult } from \"../../shared/types.ts\";\nimport { getSingleResultOutput } from \"../../shared/utils.ts\";\nimport { validateStructuredOutputValue } from \"./structured-output.ts\";\n\nexport class DynamicFanoutError extends Error {}\n\nexport interface DynamicFanoutConfig {\n\tmaxItems?: number;\n\tallowRunnerFields?: boolean;\n}\n\nexport interface DynamicMaterializedItem {\n\tindex: number;\n\tkey: string;\n\tidKey: string;\n\titem: unknown;\n}\n\nexport interface DynamicCollectedResult {\n\tkey: string;\n\tindex: number;\n\titem: unknown;\n\tagent: string;\n\texitCode: number | null;\n\ttext: string;\n\tstructured?: unknown;\n\terror?: string;\n\ttimedOut?: boolean;\n\tstopped?: boolean;\n\toutputPath?: string;\n\tartifactPaths?: ArtifactPaths;\n}\n\nexport interface DynamicMaterializedGroup {\n\titems: DynamicMaterializedItem[];\n\tparallel: ParallelTaskItem[];\n\tcollectedOnEmpty?: DynamicCollectedResult[];\n}\n\nconst SAFE_OUTPUT_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;\nconst ITEM_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;\nconst ITEM_REF_PATTERN = /\\{([A-Za-z_][A-Za-z0-9_]*)(?:\\.([^{}]+))?\\}/g;\nconst RESERVED_TEMPLATE_NAMES = new Set([\"task\", \"previous\", \"chain_dir\", \"outputs\"]);\nconst DYNAMIC_STEP_KEYS = new Set([\"expand\", \"parallel\", \"collect\", \"concurrency\", \"failFast\", \"phase\", \"label\", \"acceptance\"]);\nconst RUNNER_DYNAMIC_STEP_KEYS = new Set([...DYNAMIC_STEP_KEYS, \"effectiveAcceptance\", \"acceptanceInput\", \"acceptanceRole\", \"sessionFiles\", \"thinkingOverrides\"]);\nconst DYNAMIC_EXPAND_KEYS = new Set([\"from\", \"item\", \"key\", \"maxItems\", \"onEmpty\"]);\nconst DYNAMIC_EXPAND_FROM_KEYS = new Set([\"output\", \"path\"]);\nconst DYNAMIC_PARALLEL_KEYS = new Set([\"agent\", \"task\", \"phase\", \"label\", \"outputSchema\", \"cwd\", \"output\", \"outputMode\", \"reads\", \"progress\", \"skill\", \"model\", \"toolBudget\", \"acceptance\"]);\nconst RUNNER_DYNAMIC_PARALLEL_KEYS = new Set([\n\t...DYNAMIC_PARALLEL_KEYS,\n\t\"outputName\", \"structured\", \"inheritProjectContext\", \"inheritSkills\", \"skills\", \"outputPath\", \"namespaceOutputPath\", \"maxSubagentDepth\", \"waitToolEnabled\",\n\t\"structuredOutput\", \"structuredOutputSchema\", \"tools\", \"extensions\", \"subagentOnlyExtensions\", \"mcpDirectTools\", \"completionGuard\", \"systemPrompt\",\n\t\"systemPromptMode\", \"thinking\", \"modelCandidates\", \"sessionFile\", \"effectiveAcceptance\", \"acceptanceInput\", \"acceptanceRole\", \"parentSessionId\", \"parentPermissionMode\",\n]);\nconst DYNAMIC_COLLECT_KEYS = new Set([\"as\", \"outputSchema\"]);\n\nexport function isSafeOutputName(name: string): boolean {\n\treturn SAFE_OUTPUT_NAME_PATTERN.test(name);\n}\n\nexport function assertJsonPointer(pointer: string, label: string): void {\n\tif (pointer === \"\") return;\n\tif (!pointer.startsWith(\"/\")) {\n\t\tthrow new DynamicFanoutError(`${label} must be a JSON Pointer starting with '/'.`);\n\t}\n\tfor (const segment of pointer.slice(1).split(\"/\")) {\n\t\tif (/~(?![01])/.test(segment)) {\n\t\t\tthrow new DynamicFanoutError(`${label} contains invalid JSON Pointer escape.`);\n\t\t}\n\t}\n}\n\nfunction decodePointerSegment(segment: string): string {\n\treturn segment.replace(/~1/g, \"/\").replace(/~0/g, \"~\");\n}\n\nexport function resolveJsonPointer(value: unknown, pointer: string, label: string): unknown {\n\tassertJsonPointer(pointer, label);\n\tif (pointer === \"\") return value;\n\tlet current = value;\n\tfor (const rawSegment of pointer.slice(1).split(\"/\")) {\n\t\tconst segment = decodePointerSegment(rawSegment);\n\t\tif (Array.isArray(current)) {\n\t\t\tif (!/^(0|[1-9][0-9]*)$/.test(segment)) {\n\t\t\t\tthrow new DynamicFanoutError(`${label} segment '${segment}' does not address an array index.`);\n\t\t\t}\n\t\t\tconst index = Number(segment);\n\t\t\tif (index >= current.length) throw new DynamicFanoutError(`${label} does not exist.`);\n\t\t\tcurrent = current[index];\n\t\t\tcontinue;\n\t\t}\n\t\tif (!current || typeof current !== \"object\") {\n\t\t\tthrow new DynamicFanoutError(`${label} does not exist.`);\n\t\t}\n\t\tconst record = current as Record<string, unknown>;\n\t\tif (!Object.prototype.hasOwnProperty.call(record, segment)) {\n\t\t\tthrow new DynamicFanoutError(`${label} does not exist.`);\n\t\t}\n\t\tcurrent = record[segment];\n\t}\n\treturn current;\n}\n\nfunction scalarToKey(value: unknown, label: string): string {\n\tif (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n\t\tconst key = String(value);\n\t\tif (!key.trim()) throw new DynamicFanoutError(`${label} resolved to an empty key.`);\n\t\tif (/[\\u0000-\\u001F\\u007F]/.test(key)) throw new DynamicFanoutError(`${label} resolved to an unsafe key.`);\n\t\tif (key.length > 200) throw new DynamicFanoutError(`${label} resolved to a key longer than 200 characters.`);\n\t\treturn key;\n\t}\n\tthrow new DynamicFanoutError(`${label} must resolve to a string, number, or boolean.`);\n}\n\nexport function normalizeItemKeyForId(key: string): string {\n\tconst normalized = key\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9]+/g, \"-\")\n\t\t.replace(/^-+|-+$/g, \"\")\n\t\t.slice(0, 80);\n\treturn normalized || \"item\";\n}\n\nfunction valueToTemplateText(value: unknown, reference: string): string {\n\tif (value === undefined) throw new DynamicFanoutError(`Unresolved item reference '${reference}'.`);\n\tif (typeof value === \"string\") return value;\n\tif (typeof value === \"number\" || typeof value === \"boolean\" || value === null) return String(value);\n\treturn JSON.stringify(value);\n}\n\nfunction resolveItemPath(item: unknown, pathText: string | undefined, reference: string): unknown {\n\tif (!pathText) return item;\n\tconst pointer = `/${pathText.split(\".\").map((segment) => segment.replace(/~/g, \"~0\").replace(/\\//g, \"~1\")).join(\"/\")}`;\n\treturn resolveJsonPointer(item, pointer, reference);\n}\n\nexport function resolveItemTemplate(template: string, itemName: string, item: unknown): string {\n\treturn template.replace(ITEM_REF_PATTERN, (raw, name: string, pathText: string | undefined) => {\n\t\tif (name !== itemName) return raw;\n\t\tif (pathText !== undefined && (!pathText.trim() || pathText.includes(\"..\"))) {\n\t\t\tthrow new DynamicFanoutError(`Invalid item reference '${raw}'.`);\n\t\t}\n\t\treturn valueToTemplateText(resolveItemPath(item, pathText, raw), raw);\n\t});\n}\n\nfunction assertOnlyKeys(value: unknown, allowed: Set<string>, label: string): void {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) throw new DynamicFanoutError(`${label} must be an object.`);\n\tfor (const key of Object.keys(value)) {\n\t\tif (!allowed.has(key)) throw new DynamicFanoutError(`${label} does not support field '${key}'.`);\n\t}\n}\n\nexport function assertNoUnresolvedItemReferences(template: string, itemName: string, label: string): void {\n\tfor (const match of template.matchAll(/\\{([^{}]*)\\}/g)) {\n\t\tconst raw = match[0]!;\n\t\tconst reference = match[1]!;\n\t\tif (reference === itemName || reference.startsWith(`${itemName}.`)) {\n\t\t\tif (!ITEM_REF_PATTERN.test(raw) || reference === `${itemName}.` || reference.includes(\"..\")) {\n\t\t\t\tthrow new DynamicFanoutError(`Invalid item reference '${raw}' in ${label}.`);\n\t\t\t}\n\t\t\tITEM_REF_PATTERN.lastIndex = 0;\n\t\t\tcontinue;\n\t\t}\n\t\tITEM_REF_PATTERN.lastIndex = 0;\n\t\tconst name = reference.match(/^[A-Za-z_][A-Za-z0-9_]*/)?.[0];\n\t\tif (name === itemName) throw new DynamicFanoutError(`Invalid item reference '${raw}' in ${label}.`);\n\t\tif (name && RESERVED_TEMPLATE_NAMES.has(name)) continue;\n\t\tif (name) throw new DynamicFanoutError(`Unsupported template reference '${raw}' in ${label}.`);\n\t}\n\tITEM_REF_PATTERN.lastIndex = 0;\n\tif (template.includes(`{${itemName}.}`) || new RegExp(`\\\\{${itemName}(?:\\\\.|$)[^}]*$`).test(template)) {\n\t\tthrow new DynamicFanoutError(`Invalid item reference in ${label}.`);\n\t}\n}\n\nexport function hasDynamicFanoutFields(step: unknown): boolean {\n\treturn !!step && typeof step === \"object\" && !Array.isArray(step)\n\t\t&& (Object.prototype.hasOwnProperty.call(step, \"expand\") || Object.prototype.hasOwnProperty.call(step, \"collect\"));\n}\n\nexport function validateDynamicStepShape(step: DynamicParallelStep, stepIndex: number, config: DynamicFanoutConfig = {}): void {\n\tconst prefix = `Dynamic chain step ${stepIndex + 1}`;\n\tassertOnlyKeys(step, config.allowRunnerFields ? RUNNER_DYNAMIC_STEP_KEYS : DYNAMIC_STEP_KEYS, prefix);\n\tif (!step.expand || !step.expand.from) throw new DynamicFanoutError(`${prefix} requires expand.from.`);\n\tassertOnlyKeys(step.expand, DYNAMIC_EXPAND_KEYS, `${prefix} expand`);\n\tassertOnlyKeys(step.expand.from, DYNAMIC_EXPAND_FROM_KEYS, `${prefix} expand.from`);\n\tif (!isSafeOutputName(step.expand.from.output)) throw new DynamicFanoutError(`${prefix} has invalid expand.from.output '${step.expand.from.output}'.`);\n\tassertJsonPointer(step.expand.from.path, `${prefix} expand.from.path`);\n\tif (step.expand.key !== undefined) assertJsonPointer(step.expand.key, `${prefix} expand.key`);\n\tconst itemName = step.expand.item ?? \"item\";\n\tif (!ITEM_NAME_PATTERN.test(itemName)) throw new DynamicFanoutError(`${prefix} has invalid expand.item '${itemName}'.`);\n\tif (step.expand.maxItems === undefined && config.maxItems === undefined) {\n\t\tthrow new DynamicFanoutError(`${prefix} requires expand.maxItems or config.chain.dynamicFanout.maxItems.`);\n\t}\n\tif (step.expand.maxItems !== undefined && (!Number.isInteger(step.expand.maxItems) || step.expand.maxItems < 0)) {\n\t\tthrow new DynamicFanoutError(`${prefix} expand.maxItems must be an integer >= 0.`);\n\t}\n\tif (config.maxItems !== undefined && (!Number.isInteger(config.maxItems) || config.maxItems < 0)) {\n\t\tthrow new DynamicFanoutError(\"config.chain.dynamicFanout.maxItems must be an integer >= 0.\");\n\t}\n\tif (!step.parallel || Array.isArray(step.parallel)) throw new DynamicFanoutError(`${prefix} requires a single parallel template object and cannot mix dynamic expand/collect with static parallel arrays.`);\n\tassertOnlyKeys(step.parallel, config.allowRunnerFields ? RUNNER_DYNAMIC_PARALLEL_KEYS : DYNAMIC_PARALLEL_KEYS, `${prefix} parallel`);\n\tif (\"expand\" in (step.parallel as object)) throw new DynamicFanoutError(`${prefix} does not support nested dynamic fanout.`);\n\tif (!step.parallel.agent) throw new DynamicFanoutError(`${prefix} parallel.agent is required.`);\n\tif (!step.collect?.as || !isSafeOutputName(step.collect.as)) throw new DynamicFanoutError(`${prefix} requires collect.as with a safe output name.`);\n\tassertOnlyKeys(step.collect, DYNAMIC_COLLECT_KEYS, `${prefix} collect`);\n\tfor (const [label, template] of [\n\t\t[\"parallel.task\", step.parallel.task],\n\t\t[\"parallel.label\", step.parallel.label],\n\t] as const) {\n\t\tif (template) assertNoUnresolvedItemReferences(template, itemName, `${prefix} ${label}`);\n\t}\n}\n\nexport function resolveDynamicFanoutItems(step: DynamicParallelStep, outputs: ChainOutputMap, stepIndex: number, config: DynamicFanoutConfig = {}): DynamicMaterializedItem[] {\n\tvalidateDynamicStepShape(step, stepIndex, config);\n\tconst sourceName = step.expand.from.output;\n\tconst source = outputs[sourceName];\n\tif (!source) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} references unknown output '${sourceName}'.`);\n\tif (source.structured === undefined) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} requires structured output '${sourceName}'.`);\n\tconst value = resolveJsonPointer(source.structured, step.expand.from.path, `Dynamic chain step ${stepIndex + 1} expand.from.path`);\n\tif (!Array.isArray(value)) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} expand.from.path must resolve to an array.`);\n\tconst maxItems = step.expand.maxItems ?? config.maxItems;\n\tif (maxItems === undefined) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} requires an effective maxItems.`);\n\tif (value.length > maxItems) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} resolved ${value.length} items, exceeding maxItems ${maxItems}.`);\n\tconst seen = new Set<string>();\n\tconst seenIds = new Set<string>();\n\treturn value.map((item, index) => {\n\t\tconst key = step.expand.key === undefined\n\t\t\t? String(index)\n\t\t\t: scalarToKey(resolveJsonPointer(item, step.expand.key, `Dynamic chain step ${stepIndex + 1} expand.key`), `Dynamic chain step ${stepIndex + 1} expand.key`);\n\t\tif (seen.has(key)) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} produced duplicate item key '${key}'.`);\n\t\tseen.add(key);\n\t\tconst idKey = normalizeItemKeyForId(key);\n\t\tif (seenIds.has(idKey)) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} produced colliding item id '${idKey}'.`);\n\t\tseenIds.add(idKey);\n\t\treturn { index, key, idKey, item };\n\t});\n}\n\nexport function materializeDynamicParallelStep(step: DynamicParallelStep, outputs: ChainOutputMap, stepIndex: number, config: DynamicFanoutConfig = {}): DynamicMaterializedGroup {\n\tconst items = resolveDynamicFanoutItems(step, outputs, stepIndex, config);\n\tif (items.length === 0) {\n\t\tif ((step.expand.onEmpty ?? \"skip\") === \"fail\") {\n\t\t\tthrow new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} source array is empty.`);\n\t\t}\n\t\treturn { items, parallel: [], collectedOnEmpty: [] };\n\t}\n\tconst itemName = step.expand.item ?? \"item\";\n\tconst parallel = items.map((entry) => {\n\t\tconst task = resolveItemTemplate(step.parallel.task ?? \"{previous}\", itemName, entry.item);\n\t\tconst label = step.parallel.label ? resolveItemTemplate(step.parallel.label, itemName, entry.item) : undefined;\n\t\treturn {\n\t\t\t...step.parallel,\n\t\t\ttask,\n\t\t\t...(label !== undefined ? { label } : {}),\n\t\t};\n\t});\n\treturn { items, parallel };\n}\n\nexport function collectDynamicResults(\n\tstep: DynamicParallelStep,\n\titems: DynamicMaterializedItem[],\n\tresults: Array<Pick<SingleResult, \"agent\" | \"exitCode\" | \"error\" | \"timedOut\" | \"stopped\" | \"structuredOutput\" | \"artifactPaths\" | \"savedOutputPath\"> & { output?: string; finalOutput?: string }>,\n): DynamicCollectedResult[] {\n\treturn items.map((entry, index) => {\n\t\tconst result = results[index];\n\t\tconst text = result\n\t\t\t? (\"output\" in result && typeof result.output === \"string\" ? result.output : getSingleResultOutput(result as SingleResult))\n\t\t\t: \"\";\n\t\treturn {\n\t\t\tkey: entry.key,\n\t\t\tindex: entry.index,\n\t\t\titem: entry.item,\n\t\t\tagent: result?.agent ?? step.parallel.agent,\n\t\t\texitCode: result?.exitCode ?? null,\n\t\t\ttext,\n\t\t\t...(result?.structuredOutput !== undefined ? { structured: result.structuredOutput } : {}),\n\t\t\t...(result?.error ? { error: result.error } : {}),\n\t\t\t...(result?.timedOut ? { timedOut: true } : {}),\n\t\t\t...(result?.stopped ? { stopped: true } : {}),\n\t\t\t...(result?.savedOutputPath ? { outputPath: result.savedOutputPath } : {}),\n\t\t\t...(result?.artifactPaths ? { artifactPaths: result.artifactPaths } : {}),\n\t\t};\n\t});\n}\n\nexport function validateDynamicCollection(schema: JsonSchemaObject | undefined, value: DynamicCollectedResult[]): void {\n\tif (!schema) return;\n\tconst validation = validateStructuredOutputValue(schema, value);\n\tif (validation.status === \"invalid\") {\n\t\tthrow new DynamicFanoutError(`Collected output validation failed: ${validation.message}`);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"dynamic-fanout.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/dynamic-fanout.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport type { DynamicParallelStep, ParallelTaskItem } from \"../../shared/settings.ts\";\nimport type { ArtifactPaths, ChainOutputMap, JsonSchemaObject, SingleResult } from \"../../shared/types.ts\";\nimport { getSingleResultOutput } from \"../../shared/utils.ts\";\nimport { validateChildDescription } from \"../../shared/child-spec.ts\";\nimport { validateStructuredOutputValue } from \"./structured-output.ts\";\n\nexport class DynamicFanoutError extends Error {}\n\nexport interface DynamicFanoutConfig {\n\tmaxItems?: number;\n\tallowRunnerFields?: boolean;\n}\n\nexport interface DynamicMaterializedItem {\n\tindex: number;\n\tkey: string;\n\tidKey: string;\n\titem: unknown;\n}\n\nexport interface DynamicCollectedResult {\n\tkey: string;\n\tindex: number;\n\titem: unknown;\n\tagent: string;\n\texitCode: number | null;\n\ttext: string;\n\tstructured?: unknown;\n\terror?: string;\n\ttimedOut?: boolean;\n\tstopped?: boolean;\n\toutputPath?: string;\n\tartifactPaths?: ArtifactPaths;\n}\n\nexport interface DynamicMaterializedGroup {\n\titems: DynamicMaterializedItem[];\n\tparallel: ParallelTaskItem[];\n\tcollectedOnEmpty?: DynamicCollectedResult[];\n}\n\nconst SAFE_OUTPUT_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;\nconst ITEM_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;\nconst ITEM_REF_PATTERN = /\\{([A-Za-z_][A-Za-z0-9_]*)(?:\\.([^{}]+))?\\}/g;\nconst RESERVED_TEMPLATE_NAMES = new Set([\"task\", \"previous\", \"chain_dir\", \"outputs\"]);\nconst DYNAMIC_STEP_KEYS = new Set([\"expand\", \"parallel\", \"collect\", \"concurrency\", \"failFast\", \"phase\", \"label\", \"acceptance\"]);\nconst RUNNER_DYNAMIC_STEP_KEYS = new Set([...DYNAMIC_STEP_KEYS, \"effectiveAcceptance\", \"acceptanceInput\", \"acceptanceRole\", \"sessionFiles\", \"thinkingOverrides\"]);\nconst DYNAMIC_EXPAND_KEYS = new Set([\"from\", \"item\", \"key\", \"maxItems\", \"onEmpty\"]);\nconst DYNAMIC_EXPAND_FROM_KEYS = new Set([\"output\", \"path\"]);\nconst DYNAMIC_PARALLEL_KEYS = new Set([\"task\", \"description\", \"permissions\", \"phase\", \"label\", \"outputSchema\", \"cwd\", \"output\", \"outputMode\", \"reads\", \"progress\", \"skill\", \"model\", \"tier\", \"toolBudget\", \"acceptance\"]);\nconst RUNNER_DYNAMIC_PARALLEL_KEYS = new Set([\n\t...DYNAMIC_PARALLEL_KEYS,\n\t\"agent\", \"childId\",\n\t\"outputName\", \"structured\", \"inheritProjectContext\", \"inheritSkills\", \"skills\", \"outputPath\", \"namespaceOutputPath\", \"maxSubagentDepth\", \"waitToolEnabled\",\n\t\"structuredOutput\", \"structuredOutputSchema\", \"tools\", \"extensions\", \"subagentOnlyExtensions\", \"mcpDirectTools\", \"completionGuard\", \"systemPrompt\",\n\t\"systemPromptMode\", \"thinking\", \"modelCandidates\", \"sessionFile\", \"effectiveAcceptance\", \"acceptanceInput\", \"acceptanceRole\", \"parentSessionId\", \"parentPermissionMode\",\n]);\nconst DYNAMIC_COLLECT_KEYS = new Set([\"as\", \"outputSchema\"]);\n\nexport function isSafeOutputName(name: string): boolean {\n\treturn SAFE_OUTPUT_NAME_PATTERN.test(name);\n}\n\nexport function assertJsonPointer(pointer: string, label: string): void {\n\tif (pointer === \"\") return;\n\tif (!pointer.startsWith(\"/\")) {\n\t\tthrow new DynamicFanoutError(`${label} must be a JSON Pointer starting with '/'.`);\n\t}\n\tfor (const segment of pointer.slice(1).split(\"/\")) {\n\t\tif (/~(?![01])/.test(segment)) {\n\t\t\tthrow new DynamicFanoutError(`${label} contains invalid JSON Pointer escape.`);\n\t\t}\n\t}\n}\n\nfunction decodePointerSegment(segment: string): string {\n\treturn segment.replace(/~1/g, \"/\").replace(/~0/g, \"~\");\n}\n\nexport function resolveJsonPointer(value: unknown, pointer: string, label: string): unknown {\n\tassertJsonPointer(pointer, label);\n\tif (pointer === \"\") return value;\n\tlet current = value;\n\tfor (const rawSegment of pointer.slice(1).split(\"/\")) {\n\t\tconst segment = decodePointerSegment(rawSegment);\n\t\tif (Array.isArray(current)) {\n\t\t\tif (!/^(0|[1-9][0-9]*)$/.test(segment)) {\n\t\t\t\tthrow new DynamicFanoutError(`${label} segment '${segment}' does not address an array index.`);\n\t\t\t}\n\t\t\tconst index = Number(segment);\n\t\t\tif (index >= current.length) throw new DynamicFanoutError(`${label} does not exist.`);\n\t\t\tcurrent = current[index];\n\t\t\tcontinue;\n\t\t}\n\t\tif (!current || typeof current !== \"object\") {\n\t\t\tthrow new DynamicFanoutError(`${label} does not exist.`);\n\t\t}\n\t\tconst record = current as Record<string, unknown>;\n\t\tif (!Object.prototype.hasOwnProperty.call(record, segment)) {\n\t\t\tthrow new DynamicFanoutError(`${label} does not exist.`);\n\t\t}\n\t\tcurrent = record[segment];\n\t}\n\treturn current;\n}\n\nfunction scalarToKey(value: unknown, label: string): string {\n\tif (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n\t\tconst key = String(value);\n\t\tif (!key.trim()) throw new DynamicFanoutError(`${label} resolved to an empty key.`);\n\t\tif (/[\\u0000-\\u001F\\u007F]/.test(key)) throw new DynamicFanoutError(`${label} resolved to an unsafe key.`);\n\t\tif (key.length > 200) throw new DynamicFanoutError(`${label} resolved to a key longer than 200 characters.`);\n\t\treturn key;\n\t}\n\tthrow new DynamicFanoutError(`${label} must resolve to a string, number, or boolean.`);\n}\n\nexport function normalizeItemKeyForId(key: string): string {\n\tconst normalized = key\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9]+/g, \"-\")\n\t\t.replace(/^-+|-+$/g, \"\")\n\t\t.slice(0, 80);\n\treturn normalized || \"item\";\n}\n\nfunction valueToTemplateText(value: unknown, reference: string): string {\n\tif (value === undefined) throw new DynamicFanoutError(`Unresolved item reference '${reference}'.`);\n\tif (typeof value === \"string\") return value;\n\tif (typeof value === \"number\" || typeof value === \"boolean\" || value === null) return String(value);\n\treturn JSON.stringify(value);\n}\n\nfunction resolveItemPath(item: unknown, pathText: string | undefined, reference: string): unknown {\n\tif (!pathText) return item;\n\tconst pointer = `/${pathText.split(\".\").map((segment) => segment.replace(/~/g, \"~0\").replace(/\\//g, \"~1\")).join(\"/\")}`;\n\treturn resolveJsonPointer(item, pointer, reference);\n}\n\nexport function resolveItemTemplate(template: string, itemName: string, item: unknown): string {\n\treturn template.replace(ITEM_REF_PATTERN, (raw, name: string, pathText: string | undefined) => {\n\t\tif (name !== itemName) return raw;\n\t\tif (pathText !== undefined && (!pathText.trim() || pathText.includes(\"..\"))) {\n\t\t\tthrow new DynamicFanoutError(`Invalid item reference '${raw}'.`);\n\t\t}\n\t\treturn valueToTemplateText(resolveItemPath(item, pathText, raw), raw);\n\t});\n}\n\nfunction assertOnlyKeys(value: unknown, allowed: Set<string>, label: string): void {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) throw new DynamicFanoutError(`${label} must be an object.`);\n\tfor (const key of Object.keys(value)) {\n\t\tif (!allowed.has(key)) throw new DynamicFanoutError(`${label} does not support field '${key}'.`);\n\t}\n}\n\nexport function assertNoUnresolvedItemReferences(template: string, itemName: string, label: string): void {\n\tfor (const match of template.matchAll(/\\{([^{}]*)\\}/g)) {\n\t\tconst raw = match[0]!;\n\t\tconst reference = match[1]!;\n\t\tif (reference === itemName || reference.startsWith(`${itemName}.`)) {\n\t\t\tif (!ITEM_REF_PATTERN.test(raw) || reference === `${itemName}.` || reference.includes(\"..\")) {\n\t\t\t\tthrow new DynamicFanoutError(`Invalid item reference '${raw}' in ${label}.`);\n\t\t\t}\n\t\t\tITEM_REF_PATTERN.lastIndex = 0;\n\t\t\tcontinue;\n\t\t}\n\t\tITEM_REF_PATTERN.lastIndex = 0;\n\t\tconst name = reference.match(/^[A-Za-z_][A-Za-z0-9_]*/)?.[0];\n\t\tif (name === itemName) throw new DynamicFanoutError(`Invalid item reference '${raw}' in ${label}.`);\n\t\tif (name && RESERVED_TEMPLATE_NAMES.has(name)) continue;\n\t\tif (name) throw new DynamicFanoutError(`Unsupported template reference '${raw}' in ${label}.`);\n\t}\n\tITEM_REF_PATTERN.lastIndex = 0;\n\tif (template.includes(`{${itemName}.}`) || new RegExp(`\\\\{${itemName}(?:\\\\.|$)[^}]*$`).test(template)) {\n\t\tthrow new DynamicFanoutError(`Invalid item reference in ${label}.`);\n\t}\n}\n\nexport function hasDynamicFanoutFields(step: unknown): boolean {\n\treturn !!step && typeof step === \"object\" && !Array.isArray(step)\n\t\t&& (Object.prototype.hasOwnProperty.call(step, \"expand\") || Object.prototype.hasOwnProperty.call(step, \"collect\"));\n}\n\nexport function validateDynamicStepShape(step: DynamicParallelStep, stepIndex: number, config: DynamicFanoutConfig = {}): void {\n\tconst prefix = `Dynamic chain step ${stepIndex + 1}`;\n\tassertOnlyKeys(step, config.allowRunnerFields ? RUNNER_DYNAMIC_STEP_KEYS : DYNAMIC_STEP_KEYS, prefix);\n\tif (!step.expand || !step.expand.from) throw new DynamicFanoutError(`${prefix} requires expand.from.`);\n\tassertOnlyKeys(step.expand, DYNAMIC_EXPAND_KEYS, `${prefix} expand`);\n\tassertOnlyKeys(step.expand.from, DYNAMIC_EXPAND_FROM_KEYS, `${prefix} expand.from`);\n\tif (!isSafeOutputName(step.expand.from.output)) throw new DynamicFanoutError(`${prefix} has invalid expand.from.output '${step.expand.from.output}'.`);\n\tassertJsonPointer(step.expand.from.path, `${prefix} expand.from.path`);\n\tif (step.expand.key !== undefined) assertJsonPointer(step.expand.key, `${prefix} expand.key`);\n\tconst itemName = step.expand.item ?? \"item\";\n\tif (!ITEM_NAME_PATTERN.test(itemName)) throw new DynamicFanoutError(`${prefix} has invalid expand.item '${itemName}'.`);\n\tif (step.expand.maxItems === undefined && config.maxItems === undefined) {\n\t\tthrow new DynamicFanoutError(`${prefix} requires expand.maxItems or config.chain.dynamicFanout.maxItems.`);\n\t}\n\tif (step.expand.maxItems !== undefined && (!Number.isInteger(step.expand.maxItems) || step.expand.maxItems < 0)) {\n\t\tthrow new DynamicFanoutError(`${prefix} expand.maxItems must be an integer >= 0.`);\n\t}\n\tif (config.maxItems !== undefined && (!Number.isInteger(config.maxItems) || config.maxItems < 0)) {\n\t\tthrow new DynamicFanoutError(\"config.chain.dynamicFanout.maxItems must be an integer >= 0.\");\n\t}\n\tif (!step.parallel || Array.isArray(step.parallel)) throw new DynamicFanoutError(`${prefix} requires a single parallel template object and cannot mix dynamic expand/collect with static parallel arrays.`);\n\tassertOnlyKeys(step.parallel, config.allowRunnerFields ? RUNNER_DYNAMIC_PARALLEL_KEYS : DYNAMIC_PARALLEL_KEYS, `${prefix} parallel`);\n\tif (\"expand\" in (step.parallel as object)) throw new DynamicFanoutError(`${prefix} does not support nested dynamic fanout.`);\n\tif (!step.parallel.description) throw new DynamicFanoutError(`${prefix} parallel.description is required.`);\n\tif (!step.collect?.as || !isSafeOutputName(step.collect.as)) throw new DynamicFanoutError(`${prefix} requires collect.as with a safe output name.`);\n\tassertOnlyKeys(step.collect, DYNAMIC_COLLECT_KEYS, `${prefix} collect`);\n\tfor (const [label, template] of [\n\t\t[\"parallel.task\", step.parallel.task],\n\t\t[\"parallel.description\", step.parallel.description],\n\t\t[\"parallel.label\", step.parallel.label],\n\t] as const) {\n\t\tif (template) assertNoUnresolvedItemReferences(template, itemName, `${prefix} ${label}`);\n\t}\n}\n\nexport function resolveDynamicFanoutItems(step: DynamicParallelStep, outputs: ChainOutputMap, stepIndex: number, config: DynamicFanoutConfig = {}): DynamicMaterializedItem[] {\n\tvalidateDynamicStepShape(step, stepIndex, config);\n\tconst sourceName = step.expand.from.output;\n\tconst source = outputs[sourceName];\n\tif (!source) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} references unknown output '${sourceName}'.`);\n\tif (source.structured === undefined) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} requires structured output '${sourceName}'.`);\n\tconst value = resolveJsonPointer(source.structured, step.expand.from.path, `Dynamic chain step ${stepIndex + 1} expand.from.path`);\n\tif (!Array.isArray(value)) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} expand.from.path must resolve to an array.`);\n\tconst maxItems = step.expand.maxItems ?? config.maxItems;\n\tif (maxItems === undefined) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} requires an effective maxItems.`);\n\tif (value.length > maxItems) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} resolved ${value.length} items, exceeding maxItems ${maxItems}.`);\n\tconst seen = new Set<string>();\n\tconst seenIds = new Set<string>();\n\treturn value.map((item, index) => {\n\t\tconst key = step.expand.key === undefined\n\t\t\t? String(index)\n\t\t\t: scalarToKey(resolveJsonPointer(item, step.expand.key, `Dynamic chain step ${stepIndex + 1} expand.key`), `Dynamic chain step ${stepIndex + 1} expand.key`);\n\t\tif (seen.has(key)) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} produced duplicate item key '${key}'.`);\n\t\tseen.add(key);\n\t\tconst idKey = normalizeItemKeyForId(key);\n\t\tif (seenIds.has(idKey)) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} produced colliding item id '${idKey}'.`);\n\t\tseenIds.add(idKey);\n\t\treturn { index, key, idKey, item };\n\t});\n}\n\nexport function materializeDynamicParallelStep(step: DynamicParallelStep, outputs: ChainOutputMap, stepIndex: number, config: DynamicFanoutConfig = {}): DynamicMaterializedGroup {\n\tconst items = resolveDynamicFanoutItems(step, outputs, stepIndex, config);\n\tif (items.length === 0) {\n\t\tif ((step.expand.onEmpty ?? \"skip\") === \"fail\") {\n\t\t\tthrow new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} source array is empty.`);\n\t\t}\n\t\treturn { items, parallel: [], collectedOnEmpty: [] };\n\t}\n\tconst itemName = step.expand.item ?? \"item\";\n\tconst parallel = items.map((entry) => {\n\t\tconst task = resolveItemTemplate(step.parallel.task ?? \"{previous}\", itemName, entry.item);\n\t\tlet description: string;\n\t\ttry {\n\t\t\tdescription = validateChildDescription(\n\t\t\t\tresolveItemTemplate(step.parallel.description, itemName, entry.item),\n\t\t\t\t`Dynamic chain step ${stepIndex + 1} item '${entry.key}' description`,\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tthrow new DynamicFanoutError(error instanceof Error ? error.message : String(error));\n\t\t}\n\t\tconst label = step.parallel.label ? resolveItemTemplate(step.parallel.label, itemName, entry.item) : undefined;\n\t\tconst childId = step.parallel.childId ? `${step.parallel.childId}-${entry.idKey}` : undefined;\n\t\treturn {\n\t\t\t...step.parallel,\n\t\t\tchildId,\n\t\t\t// Foreground generic chains keep a private compatibility key in agent so\n\t\t\t// intercom/runtime config lookup survives materialization. Async runner\n\t\t\t// templates carry childId and use the expanded description for display.\n\t\t\tagent: childId ? description : step.parallel.agent || description,\n\t\t\ttask,\n\t\t\tdescription,\n\t\t\t...(label !== undefined ? { label } : {}),\n\t\t};\n\t});\n\treturn { items, parallel };\n}\n\nexport function collectDynamicResults(\n\tstep: DynamicParallelStep,\n\titems: DynamicMaterializedItem[],\n\tresults: Array<Pick<SingleResult, \"agent\" | \"exitCode\" | \"error\" | \"timedOut\" | \"stopped\" | \"structuredOutput\" | \"artifactPaths\" | \"savedOutputPath\"> & { output?: string; finalOutput?: string }>,\n): DynamicCollectedResult[] {\n\treturn items.map((entry, index) => {\n\t\tconst result = results[index];\n\t\tconst text = result\n\t\t\t? (\"output\" in result && typeof result.output === \"string\" ? result.output : getSingleResultOutput(result as SingleResult))\n\t\t\t: \"\";\n\t\treturn {\n\t\t\tkey: entry.key,\n\t\t\tindex: entry.index,\n\t\t\titem: entry.item,\n\t\t\tagent: result?.agent ?? step.parallel.agent,\n\t\t\texitCode: result?.exitCode ?? null,\n\t\t\ttext,\n\t\t\t...(result?.structuredOutput !== undefined ? { structured: result.structuredOutput } : {}),\n\t\t\t...(result?.error ? { error: result.error } : {}),\n\t\t\t...(result?.timedOut ? { timedOut: true } : {}),\n\t\t\t...(result?.stopped ? { stopped: true } : {}),\n\t\t\t...(result?.savedOutputPath ? { outputPath: result.savedOutputPath } : {}),\n\t\t\t...(result?.artifactPaths ? { artifactPaths: result.artifactPaths } : {}),\n\t\t};\n\t});\n}\n\nexport function validateDynamicCollection(schema: JsonSchemaObject | undefined, value: DynamicCollectedResult[]): void {\n\tif (!schema) return;\n\tconst validation = validateStructuredOutputValue(schema, value);\n\tif (validation.status === \"invalid\") {\n\t\tthrow new DynamicFanoutError(`Collected output validation failed: ${validation.message}`);\n\t}\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { getSingleResultOutput } from "../../shared/utils.js";
|
|
2
|
+
import { validateChildDescription } from "../../shared/child-spec.js";
|
|
2
3
|
import { validateStructuredOutputValue } from "./structured-output.js";
|
|
3
4
|
export class DynamicFanoutError extends Error {
|
|
4
5
|
}
|
|
@@ -10,9 +11,10 @@ const DYNAMIC_STEP_KEYS = new Set(["expand", "parallel", "collect", "concurrency
|
|
|
10
11
|
const RUNNER_DYNAMIC_STEP_KEYS = new Set([...DYNAMIC_STEP_KEYS, "effectiveAcceptance", "acceptanceInput", "acceptanceRole", "sessionFiles", "thinkingOverrides"]);
|
|
11
12
|
const DYNAMIC_EXPAND_KEYS = new Set(["from", "item", "key", "maxItems", "onEmpty"]);
|
|
12
13
|
const DYNAMIC_EXPAND_FROM_KEYS = new Set(["output", "path"]);
|
|
13
|
-
const DYNAMIC_PARALLEL_KEYS = new Set(["
|
|
14
|
+
const DYNAMIC_PARALLEL_KEYS = new Set(["task", "description", "permissions", "phase", "label", "outputSchema", "cwd", "output", "outputMode", "reads", "progress", "skill", "model", "tier", "toolBudget", "acceptance"]);
|
|
14
15
|
const RUNNER_DYNAMIC_PARALLEL_KEYS = new Set([
|
|
15
16
|
...DYNAMIC_PARALLEL_KEYS,
|
|
17
|
+
"agent", "childId",
|
|
16
18
|
"outputName", "structured", "inheritProjectContext", "inheritSkills", "skills", "outputPath", "namespaceOutputPath", "maxSubagentDepth", "waitToolEnabled",
|
|
17
19
|
"structuredOutput", "structuredOutputSchema", "tools", "extensions", "subagentOnlyExtensions", "mcpDirectTools", "completionGuard", "systemPrompt",
|
|
18
20
|
"systemPromptMode", "thinking", "modelCandidates", "sessionFile", "effectiveAcceptance", "acceptanceInput", "acceptanceRole", "parentSessionId", "parentPermissionMode",
|
|
@@ -176,13 +178,14 @@ export function validateDynamicStepShape(step, stepIndex, config = {}) {
|
|
|
176
178
|
assertOnlyKeys(step.parallel, config.allowRunnerFields ? RUNNER_DYNAMIC_PARALLEL_KEYS : DYNAMIC_PARALLEL_KEYS, `${prefix} parallel`);
|
|
177
179
|
if ("expand" in step.parallel)
|
|
178
180
|
throw new DynamicFanoutError(`${prefix} does not support nested dynamic fanout.`);
|
|
179
|
-
if (!step.parallel.
|
|
180
|
-
throw new DynamicFanoutError(`${prefix} parallel.
|
|
181
|
+
if (!step.parallel.description)
|
|
182
|
+
throw new DynamicFanoutError(`${prefix} parallel.description is required.`);
|
|
181
183
|
if (!step.collect?.as || !isSafeOutputName(step.collect.as))
|
|
182
184
|
throw new DynamicFanoutError(`${prefix} requires collect.as with a safe output name.`);
|
|
183
185
|
assertOnlyKeys(step.collect, DYNAMIC_COLLECT_KEYS, `${prefix} collect`);
|
|
184
186
|
for (const [label, template] of [
|
|
185
187
|
["parallel.task", step.parallel.task],
|
|
188
|
+
["parallel.description", step.parallel.description],
|
|
186
189
|
["parallel.label", step.parallel.label],
|
|
187
190
|
]) {
|
|
188
191
|
if (template)
|
|
@@ -232,10 +235,24 @@ export function materializeDynamicParallelStep(step, outputs, stepIndex, config
|
|
|
232
235
|
const itemName = step.expand.item ?? "item";
|
|
233
236
|
const parallel = items.map((entry) => {
|
|
234
237
|
const task = resolveItemTemplate(step.parallel.task ?? "{previous}", itemName, entry.item);
|
|
238
|
+
let description;
|
|
239
|
+
try {
|
|
240
|
+
description = validateChildDescription(resolveItemTemplate(step.parallel.description, itemName, entry.item), `Dynamic chain step ${stepIndex + 1} item '${entry.key}' description`);
|
|
241
|
+
}
|
|
242
|
+
catch (error) {
|
|
243
|
+
throw new DynamicFanoutError(error instanceof Error ? error.message : String(error));
|
|
244
|
+
}
|
|
235
245
|
const label = step.parallel.label ? resolveItemTemplate(step.parallel.label, itemName, entry.item) : undefined;
|
|
246
|
+
const childId = step.parallel.childId ? `${step.parallel.childId}-${entry.idKey}` : undefined;
|
|
236
247
|
return {
|
|
237
248
|
...step.parallel,
|
|
249
|
+
childId,
|
|
250
|
+
// Foreground generic chains keep a private compatibility key in agent so
|
|
251
|
+
// intercom/runtime config lookup survives materialization. Async runner
|
|
252
|
+
// templates carry childId and use the expanded description for display.
|
|
253
|
+
agent: childId ? description : step.parallel.agent || description,
|
|
238
254
|
task,
|
|
255
|
+
description,
|
|
239
256
|
...(label !== undefined ? { label } : {}),
|
|
240
257
|
};
|
|
241
258
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dynamic-fanout.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/dynamic-fanout.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport type { DynamicParallelStep, ParallelTaskItem } from \"../../shared/settings.ts\";\nimport type { ArtifactPaths, ChainOutputMap, JsonSchemaObject, SingleResult } from \"../../shared/types.ts\";\nimport { getSingleResultOutput } from \"../../shared/utils.ts\";\nimport { validateStructuredOutputValue } from \"./structured-output.ts\";\n\nexport class DynamicFanoutError extends Error {}\n\nexport interface DynamicFanoutConfig {\n\tmaxItems?: number;\n\tallowRunnerFields?: boolean;\n}\n\nexport interface DynamicMaterializedItem {\n\tindex: number;\n\tkey: string;\n\tidKey: string;\n\titem: unknown;\n}\n\nexport interface DynamicCollectedResult {\n\tkey: string;\n\tindex: number;\n\titem: unknown;\n\tagent: string;\n\texitCode: number | null;\n\ttext: string;\n\tstructured?: unknown;\n\terror?: string;\n\ttimedOut?: boolean;\n\tstopped?: boolean;\n\toutputPath?: string;\n\tartifactPaths?: ArtifactPaths;\n}\n\nexport interface DynamicMaterializedGroup {\n\titems: DynamicMaterializedItem[];\n\tparallel: ParallelTaskItem[];\n\tcollectedOnEmpty?: DynamicCollectedResult[];\n}\n\nconst SAFE_OUTPUT_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;\nconst ITEM_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;\nconst ITEM_REF_PATTERN = /\\{([A-Za-z_][A-Za-z0-9_]*)(?:\\.([^{}]+))?\\}/g;\nconst RESERVED_TEMPLATE_NAMES = new Set([\"task\", \"previous\", \"chain_dir\", \"outputs\"]);\nconst DYNAMIC_STEP_KEYS = new Set([\"expand\", \"parallel\", \"collect\", \"concurrency\", \"failFast\", \"phase\", \"label\", \"acceptance\"]);\nconst RUNNER_DYNAMIC_STEP_KEYS = new Set([...DYNAMIC_STEP_KEYS, \"effectiveAcceptance\", \"acceptanceInput\", \"acceptanceRole\", \"sessionFiles\", \"thinkingOverrides\"]);\nconst DYNAMIC_EXPAND_KEYS = new Set([\"from\", \"item\", \"key\", \"maxItems\", \"onEmpty\"]);\nconst DYNAMIC_EXPAND_FROM_KEYS = new Set([\"output\", \"path\"]);\nconst DYNAMIC_PARALLEL_KEYS = new Set([\"agent\", \"task\", \"phase\", \"label\", \"outputSchema\", \"cwd\", \"output\", \"outputMode\", \"reads\", \"progress\", \"skill\", \"model\", \"toolBudget\", \"acceptance\"]);\nconst RUNNER_DYNAMIC_PARALLEL_KEYS = new Set([\n\t...DYNAMIC_PARALLEL_KEYS,\n\t\"outputName\", \"structured\", \"inheritProjectContext\", \"inheritSkills\", \"skills\", \"outputPath\", \"namespaceOutputPath\", \"maxSubagentDepth\", \"waitToolEnabled\",\n\t\"structuredOutput\", \"structuredOutputSchema\", \"tools\", \"extensions\", \"subagentOnlyExtensions\", \"mcpDirectTools\", \"completionGuard\", \"systemPrompt\",\n\t\"systemPromptMode\", \"thinking\", \"modelCandidates\", \"sessionFile\", \"effectiveAcceptance\", \"acceptanceInput\", \"acceptanceRole\", \"parentSessionId\", \"parentPermissionMode\",\n]);\nconst DYNAMIC_COLLECT_KEYS = new Set([\"as\", \"outputSchema\"]);\n\nexport function isSafeOutputName(name: string): boolean {\n\treturn SAFE_OUTPUT_NAME_PATTERN.test(name);\n}\n\nexport function assertJsonPointer(pointer: string, label: string): void {\n\tif (pointer === \"\") return;\n\tif (!pointer.startsWith(\"/\")) {\n\t\tthrow new DynamicFanoutError(`${label} must be a JSON Pointer starting with '/'.`);\n\t}\n\tfor (const segment of pointer.slice(1).split(\"/\")) {\n\t\tif (/~(?![01])/.test(segment)) {\n\t\t\tthrow new DynamicFanoutError(`${label} contains invalid JSON Pointer escape.`);\n\t\t}\n\t}\n}\n\nfunction decodePointerSegment(segment: string): string {\n\treturn segment.replace(/~1/g, \"/\").replace(/~0/g, \"~\");\n}\n\nexport function resolveJsonPointer(value: unknown, pointer: string, label: string): unknown {\n\tassertJsonPointer(pointer, label);\n\tif (pointer === \"\") return value;\n\tlet current = value;\n\tfor (const rawSegment of pointer.slice(1).split(\"/\")) {\n\t\tconst segment = decodePointerSegment(rawSegment);\n\t\tif (Array.isArray(current)) {\n\t\t\tif (!/^(0|[1-9][0-9]*)$/.test(segment)) {\n\t\t\t\tthrow new DynamicFanoutError(`${label} segment '${segment}' does not address an array index.`);\n\t\t\t}\n\t\t\tconst index = Number(segment);\n\t\t\tif (index >= current.length) throw new DynamicFanoutError(`${label} does not exist.`);\n\t\t\tcurrent = current[index];\n\t\t\tcontinue;\n\t\t}\n\t\tif (!current || typeof current !== \"object\") {\n\t\t\tthrow new DynamicFanoutError(`${label} does not exist.`);\n\t\t}\n\t\tconst record = current as Record<string, unknown>;\n\t\tif (!Object.prototype.hasOwnProperty.call(record, segment)) {\n\t\t\tthrow new DynamicFanoutError(`${label} does not exist.`);\n\t\t}\n\t\tcurrent = record[segment];\n\t}\n\treturn current;\n}\n\nfunction scalarToKey(value: unknown, label: string): string {\n\tif (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n\t\tconst key = String(value);\n\t\tif (!key.trim()) throw new DynamicFanoutError(`${label} resolved to an empty key.`);\n\t\tif (/[\\u0000-\\u001F\\u007F]/.test(key)) throw new DynamicFanoutError(`${label} resolved to an unsafe key.`);\n\t\tif (key.length > 200) throw new DynamicFanoutError(`${label} resolved to a key longer than 200 characters.`);\n\t\treturn key;\n\t}\n\tthrow new DynamicFanoutError(`${label} must resolve to a string, number, or boolean.`);\n}\n\nexport function normalizeItemKeyForId(key: string): string {\n\tconst normalized = key\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9]+/g, \"-\")\n\t\t.replace(/^-+|-+$/g, \"\")\n\t\t.slice(0, 80);\n\treturn normalized || \"item\";\n}\n\nfunction valueToTemplateText(value: unknown, reference: string): string {\n\tif (value === undefined) throw new DynamicFanoutError(`Unresolved item reference '${reference}'.`);\n\tif (typeof value === \"string\") return value;\n\tif (typeof value === \"number\" || typeof value === \"boolean\" || value === null) return String(value);\n\treturn JSON.stringify(value);\n}\n\nfunction resolveItemPath(item: unknown, pathText: string | undefined, reference: string): unknown {\n\tif (!pathText) return item;\n\tconst pointer = `/${pathText.split(\".\").map((segment) => segment.replace(/~/g, \"~0\").replace(/\\//g, \"~1\")).join(\"/\")}`;\n\treturn resolveJsonPointer(item, pointer, reference);\n}\n\nexport function resolveItemTemplate(template: string, itemName: string, item: unknown): string {\n\treturn template.replace(ITEM_REF_PATTERN, (raw, name: string, pathText: string | undefined) => {\n\t\tif (name !== itemName) return raw;\n\t\tif (pathText !== undefined && (!pathText.trim() || pathText.includes(\"..\"))) {\n\t\t\tthrow new DynamicFanoutError(`Invalid item reference '${raw}'.`);\n\t\t}\n\t\treturn valueToTemplateText(resolveItemPath(item, pathText, raw), raw);\n\t});\n}\n\nfunction assertOnlyKeys(value: unknown, allowed: Set<string>, label: string): void {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) throw new DynamicFanoutError(`${label} must be an object.`);\n\tfor (const key of Object.keys(value)) {\n\t\tif (!allowed.has(key)) throw new DynamicFanoutError(`${label} does not support field '${key}'.`);\n\t}\n}\n\nexport function assertNoUnresolvedItemReferences(template: string, itemName: string, label: string): void {\n\tfor (const match of template.matchAll(/\\{([^{}]*)\\}/g)) {\n\t\tconst raw = match[0]!;\n\t\tconst reference = match[1]!;\n\t\tif (reference === itemName || reference.startsWith(`${itemName}.`)) {\n\t\t\tif (!ITEM_REF_PATTERN.test(raw) || reference === `${itemName}.` || reference.includes(\"..\")) {\n\t\t\t\tthrow new DynamicFanoutError(`Invalid item reference '${raw}' in ${label}.`);\n\t\t\t}\n\t\t\tITEM_REF_PATTERN.lastIndex = 0;\n\t\t\tcontinue;\n\t\t}\n\t\tITEM_REF_PATTERN.lastIndex = 0;\n\t\tconst name = reference.match(/^[A-Za-z_][A-Za-z0-9_]*/)?.[0];\n\t\tif (name === itemName) throw new DynamicFanoutError(`Invalid item reference '${raw}' in ${label}.`);\n\t\tif (name && RESERVED_TEMPLATE_NAMES.has(name)) continue;\n\t\tif (name) throw new DynamicFanoutError(`Unsupported template reference '${raw}' in ${label}.`);\n\t}\n\tITEM_REF_PATTERN.lastIndex = 0;\n\tif (template.includes(`{${itemName}.}`) || new RegExp(`\\\\{${itemName}(?:\\\\.|$)[^}]*$`).test(template)) {\n\t\tthrow new DynamicFanoutError(`Invalid item reference in ${label}.`);\n\t}\n}\n\nexport function hasDynamicFanoutFields(step: unknown): boolean {\n\treturn !!step && typeof step === \"object\" && !Array.isArray(step)\n\t\t&& (Object.prototype.hasOwnProperty.call(step, \"expand\") || Object.prototype.hasOwnProperty.call(step, \"collect\"));\n}\n\nexport function validateDynamicStepShape(step: DynamicParallelStep, stepIndex: number, config: DynamicFanoutConfig = {}): void {\n\tconst prefix = `Dynamic chain step ${stepIndex + 1}`;\n\tassertOnlyKeys(step, config.allowRunnerFields ? RUNNER_DYNAMIC_STEP_KEYS : DYNAMIC_STEP_KEYS, prefix);\n\tif (!step.expand || !step.expand.from) throw new DynamicFanoutError(`${prefix} requires expand.from.`);\n\tassertOnlyKeys(step.expand, DYNAMIC_EXPAND_KEYS, `${prefix} expand`);\n\tassertOnlyKeys(step.expand.from, DYNAMIC_EXPAND_FROM_KEYS, `${prefix} expand.from`);\n\tif (!isSafeOutputName(step.expand.from.output)) throw new DynamicFanoutError(`${prefix} has invalid expand.from.output '${step.expand.from.output}'.`);\n\tassertJsonPointer(step.expand.from.path, `${prefix} expand.from.path`);\n\tif (step.expand.key !== undefined) assertJsonPointer(step.expand.key, `${prefix} expand.key`);\n\tconst itemName = step.expand.item ?? \"item\";\n\tif (!ITEM_NAME_PATTERN.test(itemName)) throw new DynamicFanoutError(`${prefix} has invalid expand.item '${itemName}'.`);\n\tif (step.expand.maxItems === undefined && config.maxItems === undefined) {\n\t\tthrow new DynamicFanoutError(`${prefix} requires expand.maxItems or config.chain.dynamicFanout.maxItems.`);\n\t}\n\tif (step.expand.maxItems !== undefined && (!Number.isInteger(step.expand.maxItems) || step.expand.maxItems < 0)) {\n\t\tthrow new DynamicFanoutError(`${prefix} expand.maxItems must be an integer >= 0.`);\n\t}\n\tif (config.maxItems !== undefined && (!Number.isInteger(config.maxItems) || config.maxItems < 0)) {\n\t\tthrow new DynamicFanoutError(\"config.chain.dynamicFanout.maxItems must be an integer >= 0.\");\n\t}\n\tif (!step.parallel || Array.isArray(step.parallel)) throw new DynamicFanoutError(`${prefix} requires a single parallel template object and cannot mix dynamic expand/collect with static parallel arrays.`);\n\tassertOnlyKeys(step.parallel, config.allowRunnerFields ? RUNNER_DYNAMIC_PARALLEL_KEYS : DYNAMIC_PARALLEL_KEYS, `${prefix} parallel`);\n\tif (\"expand\" in (step.parallel as object)) throw new DynamicFanoutError(`${prefix} does not support nested dynamic fanout.`);\n\tif (!step.parallel.agent) throw new DynamicFanoutError(`${prefix} parallel.agent is required.`);\n\tif (!step.collect?.as || !isSafeOutputName(step.collect.as)) throw new DynamicFanoutError(`${prefix} requires collect.as with a safe output name.`);\n\tassertOnlyKeys(step.collect, DYNAMIC_COLLECT_KEYS, `${prefix} collect`);\n\tfor (const [label, template] of [\n\t\t[\"parallel.task\", step.parallel.task],\n\t\t[\"parallel.label\", step.parallel.label],\n\t] as const) {\n\t\tif (template) assertNoUnresolvedItemReferences(template, itemName, `${prefix} ${label}`);\n\t}\n}\n\nexport function resolveDynamicFanoutItems(step: DynamicParallelStep, outputs: ChainOutputMap, stepIndex: number, config: DynamicFanoutConfig = {}): DynamicMaterializedItem[] {\n\tvalidateDynamicStepShape(step, stepIndex, config);\n\tconst sourceName = step.expand.from.output;\n\tconst source = outputs[sourceName];\n\tif (!source) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} references unknown output '${sourceName}'.`);\n\tif (source.structured === undefined) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} requires structured output '${sourceName}'.`);\n\tconst value = resolveJsonPointer(source.structured, step.expand.from.path, `Dynamic chain step ${stepIndex + 1} expand.from.path`);\n\tif (!Array.isArray(value)) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} expand.from.path must resolve to an array.`);\n\tconst maxItems = step.expand.maxItems ?? config.maxItems;\n\tif (maxItems === undefined) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} requires an effective maxItems.`);\n\tif (value.length > maxItems) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} resolved ${value.length} items, exceeding maxItems ${maxItems}.`);\n\tconst seen = new Set<string>();\n\tconst seenIds = new Set<string>();\n\treturn value.map((item, index) => {\n\t\tconst key = step.expand.key === undefined\n\t\t\t? String(index)\n\t\t\t: scalarToKey(resolveJsonPointer(item, step.expand.key, `Dynamic chain step ${stepIndex + 1} expand.key`), `Dynamic chain step ${stepIndex + 1} expand.key`);\n\t\tif (seen.has(key)) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} produced duplicate item key '${key}'.`);\n\t\tseen.add(key);\n\t\tconst idKey = normalizeItemKeyForId(key);\n\t\tif (seenIds.has(idKey)) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} produced colliding item id '${idKey}'.`);\n\t\tseenIds.add(idKey);\n\t\treturn { index, key, idKey, item };\n\t});\n}\n\nexport function materializeDynamicParallelStep(step: DynamicParallelStep, outputs: ChainOutputMap, stepIndex: number, config: DynamicFanoutConfig = {}): DynamicMaterializedGroup {\n\tconst items = resolveDynamicFanoutItems(step, outputs, stepIndex, config);\n\tif (items.length === 0) {\n\t\tif ((step.expand.onEmpty ?? \"skip\") === \"fail\") {\n\t\t\tthrow new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} source array is empty.`);\n\t\t}\n\t\treturn { items, parallel: [], collectedOnEmpty: [] };\n\t}\n\tconst itemName = step.expand.item ?? \"item\";\n\tconst parallel = items.map((entry) => {\n\t\tconst task = resolveItemTemplate(step.parallel.task ?? \"{previous}\", itemName, entry.item);\n\t\tconst label = step.parallel.label ? resolveItemTemplate(step.parallel.label, itemName, entry.item) : undefined;\n\t\treturn {\n\t\t\t...step.parallel,\n\t\t\ttask,\n\t\t\t...(label !== undefined ? { label } : {}),\n\t\t};\n\t});\n\treturn { items, parallel };\n}\n\nexport function collectDynamicResults(\n\tstep: DynamicParallelStep,\n\titems: DynamicMaterializedItem[],\n\tresults: Array<Pick<SingleResult, \"agent\" | \"exitCode\" | \"error\" | \"timedOut\" | \"stopped\" | \"structuredOutput\" | \"artifactPaths\" | \"savedOutputPath\"> & { output?: string; finalOutput?: string }>,\n): DynamicCollectedResult[] {\n\treturn items.map((entry, index) => {\n\t\tconst result = results[index];\n\t\tconst text = result\n\t\t\t? (\"output\" in result && typeof result.output === \"string\" ? result.output : getSingleResultOutput(result as SingleResult))\n\t\t\t: \"\";\n\t\treturn {\n\t\t\tkey: entry.key,\n\t\t\tindex: entry.index,\n\t\t\titem: entry.item,\n\t\t\tagent: result?.agent ?? step.parallel.agent,\n\t\t\texitCode: result?.exitCode ?? null,\n\t\t\ttext,\n\t\t\t...(result?.structuredOutput !== undefined ? { structured: result.structuredOutput } : {}),\n\t\t\t...(result?.error ? { error: result.error } : {}),\n\t\t\t...(result?.timedOut ? { timedOut: true } : {}),\n\t\t\t...(result?.stopped ? { stopped: true } : {}),\n\t\t\t...(result?.savedOutputPath ? { outputPath: result.savedOutputPath } : {}),\n\t\t\t...(result?.artifactPaths ? { artifactPaths: result.artifactPaths } : {}),\n\t\t};\n\t});\n}\n\nexport function validateDynamicCollection(schema: JsonSchemaObject | undefined, value: DynamicCollectedResult[]): void {\n\tif (!schema) return;\n\tconst validation = validateStructuredOutputValue(schema, value);\n\tif (validation.status === \"invalid\") {\n\t\tthrow new DynamicFanoutError(`Collected output validation failed: ${validation.message}`);\n\t}\n}\n"]}
|
|
1
|
+
{"version":3,"file":"dynamic-fanout.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/dynamic-fanout.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport type { DynamicParallelStep, ParallelTaskItem } from \"../../shared/settings.ts\";\nimport type { ArtifactPaths, ChainOutputMap, JsonSchemaObject, SingleResult } from \"../../shared/types.ts\";\nimport { getSingleResultOutput } from \"../../shared/utils.ts\";\nimport { validateChildDescription } from \"../../shared/child-spec.ts\";\nimport { validateStructuredOutputValue } from \"./structured-output.ts\";\n\nexport class DynamicFanoutError extends Error {}\n\nexport interface DynamicFanoutConfig {\n\tmaxItems?: number;\n\tallowRunnerFields?: boolean;\n}\n\nexport interface DynamicMaterializedItem {\n\tindex: number;\n\tkey: string;\n\tidKey: string;\n\titem: unknown;\n}\n\nexport interface DynamicCollectedResult {\n\tkey: string;\n\tindex: number;\n\titem: unknown;\n\tagent: string;\n\texitCode: number | null;\n\ttext: string;\n\tstructured?: unknown;\n\terror?: string;\n\ttimedOut?: boolean;\n\tstopped?: boolean;\n\toutputPath?: string;\n\tartifactPaths?: ArtifactPaths;\n}\n\nexport interface DynamicMaterializedGroup {\n\titems: DynamicMaterializedItem[];\n\tparallel: ParallelTaskItem[];\n\tcollectedOnEmpty?: DynamicCollectedResult[];\n}\n\nconst SAFE_OUTPUT_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;\nconst ITEM_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;\nconst ITEM_REF_PATTERN = /\\{([A-Za-z_][A-Za-z0-9_]*)(?:\\.([^{}]+))?\\}/g;\nconst RESERVED_TEMPLATE_NAMES = new Set([\"task\", \"previous\", \"chain_dir\", \"outputs\"]);\nconst DYNAMIC_STEP_KEYS = new Set([\"expand\", \"parallel\", \"collect\", \"concurrency\", \"failFast\", \"phase\", \"label\", \"acceptance\"]);\nconst RUNNER_DYNAMIC_STEP_KEYS = new Set([...DYNAMIC_STEP_KEYS, \"effectiveAcceptance\", \"acceptanceInput\", \"acceptanceRole\", \"sessionFiles\", \"thinkingOverrides\"]);\nconst DYNAMIC_EXPAND_KEYS = new Set([\"from\", \"item\", \"key\", \"maxItems\", \"onEmpty\"]);\nconst DYNAMIC_EXPAND_FROM_KEYS = new Set([\"output\", \"path\"]);\nconst DYNAMIC_PARALLEL_KEYS = new Set([\"task\", \"description\", \"permissions\", \"phase\", \"label\", \"outputSchema\", \"cwd\", \"output\", \"outputMode\", \"reads\", \"progress\", \"skill\", \"model\", \"tier\", \"toolBudget\", \"acceptance\"]);\nconst RUNNER_DYNAMIC_PARALLEL_KEYS = new Set([\n\t...DYNAMIC_PARALLEL_KEYS,\n\t\"agent\", \"childId\",\n\t\"outputName\", \"structured\", \"inheritProjectContext\", \"inheritSkills\", \"skills\", \"outputPath\", \"namespaceOutputPath\", \"maxSubagentDepth\", \"waitToolEnabled\",\n\t\"structuredOutput\", \"structuredOutputSchema\", \"tools\", \"extensions\", \"subagentOnlyExtensions\", \"mcpDirectTools\", \"completionGuard\", \"systemPrompt\",\n\t\"systemPromptMode\", \"thinking\", \"modelCandidates\", \"sessionFile\", \"effectiveAcceptance\", \"acceptanceInput\", \"acceptanceRole\", \"parentSessionId\", \"parentPermissionMode\",\n]);\nconst DYNAMIC_COLLECT_KEYS = new Set([\"as\", \"outputSchema\"]);\n\nexport function isSafeOutputName(name: string): boolean {\n\treturn SAFE_OUTPUT_NAME_PATTERN.test(name);\n}\n\nexport function assertJsonPointer(pointer: string, label: string): void {\n\tif (pointer === \"\") return;\n\tif (!pointer.startsWith(\"/\")) {\n\t\tthrow new DynamicFanoutError(`${label} must be a JSON Pointer starting with '/'.`);\n\t}\n\tfor (const segment of pointer.slice(1).split(\"/\")) {\n\t\tif (/~(?![01])/.test(segment)) {\n\t\t\tthrow new DynamicFanoutError(`${label} contains invalid JSON Pointer escape.`);\n\t\t}\n\t}\n}\n\nfunction decodePointerSegment(segment: string): string {\n\treturn segment.replace(/~1/g, \"/\").replace(/~0/g, \"~\");\n}\n\nexport function resolveJsonPointer(value: unknown, pointer: string, label: string): unknown {\n\tassertJsonPointer(pointer, label);\n\tif (pointer === \"\") return value;\n\tlet current = value;\n\tfor (const rawSegment of pointer.slice(1).split(\"/\")) {\n\t\tconst segment = decodePointerSegment(rawSegment);\n\t\tif (Array.isArray(current)) {\n\t\t\tif (!/^(0|[1-9][0-9]*)$/.test(segment)) {\n\t\t\t\tthrow new DynamicFanoutError(`${label} segment '${segment}' does not address an array index.`);\n\t\t\t}\n\t\t\tconst index = Number(segment);\n\t\t\tif (index >= current.length) throw new DynamicFanoutError(`${label} does not exist.`);\n\t\t\tcurrent = current[index];\n\t\t\tcontinue;\n\t\t}\n\t\tif (!current || typeof current !== \"object\") {\n\t\t\tthrow new DynamicFanoutError(`${label} does not exist.`);\n\t\t}\n\t\tconst record = current as Record<string, unknown>;\n\t\tif (!Object.prototype.hasOwnProperty.call(record, segment)) {\n\t\t\tthrow new DynamicFanoutError(`${label} does not exist.`);\n\t\t}\n\t\tcurrent = record[segment];\n\t}\n\treturn current;\n}\n\nfunction scalarToKey(value: unknown, label: string): string {\n\tif (typeof value === \"string\" || typeof value === \"number\" || typeof value === \"boolean\") {\n\t\tconst key = String(value);\n\t\tif (!key.trim()) throw new DynamicFanoutError(`${label} resolved to an empty key.`);\n\t\tif (/[\\u0000-\\u001F\\u007F]/.test(key)) throw new DynamicFanoutError(`${label} resolved to an unsafe key.`);\n\t\tif (key.length > 200) throw new DynamicFanoutError(`${label} resolved to a key longer than 200 characters.`);\n\t\treturn key;\n\t}\n\tthrow new DynamicFanoutError(`${label} must resolve to a string, number, or boolean.`);\n}\n\nexport function normalizeItemKeyForId(key: string): string {\n\tconst normalized = key\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9]+/g, \"-\")\n\t\t.replace(/^-+|-+$/g, \"\")\n\t\t.slice(0, 80);\n\treturn normalized || \"item\";\n}\n\nfunction valueToTemplateText(value: unknown, reference: string): string {\n\tif (value === undefined) throw new DynamicFanoutError(`Unresolved item reference '${reference}'.`);\n\tif (typeof value === \"string\") return value;\n\tif (typeof value === \"number\" || typeof value === \"boolean\" || value === null) return String(value);\n\treturn JSON.stringify(value);\n}\n\nfunction resolveItemPath(item: unknown, pathText: string | undefined, reference: string): unknown {\n\tif (!pathText) return item;\n\tconst pointer = `/${pathText.split(\".\").map((segment) => segment.replace(/~/g, \"~0\").replace(/\\//g, \"~1\")).join(\"/\")}`;\n\treturn resolveJsonPointer(item, pointer, reference);\n}\n\nexport function resolveItemTemplate(template: string, itemName: string, item: unknown): string {\n\treturn template.replace(ITEM_REF_PATTERN, (raw, name: string, pathText: string | undefined) => {\n\t\tif (name !== itemName) return raw;\n\t\tif (pathText !== undefined && (!pathText.trim() || pathText.includes(\"..\"))) {\n\t\t\tthrow new DynamicFanoutError(`Invalid item reference '${raw}'.`);\n\t\t}\n\t\treturn valueToTemplateText(resolveItemPath(item, pathText, raw), raw);\n\t});\n}\n\nfunction assertOnlyKeys(value: unknown, allowed: Set<string>, label: string): void {\n\tif (!value || typeof value !== \"object\" || Array.isArray(value)) throw new DynamicFanoutError(`${label} must be an object.`);\n\tfor (const key of Object.keys(value)) {\n\t\tif (!allowed.has(key)) throw new DynamicFanoutError(`${label} does not support field '${key}'.`);\n\t}\n}\n\nexport function assertNoUnresolvedItemReferences(template: string, itemName: string, label: string): void {\n\tfor (const match of template.matchAll(/\\{([^{}]*)\\}/g)) {\n\t\tconst raw = match[0]!;\n\t\tconst reference = match[1]!;\n\t\tif (reference === itemName || reference.startsWith(`${itemName}.`)) {\n\t\t\tif (!ITEM_REF_PATTERN.test(raw) || reference === `${itemName}.` || reference.includes(\"..\")) {\n\t\t\t\tthrow new DynamicFanoutError(`Invalid item reference '${raw}' in ${label}.`);\n\t\t\t}\n\t\t\tITEM_REF_PATTERN.lastIndex = 0;\n\t\t\tcontinue;\n\t\t}\n\t\tITEM_REF_PATTERN.lastIndex = 0;\n\t\tconst name = reference.match(/^[A-Za-z_][A-Za-z0-9_]*/)?.[0];\n\t\tif (name === itemName) throw new DynamicFanoutError(`Invalid item reference '${raw}' in ${label}.`);\n\t\tif (name && RESERVED_TEMPLATE_NAMES.has(name)) continue;\n\t\tif (name) throw new DynamicFanoutError(`Unsupported template reference '${raw}' in ${label}.`);\n\t}\n\tITEM_REF_PATTERN.lastIndex = 0;\n\tif (template.includes(`{${itemName}.}`) || new RegExp(`\\\\{${itemName}(?:\\\\.|$)[^}]*$`).test(template)) {\n\t\tthrow new DynamicFanoutError(`Invalid item reference in ${label}.`);\n\t}\n}\n\nexport function hasDynamicFanoutFields(step: unknown): boolean {\n\treturn !!step && typeof step === \"object\" && !Array.isArray(step)\n\t\t&& (Object.prototype.hasOwnProperty.call(step, \"expand\") || Object.prototype.hasOwnProperty.call(step, \"collect\"));\n}\n\nexport function validateDynamicStepShape(step: DynamicParallelStep, stepIndex: number, config: DynamicFanoutConfig = {}): void {\n\tconst prefix = `Dynamic chain step ${stepIndex + 1}`;\n\tassertOnlyKeys(step, config.allowRunnerFields ? RUNNER_DYNAMIC_STEP_KEYS : DYNAMIC_STEP_KEYS, prefix);\n\tif (!step.expand || !step.expand.from) throw new DynamicFanoutError(`${prefix} requires expand.from.`);\n\tassertOnlyKeys(step.expand, DYNAMIC_EXPAND_KEYS, `${prefix} expand`);\n\tassertOnlyKeys(step.expand.from, DYNAMIC_EXPAND_FROM_KEYS, `${prefix} expand.from`);\n\tif (!isSafeOutputName(step.expand.from.output)) throw new DynamicFanoutError(`${prefix} has invalid expand.from.output '${step.expand.from.output}'.`);\n\tassertJsonPointer(step.expand.from.path, `${prefix} expand.from.path`);\n\tif (step.expand.key !== undefined) assertJsonPointer(step.expand.key, `${prefix} expand.key`);\n\tconst itemName = step.expand.item ?? \"item\";\n\tif (!ITEM_NAME_PATTERN.test(itemName)) throw new DynamicFanoutError(`${prefix} has invalid expand.item '${itemName}'.`);\n\tif (step.expand.maxItems === undefined && config.maxItems === undefined) {\n\t\tthrow new DynamicFanoutError(`${prefix} requires expand.maxItems or config.chain.dynamicFanout.maxItems.`);\n\t}\n\tif (step.expand.maxItems !== undefined && (!Number.isInteger(step.expand.maxItems) || step.expand.maxItems < 0)) {\n\t\tthrow new DynamicFanoutError(`${prefix} expand.maxItems must be an integer >= 0.`);\n\t}\n\tif (config.maxItems !== undefined && (!Number.isInteger(config.maxItems) || config.maxItems < 0)) {\n\t\tthrow new DynamicFanoutError(\"config.chain.dynamicFanout.maxItems must be an integer >= 0.\");\n\t}\n\tif (!step.parallel || Array.isArray(step.parallel)) throw new DynamicFanoutError(`${prefix} requires a single parallel template object and cannot mix dynamic expand/collect with static parallel arrays.`);\n\tassertOnlyKeys(step.parallel, config.allowRunnerFields ? RUNNER_DYNAMIC_PARALLEL_KEYS : DYNAMIC_PARALLEL_KEYS, `${prefix} parallel`);\n\tif (\"expand\" in (step.parallel as object)) throw new DynamicFanoutError(`${prefix} does not support nested dynamic fanout.`);\n\tif (!step.parallel.description) throw new DynamicFanoutError(`${prefix} parallel.description is required.`);\n\tif (!step.collect?.as || !isSafeOutputName(step.collect.as)) throw new DynamicFanoutError(`${prefix} requires collect.as with a safe output name.`);\n\tassertOnlyKeys(step.collect, DYNAMIC_COLLECT_KEYS, `${prefix} collect`);\n\tfor (const [label, template] of [\n\t\t[\"parallel.task\", step.parallel.task],\n\t\t[\"parallel.description\", step.parallel.description],\n\t\t[\"parallel.label\", step.parallel.label],\n\t] as const) {\n\t\tif (template) assertNoUnresolvedItemReferences(template, itemName, `${prefix} ${label}`);\n\t}\n}\n\nexport function resolveDynamicFanoutItems(step: DynamicParallelStep, outputs: ChainOutputMap, stepIndex: number, config: DynamicFanoutConfig = {}): DynamicMaterializedItem[] {\n\tvalidateDynamicStepShape(step, stepIndex, config);\n\tconst sourceName = step.expand.from.output;\n\tconst source = outputs[sourceName];\n\tif (!source) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} references unknown output '${sourceName}'.`);\n\tif (source.structured === undefined) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} requires structured output '${sourceName}'.`);\n\tconst value = resolveJsonPointer(source.structured, step.expand.from.path, `Dynamic chain step ${stepIndex + 1} expand.from.path`);\n\tif (!Array.isArray(value)) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} expand.from.path must resolve to an array.`);\n\tconst maxItems = step.expand.maxItems ?? config.maxItems;\n\tif (maxItems === undefined) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} requires an effective maxItems.`);\n\tif (value.length > maxItems) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} resolved ${value.length} items, exceeding maxItems ${maxItems}.`);\n\tconst seen = new Set<string>();\n\tconst seenIds = new Set<string>();\n\treturn value.map((item, index) => {\n\t\tconst key = step.expand.key === undefined\n\t\t\t? String(index)\n\t\t\t: scalarToKey(resolveJsonPointer(item, step.expand.key, `Dynamic chain step ${stepIndex + 1} expand.key`), `Dynamic chain step ${stepIndex + 1} expand.key`);\n\t\tif (seen.has(key)) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} produced duplicate item key '${key}'.`);\n\t\tseen.add(key);\n\t\tconst idKey = normalizeItemKeyForId(key);\n\t\tif (seenIds.has(idKey)) throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} produced colliding item id '${idKey}'.`);\n\t\tseenIds.add(idKey);\n\t\treturn { index, key, idKey, item };\n\t});\n}\n\nexport function materializeDynamicParallelStep(step: DynamicParallelStep, outputs: ChainOutputMap, stepIndex: number, config: DynamicFanoutConfig = {}): DynamicMaterializedGroup {\n\tconst items = resolveDynamicFanoutItems(step, outputs, stepIndex, config);\n\tif (items.length === 0) {\n\t\tif ((step.expand.onEmpty ?? \"skip\") === \"fail\") {\n\t\t\tthrow new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} source array is empty.`);\n\t\t}\n\t\treturn { items, parallel: [], collectedOnEmpty: [] };\n\t}\n\tconst itemName = step.expand.item ?? \"item\";\n\tconst parallel = items.map((entry) => {\n\t\tconst task = resolveItemTemplate(step.parallel.task ?? \"{previous}\", itemName, entry.item);\n\t\tlet description: string;\n\t\ttry {\n\t\t\tdescription = validateChildDescription(\n\t\t\t\tresolveItemTemplate(step.parallel.description, itemName, entry.item),\n\t\t\t\t`Dynamic chain step ${stepIndex + 1} item '${entry.key}' description`,\n\t\t\t);\n\t\t} catch (error) {\n\t\t\tthrow new DynamicFanoutError(error instanceof Error ? error.message : String(error));\n\t\t}\n\t\tconst label = step.parallel.label ? resolveItemTemplate(step.parallel.label, itemName, entry.item) : undefined;\n\t\tconst childId = step.parallel.childId ? `${step.parallel.childId}-${entry.idKey}` : undefined;\n\t\treturn {\n\t\t\t...step.parallel,\n\t\t\tchildId,\n\t\t\t// Foreground generic chains keep a private compatibility key in agent so\n\t\t\t// intercom/runtime config lookup survives materialization. Async runner\n\t\t\t// templates carry childId and use the expanded description for display.\n\t\t\tagent: childId ? description : step.parallel.agent || description,\n\t\t\ttask,\n\t\t\tdescription,\n\t\t\t...(label !== undefined ? { label } : {}),\n\t\t};\n\t});\n\treturn { items, parallel };\n}\n\nexport function collectDynamicResults(\n\tstep: DynamicParallelStep,\n\titems: DynamicMaterializedItem[],\n\tresults: Array<Pick<SingleResult, \"agent\" | \"exitCode\" | \"error\" | \"timedOut\" | \"stopped\" | \"structuredOutput\" | \"artifactPaths\" | \"savedOutputPath\"> & { output?: string; finalOutput?: string }>,\n): DynamicCollectedResult[] {\n\treturn items.map((entry, index) => {\n\t\tconst result = results[index];\n\t\tconst text = result\n\t\t\t? (\"output\" in result && typeof result.output === \"string\" ? result.output : getSingleResultOutput(result as SingleResult))\n\t\t\t: \"\";\n\t\treturn {\n\t\t\tkey: entry.key,\n\t\t\tindex: entry.index,\n\t\t\titem: entry.item,\n\t\t\tagent: result?.agent ?? step.parallel.agent,\n\t\t\texitCode: result?.exitCode ?? null,\n\t\t\ttext,\n\t\t\t...(result?.structuredOutput !== undefined ? { structured: result.structuredOutput } : {}),\n\t\t\t...(result?.error ? { error: result.error } : {}),\n\t\t\t...(result?.timedOut ? { timedOut: true } : {}),\n\t\t\t...(result?.stopped ? { stopped: true } : {}),\n\t\t\t...(result?.savedOutputPath ? { outputPath: result.savedOutputPath } : {}),\n\t\t\t...(result?.artifactPaths ? { artifactPaths: result.artifactPaths } : {}),\n\t\t};\n\t});\n}\n\nexport function validateDynamicCollection(schema: JsonSchemaObject | undefined, value: DynamicCollectedResult[]): void {\n\tif (!schema) return;\n\tconst validation = validateStructuredOutputValue(schema, value);\n\tif (validation.status === \"invalid\") {\n\t\tthrow new DynamicFanoutError(`Collected output validation failed: ${validation.message}`);\n\t}\n}\n"]}
|
|
@@ -3,7 +3,10 @@ export interface RunnerSubagentStep {
|
|
|
3
3
|
parentSessionId?: string;
|
|
4
4
|
/** Live parent permission mode snapshotted at spawn. */
|
|
5
5
|
parentPermissionMode?: string;
|
|
6
|
-
agent
|
|
6
|
+
agent?: string;
|
|
7
|
+
childId?: string;
|
|
8
|
+
description?: string;
|
|
9
|
+
permissions?: "full" | "read-only";
|
|
7
10
|
task: string;
|
|
8
11
|
importAsyncRoot?: {
|
|
9
12
|
runId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parallel-utils.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nexport interface RunnerSubagentStep {\n\t/** Session id of the direct parent session for permission-system ask forwarding. */\n\tparentSessionId?: string;\n\t/** Live parent permission mode snapshotted at spawn. */\n\tparentPermissionMode?: string;\n\tagent: string;\n\ttask: string;\n\timportAsyncRoot?: {\n\t\trunId: string;\n\t\tasyncDir: string;\n\t\tresultPath: string;\n\t\tindex: number;\n\t};\n\tphase?: string;\n\tlabel?: string;\n\toutputName?: string;\n\tstructured?: boolean;\n\tcwd?: string;\n\tmodel?: string;\n\tthinking?: string;\n\tmodelCandidates?: string[];\n\ttools?: string[];\n\textensions?: string[];\n\tsubagentOnlyExtensions?: string[];\n\tmcpDirectTools?: string[];\n\tcompletionGuard?: boolean;\n\tsystemPrompt?: string | null;\n\tsystemPromptMode?: \"append\" | \"replace\";\n\tinheritProjectContext: boolean;\n\tinheritSkills: boolean;\n\tskills?: string[];\n\toutputPath?: string;\n\t/** Defer the authoritative output instruction until a dynamic fanout item is materialized. */\n\tnamespaceOutputPath?: boolean;\n\toutputMode?: \"inline\" | \"file-only\";\n\tsessionFile?: string;\n\tmaxSubagentDepth?: number;\n\twaitToolEnabled?: boolean;\n\tstructuredOutput?: {\n\t\tschema: import(\"../../shared/types.ts\").JsonSchemaObject;\n\t\tschemaPath: string;\n\t\toutputPath: string;\n\t};\n\tstructuredOutputSchema?: import(\"../../shared/types.ts\").JsonSchemaObject;\n\teffectiveAcceptance?: import(\"../../shared/types.ts\").ResolvedAcceptanceConfig;\n\tacceptanceInput?: import(\"../../shared/types.ts\").AcceptanceInput;\n\tacceptanceRole?: import(\"../../shared/types.ts\").AcceptanceRole;\n\ttoolBudget?: import(\"../../shared/types.ts\").ResolvedToolBudget;\n}\n\nexport interface ParallelStepGroup {\n\tparallel: RunnerSubagentStep[];\n\tconcurrency?: number;\n\tfailFast?: boolean;\n\tworktree?: boolean;\n}\n\nexport interface DynamicRunnerGroup {\n\texpand: import(\"../../shared/settings.ts\").DynamicExpandSpec;\n\tparallel: RunnerSubagentStep;\n\tcollect: import(\"../../shared/settings.ts\").DynamicCollectSpec;\n\tconcurrency?: number;\n\tfailFast?: boolean;\n\tphase?: string;\n\tlabel?: string;\n\tsessionFiles?: (string | undefined)[];\n\tthinkingOverrides?: (string | undefined)[];\n\teffectiveAcceptance?: import(\"../../shared/types.ts\").ResolvedAcceptanceConfig;\n\tacceptanceInput?: import(\"../../shared/types.ts\").AcceptanceInput;\n\tacceptanceRole?: import(\"../../shared/types.ts\").AcceptanceRole;\n}\n\nexport type RunnerStep = RunnerSubagentStep | ParallelStepGroup | DynamicRunnerGroup;\n\nexport function isParallelGroup(step: RunnerStep): step is ParallelStepGroup {\n\treturn \"parallel\" in step && Array.isArray(step.parallel);\n}\n\nexport function isDynamicRunnerGroup(step: RunnerStep): step is DynamicRunnerGroup {\n\treturn \"expand\" in step && \"collect\" in step && \"parallel\" in step && !Array.isArray((step as { parallel?: unknown }).parallel);\n}\n\nexport function flattenSteps(steps: RunnerStep[]): RunnerSubagentStep[] {\n\tconst flat: RunnerSubagentStep[] = [];\n\tfor (const step of steps) {\n\t\tif (isParallelGroup(step)) {\n\t\t\tfor (const task of step.parallel) flat.push(task);\n\t\t} else if (isDynamicRunnerGroup(step)) {\n\t\t\tcontinue;\n\t\t} else {\n\t\t\tflat.push(step);\n\t\t}\n\t}\n\treturn flat;\n}\n\nexport const DEFAULT_GLOBAL_CONCURRENCY_LIMIT = Number.MAX_SAFE_INTEGER;\n\n// lunr: stagger parallel cold starts so the first child's response begins\n// (creating the Anthropic cache entry) before siblings fire identical\n// system prompts. Sequential mode (limit=1) is untouched.\nconst PARALLEL_COLD_START_STAGGER_MS = 1000;\n\n/**\n * A promise-based semaphore for limiting concurrent access across multiple\n * mapConcurrent calls within a single run. Enforces a global cap on the total\n * number of subagent tasks executing simultaneously, regardless of each step's\n * per-step concurrency limit.\n */\nexport class Semaphore {\n\tprivate available: number;\n\tprivate readonly queue: Array<() => void> = [];\n\n\tconstructor(limit: number) {\n\t\tthis.available = Math.max(1, Math.floor(limit) || 1);\n\t}\n\n\tacquire(): Promise<void> {\n\t\tif (this.available > 0) {\n\t\t\tthis.available--;\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tthis.queue.push(resolve);\n\t\t});\n\t}\n\n\trelease(): void {\n\t\tconst next = this.queue.shift();\n\t\tif (next) {\n\t\t\tnext();\n\t\t} else {\n\t\t\tthis.available++;\n\t\t}\n\t}\n}\n\nexport async function mapConcurrent<T, R>(\n\titems: T[],\n\tlimit: number,\n\tfn: (item: T, i: number) => Promise<R>,\n\tglobalSemaphore?: Semaphore,\n): Promise<R[]> {\n\tconst safeLimit = Math.max(1, Math.floor(limit) || 1);\n\tconst results: R[] = new Array(items.length);\n\tlet next = 0;\n\n\tasync function worker(_workerIndex: number): Promise<void> {\n\t\twhile (next < items.length) {\n\t\t\tconst i = next++;\n\t\t\tif (safeLimit > 1 && i > 0 && PARALLEL_COLD_START_STAGGER_MS > 0) {\n\t\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\t\tsetTimeout(resolve, PARALLEL_COLD_START_STAGGER_MS * i);\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (globalSemaphore) {\n\t\t\t\tawait globalSemaphore.acquire();\n\t\t\t\ttry {\n\t\t\t\t\tresults[i] = await fn(items[i], i);\n\t\t\t\t} finally {\n\t\t\t\t\tglobalSemaphore.release();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresults[i] = await fn(items[i], i);\n\t\t\t}\n\t\t}\n\t}\n\n\tawait Promise.all(\n\t\tArray.from({ length: Math.min(safeLimit, items.length) }, (_, wi) => worker(wi)),\n\t);\n\treturn results;\n}\n\nexport interface ParallelTaskResult {\n\tagent: string;\n\ttaskIndex?: number;\n\toutput: string;\n\texitCode: number | null;\n\terror?: string;\n\ttimedOut?: boolean;\n\tmodel?: string;\n\tattemptedModels?: string[];\n\toutputTargetPath?: string;\n\toutputTargetExists?: boolean;\n}\n\nexport function aggregateParallelOutputs(\n\tresults: ParallelTaskResult[],\n\theaderFormat: (index: number, agent: string) => string = (i, agent) =>\n\t\t`=== Parallel Task ${i + 1} (${agent}) ===`,\n): string {\n\treturn results\n\t\t.map((r, i) => {\n\t\t\tconst header = headerFormat(r.taskIndex ?? i, r.agent);\n\t\t\tconst hasOutput = Boolean(r.output?.trim());\n\t\t\tconst status =\n\t\t\t\tr.timedOut\n\t\t\t\t\t? `TIMED OUT${r.error ? `: ${r.error}` : \"\"}`\n\t\t\t\t\t: r.exitCode === -1\n\t\t\t\t\t? \"SKIPPED\"\n\t\t\t\t\t: r.exitCode !== 0 && r.exitCode !== null\n\t\t\t\t\t\t? `FAILED (exit code ${r.exitCode})${r.error ? `: ${r.error}` : \"\"}`\n\t\t\t\t\t\t: r.error\n\t\t\t\t\t\t\t? `WARNING: ${r.error}`\n\t\t\t\t\t\t\t: !hasOutput && r.outputTargetPath && r.outputTargetExists === false\n\t\t\t\t\t\t\t\t? `EMPTY OUTPUT (expected output file missing: ${r.outputTargetPath})`\n\t\t\t\t\t\t\t\t: !hasOutput && !r.outputTargetPath\n\t\t\t\t\t\t\t\t\t? \"EMPTY OUTPUT (no textual response returned)\"\n\t\t\t\t\t\t\t: \"\";\n\t\t\tconst body = status ? (hasOutput ? `${status}\\n${r.output}` : status) : r.output;\n\t\t\treturn `${header}\\n${body}`;\n\t\t})\n\t\t.join(\"\\n\\n\");\n}\n\nexport const MAX_PARALLEL_CONCURRENCY = Number.MAX_SAFE_INTEGER;\n"]}
|
|
1
|
+
{"version":3,"file":"parallel-utils.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,kBAAkB;IAClC,oFAAoF;IACpF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,wDAAwD;IACxD,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;KACd,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;IAClC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gBAAgB,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IACxC,qBAAqB,EAAE,OAAO,CAAC;IAC/B,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8FAA8F;IAC9F,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,UAAU,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gBAAgB,CAAC,EAAE;QAClB,MAAM,EAAE,OAAO,uBAAuB,EAAE,gBAAgB,CAAC;QACzD,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,sBAAsB,CAAC,EAAE,OAAO,uBAAuB,EAAE,gBAAgB,CAAC;IAC1E,mBAAmB,CAAC,EAAE,OAAO,uBAAuB,EAAE,wBAAwB,CAAC;IAC/E,eAAe,CAAC,EAAE,OAAO,uBAAuB,EAAE,eAAe,CAAC;IAClE,cAAc,CAAC,EAAE,OAAO,uBAAuB,EAAE,cAAc,CAAC;IAChE,UAAU,CAAC,EAAE,OAAO,uBAAuB,EAAE,kBAAkB,CAAC;CAChE;AAED,MAAM,WAAW,iBAAiB;IACjC,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IAClC,MAAM,EAAE,OAAO,0BAA0B,EAAE,iBAAiB,CAAC;IAC7D,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,OAAO,EAAE,OAAO,0BAA0B,EAAE,kBAAkB,CAAC;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC;IACtC,iBAAiB,CAAC,EAAE,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC;IAC3C,mBAAmB,CAAC,EAAE,OAAO,uBAAuB,EAAE,wBAAwB,CAAC;IAC/E,eAAe,CAAC,EAAE,OAAO,uBAAuB,EAAE,eAAe,CAAC;IAClE,cAAc,CAAC,EAAE,OAAO,uBAAuB,EAAE,cAAc,CAAC;CAChE;AAED,MAAM,MAAM,UAAU,GAAG,kBAAkB,GAAG,iBAAiB,GAAG,kBAAkB,CAAC;AAErF,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,IAAI,iBAAiB,CAE3E;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,IAAI,kBAAkB,CAEjF;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,kBAAkB,EAAE,CAYtE;AAED,eAAO,MAAM,gCAAgC,QAA0B,CAAC;AAOxE;;;;;GAKG;AACH,qBAAa,SAAS;IACrB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyB;IAE/C,YAAY,KAAK,EAAE,MAAM,EAExB;IAED,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAQvB;IAED,OAAO,IAAI,IAAI,CAOd;CACD;AAED,wBAAsB,aAAa,CAAC,CAAC,EAAE,CAAC,EACvC,KAAK,EAAE,CAAC,EAAE,EACV,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EACtC,eAAe,CAAC,EAAE,SAAS,GACzB,OAAO,CAAC,CAAC,EAAE,CAAC,CA8Bd;AAED,MAAM,WAAW,kBAAkB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,wBAAgB,wBAAwB,CACvC,OAAO,EAAE,kBAAkB,EAAE,EAC7B,YAAY,GAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MACJ,GAC1C,MAAM,CAuBR;AAED,eAAO,MAAM,wBAAwB,QAA0B,CAAC","sourcesContent":["// @ts-nocheck\nexport interface RunnerSubagentStep {\n\t/** Session id of the direct parent session for permission-system ask forwarding. */\n\tparentSessionId?: string;\n\t/** Live parent permission mode snapshotted at spawn. */\n\tparentPermissionMode?: string;\n\tagent?: string;\n\tchildId?: string;\n\tdescription?: string;\n\tpermissions?: \"full\" | \"read-only\";\n\ttask: string;\n\timportAsyncRoot?: {\n\t\trunId: string;\n\t\tasyncDir: string;\n\t\tresultPath: string;\n\t\tindex: number;\n\t};\n\tphase?: string;\n\tlabel?: string;\n\toutputName?: string;\n\tstructured?: boolean;\n\tcwd?: string;\n\tmodel?: string;\n\tthinking?: string;\n\tmodelCandidates?: string[];\n\ttools?: string[];\n\textensions?: string[];\n\tsubagentOnlyExtensions?: string[];\n\tmcpDirectTools?: string[];\n\tcompletionGuard?: boolean;\n\tsystemPrompt?: string | null;\n\tsystemPromptMode?: \"append\" | \"replace\";\n\tinheritProjectContext: boolean;\n\tinheritSkills: boolean;\n\tskills?: string[];\n\toutputPath?: string;\n\t/** Defer the authoritative output instruction until a dynamic fanout item is materialized. */\n\tnamespaceOutputPath?: boolean;\n\toutputMode?: \"inline\" | \"file-only\";\n\tsessionFile?: string;\n\tmaxSubagentDepth?: number;\n\twaitToolEnabled?: boolean;\n\tstructuredOutput?: {\n\t\tschema: import(\"../../shared/types.ts\").JsonSchemaObject;\n\t\tschemaPath: string;\n\t\toutputPath: string;\n\t};\n\tstructuredOutputSchema?: import(\"../../shared/types.ts\").JsonSchemaObject;\n\teffectiveAcceptance?: import(\"../../shared/types.ts\").ResolvedAcceptanceConfig;\n\tacceptanceInput?: import(\"../../shared/types.ts\").AcceptanceInput;\n\tacceptanceRole?: import(\"../../shared/types.ts\").AcceptanceRole;\n\ttoolBudget?: import(\"../../shared/types.ts\").ResolvedToolBudget;\n}\n\nexport interface ParallelStepGroup {\n\tparallel: RunnerSubagentStep[];\n\tconcurrency?: number;\n\tfailFast?: boolean;\n\tworktree?: boolean;\n}\n\nexport interface DynamicRunnerGroup {\n\texpand: import(\"../../shared/settings.ts\").DynamicExpandSpec;\n\tparallel: RunnerSubagentStep;\n\tcollect: import(\"../../shared/settings.ts\").DynamicCollectSpec;\n\tconcurrency?: number;\n\tfailFast?: boolean;\n\tphase?: string;\n\tlabel?: string;\n\tsessionFiles?: (string | undefined)[];\n\tthinkingOverrides?: (string | undefined)[];\n\teffectiveAcceptance?: import(\"../../shared/types.ts\").ResolvedAcceptanceConfig;\n\tacceptanceInput?: import(\"../../shared/types.ts\").AcceptanceInput;\n\tacceptanceRole?: import(\"../../shared/types.ts\").AcceptanceRole;\n}\n\nexport type RunnerStep = RunnerSubagentStep | ParallelStepGroup | DynamicRunnerGroup;\n\nexport function isParallelGroup(step: RunnerStep): step is ParallelStepGroup {\n\treturn \"parallel\" in step && Array.isArray(step.parallel);\n}\n\nexport function isDynamicRunnerGroup(step: RunnerStep): step is DynamicRunnerGroup {\n\treturn \"expand\" in step && \"collect\" in step && \"parallel\" in step && !Array.isArray((step as { parallel?: unknown }).parallel);\n}\n\nexport function flattenSteps(steps: RunnerStep[]): RunnerSubagentStep[] {\n\tconst flat: RunnerSubagentStep[] = [];\n\tfor (const step of steps) {\n\t\tif (isParallelGroup(step)) {\n\t\t\tfor (const task of step.parallel) flat.push(task);\n\t\t} else if (isDynamicRunnerGroup(step)) {\n\t\t\tcontinue;\n\t\t} else {\n\t\t\tflat.push(step);\n\t\t}\n\t}\n\treturn flat;\n}\n\nexport const DEFAULT_GLOBAL_CONCURRENCY_LIMIT = Number.MAX_SAFE_INTEGER;\n\n// lunr: stagger parallel cold starts so the first child's response begins\n// (creating the Anthropic cache entry) before siblings fire identical\n// system prompts. Sequential mode (limit=1) is untouched.\nconst PARALLEL_COLD_START_STAGGER_MS = 1000;\n\n/**\n * A promise-based semaphore for limiting concurrent access across multiple\n * mapConcurrent calls within a single run. Enforces a global cap on the total\n * number of subagent tasks executing simultaneously, regardless of each step's\n * per-step concurrency limit.\n */\nexport class Semaphore {\n\tprivate available: number;\n\tprivate readonly queue: Array<() => void> = [];\n\n\tconstructor(limit: number) {\n\t\tthis.available = Math.max(1, Math.floor(limit) || 1);\n\t}\n\n\tacquire(): Promise<void> {\n\t\tif (this.available > 0) {\n\t\t\tthis.available--;\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tthis.queue.push(resolve);\n\t\t});\n\t}\n\n\trelease(): void {\n\t\tconst next = this.queue.shift();\n\t\tif (next) {\n\t\t\tnext();\n\t\t} else {\n\t\t\tthis.available++;\n\t\t}\n\t}\n}\n\nexport async function mapConcurrent<T, R>(\n\titems: T[],\n\tlimit: number,\n\tfn: (item: T, i: number) => Promise<R>,\n\tglobalSemaphore?: Semaphore,\n): Promise<R[]> {\n\tconst safeLimit = Math.max(1, Math.floor(limit) || 1);\n\tconst results: R[] = new Array(items.length);\n\tlet next = 0;\n\n\tasync function worker(_workerIndex: number): Promise<void> {\n\t\twhile (next < items.length) {\n\t\t\tconst i = next++;\n\t\t\tif (safeLimit > 1 && i > 0 && PARALLEL_COLD_START_STAGGER_MS > 0) {\n\t\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\t\tsetTimeout(resolve, PARALLEL_COLD_START_STAGGER_MS * i);\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (globalSemaphore) {\n\t\t\t\tawait globalSemaphore.acquire();\n\t\t\t\ttry {\n\t\t\t\t\tresults[i] = await fn(items[i], i);\n\t\t\t\t} finally {\n\t\t\t\t\tglobalSemaphore.release();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresults[i] = await fn(items[i], i);\n\t\t\t}\n\t\t}\n\t}\n\n\tawait Promise.all(\n\t\tArray.from({ length: Math.min(safeLimit, items.length) }, (_, wi) => worker(wi)),\n\t);\n\treturn results;\n}\n\nexport interface ParallelTaskResult {\n\tagent: string;\n\ttaskIndex?: number;\n\toutput: string;\n\texitCode: number | null;\n\terror?: string;\n\ttimedOut?: boolean;\n\tmodel?: string;\n\tattemptedModels?: string[];\n\toutputTargetPath?: string;\n\toutputTargetExists?: boolean;\n}\n\nexport function aggregateParallelOutputs(\n\tresults: ParallelTaskResult[],\n\theaderFormat: (index: number, agent: string) => string = (i, agent) =>\n\t\t`=== Parallel Task ${i + 1} (${agent}) ===`,\n): string {\n\treturn results\n\t\t.map((r, i) => {\n\t\t\tconst header = headerFormat(r.taskIndex ?? i, r.agent);\n\t\t\tconst hasOutput = Boolean(r.output?.trim());\n\t\t\tconst status =\n\t\t\t\tr.timedOut\n\t\t\t\t\t? `TIMED OUT${r.error ? `: ${r.error}` : \"\"}`\n\t\t\t\t\t: r.exitCode === -1\n\t\t\t\t\t? \"SKIPPED\"\n\t\t\t\t\t: r.exitCode !== 0 && r.exitCode !== null\n\t\t\t\t\t\t? `FAILED (exit code ${r.exitCode})${r.error ? `: ${r.error}` : \"\"}`\n\t\t\t\t\t\t: r.error\n\t\t\t\t\t\t\t? `WARNING: ${r.error}`\n\t\t\t\t\t\t\t: !hasOutput && r.outputTargetPath && r.outputTargetExists === false\n\t\t\t\t\t\t\t\t? `EMPTY OUTPUT (expected output file missing: ${r.outputTargetPath})`\n\t\t\t\t\t\t\t\t: !hasOutput && !r.outputTargetPath\n\t\t\t\t\t\t\t\t\t? \"EMPTY OUTPUT (no textual response returned)\"\n\t\t\t\t\t\t\t: \"\";\n\t\t\tconst body = status ? (hasOutput ? `${status}\\n${r.output}` : status) : r.output;\n\t\t\treturn `${header}\\n${body}`;\n\t\t})\n\t\t.join(\"\\n\\n\");\n}\n\nexport const MAX_PARALLEL_CONCURRENCY = Number.MAX_SAFE_INTEGER;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parallel-utils.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nexport interface RunnerSubagentStep {\n\t/** Session id of the direct parent session for permission-system ask forwarding. */\n\tparentSessionId?: string;\n\t/** Live parent permission mode snapshotted at spawn. */\n\tparentPermissionMode?: string;\n\tagent: string;\n\ttask: string;\n\timportAsyncRoot?: {\n\t\trunId: string;\n\t\tasyncDir: string;\n\t\tresultPath: string;\n\t\tindex: number;\n\t};\n\tphase?: string;\n\tlabel?: string;\n\toutputName?: string;\n\tstructured?: boolean;\n\tcwd?: string;\n\tmodel?: string;\n\tthinking?: string;\n\tmodelCandidates?: string[];\n\ttools?: string[];\n\textensions?: string[];\n\tsubagentOnlyExtensions?: string[];\n\tmcpDirectTools?: string[];\n\tcompletionGuard?: boolean;\n\tsystemPrompt?: string | null;\n\tsystemPromptMode?: \"append\" | \"replace\";\n\tinheritProjectContext: boolean;\n\tinheritSkills: boolean;\n\tskills?: string[];\n\toutputPath?: string;\n\t/** Defer the authoritative output instruction until a dynamic fanout item is materialized. */\n\tnamespaceOutputPath?: boolean;\n\toutputMode?: \"inline\" | \"file-only\";\n\tsessionFile?: string;\n\tmaxSubagentDepth?: number;\n\twaitToolEnabled?: boolean;\n\tstructuredOutput?: {\n\t\tschema: import(\"../../shared/types.ts\").JsonSchemaObject;\n\t\tschemaPath: string;\n\t\toutputPath: string;\n\t};\n\tstructuredOutputSchema?: import(\"../../shared/types.ts\").JsonSchemaObject;\n\teffectiveAcceptance?: import(\"../../shared/types.ts\").ResolvedAcceptanceConfig;\n\tacceptanceInput?: import(\"../../shared/types.ts\").AcceptanceInput;\n\tacceptanceRole?: import(\"../../shared/types.ts\").AcceptanceRole;\n\ttoolBudget?: import(\"../../shared/types.ts\").ResolvedToolBudget;\n}\n\nexport interface ParallelStepGroup {\n\tparallel: RunnerSubagentStep[];\n\tconcurrency?: number;\n\tfailFast?: boolean;\n\tworktree?: boolean;\n}\n\nexport interface DynamicRunnerGroup {\n\texpand: import(\"../../shared/settings.ts\").DynamicExpandSpec;\n\tparallel: RunnerSubagentStep;\n\tcollect: import(\"../../shared/settings.ts\").DynamicCollectSpec;\n\tconcurrency?: number;\n\tfailFast?: boolean;\n\tphase?: string;\n\tlabel?: string;\n\tsessionFiles?: (string | undefined)[];\n\tthinkingOverrides?: (string | undefined)[];\n\teffectiveAcceptance?: import(\"../../shared/types.ts\").ResolvedAcceptanceConfig;\n\tacceptanceInput?: import(\"../../shared/types.ts\").AcceptanceInput;\n\tacceptanceRole?: import(\"../../shared/types.ts\").AcceptanceRole;\n}\n\nexport type RunnerStep = RunnerSubagentStep | ParallelStepGroup | DynamicRunnerGroup;\n\nexport function isParallelGroup(step: RunnerStep): step is ParallelStepGroup {\n\treturn \"parallel\" in step && Array.isArray(step.parallel);\n}\n\nexport function isDynamicRunnerGroup(step: RunnerStep): step is DynamicRunnerGroup {\n\treturn \"expand\" in step && \"collect\" in step && \"parallel\" in step && !Array.isArray((step as { parallel?: unknown }).parallel);\n}\n\nexport function flattenSteps(steps: RunnerStep[]): RunnerSubagentStep[] {\n\tconst flat: RunnerSubagentStep[] = [];\n\tfor (const step of steps) {\n\t\tif (isParallelGroup(step)) {\n\t\t\tfor (const task of step.parallel) flat.push(task);\n\t\t} else if (isDynamicRunnerGroup(step)) {\n\t\t\tcontinue;\n\t\t} else {\n\t\t\tflat.push(step);\n\t\t}\n\t}\n\treturn flat;\n}\n\nexport const DEFAULT_GLOBAL_CONCURRENCY_LIMIT = Number.MAX_SAFE_INTEGER;\n\n// lunr: stagger parallel cold starts so the first child's response begins\n// (creating the Anthropic cache entry) before siblings fire identical\n// system prompts. Sequential mode (limit=1) is untouched.\nconst PARALLEL_COLD_START_STAGGER_MS = 1000;\n\n/**\n * A promise-based semaphore for limiting concurrent access across multiple\n * mapConcurrent calls within a single run. Enforces a global cap on the total\n * number of subagent tasks executing simultaneously, regardless of each step's\n * per-step concurrency limit.\n */\nexport class Semaphore {\n\tprivate available: number;\n\tprivate readonly queue: Array<() => void> = [];\n\n\tconstructor(limit: number) {\n\t\tthis.available = Math.max(1, Math.floor(limit) || 1);\n\t}\n\n\tacquire(): Promise<void> {\n\t\tif (this.available > 0) {\n\t\t\tthis.available--;\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tthis.queue.push(resolve);\n\t\t});\n\t}\n\n\trelease(): void {\n\t\tconst next = this.queue.shift();\n\t\tif (next) {\n\t\t\tnext();\n\t\t} else {\n\t\t\tthis.available++;\n\t\t}\n\t}\n}\n\nexport async function mapConcurrent<T, R>(\n\titems: T[],\n\tlimit: number,\n\tfn: (item: T, i: number) => Promise<R>,\n\tglobalSemaphore?: Semaphore,\n): Promise<R[]> {\n\tconst safeLimit = Math.max(1, Math.floor(limit) || 1);\n\tconst results: R[] = new Array(items.length);\n\tlet next = 0;\n\n\tasync function worker(_workerIndex: number): Promise<void> {\n\t\twhile (next < items.length) {\n\t\t\tconst i = next++;\n\t\t\tif (safeLimit > 1 && i > 0 && PARALLEL_COLD_START_STAGGER_MS > 0) {\n\t\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\t\tsetTimeout(resolve, PARALLEL_COLD_START_STAGGER_MS * i);\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (globalSemaphore) {\n\t\t\t\tawait globalSemaphore.acquire();\n\t\t\t\ttry {\n\t\t\t\t\tresults[i] = await fn(items[i], i);\n\t\t\t\t} finally {\n\t\t\t\t\tglobalSemaphore.release();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresults[i] = await fn(items[i], i);\n\t\t\t}\n\t\t}\n\t}\n\n\tawait Promise.all(\n\t\tArray.from({ length: Math.min(safeLimit, items.length) }, (_, wi) => worker(wi)),\n\t);\n\treturn results;\n}\n\nexport interface ParallelTaskResult {\n\tagent: string;\n\ttaskIndex?: number;\n\toutput: string;\n\texitCode: number | null;\n\terror?: string;\n\ttimedOut?: boolean;\n\tmodel?: string;\n\tattemptedModels?: string[];\n\toutputTargetPath?: string;\n\toutputTargetExists?: boolean;\n}\n\nexport function aggregateParallelOutputs(\n\tresults: ParallelTaskResult[],\n\theaderFormat: (index: number, agent: string) => string = (i, agent) =>\n\t\t`=== Parallel Task ${i + 1} (${agent}) ===`,\n): string {\n\treturn results\n\t\t.map((r, i) => {\n\t\t\tconst header = headerFormat(r.taskIndex ?? i, r.agent);\n\t\t\tconst hasOutput = Boolean(r.output?.trim());\n\t\t\tconst status =\n\t\t\t\tr.timedOut\n\t\t\t\t\t? `TIMED OUT${r.error ? `: ${r.error}` : \"\"}`\n\t\t\t\t\t: r.exitCode === -1\n\t\t\t\t\t? \"SKIPPED\"\n\t\t\t\t\t: r.exitCode !== 0 && r.exitCode !== null\n\t\t\t\t\t\t? `FAILED (exit code ${r.exitCode})${r.error ? `: ${r.error}` : \"\"}`\n\t\t\t\t\t\t: r.error\n\t\t\t\t\t\t\t? `WARNING: ${r.error}`\n\t\t\t\t\t\t\t: !hasOutput && r.outputTargetPath && r.outputTargetExists === false\n\t\t\t\t\t\t\t\t? `EMPTY OUTPUT (expected output file missing: ${r.outputTargetPath})`\n\t\t\t\t\t\t\t\t: !hasOutput && !r.outputTargetPath\n\t\t\t\t\t\t\t\t\t? \"EMPTY OUTPUT (no textual response returned)\"\n\t\t\t\t\t\t\t: \"\";\n\t\t\tconst body = status ? (hasOutput ? `${status}\\n${r.output}` : status) : r.output;\n\t\t\treturn `${header}\\n${body}`;\n\t\t})\n\t\t.join(\"\\n\\n\");\n}\n\nexport const MAX_PARALLEL_CONCURRENCY = Number.MAX_SAFE_INTEGER;\n"]}
|
|
1
|
+
{"version":3,"file":"parallel-utils.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.ts"],"names":[],"mappings":"AA8EA,MAAM,UAAU,eAAe,CAAC,IAAgB,EAA6B;IAC5E,OAAO,UAAU,IAAI,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AAAA,CAC1D;AAED,MAAM,UAAU,oBAAoB,CAAC,IAAgB,EAA8B;IAClF,OAAO,QAAQ,IAAI,IAAI,IAAI,SAAS,IAAI,IAAI,IAAI,UAAU,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAE,IAA+B,CAAC,QAAQ,CAAC,CAAC;AAAA,CAChI;AAED,MAAM,UAAU,YAAY,CAAC,KAAmB,EAAwB;IACvE,MAAM,IAAI,GAAyB,EAAE,CAAC;IACtC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC1B,IAAI,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,QAAQ;gBAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,CAAC;aAAM,IAAI,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;YACvC,SAAS;QACV,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,CAAC;IACF,CAAC;IACD,OAAO,IAAI,CAAC;AAAA,CACZ;AAED,MAAM,CAAC,MAAM,gCAAgC,GAAG,MAAM,CAAC,gBAAgB,CAAC;AAExE,0EAA0E;AAC1E,sEAAsE;AACtE,0DAA0D;AAC1D,MAAM,8BAA8B,GAAG,IAAI,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,OAAO,SAAS;IACb,SAAS,CAAS;IACT,KAAK,GAAsB,EAAE,CAAC;IAE/C,YAAY,KAAa,EAAE;QAC1B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IAAA,CACrD;IAED,OAAO,GAAkB;QACxB,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;YACxB,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC1B,CAAC;QACD,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC;YACrC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAAA,CACzB,CAAC,CAAC;IAAA,CACH;IAED,OAAO,GAAS;QACf,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,IAAI,EAAE,CAAC;YACV,IAAI,EAAE,CAAC;QACR,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,SAAS,EAAE,CAAC;QAClB,CAAC;IAAA,CACD;CACD;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAClC,KAAU,EACV,KAAa,EACb,EAAsC,EACtC,eAA2B,EACZ;IACf,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;IACtD,MAAM,OAAO,GAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC7C,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,KAAK,UAAU,MAAM,CAAC,YAAoB,EAAiB;QAC1D,OAAO,IAAI,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;YAC5B,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;YACjB,IAAI,SAAS,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,8BAA8B,GAAG,CAAC,EAAE,CAAC;gBAClE,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE,CAAC;oBACpC,UAAU,CAAC,OAAO,EAAE,8BAA8B,GAAG,CAAC,CAAC,CAAC;gBAAA,CACxD,CAAC,CAAC;YACJ,CAAC;YACD,IAAI,eAAe,EAAE,CAAC;gBACrB,MAAM,eAAe,CAAC,OAAO,EAAE,CAAC;gBAChC,IAAI,CAAC;oBACJ,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACpC,CAAC;wBAAS,CAAC;oBACV,eAAe,CAAC,OAAO,EAAE,CAAC;gBAC3B,CAAC;YACF,CAAC;iBAAM,CAAC;gBACP,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACpC,CAAC;QACF,CAAC;IAAA,CACD;IAED,MAAM,OAAO,CAAC,GAAG,CAChB,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAChF,CAAC;IACF,OAAO,OAAO,CAAC;AAAA,CACf;AAeD,MAAM,UAAU,wBAAwB,CACvC,OAA6B,EAC7B,YAAY,GAA6C,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,CACrE,qBAAqB,CAAC,GAAG,CAAC,KAAK,KAAK,OAAO,EACnC;IACT,OAAO,OAAO;SACZ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;QACvD,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,MAAM,MAAM,GACX,CAAC,CAAC,QAAQ;YACT,CAAC,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;YAC7C,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC;gBACnB,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAK,IAAI;oBACxC,CAAC,CAAC,qBAAqB,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;oBACpE,CAAC,CAAC,CAAC,CAAC,KAAK;wBACR,CAAC,CAAC,YAAY,CAAC,CAAC,KAAK,EAAE;wBACvB,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,gBAAgB,IAAI,CAAC,CAAC,kBAAkB,KAAK,KAAK;4BACnE,CAAC,CAAC,+CAA+C,CAAC,CAAC,gBAAgB,GAAG;4BACtE,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,gBAAgB;gCAClC,CAAC,CAAC,6CAA6C;gCACjD,CAAC,CAAC,EAAE,CAAC;QACT,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,MAAM,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACjF,OAAO,GAAG,MAAM,KAAK,IAAI,EAAE,CAAC;IAAA,CAC5B,CAAC;SACD,IAAI,CAAC,MAAM,CAAC,CAAC;AAAA,CACf;AAED,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAC,gBAAgB,CAAC","sourcesContent":["// @ts-nocheck\nexport interface RunnerSubagentStep {\n\t/** Session id of the direct parent session for permission-system ask forwarding. */\n\tparentSessionId?: string;\n\t/** Live parent permission mode snapshotted at spawn. */\n\tparentPermissionMode?: string;\n\tagent?: string;\n\tchildId?: string;\n\tdescription?: string;\n\tpermissions?: \"full\" | \"read-only\";\n\ttask: string;\n\timportAsyncRoot?: {\n\t\trunId: string;\n\t\tasyncDir: string;\n\t\tresultPath: string;\n\t\tindex: number;\n\t};\n\tphase?: string;\n\tlabel?: string;\n\toutputName?: string;\n\tstructured?: boolean;\n\tcwd?: string;\n\tmodel?: string;\n\tthinking?: string;\n\tmodelCandidates?: string[];\n\ttools?: string[];\n\textensions?: string[];\n\tsubagentOnlyExtensions?: string[];\n\tmcpDirectTools?: string[];\n\tcompletionGuard?: boolean;\n\tsystemPrompt?: string | null;\n\tsystemPromptMode?: \"append\" | \"replace\";\n\tinheritProjectContext: boolean;\n\tinheritSkills: boolean;\n\tskills?: string[];\n\toutputPath?: string;\n\t/** Defer the authoritative output instruction until a dynamic fanout item is materialized. */\n\tnamespaceOutputPath?: boolean;\n\toutputMode?: \"inline\" | \"file-only\";\n\tsessionFile?: string;\n\tmaxSubagentDepth?: number;\n\twaitToolEnabled?: boolean;\n\tstructuredOutput?: {\n\t\tschema: import(\"../../shared/types.ts\").JsonSchemaObject;\n\t\tschemaPath: string;\n\t\toutputPath: string;\n\t};\n\tstructuredOutputSchema?: import(\"../../shared/types.ts\").JsonSchemaObject;\n\teffectiveAcceptance?: import(\"../../shared/types.ts\").ResolvedAcceptanceConfig;\n\tacceptanceInput?: import(\"../../shared/types.ts\").AcceptanceInput;\n\tacceptanceRole?: import(\"../../shared/types.ts\").AcceptanceRole;\n\ttoolBudget?: import(\"../../shared/types.ts\").ResolvedToolBudget;\n}\n\nexport interface ParallelStepGroup {\n\tparallel: RunnerSubagentStep[];\n\tconcurrency?: number;\n\tfailFast?: boolean;\n\tworktree?: boolean;\n}\n\nexport interface DynamicRunnerGroup {\n\texpand: import(\"../../shared/settings.ts\").DynamicExpandSpec;\n\tparallel: RunnerSubagentStep;\n\tcollect: import(\"../../shared/settings.ts\").DynamicCollectSpec;\n\tconcurrency?: number;\n\tfailFast?: boolean;\n\tphase?: string;\n\tlabel?: string;\n\tsessionFiles?: (string | undefined)[];\n\tthinkingOverrides?: (string | undefined)[];\n\teffectiveAcceptance?: import(\"../../shared/types.ts\").ResolvedAcceptanceConfig;\n\tacceptanceInput?: import(\"../../shared/types.ts\").AcceptanceInput;\n\tacceptanceRole?: import(\"../../shared/types.ts\").AcceptanceRole;\n}\n\nexport type RunnerStep = RunnerSubagentStep | ParallelStepGroup | DynamicRunnerGroup;\n\nexport function isParallelGroup(step: RunnerStep): step is ParallelStepGroup {\n\treturn \"parallel\" in step && Array.isArray(step.parallel);\n}\n\nexport function isDynamicRunnerGroup(step: RunnerStep): step is DynamicRunnerGroup {\n\treturn \"expand\" in step && \"collect\" in step && \"parallel\" in step && !Array.isArray((step as { parallel?: unknown }).parallel);\n}\n\nexport function flattenSteps(steps: RunnerStep[]): RunnerSubagentStep[] {\n\tconst flat: RunnerSubagentStep[] = [];\n\tfor (const step of steps) {\n\t\tif (isParallelGroup(step)) {\n\t\t\tfor (const task of step.parallel) flat.push(task);\n\t\t} else if (isDynamicRunnerGroup(step)) {\n\t\t\tcontinue;\n\t\t} else {\n\t\t\tflat.push(step);\n\t\t}\n\t}\n\treturn flat;\n}\n\nexport const DEFAULT_GLOBAL_CONCURRENCY_LIMIT = Number.MAX_SAFE_INTEGER;\n\n// lunr: stagger parallel cold starts so the first child's response begins\n// (creating the Anthropic cache entry) before siblings fire identical\n// system prompts. Sequential mode (limit=1) is untouched.\nconst PARALLEL_COLD_START_STAGGER_MS = 1000;\n\n/**\n * A promise-based semaphore for limiting concurrent access across multiple\n * mapConcurrent calls within a single run. Enforces a global cap on the total\n * number of subagent tasks executing simultaneously, regardless of each step's\n * per-step concurrency limit.\n */\nexport class Semaphore {\n\tprivate available: number;\n\tprivate readonly queue: Array<() => void> = [];\n\n\tconstructor(limit: number) {\n\t\tthis.available = Math.max(1, Math.floor(limit) || 1);\n\t}\n\n\tacquire(): Promise<void> {\n\t\tif (this.available > 0) {\n\t\t\tthis.available--;\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tthis.queue.push(resolve);\n\t\t});\n\t}\n\n\trelease(): void {\n\t\tconst next = this.queue.shift();\n\t\tif (next) {\n\t\t\tnext();\n\t\t} else {\n\t\t\tthis.available++;\n\t\t}\n\t}\n}\n\nexport async function mapConcurrent<T, R>(\n\titems: T[],\n\tlimit: number,\n\tfn: (item: T, i: number) => Promise<R>,\n\tglobalSemaphore?: Semaphore,\n): Promise<R[]> {\n\tconst safeLimit = Math.max(1, Math.floor(limit) || 1);\n\tconst results: R[] = new Array(items.length);\n\tlet next = 0;\n\n\tasync function worker(_workerIndex: number): Promise<void> {\n\t\twhile (next < items.length) {\n\t\t\tconst i = next++;\n\t\t\tif (safeLimit > 1 && i > 0 && PARALLEL_COLD_START_STAGGER_MS > 0) {\n\t\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\t\tsetTimeout(resolve, PARALLEL_COLD_START_STAGGER_MS * i);\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (globalSemaphore) {\n\t\t\t\tawait globalSemaphore.acquire();\n\t\t\t\ttry {\n\t\t\t\t\tresults[i] = await fn(items[i], i);\n\t\t\t\t} finally {\n\t\t\t\t\tglobalSemaphore.release();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresults[i] = await fn(items[i], i);\n\t\t\t}\n\t\t}\n\t}\n\n\tawait Promise.all(\n\t\tArray.from({ length: Math.min(safeLimit, items.length) }, (_, wi) => worker(wi)),\n\t);\n\treturn results;\n}\n\nexport interface ParallelTaskResult {\n\tagent: string;\n\ttaskIndex?: number;\n\toutput: string;\n\texitCode: number | null;\n\terror?: string;\n\ttimedOut?: boolean;\n\tmodel?: string;\n\tattemptedModels?: string[];\n\toutputTargetPath?: string;\n\toutputTargetExists?: boolean;\n}\n\nexport function aggregateParallelOutputs(\n\tresults: ParallelTaskResult[],\n\theaderFormat: (index: number, agent: string) => string = (i, agent) =>\n\t\t`=== Parallel Task ${i + 1} (${agent}) ===`,\n): string {\n\treturn results\n\t\t.map((r, i) => {\n\t\t\tconst header = headerFormat(r.taskIndex ?? i, r.agent);\n\t\t\tconst hasOutput = Boolean(r.output?.trim());\n\t\t\tconst status =\n\t\t\t\tr.timedOut\n\t\t\t\t\t? `TIMED OUT${r.error ? `: ${r.error}` : \"\"}`\n\t\t\t\t\t: r.exitCode === -1\n\t\t\t\t\t? \"SKIPPED\"\n\t\t\t\t\t: r.exitCode !== 0 && r.exitCode !== null\n\t\t\t\t\t\t? `FAILED (exit code ${r.exitCode})${r.error ? `: ${r.error}` : \"\"}`\n\t\t\t\t\t\t: r.error\n\t\t\t\t\t\t\t? `WARNING: ${r.error}`\n\t\t\t\t\t\t\t: !hasOutput && r.outputTargetPath && r.outputTargetExists === false\n\t\t\t\t\t\t\t\t? `EMPTY OUTPUT (expected output file missing: ${r.outputTargetPath})`\n\t\t\t\t\t\t\t\t: !hasOutput && !r.outputTargetPath\n\t\t\t\t\t\t\t\t\t? \"EMPTY OUTPUT (no textual response returned)\"\n\t\t\t\t\t\t\t: \"\";\n\t\t\tconst body = status ? (hasOutput ? `${status}\\n${r.output}` : status) : r.output;\n\t\t\treturn `${header}\\n${body}`;\n\t\t})\n\t\t.join(\"\\n\\n\");\n}\n\nexport const MAX_PARALLEL_CONCURRENCY = Number.MAX_SAFE_INTEGER;\n"]}
|
|
@@ -19,6 +19,7 @@ export declare const SUBAGENT_PARENT_PATH_ENV = "PI_SUBAGENT_PARENT_PATH";
|
|
|
19
19
|
export declare const SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV = "PI_SUBAGENT_PARENT_CAPABILITY_TOKEN";
|
|
20
20
|
export declare const SUBAGENT_PARENT_SESSION_ENV = "PI_SUBAGENT_PARENT_SESSION";
|
|
21
21
|
export declare const SUBAGENT_PARENT_PERMISSION_MODE_ENV = "PI_SUBAGENT_PARENT_PERMISSION_MODE";
|
|
22
|
+
export declare const SUBAGENT_CHILD_PERMISSION_ENV = "PI_SUBAGENT_CHILD_PERMISSION";
|
|
22
23
|
export declare const SUBAGENT_STEER_INBOX_ENV = "PI_SUBAGENT_STEER_INBOX";
|
|
23
24
|
export declare const SUBAGENT_STEER_CAPABILITY_ENV = "PI_SUBAGENT_STEER_CAPABILITY";
|
|
24
25
|
export declare const SUBAGENT_STEER_ACK_DIR_ENV = "PI_SUBAGENT_STEER_ACK_DIR";
|
|
@@ -67,6 +68,10 @@ interface BuildPiArgsInput {
|
|
|
67
68
|
childWatchdog?: ChildWatchdogConfig;
|
|
68
69
|
waitToolEnabled?: boolean;
|
|
69
70
|
parentPermissionMode?: string;
|
|
71
|
+
childPermission?: "full" | "read-only";
|
|
72
|
+
excludeTools?: string[];
|
|
73
|
+
childId?: string;
|
|
74
|
+
childDescription?: string;
|
|
70
75
|
}
|
|
71
76
|
interface BuildPiArgsResult {
|
|
72
77
|
args: string[];
|