@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
|
@@ -2,24 +2,69 @@ import * as fs from "node:fs";
|
|
|
2
2
|
import * as path from "node:path";
|
|
3
3
|
import type { AgentToolResult } from "@earendil-works/pi-agent-core";
|
|
4
4
|
import { getMarkdownTheme, type ExtensionContext } from "@selesai/code";
|
|
5
|
-
import {
|
|
5
|
+
import { matchesKey, truncateToWidth, visibleWidth, wrapTextWithAnsi, type Component, type MarkdownTheme } from "@earendil-works/pi-tui";
|
|
6
6
|
import { getArtifactPaths, getArtifactsDir } from "../shared/artifacts.ts";
|
|
7
7
|
import { formatDuration, formatModelThinking, formatTokens, shortenPath } from "../shared/formatters.ts";
|
|
8
|
-
import { DIRS, type AsyncJobState, type Details, type ForegroundChildControl, type ForegroundResumeChild, type ForegroundResumeRun, type ForegroundRunControl, type SubagentState } from "../shared/types.ts";
|
|
8
|
+
import { DIRS, type AsyncJobState, type Details, type FleetKeybindingAction, type FleetKeybindingsConfig, type ForegroundChildControl, type ForegroundResumeChild, type ForegroundResumeRun, type ForegroundRunControl, type SubagentState } from "../shared/types.ts";
|
|
9
|
+
import { decodeUtf8Tail } from "../shared/utf8.ts";
|
|
9
10
|
import { readStatus } from "../shared/utils.ts";
|
|
10
11
|
import { formatAsyncRunTranscript } from "../runs/background/fleet-view.ts";
|
|
11
12
|
import { listAsyncRuns, type AsyncRunSummary } from "../runs/background/async-status.ts";
|
|
12
13
|
import { steerAsyncRun } from "../runs/foreground/async-steering-action.ts";
|
|
14
|
+
import type { SteerDeliveryMode } from "../runs/background/control-channel.ts";
|
|
13
15
|
import { stopAsyncRun } from "../runs/foreground/async-stop-action.ts";
|
|
14
16
|
import { contextModeBadge, contextModeLabel } from "../runs/shared/context-mode.ts";
|
|
15
17
|
import { FLEET_STATUS_WIDGET_KEY } from "./fleet-status.ts";
|
|
16
18
|
import { readFleetTranscript, renderFleetTranscript, type FleetTranscript } from "./fleet-transcript.ts";
|
|
17
19
|
import { handleHerdrInspectorAction } from "../inspectors/herdr/actions.ts";
|
|
20
|
+
import { getLivePromptAudit, type LivePromptAudit, type PromptAuditView } from "../runs/foreground/prompt-audit.ts";
|
|
18
21
|
|
|
19
22
|
const REFRESH_MS = 750;
|
|
20
23
|
const MAX_RECENT_ASYNC_RUNS = 20;
|
|
21
24
|
const MAX_FLEET_HISTORY_CANDIDATES = 100;
|
|
22
25
|
const TRANSCRIPT_LINES = 200;
|
|
26
|
+
const OUTPUT_TAIL_BYTES = 64 * 1024;
|
|
27
|
+
const PROMPT_AUDIT_SUMMARY_WIDTH = 160;
|
|
28
|
+
|
|
29
|
+
export const DEFAULT_FLEET_KEYBINDINGS: Record<FleetKeybindingAction, string[]> = {
|
|
30
|
+
close: ["escape", "ctrl+c", "q"],
|
|
31
|
+
scrollUp: ["K"],
|
|
32
|
+
scrollDown: ["J"],
|
|
33
|
+
selectUp: ["up", "k"],
|
|
34
|
+
selectDown: ["down", "j"],
|
|
35
|
+
selectFirst: ["home"],
|
|
36
|
+
selectLast: ["end"],
|
|
37
|
+
pageUp: ["pageUp"],
|
|
38
|
+
pageDown: ["pageDown"],
|
|
39
|
+
refresh: ["r", "R"],
|
|
40
|
+
steer: ["s"],
|
|
41
|
+
inspect: ["H"],
|
|
42
|
+
stop: ["D"],
|
|
43
|
+
toggleTools: ["x", "X", "ctrl+o"],
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
type ResolvedFleetKeybindings = Record<FleetKeybindingAction, string[]>;
|
|
47
|
+
|
|
48
|
+
export function resolveFleetKeybindings(config: FleetKeybindingsConfig | undefined): ResolvedFleetKeybindings {
|
|
49
|
+
return Object.fromEntries(
|
|
50
|
+
Object.entries(DEFAULT_FLEET_KEYBINDINGS).map(([action, defaults]) => [action, config?.[action as FleetKeybindingAction] ?? defaults]),
|
|
51
|
+
) as ResolvedFleetKeybindings;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function matchesFleetBinding(data: string, binding: string): boolean {
|
|
55
|
+
const key = /^[A-Z]$/.test(binding) ? `shift+${binding.toLowerCase()}` : binding;
|
|
56
|
+
return matchesKey(data, key as Parameters<typeof matchesKey>[1]);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function matchesFleetAction(data: string, bindings: ResolvedFleetKeybindings, action: FleetKeybindingAction): boolean {
|
|
60
|
+
return bindings[action].some((binding) => matchesFleetBinding(data, binding));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function bindingLabel(bindings: ResolvedFleetKeybindings, action: FleetKeybindingAction): string {
|
|
64
|
+
return bindings[action]
|
|
65
|
+
.map((binding) => binding === "up" ? "↑" : binding === "down" ? "↓" : binding === "escape" ? "Esc" : binding === "return" ? "Enter" : binding)
|
|
66
|
+
.join("/");
|
|
67
|
+
}
|
|
23
68
|
|
|
24
69
|
type Theme = ExtensionContext["ui"]["theme"];
|
|
25
70
|
type FleetTui = {
|
|
@@ -45,9 +90,10 @@ export interface FleetActionResult {
|
|
|
45
90
|
}
|
|
46
91
|
|
|
47
92
|
export interface FleetActionHandlers {
|
|
48
|
-
steer(input: { runId: string; asyncDir: string; index?: number; message: string }): Promise<FleetActionResult>;
|
|
93
|
+
steer(input: { runId: string; asyncDir: string; index?: number; message: string; mode: SteerDeliveryMode }): Promise<FleetActionResult>;
|
|
49
94
|
stop(input: { runId: string; asyncDir: string; index?: number }): Promise<FleetActionResult> | FleetActionResult;
|
|
50
95
|
inspect?(input: { runId: string; asyncDir: string; index?: number }): Promise<FleetActionResult>;
|
|
96
|
+
redoPrompt?(input: { runId: string; index: number; guidance: string; control?: ForegroundRunControl }): Promise<FleetActionResult>;
|
|
51
97
|
}
|
|
52
98
|
|
|
53
99
|
export interface FleetViewOptions {
|
|
@@ -56,7 +102,9 @@ export interface FleetViewOptions {
|
|
|
56
102
|
refreshMs?: number;
|
|
57
103
|
initialKey?: string;
|
|
58
104
|
markdownTheme?: MarkdownTheme;
|
|
105
|
+
fleetKeybindings?: FleetKeybindingsConfig;
|
|
59
106
|
actions?: FleetActionHandlers;
|
|
107
|
+
copyText?: (text: string) => Promise<void> | void;
|
|
60
108
|
}
|
|
61
109
|
|
|
62
110
|
function belongsToCurrentSession(sessionId: string | undefined, currentSessionId: string | null): boolean {
|
|
@@ -236,22 +284,62 @@ function statusGlyph(item: FleetItem, theme: Theme): string {
|
|
|
236
284
|
return theme.fg("error", "✗");
|
|
237
285
|
}
|
|
238
286
|
|
|
239
|
-
function
|
|
287
|
+
function foregroundPromptAuditCount(item: Extract<FleetItem, { kind: "foreground-active" }>, state: SubagentState): number {
|
|
288
|
+
if (!state.currentSessionId || item.control.sessionId !== state.currentSessionId) return 0;
|
|
289
|
+
if (!item.control.activeChildren) return getLivePromptAudit(item.control, item.index ?? 0) ? 1 : 0;
|
|
290
|
+
return [...item.control.activeChildren.keys()].filter((index) => getLivePromptAudit(item.control, index)).length;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
function authoredPromptSummary(text: string): string | undefined {
|
|
294
|
+
const summary = text.replace(/\s+/g, " ").trim();
|
|
295
|
+
return summary ? truncateToWidth(summary, PROMPT_AUDIT_SUMMARY_WIDTH, "…") : undefined;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
function foregroundAuthoredPromptSummary(item: Extract<FleetItem, { kind: "foreground-active" }>, state: SubagentState): string | undefined {
|
|
299
|
+
if (!state.currentSessionId || item.control.sessionId !== state.currentSessionId) return undefined;
|
|
300
|
+
const prompt = getLivePromptAudit(item.control, item.index ?? 0);
|
|
301
|
+
return prompt ? authoredPromptSummary(prompt.authoredTask) : undefined;
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
function promptAuditText(prompt: LivePromptAudit, view: PromptAuditView): string {
|
|
305
|
+
switch (view) {
|
|
306
|
+
case "authored": return prompt.authoredTask;
|
|
307
|
+
case "runtime": return prompt.runtimeAdditions;
|
|
308
|
+
case "effective": return prompt.finalEffectivePrompt;
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
function promptAuditViewLabel(view: PromptAuditView): string {
|
|
313
|
+
switch (view) {
|
|
314
|
+
case "authored": return "[1] Authored task";
|
|
315
|
+
case "runtime": return "[2] Runtime additions";
|
|
316
|
+
case "effective": return "[3] Final effective prompt";
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
function foregroundActiveDetail(item: Extract<FleetItem, { kind: "foreground-active" }>, state: SubagentState): string[] {
|
|
240
321
|
const { control } = item;
|
|
241
322
|
const live = item.activeChild ?? control;
|
|
242
323
|
const modelThinking = formatModelThinking(live.model, live.thinking);
|
|
324
|
+
const promptAuditCount = foregroundPromptAuditCount(item, state);
|
|
325
|
+
const promptSummary = foregroundAuthoredPromptSummary(item, state);
|
|
243
326
|
const lines = [
|
|
244
327
|
`Run: ${item.runId}`,
|
|
245
328
|
"Source: foreground",
|
|
246
329
|
`State: running`,
|
|
247
330
|
`Mode: ${control.mode}`,
|
|
331
|
+
control.parentWorkflowRunId ? `Workflow child of: ${control.parentWorkflowRunId}${control.workflowKey ? ` (${control.workflowKey})` : ""}` : undefined,
|
|
332
|
+
control.sourceRunId ? `Redo source: ${control.sourceRunId}` : undefined,
|
|
333
|
+
control.supersededByRunId ? `Superseded by: ${control.supersededByRunId}` : undefined,
|
|
248
334
|
item.index !== undefined ? `Child: ${item.index} (${item.agent})` : `Agent: ${item.agent}`,
|
|
249
335
|
modelThinking ? `Model: ${modelThinking}` : undefined,
|
|
336
|
+
promptSummary ? `Task: ${promptSummary}` : undefined,
|
|
250
337
|
`Started: ${new Date(live.startedAt).toISOString()}`,
|
|
251
338
|
live.currentTool ? `Current tool: ${live.currentTool}${live.currentPath ? ` · ${shortenPath(live.currentPath)}` : ""}` : undefined,
|
|
252
339
|
live.turnCount !== undefined ? `Turns: ${live.turnCount}` : undefined,
|
|
253
340
|
live.toolCount !== undefined ? `Tools: ${live.toolCount}` : undefined,
|
|
254
341
|
live.tokens !== undefined ? `Tokens: ${formatTokens(live.tokens)}` : undefined,
|
|
342
|
+
promptAuditCount > 0 ? `Prompt audit: ${promptAuditCount} live · 3 views · p opens` : undefined,
|
|
255
343
|
"",
|
|
256
344
|
"Transcript",
|
|
257
345
|
"Live foreground output remains in the expanded subagent tool result. Persisted output and session paths appear here after the child settles.",
|
|
@@ -259,7 +347,59 @@ function foregroundActiveDetail(item: Extract<FleetItem, { kind: "foreground-act
|
|
|
259
347
|
return lines.filter((line): line is string => line !== undefined);
|
|
260
348
|
}
|
|
261
349
|
|
|
262
|
-
function
|
|
350
|
+
function pathWithin(base: string, candidate: string): boolean {
|
|
351
|
+
const resolvedBase = path.resolve(base);
|
|
352
|
+
const resolvedCandidate = path.resolve(candidate);
|
|
353
|
+
return resolvedCandidate === resolvedBase || resolvedCandidate.startsWith(`${resolvedBase}${path.sep}`);
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
function trustedFileTail(filePath: string, trustedRoots: string[]): { text?: string; warning?: string; unavailable?: string } {
|
|
357
|
+
const resolvedPath = path.resolve(filePath);
|
|
358
|
+
if (trustedRoots.length === 0 || !trustedRoots.some((root) => pathWithin(root, resolvedPath))) return { warning: `output artifact is outside trusted roots: ${filePath}` };
|
|
359
|
+
let stat: fs.Stats;
|
|
360
|
+
try {
|
|
361
|
+
stat = fs.lstatSync(resolvedPath);
|
|
362
|
+
} catch (error) {
|
|
363
|
+
if (error && typeof error === "object" && "code" in error && error.code === "ENOENT") return { unavailable: `output artifact unavailable: ${filePath}` };
|
|
364
|
+
return { warning: `output artifact could not be inspected: ${error instanceof Error ? error.message : String(error)}` };
|
|
365
|
+
}
|
|
366
|
+
if (stat.isSymbolicLink()) return { warning: `output artifact refused a symlink: ${filePath}` };
|
|
367
|
+
if (!stat.isFile()) return { warning: `output artifact is not a file: ${filePath}` };
|
|
368
|
+
try {
|
|
369
|
+
const realPath = fs.realpathSync(resolvedPath);
|
|
370
|
+
const realRoots = trustedRoots.filter((root) => fs.existsSync(root)).map((root) => fs.realpathSync(root));
|
|
371
|
+
if (!realRoots.some((root) => pathWithin(root, realPath))) return { warning: `output artifact resolves outside trusted roots: ${filePath}` };
|
|
372
|
+
const fd = fs.openSync(realPath, "r");
|
|
373
|
+
try {
|
|
374
|
+
const bytes = Math.min(stat.size, OUTPUT_TAIL_BYTES);
|
|
375
|
+
const buffer = Buffer.alloc(bytes);
|
|
376
|
+
fs.readSync(fd, buffer, 0, bytes, stat.size - bytes);
|
|
377
|
+
return { text: decodeUtf8Tail(buffer) };
|
|
378
|
+
} finally {
|
|
379
|
+
fs.closeSync(fd);
|
|
380
|
+
}
|
|
381
|
+
} catch (error) {
|
|
382
|
+
return { warning: `output artifact could not be read: ${error instanceof Error ? error.message : String(error)}` };
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
function foregroundRecentOutputLines(item: Extract<FleetItem, { kind: "foreground-recent" }>, state: SubagentState): string[] {
|
|
387
|
+
const outputPath = item.child.artifactPaths?.outputPath ?? item.child.savedOutputPath;
|
|
388
|
+
const output = item.child.finalOutput
|
|
389
|
+
? { text: item.child.finalOutput }
|
|
390
|
+
: outputPath
|
|
391
|
+
? trustedFileTail(path.isAbsolute(outputPath) ? outputPath : path.resolve(item.run.cwd, outputPath), uniquePaths([
|
|
392
|
+
fleetArtifactsRoot(state, item.run.cwd),
|
|
393
|
+
fleetArtifactsRoot(state, state.baseCwd),
|
|
394
|
+
]))
|
|
395
|
+
: undefined;
|
|
396
|
+
if (output?.warning) return [`(${output.warning})`];
|
|
397
|
+
if (output?.unavailable) return [`(${output.unavailable})`];
|
|
398
|
+
const outputLines = (output?.text ?? "").split(/\r?\n/).filter((line) => line.trim()).slice(-TRANSCRIPT_LINES);
|
|
399
|
+
return outputLines.length ? outputLines : ["(no recovered output available)"];
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
function foregroundRecentDetail(item: Extract<FleetItem, { kind: "foreground-recent" }>, state: SubagentState): string[] {
|
|
263
403
|
const { child, run } = item;
|
|
264
404
|
const outputPath = child.artifactPaths?.outputPath ?? child.savedOutputPath;
|
|
265
405
|
const modelThinking = formatModelThinking(child.model, child.thinking);
|
|
@@ -280,8 +420,7 @@ function foregroundRecentDetail(item: Extract<FleetItem, { kind: "foreground-rec
|
|
|
280
420
|
"",
|
|
281
421
|
"Result transcript tail",
|
|
282
422
|
];
|
|
283
|
-
|
|
284
|
-
lines.push(...(outputLines.length ? outputLines : ["(no recovered output available)"]));
|
|
423
|
+
lines.push(...foregroundRecentOutputLines(item, state));
|
|
285
424
|
return lines.filter((line): line is string => line !== undefined);
|
|
286
425
|
}
|
|
287
426
|
|
|
@@ -305,12 +444,12 @@ function asyncDetail(item: Extract<FleetItem, { kind: "async" }>): string[] {
|
|
|
305
444
|
].filter((line): line is string => line !== undefined);
|
|
306
445
|
}
|
|
307
446
|
|
|
308
|
-
function detailLines(item: FleetItem | undefined, error: string | undefined): string[] {
|
|
447
|
+
function detailLines(item: FleetItem | undefined, error: string | undefined, state: SubagentState): string[] {
|
|
309
448
|
if (!item) return [error ? `Fleet scan failed: ${error}` : "No current-session foreground or recent async children.", "", "New runs appear here automatically while this inspector remains open."];
|
|
310
449
|
const lines = item.kind === "foreground-active"
|
|
311
|
-
? foregroundActiveDetail(item)
|
|
450
|
+
? foregroundActiveDetail(item, state)
|
|
312
451
|
: item.kind === "foreground-recent"
|
|
313
|
-
? foregroundRecentDetail(item)
|
|
452
|
+
? foregroundRecentDetail(item, state)
|
|
314
453
|
: asyncDetail(item);
|
|
315
454
|
if (error) lines.unshift(`Fleet scan warning: ${error}`, "");
|
|
316
455
|
return lines;
|
|
@@ -421,7 +560,7 @@ function itemStats(item: FleetItem): string[] {
|
|
|
421
560
|
].filter((value): value is string => Boolean(value));
|
|
422
561
|
}
|
|
423
562
|
|
|
424
|
-
function structuredHeader(item: FleetItem, width: number, theme: Theme, conversationState: string): string[] {
|
|
563
|
+
function structuredHeader(item: FleetItem, width: number, theme: Theme, conversationState: string, promptSummary?: string): string[] {
|
|
425
564
|
const lines: string[] = [];
|
|
426
565
|
lines.push(rightAligned(` ${statusGlyph(item, theme)} ${theme.bold(item.agent)}`, theme.fg("dim", item.state), width));
|
|
427
566
|
const child = item.index !== undefined ? ` · child ${item.index + 1}` : "";
|
|
@@ -430,10 +569,7 @@ function structuredHeader(item: FleetItem, width: number, theme: Theme, conversa
|
|
|
430
569
|
lines.push(` ${theme.fg("dim", identity)}`);
|
|
431
570
|
const stats = itemStats(item);
|
|
432
571
|
if (stats.length) lines.push(` ${theme.fg("muted", stats.join(" · "))}`);
|
|
433
|
-
if (
|
|
434
|
-
const task = item.description.replace(/\s+/g, " ").trim();
|
|
435
|
-
lines.push(` ${theme.fg("dim", "Task")} ${task}`);
|
|
436
|
-
}
|
|
572
|
+
if (promptSummary) lines.push(` ${theme.fg("muted", `Task: ${promptSummary}`)}`);
|
|
437
573
|
lines.push(`${theme.fg("accent", "Conversation")} ${theme.fg("dim", `· ${conversationState}`)}`);
|
|
438
574
|
return lines.map((line) => truncateToWidth(line, width));
|
|
439
575
|
}
|
|
@@ -482,8 +618,12 @@ export class SubagentFleetComponent implements Component {
|
|
|
482
618
|
private detailViewportHeight = 8;
|
|
483
619
|
private bodyHeight = 8;
|
|
484
620
|
private expandedTools = false;
|
|
621
|
+
private promptAuditOpen = false;
|
|
622
|
+
private promptAuditView: PromptAuditView = "authored";
|
|
485
623
|
private actionNotice: FleetActionResult | undefined;
|
|
486
624
|
private steerDraft: string | undefined;
|
|
625
|
+
private redoGuidanceDraft: string | undefined;
|
|
626
|
+
private steerMode: SteerDeliveryMode = "steer";
|
|
487
627
|
private stopConfirming = false;
|
|
488
628
|
private actionBusy = false;
|
|
489
629
|
private transcriptCache: FleetTranscriptCache | undefined;
|
|
@@ -495,6 +635,7 @@ export class SubagentFleetComponent implements Component {
|
|
|
495
635
|
private readonly state: SubagentState;
|
|
496
636
|
private readonly done: (result: undefined) => void;
|
|
497
637
|
private readonly options: FleetViewOptions;
|
|
638
|
+
private readonly keybindings: ResolvedFleetKeybindings;
|
|
498
639
|
|
|
499
640
|
constructor(
|
|
500
641
|
tui: FleetTui,
|
|
@@ -509,6 +650,7 @@ export class SubagentFleetComponent implements Component {
|
|
|
509
650
|
this.state = state;
|
|
510
651
|
this.done = done;
|
|
511
652
|
this.options = options;
|
|
653
|
+
this.keybindings = resolveFleetKeybindings(options.fleetKeybindings);
|
|
512
654
|
this.selectedKey = options.initialKey;
|
|
513
655
|
this.refresh();
|
|
514
656
|
this.timer = setInterval(() => {
|
|
@@ -536,8 +678,46 @@ export class SubagentFleetComponent implements Component {
|
|
|
536
678
|
this.tui.requestRender();
|
|
537
679
|
}
|
|
538
680
|
|
|
681
|
+
private selectedPromptAudit(): LivePromptAudit | undefined {
|
|
682
|
+
const item = this.snapshot.items[this.selected];
|
|
683
|
+
if (item?.kind !== "foreground-active") return undefined;
|
|
684
|
+
if (!this.state.currentSessionId || item.control.sessionId !== this.state.currentSessionId) return undefined;
|
|
685
|
+
return getLivePromptAudit(item.control, item.index ?? 0);
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
private promptAuditItems(): Array<{ item: Extract<FleetItem, { kind: "foreground-active" }>; prompt: LivePromptAudit }> {
|
|
689
|
+
const selected = this.snapshot.items[this.selected];
|
|
690
|
+
if (selected?.kind !== "foreground-active" || !this.state.currentSessionId || selected.control.sessionId !== this.state.currentSessionId) return [];
|
|
691
|
+
return this.snapshot.items.flatMap((item) => {
|
|
692
|
+
if (item.kind !== "foreground-active" || item.control !== selected.control) return [];
|
|
693
|
+
const prompt = getLivePromptAudit(item.control, item.index ?? 0);
|
|
694
|
+
return prompt ? [{ item, prompt }] : [];
|
|
695
|
+
});
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
private selectedPromptText(): string | undefined {
|
|
699
|
+
const prompt = this.selectedPromptAudit();
|
|
700
|
+
return prompt ? promptAuditText(prompt, this.promptAuditView) : undefined;
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
private movePromptSelection(delta: number): void {
|
|
704
|
+
const items = this.promptAuditItems();
|
|
705
|
+
if (items.length === 0) return;
|
|
706
|
+
const currentKey = this.snapshot.items[this.selected]?.key;
|
|
707
|
+
const current = Math.max(0, items.findIndex(({ item }) => item.key === currentKey));
|
|
708
|
+
const target = items[Math.max(0, Math.min(items.length - 1, current + delta))]?.item;
|
|
709
|
+
if (!target) return;
|
|
710
|
+
this.selected = this.snapshot.items.findIndex((item) => item.key === target.key);
|
|
711
|
+
this.selectedKey = target.key;
|
|
712
|
+
this.detailScroll = 0;
|
|
713
|
+
this.detailAutoFollow = false;
|
|
714
|
+
this.tui.requestRender();
|
|
715
|
+
}
|
|
716
|
+
|
|
539
717
|
private resetActionInput(): void {
|
|
540
718
|
this.steerDraft = undefined;
|
|
719
|
+
this.redoGuidanceDraft = undefined;
|
|
720
|
+
this.steerMode = "steer";
|
|
541
721
|
this.stopConfirming = false;
|
|
542
722
|
}
|
|
543
723
|
|
|
@@ -549,12 +729,28 @@ export class SubagentFleetComponent implements Component {
|
|
|
549
729
|
return { item };
|
|
550
730
|
}
|
|
551
731
|
|
|
732
|
+
private selectedHerdrInspectAction(): { runId: string; asyncDir: string; index?: number } | { reason: string } {
|
|
733
|
+
const item = this.snapshot.items[this.selected];
|
|
734
|
+
if (!item) return { reason: "No child is selected." };
|
|
735
|
+
if (item.kind === "async") {
|
|
736
|
+
if (!isActionableAsyncState(item.run.state) || !isActionableAsyncState(item.state)) return { reason: `Selected child is ${item.state}; controls require a running or queued async child.` };
|
|
737
|
+
return { runId: item.runId, asyncDir: item.run.asyncDir, ...(item.index !== undefined ? { index: item.index } : {}) };
|
|
738
|
+
}
|
|
739
|
+
if (item.kind !== "foreground-active" || !item.control.parentWorkflowRunId) return { reason: "Fleet controls are available for current-session top-level async runs only." };
|
|
740
|
+
const parent = this.state.asyncJobs.get(item.control.parentWorkflowRunId) ?? this.state.fleetJobs?.get(item.control.parentWorkflowRunId);
|
|
741
|
+
if (!parent || !isActionableAsyncState(parent.status)) return { reason: "The parent workflow is no longer available for Herdr inspection." };
|
|
742
|
+
return { runId: parent.asyncId, asyncDir: parent.asyncDir };
|
|
743
|
+
}
|
|
744
|
+
|
|
552
745
|
private actionLines(): string[] {
|
|
553
746
|
const lines: string[] = [];
|
|
554
747
|
if (this.actionBusy) lines.push(this.theme.fg("accent", "Action pending..."));
|
|
555
748
|
if (this.steerDraft !== undefined) {
|
|
556
|
-
lines.push(this.theme.fg("accent", `Steer message: ${this.steerDraft}${this.theme.fg("dim", "▌")}`));
|
|
557
|
-
lines.push(this.theme.fg("dim", "Enter sends · Esc cancels · Backspace edits"));
|
|
749
|
+
lines.push(this.theme.fg("accent", `Steer message (${this.steerMode}): ${this.steerDraft}${this.theme.fg("dim", "▌")}`));
|
|
750
|
+
lines.push(this.theme.fg("dim", "Enter sends · Tab changes mode · Esc cancels · Backspace edits"));
|
|
751
|
+
} else if (this.redoGuidanceDraft !== undefined) {
|
|
752
|
+
lines.push(this.theme.fg("accent", `Redo guidance: ${this.redoGuidanceDraft}${this.theme.fg("dim", "▌")}`));
|
|
753
|
+
lines.push(this.theme.fg("dim", "Enter rewrites and reruns · Esc cancels · Backspace edits"));
|
|
558
754
|
} else if (this.stopConfirming) {
|
|
559
755
|
const selected = this.snapshot.items[this.selected];
|
|
560
756
|
lines.push(this.theme.fg("warning", `Confirm stop for async run ${selected?.runId ?? "selected run"}?`));
|
|
@@ -601,6 +797,82 @@ export class SubagentFleetComponent implements Component {
|
|
|
601
797
|
}
|
|
602
798
|
|
|
603
799
|
handleInput(data: string): void {
|
|
800
|
+
if (this.promptAuditOpen && this.redoGuidanceDraft !== undefined) {
|
|
801
|
+
if (matchesKey(data, "escape") || matchesKey(data, "ctrl+c")) {
|
|
802
|
+
this.resetActionInput();
|
|
803
|
+
this.tui.requestRender();
|
|
804
|
+
return;
|
|
805
|
+
}
|
|
806
|
+
if (matchesKey(data, "return") || data === "\r" || data === "\n") {
|
|
807
|
+
const guidance = this.redoGuidanceDraft.trim();
|
|
808
|
+
if (!guidance) {
|
|
809
|
+
this.setActionNotice({ text: "Redo guidance cannot be empty.", isError: true });
|
|
810
|
+
return;
|
|
811
|
+
}
|
|
812
|
+
const selected = this.snapshot.items[this.selected];
|
|
813
|
+
if (selected?.kind !== "foreground-active" || !this.options.actions?.redoPrompt) {
|
|
814
|
+
this.setActionNotice({ text: "Redo is unavailable for this prompt.", isError: true });
|
|
815
|
+
return;
|
|
816
|
+
}
|
|
817
|
+
this.runAction(() => this.options.actions!.redoPrompt!({ runId: selected.runId, index: selected.index ?? 0, guidance, control: selected.control }));
|
|
818
|
+
return;
|
|
819
|
+
}
|
|
820
|
+
if (matchesKey(data, "backspace") || data === "\x7f") {
|
|
821
|
+
this.redoGuidanceDraft = this.redoGuidanceDraft.slice(0, -1);
|
|
822
|
+
this.tui.requestRender();
|
|
823
|
+
return;
|
|
824
|
+
}
|
|
825
|
+
if (data.length === 1 && data >= " " && data !== "\x7f") {
|
|
826
|
+
this.redoGuidanceDraft += data;
|
|
827
|
+
this.tui.requestRender();
|
|
828
|
+
}
|
|
829
|
+
return;
|
|
830
|
+
}
|
|
831
|
+
if (this.promptAuditOpen) {
|
|
832
|
+
if (matchesKey(data, "escape") || matchesKey(data, "ctrl+c")) {
|
|
833
|
+
this.promptAuditOpen = false;
|
|
834
|
+
this.detailAutoFollow = true;
|
|
835
|
+
this.tui.requestRender();
|
|
836
|
+
return;
|
|
837
|
+
}
|
|
838
|
+
if (data === "j") return this.movePromptSelection(1);
|
|
839
|
+
if (data === "k") return this.movePromptSelection(-1);
|
|
840
|
+
if (data === "1" || data === "2" || data === "3") {
|
|
841
|
+
this.promptAuditView = data === "1" ? "authored" : data === "2" ? "runtime" : "effective";
|
|
842
|
+
this.detailScroll = 0;
|
|
843
|
+
this.tui.requestRender();
|
|
844
|
+
return;
|
|
845
|
+
}
|
|
846
|
+
if (data === "g") {
|
|
847
|
+
const prompt = this.selectedPromptAudit();
|
|
848
|
+
if (!prompt) this.setActionNotice({ text: "Prompt Audit is available only for a live child owned by this session.", isError: true });
|
|
849
|
+
else if (!prompt.rerun) this.setActionNotice({ text: "Redo is not safe for this prompt in this slice.", isError: true });
|
|
850
|
+
else if (!this.options.actions?.redoPrompt) this.setActionNotice({ text: "Redo controls are unavailable in this context.", isError: true });
|
|
851
|
+
else {
|
|
852
|
+
this.actionNotice = undefined;
|
|
853
|
+
this.redoGuidanceDraft = "";
|
|
854
|
+
this.detailAutoFollow = false;
|
|
855
|
+
this.detailScroll = 0;
|
|
856
|
+
this.tui.requestRender();
|
|
857
|
+
}
|
|
858
|
+
return;
|
|
859
|
+
}
|
|
860
|
+
if (data === "c") {
|
|
861
|
+
const text = this.selectedPromptText();
|
|
862
|
+
if (!text) this.setActionNotice({ text: "No prompt view is available to copy.", isError: true });
|
|
863
|
+
else if (!this.options.copyText) this.setActionNotice({ text: "Clipboard is unavailable in this context.", isError: true });
|
|
864
|
+
else this.runAction(async () => {
|
|
865
|
+
await this.options.copyText!(text);
|
|
866
|
+
return { text: "Copied visible prompt view." };
|
|
867
|
+
});
|
|
868
|
+
return;
|
|
869
|
+
}
|
|
870
|
+
if (matchesFleetAction(data, this.keybindings, "scrollUp")) return this.scrollDetail(-1);
|
|
871
|
+
if (matchesFleetAction(data, this.keybindings, "scrollDown")) return this.scrollDetail(1);
|
|
872
|
+
if (matchesFleetAction(data, this.keybindings, "pageUp")) return this.scrollDetail(-this.detailViewportHeight);
|
|
873
|
+
if (matchesFleetAction(data, this.keybindings, "pageDown")) return this.scrollDetail(this.detailViewportHeight);
|
|
874
|
+
return;
|
|
875
|
+
}
|
|
604
876
|
if (this.steerDraft !== undefined) {
|
|
605
877
|
if (matchesKey(data, "escape") || matchesKey(data, "ctrl+c")) {
|
|
606
878
|
this.resetActionInput();
|
|
@@ -618,7 +890,13 @@ export class SubagentFleetComponent implements Component {
|
|
|
618
890
|
this.setActionNotice({ text: "reason" in target ? target.reason : "Fleet controls are unavailable in this context.", isError: true });
|
|
619
891
|
return;
|
|
620
892
|
}
|
|
621
|
-
this.runAction(() => this.options.actions!.steer({ runId: target.item.runId, asyncDir: target.item.run.asyncDir, ...(target.item.index !== undefined ? { index: target.item.index } : {}), message }));
|
|
893
|
+
this.runAction(() => this.options.actions!.steer({ runId: target.item.runId, asyncDir: target.item.run.asyncDir, ...(target.item.index !== undefined ? { index: target.item.index } : {}), message, mode: this.steerMode }));
|
|
894
|
+
return;
|
|
895
|
+
}
|
|
896
|
+
if (matchesKey(data, "tab") || data === "\t") {
|
|
897
|
+
const modes: SteerDeliveryMode[] = ["steer", "follow_up", "auto"];
|
|
898
|
+
this.steerMode = modes[(modes.indexOf(this.steerMode) + 1) % modes.length]!;
|
|
899
|
+
this.tui.requestRender();
|
|
622
900
|
return;
|
|
623
901
|
}
|
|
624
902
|
if (matchesKey(data, "backspace") || data === "\x7f") {
|
|
@@ -648,25 +926,37 @@ export class SubagentFleetComponent implements Component {
|
|
|
648
926
|
}
|
|
649
927
|
return;
|
|
650
928
|
}
|
|
651
|
-
if (
|
|
929
|
+
if (matchesFleetAction(data, this.keybindings, "close")) {
|
|
652
930
|
this.done(undefined);
|
|
653
931
|
return;
|
|
654
932
|
}
|
|
655
|
-
if (
|
|
656
|
-
if (
|
|
657
|
-
if (
|
|
658
|
-
if (
|
|
659
|
-
if (
|
|
660
|
-
if (
|
|
661
|
-
if (
|
|
662
|
-
if (
|
|
663
|
-
if (data.
|
|
933
|
+
if (matchesFleetAction(data, this.keybindings, "scrollUp")) return this.scrollDetail(-1);
|
|
934
|
+
if (matchesFleetAction(data, this.keybindings, "scrollDown")) return this.scrollDetail(1);
|
|
935
|
+
if (matchesFleetAction(data, this.keybindings, "selectUp")) return this.moveSelection(-1);
|
|
936
|
+
if (matchesFleetAction(data, this.keybindings, "selectDown")) return this.moveSelection(1);
|
|
937
|
+
if (matchesFleetAction(data, this.keybindings, "selectFirst")) return this.moveSelection(-this.snapshot.items.length);
|
|
938
|
+
if (matchesFleetAction(data, this.keybindings, "selectLast")) return this.moveSelection(this.snapshot.items.length);
|
|
939
|
+
if (matchesFleetAction(data, this.keybindings, "pageUp")) return this.scrollDetail(-this.detailViewportHeight);
|
|
940
|
+
if (matchesFleetAction(data, this.keybindings, "pageDown")) return this.scrollDetail(this.detailViewportHeight);
|
|
941
|
+
if (matchesFleetAction(data, this.keybindings, "refresh")) {
|
|
664
942
|
this.transcriptCache = undefined;
|
|
665
943
|
this.refresh();
|
|
666
944
|
this.tui.requestRender();
|
|
667
945
|
return;
|
|
668
946
|
}
|
|
669
|
-
if (data === "
|
|
947
|
+
if (data === "p") {
|
|
948
|
+
if (!this.selectedPromptAudit()) this.setActionNotice({ text: "Prompt Audit is available only for a live child owned by this session.", isError: true });
|
|
949
|
+
else {
|
|
950
|
+
this.promptAuditOpen = true;
|
|
951
|
+
this.promptAuditView = "authored";
|
|
952
|
+
this.detailScroll = 0;
|
|
953
|
+
this.detailAutoFollow = false;
|
|
954
|
+
this.actionNotice = undefined;
|
|
955
|
+
this.tui.requestRender();
|
|
956
|
+
}
|
|
957
|
+
return;
|
|
958
|
+
}
|
|
959
|
+
if (matchesFleetAction(data, this.keybindings, "steer")) {
|
|
670
960
|
const target = this.selectedAsyncAction();
|
|
671
961
|
if ("reason" in target || !this.options.actions) this.setActionNotice({ text: "reason" in target ? target.reason : "Fleet controls are unavailable in this context.", isError: true });
|
|
672
962
|
else {
|
|
@@ -678,13 +968,13 @@ export class SubagentFleetComponent implements Component {
|
|
|
678
968
|
}
|
|
679
969
|
return;
|
|
680
970
|
}
|
|
681
|
-
if (data
|
|
682
|
-
const target = this.
|
|
971
|
+
if (matchesFleetAction(data, this.keybindings, "inspect")) {
|
|
972
|
+
const target = this.selectedHerdrInspectAction();
|
|
683
973
|
if ("reason" in target || !this.options.actions?.inspect) this.setActionNotice({ text: "reason" in target ? target.reason : "Herdr inspector controls are unavailable in this context.", isError: true });
|
|
684
|
-
else this.runAction(() => this.options.actions!.inspect!(
|
|
974
|
+
else this.runAction(() => this.options.actions!.inspect!(target));
|
|
685
975
|
return;
|
|
686
976
|
}
|
|
687
|
-
if (data
|
|
977
|
+
if (matchesFleetAction(data, this.keybindings, "stop")) {
|
|
688
978
|
const target = this.selectedAsyncAction();
|
|
689
979
|
if ("reason" in target || !this.options.actions) this.setActionNotice({ text: "reason" in target ? target.reason : "Fleet controls are unavailable in this context.", isError: true });
|
|
690
980
|
else {
|
|
@@ -696,7 +986,7 @@ export class SubagentFleetComponent implements Component {
|
|
|
696
986
|
}
|
|
697
987
|
return;
|
|
698
988
|
}
|
|
699
|
-
if (
|
|
989
|
+
if (matchesFleetAction(data, this.keybindings, "toggleTools")) {
|
|
700
990
|
this.expandedTools = !this.expandedTools;
|
|
701
991
|
this.transcriptCache = undefined;
|
|
702
992
|
this.tui.requestRender();
|
|
@@ -711,7 +1001,7 @@ export class SubagentFleetComponent implements Component {
|
|
|
711
1001
|
const marker = index === this.selected ? this.theme.fg("accent", "›") : " ";
|
|
712
1002
|
const context = item.kind === "async" ? contextModeBadge(this.theme, item.step?.context ?? item.run.context) : item.kind === "foreground-recent" ? contextModeBadge(this.theme, item.child.context) : "";
|
|
713
1003
|
const agent = index === this.selected ? this.theme.bold(item.agent) : item.agent;
|
|
714
|
-
const identity = item.
|
|
1004
|
+
const identity = item.runId.slice(0, 8);
|
|
715
1005
|
const left = `${marker} ${statusGlyph(item, this.theme)} ${agent}${context} ${this.theme.fg("dim", `· ${identity}`)}`;
|
|
716
1006
|
return rightAligned(left, this.theme.fg("dim", item.state), width);
|
|
717
1007
|
});
|
|
@@ -734,7 +1024,35 @@ export class SubagentFleetComponent implements Component {
|
|
|
734
1024
|
return { transcript, body: [...body] };
|
|
735
1025
|
}
|
|
736
1026
|
|
|
1027
|
+
private promptAuditDetail(width: number): FleetDetailSections {
|
|
1028
|
+
const selected = this.snapshot.items[this.selected];
|
|
1029
|
+
const prompt = this.selectedPromptAudit();
|
|
1030
|
+
const items = this.promptAuditItems();
|
|
1031
|
+
const selectedPosition = selected ? items.findIndex(({ item }) => item.key === selected.key) : -1;
|
|
1032
|
+
const live = selected?.kind === "foreground-active" ? selected.activeChild ?? selected.control : undefined;
|
|
1033
|
+
const viewLabel = promptAuditViewLabel(this.promptAuditView);
|
|
1034
|
+
const promptText = this.selectedPromptText()
|
|
1035
|
+
?? this.theme.fg("muted", "Selected prompt unavailable.");
|
|
1036
|
+
const raw = [
|
|
1037
|
+
this.theme.bold("Prompt Audit"),
|
|
1038
|
+
this.theme.fg("dim", "Retention: live memory only · no storage"),
|
|
1039
|
+
selected?.kind === "foreground-active" ? `Run: ${selected.runId}${selected.index !== undefined ? ` · Child: ${selected.index}` : ""} · Agent: ${selected.agent}` : "Selected prompt unavailable",
|
|
1040
|
+
live ? `Started: ${new Date(live.startedAt).toISOString()}` : undefined,
|
|
1041
|
+
live ? `Model: ${formatModelThinking(live.model, live.thinking) || "default"}` : undefined,
|
|
1042
|
+
prompt?.cwd ? `Cwd: ${prompt.cwd}` : undefined,
|
|
1043
|
+
prompt?.outputPath ? `Output: ${prompt.outputPath}` : undefined,
|
|
1044
|
+
this.theme.fg("dim", `Live children: ${items.map(({ item }) => item.agent).join(", ") || "none"}`),
|
|
1045
|
+
this.theme.fg("dim", selectedPosition >= 0 ? `Selected: ${selectedPosition + 1}/${items.length}` : "Selected prompt unavailable"),
|
|
1046
|
+
"",
|
|
1047
|
+
this.theme.fg("accent", viewLabel),
|
|
1048
|
+
promptText,
|
|
1049
|
+
];
|
|
1050
|
+
const body = raw.filter((line): line is string => line !== undefined).flatMap((line) => wrapTextWithAnsi(line, Math.max(1, width)));
|
|
1051
|
+
return { header: [], body: this.withActionLines(body) };
|
|
1052
|
+
}
|
|
1053
|
+
|
|
737
1054
|
private wrappedDetail(width: number): FleetDetailSections {
|
|
1055
|
+
if (this.promptAuditOpen) return this.promptAuditDetail(width);
|
|
738
1056
|
const selected = this.snapshot.items[this.selected];
|
|
739
1057
|
let transcriptWarning: string | undefined;
|
|
740
1058
|
if (selected) {
|
|
@@ -752,16 +1070,17 @@ export class SubagentFleetComponent implements Component {
|
|
|
752
1070
|
: latest?.kind === "tool"
|
|
753
1071
|
? `${latest.name} · ${latest.status}`
|
|
754
1072
|
: "activity";
|
|
755
|
-
|
|
1073
|
+
const promptSummary = selected.kind === "foreground-active" ? foregroundAuthoredPromptSummary(selected, this.state) : undefined;
|
|
1074
|
+
return { header: structuredHeader(selected, width, this.theme, conversationState, promptSummary), body: this.withActionLines(body) };
|
|
756
1075
|
}
|
|
757
1076
|
}
|
|
758
1077
|
}
|
|
759
1078
|
|
|
760
|
-
const raw = detailLines(selected, this.snapshot.error);
|
|
1079
|
+
const raw = detailLines(selected, this.snapshot.error, this.state);
|
|
761
1080
|
if (transcriptWarning) raw.unshift(`Transcript preview warning: ${transcriptWarning}`, "");
|
|
762
1081
|
const lines: string[] = [];
|
|
763
1082
|
for (const line of raw) {
|
|
764
|
-
const styled = /^(Run|State|Mode|Source|Child|Agent|Model):/.test(line)
|
|
1083
|
+
const styled = /^(Run|State|Mode|Source|Child|Agent|Model|Task):/.test(line)
|
|
765
1084
|
? this.theme.bold(line)
|
|
766
1085
|
: /^(Transcript|Result transcript tail)/.test(line)
|
|
767
1086
|
? this.theme.fg("accent", line)
|
|
@@ -780,7 +1099,7 @@ export class SubagentFleetComponent implements Component {
|
|
|
780
1099
|
if (width < 36) return [truncateToWidth("Subagent fleet needs at least 36 columns. Esc closes.", width)];
|
|
781
1100
|
const innerWidth = width - 2;
|
|
782
1101
|
const rows = this.tui.terminal?.rows ?? 32;
|
|
783
|
-
this.bodyHeight = Math.max(2, Math.
|
|
1102
|
+
this.bodyHeight = Math.max(2, Math.floor(rows * 0.85) - 6);
|
|
784
1103
|
const rosterWidth = Math.max(22, Math.min(46, Math.floor((innerWidth - 1) * 0.38)));
|
|
785
1104
|
const detailWidth = Math.max(1, innerWidth - rosterWidth - 1);
|
|
786
1105
|
const roster = this.rosterLines(rosterWidth);
|
|
@@ -814,7 +1133,9 @@ export class SubagentFleetComponent implements Component {
|
|
|
814
1133
|
}
|
|
815
1134
|
lines.push(this.theme.fg("border", `├${"─".repeat(rosterWidth)}┴${"─".repeat(detailWidth)}┤`));
|
|
816
1135
|
const position = this.snapshot.items.length ? `${this.selected + 1}/${this.snapshot.items.length}` : "0/0";
|
|
817
|
-
const footer =
|
|
1136
|
+
const footer = this.promptAuditOpen
|
|
1137
|
+
? ` j/k child · 1/2/3 view · g redo with guidance · c copy · Esc close Prompt Audit · ${position}`
|
|
1138
|
+
: ` ${bindingLabel(this.keybindings, "selectUp")}/${bindingLabel(this.keybindings, "selectDown")} agent · p Prompt Audit · ${bindingLabel(this.keybindings, "inspect")} Herdr · ${bindingLabel(this.keybindings, "steer")} steer · ${bindingLabel(this.keybindings, "stop")} stop · ${bindingLabel(this.keybindings, "toggleTools")} tools · ${bindingLabel(this.keybindings, "refresh")} refresh · ${bindingLabel(this.keybindings, "close")} close · ${position}`;
|
|
818
1139
|
lines.push(this.theme.fg("border", "│") + fit(this.theme.fg("dim", footer), innerWidth) + this.theme.fg("border", "│"));
|
|
819
1140
|
lines.push(this.theme.fg("border", `╰${"─".repeat(innerWidth)}╯`));
|
|
820
1141
|
return lines.map((line) => truncateToWidth(line, width));
|
|
@@ -835,12 +1156,19 @@ export async function openSubagentFleet(ctx: ExtensionContext, state: SubagentSt
|
|
|
835
1156
|
const wasOpen = state.fleetInspectorOpen === true;
|
|
836
1157
|
state.fleetInspectorOpen = true;
|
|
837
1158
|
if (typeof ctx.ui.setWidget === "function") ctx.ui.setWidget(FLEET_STATUS_WIDGET_KEY, undefined);
|
|
1159
|
+
const copyText = options.copyText ?? (async (text: string) => {
|
|
1160
|
+
const module = await import("@selesai/code");
|
|
1161
|
+
const copyToClipboard = (module as { copyToClipboard?: (value: string) => Promise<void> | void }).copyToClipboard;
|
|
1162
|
+
if (!copyToClipboard) throw new Error("Clipboard is unavailable in this Pi version.");
|
|
1163
|
+
await copyToClipboard(text);
|
|
1164
|
+
});
|
|
838
1165
|
const actions = options.actions ?? {
|
|
839
|
-
steer: async (input: { runId: string; asyncDir: string; index?: number; message: string }) => firstToolResultText(await steerAsyncRun({
|
|
1166
|
+
steer: async (input: { runId: string; asyncDir: string; index?: number; message: string; mode: SteerDeliveryMode }) => firstToolResultText(await steerAsyncRun({
|
|
840
1167
|
state,
|
|
841
1168
|
runId: input.runId,
|
|
842
1169
|
...(input.index !== undefined ? { index: input.index } : {}),
|
|
843
1170
|
message: input.message,
|
|
1171
|
+
mode: input.mode,
|
|
844
1172
|
location: { asyncDir: input.asyncDir, resolvedId: input.runId } as Parameters<typeof steerAsyncRun>[0]["location"],
|
|
845
1173
|
}), `Failed to steer async run ${input.runId}.`),
|
|
846
1174
|
stop: (input: { runId: string; asyncDir: string; index?: number }) => firstToolResultText(stopAsyncRun(state, input.runId, undefined, { asyncDir: input.asyncDir, resolvedId: input.runId }), `Failed to stop async run ${input.runId}.`),
|
|
@@ -854,10 +1182,15 @@ export async function openSubagentFleet(ctx: ExtensionContext, state: SubagentSt
|
|
|
854
1182
|
...(state.authorityPolicy ? { authorityPolicy: state.authorityPolicy } : {}),
|
|
855
1183
|
...(state.missionStoreConfig ? { missions: state.missionStoreConfig } : {}),
|
|
856
1184
|
}), `Failed to open Herdr inspector for async run ${input.runId}.`),
|
|
1185
|
+
redoPrompt: async (input: { runId: string; index: number; guidance: string; control?: ForegroundRunControl }) => {
|
|
1186
|
+
const control = input.control ?? state.foregroundControls.get(input.runId);
|
|
1187
|
+
if (!control?.promptAuditRedo) return { text: "Redo is not available for this live child.", isError: true };
|
|
1188
|
+
return control.promptAuditRedo(input.index, input.guidance);
|
|
1189
|
+
},
|
|
857
1190
|
} satisfies FleetActionHandlers;
|
|
858
1191
|
try {
|
|
859
1192
|
await ctx.ui.custom<undefined>(
|
|
860
|
-
(tui, theme, _keybindings, done) => new SubagentFleetComponent(tui, theme, state, done, { ...options, actions }),
|
|
1193
|
+
(tui, theme, _keybindings, done) => new SubagentFleetComponent(tui, theme, state, done, { ...options, actions, copyText }),
|
|
861
1194
|
{
|
|
862
1195
|
overlay: true,
|
|
863
1196
|
overlayOptions: { anchor: "center", width: "95%", minWidth: 60, maxHeight: "85%", margin: 1 },
|