@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,8 +5,10 @@ import * as os from "node:os";
|
|
|
5
5
|
import * as path from "node:path";
|
|
6
6
|
import { after, afterEach, before, beforeEach, describe, it } from "node:test";
|
|
7
7
|
import { ASYNC_DIR, INTERCOM_DETACH_REQUEST_EVENT, RESULTS_DIR, SUBAGENT_ASYNC_STARTED_EVENT, SUBAGENT_FOREGROUND_COMPLETE_EVENT } from "../../src/shared/types.ts";
|
|
8
|
+
import { ACTIVE_ASYNC_CAPACITY_DIR, acquireActiveAsyncCapacity, activeAsyncCapacitySessionKey, getActiveAsyncCapacitySnapshot } from "../../src/runs/background/active-async-capacity.ts";
|
|
8
9
|
import { waitForSubagents } from "../../src/runs/background/subagent-wait.ts";
|
|
9
|
-
import {
|
|
10
|
+
import { createRunFanoutBudget } from "../../src/runs/shared/run-fanout-budget.ts";
|
|
11
|
+
import { acquireSessionLease, sessionLeaseDir } from "../../src/runs/shared/session-lease.ts";
|
|
10
12
|
import type { MockPi } from "../support/helpers.ts";
|
|
11
13
|
import {
|
|
12
14
|
createMockPi,
|
|
@@ -26,6 +28,7 @@ interface ExecutorResult {
|
|
|
26
28
|
runId?: string;
|
|
27
29
|
results?: Array<{ agent?: string; finalOutput?: string; sessionFile?: string; acceptance?: { status?: string }; artifactPaths?: { metadataPath?: string } }>;
|
|
28
30
|
asyncId?: string;
|
|
31
|
+
workflow?: { value?: unknown };
|
|
29
32
|
};
|
|
30
33
|
}
|
|
31
34
|
|
|
@@ -81,6 +84,7 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
|
|
|
81
84
|
let mockPi: MockPi;
|
|
82
85
|
let originalHome: string | undefined;
|
|
83
86
|
let originalUserProfile: string | undefined;
|
|
87
|
+
let budgetDirectories: string[] = [];
|
|
84
88
|
|
|
85
89
|
before(() => {
|
|
86
90
|
originalHome = process.env.HOME;
|
|
@@ -111,6 +115,7 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
|
|
|
111
115
|
|
|
112
116
|
afterEach(() => {
|
|
113
117
|
removeTempDir(tempDir);
|
|
118
|
+
for (const directory of budgetDirectories.splice(0)) fs.rmSync(directory, { recursive: true, force: true });
|
|
114
119
|
});
|
|
115
120
|
|
|
116
121
|
async function readMockCallArgs(index: number): Promise<string[]> {
|
|
@@ -161,7 +166,39 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
|
|
|
161
166
|
}
|
|
162
167
|
}
|
|
163
168
|
|
|
164
|
-
function
|
|
169
|
+
async function waitForStatus(filePath: string, predicate: (status: any) => boolean, timeoutMs = 10_000): Promise<any> {
|
|
170
|
+
const deadline = Date.now() + timeoutMs;
|
|
171
|
+
let lastStatus: any;
|
|
172
|
+
while (Date.now() <= deadline) {
|
|
173
|
+
if (fs.existsSync(filePath)) {
|
|
174
|
+
lastStatus = JSON.parse(fs.readFileSync(filePath, "utf-8"));
|
|
175
|
+
if (predicate(lastStatus)) return lastStatus;
|
|
176
|
+
}
|
|
177
|
+
await new Promise((resolve) => setTimeout(resolve, 50));
|
|
178
|
+
}
|
|
179
|
+
assert.fail(`Timed out waiting for status at ${filePath}; last status: ${JSON.stringify(lastStatus)}`);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
function writeRecoveryDescriptor(asyncDir: string, runId: string, agent = "worker", overrides: Record<string, unknown> = {}): void {
|
|
183
|
+
const runFanoutBudget = createRunFanoutBudget(runId, 64);
|
|
184
|
+
budgetDirectories.push(runFanoutBudget.directory);
|
|
185
|
+
fs.writeFileSync(path.join(asyncDir, "recovery-descriptor.json"), JSON.stringify({
|
|
186
|
+
version: 1,
|
|
187
|
+
runFanoutBudget,
|
|
188
|
+
sourceRunId: runId,
|
|
189
|
+
agent,
|
|
190
|
+
cwd: tempDir,
|
|
191
|
+
systemPromptMode: "replace",
|
|
192
|
+
inheritProjectContext: false,
|
|
193
|
+
inheritSkills: false,
|
|
194
|
+
outputMode: "inline",
|
|
195
|
+
maxSubagentDepth: 2,
|
|
196
|
+
share: false,
|
|
197
|
+
...overrides,
|
|
198
|
+
}, null, 2), "utf-8");
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
function makeExecutor(options: { bridgeMode?: "always" | "off"; resultDelivery?: boolean; agents?: ReturnType<typeof makeAgent>[]; acknowledgeResults?: boolean; kill?: (pid: number, signal?: NodeJS.Signals | 0) => boolean; maxActiveAsyncRunsPerSession?: number } = {}) {
|
|
165
202
|
const events = createRecordingEventBus({ acknowledgeResults: options.acknowledgeResults ?? true });
|
|
166
203
|
const state = {
|
|
167
204
|
baseCwd: tempDir,
|
|
@@ -193,24 +230,25 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
|
|
|
193
230
|
mode: options.bridgeMode ?? "always",
|
|
194
231
|
...(options.resultDelivery === undefined ? {} : { resultDelivery: options.resultDelivery }),
|
|
195
232
|
},
|
|
233
|
+
...(options.maxActiveAsyncRunsPerSession === undefined ? {} : { maxActiveAsyncRunsPerSession: options.maxActiveAsyncRunsPerSession }),
|
|
196
234
|
},
|
|
197
235
|
asyncByDefault: false,
|
|
198
236
|
tempArtifactsDir: tempDir,
|
|
199
237
|
getSubagentSessionRoot: () => tempDir,
|
|
200
238
|
expandTilde: (value: string) => value,
|
|
201
|
-
discoverAgents: () => ({ agents: options.agents ?? [makeAgent("
|
|
239
|
+
discoverAgents: () => ({ agents: options.agents ?? [makeAgent("worker")] }),
|
|
202
240
|
kill: options.kill,
|
|
203
241
|
});
|
|
204
242
|
return { executor, events, state };
|
|
205
243
|
}
|
|
206
244
|
|
|
207
245
|
it("single foreground runs emit one grouped event and return a compact receipt", async () => {
|
|
208
|
-
mockPi.onCall({ output: "Full child output from
|
|
246
|
+
mockPi.onCall({ output: "Full child output from worker" });
|
|
209
247
|
const { executor, events } = makeExecutor({ resultDelivery: true });
|
|
210
248
|
|
|
211
249
|
const result = await executor.execute(
|
|
212
250
|
"single-intercom",
|
|
213
|
-
{ agent: "
|
|
251
|
+
{ agent: "worker", task: "Implement feature" },
|
|
214
252
|
new AbortController().signal,
|
|
215
253
|
undefined,
|
|
216
254
|
makeMinimalCtx(tempDir),
|
|
@@ -221,14 +259,83 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
|
|
|
221
259
|
const payload = intercomEvents[0]!.payload as { children?: Array<{ agent?: string; intercomTarget?: string }>; message?: string; mode?: string };
|
|
222
260
|
assert.equal(payload.mode, "single");
|
|
223
261
|
assert.equal(payload.children?.length, 1);
|
|
224
|
-
assert.equal(payload.children?.[0]?.agent, "
|
|
225
|
-
assert.match(payload.children?.[0]?.intercomTarget ?? "", /^subagent-
|
|
262
|
+
assert.equal(payload.children?.[0]?.agent, "worker");
|
|
263
|
+
assert.match(payload.children?.[0]?.intercomTarget ?? "", /^subagent-worker-[a-f0-9]+-1$/);
|
|
226
264
|
assert.match(String(payload.message ?? ""), /Intercom targets below identify child sessions used while they were running/);
|
|
227
|
-
assert.match(String(payload.message ?? ""), /Run intercom target: subagent-
|
|
265
|
+
assert.match(String(payload.message ?? ""), /Run intercom target: subagent-worker-[a-f0-9]+-1/);
|
|
228
266
|
assert.match(result.content[0]?.text ?? "", /Delivered single subagent result via intercom\./);
|
|
229
|
-
assert.doesNotMatch(result.content[0]?.text ?? "", /Full child output from
|
|
267
|
+
assert.doesNotMatch(result.content[0]?.text ?? "", /Full child output from worker/);
|
|
230
268
|
assert.equal(result.details?.results?.[0]?.finalOutput, undefined);
|
|
231
|
-
assert.match(String(payload.message ?? ""), /Full child output from
|
|
269
|
+
assert.match(String(payload.message ?? ""), /Full child output from worker/);
|
|
270
|
+
});
|
|
271
|
+
|
|
272
|
+
it("keeps child output available to workflow runs after grouped delivery", async () => {
|
|
273
|
+
mockPi.onCall({ output: "Workflow child output" });
|
|
274
|
+
const { executor, events } = makeExecutor({ resultDelivery: true });
|
|
275
|
+
|
|
276
|
+
const result = await executor.execute(
|
|
277
|
+
"workflow-intercom-output",
|
|
278
|
+
{ workflowScript: "const result = await runs.run('worker', { agent: 'worker', task: 'task' }); return result.output;", async: false },
|
|
279
|
+
new AbortController().signal,
|
|
280
|
+
undefined,
|
|
281
|
+
makeMinimalCtx(tempDir),
|
|
282
|
+
);
|
|
283
|
+
|
|
284
|
+
assert.equal(events.emitted.filter((entry) => entry.channel === "subagent:result-intercom").length, 1);
|
|
285
|
+
assert.match(result.content[0]?.text ?? "", /Workflow child output/);
|
|
286
|
+
assert.doesNotMatch(result.content[0]?.text ?? "", /Delivered single subagent result via intercom\./);
|
|
287
|
+
});
|
|
288
|
+
|
|
289
|
+
it("waits for retained workflow resume loops and returns each completed revived child", async () => {
|
|
290
|
+
mockPi.onCall({ output: "Completed retained follow-up one" });
|
|
291
|
+
mockPi.onCall({ output: "Completed retained follow-up two" });
|
|
292
|
+
const sourceRunId = `workflow-resume-source-${Date.now()}`;
|
|
293
|
+
const sourceAsyncDir = path.join(ASYNC_DIR, sourceRunId);
|
|
294
|
+
const sessionFile = path.join(tempDir, "workflow-resume-session.jsonl");
|
|
295
|
+
let revivedIds: string[] = [];
|
|
296
|
+
try {
|
|
297
|
+
fs.mkdirSync(sourceAsyncDir, { recursive: true });
|
|
298
|
+
fs.writeFileSync(sessionFile, "", "utf-8");
|
|
299
|
+
fs.writeFileSync(path.join(sourceAsyncDir, "status.json"), JSON.stringify({
|
|
300
|
+
runId: sourceRunId,
|
|
301
|
+
sessionId: "session-123",
|
|
302
|
+
mode: "single",
|
|
303
|
+
state: "complete",
|
|
304
|
+
startedAt: 100,
|
|
305
|
+
lastUpdate: 200,
|
|
306
|
+
cwd: tempDir,
|
|
307
|
+
sessionFile,
|
|
308
|
+
steps: [{ agent: "worker", status: "complete", sessionFile }],
|
|
309
|
+
}, null, 2), "utf-8");
|
|
310
|
+
writeRecoveryDescriptor(sourceAsyncDir, sourceRunId);
|
|
311
|
+
const { executor } = makeExecutor();
|
|
312
|
+
|
|
313
|
+
const result = await executor.execute(
|
|
314
|
+
"workflow-retained-resume",
|
|
315
|
+
{
|
|
316
|
+
workflowScript: `const first = await runs.run("followup-1", { resume: "${sourceRunId}", task: "Continue once" }); const second = await runs.run("followup-2", { resume: first.runId, task: "Continue twice" }); return { firstRunId: first.runId, firstOutput: first.output, runId: second.runId, output: second.output };`,
|
|
317
|
+
async: false,
|
|
318
|
+
},
|
|
319
|
+
new AbortController().signal,
|
|
320
|
+
undefined,
|
|
321
|
+
makeMinimalCtx(tempDir),
|
|
322
|
+
);
|
|
323
|
+
|
|
324
|
+
assert.equal(result.isError, undefined, result.content[0]?.text);
|
|
325
|
+
assert.match(result.content[0]?.text ?? "", /Completed retained follow-up two/);
|
|
326
|
+
assert.doesNotMatch(result.content[0]?.text ?? "", /detached and running in the background/);
|
|
327
|
+
const value = result.details?.workflow?.value as { firstRunId?: string; firstOutput?: string; runId?: string; output?: string } | undefined;
|
|
328
|
+
revivedIds = [value?.firstRunId, value?.runId].filter((id): id is string => Boolean(id));
|
|
329
|
+
assert.equal(revivedIds.length, 2);
|
|
330
|
+
assert.notEqual(revivedIds[0], sourceRunId);
|
|
331
|
+
assert.notEqual(revivedIds[1], revivedIds[0], "expected the latest revived run id from pass two");
|
|
332
|
+
assert.equal(value?.firstOutput, "Completed retained follow-up one");
|
|
333
|
+
assert.equal(value?.output, "Completed retained follow-up two");
|
|
334
|
+
assert.equal(revivedIds.every((id) => !fs.existsSync(path.join(ASYNC_DIR, id, "workflow-result.json"))), true);
|
|
335
|
+
} finally {
|
|
336
|
+
fs.rmSync(sourceAsyncDir, { recursive: true, force: true });
|
|
337
|
+
for (const id of revivedIds) fs.rmSync(path.join(ASYNC_DIR, id), { recursive: true, force: true });
|
|
338
|
+
}
|
|
232
339
|
});
|
|
233
340
|
|
|
234
341
|
it("falls back to legacy foreground output when the bridge is inactive", async () => {
|
|
@@ -237,7 +344,7 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
|
|
|
237
344
|
|
|
238
345
|
const result = await executor.execute(
|
|
239
346
|
"single-no-intercom",
|
|
240
|
-
{ agent: "
|
|
347
|
+
{ agent: "worker", task: "Summarize feature" },
|
|
241
348
|
new AbortController().signal,
|
|
242
349
|
undefined,
|
|
243
350
|
makeMinimalCtx(tempDir),
|
|
@@ -253,7 +360,7 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
|
|
|
253
360
|
|
|
254
361
|
const result = await executor.execute(
|
|
255
362
|
"single-native-delivery",
|
|
256
|
-
{ agent: "
|
|
363
|
+
{ agent: "worker", task: "Summarize feature" },
|
|
257
364
|
new AbortController().signal,
|
|
258
365
|
undefined,
|
|
259
366
|
makeMinimalCtx(tempDir),
|
|
@@ -269,7 +376,7 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
|
|
|
269
376
|
|
|
270
377
|
const result = await executor.execute(
|
|
271
378
|
"single-no-ack",
|
|
272
|
-
{ agent: "
|
|
379
|
+
{ agent: "worker", task: "Summarize feature" },
|
|
273
380
|
new AbortController().signal,
|
|
274
381
|
undefined,
|
|
275
382
|
makeMinimalCtx(tempDir),
|
|
@@ -317,7 +424,7 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
|
|
|
317
424
|
|
|
318
425
|
const result = await executor.execute(
|
|
319
426
|
"workflow-worktree-live-card",
|
|
320
|
-
{ workflowScript: "const result = await runs.run('
|
|
427
|
+
{ workflowScript: "const result = await runs.run('worker', { agent: 'worker', task: 'task', worktree: true }); return result.output;", async: false, chatProgress: "live-card" },
|
|
321
428
|
new AbortController().signal,
|
|
322
429
|
undefined,
|
|
323
430
|
makeMinimalCtx(tempDir),
|
|
@@ -349,7 +456,7 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
|
|
|
349
456
|
);
|
|
350
457
|
assert.equal(rejected, true);
|
|
351
458
|
assert.equal(result.isError, true);
|
|
352
|
-
assert.equal(state.foregroundControls.size, 1, "remaining
|
|
459
|
+
assert.equal(state.foregroundControls.size, 1, "remaining worker still owns queued scheduling");
|
|
353
460
|
await waitForCallCount(3);
|
|
354
461
|
const liveControl = [...state.foregroundControls.values()][0];
|
|
355
462
|
assert.equal(liveControl?.currentAgent, "c", "later queued child must remain discoverable after launch");
|
|
@@ -379,7 +486,7 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
|
|
|
379
486
|
);
|
|
380
487
|
assert.equal(rejected, true);
|
|
381
488
|
assert.equal(result.isError, true);
|
|
382
|
-
assert.equal(state.foregroundControls.size, 1, "remaining chain
|
|
489
|
+
assert.equal(state.foregroundControls.size, 1, "remaining chain worker still owns queued scheduling");
|
|
383
490
|
await waitForCallCount(3);
|
|
384
491
|
const liveControl = [...state.foregroundControls.values()][0];
|
|
385
492
|
assert.equal(liveControl?.currentAgent, "c", "later queued chain child must remain discoverable after launch");
|
|
@@ -391,12 +498,12 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
|
|
|
391
498
|
|
|
392
499
|
it("cleans a rejected sequential chain child and releases foreground ownership", async () => {
|
|
393
500
|
mockPi.onCall({ output: "sequential child output" });
|
|
394
|
-
const { executor, state } = makeExecutor({ bridgeMode: "off", agents: [makeAgent("
|
|
501
|
+
const { executor, state } = makeExecutor({ bridgeMode: "off", agents: [makeAgent("worker")] });
|
|
395
502
|
let rejected = false;
|
|
396
503
|
let ownedControl: { schedulingOwners?: number; activeChildren?: Map<number, unknown> } | undefined;
|
|
397
504
|
const result = await executor.execute(
|
|
398
505
|
"chain-sequential-rejection-cleanup",
|
|
399
|
-
{ chain: [{ agent: "
|
|
506
|
+
{ chain: [{ agent: "worker", task: "sequential task" }] },
|
|
400
507
|
new AbortController().signal,
|
|
401
508
|
(update: { details?: { progress?: Array<{ status?: string }> } }) => {
|
|
402
509
|
if (rejected || !update.details?.progress?.some((entry) => entry.status === "completed")) return;
|
|
@@ -415,10 +522,10 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
|
|
|
415
522
|
});
|
|
416
523
|
|
|
417
524
|
it("cleans a sequential chain child after an early tool-budget validation return", async () => {
|
|
418
|
-
const { executor, state } = makeExecutor({ bridgeMode: "off", agents: [makeAgent("
|
|
525
|
+
const { executor, state } = makeExecutor({ bridgeMode: "off", agents: [makeAgent("worker")] });
|
|
419
526
|
const execution = executor.execute(
|
|
420
527
|
"chain-sequential-budget-cleanup",
|
|
421
|
-
{ chain: [{ agent: "
|
|
528
|
+
{ chain: [{ agent: "worker", task: "invalid budget task", toolBudget: { hard: 0 } }] },
|
|
422
529
|
new AbortController().signal,
|
|
423
530
|
undefined,
|
|
424
531
|
makeMinimalCtx(tempDir),
|
|
@@ -443,11 +550,11 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
|
|
|
443
550
|
].map((entry) => JSON.stringify(entry)).join("\n") + "\n",
|
|
444
551
|
structuredOutputCapture: { ok: true },
|
|
445
552
|
});
|
|
446
|
-
const { executor, state } = makeExecutor({ bridgeMode: "off", agents: [makeAgent("
|
|
553
|
+
const { executor, state } = makeExecutor({ bridgeMode: "off", agents: [makeAgent("worker")] });
|
|
447
554
|
let structuredDir: string | undefined;
|
|
448
555
|
const result = await executor.execute(
|
|
449
556
|
"single-rejection-cleanup",
|
|
450
|
-
{ agent: "
|
|
557
|
+
{ agent: "worker", task: "structured task", artifacts: false, outputSchema: { type: "object", properties: { ok: { type: "boolean" } }, required: ["ok"] } },
|
|
451
558
|
new AbortController().signal,
|
|
452
559
|
(update: { details?: { results?: Array<{ structuredOutputPath?: string }>; progress?: Array<{ status?: string }> } }) => {
|
|
453
560
|
const outputPath = update.details?.results?.[0]?.structuredOutputPath;
|
|
@@ -541,7 +648,7 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
|
|
|
541
648
|
pid: process.pid,
|
|
542
649
|
startedAt: 100,
|
|
543
650
|
lastUpdate: Date.now(),
|
|
544
|
-
steps: [{ agent: "
|
|
651
|
+
steps: [{ agent: "worker", status: "running" }],
|
|
545
652
|
}, null, 2), "utf-8");
|
|
546
653
|
const { executor, events } = makeExecutor({
|
|
547
654
|
kill: (pid, signal) => {
|
|
@@ -583,7 +690,7 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
|
|
|
583
690
|
pid: process.pid,
|
|
584
691
|
startedAt: 100,
|
|
585
692
|
lastUpdate: Date.now(),
|
|
586
|
-
steps: [{ agent: "
|
|
693
|
+
steps: [{ agent: "worker", status: "running" }],
|
|
587
694
|
}, null, 2), "utf-8");
|
|
588
695
|
const { executor } = makeExecutor();
|
|
589
696
|
|
|
@@ -607,9 +714,9 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
|
|
|
607
714
|
it("resume action rejects explicit reviewed acceptance before launching", async () => {
|
|
608
715
|
for (const [index, params] of [
|
|
609
716
|
{ message: "Continue", acceptance: "reviewed" },
|
|
610
|
-
{ chain: [{ agent: "
|
|
717
|
+
{ chain: [{ agent: "reviewer", task: "Review {previous}", acceptance: { level: "reviewed" } }] },
|
|
611
718
|
].entries()) {
|
|
612
|
-
const { executor, events } = makeExecutor({ agents: [makeAgent("
|
|
719
|
+
const { executor, events } = makeExecutor({ agents: [makeAgent("reviewer")] });
|
|
613
720
|
const result = await executor.execute(
|
|
614
721
|
`resume-invalid-acceptance-${index}`,
|
|
615
722
|
{ action: "resume", id: "missing-source-run", ...params },
|
|
@@ -642,26 +749,26 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
|
|
|
642
749
|
startedAt: 100,
|
|
643
750
|
lastUpdate: 100,
|
|
644
751
|
cwd: tempDir,
|
|
645
|
-
steps: [{ agent: "
|
|
752
|
+
steps: [{ agent: "worker", status: "running", sessionFile: sourceSession }],
|
|
646
753
|
}, null, 2), "utf-8");
|
|
647
754
|
fs.writeFileSync(sourceResultPath, JSON.stringify({
|
|
648
755
|
id: sourceRunId,
|
|
649
756
|
sessionId: "session-123",
|
|
650
|
-
agent: "
|
|
757
|
+
agent: "worker",
|
|
651
758
|
mode: "single",
|
|
652
759
|
success: true,
|
|
653
760
|
state: "complete",
|
|
654
761
|
summary: "root output",
|
|
655
|
-
results: [{ agent: "
|
|
762
|
+
results: [{ agent: "worker", output: "root output", success: true, sessionFile: sourceSession }],
|
|
656
763
|
}, null, 2), "utf-8");
|
|
657
|
-
const { executor, events } = makeExecutor({ agents: [makeAgent("
|
|
764
|
+
const { executor, events } = makeExecutor({ agents: [makeAgent("worker"), makeAgent("reviewer")] });
|
|
658
765
|
|
|
659
766
|
const result = await executor.execute(
|
|
660
767
|
"resume-chain-root",
|
|
661
768
|
{
|
|
662
769
|
action: "resume",
|
|
663
770
|
id: sourceRunId,
|
|
664
|
-
chain: [{ agent: "
|
|
771
|
+
chain: [{ agent: "reviewer", task: "Review this root result: {previous}" }],
|
|
665
772
|
},
|
|
666
773
|
new AbortController().signal,
|
|
667
774
|
undefined,
|
|
@@ -671,11 +778,11 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
|
|
|
671
778
|
assert.equal(result.isError, undefined);
|
|
672
779
|
assert.match(result.content[0]?.text ?? "", /Attached async subagent/);
|
|
673
780
|
const startedEvent = events.emitted.find((entry) => entry.channel === SUBAGENT_ASYNC_STARTED_EVENT)?.payload as { agent?: string; agents?: string[]; chain?: string[]; chainStepCount?: number; goal?: string } | undefined;
|
|
674
|
-
assert.equal(startedEvent?.agent, "
|
|
675
|
-
assert.deepEqual(startedEvent?.agents, ["
|
|
676
|
-
assert.deepEqual(startedEvent?.chain, ["
|
|
781
|
+
assert.equal(startedEvent?.agent, "worker");
|
|
782
|
+
assert.deepEqual(startedEvent?.agents, ["worker", "reviewer"]);
|
|
783
|
+
assert.deepEqual(startedEvent?.chain, ["worker", "reviewer"]);
|
|
677
784
|
assert.equal(startedEvent?.chainStepCount, 2);
|
|
678
|
-
assert.equal(startedEvent?.goal, "
|
|
785
|
+
assert.equal(startedEvent?.goal, "[prompt redacted]");
|
|
679
786
|
const attachedId = result.details?.asyncId;
|
|
680
787
|
assert.ok(attachedId, "expected attached chain async id");
|
|
681
788
|
assert.match(result.details?.asyncDir ?? "", new RegExp(`${attachedId}$`));
|
|
@@ -684,7 +791,7 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
|
|
|
684
791
|
const attachedStatus = JSON.parse(fs.readFileSync(statusPath, "utf-8")) as { mode?: string; chainStepCount?: number; steps?: Array<{ agent?: string; label?: string; status?: string }> };
|
|
685
792
|
assert.equal(attachedStatus.mode, "chain");
|
|
686
793
|
assert.equal(attachedStatus.chainStepCount, 2);
|
|
687
|
-
assert.deepEqual(attachedStatus.steps?.map((step) => step.agent), ["
|
|
794
|
+
assert.deepEqual(attachedStatus.steps?.map((step) => step.agent), ["worker", "reviewer"]);
|
|
688
795
|
assert.match(attachedStatus.steps?.[0]?.label ?? "", /Attached resume-chain-root-/);
|
|
689
796
|
await waitForFile(path.join(RESULTS_DIR, `${attachedId}.json`));
|
|
690
797
|
} finally {
|
|
@@ -708,19 +815,19 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
|
|
|
708
815
|
startedAt: 100,
|
|
709
816
|
lastUpdate: 200,
|
|
710
817
|
cwd: tempDir,
|
|
711
|
-
steps: [{ agent: "
|
|
818
|
+
steps: [{ agent: "worker", status: "complete" }],
|
|
712
819
|
}, null, 2), "utf-8");
|
|
713
820
|
fs.writeFileSync(sourceResultPath, JSON.stringify({
|
|
714
821
|
id: sourceRunId,
|
|
715
822
|
sessionId: "session-123",
|
|
716
|
-
agent: "
|
|
823
|
+
agent: "worker",
|
|
717
824
|
mode: "single",
|
|
718
825
|
success: true,
|
|
719
826
|
state: "complete",
|
|
720
827
|
summary: "completed root output",
|
|
721
|
-
results: [{ agent: "
|
|
828
|
+
results: [{ agent: "worker", output: "completed root output", success: true }],
|
|
722
829
|
}, null, 2), "utf-8");
|
|
723
|
-
const { executor } = makeExecutor({ agents: [makeAgent("
|
|
830
|
+
const { executor } = makeExecutor({ agents: [makeAgent("worker"), makeAgent("reviewer")] });
|
|
724
831
|
|
|
725
832
|
const reviveOnly = await executor.execute(
|
|
726
833
|
"resume-chain-complete-root-revive-only",
|
|
@@ -737,7 +844,7 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
|
|
|
737
844
|
{
|
|
738
845
|
action: "resume",
|
|
739
846
|
id: sourceRunId,
|
|
740
|
-
chain: [{ agent: "
|
|
847
|
+
chain: [{ agent: "reviewer", task: "Review this completed root result: {previous}" }],
|
|
741
848
|
},
|
|
742
849
|
new AbortController().signal,
|
|
743
850
|
undefined,
|
|
@@ -777,6 +884,7 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
|
|
|
777
884
|
{ agent: "b", status: "complete", sessionFile: secondSession, model: "anthropic/claude-sonnet-4", thinking: "high" },
|
|
778
885
|
],
|
|
779
886
|
}, null, 2), "utf-8");
|
|
887
|
+
writeRecoveryDescriptor(asyncDir, runId, "b", { model: "anthropic/claude-sonnet-4:high" });
|
|
780
888
|
const { executor } = makeExecutor({ agents: [makeAgent("a"), makeAgent("b")] });
|
|
781
889
|
|
|
782
890
|
const result = await executor.execute(
|
|
@@ -816,8 +924,9 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
|
|
|
816
924
|
lastUpdate: 200,
|
|
817
925
|
cwd: tempDir,
|
|
818
926
|
sessionFile,
|
|
819
|
-
steps: [{ agent: "
|
|
927
|
+
steps: [{ agent: "worker", status: "complete", launchContractDigest: "source-launch-contract-digest" }],
|
|
820
928
|
}, null, 2), "utf-8");
|
|
929
|
+
writeRecoveryDescriptor(asyncDir, runId, "worker", { launchContractDigest: "source-launch-contract-digest" });
|
|
821
930
|
const { executor, events } = makeExecutor();
|
|
822
931
|
|
|
823
932
|
const result = await executor.execute(
|
|
@@ -838,7 +947,7 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
|
|
|
838
947
|
assert.ok(revivedId, "expected revived async id");
|
|
839
948
|
assert.equal(result.details?.sourceLaunchContractDigest, "source-launch-contract-digest");
|
|
840
949
|
const startedEvent = events.emitted.find((entry) => entry.channel === SUBAGENT_ASYNC_STARTED_EVENT && (entry.payload as { id?: string }).id === revivedId)?.payload as { goal?: string } | undefined;
|
|
841
|
-
assert.equal(startedEvent?.goal, "
|
|
950
|
+
assert.equal(startedEvent?.goal, "[prompt redacted]");
|
|
842
951
|
const resultPath = path.join(RESULTS_DIR, `${revivedId}.json`);
|
|
843
952
|
const deadline = Date.now() + 10_000;
|
|
844
953
|
while (!fs.existsSync(resultPath)) {
|
|
@@ -861,23 +970,14 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
|
|
|
861
970
|
fs.writeFileSync(sessionFile, "", "utf-8");
|
|
862
971
|
fs.writeFileSync(path.join(asyncDir, "status.json"), JSON.stringify({
|
|
863
972
|
runId, sessionId: "session-123", mode: "single", state: "paused", startedAt: 100, lastUpdate: 200, cwd: tempDir,
|
|
864
|
-
steps: [{ agent: "removed-
|
|
973
|
+
steps: [{ agent: "removed-worker", status: "paused", sessionFile }],
|
|
865
974
|
}, null, 2), "utf-8");
|
|
866
|
-
|
|
867
|
-
version: 1,
|
|
868
|
-
sourceRunId: runId,
|
|
869
|
-
agent: "removed-builder",
|
|
870
|
-
cwd: tempDir,
|
|
975
|
+
writeRecoveryDescriptor(asyncDir, runId, "removed-worker", {
|
|
871
976
|
model: "anthropic/claude-sonnet-4:high",
|
|
872
977
|
tools: ["read"],
|
|
873
978
|
systemPrompt: "Original persisted prompt",
|
|
874
|
-
systemPromptMode: "replace",
|
|
875
|
-
inheritProjectContext: false,
|
|
876
|
-
inheritSkills: false,
|
|
877
|
-
outputMode: "inline",
|
|
878
979
|
maxSubagentDepth: 1,
|
|
879
|
-
|
|
880
|
-
}, null, 2), "utf-8");
|
|
980
|
+
});
|
|
881
981
|
const { executor } = makeExecutor({ agents: [] });
|
|
882
982
|
|
|
883
983
|
const result = await executor.execute(
|
|
@@ -921,8 +1021,9 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
|
|
|
921
1021
|
lastUpdate: 200,
|
|
922
1022
|
cwd: tempDir,
|
|
923
1023
|
sessionFile,
|
|
924
|
-
steps: [{ agent: "
|
|
1024
|
+
steps: [{ agent: "worker", status: "complete" }],
|
|
925
1025
|
}, null, 2), "utf-8");
|
|
1026
|
+
writeRecoveryDescriptor(sourceAsyncDir, sourceRunId);
|
|
926
1027
|
try {
|
|
927
1028
|
const { executor } = makeExecutor();
|
|
928
1029
|
const first = await executor.execute(
|
|
@@ -967,6 +1068,170 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
|
|
|
967
1068
|
}
|
|
968
1069
|
});
|
|
969
1070
|
|
|
1071
|
+
it("marks a resumed workflow child async when its runner starts and fails before proceed", async () => {
|
|
1072
|
+
const parentSessionId = `session-workflow-resume-start-${Date.now()}`;
|
|
1073
|
+
const sourceRunId = `workflow-resume-start-source-${Date.now()}`;
|
|
1074
|
+
const sourceAsyncDir = path.join(ASYNC_DIR, sourceRunId);
|
|
1075
|
+
const sessionFile = path.join(tempDir, "workflow-resume-start-session.jsonl");
|
|
1076
|
+
let workflowRunId: string | undefined;
|
|
1077
|
+
let revivedRunId: string | undefined;
|
|
1078
|
+
try {
|
|
1079
|
+
fs.mkdirSync(sourceAsyncDir, { recursive: true });
|
|
1080
|
+
fs.writeFileSync(sessionFile, "", "utf-8");
|
|
1081
|
+
fs.writeFileSync(path.join(sourceAsyncDir, "status.json"), JSON.stringify({
|
|
1082
|
+
runId: sourceRunId,
|
|
1083
|
+
sessionId: parentSessionId,
|
|
1084
|
+
mode: "single",
|
|
1085
|
+
state: "complete",
|
|
1086
|
+
startedAt: 100,
|
|
1087
|
+
lastUpdate: 200,
|
|
1088
|
+
cwd: tempDir,
|
|
1089
|
+
sessionFile,
|
|
1090
|
+
steps: [{ agent: "worker", status: "complete", sessionFile }],
|
|
1091
|
+
}, null, 2), "utf-8");
|
|
1092
|
+
writeRecoveryDescriptor(sourceAsyncDir, sourceRunId);
|
|
1093
|
+
const competingLease = acquireSessionLease({ sessionFile, runId: "workflow-competing-revival", sourceRunId, parentSessionId });
|
|
1094
|
+
const { executor } = makeExecutor({ maxActiveAsyncRunsPerSession: 1 });
|
|
1095
|
+
const ctx = makeMinimalCtx(tempDir);
|
|
1096
|
+
ctx.sessionManager.getSessionId = () => parentSessionId;
|
|
1097
|
+
try {
|
|
1098
|
+
const failed = await executor.execute(
|
|
1099
|
+
"workflow-resume-start-failure",
|
|
1100
|
+
{ workflowScript: `return await runs.run("resume-child", { resume: "${sourceRunId}", task: "Continue" });`, async: true },
|
|
1101
|
+
new AbortController().signal,
|
|
1102
|
+
undefined,
|
|
1103
|
+
ctx,
|
|
1104
|
+
);
|
|
1105
|
+
workflowRunId = failed.details?.asyncId;
|
|
1106
|
+
assert.ok(workflowRunId, "expected async workflow id");
|
|
1107
|
+
await waitForFile(path.join(RESULTS_DIR, `${workflowRunId}.json`));
|
|
1108
|
+
const workflowStatusPath = path.join(ASYNC_DIR, workflowRunId, "status.json");
|
|
1109
|
+
const workflowStatus = await waitForStatus(workflowStatusPath, (value) => value?.state === "failed") as { steps?: Array<{ async?: boolean; runId?: string }>; error?: string };
|
|
1110
|
+
revivedRunId = workflowStatus.steps?.[0]?.runId;
|
|
1111
|
+
|
|
1112
|
+
assert.equal(workflowStatus.steps?.[0]?.async, true);
|
|
1113
|
+
assert.ok(revivedRunId, "expected the workflow step to keep revived run identity");
|
|
1114
|
+
assert.match(workflowStatus.error ?? "", /already owned by run 'workflow-competing-revival'/);
|
|
1115
|
+
assert.deepEqual(getActiveAsyncCapacitySnapshot(parentSessionId, 1), { used: 0, limit: 1 });
|
|
1116
|
+
} finally {
|
|
1117
|
+
competingLease.release();
|
|
1118
|
+
}
|
|
1119
|
+
} finally {
|
|
1120
|
+
fs.rmSync(sourceAsyncDir, { recursive: true, force: true });
|
|
1121
|
+
if (workflowRunId) fs.rmSync(path.join(ASYNC_DIR, workflowRunId), { recursive: true, force: true });
|
|
1122
|
+
if (revivedRunId) fs.rmSync(path.join(ASYNC_DIR, revivedRunId), { recursive: true, force: true });
|
|
1123
|
+
fs.rmSync(path.join(ACTIVE_ASYNC_CAPACITY_DIR, activeAsyncCapacitySessionKey(parentSessionId)), { recursive: true, force: true });
|
|
1124
|
+
}
|
|
1125
|
+
});
|
|
1126
|
+
|
|
1127
|
+
it("releases async workflow capacity after child launch preparation fails", async () => {
|
|
1128
|
+
const parentSessionId = `session-workflow-prep-${Date.now()}`;
|
|
1129
|
+
try {
|
|
1130
|
+
const { executor } = makeExecutor({ maxActiveAsyncRunsPerSession: 1 });
|
|
1131
|
+
const ctx = makeMinimalCtx(tempDir);
|
|
1132
|
+
ctx.sessionManager.getSessionId = () => parentSessionId;
|
|
1133
|
+
const failed = await executor.execute(
|
|
1134
|
+
"workflow-prep-capacity-release",
|
|
1135
|
+
{
|
|
1136
|
+
workflowScript: `return await runs.run("gated", { agent: "worker", task: "run", gate: "npm test" });`,
|
|
1137
|
+
async: true,
|
|
1138
|
+
acceptance: false,
|
|
1139
|
+
},
|
|
1140
|
+
new AbortController().signal,
|
|
1141
|
+
undefined,
|
|
1142
|
+
ctx,
|
|
1143
|
+
);
|
|
1144
|
+
const workflowRunId = failed.details?.asyncId;
|
|
1145
|
+
assert.ok(workflowRunId, "expected async workflow id");
|
|
1146
|
+
await waitForFile(path.join(RESULTS_DIR, `${workflowRunId}.json`));
|
|
1147
|
+
const statusPath = path.join(ASYNC_DIR, workflowRunId, "status.json");
|
|
1148
|
+
const status = await waitForStatus(statusPath, (value) => value?.state === "failed") as { state?: string; steps?: Array<{ async?: boolean }>; error?: string };
|
|
1149
|
+
|
|
1150
|
+
assert.equal(status.state, "failed");
|
|
1151
|
+
assert.equal(status.steps?.[0]?.async, false);
|
|
1152
|
+
assert.match(status.error ?? "", /gate cannot be combined with acceptance/);
|
|
1153
|
+
assert.deepEqual(getActiveAsyncCapacitySnapshot(parentSessionId, 1), { used: 0, limit: 1 });
|
|
1154
|
+
|
|
1155
|
+
const next = await executor.execute(
|
|
1156
|
+
"workflow-prep-capacity-next",
|
|
1157
|
+
{ workflowScript: `return "ok";`, async: true },
|
|
1158
|
+
new AbortController().signal,
|
|
1159
|
+
undefined,
|
|
1160
|
+
ctx,
|
|
1161
|
+
);
|
|
1162
|
+
assert.equal(next.isError, undefined);
|
|
1163
|
+
const nextWorkflowRunId = next.details?.asyncId;
|
|
1164
|
+
assert.ok(nextWorkflowRunId, "expected the next async workflow to acquire capacity");
|
|
1165
|
+
await waitForFile(path.join(RESULTS_DIR, `${nextWorkflowRunId}.json`));
|
|
1166
|
+
} finally {
|
|
1167
|
+
fs.rmSync(path.join(ACTIVE_ASYNC_CAPACITY_DIR, activeAsyncCapacitySessionKey(parentSessionId)), { recursive: true, force: true });
|
|
1168
|
+
}
|
|
1169
|
+
});
|
|
1170
|
+
|
|
1171
|
+
it("restores active capacity when revival fails before startup proceed", async () => {
|
|
1172
|
+
const parentSessionId = `session-resume-handshake-${Date.now()}`;
|
|
1173
|
+
const sourceRunId = `resume-handshake-source-${Date.now()}`;
|
|
1174
|
+
const sourceAsyncDir = path.join(ASYNC_DIR, sourceRunId);
|
|
1175
|
+
const sessionFile = path.join(tempDir, "resume-handshake-child.jsonl");
|
|
1176
|
+
fs.mkdirSync(sourceAsyncDir, { recursive: true });
|
|
1177
|
+
fs.writeFileSync(sessionFile, "", "utf-8");
|
|
1178
|
+
fs.writeFileSync(path.join(sourceAsyncDir, "status.json"), JSON.stringify({
|
|
1179
|
+
runId: sourceRunId,
|
|
1180
|
+
sessionId: parentSessionId,
|
|
1181
|
+
mode: "single",
|
|
1182
|
+
state: "complete",
|
|
1183
|
+
startedAt: 100,
|
|
1184
|
+
lastUpdate: 200,
|
|
1185
|
+
cwd: tempDir,
|
|
1186
|
+
sessionFile,
|
|
1187
|
+
steps: [{ agent: "worker", status: "complete", sessionFile }],
|
|
1188
|
+
}, null, 2), "utf-8");
|
|
1189
|
+
writeRecoveryDescriptor(sourceAsyncDir, sourceRunId);
|
|
1190
|
+
const sourceCapacity = acquireActiveAsyncCapacity({ sessionId: parentSessionId, limit: 1, runId: sourceRunId, kind: "runner", asyncDir: sourceAsyncDir });
|
|
1191
|
+
assert.ok(sourceCapacity);
|
|
1192
|
+
sourceCapacity.markStarted("source-runner");
|
|
1193
|
+
fs.writeFileSync(path.join(sourceAsyncDir, "process-terminal.json"), JSON.stringify({
|
|
1194
|
+
version: 1,
|
|
1195
|
+
state: "observed",
|
|
1196
|
+
runId: sourceRunId,
|
|
1197
|
+
runnerProcessInstanceId: "source-runner",
|
|
1198
|
+
observedAt: Date.now(),
|
|
1199
|
+
instances: [{ kind: "runner", processInstanceId: "source-runner", closeObservedAt: Date.now(), exitCode: 0, signal: null }],
|
|
1200
|
+
}), "utf-8");
|
|
1201
|
+
const competingLease = acquireSessionLease({ sessionFile, runId: "competing-revival", sourceRunId, parentSessionId });
|
|
1202
|
+
try {
|
|
1203
|
+
const { executor } = makeExecutor({ maxActiveAsyncRunsPerSession: 1 });
|
|
1204
|
+
const ctx = makeMinimalCtx(tempDir);
|
|
1205
|
+
ctx.sessionManager.getSessionId = () => parentSessionId;
|
|
1206
|
+
const failed = await executor.execute(
|
|
1207
|
+
"resume-handshake-failure",
|
|
1208
|
+
{ action: "resume", id: sourceRunId, message: "Retry safely" },
|
|
1209
|
+
new AbortController().signal,
|
|
1210
|
+
undefined,
|
|
1211
|
+
ctx,
|
|
1212
|
+
);
|
|
1213
|
+
assert.equal(failed.isError, true);
|
|
1214
|
+
assert.match(failed.content[0]?.text ?? "", /already owned by run 'competing-revival'/);
|
|
1215
|
+
const revivedStatusDirs = fs.readdirSync(ASYNC_DIR)
|
|
1216
|
+
.map((name) => path.join(ASYNC_DIR, name))
|
|
1217
|
+
.filter((dir) => {
|
|
1218
|
+
try {
|
|
1219
|
+
const status = JSON.parse(fs.readFileSync(path.join(dir, "status.json"), "utf-8"));
|
|
1220
|
+
return status.sessionId === parentSessionId && status.runId !== sourceRunId && status.processTerminal?.runnerProcessInstanceId;
|
|
1221
|
+
} catch {
|
|
1222
|
+
return false;
|
|
1223
|
+
}
|
|
1224
|
+
});
|
|
1225
|
+
assert.equal(revivedStatusDirs.length, 1, "expected one failed revived run with runner identity");
|
|
1226
|
+
fs.rmSync(path.join(revivedStatusDirs[0]!, "process-terminal.json"), { force: true });
|
|
1227
|
+
assert.deepEqual(getActiveAsyncCapacitySnapshot(parentSessionId, 1), { used: 0, limit: 1 });
|
|
1228
|
+
} finally {
|
|
1229
|
+
competingLease.release();
|
|
1230
|
+
getActiveAsyncCapacitySnapshot(parentSessionId, 1);
|
|
1231
|
+
fs.rmSync(sourceAsyncDir, { recursive: true, force: true });
|
|
1232
|
+
}
|
|
1233
|
+
});
|
|
1234
|
+
|
|
970
1235
|
it("resume action revives a completed foreground child by index", async () => {
|
|
971
1236
|
mockPi.onCall({ output: "first child done" });
|
|
972
1237
|
mockPi.onCall({ output: "second child done" });
|
|
@@ -1031,7 +1296,7 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
|
|
|
1031
1296
|
try {
|
|
1032
1297
|
const original = await executor.execute(
|
|
1033
1298
|
"foreground-lease-original",
|
|
1034
|
-
{ agent: "
|
|
1299
|
+
{ agent: "worker", task: "Original task" },
|
|
1035
1300
|
new AbortController().signal,
|
|
1036
1301
|
undefined,
|
|
1037
1302
|
makeMinimalCtx(tempDir),
|
|
@@ -1746,11 +2011,11 @@ describe("intercom result delivery cutover", { skip: !available ? "executor not
|
|
|
1746
2011
|
|
|
1747
2012
|
it("does not treat a synthetic foreground startup error as child output", async () => {
|
|
1748
2013
|
mockPi.onCall({ output: "", stderr: "mock startup failure", exitCode: 1 });
|
|
1749
|
-
const { executor, events } = makeExecutor({ resultDelivery: true, agents: [makeAgent("
|
|
2014
|
+
const { executor, events } = makeExecutor({ resultDelivery: true, agents: [makeAgent("worker")] });
|
|
1750
2015
|
|
|
1751
2016
|
await executor.execute(
|
|
1752
2017
|
"foreground-synthetic-error",
|
|
1753
|
-
{ agent: "
|
|
2018
|
+
{ agent: "worker", task: "synthetic-error-task" },
|
|
1754
2019
|
new AbortController().signal,
|
|
1755
2020
|
undefined,
|
|
1756
2021
|
makeMinimalCtx(tempDir),
|