@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
|
@@ -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
|
),
|
|
@@ -646,10 +667,11 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
646
667
|
);
|
|
647
668
|
|
|
648
669
|
assert.ok(!result.isError);
|
|
649
|
-
|
|
670
|
+
assert.equal(result.details.results[1].task, "[prompt redacted]");
|
|
671
|
+
const step2Task = readCallArgs(1).at(-1) ?? "";
|
|
650
672
|
assert.ok(
|
|
651
673
|
step2Task.includes("MARKER_ABC_123"),
|
|
652
|
-
`step 2
|
|
674
|
+
`step 2 invocation should contain step 1 output via {previous}: ${step2Task.slice(0, 200)}`,
|
|
653
675
|
);
|
|
654
676
|
});
|
|
655
677
|
|
|
@@ -681,16 +703,16 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
681
703
|
mockPi.onCall({ output: "review-a", structuredOutput: { ok: "a" } });
|
|
682
704
|
mockPi.onCall({ output: "review-b", structuredOutput: { ok: "b" } });
|
|
683
705
|
mockPi.onCall({ output: "synthesized" });
|
|
684
|
-
const agents = [makeAgent("
|
|
706
|
+
const agents = [makeAgent("scout"), makeAgent("reviewer"), makeAgent("writer")];
|
|
685
707
|
|
|
686
708
|
const result = await executeChain(
|
|
687
709
|
makeChainParams(
|
|
688
710
|
[
|
|
689
|
-
{ agent: "
|
|
711
|
+
{ agent: "scout", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
|
|
690
712
|
{
|
|
691
713
|
expand: { from: { output: "targets", path: "/items" }, item: "target", key: "/path", maxItems: 4 },
|
|
692
714
|
parallel: {
|
|
693
|
-
agent: "
|
|
715
|
+
agent: "reviewer",
|
|
694
716
|
task: "Review {target.path}",
|
|
695
717
|
label: "Review {target.path}",
|
|
696
718
|
outputSchema: { type: "object" },
|
|
@@ -724,14 +746,14 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
724
746
|
});
|
|
725
747
|
mockPi.onCall({ echoEnv: [PERMISSION_POLICY_ENV, PERMISSION_AUDIT_PATH_ENV], structuredOutput: { ok: "a" } });
|
|
726
748
|
mockPi.onCall({ echoEnv: [PERMISSION_POLICY_ENV, PERMISSION_AUDIT_PATH_ENV], structuredOutput: { ok: "b" } });
|
|
727
|
-
const agents = [makeAgent("
|
|
749
|
+
const agents = [makeAgent("scout"), makeAgent("reviewer")];
|
|
728
750
|
|
|
729
751
|
const result = await executeChain!(makeChainParams(
|
|
730
752
|
[
|
|
731
|
-
{ agent: "
|
|
753
|
+
{ agent: "scout", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
|
|
732
754
|
{
|
|
733
755
|
expand: { from: { output: "targets", path: "/items" }, key: "/path", maxItems: 4 },
|
|
734
|
-
parallel: { agent: "
|
|
756
|
+
parallel: { agent: "reviewer", task: "Review {item.path}", outputSchema: { type: "object" } },
|
|
735
757
|
collect: { as: "reviews" },
|
|
736
758
|
concurrency: 1,
|
|
737
759
|
},
|
|
@@ -741,7 +763,7 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
741
763
|
));
|
|
742
764
|
|
|
743
765
|
assert.equal(result.isError, undefined);
|
|
744
|
-
const reviewerResults = result.details.results.filter((entry) => entry.agent === "
|
|
766
|
+
const reviewerResults = result.details.results.filter((entry) => entry.agent === "reviewer");
|
|
745
767
|
assert.equal(reviewerResults.length, 2);
|
|
746
768
|
for (const child of reviewerResults) {
|
|
747
769
|
const env = JSON.parse(child.finalOutput ?? "{}") as Record<string, string | null>;
|
|
@@ -757,15 +779,15 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
757
779
|
});
|
|
758
780
|
mockPi.onCall({ output: acceptanceReport({ changedFiles: ["src/a.ts"] }), structuredOutput: { ok: "a" } });
|
|
759
781
|
mockPi.onCall({ output: acceptanceReport({ changedFiles: ["src/b.ts"] }), structuredOutput: { ok: "b" } });
|
|
760
|
-
const agents = [makeAgent("
|
|
782
|
+
const agents = [makeAgent("scout"), makeAgent("reviewer", { completionGuard: false })];
|
|
761
783
|
|
|
762
784
|
const result = await executeChain(
|
|
763
785
|
makeChainParams(
|
|
764
786
|
[
|
|
765
|
-
{ agent: "
|
|
787
|
+
{ agent: "scout", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
|
|
766
788
|
{
|
|
767
789
|
expand: { from: { output: "targets", path: "/items" }, key: "/path", maxItems: 4 },
|
|
768
|
-
parallel: { agent: "
|
|
790
|
+
parallel: { agent: "reviewer", task: "Review {item.path}", outputSchema: { type: "object" }, acceptance: { level: "checked" } },
|
|
769
791
|
collect: { as: "reviews" },
|
|
770
792
|
acceptance: { level: "checked" },
|
|
771
793
|
concurrency: 1,
|
|
@@ -779,7 +801,7 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
779
801
|
const dynamicNode = result.details.workflowGraph?.nodes[1];
|
|
780
802
|
assert.equal(dynamicNode?.acceptanceStatus, "review-required");
|
|
781
803
|
assert.deepEqual(dynamicNode?.children?.map((child) => child.acceptanceStatus), ["checked", "checked"]);
|
|
782
|
-
assert.deepEqual(result.details.results.filter((child) => child.agent === "
|
|
804
|
+
assert.deepEqual(result.details.results.filter((child) => child.agent === "reviewer").map((child) => child.acceptance?.evidenceStatus), ["checked", "checked"]);
|
|
783
805
|
});
|
|
784
806
|
|
|
785
807
|
it("applies read-only acceptance roles to dynamic children and their aggregate group", async () => {
|
|
@@ -796,15 +818,15 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
796
818
|
});
|
|
797
819
|
mockPi.onCall({ output: readOnlyReport, structuredOutput: { ok: "a" } });
|
|
798
820
|
mockPi.onCall({ output: readOnlyReport, structuredOutput: { ok: "b" } });
|
|
799
|
-
const agents = [makeAgent("
|
|
821
|
+
const agents = [makeAgent("scout"), makeAgent("explorer", { acceptanceRole: "read-only" })];
|
|
800
822
|
|
|
801
823
|
const result = await executeChain(
|
|
802
824
|
makeChainParams(
|
|
803
825
|
[
|
|
804
|
-
{ agent: "
|
|
826
|
+
{ agent: "scout", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
|
|
805
827
|
{
|
|
806
828
|
expand: { from: { output: "targets", path: "/items" }, key: "/path", maxItems: 4 },
|
|
807
|
-
parallel: { agent: "
|
|
829
|
+
parallel: { agent: "explorer", task: "Explore {item.path}", outputSchema: { type: "object" } },
|
|
808
830
|
collect: { as: "reviews" },
|
|
809
831
|
concurrency: 1,
|
|
810
832
|
},
|
|
@@ -814,7 +836,7 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
814
836
|
);
|
|
815
837
|
|
|
816
838
|
assert.ok(!result.isError, `chain should succeed: ${JSON.stringify(result.content)}`);
|
|
817
|
-
const explorerResults = result.details.results.filter((child) => child.agent === "
|
|
839
|
+
const explorerResults = result.details.results.filter((child) => child.agent === "explorer");
|
|
818
840
|
assert.deepEqual(explorerResults.map((child) => child.acceptance?.effectiveAcceptance.level), ["attested", "attested"]);
|
|
819
841
|
const dynamicNode = result.details.workflowGraph?.nodes[1];
|
|
820
842
|
assert.equal(dynamicNode?.acceptanceStatus, "attested");
|
|
@@ -828,15 +850,15 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
828
850
|
});
|
|
829
851
|
mockPi.onCall({ output: acceptanceReport({ changedFiles: ["src/a.ts"] }), structuredOutput: { ok: "a" } });
|
|
830
852
|
mockPi.onCall({ output: acceptanceReport({ changedFiles: ["src/b.ts"] }), structuredOutput: { ok: "b" } });
|
|
831
|
-
const agents = [makeAgent("
|
|
853
|
+
const agents = [makeAgent("scout"), makeAgent("explorer", { acceptanceRole: "read-only" })];
|
|
832
854
|
|
|
833
855
|
const result = await executeChain(
|
|
834
856
|
makeChainParams(
|
|
835
857
|
[
|
|
836
|
-
{ agent: "
|
|
858
|
+
{ agent: "scout", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
|
|
837
859
|
{
|
|
838
860
|
expand: { from: { output: "targets", path: "/items" }, key: "/path", maxItems: 4 },
|
|
839
|
-
parallel: { agent: "
|
|
861
|
+
parallel: { agent: "explorer", task: "Patch {item.path}", outputSchema: { type: "object" } },
|
|
840
862
|
collect: { as: "reviews" },
|
|
841
863
|
concurrency: 1,
|
|
842
864
|
},
|
|
@@ -846,7 +868,7 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
846
868
|
);
|
|
847
869
|
|
|
848
870
|
assert.ok(!result.isError, `chain should succeed: ${JSON.stringify(result.content)}`);
|
|
849
|
-
const explorerResults = result.details.results.filter((child) => child.agent === "
|
|
871
|
+
const explorerResults = result.details.results.filter((child) => child.agent === "explorer");
|
|
850
872
|
assert.deepEqual(explorerResults.map((child) => child.acceptance?.effectiveAcceptance.level), ["checked", "checked"]);
|
|
851
873
|
const dynamicNode = result.details.workflowGraph?.nodes[1];
|
|
852
874
|
assert.equal(dynamicNode?.acceptanceStatus, "rejected");
|
|
@@ -860,15 +882,15 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
860
882
|
});
|
|
861
883
|
mockPi.onCall({ output: "review-a", structuredOutput: { ok: "a" } });
|
|
862
884
|
mockPi.onCall({ exitCode: 1, stderr: "review-b failed" });
|
|
863
|
-
const agents = [makeAgent("
|
|
885
|
+
const agents = [makeAgent("scout"), makeAgent("reviewer")];
|
|
864
886
|
|
|
865
887
|
const result = await executeChain(
|
|
866
888
|
makeChainParams(
|
|
867
889
|
[
|
|
868
|
-
{ agent: "
|
|
890
|
+
{ agent: "scout", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
|
|
869
891
|
{
|
|
870
892
|
expand: { from: { output: "targets", path: "/items" }, key: "/path", maxItems: 4 },
|
|
871
|
-
parallel: { agent: "
|
|
893
|
+
parallel: { agent: "reviewer", task: "Review {item.path}", outputSchema: { type: "object" } },
|
|
872
894
|
collect: { as: "reviews" },
|
|
873
895
|
concurrency: 1,
|
|
874
896
|
},
|
|
@@ -885,15 +907,15 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
885
907
|
|
|
886
908
|
it("fails dynamic fanout before spawning children for invalid source arrays", async () => {
|
|
887
909
|
mockPi.onCall({ output: "targets", structuredOutput: { items: [{ path: "a" }, { path: "b" }] } });
|
|
888
|
-
const agents = [makeAgent("
|
|
910
|
+
const agents = [makeAgent("scout"), makeAgent("reviewer")];
|
|
889
911
|
|
|
890
912
|
const result = await executeChain(
|
|
891
913
|
makeChainParams(
|
|
892
914
|
[
|
|
893
|
-
{ agent: "
|
|
915
|
+
{ agent: "scout", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
|
|
894
916
|
{
|
|
895
917
|
expand: { from: { output: "targets", path: "/items" }, key: "/path", maxItems: 1 },
|
|
896
|
-
parallel: { agent: "
|
|
918
|
+
parallel: { agent: "reviewer", task: "Review {item.path}" },
|
|
897
919
|
collect: { as: "reviews" },
|
|
898
920
|
},
|
|
899
921
|
],
|
|
@@ -910,15 +932,15 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
910
932
|
|
|
911
933
|
it("marks dynamic file-only validation failures as failed graph groups before spawning children", async () => {
|
|
912
934
|
mockPi.onCall({ output: "targets", structuredOutput: { items: [{ path: "src/a.ts" }] } });
|
|
913
|
-
const agents = [makeAgent("
|
|
935
|
+
const agents = [makeAgent("scout"), makeAgent("reviewer")];
|
|
914
936
|
|
|
915
937
|
const result = await executeChain(
|
|
916
938
|
makeChainParams(
|
|
917
939
|
[
|
|
918
|
-
{ agent: "
|
|
940
|
+
{ agent: "scout", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
|
|
919
941
|
{
|
|
920
942
|
expand: { from: { output: "targets", path: "/items" }, key: "/path", maxItems: 4 },
|
|
921
|
-
parallel: { agent: "
|
|
943
|
+
parallel: { agent: "reviewer", task: "Review {item.path}", outputMode: "file-only" },
|
|
922
944
|
collect: { as: "reviews" },
|
|
923
945
|
},
|
|
924
946
|
],
|
|
@@ -937,15 +959,15 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
937
959
|
it("marks empty dynamic fanout skip as a completed graph group", async () => {
|
|
938
960
|
mockPi.onCall({ output: "targets", structuredOutput: { items: [] } });
|
|
939
961
|
mockPi.onCall({ output: "used empty reviews" });
|
|
940
|
-
const agents = [makeAgent("
|
|
962
|
+
const agents = [makeAgent("scout"), makeAgent("reviewer"), makeAgent("writer")];
|
|
941
963
|
|
|
942
964
|
const result = await executeChain(
|
|
943
965
|
makeChainParams(
|
|
944
966
|
[
|
|
945
|
-
{ agent: "
|
|
967
|
+
{ agent: "scout", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
|
|
946
968
|
{
|
|
947
969
|
expand: { from: { output: "targets", path: "/items" }, key: "/path", maxItems: 4, onEmpty: "skip" },
|
|
948
|
-
parallel: { agent: "
|
|
970
|
+
parallel: { agent: "reviewer", task: "Review {item.path}" },
|
|
949
971
|
collect: { as: "reviews" },
|
|
950
972
|
},
|
|
951
973
|
{ agent: "writer", task: "Use {outputs.reviews}" },
|
|
@@ -964,15 +986,15 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
964
986
|
it("marks dynamic collect schema failures as failed graph groups", async () => {
|
|
965
987
|
mockPi.onCall({ output: "targets", structuredOutput: { items: [{ path: "src/a.ts" }] } });
|
|
966
988
|
mockPi.onCall({ output: "review-a", structuredOutput: { ok: "a" } });
|
|
967
|
-
const agents = [makeAgent("
|
|
989
|
+
const agents = [makeAgent("scout"), makeAgent("reviewer")];
|
|
968
990
|
|
|
969
991
|
const result = await executeChain(
|
|
970
992
|
makeChainParams(
|
|
971
993
|
[
|
|
972
|
-
{ agent: "
|
|
994
|
+
{ agent: "scout", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
|
|
973
995
|
{
|
|
974
996
|
expand: { from: { output: "targets", path: "/items" }, key: "/path", maxItems: 4 },
|
|
975
|
-
parallel: { agent: "
|
|
997
|
+
parallel: { agent: "reviewer", task: "Review {item.path}", outputSchema: { type: "object" } },
|
|
976
998
|
collect: { as: "reviews", outputSchema: { type: "object" } },
|
|
977
999
|
},
|
|
978
1000
|
],
|
|
@@ -993,16 +1015,16 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
993
1015
|
mockPi.onCall({ output: "review-a", structuredOutput: { ok: "a" } });
|
|
994
1016
|
mockPi.onCall({ output: "review-b", structuredOutput: { ok: "b" } });
|
|
995
1017
|
mockPi.onCall({ steps: [{ jsonl: [events.assistantMessage("writer started")] }] });
|
|
996
|
-
const agents = [makeAgent("
|
|
1018
|
+
const agents = [makeAgent("scout"), makeAgent("reviewer"), makeAgent("writer")];
|
|
997
1019
|
let writerUpdateChildren: Array<{ itemKey?: string; status?: string }> | undefined;
|
|
998
1020
|
|
|
999
1021
|
const result = await executeChain(
|
|
1000
1022
|
makeChainParams(
|
|
1001
1023
|
[
|
|
1002
|
-
{ agent: "
|
|
1024
|
+
{ agent: "scout", task: "Return targets", as: "targets", outputSchema: { type: "object" } },
|
|
1003
1025
|
{
|
|
1004
1026
|
expand: { from: { output: "targets", path: "/items" }, key: "/path", maxItems: 4 },
|
|
1005
|
-
parallel: { agent: "
|
|
1027
|
+
parallel: { agent: "reviewer", task: "Review {item.path}", outputSchema: { type: "object" } },
|
|
1006
1028
|
collect: { as: "reviews" },
|
|
1007
1029
|
concurrency: 1,
|
|
1008
1030
|
},
|
|
@@ -1063,10 +1085,10 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
1063
1085
|
properties: { ok: { type: "boolean" }, note: { type: "string" } },
|
|
1064
1086
|
};
|
|
1065
1087
|
mockPi.onCall({ output: "prose", structuredOutput: { ok: true, note: "captured" } });
|
|
1066
|
-
const agents = [makeAgent("
|
|
1088
|
+
const agents = [makeAgent("worker")];
|
|
1067
1089
|
|
|
1068
1090
|
const result = await executeChain(
|
|
1069
|
-
makeChainParams([{ agent: "
|
|
1091
|
+
makeChainParams([{ agent: "worker", task: "Return structured", outputSchema: schema }], agents),
|
|
1070
1092
|
);
|
|
1071
1093
|
|
|
1072
1094
|
assert.ok(!result.isError);
|
|
@@ -1075,7 +1097,7 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
1075
1097
|
mockPi.reset();
|
|
1076
1098
|
mockPi.onCall({ structuredOutput: { ok: true, note: "tool-only" } });
|
|
1077
1099
|
const structuredOnly = await executeChain(
|
|
1078
|
-
makeChainParams([{ agent: "
|
|
1100
|
+
makeChainParams([{ agent: "worker", task: "Return structured", outputSchema: schema }], agents),
|
|
1079
1101
|
);
|
|
1080
1102
|
assert.ok(!structuredOnly.isError);
|
|
1081
1103
|
assert.deepEqual(structuredOnly.details.results[0]?.structuredOutput, { ok: true, note: "tool-only" });
|
|
@@ -1083,15 +1105,23 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
1083
1105
|
mockPi.reset();
|
|
1084
1106
|
mockPi.onCall({ output: "prose only" });
|
|
1085
1107
|
const missing = await executeChain(
|
|
1086
|
-
makeChainParams([{ agent: "
|
|
1108
|
+
makeChainParams([{ agent: "worker", task: "Return structured", outputSchema: schema }], agents),
|
|
1087
1109
|
);
|
|
1088
1110
|
assert.equal(missing.isError, true);
|
|
1089
1111
|
assert.match(missing.details.results[0]?.error ?? "", /Missing structured_output call/);
|
|
1090
1112
|
|
|
1113
|
+
mockPi.reset();
|
|
1114
|
+
mockPi.onCall({ output: "prose only" });
|
|
1115
|
+
const missingImplementation = await executeChain(
|
|
1116
|
+
makeChainParams([{ agent: "worker", task: "Implement the fix and return structured data", outputSchema: schema }], agents),
|
|
1117
|
+
);
|
|
1118
|
+
assert.equal(missingImplementation.isError, true);
|
|
1119
|
+
assert.match(missingImplementation.details.results[0]?.error ?? "", /Missing structured_output call/);
|
|
1120
|
+
|
|
1091
1121
|
mockPi.reset();
|
|
1092
1122
|
mockPi.onCall({ output: "invalid", structuredOutput: { ok: "yes" } });
|
|
1093
1123
|
const invalid = await executeChain(
|
|
1094
|
-
makeChainParams([{ agent: "
|
|
1124
|
+
makeChainParams([{ agent: "worker", task: "Return structured", outputSchema: schema, phase: "Validate", label: "Structured worker", as: "result" }], agents),
|
|
1095
1125
|
);
|
|
1096
1126
|
assert.equal(invalid.isError, true);
|
|
1097
1127
|
assert.match(invalid.details.results[0]?.error ?? "", /Structured output validation failed/);
|
|
@@ -1100,33 +1130,56 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
1100
1130
|
assert.match(invalid.details.workflowGraph?.nodes[0]?.error ?? "", /Structured output validation failed/);
|
|
1101
1131
|
});
|
|
1102
1132
|
|
|
1133
|
+
it("accepts recovered tool errors before valid structured output", async () => {
|
|
1134
|
+
mockPi.onCall({
|
|
1135
|
+
jsonl: [{
|
|
1136
|
+
type: "tool_result_end",
|
|
1137
|
+
message: { role: "toolResult", toolName: "read", isError: true, content: [{ type: "text", text: "EISDIR" }] },
|
|
1138
|
+
}],
|
|
1139
|
+
structuredOutput: { ok: true },
|
|
1140
|
+
});
|
|
1141
|
+
const agents = [makeAgent("worker")];
|
|
1142
|
+
|
|
1143
|
+
const result = await executeChain(
|
|
1144
|
+
makeChainParams([{
|
|
1145
|
+
agent: "worker",
|
|
1146
|
+
task: "Recover and return structured data",
|
|
1147
|
+
outputSchema: { type: "object", required: ["ok"], properties: { ok: { type: "boolean" } } },
|
|
1148
|
+
}], agents),
|
|
1149
|
+
);
|
|
1150
|
+
|
|
1151
|
+
assert.ok(!result.isError, `chain should succeed: ${JSON.stringify(result.content)}`);
|
|
1152
|
+
assert.deepEqual(result.details.results[0]?.structuredOutput, { ok: true });
|
|
1153
|
+
});
|
|
1154
|
+
|
|
1103
1155
|
it("substitutes {task} in templates", async () => {
|
|
1104
1156
|
mockPi.onCall({ output: "Done" });
|
|
1105
|
-
const agents = [makeAgent("
|
|
1157
|
+
const agents = [makeAgent("worker")];
|
|
1106
1158
|
|
|
1107
1159
|
const result = await executeChain(
|
|
1108
1160
|
makeChainParams(
|
|
1109
|
-
[{ agent: "
|
|
1161
|
+
[{ agent: "worker", task: "Review {task} carefully" }],
|
|
1110
1162
|
agents,
|
|
1111
1163
|
{ task: "the authentication module" },
|
|
1112
1164
|
),
|
|
1113
1165
|
);
|
|
1114
1166
|
|
|
1115
1167
|
assert.ok(!result.isError);
|
|
1116
|
-
|
|
1168
|
+
assert.equal(result.details.results[0].task, "[prompt redacted]");
|
|
1169
|
+
const workerTask = readCallArgs(0).at(-1) ?? "";
|
|
1117
1170
|
assert.ok(
|
|
1118
1171
|
workerTask.includes("the authentication module"),
|
|
1119
|
-
`should substitute {task}: ${workerTask.slice(0, 200)}`,
|
|
1172
|
+
`should substitute {task} in the child invocation: ${workerTask.slice(0, 200)}`,
|
|
1120
1173
|
);
|
|
1121
1174
|
});
|
|
1122
1175
|
|
|
1123
1176
|
it("creates and uses chain_dir", async () => {
|
|
1124
1177
|
mockPi.onCall({ output: "Done" });
|
|
1125
|
-
const agents = [makeAgent("
|
|
1178
|
+
const agents = [makeAgent("worker")];
|
|
1126
1179
|
|
|
1127
1180
|
const result = await executeChain(
|
|
1128
1181
|
makeChainParams(
|
|
1129
|
-
[{ agent: "
|
|
1182
|
+
[{ agent: "worker", task: "Write to {chain_dir}" }],
|
|
1130
1183
|
agents,
|
|
1131
1184
|
),
|
|
1132
1185
|
);
|
|
@@ -1199,13 +1252,13 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
1199
1252
|
|
|
1200
1253
|
it("runs a 3-step chain end-to-end", async () => {
|
|
1201
1254
|
mockPi.onCall({ output: "Step output" });
|
|
1202
|
-
const agents = [makeAgent("
|
|
1255
|
+
const agents = [makeAgent("scout"), makeAgent("planner"), makeAgent("executor")];
|
|
1203
1256
|
|
|
1204
1257
|
const result = await executeChain(
|
|
1205
1258
|
makeChainParams(
|
|
1206
1259
|
[
|
|
1207
|
-
{ agent: "
|
|
1208
|
-
{ agent: "
|
|
1260
|
+
{ agent: "scout", task: "Survey the codebase" },
|
|
1261
|
+
{ agent: "planner" },
|
|
1209
1262
|
{ agent: "executor" },
|
|
1210
1263
|
],
|
|
1211
1264
|
agents,
|
|
@@ -1217,16 +1270,16 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
1217
1270
|
assert.ok(result.details.results.every((r) => r.exitCode === 0));
|
|
1218
1271
|
});
|
|
1219
1272
|
|
|
1220
|
-
it("runs a 40-step alternating
|
|
1273
|
+
it("runs a 40-step alternating worker and reviewer chain", async () => {
|
|
1221
1274
|
const chainLength = 40;
|
|
1222
1275
|
for (let i = 0; i < chainLength; i++) {
|
|
1223
1276
|
mockPi.onCall({ output: `step-${i}-output` });
|
|
1224
1277
|
}
|
|
1225
1278
|
const chain = Array.from({ length: chainLength }, (_, i): TestSequentialStep => ({
|
|
1226
|
-
agent: i % 2 === 0 ? "
|
|
1227
|
-
...(i === 0 ? { task: "Start long
|
|
1279
|
+
agent: i % 2 === 0 ? "worker" : "reviewer",
|
|
1280
|
+
...(i === 0 ? { task: "Start long worker/reviewer chain" } : {}),
|
|
1228
1281
|
}));
|
|
1229
|
-
const agents = [makeAgent("
|
|
1282
|
+
const agents = [makeAgent("worker"), makeAgent("reviewer")];
|
|
1230
1283
|
|
|
1231
1284
|
const result = await executeChain(makeChainParams(chain, agents));
|
|
1232
1285
|
|
|
@@ -1236,7 +1289,7 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
1236
1289
|
assert.equal(result.details.totalSteps, chainLength);
|
|
1237
1290
|
assert.equal(result.details.chainAgents?.length, chainLength);
|
|
1238
1291
|
assert.equal(result.details.workflowGraph?.nodes.length, chainLength);
|
|
1239
|
-
assert.equal(result.details.workflowGraph?.nodes.at(-1)?.agent, "
|
|
1292
|
+
assert.equal(result.details.workflowGraph?.nodes.at(-1)?.agent, "reviewer");
|
|
1240
1293
|
assert.equal(result.details.workflowGraph?.nodes.at(-1)?.flatIndex, chainLength - 1);
|
|
1241
1294
|
assert.ok(result.details.results.every((r) => r.exitCode === 0));
|
|
1242
1295
|
assert.deepEqual(
|
|
@@ -1251,11 +1304,11 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
1251
1304
|
});
|
|
1252
1305
|
|
|
1253
1306
|
it("returns error for unknown agent in chain", async () => {
|
|
1254
|
-
const agents = [makeAgent("
|
|
1307
|
+
const agents = [makeAgent("scout")];
|
|
1255
1308
|
|
|
1256
1309
|
const result = await executeChain(
|
|
1257
1310
|
makeChainParams(
|
|
1258
|
-
[{ agent: "
|
|
1311
|
+
[{ agent: "scout", task: "Start" }, { agent: "nonexistent" }],
|
|
1259
1312
|
agents,
|
|
1260
1313
|
),
|
|
1261
1314
|
);
|
|
@@ -1301,12 +1354,12 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
1301
1354
|
|
|
1302
1355
|
it("uses custom chainDir when provided", async () => {
|
|
1303
1356
|
mockPi.onCall({ output: "Done" });
|
|
1304
|
-
const agents = [makeAgent("
|
|
1357
|
+
const agents = [makeAgent("worker")];
|
|
1305
1358
|
const customChainDir = path.join(tempDir, "my-chain");
|
|
1306
1359
|
|
|
1307
1360
|
const result = await executeChain(
|
|
1308
1361
|
makeChainParams(
|
|
1309
|
-
[{ agent: "
|
|
1362
|
+
[{ agent: "worker", task: "Use {chain_dir}" }],
|
|
1310
1363
|
agents,
|
|
1311
1364
|
{ chainDir: customChainDir },
|
|
1312
1365
|
),
|
|
@@ -1323,11 +1376,11 @@ describe("chain execution — sequential", { skip: !available ? "pi packages not
|
|
|
1323
1376
|
delete process.env.SELESAI_SUBAGENT_MAX_DEPTH;
|
|
1324
1377
|
try {
|
|
1325
1378
|
mockPi.onCall({ echoEnv: ["SELESAI_SUBAGENT_DEPTH", "SELESAI_SUBAGENT_MAX_DEPTH"] });
|
|
1326
|
-
const agents = [makeAgent("
|
|
1379
|
+
const agents = [makeAgent("worker", { maxSubagentDepth: 1 })];
|
|
1327
1380
|
|
|
1328
1381
|
const result = await executeChain(
|
|
1329
1382
|
makeChainParams(
|
|
1330
|
-
[{ agent: "
|
|
1383
|
+
[{ agent: "worker", task: "Inspect env" }],
|
|
1331
1384
|
agents,
|
|
1332
1385
|
{ maxSubagentDepth: 3 },
|
|
1333
1386
|
),
|
|
@@ -1416,15 +1469,15 @@ describe("chain execution — parallel steps", { skip: !available ? "pi packages
|
|
|
1416
1469
|
|
|
1417
1470
|
it("runs parallel tasks within a chain step", async () => {
|
|
1418
1471
|
mockPi.onCall({ output: "Parallel task done" });
|
|
1419
|
-
const agents = [makeAgent("
|
|
1472
|
+
const agents = [makeAgent("reviewer-a"), makeAgent("reviewer-b")];
|
|
1420
1473
|
|
|
1421
1474
|
const result = await executeChain(
|
|
1422
1475
|
makeChainParams(
|
|
1423
1476
|
[
|
|
1424
1477
|
{
|
|
1425
1478
|
parallel: [
|
|
1426
|
-
{ agent: "
|
|
1427
|
-
{ agent: "
|
|
1479
|
+
{ agent: "reviewer-a", task: "Review auth module" },
|
|
1480
|
+
{ agent: "reviewer-b", task: "Review data layer" },
|
|
1428
1481
|
],
|
|
1429
1482
|
},
|
|
1430
1483
|
],
|
|
@@ -1440,13 +1493,13 @@ describe("chain execution — parallel steps", { skip: !available ? "pi packages
|
|
|
1440
1493
|
it("applies global permissions to foreground static parallel children", async () => {
|
|
1441
1494
|
mockPi.onCall({ echoEnv: [PERMISSION_POLICY_ENV, PERMISSION_AUDIT_PATH_ENV] });
|
|
1442
1495
|
mockPi.onCall({ echoEnv: [PERMISSION_POLICY_ENV, PERMISSION_AUDIT_PATH_ENV] });
|
|
1443
|
-
const agents = [makeAgent("
|
|
1496
|
+
const agents = [makeAgent("reviewer-a"), makeAgent("reviewer-b")];
|
|
1444
1497
|
|
|
1445
1498
|
const result = await executeChain!(makeChainParams(
|
|
1446
1499
|
[{
|
|
1447
1500
|
parallel: [
|
|
1448
|
-
{ agent: "
|
|
1449
|
-
{ agent: "
|
|
1501
|
+
{ agent: "reviewer-a", task: "Review A" },
|
|
1502
|
+
{ agent: "reviewer-b", task: "Review B" },
|
|
1450
1503
|
],
|
|
1451
1504
|
}],
|
|
1452
1505
|
agents,
|
|
@@ -1474,8 +1527,8 @@ describe("chain execution — parallel steps", { skip: !available ? "pi packages
|
|
|
1474
1527
|
const artifactsDir = path.join(tempDir, "artifacts");
|
|
1475
1528
|
const result = await executeChain(
|
|
1476
1529
|
makeChainParams(
|
|
1477
|
-
[{ parallel: [{ agent: "
|
|
1478
|
-
[makeAgent("
|
|
1530
|
+
[{ parallel: [{ agent: "reviewer-a", task: "Review in isolation" }], worktree: true }],
|
|
1531
|
+
[makeAgent("reviewer-a")],
|
|
1479
1532
|
{ runId, artifactsDir },
|
|
1480
1533
|
),
|
|
1481
1534
|
);
|
|
@@ -1488,7 +1541,7 @@ describe("chain execution — parallel steps", { skip: !available ? "pi packages
|
|
|
1488
1541
|
groups: Array<{ stepIndex: number; children: Array<{ agent: string; patch: { path: string } }>; cleanup: { state: string } }>;
|
|
1489
1542
|
};
|
|
1490
1543
|
assert.equal(handoff.groups[0]!.stepIndex, 0);
|
|
1491
|
-
assert.equal(handoff.groups[0]!.children[0]!.agent, "
|
|
1544
|
+
assert.equal(handoff.groups[0]!.children[0]!.agent, "reviewer-a");
|
|
1492
1545
|
assert.equal(handoff.groups[0]!.cleanup.state, "complete");
|
|
1493
1546
|
assert.equal(fs.existsSync(handoff.groups[0]!.children[0]!.patch.path), true);
|
|
1494
1547
|
assert.match(handoff.groups[0]!.children[0]!.patch.path, /worktree-diffs\/foreground-chain-handoff\/step-0\//);
|
|
@@ -1496,15 +1549,15 @@ describe("chain execution — parallel steps", { skip: !available ? "pi packages
|
|
|
1496
1549
|
|
|
1497
1550
|
it("aggregates parallel outputs for next sequential step", async () => {
|
|
1498
1551
|
mockPi.onCall({ output: "Review findings here" });
|
|
1499
|
-
const agents = [makeAgent("
|
|
1552
|
+
const agents = [makeAgent("reviewer-a"), makeAgent("reviewer-b"), makeAgent("synthesizer")];
|
|
1500
1553
|
|
|
1501
1554
|
const result = await executeChain(
|
|
1502
1555
|
makeChainParams(
|
|
1503
1556
|
[
|
|
1504
1557
|
{
|
|
1505
1558
|
parallel: [
|
|
1506
|
-
{ agent: "
|
|
1507
|
-
{ agent: "
|
|
1559
|
+
{ agent: "reviewer-a", task: "Review security" },
|
|
1560
|
+
{ agent: "reviewer-b", task: "Review performance" },
|
|
1508
1561
|
],
|
|
1509
1562
|
},
|
|
1510
1563
|
{ agent: "synthesizer" },
|
|
@@ -1515,14 +1568,15 @@ describe("chain execution — parallel steps", { skip: !available ? "pi packages
|
|
|
1515
1568
|
|
|
1516
1569
|
assert.ok(!result.isError);
|
|
1517
1570
|
assert.equal(result.details.results.length, 3);
|
|
1518
|
-
|
|
1571
|
+
assert.equal(result.details.results[2].task, "[prompt redacted]");
|
|
1572
|
+
const synthTask = readCallArgs(2).at(-1) ?? "";
|
|
1519
1573
|
assert.ok(
|
|
1520
|
-
synthTask.includes("=== Parallel Task 1 (
|
|
1521
|
-
"synthesizer should include
|
|
1574
|
+
synthTask.includes("=== Parallel Task 1 (reviewer-a) ==="),
|
|
1575
|
+
"synthesizer should include reviewer-a output block",
|
|
1522
1576
|
);
|
|
1523
1577
|
assert.ok(
|
|
1524
|
-
synthTask.includes("=== Parallel Task 2 (
|
|
1525
|
-
"synthesizer should include
|
|
1578
|
+
synthTask.includes("=== Parallel Task 2 (reviewer-b) ==="),
|
|
1579
|
+
"synthesizer should include reviewer-b output block",
|
|
1526
1580
|
);
|
|
1527
1581
|
});
|
|
1528
1582
|
|
|
@@ -1559,15 +1613,15 @@ describe("chain execution — parallel steps", { skip: !available ? "pi packages
|
|
|
1559
1613
|
mockPi.onCall({ matchArgIncludes: "Synthesize:", output: "Funnel synthesis" });
|
|
1560
1614
|
mockPi.onCall({ matchArgIncludes: "Review funnel A:", output: "Reviewer A done" });
|
|
1561
1615
|
mockPi.onCall({ matchArgIncludes: "Review funnel B:", output: "Reviewer B done" });
|
|
1562
|
-
const agents = [makeAgent("
|
|
1616
|
+
const agents = [makeAgent("scout-a"), makeAgent("scout-b"), makeAgent("synthesizer"), makeAgent("review-a"), makeAgent("review-b")];
|
|
1563
1617
|
|
|
1564
1618
|
const result = await executeChain(
|
|
1565
1619
|
makeChainParams(
|
|
1566
1620
|
[
|
|
1567
1621
|
{
|
|
1568
1622
|
parallel: [
|
|
1569
|
-
{ agent: "
|
|
1570
|
-
{ agent: "
|
|
1623
|
+
{ agent: "scout-a", task: "Scout API" },
|
|
1624
|
+
{ agent: "scout-b", task: "Scout UI" },
|
|
1571
1625
|
],
|
|
1572
1626
|
},
|
|
1573
1627
|
{ agent: "synthesizer", task: "Synthesize:\n{previous}" },
|
|
@@ -1583,12 +1637,12 @@ describe("chain execution — parallel steps", { skip: !available ? "pi packages
|
|
|
1583
1637
|
);
|
|
1584
1638
|
|
|
1585
1639
|
assert.ok(!result.isError, `should succeed: ${JSON.stringify(result.content)}`);
|
|
1586
|
-
assert.deepEqual(result.details.results.map((entry) => entry.agent), ["
|
|
1640
|
+
assert.deepEqual(result.details.results.map((entry) => entry.agent), ["scout-a", "scout-b", "synthesizer", "review-a", "review-b"]);
|
|
1587
1641
|
assert.equal(result.details.totalSteps, 3);
|
|
1588
1642
|
const funnelTask = readCallArgsMatching("Synthesize:").at(-1) ?? "";
|
|
1589
|
-
assert.match(funnelTask, /=== Parallel Task 1 \(
|
|
1643
|
+
assert.match(funnelTask, /=== Parallel Task 1 \(scout-a\) ===/);
|
|
1590
1644
|
assert.match(funnelTask, /Scout A findings/);
|
|
1591
|
-
assert.match(funnelTask, /=== Parallel Task 2 \(
|
|
1645
|
+
assert.match(funnelTask, /=== Parallel Task 2 \(scout-b\) ===/);
|
|
1592
1646
|
assert.match(funnelTask, /Scout B findings/);
|
|
1593
1647
|
const fanoutTaskA = readCallArgsMatching("Review funnel A:").at(-1) ?? "";
|
|
1594
1648
|
const fanoutTaskB = readCallArgsMatching("Review funnel B:").at(-1) ?? "";
|
|
@@ -1601,15 +1655,15 @@ describe("chain execution — parallel steps", { skip: !available ? "pi packages
|
|
|
1601
1655
|
|
|
1602
1656
|
it("aggregates file-only parallel outputs as file references for the next step", async () => {
|
|
1603
1657
|
mockPi.onCall({ output: "full parallel chain output\nwith details" });
|
|
1604
|
-
const agents = [makeAgent("
|
|
1658
|
+
const agents = [makeAgent("reviewer-a"), makeAgent("reviewer-b"), makeAgent("synthesizer")];
|
|
1605
1659
|
|
|
1606
1660
|
const result = await executeChain(
|
|
1607
1661
|
makeChainParams(
|
|
1608
1662
|
[
|
|
1609
1663
|
{
|
|
1610
1664
|
parallel: [
|
|
1611
|
-
{ agent: "
|
|
1612
|
-
{ agent: "
|
|
1665
|
+
{ agent: "reviewer-a", task: "Review A", output: "a.md", outputMode: "file-only" },
|
|
1666
|
+
{ agent: "reviewer-b", task: "Review B", output: "b.md", outputMode: "file-only" },
|
|
1613
1667
|
],
|
|
1614
1668
|
},
|
|
1615
1669
|
{ agent: "synthesizer" },
|
|
@@ -1629,14 +1683,14 @@ describe("chain execution — parallel steps", { skip: !available ? "pi packages
|
|
|
1629
1683
|
});
|
|
1630
1684
|
|
|
1631
1685
|
it("rejects chain parallel file-only output without spawning siblings", async () => {
|
|
1632
|
-
const agents = [makeAgent("
|
|
1686
|
+
const agents = [makeAgent("reviewer-a"), makeAgent("reviewer-b")];
|
|
1633
1687
|
|
|
1634
1688
|
const result = await executeChain(
|
|
1635
1689
|
makeChainParams(
|
|
1636
1690
|
[{
|
|
1637
1691
|
parallel: [
|
|
1638
|
-
{ agent: "
|
|
1639
|
-
{ agent: "
|
|
1692
|
+
{ agent: "reviewer-a", task: "Review A", outputMode: "file-only" },
|
|
1693
|
+
{ agent: "reviewer-b", task: "Review B", output: "b.md" },
|
|
1640
1694
|
],
|
|
1641
1695
|
}],
|
|
1642
1696
|
agents,
|
|
@@ -1779,12 +1833,12 @@ describe("chain execution — parallel steps", { skip: !available ? "pi packages
|
|
|
1779
1833
|
|
|
1780
1834
|
it("sequential → parallel → sequential (mixed chain)", async () => {
|
|
1781
1835
|
mockPi.onCall({ output: "Step complete" });
|
|
1782
|
-
const agents = [makeAgent("
|
|
1836
|
+
const agents = [makeAgent("scout"), makeAgent("rev-a"), makeAgent("rev-b"), makeAgent("writer")];
|
|
1783
1837
|
|
|
1784
1838
|
const result = await executeChain(
|
|
1785
1839
|
makeChainParams(
|
|
1786
1840
|
[
|
|
1787
|
-
{ agent: "
|
|
1841
|
+
{ agent: "scout", task: "Initial scan" },
|
|
1788
1842
|
{
|
|
1789
1843
|
parallel: [
|
|
1790
1844
|
{ agent: "rev-a", task: "Deep review A" },
|