@selesai/code 0.9.11 → 0.9.12
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 +11 -0
- package/dist/config.d.ts +4 -6
- package/dist/config.js +10 -14
- package/dist/core/agent-session.d.ts +0 -1
- package/dist/core/agent-session.js +3 -49
- package/dist/core/extensions/types.d.ts +0 -2
- package/dist/core/settings-manager.d.ts +0 -2
- package/dist/core/settings-manager.js +0 -3
- package/dist/core/tools/index.d.ts +0 -1
- package/dist/core/tools/index.js +0 -1
- package/dist/defaults/settings.json +0 -1
- package/dist/extensions/model-prompt-injector/index.test.ts +0 -10
- package/dist/extensions/model-prompt-injector/index.ts +0 -3
- package/dist/extensions/pi-intercom/CHANGELOG.md +53 -16
- package/dist/extensions/pi-intercom/README.md +41 -8
- package/dist/extensions/pi-intercom/banner.png +0 -0
- package/dist/extensions/pi-intercom/broker/broker.ts +498 -215
- package/dist/extensions/pi-intercom/broker/client.ts +39 -12
- package/dist/extensions/pi-intercom/broker/extension.test.ts +102 -3
- package/dist/extensions/pi-intercom/broker/paths.test.ts +2 -2
- package/dist/extensions/pi-intercom/broker/protocol.ts +26 -0
- package/dist/extensions/pi-intercom/broker/spawn.test.ts +5 -20
- package/dist/extensions/pi-intercom/config.test.ts +41 -0
- package/dist/extensions/pi-intercom/config.ts +21 -0
- package/dist/extensions/pi-intercom/extension-api.ts +40 -0
- package/dist/extensions/pi-intercom/index.ts +362 -26
- package/dist/extensions/pi-intercom/intercom.integration.test.ts +819 -13
- package/dist/extensions/pi-intercom/package.json +1 -1
- package/dist/extensions/pi-intercom/project-agent.ts +2 -2
- package/dist/extensions/pi-intercom/skills/pi-intercom/SKILL.md +8 -110
- package/dist/extensions/pi-intercom/types.ts +32 -5
- package/dist/extensions/pi-intercom/ui/inline-message.ts +6 -0
- package/dist/extensions/pi-subagents/.github/assets/subagent-fleet-inspector.png +0 -0
- package/dist/extensions/pi-subagents/.github/workflows/release.yml +28 -0
- package/dist/extensions/pi-subagents/.github/workflows/test.yml +51 -0
- package/dist/extensions/pi-subagents/.greptile/config.json +33 -0
- package/dist/extensions/pi-subagents/.greptile/files.json +8 -0
- package/dist/extensions/pi-subagents/.greptile/rules.md +16 -0
- package/dist/extensions/pi-subagents/CHANGELOG.md +309 -87
- package/dist/extensions/pi-subagents/README.md +15 -17
- package/dist/extensions/pi-subagents/agents/oracle.md +3 -1
- package/dist/extensions/pi-subagents/agents/researcher.md +32 -13
- package/dist/extensions/pi-subagents/agents/reviewer.md +13 -2
- package/dist/extensions/pi-subagents/agents/scout.md +2 -2
- package/dist/extensions/pi-subagents/agents/worker.md +2 -1
- package/dist/extensions/pi-subagents/async-retention-discovery-worker.mjs +180 -0
- package/dist/extensions/pi-subagents/docs/configuration.md +106 -27
- package/dist/extensions/pi-subagents/docs/extension-api.md +85 -21
- package/dist/extensions/pi-subagents/docs/missions.md +41 -4
- package/dist/extensions/pi-subagents/docs/models.md +52 -9
- package/dist/extensions/pi-subagents/docs/observability.md +103 -16
- package/dist/extensions/pi-subagents/docs/tool-reference.md +60 -45
- package/dist/extensions/pi-subagents/docs/watchdog.md +60 -3
- package/dist/extensions/pi-subagents/docs/workflows.md +181 -7
- package/dist/extensions/pi-subagents/index.ts +10 -1
- package/dist/extensions/pi-subagents/install.mjs +4 -4
- package/dist/extensions/pi-subagents/package-lock.json +1483 -1470
- package/dist/extensions/pi-subagents/package.json +6 -3
- package/dist/extensions/pi-subagents/prompts/council.md +60 -0
- package/dist/extensions/pi-subagents/prompts/parallel-review.md +5 -1
- package/dist/extensions/pi-subagents/prompts/review-loop.md +9 -5
- package/dist/extensions/pi-subagents/skills/council-mode/SKILL.md +254 -0
- package/dist/extensions/pi-subagents/skills/pi-subagents/SKILL.md +18 -17
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/constraints-and-recipes.md +31 -9
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/execution-controls.md +107 -140
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/management-authoring-rpc.md +9 -12
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/multi-lane-orchestration.md +39 -0
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/prompting-and-roles.md +44 -92
- package/dist/extensions/pi-subagents/src/agents/agent-management.ts +261 -368
- package/dist/extensions/pi-subagents/src/agents/agent-serializer.ts +6 -2
- package/dist/extensions/pi-subagents/src/agents/agents.ts +388 -85
- package/dist/extensions/pi-subagents/src/agents/builtin-names.ts +14 -0
- package/dist/extensions/pi-subagents/src/agents/runtime-agent-registry.ts +418 -0
- package/dist/extensions/pi-subagents/src/agents/skills.ts +1 -1
- package/dist/extensions/pi-subagents/src/api/agents.ts +7 -0
- package/dist/extensions/pi-subagents/src/api/external-job-provider.ts +195 -0
- package/dist/extensions/pi-subagents/src/api/preflight.ts +88 -27
- package/dist/extensions/pi-subagents/src/api/project-panes.ts +2 -0
- package/dist/extensions/pi-subagents/src/api/shared-types.ts +2 -0
- package/dist/extensions/pi-subagents/src/extension/config.ts +20 -11
- package/dist/extensions/pi-subagents/src/extension/doctor.ts +14 -6
- package/dist/extensions/pi-subagents/src/extension/fanout-child.ts +5 -4
- package/dist/extensions/pi-subagents/src/extension/index.ts +270 -187
- package/dist/extensions/pi-subagents/src/extension/public-execution.ts +65 -28
- package/dist/extensions/pi-subagents/src/extension/rpc.ts +120 -11
- package/dist/extensions/pi-subagents/src/extension/schemas.ts +46 -64
- package/dist/extensions/pi-subagents/src/extension/tool-description.ts +51 -37
- package/dist/extensions/pi-subagents/src/extension/tool-result.ts +19 -0
- package/dist/extensions/pi-subagents/src/inspectors/herdr/actions.ts +2 -2
- package/dist/extensions/pi-subagents/src/inspectors/herdr/client.ts +3 -3
- package/dist/extensions/pi-subagents/src/inspectors/herdr/focus.ts +55 -0
- package/dist/extensions/pi-subagents/src/inspectors/herdr/inspector-runner.ts +2 -1
- package/dist/extensions/pi-subagents/src/inspectors/herdr/project-panes.ts +230 -46
- package/dist/extensions/pi-subagents/src/integrations/herdr-status.ts +26 -4
- package/dist/extensions/pi-subagents/src/intercom/native-supervisor-channel.ts +32 -10
- package/dist/extensions/pi-subagents/src/missions/lifecycle.ts +6 -1
- package/dist/extensions/pi-subagents/src/missions/store.ts +4 -9
- package/dist/extensions/pi-subagents/src/missions/workflow-state.ts +2 -2
- package/dist/extensions/pi-subagents/src/policy/authority.ts +2 -0
- package/dist/extensions/pi-subagents/src/profiles/profiles.ts +3 -1
- package/dist/extensions/pi-subagents/src/runs/background/active-run-index.ts +31 -8
- package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +210 -52
- package/dist/extensions/pi-subagents/src/runs/background/async-job-tracker.ts +63 -33
- package/dist/extensions/pi-subagents/src/runs/background/async-resume.ts +71 -17
- package/dist/extensions/pi-subagents/src/runs/background/async-retention.ts +886 -0
- package/dist/extensions/pi-subagents/src/runs/background/async-status-snapshot.ts +14 -5
- package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +49 -56
- package/dist/extensions/pi-subagents/src/runs/background/auto-drain.ts +1 -0
- package/dist/extensions/pi-subagents/src/runs/background/chain-append.ts +3 -33
- package/dist/extensions/pi-subagents/src/runs/background/chain-root-attachment.ts +5 -0
- package/dist/extensions/pi-subagents/src/runs/background/completion-dedupe.ts +5 -1
- package/dist/extensions/pi-subagents/src/runs/background/completion-replay.ts +22 -12
- package/dist/extensions/pi-subagents/src/runs/background/control-channel.ts +105 -71
- package/dist/extensions/pi-subagents/src/runs/background/fleet-view.ts +68 -19
- package/dist/extensions/pi-subagents/src/runs/background/index-segment.ts +59 -0
- package/dist/extensions/pi-subagents/src/runs/background/inspect-rpc.ts +443 -0
- package/dist/extensions/pi-subagents/src/runs/background/notify.ts +94 -10
- package/dist/extensions/pi-subagents/src/runs/background/result-files.ts +158 -90
- package/dist/extensions/pi-subagents/src/runs/background/result-watcher.ts +141 -53
- package/dist/extensions/pi-subagents/src/runs/background/resume-guidance.ts +8 -5
- package/dist/extensions/pi-subagents/src/runs/background/retained-children.ts +14 -4
- package/dist/extensions/pi-subagents/src/runs/background/run-id-query.ts +7 -0
- package/dist/extensions/pi-subagents/src/runs/background/run-id-resolver.ts +13 -14
- package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +46 -25
- package/dist/extensions/pi-subagents/src/runs/background/scheduled-runs.ts +823 -0
- package/dist/extensions/pi-subagents/src/runs/background/stale-run-reconciler.ts +9 -3
- package/dist/extensions/pi-subagents/src/runs/background/steering.ts +11 -1
- package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +594 -216
- package/dist/extensions/pi-subagents/src/runs/background/subagent-wait.ts +17 -13
- package/dist/extensions/pi-subagents/src/runs/background/terminal-run-index.ts +138 -0
- package/dist/extensions/pi-subagents/src/runs/background/wait-completions.ts +23 -4
- package/dist/extensions/pi-subagents/src/runs/background/wait-subscriptions.ts +82 -4
- package/dist/extensions/pi-subagents/src/runs/background/wait-tool.ts +5 -3
- package/dist/extensions/pi-subagents/src/runs/foreground/async-steering-action.ts +21 -14
- package/dist/extensions/pi-subagents/src/runs/foreground/async-stop-action.ts +23 -2
- package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +153 -58
- package/dist/extensions/pi-subagents/src/runs/foreground/foreground-history.ts +7 -9
- package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +1283 -1657
- package/dist/extensions/pi-subagents/src/runs/foreground/workflow-detach-reconcile.ts +274 -0
- package/dist/extensions/pi-subagents/src/runs/foreground/workflow-foreground-steering.ts +6 -5
- package/dist/extensions/pi-subagents/src/runs/shared/acceptance.ts +59 -10
- package/dist/extensions/pi-subagents/src/runs/shared/agent-contract.ts +1 -1
- package/dist/extensions/pi-subagents/src/runs/shared/chain-outputs.ts +1 -3
- package/dist/extensions/pi-subagents/src/runs/shared/child-identity.ts +36 -0
- package/dist/extensions/pi-subagents/src/runs/shared/completion-guard.ts +52 -2
- package/dist/extensions/pi-subagents/src/runs/shared/dynamic-fanout.ts +1 -1
- package/dist/extensions/pi-subagents/src/runs/shared/extension-bindings.ts +78 -0
- package/dist/extensions/pi-subagents/src/runs/shared/external-cli-runner.ts +2 -0
- package/dist/extensions/pi-subagents/src/runs/shared/external-job-bridge.ts +460 -0
- package/dist/extensions/pi-subagents/src/runs/shared/external-job-runner.ts +389 -0
- package/dist/extensions/pi-subagents/src/runs/shared/fast-mode-extension.ts +10 -0
- package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +14 -0
- package/dist/extensions/pi-subagents/src/runs/shared/model-exclusions.ts +243 -0
- package/dist/extensions/pi-subagents/src/runs/shared/model-fallback.ts +201 -85
- package/dist/extensions/pi-subagents/src/runs/shared/model-scope.ts +106 -39
- package/dist/extensions/pi-subagents/src/runs/shared/mutation-evidence.ts +145 -0
- package/dist/extensions/pi-subagents/src/runs/shared/orca-progress-tabs.ts +150 -27
- package/dist/extensions/pi-subagents/src/runs/shared/parallel-handoff.ts +46 -4
- package/dist/extensions/pi-subagents/src/runs/shared/parallel-utils.ts +19 -15
- package/dist/extensions/pi-subagents/src/runs/shared/permissions.ts +5 -1
- package/dist/extensions/pi-subagents/src/runs/shared/pi-args.ts +86 -2
- package/dist/extensions/pi-subagents/src/runs/shared/pi-spawn.ts +9 -9
- package/dist/extensions/pi-subagents/src/runs/shared/session-lease.ts +0 -6
- package/dist/extensions/pi-subagents/src/runs/shared/structured-output.ts +18 -4
- package/dist/extensions/pi-subagents/src/runs/shared/subagent-control.ts +51 -7
- package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +62 -21
- package/dist/extensions/pi-subagents/src/runs/shared/tool-availability.ts +1 -3
- package/dist/extensions/pi-subagents/src/runs/shared/tool-timeout.ts +1 -3
- package/dist/extensions/pi-subagents/src/runs/shared/workflow-graph.ts +1 -23
- package/dist/extensions/pi-subagents/src/runs/shared/worktree.ts +14 -2
- package/dist/extensions/pi-subagents/src/shared/artifacts.ts +2 -2
- package/dist/extensions/pi-subagents/src/shared/atomic-json.ts +22 -2
- package/dist/extensions/pi-subagents/src/shared/capacity-resilient-json.ts +102 -0
- package/dist/extensions/pi-subagents/src/shared/completion-owner.ts +14 -0
- package/dist/extensions/pi-subagents/src/shared/file-system-retry.ts +49 -1
- package/dist/extensions/pi-subagents/src/shared/fork-context.ts +59 -1
- package/dist/extensions/pi-subagents/src/shared/launch-contract.ts +12 -5
- package/dist/extensions/pi-subagents/src/shared/model-info.ts +20 -0
- package/dist/extensions/pi-subagents/src/shared/prompt-resources.ts +0 -40
- package/dist/extensions/pi-subagents/src/shared/settings.ts +11 -30
- package/dist/extensions/pi-subagents/src/shared/thinking-ceiling.ts +52 -0
- package/dist/extensions/pi-subagents/src/shared/types.ts +228 -49
- package/dist/extensions/pi-subagents/src/shared/utils.ts +11 -3
- package/dist/extensions/pi-subagents/src/shared/watch-strategy.ts +10 -0
- package/dist/extensions/pi-subagents/src/slash/prompt-workflows.ts +0 -162
- package/dist/extensions/pi-subagents/src/slash/slash-bridge.ts +2 -5
- package/dist/extensions/pi-subagents/src/slash/slash-commands.ts +105 -13
- package/dist/extensions/pi-subagents/src/slash/slash-live-state.ts +6 -36
- package/dist/extensions/pi-subagents/src/tui/fleet-status.ts +829 -0
- package/dist/extensions/pi-subagents/src/tui/fleet.ts +1415 -0
- package/dist/extensions/pi-subagents/src/tui/render.ts +78 -7
- package/dist/extensions/pi-subagents/src/watchdog/change-signature.ts +1 -1
- package/dist/extensions/pi-subagents/src/watchdog/lsp-diagnostics.ts +1 -0
- package/dist/extensions/pi-subagents/src/watchdog/permission-arbiter.ts +59 -51
- package/dist/extensions/pi-subagents/src/watchdog/register-main.ts +8 -2
- package/dist/extensions/pi-subagents/src/watchdog/tool-actions.ts +2 -1
- package/dist/extensions/pi-subagents/src/workflows/chat-progress.ts +4 -4
- package/dist/extensions/pi-subagents/src/workflows/scripted-workflow.ts +471 -86
- package/dist/extensions/pi-subagents/src/workflows/workflow-receipt.ts +140 -0
- package/dist/extensions/pi-subagents/test/e2e/real-session-subagent.test.ts +2 -2
- 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 +1 -1
- package/dist/extensions/pi-subagents/test/integration/acceptance-file-report.test.ts +0 -54
- package/dist/extensions/pi-subagents/test/integration/async-execution.test.ts +1053 -414
- package/dist/extensions/pi-subagents/test/integration/async-job-tracker.test.ts +194 -4
- package/dist/extensions/pi-subagents/test/integration/async-status.test.ts +59 -4
- package/dist/extensions/pi-subagents/test/integration/error-handling.test.ts +0 -77
- package/dist/extensions/pi-subagents/test/integration/external-cli-runner.test.ts +107 -6
- package/dist/extensions/pi-subagents/test/integration/fork-context-execution.test.ts +211 -897
- package/dist/extensions/pi-subagents/test/integration/intercom-result-delivery.test.ts +265 -375
- package/dist/extensions/pi-subagents/test/integration/orca-progress-tabs.test.ts +77 -7
- package/dist/extensions/pi-subagents/test/integration/render-fork-badge.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/integration/render-widget.test.ts +10 -10
- package/dist/extensions/pi-subagents/test/integration/result-watcher.test.ts +547 -30
- package/dist/extensions/pi-subagents/test/integration/single-execution.test.ts +2112 -310
- package/dist/extensions/pi-subagents/test/integration/slash-commands.test.ts +274 -34
- package/dist/extensions/pi-subagents/test/integration/slash-live-state.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/integration/template-resolution.test.ts +20 -3
- package/dist/extensions/pi-subagents/test/support/isolated-temp-root.mjs +9 -0
- package/dist/extensions/pi-subagents/test/support/mock-pi-script.mjs +30 -5
- package/dist/extensions/pi-subagents/test/support/mock-pi.ts +2 -0
- package/dist/extensions/pi-subagents/test/support/real-session-runner.ts +4 -2
- package/dist/extensions/pi-subagents/test/support/register-loader.mjs +1 -0
- package/dist/extensions/pi-subagents/test/unit/acceptance.test.ts +197 -0
- package/dist/extensions/pi-subagents/test/unit/agent-contract.test.ts +14 -0
- package/dist/extensions/pi-subagents/test/unit/agent-disabled.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/agent-frontmatter.test.ts +204 -27
- package/dist/extensions/pi-subagents/test/unit/agent-management.test.ts +444 -145
- package/dist/extensions/pi-subagents/test/unit/agent-overrides.test.ts +256 -4
- package/dist/extensions/pi-subagents/test/unit/artifacts.test.ts +9 -7
- package/dist/extensions/pi-subagents/test/unit/async-interrupt-action.test.ts +152 -22
- package/dist/extensions/pi-subagents/test/unit/async-recovery-descriptor.test.ts +29 -0
- package/dist/extensions/pi-subagents/test/unit/async-resume.test.ts +205 -23
- package/dist/extensions/pi-subagents/test/unit/async-retention.test.ts +579 -0
- package/dist/extensions/pi-subagents/test/unit/atomic-json.test.ts +24 -0
- package/dist/extensions/pi-subagents/test/unit/authority-policy.test.ts +1 -0
- package/dist/extensions/pi-subagents/test/unit/auto-drain.test.ts +3 -3
- package/dist/extensions/pi-subagents/test/unit/capacity-resilient-json.test.ts +155 -0
- package/dist/extensions/pi-subagents/test/unit/compaction-resume.test.ts +2 -2
- package/dist/extensions/pi-subagents/test/unit/completion-dedupe.test.ts +7 -0
- package/dist/extensions/pi-subagents/test/unit/completion-guard.test.ts +123 -0
- package/dist/extensions/pi-subagents/test/unit/completion-replay.test.ts +81 -3
- package/dist/extensions/pi-subagents/test/unit/control-channel.test.ts +109 -7
- package/dist/extensions/pi-subagents/test/unit/default-extensions.test.ts +2 -2
- package/dist/extensions/pi-subagents/test/unit/doctor.test.ts +5 -2
- package/dist/extensions/pi-subagents/test/unit/dynamic-fanout.test.ts +3 -2
- package/dist/extensions/pi-subagents/test/unit/extension-bindings.test.ts +79 -0
- package/dist/extensions/pi-subagents/test/unit/external-cli-runner.test.ts +22 -0
- package/dist/extensions/pi-subagents/test/unit/external-job-runner.test.ts +961 -0
- package/dist/extensions/pi-subagents/test/unit/file-system-retry.test.ts +64 -0
- package/dist/extensions/pi-subagents/test/unit/fleet-status.test.ts +1110 -0
- package/dist/extensions/pi-subagents/test/unit/fleet.test.ts +1664 -0
- package/dist/extensions/pi-subagents/test/unit/fork-context.test.ts +81 -1
- package/dist/extensions/pi-subagents/test/unit/herdr-inspector.test.ts +138 -11
- package/dist/extensions/pi-subagents/test/unit/herdr-status-bridge.test.ts +41 -2
- package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +210 -79
- package/dist/extensions/pi-subagents/test/unit/index-segment.test.ts +95 -0
- package/dist/extensions/pi-subagents/test/unit/inspect-rpc.test.ts +596 -0
- package/dist/extensions/pi-subagents/test/unit/mission-lifecycle.test.ts +10 -1
- package/dist/extensions/pi-subagents/test/unit/mission-store.test.ts +3 -5
- package/dist/extensions/pi-subagents/test/unit/model-exclusions.test.ts +167 -0
- package/dist/extensions/pi-subagents/test/unit/model-fallback.test.ts +319 -18
- package/dist/extensions/pi-subagents/test/unit/model-info.test.ts +78 -0
- package/dist/extensions/pi-subagents/test/unit/model-scope-settings.test.ts +19 -5
- package/dist/extensions/pi-subagents/test/unit/model-scope.test.ts +44 -0
- package/dist/extensions/pi-subagents/test/unit/mutation-evidence.test.ts +129 -0
- package/dist/extensions/pi-subagents/test/unit/native-supervisor-channel.test.ts +231 -2
- package/dist/extensions/pi-subagents/test/unit/nested-control.test.ts +28 -1
- package/dist/extensions/pi-subagents/test/unit/notify.test.ts +106 -2
- package/dist/extensions/pi-subagents/test/unit/orca-progress-tabs.test.ts +204 -7
- package/dist/extensions/pi-subagents/test/unit/package-manifest.test.ts +59 -4
- package/dist/extensions/pi-subagents/test/unit/path-handling.test.ts +2 -6
- package/dist/extensions/pi-subagents/test/unit/pi-args-permission-system.test.ts +34 -2
- package/dist/extensions/pi-subagents/test/unit/pi-args.test.ts +116 -6
- package/dist/extensions/pi-subagents/test/unit/pi-coding-agent-dir.test.ts +12 -3
- package/dist/extensions/pi-subagents/test/unit/pi-spawn.test.ts +56 -61
- package/dist/extensions/pi-subagents/test/unit/preflight.test.ts +416 -1
- package/dist/extensions/pi-subagents/test/unit/profiles.test.ts +9 -2
- package/dist/extensions/pi-subagents/test/unit/project-panes-public-api.test.ts +42 -0
- package/dist/extensions/pi-subagents/test/unit/prompt-workflows.test.ts +21 -30
- package/dist/extensions/pi-subagents/test/unit/public-execution.test.ts +86 -11
- package/dist/extensions/pi-subagents/test/unit/render-helpers.test.ts +49 -1
- package/dist/extensions/pi-subagents/test/unit/result-files.test.ts +233 -5
- package/dist/extensions/pi-subagents/test/unit/retained-children.test.ts +28 -5
- package/dist/extensions/pi-subagents/test/unit/rpc.test.ts +323 -20
- package/dist/extensions/pi-subagents/test/unit/run-id-resolver.test.ts +66 -10
- package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +68 -5
- package/dist/extensions/pi-subagents/test/unit/runtime-agent-registration.test.ts +174 -0
- package/dist/extensions/pi-subagents/test/unit/scheduled-runs.test.ts +679 -0
- package/dist/extensions/pi-subagents/test/unit/scheduled-store-root.test.ts +67 -0
- package/dist/extensions/pi-subagents/test/unit/schemas.test.ts +55 -44
- package/dist/extensions/pi-subagents/test/unit/scripted-workflow.test.ts +399 -84
- package/dist/extensions/pi-subagents/test/unit/session-lease.test.ts +13 -0
- package/dist/extensions/pi-subagents/test/unit/skills-fallback.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/slash-bridge.test.ts +15 -10
- package/dist/extensions/pi-subagents/test/unit/stale-run-reconciler.test.ts +11 -7
- package/dist/extensions/pi-subagents/test/unit/steering-action.test.ts +2 -0
- package/dist/extensions/pi-subagents/test/unit/steering.test.ts +40 -1
- package/dist/extensions/pi-subagents/test/unit/subagent-action-recovery.test.ts +10 -2
- package/dist/extensions/pi-subagents/test/unit/subagent-control.test.ts +38 -3
- package/dist/extensions/pi-subagents/test/unit/subagent-prompt-runtime.test.ts +110 -12
- package/dist/extensions/pi-subagents/test/unit/subagent-wait.test.ts +204 -19
- package/dist/extensions/pi-subagents/test/unit/temp-paths.test.ts +25 -0
- package/dist/extensions/pi-subagents/test/unit/thinking-ceiling.test.ts +73 -0
- package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +90 -50
- package/dist/extensions/pi-subagents/test/unit/tool-timeout.test.ts +1 -2
- package/dist/extensions/pi-subagents/test/unit/wait-subscriptions.test.ts +234 -7
- package/dist/extensions/pi-subagents/test/unit/watch-strategy.test.ts +24 -0
- package/dist/extensions/pi-subagents/test/unit/watchdog-permission-arbiter.test.ts +36 -0
- package/dist/extensions/pi-subagents/test/unit/workflow-chat-progress.test.ts +37 -9
- package/dist/extensions/pi-subagents/test/unit/workflow-detach-reconcile.test.ts +302 -0
- package/dist/extensions/pi-subagents/test/unit/workflow-launch-params.test.ts +167 -7
- package/dist/extensions/pi-subagents/test/unit/workflow-receipt.test.ts +113 -0
- package/dist/extensions/pi-subagents/test/unit/worktree.test.ts +6 -6
- package/dist/extensions/ponytail/index.js +31 -25
- package/dist/extensions/ponytail/ponytail-config.cjs +34 -7
- package/dist/extensions/ponytail/ponytail-instructions.cjs +7 -9
- package/dist/extensions/ponytail/test/extension.test.js +7 -8
- package/dist/extensions/ponytail/test/helpers.test.js +1 -1
- package/dist/skills/brandkit/SKILL.md +799 -0
- package/dist/skills/design-taste-frontend/SKILL.md +1207 -0
- package/dist/skills/design-taste-frontend-v1/SKILL.md +227 -0
- package/dist/skills/full-output-enforcement/SKILL.md +50 -0
- package/dist/skills/gpt-taste/SKILL.md +75 -0
- package/dist/skills/high-end-visual-design/SKILL.md +99 -0
- package/dist/skills/image-to-code/SKILL.md +1229 -0
- package/dist/skills/imagegen-frontend-mobile/SKILL.md +1466 -0
- package/dist/skills/imagegen-frontend-web/SKILL.md +988 -0
- package/dist/skills/industrial-brutalist-ui/SKILL.md +93 -0
- package/dist/skills/minimalist-ui/SKILL.md +86 -0
- package/dist/skills/pi-subagents/SKILL.md +18 -17
- package/dist/skills/pi-subagents/references/constraints-and-recipes.md +31 -9
- package/dist/skills/pi-subagents/references/execution-controls.md +95 -143
- package/dist/skills/pi-subagents/references/management-authoring-rpc.md +9 -12
- package/dist/skills/pi-subagents/references/multi-lane-orchestration.md +39 -0
- package/dist/skills/pi-subagents/references/prompting-and-roles.md +45 -94
- package/dist/skills/ponytail/SKILL.md +12 -8
- package/dist/skills/ponytail-audit/SKILL.md +0 -1
- package/dist/skills/ponytail-debt/SKILL.md +0 -1
- package/dist/skills/ponytail-gain/SKILL.md +0 -1
- package/dist/skills/ponytail-help/SKILL.md +4 -3
- package/dist/skills/ponytail-review/SKILL.md +0 -1
- package/dist/skills/redesign-existing-projects/SKILL.md +179 -0
- package/dist/skills/stitch-design-taste/SKILL.md +185 -0
- package/dist/skills/unlazy/CHANGELOG.md +100 -0
- package/dist/skills/unlazy/CONTRIBUTING.md +66 -0
- package/dist/skills/unlazy/LICENSE +21 -0
- package/dist/skills/unlazy/README.md +242 -0
- package/dist/skills/unlazy/SECURITY.md +70 -0
- package/dist/skills/unlazy/SKILL.md +100 -0
- package/dist/skills/unlazy/package.json +13 -0
- package/dist/skills/unlazy/references/dispatch.md +82 -0
- package/dist/skills/unlazy/references/gates.md +132 -0
- package/dist/skills/unlazy/references/method.md +49 -0
- package/dist/skills/unlazy/references/orchestration.md +99 -0
- package/dist/skills/unlazy/references/parallel.md +123 -0
- package/dist/skills/unlazy/references/token-economy.md +39 -0
- package/dist/skills/unlazy/research/validation-protocol.md +81 -0
- package/dist/skills/unlazy/scripts/dispatch-check.mjs +108 -0
- package/dist/skills/unlazy/scripts/gate-check.mjs +894 -0
- package/dist/skills/unlazy/scripts/gate-lint.mjs +178 -0
- package/dist/skills/unlazy/scripts/install-hooks.mjs +206 -0
- package/dist/skills/unlazy/scripts/lib/check-supervisor.mjs +46 -0
- package/dist/skills/unlazy/scripts/lib/dispatch.mjs +283 -0
- package/dist/skills/unlazy/scripts/lib/gates.mjs +629 -0
- package/dist/skills/unlazy/scripts/lib/process-tree.mjs +161 -0
- package/dist/skills/unlazy/scripts/lib/regex-worker.mjs +9 -0
- package/dist/skills/unlazy/scripts/stop-hook.mjs +174 -0
- package/dist/skills/unlazy/templates/PLAN.md +65 -0
- package/dist/skills/unlazy/templates/gates-leaf.md +51 -0
- package/dist/skills/unlazy/templates/gates-node.md +50 -0
- package/dist/skills/unlazy/tests/contract-tests.mjs +127 -0
- package/dist/skills/unlazy/tests/dispatch-tests.mjs +481 -0
- package/dist/skills/unlazy/tests/hardening-tests.mjs +903 -0
- package/dist/skills/unlazy/tests/lint-tests.mjs +242 -0
- package/dist/skills/unlazy/tests/run-tests.mjs +554 -0
- package/dist/skills/unlazy/tests/self-check.mjs +165 -0
- package/dist/skills/unlazy/tests/stress-tests.mjs +356 -0
- package/dist/skills/web-design-guidelines/SKILL.md +40 -0
- package/docs/settings.md +0 -5
- package/package.json +1 -1
- package/dist/core/tools/schema-prune.d.ts +0 -16
- package/dist/core/tools/schema-prune.js +0 -39
- package/dist/core/tools/schema-prune.test.d.ts +0 -1
- package/dist/core/tools/schema-prune.test.js +0 -111
- package/dist/extensions/pi-subagents/UPSTREAM-V0.50-MAPPING.md +0 -172
- package/dist/extensions/pi-subagents/prompts/parallel-context-build.md +0 -55
- package/dist/extensions/pi-subagents/prompts/parallel-handoff-plan.md +0 -61
- package/dist/extensions/pi-subagents/src/agents/task-aware-routing.ts +0 -132
- package/dist/extensions/pi-subagents/src/extension/chain-validation.ts +0 -181
- package/dist/extensions/pi-subagents/src/runs/foreground/chain-clarify.ts +0 -1354
- package/dist/extensions/pi-subagents/src/runs/foreground/chain-execution.ts +0 -1581
- package/dist/extensions/pi-subagents/src/shared/env.ts +0 -16
- package/dist/extensions/pi-subagents/src/shared/session-lineage.ts +0 -71
- package/dist/extensions/pi-subagents/src/slash/inline-subagents.ts +0 -136
- package/dist/extensions/pi-subagents/src/workflows/workflow-auto-relaunch.ts +0 -41
- package/dist/extensions/pi-subagents/test/integration/chain-clarify.test.ts +0 -466
- package/dist/extensions/pi-subagents/test/integration/chain-execution.test.ts +0 -1859
- package/dist/extensions/pi-subagents/test/integration/parallel-execution.test.ts +0 -733
- package/dist/extensions/pi-subagents/test/unit/builtin-agent-documentation.test.ts +0 -63
- package/dist/extensions/pi-subagents/test/unit/chain-validation.test.ts +0 -326
- package/dist/extensions/pi-subagents/test/unit/handoff-adoption.test.ts +0 -103
- package/dist/extensions/pi-subagents/test/unit/inline-subagents.test.ts +0 -127
- package/dist/extensions/pi-subagents/test/unit/session-lineage.test.ts +0 -73
- package/dist/extensions/pi-subagents/test/unit/task-aware-routing.test.ts +0 -213
- package/dist/extensions/pi-subagents/test/unit/workflow-auto-relaunch.test.ts +0 -65
|
@@ -4,8 +4,9 @@ import type { AgentToolResult } from "@earendil-works/pi-agent-core";
|
|
|
4
4
|
import { getPiSpawnCommand } from "../../runs/shared/pi-spawn.ts";
|
|
5
5
|
import { getProjectSubagentsDir } from "../../shared/artifacts.ts";
|
|
6
6
|
import { writeAtomicJson } from "../../shared/atomic-json.ts";
|
|
7
|
-
import type { Details } from "../../shared/types.ts";
|
|
7
|
+
import type { Details, HerdrProjectPaneSnapshot, SubagentState } from "../../shared/types.ts";
|
|
8
8
|
import { createHerdrClient, detectHerdr, type HerdrClient, type HerdrErrorCode } from "./client.ts";
|
|
9
|
+
import { focusHerdrPane, herdrPaneFocusTarget, herdrPaneRecord } from "./focus.ts";
|
|
9
10
|
import { formatShellCommand } from "./shell-command.ts";
|
|
10
11
|
|
|
11
12
|
export const HERDR_PROJECT_PANE_ACTIONS = ["project.open", "project.status", "project.close"] as const;
|
|
@@ -34,6 +35,9 @@ export interface ProjectPaneRuntime {
|
|
|
34
35
|
cwd?: string;
|
|
35
36
|
foregroundCwd?: string;
|
|
36
37
|
focused?: boolean;
|
|
38
|
+
tabId?: string;
|
|
39
|
+
workspaceId?: string;
|
|
40
|
+
summary?: string;
|
|
37
41
|
terminalTitle?: string;
|
|
38
42
|
}
|
|
39
43
|
|
|
@@ -44,6 +48,7 @@ export type ProjectPaneErrorCode = HerdrErrorCode
|
|
|
44
48
|
| "BINDING_READ_FAILED"
|
|
45
49
|
| "BINDING_WRITE_FAILED"
|
|
46
50
|
| "BINDING_REMOVE_FAILED"
|
|
51
|
+
| "PANE_FOCUS_UNSUPPORTED"
|
|
47
52
|
| "PANE_NOT_IDLE"
|
|
48
53
|
| "PANE_OWNERSHIP_UNVERIFIED";
|
|
49
54
|
|
|
@@ -87,6 +92,13 @@ export interface CloseProjectPaneData extends ProjectPaneCommonData {
|
|
|
87
92
|
runtime?: ProjectPaneRuntime;
|
|
88
93
|
}
|
|
89
94
|
|
|
95
|
+
export interface FocusProjectPaneData extends ProjectPaneCommonData {
|
|
96
|
+
binding: HerdrProjectPaneBinding;
|
|
97
|
+
runtime: ProjectPaneRuntime;
|
|
98
|
+
ownership: "verified" | "unknown" | "mismatch";
|
|
99
|
+
focused: { paneId: string; tabId?: string; workspaceId?: string };
|
|
100
|
+
}
|
|
101
|
+
|
|
90
102
|
export interface OpenProjectPaneOptions {
|
|
91
103
|
cwd: string;
|
|
92
104
|
message?: string;
|
|
@@ -106,12 +118,7 @@ export interface CloseProjectPaneOptions {
|
|
|
106
118
|
signal?: AbortSignal;
|
|
107
119
|
}
|
|
108
120
|
|
|
109
|
-
export
|
|
110
|
-
run<T = unknown>(
|
|
111
|
-
args: string[],
|
|
112
|
-
options?: { timeoutMs?: number; signal?: AbortSignal; textOk?: boolean },
|
|
113
|
-
): Promise<{ ok: true; data: T } | { ok: false; error: { code: HerdrErrorCode; message: string; details?: unknown } }>;
|
|
114
|
-
}
|
|
121
|
+
export type ProjectPaneCommandClient = Pick<HerdrClient, "run">;
|
|
115
122
|
|
|
116
123
|
export interface ProjectPaneManagerOptions {
|
|
117
124
|
client?: ProjectPaneCommandClient;
|
|
@@ -121,6 +128,7 @@ export interface ProjectPaneManagerOptions {
|
|
|
121
128
|
export interface ProjectPaneManager {
|
|
122
129
|
open(options: OpenProjectPaneOptions): Promise<ProjectPaneResult<OpenProjectPaneData>>;
|
|
123
130
|
status(options: GetProjectPaneStatusOptions): Promise<ProjectPaneResult<ProjectPaneStatusData>>;
|
|
131
|
+
focus(options: GetProjectPaneStatusOptions): Promise<ProjectPaneResult<FocusProjectPaneData>>;
|
|
124
132
|
close(options: CloseProjectPaneOptions): Promise<ProjectPaneResult<CloseProjectPaneData>>;
|
|
125
133
|
}
|
|
126
134
|
|
|
@@ -129,6 +137,12 @@ interface InternalProjectPaneManagerOptions extends ProjectPaneManagerOptions {
|
|
|
129
137
|
legacyToolCompatibility?: boolean;
|
|
130
138
|
}
|
|
131
139
|
|
|
140
|
+
interface HerdrProjectPaneRootIndex {
|
|
141
|
+
schemaVersion: 1;
|
|
142
|
+
kind: "herdr-project-pane-roots";
|
|
143
|
+
projectRoots: string[];
|
|
144
|
+
}
|
|
145
|
+
|
|
132
146
|
interface ProjectPaneParams {
|
|
133
147
|
cwd?: string;
|
|
134
148
|
message?: string;
|
|
@@ -137,6 +151,7 @@ interface ProjectPaneParams {
|
|
|
137
151
|
|
|
138
152
|
interface ProjectPaneDeps {
|
|
139
153
|
cwd: string;
|
|
154
|
+
state?: SubagentState;
|
|
140
155
|
client?: HerdrClient;
|
|
141
156
|
signal?: AbortSignal;
|
|
142
157
|
now?: () => Date;
|
|
@@ -162,6 +177,51 @@ export function projectPaneBindingPath(projectRoot: string): string {
|
|
|
162
177
|
return path.join(projectPaneDir(projectRoot), "herdr.json");
|
|
163
178
|
}
|
|
164
179
|
|
|
180
|
+
function projectPaneRootIndexPath(ownerRoot: string): string {
|
|
181
|
+
return path.join(projectPaneDir(ownerRoot), "herdr-roots.json");
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
function parseRootIndex(value: unknown): string[] {
|
|
185
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) throw new Error("Invalid Herdr project pane root index.");
|
|
186
|
+
const input = value as Partial<HerdrProjectPaneRootIndex>;
|
|
187
|
+
if (input.schemaVersion !== 1 || input.kind !== "herdr-project-pane-roots" || !Array.isArray(input.projectRoots)) throw new Error("Invalid Herdr project pane root index.");
|
|
188
|
+
if (!input.projectRoots.every((root) => typeof root === "string" && root.length > 0)) throw new Error("Invalid Herdr project pane root index.");
|
|
189
|
+
return input.projectRoots;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
export function listHerdrProjectPaneRoots(ownerRoot: string): string[] {
|
|
193
|
+
try {
|
|
194
|
+
return parseRootIndex(JSON.parse(fs.readFileSync(projectPaneRootIndexPath(ownerRoot), "utf-8")));
|
|
195
|
+
} catch (error) {
|
|
196
|
+
const code = (error as NodeJS.ErrnoException).code;
|
|
197
|
+
if (code === "ENOENT" || code === "ENOTDIR") return [];
|
|
198
|
+
throw error;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
function writeHerdrProjectPaneRoot(ownerRoot: string, projectRoot: string): void {
|
|
203
|
+
const projectRoots = [...new Set([...listHerdrProjectPaneRoots(ownerRoot), projectRoot])].sort();
|
|
204
|
+
writeAtomicJson(projectPaneRootIndexPath(ownerRoot), {
|
|
205
|
+
schemaVersion: 1,
|
|
206
|
+
kind: "herdr-project-pane-roots",
|
|
207
|
+
projectRoots,
|
|
208
|
+
} satisfies HerdrProjectPaneRootIndex);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
function removeHerdrProjectPaneRoot(ownerRoot: string, projectRoot: string): void {
|
|
212
|
+
const projectRoots = listHerdrProjectPaneRoots(ownerRoot).filter((root) => root !== projectRoot);
|
|
213
|
+
const file = projectPaneRootIndexPath(ownerRoot);
|
|
214
|
+
if (projectRoots.length === 0) {
|
|
215
|
+
fs.rmSync(file, { force: true });
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
writeAtomicJson(file, {
|
|
219
|
+
schemaVersion: 1,
|
|
220
|
+
kind: "herdr-project-pane-roots",
|
|
221
|
+
projectRoots,
|
|
222
|
+
} satisfies HerdrProjectPaneRootIndex);
|
|
223
|
+
}
|
|
224
|
+
|
|
165
225
|
function parseBinding(value: unknown, strict = false): HerdrProjectPaneBinding | undefined {
|
|
166
226
|
if (!value || typeof value !== "object" || Array.isArray(value)) return undefined;
|
|
167
227
|
const input = value as Partial<HerdrProjectPaneBinding>;
|
|
@@ -224,27 +284,60 @@ export function readProjectPaneBinding(projectRoot: string): ProjectPaneResult<H
|
|
|
224
284
|
return { ok: true, data: read.binding };
|
|
225
285
|
}
|
|
226
286
|
|
|
227
|
-
function
|
|
287
|
+
function herdrProjectPaneSnapshotFromBinding(binding: HerdrProjectPaneBinding, now = Date.now()): HerdrProjectPaneSnapshot {
|
|
288
|
+
return {
|
|
289
|
+
projectRoot: binding.projectRoot,
|
|
290
|
+
bindingPath: projectPaneBindingPath(binding.projectRoot),
|
|
291
|
+
paneId: binding.paneId,
|
|
292
|
+
openedAt: binding.openedAt,
|
|
293
|
+
...(binding.lastFocusedAt ? { lastFocusedAt: binding.lastFocusedAt } : {}),
|
|
294
|
+
state: "open",
|
|
295
|
+
agentStatus: "unknown",
|
|
296
|
+
ownership: "unknown",
|
|
297
|
+
safeToClose: false,
|
|
298
|
+
refreshedAt: now,
|
|
299
|
+
};
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
export function restoreHerdrProjectPaneSnapshots(state: SubagentState, projectRoots: Iterable<string>, now = Date.now()): void {
|
|
303
|
+
const restored = new Map(state.herdrProjectPanes ?? []);
|
|
304
|
+
for (const projectRoot of projectRoots) {
|
|
305
|
+
const binding = readHerdrProjectPaneBinding(projectRoot);
|
|
306
|
+
if (binding) restored.set(binding.projectRoot, herdrProjectPaneSnapshotFromBinding(binding, now));
|
|
307
|
+
}
|
|
308
|
+
state.herdrProjectPanes = restored;
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
function sanitizedSummary(value: unknown): string | undefined {
|
|
312
|
+
if (typeof value !== "string") return undefined;
|
|
313
|
+
const cleaned = value.replace(/[\u0000-\u001f\u007f]/g, " ").replace(/\s+/g, " ").trim();
|
|
314
|
+
return cleaned ? cleaned.slice(0, 120) : undefined;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
function nestedRecord(value: unknown, key: string): Record<string, unknown> | undefined {
|
|
228
318
|
if (!value || typeof value !== "object" || Array.isArray(value)) return undefined;
|
|
229
|
-
const
|
|
230
|
-
return
|
|
231
|
-
? record.pane as Record<string, unknown>
|
|
232
|
-
: record;
|
|
319
|
+
const child = (value as Record<string, unknown>)[key];
|
|
320
|
+
return child && typeof child === "object" && !Array.isArray(child) ? child as Record<string, unknown> : undefined;
|
|
233
321
|
}
|
|
234
322
|
|
|
235
|
-
function
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
323
|
+
function paneSummary(pane: Record<string, unknown>): string | undefined {
|
|
324
|
+
return sanitizedSummary(pane.summary)
|
|
325
|
+
?? sanitizedSummary(pane.state_text)
|
|
326
|
+
?? sanitizedSummary(pane.stateText)
|
|
327
|
+
?? sanitizedSummary(pane.token_summary)
|
|
328
|
+
?? sanitizedSummary(nestedRecord(pane, "tokens")?.summary)
|
|
329
|
+
?? sanitizedSummary(nestedRecord(pane, "metadata")?.summary)
|
|
330
|
+
?? sanitizedSummary(nestedRecord(nestedRecord(pane, "metadata"), "tokens")?.summary);
|
|
240
331
|
}
|
|
241
332
|
|
|
242
333
|
function projectPaneRuntime(value: unknown): ProjectPaneRuntime | undefined {
|
|
243
|
-
const pane =
|
|
244
|
-
const
|
|
334
|
+
const pane = herdrPaneRecord(value);
|
|
335
|
+
const focusTarget = herdrPaneFocusTarget(value);
|
|
336
|
+
const paneId = focusTarget.paneId;
|
|
245
337
|
if (!pane || !paneId) return undefined;
|
|
246
338
|
const text = (key: string): string | undefined => typeof pane[key] === "string" ? pane[key] as string : undefined;
|
|
247
339
|
const agentStatus = text("agent_status") ?? text("agentStatus") ?? "unknown";
|
|
340
|
+
const summary = paneSummary(pane);
|
|
248
341
|
return {
|
|
249
342
|
paneId,
|
|
250
343
|
...(text("agent") ? { agent: text("agent") } : {}),
|
|
@@ -252,12 +345,48 @@ function projectPaneRuntime(value: unknown): ProjectPaneRuntime | undefined {
|
|
|
252
345
|
...(text("cwd") ? { cwd: text("cwd") } : {}),
|
|
253
346
|
...(text("foreground_cwd") || text("foregroundCwd") ? { foregroundCwd: text("foreground_cwd") ?? text("foregroundCwd") } : {}),
|
|
254
347
|
...(typeof pane.focused === "boolean" ? { focused: pane.focused } : {}),
|
|
348
|
+
...(focusTarget.tabId ? { tabId: focusTarget.tabId } : {}),
|
|
349
|
+
...(focusTarget.workspaceId ? { workspaceId: focusTarget.workspaceId } : {}),
|
|
350
|
+
...(summary ? { summary } : {}),
|
|
255
351
|
...(text("terminal_title_stripped") || text("terminal_title") || text("terminalTitle")
|
|
256
352
|
? { terminalTitle: text("terminal_title_stripped") ?? text("terminal_title") ?? text("terminalTitle") }
|
|
257
353
|
: {}),
|
|
258
354
|
};
|
|
259
355
|
}
|
|
260
356
|
|
|
357
|
+
function herdrProjectPaneSnapshotFromStatus(data: ProjectPaneStatusData, now: number): HerdrProjectPaneSnapshot | undefined {
|
|
358
|
+
if (data.state === "absent" || !data.binding) return undefined;
|
|
359
|
+
return {
|
|
360
|
+
projectRoot: data.projectRoot,
|
|
361
|
+
bindingPath: data.bindingPath,
|
|
362
|
+
paneId: data.binding.paneId,
|
|
363
|
+
openedAt: data.binding.openedAt,
|
|
364
|
+
...(data.binding.lastFocusedAt ? { lastFocusedAt: data.binding.lastFocusedAt } : {}),
|
|
365
|
+
state: data.state,
|
|
366
|
+
agentStatus: data.runtime?.agentStatus ?? "unknown",
|
|
367
|
+
ownership: data.ownership,
|
|
368
|
+
safeToClose: data.safeToClose,
|
|
369
|
+
refreshedAt: now,
|
|
370
|
+
...(data.runtime?.summary ? { summary: data.runtime.summary } : {}),
|
|
371
|
+
...(data.runtime?.tabId ? { tabId: data.runtime.tabId } : {}),
|
|
372
|
+
...(data.runtime?.workspaceId ? { workspaceId: data.runtime.workspaceId } : {}),
|
|
373
|
+
...(data.runtime?.terminalTitle ? { terminalTitle: data.runtime.terminalTitle } : {}),
|
|
374
|
+
...(data.staleReason ? { staleReason: data.staleReason.message } : {}),
|
|
375
|
+
};
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
function rememberProjectPane(state: SubagentState | undefined, data: ProjectPaneStatusData, now: number): void {
|
|
379
|
+
if (!state) return;
|
|
380
|
+
state.herdrProjectPanes ??= new Map();
|
|
381
|
+
const snapshot = herdrProjectPaneSnapshotFromStatus(data, now);
|
|
382
|
+
if (snapshot) state.herdrProjectPanes.set(data.projectRoot, snapshot);
|
|
383
|
+
else state.herdrProjectPanes.delete(data.projectRoot);
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
function forgetProjectPane(state: SubagentState | undefined, projectRoot: string): void {
|
|
387
|
+
state?.herdrProjectPanes?.delete(projectRoot);
|
|
388
|
+
}
|
|
389
|
+
|
|
261
390
|
function resolveProjectRoot(requested: string): ProjectPaneResult<string> {
|
|
262
391
|
const resolved = path.resolve(requested);
|
|
263
392
|
try {
|
|
@@ -379,6 +508,41 @@ function createProjectPaneManagerInternal(options: InternalProjectPaneManagerOpt
|
|
|
379
508
|
} };
|
|
380
509
|
},
|
|
381
510
|
|
|
511
|
+
async focus(input) {
|
|
512
|
+
const status = await this.status(input);
|
|
513
|
+
if (!status.ok) return projectPaneError(status.error.code, status.error.message, status.error);
|
|
514
|
+
if (status.data.state !== "open" || !status.data.binding || !status.data.runtime) {
|
|
515
|
+
return projectPaneError("PANE_GONE", `No open Herdr project pane binding exists for '${status.data.projectRoot}'.`, {
|
|
516
|
+
projectRoot: status.data.projectRoot, bindingPath: status.data.bindingPath,
|
|
517
|
+
});
|
|
518
|
+
}
|
|
519
|
+
if (status.data.ownership !== "verified") {
|
|
520
|
+
return projectPaneError("PANE_OWNERSHIP_UNVERIFIED", `Project pane '${status.data.binding.paneId}' ownership is '${status.data.ownership}' for '${status.data.projectRoot}'.`, {
|
|
521
|
+
projectRoot: status.data.projectRoot, bindingPath: status.data.bindingPath, details: status.data.runtime,
|
|
522
|
+
});
|
|
523
|
+
}
|
|
524
|
+
const focused = await focusHerdrPane(client, status.data.binding.paneId, input.signal);
|
|
525
|
+
if (!focused.ok) return projectPaneError(focused.error.code, focused.error.message, {
|
|
526
|
+
projectRoot: status.data.projectRoot, bindingPath: status.data.bindingPath, details: focused.error.details,
|
|
527
|
+
});
|
|
528
|
+
const now = (options.now?.() ?? new Date()).toISOString();
|
|
529
|
+
const binding = { ...status.data.binding, lastFocusedAt: now };
|
|
530
|
+
try {
|
|
531
|
+
writeAtomicJson(status.data.bindingPath, binding);
|
|
532
|
+
} catch (cause) {
|
|
533
|
+
return projectPaneError("BINDING_WRITE_FAILED", `Failed to update project pane binding '${status.data.bindingPath}': ${cause instanceof Error ? cause.message : String(cause)}`, {
|
|
534
|
+
projectRoot: status.data.projectRoot, bindingPath: status.data.bindingPath, details: fileSystemErrorDetails(cause),
|
|
535
|
+
});
|
|
536
|
+
}
|
|
537
|
+
return { ok: true, data: {
|
|
538
|
+
...common(status.data.projectRoot),
|
|
539
|
+
binding,
|
|
540
|
+
runtime: status.data.runtime,
|
|
541
|
+
ownership: status.data.ownership,
|
|
542
|
+
focused: focused.data,
|
|
543
|
+
} };
|
|
544
|
+
},
|
|
545
|
+
|
|
382
546
|
async open(input) {
|
|
383
547
|
const root = resolveProjectRoot(input.cwd);
|
|
384
548
|
if (!root.ok) return root;
|
|
@@ -411,10 +575,10 @@ function createProjectPaneManagerInternal(options: InternalProjectPaneManagerOpt
|
|
|
411
575
|
}
|
|
412
576
|
}
|
|
413
577
|
const splitArgs = ["pane", "split", "--current", "--direction", "right", "--cwd", projectRoot];
|
|
414
|
-
|
|
578
|
+
splitArgs.push(input.focus === true ? "--focus" : "--no-focus");
|
|
415
579
|
const split = await client.run(splitArgs, { timeoutMs: 15_000, signal: input.signal });
|
|
416
580
|
if (!split.ok) return projectPaneError(split.error.code, split.error.message, { projectRoot, details: split.error.details });
|
|
417
|
-
const paneId =
|
|
581
|
+
const paneId = herdrPaneFocusTarget(split.data).paneId;
|
|
418
582
|
if (!paneId) return projectPaneError(options.legacyToolCompatibility ? "PANE_GONE" : "INVALID_PANE_RESPONSE", "Herdr pane split returned no pane id.", { projectRoot, details: split.data });
|
|
419
583
|
const startupMessage = input.message?.trim();
|
|
420
584
|
const command = projectPaneCommand(startupMessage);
|
|
@@ -430,7 +594,7 @@ function createProjectPaneManagerInternal(options: InternalProjectPaneManagerOpt
|
|
|
430
594
|
projectRoot,
|
|
431
595
|
paneId,
|
|
432
596
|
openedAt: now,
|
|
433
|
-
...(input.focus
|
|
597
|
+
...(input.focus === true ? { lastFocusedAt: now } : {}),
|
|
434
598
|
herdrVersion: detected.data.versionText,
|
|
435
599
|
command,
|
|
436
600
|
...(startupMessage ? { startupMessage } : {}),
|
|
@@ -466,29 +630,26 @@ function createProjectPaneManagerInternal(options: InternalProjectPaneManagerOpt
|
|
|
466
630
|
if (!bindingResult.ok) return bindingResult;
|
|
467
631
|
const existing = bindingResult.data;
|
|
468
632
|
if (!existing) return { ok: true, data: { ...common(projectRoot), disposition: "absent" } };
|
|
469
|
-
|
|
470
|
-
if (
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
if (
|
|
474
|
-
|
|
475
|
-
if (!removed.ok) return removed;
|
|
476
|
-
return { ok: true, data: { ...common(projectRoot), disposition: "stale-binding-removed", binding: existing } };
|
|
477
|
-
}
|
|
478
|
-
return { ok: false, error: { ...live.error, projectRoot, bindingPath: projectPaneBindingPath(projectRoot) } };
|
|
479
|
-
}
|
|
480
|
-
runtime = live.data;
|
|
481
|
-
const ownership = projectPaneOwnership(runtime, existing, projectRoot);
|
|
482
|
-
if (ownership !== "verified") {
|
|
483
|
-
return projectPaneError("PANE_OWNERSHIP_UNVERIFIED", `Project pane '${existing.paneId}' ownership is '${ownership}' for '${projectRoot}'.`, {
|
|
484
|
-
projectRoot, bindingPath: projectPaneBindingPath(projectRoot), details: runtime,
|
|
485
|
-
});
|
|
486
|
-
}
|
|
487
|
-
if (runtime.agentStatus !== "idle") {
|
|
488
|
-
return projectPaneError("PANE_NOT_IDLE", `Project pane '${existing.paneId}' is '${runtime.agentStatus}', not explicitly idle.`, {
|
|
489
|
-
projectRoot, bindingPath: projectPaneBindingPath(projectRoot), details: runtime,
|
|
490
|
-
});
|
|
633
|
+
const live = await inspectPane(client, existing.paneId, input.signal);
|
|
634
|
+
if (!live.ok) {
|
|
635
|
+
if (live.error.code === "NOT_FOUND" || live.error.code === "PANE_GONE") {
|
|
636
|
+
const removed = removeProjectPaneBinding(projectRoot);
|
|
637
|
+
if (!removed.ok) return removed;
|
|
638
|
+
return { ok: true, data: { ...common(projectRoot), disposition: "stale-binding-removed", binding: existing } };
|
|
491
639
|
}
|
|
640
|
+
return { ok: false, error: { ...live.error, projectRoot, bindingPath: projectPaneBindingPath(projectRoot) } };
|
|
641
|
+
}
|
|
642
|
+
const runtime = live.data;
|
|
643
|
+
const ownership = projectPaneOwnership(runtime, existing, projectRoot);
|
|
644
|
+
if (ownership !== "verified") {
|
|
645
|
+
return projectPaneError("PANE_OWNERSHIP_UNVERIFIED", `Project pane '${existing.paneId}' ownership is '${ownership}' for '${projectRoot}'.`, {
|
|
646
|
+
projectRoot, bindingPath: projectPaneBindingPath(projectRoot), details: runtime,
|
|
647
|
+
});
|
|
648
|
+
}
|
|
649
|
+
if (runtime.agentStatus !== "idle") {
|
|
650
|
+
return projectPaneError("PANE_NOT_IDLE", `Project pane '${existing.paneId}' is '${runtime.agentStatus}', not explicitly idle.`, {
|
|
651
|
+
projectRoot, bindingPath: projectPaneBindingPath(projectRoot), details: runtime,
|
|
652
|
+
});
|
|
492
653
|
}
|
|
493
654
|
const closed = await client.run(["pane", "close", existing.paneId], { timeoutMs: 10_000, signal: input.signal });
|
|
494
655
|
if (!closed.ok && closed.error.code !== "NOT_FOUND" && closed.error.code !== "PANE_GONE") {
|
|
@@ -518,12 +679,19 @@ export async function closeProjectPane(options: CloseProjectPaneOptions): Promis
|
|
|
518
679
|
return createProjectPaneManager().close(options);
|
|
519
680
|
}
|
|
520
681
|
|
|
682
|
+
export async function focusProjectPane(options: GetProjectPaneStatusOptions): Promise<ProjectPaneResult<FocusProjectPaneData>> {
|
|
683
|
+
return createProjectPaneManager().focus(options);
|
|
684
|
+
}
|
|
685
|
+
|
|
521
686
|
export async function handleHerdrProjectPaneAction(action: HerdrProjectPaneAction, params: ProjectPaneParams, deps: ProjectPaneDeps): Promise<AgentToolResult<Details>> {
|
|
522
687
|
const requested = params.cwd?.trim() || deps.cwd;
|
|
688
|
+
const ownerRoot = path.resolve(deps.cwd);
|
|
523
689
|
const manager = createProjectPaneManagerInternal({ client: deps.client, now: deps.now, legacyToolCompatibility: true });
|
|
690
|
+
const remember = (data: ProjectPaneStatusData) => rememberProjectPane(deps.state, data, deps.now?.().getTime() ?? Date.now());
|
|
524
691
|
if (action === "project.status") {
|
|
525
692
|
const status = await manager.status({ cwd: requested, signal: deps.signal });
|
|
526
693
|
if (!status.ok) return toolResult(formatProjectPaneError(status.error), true);
|
|
694
|
+
remember(status.data);
|
|
527
695
|
if (status.data.state === "absent") return toolResult(`No Herdr project pane binding exists for ${status.data.projectRoot}.`);
|
|
528
696
|
if (status.data.state === "stale") {
|
|
529
697
|
const reason = status.data.staleReason!;
|
|
@@ -532,15 +700,31 @@ export async function handleHerdrProjectPaneAction(action: HerdrProjectPaneActio
|
|
|
532
700
|
return toolResult(`Herdr project pane ${status.data.binding!.paneId} is open for ${status.data.projectRoot}.\nBinding: ${status.data.bindingPath}`);
|
|
533
701
|
}
|
|
534
702
|
if (action === "project.close") {
|
|
535
|
-
const closed = await manager.close({ cwd: requested, signal: deps.signal });
|
|
703
|
+
const closed = await manager.close({ cwd: requested, requireIdle: true, signal: deps.signal });
|
|
536
704
|
if (!closed.ok) return toolResult(formatProjectPaneError(closed.error), true);
|
|
705
|
+
forgetProjectPane(deps.state, closed.data.projectRoot);
|
|
706
|
+
try { removeHerdrProjectPaneRoot(ownerRoot, closed.data.projectRoot); } catch (error) {
|
|
707
|
+
return toolResult(`Herdr project pane error (BINDING_REMOVE_FAILED): Failed to remove project pane root index '${projectPaneRootIndexPath(ownerRoot)}': ${error instanceof Error ? error.message : String(error)}`, true);
|
|
708
|
+
}
|
|
537
709
|
if (closed.data.disposition === "absent") return toolResult(`No Herdr project pane binding exists for ${closed.data.projectRoot}.`);
|
|
538
710
|
return toolResult(`Closed Herdr project pane ${closed.data.binding!.paneId} for ${closed.data.projectRoot}.`);
|
|
539
711
|
}
|
|
540
712
|
const opened = await manager.open({ cwd: requested, message: params.message, focus: params.focus, signal: deps.signal });
|
|
541
713
|
if (!opened.ok) return toolResult(formatProjectPaneError(opened.error), true);
|
|
714
|
+
try { writeHerdrProjectPaneRoot(ownerRoot, opened.data.projectRoot); } catch (error) {
|
|
715
|
+
return toolResult(`Herdr project pane error (BINDING_WRITE_FAILED): Failed to persist project pane root index '${projectPaneRootIndexPath(ownerRoot)}': ${error instanceof Error ? error.message : String(error)}`, true);
|
|
716
|
+
}
|
|
717
|
+
const status = await manager.status({ cwd: opened.data.projectRoot, signal: deps.signal });
|
|
718
|
+
if (status.ok) remember(status.data);
|
|
542
719
|
if (opened.data.disposition === "already-open") {
|
|
543
|
-
|
|
720
|
+
if (params.focus) {
|
|
721
|
+
const focused = await manager.focus({ cwd: opened.data.projectRoot, signal: deps.signal });
|
|
722
|
+
if (!focused.ok) return toolResult(`Herdr project pane ${opened.data.binding.paneId} is already open for ${opened.data.projectRoot}. ${formatProjectPaneError(focused.error)}`, true);
|
|
723
|
+
const focusedStatus = await manager.status({ cwd: opened.data.projectRoot, signal: deps.signal });
|
|
724
|
+
if (focusedStatus.ok) remember(focusedStatus.data);
|
|
725
|
+
return toolResult(`Herdr project pane ${opened.data.binding.paneId} is already open for ${opened.data.projectRoot}. Focused ${focused.data.focused.tabId ? `tab ${focused.data.focused.tabId}` : `workspace ${focused.data.focused.workspaceId}`}.`);
|
|
726
|
+
}
|
|
727
|
+
return toolResult(`Herdr project pane ${opened.data.binding.paneId} is already open for ${opened.data.projectRoot}.`);
|
|
544
728
|
}
|
|
545
729
|
return toolResult(`Opened Herdr project pane ${opened.data.binding.paneId} for ${opened.data.projectRoot}. The pane runs its own Pi session; subagents launched there belong to that project.`);
|
|
546
730
|
}
|
|
@@ -33,6 +33,8 @@ export interface HerdrStatusBridgeOptions {
|
|
|
33
33
|
env?: Record<string, string | undefined>;
|
|
34
34
|
/** Current authoritative active-run projection, used before TTL refresh. */
|
|
35
35
|
getRuns?: () => Iterable<HerdrStatusRun>;
|
|
36
|
+
/** Current project panes opened by this Pi session. Views are excluded. */
|
|
37
|
+
getProjectPaneCount?: () => number;
|
|
36
38
|
runHerdr: (args: readonly string[]) => void | Promise<void>;
|
|
37
39
|
ttlMs?: number;
|
|
38
40
|
refreshMs?: number;
|
|
@@ -109,12 +111,27 @@ export function registerHerdrStatusBridge(options: HerdrStatusBridgeOptions): He
|
|
|
109
111
|
let drainPromise = Promise.resolve();
|
|
110
112
|
let refreshTimer: ReturnType<typeof setInterval> | undefined;
|
|
111
113
|
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
+
const activeAgentNames = (): string[] => [...new Set([...runs.values()].flatMap((run) => run.agents?.length ? run.agents : run.agent ? [run.agent] : []))];
|
|
115
|
+
const activeSubagentCount = (): number => [...runs.values()].reduce((total, run) => total + Math.max(1, run.agents?.length ?? (run.agent ? 1 : 0)), 0);
|
|
116
|
+
|
|
117
|
+
const label = (includeAttention = false): string => {
|
|
118
|
+
const agents = activeAgentNames();
|
|
119
|
+
const activeCount = activeSubagentCount();
|
|
114
120
|
const who = agents.length > 0
|
|
115
121
|
? ` (${agents.slice(0, 3).join(", ")}${agents.length > 3 ? ", …" : ""})`
|
|
116
122
|
: "";
|
|
117
|
-
|
|
123
|
+
const panes = Math.max(0, options.getProjectPaneCount?.() ?? 0);
|
|
124
|
+
const paneText = panes > 0 ? ` · ${panes} pane${panes === 1 ? "" : "s"}` : "";
|
|
125
|
+
const attention = includeAttention && attentionLabels.size > 0 ? " ⚠" : "";
|
|
126
|
+
return `⏳ ${activeCount} subagent${activeCount === 1 ? "" : "s"}${who}${paneText}${attention}`;
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
const titleSuffix = (): string | undefined => {
|
|
130
|
+
if (runs.size === 0) return undefined;
|
|
131
|
+
const agentNames = activeAgentNames();
|
|
132
|
+
const activeCount = activeSubagentCount();
|
|
133
|
+
const target = activeCount === 1 && agentNames.length === 1 ? agentNames[0]! : String(activeCount);
|
|
134
|
+
return `⏳${target}${attentionLabels.size > 0 ? "⚠" : ""}`;
|
|
118
135
|
};
|
|
119
136
|
|
|
120
137
|
const enqueue = (args: readonly string[]): void => {
|
|
@@ -150,11 +167,13 @@ export function registerHerdrStatusBridge(options: HerdrStatusBridgeOptions): He
|
|
|
150
167
|
"--applies-to-source", "herdr:pi",
|
|
151
168
|
"--clear-state-labels",
|
|
152
169
|
"--clear-token", "summary",
|
|
170
|
+
"--clear-token", "title-suffix",
|
|
153
171
|
"--seq", seq,
|
|
154
172
|
]);
|
|
155
173
|
return;
|
|
156
174
|
}
|
|
157
|
-
const text = label();
|
|
175
|
+
const text = label(true);
|
|
176
|
+
const suffix = titleSuffix();
|
|
158
177
|
published = true;
|
|
159
178
|
enqueue([
|
|
160
179
|
"pane", "report-metadata", paneId,
|
|
@@ -165,6 +184,7 @@ export function registerHerdrStatusBridge(options: HerdrStatusBridgeOptions): He
|
|
|
165
184
|
"--state-label", `done=${text}`,
|
|
166
185
|
"--state-label", `working=${text}`,
|
|
167
186
|
"--token", `summary=${text}`,
|
|
187
|
+
...(suffix ? ["--token", `title-suffix=${suffix}`] : []),
|
|
168
188
|
"--ttl-ms", String(ttlMs),
|
|
169
189
|
"--seq", seq,
|
|
170
190
|
]);
|
|
@@ -221,6 +241,7 @@ export function registerHerdrStatusBridge(options: HerdrStatusBridgeOptions): He
|
|
|
221
241
|
const clearAttention = (): void => {
|
|
222
242
|
attentionLabels.clear();
|
|
223
243
|
syncBlocked();
|
|
244
|
+
publish();
|
|
224
245
|
};
|
|
225
246
|
|
|
226
247
|
const raiseAttention = (runId: string, labelText: string): void => {
|
|
@@ -228,6 +249,7 @@ export function registerHerdrStatusBridge(options: HerdrStatusBridgeOptions): He
|
|
|
228
249
|
acknowledgedAttention.delete(runId);
|
|
229
250
|
attentionLabels.set(runId, labelText);
|
|
230
251
|
syncBlocked();
|
|
252
|
+
publish();
|
|
231
253
|
};
|
|
232
254
|
|
|
233
255
|
const replaceRuns = (nextRuns: Iterable<HerdrStatusRun>): void => {
|
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
} from "../runs/shared/pi-args.ts";
|
|
15
15
|
import { INTERCOM_DETACH_REQUEST_EVENT, POLL_INTERVAL_MS, TEMP_ROOT_DIR, type IntercomEventBus, type SubagentState } from "../shared/types.ts";
|
|
16
16
|
import { writeAtomicJson } from "../shared/atomic-json.ts";
|
|
17
|
+
import { shouldUseNativeFsWatch } from "../shared/watch-strategy.ts";
|
|
17
18
|
|
|
18
19
|
const SUPERVISOR_CHANNEL_ROOT = path.join(TEMP_ROOT_DIR, "supervisor-channels");
|
|
19
20
|
const REQUESTS_DIR = "requests";
|
|
@@ -75,6 +76,7 @@ type SupervisorWatch = (filename: fs.PathLike, listener: fs.WatchListener<string
|
|
|
75
76
|
interface NativeSupervisorChannelDeps {
|
|
76
77
|
platform?: NodeJS.Platform;
|
|
77
78
|
watch?: SupervisorWatch;
|
|
79
|
+
timers?: Pick<typeof globalThis, "setInterval" | "clearInterval" | "setImmediate" | "clearImmediate">;
|
|
78
80
|
}
|
|
79
81
|
|
|
80
82
|
const ContactSupervisorParamsSchema = Type.Object({
|
|
@@ -462,7 +464,7 @@ function clearForegroundSupervisorAttention(request: SupervisorRequest, pending:
|
|
|
462
464
|
&& candidate.childIndex === request.childIndex
|
|
463
465
|
)) return;
|
|
464
466
|
const remembered = rememberedForegroundChild(request, state);
|
|
465
|
-
if (!remembered || remembered.child.status !== "detached"
|
|
467
|
+
if (!remembered || remembered.child.status !== "detached") return;
|
|
466
468
|
const updatedAt = Date.now();
|
|
467
469
|
remembered.run.updatedAt = updatedAt;
|
|
468
470
|
remembered.child.activityState = undefined;
|
|
@@ -612,8 +614,9 @@ function buildParentSupervisorTool(pending: Map<string, PendingSupervisorRequest
|
|
|
612
614
|
};
|
|
613
615
|
}
|
|
614
616
|
|
|
615
|
-
export function createNativeSupervisorChannel(pi: ExtensionAPI, state: SubagentState, deps: NativeSupervisorChannelDeps = {}): { start: () => void; dispose: () => void; pending: Map<string, PendingSupervisorRequest> } {
|
|
617
|
+
export function createNativeSupervisorChannel(pi: ExtensionAPI, state: SubagentState, deps: NativeSupervisorChannelDeps = {}): { start: () => void; activateTransport: () => void; dispose: () => void; pending: Map<string, PendingSupervisorRequest> } {
|
|
616
618
|
const watch = deps.watch ?? fs.watch;
|
|
619
|
+
const timers = deps.timers ?? globalThis;
|
|
617
620
|
const pending = new Map<string, PendingSupervisorRequest>();
|
|
618
621
|
const seenFiles = new Set<string>();
|
|
619
622
|
const requestWatchers = new Map<string, fs.FSWatcher>();
|
|
@@ -623,6 +626,13 @@ export function createNativeSupervisorChannel(pi: ExtensionAPI, state: SubagentS
|
|
|
623
626
|
let deferredWatcherRefresh: ReturnType<typeof setImmediate> | undefined;
|
|
624
627
|
let started = false;
|
|
625
628
|
let lastStaleCleanupAt = 0;
|
|
629
|
+
const platform = deps.platform ?? process.platform;
|
|
630
|
+
const useNativeWatcher = () => shouldUseNativeFsWatch("supervisor-channel", platform) && platform !== "win32";
|
|
631
|
+
const hasTransportDemand = () => {
|
|
632
|
+
if (pending.size > 0) return true;
|
|
633
|
+
if (state.foregroundControls.size > 0) return true;
|
|
634
|
+
return [...state.asyncJobs.values()].some((job) => job.status === "queued" || job.status === "running");
|
|
635
|
+
};
|
|
626
636
|
|
|
627
637
|
const registerParentTools = (): void => {
|
|
628
638
|
if (!hasTool(pi, NATIVE_SUPERVISOR_TOOL_NAME)) pi.registerTool(buildParentSupervisorTool(pending, state));
|
|
@@ -683,18 +693,25 @@ export function createNativeSupervisorChannel(pi: ExtensionAPI, state: SubagentS
|
|
|
683
693
|
agent: request.agent,
|
|
684
694
|
childIndex: request.childIndex,
|
|
685
695
|
});
|
|
696
|
+
if (pending.has(request.id)) markForegroundSupervisorAttention(request, state);
|
|
686
697
|
}
|
|
687
698
|
}
|
|
688
699
|
};
|
|
689
700
|
|
|
690
701
|
const startPolling = (): void => {
|
|
691
702
|
if (poller) return;
|
|
692
|
-
poller = setInterval(
|
|
703
|
+
poller = timers.setInterval(() => {
|
|
704
|
+
poll();
|
|
705
|
+
if (!useNativeWatcher() && platform === "darwin" && !hasTransportDemand()) {
|
|
706
|
+
if (poller) timers.clearInterval(poller);
|
|
707
|
+
poller = undefined;
|
|
708
|
+
}
|
|
709
|
+
}, CHANNEL_POLL_MS);
|
|
693
710
|
poller.unref?.();
|
|
694
711
|
};
|
|
695
712
|
const startSafetyPolling = (): void => {
|
|
696
713
|
if (safetyPoller) return;
|
|
697
|
-
safetyPoller = setInterval(() => {
|
|
714
|
+
safetyPoller = timers.setInterval(() => {
|
|
698
715
|
watchExistingRequestDirs();
|
|
699
716
|
poll();
|
|
700
717
|
}, CHANNEL_SAFETY_POLL_MS);
|
|
@@ -730,7 +747,7 @@ export function createNativeSupervisorChannel(pi: ExtensionAPI, state: SubagentS
|
|
|
730
747
|
};
|
|
731
748
|
const scheduleWatcherRefresh = (): void => {
|
|
732
749
|
if (deferredWatcherRefresh) return;
|
|
733
|
-
deferredWatcherRefresh = setImmediate(() => {
|
|
750
|
+
deferredWatcherRefresh = timers.setImmediate(() => {
|
|
734
751
|
deferredWatcherRefresh = undefined;
|
|
735
752
|
if (!started) return;
|
|
736
753
|
watchExistingRequestDirs();
|
|
@@ -740,6 +757,11 @@ export function createNativeSupervisorChannel(pi: ExtensionAPI, state: SubagentS
|
|
|
740
757
|
};
|
|
741
758
|
|
|
742
759
|
return {
|
|
760
|
+
activateTransport: () => {
|
|
761
|
+
if (!started) return;
|
|
762
|
+
poll();
|
|
763
|
+
if (!useNativeWatcher() && hasTransportDemand()) startPolling();
|
|
764
|
+
},
|
|
743
765
|
start: () => {
|
|
744
766
|
if (started) return;
|
|
745
767
|
started = true;
|
|
@@ -747,8 +769,8 @@ export function createNativeSupervisorChannel(pi: ExtensionAPI, state: SubagentS
|
|
|
747
769
|
poll();
|
|
748
770
|
try {
|
|
749
771
|
fs.mkdirSync(SUPERVISOR_CHANNEL_ROOT, { recursive: true });
|
|
750
|
-
if ((
|
|
751
|
-
startPolling();
|
|
772
|
+
if (!useNativeWatcher()) {
|
|
773
|
+
if (platform === "win32") startPolling();
|
|
752
774
|
return;
|
|
753
775
|
}
|
|
754
776
|
watchExistingRequestDirs();
|
|
@@ -776,11 +798,11 @@ export function createNativeSupervisorChannel(pi: ExtensionAPI, state: SubagentS
|
|
|
776
798
|
try { watcher.close(); } catch {}
|
|
777
799
|
}
|
|
778
800
|
requestWatchers.clear();
|
|
779
|
-
if (poller) clearInterval(poller);
|
|
801
|
+
if (poller) timers.clearInterval(poller);
|
|
780
802
|
poller = undefined;
|
|
781
|
-
if (safetyPoller) clearInterval(safetyPoller);
|
|
803
|
+
if (safetyPoller) timers.clearInterval(safetyPoller);
|
|
782
804
|
safetyPoller = undefined;
|
|
783
|
-
if (deferredWatcherRefresh) clearImmediate(deferredWatcherRefresh);
|
|
805
|
+
if (deferredWatcherRefresh) timers.clearImmediate(deferredWatcherRefresh);
|
|
784
806
|
deferredWatcherRefresh = undefined;
|
|
785
807
|
pending.clear();
|
|
786
808
|
seenFiles.clear();
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as fs from "node:fs";
|
|
2
2
|
import * as path from "node:path";
|
|
3
|
+
import { createHash } from "node:crypto";
|
|
3
4
|
import type { AgentToolResult } from "@earendil-works/pi-agent-core";
|
|
4
5
|
import { writePrivateAtomicJson } from "../shared/atomic-json.ts";
|
|
5
6
|
import { PROMPT_REDACTED } from "../shared/utils.ts";
|
|
@@ -294,13 +295,17 @@ export function syncMissionFromAsyncCompletion(value: unknown): MissionRecord |
|
|
|
294
295
|
current = readMission(binding.location, binding.missionId);
|
|
295
296
|
} catch (error) {
|
|
296
297
|
if (!(error instanceof MissionNotFoundError)) throw error;
|
|
298
|
+
const reason = "mission-record-missing";
|
|
299
|
+
const markerId = createHash("sha256").update(JSON.stringify([runId, binding.missionId, reason])).digest("hex");
|
|
300
|
+
const markerPath = path.join(event.asyncDir, `.mission-sync-skipped-${markerId}.json`);
|
|
297
301
|
try {
|
|
302
|
+
fs.writeFileSync(markerPath, `${JSON.stringify({ runId, missionId: binding.missionId, reason })}\n`, { encoding: "utf-8", mode: 0o600, flag: "wx" });
|
|
298
303
|
fs.appendFileSync(path.join(event.asyncDir, "events.jsonl"), `${JSON.stringify({
|
|
299
304
|
type: "subagent.mission.sync.skipped",
|
|
300
305
|
ts: Date.now(),
|
|
301
306
|
runId,
|
|
302
307
|
missionId: binding.missionId,
|
|
303
|
-
reason
|
|
308
|
+
reason,
|
|
304
309
|
missionPath: missionRecordPath(binding.location, binding.missionId),
|
|
305
310
|
})}\n`, "utf-8");
|
|
306
311
|
} catch {
|