@selesai/code 0.8.2 → 0.8.4
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 +4 -2
- package/dist/cli/args.d.ts +2 -0
- package/dist/cli/args.js +18 -0
- package/dist/cli/config-selector.js +2 -2
- package/dist/cli/startup-ui.d.ts +1 -1
- package/dist/cli/startup-ui.js +2 -2
- package/dist/core/keybindings.d.ts +44 -4
- package/dist/core/llama/provider.js +22 -7
- package/dist/core/model-resolver.js +2 -0
- package/dist/core/model-runtime.d.ts +4 -2
- package/dist/core/model-runtime.js +23 -2
- package/dist/core/remote-catalog-provider.js +72 -67
- package/dist/core/settings-manager.d.ts +8 -0
- package/dist/core/settings-manager.js +18 -0
- 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 +15 -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 -586
- package/dist/extensions/pi-powerline-footer/package.json +5 -6
- package/dist/extensions/pi-powerline-footer/powerline-config.ts +0 -18
- 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/fixed-editor-border.test.ts +2 -2
- package/dist/extensions/pi-powerline-footer/tests/git-optional-locks.test.ts +64 -0
- package/dist/extensions/pi-powerline-footer/tests/guide.test.ts +1 -1
- package/dist/extensions/pi-powerline-footer/tests/jump-shortcuts.test.ts +86 -19
- 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/tsconfig.json +1 -1
- package/dist/extensions/pi-powerline-footer/types.ts +1 -2
- package/dist/extensions/pi-subagents/CHANGELOG.md +202 -14
- package/dist/extensions/pi-subagents/README.md +65 -1614
- 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 +328 -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 +29 -16
- 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 +56 -8
- package/dist/extensions/pi-subagents/src/extension/control-notices.ts +2 -2
- package/dist/extensions/pi-subagents/src/extension/fanout-child.ts +51 -26
- package/dist/extensions/pi-subagents/src/extension/index.ts +119 -50
- package/dist/extensions/pi-subagents/src/extension/public-execution.ts +72 -0
- package/dist/extensions/pi-subagents/src/extension/rpc.ts +15 -15
- 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/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 -14
- package/dist/extensions/pi-subagents/src/missions/store.ts +147 -5
- package/dist/extensions/pi-subagents/src/missions/types.ts +58 -3
- package/dist/extensions/pi-subagents/src/missions/workflow-state.ts +256 -0
- package/dist/extensions/pi-subagents/src/profiles/profiles.ts +8 -8
- package/dist/extensions/pi-subagents/src/runs/background/active-run-index.ts +42 -0
- package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +41 -7
- 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 +19 -3
- package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +39 -6
- 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/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 +21 -2
- 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 +152 -68
- 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 +3 -0
- package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +55 -26
- package/dist/extensions/pi-subagents/src/runs/foreground/foreground-history.ts +137 -0
- package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +798 -112
- package/dist/extensions/pi-subagents/src/runs/foreground/workflow-foreground-steering.ts +187 -0
- package/dist/extensions/pi-subagents/src/runs/shared/acceptance.ts +165 -22
- package/dist/extensions/pi-subagents/src/runs/shared/dynamic-fanout.ts +1 -1
- 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 +9 -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 +1 -0
- package/dist/extensions/pi-subagents/src/runs/shared/pi-args.ts +465 -116
- package/dist/extensions/pi-subagents/src/runs/shared/pi-spawn.ts +10 -10
- 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 +2 -2
- package/dist/extensions/pi-subagents/src/runs/shared/worktree.ts +3 -3
- 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 +100 -3
- package/dist/extensions/pi-subagents/src/shared/utf8.ts +11 -0
- package/dist/extensions/pi-subagents/src/shared/utils.ts +43 -33
- 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 +30 -16
- package/dist/extensions/pi-subagents/src/tui/fleet.ts +151 -31
- 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 +313 -25
- 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 +15 -15
- package/dist/extensions/pi-subagents/test/integration/async-execution.test.ts +411 -300
- 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 +99 -56
- package/dist/extensions/pi-subagents/test/integration/chain-clarify.test.ts +62 -16
- package/dist/extensions/pi-subagents/test/integration/chain-execution.test.ts +159 -108
- 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 +56 -56
- package/dist/extensions/pi-subagents/test/integration/intercom-result-delivery.test.ts +114 -45
- package/dist/extensions/pi-subagents/test/integration/parallel-execution.test.ts +57 -19
- 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 +809 -87
- 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 +163 -58
- 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 +99 -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 +2 -2
- package/dist/extensions/pi-subagents/test/unit/async-resume.test.ts +94 -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 +19 -19
- 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 +52 -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 +1 -1
- 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 +62 -44
- package/dist/extensions/pi-subagents/test/unit/fleet.test.ts +329 -37
- package/dist/extensions/pi-subagents/test/unit/foreground-control.test.ts +4 -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 +5 -5
- 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 +55 -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 +28 -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/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 +357 -92
- package/dist/extensions/pi-subagents/test/unit/pi-coding-agent-dir.test.ts +22 -6
- 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 +4 -4
- 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 +40 -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 +107 -27
- 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 +56 -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 +59 -44
- package/dist/extensions/pi-subagents/test/unit/scripted-workflow.test.ts +424 -49
- 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 +120 -91
- 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 +26 -26
- package/dist/extensions/pi-subagents/test/unit/timeout-defaults.test.ts +73 -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 +7 -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/index.d.ts +1 -1
- package/dist/main.js +1 -0
- package/dist/modes/interactive/components/settings-selector.d.ts +6 -2
- package/dist/modes/interactive/components/settings-selector.js +20 -0
- package/dist/modes/interactive/interactive-mode.d.ts +28 -0
- package/dist/modes/interactive/interactive-mode.js +214 -28
- package/dist/modes/interactive/theme/dark.json +1 -0
- package/dist/modes/interactive/theme/light.json +1 -0
- package/dist/modes/interactive/theme/theme-controller.d.ts +3 -0
- package/dist/modes/interactive/theme/theme-controller.js +10 -1
- package/dist/modes/interactive/theme/theme.d.ts +2 -2
- package/dist/modes/interactive/theme/theme.js +24 -6
- 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/keybindings.md +35 -7
- 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/settings.md +16 -14
- package/docs/usage.md +5 -0
- package/package.json +5 -5
- package/dist/extensions/pi-powerline-footer/fixed-editor/cluster.ts +0 -113
- package/dist/extensions/pi-powerline-footer/fixed-editor/terminal-split.ts +0 -1080
- package/dist/extensions/pi-powerline-footer/tests/fixed-editor.test.ts +0 -1452
- 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";
|
|
@@ -69,7 +71,7 @@ import {
|
|
|
69
71
|
import { applyThinkingSuffix, buildPiArgs, cleanupTempDir, projectLaunchResolvedChildExtensions, resolvePiLaunchToolPlan } from "../shared/pi-args.ts";
|
|
70
72
|
import { readRuntimeAcknowledgedExtensions } from "../shared/runtime-acknowledged-extensions.ts";
|
|
71
73
|
import { outputEntryFromAsyncResult, resolveOutputReferences } from "../shared/chain-outputs.ts";
|
|
72
|
-
import { createStructuredOutputRuntime, readStructuredOutput } from "../shared/structured-output.ts";
|
|
74
|
+
import { createStructuredOutputRuntime, MISSING_STRUCTURED_OUTPUT_CALL_ERROR, readStructuredOutput } from "../shared/structured-output.ts";
|
|
73
75
|
import { formatProcessSignalError, isUnexplainedProcessSignal } from "../shared/process-signal.ts";
|
|
74
76
|
import { readChildToolDiagnosticError } from "../shared/tool-availability.ts";
|
|
75
77
|
import { collectDynamicResults, DynamicFanoutError, materializeDynamicParallelStep, validateDynamicCollection } from "../shared/dynamic-fanout.ts";
|
|
@@ -503,6 +505,8 @@ interface RunPiStreamingResult {
|
|
|
503
505
|
toolBudget?: ToolBudgetState;
|
|
504
506
|
toolBudgetBlocked?: boolean;
|
|
505
507
|
observedMutationAttempt?: boolean;
|
|
508
|
+
structuredOutputToolInvoked?: boolean;
|
|
509
|
+
structuredOutputMessageStartIndex?: number;
|
|
506
510
|
watchdog?: ChildWatchdogStateSnapshot;
|
|
507
511
|
runtimeAcknowledgedExtensions?: RuntimeAcknowledgedChildExtensionsV1;
|
|
508
512
|
processInstanceId: string;
|
|
@@ -568,6 +572,8 @@ function runPiStreaming(
|
|
|
568
572
|
let turnBudgetMessage: string | undefined;
|
|
569
573
|
let turnBudget: TurnBudgetState | undefined;
|
|
570
574
|
let observedMutationAttempt = false;
|
|
575
|
+
let structuredOutputToolInvoked = false;
|
|
576
|
+
let structuredOutputMessageStartIndex: number | undefined;
|
|
571
577
|
let toolCount = 0;
|
|
572
578
|
const childWatchdogConfig = decodeChildWatchdogConfig(env?.[CHILD_WATCHDOG_CONFIG_ENV]);
|
|
573
579
|
let childWatchdogState: ChildWatchdogStateSnapshot | undefined;
|
|
@@ -658,6 +664,10 @@ function runPiStreaming(
|
|
|
658
664
|
|
|
659
665
|
if (event.type === "tool_execution_start" && event.toolName) {
|
|
660
666
|
toolCount += 1;
|
|
667
|
+
if (event.toolName === "structured_output") {
|
|
668
|
+
structuredOutputToolInvoked = true;
|
|
669
|
+
structuredOutputMessageStartIndex = messages.length;
|
|
670
|
+
}
|
|
661
671
|
observedMutationAttempt = observedMutationAttempt || isMutatingTool(event.toolName, event.args);
|
|
662
672
|
const toolArgs = extractToolArgsPreview(event.args ?? {});
|
|
663
673
|
writeOutputLine(toolArgs ? `${event.toolName}: ${toolArgs}` : event.toolName);
|
|
@@ -923,6 +933,8 @@ function runPiStreaming(
|
|
|
923
933
|
turnBudgetExceeded,
|
|
924
934
|
wrapUpRequested: turnBudget?.outcome === "wrap-up-requested" || turnBudget?.outcome === "termination-deferred" || turnBudgetExceeded || undefined,
|
|
925
935
|
observedMutationAttempt,
|
|
936
|
+
structuredOutputToolInvoked,
|
|
937
|
+
structuredOutputMessageStartIndex,
|
|
926
938
|
watchdog: childWatchdogState,
|
|
927
939
|
processInstanceId,
|
|
928
940
|
processCloseObservedAt,
|
|
@@ -949,7 +961,7 @@ function runPiStreaming(
|
|
|
949
961
|
const stderr = stderrTail.text();
|
|
950
962
|
const finalOutput = getFinalOutput(messages) || rawStdoutTail.text().trim();
|
|
951
963
|
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 }));
|
|
964
|
+
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 }));
|
|
953
965
|
});
|
|
954
966
|
});
|
|
955
967
|
}
|
|
@@ -976,7 +988,7 @@ async function exportSessionHtml(sessionFile: string, outputDir: string, piPacka
|
|
|
976
988
|
|
|
977
989
|
function createShareLink(htmlPath: string): { shareUrl: string; gistUrl: string } | { error: string } {
|
|
978
990
|
try {
|
|
979
|
-
const auth = spawnSync("gh", ["auth", "status"], { encoding: "utf-8"
|
|
991
|
+
const auth = spawnSync("gh", ["auth", "status"], { encoding: "utf-8" });
|
|
980
992
|
if (auth.status !== 0) {
|
|
981
993
|
return { error: "GitHub CLI is not logged in. Run 'gh auth login' first." };
|
|
982
994
|
}
|
|
@@ -985,7 +997,7 @@ function createShareLink(htmlPath: string): { shareUrl: string; gistUrl: string
|
|
|
985
997
|
}
|
|
986
998
|
|
|
987
999
|
try {
|
|
988
|
-
const result = spawnSync("gh", ["gist", "create", htmlPath], { encoding: "utf-8"
|
|
1000
|
+
const result = spawnSync("gh", ["gist", "create", htmlPath], { encoding: "utf-8" });
|
|
989
1001
|
if (result.status !== 0) {
|
|
990
1002
|
const err = (result.stderr || "").trim() || "Failed to create gist.";
|
|
991
1003
|
return { error: err };
|
|
@@ -1444,31 +1456,42 @@ async function runSingleStep(
|
|
|
1444
1456
|
const runtimeAcknowledgedExtensions = readRuntimeAcknowledgedExtensions(runtimeAcknowledgedExtensionsPath);
|
|
1445
1457
|
cleanupTempDir(tempDir);
|
|
1446
1458
|
|
|
1447
|
-
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1459
|
+
let structuredOutput: unknown;
|
|
1460
|
+
let structuredError: string | undefined;
|
|
1461
|
+
let validatedStructuredOutput = false;
|
|
1462
|
+
if (effectiveStructuredOutput && run.exitCode === 0 && !run.error && !toolAvailabilityError) {
|
|
1463
|
+
if (!run.structuredOutputToolInvoked) {
|
|
1464
|
+
structuredError = MISSING_STRUCTURED_OUTPUT_CALL_ERROR;
|
|
1465
|
+
} else {
|
|
1466
|
+
const structured = await readStructuredOutput({
|
|
1467
|
+
schema: effectiveStructuredOutput.schema,
|
|
1468
|
+
schemaPath: effectiveStructuredOutput.schemaPath,
|
|
1469
|
+
outputPath: effectiveStructuredOutput.outputPath,
|
|
1470
|
+
});
|
|
1471
|
+
if (structured.error) structuredError = structured.error;
|
|
1472
|
+
else {
|
|
1473
|
+
structuredOutput = structured.value;
|
|
1474
|
+
validatedStructuredOutput = true;
|
|
1475
|
+
}
|
|
1476
|
+
}
|
|
1477
|
+
}
|
|
1478
|
+
const errorMessages = validatedStructuredOutput
|
|
1479
|
+
? run.messages.slice(run.structuredOutputMessageStartIndex ?? run.messages.length)
|
|
1480
|
+
: run.messages;
|
|
1481
|
+
const hiddenError = run.exitCode === 0 && !run.error && !toolAvailabilityError && !structuredError
|
|
1482
|
+
? detectSubagentError(errorMessages)
|
|
1483
|
+
: null;
|
|
1451
1484
|
const emptyOutputError = run.exitCode === 0
|
|
1452
1485
|
&& !run.error
|
|
1453
1486
|
&& !toolAvailabilityError
|
|
1487
|
+
&& !structuredError
|
|
1454
1488
|
&& !run.finalOutput.trim()
|
|
1455
|
-
&&
|
|
1489
|
+
&& !validatedStructuredOutput
|
|
1456
1490
|
&& (!hiddenError?.hasError || hasEmptyTerminalAssistantResponse(run.messages))
|
|
1457
1491
|
? "Subagent produced no output (possible model cold-start or empty response)."
|
|
1458
1492
|
: 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
1493
|
const completionGuardEnabled = isAgentContractV1(step.agentContract) ? step.completionGuard === true : step.completionGuard !== false;
|
|
1471
|
-
const completionGuard = run.exitCode === 0 && !run.error && !toolAvailabilityError && !hiddenError?.hasError && !emptyOutputError && completionGuardEnabled
|
|
1494
|
+
const completionGuard = run.exitCode === 0 && !run.error && !toolAvailabilityError && !structuredError && !hiddenError?.hasError && !emptyOutputError && completionGuardEnabled
|
|
1472
1495
|
? evaluateCompletionMutationGuard(omitUndefinedProperties({
|
|
1473
1496
|
agent: step.agent,
|
|
1474
1497
|
task: taskForCompletionGuard,
|
|
@@ -1635,6 +1658,8 @@ async function runSingleStep(
|
|
|
1635
1658
|
signal: combinedAbortSignal([ctx.timeoutSignal, ctx.stopSignal]),
|
|
1636
1659
|
abortMessage: ctx.stopSignal?.aborted ? ctx.stopMessage ?? "Subagent stopped by user." : ctx.timeoutMessage ?? "Subagent timed out.",
|
|
1637
1660
|
reportOptional: isAgentContractV1(step.agentContract),
|
|
1661
|
+
artifactsDir: ctx.artifactsDir,
|
|
1662
|
+
runId: ctx.id,
|
|
1638
1663
|
}))
|
|
1639
1664
|
: undefined;
|
|
1640
1665
|
const stoppedAfterAcceptance = finalResult?.stopped === true || ctx.stopSignal?.aborted === true;
|
|
@@ -1932,6 +1957,47 @@ function combinedAbortSignal(signals: Array<AbortSignal | undefined>): AbortSign
|
|
|
1932
1957
|
return controller.signal;
|
|
1933
1958
|
}
|
|
1934
1959
|
|
|
1960
|
+
async function runSingleStepWithTimeout(
|
|
1961
|
+
step: SubagentStep,
|
|
1962
|
+
ctx: SingleStepContext,
|
|
1963
|
+
parentDeadlineAt?: number,
|
|
1964
|
+
): Promise<SingleStepResult> {
|
|
1965
|
+
if (step.timeoutMs === undefined) return runSingleStep(step, ctx);
|
|
1966
|
+
|
|
1967
|
+
const parentRemainingMs = parentDeadlineAt === undefined ? undefined : Math.max(0, parentDeadlineAt - Date.now());
|
|
1968
|
+
const timeoutMs = parentRemainingMs === undefined ? step.timeoutMs : Math.min(step.timeoutMs, parentRemainingMs);
|
|
1969
|
+
const timeoutMessage = parentRemainingMs !== undefined && parentRemainingMs <= step.timeoutMs
|
|
1970
|
+
? ctx.timeoutMessage
|
|
1971
|
+
: `Subagent timed out after ${step.timeoutMs}ms.`;
|
|
1972
|
+
const timeoutController = new AbortController();
|
|
1973
|
+
let timeoutAction: (() => void) | undefined;
|
|
1974
|
+
let timeoutTriggered = false;
|
|
1975
|
+
const triggerTimeout = (): void => {
|
|
1976
|
+
if (timeoutTriggered) return;
|
|
1977
|
+
timeoutTriggered = true;
|
|
1978
|
+
timeoutController.abort();
|
|
1979
|
+
timeoutAction?.();
|
|
1980
|
+
};
|
|
1981
|
+
const registerTimeout = (action: (() => void) | undefined): void => {
|
|
1982
|
+
timeoutAction = action;
|
|
1983
|
+
ctx.registerTimeout?.(action ? triggerTimeout : undefined);
|
|
1984
|
+
if (action && timeoutTriggered) action();
|
|
1985
|
+
};
|
|
1986
|
+
const timer = setTimeout(triggerTimeout, timeoutMs);
|
|
1987
|
+
timer.unref?.();
|
|
1988
|
+
try {
|
|
1989
|
+
return await runSingleStep(step, {
|
|
1990
|
+
...ctx,
|
|
1991
|
+
registerTimeout,
|
|
1992
|
+
timeoutSignal: combinedAbortSignal([ctx.timeoutSignal, timeoutController.signal]),
|
|
1993
|
+
timeoutMessage,
|
|
1994
|
+
});
|
|
1995
|
+
} finally {
|
|
1996
|
+
clearTimeout(timer);
|
|
1997
|
+
ctx.registerTimeout?.(undefined);
|
|
1998
|
+
}
|
|
1999
|
+
}
|
|
2000
|
+
|
|
1935
2001
|
async function runSubagent(
|
|
1936
2002
|
config: SubagentRunConfig,
|
|
1937
2003
|
onWriterProcess?: (writer: { state: "none" | "spawning" } | { state: "running"; pid: number }) => void,
|
|
@@ -2116,6 +2182,7 @@ async function runSubagent(
|
|
|
2116
2182
|
|
|
2117
2183
|
fs.mkdirSync(asyncDir, { recursive: true });
|
|
2118
2184
|
writeAtomicJson(statusPath, statusPayload);
|
|
2185
|
+
updateActiveRunIndex(asyncDir, statusPayload.state);
|
|
2119
2186
|
let pendingParallelUsageCost: CostSummary = { inputTokens: 0, outputTokens: 0, costUsd: 0 };
|
|
2120
2187
|
const currentUsageTotals = (): CostSummary => {
|
|
2121
2188
|
const cost = results.reduce<CostSummary>((sum, result) => ({
|
|
@@ -2188,11 +2255,25 @@ async function runSubagent(
|
|
|
2188
2255
|
for (const node of graph.nodes) updateNode(node);
|
|
2189
2256
|
statusPayload.workflowGraph = graph;
|
|
2190
2257
|
};
|
|
2191
|
-
|
|
2258
|
+
let lastIndexedActiveState = isActiveAsyncState(statusPayload.state);
|
|
2259
|
+
const writeStatusPayloadNow = (): void => {
|
|
2192
2260
|
refreshWorkflowGraph();
|
|
2193
2261
|
writeAtomicJson(statusPath, statusPayload);
|
|
2262
|
+
const activeState = isActiveAsyncState(statusPayload.state);
|
|
2263
|
+
if (activeState !== lastIndexedActiveState) {
|
|
2264
|
+
updateActiveRunIndex(asyncDir, statusPayload.state);
|
|
2265
|
+
lastIndexedActiveState = activeState;
|
|
2266
|
+
}
|
|
2194
2267
|
emitNestedSelfEvent(statusPayload.state === "running" || statusPayload.state === "queued" ? "subagent.nested.updated" : "subagent.nested.completed");
|
|
2195
2268
|
};
|
|
2269
|
+
const statusWriteCoalescer = createFileCoalescer(writeStatusPayloadNow, 100);
|
|
2270
|
+
const writeStatusPayload = (immediate = true): void => {
|
|
2271
|
+
if (immediate || statusPayload.state !== "running" || statusPayload.activityState !== undefined) {
|
|
2272
|
+
if (!statusWriteCoalescer.flush(statusPath)) writeStatusPayloadNow();
|
|
2273
|
+
return;
|
|
2274
|
+
}
|
|
2275
|
+
statusWriteCoalescer.schedule(statusPath);
|
|
2276
|
+
};
|
|
2196
2277
|
const updateExternalProcess = (index: number, process: ExternalProcessStatus): void => {
|
|
2197
2278
|
requiredStatusStep(statusPayload, index).externalProcess = process;
|
|
2198
2279
|
statusPayload.lastUpdate = Date.now();
|
|
@@ -2264,7 +2345,7 @@ async function runSubagent(
|
|
|
2264
2345
|
const nestedAsyncDir = run.asyncDir ?? resolveNestedAsyncDir(config.nestedRoute.rootRunId, run);
|
|
2265
2346
|
if (!nestedAsyncDir) continue;
|
|
2266
2347
|
try {
|
|
2267
|
-
deliverInterruptRequest(
|
|
2348
|
+
deliverInterruptRequest({ asyncDir: nestedAsyncDir, source: "ancestor-interrupt" });
|
|
2268
2349
|
} catch (error) {
|
|
2269
2350
|
appendJsonl(eventsPath, JSON.stringify({
|
|
2270
2351
|
type: "subagent.nested.interrupt_failed",
|
|
@@ -2611,7 +2692,10 @@ async function runSubagent(
|
|
|
2611
2692
|
const now = Date.now();
|
|
2612
2693
|
if (ack.state === "delivered") {
|
|
2613
2694
|
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 });
|
|
2695
|
+
emitSteeringEvent("subagent.steer.delivered", { type: "steer", id: ack.requestId, ts: now, message: ack.message }, ack.index, { late, deliveryStatus: "delivered", message: ack.message });
|
|
2696
|
+
} else if (ack.state === "queued") {
|
|
2697
|
+
updateSteeringLifecycleTarget(ack.requestId, ack.index, "queued", now);
|
|
2698
|
+
emitSteeringEvent("subagent.steer.queued", { type: "steer", id: ack.requestId, ts: now, message: ack.message }, ack.index, { deliveryStatus: "queued", message: ack.message });
|
|
2615
2699
|
} else {
|
|
2616
2700
|
markSteeringAttention(ack.index);
|
|
2617
2701
|
updateSteeringLifecycleTarget(ack.requestId, ack.index, "failed", now, { reason: ack.message });
|
|
@@ -2716,7 +2800,7 @@ async function runSubagent(
|
|
|
2716
2800
|
step.lastActivityAt = now;
|
|
2717
2801
|
statusPayload.lastActivityAt = now;
|
|
2718
2802
|
statusPayload.lastUpdate = now;
|
|
2719
|
-
writeStatusPayload();
|
|
2803
|
+
writeStatusPayload(false);
|
|
2720
2804
|
return;
|
|
2721
2805
|
}
|
|
2722
2806
|
if (event.type === "tool_execution_start" && event.toolName) {
|
|
@@ -2852,7 +2936,7 @@ async function runSubagent(
|
|
|
2852
2936
|
statusPayload.lastActivityAt = now;
|
|
2853
2937
|
statusPayload.lastUpdate = now;
|
|
2854
2938
|
maybeEmitActiveLongRunning(flatIndex, now);
|
|
2855
|
-
writeStatusPayload();
|
|
2939
|
+
writeStatusPayload(false);
|
|
2856
2940
|
};
|
|
2857
2941
|
const updateRunnerActivityState = (now: number): boolean => {
|
|
2858
2942
|
if (!controlConfig.enabled) return false;
|
|
@@ -3423,7 +3507,7 @@ async function runSubagent(
|
|
|
3423
3507
|
writeStatusPayload();
|
|
3424
3508
|
appendJsonl(eventsPath, JSON.stringify({ type: "subagent.step.started", ts: taskStartTime, runId: id, stepIndex: fi, agent: task.agent }));
|
|
3425
3509
|
flushPendingStepSteers(fi);
|
|
3426
|
-
const singleResult = await
|
|
3510
|
+
const singleResult = await runSingleStepWithTimeout(task, compactOptional<SingleStepContext>({
|
|
3427
3511
|
previousOutput, placeholder, cwd, sessionEnabled,
|
|
3428
3512
|
outputs,
|
|
3429
3513
|
sessionDir: config.sessionDir ? path.join(config.sessionDir, `dynamic-${stepIndex}-${taskIdx}`) : undefined,
|
|
@@ -3453,7 +3537,7 @@ async function runSubagent(
|
|
|
3453
3537
|
onWriterProcess,
|
|
3454
3538
|
onExternalProcess: (process) => updateExternalProcess(fi, process),
|
|
3455
3539
|
skipAcceptance: () => timedOut || stopped,
|
|
3456
|
-
}));
|
|
3540
|
+
}), config.deadlineAt);
|
|
3457
3541
|
const taskEndTime = Date.now();
|
|
3458
3542
|
const childInterrupted = singleResult.interrupted === true;
|
|
3459
3543
|
const childStopped = singleResult.stopped === true;
|
|
@@ -3805,7 +3889,7 @@ async function runSubagent(
|
|
|
3805
3889
|
const { taskForRun, taskCwd } = prepareParallelTaskRun(task, cwd, worktreeSetup, taskIdx);
|
|
3806
3890
|
flushPendingStepSteers(fi);
|
|
3807
3891
|
|
|
3808
|
-
const singleResult = await
|
|
3892
|
+
const singleResult = await runSingleStepWithTimeout(taskForRun, compactOptional<SingleStepContext>({
|
|
3809
3893
|
previousOutput, placeholder, cwd: taskCwd, sessionEnabled,
|
|
3810
3894
|
outputs,
|
|
3811
3895
|
sessionDir: taskSessionDir,
|
|
@@ -3835,7 +3919,7 @@ async function runSubagent(
|
|
|
3835
3919
|
onWriterProcess,
|
|
3836
3920
|
onExternalProcess: (process) => updateExternalProcess(fi, process),
|
|
3837
3921
|
skipAcceptance: () => timedOut || stopped,
|
|
3838
|
-
}));
|
|
3922
|
+
}), config.deadlineAt);
|
|
3839
3923
|
if (task.sessionFile) {
|
|
3840
3924
|
latestSessionFile = task.sessionFile;
|
|
3841
3925
|
}
|
|
@@ -4094,7 +4178,7 @@ async function runSubagent(
|
|
|
4094
4178
|
}));
|
|
4095
4179
|
|
|
4096
4180
|
flushPendingStepSteers(flatIndex);
|
|
4097
|
-
const singleResult = await
|
|
4181
|
+
const singleResult = await runSingleStepWithTimeout(seqStep, compactOptional<SingleStepContext>({
|
|
4098
4182
|
previousOutput, placeholder, cwd, sessionEnabled,
|
|
4099
4183
|
outputs: statusPayload.mode === "single" ? undefined : outputs,
|
|
4100
4184
|
sessionDir: config.sessionDir,
|
|
@@ -4124,7 +4208,7 @@ async function runSubagent(
|
|
|
4124
4208
|
onWriterProcess,
|
|
4125
4209
|
onExternalProcess: (process) => updateExternalProcess(flatIndex, process),
|
|
4126
4210
|
skipAcceptance: () => timedOut || stopped,
|
|
4127
|
-
}));
|
|
4211
|
+
}), config.deadlineAt);
|
|
4128
4212
|
if (seqStep.sessionFile) {
|
|
4129
4213
|
latestSessionFile = seqStep.sessionFile;
|
|
4130
4214
|
}
|
|
@@ -4370,11 +4454,12 @@ async function runSubagent(
|
|
|
4370
4454
|
for (const request of steeringLifecycle.recent) {
|
|
4371
4455
|
let changed = false;
|
|
4372
4456
|
for (const target of request.targets) {
|
|
4373
|
-
if (target.state !== "scheduled" && target.state !== "routed") continue;
|
|
4457
|
+
if (target.state !== "scheduled" && target.state !== "routed" && target.state !== "queued") continue;
|
|
4374
4458
|
changed = true;
|
|
4375
|
-
|
|
4459
|
+
const reason = target.state === "queued" ? "run ended before queued follow-up delivery" : "child terminated before steering delivery";
|
|
4460
|
+
updateSteeringLifecycleTarget(request.id, target.index, "failed", Date.now(), { reason });
|
|
4376
4461
|
markSteeringAttention(target.index);
|
|
4377
|
-
emitSteeringEvent("subagent.steer.failed", { type: "steer", id: request.id, ts: request.requestedAt, message:
|
|
4462
|
+
emitSteeringEvent("subagent.steer.failed", { type: "steer", id: request.id, ts: request.requestedAt, message: reason }, target.index, { reason });
|
|
4378
4463
|
}
|
|
4379
4464
|
if (changed) emitTerminalSteeringNotice(request.id, `Steering failed for run ${id}: child terminated before delivery.`);
|
|
4380
4465
|
}
|
|
@@ -4413,39 +4498,6 @@ async function runSubagent(
|
|
|
4413
4498
|
}
|
|
4414
4499
|
}
|
|
4415
4500
|
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
4501
|
try {
|
|
4450
4502
|
writeAtomicJson(resultPath, {
|
|
4451
4503
|
lifecycleArtifactVersion: SUBAGENT_LIFECYCLE_ARTIFACT_VERSION,
|
|
@@ -4545,6 +4597,38 @@ async function runSubagent(
|
|
|
4545
4597
|
} catch (err) {
|
|
4546
4598
|
console.error(`Failed to write result file ${resultPath}:`, err);
|
|
4547
4599
|
}
|
|
4600
|
+
appendJsonl(
|
|
4601
|
+
eventsPath,
|
|
4602
|
+
JSON.stringify({
|
|
4603
|
+
type: "subagent.run.completed",
|
|
4604
|
+
lifecycleArtifactVersion: SUBAGENT_LIFECYCLE_ARTIFACT_VERSION,
|
|
4605
|
+
ts: runEndedAt,
|
|
4606
|
+
runId: id,
|
|
4607
|
+
status: statusPayload.state,
|
|
4608
|
+
durationMs: runEndedAt - overallStartTime,
|
|
4609
|
+
totalTokens: statusPayload.totalTokens,
|
|
4610
|
+
totalCost: finalTotalCost,
|
|
4611
|
+
usageBudget: statusPayload.usageBudget,
|
|
4612
|
+
}),
|
|
4613
|
+
);
|
|
4614
|
+
writeRunLog(logPath, omitUndefinedProperties({
|
|
4615
|
+
id,
|
|
4616
|
+
mode: statusPayload.mode,
|
|
4617
|
+
cwd,
|
|
4618
|
+
startedAt: overallStartTime,
|
|
4619
|
+
endedAt: runEndedAt,
|
|
4620
|
+
steps: statusPayload.steps.map((step) => omitUndefinedProperties({
|
|
4621
|
+
agent: step.agent,
|
|
4622
|
+
status: step.status,
|
|
4623
|
+
durationMs: step.durationMs,
|
|
4624
|
+
})),
|
|
4625
|
+
summary,
|
|
4626
|
+
truncated,
|
|
4627
|
+
artifactsDir,
|
|
4628
|
+
sessionFile: effectiveSessionFile,
|
|
4629
|
+
shareUrl,
|
|
4630
|
+
shareError,
|
|
4631
|
+
}));
|
|
4548
4632
|
if (config.runnerProcessInstanceId) {
|
|
4549
4633
|
const writers: Record<string, Array<{ processInstanceId: string; kind: "pi-writer"; attempt: number; closeObservedAt: number; exitCode: number | null; signal: string | null }>> = {};
|
|
4550
4634
|
const expectedWriters: Record<string, number> = {};
|
|
@@ -58,8 +58,11 @@ import {
|
|
|
58
58
|
type Details,
|
|
59
59
|
type ForegroundResumeRun,
|
|
60
60
|
type SubagentState,
|
|
61
|
+
type WaitCompletion,
|
|
61
62
|
} from "../../shared/types.ts";
|
|
62
63
|
import { formatDuration, shortenPath } from "../../shared/formatters.ts";
|
|
64
|
+
import { collectWaitCompletions } from "./wait-completions.ts";
|
|
65
|
+
import { formatResumeFirstFailedRunsNote } from "./resume-guidance.ts";
|
|
63
66
|
export { WAIT_TOOL_ENABLED_ENV, resolveWaitToolConfig, type ResolvedWaitToolConfig } from "./wait-config.ts";
|
|
64
67
|
|
|
65
68
|
/** States that mean a run is still in flight (not yet resolved). */
|
|
@@ -303,11 +306,15 @@ function summarizeTerminalRuns(runs: AsyncRunSummary[], providerFinishedCount =
|
|
|
303
306
|
return parts.join(", ");
|
|
304
307
|
}
|
|
305
308
|
|
|
306
|
-
function result(text: string, isError = false): AgentToolResult<Details> {
|
|
309
|
+
function result(text: string, isError = false, completions?: WaitCompletion[]): AgentToolResult<Details> {
|
|
307
310
|
return {
|
|
308
311
|
content: [{ type: "text", text }],
|
|
309
312
|
...(isError ? { isError: true } : {}),
|
|
310
|
-
details: {
|
|
313
|
+
details: {
|
|
314
|
+
mode: "management",
|
|
315
|
+
results: [],
|
|
316
|
+
...(completions && completions.length > 0 ? { completions } : {}),
|
|
317
|
+
},
|
|
311
318
|
};
|
|
312
319
|
}
|
|
313
320
|
|
|
@@ -597,6 +604,8 @@ export async function waitForSubagents(
|
|
|
597
604
|
let terminalSummary: string;
|
|
598
605
|
let finishedAsyncCount: number;
|
|
599
606
|
let failedAsyncCount: number;
|
|
607
|
+
let completions: WaitCompletion[] | undefined;
|
|
608
|
+
let resumeGuidance = "";
|
|
600
609
|
const activeProviderIds = new Set(providerActive.map(backgroundWorkIdentity));
|
|
601
610
|
const providerFinishedCount = [...initialProviderIds].filter((id) => !activeProviderIds.has(id)).length;
|
|
602
611
|
try {
|
|
@@ -605,6 +614,8 @@ export async function waitForSubagents(
|
|
|
605
614
|
finishedAsyncCount = terminal.length;
|
|
606
615
|
failedAsyncCount = terminal.filter((run) => run.state === "failed").length;
|
|
607
616
|
terminalSummary = summarizeTerminalRuns(terminal, providerFinishedCount);
|
|
617
|
+
resumeGuidance = formatResumeFirstFailedRunsNote(terminal);
|
|
618
|
+
completions = collectWaitCompletions(terminal, deps.state, deps.resultsDir ?? DIRS.results);
|
|
608
619
|
} catch (error) {
|
|
609
620
|
return result(error instanceof Error ? error.message : String(error), true);
|
|
610
621
|
}
|
|
@@ -629,8 +640,9 @@ export async function waitForSubagents(
|
|
|
629
640
|
: `${initialAsyncIds.size} async run(s) and ${initialProviderIds.size} provider item(s)`;
|
|
630
641
|
const status = relevantAttention.length > 0 ? "attention required" : "done";
|
|
631
642
|
return result(
|
|
632
|
-
`Waited ${elapsed} for ${scope}; ${status}.${outcome}${attentionNote} Completion/control events have been observed; inspect status if a notification is not visible yet.`,
|
|
643
|
+
`Waited ${elapsed} for ${scope}; ${status}.${outcome}${resumeGuidance}${attentionNote} Completion/control events have been observed; inspect status if a notification is not visible yet.`,
|
|
633
644
|
deps.failOnFailedRuns === true && failedAsyncCount > 0,
|
|
645
|
+
completions,
|
|
634
646
|
);
|
|
635
647
|
}
|
|
636
648
|
|
|
@@ -645,7 +657,8 @@ export async function waitForSubagents(
|
|
|
645
657
|
? `${relevantAttention.length} of ${initialCount} ${subject} need attention`
|
|
646
658
|
: `${finishedCount} of ${initialCount} ${subject} finished`;
|
|
647
659
|
return result(
|
|
648
|
-
`Waited ${elapsed}; ${progress}.${outcome}${attentionNote}${remainder} Relevant completion/control events have been observed; inspect status if a notification is not visible yet.`,
|
|
660
|
+
`Waited ${elapsed}; ${progress}.${outcome}${resumeGuidance}${attentionNote}${remainder} Relevant completion/control events have been observed; inspect status if a notification is not visible yet.`,
|
|
649
661
|
deps.failOnFailedRuns === true && failedAsyncCount > 0,
|
|
662
|
+
completions,
|
|
650
663
|
);
|
|
651
664
|
}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import type { ArtifactPaths, SubagentState, WaitCompletion, WaitCompletionChild } from "../../shared/types.ts";
|
|
4
|
+
import type { AsyncRunSummary } from "./async-status.ts";
|
|
5
|
+
import { readCompletionReplay, writeCompletionReplay } from "./completion-replay.ts";
|
|
6
|
+
|
|
7
|
+
function asNonEmptyString(value: unknown): string | undefined {
|
|
8
|
+
return typeof value === "string" && value ? value : undefined;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function errorCode(error: unknown): string | undefined {
|
|
12
|
+
return typeof error === "object" && error !== null && "code" in error
|
|
13
|
+
? (error as NodeJS.ErrnoException).code
|
|
14
|
+
: undefined;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function errorMessage(error: unknown): string {
|
|
18
|
+
return error instanceof Error ? error.message : String(error);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Project a terminal result payload into the slim shape that is safe to surface in
|
|
23
|
+
* tool_result details: run identity, per-child outcome, and the artifact trail.
|
|
24
|
+
* Output text is deliberately excluded — it already travels in the tool result
|
|
25
|
+
* content, and duplicating it in details would double the payload for every wait.
|
|
26
|
+
*/
|
|
27
|
+
export function toWaitCompletion(data: Record<string, unknown>, runId: string): WaitCompletion {
|
|
28
|
+
const results = Array.isArray(data.results)
|
|
29
|
+
? data.results.flatMap((entry): WaitCompletionChild[] => {
|
|
30
|
+
if (entry === null || typeof entry !== "object") return [];
|
|
31
|
+
const child = entry as Record<string, unknown>;
|
|
32
|
+
const outputState = child.outputState === "present" || child.outputState === "absent" || child.outputState === "unknown"
|
|
33
|
+
? child.outputState
|
|
34
|
+
: undefined;
|
|
35
|
+
const artifactPaths = child.artifactPaths !== null && typeof child.artifactPaths === "object"
|
|
36
|
+
? (child.artifactPaths as Partial<ArtifactPaths>)
|
|
37
|
+
: undefined;
|
|
38
|
+
const agent = asNonEmptyString(child.agent);
|
|
39
|
+
const childRunId = asNonEmptyString(child.runId);
|
|
40
|
+
const error = asNonEmptyString(child.error);
|
|
41
|
+
const model = asNonEmptyString(child.model);
|
|
42
|
+
return [{
|
|
43
|
+
...(agent ? { agent } : {}),
|
|
44
|
+
...(childRunId ? { runId: childRunId } : {}),
|
|
45
|
+
...(typeof child.success === "boolean" ? { success: child.success } : {}),
|
|
46
|
+
...(outputState ? { outputState } : {}),
|
|
47
|
+
...(error ? { error } : {}),
|
|
48
|
+
...(model ? { model } : {}),
|
|
49
|
+
...(artifactPaths ? { artifactPaths } : {}),
|
|
50
|
+
}];
|
|
51
|
+
})
|
|
52
|
+
: undefined;
|
|
53
|
+
const agent = asNonEmptyString(data.agent);
|
|
54
|
+
const mode = asNonEmptyString(data.mode);
|
|
55
|
+
const state = asNonEmptyString(data.state);
|
|
56
|
+
return {
|
|
57
|
+
runId,
|
|
58
|
+
...(agent ? { agent } : {}),
|
|
59
|
+
...(mode ? { mode } : {}),
|
|
60
|
+
...(state ? { state } : {}),
|
|
61
|
+
...(typeof data.success === "boolean" ? { success: data.success } : {}),
|
|
62
|
+
...(results && results.length > 0 ? { results } : {}),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Record a consumed terminal payload for later surfacing by subagent_wait, pruning
|
|
68
|
+
* stale entries with the same TTL that dedupes completion notifications. The result
|
|
69
|
+
* file is deleted after delivery, so this record is the only in-process source once
|
|
70
|
+
* the watcher has consumed it.
|
|
71
|
+
*/
|
|
72
|
+
export function recordWaitCompletion(
|
|
73
|
+
state: SubagentState,
|
|
74
|
+
runId: string,
|
|
75
|
+
data: Record<string, unknown>,
|
|
76
|
+
now: number,
|
|
77
|
+
ttlMs: number,
|
|
78
|
+
persistence?: { resultsDir: string; sessionId: string },
|
|
79
|
+
): void {
|
|
80
|
+
const store = state.completedResults ??= new Map();
|
|
81
|
+
for (const [key, entry] of store) {
|
|
82
|
+
if (now - entry.seenAt > ttlMs) store.delete(key);
|
|
83
|
+
}
|
|
84
|
+
let completion = toWaitCompletion(data, runId);
|
|
85
|
+
if (persistence) {
|
|
86
|
+
try {
|
|
87
|
+
completion = writeCompletionReplay({
|
|
88
|
+
...persistence,
|
|
89
|
+
runId,
|
|
90
|
+
completion,
|
|
91
|
+
data,
|
|
92
|
+
now,
|
|
93
|
+
ttlMs,
|
|
94
|
+
}).completion;
|
|
95
|
+
} catch (error) {
|
|
96
|
+
console.error(`Failed to persist completion replay for '${runId}':`, error);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
store.set(runId, { seenAt: now, completion });
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Terminal payloads for the runs a wait covered: the watcher's in-memory record
|
|
104
|
+
* first, then the not-yet-consumed result file. Result files are written atomically,
|
|
105
|
+
* so a direct read never observes a torn write; the read is deliberately read-only —
|
|
106
|
+
* the watcher owns notification and cleanup.
|
|
107
|
+
*/
|
|
108
|
+
export function collectWaitCompletions(terminal: AsyncRunSummary[], state: SubagentState, resultsDir: string): WaitCompletion[] | undefined {
|
|
109
|
+
if (terminal.length === 0) return undefined;
|
|
110
|
+
const completions: WaitCompletion[] = [];
|
|
111
|
+
for (const run of terminal) {
|
|
112
|
+
const recorded = state.completedResults?.get(run.id);
|
|
113
|
+
if (recorded) {
|
|
114
|
+
completions.push(recorded.completion);
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
const resultPath = path.join(resultsDir, `${run.id}.json`);
|
|
118
|
+
try {
|
|
119
|
+
const raw = JSON.parse(fs.readFileSync(resultPath, "utf-8")) as Record<string, unknown>;
|
|
120
|
+
completions.push(toWaitCompletion(raw, run.id));
|
|
121
|
+
} catch (error) {
|
|
122
|
+
if (errorCode(error) !== "ENOENT") {
|
|
123
|
+
throw new Error(`Failed to read subagent result '${resultPath}': ${errorMessage(error)}`, {
|
|
124
|
+
cause: error instanceof Error ? error : undefined,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
// The watcher may have consumed the file between the store check and the
|
|
128
|
+
// read. Prefer its in-memory record, then the durable replay written before
|
|
129
|
+
// result cleanup so watcher reloads do not lose completion details.
|
|
130
|
+
const late = state.completedResults?.get(run.id);
|
|
131
|
+
if (late) {
|
|
132
|
+
completions.push(late.completion);
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
try {
|
|
136
|
+
const replay = readCompletionReplay(resultsDir, run.id, { sessionId: run.sessionId });
|
|
137
|
+
if (replay) completions.push(replay.completion);
|
|
138
|
+
} catch (replayError) {
|
|
139
|
+
throw new Error(`Failed to read completion replay for '${run.id}': ${errorMessage(replayError)}`, {
|
|
140
|
+
cause: replayError instanceof Error ? replayError : undefined,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return completions.length > 0 ? completions : undefined;
|
|
146
|
+
}
|