@ashx-j/lunr 0.2.11 → 0.2.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +13 -0
- package/README.md +211 -236
- package/dist/builtin-extensions/ashxj-tui.d.ts +3 -0
- package/dist/builtin-extensions/ashxj-tui.d.ts.map +1 -1
- package/dist/builtin-extensions/ashxj-tui.js +28 -11
- package/dist/builtin-extensions/ashxj-tui.js.map +1 -1
- package/dist/builtin-extensions/index.d.ts.map +1 -1
- package/dist/builtin-extensions/index.js +0 -2
- package/dist/builtin-extensions/index.js.map +1 -1
- package/dist/builtin-extensions/lunr-cron.d.ts +1 -1
- package/dist/builtin-extensions/lunr-cron.d.ts.map +1 -1
- package/dist/builtin-extensions/lunr-cron.js +1 -1
- package/dist/builtin-extensions/lunr-cron.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/chain-validation.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/chain-validation.js +3 -3
- package/dist/builtin-extensions/pi-subagents/src/extension/chain-validation.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/doctor.d.ts +0 -2
- package/dist/builtin-extensions/pi-subagents/src/extension/doctor.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/doctor.js +1 -23
- package/dist/builtin-extensions/pi-subagents/src/extension/doctor.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.js +6 -7
- package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/index.js +7 -14
- package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.d.ts +12 -9
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js +38 -34
- package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts +3 -3
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js +32 -47
- package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts +7 -10
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js +90 -109
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.d.ts +3 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.js +37 -50
- package/dist/builtin-extensions/pi-subagents/src/runs/background/async-resume.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.js +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/run-status.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.d.ts +4 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.js +5 -5
- package/dist/builtin-extensions/pi-subagents/src/runs/background/scheduled-runs.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js +31 -13
- package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-clarify.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts +4 -3
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js +48 -20
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +90 -64
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts +6 -8
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +262 -161
- package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.d.ts +2 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.js +24 -33
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/acceptance.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.d.ts +25 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.d.ts.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.js +51 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.js.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/dynamic-fanout.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/dynamic-fanout.js +20 -3
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/dynamic-fanout.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts +4 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.d.ts +5 -0
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.js +9 -3
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.js +2 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.js +20 -17
- package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.d.ts +70 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.d.ts.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.js +153 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/child-spec.js.map +1 -0
- package/dist/builtin-extensions/pi-subagents/src/shared/settings.d.ts +13 -8
- package/dist/builtin-extensions/pi-subagents/src/shared/settings.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/settings.js +20 -51
- package/dist/builtin-extensions/pi-subagents/src/shared/settings.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +80 -20
- package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/shared/types.js +10 -2
- package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts +2 -2
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js +20 -32
- package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts +2 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js +23 -449
- package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +2 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js +13 -11
- package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.d.ts +2 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.d.ts.map +1 -1
- package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.js +18 -17
- package/dist/builtin-extensions/pi-subagents/src/watchdog/runtime.js.map +1 -1
- package/dist/builtin-extensions/simple-pi-memory.d.ts +2 -2
- package/dist/builtin-extensions/simple-pi-memory.d.ts.map +1 -1
- package/dist/builtin-extensions/simple-pi-memory.js +41 -17
- package/dist/builtin-extensions/simple-pi-memory.js.map +1 -1
- package/dist/catalog/models.json +1 -1
- package/dist/catalog/providers/amazon-bedrock.json +1 -1
- package/dist/catalog/providers/azure-openai-responses.json +1 -1
- package/dist/catalog/providers/cloudflare-ai-gateway.json +1 -1
- package/dist/catalog/providers/cloudflare-workers-ai.json +1 -1
- package/dist/catalog/providers/fireworks.json +1 -1
- package/dist/catalog/providers/github-copilot.json +1 -1
- package/dist/catalog/providers/huggingface.json +1 -1
- package/dist/catalog/providers/minimax-cn.json +1 -1
- package/dist/catalog/providers/minimax.json +1 -1
- package/dist/catalog/providers/mistral.json +1 -1
- package/dist/catalog/providers/nvidia.json +1 -1
- package/dist/catalog/providers/openai.json +1 -1
- package/dist/catalog/providers/opencode-go.json +1 -1
- package/dist/catalog/providers/opencode.json +1 -1
- package/dist/catalog/providers/openrouter.json +1 -1
- package/dist/catalog/providers/qwen-cloud-cn.json +1 -1
- package/dist/catalog/providers/qwen-cloud.json +1 -1
- package/dist/catalog/providers/qwen-token-plan-cn.json +1 -1
- package/dist/catalog/providers/qwen-token-plan.json +1 -1
- package/dist/catalog/providers/together.json +1 -1
- package/dist/catalog/providers/vercel-ai-gateway.json +1 -1
- package/dist/catalog/providers/zai-coding-cn.json +1 -1
- package/dist/catalog/providers/zai.json +1 -1
- package/dist/catalog/publication.json +3 -3
- package/dist/core/agent-session.d.ts +7 -1
- package/dist/core/agent-session.d.ts.map +1 -1
- package/dist/core/agent-session.js +34 -4
- package/dist/core/agent-session.js.map +1 -1
- package/dist/core/context-breakdown.d.ts +3 -1
- package/dist/core/context-breakdown.d.ts.map +1 -1
- package/dist/core/context-breakdown.js +5 -2
- package/dist/core/context-breakdown.js.map +1 -1
- package/dist/core/customize.d.ts +2 -0
- package/dist/core/customize.d.ts.map +1 -1
- package/dist/core/customize.js +6 -0
- package/dist/core/customize.js.map +1 -1
- package/dist/core/memory-cap.d.ts +4 -8
- package/dist/core/memory-cap.d.ts.map +1 -1
- package/dist/core/memory-cap.js +8 -8
- package/dist/core/memory-cap.js.map +1 -1
- package/dist/core/permissions.d.ts +2 -0
- package/dist/core/permissions.d.ts.map +1 -1
- package/dist/core/permissions.js +30 -14
- package/dist/core/permissions.js.map +1 -1
- package/dist/core/plan-mode.d.ts.map +1 -1
- package/dist/core/plan-mode.js +1 -9
- package/dist/core/plan-mode.js.map +1 -1
- package/dist/core/rollback.d.ts.map +1 -1
- package/dist/core/rollback.js +1 -1
- package/dist/core/rollback.js.map +1 -1
- package/dist/core/settings-manager.d.ts +16 -5
- package/dist/core/settings-manager.d.ts.map +1 -1
- package/dist/core/settings-manager.js +37 -10
- package/dist/core/settings-manager.js.map +1 -1
- package/dist/core/slash-commands.d.ts.map +1 -1
- package/dist/core/slash-commands.js +1 -5
- package/dist/core/slash-commands.js.map +1 -1
- package/dist/core/subagent-permission-inherit.d.ts +34 -22
- package/dist/core/subagent-permission-inherit.d.ts.map +1 -1
- package/dist/core/subagent-permission-inherit.js +37 -80
- package/dist/core/subagent-permission-inherit.js.map +1 -1
- package/dist/core/swarm.d.ts.map +1 -1
- package/dist/core/swarm.js +13 -7
- package/dist/core/swarm.js.map +1 -1
- package/dist/core/system-prompt.d.ts +6 -4
- package/dist/core/system-prompt.d.ts.map +1 -1
- package/dist/core/system-prompt.js +38 -48
- package/dist/core/system-prompt.js.map +1 -1
- package/dist/core/usage-adapters/openai-codex.d.ts +1 -1
- package/dist/core/usage-adapters/openai-codex.d.ts.map +1 -1
- package/dist/core/usage-adapters/openai-codex.js +22 -17
- package/dist/core/usage-adapters/openai-codex.js.map +1 -1
- package/dist/core/usage-service.d.ts +10 -1
- package/dist/core/usage-service.d.ts.map +1 -1
- package/dist/core/usage-service.js +17 -6
- package/dist/core/usage-service.js.map +1 -1
- package/dist/gateway/agent-bridge.d.ts.map +1 -1
- package/dist/gateway/agent-bridge.js +1 -4
- package/dist/gateway/agent-bridge.js.map +1 -1
- package/dist/gateway/cron.d.ts.map +1 -1
- package/dist/gateway/cron.js +1 -4
- package/dist/gateway/cron.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +0 -5
- package/dist/main.js.map +1 -1
- package/dist/migrations.d.ts +2 -0
- package/dist/migrations.d.ts.map +1 -1
- package/dist/migrations.js +21 -0
- package/dist/migrations.js.map +1 -1
- package/dist/modes/interactive/components/settings-selector.d.ts +7 -4
- package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
- package/dist/modes/interactive/components/settings-selector.js +122 -162
- package/dist/modes/interactive/components/settings-selector.js.map +1 -1
- package/dist/modes/interactive/components/usage-view.d.ts +1 -1
- package/dist/modes/interactive/components/usage-view.d.ts.map +1 -1
- package/dist/modes/interactive/components/usage-view.js +7 -4
- package/dist/modes/interactive/components/usage-view.js.map +1 -1
- package/dist/modes/interactive/interactive-mode.d.ts +1 -2
- package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
- package/dist/modes/interactive/interactive-mode.js +55 -96
- package/dist/modes/interactive/interactive-mode.js.map +1 -1
- package/dist/modes/interactive/skill-tag-autocomplete.d.ts +13 -0
- package/dist/modes/interactive/skill-tag-autocomplete.d.ts.map +1 -0
- package/dist/modes/interactive/skill-tag-autocomplete.js +72 -0
- package/dist/modes/interactive/skill-tag-autocomplete.js.map +1 -0
- package/docs/compaction.md +23 -23
- package/docs/containerization.md +24 -24
- package/docs/custom-provider.md +18 -18
- package/docs/development.md +16 -15
- package/docs/docs.json +6 -2
- package/docs/extensions.md +82 -80
- package/docs/features.md +102 -0
- package/docs/index.md +25 -19
- package/docs/json.md +7 -7
- package/docs/keybindings.md +4 -4
- package/docs/models.md +2 -2
- package/docs/packages.md +38 -42
- package/docs/prompt-templates.md +4 -4
- package/docs/providers.md +22 -10
- package/docs/quickstart.md +81 -46
- package/docs/rpc.md +7 -13
- package/docs/sdk.md +43 -41
- package/docs/security.md +18 -18
- package/docs/session-format.md +9 -9
- package/docs/sessions.md +13 -12
- package/docs/settings.md +63 -24
- package/docs/shell-aliases.md +2 -2
- package/docs/skills.md +21 -11
- package/docs/terminal-setup.md +5 -5
- package/docs/termux.md +7 -7
- package/docs/themes.md +12 -14
- package/docs/tmux.md +4 -4
- package/docs/tui.md +23 -23
- package/docs/usage.md +112 -87
- package/docs/windows.md +10 -2
- package/examples/README.md +3 -1
- package/examples/extensions/README.md +6 -6
- package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
- package/examples/extensions/custom-provider-anthropic/package.json +1 -1
- package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
- package/examples/extensions/doom-overlay/README.md +2 -2
- package/examples/extensions/gondolin/package-lock.json +2 -2
- package/examples/extensions/gondolin/package.json +1 -1
- package/examples/extensions/plan-mode/README.md +3 -1
- package/examples/extensions/sandbox/package-lock.json +2 -2
- package/examples/extensions/sandbox/package.json +1 -1
- package/examples/extensions/subagent/README.md +13 -11
- package/examples/extensions/todo.ts +2 -1
- package/examples/extensions/with-deps/package-lock.json +2 -2
- package/examples/extensions/with-deps/package.json +1 -1
- package/examples/sdk/README.md +9 -5
- package/package.json +6 -7
- package/dist/builtin-extensions/lunr-behavior.d.ts +0 -44
- package/dist/builtin-extensions/lunr-behavior.d.ts.map +0 -1
- package/dist/builtin-extensions/lunr-behavior.js +0 -213
- package/dist/builtin-extensions/lunr-behavior.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/agents/context-builder.md +0 -46
- package/dist/builtin-extensions/pi-subagents/agents/deep-researcher.md +0 -36
- package/dist/builtin-extensions/pi-subagents/agents/delegate.md +0 -12
- package/dist/builtin-extensions/pi-subagents/agents/oracle.md +0 -73
- package/dist/builtin-extensions/pi-subagents/agents/planner.md +0 -55
- package/dist/builtin-extensions/pi-subagents/agents/research-writer.md +0 -37
- package/dist/builtin-extensions/pi-subagents/agents/researcher.md +0 -52
- package/dist/builtin-extensions/pi-subagents/agents/reviewer.md +0 -79
- package/dist/builtin-extensions/pi-subagents/agents/scout.md +0 -50
- package/dist/builtin-extensions/pi-subagents/agents/worker.md +0 -55
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.d.ts +0 -20
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.js +0 -1273
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-management.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-memory.d.ts +0 -49
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-memory.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-memory.js +0 -252
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-memory.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-scope.d.ts +0 -3
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-scope.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-scope.js +0 -6
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-scope.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-selection.d.ts +0 -3
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-selection.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-selection.js +0 -23
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-selection.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-serializer.d.ts +0 -8
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-serializer.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-serializer.js +0 -143
- package/dist/builtin-extensions/pi-subagents/src/agents/agent-serializer.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agents.d.ts +0 -176
- package/dist/builtin-extensions/pi-subagents/src/agents/agents.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/agents.js +0 -1326
- package/dist/builtin-extensions/pi-subagents/src/agents/agents.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/chain-serializer.d.ts +0 -7
- package/dist/builtin-extensions/pi-subagents/src/agents/chain-serializer.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/chain-serializer.js +0 -307
- package/dist/builtin-extensions/pi-subagents/src/agents/chain-serializer.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/identity.d.ts +0 -8
- package/dist/builtin-extensions/pi-subagents/src/agents/identity.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/identity.js +0 -30
- package/dist/builtin-extensions/pi-subagents/src/agents/identity.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/proactive-skills.d.ts +0 -35
- package/dist/builtin-extensions/pi-subagents/src/agents/proactive-skills.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/agents/proactive-skills.js +0 -151
- package/dist/builtin-extensions/pi-subagents/src/agents/proactive-skills.js.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.d.ts +0 -131
- package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.d.ts.map +0 -1
- package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.js +0 -491
- package/dist/builtin-extensions/pi-subagents/src/profiles/profiles.js.map +0 -1
- package/dist/core/behavior-preset.d.ts +0 -60
- package/dist/core/behavior-preset.d.ts.map +0 -1
- package/dist/core/behavior-preset.js +0 -257
- package/dist/core/behavior-preset.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-intent.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/task-intent.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;GAiBG;AA0EH,MAAM,MAAM,kBAAkB,GAAG;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAmD1G,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAa1F;AAED,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAElF;AAKD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAKnD","sourcesContent":["// @ts-nocheck\n/**\n * Shared task mutation-intent classifier.\n *\n * Single authority for reading a task's wording, answering two different\n * questions from one prohibition analysis:\n *\n * - `classifyTaskMutationIntent` / `expectsImplementationMutation`: does the\n * task REQUIRE file changes? Consumed by the completion mutation guard,\n * which blocks completion, so its vocabulary is deliberately narrow.\n * - `taskMayMutate`: COULD the task plausibly change files? Consumed by\n * acceptance level inference, which only raises evidence gates, so its\n * vocabulary is deliberately broad (any bare write verb).\n *\n * Explicit read-only wording (\"do not modify\", \"review only\") is a task-level\n * intent only when no write imperative survives outside those phrases. A task\n * like \"Do not modify tests; implement the fix\" is an implementation task with\n * a scoped constraint, not a read-only task.\n */\n\nconst REVIEW_ONLY_PATTERNS = [\n\t/\\breview only\\b/i,\n\t/\\bsuggest fixes only\\b/i,\n\t/\\bonly return findings\\b/i,\n\t/\\breturn findings only\\b/i,\n];\n\nconst REVIEWER_REQUIRED_EDIT_PATTERNS = [\n\t/\\bmust\\s+(?:edit|modify|change|fix|patch|apply)\\b/i,\n\t/\\brequired\\s+to\\s+(?:edit|modify|change|fix|patch|apply)\\b/i,\n\t/\\bregardless\\s+of\\s+findings\\b/i,\n\t/\\balways\\s+(?:edit|modify|change|fix|patch|apply)\\b/i,\n\t/\\bapply\\s+(?:the\\s+)?fix(?:es)?\\s+directly\\b/i,\n\t/\\bmake\\s+(?:the\\s+)?code\\s+changes\\b/i,\n];\n\n// The prohibition's object ends at punctuation or at a coordinating word\n// (but/and/then), so a follow-on clause like \"but implement the fix\" stays in\n// the text for write-intent testing instead of being swallowed as the object.\nconst NO_EDIT_PROHIBITION_PATTERN = /\\b(?:do not|don't|must not)\\s+(?:edit|modify|write(?:\\s+to)?|touch|change)\\b((?:(?!\\b(?:but|and|then)\\b)[^.;,:!?\\n–—-])*)/gi;\n\n/** Objects of a no-edit prohibition that mean \"the codebase in general\" rather than a named scope. */\nconst GENERIC_PROHIBITION_OBJECT = /^\\s*(?:(?:any|all|the|these|those|your|our|existing|project|source|sources|repo|repository)[\\s/,-]*)*(?:files?|code|codebase|sources?|anything|repo(?:sitory)?)?\\s*$/i;\n\nconst SCOPED_NO_EDIT_CONSTRAINT_PATTERNS = [\n\t/\\bdo not edit files?\\s+outside\\b/i,\n\t/\\bdo not edit\\s+outside\\b/i,\n\t/\\bdo not edit\\s+unrelated files?\\b/i,\n\t/\\bdo not change\\s+unrelated files?\\b/i,\n\t/\\bdo not modify\\s+unrelated files?\\b/i,\n];\n\nconst NO_TOOL_INTENT_PATTERNS = [\n\t/\\bno tools? needed\\b/i,\n\t/\\bno tools? required\\b/i,\n\t/\\bwithout using tools\\b/i,\n\t/\\bdo not use tools\\b/i,\n\t/\\bdon't use tools\\b/i,\n];\n\nconst READ_ONLY_DELIVERABLE_PATTERNS = [\n\t/\\b(?:draft|write|compose|prepare|produce)\\s+(?:(?:a|an|the)\\s+)?(?:github\\s+)?(?:issue|bug report|issue draft|issue body|proposal|plan|report|summary|findings?|analysis|recommendations?)\\b/i,\n\t/\\b(?:issue|bug report)\\s+(?:draft|body|template)\\b/i,\n\t/\\b(?:return|provide|produce)\\s+(?:text|markdown|answer|findings?|recommendations?)\\s+only\\b/i,\n];\n\nconst RESEARCH_AGENT_PATTERNS = [\n\t/\\binvestigate\\b/i,\n\t/\\bscout\\b/i,\n\t/\\bresearch(?:er)?\\b/i,\n];\n\nconst FIX_OR_PATCH_IMPLEMENTATION_PATTERN = /\\b(?:fix|patch)\\s+(?:(?:it|this|that|them|each|any|all|these|those)\\b|(?:(?:a|an|the|any|all)\\s+)?(?:(?:failing|failed|broken|flaky|red|cold|start|current|existing|reported|approved|known|regression|unit|integration|e2e|source|typescript|type-?script|ts|type-?check|compiler)\\s+)*(?:bug|defect|issues?|problems?|failures?|regressions?|tests?|errors?|items?|typos?|code|source|implementation|component|function|module|class|method|logic|file|files|readme|docs?|changelog|package\\.json|config|manifest|extension|prompt|command|lint(?:ing)?|build|ci|type-?check|type\\s+checking)\\b)/i;\n\nconst WORKER_IMPLEMENTATION_PATTERNS = [\n\t/\\b(?:implement|edit|modify|refactor|delete)\\b/i,\n\tFIX_OR_PATCH_IMPLEMENTATION_PATTERN,\n\t/\\b(?:update|add|remove|replace|create)\\b(?!\\s+(?:(?:a|an|the)\\s+)?(?:report|summary|findings?)(?:\\b|$))/i,\n\t/\\bapply\\s+(?:the\\s+)?(?:(?:suggested|proposed|recommended)\\s+)?(?:changes?|fix(?:es)?|patch)\\b/i,\n\t/\\bmake\\s+(?:the\\s+)?changes\\b/i,\n\t/\\bdo those fixes\\b/i,\n];\n\nconst GENERAL_IMPLEMENTATION_PATTERNS = [\n\t/\\b(?:implement|edit|modify|refactor)\\b/i,\n\tFIX_OR_PATCH_IMPLEMENTATION_PATTERN,\n\t/\\bapply\\s+(?:the\\s+)?(?:(?:suggested|proposed|recommended)\\s+)?(?:changes?|fix(?:es)?|patch)\\b/i,\n\t/\\bmake\\s+(?:the\\s+)?changes\\b/i,\n\t/\\bdo those fixes\\b/i,\n\t/\\b(?:update|add|remove|replace|delete|create)\\s+(?:the\\s+)?(?:file|files|code|source|implementation|test|tests|component|function|module|class|method|logic|import|imports|readme|docs?|changelog|package\\.json|config|manifest|extension|prompt|command)\\b/i,\n];\n\nexport type TaskMutationIntent = { kind: \"implementation\" } | { kind: \"read-only\" } | { kind: \"unknown\" };\n\nfunction stripFrameworkInstructions(task: string): string {\n\treturn task\n\t\t.split(\"\\n\")\n\t\t.filter((line) => !/^\\s*\\[(?:Write to|Read from):/i.test(line))\n\t\t.filter((line) => !/^\\s*(?:Create and maintain progress at:|Update progress at:|\\*\\*Output:\\*\\*|Write your findings to(?: exactly this path)?:|Return the complete artifact in your final response\\.|The runtime will persist it to exactly this path:|Do not call contact_supervisor merely because no write-capable tool is available\\.|This path is authoritative for this run\\.|Ignore any other output filename or output path mentioned elsewhere)/i.test(line))\n\t\t.join(\"\\n\");\n}\n\nfunction stripPatterns(task: string, patterns: RegExp[]): string {\n\tlet stripped = task;\n\tfor (const pattern of patterns) {\n\t\tconst flags = pattern.flags.includes(\"g\") ? pattern.flags : `${pattern.flags}g`;\n\t\tstripped = stripped.replace(new RegExp(pattern.source, flags), \" \");\n\t}\n\treturn stripped;\n}\n\ninterface NoEditProhibitionAnalysis {\n\t/** True when any prohibition (or review-only/no-tool wording) is present. */\n\tpresent: boolean;\n\t/** True when a prohibition covers files/code in general; such wording wins over write verbs. */\n\tblanket: boolean;\n\t/** Task text with prohibition phrases and their objects removed, for write-intent testing. */\n\tstrippedText: string;\n}\n\nfunction analyzeNoEditProhibitions(taskText: string): NoEditProhibitionAnalysis {\n\tlet present = REVIEW_ONLY_PATTERNS.some((pattern) => pattern.test(taskText))\n\t\t|| NO_TOOL_INTENT_PATTERNS.some((pattern) => pattern.test(taskText));\n\tlet blanket = present;\n\tlet strippedText = stripPatterns(taskText, [...REVIEW_ONLY_PATTERNS, ...NO_TOOL_INTENT_PATTERNS]);\n\tstrippedText = strippedText.replace(new RegExp(NO_EDIT_PROHIBITION_PATTERN.source, NO_EDIT_PROHIBITION_PATTERN.flags), (_match, object: string) => {\n\t\tpresent = true;\n\t\tif (GENERIC_PROHIBITION_OBJECT.test(object)) blanket = true;\n\t\treturn \" \";\n\t});\n\treturn { present, blanket, strippedText };\n}\n\nfunction taskHasReadOnlyDeliverable(taskText: string): boolean {\n\treturn READ_ONLY_DELIVERABLE_PATTERNS.some((pattern) => pattern.test(taskText));\n}\n\nfunction hasImplementationIntent(agent: string, taskText: string): boolean {\n\tif (/\\breviewer\\b/i.test(agent)) return REVIEWER_REQUIRED_EDIT_PATTERNS.some((pattern) => pattern.test(taskText));\n\tif (agent === \"worker\") return WORKER_IMPLEMENTATION_PATTERNS.some((pattern) => pattern.test(taskText));\n\treturn GENERAL_IMPLEMENTATION_PATTERNS.some((pattern) => pattern.test(taskText));\n}\n\nexport function classifyTaskMutationIntent(agent: string, task: string): TaskMutationIntent {\n\tconst taskText = stripFrameworkInstructions(task);\n\tconst taskTextWithoutScopedConstraints = stripPatterns(taskText, SCOPED_NO_EDIT_CONSTRAINT_PATTERNS);\n\tconst prohibitions = analyzeNoEditProhibitions(taskTextWithoutScopedConstraints);\n\tif (prohibitions.present) {\n\t\tif (prohibitions.blanket) return { kind: \"read-only\" };\n\t\treturn hasImplementationIntent(agent, prohibitions.strippedText) ? { kind: \"implementation\" } : { kind: \"read-only\" };\n\t}\n\n\tif (RESEARCH_AGENT_PATTERNS.some((pattern) => pattern.test(agent))) return { kind: \"read-only\" };\n\tif (hasImplementationIntent(agent, taskText)) return { kind: \"implementation\" };\n\tif (/\\breviewer\\b/i.test(agent)) return { kind: \"read-only\" };\n\treturn taskHasReadOnlyDeliverable(taskTextWithoutScopedConstraints) ? { kind: \"read-only\" } : { kind: \"unknown\" };\n}\n\nexport function expectsImplementationMutation(agent: string, task: string): boolean {\n\treturn classifyTaskMutationIntent(agent, task).kind === \"implementation\";\n}\n\n/** Bare write verbs that make a task write-capable for acceptance inference. */\nconst MAY_MUTATE_VERB_PATTERN = /\\b(?:fix|implement|update|write|edit|modify|migrate|delete|remove|refactor|commit)\\b/i;\n\n/**\n * Whether the task could plausibly change files. Blanket prohibitions win;\n * write verbs inside a scoped prohibition's object or a read-only deliverable\n * phrase (\"write a summary report\") do not count; any other bare write verb\n * does.\n */\nexport function taskMayMutate(task: string): boolean {\n\tconst taskText = stripPatterns(stripFrameworkInstructions(task), SCOPED_NO_EDIT_CONSTRAINT_PATTERNS);\n\tconst prohibitions = analyzeNoEditProhibitions(taskText);\n\tif (prohibitions.blanket) return false;\n\treturn MAY_MUTATE_VERB_PATTERN.test(stripPatterns(prohibitions.strippedText, READ_ONLY_DELIVERABLE_PATTERNS));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"task-intent.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/task-intent.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;GAiBG;AAyEH,MAAM,MAAM,kBAAkB,GAAG;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,WAAW,CAAA;CAAE,GAAG;IAAE,IAAI,EAAE,SAAS,CAAA;CAAE,CAAC;AAuD1G,wBAAgB,0BAA0B,CAAC,uBAAuB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,kBAAkB,CAe5G;AAED,wBAAgB,6BAA6B,CAAC,uBAAuB,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAGpG;AAKD;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAKnD","sourcesContent":["// @ts-nocheck\n/**\n * Shared task mutation-intent classifier.\n *\n * Single authority for reading a task's wording, answering two different\n * questions from one prohibition analysis:\n *\n * - `classifyTaskMutationIntent` / `expectsImplementationMutation`: does the\n * task REQUIRE file changes? Consumed by the completion mutation guard,\n * which blocks completion, so its vocabulary is deliberately narrow.\n * - `taskMayMutate`: COULD the task plausibly change files? Consumed by\n * acceptance level inference, which only raises evidence gates, so its\n * vocabulary is deliberately broad (any bare write verb).\n *\n * Explicit read-only wording (\"do not modify\", \"review only\") is a task-level\n * intent only when no write imperative survives outside those phrases. A task\n * like \"Do not modify tests; implement the fix\" is an implementation task with\n * a scoped constraint, not a read-only task.\n */\n\nconst REVIEW_ONLY_PATTERNS = [\n\t/\\breview only\\b/i,\n\t/\\bsuggest fixes only\\b/i,\n\t/\\bonly return findings\\b/i,\n\t/\\breturn findings only\\b/i,\n];\n\nconst REVIEWER_REQUIRED_EDIT_PATTERNS = [\n\t/\\bmust\\s+(?:edit|modify|change|fix|patch|apply)\\b/i,\n\t/\\brequired\\s+to\\s+(?:edit|modify|change|fix|patch|apply)\\b/i,\n\t/\\bregardless\\s+of\\s+findings\\b/i,\n\t/\\balways\\s+(?:edit|modify|change|fix|patch|apply)\\b/i,\n\t/\\bapply\\s+(?:the\\s+)?fix(?:es)?\\s+directly\\b/i,\n\t/\\bmake\\s+(?:the\\s+)?code\\s+changes\\b/i,\n];\n\n// The prohibition's object ends at punctuation or at a coordinating word\n// (but/and/then), so a follow-on clause like \"but implement the fix\" stays in\n// the text for write-intent testing instead of being swallowed as the object.\nconst NO_EDIT_PROHIBITION_PATTERN = /\\b(?:do not|don't|must not)\\s+(?:edit|modify|write(?:\\s+to)?|touch|change)\\b((?:(?!\\b(?:but|and|then)\\b)[^.;,:!?\\n–—-])*)/gi;\n\n/** Objects of a no-edit prohibition that mean \"the codebase in general\" rather than a named scope. */\nconst GENERIC_PROHIBITION_OBJECT = /^\\s*(?:(?:any|all|the|these|those|your|our|existing|project|source|sources|repo|repository)[\\s/,-]*)*(?:files?|code|codebase|sources?|anything|repo(?:sitory)?)?\\s*$/i;\n\nconst SCOPED_NO_EDIT_CONSTRAINT_PATTERNS = [\n\t/\\bdo not edit files?\\s+outside\\b/i,\n\t/\\bdo not edit\\s+outside\\b/i,\n\t/\\bdo not edit\\s+unrelated files?\\b/i,\n\t/\\bdo not change\\s+unrelated files?\\b/i,\n\t/\\bdo not modify\\s+unrelated files?\\b/i,\n];\n\nconst NO_TOOL_INTENT_PATTERNS = [\n\t/\\bno tools? needed\\b/i,\n\t/\\bno tools? required\\b/i,\n\t/\\bwithout using tools\\b/i,\n\t/\\bdo not use tools\\b/i,\n\t/\\bdon't use tools\\b/i,\n];\n\nconst READ_ONLY_DELIVERABLE_PATTERNS = [\n\t/\\b(?:draft|write|compose|prepare|produce)\\s+(?:(?:a|an|the)\\s+)?(?:github\\s+)?(?:issue|bug report|issue draft|issue body|proposal|plan|report|summary|findings?|analysis|recommendations?)\\b/i,\n\t/\\b(?:issue|bug report)\\s+(?:draft|body|template)\\b/i,\n\t/\\b(?:return|provide|produce)\\s+(?:text|markdown|answer|findings?|recommendations?)\\s+only\\b/i,\n];\n\nconst RESEARCH_TASK_PATTERNS = [\n\t/\\binvestigate\\b/i,\n\t/\\bresearch\\b/i,\n];\n\nconst FIX_OR_PATCH_IMPLEMENTATION_PATTERN = /\\b(?:fix|patch)\\s+(?:(?:it|this|that|them|each|any|all|these|those)\\b|(?:(?:a|an|the|any|all)\\s+)?(?:(?:failing|failed|broken|flaky|red|cold|start|current|existing|reported|approved|known|regression|unit|integration|e2e|source|typescript|type-?script|ts|type-?check|compiler)\\s+)*(?:bug|defect|issues?|problems?|failures?|regressions?|tests?|errors?|items?|typos?|code|source|implementation|component|function|module|class|method|logic|file|files|readme|docs?|changelog|package\\.json|config|manifest|extension|prompt|command|lint(?:ing)?|build|ci|type-?check|type\\s+checking)\\b)/i;\n\nconst WORKER_IMPLEMENTATION_PATTERNS = [\n\t/\\b(?:implement|edit|modify|refactor|delete)\\b/i,\n\tFIX_OR_PATCH_IMPLEMENTATION_PATTERN,\n\t/\\b(?:update|add|remove|replace|create)\\b(?!\\s+(?:(?:a|an|the)\\s+)?(?:report|summary|findings?)(?:\\b|$))/i,\n\t/\\bapply\\s+(?:the\\s+)?(?:(?:suggested|proposed|recommended)\\s+)?(?:changes?|fix(?:es)?|patch)\\b/i,\n\t/\\bmake\\s+(?:the\\s+)?changes\\b/i,\n\t/\\bdo those fixes\\b/i,\n];\n\nconst GENERAL_IMPLEMENTATION_PATTERNS = [\n\t/\\b(?:implement|edit|modify|refactor)\\b/i,\n\tFIX_OR_PATCH_IMPLEMENTATION_PATTERN,\n\t/\\bapply\\s+(?:the\\s+)?(?:(?:suggested|proposed|recommended)\\s+)?(?:changes?|fix(?:es)?|patch)\\b/i,\n\t/\\bmake\\s+(?:the\\s+)?changes\\b/i,\n\t/\\bdo those fixes\\b/i,\n\t/\\b(?:update|add|remove|replace|delete|create)\\s+(?:the\\s+)?(?:file|files|code|source|implementation|test|tests|component|function|module|class|method|logic|import|imports|readme|docs?|changelog|package\\.json|config|manifest|extension|prompt|command)\\b/i,\n];\n\nexport type TaskMutationIntent = { kind: \"implementation\" } | { kind: \"read-only\" } | { kind: \"unknown\" };\n\nfunction stripFrameworkInstructions(task: string): string {\n\treturn task\n\t\t.split(\"\\n\")\n\t\t.filter((line) => !/^\\s*\\[(?:Write to|Read from):/i.test(line))\n\t\t.filter((line) => !/^\\s*(?:Create and maintain progress at:|Update progress at:|\\*\\*Output:\\*\\*|Write your findings to(?: exactly this path)?:|Return the complete artifact in your final response\\.|The runtime will persist it to exactly this path:|Do not call contact_supervisor merely because no write-capable tool is available\\.|This path is authoritative for this run\\.|Ignore any other output filename or output path mentioned elsewhere)/i.test(line))\n\t\t.join(\"\\n\");\n}\n\nfunction stripPatterns(task: string, patterns: RegExp[]): string {\n\tlet stripped = task;\n\tfor (const pattern of patterns) {\n\t\tconst flags = pattern.flags.includes(\"g\") ? pattern.flags : `${pattern.flags}g`;\n\t\tstripped = stripped.replace(new RegExp(pattern.source, flags), \" \");\n\t}\n\treturn stripped;\n}\n\ninterface NoEditProhibitionAnalysis {\n\t/** True when any prohibition (or review-only/no-tool wording) is present. */\n\tpresent: boolean;\n\t/** True when a prohibition covers files/code in general; such wording wins over write verbs. */\n\tblanket: boolean;\n\t/** Task text with prohibition phrases and their objects removed, for write-intent testing. */\n\tstrippedText: string;\n}\n\nfunction analyzeNoEditProhibitions(taskText: string): NoEditProhibitionAnalysis {\n\tlet present = REVIEW_ONLY_PATTERNS.some((pattern) => pattern.test(taskText))\n\t\t|| NO_TOOL_INTENT_PATTERNS.some((pattern) => pattern.test(taskText));\n\tlet blanket = present;\n\tlet strippedText = stripPatterns(taskText, [...REVIEW_ONLY_PATTERNS, ...NO_TOOL_INTENT_PATTERNS]);\n\tstrippedText = strippedText.replace(new RegExp(NO_EDIT_PROHIBITION_PATTERN.source, NO_EDIT_PROHIBITION_PATTERN.flags), (_match, object: string) => {\n\t\tpresent = true;\n\t\tif (GENERIC_PROHIBITION_OBJECT.test(object)) blanket = true;\n\t\treturn \" \";\n\t});\n\treturn { present, blanket, strippedText };\n}\n\nfunction taskHasReadOnlyDeliverable(taskText: string): boolean {\n\treturn READ_ONLY_DELIVERABLE_PATTERNS.some((pattern) => pattern.test(taskText));\n}\n\nfunction hasImplementationIntent(taskText: string): boolean {\n\treturn GENERAL_IMPLEMENTATION_PATTERNS.some((pattern) => pattern.test(taskText))\n\t\t|| WORKER_IMPLEMENTATION_PATTERNS.some((pattern) => pattern.test(taskText))\n\t\t|| REVIEWER_REQUIRED_EDIT_PATTERNS.some((pattern) => pattern.test(taskText));\n}\n\nfunction isReadOnlyPermission(permissionsOrLegacyName: string | undefined): boolean {\n\treturn permissionsOrLegacyName === \"read-only\";\n}\n\nexport function classifyTaskMutationIntent(permissionsOrLegacyName: string, task: string): TaskMutationIntent {\n\tif (isReadOnlyPermission(permissionsOrLegacyName)) return { kind: \"read-only\" };\n\tconst taskText = stripFrameworkInstructions(task);\n\tconst taskTextWithoutScopedConstraints = stripPatterns(taskText, SCOPED_NO_EDIT_CONSTRAINT_PATTERNS);\n\tconst prohibitions = analyzeNoEditProhibitions(taskTextWithoutScopedConstraints);\n\tif (prohibitions.present) {\n\t\tif (prohibitions.blanket) return { kind: \"read-only\" };\n\t\treturn hasImplementationIntent(prohibitions.strippedText) ? { kind: \"implementation\" } : { kind: \"read-only\" };\n\t}\n\n\tif (hasImplementationIntent(taskText)) return { kind: \"implementation\" };\n\tif (RESEARCH_TASK_PATTERNS.some((pattern) => pattern.test(taskText)) && !hasImplementationIntent(taskText)) {\n\t\treturn { kind: \"read-only\" };\n\t}\n\treturn taskHasReadOnlyDeliverable(taskTextWithoutScopedConstraints) ? { kind: \"read-only\" } : { kind: \"unknown\" };\n}\n\nexport function expectsImplementationMutation(permissionsOrLegacyName: string, task: string): boolean {\n\tif (isReadOnlyPermission(permissionsOrLegacyName)) return false;\n\treturn classifyTaskMutationIntent(permissionsOrLegacyName, task).kind === \"implementation\";\n}\n\n/** Bare write verbs that make a task write-capable for acceptance inference. */\nconst MAY_MUTATE_VERB_PATTERN = /\\b(?:fix|implement|update|write|edit|modify|migrate|delete|remove|refactor|commit)\\b/i;\n\n/**\n * Whether the task could plausibly change files. Blanket prohibitions win;\n * write verbs inside a scoped prohibition's object or a read-only deliverable\n * phrase (\"write a summary report\") do not count; any other bare write verb\n * does.\n */\nexport function taskMayMutate(task: string): boolean {\n\tconst taskText = stripPatterns(stripFrameworkInstructions(task), SCOPED_NO_EDIT_CONSTRAINT_PATTERNS);\n\tconst prohibitions = analyzeNoEditProhibitions(taskText);\n\tif (prohibitions.blanket) return false;\n\treturn MAY_MUTATE_VERB_PATTERN.test(stripPatterns(prohibitions.strippedText, READ_ONLY_DELIVERABLE_PATTERNS));\n}\n"]}
|
|
@@ -56,10 +56,9 @@ const READ_ONLY_DELIVERABLE_PATTERNS = [
|
|
|
56
56
|
/\b(?:issue|bug report)\s+(?:draft|body|template)\b/i,
|
|
57
57
|
/\b(?:return|provide|produce)\s+(?:text|markdown|answer|findings?|recommendations?)\s+only\b/i,
|
|
58
58
|
];
|
|
59
|
-
const
|
|
59
|
+
const RESEARCH_TASK_PATTERNS = [
|
|
60
60
|
/\binvestigate\b/i,
|
|
61
|
-
/\
|
|
62
|
-
/\bresearch(?:er)?\b/i,
|
|
61
|
+
/\bresearch\b/i,
|
|
63
62
|
];
|
|
64
63
|
const FIX_OR_PATCH_IMPLEMENTATION_PATTERN = /\b(?:fix|patch)\s+(?:(?:it|this|that|them|each|any|all|these|those)\b|(?:(?:a|an|the|any|all)\s+)?(?:(?:failing|failed|broken|flaky|red|cold|start|current|existing|reported|approved|known|regression|unit|integration|e2e|source|typescript|type-?script|ts|type-?check|compiler)\s+)*(?:bug|defect|issues?|problems?|failures?|regressions?|tests?|errors?|items?|typos?|code|source|implementation|component|function|module|class|method|logic|file|files|readme|docs?|changelog|package\.json|config|manifest|extension|prompt|command|lint(?:ing)?|build|ci|type-?check|type\s+checking)\b)/i;
|
|
65
64
|
const WORKER_IMPLEMENTATION_PATTERNS = [
|
|
@@ -109,32 +108,36 @@ function analyzeNoEditProhibitions(taskText) {
|
|
|
109
108
|
function taskHasReadOnlyDeliverable(taskText) {
|
|
110
109
|
return READ_ONLY_DELIVERABLE_PATTERNS.some((pattern) => pattern.test(taskText));
|
|
111
110
|
}
|
|
112
|
-
function hasImplementationIntent(
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
return WORKER_IMPLEMENTATION_PATTERNS.some((pattern) => pattern.test(taskText));
|
|
117
|
-
return GENERAL_IMPLEMENTATION_PATTERNS.some((pattern) => pattern.test(taskText));
|
|
111
|
+
function hasImplementationIntent(taskText) {
|
|
112
|
+
return GENERAL_IMPLEMENTATION_PATTERNS.some((pattern) => pattern.test(taskText))
|
|
113
|
+
|| WORKER_IMPLEMENTATION_PATTERNS.some((pattern) => pattern.test(taskText))
|
|
114
|
+
|| REVIEWER_REQUIRED_EDIT_PATTERNS.some((pattern) => pattern.test(taskText));
|
|
118
115
|
}
|
|
119
|
-
|
|
116
|
+
function isReadOnlyPermission(permissionsOrLegacyName) {
|
|
117
|
+
return permissionsOrLegacyName === "read-only";
|
|
118
|
+
}
|
|
119
|
+
export function classifyTaskMutationIntent(permissionsOrLegacyName, task) {
|
|
120
|
+
if (isReadOnlyPermission(permissionsOrLegacyName))
|
|
121
|
+
return { kind: "read-only" };
|
|
120
122
|
const taskText = stripFrameworkInstructions(task);
|
|
121
123
|
const taskTextWithoutScopedConstraints = stripPatterns(taskText, SCOPED_NO_EDIT_CONSTRAINT_PATTERNS);
|
|
122
124
|
const prohibitions = analyzeNoEditProhibitions(taskTextWithoutScopedConstraints);
|
|
123
125
|
if (prohibitions.present) {
|
|
124
126
|
if (prohibitions.blanket)
|
|
125
127
|
return { kind: "read-only" };
|
|
126
|
-
return hasImplementationIntent(
|
|
128
|
+
return hasImplementationIntent(prohibitions.strippedText) ? { kind: "implementation" } : { kind: "read-only" };
|
|
127
129
|
}
|
|
128
|
-
if (
|
|
129
|
-
return { kind: "read-only" };
|
|
130
|
-
if (hasImplementationIntent(agent, taskText))
|
|
130
|
+
if (hasImplementationIntent(taskText))
|
|
131
131
|
return { kind: "implementation" };
|
|
132
|
-
if (
|
|
132
|
+
if (RESEARCH_TASK_PATTERNS.some((pattern) => pattern.test(taskText)) && !hasImplementationIntent(taskText)) {
|
|
133
133
|
return { kind: "read-only" };
|
|
134
|
+
}
|
|
134
135
|
return taskHasReadOnlyDeliverable(taskTextWithoutScopedConstraints) ? { kind: "read-only" } : { kind: "unknown" };
|
|
135
136
|
}
|
|
136
|
-
export function expectsImplementationMutation(
|
|
137
|
-
|
|
137
|
+
export function expectsImplementationMutation(permissionsOrLegacyName, task) {
|
|
138
|
+
if (isReadOnlyPermission(permissionsOrLegacyName))
|
|
139
|
+
return false;
|
|
140
|
+
return classifyTaskMutationIntent(permissionsOrLegacyName, task).kind === "implementation";
|
|
138
141
|
}
|
|
139
142
|
/** Bare write verbs that make a task write-capable for acceptance inference. */
|
|
140
143
|
const MAY_MUTATE_VERB_PATTERN = /\b(?:fix|implement|update|write|edit|modify|migrate|delete|remove|refactor|commit)\b/i;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-intent.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/task-intent.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * Shared task mutation-intent classifier.\n *\n * Single authority for reading a task's wording, answering two different\n * questions from one prohibition analysis:\n *\n * - `classifyTaskMutationIntent` / `expectsImplementationMutation`: does the\n * task REQUIRE file changes? Consumed by the completion mutation guard,\n * which blocks completion, so its vocabulary is deliberately narrow.\n * - `taskMayMutate`: COULD the task plausibly change files? Consumed by\n * acceptance level inference, which only raises evidence gates, so its\n * vocabulary is deliberately broad (any bare write verb).\n *\n * Explicit read-only wording (\"do not modify\", \"review only\") is a task-level\n * intent only when no write imperative survives outside those phrases. A task\n * like \"Do not modify tests; implement the fix\" is an implementation task with\n * a scoped constraint, not a read-only task.\n */\n\nconst REVIEW_ONLY_PATTERNS = [\n\t/\\breview only\\b/i,\n\t/\\bsuggest fixes only\\b/i,\n\t/\\bonly return findings\\b/i,\n\t/\\breturn findings only\\b/i,\n];\n\nconst REVIEWER_REQUIRED_EDIT_PATTERNS = [\n\t/\\bmust\\s+(?:edit|modify|change|fix|patch|apply)\\b/i,\n\t/\\brequired\\s+to\\s+(?:edit|modify|change|fix|patch|apply)\\b/i,\n\t/\\bregardless\\s+of\\s+findings\\b/i,\n\t/\\balways\\s+(?:edit|modify|change|fix|patch|apply)\\b/i,\n\t/\\bapply\\s+(?:the\\s+)?fix(?:es)?\\s+directly\\b/i,\n\t/\\bmake\\s+(?:the\\s+)?code\\s+changes\\b/i,\n];\n\n// The prohibition's object ends at punctuation or at a coordinating word\n// (but/and/then), so a follow-on clause like \"but implement the fix\" stays in\n// the text for write-intent testing instead of being swallowed as the object.\nconst NO_EDIT_PROHIBITION_PATTERN = /\\b(?:do not|don't|must not)\\s+(?:edit|modify|write(?:\\s+to)?|touch|change)\\b((?:(?!\\b(?:but|and|then)\\b)[^.;,:!?\\n–—-])*)/gi;\n\n/** Objects of a no-edit prohibition that mean \"the codebase in general\" rather than a named scope. */\nconst GENERIC_PROHIBITION_OBJECT = /^\\s*(?:(?:any|all|the|these|those|your|our|existing|project|source|sources|repo|repository)[\\s/,-]*)*(?:files?|code|codebase|sources?|anything|repo(?:sitory)?)?\\s*$/i;\n\nconst SCOPED_NO_EDIT_CONSTRAINT_PATTERNS = [\n\t/\\bdo not edit files?\\s+outside\\b/i,\n\t/\\bdo not edit\\s+outside\\b/i,\n\t/\\bdo not edit\\s+unrelated files?\\b/i,\n\t/\\bdo not change\\s+unrelated files?\\b/i,\n\t/\\bdo not modify\\s+unrelated files?\\b/i,\n];\n\nconst NO_TOOL_INTENT_PATTERNS = [\n\t/\\bno tools? needed\\b/i,\n\t/\\bno tools? required\\b/i,\n\t/\\bwithout using tools\\b/i,\n\t/\\bdo not use tools\\b/i,\n\t/\\bdon't use tools\\b/i,\n];\n\nconst READ_ONLY_DELIVERABLE_PATTERNS = [\n\t/\\b(?:draft|write|compose|prepare|produce)\\s+(?:(?:a|an|the)\\s+)?(?:github\\s+)?(?:issue|bug report|issue draft|issue body|proposal|plan|report|summary|findings?|analysis|recommendations?)\\b/i,\n\t/\\b(?:issue|bug report)\\s+(?:draft|body|template)\\b/i,\n\t/\\b(?:return|provide|produce)\\s+(?:text|markdown|answer|findings?|recommendations?)\\s+only\\b/i,\n];\n\nconst RESEARCH_AGENT_PATTERNS = [\n\t/\\binvestigate\\b/i,\n\t/\\bscout\\b/i,\n\t/\\bresearch(?:er)?\\b/i,\n];\n\nconst FIX_OR_PATCH_IMPLEMENTATION_PATTERN = /\\b(?:fix|patch)\\s+(?:(?:it|this|that|them|each|any|all|these|those)\\b|(?:(?:a|an|the|any|all)\\s+)?(?:(?:failing|failed|broken|flaky|red|cold|start|current|existing|reported|approved|known|regression|unit|integration|e2e|source|typescript|type-?script|ts|type-?check|compiler)\\s+)*(?:bug|defect|issues?|problems?|failures?|regressions?|tests?|errors?|items?|typos?|code|source|implementation|component|function|module|class|method|logic|file|files|readme|docs?|changelog|package\\.json|config|manifest|extension|prompt|command|lint(?:ing)?|build|ci|type-?check|type\\s+checking)\\b)/i;\n\nconst WORKER_IMPLEMENTATION_PATTERNS = [\n\t/\\b(?:implement|edit|modify|refactor|delete)\\b/i,\n\tFIX_OR_PATCH_IMPLEMENTATION_PATTERN,\n\t/\\b(?:update|add|remove|replace|create)\\b(?!\\s+(?:(?:a|an|the)\\s+)?(?:report|summary|findings?)(?:\\b|$))/i,\n\t/\\bapply\\s+(?:the\\s+)?(?:(?:suggested|proposed|recommended)\\s+)?(?:changes?|fix(?:es)?|patch)\\b/i,\n\t/\\bmake\\s+(?:the\\s+)?changes\\b/i,\n\t/\\bdo those fixes\\b/i,\n];\n\nconst GENERAL_IMPLEMENTATION_PATTERNS = [\n\t/\\b(?:implement|edit|modify|refactor)\\b/i,\n\tFIX_OR_PATCH_IMPLEMENTATION_PATTERN,\n\t/\\bapply\\s+(?:the\\s+)?(?:(?:suggested|proposed|recommended)\\s+)?(?:changes?|fix(?:es)?|patch)\\b/i,\n\t/\\bmake\\s+(?:the\\s+)?changes\\b/i,\n\t/\\bdo those fixes\\b/i,\n\t/\\b(?:update|add|remove|replace|delete|create)\\s+(?:the\\s+)?(?:file|files|code|source|implementation|test|tests|component|function|module|class|method|logic|import|imports|readme|docs?|changelog|package\\.json|config|manifest|extension|prompt|command)\\b/i,\n];\n\nexport type TaskMutationIntent = { kind: \"implementation\" } | { kind: \"read-only\" } | { kind: \"unknown\" };\n\nfunction stripFrameworkInstructions(task: string): string {\n\treturn task\n\t\t.split(\"\\n\")\n\t\t.filter((line) => !/^\\s*\\[(?:Write to|Read from):/i.test(line))\n\t\t.filter((line) => !/^\\s*(?:Create and maintain progress at:|Update progress at:|\\*\\*Output:\\*\\*|Write your findings to(?: exactly this path)?:|Return the complete artifact in your final response\\.|The runtime will persist it to exactly this path:|Do not call contact_supervisor merely because no write-capable tool is available\\.|This path is authoritative for this run\\.|Ignore any other output filename or output path mentioned elsewhere)/i.test(line))\n\t\t.join(\"\\n\");\n}\n\nfunction stripPatterns(task: string, patterns: RegExp[]): string {\n\tlet stripped = task;\n\tfor (const pattern of patterns) {\n\t\tconst flags = pattern.flags.includes(\"g\") ? pattern.flags : `${pattern.flags}g`;\n\t\tstripped = stripped.replace(new RegExp(pattern.source, flags), \" \");\n\t}\n\treturn stripped;\n}\n\ninterface NoEditProhibitionAnalysis {\n\t/** True when any prohibition (or review-only/no-tool wording) is present. */\n\tpresent: boolean;\n\t/** True when a prohibition covers files/code in general; such wording wins over write verbs. */\n\tblanket: boolean;\n\t/** Task text with prohibition phrases and their objects removed, for write-intent testing. */\n\tstrippedText: string;\n}\n\nfunction analyzeNoEditProhibitions(taskText: string): NoEditProhibitionAnalysis {\n\tlet present = REVIEW_ONLY_PATTERNS.some((pattern) => pattern.test(taskText))\n\t\t|| NO_TOOL_INTENT_PATTERNS.some((pattern) => pattern.test(taskText));\n\tlet blanket = present;\n\tlet strippedText = stripPatterns(taskText, [...REVIEW_ONLY_PATTERNS, ...NO_TOOL_INTENT_PATTERNS]);\n\tstrippedText = strippedText.replace(new RegExp(NO_EDIT_PROHIBITION_PATTERN.source, NO_EDIT_PROHIBITION_PATTERN.flags), (_match, object: string) => {\n\t\tpresent = true;\n\t\tif (GENERIC_PROHIBITION_OBJECT.test(object)) blanket = true;\n\t\treturn \" \";\n\t});\n\treturn { present, blanket, strippedText };\n}\n\nfunction taskHasReadOnlyDeliverable(taskText: string): boolean {\n\treturn READ_ONLY_DELIVERABLE_PATTERNS.some((pattern) => pattern.test(taskText));\n}\n\nfunction hasImplementationIntent(agent: string, taskText: string): boolean {\n\tif (/\\breviewer\\b/i.test(agent)) return REVIEWER_REQUIRED_EDIT_PATTERNS.some((pattern) => pattern.test(taskText));\n\tif (agent === \"worker\") return WORKER_IMPLEMENTATION_PATTERNS.some((pattern) => pattern.test(taskText));\n\treturn GENERAL_IMPLEMENTATION_PATTERNS.some((pattern) => pattern.test(taskText));\n}\n\nexport function classifyTaskMutationIntent(agent: string, task: string): TaskMutationIntent {\n\tconst taskText = stripFrameworkInstructions(task);\n\tconst taskTextWithoutScopedConstraints = stripPatterns(taskText, SCOPED_NO_EDIT_CONSTRAINT_PATTERNS);\n\tconst prohibitions = analyzeNoEditProhibitions(taskTextWithoutScopedConstraints);\n\tif (prohibitions.present) {\n\t\tif (prohibitions.blanket) return { kind: \"read-only\" };\n\t\treturn hasImplementationIntent(agent, prohibitions.strippedText) ? { kind: \"implementation\" } : { kind: \"read-only\" };\n\t}\n\n\tif (RESEARCH_AGENT_PATTERNS.some((pattern) => pattern.test(agent))) return { kind: \"read-only\" };\n\tif (hasImplementationIntent(agent, taskText)) return { kind: \"implementation\" };\n\tif (/\\breviewer\\b/i.test(agent)) return { kind: \"read-only\" };\n\treturn taskHasReadOnlyDeliverable(taskTextWithoutScopedConstraints) ? { kind: \"read-only\" } : { kind: \"unknown\" };\n}\n\nexport function expectsImplementationMutation(agent: string, task: string): boolean {\n\treturn classifyTaskMutationIntent(agent, task).kind === \"implementation\";\n}\n\n/** Bare write verbs that make a task write-capable for acceptance inference. */\nconst MAY_MUTATE_VERB_PATTERN = /\\b(?:fix|implement|update|write|edit|modify|migrate|delete|remove|refactor|commit)\\b/i;\n\n/**\n * Whether the task could plausibly change files. Blanket prohibitions win;\n * write verbs inside a scoped prohibition's object or a read-only deliverable\n * phrase (\"write a summary report\") do not count; any other bare write verb\n * does.\n */\nexport function taskMayMutate(task: string): boolean {\n\tconst taskText = stripPatterns(stripFrameworkInstructions(task), SCOPED_NO_EDIT_CONSTRAINT_PATTERNS);\n\tconst prohibitions = analyzeNoEditProhibitions(taskText);\n\tif (prohibitions.blanket) return false;\n\treturn MAY_MUTATE_VERB_PATTERN.test(stripPatterns(prohibitions.strippedText, READ_ONLY_DELIVERABLE_PATTERNS));\n}\n"]}
|
|
1
|
+
{"version":3,"file":"task-intent.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/task-intent.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * Shared task mutation-intent classifier.\n *\n * Single authority for reading a task's wording, answering two different\n * questions from one prohibition analysis:\n *\n * - `classifyTaskMutationIntent` / `expectsImplementationMutation`: does the\n * task REQUIRE file changes? Consumed by the completion mutation guard,\n * which blocks completion, so its vocabulary is deliberately narrow.\n * - `taskMayMutate`: COULD the task plausibly change files? Consumed by\n * acceptance level inference, which only raises evidence gates, so its\n * vocabulary is deliberately broad (any bare write verb).\n *\n * Explicit read-only wording (\"do not modify\", \"review only\") is a task-level\n * intent only when no write imperative survives outside those phrases. A task\n * like \"Do not modify tests; implement the fix\" is an implementation task with\n * a scoped constraint, not a read-only task.\n */\n\nconst REVIEW_ONLY_PATTERNS = [\n\t/\\breview only\\b/i,\n\t/\\bsuggest fixes only\\b/i,\n\t/\\bonly return findings\\b/i,\n\t/\\breturn findings only\\b/i,\n];\n\nconst REVIEWER_REQUIRED_EDIT_PATTERNS = [\n\t/\\bmust\\s+(?:edit|modify|change|fix|patch|apply)\\b/i,\n\t/\\brequired\\s+to\\s+(?:edit|modify|change|fix|patch|apply)\\b/i,\n\t/\\bregardless\\s+of\\s+findings\\b/i,\n\t/\\balways\\s+(?:edit|modify|change|fix|patch|apply)\\b/i,\n\t/\\bapply\\s+(?:the\\s+)?fix(?:es)?\\s+directly\\b/i,\n\t/\\bmake\\s+(?:the\\s+)?code\\s+changes\\b/i,\n];\n\n// The prohibition's object ends at punctuation or at a coordinating word\n// (but/and/then), so a follow-on clause like \"but implement the fix\" stays in\n// the text for write-intent testing instead of being swallowed as the object.\nconst NO_EDIT_PROHIBITION_PATTERN = /\\b(?:do not|don't|must not)\\s+(?:edit|modify|write(?:\\s+to)?|touch|change)\\b((?:(?!\\b(?:but|and|then)\\b)[^.;,:!?\\n–—-])*)/gi;\n\n/** Objects of a no-edit prohibition that mean \"the codebase in general\" rather than a named scope. */\nconst GENERIC_PROHIBITION_OBJECT = /^\\s*(?:(?:any|all|the|these|those|your|our|existing|project|source|sources|repo|repository)[\\s/,-]*)*(?:files?|code|codebase|sources?|anything|repo(?:sitory)?)?\\s*$/i;\n\nconst SCOPED_NO_EDIT_CONSTRAINT_PATTERNS = [\n\t/\\bdo not edit files?\\s+outside\\b/i,\n\t/\\bdo not edit\\s+outside\\b/i,\n\t/\\bdo not edit\\s+unrelated files?\\b/i,\n\t/\\bdo not change\\s+unrelated files?\\b/i,\n\t/\\bdo not modify\\s+unrelated files?\\b/i,\n];\n\nconst NO_TOOL_INTENT_PATTERNS = [\n\t/\\bno tools? needed\\b/i,\n\t/\\bno tools? required\\b/i,\n\t/\\bwithout using tools\\b/i,\n\t/\\bdo not use tools\\b/i,\n\t/\\bdon't use tools\\b/i,\n];\n\nconst READ_ONLY_DELIVERABLE_PATTERNS = [\n\t/\\b(?:draft|write|compose|prepare|produce)\\s+(?:(?:a|an|the)\\s+)?(?:github\\s+)?(?:issue|bug report|issue draft|issue body|proposal|plan|report|summary|findings?|analysis|recommendations?)\\b/i,\n\t/\\b(?:issue|bug report)\\s+(?:draft|body|template)\\b/i,\n\t/\\b(?:return|provide|produce)\\s+(?:text|markdown|answer|findings?|recommendations?)\\s+only\\b/i,\n];\n\nconst RESEARCH_TASK_PATTERNS = [\n\t/\\binvestigate\\b/i,\n\t/\\bresearch\\b/i,\n];\n\nconst FIX_OR_PATCH_IMPLEMENTATION_PATTERN = /\\b(?:fix|patch)\\s+(?:(?:it|this|that|them|each|any|all|these|those)\\b|(?:(?:a|an|the|any|all)\\s+)?(?:(?:failing|failed|broken|flaky|red|cold|start|current|existing|reported|approved|known|regression|unit|integration|e2e|source|typescript|type-?script|ts|type-?check|compiler)\\s+)*(?:bug|defect|issues?|problems?|failures?|regressions?|tests?|errors?|items?|typos?|code|source|implementation|component|function|module|class|method|logic|file|files|readme|docs?|changelog|package\\.json|config|manifest|extension|prompt|command|lint(?:ing)?|build|ci|type-?check|type\\s+checking)\\b)/i;\n\nconst WORKER_IMPLEMENTATION_PATTERNS = [\n\t/\\b(?:implement|edit|modify|refactor|delete)\\b/i,\n\tFIX_OR_PATCH_IMPLEMENTATION_PATTERN,\n\t/\\b(?:update|add|remove|replace|create)\\b(?!\\s+(?:(?:a|an|the)\\s+)?(?:report|summary|findings?)(?:\\b|$))/i,\n\t/\\bapply\\s+(?:the\\s+)?(?:(?:suggested|proposed|recommended)\\s+)?(?:changes?|fix(?:es)?|patch)\\b/i,\n\t/\\bmake\\s+(?:the\\s+)?changes\\b/i,\n\t/\\bdo those fixes\\b/i,\n];\n\nconst GENERAL_IMPLEMENTATION_PATTERNS = [\n\t/\\b(?:implement|edit|modify|refactor)\\b/i,\n\tFIX_OR_PATCH_IMPLEMENTATION_PATTERN,\n\t/\\bapply\\s+(?:the\\s+)?(?:(?:suggested|proposed|recommended)\\s+)?(?:changes?|fix(?:es)?|patch)\\b/i,\n\t/\\bmake\\s+(?:the\\s+)?changes\\b/i,\n\t/\\bdo those fixes\\b/i,\n\t/\\b(?:update|add|remove|replace|delete|create)\\s+(?:the\\s+)?(?:file|files|code|source|implementation|test|tests|component|function|module|class|method|logic|import|imports|readme|docs?|changelog|package\\.json|config|manifest|extension|prompt|command)\\b/i,\n];\n\nexport type TaskMutationIntent = { kind: \"implementation\" } | { kind: \"read-only\" } | { kind: \"unknown\" };\n\nfunction stripFrameworkInstructions(task: string): string {\n\treturn task\n\t\t.split(\"\\n\")\n\t\t.filter((line) => !/^\\s*\\[(?:Write to|Read from):/i.test(line))\n\t\t.filter((line) => !/^\\s*(?:Create and maintain progress at:|Update progress at:|\\*\\*Output:\\*\\*|Write your findings to(?: exactly this path)?:|Return the complete artifact in your final response\\.|The runtime will persist it to exactly this path:|Do not call contact_supervisor merely because no write-capable tool is available\\.|This path is authoritative for this run\\.|Ignore any other output filename or output path mentioned elsewhere)/i.test(line))\n\t\t.join(\"\\n\");\n}\n\nfunction stripPatterns(task: string, patterns: RegExp[]): string {\n\tlet stripped = task;\n\tfor (const pattern of patterns) {\n\t\tconst flags = pattern.flags.includes(\"g\") ? pattern.flags : `${pattern.flags}g`;\n\t\tstripped = stripped.replace(new RegExp(pattern.source, flags), \" \");\n\t}\n\treturn stripped;\n}\n\ninterface NoEditProhibitionAnalysis {\n\t/** True when any prohibition (or review-only/no-tool wording) is present. */\n\tpresent: boolean;\n\t/** True when a prohibition covers files/code in general; such wording wins over write verbs. */\n\tblanket: boolean;\n\t/** Task text with prohibition phrases and their objects removed, for write-intent testing. */\n\tstrippedText: string;\n}\n\nfunction analyzeNoEditProhibitions(taskText: string): NoEditProhibitionAnalysis {\n\tlet present = REVIEW_ONLY_PATTERNS.some((pattern) => pattern.test(taskText))\n\t\t|| NO_TOOL_INTENT_PATTERNS.some((pattern) => pattern.test(taskText));\n\tlet blanket = present;\n\tlet strippedText = stripPatterns(taskText, [...REVIEW_ONLY_PATTERNS, ...NO_TOOL_INTENT_PATTERNS]);\n\tstrippedText = strippedText.replace(new RegExp(NO_EDIT_PROHIBITION_PATTERN.source, NO_EDIT_PROHIBITION_PATTERN.flags), (_match, object: string) => {\n\t\tpresent = true;\n\t\tif (GENERIC_PROHIBITION_OBJECT.test(object)) blanket = true;\n\t\treturn \" \";\n\t});\n\treturn { present, blanket, strippedText };\n}\n\nfunction taskHasReadOnlyDeliverable(taskText: string): boolean {\n\treturn READ_ONLY_DELIVERABLE_PATTERNS.some((pattern) => pattern.test(taskText));\n}\n\nfunction hasImplementationIntent(taskText: string): boolean {\n\treturn GENERAL_IMPLEMENTATION_PATTERNS.some((pattern) => pattern.test(taskText))\n\t\t|| WORKER_IMPLEMENTATION_PATTERNS.some((pattern) => pattern.test(taskText))\n\t\t|| REVIEWER_REQUIRED_EDIT_PATTERNS.some((pattern) => pattern.test(taskText));\n}\n\nfunction isReadOnlyPermission(permissionsOrLegacyName: string | undefined): boolean {\n\treturn permissionsOrLegacyName === \"read-only\";\n}\n\nexport function classifyTaskMutationIntent(permissionsOrLegacyName: string, task: string): TaskMutationIntent {\n\tif (isReadOnlyPermission(permissionsOrLegacyName)) return { kind: \"read-only\" };\n\tconst taskText = stripFrameworkInstructions(task);\n\tconst taskTextWithoutScopedConstraints = stripPatterns(taskText, SCOPED_NO_EDIT_CONSTRAINT_PATTERNS);\n\tconst prohibitions = analyzeNoEditProhibitions(taskTextWithoutScopedConstraints);\n\tif (prohibitions.present) {\n\t\tif (prohibitions.blanket) return { kind: \"read-only\" };\n\t\treturn hasImplementationIntent(prohibitions.strippedText) ? { kind: \"implementation\" } : { kind: \"read-only\" };\n\t}\n\n\tif (hasImplementationIntent(taskText)) return { kind: \"implementation\" };\n\tif (RESEARCH_TASK_PATTERNS.some((pattern) => pattern.test(taskText)) && !hasImplementationIntent(taskText)) {\n\t\treturn { kind: \"read-only\" };\n\t}\n\treturn taskHasReadOnlyDeliverable(taskTextWithoutScopedConstraints) ? { kind: \"read-only\" } : { kind: \"unknown\" };\n}\n\nexport function expectsImplementationMutation(permissionsOrLegacyName: string, task: string): boolean {\n\tif (isReadOnlyPermission(permissionsOrLegacyName)) return false;\n\treturn classifyTaskMutationIntent(permissionsOrLegacyName, task).kind === \"implementation\";\n}\n\n/** Bare write verbs that make a task write-capable for acceptance inference. */\nconst MAY_MUTATE_VERB_PATTERN = /\\b(?:fix|implement|update|write|edit|modify|migrate|delete|remove|refactor|commit)\\b/i;\n\n/**\n * Whether the task could plausibly change files. Blanket prohibitions win;\n * write verbs inside a scoped prohibition's object or a read-only deliverable\n * phrase (\"write a summary report\") do not count; any other bare write verb\n * does.\n */\nexport function taskMayMutate(task: string): boolean {\n\tconst taskText = stripPatterns(stripFrameworkInstructions(task), SCOPED_NO_EDIT_CONSTRAINT_PATTERNS);\n\tconst prohibitions = analyzeNoEditProhibitions(taskText);\n\tif (prohibitions.blanket) return false;\n\treturn MAY_MUTATE_VERB_PATTERN.test(stripPatterns(prohibitions.strippedText, READ_ONLY_DELIVERABLE_PATTERNS));\n}\n"]}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Normalize model-authored delegated tasks into ChildSpec before validation,
|
|
3
|
+
* rendering, persistence, or process spawning.
|
|
4
|
+
*/
|
|
5
|
+
import { type ChildPermission } from "../../../../core/subagent-permission-inherit.ts";
|
|
6
|
+
import type { ChildSpec } from "./types.ts";
|
|
7
|
+
export type { ChildSpec, ChildTier } from "./types.ts";
|
|
8
|
+
export declare const CHILD_DESCRIPTION_MAX_LENGTH = 80;
|
|
9
|
+
export interface DelegatedTaskInput {
|
|
10
|
+
task?: unknown;
|
|
11
|
+
description?: unknown;
|
|
12
|
+
permissions?: unknown;
|
|
13
|
+
model?: unknown;
|
|
14
|
+
tier?: unknown;
|
|
15
|
+
skill?: unknown;
|
|
16
|
+
cwd?: unknown;
|
|
17
|
+
output?: unknown;
|
|
18
|
+
outputMode?: unknown;
|
|
19
|
+
acceptance?: unknown;
|
|
20
|
+
toolBudget?: unknown;
|
|
21
|
+
count?: unknown;
|
|
22
|
+
reads?: unknown;
|
|
23
|
+
progress?: unknown;
|
|
24
|
+
label?: unknown;
|
|
25
|
+
phase?: unknown;
|
|
26
|
+
as?: unknown;
|
|
27
|
+
outputSchema?: unknown;
|
|
28
|
+
}
|
|
29
|
+
export interface NormalizeChildSpecOptions {
|
|
30
|
+
parentMode?: string;
|
|
31
|
+
runId: string;
|
|
32
|
+
index: number;
|
|
33
|
+
childId?: string;
|
|
34
|
+
defaultTask?: string;
|
|
35
|
+
fanoutAuthorized?: boolean;
|
|
36
|
+
pathLabel?: string;
|
|
37
|
+
}
|
|
38
|
+
export declare function allocateChildId(runId: string, index: number): string;
|
|
39
|
+
export declare function sanitizeChildDescription(value: string, max?: number): string;
|
|
40
|
+
export declare function validateChildDescription(value: unknown, pathLabel?: string): string;
|
|
41
|
+
export declare function parseChildPermissionsInput(value: unknown, pathLabel?: string): ChildPermission | undefined;
|
|
42
|
+
export declare function normalizeChildSpec(input: DelegatedTaskInput, options: NormalizeChildSpecOptions): ChildSpec;
|
|
43
|
+
export declare function childDisplayLabel(spec: Pick<ChildSpec, "description" | "label">): string;
|
|
44
|
+
export declare function tryNormalizeChildSpec(input: DelegatedTaskInput, options: NormalizeChildSpecOptions): {
|
|
45
|
+
ok: true;
|
|
46
|
+
spec: ChildSpec;
|
|
47
|
+
} | {
|
|
48
|
+
ok: false;
|
|
49
|
+
error: string;
|
|
50
|
+
};
|
|
51
|
+
export declare function childIdentityFields(spec: ChildSpec): {
|
|
52
|
+
childId: string;
|
|
53
|
+
description: string;
|
|
54
|
+
permissions: ChildPermission;
|
|
55
|
+
agent: string;
|
|
56
|
+
};
|
|
57
|
+
export declare function childOutputCapabilities(permissions: ChildPermission): {
|
|
58
|
+
tools: string[];
|
|
59
|
+
};
|
|
60
|
+
export declare function childSpawnPiArgDefaults(spec: ChildSpec): {
|
|
61
|
+
inheritProjectContext: true;
|
|
62
|
+
inheritSkills: false;
|
|
63
|
+
systemPromptMode: "append";
|
|
64
|
+
excludeTools: string[];
|
|
65
|
+
childPermission: ChildPermission;
|
|
66
|
+
childId: string;
|
|
67
|
+
childDescription: string;
|
|
68
|
+
childAgentName: string;
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=child-spec.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"child-spec.d.ts","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/shared/child-spec.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * Normalize model-authored delegated tasks into ChildSpec before validation,\n * rendering, persistence, or process spawning.\n */\n\nimport {\n\tPLAN_MODE_WRITE_SPAWN_ERROR,\n\tresolveChildPermissions,\n\ttype ChildPermission,\n} from \"../../../../core/subagent-permission-inherit.ts\";\nimport { resolveChildExcludeTools } from \"../runs/shared/child-tools.ts\";\nimport type { AcceptanceInput, ChildSpec, ChildTier, JsonSchemaObject, ToolBudgetConfig } from \"./types.ts\";\n\nexport type { ChildSpec, ChildTier } from \"./types.ts\";\n\nexport const CHILD_DESCRIPTION_MAX_LENGTH = 80;\n\nexport interface DelegatedTaskInput {\n\ttask?: unknown;\n\tdescription?: unknown;\n\tpermissions?: unknown;\n\tmodel?: unknown;\n\ttier?: unknown;\n\tskill?: unknown;\n\tcwd?: unknown;\n\toutput?: unknown;\n\toutputMode?: unknown;\n\tacceptance?: unknown;\n\ttoolBudget?: unknown;\n\tcount?: unknown;\n\treads?: unknown;\n\tprogress?: unknown;\n\tlabel?: unknown;\n\tphase?: unknown;\n\tas?: unknown;\n\toutputSchema?: unknown;\n}\n\nexport interface NormalizeChildSpecOptions {\n\tparentMode?: string;\n\trunId: string;\n\tindex: number;\n\tchildId?: string;\n\tdefaultTask?: string;\n\tfanoutAuthorized?: boolean;\n\tpathLabel?: string;\n}\n\nexport function allocateChildId(runId: string, index: number): string {\n\treturn `${runId}-${index}`;\n}\n\nexport function sanitizeChildDescription(value: string, max = CHILD_DESCRIPTION_MAX_LENGTH): string {\n\tconst collapsed = value.replace(/\\s+/g, \" \").trim();\n\tif (collapsed.length <= max) return collapsed;\n\treturn `${collapsed.slice(0, Math.max(1, max - 1))}…`;\n}\n\nexport function validateChildDescription(value: unknown, pathLabel = \"description\"): string {\n\tif (typeof value !== \"string\") {\n\t\tthrow new Error(`${pathLabel} is required and must be a concise single-line label (max ${CHILD_DESCRIPTION_MAX_LENGTH} characters).`);\n\t}\n\tif (/[\\r\\n]/.test(value)) {\n\t\tthrow new Error(`${pathLabel} must be a single line with no newlines.`);\n\t}\n\tconst trimmed = value.trim();\n\tif (!trimmed) {\n\t\tthrow new Error(`${pathLabel} is required and must be a concise single-line label (max ${CHILD_DESCRIPTION_MAX_LENGTH} characters).`);\n\t}\n\tif (trimmed.length > CHILD_DESCRIPTION_MAX_LENGTH) {\n\t\tthrow new Error(`${pathLabel} must be at most ${CHILD_DESCRIPTION_MAX_LENGTH} characters.`);\n\t}\n\treturn trimmed;\n}\n\nexport function parseChildPermissionsInput(value: unknown, pathLabel = \"permissions\"): ChildPermission | undefined {\n\tif (value === undefined) return undefined;\n\tif (value === \"full\" || value === \"read-only\") return value;\n\tthrow new Error(`${pathLabel} must be \"full\" or \"read-only\".`);\n}\n\nfunction optionalString(value: unknown): string | undefined {\n\treturn typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nfunction optionalSkill(value: unknown): string | string[] | false | undefined {\n\tif (value === false) return false;\n\tif (typeof value === \"string\") return value;\n\tif (Array.isArray(value) && value.every((entry) => typeof entry === \"string\")) return value as string[];\n\treturn undefined;\n}\n\nfunction optionalOutput(value: unknown): string | false | undefined {\n\tif (value === false) return false;\n\tif (typeof value === \"string\") return value;\n\treturn undefined;\n}\n\nfunction optionalReads(value: unknown): string[] | false | undefined {\n\tif (value === false) return false;\n\tif (Array.isArray(value) && value.every((entry) => typeof entry === \"string\")) return value as string[];\n\treturn undefined;\n}\n\nfunction optionalCount(value: unknown): number | undefined {\n\tif (typeof value === \"number\" && Number.isInteger(value) && value >= 1) return value;\n\treturn undefined;\n}\n\nexport function normalizeChildSpec(input: DelegatedTaskInput, options: NormalizeChildSpecOptions): ChildSpec {\n\tconst pathLabel = options.pathLabel ?? \"task\";\n\tconst description = validateChildDescription(input.description, `${pathLabel}.description`);\n\tconst task = typeof input.task === \"string\" && input.task.trim()\n\t\t? input.task\n\t\t: options.defaultTask;\n\tif (typeof task !== \"string\" || !task.trim()) {\n\t\tthrow new Error(`${pathLabel}.task is required.`);\n\t}\n\tconst requested = parseChildPermissionsInput(input.permissions, `${pathLabel}.permissions`);\n\tconst resolved = resolveChildPermissions(options.parentMode, requested);\n\tif (!resolved.ok) {\n\t\tthrow new Error(resolved.error || PLAN_MODE_WRITE_SPAWN_ERROR);\n\t}\n\tconst tier = input.tier === \"light\" || input.tier === \"standard\" || input.tier === \"heavy\" ? input.tier : undefined;\n\tconst outputMode = input.outputMode === \"inline\" || input.outputMode === \"file-only\" ? input.outputMode : undefined;\n\treturn {\n\t\tchildId: options.childId ?? allocateChildId(options.runId, options.index),\n\t\ttask,\n\t\tdescription,\n\t\trequestedPermissions: resolved.requested,\n\t\teffectivePermissions: resolved.effective,\n\t\tmodel: optionalString(input.model),\n\t\ttier,\n\t\tskill: optionalSkill(input.skill),\n\t\tcwd: optionalString(input.cwd),\n\t\toutput: optionalOutput(input.output),\n\t\toutputMode,\n\t\tacceptance: input.acceptance as AcceptanceInput | undefined,\n\t\ttoolBudget: input.toolBudget as ToolBudgetConfig | undefined,\n\t\tcount: optionalCount(input.count),\n\t\treads: optionalReads(input.reads),\n\t\tprogress: typeof input.progress === \"boolean\" ? input.progress : undefined,\n\t\tlabel: optionalString(input.label),\n\t\tphase: optionalString(input.phase),\n\t\tas: optionalString(input.as),\n\t\toutputSchema: input.outputSchema && typeof input.outputSchema === \"object\"\n\t\t\t? input.outputSchema as JsonSchemaObject\n\t\t\t: undefined,\n\t\tfanoutAuthorized: options.fanoutAuthorized === true,\n\t};\n}\n\nexport function childDisplayLabel(spec: Pick<ChildSpec, \"description\" | \"label\">): string {\n\treturn spec.label?.trim() || spec.description;\n}\n\nexport function tryNormalizeChildSpec(\n\tinput: DelegatedTaskInput,\n\toptions: NormalizeChildSpecOptions,\n): { ok: true; spec: ChildSpec } | { ok: false; error: string } {\n\ttry {\n\t\treturn { ok: true, spec: normalizeChildSpec(input, options) };\n\t} catch (error) {\n\t\treturn { ok: false, error: error instanceof Error ? error.message : String(error) };\n\t}\n}\n\nexport function childIdentityFields(spec: ChildSpec): {\n\tchildId: string;\n\tdescription: string;\n\tpermissions: ChildPermission;\n\tagent: string;\n} {\n\treturn {\n\t\tchildId: spec.childId,\n\t\tdescription: spec.description,\n\t\tpermissions: spec.effectivePermissions,\n\t\tagent: spec.description,\n\t};\n}\n\nexport function childOutputCapabilities(permissions: ChildPermission): { tools: string[] } {\n\treturn permissions === \"read-only\"\n\t\t? { tools: [\"read\"] }\n\t\t: { tools: [\"read\", \"edit\", \"write\", \"bash\"] };\n}\n\nexport function childSpawnPiArgDefaults(spec: ChildSpec): {\n\tinheritProjectContext: true;\n\tinheritSkills: false;\n\tsystemPromptMode: \"append\";\n\texcludeTools: string[];\n\tchildPermission: ChildPermission;\n\tchildId: string;\n\tchildDescription: string;\n\tchildAgentName: string;\n} {\n\treturn {\n\t\tinheritProjectContext: true,\n\t\tinheritSkills: false,\n\t\tsystemPromptMode: \"append\",\n\t\texcludeTools: resolveChildExcludeTools({\n\t\t\tpermissions: spec.effectivePermissions,\n\t\t\tfanoutAuthorized: spec.fanoutAuthorized,\n\t\t}),\n\t\tchildPermission: spec.effectivePermissions,\n\t\tchildId: spec.childId,\n\t\tchildDescription: spec.description,\n\t\tchildAgentName: spec.childId,\n\t};\n}\n"]}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
// @ts-nocheck
|
|
2
|
+
/**
|
|
3
|
+
* Normalize model-authored delegated tasks into ChildSpec before validation,
|
|
4
|
+
* rendering, persistence, or process spawning.
|
|
5
|
+
*/
|
|
6
|
+
import { PLAN_MODE_WRITE_SPAWN_ERROR, resolveChildPermissions, } from "../../../../core/subagent-permission-inherit.js";
|
|
7
|
+
import { resolveChildExcludeTools } from "../runs/shared/child-tools.js";
|
|
8
|
+
export const CHILD_DESCRIPTION_MAX_LENGTH = 80;
|
|
9
|
+
export function allocateChildId(runId, index) {
|
|
10
|
+
return `${runId}-${index}`;
|
|
11
|
+
}
|
|
12
|
+
export function sanitizeChildDescription(value, max = CHILD_DESCRIPTION_MAX_LENGTH) {
|
|
13
|
+
const collapsed = value.replace(/\s+/g, " ").trim();
|
|
14
|
+
if (collapsed.length <= max)
|
|
15
|
+
return collapsed;
|
|
16
|
+
return `${collapsed.slice(0, Math.max(1, max - 1))}…`;
|
|
17
|
+
}
|
|
18
|
+
export function validateChildDescription(value, pathLabel = "description") {
|
|
19
|
+
if (typeof value !== "string") {
|
|
20
|
+
throw new Error(`${pathLabel} is required and must be a concise single-line label (max ${CHILD_DESCRIPTION_MAX_LENGTH} characters).`);
|
|
21
|
+
}
|
|
22
|
+
if (/[\r\n]/.test(value)) {
|
|
23
|
+
throw new Error(`${pathLabel} must be a single line with no newlines.`);
|
|
24
|
+
}
|
|
25
|
+
const trimmed = value.trim();
|
|
26
|
+
if (!trimmed) {
|
|
27
|
+
throw new Error(`${pathLabel} is required and must be a concise single-line label (max ${CHILD_DESCRIPTION_MAX_LENGTH} characters).`);
|
|
28
|
+
}
|
|
29
|
+
if (trimmed.length > CHILD_DESCRIPTION_MAX_LENGTH) {
|
|
30
|
+
throw new Error(`${pathLabel} must be at most ${CHILD_DESCRIPTION_MAX_LENGTH} characters.`);
|
|
31
|
+
}
|
|
32
|
+
return trimmed;
|
|
33
|
+
}
|
|
34
|
+
export function parseChildPermissionsInput(value, pathLabel = "permissions") {
|
|
35
|
+
if (value === undefined)
|
|
36
|
+
return undefined;
|
|
37
|
+
if (value === "full" || value === "read-only")
|
|
38
|
+
return value;
|
|
39
|
+
throw new Error(`${pathLabel} must be "full" or "read-only".`);
|
|
40
|
+
}
|
|
41
|
+
function optionalString(value) {
|
|
42
|
+
return typeof value === "string" && value.trim() ? value : undefined;
|
|
43
|
+
}
|
|
44
|
+
function optionalSkill(value) {
|
|
45
|
+
if (value === false)
|
|
46
|
+
return false;
|
|
47
|
+
if (typeof value === "string")
|
|
48
|
+
return value;
|
|
49
|
+
if (Array.isArray(value) && value.every((entry) => typeof entry === "string"))
|
|
50
|
+
return value;
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
function optionalOutput(value) {
|
|
54
|
+
if (value === false)
|
|
55
|
+
return false;
|
|
56
|
+
if (typeof value === "string")
|
|
57
|
+
return value;
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
function optionalReads(value) {
|
|
61
|
+
if (value === false)
|
|
62
|
+
return false;
|
|
63
|
+
if (Array.isArray(value) && value.every((entry) => typeof entry === "string"))
|
|
64
|
+
return value;
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
function optionalCount(value) {
|
|
68
|
+
if (typeof value === "number" && Number.isInteger(value) && value >= 1)
|
|
69
|
+
return value;
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
export function normalizeChildSpec(input, options) {
|
|
73
|
+
const pathLabel = options.pathLabel ?? "task";
|
|
74
|
+
const description = validateChildDescription(input.description, `${pathLabel}.description`);
|
|
75
|
+
const task = typeof input.task === "string" && input.task.trim()
|
|
76
|
+
? input.task
|
|
77
|
+
: options.defaultTask;
|
|
78
|
+
if (typeof task !== "string" || !task.trim()) {
|
|
79
|
+
throw new Error(`${pathLabel}.task is required.`);
|
|
80
|
+
}
|
|
81
|
+
const requested = parseChildPermissionsInput(input.permissions, `${pathLabel}.permissions`);
|
|
82
|
+
const resolved = resolveChildPermissions(options.parentMode, requested);
|
|
83
|
+
if (!resolved.ok) {
|
|
84
|
+
throw new Error(resolved.error || PLAN_MODE_WRITE_SPAWN_ERROR);
|
|
85
|
+
}
|
|
86
|
+
const tier = input.tier === "light" || input.tier === "standard" || input.tier === "heavy" ? input.tier : undefined;
|
|
87
|
+
const outputMode = input.outputMode === "inline" || input.outputMode === "file-only" ? input.outputMode : undefined;
|
|
88
|
+
return {
|
|
89
|
+
childId: options.childId ?? allocateChildId(options.runId, options.index),
|
|
90
|
+
task,
|
|
91
|
+
description,
|
|
92
|
+
requestedPermissions: resolved.requested,
|
|
93
|
+
effectivePermissions: resolved.effective,
|
|
94
|
+
model: optionalString(input.model),
|
|
95
|
+
tier,
|
|
96
|
+
skill: optionalSkill(input.skill),
|
|
97
|
+
cwd: optionalString(input.cwd),
|
|
98
|
+
output: optionalOutput(input.output),
|
|
99
|
+
outputMode,
|
|
100
|
+
acceptance: input.acceptance,
|
|
101
|
+
toolBudget: input.toolBudget,
|
|
102
|
+
count: optionalCount(input.count),
|
|
103
|
+
reads: optionalReads(input.reads),
|
|
104
|
+
progress: typeof input.progress === "boolean" ? input.progress : undefined,
|
|
105
|
+
label: optionalString(input.label),
|
|
106
|
+
phase: optionalString(input.phase),
|
|
107
|
+
as: optionalString(input.as),
|
|
108
|
+
outputSchema: input.outputSchema && typeof input.outputSchema === "object"
|
|
109
|
+
? input.outputSchema
|
|
110
|
+
: undefined,
|
|
111
|
+
fanoutAuthorized: options.fanoutAuthorized === true,
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
export function childDisplayLabel(spec) {
|
|
115
|
+
return spec.label?.trim() || spec.description;
|
|
116
|
+
}
|
|
117
|
+
export function tryNormalizeChildSpec(input, options) {
|
|
118
|
+
try {
|
|
119
|
+
return { ok: true, spec: normalizeChildSpec(input, options) };
|
|
120
|
+
}
|
|
121
|
+
catch (error) {
|
|
122
|
+
return { ok: false, error: error instanceof Error ? error.message : String(error) };
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
export function childIdentityFields(spec) {
|
|
126
|
+
return {
|
|
127
|
+
childId: spec.childId,
|
|
128
|
+
description: spec.description,
|
|
129
|
+
permissions: spec.effectivePermissions,
|
|
130
|
+
agent: spec.description,
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
export function childOutputCapabilities(permissions) {
|
|
134
|
+
return permissions === "read-only"
|
|
135
|
+
? { tools: ["read"] }
|
|
136
|
+
: { tools: ["read", "edit", "write", "bash"] };
|
|
137
|
+
}
|
|
138
|
+
export function childSpawnPiArgDefaults(spec) {
|
|
139
|
+
return {
|
|
140
|
+
inheritProjectContext: true,
|
|
141
|
+
inheritSkills: false,
|
|
142
|
+
systemPromptMode: "append",
|
|
143
|
+
excludeTools: resolveChildExcludeTools({
|
|
144
|
+
permissions: spec.effectivePermissions,
|
|
145
|
+
fanoutAuthorized: spec.fanoutAuthorized,
|
|
146
|
+
}),
|
|
147
|
+
childPermission: spec.effectivePermissions,
|
|
148
|
+
childId: spec.childId,
|
|
149
|
+
childDescription: spec.description,
|
|
150
|
+
childAgentName: spec.childId,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=child-spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"child-spec.js","sourceRoot":"","sources":["../../../../../src/builtin-extensions/pi-subagents/src/shared/child-spec.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\n/**\n * Normalize model-authored delegated tasks into ChildSpec before validation,\n * rendering, persistence, or process spawning.\n */\n\nimport {\n\tPLAN_MODE_WRITE_SPAWN_ERROR,\n\tresolveChildPermissions,\n\ttype ChildPermission,\n} from \"../../../../core/subagent-permission-inherit.ts\";\nimport { resolveChildExcludeTools } from \"../runs/shared/child-tools.ts\";\nimport type { AcceptanceInput, ChildSpec, ChildTier, JsonSchemaObject, ToolBudgetConfig } from \"./types.ts\";\n\nexport type { ChildSpec, ChildTier } from \"./types.ts\";\n\nexport const CHILD_DESCRIPTION_MAX_LENGTH = 80;\n\nexport interface DelegatedTaskInput {\n\ttask?: unknown;\n\tdescription?: unknown;\n\tpermissions?: unknown;\n\tmodel?: unknown;\n\ttier?: unknown;\n\tskill?: unknown;\n\tcwd?: unknown;\n\toutput?: unknown;\n\toutputMode?: unknown;\n\tacceptance?: unknown;\n\ttoolBudget?: unknown;\n\tcount?: unknown;\n\treads?: unknown;\n\tprogress?: unknown;\n\tlabel?: unknown;\n\tphase?: unknown;\n\tas?: unknown;\n\toutputSchema?: unknown;\n}\n\nexport interface NormalizeChildSpecOptions {\n\tparentMode?: string;\n\trunId: string;\n\tindex: number;\n\tchildId?: string;\n\tdefaultTask?: string;\n\tfanoutAuthorized?: boolean;\n\tpathLabel?: string;\n}\n\nexport function allocateChildId(runId: string, index: number): string {\n\treturn `${runId}-${index}`;\n}\n\nexport function sanitizeChildDescription(value: string, max = CHILD_DESCRIPTION_MAX_LENGTH): string {\n\tconst collapsed = value.replace(/\\s+/g, \" \").trim();\n\tif (collapsed.length <= max) return collapsed;\n\treturn `${collapsed.slice(0, Math.max(1, max - 1))}…`;\n}\n\nexport function validateChildDescription(value: unknown, pathLabel = \"description\"): string {\n\tif (typeof value !== \"string\") {\n\t\tthrow new Error(`${pathLabel} is required and must be a concise single-line label (max ${CHILD_DESCRIPTION_MAX_LENGTH} characters).`);\n\t}\n\tif (/[\\r\\n]/.test(value)) {\n\t\tthrow new Error(`${pathLabel} must be a single line with no newlines.`);\n\t}\n\tconst trimmed = value.trim();\n\tif (!trimmed) {\n\t\tthrow new Error(`${pathLabel} is required and must be a concise single-line label (max ${CHILD_DESCRIPTION_MAX_LENGTH} characters).`);\n\t}\n\tif (trimmed.length > CHILD_DESCRIPTION_MAX_LENGTH) {\n\t\tthrow new Error(`${pathLabel} must be at most ${CHILD_DESCRIPTION_MAX_LENGTH} characters.`);\n\t}\n\treturn trimmed;\n}\n\nexport function parseChildPermissionsInput(value: unknown, pathLabel = \"permissions\"): ChildPermission | undefined {\n\tif (value === undefined) return undefined;\n\tif (value === \"full\" || value === \"read-only\") return value;\n\tthrow new Error(`${pathLabel} must be \"full\" or \"read-only\".`);\n}\n\nfunction optionalString(value: unknown): string | undefined {\n\treturn typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nfunction optionalSkill(value: unknown): string | string[] | false | undefined {\n\tif (value === false) return false;\n\tif (typeof value === \"string\") return value;\n\tif (Array.isArray(value) && value.every((entry) => typeof entry === \"string\")) return value as string[];\n\treturn undefined;\n}\n\nfunction optionalOutput(value: unknown): string | false | undefined {\n\tif (value === false) return false;\n\tif (typeof value === \"string\") return value;\n\treturn undefined;\n}\n\nfunction optionalReads(value: unknown): string[] | false | undefined {\n\tif (value === false) return false;\n\tif (Array.isArray(value) && value.every((entry) => typeof entry === \"string\")) return value as string[];\n\treturn undefined;\n}\n\nfunction optionalCount(value: unknown): number | undefined {\n\tif (typeof value === \"number\" && Number.isInteger(value) && value >= 1) return value;\n\treturn undefined;\n}\n\nexport function normalizeChildSpec(input: DelegatedTaskInput, options: NormalizeChildSpecOptions): ChildSpec {\n\tconst pathLabel = options.pathLabel ?? \"task\";\n\tconst description = validateChildDescription(input.description, `${pathLabel}.description`);\n\tconst task = typeof input.task === \"string\" && input.task.trim()\n\t\t? input.task\n\t\t: options.defaultTask;\n\tif (typeof task !== \"string\" || !task.trim()) {\n\t\tthrow new Error(`${pathLabel}.task is required.`);\n\t}\n\tconst requested = parseChildPermissionsInput(input.permissions, `${pathLabel}.permissions`);\n\tconst resolved = resolveChildPermissions(options.parentMode, requested);\n\tif (!resolved.ok) {\n\t\tthrow new Error(resolved.error || PLAN_MODE_WRITE_SPAWN_ERROR);\n\t}\n\tconst tier = input.tier === \"light\" || input.tier === \"standard\" || input.tier === \"heavy\" ? input.tier : undefined;\n\tconst outputMode = input.outputMode === \"inline\" || input.outputMode === \"file-only\" ? input.outputMode : undefined;\n\treturn {\n\t\tchildId: options.childId ?? allocateChildId(options.runId, options.index),\n\t\ttask,\n\t\tdescription,\n\t\trequestedPermissions: resolved.requested,\n\t\teffectivePermissions: resolved.effective,\n\t\tmodel: optionalString(input.model),\n\t\ttier,\n\t\tskill: optionalSkill(input.skill),\n\t\tcwd: optionalString(input.cwd),\n\t\toutput: optionalOutput(input.output),\n\t\toutputMode,\n\t\tacceptance: input.acceptance as AcceptanceInput | undefined,\n\t\ttoolBudget: input.toolBudget as ToolBudgetConfig | undefined,\n\t\tcount: optionalCount(input.count),\n\t\treads: optionalReads(input.reads),\n\t\tprogress: typeof input.progress === \"boolean\" ? input.progress : undefined,\n\t\tlabel: optionalString(input.label),\n\t\tphase: optionalString(input.phase),\n\t\tas: optionalString(input.as),\n\t\toutputSchema: input.outputSchema && typeof input.outputSchema === \"object\"\n\t\t\t? input.outputSchema as JsonSchemaObject\n\t\t\t: undefined,\n\t\tfanoutAuthorized: options.fanoutAuthorized === true,\n\t};\n}\n\nexport function childDisplayLabel(spec: Pick<ChildSpec, \"description\" | \"label\">): string {\n\treturn spec.label?.trim() || spec.description;\n}\n\nexport function tryNormalizeChildSpec(\n\tinput: DelegatedTaskInput,\n\toptions: NormalizeChildSpecOptions,\n): { ok: true; spec: ChildSpec } | { ok: false; error: string } {\n\ttry {\n\t\treturn { ok: true, spec: normalizeChildSpec(input, options) };\n\t} catch (error) {\n\t\treturn { ok: false, error: error instanceof Error ? error.message : String(error) };\n\t}\n}\n\nexport function childIdentityFields(spec: ChildSpec): {\n\tchildId: string;\n\tdescription: string;\n\tpermissions: ChildPermission;\n\tagent: string;\n} {\n\treturn {\n\t\tchildId: spec.childId,\n\t\tdescription: spec.description,\n\t\tpermissions: spec.effectivePermissions,\n\t\tagent: spec.description,\n\t};\n}\n\nexport function childOutputCapabilities(permissions: ChildPermission): { tools: string[] } {\n\treturn permissions === \"read-only\"\n\t\t? { tools: [\"read\"] }\n\t\t: { tools: [\"read\", \"edit\", \"write\", \"bash\"] };\n}\n\nexport function childSpawnPiArgDefaults(spec: ChildSpec): {\n\tinheritProjectContext: true;\n\tinheritSkills: false;\n\tsystemPromptMode: \"append\";\n\texcludeTools: string[];\n\tchildPermission: ChildPermission;\n\tchildId: string;\n\tchildDescription: string;\n\tchildAgentName: string;\n} {\n\treturn {\n\t\tinheritProjectContext: true,\n\t\tinheritSkills: false,\n\t\tsystemPromptMode: \"append\",\n\t\texcludeTools: resolveChildExcludeTools({\n\t\t\tpermissions: spec.effectivePermissions,\n\t\t\tfanoutAuthorized: spec.fanoutAuthorized,\n\t\t}),\n\t\tchildPermission: spec.effectivePermissions,\n\t\tchildId: spec.childId,\n\t\tchildDescription: spec.description,\n\t\tchildAgentName: spec.childId,\n\t};\n}\n"]}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Chain behavior, template resolution, and directory management
|
|
3
3
|
*/
|
|
4
|
-
import type { AgentConfig } from "../agents/agents.ts";
|
|
5
4
|
import { type AcceptanceInput, type JsonSchemaObject, type OutputMode, type ToolBudgetConfig } from "./types.ts";
|
|
6
5
|
export interface ResolvedStepBehavior {
|
|
7
6
|
output: string | false;
|
|
@@ -19,10 +18,12 @@ export interface StepOverrides {
|
|
|
19
18
|
skills?: string[] | false;
|
|
20
19
|
model?: string;
|
|
21
20
|
}
|
|
22
|
-
/** Sequential step: single
|
|
21
|
+
/** Sequential step: single generic child execution */
|
|
23
22
|
export interface SequentialStep {
|
|
24
|
-
agent
|
|
23
|
+
agent?: string;
|
|
25
24
|
task?: string;
|
|
25
|
+
description?: string;
|
|
26
|
+
permissions?: "full" | "read-only";
|
|
26
27
|
phase?: string;
|
|
27
28
|
label?: string;
|
|
28
29
|
as?: string;
|
|
@@ -34,13 +35,16 @@ export interface SequentialStep {
|
|
|
34
35
|
progress?: boolean;
|
|
35
36
|
skill?: string | string[] | false;
|
|
36
37
|
model?: string;
|
|
38
|
+
tier?: "light" | "standard" | "heavy";
|
|
37
39
|
toolBudget?: ToolBudgetConfig;
|
|
38
40
|
acceptance?: AcceptanceInput;
|
|
39
41
|
}
|
|
40
42
|
/** Parallel task item within a parallel step */
|
|
41
43
|
export interface ParallelTaskItem {
|
|
42
|
-
agent
|
|
44
|
+
agent?: string;
|
|
43
45
|
task?: string;
|
|
46
|
+
description?: string;
|
|
47
|
+
permissions?: "full" | "read-only";
|
|
44
48
|
phase?: string;
|
|
45
49
|
label?: string;
|
|
46
50
|
as?: string;
|
|
@@ -53,6 +57,7 @@ export interface ParallelTaskItem {
|
|
|
53
57
|
progress?: boolean;
|
|
54
58
|
skill?: string | string[] | false;
|
|
55
59
|
model?: string;
|
|
60
|
+
tier?: "light" | "standard" | "heavy";
|
|
56
61
|
toolBudget?: ToolBudgetConfig;
|
|
57
62
|
acceptance?: AcceptanceInput;
|
|
58
63
|
}
|
|
@@ -93,7 +98,7 @@ export interface ParallelStep {
|
|
|
93
98
|
export type ChainStep = SequentialStep | ParallelStep | DynamicParallelStep;
|
|
94
99
|
export declare function isParallelStep(step: ChainStep): step is ParallelStep;
|
|
95
100
|
export declare function isDynamicParallelStep(step: ChainStep): step is DynamicParallelStep;
|
|
96
|
-
/** Get
|
|
101
|
+
/** Get display labels (description) for children in a step. */
|
|
97
102
|
export declare function getStepAgents(step: ChainStep): string[];
|
|
98
103
|
export declare function createChainDir(runId: string, baseDir?: string): string;
|
|
99
104
|
export declare function removeChainDir(chainDir: string): void;
|
|
@@ -107,9 +112,9 @@ export type ResolvedTemplates = (string | string[])[];
|
|
|
107
112
|
export declare function resolveChainTemplates(steps: ChainStep[]): ResolvedTemplates;
|
|
108
113
|
/**
|
|
109
114
|
* Resolve effective chain behavior per step.
|
|
110
|
-
* Priority: step override >
|
|
115
|
+
* Priority: step override > false (disabled). Children have no named-agent defaults.
|
|
111
116
|
*/
|
|
112
|
-
export declare function resolveStepBehavior(
|
|
117
|
+
export declare function resolveStepBehavior(stepOverrides: StepOverrides, chainSkills?: string[]): ResolvedStepBehavior;
|
|
113
118
|
export declare function resolveTaskTextForFileUpdatePolicy(task: string | undefined, originalTask?: string): string | undefined;
|
|
114
119
|
export declare function taskDisallowsFileUpdates(task: string | undefined): boolean;
|
|
115
120
|
export declare function suppressProgressForReadOnlyTask(behavior: ResolvedStepBehavior, task: string | undefined, originalTask?: string): ResolvedStepBehavior;
|
|
@@ -126,7 +131,7 @@ export declare function buildChainInstructions(behavior: ResolvedStepBehavior, c
|
|
|
126
131
|
* Resolve behaviors for all tasks in a parallel step.
|
|
127
132
|
* Creates namespaced output paths to avoid collisions.
|
|
128
133
|
*/
|
|
129
|
-
export declare function resolveParallelBehaviors(tasks: ParallelTaskItem[],
|
|
134
|
+
export declare function resolveParallelBehaviors(tasks: ParallelTaskItem[], stepIndex: number, chainSkills?: string[]): ResolvedStepBehavior[];
|
|
130
135
|
/**
|
|
131
136
|
* Create subdirectories for parallel step outputs
|
|
132
137
|
*/
|