@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
|
@@ -10,11 +10,12 @@ import { SUBAGENT_CHILD_ENV, SUBAGENT_FANOUT_CHILD_ENV } from "../../src/runs/sh
|
|
|
10
10
|
|
|
11
11
|
const projectRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..");
|
|
12
12
|
|
|
13
|
-
function parentToolEnv(): NodeJS.ProcessEnv {
|
|
13
|
+
function parentToolEnv(agentDir?: string): NodeJS.ProcessEnv {
|
|
14
14
|
const env = { ...process.env };
|
|
15
15
|
delete env[SUBAGENT_CHILD_ENV];
|
|
16
16
|
delete env[SUBAGENT_FANOUT_CHILD_ENV];
|
|
17
17
|
delete env[WAIT_TOOL_ENABLED_ENV];
|
|
18
|
+
if (agentDir) env.SELESAI_CODING_AGENT_DIR = agentDir;
|
|
18
19
|
return env;
|
|
19
20
|
}
|
|
20
21
|
|
|
@@ -71,7 +72,7 @@ describe("subagent extension child mode", () => {
|
|
|
71
72
|
);
|
|
72
73
|
});
|
|
73
74
|
|
|
74
|
-
it("renders only the public
|
|
75
|
+
it("renders only the public workflow execution mode", () => {
|
|
75
76
|
const script = String.raw`
|
|
76
77
|
import registerSubagentExtension from "./index.ts";
|
|
77
78
|
const events = { on() { return () => {}; }, emit() {} };
|
|
@@ -84,20 +85,16 @@ describe("subagent extension child mode", () => {
|
|
|
84
85
|
registerSubagentExtension(fakePi);
|
|
85
86
|
if (!registeredTool) throw new Error("tool not registered");
|
|
86
87
|
const theme = { fg(_name, text) { return text; }, bold(text) { return text; } };
|
|
87
|
-
const single = registeredTool.renderCall({ agent: "builder", async: true }, theme).text;
|
|
88
88
|
const workflow = registeredTool.renderCall({
|
|
89
|
-
workflowScript: "const scan = await runs.run('scan', {agent:'
|
|
89
|
+
workflowScript: "const scan = await runs.run('scan', {agent:'worker'}); return runs.all([{key:'correctness',agent:'reviewer'},{key:'tests',agent:'reviewer'}]);",
|
|
90
90
|
}, theme).text;
|
|
91
|
-
const foregroundWorkflow = registeredTool.renderCall({ workflowScript: "return runs.run('publish', {agent:'
|
|
92
|
-
const
|
|
93
|
-
const
|
|
94
|
-
const
|
|
95
|
-
const
|
|
96
|
-
const ordinaryKeyWorkflow = registeredTool.renderCall({ workflowScript: "const config = {key: 'secret'}; return runs.all([{agent: 'commentator', config: {key: 'nested'}, key: 'review'}]);" }, theme).text;
|
|
97
|
-
if (!single.includes("builder [async]")) throw new Error("expected async single badge, got " + single);
|
|
91
|
+
const foregroundWorkflow = registeredTool.renderCall({ workflowScript: "return runs.run('publish', {agent:'worker'});", async: false }, theme).text;
|
|
92
|
+
const templateWorkflow = registeredTool.renderCall({ workflowScript: "return runs.run(\`template\`, {agent:'worker'});", async: false }, theme).text;
|
|
93
|
+
const commentedWorkflow = registeredTool.renderCall({ workflowScript: "// runs.run('ignored', {agent:'worker'})\nconst note = \"key: 'also-ignored'\"; return runs.run('real', {agent:'worker'});" }, theme).text;
|
|
94
|
+
const dynamicKeyWorkflow = registeredTool.renderCall({ workflowScript: "return runs.all([{key: 'review-' + item, agent: 'reviewer'}]);" }, theme).text;
|
|
95
|
+
const ordinaryKeyWorkflow = registeredTool.renderCall({ workflowScript: "const config = {key: 'secret'}; return runs.all([{agent: 'reviewer', config: {key: 'nested'}, key: 'review'}]);" }, theme).text;
|
|
98
96
|
if (!workflow.includes("background · 3 lanes: scan, correctness, tests")) throw new Error("expected workflow manifest, got " + workflow);
|
|
99
97
|
if (!foregroundWorkflow.includes("foreground · 1 lane: publish")) throw new Error("expected foreground workflow manifest, got " + foregroundWorkflow);
|
|
100
|
-
if (!clarifiedWorkflow.includes("rejected: clarify UI unsupported")) throw new Error("expected clarified workflow rejection, got " + clarifiedWorkflow);
|
|
101
98
|
if (!templateWorkflow.includes("foreground · 1 lane: template")) throw new Error("expected static template lane, got " + templateWorkflow);
|
|
102
99
|
if (!commentedWorkflow.includes("background · 1 lane: real")) throw new Error("expected lexical lane filtering, got " + commentedWorkflow);
|
|
103
100
|
if (!dynamicKeyWorkflow.includes("workflow script · background")) throw new Error("expected dynamic key fallback, got " + dynamicKeyWorkflow);
|
|
@@ -123,10 +120,10 @@ describe("subagent extension child mode", () => {
|
|
|
123
120
|
registerSubagentExtension(fakePi);
|
|
124
121
|
const theme = { fg(_name, text) { return text; }, bold(text) { return text; } };
|
|
125
122
|
const result = registeredTool.renderCall({
|
|
126
|
-
workflowScript: "return runs.run('scan' /* stable lane */, {agent:'
|
|
123
|
+
workflowScript: "return runs.run('scan' /* stable lane */, {agent:'worker'});",
|
|
127
124
|
}, theme).text;
|
|
128
125
|
const explicitForeground = registeredTool.renderCall({
|
|
129
|
-
workflowScript: "return runs.run('publish', {agent:'
|
|
126
|
+
workflowScript: "return runs.run('publish', {agent:'worker'});",
|
|
130
127
|
async: false,
|
|
131
128
|
}, theme).text;
|
|
132
129
|
if (!result.includes("background · 1 lane: scan")) throw new Error("expected workflow executor background manifest, got " + result);
|
|
@@ -165,9 +162,41 @@ describe("subagent extension child mode", () => {
|
|
|
165
162
|
if (!error.includes("Retry the subagent call.")) throw new Error("error retry guidance was hidden: " + error);
|
|
166
163
|
if (error.includes("3 lines")) throw new Error("error was collapsed: " + error);
|
|
167
164
|
|
|
168
|
-
const success = render("Managed agents:\n-
|
|
165
|
+
const success = render("Managed agents:\n- reviewer\n- writer", false);
|
|
169
166
|
if (!success.includes("Managed agents: · 3 lines")) throw new Error("success summary was not collapsed: " + success);
|
|
170
|
-
if (success.includes("-
|
|
167
|
+
if (success.includes("- reviewer") || success.includes("- writer")) throw new Error("success details were not collapsed: " + success);
|
|
168
|
+
`;
|
|
169
|
+
|
|
170
|
+
execFileSync(
|
|
171
|
+
process.execPath,
|
|
172
|
+
[
|
|
173
|
+
"--experimental-strip-types",
|
|
174
|
+
"--import",
|
|
175
|
+
"./test/support/register-loader.mjs",
|
|
176
|
+
"--input-type=module",
|
|
177
|
+
"--eval",
|
|
178
|
+
script,
|
|
179
|
+
],
|
|
180
|
+
{ cwd: projectRoot, env: parentToolEnv(), stdio: "pipe" },
|
|
181
|
+
);
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
it("rejects blank action at the public executor boundary", () => {
|
|
185
|
+
const script = String.raw`
|
|
186
|
+
import registerSubagentExtension from "./index.ts";
|
|
187
|
+
const events = { on() { return () => {}; }, emit() {} };
|
|
188
|
+
let registeredTool;
|
|
189
|
+
const fakePi = new Proxy({
|
|
190
|
+
events,
|
|
191
|
+
registerTool(tool) { if (tool.name === "subagent") registeredTool = tool; },
|
|
192
|
+
registerCommand() {}, registerShortcut() {}, registerMessageRenderer() {}, sendMessage() {}, getSessionName() {},
|
|
193
|
+
}, { get(target, prop) { return prop in target ? target[prop] : () => undefined; } });
|
|
194
|
+
registerSubagentExtension(fakePi);
|
|
195
|
+
if (!registeredTool) throw new Error("tool not registered");
|
|
196
|
+
const result = await registeredTool.execute("blank-action", { action: "", agent: "reviewer" }, new AbortController().signal, undefined, { cwd: process.cwd(), hasUI: false });
|
|
197
|
+
if (!result.isError) throw new Error("blank action should be rejected");
|
|
198
|
+
const text = result.content?.[0]?.text ?? "";
|
|
199
|
+
if (!text.includes("action must be a non-empty")) throw new Error("unexpected blank action error: " + text);
|
|
171
200
|
`;
|
|
172
201
|
|
|
173
202
|
execFileSync(
|
|
@@ -208,9 +237,9 @@ describe("subagent extension child mode", () => {
|
|
|
208
237
|
details: {
|
|
209
238
|
mode: "single",
|
|
210
239
|
results: [{
|
|
211
|
-
agent: "
|
|
240
|
+
agent: "worker", task: "quiet", exitCode: 0, messages: [],
|
|
212
241
|
usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, turns: 0 },
|
|
213
|
-
progress: { status: "running", index: 0, agent: "
|
|
242
|
+
progress: { status: "running", index: 0, agent: "worker", toolCount: 0, tokens: 0, durationMs: 0 },
|
|
214
243
|
}],
|
|
215
244
|
},
|
|
216
245
|
}, { expanded: false }, { fg(_name, text) { return text; }, bold(text) { return text; } }, context);
|
|
@@ -255,15 +284,15 @@ describe("subagent extension child mode", () => {
|
|
|
255
284
|
if (!registeredTool) throw new Error("tool not registered");
|
|
256
285
|
const theme = { fg(_name, text) { return text; }, bold(text) { return text; } };
|
|
257
286
|
const base = {
|
|
258
|
-
agent: "
|
|
287
|
+
agent: "delegate", task: "quiet", messages: [],
|
|
259
288
|
usage: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0, turns: 0 },
|
|
260
289
|
};
|
|
261
290
|
const running = registeredTool.renderResult({
|
|
262
291
|
content: [{ type: "text", text: "partial output that must not appear" }],
|
|
263
|
-
details: { mode: "single", results: [{ ...base, exitCode: 0, progress: { status: "running", index: 0, agent: "
|
|
292
|
+
details: { mode: "single", results: [{ ...base, exitCode: 0, progress: { status: "running", index: 0, agent: "delegate", toolCount: 2, tokens: 300, durationMs: 20_000 } }] },
|
|
264
293
|
}, { expanded: false, isPartial: true }, theme, { state: {} }).render(120);
|
|
265
294
|
const asyncSingle = registeredTool.renderResult({
|
|
266
|
-
content: [{ type: "text", text: "Async:
|
|
295
|
+
content: [{ type: "text", text: "Async: delegate [single-run]" }],
|
|
267
296
|
details: { mode: "single", runId: "single-run", asyncId: "single-run", asyncDir: "/tmp/single-run", results: [] },
|
|
268
297
|
}, { expanded: false }, theme, { state: {} }).render(120);
|
|
269
298
|
const asyncChain = registeredTool.renderResult({
|
|
@@ -298,13 +327,13 @@ describe("subagent extension child mode", () => {
|
|
|
298
327
|
content: [{ type: "text", text: "Agent configuration is invalid." }],
|
|
299
328
|
details: { mode: "management", results: [] },
|
|
300
329
|
}, { expanded: false, isPartial: false }, theme, { isError: true, state: {} }).render(120);
|
|
301
|
-
if (running.length !== 1 || running[0] !== "●
|
|
330
|
+
if (running.length !== 1 || running[0] !== "● delegate · running") throw new Error("unexpected running summary: " + JSON.stringify(running));
|
|
302
331
|
if (asyncSingle.length !== 1 || asyncSingle[0] !== "● single · running") throw new Error("unexpected async single summary: " + JSON.stringify(asyncSingle));
|
|
303
332
|
if (asyncChain.length !== 1 || asyncChain[0] !== "● chain · running") throw new Error("unexpected async chain summary: " + JSON.stringify(asyncChain));
|
|
304
|
-
if (completed.length !== 1 || completed[0] !== "✓
|
|
305
|
-
if (stopped.length !== 1 || stopped[0] !== "■
|
|
306
|
-
if (paused.length !== 1 || paused[0] !== "■
|
|
307
|
-
if (failed.length !== 1 || failed[0] !== "✗
|
|
333
|
+
if (completed.length !== 1 || completed[0] !== "✓ delegate · completed") throw new Error("unexpected completed summary: " + JSON.stringify(completed));
|
|
334
|
+
if (stopped.length !== 1 || stopped[0] !== "■ delegate · stopped") throw new Error("unexpected stopped summary: " + JSON.stringify(stopped));
|
|
335
|
+
if (paused.length !== 1 || paused[0] !== "■ delegate · paused") throw new Error("unexpected paused summary: " + JSON.stringify(paused));
|
|
336
|
+
if (failed.length !== 1 || failed[0] !== "✗ delegate · failed") throw new Error("unexpected failed summary: " + JSON.stringify(failed));
|
|
308
337
|
if (failedWithPaused.length !== 1 || failedWithPaused[0] !== "✗ parallel · failed") throw new Error("unexpected paused aggregate summary: " + JSON.stringify(failedWithPaused));
|
|
309
338
|
if (failedWithStopped.length !== 1 || failedWithStopped[0] !== "✗ parallel · failed") throw new Error("unexpected stopped aggregate summary: " + JSON.stringify(failedWithStopped));
|
|
310
339
|
if (contextError.length !== 1 || contextError[0] !== "✗ management · failed") throw new Error("unexpected context error summary: " + JSON.stringify(contextError));
|
|
@@ -400,7 +429,7 @@ describe("subagent extension child mode", () => {
|
|
|
400
429
|
registerSubagentExtension(fakePi);
|
|
401
430
|
handlers.get("session_start")({}, ctx);
|
|
402
431
|
widgets.length = 0;
|
|
403
|
-
eventHandlers.get("subagent:async-started")({ id: "widget-run", pid: 1, sessionId: "session-widget", mode: "single", agent: "
|
|
432
|
+
eventHandlers.get("subagent:async-started")({ id: "widget-run", pid: 1, sessionId: "session-widget", mode: "single", agent: "worker", asyncDir: "/tmp/widget-run" });
|
|
404
433
|
handlers.get("tool_result")({ toolName: "subagent" }, ctx);
|
|
405
434
|
const asyncWidgets = widgets.filter((entry) => entry.key === "subagent-async");
|
|
406
435
|
if (asyncWidgets.length < 2 || asyncWidgets.some((entry) => entry.value !== undefined)) throw new Error("async widget rendered despite disabled config: " + JSON.stringify(asyncWidgets));
|
|
@@ -441,7 +470,7 @@ describe("subagent extension child mode", () => {
|
|
|
441
470
|
registerSubagentExtension(fakePi);
|
|
442
471
|
handlers.get("session_start")({}, ctx);
|
|
443
472
|
widgets.length = 0;
|
|
444
|
-
eventHandlers.get("subagent:async-started")({ id: "widget-run", pid: 1, sessionId: "session-widget", mode: "workflow", agent: "
|
|
473
|
+
eventHandlers.get("subagent:async-started")({ id: "widget-run", pid: 1, sessionId: "session-widget", mode: "workflow", agent: "worker", asyncDir: "/tmp/widget-run" });
|
|
445
474
|
handlers.get("tool_result")({ toolName: "subagent" }, ctx);
|
|
446
475
|
const asyncWidgets = widgets.filter((entry) => entry.key === "subagent-async");
|
|
447
476
|
if (!asyncWidgets.some((entry) => entry.value !== undefined)) throw new Error("async widget was not rendered with FleetView enabled: " + JSON.stringify(asyncWidgets));
|
|
@@ -455,11 +484,12 @@ describe("subagent extension child mode", () => {
|
|
|
455
484
|
}
|
|
456
485
|
});
|
|
457
486
|
|
|
458
|
-
it("restores
|
|
487
|
+
it("restores indexed active status after a management tool result", () => {
|
|
459
488
|
const script = String.raw`
|
|
460
489
|
import * as fs from "node:fs";
|
|
461
490
|
import * as path from "node:path";
|
|
462
491
|
import registerSubagentExtension from "./index.ts";
|
|
492
|
+
import { updateActiveRunIndex } from "./src/runs/background/active-run-index.ts";
|
|
463
493
|
import { DIRS } from "./src/shared/types.ts";
|
|
464
494
|
const eventHandlers = new Map();
|
|
465
495
|
const handlers = new Map();
|
|
@@ -489,6 +519,7 @@ describe("subagent extension child mode", () => {
|
|
|
489
519
|
runId, sessionId, mode: "workflow", state: "running",
|
|
490
520
|
startedAt: Date.now(), lastUpdate: Date.now(), cwd: process.cwd(), pid: process.pid,
|
|
491
521
|
}), "utf-8");
|
|
522
|
+
updateActiveRunIndex(asyncDir, "running");
|
|
492
523
|
handlers.get("tool_result")({ toolName: "subagent" }, ctx);
|
|
493
524
|
const fleetWidgets = widgets.filter((entry) => entry.key === "subagent-fleet-status");
|
|
494
525
|
if (!fleetWidgets.some((entry) => typeof entry.value === "function")) throw new Error("management result did not restore active fleet status: " + JSON.stringify(fleetWidgets));
|
|
@@ -544,7 +575,7 @@ describe("subagent extension child mode", () => {
|
|
|
544
575
|
handlers.get("session_start")({}, ctx);
|
|
545
576
|
sent.length = 0;
|
|
546
577
|
events.emit("subagent:async-complete", {
|
|
547
|
-
id: "shutdown-held-completion", agent: "
|
|
578
|
+
id: "shutdown-held-completion", agent: "worker", success: true, summary: "Done",
|
|
548
579
|
exitCode: 0, timestamp: Date.now(), sessionId: "notify-shutdown-session",
|
|
549
580
|
});
|
|
550
581
|
if (sent.length !== 0) throw new Error("completion was not queued before shutdown");
|
|
@@ -622,7 +653,7 @@ describe("subagent extension child mode", () => {
|
|
|
622
653
|
oldRuntime.sent.length = 0;
|
|
623
654
|
const timersBeforeOldCompletion = new Set(pendingTimers.keys());
|
|
624
655
|
oldRuntime.events.emit("subagent:async-complete", {
|
|
625
|
-
id: "reload-held-completion", agent: "
|
|
656
|
+
id: "reload-held-completion", agent: "worker", success: true, summary: "Old",
|
|
626
657
|
exitCode: 0, timestamp: Date.now(), sessionId: "notify-reload-old",
|
|
627
658
|
});
|
|
628
659
|
if (oldRuntime.sent.length !== 0) throw new Error("old completion was not queued before reload");
|
|
@@ -637,7 +668,7 @@ describe("subagent extension child mode", () => {
|
|
|
637
668
|
|
|
638
669
|
const timersBeforeNewCompletion = new Set(pendingTimers.keys());
|
|
639
670
|
newRuntime.events.emit("subagent:async-complete", {
|
|
640
|
-
id: "reload-new-completion", agent: "
|
|
671
|
+
id: "reload-new-completion", agent: "reviewer", success: true, summary: "New",
|
|
641
672
|
exitCode: 0, timestamp: Date.now(), sessionId: "notify-reload-new",
|
|
642
673
|
});
|
|
643
674
|
const newCompletionTimers = [...pendingTimers.entries()].filter(([token]) => !timersBeforeNewCompletion.has(token));
|
|
@@ -820,6 +851,37 @@ describe("subagent extension child mode", () => {
|
|
|
820
851
|
);
|
|
821
852
|
});
|
|
822
853
|
|
|
854
|
+
it("trims legacy chain controls from the child-safe fanout tool by default", () => {
|
|
855
|
+
const readRegisteredTool = (legacyChainControls: boolean): { description: string; properties: string[]; id: string; runId: string } => {
|
|
856
|
+
const agentDir = fs.mkdtempSync(path.join(os.tmpdir(), "pi-subagents-fanout-schema-"));
|
|
857
|
+
fs.mkdirSync(path.join(agentDir, "extensions", "subagent"), { recursive: true });
|
|
858
|
+
fs.writeFileSync(path.join(agentDir, "extensions", "subagent", "config.json"), JSON.stringify({ legacyChainControls }), "utf-8");
|
|
859
|
+
const script = String.raw`
|
|
860
|
+
import registerFanoutChildSubagentExtension from "./src/extension/fanout-child.ts";
|
|
861
|
+
import { SUBAGENT_CHILD_ENV, SUBAGENT_FANOUT_CHILD_ENV } from "./src/runs/shared/pi-args.ts";
|
|
862
|
+
process.env[SUBAGENT_CHILD_ENV] = "1";
|
|
863
|
+
process.env[SUBAGENT_FANOUT_CHILD_ENV] = "1";
|
|
864
|
+
let tool;
|
|
865
|
+
registerFanoutChildSubagentExtension({ events: { on() { return () => {}; }, emit() {} }, registerTool(value) { tool = value; }, getSessionName() { return undefined; } });
|
|
866
|
+
process.stdout.write(JSON.stringify({ description: tool.description, properties: Object.keys(tool.parameters.properties), id: tool.parameters.properties.id.description, runId: tool.parameters.properties.runId.description }));
|
|
867
|
+
`;
|
|
868
|
+
const output = execFileSync(process.execPath, ["--experimental-strip-types", "--import", "./test/support/register-loader.mjs", "--input-type=module", "--eval", script], {
|
|
869
|
+
cwd: projectRoot,
|
|
870
|
+
env: parentToolEnv(agentDir),
|
|
871
|
+
encoding: "utf-8",
|
|
872
|
+
});
|
|
873
|
+
return JSON.parse(output) as { description: string; properties: string[]; id: string; runId: string };
|
|
874
|
+
};
|
|
875
|
+
|
|
876
|
+
const trimmed = readRegisteredTool(false);
|
|
877
|
+
assert.equal(trimmed.properties.includes("step"), false);
|
|
878
|
+
assert.doesNotMatch(`${trimmed.description}\n${trimmed.id}\n${trimmed.runId}`, /append-step|approve-checkpoint|reject-checkpoint/);
|
|
879
|
+
|
|
880
|
+
const legacy = readRegisteredTool(true);
|
|
881
|
+
assert.equal(legacy.properties.includes("step"), true);
|
|
882
|
+
assert.match(`${legacy.description}\n${legacy.id}\n${legacy.runId}`, /append-step/);
|
|
883
|
+
});
|
|
884
|
+
|
|
823
885
|
it("lets fanout children call read-only list but blocks mutating management actions", () => {
|
|
824
886
|
const script = String.raw`
|
|
825
887
|
import registerFanoutChildSubagentExtension from "./src/extension/fanout-child.ts";
|
|
@@ -846,6 +908,10 @@ describe("subagent extension child mode", () => {
|
|
|
846
908
|
if (!create.isError) throw new Error("create should be blocked");
|
|
847
909
|
const text = create.content?.[0]?.text ?? "";
|
|
848
910
|
if (!text.includes("not available from child-safe subagent fanout mode")) throw new Error("unexpected create error: " + text);
|
|
911
|
+
const refine = await registeredTool.execute("refine-check", { action: "refine", agent: "worker" }, new AbortController().signal, undefined, ctx);
|
|
912
|
+
if (!refine.isError) throw new Error("refine should be blocked");
|
|
913
|
+
const refineText = refine.content?.[0]?.text ?? "";
|
|
914
|
+
if (!refineText.includes("not available from child-safe subagent fanout mode")) throw new Error("unexpected refine error: " + refineText);
|
|
849
915
|
const grant = await registeredTool.execute("grant-check", { action: "grant-spawn-budget", additional: 1 }, new AbortController().signal, undefined, { ...ctx, hasUI: true });
|
|
850
916
|
if (!grant.isError) throw new Error("grant-spawn-budget should be blocked");
|
|
851
917
|
const grantText = grant.content?.[0]?.text ?? "";
|
|
@@ -17,14 +17,14 @@ import {
|
|
|
17
17
|
|
|
18
18
|
function makeAgent(overrides: Partial<AgentConfig> = {}): AgentConfig {
|
|
19
19
|
return {
|
|
20
|
-
name: "
|
|
21
|
-
description: "Test
|
|
20
|
+
name: "worker",
|
|
21
|
+
description: "Test worker",
|
|
22
22
|
systemPrompt: "Base prompt",
|
|
23
23
|
systemPromptMode: "replace",
|
|
24
24
|
inheritProjectContext: false,
|
|
25
25
|
inheritSkills: false,
|
|
26
26
|
source: "user",
|
|
27
|
-
filePath: "/tmp/
|
|
27
|
+
filePath: "/tmp/worker.md",
|
|
28
28
|
...overrides,
|
|
29
29
|
};
|
|
30
30
|
}
|
|
@@ -44,7 +44,7 @@ describe("resolveIntercomBridgeMode", () => {
|
|
|
44
44
|
|
|
45
45
|
describe("resolveIntercomSessionTarget", () => {
|
|
46
46
|
it("prefers an explicit session name", () => {
|
|
47
|
-
assert.equal(resolveIntercomSessionTarget("
|
|
47
|
+
assert.equal(resolveIntercomSessionTarget("planner", "session-12345678", "session-stableabcdef"), "planner");
|
|
48
48
|
});
|
|
49
49
|
|
|
50
50
|
it("uses a runtime-only subagent chat alias when unnamed", () => {
|
|
@@ -52,13 +52,14 @@ describe("resolveIntercomSessionTarget", () => {
|
|
|
52
52
|
});
|
|
53
53
|
|
|
54
54
|
it("uses the current pi-intercom runtime id for unnamed fallback when present", () => {
|
|
55
|
-
assert.equal(resolveIntercomSessionTarget(undefined, "session-12345678", "session-stableabcdef"), "subagent-chat-
|
|
55
|
+
assert.equal(resolveIntercomSessionTarget(undefined, "session-12345678", "session-stableabcdef"), "subagent-chat-stableabcdef");
|
|
56
|
+
assert.equal(resolveIntercomSessionTarget(undefined, "session-12345678", "session-abcdefghijklmnopqrst"), "subagent-chat-abcdefghijklmnopqr");
|
|
56
57
|
});
|
|
57
58
|
});
|
|
58
59
|
|
|
59
60
|
describe("resolveSubagentIntercomTarget", () => {
|
|
60
61
|
it("builds stable child session targets from run metadata", () => {
|
|
61
|
-
assert.equal(resolveSubagentIntercomTarget("78f659a3", "
|
|
62
|
+
assert.equal(resolveSubagentIntercomTarget("78f659a3", "worker"), "subagent-worker-78f659a3");
|
|
62
63
|
assert.equal(resolveSubagentIntercomTarget("78f659a3", "senior executor", 1), "subagent-senior-executor-78f659a3-2");
|
|
63
64
|
});
|
|
64
65
|
});
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { describe, it } from "node:test";
|
|
3
|
+
import {
|
|
4
|
+
arbitrateCompletionGuardRescue,
|
|
5
|
+
createTaskMutationArbiter,
|
|
6
|
+
isCompletionGuardFailure,
|
|
7
|
+
maybeRescueCompletionGuardFailure,
|
|
8
|
+
type TaskMutationArbiter,
|
|
9
|
+
} from "../../src/runs/shared/llm-intent-arbiter.ts";
|
|
10
|
+
|
|
11
|
+
const GUARD_ERROR =
|
|
12
|
+
"Subagent completed without making edits for an implementation task.\nIt appears to have returned planning or scratchpad output instead of applying changes.";
|
|
13
|
+
|
|
14
|
+
function fakeCtx(overrides: { models?: Array<{ provider?: string; id?: string; api?: string }> } = {}) {
|
|
15
|
+
const models = overrides.models ?? [{ provider: "test", id: "model-1", api: "test-api" }];
|
|
16
|
+
return {
|
|
17
|
+
model: models[0],
|
|
18
|
+
modelRegistry: {
|
|
19
|
+
getAvailable: () => models,
|
|
20
|
+
getRegisteredProviderConfig: () => undefined,
|
|
21
|
+
},
|
|
22
|
+
} as never;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function stubArbiter(verdict: "read-only" | "implementation" | "unavailable" | "throw"): TaskMutationArbiter {
|
|
26
|
+
return async () => {
|
|
27
|
+
if (verdict === "throw") throw new Error("boom");
|
|
28
|
+
return verdict;
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
describe("arbitrateCompletionGuardRescue", () => {
|
|
33
|
+
it("rescues only a confident read-only verdict", async () => {
|
|
34
|
+
const rescued = await arbitrateCompletionGuardRescue({
|
|
35
|
+
guardTriggered: true,
|
|
36
|
+
task: "t",
|
|
37
|
+
arbiter: stubArbiter("read-only"),
|
|
38
|
+
});
|
|
39
|
+
assert.deepEqual(rescued, { triggered: false, rescued: true });
|
|
40
|
+
for (const verdict of ["implementation", "unavailable"] as const) {
|
|
41
|
+
const kept = await arbitrateCompletionGuardRescue({
|
|
42
|
+
guardTriggered: true,
|
|
43
|
+
task: "t",
|
|
44
|
+
arbiter: stubArbiter(verdict),
|
|
45
|
+
});
|
|
46
|
+
assert.deepEqual(kept, { triggered: true, rescued: false }, verdict);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it("keeps the guard verdict without an arbiter or on arbiter failure", async () => {
|
|
51
|
+
assert.deepEqual(
|
|
52
|
+
await arbitrateCompletionGuardRescue({ guardTriggered: true, task: "t" }),
|
|
53
|
+
{ triggered: true, rescued: false },
|
|
54
|
+
);
|
|
55
|
+
assert.deepEqual(
|
|
56
|
+
await arbitrateCompletionGuardRescue({ guardTriggered: true, task: "t", arbiter: stubArbiter("throw") }),
|
|
57
|
+
{ triggered: true, rescued: false },
|
|
58
|
+
);
|
|
59
|
+
assert.deepEqual(
|
|
60
|
+
await arbitrateCompletionGuardRescue({ guardTriggered: false, task: "t", arbiter: stubArbiter("read-only") }),
|
|
61
|
+
{ triggered: false, rescued: false },
|
|
62
|
+
);
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
describe("isCompletionGuardFailure", () => {
|
|
67
|
+
it("recognizes the guard error prefix", () => {
|
|
68
|
+
assert.equal(isCompletionGuardFailure({ error: GUARD_ERROR }), true);
|
|
69
|
+
assert.equal(isCompletionGuardFailure({ error: "Some other failure." }), false);
|
|
70
|
+
assert.equal(isCompletionGuardFailure({}), false);
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
describe("maybeRescueCompletionGuardFailure", () => {
|
|
75
|
+
it("keeps the failure without an arbiter", async () => {
|
|
76
|
+
const result = { exitCode: 1, error: GUARD_ERROR };
|
|
77
|
+
const rescued = await maybeRescueCompletionGuardFailure(result, "task", undefined);
|
|
78
|
+
assert.equal(rescued, false);
|
|
79
|
+
assert.equal(result.exitCode, 1);
|
|
80
|
+
assert.equal(result.error, GUARD_ERROR);
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
it("rescues only a confident read-only verdict", async () => {
|
|
84
|
+
for (const verdict of ["implementation", "unavailable"] as const) {
|
|
85
|
+
const result = { exitCode: 1, error: GUARD_ERROR };
|
|
86
|
+
const rescued = await maybeRescueCompletionGuardFailure(result, "task", stubArbiter(verdict));
|
|
87
|
+
assert.equal(rescued, false, verdict);
|
|
88
|
+
assert.equal(result.exitCode, 1);
|
|
89
|
+
assert.equal(result.error, GUARD_ERROR);
|
|
90
|
+
}
|
|
91
|
+
const result = { exitCode: 1, error: GUARD_ERROR };
|
|
92
|
+
const rescued = await maybeRescueCompletionGuardFailure(result, "task", stubArbiter("read-only"));
|
|
93
|
+
assert.equal(rescued, true);
|
|
94
|
+
assert.equal(result.exitCode, 0);
|
|
95
|
+
assert.equal(result.error, undefined);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it("fails closed when the arbiter throws", async () => {
|
|
99
|
+
const result = { exitCode: 1, error: GUARD_ERROR };
|
|
100
|
+
const rescued = await maybeRescueCompletionGuardFailure(result, "task", stubArbiter("throw"));
|
|
101
|
+
assert.equal(rescued, false);
|
|
102
|
+
assert.equal(result.exitCode, 1);
|
|
103
|
+
assert.equal(result.error, GUARD_ERROR);
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
it("does not touch unrelated failures", async () => {
|
|
107
|
+
const result = { exitCode: 1, error: "Something else broke." };
|
|
108
|
+
const rescued = await maybeRescueCompletionGuardFailure(result, "task", stubArbiter("read-only"));
|
|
109
|
+
assert.equal(rescued, false);
|
|
110
|
+
assert.equal(result.exitCode, 1);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
describe("createTaskMutationArbiter", () => {
|
|
115
|
+
it("is disabled by the env opt-out", () => {
|
|
116
|
+
const previous = process.env.SELESAI_SUBAGENTS_LLM_INTENT_ARBITER;
|
|
117
|
+
process.env.SELESAI_SUBAGENTS_LLM_INTENT_ARBITER = "0";
|
|
118
|
+
try {
|
|
119
|
+
assert.equal(createTaskMutationArbiter(fakeCtx()), undefined);
|
|
120
|
+
} finally {
|
|
121
|
+
if (previous === undefined) delete process.env.SELESAI_SUBAGENTS_LLM_INTENT_ARBITER;
|
|
122
|
+
else process.env.SELESAI_SUBAGENTS_LLM_INTENT_ARBITER = previous;
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it("returns undefined when no model can be resolved", () => {
|
|
127
|
+
assert.equal(createTaskMutationArbiter(fakeCtx({ models: [] })), undefined);
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it("returns a working arbiter bound to the host model", async () => {
|
|
131
|
+
const arbiter = createTaskMutationArbiter(fakeCtx(), {
|
|
132
|
+
streamFn: async () => {
|
|
133
|
+
throw new Error("not reached in this seam test");
|
|
134
|
+
},
|
|
135
|
+
});
|
|
136
|
+
assert.notEqual(arbiter, undefined);
|
|
137
|
+
// Without a scripted stream the underlying Agent call cannot succeed;
|
|
138
|
+
// the arbiter must degrade to "unavailable" rather than throw.
|
|
139
|
+
const verdict = await arbiter!("task");
|
|
140
|
+
assert.equal(verdict, "unavailable");
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
it("memoizes verdicts per task", async () => {
|
|
144
|
+
let streamCalls = 0;
|
|
145
|
+
const arbiter = createTaskMutationArbiter(fakeCtx(), {
|
|
146
|
+
streamFn: async () => {
|
|
147
|
+
streamCalls += 1;
|
|
148
|
+
throw new Error("fail");
|
|
149
|
+
},
|
|
150
|
+
})!;
|
|
151
|
+
const v1 = await arbiter("t");
|
|
152
|
+
const v2 = await arbiter("t");
|
|
153
|
+
assert.equal(v1, "unavailable");
|
|
154
|
+
assert.equal(v2, "unavailable");
|
|
155
|
+
assert.equal(streamCalls, 1);
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
it("uses the full task as the cache key", async () => {
|
|
159
|
+
let streamCalls = 0;
|
|
160
|
+
const arbiter = createTaskMutationArbiter(fakeCtx(), {
|
|
161
|
+
streamFn: async () => {
|
|
162
|
+
streamCalls += 1;
|
|
163
|
+
throw new Error("fail");
|
|
164
|
+
},
|
|
165
|
+
})!;
|
|
166
|
+
const prefix = "x".repeat(180);
|
|
167
|
+
await arbiter(`${prefix}A`);
|
|
168
|
+
await arbiter(`${prefix}B`);
|
|
169
|
+
assert.equal(streamCalls, 2);
|
|
170
|
+
});
|
|
171
|
+
});
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import * as fs from "node:fs";
|
|
3
|
+
import * as os from "node:os";
|
|
4
|
+
import * as path from "node:path";
|
|
5
|
+
import { describe, it } from "node:test";
|
|
6
|
+
import { handleMissionAction } from "../../src/missions/actions.ts";
|
|
7
|
+
import { collectGoalContinuationNotices } from "../../src/missions/goal-driver.ts";
|
|
8
|
+
import { createMission, readMission, resolveMissionStoreLocation, updateMission } from "../../src/missions/store.ts";
|
|
9
|
+
import { missionStatePath } from "../../src/missions/workflow-state.ts";
|
|
10
|
+
|
|
11
|
+
function fixture() {
|
|
12
|
+
const root = fs.mkdtempSync(path.join(os.tmpdir(), "pi-subagents-goal-mission-"));
|
|
13
|
+
const projectRoot = path.join(root, "project");
|
|
14
|
+
fs.mkdirSync(projectRoot, { recursive: true });
|
|
15
|
+
const location = resolveMissionStoreLocation({ projectRoot, agentDir: path.join(root, "agent") });
|
|
16
|
+
return { root, projectRoot, location };
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
describe("goal mission continuation", () => {
|
|
20
|
+
it("nudges from persisted state only while linked runs are idle and accounts their tokens", () => {
|
|
21
|
+
const test = fixture();
|
|
22
|
+
try {
|
|
23
|
+
const mission = createMission(test.location, {
|
|
24
|
+
title: "Ship auth refresh",
|
|
25
|
+
objective: "Implement and validate token refresh",
|
|
26
|
+
goal: true,
|
|
27
|
+
budget: { tokens: 100 },
|
|
28
|
+
status: "active",
|
|
29
|
+
ownerSessionId: "session-1",
|
|
30
|
+
});
|
|
31
|
+
fs.mkdirSync(path.dirname(missionStatePath(test.location, mission.id)), { recursive: true });
|
|
32
|
+
fs.writeFileSync(missionStatePath(test.location, mission.id), JSON.stringify({ lanes: { review: { status: "ready", action: "Review the token refresh diff" } } }));
|
|
33
|
+
|
|
34
|
+
const first = collectGoalContinuationNotices({ location: test.location, ownerSessionId: "session-1", retainedChildren: [], turnId: 1 });
|
|
35
|
+
assert.equal(first.length, 1);
|
|
36
|
+
assert.match(first[0]!.message, /Remaining budget: 100 tokens/);
|
|
37
|
+
assert.match(first[0]!.message, /Next ready action: Review the token refresh diff/);
|
|
38
|
+
|
|
39
|
+
const asyncDir = path.join(test.root, "run-1");
|
|
40
|
+
fs.mkdirSync(asyncDir);
|
|
41
|
+
fs.writeFileSync(path.join(asyncDir, "status.json"), JSON.stringify({ state: "running", totalTokens: { input: 10, output: 5, total: 15 } }));
|
|
42
|
+
updateMission(test.location, mission.id, { addRuns: [{ runId: "workflow-1", mode: "workflow", asyncDir, status: "running" }] });
|
|
43
|
+
assert.deepEqual(collectGoalContinuationNotices({ location: test.location, ownerSessionId: "session-1", retainedChildren: [], turnId: 2 }), []);
|
|
44
|
+
|
|
45
|
+
fs.writeFileSync(path.join(asyncDir, "status.json"), JSON.stringify({ state: "complete", totalTokens: { input: 25, output: 15, total: 40 } }));
|
|
46
|
+
const resumed = collectGoalContinuationNotices({
|
|
47
|
+
location: test.location,
|
|
48
|
+
ownerSessionId: "session-1",
|
|
49
|
+
retainedChildren: [{ runId: "child-review", parentRunId: "workflow-1", agent: "reviewer", taskSummary: "Review", completedAt: 1, sessionPath: "/tmp/child.jsonl" }],
|
|
50
|
+
turnId: 3,
|
|
51
|
+
});
|
|
52
|
+
assert.equal(resumed.length, 1);
|
|
53
|
+
assert.match(resumed[0]!.message, /Remaining budget: 60 tokens/);
|
|
54
|
+
assert.match(resumed[0]!.message, /Resume retained child child-review \(reviewer\)/);
|
|
55
|
+
assert.equal(readMission(test.location, mission.id).usage?.tokens, 40);
|
|
56
|
+
|
|
57
|
+
fs.writeFileSync(path.join(asyncDir, "status.json"), JSON.stringify({ state: "complete", totalTokens: { input: 60, output: 40, total: 100 } }));
|
|
58
|
+
assert.deepEqual(collectGoalContinuationNotices({ location: test.location, ownerSessionId: "session-1", retainedChildren: [], turnId: 4 }), []);
|
|
59
|
+
assert.equal(readMission(test.location, mission.id).goal?.status, "budget-exhausted");
|
|
60
|
+
assert.equal(readMission(test.location, mission.id).status, "active");
|
|
61
|
+
} finally {
|
|
62
|
+
fs.rmSync(test.root, { recursive: true, force: true });
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it("resumes retained children from the latest linked run", () => {
|
|
67
|
+
const test = fixture();
|
|
68
|
+
try {
|
|
69
|
+
const mission = createMission(test.location, {
|
|
70
|
+
title: "Ship auth refresh",
|
|
71
|
+
objective: "Implement and validate token refresh",
|
|
72
|
+
goal: true,
|
|
73
|
+
budget: { tokens: 100 },
|
|
74
|
+
status: "active",
|
|
75
|
+
ownerSessionId: "session-1",
|
|
76
|
+
});
|
|
77
|
+
updateMission(test.location, mission.id, {
|
|
78
|
+
addRuns: [
|
|
79
|
+
{ runId: "workflow-old", mode: "workflow", status: "complete" },
|
|
80
|
+
{ runId: "workflow-new", mode: "workflow", status: "complete" },
|
|
81
|
+
],
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
const notices = collectGoalContinuationNotices({
|
|
85
|
+
location: test.location,
|
|
86
|
+
ownerSessionId: "session-1",
|
|
87
|
+
retainedChildren: [
|
|
88
|
+
{ runId: "child-old", parentRunId: "workflow-old", agent: "reviewer", taskSummary: "Old", completedAt: 2, sessionPath: "/tmp/old.jsonl" },
|
|
89
|
+
{ runId: "child-new", parentRunId: "workflow-new", agent: "reviewer", taskSummary: "New", completedAt: 1, sessionPath: "/tmp/new.jsonl" },
|
|
90
|
+
],
|
|
91
|
+
turnId: 1,
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
assert.equal(notices.length, 1);
|
|
95
|
+
assert.match(notices[0]!.message, /Resume retained child child-new \(reviewer\)/);
|
|
96
|
+
assert.doesNotMatch(notices[0]!.message, /child-old/);
|
|
97
|
+
} finally {
|
|
98
|
+
fs.rmSync(test.root, { recursive: true, force: true });
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
it("supports pause, resume, and opt-out through mission.update", () => {
|
|
103
|
+
const test = fixture();
|
|
104
|
+
try {
|
|
105
|
+
const ctx = { cwd: test.projectRoot, agentDir: path.join(test.root, "agent"), currentSessionId: "session-1" };
|
|
106
|
+
const created = handleMissionAction("mission.create", { mission: { title: "Goal controls", objective: "Exercise controls", goal: true, budget: { tokens: 50 } } }, ctx);
|
|
107
|
+
const missionId = created.details!.missionId!;
|
|
108
|
+
assert.equal(handleMissionAction("mission.update", { missionId, missionUpdate: { goal: { paused: true } } }, ctx).details?.mission?.goal?.status, "paused");
|
|
109
|
+
assert.deepEqual(collectGoalContinuationNotices({ location: test.location, ownerSessionId: "session-1", retainedChildren: [], turnId: 1 }), []);
|
|
110
|
+
assert.equal(handleMissionAction("mission.update", { missionId, missionUpdate: { goal: { paused: false } } }, ctx).details?.mission?.goal?.status, "active");
|
|
111
|
+
assert.equal(handleMissionAction("mission.update", { missionId, missionUpdate: { goal: false } }, ctx).details?.mission?.goal, undefined);
|
|
112
|
+
} finally {
|
|
113
|
+
fs.rmSync(test.root, { recursive: true, force: true });
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
});
|