@selesai/code 0.8.3 → 0.8.5
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 +15 -0
- package/README.md +7 -1
- package/dist/core/slash-commands.js +1 -0
- package/dist/defaults/models.json +41 -55
- package/dist/defaults/settings.json +7 -8
- package/dist/extensions/handoff-new.ts +1 -1
- package/dist/extensions/inline-skills.test.ts +1 -0
- package/dist/extensions/inline-skills.ts +1 -1
- package/dist/extensions/pi-intercom/CHANGELOG.md +25 -3
- package/dist/extensions/pi-intercom/README.md +34 -15
- package/dist/extensions/pi-intercom/broker/broker.ts +38 -141
- package/dist/extensions/pi-intercom/broker/client-liveness.test.ts +173 -0
- package/dist/extensions/pi-intercom/broker/client.ts +78 -150
- package/dist/extensions/pi-intercom/broker/extension-state.ts +18 -7
- package/dist/extensions/pi-intercom/broker/framing.ts +1 -1
- package/dist/extensions/pi-intercom/broker/protocol.ts +182 -0
- package/dist/extensions/pi-intercom/broker/spawn.test.ts +106 -7
- package/dist/extensions/pi-intercom/broker/spawn.ts +37 -11
- package/dist/extensions/pi-intercom/config.test.ts +8 -10
- package/dist/extensions/pi-intercom/config.ts +3 -3
- package/dist/extensions/pi-intercom/index.ts +218 -147
- package/dist/extensions/pi-intercom/intercom.integration.test.ts +891 -103
- package/dist/extensions/pi-intercom/package.json +3 -2
- package/dist/extensions/pi-intercom/project-agent.test.ts +145 -0
- package/dist/extensions/pi-intercom/project-agent.ts +324 -0
- package/dist/extensions/pi-intercom/reply-tracker.test.ts +86 -1
- package/dist/extensions/pi-intercom/reply-tracker.ts +41 -9
- package/dist/extensions/pi-intercom/skills/pi-intercom/SKILL.md +49 -9
- package/dist/extensions/pi-intercom/test/inline-message.test.ts +9 -9
- package/dist/extensions/pi-intercom/types.ts +3 -1
- package/dist/extensions/pi-intercom/ui/inline-message.ts +7 -7
- package/dist/extensions/pi-powerline-footer/.github/workflows/test.yml +2 -2
- package/dist/extensions/pi-powerline-footer/CHANGELOG.md +14 -1
- package/dist/extensions/pi-powerline-footer/README.md +20 -37
- package/dist/extensions/pi-powerline-footer/bash-mode/completion.ts +40 -25
- package/dist/extensions/pi-powerline-footer/bash-mode/editor.ts +149 -18
- package/dist/extensions/pi-powerline-footer/bash-mode/types.ts +1 -0
- package/dist/extensions/pi-powerline-footer/editor-performance.ts +99 -0
- package/dist/extensions/pi-powerline-footer/git-status.ts +15 -0
- package/dist/extensions/pi-powerline-footer/index.ts +394 -317
- package/dist/extensions/pi-powerline-footer/package.json +1 -1
- package/dist/extensions/pi-powerline-footer/powerline-config.ts +0 -12
- package/dist/extensions/pi-powerline-footer/queue/store.ts +8 -56
- package/dist/extensions/pi-powerline-footer/queue/types.ts +1 -2
- package/dist/extensions/pi-powerline-footer/segments.ts +0 -3
- package/dist/extensions/pi-powerline-footer/tests/bash-mode.test.ts +231 -1
- package/dist/extensions/pi-powerline-footer/tests/custom-items.test.ts +5 -19
- package/dist/extensions/pi-powerline-footer/tests/editor-performance.test.ts +43 -0
- package/dist/extensions/pi-powerline-footer/tests/git-optional-locks.test.ts +64 -0
- package/dist/extensions/pi-powerline-footer/tests/jump-shortcuts.test.ts +116 -0
- package/dist/extensions/pi-powerline-footer/tests/queue-store.test.ts +19 -149
- package/dist/extensions/pi-powerline-footer/tests/remaining-regressions.test.ts +6 -0
- package/dist/extensions/pi-powerline-footer/tests/usage-display.test.ts +5 -5
- package/dist/extensions/pi-powerline-footer/types.ts +1 -2
- package/dist/extensions/pi-subagents/CHANGELOG.md +225 -14
- package/dist/extensions/pi-subagents/README.md +66 -1613
- package/dist/extensions/pi-subagents/agents/builder.md +0 -1
- package/dist/extensions/pi-subagents/agents/delegate.md +14 -0
- package/dist/extensions/pi-subagents/agents/oracle.md +74 -0
- package/dist/extensions/pi-subagents/agents/reviewer.md +78 -0
- package/dist/extensions/pi-subagents/agents/scout.md +50 -0
- package/dist/extensions/pi-subagents/agents/worker.md +58 -0
- package/dist/extensions/pi-subagents/docs/configuration.md +372 -0
- package/dist/extensions/pi-subagents/docs/extension-api.md +308 -0
- package/dist/extensions/pi-subagents/docs/missions.md +119 -0
- package/dist/extensions/pi-subagents/docs/models.md +192 -0
- package/dist/extensions/pi-subagents/docs/observability.md +174 -0
- package/dist/extensions/pi-subagents/docs/tool-reference.md +343 -0
- package/dist/extensions/pi-subagents/docs/watchdog.md +176 -0
- package/dist/extensions/pi-subagents/docs/workflows.md +163 -0
- package/dist/extensions/pi-subagents/inspector-runner.mjs +11 -0
- package/dist/extensions/pi-subagents/package-lock.json +152 -194
- package/dist/extensions/pi-subagents/package.json +9 -10
- package/dist/extensions/pi-subagents/prompts/gather-context-and-clarify.md +1 -1
- package/dist/extensions/pi-subagents/prompts/parallel-cleanup.md +9 -9
- package/dist/extensions/pi-subagents/prompts/parallel-research.md +6 -6
- package/dist/extensions/pi-subagents/prompts/parallel-review.md +8 -8
- package/dist/extensions/pi-subagents/prompts/review-loop.md +12 -12
- package/dist/extensions/pi-subagents/skills/pi-subagents/SKILL.md +22 -17
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/constraints-and-recipes.md +77 -72
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/execution-controls.md +177 -69
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/management-authoring-rpc.md +28 -8
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/prompting-and-roles.md +88 -66
- package/dist/extensions/pi-subagents/src/agents/agent-management.ts +3 -3
- package/dist/extensions/pi-subagents/src/agents/agent-refinements.ts +624 -0
- package/dist/extensions/pi-subagents/src/agents/agents.ts +38 -19
- package/dist/extensions/pi-subagents/src/agents/frontmatter.ts +7 -3
- package/dist/extensions/pi-subagents/src/agents/proactive-skills.ts +2 -2
- package/dist/extensions/pi-subagents/src/agents/skills.ts +2 -9
- package/dist/extensions/pi-subagents/src/api/delegation.ts +1 -2
- package/dist/extensions/pi-subagents/src/api/project-panes.ts +30 -0
- package/dist/extensions/pi-subagents/src/extension/config.ts +62 -8
- package/dist/extensions/pi-subagents/src/extension/control-notices.ts +2 -2
- package/dist/extensions/pi-subagents/src/extension/doctor.ts +40 -0
- package/dist/extensions/pi-subagents/src/extension/fanout-child.ts +51 -26
- package/dist/extensions/pi-subagents/src/extension/index.ts +140 -50
- package/dist/extensions/pi-subagents/src/extension/public-execution.ts +77 -0
- package/dist/extensions/pi-subagents/src/extension/rpc.ts +18 -24
- package/dist/extensions/pi-subagents/src/extension/schemas.ts +58 -21
- package/dist/extensions/pi-subagents/src/extension/subagent-guide.ts +39 -0
- package/dist/extensions/pi-subagents/src/extension/tool-description.ts +47 -25
- package/dist/extensions/pi-subagents/src/inspectors/herdr/actions.ts +3 -3
- package/dist/extensions/pi-subagents/src/inspectors/herdr/project-panes.ts +460 -64
- package/dist/extensions/pi-subagents/src/intercom/intercom-bridge.ts +4 -1
- package/dist/extensions/pi-subagents/src/intercom/native-supervisor-channel.ts +102 -4
- package/dist/extensions/pi-subagents/src/missions/actions.ts +77 -16
- package/dist/extensions/pi-subagents/src/missions/goal-driver.ts +162 -0
- package/dist/extensions/pi-subagents/src/missions/lifecycle.ts +65 -17
- package/dist/extensions/pi-subagents/src/missions/store.ts +151 -9
- package/dist/extensions/pi-subagents/src/missions/types.ts +58 -3
- package/dist/extensions/pi-subagents/src/missions/workflow-state.ts +260 -0
- package/dist/extensions/pi-subagents/src/profiles/profiles.ts +8 -8
- package/dist/extensions/pi-subagents/src/runs/background/active-async-capacity.ts +374 -0
- package/dist/extensions/pi-subagents/src/runs/background/active-run-index.ts +46 -0
- package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +158 -36
- package/dist/extensions/pi-subagents/src/runs/background/async-job-tracker.ts +294 -134
- package/dist/extensions/pi-subagents/src/runs/background/async-resume.ts +26 -4
- package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +45 -6
- package/dist/extensions/pi-subagents/src/runs/background/chain-append.ts +33 -15
- package/dist/extensions/pi-subagents/src/runs/background/completion-replay.ts +267 -0
- package/dist/extensions/pi-subagents/src/runs/background/control-channel.ts +145 -60
- package/dist/extensions/pi-subagents/src/runs/background/owned-process-tree.ts +104 -0
- package/dist/extensions/pi-subagents/src/runs/background/process-terminal.ts +17 -3
- package/dist/extensions/pi-subagents/src/runs/background/result-watcher.ts +114 -6
- package/dist/extensions/pi-subagents/src/runs/background/resume-guidance.ts +33 -0
- package/dist/extensions/pi-subagents/src/runs/background/retained-children.ts +68 -0
- package/dist/extensions/pi-subagents/src/runs/background/run-id-resolver.ts +71 -0
- package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +26 -3
- package/dist/extensions/pi-subagents/src/runs/background/scheduled-runs.ts +42 -14
- package/dist/extensions/pi-subagents/src/runs/background/stale-run-reconciler.ts +12 -24
- package/dist/extensions/pi-subagents/src/runs/background/steering.ts +7 -5
- package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +233 -101
- package/dist/extensions/pi-subagents/src/runs/background/subagent-wait.ts +17 -4
- package/dist/extensions/pi-subagents/src/runs/background/wait-completions.ts +146 -0
- package/dist/extensions/pi-subagents/src/runs/background/wait-subscriptions.ts +21 -5
- package/dist/extensions/pi-subagents/src/runs/foreground/async-dismiss-action.ts +85 -0
- package/dist/extensions/pi-subagents/src/runs/foreground/async-steering-action.ts +43 -18
- package/dist/extensions/pi-subagents/src/runs/foreground/chain-clarify.ts +20 -19
- package/dist/extensions/pi-subagents/src/runs/foreground/chain-execution.ts +40 -2
- package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +188 -46
- package/dist/extensions/pi-subagents/src/runs/foreground/foreground-control.ts +12 -0
- package/dist/extensions/pi-subagents/src/runs/foreground/foreground-history.ts +137 -0
- package/dist/extensions/pi-subagents/src/runs/foreground/prompt-audit.ts +171 -0
- package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +1365 -252
- package/dist/extensions/pi-subagents/src/runs/foreground/workflow-foreground-steering.ts +187 -0
- package/dist/extensions/pi-subagents/src/runs/shared/acceptance.ts +178 -26
- package/dist/extensions/pi-subagents/src/runs/shared/dynamic-fanout.ts +1 -1
- package/dist/extensions/pi-subagents/src/runs/shared/llm-intent-arbiter.ts +286 -0
- package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +2 -0
- package/dist/extensions/pi-subagents/src/runs/shared/model-fallback.ts +32 -5
- package/dist/extensions/pi-subagents/src/runs/shared/model-scope.ts +12 -2
- package/dist/extensions/pi-subagents/src/runs/shared/parallel-utils.ts +3 -0
- package/dist/extensions/pi-subagents/src/runs/shared/pi-args.ts +509 -117
- package/dist/extensions/pi-subagents/src/runs/shared/pi-spawn.ts +10 -10
- package/dist/extensions/pi-subagents/src/runs/shared/run-fanout-budget.ts +280 -0
- package/dist/extensions/pi-subagents/src/runs/shared/single-output.ts +4 -2
- package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +189 -32
- package/dist/extensions/pi-subagents/src/runs/shared/task-intent.ts +21 -5
- package/dist/extensions/pi-subagents/src/runs/shared/worktree.ts +20 -8
- package/dist/extensions/pi-subagents/src/shared/artifacts.ts +128 -3
- package/dist/extensions/pi-subagents/src/shared/display-text.ts +100 -0
- package/dist/extensions/pi-subagents/src/shared/file-coalescer.ts +9 -0
- package/dist/extensions/pi-subagents/src/shared/fork-context.ts +13 -0
- package/dist/extensions/pi-subagents/src/shared/formatters.ts +4 -6
- package/dist/extensions/pi-subagents/src/shared/prompt-resources.ts +51 -0
- package/dist/extensions/pi-subagents/src/shared/settings.ts +41 -11
- package/dist/extensions/pi-subagents/src/shared/types.ts +192 -3
- package/dist/extensions/pi-subagents/src/shared/utf8.ts +11 -0
- package/dist/extensions/pi-subagents/src/shared/utils.ts +46 -34
- package/dist/extensions/pi-subagents/src/slash/delegation-adapters.ts +1 -14
- package/dist/extensions/pi-subagents/src/slash/inline-subagents.ts +1 -1
- package/dist/extensions/pi-subagents/src/slash/prompt-template-bridge.ts +14 -12
- package/dist/extensions/pi-subagents/src/slash/prompt-workflows.ts +176 -21
- package/dist/extensions/pi-subagents/src/slash/slash-bridge.ts +12 -6
- package/dist/extensions/pi-subagents/src/slash/slash-commands.ts +52 -18
- package/dist/extensions/pi-subagents/src/slash/slash-live-state.ts +36 -5
- package/dist/extensions/pi-subagents/src/tui/fleet-status.ts +37 -21
- package/dist/extensions/pi-subagents/src/tui/fleet.ts +375 -42
- package/dist/extensions/pi-subagents/src/tui/render.ts +201 -68
- package/dist/extensions/pi-subagents/src/types/pi-runtime-compat.d.ts +0 -6
- package/dist/extensions/pi-subagents/src/watchdog/change-signature.ts +5 -4
- package/dist/extensions/pi-subagents/src/watchdog/lsp-diagnostics.ts +0 -1
- package/dist/extensions/pi-subagents/src/workflows/scripted-workflow.ts +332 -27
- package/dist/extensions/pi-subagents/test/e2e/real-session-subagent.test.ts +15 -15
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/cli.d.ts +3 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/register-bedrock.d.ts +2 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/bun/restore-sandbox-env.d.ts +17 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/args.d.ts +57 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/config-selector.d.ts +16 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/file-processor.d.ts +15 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/initial-message.d.ts +18 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/list-models.d.ts +9 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/project-trust.d.ts +10 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/session-picker.d.ts +10 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli/startup-ui.d.ts +20 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/cli.d.ts +3 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/config.d.ts +96 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session-runtime.d.ts +119 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session-services.d.ts +85 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/agent-session.d.ts +620 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/auth-guidance.d.ts +5 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/auth-storage.d.ts +56 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/bash-executor.d.ts +32 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/cache-stats.d.ts +49 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/branch-summarization.d.ts +93 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/compaction.d.ts +128 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/index.d.ts +7 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/compaction/utils.d.ts +38 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/defaults.d.ts +3 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/diagnostics.d.ts +15 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/event-bus.d.ts +9 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/exec.d.ts +29 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/experimental.d.ts +2 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/ansi-to-html.d.ts +22 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/index.d.ts +37 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/export-html/tool-renderer.d.ts +34 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/index.d.ts +12 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/loader.d.ts +23 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/runner.d.ts +171 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/types.d.ts +1261 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/extensions/wrapper.d.ts +20 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/footer-data-provider.d.ts +54 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/http-dispatcher.d.ts +22 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/index.d.ts +13 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/keybindings.d.ts +358 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/messages.d.ts +77 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-config.d.ts +512 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-registry.d.ts +43 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-resolver.d.ts +121 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/model-runtime.d.ts +82 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/models-store.d.ts +17 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/output-guard.d.ts +7 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/package-manager.d.ts +210 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/project-trust.d.ts +15 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/prompt-templates.d.ts +54 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/provider-attribution.d.ts +4 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/provider-composer.d.ts +55 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/radius.d.ts +2 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/remote-catalog-provider.d.ts +5 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/resolve-config-value.d.ts +30 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/resource-loader.d.ts +206 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/runtime-credentials.d.ts +15 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/sdk.d.ts +106 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/session-cwd.d.ts +19 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/session-manager.d.ts +356 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/settings-manager.d.ts +297 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/skills.d.ts +60 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/slash-commands.d.ts +15 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/source-info.d.ts +18 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/system-prompt.d.ts +28 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/telemetry.d.ts +3 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/timings.d.ts +10 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/bash.d.ts +68 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/edit-diff.d.ts +106 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/edit.d.ts +51 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/file-mutation-queue.d.ts +6 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/find.d.ts +35 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/grep.d.ts +37 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/index.d.ts +40 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/ls.d.ts +37 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/output-accumulator.d.ts +52 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/path-utils.d.ts +10 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/read.d.ts +35 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/render-utils.d.ts +24 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/truncate.d.ts +70 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/tools/write.d.ts +26 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/trust-manager.d.ts +36 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/core/usage-totals.d.ts +19 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/index.d.ts +3 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/client.d.ts +61 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/huggingface.d.ts +23 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/index.d.ts +3 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/provider.d.ts +10 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/extensions/llama/ui.d.ts +42 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/index.d.ts +35 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/main.d.ts +12 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/migrations.d.ts +33 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/index.d.ts +9 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/armin.d.ts +34 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/assistant-message.d.ts +22 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/bash-execution.d.ts +34 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/config-selector.d.ts +102 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-editor.d.ts +21 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-entry.d.ts +19 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/custom-message.d.ts +20 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/daxnuts.d.ts +23 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/diff.d.ts +12 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/earendil-announcement.d.ts +5 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-editor.d.ts +22 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-input.d.ts +23 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/extension-selector.d.ts +26 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/first-time-setup.d.ts +25 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/footer.d.ts +32 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/index.d.ts +34 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/keybinding-hints.d.ts +13 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/login-dialog.d.ts +52 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/model-selector.d.ts +54 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/oauth-selector.d.ts +33 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/scoped-models-selector.d.ts +42 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/session-selector.d.ts +95 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/settings-selector.d.ts +77 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/status-indicator.d.ts +28 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/theme-selector.d.ts +11 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/thinking-selector.d.ts +11 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/tool-execution.d.ts +63 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/tree-selector.d.ts +94 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/trust-selector.d.ts +23 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/user-message.d.ts +14 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/interactive-mode.d.ts +394 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/model-search.d.ts +12 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/theme/theme-controller.d.ts +29 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/interactive/theme/theme.d.ts +120 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/print-mode.d.ts +28 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/jsonl.d.ts +17 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-client.d.ts +246 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-mode.d.ts +20 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/modes/rpc/rpc-types.d.ts +457 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/package-manager-cli.d.ts +8 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/rpc-entry.d.ts +3 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/ansi.d.ts +2 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/changelog.d.ts +22 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/child-process.d.ts +18 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard-image.d.ts +11 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard-native.d.ts +11 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/clipboard.d.ts +4 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/deprecation.d.ts +4 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/exif-orientation.d.ts +5 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/frontmatter.d.ts +8 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/fs-watch.d.ts +5 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/git.d.ts +26 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/html.d.ts +7 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-convert.d.ts +10 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-process.d.ts +18 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize-core.d.ts +30 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize-worker.d.ts +2 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/image-resize.d.ts +16 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/json.d.ts +3 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/mime.d.ts +3 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/open-browser.d.ts +9 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/paths.d.ts +31 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/photon.d.ts +21 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/pi-user-agent.d.ts +2 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/shell.d.ts +31 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/sleep.d.ts +5 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/syntax-highlight.d.ts +12 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/tools-manager.d.ts +3 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/version-check.d.ts +15 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/dist/utils/windows-self-update.d.ts +3 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/index.mjs +84 -0
- package/dist/extensions/pi-subagents/test/fixtures/pi-coding-agent-shim/package.json +14 -0
- package/dist/extensions/pi-subagents/test/integration/acceptance-file-report.test.ts +102 -15
- package/dist/extensions/pi-subagents/test/integration/async-execution.test.ts +507 -306
- package/dist/extensions/pi-subagents/test/integration/async-job-tracker.test.ts +309 -123
- package/dist/extensions/pi-subagents/test/integration/async-status.test.ts +124 -58
- package/dist/extensions/pi-subagents/test/integration/chain-clarify.test.ts +62 -16
- package/dist/extensions/pi-subagents/test/integration/chain-execution.test.ts +167 -113
- package/dist/extensions/pi-subagents/test/integration/detect-error.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/integration/external-cli-runner.test.ts +4 -2
- package/dist/extensions/pi-subagents/test/integration/fork-context-execution.test.ts +139 -58
- package/dist/extensions/pi-subagents/test/integration/intercom-result-delivery.test.ts +324 -59
- package/dist/extensions/pi-subagents/test/integration/parallel-execution.test.ts +98 -22
- package/dist/extensions/pi-subagents/test/integration/render-fork-badge.test.ts +106 -106
- package/dist/extensions/pi-subagents/test/integration/render-widget.test.ts +416 -106
- package/dist/extensions/pi-subagents/test/integration/result-watcher.test.ts +287 -17
- package/dist/extensions/pi-subagents/test/integration/single-execution.test.ts +1122 -96
- package/dist/extensions/pi-subagents/test/integration/slash-commands.test.ts +107 -20
- package/dist/extensions/pi-subagents/test/integration/slash-live-state.test.ts +9 -9
- package/dist/extensions/pi-subagents/test/integration/template-resolution.test.ts +26 -6
- package/dist/extensions/pi-subagents/test/integration/top-level-async.test.ts +2 -2
- package/dist/extensions/pi-subagents/test/support/helpers.ts +2 -0
- package/dist/extensions/pi-subagents/test/support/mock-pi-script.mjs +1 -1
- package/dist/extensions/pi-subagents/test/support/ts-loader.mjs +0 -8
- package/dist/extensions/pi-subagents/test/unit/acceptance.test.ts +194 -59
- package/dist/extensions/pi-subagents/test/unit/active-async-capacity.test.ts +317 -0
- package/dist/extensions/pi-subagents/test/unit/agent-disabled.test.ts +15 -15
- package/dist/extensions/pi-subagents/test/unit/agent-eject-disable.test.ts +66 -66
- package/dist/extensions/pi-subagents/test/unit/agent-frontmatter.test.ts +334 -248
- package/dist/extensions/pi-subagents/test/unit/agent-management.test.ts +52 -52
- package/dist/extensions/pi-subagents/test/unit/agent-memory.test.ts +26 -26
- package/dist/extensions/pi-subagents/test/unit/agent-overrides.test.ts +118 -99
- package/dist/extensions/pi-subagents/test/unit/agent-refinements.test.ts +160 -0
- package/dist/extensions/pi-subagents/test/unit/agent-selection.test.ts +9 -9
- package/dist/extensions/pi-subagents/test/unit/artifacts.test.ts +43 -1
- package/dist/extensions/pi-subagents/test/unit/async-execution.test.ts +36 -10
- package/dist/extensions/pi-subagents/test/unit/async-interrupt-action.test.ts +387 -30
- package/dist/extensions/pi-subagents/test/unit/async-permission-session.test.ts +9 -9
- package/dist/extensions/pi-subagents/test/unit/async-recovery-descriptor.test.ts +18 -3
- package/dist/extensions/pi-subagents/test/unit/async-resume.test.ts +99 -40
- package/dist/extensions/pi-subagents/test/unit/background-work.test.ts +5 -3
- package/dist/extensions/pi-subagents/test/unit/builtin-agent-documentation.test.ts +7 -7
- package/dist/extensions/pi-subagents/test/unit/capability-ceiling-agent-allowlist.test.ts +19 -19
- package/dist/extensions/pi-subagents/test/unit/chain-append.test.ts +94 -23
- package/dist/extensions/pi-subagents/test/unit/chain-root-attachment.test.ts +9 -9
- package/dist/extensions/pi-subagents/test/unit/chain-serializer.test.ts +20 -20
- package/dist/extensions/pi-subagents/test/unit/child-transcript.test.ts +9 -9
- package/dist/extensions/pi-subagents/test/unit/compaction-resume.test.ts +35 -5
- package/dist/extensions/pi-subagents/test/unit/completion-dedupe.test.ts +2 -2
- package/dist/extensions/pi-subagents/test/unit/completion-guard.test.ts +70 -52
- package/dist/extensions/pi-subagents/test/unit/completion-replay.test.ts +187 -0
- package/dist/extensions/pi-subagents/test/unit/control-channel.test.ts +125 -71
- package/dist/extensions/pi-subagents/test/unit/control-notices.test.ts +18 -3
- package/dist/extensions/pi-subagents/test/unit/default-extensions.test.ts +12 -12
- package/dist/extensions/pi-subagents/test/unit/delegation-api.test.ts +17 -23
- package/dist/extensions/pi-subagents/test/unit/doctor.test.ts +30 -2
- package/dist/extensions/pi-subagents/test/unit/dynamic-fanout.test.ts +25 -25
- package/dist/extensions/pi-subagents/test/unit/extra-agent-dirs.test.ts +3 -3
- package/dist/extensions/pi-subagents/test/unit/file-coalescer.test.ts +15 -0
- package/dist/extensions/pi-subagents/test/unit/fleet-status.test.ts +91 -47
- package/dist/extensions/pi-subagents/test/unit/fleet.test.ts +468 -38
- package/dist/extensions/pi-subagents/test/unit/foreground-control.test.ts +14 -4
- package/dist/extensions/pi-subagents/test/unit/foreground-tool-call-compaction.test.ts +37 -0
- package/dist/extensions/pi-subagents/test/unit/herdr-inspector-bootstrap.test.ts +69 -0
- package/dist/extensions/pi-subagents/test/unit/herdr-inspector.test.ts +79 -2
- package/dist/extensions/pi-subagents/test/unit/herdr-status-bridge.test.ts +102 -49
- package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +98 -32
- package/dist/extensions/pi-subagents/test/unit/intercom-bridge.test.ts +7 -6
- package/dist/extensions/pi-subagents/test/unit/llm-intent-arbiter.test.ts +171 -0
- package/dist/extensions/pi-subagents/test/unit/mission-goal-driver.test.ts +116 -0
- package/dist/extensions/pi-subagents/test/unit/mission-lifecycle.test.ts +81 -7
- package/dist/extensions/pi-subagents/test/unit/mission-store.test.ts +289 -13
- package/dist/extensions/pi-subagents/test/unit/model-fallback.test.ts +42 -1
- package/dist/extensions/pi-subagents/test/unit/model-scope-settings.test.ts +2 -2
- package/dist/extensions/pi-subagents/test/unit/model-scope.test.ts +11 -2
- package/dist/extensions/pi-subagents/test/unit/native-supervisor-channel.test.ts +84 -10
- package/dist/extensions/pi-subagents/test/unit/nested-control.test.ts +122 -8
- package/dist/extensions/pi-subagents/test/unit/nested-events.test.ts +8 -8
- package/dist/extensions/pi-subagents/test/unit/notify.test.ts +24 -24
- package/dist/extensions/pi-subagents/test/unit/owned-process-tree.test.ts +69 -0
- package/dist/extensions/pi-subagents/test/unit/package-manifest.test.ts +16 -2
- package/dist/extensions/pi-subagents/test/unit/parallel-handoff.test.ts +7 -7
- package/dist/extensions/pi-subagents/test/unit/parallel-utils.test.ts +10 -10
- package/dist/extensions/pi-subagents/test/unit/path-handling.test.ts +3 -3
- package/dist/extensions/pi-subagents/test/unit/path-resolution.test.ts +26 -17
- package/dist/extensions/pi-subagents/test/unit/pi-args-permission-system.test.ts +405 -0
- package/dist/extensions/pi-subagents/test/unit/pi-args.test.ts +440 -92
- package/dist/extensions/pi-subagents/test/unit/pi-coding-agent-dir.test.ts +24 -8
- package/dist/extensions/pi-subagents/test/unit/pi-spawn.test.ts +6 -6
- package/dist/extensions/pi-subagents/test/unit/preflight.test.ts +43 -43
- package/dist/extensions/pi-subagents/test/unit/proactive-skills.test.ts +13 -13
- package/dist/extensions/pi-subagents/test/unit/process-terminal.test.ts +59 -6
- package/dist/extensions/pi-subagents/test/unit/profiles.test.ts +19 -19
- package/dist/extensions/pi-subagents/test/unit/project-panes-public-api.test.ts +243 -0
- package/dist/extensions/pi-subagents/test/unit/prompt-template-bridge.test.ts +68 -168
- package/dist/extensions/pi-subagents/test/unit/prompt-workflows.test.ts +58 -15
- package/dist/extensions/pi-subagents/test/unit/public-execution.test.ts +51 -0
- package/dist/extensions/pi-subagents/test/unit/reads-resolution.test.ts +66 -0
- package/dist/extensions/pi-subagents/test/unit/render-helpers.test.ts +47 -28
- package/dist/extensions/pi-subagents/test/unit/result-intercom.test.ts +12 -12
- package/dist/extensions/pi-subagents/test/unit/retained-children.test.ts +57 -0
- package/dist/extensions/pi-subagents/test/unit/rpc.test.ts +111 -31
- package/dist/extensions/pi-subagents/test/unit/run-fanout-budget.test.ts +121 -0
- package/dist/extensions/pi-subagents/test/unit/run-id-resolver.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +65 -50
- package/dist/extensions/pi-subagents/test/unit/scheduled-runs.test.ts +69 -28
- package/dist/extensions/pi-subagents/test/unit/scheduled-store-root.test.ts +67 -0
- package/dist/extensions/pi-subagents/test/unit/schemas.test.ts +60 -44
- package/dist/extensions/pi-subagents/test/unit/scripted-workflow.test.ts +424 -49
- package/dist/extensions/pi-subagents/test/unit/single-output.test.ts +28 -0
- package/dist/extensions/pi-subagents/test/unit/skills-fallback.test.ts +23 -1
- package/dist/extensions/pi-subagents/test/unit/slash-bridge.test.ts +32 -5
- package/dist/extensions/pi-subagents/test/unit/stale-run-reconciler.test.ts +13 -13
- package/dist/extensions/pi-subagents/test/unit/steering-action.test.ts +130 -92
- package/dist/extensions/pi-subagents/test/unit/steering.test.ts +2 -2
- package/dist/extensions/pi-subagents/test/unit/subagent-action-recovery.test.ts +85 -0
- package/dist/extensions/pi-subagents/test/unit/subagent-control.test.ts +35 -35
- package/dist/extensions/pi-subagents/test/unit/subagent-guide.test.ts +24 -0
- package/dist/extensions/pi-subagents/test/unit/subagent-prompt-runtime.test.ts +312 -22
- package/dist/extensions/pi-subagents/test/unit/subagent-wait.test.ts +150 -15
- package/dist/extensions/pi-subagents/test/unit/task-intent.test.ts +65 -26
- package/dist/extensions/pi-subagents/test/unit/timeout-defaults.test.ts +138 -0
- package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +76 -25
- package/dist/extensions/pi-subagents/test/unit/turn-budget.test.ts +5 -5
- package/dist/extensions/pi-subagents/test/unit/wait-subscriptions.test.ts +55 -6
- package/dist/extensions/pi-subagents/test/unit/watchdog-child-status.test.ts +13 -13
- package/dist/extensions/pi-subagents/test/unit/watchdog-lsp-diagnostics.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/watchdog-runtime.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/watchdog-settings.test.ts +8 -8
- package/dist/extensions/pi-subagents/test/unit/widget-nested-render.test.ts +6 -6
- package/dist/extensions/pi-subagents/test/unit/workflow-chat-progress.test.ts +138 -11
- package/dist/extensions/pi-subagents/test/unit/workflow-graph.test.ts +8 -8
- package/dist/extensions/pi-subagents/test/unit/workflow-launch-params.test.ts +113 -0
- package/dist/extensions/pi-subagents/test/unit/worktree.test.ts +68 -7
- package/dist/extensions/pi-subagents/test/unit/writer-budget-guidance.test.ts +6 -6
- package/dist/extensions/workflow/extension.ts +21 -19
- package/dist/extensions/workflow/modes.ts +65 -0
- package/dist/modes/interactive/interactive-mode.d.ts +1 -0
- package/dist/modes/interactive/interactive-mode.js +48 -1
- package/dist/skills/pi-subagents/SKILL.md +20 -15
- package/dist/skills/pi-subagents/references/constraints-and-recipes.md +77 -83
- package/dist/skills/pi-subagents/references/execution-controls.md +215 -106
- package/dist/skills/pi-subagents/references/management-authoring-rpc.md +29 -9
- package/dist/skills/pi-subagents/references/prompting-and-roles.md +58 -43
- package/docs/plans/workflow-autoloop-reference.md +192 -0
- package/docs/plans/workflow-subagent-consolidation-planb.md +374 -0
- package/docs/plans/workflow-subagent-scripted-merge.md +406 -0
- package/docs/quickstart.md +27 -43
- package/docs/settings.md +4 -0
- package/docs/usage.md +1 -0
- package/package.json +2 -1
- package/dist/extensions/workflow/adapter.ts +0 -949
- package/dist/extensions/workflow/modes/loop.ts +0 -74
- package/dist/extensions/workflow/modes/prototype.ts +0 -170
- package/dist/extensions/workflow/modes/quicktype.ts +0 -150
- package/dist/extensions/workflow/modes/task.ts +0 -105
- package/dist/extensions/workflow/run-state.ts +0 -124
- package/dist/extensions/workflow/state-machine.ts +0 -484
- package/dist/extensions/workflow/validators.ts +0 -42
|
@@ -5,6 +5,8 @@ import * as path from "node:path";
|
|
|
5
5
|
import { pathToFileURL } from "node:url";
|
|
6
6
|
import type { Message } from "@earendil-works/pi-ai";
|
|
7
7
|
import { writeAtomicJson } from "../../shared/atomic-json.ts";
|
|
8
|
+
import { createFileCoalescer } from "../../shared/file-coalescer.ts";
|
|
9
|
+
import { isActiveAsyncState, updateActiveRunIndex } from "./active-run-index.ts";
|
|
8
10
|
import { createChildTranscriptWriter, type ChildTranscriptWriter } from "../../shared/child-transcript.ts";
|
|
9
11
|
import { closeSteerInbox, consumeInterruptRequest, consumeSteerRequests, deliverInterruptRequest, deliverStopRequest, deliverTimeoutRequest, enqueueStepSteer, steerAcksDir, steerCapabilityPath, stepSteerInboxDir, watchAsyncControlInbox, type SteerAck, type SteerCapability, type SteerRequest } from "./control-channel.ts";
|
|
10
12
|
import { appendJsonl as appendRawJsonl, formatOutputArtifactContent, getArtifactPaths, writeArtifact, writeMetadata } from "../../shared/artifacts.ts";
|
|
@@ -23,11 +25,14 @@ import {
|
|
|
23
25
|
type LaunchResolvedChildExtensionsV1,
|
|
24
26
|
type RuntimeAcknowledgedChildExtensionsV1,
|
|
25
27
|
type ModelAttempt,
|
|
28
|
+
type PiWriterProcessInstanceExitV1,
|
|
29
|
+
type ProcessTreeTerminalV1,
|
|
26
30
|
type NestedRouteInfo,
|
|
27
31
|
type NestedRunSummary,
|
|
28
32
|
type ResolvedControlConfig,
|
|
29
33
|
type ResolvedTurnBudget,
|
|
30
34
|
type ResolvedToolBudget,
|
|
35
|
+
type RunFanoutBudgetDescriptor,
|
|
31
36
|
type SubagentRunMode,
|
|
32
37
|
type SubagentOutputState,
|
|
33
38
|
type UsageBudgetConfig,
|
|
@@ -66,15 +71,16 @@ import {
|
|
|
66
71
|
DEFAULT_GLOBAL_CONCURRENCY_LIMIT,
|
|
67
72
|
Semaphore,
|
|
68
73
|
} from "../shared/parallel-utils.ts";
|
|
69
|
-
import { applyThinkingSuffix, buildPiArgs, cleanupTempDir, projectLaunchResolvedChildExtensions, resolvePiLaunchToolPlan } from "../shared/pi-args.ts";
|
|
74
|
+
import { applyThinkingSuffix, buildPiArgs, cleanupTempDir, projectLaunchResolvedChildExtensions, resolvePiLaunchToolPlan, type SubagentTaskDelivery } from "../shared/pi-args.ts";
|
|
70
75
|
import { readRuntimeAcknowledgedExtensions } from "../shared/runtime-acknowledged-extensions.ts";
|
|
71
76
|
import { outputEntryFromAsyncResult, resolveOutputReferences } from "../shared/chain-outputs.ts";
|
|
72
|
-
import { createStructuredOutputRuntime, readStructuredOutput } from "../shared/structured-output.ts";
|
|
77
|
+
import { createStructuredOutputRuntime, MISSING_STRUCTURED_OUTPUT_CALL_ERROR, readStructuredOutput } from "../shared/structured-output.ts";
|
|
73
78
|
import { formatProcessSignalError, isUnexplainedProcessSignal } from "../shared/process-signal.ts";
|
|
74
79
|
import { readChildToolDiagnosticError } from "../shared/tool-availability.ts";
|
|
75
80
|
import { collectDynamicResults, DynamicFanoutError, materializeDynamicParallelStep, validateDynamicCollection } from "../shared/dynamic-fanout.ts";
|
|
81
|
+
import { claimRunFanoutBatch, getRunFanoutBudgetSnapshot } from "../shared/run-fanout-budget.ts";
|
|
76
82
|
import { nestedSummaryFromAsyncStatus, projectNestedEvents, resolveNestedAsyncDir, writeNestedEvent } from "../shared/nested-events.ts";
|
|
77
|
-
import { formatModelAttemptNote, isRetryableModelFailure } from "../shared/model-fallback.ts";
|
|
83
|
+
import { formatModelAttemptNote, formatModelRetryNote, isRetryableModelFailure, MODEL_RETRY_DELAYS_MS } from "../shared/model-fallback.ts";
|
|
78
84
|
import {
|
|
79
85
|
SUBAGENT_STARTUP_RETRY_DELAYS_MS,
|
|
80
86
|
formatSubagentStartupRetryExhaustedError,
|
|
@@ -83,9 +89,10 @@ import {
|
|
|
83
89
|
waitForSubagentStartupRetry,
|
|
84
90
|
} from "../shared/subagent-startup-retry.ts";
|
|
85
91
|
import { markProcessTerminalCandidateLeaseRelease, writeProcessTerminalCandidate, type ProcessTerminalCandidate } from "./process-terminal.ts";
|
|
92
|
+
import { createOwnedProcessTreeController, type OwnedProcessTreeController } from "./owned-process-tree.ts";
|
|
86
93
|
import { createSteeringStatus, recordSteeringRequest, steeringStatus, terminalSteeringNoticeState, updateSteeringTarget } from "./steering.ts";
|
|
87
94
|
import { attachPostExitStdioGuard, trySignalChild } from "../../shared/post-exit-stdio-guard.ts";
|
|
88
|
-
import { detectSubagentError, extractTextFromContent, extractToolArgsPreview, getFinalOutput, hasEmptyTerminalAssistantResponse, readStatus } from "../../shared/utils.ts";
|
|
95
|
+
import { PROMPT_REDACTED, detectSubagentError, extractTextFromContent, extractToolArgsPreview, getFinalOutput, hasEmptyTerminalAssistantResponse, readStatus } from "../../shared/utils.ts";
|
|
89
96
|
import { evaluateCompletionMutationGuard } from "../shared/completion-guard.ts";
|
|
90
97
|
import {
|
|
91
98
|
createMutatingFailureState,
|
|
@@ -175,6 +182,7 @@ interface SubagentRunConfig {
|
|
|
175
182
|
/** Global cap on simultaneously-running subagent tasks within this run. */
|
|
176
183
|
globalConcurrencyLimit?: number;
|
|
177
184
|
capabilityCeiling?: ResolvedSubagentCapabilityCeiling;
|
|
185
|
+
runFanoutBudget?: RunFanoutBudgetDescriptor;
|
|
178
186
|
launchContractDigest?: string;
|
|
179
187
|
launchResolvedExtensions?: LaunchResolvedChildExtensionsV1;
|
|
180
188
|
runtimeAcknowledgedExtensions?: RuntimeAcknowledgedChildExtensionsV1;
|
|
@@ -230,7 +238,7 @@ interface StepResult {
|
|
|
230
238
|
structuredOutputSchemaPath?: string;
|
|
231
239
|
acceptance?: import("../../shared/types.ts").AcceptanceLedger;
|
|
232
240
|
watchdog?: import("../../shared/types.ts").ChildWatchdogProgress;
|
|
233
|
-
writerProcesses?:
|
|
241
|
+
writerProcesses?: PiWriterProcessInstanceExitV1[];
|
|
234
242
|
writerAttemptCount?: number;
|
|
235
243
|
runner?: ExternalCliRunnerStatus;
|
|
236
244
|
externalProcess?: ExternalProcessStatus;
|
|
@@ -503,11 +511,14 @@ interface RunPiStreamingResult {
|
|
|
503
511
|
toolBudget?: ToolBudgetState;
|
|
504
512
|
toolBudgetBlocked?: boolean;
|
|
505
513
|
observedMutationAttempt?: boolean;
|
|
514
|
+
structuredOutputToolInvoked?: boolean;
|
|
515
|
+
structuredOutputMessageStartIndex?: number;
|
|
506
516
|
watchdog?: ChildWatchdogStateSnapshot;
|
|
507
517
|
runtimeAcknowledgedExtensions?: RuntimeAcknowledgedChildExtensionsV1;
|
|
508
518
|
processInstanceId: string;
|
|
509
519
|
processCloseObservedAt?: number;
|
|
510
520
|
processSignal?: string | null;
|
|
521
|
+
processTree: ProcessTreeTerminalV1;
|
|
511
522
|
}
|
|
512
523
|
|
|
513
524
|
function runPiStreaming(
|
|
@@ -544,7 +555,9 @@ function runPiStreaming(
|
|
|
544
555
|
stdio: ["ignore", "pipe", "pipe"],
|
|
545
556
|
env: spawnEnv,
|
|
546
557
|
windowsHide: true,
|
|
558
|
+
detached: process.platform !== "win32",
|
|
547
559
|
});
|
|
560
|
+
let processTreeController: OwnedProcessTreeController | undefined;
|
|
548
561
|
const stderrTail = createBoundedByteTail();
|
|
549
562
|
const rawStdoutTail = createBoundedByteTail();
|
|
550
563
|
const messages: Message[] = [];
|
|
@@ -552,6 +565,7 @@ function runPiStreaming(
|
|
|
552
565
|
let model: string | undefined;
|
|
553
566
|
let writerRegistrationError: string | undefined;
|
|
554
567
|
if (typeof child.pid === "number") {
|
|
568
|
+
processTreeController = createOwnedProcessTreeController(child.pid);
|
|
555
569
|
try {
|
|
556
570
|
onWriterProcess?.({ state: "running", pid: child.pid });
|
|
557
571
|
} catch (writerError) {
|
|
@@ -568,6 +582,8 @@ function runPiStreaming(
|
|
|
568
582
|
let turnBudgetMessage: string | undefined;
|
|
569
583
|
let turnBudget: TurnBudgetState | undefined;
|
|
570
584
|
let observedMutationAttempt = false;
|
|
585
|
+
let structuredOutputToolInvoked = false;
|
|
586
|
+
let structuredOutputMessageStartIndex: number | undefined;
|
|
571
587
|
let toolCount = 0;
|
|
572
588
|
const childWatchdogConfig = decodeChildWatchdogConfig(env?.[CHILD_WATCHDOG_CONFIG_ENV]);
|
|
573
589
|
let childWatchdogState: ChildWatchdogStateSnapshot | undefined;
|
|
@@ -658,6 +674,10 @@ function runPiStreaming(
|
|
|
658
674
|
|
|
659
675
|
if (event.type === "tool_execution_start" && event.toolName) {
|
|
660
676
|
toolCount += 1;
|
|
677
|
+
if (event.toolName === "structured_output") {
|
|
678
|
+
structuredOutputToolInvoked = true;
|
|
679
|
+
structuredOutputMessageStartIndex = messages.length;
|
|
680
|
+
}
|
|
661
681
|
observedMutationAttempt = observedMutationAttempt || isMutatingTool(event.toolName, event.args);
|
|
662
682
|
const toolArgs = extractToolArgsPreview(event.args ?? {});
|
|
663
683
|
writeOutputLine(toolArgs ? `${event.toolName}: ${toolArgs}` : event.toolName);
|
|
@@ -693,7 +713,6 @@ function runPiStreaming(
|
|
|
693
713
|
// a lingering stdio holder after `exit`, or a child that never exits.
|
|
694
714
|
const FINAL_STOP_GRACE_MS = 1000;
|
|
695
715
|
const HARD_KILL_MS = 3000;
|
|
696
|
-
const TIMEOUT_HARD_KILL_MS = 3000;
|
|
697
716
|
let childExited = false;
|
|
698
717
|
let forcedTerminationSignal = false;
|
|
699
718
|
let cleanTerminalAssistantStopReceived = false;
|
|
@@ -701,7 +720,6 @@ function runPiStreaming(
|
|
|
701
720
|
let finalDrainTimer: NodeJS.Timeout | undefined;
|
|
702
721
|
let finalHardKillTimer: NodeJS.Timeout | undefined;
|
|
703
722
|
let watchdogTailTimer: NodeJS.Timeout | undefined;
|
|
704
|
-
let timeoutHardKillTimer: NodeJS.Timeout | undefined;
|
|
705
723
|
let turnBudgetTerminationTimer: NodeJS.Timeout | undefined;
|
|
706
724
|
let turnBudgetHardKillTimer: NodeJS.Timeout | undefined;
|
|
707
725
|
let protocolHardKillTimer: NodeJS.Timeout | undefined;
|
|
@@ -766,22 +784,16 @@ function runPiStreaming(
|
|
|
766
784
|
timedOut = true;
|
|
767
785
|
interrupted = false;
|
|
768
786
|
error = timeoutMessage ?? "Subagent timed out.";
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
if (!settled) trySignalChild(child, "SIGKILL");
|
|
772
|
-
}, TIMEOUT_HARD_KILL_MS);
|
|
773
|
-
timeoutHardKillTimer.unref?.();
|
|
787
|
+
if (processTreeController) void processTreeController.terminate();
|
|
788
|
+
else trySignalChild(child, "SIGTERM");
|
|
774
789
|
});
|
|
775
790
|
registerStop?.(() => {
|
|
776
791
|
if (settled || timedOut || stopped) return;
|
|
777
792
|
stopped = true;
|
|
778
793
|
interrupted = false;
|
|
779
794
|
error = stopMessage ?? "Subagent stopped by user.";
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
if (!settled) trySignalChild(child, "SIGKILL");
|
|
783
|
-
}, TIMEOUT_HARD_KILL_MS);
|
|
784
|
-
timeoutHardKillTimer.unref?.();
|
|
795
|
+
if (processTreeController) void processTreeController.terminate();
|
|
796
|
+
else trySignalChild(child, "SIGTERM");
|
|
785
797
|
});
|
|
786
798
|
registerTurnBudgetAbort?.((message, state) => {
|
|
787
799
|
if (settled || timedOut || stopped || turnBudgetExceeded) return;
|
|
@@ -810,10 +822,6 @@ function runPiStreaming(
|
|
|
810
822
|
finalHardKillTimer = undefined;
|
|
811
823
|
}
|
|
812
824
|
clearWatchdogTailTimer();
|
|
813
|
-
if (timeoutHardKillTimer) {
|
|
814
|
-
clearTimeout(timeoutHardKillTimer);
|
|
815
|
-
timeoutHardKillTimer = undefined;
|
|
816
|
-
}
|
|
817
825
|
if (turnBudgetTerminationTimer) {
|
|
818
826
|
clearTimeout(turnBudgetTerminationTimer);
|
|
819
827
|
turnBudgetTerminationTimer = undefined;
|
|
@@ -875,9 +883,12 @@ function runPiStreaming(
|
|
|
875
883
|
childExited = true;
|
|
876
884
|
clearDrainTimers();
|
|
877
885
|
});
|
|
878
|
-
child.on("close", (exitCode, signal) => {
|
|
886
|
+
child.on("close", async (exitCode, signal) => {
|
|
879
887
|
settled = true;
|
|
880
888
|
const processCloseObservedAt = Date.now();
|
|
889
|
+
const processTree = processTreeController
|
|
890
|
+
? await processTreeController.finishAfterWriterClose()
|
|
891
|
+
: { state: "unknown" as const, reason: "verification-failed" as const, diagnostic: "Writer PID was unavailable." };
|
|
881
892
|
try {
|
|
882
893
|
onWriterProcess?.({ state: "none" });
|
|
883
894
|
} catch {
|
|
@@ -923,10 +934,13 @@ function runPiStreaming(
|
|
|
923
934
|
turnBudgetExceeded,
|
|
924
935
|
wrapUpRequested: turnBudget?.outcome === "wrap-up-requested" || turnBudget?.outcome === "termination-deferred" || turnBudgetExceeded || undefined,
|
|
925
936
|
observedMutationAttempt,
|
|
937
|
+
structuredOutputToolInvoked,
|
|
938
|
+
structuredOutputMessageStartIndex,
|
|
926
939
|
watchdog: childWatchdogState,
|
|
927
940
|
processInstanceId,
|
|
928
941
|
processCloseObservedAt,
|
|
929
942
|
processSignal: signal,
|
|
943
|
+
processTree,
|
|
930
944
|
}));
|
|
931
945
|
});
|
|
932
946
|
|
|
@@ -949,7 +963,7 @@ function runPiStreaming(
|
|
|
949
963
|
const stderr = stderrTail.text();
|
|
950
964
|
const finalOutput = getFinalOutput(messages) || rawStdoutTail.text().trim();
|
|
951
965
|
const spawnErrorMessage = spawnError instanceof Error ? spawnError.message : String(spawnError);
|
|
952
|
-
resolve(omitUndefinedProperties({ stderr, exitCode: 1, messages, usage, toolCount, durationMs: Date.now() - startedAt, model, error: stopped ? (stopMessage ?? "Subagent stopped by user.") : timedOut ? (timeoutMessage ?? "Subagent timed out.") : turnBudgetExceeded ? turnBudgetMessage : error ?? assistantError ?? spawnErrorMessage, protocolError, finalOutput: (timedOut || stopped) && !finalOutput.trim() ? (stopped ? stopMessage ?? "Subagent stopped by user." : timeoutMessage ?? "Subagent timed out.") : finalOutput, outputState: finalOutput.trim() ? "present" : "absent", timedOut, stopped, turnBudget, turnBudgetExceeded, wrapUpRequested: turnBudget?.outcome === "wrap-up-requested" || turnBudget?.outcome === "termination-deferred" || turnBudgetExceeded || undefined, observedMutationAttempt, watchdog: childWatchdogState, processInstanceId }));
|
|
966
|
+
resolve(omitUndefinedProperties({ stderr, exitCode: 1, messages, usage, toolCount, durationMs: Date.now() - startedAt, model, error: stopped ? (stopMessage ?? "Subagent stopped by user.") : timedOut ? (timeoutMessage ?? "Subagent timed out.") : turnBudgetExceeded ? turnBudgetMessage : error ?? assistantError ?? spawnErrorMessage, protocolError, finalOutput: (timedOut || stopped) && !finalOutput.trim() ? (stopped ? stopMessage ?? "Subagent stopped by user." : timeoutMessage ?? "Subagent timed out.") : finalOutput, outputState: finalOutput.trim() ? "present" : "absent", timedOut, stopped, turnBudget, turnBudgetExceeded, wrapUpRequested: turnBudget?.outcome === "wrap-up-requested" || turnBudget?.outcome === "termination-deferred" || turnBudgetExceeded || undefined, observedMutationAttempt, structuredOutputToolInvoked, structuredOutputMessageStartIndex, watchdog: childWatchdogState, processInstanceId, processTree: { state: "unknown", reason: "verification-failed", diagnostic: spawnErrorMessage } }));
|
|
953
967
|
});
|
|
954
968
|
});
|
|
955
969
|
}
|
|
@@ -976,7 +990,7 @@ async function exportSessionHtml(sessionFile: string, outputDir: string, piPacka
|
|
|
976
990
|
|
|
977
991
|
function createShareLink(htmlPath: string): { shareUrl: string; gistUrl: string } | { error: string } {
|
|
978
992
|
try {
|
|
979
|
-
const auth = spawnSync("gh", ["auth", "status"], { encoding: "utf-8"
|
|
993
|
+
const auth = spawnSync("gh", ["auth", "status"], { encoding: "utf-8" });
|
|
980
994
|
if (auth.status !== 0) {
|
|
981
995
|
return { error: "GitHub CLI is not logged in. Run 'gh auth login' first." };
|
|
982
996
|
}
|
|
@@ -985,7 +999,7 @@ function createShareLink(htmlPath: string): { shareUrl: string; gistUrl: string
|
|
|
985
999
|
}
|
|
986
1000
|
|
|
987
1001
|
try {
|
|
988
|
-
const result = spawnSync("gh", ["gist", "create", htmlPath], { encoding: "utf-8"
|
|
1002
|
+
const result = spawnSync("gh", ["gist", "create", htmlPath], { encoding: "utf-8" });
|
|
989
1003
|
if (result.status !== 0) {
|
|
990
1004
|
const err = (result.stderr || "").trim() || "Failed to create gist.";
|
|
991
1005
|
return { error: err };
|
|
@@ -1093,6 +1107,7 @@ interface SingleStepContext {
|
|
|
1093
1107
|
orchestratorIntercomTarget?: string;
|
|
1094
1108
|
nestedRoute?: NestedRouteInfo;
|
|
1095
1109
|
capabilityCeiling?: ResolvedSubagentCapabilityCeiling;
|
|
1110
|
+
runFanoutBudget?: RunFanoutBudgetDescriptor;
|
|
1096
1111
|
onAttemptStart?: (attempt: { model?: string; thinking?: string }) => void;
|
|
1097
1112
|
onChildEvent?: (event: ChildEvent) => void;
|
|
1098
1113
|
onWriterProcess?: (writer: { state: "none" | "spawning" } | { state: "running"; pid: number }) => void;
|
|
@@ -1194,7 +1209,7 @@ async function runSingleStep(
|
|
|
1194
1209
|
artifactPaths = getArtifactPaths(ctx.artifactsDir, ctx.id, step.agent, index);
|
|
1195
1210
|
fs.mkdirSync(ctx.artifactsDir, { recursive: true });
|
|
1196
1211
|
if (ctx.artifactConfig?.includeInput !== false) {
|
|
1197
|
-
fs.writeFileSync(artifactPaths.inputPath, `# Task for ${step.agent}\n\n${
|
|
1212
|
+
fs.writeFileSync(artifactPaths.inputPath, `# Task for ${step.agent}\n\n${PROMPT_REDACTED}; live Prompt Audit only.\n`, "utf-8");
|
|
1198
1213
|
}
|
|
1199
1214
|
if (ctx.artifactConfig?.includeTranscript !== false) {
|
|
1200
1215
|
transcriptWriter = createChildTranscriptWriter({
|
|
@@ -1207,7 +1222,7 @@ async function runSingleStep(
|
|
|
1207
1222
|
});
|
|
1208
1223
|
}
|
|
1209
1224
|
}
|
|
1210
|
-
transcriptWriter?.writeInitialUserMessage(
|
|
1225
|
+
transcriptWriter?.writeInitialUserMessage(`${PROMPT_REDACTED}; live Prompt Audit only.`);
|
|
1211
1226
|
|
|
1212
1227
|
if (step.runner?.type === "external-cli") {
|
|
1213
1228
|
const runner: ExternalCliRunnerStatus = {
|
|
@@ -1250,7 +1265,7 @@ async function runSingleStep(
|
|
|
1250
1265
|
artifactPaths,
|
|
1251
1266
|
artifactConfig: ctx.artifactConfig,
|
|
1252
1267
|
output: formatOutputArtifactContent(omitUndefinedProperties({ output: resolvedOutput.fullOutput, error: external.error, metadataPath: ctx.artifactConfig?.includeMetadata === false ? undefined : artifactPaths.metadataPath })),
|
|
1253
|
-
metadata: { runId: ctx.id, agent: step.agent, task, runner, externalProcess: external.externalProcess, exitCode: external.exitCode, error: external.error, timestamp: Date.now() },
|
|
1268
|
+
metadata: { runId: ctx.id, agent: step.agent, task: PROMPT_REDACTED, runner, externalProcess: external.externalProcess, exitCode: external.exitCode, error: external.error, timestamp: Date.now() },
|
|
1254
1269
|
})
|
|
1255
1270
|
: {};
|
|
1256
1271
|
return omitUndefinedProperties({
|
|
@@ -1280,7 +1295,7 @@ async function runSingleStep(
|
|
|
1280
1295
|
let capabilityAudit: import("../shared/capability-ceiling.ts").SubagentCapabilityAudit | undefined;
|
|
1281
1296
|
let launchResolvedExtensions = step.launchResolvedExtensions;
|
|
1282
1297
|
const modelAttempts: ModelAttempt[] = [];
|
|
1283
|
-
const writerProcesses:
|
|
1298
|
+
const writerProcesses: PiWriterProcessInstanceExitV1[] = [];
|
|
1284
1299
|
let writerAttemptCount = 0;
|
|
1285
1300
|
const attemptNotes: string[] = [];
|
|
1286
1301
|
const eventsPath = path.join(path.dirname(ctx.outputFile), "events.jsonl");
|
|
@@ -1294,6 +1309,10 @@ async function runSingleStep(
|
|
|
1294
1309
|
|
|
1295
1310
|
let modelIndex = 0;
|
|
1296
1311
|
let startupAttemptIndex = 0;
|
|
1312
|
+
let modelRetryIndex = 0;
|
|
1313
|
+
// Escalated to "file" after an unexplained zero-activity startup failure so
|
|
1314
|
+
// retries keep the task text out of argv (endpoint pre-exec scans may deny it).
|
|
1315
|
+
let taskDeliveryOverride: SubagentTaskDelivery | undefined;
|
|
1297
1316
|
modelAttemptsLoop: while (modelIndex < candidates.length) {
|
|
1298
1317
|
if (ctx.timeoutSignal?.aborted || ctx.stopSignal?.aborted || ctx.skipAcceptance?.()) break;
|
|
1299
1318
|
const candidate = candidates[modelIndex];
|
|
@@ -1319,6 +1338,7 @@ async function runSingleStep(
|
|
|
1319
1338
|
parentSessionId: step.parentSessionId,
|
|
1320
1339
|
baseArgs: ["--mode", "json", "-p"],
|
|
1321
1340
|
task,
|
|
1341
|
+
taskDelivery: taskDeliveryOverride,
|
|
1322
1342
|
sessionEnabled,
|
|
1323
1343
|
sessionDir,
|
|
1324
1344
|
sessionFile: step.sessionFile,
|
|
@@ -1344,6 +1364,10 @@ async function runSingleStep(
|
|
|
1344
1364
|
parentControlInbox: ctx.nestedRoute?.controlInbox,
|
|
1345
1365
|
parentRootRunId: ctx.nestedRoute?.rootRunId,
|
|
1346
1366
|
parentCapabilityToken: ctx.nestedRoute?.capabilityToken,
|
|
1367
|
+
runFanoutBudget: ctx.runFanoutBudget ? {
|
|
1368
|
+
...ctx.runFanoutBudget,
|
|
1369
|
+
...(step.runFanoutPath ? { parentPath: `${ctx.runFanoutBudget.parentPath ? `${ctx.runFanoutBudget.parentPath}/` : ""}${step.runFanoutPath}` } : {}),
|
|
1370
|
+
} : undefined,
|
|
1347
1371
|
steerInboxDir: ctx.steerInboxDir,
|
|
1348
1372
|
steerCapabilityPath: ctx.steerCapabilityPath,
|
|
1349
1373
|
steerAckDir: ctx.steerAckDir,
|
|
@@ -1417,6 +1441,7 @@ async function runSingleStep(
|
|
|
1417
1441
|
closeObservedAt: run.processCloseObservedAt,
|
|
1418
1442
|
exitCode: run.exitCode,
|
|
1419
1443
|
signal: run.processSignal ?? null,
|
|
1444
|
+
processTree: run.processTree,
|
|
1420
1445
|
});
|
|
1421
1446
|
}
|
|
1422
1447
|
if (run.turnBudget) turnBudget = run.turnBudget;
|
|
@@ -1444,31 +1469,42 @@ async function runSingleStep(
|
|
|
1444
1469
|
const runtimeAcknowledgedExtensions = readRuntimeAcknowledgedExtensions(runtimeAcknowledgedExtensionsPath);
|
|
1445
1470
|
cleanupTempDir(tempDir);
|
|
1446
1471
|
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1472
|
+
let structuredOutput: unknown;
|
|
1473
|
+
let structuredError: string | undefined;
|
|
1474
|
+
let validatedStructuredOutput = false;
|
|
1475
|
+
if (effectiveStructuredOutput && run.exitCode === 0 && !run.error && !toolAvailabilityError) {
|
|
1476
|
+
if (!run.structuredOutputToolInvoked) {
|
|
1477
|
+
structuredError = MISSING_STRUCTURED_OUTPUT_CALL_ERROR;
|
|
1478
|
+
} else {
|
|
1479
|
+
const structured = await readStructuredOutput({
|
|
1480
|
+
schema: effectiveStructuredOutput.schema,
|
|
1481
|
+
schemaPath: effectiveStructuredOutput.schemaPath,
|
|
1482
|
+
outputPath: effectiveStructuredOutput.outputPath,
|
|
1483
|
+
});
|
|
1484
|
+
if (structured.error) structuredError = structured.error;
|
|
1485
|
+
else {
|
|
1486
|
+
structuredOutput = structured.value;
|
|
1487
|
+
validatedStructuredOutput = true;
|
|
1488
|
+
}
|
|
1489
|
+
}
|
|
1490
|
+
}
|
|
1491
|
+
const errorMessages = validatedStructuredOutput
|
|
1492
|
+
? run.messages.slice(run.structuredOutputMessageStartIndex ?? run.messages.length)
|
|
1493
|
+
: run.messages;
|
|
1494
|
+
const hiddenError = run.exitCode === 0 && !run.error && !toolAvailabilityError && !structuredError
|
|
1495
|
+
? detectSubagentError(errorMessages)
|
|
1496
|
+
: null;
|
|
1451
1497
|
const emptyOutputError = run.exitCode === 0
|
|
1452
1498
|
&& !run.error
|
|
1453
1499
|
&& !toolAvailabilityError
|
|
1500
|
+
&& !structuredError
|
|
1454
1501
|
&& !run.finalOutput.trim()
|
|
1455
|
-
&&
|
|
1502
|
+
&& !validatedStructuredOutput
|
|
1456
1503
|
&& (!hiddenError?.hasError || hasEmptyTerminalAssistantResponse(run.messages))
|
|
1457
1504
|
? "Subagent produced no output (possible model cold-start or empty response)."
|
|
1458
1505
|
: undefined;
|
|
1459
|
-
let structuredOutput: unknown;
|
|
1460
|
-
let structuredError: string | undefined;
|
|
1461
|
-
if (effectiveStructuredOutput && run.exitCode === 0 && !run.error && !toolAvailabilityError && !hiddenError?.hasError && !emptyOutputError) {
|
|
1462
|
-
const structured = await readStructuredOutput({
|
|
1463
|
-
schema: effectiveStructuredOutput.schema,
|
|
1464
|
-
schemaPath: effectiveStructuredOutput.schemaPath,
|
|
1465
|
-
outputPath: effectiveStructuredOutput.outputPath,
|
|
1466
|
-
});
|
|
1467
|
-
if (structured.error) structuredError = structured.error;
|
|
1468
|
-
else structuredOutput = structured.value;
|
|
1469
|
-
}
|
|
1470
1506
|
const completionGuardEnabled = isAgentContractV1(step.agentContract) ? step.completionGuard === true : step.completionGuard !== false;
|
|
1471
|
-
const completionGuard = run.exitCode === 0 && !run.error && !toolAvailabilityError && !hiddenError?.hasError && !emptyOutputError && completionGuardEnabled
|
|
1507
|
+
const completionGuard = run.exitCode === 0 && !run.error && !toolAvailabilityError && !structuredError && !hiddenError?.hasError && !emptyOutputError && completionGuardEnabled
|
|
1472
1508
|
? evaluateCompletionMutationGuard(omitUndefinedProperties({
|
|
1473
1509
|
agent: step.agent,
|
|
1474
1510
|
task: taskForCompletionGuard,
|
|
@@ -1560,6 +1596,10 @@ async function runSingleStep(
|
|
|
1560
1596
|
});
|
|
1561
1597
|
const shouldRetry = await waitForSubagentStartupRetry(retryDelayMs, [ctx.timeoutSignal, ctx.stopSignal]);
|
|
1562
1598
|
if (!shouldRetry || ctx.skipAcceptance?.()) break modelAttemptsLoop;
|
|
1599
|
+
if (!taskDeliveryOverride && run.processSignal === "SIGKILL") {
|
|
1600
|
+
taskDeliveryOverride = "file";
|
|
1601
|
+
attemptNotes.push("[startup-retry] retrying with file task delivery to keep the task text out of the child process argv.");
|
|
1602
|
+
}
|
|
1563
1603
|
attempt.error = retryNote;
|
|
1564
1604
|
attemptNotes.push(retryNote);
|
|
1565
1605
|
startupAttemptIndex += 1;
|
|
@@ -1575,10 +1615,32 @@ async function runSingleStep(
|
|
|
1575
1615
|
finalResult.finalOutput = startupError;
|
|
1576
1616
|
break modelAttemptsLoop;
|
|
1577
1617
|
}
|
|
1578
|
-
if (
|
|
1579
|
-
|
|
1580
|
-
|
|
1581
|
-
|
|
1618
|
+
if (isRetryableModelFailure(error)) {
|
|
1619
|
+
if (modelIndex < candidates.length - 1) {
|
|
1620
|
+
attemptNotes.push(formatModelAttemptNote(attempt, candidates[modelIndex + 1]));
|
|
1621
|
+
modelIndex += 1;
|
|
1622
|
+
modelRetryIndex = 0;
|
|
1623
|
+
startupAttemptIndex = 0;
|
|
1624
|
+
continue;
|
|
1625
|
+
}
|
|
1626
|
+
const modelRetryDelayMs = MODEL_RETRY_DELAYS_MS[modelRetryIndex];
|
|
1627
|
+
if (modelRetryDelayMs !== undefined) {
|
|
1628
|
+
const retryNote = formatModelRetryNote({
|
|
1629
|
+
model: attempt.model,
|
|
1630
|
+
attempt: modelRetryIndex + 1,
|
|
1631
|
+
maxAttempts: MODEL_RETRY_DELAYS_MS.length + 1,
|
|
1632
|
+
delayMs: modelRetryDelayMs,
|
|
1633
|
+
});
|
|
1634
|
+
const shouldRetry = await waitForSubagentStartupRetry(modelRetryDelayMs, [ctx.timeoutSignal, ctx.stopSignal]);
|
|
1635
|
+
if (!shouldRetry || ctx.skipAcceptance?.()) break modelAttemptsLoop;
|
|
1636
|
+
attempt.error = retryNote;
|
|
1637
|
+
attemptNotes.push(retryNote);
|
|
1638
|
+
modelRetryIndex += 1;
|
|
1639
|
+
startupAttemptIndex = 0;
|
|
1640
|
+
continue;
|
|
1641
|
+
}
|
|
1642
|
+
}
|
|
1643
|
+
break modelAttemptsLoop;
|
|
1582
1644
|
}
|
|
1583
1645
|
|
|
1584
1646
|
const rawOutput = finalResult?.finalOutput ?? "";
|
|
@@ -1635,6 +1697,8 @@ async function runSingleStep(
|
|
|
1635
1697
|
signal: combinedAbortSignal([ctx.timeoutSignal, ctx.stopSignal]),
|
|
1636
1698
|
abortMessage: ctx.stopSignal?.aborted ? ctx.stopMessage ?? "Subagent stopped by user." : ctx.timeoutMessage ?? "Subagent timed out.",
|
|
1637
1699
|
reportOptional: isAgentContractV1(step.agentContract),
|
|
1700
|
+
artifactsDir: ctx.artifactsDir,
|
|
1701
|
+
runId: ctx.id,
|
|
1638
1702
|
}))
|
|
1639
1703
|
: undefined;
|
|
1640
1704
|
const stoppedAfterAcceptance = finalResult?.stopped === true || ctx.stopSignal?.aborted === true;
|
|
@@ -1675,7 +1739,7 @@ async function runSingleStep(
|
|
|
1675
1739
|
metadata: {
|
|
1676
1740
|
runId: ctx.id,
|
|
1677
1741
|
agent: step.agent,
|
|
1678
|
-
task,
|
|
1742
|
+
task: PROMPT_REDACTED,
|
|
1679
1743
|
exitCode: effectiveFinalExitCode,
|
|
1680
1744
|
model: finalResult?.model,
|
|
1681
1745
|
attemptedModels: attemptedModels.length > 0 ? attemptedModels : undefined,
|
|
@@ -1932,6 +1996,47 @@ function combinedAbortSignal(signals: Array<AbortSignal | undefined>): AbortSign
|
|
|
1932
1996
|
return controller.signal;
|
|
1933
1997
|
}
|
|
1934
1998
|
|
|
1999
|
+
async function runSingleStepWithTimeout(
|
|
2000
|
+
step: SubagentStep,
|
|
2001
|
+
ctx: SingleStepContext,
|
|
2002
|
+
parentDeadlineAt?: number,
|
|
2003
|
+
): Promise<SingleStepResult> {
|
|
2004
|
+
if (step.timeoutMs === undefined) return runSingleStep(step, ctx);
|
|
2005
|
+
|
|
2006
|
+
const parentRemainingMs = parentDeadlineAt === undefined ? undefined : Math.max(0, parentDeadlineAt - Date.now());
|
|
2007
|
+
const timeoutMs = parentRemainingMs === undefined ? step.timeoutMs : Math.min(step.timeoutMs, parentRemainingMs);
|
|
2008
|
+
const timeoutMessage = parentRemainingMs !== undefined && parentRemainingMs <= step.timeoutMs
|
|
2009
|
+
? ctx.timeoutMessage
|
|
2010
|
+
: `Subagent timed out after ${step.timeoutMs}ms.`;
|
|
2011
|
+
const timeoutController = new AbortController();
|
|
2012
|
+
let timeoutAction: (() => void) | undefined;
|
|
2013
|
+
let timeoutTriggered = false;
|
|
2014
|
+
const triggerTimeout = (): void => {
|
|
2015
|
+
if (timeoutTriggered) return;
|
|
2016
|
+
timeoutTriggered = true;
|
|
2017
|
+
timeoutController.abort();
|
|
2018
|
+
timeoutAction?.();
|
|
2019
|
+
};
|
|
2020
|
+
const registerTimeout = (action: (() => void) | undefined): void => {
|
|
2021
|
+
timeoutAction = action;
|
|
2022
|
+
ctx.registerTimeout?.(action ? triggerTimeout : undefined);
|
|
2023
|
+
if (action && timeoutTriggered) action();
|
|
2024
|
+
};
|
|
2025
|
+
const timer = setTimeout(triggerTimeout, timeoutMs);
|
|
2026
|
+
timer.unref?.();
|
|
2027
|
+
try {
|
|
2028
|
+
return await runSingleStep(step, {
|
|
2029
|
+
...ctx,
|
|
2030
|
+
registerTimeout,
|
|
2031
|
+
timeoutSignal: combinedAbortSignal([ctx.timeoutSignal, timeoutController.signal]),
|
|
2032
|
+
timeoutMessage,
|
|
2033
|
+
});
|
|
2034
|
+
} finally {
|
|
2035
|
+
clearTimeout(timer);
|
|
2036
|
+
ctx.registerTimeout?.(undefined);
|
|
2037
|
+
}
|
|
2038
|
+
}
|
|
2039
|
+
|
|
1935
2040
|
async function runSubagent(
|
|
1936
2041
|
config: SubagentRunConfig,
|
|
1937
2042
|
onWriterProcess?: (writer: { state: "none" | "spawning" } | { state: "running"; pid: number }) => void,
|
|
@@ -2105,6 +2210,7 @@ async function runSubagent(
|
|
|
2105
2210
|
...(config.launchContractDigest ? { launchContractDigest: config.launchContractDigest } : {}),
|
|
2106
2211
|
...(config.launchResolvedExtensions ? { launchResolvedExtensions: config.launchResolvedExtensions } : {}),
|
|
2107
2212
|
...(config.capabilityCeiling ? { capabilityCeiling: config.capabilityCeiling } : {}),
|
|
2213
|
+
...(config.runFanoutBudget ? { runFanoutBudget: getRunFanoutBudgetSnapshot(config.runFanoutBudget) } : {}),
|
|
2108
2214
|
...(config.parentWorkflowRunId ? { parentWorkflowRunId: config.parentWorkflowRunId } : {}),
|
|
2109
2215
|
...(config.workflowKey ? { workflowKey: config.workflowKey } : {}),
|
|
2110
2216
|
...(config.runnerProcessInstanceId ? { processTerminal: { version: 1 as const, state: "pending" as const, runId: id, runnerProcessInstanceId: config.runnerProcessInstanceId } } : {}),
|
|
@@ -2116,6 +2222,7 @@ async function runSubagent(
|
|
|
2116
2222
|
|
|
2117
2223
|
fs.mkdirSync(asyncDir, { recursive: true });
|
|
2118
2224
|
writeAtomicJson(statusPath, statusPayload);
|
|
2225
|
+
updateActiveRunIndex(asyncDir, statusPayload.state);
|
|
2119
2226
|
let pendingParallelUsageCost: CostSummary = { inputTokens: 0, outputTokens: 0, costUsd: 0 };
|
|
2120
2227
|
const currentUsageTotals = (): CostSummary => {
|
|
2121
2228
|
const cost = results.reduce<CostSummary>((sum, result) => ({
|
|
@@ -2188,11 +2295,25 @@ async function runSubagent(
|
|
|
2188
2295
|
for (const node of graph.nodes) updateNode(node);
|
|
2189
2296
|
statusPayload.workflowGraph = graph;
|
|
2190
2297
|
};
|
|
2191
|
-
|
|
2298
|
+
let lastIndexedActiveState = isActiveAsyncState(statusPayload.state);
|
|
2299
|
+
const writeStatusPayloadNow = (): void => {
|
|
2192
2300
|
refreshWorkflowGraph();
|
|
2193
2301
|
writeAtomicJson(statusPath, statusPayload);
|
|
2302
|
+
const activeState = isActiveAsyncState(statusPayload.state);
|
|
2303
|
+
if (activeState && activeState !== lastIndexedActiveState) {
|
|
2304
|
+
updateActiveRunIndex(asyncDir, statusPayload.state);
|
|
2305
|
+
}
|
|
2306
|
+
lastIndexedActiveState = activeState;
|
|
2194
2307
|
emitNestedSelfEvent(statusPayload.state === "running" || statusPayload.state === "queued" ? "subagent.nested.updated" : "subagent.nested.completed");
|
|
2195
2308
|
};
|
|
2309
|
+
const statusWriteCoalescer = createFileCoalescer(writeStatusPayloadNow, 100);
|
|
2310
|
+
const writeStatusPayload = (immediate = true): void => {
|
|
2311
|
+
if (immediate || statusPayload.state !== "running" || statusPayload.activityState !== undefined) {
|
|
2312
|
+
if (!statusWriteCoalescer.flush(statusPath)) writeStatusPayloadNow();
|
|
2313
|
+
return;
|
|
2314
|
+
}
|
|
2315
|
+
statusWriteCoalescer.schedule(statusPath);
|
|
2316
|
+
};
|
|
2196
2317
|
const updateExternalProcess = (index: number, process: ExternalProcessStatus): void => {
|
|
2197
2318
|
requiredStatusStep(statusPayload, index).externalProcess = process;
|
|
2198
2319
|
statusPayload.lastUpdate = Date.now();
|
|
@@ -2264,7 +2385,7 @@ async function runSubagent(
|
|
|
2264
2385
|
const nestedAsyncDir = run.asyncDir ?? resolveNestedAsyncDir(config.nestedRoute.rootRunId, run);
|
|
2265
2386
|
if (!nestedAsyncDir) continue;
|
|
2266
2387
|
try {
|
|
2267
|
-
deliverInterruptRequest(
|
|
2388
|
+
deliverInterruptRequest({ asyncDir: nestedAsyncDir, source: "ancestor-interrupt" });
|
|
2268
2389
|
} catch (error) {
|
|
2269
2390
|
appendJsonl(eventsPath, JSON.stringify({
|
|
2270
2391
|
type: "subagent.nested.interrupt_failed",
|
|
@@ -2611,7 +2732,10 @@ async function runSubagent(
|
|
|
2611
2732
|
const now = Date.now();
|
|
2612
2733
|
if (ack.state === "delivered") {
|
|
2613
2734
|
updateSteeringLifecycleTarget(ack.requestId, ack.index, late ? "late" : "delivered", now, omitUndefinedProperties({ reason: late ? "acknowledged after recovery commit" : undefined }));
|
|
2614
|
-
emitSteeringEvent("subagent.steer.delivered", { type: "steer", id: ack.requestId, ts: now, message: ack.message }, ack.index, { late, message: ack.message });
|
|
2735
|
+
emitSteeringEvent("subagent.steer.delivered", { type: "steer", id: ack.requestId, ts: now, message: ack.message }, ack.index, { late, deliveryStatus: "delivered", message: ack.message });
|
|
2736
|
+
} else if (ack.state === "queued") {
|
|
2737
|
+
updateSteeringLifecycleTarget(ack.requestId, ack.index, "queued", now);
|
|
2738
|
+
emitSteeringEvent("subagent.steer.queued", { type: "steer", id: ack.requestId, ts: now, message: ack.message }, ack.index, { deliveryStatus: "queued", message: ack.message });
|
|
2615
2739
|
} else {
|
|
2616
2740
|
markSteeringAttention(ack.index);
|
|
2617
2741
|
updateSteeringLifecycleTarget(ack.requestId, ack.index, "failed", now, { reason: ack.message });
|
|
@@ -2716,7 +2840,7 @@ async function runSubagent(
|
|
|
2716
2840
|
step.lastActivityAt = now;
|
|
2717
2841
|
statusPayload.lastActivityAt = now;
|
|
2718
2842
|
statusPayload.lastUpdate = now;
|
|
2719
|
-
writeStatusPayload();
|
|
2843
|
+
writeStatusPayload(false);
|
|
2720
2844
|
return;
|
|
2721
2845
|
}
|
|
2722
2846
|
if (event.type === "tool_execution_start" && event.toolName) {
|
|
@@ -2852,7 +2976,7 @@ async function runSubagent(
|
|
|
2852
2976
|
statusPayload.lastActivityAt = now;
|
|
2853
2977
|
statusPayload.lastUpdate = now;
|
|
2854
2978
|
maybeEmitActiveLongRunning(flatIndex, now);
|
|
2855
|
-
writeStatusPayload();
|
|
2979
|
+
writeStatusPayload(false);
|
|
2856
2980
|
};
|
|
2857
2981
|
const updateRunnerActivityState = (now: number): boolean => {
|
|
2858
2982
|
if (!controlConfig.enabled) return false;
|
|
@@ -2951,7 +3075,6 @@ async function runSubagent(
|
|
|
2951
3075
|
if (stopped || timedOut || interrupted || statusPayload.state !== "running") return;
|
|
2952
3076
|
stopped = true;
|
|
2953
3077
|
const now = Date.now();
|
|
2954
|
-
statusPayload.state = "stopped";
|
|
2955
3078
|
statusPayload.stopped = true;
|
|
2956
3079
|
statusPayload.error = stopMessage;
|
|
2957
3080
|
currentActivityState = undefined;
|
|
@@ -2984,7 +3107,6 @@ async function runSubagent(
|
|
|
2984
3107
|
timedOut = true;
|
|
2985
3108
|
const now = Date.now();
|
|
2986
3109
|
const message = timeoutMessage ?? "Subagent timed out.";
|
|
2987
|
-
statusPayload.state = "failed";
|
|
2988
3110
|
statusPayload.timedOut = true;
|
|
2989
3111
|
statusPayload.error = message;
|
|
2990
3112
|
currentActivityState = undefined;
|
|
@@ -3174,6 +3296,9 @@ async function runSubagent(
|
|
|
3174
3296
|
throw new DynamicFanoutError(`Dynamic chain step ${stepIndex + 1} materialized ${materialized.parallel.length} items that resolve output to the same path: ${step.parallel.outputPath}. Remove the explicit output path or use an inherited relative agent output so each item can be isolated.`);
|
|
3175
3297
|
}
|
|
3176
3298
|
if (materialized.collectedOnEmpty) await validateDynamicCollection(step.collect.outputSchema, materialized.collectedOnEmpty);
|
|
3299
|
+
if (!config.runFanoutBudget) throw new Error("Async runner is missing its run fan-out budget identity.");
|
|
3300
|
+
const runFanoutBudget = claimRunFanoutBatch(config.runFanoutBudget, materialized.parallel.map((_, itemIndex) => `chain[${stepIndex}].expand[${itemIndex}]`));
|
|
3301
|
+
statusPayload.runFanoutBudget = runFanoutBudget;
|
|
3177
3302
|
} catch (error) {
|
|
3178
3303
|
const now = Date.now();
|
|
3179
3304
|
const message = error instanceof DynamicFanoutError ? error.message : error instanceof Error ? error.message : String(error);
|
|
@@ -3280,6 +3405,7 @@ async function runSubagent(
|
|
|
3280
3405
|
const materializedTask = step.parallel.namespaceOutputPath ? injectSingleOutputInstruction(taskText, outputPath, step.parallel) : taskText;
|
|
3281
3406
|
return omitUndefinedProperties({
|
|
3282
3407
|
...step.parallel,
|
|
3408
|
+
runFanoutPath: `chain[${stepIndex}].expand[${itemIndex}]`,
|
|
3283
3409
|
task: materializedTask,
|
|
3284
3410
|
effectiveAcceptance: resolveEffectiveAcceptance(omitUndefinedProperties({
|
|
3285
3411
|
explicit: step.parallel.acceptanceInput,
|
|
@@ -3423,7 +3549,7 @@ async function runSubagent(
|
|
|
3423
3549
|
writeStatusPayload();
|
|
3424
3550
|
appendJsonl(eventsPath, JSON.stringify({ type: "subagent.step.started", ts: taskStartTime, runId: id, stepIndex: fi, agent: task.agent }));
|
|
3425
3551
|
flushPendingStepSteers(fi);
|
|
3426
|
-
const singleResult = await
|
|
3552
|
+
const singleResult = await runSingleStepWithTimeout(task, compactOptional<SingleStepContext>({
|
|
3427
3553
|
previousOutput, placeholder, cwd, sessionEnabled,
|
|
3428
3554
|
outputs,
|
|
3429
3555
|
sessionDir: config.sessionDir ? path.join(config.sessionDir, `dynamic-${stepIndex}-${taskIdx}`) : undefined,
|
|
@@ -3439,6 +3565,7 @@ async function runSubagent(
|
|
|
3439
3565
|
orchestratorIntercomTarget: config.controlIntercomTarget,
|
|
3440
3566
|
nestedRoute: config.nestedRoute,
|
|
3441
3567
|
capabilityCeiling: config.capabilityCeiling,
|
|
3568
|
+
runFanoutBudget: config.runFanoutBudget,
|
|
3442
3569
|
registerInterrupt: (interrupt) => registerStepInterrupt(fi, interrupt),
|
|
3443
3570
|
registerTimeout: (interrupt) => registerStepTimeout(fi, interrupt),
|
|
3444
3571
|
registerStop: (stop) => registerStepStop(fi, stop),
|
|
@@ -3453,7 +3580,7 @@ async function runSubagent(
|
|
|
3453
3580
|
onWriterProcess,
|
|
3454
3581
|
onExternalProcess: (process) => updateExternalProcess(fi, process),
|
|
3455
3582
|
skipAcceptance: () => timedOut || stopped,
|
|
3456
|
-
}));
|
|
3583
|
+
}), config.deadlineAt);
|
|
3457
3584
|
const taskEndTime = Date.now();
|
|
3458
3585
|
const childInterrupted = singleResult.interrupted === true;
|
|
3459
3586
|
const childStopped = singleResult.stopped === true;
|
|
@@ -3805,7 +3932,7 @@ async function runSubagent(
|
|
|
3805
3932
|
const { taskForRun, taskCwd } = prepareParallelTaskRun(task, cwd, worktreeSetup, taskIdx);
|
|
3806
3933
|
flushPendingStepSteers(fi);
|
|
3807
3934
|
|
|
3808
|
-
const singleResult = await
|
|
3935
|
+
const singleResult = await runSingleStepWithTimeout(taskForRun, compactOptional<SingleStepContext>({
|
|
3809
3936
|
previousOutput, placeholder, cwd: taskCwd, sessionEnabled,
|
|
3810
3937
|
outputs,
|
|
3811
3938
|
sessionDir: taskSessionDir,
|
|
@@ -3821,6 +3948,7 @@ async function runSubagent(
|
|
|
3821
3948
|
orchestratorIntercomTarget: config.controlIntercomTarget,
|
|
3822
3949
|
nestedRoute: config.nestedRoute,
|
|
3823
3950
|
capabilityCeiling: config.capabilityCeiling,
|
|
3951
|
+
runFanoutBudget: config.runFanoutBudget,
|
|
3824
3952
|
registerInterrupt: (interrupt) => registerStepInterrupt(fi, interrupt),
|
|
3825
3953
|
registerTimeout: (interrupt) => registerStepTimeout(fi, interrupt),
|
|
3826
3954
|
registerStop: (stop) => registerStepStop(fi, stop),
|
|
@@ -3835,7 +3963,7 @@ async function runSubagent(
|
|
|
3835
3963
|
onWriterProcess,
|
|
3836
3964
|
onExternalProcess: (process) => updateExternalProcess(fi, process),
|
|
3837
3965
|
skipAcceptance: () => timedOut || stopped,
|
|
3838
|
-
}));
|
|
3966
|
+
}), config.deadlineAt);
|
|
3839
3967
|
if (task.sessionFile) {
|
|
3840
3968
|
latestSessionFile = task.sessionFile;
|
|
3841
3969
|
}
|
|
@@ -4094,7 +4222,7 @@ async function runSubagent(
|
|
|
4094
4222
|
}));
|
|
4095
4223
|
|
|
4096
4224
|
flushPendingStepSteers(flatIndex);
|
|
4097
|
-
const singleResult = await
|
|
4225
|
+
const singleResult = await runSingleStepWithTimeout(seqStep, compactOptional<SingleStepContext>({
|
|
4098
4226
|
previousOutput, placeholder, cwd, sessionEnabled,
|
|
4099
4227
|
outputs: statusPayload.mode === "single" ? undefined : outputs,
|
|
4100
4228
|
sessionDir: config.sessionDir,
|
|
@@ -4110,6 +4238,7 @@ async function runSubagent(
|
|
|
4110
4238
|
orchestratorIntercomTarget: config.controlIntercomTarget,
|
|
4111
4239
|
nestedRoute: config.nestedRoute,
|
|
4112
4240
|
capabilityCeiling: config.capabilityCeiling,
|
|
4241
|
+
runFanoutBudget: config.runFanoutBudget,
|
|
4113
4242
|
registerInterrupt: (interrupt) => registerStepInterrupt(flatIndex, interrupt),
|
|
4114
4243
|
registerTimeout: (interrupt) => registerStepTimeout(flatIndex, interrupt),
|
|
4115
4244
|
registerStop: (stop) => registerStepStop(flatIndex, stop),
|
|
@@ -4124,7 +4253,7 @@ async function runSubagent(
|
|
|
4124
4253
|
onWriterProcess,
|
|
4125
4254
|
onExternalProcess: (process) => updateExternalProcess(flatIndex, process),
|
|
4126
4255
|
skipAcceptance: () => timedOut || stopped,
|
|
4127
|
-
}));
|
|
4256
|
+
}), config.deadlineAt);
|
|
4128
4257
|
if (seqStep.sessionFile) {
|
|
4129
4258
|
latestSessionFile = seqStep.sessionFile;
|
|
4130
4259
|
}
|
|
@@ -4354,6 +4483,9 @@ async function runSubagent(
|
|
|
4354
4483
|
clearTimeout(timeoutTimer);
|
|
4355
4484
|
timeoutTimer = undefined;
|
|
4356
4485
|
}
|
|
4486
|
+
if (!timedOut && !stopped && !interrupted && config.timeoutMs !== undefined && results.some((result) => result.timedOut === true && result.error === timeoutMessage)) {
|
|
4487
|
+
timedOut = true;
|
|
4488
|
+
}
|
|
4357
4489
|
const signalTerminated = !stopped && !timedOut && !turnBudgetExceeded && !interrupted && results.some((result) => result.exitCode !== 0 && isUnexplainedProcessSignal(omitUndefinedProperties({
|
|
4358
4490
|
processSignal: result.processSignal,
|
|
4359
4491
|
interrupted: result.interrupted,
|
|
@@ -4370,11 +4502,12 @@ async function runSubagent(
|
|
|
4370
4502
|
for (const request of steeringLifecycle.recent) {
|
|
4371
4503
|
let changed = false;
|
|
4372
4504
|
for (const target of request.targets) {
|
|
4373
|
-
if (target.state !== "scheduled" && target.state !== "routed") continue;
|
|
4505
|
+
if (target.state !== "scheduled" && target.state !== "routed" && target.state !== "queued") continue;
|
|
4374
4506
|
changed = true;
|
|
4375
|
-
|
|
4507
|
+
const reason = target.state === "queued" ? "run ended before queued follow-up delivery" : "child terminated before steering delivery";
|
|
4508
|
+
updateSteeringLifecycleTarget(request.id, target.index, "failed", Date.now(), { reason });
|
|
4376
4509
|
markSteeringAttention(target.index);
|
|
4377
|
-
emitSteeringEvent("subagent.steer.failed", { type: "steer", id: request.id, ts: request.requestedAt, message:
|
|
4510
|
+
emitSteeringEvent("subagent.steer.failed", { type: "steer", id: request.id, ts: request.requestedAt, message: reason }, target.index, { reason });
|
|
4378
4511
|
}
|
|
4379
4512
|
if (changed) emitTerminalSteeringNotice(request.id, `Steering failed for run ${id}: child terminated before delivery.`);
|
|
4380
4513
|
}
|
|
@@ -4413,39 +4546,6 @@ async function runSubagent(
|
|
|
4413
4546
|
}
|
|
4414
4547
|
}
|
|
4415
4548
|
writeStatusPayload();
|
|
4416
|
-
appendJsonl(
|
|
4417
|
-
eventsPath,
|
|
4418
|
-
JSON.stringify({
|
|
4419
|
-
type: "subagent.run.completed",
|
|
4420
|
-
lifecycleArtifactVersion: SUBAGENT_LIFECYCLE_ARTIFACT_VERSION,
|
|
4421
|
-
ts: runEndedAt,
|
|
4422
|
-
runId: id,
|
|
4423
|
-
status: statusPayload.state,
|
|
4424
|
-
durationMs: runEndedAt - overallStartTime,
|
|
4425
|
-
totalTokens: statusPayload.totalTokens,
|
|
4426
|
-
totalCost: finalTotalCost,
|
|
4427
|
-
usageBudget: statusPayload.usageBudget,
|
|
4428
|
-
}),
|
|
4429
|
-
);
|
|
4430
|
-
writeRunLog(logPath, omitUndefinedProperties({
|
|
4431
|
-
id,
|
|
4432
|
-
mode: statusPayload.mode,
|
|
4433
|
-
cwd,
|
|
4434
|
-
startedAt: overallStartTime,
|
|
4435
|
-
endedAt: runEndedAt,
|
|
4436
|
-
steps: statusPayload.steps.map((step) => omitUndefinedProperties({
|
|
4437
|
-
agent: step.agent,
|
|
4438
|
-
status: step.status,
|
|
4439
|
-
durationMs: step.durationMs,
|
|
4440
|
-
})),
|
|
4441
|
-
summary,
|
|
4442
|
-
truncated,
|
|
4443
|
-
artifactsDir,
|
|
4444
|
-
sessionFile: effectiveSessionFile,
|
|
4445
|
-
shareUrl,
|
|
4446
|
-
shareError,
|
|
4447
|
-
}));
|
|
4448
|
-
|
|
4449
4549
|
try {
|
|
4450
4550
|
writeAtomicJson(resultPath, {
|
|
4451
4551
|
lifecycleArtifactVersion: SUBAGENT_LIFECYCLE_ARTIFACT_VERSION,
|
|
@@ -4545,8 +4645,40 @@ async function runSubagent(
|
|
|
4545
4645
|
} catch (err) {
|
|
4546
4646
|
console.error(`Failed to write result file ${resultPath}:`, err);
|
|
4547
4647
|
}
|
|
4648
|
+
appendJsonl(
|
|
4649
|
+
eventsPath,
|
|
4650
|
+
JSON.stringify({
|
|
4651
|
+
type: "subagent.run.completed",
|
|
4652
|
+
lifecycleArtifactVersion: SUBAGENT_LIFECYCLE_ARTIFACT_VERSION,
|
|
4653
|
+
ts: runEndedAt,
|
|
4654
|
+
runId: id,
|
|
4655
|
+
status: statusPayload.state,
|
|
4656
|
+
durationMs: runEndedAt - overallStartTime,
|
|
4657
|
+
totalTokens: statusPayload.totalTokens,
|
|
4658
|
+
totalCost: finalTotalCost,
|
|
4659
|
+
usageBudget: statusPayload.usageBudget,
|
|
4660
|
+
}),
|
|
4661
|
+
);
|
|
4662
|
+
writeRunLog(logPath, omitUndefinedProperties({
|
|
4663
|
+
id,
|
|
4664
|
+
mode: statusPayload.mode,
|
|
4665
|
+
cwd,
|
|
4666
|
+
startedAt: overallStartTime,
|
|
4667
|
+
endedAt: runEndedAt,
|
|
4668
|
+
steps: statusPayload.steps.map((step) => omitUndefinedProperties({
|
|
4669
|
+
agent: step.agent,
|
|
4670
|
+
status: step.status,
|
|
4671
|
+
durationMs: step.durationMs,
|
|
4672
|
+
})),
|
|
4673
|
+
summary,
|
|
4674
|
+
truncated,
|
|
4675
|
+
artifactsDir,
|
|
4676
|
+
sessionFile: effectiveSessionFile,
|
|
4677
|
+
shareUrl,
|
|
4678
|
+
shareError,
|
|
4679
|
+
}));
|
|
4548
4680
|
if (config.runnerProcessInstanceId) {
|
|
4549
|
-
const writers: Record<string,
|
|
4681
|
+
const writers: Record<string, PiWriterProcessInstanceExitV1[]> = {};
|
|
4550
4682
|
const expectedWriters: Record<string, number> = {};
|
|
4551
4683
|
for (const [index, result] of results.entries()) {
|
|
4552
4684
|
writers[String(index)] = result.writerProcesses ?? [];
|