@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
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
createCompletionBatcher,
|
|
15
15
|
resolveCompletionBatchConfig,
|
|
16
16
|
} from "./completion-batcher.ts";
|
|
17
|
-
import { SUBAGENT_ASYNC_COMPLETE_EVENT, SUBAGENT_FOREGROUND_COMPLETE_EVENT, type ParallelHandoffReference, type SubagentState } from "../../shared/types.ts";
|
|
17
|
+
import { SUBAGENT_ASYNC_COMPLETE_EVENT, SUBAGENT_FOREGROUND_COMPLETE_EVENT, type ParallelHandoffReference, type ScheduleOrigin, type SubagentState } from "../../shared/types.ts";
|
|
18
18
|
import { isUnexplainedProcessSignal } from "../shared/process-signal.ts";
|
|
19
19
|
|
|
20
20
|
export interface SubagentNotifyDetails {
|
|
@@ -24,9 +24,14 @@ export interface SubagentNotifyDetails {
|
|
|
24
24
|
taskInfo?: string;
|
|
25
25
|
resultPreview: string;
|
|
26
26
|
durationMs?: number;
|
|
27
|
+
workflowRunId?: string;
|
|
28
|
+
childRuns?: Array<{ runId: string; workflowKey?: string; agent?: string; status?: string }>;
|
|
29
|
+
reconciledFromDetachedChild?: string;
|
|
27
30
|
sessionLabel?: string;
|
|
28
31
|
sessionValue?: string;
|
|
29
32
|
handoffPath?: string;
|
|
33
|
+
/** Present when a durable schedule launched the run. */
|
|
34
|
+
scheduleOrigin?: ScheduleOrigin;
|
|
30
35
|
}
|
|
31
36
|
|
|
32
37
|
export interface CompletionNotification {
|
|
@@ -38,12 +43,18 @@ export interface CompletionNotification {
|
|
|
38
43
|
summary?: string;
|
|
39
44
|
exitCode?: number;
|
|
40
45
|
state?: string;
|
|
46
|
+
mode?: string;
|
|
47
|
+
runId?: string | null;
|
|
48
|
+
reconciledFromDetachedChild?: string;
|
|
41
49
|
processSignal?: string | null;
|
|
42
50
|
interrupted?: boolean;
|
|
43
51
|
timedOut?: boolean;
|
|
44
52
|
stopped?: boolean;
|
|
45
53
|
turnBudgetExceeded?: boolean;
|
|
46
54
|
results?: Array<{
|
|
55
|
+
runId?: string;
|
|
56
|
+
workflowKey?: string;
|
|
57
|
+
agent?: string;
|
|
47
58
|
status?: string;
|
|
48
59
|
success?: boolean;
|
|
49
60
|
exitCode?: number | null;
|
|
@@ -63,10 +74,12 @@ export interface CompletionNotification {
|
|
|
63
74
|
taskIndex?: number;
|
|
64
75
|
totalTasks?: number;
|
|
65
76
|
sessionId?: string | null;
|
|
77
|
+
completionOwnerId?: string | null;
|
|
66
78
|
triggerTurn?: boolean;
|
|
67
79
|
/** True when an acknowledged grouped intercom relay already delivered this run. */
|
|
68
80
|
intercomDelivered?: boolean;
|
|
69
81
|
parallelHandoff?: ParallelHandoffReference;
|
|
82
|
+
scheduleOrigin?: ScheduleOrigin;
|
|
70
83
|
}
|
|
71
84
|
|
|
72
85
|
interface NotifyTimerApi {
|
|
@@ -90,15 +103,37 @@ function formatSessionLine(details: SubagentNotifyDetails): string | undefined {
|
|
|
90
103
|
return details.sessionLabel ? `${details.sessionLabel}: ${details.sessionValue}` : details.sessionValue;
|
|
91
104
|
}
|
|
92
105
|
|
|
106
|
+
function formatChildRun(child: { runId: string; workflowKey?: string; agent?: string; status?: string }): string {
|
|
107
|
+
const label = child.workflowKey ?? child.agent;
|
|
108
|
+
const status = child.status ? ` (${child.status})` : "";
|
|
109
|
+
return `${label ? `${label}=` : ""}${child.runId}${status}`;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function formatCorrelationLines(details: SubagentNotifyDetails): string[] {
|
|
113
|
+
return [
|
|
114
|
+
details.workflowRunId ? `Workflow run: ${details.workflowRunId}` : undefined,
|
|
115
|
+
details.childRuns?.length ? `Child runs: ${details.childRuns.map(formatChildRun).join(", ")}` : undefined,
|
|
116
|
+
details.reconciledFromDetachedChild ? `Reconciled detached child: ${details.reconciledFromDetachedChild}` : undefined,
|
|
117
|
+
].filter((line): line is string => line !== undefined);
|
|
118
|
+
}
|
|
119
|
+
|
|
93
120
|
export function formatSingleCompletion(details: SubagentNotifyDetails): string {
|
|
94
121
|
const sessionLine = formatSessionLine(details);
|
|
122
|
+
const correlationLines = formatCorrelationLines(details);
|
|
95
123
|
const taskKind = details.source === "foreground" ? "Detached foreground task" : "Background task";
|
|
124
|
+
const scheduleLine = details.scheduleOrigin
|
|
125
|
+
? `Scheduled run from **${details.scheduleOrigin.name ?? details.scheduleOrigin.id}** (schedule ${details.scheduleOrigin.id}).`
|
|
126
|
+
: undefined;
|
|
96
127
|
return [
|
|
97
128
|
`${taskKind} ${details.status}: **${details.agent}**${details.taskInfo ?? ""}`,
|
|
98
129
|
"",
|
|
130
|
+
scheduleLine,
|
|
131
|
+
scheduleLine ? "" : undefined,
|
|
99
132
|
details.resultPreview.trim() ? details.resultPreview : "(no output)",
|
|
100
133
|
details.handoffPath ? "" : undefined,
|
|
101
134
|
details.handoffPath ? `Parallel handoff: ${details.handoffPath}` : undefined,
|
|
135
|
+
correlationLines.length && !details.handoffPath ? "" : undefined,
|
|
136
|
+
...correlationLines,
|
|
102
137
|
sessionLine ? "" : undefined,
|
|
103
138
|
sessionLine,
|
|
104
139
|
]
|
|
@@ -110,7 +145,17 @@ export function parseSubagentNotifyContent(content: string): SubagentNotifyDetai
|
|
|
110
145
|
const lines = content.split("\n");
|
|
111
146
|
const match = (lines[0] ?? "").match(/^(Background task|Detached foreground task) (completed|failed|paused|stopped): \*\*(.+?)\*\*(?:\s+(\([^)]*\)))?$/);
|
|
112
147
|
if (!match) return undefined;
|
|
113
|
-
|
|
148
|
+
let body = lines.slice(2);
|
|
149
|
+
// Restore the schedule origin so a re-rendered notice keeps its attribution and
|
|
150
|
+
// does not fold the line into the result preview.
|
|
151
|
+
const scheduleMatch = (body[0] ?? "").match(/^Scheduled run from \*\*(.+?)\*\* \(schedule (.+?)\)\.$/);
|
|
152
|
+
let parsedScheduleOrigin: ScheduleOrigin | undefined;
|
|
153
|
+
if (scheduleMatch) {
|
|
154
|
+
const label = scheduleMatch[1]!;
|
|
155
|
+
const id = scheduleMatch[2]!;
|
|
156
|
+
parsedScheduleOrigin = { id, ...(label === id ? {} : { name: label }) };
|
|
157
|
+
body = body.slice(body[1]?.trim() === "" ? 2 : 1);
|
|
158
|
+
}
|
|
114
159
|
let sessionIndex = -1;
|
|
115
160
|
for (let i = body.length - 1; i >= 1; i--) {
|
|
116
161
|
if (body[i - 1]?.trim() === "" && /^(Session|Session file|Session share error):\s+/.test(body[i]!)) {
|
|
@@ -120,11 +165,27 @@ export function parseSubagentNotifyContent(content: string): SubagentNotifyDetai
|
|
|
120
165
|
}
|
|
121
166
|
const sessionLine = sessionIndex >= 0 ? body[sessionIndex] : undefined;
|
|
122
167
|
const handoffIndex = body.findIndex((line) => line.startsWith("Parallel handoff: "));
|
|
123
|
-
const
|
|
168
|
+
const workflowRunIndex = body.findIndex((line) => line.startsWith("Workflow run: "));
|
|
169
|
+
const childRunsIndex = body.findIndex((line) => line.startsWith("Child runs: "));
|
|
170
|
+
const reconciledIndex = body.findIndex((line) => line.startsWith("Reconciled detached child: "));
|
|
171
|
+
const metadataIndexes = [sessionIndex, handoffIndex, workflowRunIndex, childRunsIndex, reconciledIndex].filter((index) => index >= 0);
|
|
124
172
|
const firstMetadataIndex = metadataIndexes.length ? Math.min(...metadataIndexes) : body.length;
|
|
125
173
|
const resultEnd = firstMetadataIndex > 0 && body[firstMetadataIndex - 1]?.trim() === "" ? firstMetadataIndex - 1 : firstMetadataIndex;
|
|
126
174
|
const resultPreview = body.slice(0, resultEnd).join("\n").trim() || "(no output)";
|
|
127
175
|
const handoffPath = handoffIndex >= 0 ? body[handoffIndex]!.slice("Parallel handoff: ".length).trim() : undefined;
|
|
176
|
+
const workflowRunId = workflowRunIndex >= 0 ? body[workflowRunIndex]!.slice("Workflow run: ".length).trim() : undefined;
|
|
177
|
+
const childRuns = childRunsIndex >= 0
|
|
178
|
+
? body[childRunsIndex]!.slice("Child runs: ".length).split(", ").map((part) => {
|
|
179
|
+
const trimmed = part.trim();
|
|
180
|
+
const statusMatch = trimmed.match(/^(.*?)(?: \(([^)]*)\))?$/);
|
|
181
|
+
const raw = statusMatch?.[1] ?? trimmed;
|
|
182
|
+
const separator = raw.indexOf("=");
|
|
183
|
+
return separator >= 0
|
|
184
|
+
? { workflowKey: raw.slice(0, separator), runId: raw.slice(separator + 1), ...(statusMatch?.[2] ? { status: statusMatch[2] } : {}) }
|
|
185
|
+
: { runId: raw, ...(statusMatch?.[2] ? { status: statusMatch[2] } : {}) };
|
|
186
|
+
}).filter((child) => child.runId)
|
|
187
|
+
: undefined;
|
|
188
|
+
const reconciledFromDetachedChild = reconciledIndex >= 0 ? body[reconciledIndex]!.slice("Reconciled detached child: ".length).trim() : undefined;
|
|
128
189
|
let sessionLabel: string | undefined;
|
|
129
190
|
let sessionValue: string | undefined;
|
|
130
191
|
if (sessionLine) {
|
|
@@ -137,8 +198,12 @@ export function parseSubagentNotifyContent(content: string): SubagentNotifyDetai
|
|
|
137
198
|
status: match[2] as SubagentNotifyDetails["status"],
|
|
138
199
|
...(match[1] === "Detached foreground task" ? { source: "foreground" as const } : {}),
|
|
139
200
|
...(match[4] ? { taskInfo: match[4] } : {}),
|
|
201
|
+
...(parsedScheduleOrigin ? { scheduleOrigin: parsedScheduleOrigin } : {}),
|
|
140
202
|
resultPreview,
|
|
141
203
|
...(handoffPath ? { handoffPath } : {}),
|
|
204
|
+
...(workflowRunId ? { workflowRunId } : {}),
|
|
205
|
+
...(childRuns?.length ? { childRuns } : {}),
|
|
206
|
+
...(reconciledFromDetachedChild ? { reconciledFromDetachedChild } : {}),
|
|
142
207
|
...(sessionLabel && sessionValue ? { sessionLabel, sessionValue } : {}),
|
|
143
208
|
};
|
|
144
209
|
}
|
|
@@ -150,9 +215,10 @@ export function formatGroupedCompletion(details: SubagentNotifyDetails[]): strin
|
|
|
150
215
|
const detail = details[index];
|
|
151
216
|
if (!detail) continue;
|
|
152
217
|
const sessionLine = formatSessionLine(detail);
|
|
153
|
-
blocks.push(`${index + 1}. ${detail.agent}${detail.taskInfo ?? ""}`);
|
|
218
|
+
blocks.push(`${index + 1}. ${detail.agent}${detail.taskInfo ?? ""}${detail.scheduleOrigin ? ` — scheduled run from ${detail.scheduleOrigin.name ?? detail.scheduleOrigin.id} (schedule ${detail.scheduleOrigin.id})` : ""}`);
|
|
154
219
|
blocks.push(detail.resultPreview.trim() ? detail.resultPreview : "(no output)");
|
|
155
220
|
if (detail.handoffPath) blocks.push(`Parallel handoff: ${detail.handoffPath}`);
|
|
221
|
+
blocks.push(...formatCorrelationLines(detail));
|
|
156
222
|
if (sessionLine) blocks.push(sessionLine);
|
|
157
223
|
blocks.push("");
|
|
158
224
|
}
|
|
@@ -170,7 +236,7 @@ function sendCompletion(pi: Pick<ExtensionAPI, "sendMessage">, items: PendingCom
|
|
|
170
236
|
if (items.length === 0) return true;
|
|
171
237
|
const details = items.map((item) => item.details);
|
|
172
238
|
const content = details.length === 1 ? formatSingleCompletion(details[0]!) : formatGroupedCompletion(details);
|
|
173
|
-
const display = details.some((detail) => detail.source === "foreground" || detail.status !== "completed");
|
|
239
|
+
const display = details.some((detail) => detail.source === "foreground" || detail.status !== "completed" || detail.scheduleOrigin !== undefined);
|
|
174
240
|
try {
|
|
175
241
|
pi.sendMessage(
|
|
176
242
|
{
|
|
@@ -217,6 +283,18 @@ export function buildCompletionDetails(result: CompletionNotification): Subagent
|
|
|
217
283
|
? result.parallelHandoff as { path?: unknown }
|
|
218
284
|
: undefined;
|
|
219
285
|
const handoffPath = typeof parallelHandoff?.path === "string" ? parallelHandoff.path : undefined;
|
|
286
|
+
const rawRunId = typeof result.runId === "string" ? result.runId : typeof result.id === "string" ? result.id : undefined;
|
|
287
|
+
const workflowRunId = (result.mode === "workflow" || agent === "workflow") && rawRunId ? rawRunId : undefined;
|
|
288
|
+
const childRuns = result.results?.flatMap((child) => {
|
|
289
|
+
if (typeof child.runId !== "string" || !child.runId.trim()) return [];
|
|
290
|
+
return [{
|
|
291
|
+
runId: child.runId,
|
|
292
|
+
...(typeof child.workflowKey === "string" ? { workflowKey: child.workflowKey } : {}),
|
|
293
|
+
...(typeof child.agent === "string" ? { agent: child.agent } : {}),
|
|
294
|
+
...(typeof child.status === "string" ? { status: child.status } : {}),
|
|
295
|
+
}];
|
|
296
|
+
}) ?? [];
|
|
297
|
+
const reconciledFromDetachedChild = typeof result.reconciledFromDetachedChild === "string" ? result.reconciledFromDetachedChild : undefined;
|
|
220
298
|
const session =
|
|
221
299
|
result.shareUrl
|
|
222
300
|
? { label: "Session", value: result.shareUrl }
|
|
@@ -225,21 +303,29 @@ export function buildCompletionDetails(result: CompletionNotification): Subagent
|
|
|
225
303
|
: result.sessionFile
|
|
226
304
|
? { label: "Session file", value: result.sessionFile }
|
|
227
305
|
: undefined;
|
|
306
|
+
const rawOrigin = result.scheduleOrigin;
|
|
307
|
+
const scheduleOrigin = rawOrigin && typeof rawOrigin.id === "string"
|
|
308
|
+
? { id: rawOrigin.id, ...(typeof rawOrigin.name === "string" ? { name: rawOrigin.name } : {}) }
|
|
309
|
+
: undefined;
|
|
228
310
|
return {
|
|
229
311
|
agent,
|
|
230
312
|
status,
|
|
313
|
+
...(scheduleOrigin ? { scheduleOrigin } : {}),
|
|
231
314
|
...(result.source ? { source: result.source } : {}),
|
|
232
315
|
...(taskInfo ? { taskInfo } : {}),
|
|
233
316
|
resultPreview: summary,
|
|
234
317
|
...(typeof result.durationMs === "number" ? { durationMs: result.durationMs } : {}),
|
|
235
318
|
...(handoffPath ? { handoffPath } : {}),
|
|
319
|
+
...(workflowRunId ? { workflowRunId } : {}),
|
|
320
|
+
...(childRuns.length ? { childRuns } : {}),
|
|
321
|
+
...(reconciledFromDetachedChild ? { reconciledFromDetachedChild } : {}),
|
|
236
322
|
...(session ? { sessionLabel: session.label, sessionValue: session.value } : {}),
|
|
237
323
|
};
|
|
238
324
|
}
|
|
239
325
|
|
|
240
326
|
export default function registerSubagentNotify(
|
|
241
327
|
pi: ExtensionAPI,
|
|
242
|
-
state: Pick<SubagentState, "currentSessionId" | "
|
|
328
|
+
state: Pick<SubagentState, "currentSessionId" | "completionOwnerId">,
|
|
243
329
|
options: RegisterSubagentNotifyOptions = {},
|
|
244
330
|
): CompletionNotifier {
|
|
245
331
|
const seen = new Map<string, number>();
|
|
@@ -250,9 +336,6 @@ export default function registerSubagentNotify(
|
|
|
250
336
|
const batchers = new Map<string, CompletionBatcher<PendingCompletion>>();
|
|
251
337
|
let disposed = false;
|
|
252
338
|
|
|
253
|
-
const ownsSession = (sessionId: string) =>
|
|
254
|
-
sessionId === state.currentSessionId || state.sessionLineage?.includes(sessionId) === true;
|
|
255
|
-
|
|
256
339
|
const settle = (items: PendingCompletion[], accepted: boolean) => {
|
|
257
340
|
for (const item of items) {
|
|
258
341
|
pending.delete(item.key);
|
|
@@ -277,7 +360,8 @@ export default function registerSubagentNotify(
|
|
|
277
360
|
};
|
|
278
361
|
|
|
279
362
|
const deliver = (result: CompletionNotification): Promise<boolean> => {
|
|
280
|
-
if (disposed || typeof result.sessionId !== "string" ||
|
|
363
|
+
if (disposed || typeof result.sessionId !== "string" || result.sessionId !== state.currentSessionId) return Promise.resolve(false);
|
|
364
|
+
if (result.source !== "foreground" && (!state.completionOwnerId || result.completionOwnerId !== state.completionOwnerId)) return Promise.resolve(false);
|
|
281
365
|
if (result.intercomDelivered === true) return Promise.resolve(true);
|
|
282
366
|
const key = buildCompletionKey(result, "notify");
|
|
283
367
|
const seenAt = seen.get(key);
|
|
@@ -2,14 +2,18 @@ import * as fs from "node:fs";
|
|
|
2
2
|
import * as path from "node:path";
|
|
3
3
|
import { writeAtomicJson } from "../../shared/atomic-json.ts";
|
|
4
4
|
import { MISSION_BINDING_FILE } from "../../missions/lifecycle.ts";
|
|
5
|
+
import { encodeIndexSegment, indexSegmentAliases, MAX_INDEX_SEGMENT_BYTES } from "./index-segment.ts";
|
|
5
6
|
|
|
6
7
|
const RESULT_INDEX_VERSION = 1;
|
|
7
8
|
const RESULT_INDEX_DIR = "result-index";
|
|
8
9
|
const SESSION_INDEX_DIR = "sessions";
|
|
10
|
+
const RUN_INDEX_DIR = "runs";
|
|
9
11
|
const OBSERVER_INDEX_DIR = "observers";
|
|
10
12
|
const TOOL_CALL_INDEX_DIR = "tool-calls";
|
|
11
13
|
const RESULT_PENDING_DIR = "result-pending";
|
|
12
14
|
const MISSION_OBSERVER = "mission";
|
|
15
|
+
const JSON_EXTENSION = ".json";
|
|
16
|
+
const MAX_JSON_FILE_STEM_BYTES = MAX_INDEX_SEGMENT_BYTES - Buffer.byteLength(JSON_EXTENSION, "utf-8");
|
|
13
17
|
|
|
14
18
|
export interface ResultIndexEntry {
|
|
15
19
|
version: 1;
|
|
@@ -21,7 +25,15 @@ export interface ResultIndexEntry {
|
|
|
21
25
|
}
|
|
22
26
|
|
|
23
27
|
function encodeSegment(value: string): string {
|
|
24
|
-
return
|
|
28
|
+
return encodeIndexSegment(value);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
function encodedJsonFileName(value: string): string {
|
|
32
|
+
return `${encodeIndexSegment(value, MAX_JSON_FILE_STEM_BYTES)}${JSON_EXTENSION}`;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function encodedJsonFileNames(value: string): string[] {
|
|
36
|
+
return indexSegmentAliases(value, MAX_JSON_FILE_STEM_BYTES).map((segment) => `${segment}${JSON_EXTENSION}`);
|
|
25
37
|
}
|
|
26
38
|
|
|
27
39
|
function nonEmptyString(value: unknown): string | undefined {
|
|
@@ -29,7 +41,7 @@ function nonEmptyString(value: unknown): string | undefined {
|
|
|
29
41
|
}
|
|
30
42
|
|
|
31
43
|
export function resultFileName(runId: string): string {
|
|
32
|
-
return `${runId}
|
|
44
|
+
return `${runId}${JSON_EXTENSION}`;
|
|
33
45
|
}
|
|
34
46
|
|
|
35
47
|
export function resultFilePath(resultsDir: string, runId: string): string {
|
|
@@ -40,12 +52,39 @@ function sessionIndexDir(resultsDir: string, sessionId: string): string {
|
|
|
40
52
|
return path.join(resultsDir, RESULT_INDEX_DIR, SESSION_INDEX_DIR, encodeSegment(sessionId));
|
|
41
53
|
}
|
|
42
54
|
|
|
55
|
+
function sessionIndexDirs(resultsDir: string, sessionId: string): string[] {
|
|
56
|
+
return indexSegmentAliases(sessionId).map((segment) => path.join(resultsDir, RESULT_INDEX_DIR, SESSION_INDEX_DIR, segment));
|
|
57
|
+
}
|
|
58
|
+
|
|
43
59
|
function resultIndexPath(resultsDir: string, sessionId: string, runId: string): string {
|
|
44
|
-
return path.join(sessionIndexDir(resultsDir, sessionId),
|
|
60
|
+
return path.join(sessionIndexDir(resultsDir, sessionId), encodedJsonFileName(runId));
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function resultIndexPaths(resultsDir: string, sessionId: string, runId: string): string[] {
|
|
64
|
+
return sessionIndexDirs(resultsDir, sessionId).flatMap((dir) => encodedJsonFileNames(runId).map((fileName) => path.join(dir, fileName)));
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function runIndexPath(resultsDir: string, runId: string): string {
|
|
68
|
+
return path.join(resultsDir, RESULT_INDEX_DIR, RUN_INDEX_DIR, encodedJsonFileName(runId));
|
|
45
69
|
}
|
|
46
70
|
|
|
47
71
|
function resultPendingPath(resultsDir: string, sessionId: string, runId: string): string {
|
|
48
|
-
return path.join(resultsDir, RESULT_PENDING_DIR, encodeSegment(sessionId),
|
|
72
|
+
return path.join(resultsDir, RESULT_PENDING_DIR, encodeSegment(sessionId), encodedJsonFileName(runId));
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function resultPendingPaths(resultsDir: string, sessionId: string, runId: string): string[] {
|
|
76
|
+
return indexSegmentAliases(sessionId).flatMap((segment) => encodedJsonFileNames(runId).map((fileName) => path.join(resultsDir, RESULT_PENDING_DIR, segment, fileName)));
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function pendingSessionDirs(resultsDir: string, sessionId: string): string[] {
|
|
80
|
+
return indexSegmentAliases(sessionId).map((segment) => path.join(resultsDir, RESULT_PENDING_DIR, segment));
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function firstExistingResultFile(paths: string[]): string | undefined {
|
|
84
|
+
for (const filePath of paths) {
|
|
85
|
+
if (existingResultFile(filePath)) return filePath;
|
|
86
|
+
}
|
|
87
|
+
return undefined;
|
|
49
88
|
}
|
|
50
89
|
|
|
51
90
|
function observerIndexDir(resultsDir: string, observer: string): string {
|
|
@@ -53,15 +92,15 @@ function observerIndexDir(resultsDir: string, observer: string): string {
|
|
|
53
92
|
}
|
|
54
93
|
|
|
55
94
|
function observerIndexPath(resultsDir: string, observer: string, runId: string): string {
|
|
56
|
-
return path.join(observerIndexDir(resultsDir, observer),
|
|
95
|
+
return path.join(observerIndexDir(resultsDir, observer), encodedJsonFileName(runId));
|
|
57
96
|
}
|
|
58
97
|
|
|
59
98
|
function toolCallIndexDir(resultsDir: string, toolCallId: string): string {
|
|
60
|
-
return path.join(resultsDir, RESULT_INDEX_DIR, TOOL_CALL_INDEX_DIR,
|
|
99
|
+
return path.join(resultsDir, RESULT_INDEX_DIR, TOOL_CALL_INDEX_DIR, encodeIndexSegment(toolCallId));
|
|
61
100
|
}
|
|
62
101
|
|
|
63
102
|
function toolCallIndexPath(resultsDir: string, toolCallId: string, runId: string): string {
|
|
64
|
-
return path.join(toolCallIndexDir(resultsDir, toolCallId),
|
|
103
|
+
return path.join(toolCallIndexDir(resultsDir, toolCallId), encodedJsonFileName(runId));
|
|
65
104
|
}
|
|
66
105
|
|
|
67
106
|
function parseResultIndexEntry(value: unknown): ResultIndexEntry | undefined {
|
|
@@ -97,6 +136,11 @@ export function writeResultIndexForData(resultPath: string, data: Record<string,
|
|
|
97
136
|
};
|
|
98
137
|
const resultsDir = path.dirname(resultPath);
|
|
99
138
|
writeAtomicJson(resultIndexPath(resultsDir, sessionId, runId), entry);
|
|
139
|
+
try {
|
|
140
|
+
writeAtomicJson(runIndexPath(resultsDir, runId), entry);
|
|
141
|
+
} catch (error) {
|
|
142
|
+
console.error(`Failed to write async result run index for '${resultPath}':`, error);
|
|
143
|
+
}
|
|
100
144
|
const toolCallId = nonEmptyString(data.toolCallId);
|
|
101
145
|
try {
|
|
102
146
|
if (toolCallId) writeAtomicJson(toolCallIndexPath(resultsDir, toolCallId, runId), entry);
|
|
@@ -136,17 +180,26 @@ export function writeAsyncResultFile(resultPath: string, data: Record<string, un
|
|
|
136
180
|
export function removeResultIndex(resultsDir: string, sessionId: string | undefined, runId: string | undefined, toolCallId?: string): void {
|
|
137
181
|
if (!runId) return;
|
|
138
182
|
if (sessionId) {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
183
|
+
for (const indexPath of resultIndexPaths(resultsDir, sessionId, runId)) {
|
|
184
|
+
try {
|
|
185
|
+
fs.rmSync(indexPath, { force: true });
|
|
186
|
+
} catch {
|
|
187
|
+
// Index cleanup must not affect result delivery.
|
|
188
|
+
}
|
|
143
189
|
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
190
|
+
for (const pendingPath of resultPendingPaths(resultsDir, sessionId, runId)) {
|
|
191
|
+
try {
|
|
192
|
+
fs.rmSync(pendingPath, { force: true });
|
|
193
|
+
} catch {
|
|
194
|
+
// Pending cleanup must not affect result delivery.
|
|
195
|
+
}
|
|
148
196
|
}
|
|
149
197
|
}
|
|
198
|
+
try {
|
|
199
|
+
fs.rmSync(runIndexPath(resultsDir, runId), { force: true });
|
|
200
|
+
} catch {
|
|
201
|
+
// Index cleanup must not affect result delivery.
|
|
202
|
+
}
|
|
150
203
|
if (toolCallId) {
|
|
151
204
|
try {
|
|
152
205
|
fs.rmSync(toolCallIndexPath(resultsDir, toolCallId, runId), { force: true });
|
|
@@ -180,7 +233,7 @@ function existingResultFile(resultPath: string): boolean {
|
|
|
180
233
|
}
|
|
181
234
|
|
|
182
235
|
function pendingResultExists(resultsDir: string, sessionId: string, runId: string): boolean {
|
|
183
|
-
return
|
|
236
|
+
return firstExistingResultFile(resultPendingPaths(resultsDir, sessionId, runId)) !== undefined;
|
|
184
237
|
}
|
|
185
238
|
|
|
186
239
|
function pendingResultPayloadMatches(filePath: string, sessionId: string, runId: string): boolean {
|
|
@@ -193,16 +246,34 @@ function pendingResultPayloadMatches(filePath: string, sessionId: string, runId:
|
|
|
193
246
|
}
|
|
194
247
|
}
|
|
195
248
|
|
|
249
|
+
function assertPendingResultPayloadMatches(filePath: string, sessionId: string, runId: string): boolean {
|
|
250
|
+
const data = JSON.parse(fs.readFileSync(filePath, "utf-8")) as Record<string, unknown>;
|
|
251
|
+
return (nonEmptyString(data.runId) ?? nonEmptyString(data.id)) === runId && nonEmptyString(data.sessionId) === sessionId;
|
|
252
|
+
}
|
|
253
|
+
|
|
196
254
|
export function promotePendingResultFile(resultsDir: string, sessionId: string, runId: string, file = resultFileName(runId), options: { logFailure?: boolean } = {}): "none" | "promoted" | "pending" {
|
|
197
255
|
if (file !== path.basename(file) || !file.endsWith(".json")) return "none";
|
|
198
|
-
const pendingPath =
|
|
199
|
-
if (!
|
|
256
|
+
const pendingPath = firstExistingResultFile(resultPendingPaths(resultsDir, sessionId, runId));
|
|
257
|
+
if (!pendingPath) return "none";
|
|
200
258
|
const resultPath = path.join(resultsDir, file);
|
|
201
259
|
try {
|
|
202
|
-
|
|
260
|
+
// POSIX rename replaces the destination atomically. Deleting it first lets a
|
|
261
|
+
// losing promoter unlink the result that another promoter just published.
|
|
203
262
|
fs.renameSync(pendingPath, resultPath);
|
|
204
263
|
return existingResultFile(resultPath) ? "promoted" : "pending";
|
|
205
264
|
} catch (error) {
|
|
265
|
+
const code = (error as NodeJS.ErrnoException).code;
|
|
266
|
+
if (code === "ENOENT" || code === "EEXIST" || code === "EPERM" || code === "EACCES") {
|
|
267
|
+
const pendingExists = existingResultFile(pendingPath);
|
|
268
|
+
const resultExists = existingResultFile(resultPath);
|
|
269
|
+
if (pendingExists) {
|
|
270
|
+
if (!resultExists && options.logFailure !== false) console.error(`Failed to promote pending async result '${pendingPath}' to '${resultPath}':`, error);
|
|
271
|
+
return "pending";
|
|
272
|
+
}
|
|
273
|
+
if (resultExists) return "promoted";
|
|
274
|
+
if (options.logFailure !== false) console.error(`Pending async result '${pendingPath}' disappeared without a promoted result at '${resultPath}'.`);
|
|
275
|
+
return "none";
|
|
276
|
+
}
|
|
206
277
|
if (options.logFailure !== false) console.error(`Failed to promote pending async result '${pendingPath}' to '${resultPath}':`, error);
|
|
207
278
|
return "pending";
|
|
208
279
|
}
|
|
@@ -216,33 +287,15 @@ interface ResultPayloadLocation {
|
|
|
216
287
|
|
|
217
288
|
function pendingResultLocationForSessionRun(resultsDir: string, sessionId: string, runId: string, file = resultFileName(runId)): ResultPayloadLocation | undefined {
|
|
218
289
|
if (file !== path.basename(file) || !file.endsWith(".json")) return undefined;
|
|
219
|
-
const pendingPath =
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
: undefined;
|
|
290
|
+
const pendingPath = firstExistingResultFile(resultPendingPaths(resultsDir, sessionId, runId));
|
|
291
|
+
if (!pendingPath || !pendingResultPayloadMatches(pendingPath, sessionId, runId)) return undefined;
|
|
292
|
+
return { file, path: pendingPath, state: "pending" };
|
|
223
293
|
}
|
|
224
294
|
|
|
225
|
-
function
|
|
226
|
-
const
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
sessions = fs.readdirSync(root, { withFileTypes: true });
|
|
230
|
-
} catch (error) {
|
|
231
|
-
if ((error as NodeJS.ErrnoException).code !== "ENOENT") console.error(`Failed to inspect pending async result root '${root}':`, error);
|
|
232
|
-
return undefined;
|
|
233
|
-
}
|
|
234
|
-
for (const session of sessions) {
|
|
235
|
-
if (!session.isDirectory()) continue;
|
|
236
|
-
let sessionId: string;
|
|
237
|
-
try {
|
|
238
|
-
sessionId = decodeURIComponent(session.name);
|
|
239
|
-
} catch {
|
|
240
|
-
continue;
|
|
241
|
-
}
|
|
242
|
-
const location = pendingResultLocationForSessionRun(resultsDir, sessionId, runId);
|
|
243
|
-
if (location) return location;
|
|
244
|
-
}
|
|
245
|
-
return undefined;
|
|
295
|
+
export function fallbackResultPayloadPathForSessionRun(resultsDir: string, sessionId: string, runId: string): string | undefined {
|
|
296
|
+
const pendingPath = firstExistingResultFile(resultPendingPaths(resultsDir, sessionId, runId));
|
|
297
|
+
if (!pendingPath || !assertPendingResultPayloadMatches(pendingPath, sessionId, runId)) return undefined;
|
|
298
|
+
return pendingPath;
|
|
246
299
|
}
|
|
247
300
|
|
|
248
301
|
function resultPayloadLocationFromIndex(resultsDir: string, entry: ResultIndexEntry): ResultPayloadLocation | undefined {
|
|
@@ -257,15 +310,20 @@ function resultPayloadLocationFromIndex(resultsDir: string, entry: ResultIndexEn
|
|
|
257
310
|
}
|
|
258
311
|
|
|
259
312
|
function readResultIndexForSessionRun(resultsDir: string, sessionId: string, runId: string): ResultIndexEntry | undefined {
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
313
|
+
for (const indexPath of resultIndexPaths(resultsDir, sessionId, runId)) {
|
|
314
|
+
try {
|
|
315
|
+
const entry = parseResultIndexEntry(JSON.parse(fs.readFileSync(indexPath, "utf-8")));
|
|
316
|
+
if (!entry || entry.sessionId !== sessionId || entry.runId !== runId) continue;
|
|
317
|
+
return entry;
|
|
318
|
+
} catch (error) {
|
|
319
|
+
const code = (error as NodeJS.ErrnoException).code;
|
|
320
|
+
if (code === "EPERM" || code === "EACCES") throw error;
|
|
321
|
+
if (code !== "ENOENT" && code !== "ENOTDIR") {
|
|
322
|
+
console.error(`Ignoring invalid async result index for '${runId}':`, error);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
268
325
|
}
|
|
326
|
+
return undefined;
|
|
269
327
|
}
|
|
270
328
|
|
|
271
329
|
export function resultPayloadPathForSessionRun(resultsDir: string, sessionId: string, runId: string): string | undefined {
|
|
@@ -286,27 +344,24 @@ export function resultPayloadPathForMissionObserverRun(resultsDir: string, runId
|
|
|
286
344
|
}
|
|
287
345
|
|
|
288
346
|
export function resultPayloadPathForIndexedRun(resultsDir: string, runId: string): string | undefined {
|
|
289
|
-
const
|
|
290
|
-
let sessions: fs.Dirent[] = [];
|
|
347
|
+
const entryPath = runIndexPath(resultsDir, runId);
|
|
291
348
|
try {
|
|
292
|
-
|
|
349
|
+
const entry = parseResultIndexEntry(JSON.parse(fs.readFileSync(entryPath, "utf-8")));
|
|
350
|
+
if (!entry || entry.runId !== runId) {
|
|
351
|
+
fs.rmSync(entryPath, { force: true });
|
|
352
|
+
return undefined;
|
|
353
|
+
}
|
|
354
|
+
const location = resultPayloadLocationFromIndex(resultsDir, entry);
|
|
355
|
+
if (location) return location.path;
|
|
356
|
+
fs.rmSync(entryPath, { force: true });
|
|
293
357
|
} catch (error) {
|
|
294
358
|
const code = (error as NodeJS.ErrnoException).code;
|
|
295
|
-
if (code !== "ENOENT" && code !== "ENOTDIR")
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
if (!session.isDirectory()) continue;
|
|
299
|
-
const entryPath = path.join(root, session.name, `${encodeSegment(runId)}.json`);
|
|
300
|
-
try {
|
|
301
|
-
const entry = parseResultIndexEntry(JSON.parse(fs.readFileSync(entryPath, "utf-8")));
|
|
302
|
-
if (!entry || entry.runId !== runId) continue;
|
|
303
|
-
const location = resultPayloadLocationFromIndex(resultsDir, entry);
|
|
304
|
-
if (location) return location.path;
|
|
305
|
-
} catch (error) {
|
|
306
|
-
if ((error as NodeJS.ErrnoException).code !== "ENOENT") console.error(`Ignoring invalid async result index '${entryPath}':`, error);
|
|
359
|
+
if (code !== "ENOENT" && code !== "ENOTDIR") {
|
|
360
|
+
console.error(`Ignoring invalid async result run index '${entryPath}':`, error);
|
|
361
|
+
try { fs.rmSync(entryPath, { force: true }); } catch {}
|
|
307
362
|
}
|
|
308
363
|
}
|
|
309
|
-
return
|
|
364
|
+
return undefined;
|
|
310
365
|
}
|
|
311
366
|
|
|
312
367
|
function indexedResultFile(resultsDir: string, entry: ResultIndexEntry, includePending = false): string | undefined {
|
|
@@ -323,7 +378,7 @@ function listIndexFiles(dir: string): string[] {
|
|
|
323
378
|
.map((entry) => path.join(dir, entry.name));
|
|
324
379
|
} catch (error) {
|
|
325
380
|
const code = (error as NodeJS.ErrnoException).code;
|
|
326
|
-
if (code === "ENOENT" || code === "ENOTDIR") return [];
|
|
381
|
+
if (code === "ENOENT" || code === "ENOTDIR" || code === "EPERM" || code === "EACCES") return [];
|
|
327
382
|
throw error;
|
|
328
383
|
}
|
|
329
384
|
return files;
|
|
@@ -348,44 +403,56 @@ function resultFilesFromIndexDir(resultsDir: string, dir: string, includePending
|
|
|
348
403
|
}
|
|
349
404
|
|
|
350
405
|
export function resultFilesForSession(resultsDir: string, sessionId: string): string[] {
|
|
351
|
-
|
|
406
|
+
const files = new Set<string>();
|
|
407
|
+
for (const dir of sessionIndexDirs(resultsDir, sessionId)) {
|
|
408
|
+
for (const file of resultFilesFromIndexDir(resultsDir, dir)) files.add(file);
|
|
409
|
+
}
|
|
410
|
+
return [...files];
|
|
352
411
|
}
|
|
353
412
|
|
|
354
413
|
function pendingResultFilesForSession(resultsDir: string, sessionId: string): string[] {
|
|
355
|
-
const dir = path.join(resultsDir, RESULT_PENDING_DIR, encodeSegment(sessionId));
|
|
356
|
-
let entries: fs.Dirent[];
|
|
357
|
-
try {
|
|
358
|
-
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
359
|
-
} catch (error) {
|
|
360
|
-
if ((error as NodeJS.ErrnoException).code === "ENOENT") return [];
|
|
361
|
-
throw error;
|
|
362
|
-
}
|
|
363
414
|
const files = new Set<string>();
|
|
364
|
-
for (const
|
|
365
|
-
|
|
366
|
-
const pendingPath = path.join(dir, entry.name);
|
|
415
|
+
for (const dir of pendingSessionDirs(resultsDir, sessionId)) {
|
|
416
|
+
let entries: fs.Dirent[];
|
|
367
417
|
try {
|
|
368
|
-
|
|
369
|
-
const runId = nonEmptyString(data.runId) ?? nonEmptyString(data.id);
|
|
370
|
-
if (runId && nonEmptyString(data.sessionId) === sessionId) files.add(resultFileName(runId));
|
|
418
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
371
419
|
} catch (error) {
|
|
372
|
-
|
|
420
|
+
const code = (error as NodeJS.ErrnoException).code;
|
|
421
|
+
if (code === "ENOENT" || code === "ENOTDIR" || code === "EPERM" || code === "EACCES") continue;
|
|
422
|
+
throw error;
|
|
423
|
+
}
|
|
424
|
+
for (const entry of entries) {
|
|
425
|
+
if (!entry.isFile() || !entry.name.endsWith(".json")) continue;
|
|
426
|
+
const pendingPath = path.join(dir, entry.name);
|
|
427
|
+
try {
|
|
428
|
+
const data = JSON.parse(fs.readFileSync(pendingPath, "utf-8")) as Record<string, unknown>;
|
|
429
|
+
const runId = nonEmptyString(data.runId) ?? nonEmptyString(data.id);
|
|
430
|
+
if (runId && nonEmptyString(data.sessionId) === sessionId) files.add(resultFileName(runId));
|
|
431
|
+
} catch (error) {
|
|
432
|
+
if ((error as NodeJS.ErrnoException).code !== "ENOENT") console.error(`Ignoring invalid pending async result '${pendingPath}':`, error);
|
|
433
|
+
}
|
|
373
434
|
}
|
|
374
435
|
}
|
|
375
436
|
return [...files];
|
|
376
437
|
}
|
|
377
438
|
|
|
378
439
|
export function resultCandidateFilesForSession(resultsDir: string, sessionId: string): string[] {
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
440
|
+
const files = new Set<string>();
|
|
441
|
+
for (const dir of sessionIndexDirs(resultsDir, sessionId)) {
|
|
442
|
+
for (const file of resultFilesFromIndexDir(resultsDir, dir, true)) files.add(file);
|
|
443
|
+
}
|
|
444
|
+
for (const file of pendingResultFilesForSession(resultsDir, sessionId)) files.add(file);
|
|
445
|
+
return [...files];
|
|
383
446
|
}
|
|
384
447
|
|
|
385
448
|
export function resultFilesForToolCall(resultsDir: string, toolCallId: string): string[] {
|
|
386
449
|
return resultFilesFromIndexDir(resultsDir, toolCallIndexDir(resultsDir, toolCallId));
|
|
387
450
|
}
|
|
388
451
|
|
|
452
|
+
export function resultCandidateFilesForToolCall(resultsDir: string, toolCallId: string): string[] {
|
|
453
|
+
return resultFilesFromIndexDir(resultsDir, toolCallIndexDir(resultsDir, toolCallId), true);
|
|
454
|
+
}
|
|
455
|
+
|
|
389
456
|
export function missionObserverResultFiles(resultsDir: string): string[] {
|
|
390
457
|
return resultFilesFromIndexDir(resultsDir, observerIndexDir(resultsDir, MISSION_OBSERVER));
|
|
391
458
|
}
|
|
@@ -403,7 +470,8 @@ export function cleanupResultIndexes(resultsDir: string, now = Date.now(), maxAg
|
|
|
403
470
|
try {
|
|
404
471
|
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
405
472
|
} catch (error) {
|
|
406
|
-
|
|
473
|
+
const code = (error as NodeJS.ErrnoException).code;
|
|
474
|
+
if (code === "ENOENT" || code === "ENOTDIR" || code === "EPERM" || code === "EACCES") return;
|
|
407
475
|
throw error;
|
|
408
476
|
}
|
|
409
477
|
for (const entry of entries) {
|