@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
|
@@ -221,12 +221,12 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
221
221
|
it("pauses foreground chains at approval checkpoints without launching the next child", async () => {
|
|
222
222
|
mockPi.onCall({ output: "analysis done" });
|
|
223
223
|
mockPi.onCall({ output: "should not run" });
|
|
224
|
-
const agents = [makeAgent("analyst"), makeAgent("
|
|
224
|
+
const agents = [makeAgent("analyst"), makeAgent("worker")];
|
|
225
225
|
|
|
226
226
|
const result = await executeChain!(makeChainParams([
|
|
227
227
|
{ agent: "analyst", task: "Analyze" },
|
|
228
228
|
{ checkpoint: "review", message: "Approve implementation?" },
|
|
229
|
-
{ agent: "
|
|
229
|
+
{ agent: "worker", task: "Implement" },
|
|
230
230
|
], agents));
|
|
231
231
|
|
|
232
232
|
assert.equal(result.isError, undefined);
|
|
@@ -241,10 +241,10 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
241
241
|
|
|
242
242
|
it("applies global permissions to foreground chain children", async () => {
|
|
243
243
|
mockPi.onCall({ echoEnv: [PERMISSION_POLICY_ENV, PERMISSION_AUDIT_PATH_ENV] });
|
|
244
|
-
const agents = [makeAgent("
|
|
244
|
+
const agents = [makeAgent("worker")];
|
|
245
245
|
|
|
246
246
|
const result = await executeChain!(makeChainParams(
|
|
247
|
-
[{ agent: "
|
|
247
|
+
[{ agent: "worker", task: "Work" }],
|
|
248
248
|
agents,
|
|
249
249
|
{ permissions: { rules: { write: "ask" } } },
|
|
250
250
|
));
|
|
@@ -410,11 +410,11 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
410
410
|
"```",
|
|
411
411
|
].join("\n"),
|
|
412
412
|
});
|
|
413
|
-
const agents = [makeAgent("
|
|
413
|
+
const agents = [makeAgent("worker", { completionGuard: false })];
|
|
414
414
|
|
|
415
415
|
const result = await executeChain(
|
|
416
416
|
makeChainParams(
|
|
417
|
-
[{ agent: "
|
|
417
|
+
[{ agent: "worker", task: "Implement fix", output: "accepted.md", outputMode: "file-only", acceptance: { level: "checked", criteria: ["Patch bug"] } }],
|
|
418
418
|
agents,
|
|
419
419
|
{ chainDir: tempDir },
|
|
420
420
|
),
|
|
@@ -442,7 +442,7 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
442
442
|
|
|
443
443
|
const failed = await executeChain(
|
|
444
444
|
makeChainParams(
|
|
445
|
-
[{ agent: "
|
|
445
|
+
[{ agent: "worker", task: "Implement fix", acceptance: { level: "checked" } }],
|
|
446
446
|
agents,
|
|
447
447
|
),
|
|
448
448
|
);
|
|
@@ -467,11 +467,11 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
467
467
|
"```",
|
|
468
468
|
].join("\n");
|
|
469
469
|
mockPi.onCall({ output: acceptanceReport });
|
|
470
|
-
const agents = [makeAgent("
|
|
470
|
+
const agents = [makeAgent("worker", { completionGuard: false })];
|
|
471
471
|
|
|
472
472
|
const result = await executeChain(
|
|
473
473
|
makeChainParams(
|
|
474
|
-
[{ agent: "
|
|
474
|
+
[{ agent: "worker", task: "Implement fix", acceptance: { level: "verified", verify: [{ id: "runtime-pass", command: "node -e \"process.exit(0)\"" }] } }],
|
|
475
475
|
agents,
|
|
476
476
|
),
|
|
477
477
|
);
|
|
@@ -482,7 +482,7 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
482
482
|
mockPi.onCall({ output: acceptanceReport });
|
|
483
483
|
const failed = await executeChain(
|
|
484
484
|
makeChainParams(
|
|
485
|
-
[{ agent: "
|
|
485
|
+
[{ agent: "worker", task: "Implement fix", acceptance: { level: "verified", verify: [{ id: "runtime-fail", command: "node -e \"process.exit(5)\"" }] } }],
|
|
486
486
|
agents,
|
|
487
487
|
),
|
|
488
488
|
);
|
|
@@ -560,8 +560,8 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
560
560
|
|
|
561
561
|
const result = await executeChain(
|
|
562
562
|
makeChainParams(
|
|
563
|
-
[{ agent: "
|
|
564
|
-
[makeAgent("
|
|
563
|
+
[{ agent: "worker", task: "Do work" }],
|
|
564
|
+
[makeAgent("worker")],
|
|
565
565
|
{
|
|
566
566
|
ctx: {
|
|
567
567
|
...makeMinimalCtx(tempDir),
|
|
@@ -582,8 +582,8 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
582
582
|
|
|
583
583
|
const result = await executeChain(
|
|
584
584
|
makeChainParams(
|
|
585
|
-
[{ agent: "
|
|
586
|
-
[makeAgent("
|
|
585
|
+
[{ agent: "worker", task: "Do work", model: "inherit" }],
|
|
586
|
+
[makeAgent("worker")],
|
|
587
587
|
{
|
|
588
588
|
ctx: {
|
|
589
589
|
...makeMinimalCtx(tempDir),
|
|
@@ -601,11 +601,11 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
601
601
|
|
|
602
602
|
it("suppresses progress for {task} chain templates when the top-level task is review-only", async () => {
|
|
603
603
|
mockPi.onCall({ output: "Review done" });
|
|
604
|
-
const agents = [makeAgent("
|
|
604
|
+
const agents = [makeAgent("reviewer", { defaultProgress: true })];
|
|
605
605
|
|
|
606
606
|
await executeChain(
|
|
607
607
|
makeChainParams(
|
|
608
|
-
[{ agent: "
|
|
608
|
+
[{ agent: "reviewer" }],
|
|
609
609
|
agents,
|
|
610
610
|
{ task: "Review-only. Do not edit files. Return findings." },
|
|
611
611
|
),
|
|
@@ -616,15 +616,36 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
616
616
|
assert.equal(fs.existsSync(path.join(tempDir, "progress.md")), false);
|
|
617
617
|
});
|
|
618
618
|
|
|
619
|
+
it("foreground chains resolve explicit reads inside the chain directory", async () => {
|
|
620
|
+
mockPi.onCall({ output: "Review done" });
|
|
621
|
+
const chainDir = path.join(tempDir, "chain-reads");
|
|
622
|
+
const runId = "chain-reads-run";
|
|
623
|
+
const runDir = path.join(chainDir, runId);
|
|
624
|
+
fs.mkdirSync(runDir, { recursive: true });
|
|
625
|
+
fs.writeFileSync(path.join(runDir, "plan.md"), "chain plan");
|
|
626
|
+
fs.writeFileSync(path.join(runDir, "progress.md"), "chain progress");
|
|
627
|
+
|
|
628
|
+
await executeChain!(makeChainParams(
|
|
629
|
+
[{ agent: "reviewer", task: "Review the chain artifacts.", reads: ["plan.md", "progress.md"] }],
|
|
630
|
+
[makeAgent("reviewer")],
|
|
631
|
+
{ chainDir, runId },
|
|
632
|
+
));
|
|
633
|
+
|
|
634
|
+
const taskArg = readCallArgs(0).at(-1) ?? "";
|
|
635
|
+
assert.ok(taskArg.includes("[Read from: "));
|
|
636
|
+
assert.ok(taskArg.includes(path.join(runDir, "plan.md")));
|
|
637
|
+
assert.ok(taskArg.includes(path.join(runDir, "progress.md")));
|
|
638
|
+
});
|
|
639
|
+
|
|
619
640
|
it("foreground chains still resolve defaultProgress inside the chain directory", async () => {
|
|
620
641
|
mockPi.onCall({ output: "Progress done" });
|
|
621
|
-
const agents = [makeAgent("
|
|
642
|
+
const agents = [makeAgent("reviewer", { defaultProgress: true })];
|
|
622
643
|
const chainDir = path.join(tempDir, "chain-progress");
|
|
623
644
|
const runId = "chain-progress-run";
|
|
624
645
|
|
|
625
646
|
await executeChain(
|
|
626
647
|
makeChainParams(
|
|
627
|
-
[{ agent: "
|
|
648
|
+
[{ agent: "reviewer", task: "Track chain work" }],
|
|
628
649
|
agents,
|
|
629
650
|
{ chainDir, runId },
|
|
630
651
|
),
|
|
@@ -681,16 +702,16 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
681
702
|
mockPi.onCall({ output: "review-a", structuredOutput: { ok: "a" } });
|
|
682
703
|
mockPi.onCall({ output: "review-b", structuredOutput: { ok: "b" } });
|
|
683
704
|
mockPi.onCall({ output: "synthesized" });
|
|
684
|
-
const agents = [makeAgent("
|
|
705
|
+
const agents = [makeAgent("scout"), makeAgent("reviewer"), makeAgent("writer")];
|
|
685
706
|
|
|
686
707
|
const result = await executeChain(
|
|
687
708
|
makeChainParams(
|
|
688
709
|
[
|
|
689
|
-
{ agent: "
|
|
710
|
+
{ agent: "scout", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
|
|
690
711
|
{
|
|
691
712
|
expand: { from: { output: "targets", path: "/items" }, item: "target", key: "/path", maxItems: 4 },
|
|
692
713
|
parallel: {
|
|
693
|
-
agent: "
|
|
714
|
+
agent: "reviewer",
|
|
694
715
|
task: "Review {target.path}",
|
|
695
716
|
label: "Review {target.path}",
|
|
696
717
|
outputSchema: { type: "object" },
|
|
@@ -724,14 +745,14 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
724
745
|
});
|
|
725
746
|
mockPi.onCall({ echoEnv: [PERMISSION_POLICY_ENV, PERMISSION_AUDIT_PATH_ENV], structuredOutput: { ok: "a" } });
|
|
726
747
|
mockPi.onCall({ echoEnv: [PERMISSION_POLICY_ENV, PERMISSION_AUDIT_PATH_ENV], structuredOutput: { ok: "b" } });
|
|
727
|
-
const agents = [makeAgent("
|
|
748
|
+
const agents = [makeAgent("scout"), makeAgent("reviewer")];
|
|
728
749
|
|
|
729
750
|
const result = await executeChain!(makeChainParams(
|
|
730
751
|
[
|
|
731
|
-
{ agent: "
|
|
752
|
+
{ agent: "scout", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
|
|
732
753
|
{
|
|
733
754
|
expand: { from: { output: "targets", path: "/items" }, key: "/path", maxItems: 4 },
|
|
734
|
-
parallel: { agent: "
|
|
755
|
+
parallel: { agent: "reviewer", task: "Review {item.path}", outputSchema: { type: "object" } },
|
|
735
756
|
collect: { as: "reviews" },
|
|
736
757
|
concurrency: 1,
|
|
737
758
|
},
|
|
@@ -741,7 +762,7 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
741
762
|
));
|
|
742
763
|
|
|
743
764
|
assert.equal(result.isError, undefined);
|
|
744
|
-
const reviewerResults = result.details.results.filter((entry) => entry.agent === "
|
|
765
|
+
const reviewerResults = result.details.results.filter((entry) => entry.agent === "reviewer");
|
|
745
766
|
assert.equal(reviewerResults.length, 2);
|
|
746
767
|
for (const child of reviewerResults) {
|
|
747
768
|
const env = JSON.parse(child.finalOutput ?? "{}") as Record<string, string | null>;
|
|
@@ -757,15 +778,15 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
757
778
|
});
|
|
758
779
|
mockPi.onCall({ output: acceptanceReport({ changedFiles: ["src/a.ts"] }), structuredOutput: { ok: "a" } });
|
|
759
780
|
mockPi.onCall({ output: acceptanceReport({ changedFiles: ["src/b.ts"] }), structuredOutput: { ok: "b" } });
|
|
760
|
-
const agents = [makeAgent("
|
|
781
|
+
const agents = [makeAgent("scout"), makeAgent("reviewer", { completionGuard: false })];
|
|
761
782
|
|
|
762
783
|
const result = await executeChain(
|
|
763
784
|
makeChainParams(
|
|
764
785
|
[
|
|
765
|
-
{ agent: "
|
|
786
|
+
{ agent: "scout", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
|
|
766
787
|
{
|
|
767
788
|
expand: { from: { output: "targets", path: "/items" }, key: "/path", maxItems: 4 },
|
|
768
|
-
parallel: { agent: "
|
|
789
|
+
parallel: { agent: "reviewer", task: "Review {item.path}", outputSchema: { type: "object" }, acceptance: { level: "checked" } },
|
|
769
790
|
collect: { as: "reviews" },
|
|
770
791
|
acceptance: { level: "checked" },
|
|
771
792
|
concurrency: 1,
|
|
@@ -779,7 +800,7 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
779
800
|
const dynamicNode = result.details.workflowGraph?.nodes[1];
|
|
780
801
|
assert.equal(dynamicNode?.acceptanceStatus, "review-required");
|
|
781
802
|
assert.deepEqual(dynamicNode?.children?.map((child) => child.acceptanceStatus), ["checked", "checked"]);
|
|
782
|
-
assert.deepEqual(result.details.results.filter((child) => child.agent === "
|
|
803
|
+
assert.deepEqual(result.details.results.filter((child) => child.agent === "reviewer").map((child) => child.acceptance?.evidenceStatus), ["checked", "checked"]);
|
|
783
804
|
});
|
|
784
805
|
|
|
785
806
|
it("applies read-only acceptance roles to dynamic children and their aggregate group", async () => {
|
|
@@ -796,15 +817,15 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
796
817
|
});
|
|
797
818
|
mockPi.onCall({ output: readOnlyReport, structuredOutput: { ok: "a" } });
|
|
798
819
|
mockPi.onCall({ output: readOnlyReport, structuredOutput: { ok: "b" } });
|
|
799
|
-
const agents = [makeAgent("
|
|
820
|
+
const agents = [makeAgent("scout"), makeAgent("explorer", { acceptanceRole: "read-only" })];
|
|
800
821
|
|
|
801
822
|
const result = await executeChain(
|
|
802
823
|
makeChainParams(
|
|
803
824
|
[
|
|
804
|
-
{ agent: "
|
|
825
|
+
{ agent: "scout", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
|
|
805
826
|
{
|
|
806
827
|
expand: { from: { output: "targets", path: "/items" }, key: "/path", maxItems: 4 },
|
|
807
|
-
parallel: { agent: "
|
|
828
|
+
parallel: { agent: "explorer", task: "Explore {item.path}", outputSchema: { type: "object" } },
|
|
808
829
|
collect: { as: "reviews" },
|
|
809
830
|
concurrency: 1,
|
|
810
831
|
},
|
|
@@ -814,7 +835,7 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
814
835
|
);
|
|
815
836
|
|
|
816
837
|
assert.ok(!result.isError, `chain should succeed: ${JSON.stringify(result.content)}`);
|
|
817
|
-
const explorerResults = result.details.results.filter((child) => child.agent === "
|
|
838
|
+
const explorerResults = result.details.results.filter((child) => child.agent === "explorer");
|
|
818
839
|
assert.deepEqual(explorerResults.map((child) => child.acceptance?.effectiveAcceptance.level), ["attested", "attested"]);
|
|
819
840
|
const dynamicNode = result.details.workflowGraph?.nodes[1];
|
|
820
841
|
assert.equal(dynamicNode?.acceptanceStatus, "attested");
|
|
@@ -828,15 +849,15 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
828
849
|
});
|
|
829
850
|
mockPi.onCall({ output: acceptanceReport({ changedFiles: ["src/a.ts"] }), structuredOutput: { ok: "a" } });
|
|
830
851
|
mockPi.onCall({ output: acceptanceReport({ changedFiles: ["src/b.ts"] }), structuredOutput: { ok: "b" } });
|
|
831
|
-
const agents = [makeAgent("
|
|
852
|
+
const agents = [makeAgent("scout"), makeAgent("explorer", { acceptanceRole: "read-only" })];
|
|
832
853
|
|
|
833
854
|
const result = await executeChain(
|
|
834
855
|
makeChainParams(
|
|
835
856
|
[
|
|
836
|
-
{ agent: "
|
|
857
|
+
{ agent: "scout", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
|
|
837
858
|
{
|
|
838
859
|
expand: { from: { output: "targets", path: "/items" }, key: "/path", maxItems: 4 },
|
|
839
|
-
parallel: { agent: "
|
|
860
|
+
parallel: { agent: "explorer", task: "Patch {item.path}", outputSchema: { type: "object" } },
|
|
840
861
|
collect: { as: "reviews" },
|
|
841
862
|
concurrency: 1,
|
|
842
863
|
},
|
|
@@ -846,7 +867,7 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
846
867
|
);
|
|
847
868
|
|
|
848
869
|
assert.ok(!result.isError, `chain should succeed: ${JSON.stringify(result.content)}`);
|
|
849
|
-
const explorerResults = result.details.results.filter((child) => child.agent === "
|
|
870
|
+
const explorerResults = result.details.results.filter((child) => child.agent === "explorer");
|
|
850
871
|
assert.deepEqual(explorerResults.map((child) => child.acceptance?.effectiveAcceptance.level), ["checked", "checked"]);
|
|
851
872
|
const dynamicNode = result.details.workflowGraph?.nodes[1];
|
|
852
873
|
assert.equal(dynamicNode?.acceptanceStatus, "rejected");
|
|
@@ -860,15 +881,15 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
860
881
|
});
|
|
861
882
|
mockPi.onCall({ output: "review-a", structuredOutput: { ok: "a" } });
|
|
862
883
|
mockPi.onCall({ exitCode: 1, stderr: "review-b failed" });
|
|
863
|
-
const agents = [makeAgent("
|
|
884
|
+
const agents = [makeAgent("scout"), makeAgent("reviewer")];
|
|
864
885
|
|
|
865
886
|
const result = await executeChain(
|
|
866
887
|
makeChainParams(
|
|
867
888
|
[
|
|
868
|
-
{ agent: "
|
|
889
|
+
{ agent: "scout", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
|
|
869
890
|
{
|
|
870
891
|
expand: { from: { output: "targets", path: "/items" }, key: "/path", maxItems: 4 },
|
|
871
|
-
parallel: { agent: "
|
|
892
|
+
parallel: { agent: "reviewer", task: "Review {item.path}", outputSchema: { type: "object" } },
|
|
872
893
|
collect: { as: "reviews" },
|
|
873
894
|
concurrency: 1,
|
|
874
895
|
},
|
|
@@ -885,15 +906,15 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
885
906
|
|
|
886
907
|
it("fails dynamic fanout before spawning children for invalid source arrays", async () => {
|
|
887
908
|
mockPi.onCall({ output: "targets", structuredOutput: { items: [{ path: "a" }, { path: "b" }] } });
|
|
888
|
-
const agents = [makeAgent("
|
|
909
|
+
const agents = [makeAgent("scout"), makeAgent("reviewer")];
|
|
889
910
|
|
|
890
911
|
const result = await executeChain(
|
|
891
912
|
makeChainParams(
|
|
892
913
|
[
|
|
893
|
-
{ agent: "
|
|
914
|
+
{ agent: "scout", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
|
|
894
915
|
{
|
|
895
916
|
expand: { from: { output: "targets", path: "/items" }, key: "/path", maxItems: 1 },
|
|
896
|
-
parallel: { agent: "
|
|
917
|
+
parallel: { agent: "reviewer", task: "Review {item.path}" },
|
|
897
918
|
collect: { as: "reviews" },
|
|
898
919
|
},
|
|
899
920
|
],
|
|
@@ -910,15 +931,15 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
910
931
|
|
|
911
932
|
it("marks dynamic file-only validation failures as failed graph groups before spawning children", async () => {
|
|
912
933
|
mockPi.onCall({ output: "targets", structuredOutput: { items: [{ path: "src/a.ts" }] } });
|
|
913
|
-
const agents = [makeAgent("
|
|
934
|
+
const agents = [makeAgent("scout"), makeAgent("reviewer")];
|
|
914
935
|
|
|
915
936
|
const result = await executeChain(
|
|
916
937
|
makeChainParams(
|
|
917
938
|
[
|
|
918
|
-
{ agent: "
|
|
939
|
+
{ agent: "scout", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
|
|
919
940
|
{
|
|
920
941
|
expand: { from: { output: "targets", path: "/items" }, key: "/path", maxItems: 4 },
|
|
921
|
-
parallel: { agent: "
|
|
942
|
+
parallel: { agent: "reviewer", task: "Review {item.path}", outputMode: "file-only" },
|
|
922
943
|
collect: { as: "reviews" },
|
|
923
944
|
},
|
|
924
945
|
],
|
|
@@ -937,15 +958,15 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
937
958
|
it("marks empty dynamic fanout skip as a completed graph group", async () => {
|
|
938
959
|
mockPi.onCall({ output: "targets", structuredOutput: { items: [] } });
|
|
939
960
|
mockPi.onCall({ output: "used empty reviews" });
|
|
940
|
-
const agents = [makeAgent("
|
|
961
|
+
const agents = [makeAgent("scout"), makeAgent("reviewer"), makeAgent("writer")];
|
|
941
962
|
|
|
942
963
|
const result = await executeChain(
|
|
943
964
|
makeChainParams(
|
|
944
965
|
[
|
|
945
|
-
{ agent: "
|
|
966
|
+
{ agent: "scout", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
|
|
946
967
|
{
|
|
947
968
|
expand: { from: { output: "targets", path: "/items" }, key: "/path", maxItems: 4, onEmpty: "skip" },
|
|
948
|
-
parallel: { agent: "
|
|
969
|
+
parallel: { agent: "reviewer", task: "Review {item.path}" },
|
|
949
970
|
collect: { as: "reviews" },
|
|
950
971
|
},
|
|
951
972
|
{ agent: "writer", task: "Use {outputs.reviews}" },
|
|
@@ -964,15 +985,15 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
964
985
|
it("marks dynamic collect schema failures as failed graph groups", async () => {
|
|
965
986
|
mockPi.onCall({ output: "targets", structuredOutput: { items: [{ path: "src/a.ts" }] } });
|
|
966
987
|
mockPi.onCall({ output: "review-a", structuredOutput: { ok: "a" } });
|
|
967
|
-
const agents = [makeAgent("
|
|
988
|
+
const agents = [makeAgent("scout"), makeAgent("reviewer")];
|
|
968
989
|
|
|
969
990
|
const result = await executeChain(
|
|
970
991
|
makeChainParams(
|
|
971
992
|
[
|
|
972
|
-
{ agent: "
|
|
993
|
+
{ agent: "scout", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
|
|
973
994
|
{
|
|
974
995
|
expand: { from: { output: "targets", path: "/items" }, key: "/path", maxItems: 4 },
|
|
975
|
-
parallel: { agent: "
|
|
996
|
+
parallel: { agent: "reviewer", task: "Review {item.path}", outputSchema: { type: "object" } },
|
|
976
997
|
collect: { as: "reviews", outputSchema: { type: "object" } },
|
|
977
998
|
},
|
|
978
999
|
],
|
|
@@ -993,16 +1014,16 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
993
1014
|
mockPi.onCall({ output: "review-a", structuredOutput: { ok: "a" } });
|
|
994
1015
|
mockPi.onCall({ output: "review-b", structuredOutput: { ok: "b" } });
|
|
995
1016
|
mockPi.onCall({ steps: [{ jsonl: [events.assistantMessage("writer started")] }] });
|
|
996
|
-
const agents = [makeAgent("
|
|
1017
|
+
const agents = [makeAgent("scout"), makeAgent("reviewer"), makeAgent("writer")];
|
|
997
1018
|
let writerUpdateChildren: Array<{ itemKey?: string; status?: string }> | undefined;
|
|
998
1019
|
|
|
999
1020
|
const result = await executeChain(
|
|
1000
1021
|
makeChainParams(
|
|
1001
1022
|
[
|
|
1002
|
-
{ agent: "
|
|
1023
|
+
{ agent: "scout", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
|
|
1003
1024
|
{
|
|
1004
1025
|
expand: { from: { output: "targets", path: "/items" }, key: "/path", maxItems: 4 },
|
|
1005
|
-
parallel: { agent: "
|
|
1026
|
+
parallel: { agent: "reviewer", task: "Review {item.path}", outputSchema: { type: "object" } },
|
|
1006
1027
|
collect: { as: "reviews" },
|
|
1007
1028
|
concurrency: 1,
|
|
1008
1029
|
},
|
|
@@ -1063,10 +1084,10 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
1063
1084
|
properties: { ok: { type: "boolean" }, note: { type: "string" } },
|
|
1064
1085
|
};
|
|
1065
1086
|
mockPi.onCall({ output: "prose", structuredOutput: { ok: true, note: "captured" } });
|
|
1066
|
-
const agents = [makeAgent("
|
|
1087
|
+
const agents = [makeAgent("worker")];
|
|
1067
1088
|
|
|
1068
1089
|
const result = await executeChain(
|
|
1069
|
-
makeChainParams([{ agent: "
|
|
1090
|
+
makeChainParams([{ agent: "worker", task: "Return structured", outputSchema: schema }], agents),
|
|
1070
1091
|
);
|
|
1071
1092
|
|
|
1072
1093
|
assert.ok(!result.isError);
|
|
@@ -1075,7 +1096,7 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
1075
1096
|
mockPi.reset();
|
|
1076
1097
|
mockPi.onCall({ structuredOutput: { ok: true, note: "tool-only" } });
|
|
1077
1098
|
const structuredOnly = await executeChain(
|
|
1078
|
-
makeChainParams([{ agent: "
|
|
1099
|
+
makeChainParams([{ agent: "worker", task: "Return structured", outputSchema: schema }], agents),
|
|
1079
1100
|
);
|
|
1080
1101
|
assert.ok(!structuredOnly.isError);
|
|
1081
1102
|
assert.deepEqual(structuredOnly.details.results[0]?.structuredOutput, { ok: true, note: "tool-only" });
|
|
@@ -1083,15 +1104,23 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
1083
1104
|
mockPi.reset();
|
|
1084
1105
|
mockPi.onCall({ output: "prose only" });
|
|
1085
1106
|
const missing = await executeChain(
|
|
1086
|
-
makeChainParams([{ agent: "
|
|
1107
|
+
makeChainParams([{ agent: "worker", task: "Return structured", outputSchema: schema }], agents),
|
|
1087
1108
|
);
|
|
1088
1109
|
assert.equal(missing.isError, true);
|
|
1089
1110
|
assert.match(missing.details.results[0]?.error ?? "", /Missing structured_output call/);
|
|
1090
1111
|
|
|
1112
|
+
mockPi.reset();
|
|
1113
|
+
mockPi.onCall({ output: "prose only" });
|
|
1114
|
+
const missingImplementation = await executeChain(
|
|
1115
|
+
makeChainParams([{ agent: "worker", task: "Implement the fix and return structured data", outputSchema: schema }], agents),
|
|
1116
|
+
);
|
|
1117
|
+
assert.equal(missingImplementation.isError, true);
|
|
1118
|
+
assert.match(missingImplementation.details.results[0]?.error ?? "", /Missing structured_output call/);
|
|
1119
|
+
|
|
1091
1120
|
mockPi.reset();
|
|
1092
1121
|
mockPi.onCall({ output: "invalid", structuredOutput: { ok: "yes" } });
|
|
1093
1122
|
const invalid = await executeChain(
|
|
1094
|
-
makeChainParams([{ agent: "
|
|
1123
|
+
makeChainParams([{ agent: "worker", task: "Return structured", outputSchema: schema, phase: "Validate", label: "Structured worker", as: "result" }], agents),
|
|
1095
1124
|
);
|
|
1096
1125
|
assert.equal(invalid.isError, true);
|
|
1097
1126
|
assert.match(invalid.details.results[0]?.error ?? "", /Structured output validation failed/);
|
|
@@ -1100,13 +1129,35 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
1100
1129
|
assert.match(invalid.details.workflowGraph?.nodes[0]?.error ?? "", /Structured output validation failed/);
|
|
1101
1130
|
});
|
|
1102
1131
|
|
|
1132
|
+
it("accepts recovered tool errors before valid structured output", async () => {
|
|
1133
|
+
mockPi.onCall({
|
|
1134
|
+
jsonl: [{
|
|
1135
|
+
type: "tool_result_end",
|
|
1136
|
+
message: { role: "toolResult", toolName: "read", isError: true, content: [{ type: "text", text: "EISDIR" }] },
|
|
1137
|
+
}],
|
|
1138
|
+
structuredOutput: { ok: true },
|
|
1139
|
+
});
|
|
1140
|
+
const agents = [makeAgent("worker")];
|
|
1141
|
+
|
|
1142
|
+
const result = await executeChain(
|
|
1143
|
+
makeChainParams([{
|
|
1144
|
+
agent: "worker",
|
|
1145
|
+
task: "Recover and return structured data",
|
|
1146
|
+
outputSchema: { type: "object", required: ["ok"], properties: { ok: { type: "boolean" } } },
|
|
1147
|
+
}], agents),
|
|
1148
|
+
);
|
|
1149
|
+
|
|
1150
|
+
assert.ok(!result.isError, `chain should succeed: ${JSON.stringify(result.content)}`);
|
|
1151
|
+
assert.deepEqual(result.details.results[0]?.structuredOutput, { ok: true });
|
|
1152
|
+
});
|
|
1153
|
+
|
|
1103
1154
|
it("substitutes {task} in templates", async () => {
|
|
1104
1155
|
mockPi.onCall({ output: "Done" });
|
|
1105
|
-
const agents = [makeAgent("
|
|
1156
|
+
const agents = [makeAgent("worker")];
|
|
1106
1157
|
|
|
1107
1158
|
const result = await executeChain(
|
|
1108
1159
|
makeChainParams(
|
|
1109
|
-
[{ agent: "
|
|
1160
|
+
[{ agent: "worker", task: "Review {task} carefully" }],
|
|
1110
1161
|
agents,
|
|
1111
1162
|
{ task: "the authentication module" },
|
|
1112
1163
|
),
|
|
@@ -1122,11 +1173,11 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
1122
1173
|
|
|
1123
1174
|
it("creates and uses chain_dir", async () => {
|
|
1124
1175
|
mockPi.onCall({ output: "Done" });
|
|
1125
|
-
const agents = [makeAgent("
|
|
1176
|
+
const agents = [makeAgent("worker")];
|
|
1126
1177
|
|
|
1127
1178
|
const result = await executeChain(
|
|
1128
1179
|
makeChainParams(
|
|
1129
|
-
[{ agent: "
|
|
1180
|
+
[{ agent: "worker", task: "Write to {chain_dir}" }],
|
|
1130
1181
|
agents,
|
|
1131
1182
|
),
|
|
1132
1183
|
);
|
|
@@ -1199,13 +1250,13 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
1199
1250
|
|
|
1200
1251
|
it("runs a 3-step chain end-to-end", async () => {
|
|
1201
1252
|
mockPi.onCall({ output: "Step output" });
|
|
1202
|
-
const agents = [makeAgent("
|
|
1253
|
+
const agents = [makeAgent("scout"), makeAgent("planner"), makeAgent("executor")];
|
|
1203
1254
|
|
|
1204
1255
|
const result = await executeChain(
|
|
1205
1256
|
makeChainParams(
|
|
1206
1257
|
[
|
|
1207
|
-
{ agent: "
|
|
1208
|
-
{ agent: "
|
|
1258
|
+
{ agent: "scout", task: "Survey the codebase" },
|
|
1259
|
+
{ agent: "planner" },
|
|
1209
1260
|
{ agent: "executor" },
|
|
1210
1261
|
],
|
|
1211
1262
|
agents,
|
|
@@ -1217,16 +1268,16 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
1217
1268
|
assert.ok(result.details.results.every((r) => r.exitCode === 0));
|
|
1218
1269
|
});
|
|
1219
1270
|
|
|
1220
|
-
it("runs a 40-step alternating
|
|
1271
|
+
it("runs a 40-step alternating worker and reviewer chain", async () => {
|
|
1221
1272
|
const chainLength = 40;
|
|
1222
1273
|
for (let i = 0; i < chainLength; i++) {
|
|
1223
1274
|
mockPi.onCall({ output: `step-${i}-output` });
|
|
1224
1275
|
}
|
|
1225
1276
|
const chain = Array.from({ length: chainLength }, (_, i): TestSequentialStep => ({
|
|
1226
|
-
agent: i % 2 === 0 ? "
|
|
1227
|
-
...(i === 0 ? { task: "Start long
|
|
1277
|
+
agent: i % 2 === 0 ? "worker" : "reviewer",
|
|
1278
|
+
...(i === 0 ? { task: "Start long worker/reviewer chain" } : {}),
|
|
1228
1279
|
}));
|
|
1229
|
-
const agents = [makeAgent("
|
|
1280
|
+
const agents = [makeAgent("worker"), makeAgent("reviewer")];
|
|
1230
1281
|
|
|
1231
1282
|
const result = await executeChain(makeChainParams(chain, agents));
|
|
1232
1283
|
|
|
@@ -1236,7 +1287,7 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
1236
1287
|
assert.equal(result.details.totalSteps, chainLength);
|
|
1237
1288
|
assert.equal(result.details.chainAgents?.length, chainLength);
|
|
1238
1289
|
assert.equal(result.details.workflowGraph?.nodes.length, chainLength);
|
|
1239
|
-
assert.equal(result.details.workflowGraph?.nodes.at(-1)?.agent, "
|
|
1290
|
+
assert.equal(result.details.workflowGraph?.nodes.at(-1)?.agent, "reviewer");
|
|
1240
1291
|
assert.equal(result.details.workflowGraph?.nodes.at(-1)?.flatIndex, chainLength - 1);
|
|
1241
1292
|
assert.ok(result.details.results.every((r) => r.exitCode === 0));
|
|
1242
1293
|
assert.deepEqual(
|
|
@@ -1251,11 +1302,11 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
1251
1302
|
});
|
|
1252
1303
|
|
|
1253
1304
|
it("returns error for unknown agent in chain", async () => {
|
|
1254
|
-
const agents = [makeAgent("
|
|
1305
|
+
const agents = [makeAgent("scout")];
|
|
1255
1306
|
|
|
1256
1307
|
const result = await executeChain(
|
|
1257
1308
|
makeChainParams(
|
|
1258
|
-
[{ agent: "
|
|
1309
|
+
[{ agent: "scout", task: "Start" }, { agent: "nonexistent" }],
|
|
1259
1310
|
agents,
|
|
1260
1311
|
),
|
|
1261
1312
|
);
|
|
@@ -1301,12 +1352,12 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
1301
1352
|
|
|
1302
1353
|
it("uses custom chainDir when provided", async () => {
|
|
1303
1354
|
mockPi.onCall({ output: "Done" });
|
|
1304
|
-
const agents = [makeAgent("
|
|
1355
|
+
const agents = [makeAgent("worker")];
|
|
1305
1356
|
const customChainDir = path.join(tempDir, "my-chain");
|
|
1306
1357
|
|
|
1307
1358
|
const result = await executeChain(
|
|
1308
1359
|
makeChainParams(
|
|
1309
|
-
[{ agent: "
|
|
1360
|
+
[{ agent: "worker", task: "Use {chain_dir}" }],
|
|
1310
1361
|
agents,
|
|
1311
1362
|
{ chainDir: customChainDir },
|
|
1312
1363
|
),
|
|
@@ -1323,11 +1374,11 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
1323
1374
|
delete process.env.SELESAI_SUBAGENT_MAX_DEPTH;
|
|
1324
1375
|
try {
|
|
1325
1376
|
mockPi.onCall({ echoEnv: ["SELESAI_SUBAGENT_DEPTH", "SELESAI_SUBAGENT_MAX_DEPTH"] });
|
|
1326
|
-
const agents = [makeAgent("
|
|
1377
|
+
const agents = [makeAgent("worker", { maxSubagentDepth: 1 })];
|
|
1327
1378
|
|
|
1328
1379
|
const result = await executeChain(
|
|
1329
1380
|
makeChainParams(
|
|
1330
|
-
[{ agent: "
|
|
1381
|
+
[{ agent: "worker", task: "Inspect env" }],
|
|
1331
1382
|
agents,
|
|
1332
1383
|
{ maxSubagentDepth: 3 },
|
|
1333
1384
|
),
|
|
@@ -1416,15 +1467,15 @@ describe("chain execution — parallel steps", { skip: !available ? "pi packages
|
|
|
1416
1467
|
|
|
1417
1468
|
it("runs parallel tasks within a chain step", async () => {
|
|
1418
1469
|
mockPi.onCall({ output: "Parallel task done" });
|
|
1419
|
-
const agents = [makeAgent("
|
|
1470
|
+
const agents = [makeAgent("reviewer-a"), makeAgent("reviewer-b")];
|
|
1420
1471
|
|
|
1421
1472
|
const result = await executeChain(
|
|
1422
1473
|
makeChainParams(
|
|
1423
1474
|
[
|
|
1424
1475
|
{
|
|
1425
1476
|
parallel: [
|
|
1426
|
-
{ agent: "
|
|
1427
|
-
{ agent: "
|
|
1477
|
+
{ agent: "reviewer-a", task: "Review auth module" },
|
|
1478
|
+
{ agent: "reviewer-b", task: "Review data layer" },
|
|
1428
1479
|
],
|
|
1429
1480
|
},
|
|
1430
1481
|
],
|
|
@@ -1440,13 +1491,13 @@ describe("chain execution — parallel steps", { skip: !available ? "pi packages
|
|
|
1440
1491
|
it("applies global permissions to foreground static parallel children", async () => {
|
|
1441
1492
|
mockPi.onCall({ echoEnv: [PERMISSION_POLICY_ENV, PERMISSION_AUDIT_PATH_ENV] });
|
|
1442
1493
|
mockPi.onCall({ echoEnv: [PERMISSION_POLICY_ENV, PERMISSION_AUDIT_PATH_ENV] });
|
|
1443
|
-
const agents = [makeAgent("
|
|
1494
|
+
const agents = [makeAgent("reviewer-a"), makeAgent("reviewer-b")];
|
|
1444
1495
|
|
|
1445
1496
|
const result = await executeChain!(makeChainParams(
|
|
1446
1497
|
[{
|
|
1447
1498
|
parallel: [
|
|
1448
|
-
{ agent: "
|
|
1449
|
-
{ agent: "
|
|
1499
|
+
{ agent: "reviewer-a", task: "Review A" },
|
|
1500
|
+
{ agent: "reviewer-b", task: "Review B" },
|
|
1450
1501
|
],
|
|
1451
1502
|
}],
|
|
1452
1503
|
agents,
|
|
@@ -1474,8 +1525,8 @@ describe("chain execution — parallel steps", { skip: !available ? "pi packages
|
|
|
1474
1525
|
const artifactsDir = path.join(tempDir, "artifacts");
|
|
1475
1526
|
const result = await executeChain(
|
|
1476
1527
|
makeChainParams(
|
|
1477
|
-
[{ parallel: [{ agent: "
|
|
1478
|
-
[makeAgent("
|
|
1528
|
+
[{ parallel: [{ agent: "reviewer-a", task: "Review in isolation" }], worktree: true }],
|
|
1529
|
+
[makeAgent("reviewer-a")],
|
|
1479
1530
|
{ runId, artifactsDir },
|
|
1480
1531
|
),
|
|
1481
1532
|
);
|
|
@@ -1488,7 +1539,7 @@ describe("chain execution — parallel steps", { skip: !available ? "pi packages
|
|
|
1488
1539
|
groups: Array<{ stepIndex: number; children: Array<{ agent: string; patch: { path: string } }>; cleanup: { state: string } }>;
|
|
1489
1540
|
};
|
|
1490
1541
|
assert.equal(handoff.groups[0]!.stepIndex, 0);
|
|
1491
|
-
assert.equal(handoff.groups[0]!.children[0]!.agent, "
|
|
1542
|
+
assert.equal(handoff.groups[0]!.children[0]!.agent, "reviewer-a");
|
|
1492
1543
|
assert.equal(handoff.groups[0]!.cleanup.state, "complete");
|
|
1493
1544
|
assert.equal(fs.existsSync(handoff.groups[0]!.children[0]!.patch.path), true);
|
|
1494
1545
|
assert.match(handoff.groups[0]!.children[0]!.patch.path, /worktree-diffs\/foreground-chain-handoff\/step-0\//);
|
|
@@ -1496,15 +1547,15 @@ describe("chain execution — parallel steps", { skip: !available ? "pi packages
|
|
|
1496
1547
|
|
|
1497
1548
|
it("aggregates parallel outputs for next sequential step", async () => {
|
|
1498
1549
|
mockPi.onCall({ output: "Review findings here" });
|
|
1499
|
-
const agents = [makeAgent("
|
|
1550
|
+
const agents = [makeAgent("reviewer-a"), makeAgent("reviewer-b"), makeAgent("synthesizer")];
|
|
1500
1551
|
|
|
1501
1552
|
const result = await executeChain(
|
|
1502
1553
|
makeChainParams(
|
|
1503
1554
|
[
|
|
1504
1555
|
{
|
|
1505
1556
|
parallel: [
|
|
1506
|
-
{ agent: "
|
|
1507
|
-
{ agent: "
|
|
1557
|
+
{ agent: "reviewer-a", task: "Review security" },
|
|
1558
|
+
{ agent: "reviewer-b", task: "Review performance" },
|
|
1508
1559
|
],
|
|
1509
1560
|
},
|
|
1510
1561
|
{ agent: "synthesizer" },
|
|
@@ -1517,12 +1568,12 @@ describe("chain execution — parallel steps", { skip: !available ? "pi packages
|
|
|
1517
1568
|
assert.equal(result.details.results.length, 3);
|
|
1518
1569
|
const synthTask = result.details.results[2].task;
|
|
1519
1570
|
assert.ok(
|
|
1520
|
-
synthTask.includes("=== Parallel Task 1 (
|
|
1521
|
-
"synthesizer should include
|
|
1571
|
+
synthTask.includes("=== Parallel Task 1 (reviewer-a) ==="),
|
|
1572
|
+
"synthesizer should include reviewer-a output block",
|
|
1522
1573
|
);
|
|
1523
1574
|
assert.ok(
|
|
1524
|
-
synthTask.includes("=== Parallel Task 2 (
|
|
1525
|
-
"synthesizer should include
|
|
1575
|
+
synthTask.includes("=== Parallel Task 2 (reviewer-b) ==="),
|
|
1576
|
+
"synthesizer should include reviewer-b output block",
|
|
1526
1577
|
);
|
|
1527
1578
|
});
|
|
1528
1579
|
|
|
@@ -1559,15 +1610,15 @@ describe("chain execution — parallel steps", { skip: !available ? "pi packages
|
|
|
1559
1610
|
mockPi.onCall({ matchArgIncludes: "Synthesize:", output: "Funnel synthesis" });
|
|
1560
1611
|
mockPi.onCall({ matchArgIncludes: "Review funnel A:", output: "Reviewer A done" });
|
|
1561
1612
|
mockPi.onCall({ matchArgIncludes: "Review funnel B:", output: "Reviewer B done" });
|
|
1562
|
-
const agents = [makeAgent("
|
|
1613
|
+
const agents = [makeAgent("scout-a"), makeAgent("scout-b"), makeAgent("synthesizer"), makeAgent("review-a"), makeAgent("review-b")];
|
|
1563
1614
|
|
|
1564
1615
|
const result = await executeChain(
|
|
1565
1616
|
makeChainParams(
|
|
1566
1617
|
[
|
|
1567
1618
|
{
|
|
1568
1619
|
parallel: [
|
|
1569
|
-
{ agent: "
|
|
1570
|
-
{ agent: "
|
|
1620
|
+
{ agent: "scout-a", task: "Scout API" },
|
|
1621
|
+
{ agent: "scout-b", task: "Scout UI" },
|
|
1571
1622
|
],
|
|
1572
1623
|
},
|
|
1573
1624
|
{ agent: "synthesizer", task: "Synthesize:\n{previous}" },
|
|
@@ -1583,12 +1634,12 @@ describe("chain execution — parallel steps", { skip: !available ? "pi packages
|
|
|
1583
1634
|
);
|
|
1584
1635
|
|
|
1585
1636
|
assert.ok(!result.isError, `should succeed: ${JSON.stringify(result.content)}`);
|
|
1586
|
-
assert.deepEqual(result.details.results.map((entry) => entry.agent), ["
|
|
1637
|
+
assert.deepEqual(result.details.results.map((entry) => entry.agent), ["scout-a", "scout-b", "synthesizer", "review-a", "review-b"]);
|
|
1587
1638
|
assert.equal(result.details.totalSteps, 3);
|
|
1588
1639
|
const funnelTask = readCallArgsMatching("Synthesize:").at(-1) ?? "";
|
|
1589
|
-
assert.match(funnelTask, /=== Parallel Task 1 \(
|
|
1640
|
+
assert.match(funnelTask, /=== Parallel Task 1 \(scout-a\) ===/);
|
|
1590
1641
|
assert.match(funnelTask, /Scout A findings/);
|
|
1591
|
-
assert.match(funnelTask, /=== Parallel Task 2 \(
|
|
1642
|
+
assert.match(funnelTask, /=== Parallel Task 2 \(scout-b\) ===/);
|
|
1592
1643
|
assert.match(funnelTask, /Scout B findings/);
|
|
1593
1644
|
const fanoutTaskA = readCallArgsMatching("Review funnel A:").at(-1) ?? "";
|
|
1594
1645
|
const fanoutTaskB = readCallArgsMatching("Review funnel B:").at(-1) ?? "";
|
|
@@ -1601,15 +1652,15 @@ describe("chain execution — parallel steps", { skip: !available ? "pi packages
|
|
|
1601
1652
|
|
|
1602
1653
|
it("aggregates file-only parallel outputs as file references for the next step", async () => {
|
|
1603
1654
|
mockPi.onCall({ output: "full parallel chain output\nwith details" });
|
|
1604
|
-
const agents = [makeAgent("
|
|
1655
|
+
const agents = [makeAgent("reviewer-a"), makeAgent("reviewer-b"), makeAgent("synthesizer")];
|
|
1605
1656
|
|
|
1606
1657
|
const result = await executeChain(
|
|
1607
1658
|
makeChainParams(
|
|
1608
1659
|
[
|
|
1609
1660
|
{
|
|
1610
1661
|
parallel: [
|
|
1611
|
-
{ agent: "
|
|
1612
|
-
{ agent: "
|
|
1662
|
+
{ agent: "reviewer-a", task: "Review A", output: "a.md", outputMode: "file-only" },
|
|
1663
|
+
{ agent: "reviewer-b", task: "Review B", output: "b.md", outputMode: "file-only" },
|
|
1613
1664
|
],
|
|
1614
1665
|
},
|
|
1615
1666
|
{ agent: "synthesizer" },
|
|
@@ -1629,14 +1680,14 @@ describe("chain execution — parallel steps", { skip: !available ? "pi packages
|
|
|
1629
1680
|
});
|
|
1630
1681
|
|
|
1631
1682
|
it("rejects chain parallel file-only output without spawning siblings", async () => {
|
|
1632
|
-
const agents = [makeAgent("
|
|
1683
|
+
const agents = [makeAgent("reviewer-a"), makeAgent("reviewer-b")];
|
|
1633
1684
|
|
|
1634
1685
|
const result = await executeChain(
|
|
1635
1686
|
makeChainParams(
|
|
1636
1687
|
[{
|
|
1637
1688
|
parallel: [
|
|
1638
|
-
{ agent: "
|
|
1639
|
-
{ agent: "
|
|
1689
|
+
{ agent: "reviewer-a", task: "Review A", outputMode: "file-only" },
|
|
1690
|
+
{ agent: "reviewer-b", task: "Review B", output: "b.md" },
|
|
1640
1691
|
],
|
|
1641
1692
|
}],
|
|
1642
1693
|
agents,
|
|
@@ -1779,12 +1830,12 @@ describe("chain execution — parallel steps", { skip: !available ? "pi packages
|
|
|
1779
1830
|
|
|
1780
1831
|
it("sequential → parallel → sequential (mixed chain)", async () => {
|
|
1781
1832
|
mockPi.onCall({ output: "Step complete" });
|
|
1782
|
-
const agents = [makeAgent("
|
|
1833
|
+
const agents = [makeAgent("scout"), makeAgent("rev-a"), makeAgent("rev-b"), makeAgent("writer")];
|
|
1783
1834
|
|
|
1784
1835
|
const result = await executeChain(
|
|
1785
1836
|
makeChainParams(
|
|
1786
1837
|
[
|
|
1787
|
-
{ agent: "
|
|
1838
|
+
{ agent: "scout", task: "Initial scan" },
|
|
1788
1839
|
{
|
|
1789
1840
|
parallel: [
|
|
1790
1841
|
{ agent: "rev-a", task: "Deep review A" },
|