@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
|
@@ -2,6 +2,7 @@ import * as fs from "node:fs";
|
|
|
2
2
|
import * as path from "node:path";
|
|
3
3
|
import { buildCompletionKey, markSeenWithTtl } from "./completion-dedupe.ts";
|
|
4
4
|
import { createFileCoalescer } from "../../shared/file-coalescer.ts";
|
|
5
|
+
import { shouldUseNativeFsWatch } from "../../shared/watch-strategy.ts";
|
|
5
6
|
import {
|
|
6
7
|
SUBAGENT_ASYNC_COMPLETE_EVENT,
|
|
7
8
|
type IntercomEventBus,
|
|
@@ -29,6 +30,7 @@ const WATCHER_RESTART_DELAY_MS = 3000;
|
|
|
29
30
|
const POLL_INTERVAL_MS = 3000;
|
|
30
31
|
const HEALTHY_SCAN_INTERVAL_MS = 60_000;
|
|
31
32
|
const RETRY_DELAY_MS = 100;
|
|
33
|
+
const SLOW_RESULT_SCAN_MS = 500;
|
|
32
34
|
|
|
33
35
|
type ResultWatcherFs = Pick<typeof fs, "existsSync" | "readFileSync" | "unlinkSync" | "readdirSync" | "mkdirSync" | "realpathSync" | "statSync" | "watch">;
|
|
34
36
|
|
|
@@ -53,6 +55,11 @@ type ResultWatcherDeps = {
|
|
|
53
55
|
deliverIntercomResults?: boolean;
|
|
54
56
|
/** Coalesces result-file events. Tests can lower this without changing retry timing. */
|
|
55
57
|
coalesceDelayMs?: number;
|
|
58
|
+
/** Returns true while a durable completion source needs periodic delivery checks. */
|
|
59
|
+
hasDeliveryDemand?: () => boolean;
|
|
60
|
+
/** Control how slow result-index scans are logged. Defaults to \"activity\". */
|
|
61
|
+
resultScanLogging?: "all" | "activity" | "off";
|
|
62
|
+
platform?: NodeJS.Platform;
|
|
56
63
|
};
|
|
57
64
|
|
|
58
65
|
type ResultFileChild = {
|
|
@@ -87,10 +94,17 @@ type ResultFileData = CompletionNotification & {
|
|
|
87
94
|
|
|
88
95
|
type ResultFileIdentity = {
|
|
89
96
|
sessionId?: string;
|
|
97
|
+
completionOwnerId?: string;
|
|
90
98
|
runId?: string;
|
|
91
99
|
asyncDir?: string;
|
|
92
100
|
};
|
|
93
101
|
|
|
102
|
+
interface ResultScanStats {
|
|
103
|
+
files: number;
|
|
104
|
+
scheduled: number;
|
|
105
|
+
startedAt: number;
|
|
106
|
+
}
|
|
107
|
+
|
|
94
108
|
function jsonStringProperty(raw: string, property: string): string | undefined {
|
|
95
109
|
const matches = raw.matchAll(new RegExp(`"${property}"\\s*:\\s*("(?:\\\\.|[^"\\\\])*")`, "g"));
|
|
96
110
|
let encoded: string | undefined;
|
|
@@ -107,6 +121,7 @@ function jsonStringProperty(raw: string, property: string): string | undefined {
|
|
|
107
121
|
function resultFileIdentity(raw: string, file: string): ResultFileIdentity {
|
|
108
122
|
return {
|
|
109
123
|
sessionId: jsonStringProperty(raw, "sessionId"),
|
|
124
|
+
completionOwnerId: jsonStringProperty(raw, "completionOwnerId"),
|
|
110
125
|
runId: file.replace(/\.json$/i, ""),
|
|
111
126
|
asyncDir: jsonStringProperty(raw, "asyncDir"),
|
|
112
127
|
};
|
|
@@ -133,6 +148,11 @@ function isNotFound(error: unknown): boolean {
|
|
|
133
148
|
return errorCode(error) === "ENOENT";
|
|
134
149
|
}
|
|
135
150
|
|
|
151
|
+
function isAccessDenied(error: unknown): boolean {
|
|
152
|
+
const code = errorCode(error);
|
|
153
|
+
return code === "EPERM" || code === "EACCES";
|
|
154
|
+
}
|
|
155
|
+
|
|
136
156
|
function shouldPoll(error: unknown): boolean {
|
|
137
157
|
const code = errorCode(error);
|
|
138
158
|
return code === "EMFILE" || code === "ENOSPC";
|
|
@@ -142,6 +162,21 @@ function hasDeliveredNotification(data: ResultFileData): boolean {
|
|
|
142
162
|
return typeof data.notificationDeliveredAt === "number" && Number.isFinite(data.notificationDeliveredAt);
|
|
143
163
|
}
|
|
144
164
|
|
|
165
|
+
type PublicResultIdentity = {
|
|
166
|
+
state?: string;
|
|
167
|
+
timestamp?: number;
|
|
168
|
+
};
|
|
169
|
+
|
|
170
|
+
function resultPayloadWasReplaced(delivered: ResultFileData, disk: PublicResultIdentity | undefined): boolean {
|
|
171
|
+
if (!disk) return false;
|
|
172
|
+
const deliveredState = typeof delivered.state === "string" ? delivered.state : undefined;
|
|
173
|
+
if (disk.state && deliveredState && disk.state !== deliveredState) return true;
|
|
174
|
+
const deliveredTimestamp = typeof delivered.timestamp === "number" && Number.isFinite(delivered.timestamp)
|
|
175
|
+
? delivered.timestamp
|
|
176
|
+
: undefined;
|
|
177
|
+
return disk.timestamp !== undefined && deliveredTimestamp !== undefined && disk.timestamp !== deliveredTimestamp;
|
|
178
|
+
}
|
|
179
|
+
|
|
145
180
|
function markDeliveredNotification(resultPath: string, data: ResultFileData, runId: string, now: number): ResultFileData {
|
|
146
181
|
const marked = { ...data, runId, notificationDeliveredAt: now };
|
|
147
182
|
writeAsyncResultFile(resultPath, marked);
|
|
@@ -162,6 +197,7 @@ export function createResultWatcher(
|
|
|
162
197
|
): {
|
|
163
198
|
startResultWatcher: () => void;
|
|
164
199
|
primeExistingResults: (options?: { triggerTurn?: boolean }) => void;
|
|
200
|
+
refreshResultDelivery: () => void;
|
|
165
201
|
stopResultWatcher: () => void;
|
|
166
202
|
} {
|
|
167
203
|
const fsApi = deps.fs ?? fs;
|
|
@@ -179,27 +215,13 @@ export function createResultWatcher(
|
|
|
179
215
|
// and revoked before the watcher, queues, or callbacks are torn down.
|
|
180
216
|
let activeSessionId: string | null = null;
|
|
181
217
|
|
|
182
|
-
const
|
|
218
|
+
const ownsCompletion = (sessionId: string, completionOwnerId: unknown, epoch: number) => {
|
|
183
219
|
if (!deliveryActive || epoch !== deliveryEpoch) return false;
|
|
184
220
|
if (!activeSessionId && state.currentSessionId) activeSessionId = state.currentSessionId;
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
const lineageOwnsResult = (identity: ResultFileIdentity, file: string): boolean => {
|
|
191
|
-
const lineage = state.sessionLineage;
|
|
192
|
-
if (!identity.sessionId || !lineage || !lineage.includes(identity.sessionId)) return false;
|
|
193
|
-
// Replay guard: only accept lineage results written around or after the
|
|
194
|
-
// adoption window. The previous session's watcher deleted every result it
|
|
195
|
-
// delivered, so older files are stale leftovers, not missed deliveries.
|
|
196
|
-
const windowStart = state.adoptedResultWindowStart;
|
|
197
|
-
if (windowStart === undefined) return false;
|
|
198
|
-
try {
|
|
199
|
-
return fsApi.statSync(path.join(resultsDir, file)).mtimeMs >= windowStart;
|
|
200
|
-
} catch {
|
|
201
|
-
return false;
|
|
202
|
-
}
|
|
221
|
+
return activeSessionId === sessionId
|
|
222
|
+
&& state.currentSessionId === sessionId
|
|
223
|
+
&& typeof completionOwnerId === "string"
|
|
224
|
+
&& completionOwnerId === state.completionOwnerId;
|
|
203
225
|
};
|
|
204
226
|
|
|
205
227
|
const scheduleResult = (file: string, triggerTurn: boolean, delayMs = 0) => {
|
|
@@ -242,6 +264,7 @@ export function createResultWatcher(
|
|
|
242
264
|
return `${resultPath}:${stat.size}:${stat.mtimeMs}`;
|
|
243
265
|
} catch (error) {
|
|
244
266
|
identityCache.delete(file);
|
|
267
|
+
if (isAccessDenied(error)) throw error;
|
|
245
268
|
if (!isNotFound(error)) console.error(`Failed to inspect subagent result file '${resultPath}':`, error);
|
|
246
269
|
return undefined;
|
|
247
270
|
}
|
|
@@ -259,6 +282,7 @@ export function createResultWatcher(
|
|
|
259
282
|
return { identity, signature };
|
|
260
283
|
} catch (error) {
|
|
261
284
|
identityCache.delete(file);
|
|
285
|
+
if (isAccessDenied(error)) throw error;
|
|
262
286
|
if (!isNotFound(error)) console.error(`Failed to inspect subagent result file '${resultPath}':`, error);
|
|
263
287
|
return undefined;
|
|
264
288
|
}
|
|
@@ -280,8 +304,7 @@ export function createResultWatcher(
|
|
|
280
304
|
// Missing identity stays on the normal parser path so malformed or legacy
|
|
281
305
|
// files keep their existing diagnostics and compatibility behavior.
|
|
282
306
|
if (!identity.sessionId) return true;
|
|
283
|
-
if (identity.sessionId === state.currentSessionId) return true;
|
|
284
|
-
if (lineageOwnsResult(identity, file)) return true;
|
|
307
|
+
if (identity.sessionId === state.currentSessionId && identity.completionOwnerId === state.completionOwnerId) return true;
|
|
285
308
|
if (identity.asyncDir && fsApi.existsSync(path.join(identity.asyncDir, MISSION_BINDING_FILE))) return true;
|
|
286
309
|
if (identity.runId && (observed ?? observedRunIds()).has(identity.runId)) return true;
|
|
287
310
|
return Boolean(deps.observeCompletion && !deps.observedCompletionRunIds);
|
|
@@ -304,13 +327,33 @@ export function createResultWatcher(
|
|
|
304
327
|
const handleResult = async (file: string, triggerTurn: boolean) => {
|
|
305
328
|
if (processing.has(file)) return;
|
|
306
329
|
let observed: ReadonlySet<string> | undefined;
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
330
|
+
try {
|
|
331
|
+
if (!shouldProcessResult(file)) {
|
|
332
|
+
const runId = file === path.basename(file) && file.endsWith(".json") ? file.replace(/\.json$/i, "") : undefined;
|
|
333
|
+
observed = observedRunIds();
|
|
334
|
+
if (!runId || !observed.has(runId) || !shouldProcessResult(file, observed)) return;
|
|
335
|
+
}
|
|
336
|
+
} catch (error) {
|
|
337
|
+
if (!isAccessDenied(error)) throw error;
|
|
338
|
+
console.error(`Failed to inspect subagent result file '${publicResultPath(file)}'; will retry:`, error);
|
|
339
|
+
scheduleResult(file, triggerTurn, RETRY_DELAY_MS);
|
|
340
|
+
return;
|
|
311
341
|
}
|
|
312
342
|
processing.add(file);
|
|
343
|
+
let rereadReplacedPayload = false;
|
|
313
344
|
let resultPath = publicResultPath(file);
|
|
345
|
+
const readPublicResultIdentity = (): PublicResultIdentity | undefined => {
|
|
346
|
+
if (!publicResultFileExists(file)) return undefined;
|
|
347
|
+
const parsed: unknown = JSON.parse(fsApi.readFileSync(publicResultPath(file), "utf-8"));
|
|
348
|
+
if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) return undefined;
|
|
349
|
+
const record = parsed as Record<string, unknown>;
|
|
350
|
+
const state = typeof record.state === "string" && record.state ? record.state : undefined;
|
|
351
|
+
const timestamp = typeof record.timestamp === "number" && Number.isFinite(record.timestamp)
|
|
352
|
+
? record.timestamp
|
|
353
|
+
: undefined;
|
|
354
|
+
if (!state && timestamp === undefined) return undefined;
|
|
355
|
+
return { state, timestamp };
|
|
356
|
+
};
|
|
314
357
|
try {
|
|
315
358
|
const payloadPath = resultPayloadPath(file, observed);
|
|
316
359
|
if (!payloadPath) return;
|
|
@@ -336,8 +379,21 @@ export function createResultWatcher(
|
|
|
336
379
|
}
|
|
337
380
|
}
|
|
338
381
|
let data = parseResult(raw);
|
|
382
|
+
const markReplacedPayload = (): boolean => {
|
|
383
|
+
try {
|
|
384
|
+
if (!resultPayloadWasReplaced(data, readPublicResultIdentity())) return false;
|
|
385
|
+
} catch (error) {
|
|
386
|
+
if (isAccessDenied(error)) throw error;
|
|
387
|
+
if (isNotFound(error)) return false;
|
|
388
|
+
console.error(`Failed to re-read subagent result file '${publicResultPath(file)}':`, error);
|
|
389
|
+
}
|
|
390
|
+
identityCache.delete(file);
|
|
391
|
+
rereadReplacedPayload = true;
|
|
392
|
+
return true;
|
|
393
|
+
};
|
|
339
394
|
if (typeof data.sessionId !== "string" || !data.sessionId) return;
|
|
340
395
|
const sessionId = data.sessionId;
|
|
396
|
+
const completionOwnerId = data.completionOwnerId;
|
|
341
397
|
const runId = data.runId ?? data.id ?? file.replace(/\.json$/i, "");
|
|
342
398
|
const toolCallId = typeof data.toolCallId === "string" ? data.toolCallId : undefined;
|
|
343
399
|
let observerSucceeded = true;
|
|
@@ -355,7 +411,7 @@ export function createResultWatcher(
|
|
|
355
411
|
}
|
|
356
412
|
if (observerSucceeded) removeMissionObserverIndex(resultsDir, runId);
|
|
357
413
|
const epoch = deliveryEpoch;
|
|
358
|
-
if (!
|
|
414
|
+
if (!ownsCompletion(sessionId, completionOwnerId, epoch)) return;
|
|
359
415
|
// Recorded before dedupe and before the unlink below so subagent_wait can
|
|
360
416
|
// use the in-memory record or its bounded durable replay after cleanup.
|
|
361
417
|
recordWaitCompletion(state, runId, data, Date.now(), completionTtlMs, {
|
|
@@ -384,7 +440,8 @@ export function createResultWatcher(
|
|
|
384
440
|
scheduleResult(file, triggerTurn, RETRY_DELAY_MS);
|
|
385
441
|
return;
|
|
386
442
|
}
|
|
387
|
-
if (!
|
|
443
|
+
if (!ownsCompletion(sessionId, completionOwnerId, epoch)) return;
|
|
444
|
+
if (markReplacedPayload()) return;
|
|
388
445
|
if (!removeDeliveredResult(file, sessionId, runId, toolCallId)) scheduleResult(file, triggerTurn, RETRY_DELAY_MS);
|
|
389
446
|
return;
|
|
390
447
|
}
|
|
@@ -439,7 +496,8 @@ export function createResultWatcher(
|
|
|
439
496
|
scheduleResult(file, triggerTurn, RETRY_DELAY_MS);
|
|
440
497
|
return;
|
|
441
498
|
}
|
|
442
|
-
if (!
|
|
499
|
+
if (!ownsCompletion(sessionId, completionOwnerId, epoch)) return;
|
|
500
|
+
if (markReplacedPayload()) return;
|
|
443
501
|
if (!removeDeliveredResult(file, sessionId, runId, toolCallId)) scheduleResult(file, triggerTurn, RETRY_DELAY_MS);
|
|
444
502
|
return;
|
|
445
503
|
}
|
|
@@ -460,7 +518,7 @@ export function createResultWatcher(
|
|
|
460
518
|
asyncDir: data.asyncDir,
|
|
461
519
|
...(data.parallelHandoff ? { parallelHandoff: data.parallelHandoff } : {}),
|
|
462
520
|
}));
|
|
463
|
-
if (!
|
|
521
|
+
if (!ownsCompletion(sessionId, completionOwnerId, epoch)) return;
|
|
464
522
|
if (!intercomDelivered) console.error(`Subagent async grouped result intercom delivery was not acknowledged for '${resultPath}'.`);
|
|
465
523
|
}
|
|
466
524
|
|
|
@@ -484,11 +542,12 @@ export function createResultWatcher(
|
|
|
484
542
|
})) : [],
|
|
485
543
|
} : {}),
|
|
486
544
|
});
|
|
487
|
-
if (!
|
|
545
|
+
if (!ownsCompletion(sessionId, completionOwnerId, epoch)) return;
|
|
488
546
|
if (!accepted) {
|
|
489
547
|
scheduleResult(file, triggerTurn, RETRY_DELAY_MS);
|
|
490
548
|
return;
|
|
491
549
|
}
|
|
550
|
+
if (markReplacedPayload()) return;
|
|
492
551
|
try {
|
|
493
552
|
data = markDeliveredNotification(publicResultPath(file), data, runId, Date.now());
|
|
494
553
|
identityCache.delete(file);
|
|
@@ -525,12 +584,16 @@ export function createResultWatcher(
|
|
|
525
584
|
scheduleResult(file, triggerTurn, RETRY_DELAY_MS);
|
|
526
585
|
return;
|
|
527
586
|
}
|
|
528
|
-
if (!
|
|
587
|
+
if (!ownsCompletion(sessionId, completionOwnerId, epoch)) return;
|
|
529
588
|
if (!removeDeliveredResult(file, sessionId, runId, toolCallId)) scheduleResult(file, triggerTurn, RETRY_DELAY_MS);
|
|
530
589
|
} catch (error) {
|
|
531
|
-
if (
|
|
590
|
+
if (isAccessDenied(error)) {
|
|
591
|
+
console.error(`Failed to process subagent result file '${resultPath}'; will retry:`, error);
|
|
592
|
+
scheduleResult(file, triggerTurn, RETRY_DELAY_MS);
|
|
593
|
+
} else if (!isNotFound(error)) console.error(`Failed to process subagent result file '${resultPath}':`, error);
|
|
532
594
|
} finally {
|
|
533
595
|
processing.delete(file);
|
|
596
|
+
if (rereadReplacedPayload) scheduleResult(file, triggerTurn);
|
|
534
597
|
}
|
|
535
598
|
};
|
|
536
599
|
|
|
@@ -540,6 +603,18 @@ export function createResultWatcher(
|
|
|
540
603
|
void handleResult(file, triggerTurn);
|
|
541
604
|
}, deps.coalesceDelayMs ?? 50);
|
|
542
605
|
|
|
606
|
+
const logScanStats = (stats: ResultScanStats) => {
|
|
607
|
+
const elapsed = Date.now() - stats.startedAt;
|
|
608
|
+
if (elapsed < SLOW_RESULT_SCAN_MS) return;
|
|
609
|
+
const resultScanLogging = deps.resultScanLogging ?? "activity";
|
|
610
|
+
if (resultScanLogging === "off") return;
|
|
611
|
+
// A scan that inspected and scheduled nothing is a quiet no-op (e.g. the
|
|
612
|
+
// healthy periodic rescan while no async runs are pending). Under
|
|
613
|
+
// "activity", skip it so empty scans do not burn context tokens in the
|
|
614
|
+
// session transcript.
|
|
615
|
+
if (resultScanLogging === "activity" && stats.files === 0 && stats.scheduled === 0) return;
|
|
616
|
+
console.error(`Subagent result scan inspected ${stats.files} indexed result file(s), scheduled ${stats.scheduled} in ${elapsed}ms (${resultsDir}).`);
|
|
617
|
+
};
|
|
543
618
|
const indexedResultCandidates = (observed: ReadonlySet<string>): string[] => {
|
|
544
619
|
const files = new Set<string>();
|
|
545
620
|
if (state.currentSessionId) {
|
|
@@ -553,28 +628,17 @@ export function createResultWatcher(
|
|
|
553
628
|
const primeExistingResults = (options: { triggerTurn?: boolean } = {}) => {
|
|
554
629
|
try {
|
|
555
630
|
const triggerTurn = options.triggerTurn !== false;
|
|
631
|
+
const stats: ResultScanStats = { files: 0, scheduled: 0, startedAt: Date.now() };
|
|
556
632
|
const observed = observedRunIds();
|
|
557
633
|
for (const file of indexedResultCandidates(observed)) {
|
|
634
|
+
stats.files += 1;
|
|
558
635
|
const signature = resultSignature(file, observed);
|
|
559
636
|
if (!signature) continue;
|
|
560
637
|
if (!shouldProcessResult(file, observed, signature)) continue;
|
|
638
|
+
stats.scheduled += 1;
|
|
561
639
|
scheduleResult(file, triggerTurn);
|
|
562
640
|
}
|
|
563
|
-
|
|
564
|
-
// result files written directly under the results root by a previous
|
|
565
|
-
// session's runtime, so completions that raced the session switch are
|
|
566
|
-
// adopted instead of left behind. Bounded to the window; outside it,
|
|
567
|
-
// flat files are stale leftovers and only the indexed inbox is scanned.
|
|
568
|
-
if (state.adoptedResultWindowStart !== undefined) {
|
|
569
|
-
const indexed = indexedResultCandidates(observed);
|
|
570
|
-
for (const file of fsApi.readdirSync(resultsDir)) {
|
|
571
|
-
if (!file.endsWith(".json") || indexed.includes(file)) continue;
|
|
572
|
-
const signature = resultSignature(file, observed);
|
|
573
|
-
if (!signature) continue;
|
|
574
|
-
if (!shouldProcessResult(file, observed, signature)) continue;
|
|
575
|
-
scheduleResult(file, triggerTurn);
|
|
576
|
-
}
|
|
577
|
-
}
|
|
641
|
+
logScanStats(stats);
|
|
578
642
|
} catch (error) {
|
|
579
643
|
if (!isNotFound(error)) console.error(`Failed to scan subagent result index in '${resultsDir}':`, error);
|
|
580
644
|
}
|
|
@@ -584,6 +648,30 @@ export function createResultWatcher(
|
|
|
584
648
|
if (resultScanTimer) timers.clearInterval(resultScanTimer);
|
|
585
649
|
resultScanTimer = null;
|
|
586
650
|
};
|
|
651
|
+
const useNativeWatcher = () => shouldUseNativeFsWatch("result-delivery", deps.platform);
|
|
652
|
+
const hasDeliveryDemand = () => {
|
|
653
|
+
try {
|
|
654
|
+
return deps.hasDeliveryDemand?.() === true;
|
|
655
|
+
} catch (error) {
|
|
656
|
+
console.error("Failed to inspect subagent result delivery demand:", error);
|
|
657
|
+
return false;
|
|
658
|
+
}
|
|
659
|
+
};
|
|
660
|
+
const clearResultPoller = () => {
|
|
661
|
+
if (!state.watcherRestartTimer) return;
|
|
662
|
+
timers.clearTimeout(state.watcherRestartTimer);
|
|
663
|
+
timers.clearInterval(state.watcherRestartTimer);
|
|
664
|
+
state.watcherRestartTimer = null;
|
|
665
|
+
};
|
|
666
|
+
const startDemandPolling = () => {
|
|
667
|
+
if (!deliveryActive || useNativeWatcher() || state.watcherRestartTimer) return;
|
|
668
|
+
if (!hasDeliveryDemand()) return;
|
|
669
|
+
state.watcherRestartTimer = timers.setInterval(() => {
|
|
670
|
+
primeExistingResults();
|
|
671
|
+
if (!hasDeliveryDemand()) clearResultPoller();
|
|
672
|
+
}, POLL_INTERVAL_MS);
|
|
673
|
+
state.watcherRestartTimer.unref?.();
|
|
674
|
+
};
|
|
587
675
|
|
|
588
676
|
const startPolling = (reason: unknown) => {
|
|
589
677
|
state.watcher?.close();
|
|
@@ -623,6 +711,10 @@ export function createResultWatcher(
|
|
|
623
711
|
timers.clearInterval(state.watcherRestartTimer);
|
|
624
712
|
state.watcherRestartTimer = null;
|
|
625
713
|
}
|
|
714
|
+
if (!useNativeWatcher()) {
|
|
715
|
+
startDemandPolling();
|
|
716
|
+
return;
|
|
717
|
+
}
|
|
626
718
|
try {
|
|
627
719
|
const watchDir = resolveWatchPath(resultsDir, fsApi.realpathSync.native);
|
|
628
720
|
state.watcher = fsApi.watch(watchDir, (_event, file) => {
|
|
@@ -665,11 +757,7 @@ export function createResultWatcher(
|
|
|
665
757
|
deliveryEpoch += 1;
|
|
666
758
|
state.watcher?.close();
|
|
667
759
|
state.watcher = null;
|
|
668
|
-
|
|
669
|
-
timers.clearTimeout(state.watcherRestartTimer);
|
|
670
|
-
timers.clearInterval(state.watcherRestartTimer);
|
|
671
|
-
}
|
|
672
|
-
state.watcherRestartTimer = null;
|
|
760
|
+
clearResultPoller();
|
|
673
761
|
clearResultScan();
|
|
674
762
|
state.resultFileCoalescer.clear();
|
|
675
763
|
pendingTriggerTurn.clear();
|
|
@@ -677,5 +765,5 @@ export function createResultWatcher(
|
|
|
677
765
|
identityCache.clear();
|
|
678
766
|
};
|
|
679
767
|
|
|
680
|
-
return { startResultWatcher, primeExistingResults, stopResultWatcher };
|
|
768
|
+
return { startResultWatcher, primeExistingResults, stopResultWatcher, refreshResultDelivery: () => { primeExistingResults(); startDemandPolling(); } };
|
|
681
769
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as fs from "node:fs";
|
|
2
2
|
import type { AsyncRunSummary } from "./async-status.ts";
|
|
3
|
+
import { readAsyncRecoveryDescriptor } from "./async-resume.ts";
|
|
3
4
|
|
|
4
5
|
const INTERCOM_DETACH_ERROR = "detached for intercom coordination";
|
|
5
6
|
|
|
@@ -15,11 +16,13 @@ function formatIntercomDetachGuidance(run: AsyncRunSummary): string | undefined
|
|
|
15
16
|
}
|
|
16
17
|
|
|
17
18
|
export function formatAsyncReviveCommand(run: AsyncRunSummary): string | undefined {
|
|
18
|
-
const step = run.steps.find((candidate) => candidate.status === "failed"
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
19
|
+
const step = run.steps.find((candidate) => candidate.status === "failed");
|
|
20
|
+
const sessionFile = step?.sessionFile ?? (run.steps.length === 1 ? run.sessionFile : undefined);
|
|
21
|
+
if (!step || !sessionFile || !fs.existsSync(sessionFile)) return undefined;
|
|
22
|
+
try {
|
|
23
|
+
const descriptor = readAsyncRecoveryDescriptor(run.asyncDir);
|
|
24
|
+
if (!descriptor || descriptor.sourceRunId !== run.id || descriptor.agent !== step.agent) return undefined;
|
|
25
|
+
} catch {
|
|
23
26
|
return undefined;
|
|
24
27
|
}
|
|
25
28
|
const index = run.steps.length === 1 ? "" : `, index: ${step.index}`;
|
|
@@ -2,8 +2,10 @@ import * as fs from "node:fs";
|
|
|
2
2
|
import { listAsyncRuns, type AsyncRunSummary } from "./async-status.ts";
|
|
3
3
|
import { readAsyncRecoveryDescriptor } from "./async-resume.ts";
|
|
4
4
|
import type { TokenUsage } from "../../shared/types.ts";
|
|
5
|
+
import { parallelHandoffPath, resolveRetainedWorktreeCwd } from "../shared/parallel-handoff.ts";
|
|
5
6
|
|
|
6
7
|
const MAX_RETAINED_CHILDREN = 10;
|
|
8
|
+
const MAX_RETAINED_CHILD_CANDIDATES = 100;
|
|
7
9
|
const MAX_TASK_SUMMARY_LENGTH = 120;
|
|
8
10
|
|
|
9
11
|
type RetainedChildState = "complete" | "failed" | "paused" | "stopped";
|
|
@@ -49,17 +51,25 @@ function retainedSessionFile(sessionFile: string | undefined): RetainedChildResu
|
|
|
49
51
|
|
|
50
52
|
function childResumability(run: AsyncRunSummary, step: AsyncRunSummary["steps"][number]): RetainedChildResumability {
|
|
51
53
|
if (run.state === "stopped" || step.status === "stopped") return { state: "not-resumable", reason: "stopped run" };
|
|
52
|
-
if (step.runner?.type === "external-cli") return { state: "not-resumable", reason: "external
|
|
54
|
+
if (step.runner?.type === "external-cli" || step.runner?.type === "external-job") return { state: "not-resumable", reason: "external runner" };
|
|
53
55
|
const session = retainedSessionFile(step.sessionFile ?? run.sessionFile);
|
|
54
56
|
if (session.state === "not-resumable") return session;
|
|
57
|
+
let recoveryDescriptor: ReturnType<typeof readAsyncRecoveryDescriptor>;
|
|
55
58
|
try {
|
|
56
|
-
|
|
59
|
+
recoveryDescriptor = readAsyncRecoveryDescriptor(run.asyncDir);
|
|
57
60
|
if (!recoveryDescriptor) return { state: "not-resumable", reason: "missing recovery descriptor" };
|
|
58
61
|
if (recoveryDescriptor.sourceRunId !== run.id) return { state: "not-resumable", reason: `recovery descriptor belongs to run ${recoveryDescriptor.sourceRunId}` };
|
|
59
62
|
if (recoveryDescriptor.agent !== step.agent) return { state: "not-resumable", reason: `recovery descriptor belongs to agent ${recoveryDescriptor.agent}` };
|
|
60
63
|
} catch (error) {
|
|
61
64
|
return { state: "not-resumable", reason: `invalid recovery descriptor: ${error instanceof Error ? error.message : String(error)}` };
|
|
62
65
|
}
|
|
66
|
+
let requiredCwd: string | undefined;
|
|
67
|
+
try {
|
|
68
|
+
requiredCwd = resolveRetainedWorktreeCwd(parallelHandoffPath(run.asyncDir), run.id, step.index) ?? recoveryDescriptor.cwd ?? run.cwd;
|
|
69
|
+
if (!requiredCwd || !fs.statSync(requiredCwd).isDirectory()) return { state: "not-resumable", reason: `required cwd is missing: ${requiredCwd ?? "unknown"}` };
|
|
70
|
+
} catch (error) {
|
|
71
|
+
return { state: "not-resumable", reason: `resume dependency unavailable: ${error instanceof Error ? error.message : String(error)}` };
|
|
72
|
+
}
|
|
63
73
|
return session;
|
|
64
74
|
}
|
|
65
75
|
|
|
@@ -70,8 +80,8 @@ function boundedTaskSummary(value: string | undefined): string {
|
|
|
70
80
|
: normalized;
|
|
71
81
|
}
|
|
72
82
|
|
|
73
|
-
export function listRetainedChildren(asyncDirRoot: string,
|
|
74
|
-
const children = listAsyncRuns(asyncDirRoot, {
|
|
83
|
+
export function listRetainedChildren(asyncDirRoot: string, sessionId: string): RetainedChild[] {
|
|
84
|
+
const children = listAsyncRuns(asyncDirRoot, { sessionId, states: ["complete", "failed", "paused", "stopped"], entryLimit: MAX_RETAINED_CHILD_CANDIDATES, reconcile: false })
|
|
75
85
|
.flatMap((run) => {
|
|
76
86
|
if (!run.parentWorkflowRunId || run.steps.length !== 1) return [];
|
|
77
87
|
if (!isRetainedChildState(run.state)) return [];
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export const MIN_SAFE_ASYNC_RUN_PREFIX_LENGTH = 8;
|
|
2
|
+
const FULL_ASYNC_RUN_ID_LENGTH = 36;
|
|
3
|
+
|
|
4
|
+
/** Full generated ids and longer exact identities never fall back to a root scan. */
|
|
5
|
+
export function canScanAsyncRunPrefix(id: string): boolean {
|
|
6
|
+
return id.length >= MIN_SAFE_ASYNC_RUN_PREFIX_LENGTH && id.length < FULL_ASYNC_RUN_ID_LENGTH;
|
|
7
|
+
}
|
|
@@ -3,7 +3,7 @@ import * as path from "node:path";
|
|
|
3
3
|
import { DIRS, type SubagentState } from "../../shared/types.ts";
|
|
4
4
|
import { readStatus } from "../../shared/utils.ts";
|
|
5
5
|
import { findAsyncRunPrefixMatches, type AsyncRunLocation } from "./async-resume.ts";
|
|
6
|
-
import { resultFilePath,
|
|
6
|
+
import { resultCandidateFilesForToolCall, resultFilePath, resultPayloadPathForIndexedRun } from "./result-files.ts";
|
|
7
7
|
import { readActiveRunToolCallIndex } from "./active-run-index.ts";
|
|
8
8
|
import { assertSafeNestedId, findNestedRunMatchesById, type NestedRoute, type NestedRunMatch, type NestedRunResolutionScope } from "../shared/nested-events.ts";
|
|
9
9
|
|
|
@@ -21,11 +21,12 @@ export interface ResolveSubagentRunIdDeps {
|
|
|
21
21
|
|
|
22
22
|
function exactAsyncLocation(id: string, asyncDirRoot: string, resultsDir: string): AsyncRunLocation | undefined {
|
|
23
23
|
const asyncDir = path.join(asyncDirRoot, id);
|
|
24
|
-
const
|
|
25
|
-
|
|
24
|
+
const asyncDirExists = fs.existsSync(asyncDir);
|
|
25
|
+
const resultPath = resultPathFor(resultsDir, id);
|
|
26
|
+
if (!asyncDirExists && !resultPath) return undefined;
|
|
26
27
|
return {
|
|
27
|
-
asyncDir:
|
|
28
|
-
resultPath
|
|
28
|
+
asyncDir: asyncDirExists ? asyncDir : null,
|
|
29
|
+
resultPath,
|
|
29
30
|
resolvedId: id,
|
|
30
31
|
};
|
|
31
32
|
}
|
|
@@ -55,7 +56,7 @@ function readWorkflowResultIdentity(resultPath: string): WorkflowResultIdentity
|
|
|
55
56
|
}
|
|
56
57
|
|
|
57
58
|
function resultPathFor(resultsDir: string, runId: string): string | null {
|
|
58
|
-
const resultPath = resultFilePath(resultsDir, runId);
|
|
59
|
+
const resultPath = resultPayloadPathForIndexedRun(resultsDir, runId) ?? resultFilePath(resultsDir, runId);
|
|
59
60
|
return fs.existsSync(resultPath) ? resultPath : null;
|
|
60
61
|
}
|
|
61
62
|
|
|
@@ -72,11 +73,12 @@ function indexedToolCallIdAsyncLocations(toolCallId: string, asyncDirRoot: strin
|
|
|
72
73
|
const runId = status.runId || entry;
|
|
73
74
|
byId.set(runId, { asyncDir, resultPath: resultPathFor(resultsDir, runId), resolvedId: runId });
|
|
74
75
|
}
|
|
75
|
-
for (const entry of
|
|
76
|
-
const
|
|
76
|
+
for (const entry of resultCandidateFilesForToolCall(resultsDir, toolCallId)) {
|
|
77
|
+
const runIdFromFile = entry.slice(0, -".json".length);
|
|
78
|
+
const resultPath = resultPayloadPathForIndexedRun(resultsDir, runIdFromFile) ?? path.join(resultsDir, entry);
|
|
77
79
|
const identity = readWorkflowResultIdentity(resultPath);
|
|
78
80
|
if (!identity || !toolCallIdMatches(identity.toolCallId, toolCallId)) continue;
|
|
79
|
-
const runId = identity.runId ?? identity.id ??
|
|
81
|
+
const runId = identity.runId ?? identity.id ?? runIdFromFile;
|
|
80
82
|
const asyncDir = path.join(asyncDirRoot, runId);
|
|
81
83
|
byId.set(runId, { asyncDir: fs.existsSync(asyncDir) ? asyncDir : null, resultPath, resolvedId: runId });
|
|
82
84
|
}
|
|
@@ -85,10 +87,9 @@ function indexedToolCallIdAsyncLocations(toolCallId: string, asyncDirRoot: strin
|
|
|
85
87
|
|
|
86
88
|
function foregroundIds(state: SubagentState | undefined): string[] {
|
|
87
89
|
if (!state) return [];
|
|
88
|
-
const acceptedSessions = new Set(state.sessionLineage?.length ? state.sessionLineage : state.currentSessionId ? [state.currentSessionId] : []);
|
|
89
90
|
const remembered = state.currentSessionId
|
|
90
91
|
? [...(state.foregroundRuns?.values() ?? [])]
|
|
91
|
-
.filter((run) => run.sessionId
|
|
92
|
+
.filter((run) => run.sessionId === state.currentSessionId)
|
|
92
93
|
.map((run) => run.runId)
|
|
93
94
|
: [];
|
|
94
95
|
return [...new Set([...state.foregroundControls.keys(), ...remembered])];
|
|
@@ -98,9 +99,7 @@ function hasExactForegroundId(state: SubagentState | undefined, id: string): boo
|
|
|
98
99
|
if (!state) return false;
|
|
99
100
|
if (state.foregroundControls.has(id)) return true;
|
|
100
101
|
const remembered = state.foregroundRuns?.get(id);
|
|
101
|
-
|
|
102
|
-
const acceptedSessions = new Set(state.sessionLineage?.length ? state.sessionLineage : [state.currentSessionId]);
|
|
103
|
-
return acceptedSessions.has(remembered.sessionId);
|
|
102
|
+
return Boolean(remembered && state.currentSessionId && remembered.sessionId === state.currentSessionId);
|
|
104
103
|
}
|
|
105
104
|
|
|
106
105
|
function exactLiveAsyncToolCallMatch(state: SubagentState | undefined, toolCallId: string, asyncDirRoot: string, resultsDir: string): AsyncRunMatch | undefined {
|