@selesai/code 0.13.15 → 0.13.18
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 +37 -0
- package/README.md +2 -14
- package/dist/bun/cli.d.ts +3 -1
- package/dist/bun/cli.js +3 -9
- package/dist/bun/{register-bedrock.js → runtime-setup.js} +5 -0
- package/dist/bun/sandbox-env-setup.d.ts +1 -0
- package/dist/bun/sandbox-env-setup.js +3 -0
- package/dist/cli/auth-command.d.ts +23 -0
- package/dist/cli/auth-command.js +102 -0
- package/dist/cli/config-selector.js +2 -1
- package/dist/cli/setup.d.ts +1 -0
- package/dist/cli/setup.js +11 -0
- package/dist/cli.js +2 -14
- package/dist/config.d.ts +3 -2
- package/dist/config.js +9 -4
- package/dist/core/agent-session-runtime.js +15 -7
- package/dist/core/agent-session.d.ts +2 -6
- package/dist/core/agent-session.js +15 -4
- package/dist/core/compaction/branch-summarization.d.ts +1 -1
- package/dist/core/compaction/branch-summarization.js +2 -1
- package/dist/core/extensions/loader.js +3 -0
- package/dist/core/extensions/types.d.ts +16 -2
- package/dist/core/http-dispatcher.js +2 -0
- package/dist/core/keybindings.d.ts +5 -0
- package/dist/core/keybindings.js +4 -0
- package/dist/core/messages.d.ts +1 -1
- package/dist/core/model-config.d.ts +15 -0
- package/dist/core/model-config.js +3 -0
- package/dist/core/model-runtime.d.ts +1 -0
- package/dist/core/model-runtime.js +5 -2
- package/dist/core/provider-composer.js +8 -2
- package/dist/core/session-export.d.ts +3 -0
- package/dist/core/session-export.js +31 -0
- package/dist/core/session-manager.d.ts +3 -2
- package/dist/core/session-manager.js +40 -13
- package/dist/core/skills.d.ts +1 -1
- package/dist/core/skills.js +4 -2
- package/dist/core/system-prompt.js +10 -10
- package/dist/core/tools/bash.js +3 -117
- package/dist/core/tools/edit.d.ts +1 -12
- package/dist/core/tools/edit.js +5 -163
- package/dist/core/tools/find.js +4 -55
- package/dist/core/tools/grep.js +4 -60
- package/dist/core/tools/ls.js +4 -49
- package/dist/core/tools/read.d.ts +4 -0
- package/dist/core/tools/read.js +10 -122
- package/dist/core/tools/renderers/bash.d.ts +11 -0
- package/dist/core/tools/renderers/bash.js +129 -0
- package/dist/core/tools/renderers/edit.d.ts +22 -0
- package/dist/core/tools/renderers/edit.js +166 -0
- package/dist/core/tools/renderers/find.d.ts +9 -0
- package/dist/core/tools/renderers/find.js +63 -0
- package/dist/core/tools/renderers/grep.d.ts +9 -0
- package/dist/core/tools/renderers/grep.js +68 -0
- package/dist/core/tools/renderers/index.d.ts +27 -0
- package/dist/core/tools/renderers/index.js +46 -0
- package/dist/core/tools/renderers/ls.d.ts +9 -0
- package/dist/core/tools/renderers/ls.js +57 -0
- package/dist/core/tools/renderers/read.d.ts +10 -0
- package/dist/core/tools/renderers/read.js +128 -0
- package/dist/core/tools/renderers/write.d.ts +9 -0
- package/dist/core/tools/renderers/write.js +152 -0
- package/dist/core/tools/write.js +5 -146
- package/dist/extensions/capability-gateway/index.ts +12 -1
- package/dist/extensions/capability-gateway/integration.test.ts +23 -0
- package/dist/extensions/pi-hermes-memory/CHANGELOG.md +18 -0
- package/dist/extensions/pi-hermes-memory/README.md +16 -12
- package/dist/extensions/pi-hermes-memory/docs/ROADMAP.md +1 -1
- package/dist/extensions/pi-hermes-memory/package-lock.json +587 -62
- package/dist/extensions/pi-hermes-memory/package.json +4 -4
- package/dist/extensions/pi-hermes-memory/src/config.ts +32 -0
- package/dist/extensions/pi-hermes-memory/src/constants.ts +12 -2
- package/dist/extensions/pi-hermes-memory/src/handlers/background-review.ts +109 -51
- package/dist/extensions/pi-hermes-memory/src/handlers/index-sessions.ts +9 -3
- package/dist/extensions/pi-hermes-memory/src/handlers/review-memory-ops.ts +257 -98
- package/dist/extensions/pi-hermes-memory/src/handlers/session-backfill.ts +9 -2
- package/dist/extensions/pi-hermes-memory/src/handlers/sync-markdown-memories.ts +5 -0
- package/dist/extensions/pi-hermes-memory/src/index.ts +22 -2
- package/dist/extensions/pi-hermes-memory/src/paths.ts +1 -1
- package/dist/extensions/pi-hermes-memory/src/store/db.ts +6 -0
- package/dist/extensions/pi-hermes-memory/src/store/fts-query.ts +58 -1
- package/dist/extensions/pi-hermes-memory/src/store/memory-store.ts +60 -8
- package/dist/extensions/pi-hermes-memory/src/store/session-indexer.ts +169 -7
- package/dist/extensions/pi-hermes-memory/src/store/session-search.ts +7 -21
- package/dist/extensions/pi-hermes-memory/src/store/sqlite-memory-store.ts +134 -15
- package/dist/extensions/pi-hermes-memory/src/tools/memory-search-tool.ts +4 -2
- package/dist/extensions/pi-hermes-memory/src/tools/memory-tool.ts +24 -9
- package/dist/extensions/pi-hermes-memory/src/types.ts +11 -0
- package/dist/extensions/pi-hermes-memory/tests/config.test.ts +42 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/background-review.test.ts +159 -3
- package/dist/extensions/pi-hermes-memory/tests/handlers/review-memory-ops.test.ts +452 -0
- package/dist/extensions/pi-hermes-memory/tests/handlers/session-backfill.test.ts +39 -0
- package/dist/extensions/pi-hermes-memory/tests/integration/corruption-recovery-integration.test.ts +91 -0
- package/dist/extensions/pi-hermes-memory/tests/store/db.test.ts +29 -0
- package/dist/extensions/pi-hermes-memory/tests/store/fts-query.test.ts +116 -0
- package/dist/extensions/pi-hermes-memory/tests/store/memory-store.test.ts +163 -0
- package/dist/extensions/pi-hermes-memory/tests/store/session-indexer.test.ts +233 -0
- package/dist/extensions/pi-hermes-memory/tests/store/session-search.test.ts +12 -0
- package/dist/extensions/pi-hermes-memory/tests/store/sqlite-memory-store.test.ts +175 -0
- package/dist/extensions/pi-hermes-memory/tests/store/sqlite-native.test.ts +2 -2
- package/dist/extensions/pi-hermes-memory/tests/tools/memory-search-tool.test.ts +22 -0
- package/dist/extensions/pi-hermes-memory/tests/tools/memory-tool.test.ts +37 -1
- package/dist/extensions/pi-intercom/CHANGELOG.md +13 -0
- package/dist/extensions/pi-intercom/README.md +16 -2
- package/dist/extensions/pi-intercom/broker/spawn.test.ts +19 -2
- package/dist/extensions/pi-intercom/broker/spawn.ts +4 -4
- package/dist/extensions/pi-intercom/index.ts +1 -1
- package/dist/extensions/pi-intercom/intercom.integration.test.ts +121 -2
- package/dist/extensions/pi-intercom/package.json +1 -1
- package/dist/extensions/pi-intercom/project-agent.test.ts +1 -1
- package/dist/extensions/pi-intercom/project-agent.ts +1 -6
- package/dist/extensions/pi-intercom/skills/pi-intercom/SKILL.md +7 -6
- package/dist/extensions/pi-rewind-hook/index.test.ts +7 -0
- package/dist/extensions/pi-subagents/.github/workflows/test.yml +36 -4
- package/dist/extensions/pi-subagents/CHANGELOG.md +120 -0
- package/dist/extensions/pi-subagents/README.md +3 -3
- package/dist/extensions/pi-subagents/agents/researcher.md +23 -13
- package/dist/extensions/pi-subagents/agents/reviewer.md +1 -1
- package/dist/extensions/pi-subagents/agents/scout.md +1 -1
- package/dist/extensions/pi-subagents/docs/agents.md +32 -16
- package/dist/extensions/pi-subagents/docs/configuration.md +41 -15
- package/dist/extensions/pi-subagents/docs/extension-api.md +109 -6
- package/dist/extensions/pi-subagents/docs/missions.md +2 -0
- package/dist/extensions/pi-subagents/docs/models.md +58 -1
- package/dist/extensions/pi-subagents/docs/observability.md +50 -12
- package/dist/extensions/pi-subagents/docs/tool-reference.md +17 -10
- package/dist/extensions/pi-subagents/docs/watchdog.md +1 -1
- package/dist/extensions/pi-subagents/docs/workflows.md +26 -9
- package/dist/extensions/pi-subagents/package-lock.json +747 -177
- package/dist/extensions/pi-subagents/package.json +6 -4
- package/dist/extensions/pi-subagents/runner-server-preload.mjs +13 -0
- package/dist/extensions/pi-subagents/skills/pi-subagents/SKILL.md +2 -1
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/constraints-and-recipes.md +1 -1
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/execution-controls.md +21 -4
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/management-authoring-rpc.md +2 -1
- package/dist/extensions/pi-subagents/skills/pi-subagents/references/multi-lane-orchestration.md +2 -0
- package/dist/extensions/pi-subagents/src/agents/advertised-agent-prompt.ts +63 -0
- package/dist/extensions/pi-subagents/src/agents/agent-management.ts +61 -16
- package/dist/extensions/pi-subagents/src/agents/agent-serializer.ts +2 -0
- package/dist/extensions/pi-subagents/src/agents/agents.ts +8 -0
- package/dist/extensions/pi-subagents/src/api/capability-ceiling.ts +0 -1
- package/dist/extensions/pi-subagents/src/api/{pi-args.ts → child-tool-plan.ts} +1 -1
- package/dist/extensions/pi-subagents/src/api/preflight.ts +7 -4
- package/dist/extensions/pi-subagents/src/api/shared-types.ts +2 -2
- package/dist/extensions/pi-subagents/src/api/workflow-resources.ts +6 -0
- package/dist/extensions/pi-subagents/src/extension/config.ts +4 -2
- package/dist/extensions/pi-subagents/src/extension/doctor.ts +2 -10
- package/dist/extensions/pi-subagents/src/extension/fanout-child.ts +9 -11
- package/dist/extensions/pi-subagents/src/extension/index.ts +99 -10
- package/dist/extensions/pi-subagents/src/extension/public-execution.ts +13 -0
- package/dist/extensions/pi-subagents/src/extension/rpc.ts +7 -23
- package/dist/extensions/pi-subagents/src/extension/schemas.ts +11 -8
- package/dist/extensions/pi-subagents/src/extension/tool-description.ts +25 -7
- package/dist/extensions/pi-subagents/src/integrations/pi-web-session-liveness.ts +73 -0
- package/dist/extensions/pi-subagents/src/intercom/native-supervisor-channel.ts +228 -136
- package/dist/extensions/pi-subagents/src/intercom/supervisor-ui.ts +244 -0
- package/dist/extensions/pi-subagents/src/missions/workflow-state.ts +37 -16
- package/dist/extensions/pi-subagents/src/runs/background/active-async-capacity.ts +18 -18
- package/dist/extensions/pi-subagents/src/runs/background/async-execution.ts +51 -25
- package/dist/extensions/pi-subagents/src/runs/background/async-job-tracker.ts +46 -3
- package/dist/extensions/pi-subagents/src/runs/background/async-resume.ts +14 -3
- package/dist/extensions/pi-subagents/src/runs/background/async-retention.ts +9 -0
- package/dist/extensions/pi-subagents/src/runs/background/async-status-snapshot.ts +10 -12
- package/dist/extensions/pi-subagents/src/runs/background/async-status.ts +18 -15
- package/dist/extensions/pi-subagents/src/runs/background/auto-drain.ts +40 -29
- package/dist/extensions/pi-subagents/src/runs/background/chain-root-attachment.ts +8 -0
- package/dist/extensions/pi-subagents/src/runs/background/control-channel.ts +79 -247
- package/dist/extensions/pi-subagents/src/runs/background/notify.ts +88 -12
- package/dist/extensions/pi-subagents/src/runs/background/owned-process-tree.ts +6 -6
- package/dist/extensions/pi-subagents/src/runs/background/process-terminal.ts +24 -24
- package/dist/extensions/pi-subagents/src/runs/background/retained-nested-route-tracker.ts +96 -0
- package/dist/extensions/pi-subagents/src/runs/background/run-child-session.ts +642 -0
- package/dist/extensions/pi-subagents/src/runs/background/run-status.ts +75 -6
- package/dist/extensions/pi-subagents/src/runs/background/runner-aliases.ts +163 -0
- package/dist/extensions/pi-subagents/src/runs/background/runner-child-launch.ts +86 -0
- package/dist/extensions/pi-subagents/src/runs/background/runner-child-sessions.ts +31 -0
- package/dist/extensions/pi-subagents/src/runs/background/scheduled-runs.ts +18 -4
- package/dist/extensions/pi-subagents/src/runs/background/stale-run-reconciler.ts +3 -1
- package/dist/extensions/pi-subagents/src/runs/background/subagent-runner.ts +597 -1092
- package/dist/extensions/pi-subagents/src/runs/background/subagent-wait.ts +3 -0
- package/dist/extensions/pi-subagents/src/runs/background/wait-completions.ts +4 -0
- package/dist/extensions/pi-subagents/src/runs/foreground/async-steering-action.ts +20 -17
- package/dist/extensions/pi-subagents/src/runs/foreground/execution.ts +296 -394
- package/dist/extensions/pi-subagents/src/runs/foreground/foreground-control.ts +4 -0
- package/dist/extensions/pi-subagents/src/runs/foreground/foreground-history.ts +3 -1
- package/dist/extensions/pi-subagents/src/runs/foreground/prompt-audit.ts +9 -5
- package/dist/extensions/pi-subagents/src/runs/foreground/subagent-executor.ts +630 -283
- package/dist/extensions/pi-subagents/src/runs/foreground/workflow-detach-reconcile.ts +8 -5
- package/dist/extensions/pi-subagents/src/runs/foreground/workflow-foreground-steering.ts +78 -98
- package/dist/extensions/pi-subagents/src/runs/shared/abort-recovery.ts +3 -3
- package/dist/extensions/pi-subagents/src/runs/shared/acceptance.ts +16 -3
- package/dist/extensions/pi-subagents/src/runs/shared/agent-contract.ts +1 -1
- package/dist/extensions/pi-subagents/src/runs/shared/async-status-projection.ts +47 -47
- package/dist/extensions/pi-subagents/src/runs/shared/capability-ceiling.ts +1 -2
- package/dist/extensions/pi-subagents/src/runs/shared/child-hooks.ts +174 -0
- package/dist/extensions/pi-subagents/src/runs/shared/child-identity.ts +14 -3
- package/dist/extensions/pi-subagents/src/runs/shared/child-launch.ts +319 -0
- package/dist/extensions/pi-subagents/src/runs/shared/child-lifecycle.ts +25 -0
- package/dist/extensions/pi-subagents/src/runs/shared/child-runtime-config.ts +126 -0
- package/dist/extensions/pi-subagents/src/runs/shared/child-session.ts +373 -0
- package/dist/extensions/pi-subagents/src/runs/shared/child-tool-plan.ts +530 -0
- package/dist/extensions/pi-subagents/src/runs/shared/completion-evidence.ts +2 -2
- package/dist/extensions/pi-subagents/src/runs/shared/completion-guard.ts +2 -1
- package/dist/extensions/pi-subagents/src/runs/shared/external-cli-preflight.ts +16 -0
- package/dist/extensions/pi-subagents/src/runs/shared/host-step-status.ts +11 -11
- package/dist/extensions/pi-subagents/src/runs/shared/llm-intent-arbiter.ts +30 -20
- package/dist/extensions/pi-subagents/src/runs/shared/mcp-direct-tool-allowlist.ts +5 -4
- package/dist/extensions/pi-subagents/src/runs/shared/model-exclusions.ts +84 -15
- package/dist/extensions/pi-subagents/src/runs/shared/model-fallback.ts +88 -12
- package/dist/extensions/pi-subagents/src/runs/shared/nested-events.ts +37 -53
- package/dist/extensions/pi-subagents/src/runs/shared/nested-path.ts +1 -1
- package/dist/extensions/pi-subagents/src/runs/shared/orca-progress-tabs.ts +18 -7
- package/dist/extensions/pi-subagents/src/runs/shared/parallel-handoff.ts +57 -12
- package/dist/extensions/pi-subagents/src/runs/shared/parallel-utils.ts +3 -4
- package/dist/extensions/pi-subagents/src/runs/shared/permissions.ts +0 -11
- package/dist/extensions/pi-subagents/src/runs/shared/process-signal.ts +4 -1
- package/dist/extensions/pi-subagents/src/runs/shared/readonly-drain-observation.ts +42 -0
- package/dist/extensions/pi-subagents/src/runs/shared/readonly-model-continuation.ts +69 -0
- package/dist/extensions/pi-subagents/src/runs/shared/readonly-session-evidence.ts +307 -0
- package/dist/extensions/pi-subagents/src/runs/shared/run-fanout-budget.ts +8 -21
- package/dist/extensions/pi-subagents/src/runs/shared/runtime-acknowledged-extensions.ts +3 -30
- package/dist/extensions/pi-subagents/src/runs/shared/structured-output.ts +17 -4
- package/dist/extensions/pi-subagents/src/runs/shared/subagent-control.ts +2 -0
- package/dist/extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts +99 -386
- package/dist/extensions/pi-subagents/src/runs/shared/tool-availability.ts +18 -62
- package/dist/extensions/pi-subagents/src/runs/shared/tool-budget.ts +0 -14
- package/dist/extensions/pi-subagents/src/runs/shared/worktree-cleanup-plan.ts +31 -9
- package/dist/extensions/pi-subagents/src/runs/shared/worktree-setup-command.ts +190 -0
- package/dist/extensions/pi-subagents/src/runs/shared/worktree.ts +506 -226
- package/dist/extensions/pi-subagents/src/shared/child-session-name.ts +1 -1
- package/dist/extensions/pi-subagents/src/shared/jsonl-writer.ts +11 -0
- package/dist/extensions/pi-subagents/src/shared/model-response-aliases.ts +13 -0
- package/dist/extensions/pi-subagents/src/shared/thinking-ceiling.ts +0 -6
- package/dist/extensions/pi-subagents/src/shared/types.ts +145 -89
- package/dist/extensions/pi-subagents/src/shared/utils.ts +13 -6
- package/dist/extensions/pi-subagents/src/shared/watch-strategy.ts +2 -0
- package/dist/extensions/pi-subagents/src/shared/workflow-child-permit.ts +18 -13
- package/dist/extensions/pi-subagents/src/slash/slash-commands.ts +0 -6
- package/dist/extensions/pi-subagents/src/tui/fleet-status.ts +1 -1
- package/dist/extensions/pi-subagents/src/tui/fleet.ts +11 -6
- package/dist/extensions/pi-subagents/src/tui/render.ts +277 -46
- package/dist/extensions/pi-subagents/src/watchdog/child-status.ts +0 -1
- package/dist/extensions/pi-subagents/src/watchdog/register-child.ts +12 -12
- package/dist/extensions/pi-subagents/src/workflows/chat-progress.ts +3 -3
- package/dist/extensions/pi-subagents/src/workflows/scripted-workflow.ts +116 -15
- package/dist/extensions/pi-subagents/src/workflows/workflow-checklist.ts +15 -18
- package/dist/extensions/pi-subagents/src/workflows/workflow-child-summary.ts +57 -8
- package/dist/extensions/pi-subagents/src/workflows/workflow-preflight.ts +19 -19
- package/dist/extensions/pi-subagents/src/workflows/workflow-receipt.ts +3 -3
- package/dist/extensions/pi-subagents/src/workflows/workflow-resources.ts +97 -22
- package/dist/extensions/pi-subagents/src/workflows/workflow-settlement.ts +3 -0
- package/dist/extensions/pi-subagents/test/integration/acceptance-file-report.test.ts +336 -21
- package/dist/extensions/pi-subagents/test/integration/async-execution.part-1.test.ts +1181 -0
- package/dist/extensions/pi-subagents/test/integration/async-execution.part-2.test.ts +2240 -0
- package/dist/extensions/pi-subagents/test/integration/async-execution.part-3.test.ts +2268 -0
- package/dist/extensions/pi-subagents/test/integration/async-execution.part-4.test.ts +1512 -0
- package/dist/extensions/pi-subagents/test/integration/async-job-tracker.test.ts +231 -16
- package/dist/extensions/pi-subagents/test/integration/error-handling.test.ts +4 -18
- package/dist/extensions/pi-subagents/test/integration/foreign-workflow-steering.test.ts +95 -0
- package/dist/extensions/pi-subagents/test/integration/fork-context-execution.test.ts +9 -15
- package/dist/extensions/pi-subagents/test/integration/in-process-child.test.ts +374 -0
- package/dist/extensions/pi-subagents/test/integration/intercom-result-delivery.test.ts +20 -10
- package/dist/extensions/pi-subagents/test/integration/orca-progress-tabs.test.ts +18 -6
- package/dist/extensions/pi-subagents/test/integration/recovered-assistant-error.test.ts +151 -0
- package/dist/extensions/pi-subagents/test/integration/render-fork-badge.test.ts +42 -1
- package/dist/extensions/pi-subagents/test/integration/render-widget.test.ts +150 -25
- package/dist/extensions/pi-subagents/test/integration/result-publication.test.ts +354 -0
- package/dist/extensions/pi-subagents/test/integration/shared-cwd-terminal-evidence.test.ts +117 -0
- package/dist/extensions/pi-subagents/test/integration/single-execution.part-1.test.ts +3678 -0
- package/dist/extensions/pi-subagents/test/integration/{single-execution.test.ts → single-execution.part-2.test.ts} +500 -4207
- package/dist/extensions/pi-subagents/test/integration/slash-commands.test.ts +1 -2
- package/dist/extensions/pi-subagents/test/integration/workflow-result-publication.test.ts +127 -0
- package/dist/extensions/pi-subagents/test/integration/workflow-steer-inbox.test.ts +365 -0
- package/dist/extensions/pi-subagents/test/smoke/pi085-child.ts +31 -0
- package/dist/extensions/pi-subagents/test/smoke/pi085-clean-install.mjs +74 -0
- package/dist/extensions/pi-subagents/test/smoke/pi085-extension.ts +16 -0
- package/dist/extensions/pi-subagents/test/support/async-execution-fixture.ts +699 -0
- package/dist/extensions/pi-subagents/test/support/fake-child-session.ts +418 -0
- package/dist/extensions/pi-subagents/test/support/foreign-workflow-steer-host.mjs +13 -0
- package/dist/extensions/pi-subagents/test/support/mock-pi.ts +30 -76
- package/dist/extensions/pi-subagents/test/support/notify-diagnostics-fixture.ts +84 -0
- package/dist/extensions/pi-subagents/test/support/result-publication-capacity-preload.mjs +70 -0
- package/dist/extensions/pi-subagents/test/support/runner-child-session-factory.ts +17 -0
- package/dist/extensions/pi-subagents/test/support/single-execution-fixture.ts +390 -0
- package/dist/extensions/pi-subagents/test/unit/acceptance-compaction.test.ts +120 -0
- package/dist/extensions/pi-subagents/test/unit/acceptance.test.ts +24 -3
- package/dist/extensions/pi-subagents/test/unit/advertised-agent-prompt.test.ts +87 -0
- package/dist/extensions/pi-subagents/test/unit/advertised-agent-refresh.test.ts +163 -0
- package/dist/extensions/pi-subagents/test/unit/agent-frontmatter.test.ts +70 -31
- package/dist/extensions/pi-subagents/test/unit/agent-management.test.ts +78 -3
- package/dist/extensions/pi-subagents/test/unit/agent-overrides.test.ts +2 -8
- package/dist/extensions/pi-subagents/test/unit/async-execution.test.ts +1 -1
- package/dist/extensions/pi-subagents/test/unit/async-interrupt-action.test.ts +73 -66
- package/dist/extensions/pi-subagents/test/unit/async-recovery-descriptor.test.ts +51 -1
- package/dist/extensions/pi-subagents/test/unit/async-retention.test.ts +49 -1
- package/dist/extensions/pi-subagents/test/unit/async-spawn-preload.test.ts +103 -0
- package/dist/extensions/pi-subagents/test/unit/async-status-projection.test.ts +3 -3
- package/dist/extensions/pi-subagents/test/unit/capability-ceiling-agent-allowlist.test.ts +9 -8
- package/dist/extensions/pi-subagents/test/unit/capability-ceiling.test.ts +10 -7
- package/dist/extensions/pi-subagents/test/unit/chain-root-attachment.test.ts +48 -6
- package/dist/extensions/pi-subagents/test/unit/child-runtime-config.test.ts +90 -0
- package/dist/extensions/pi-subagents/test/unit/{pi-args-permission-system.test.ts → child-tool-plan-permission-system.test.ts} +48 -86
- package/dist/extensions/pi-subagents/test/unit/child-tool-plan.test.ts +33 -0
- package/dist/extensions/pi-subagents/test/unit/compaction-resume.test.ts +18 -18
- package/dist/extensions/pi-subagents/test/unit/completion-evidence.test.ts +9 -9
- package/dist/extensions/pi-subagents/test/unit/completion-guard.test.ts +8 -7
- package/dist/extensions/pi-subagents/test/unit/control-channel.test.ts +225 -65
- package/dist/extensions/pi-subagents/test/unit/extension-bindings.test.ts +17 -22
- package/dist/extensions/pi-subagents/test/unit/fleet-status.test.ts +11 -1
- package/dist/extensions/pi-subagents/test/unit/fleet.test.ts +47 -3
- package/dist/extensions/pi-subagents/test/unit/foreign-workflow-steering.test.ts +74 -0
- package/dist/extensions/pi-subagents/test/unit/fork-cache-key.test.ts +23 -29
- package/dist/extensions/pi-subagents/test/unit/host-peer-runtime-imports.test.ts +96 -4
- package/dist/extensions/pi-subagents/test/unit/host-step-status.test.ts +4 -4
- package/dist/extensions/pi-subagents/test/unit/index-child-registration.test.ts +116 -55
- package/dist/extensions/pi-subagents/test/unit/index-segment.test.ts +58 -1
- package/dist/extensions/pi-subagents/test/unit/llm-intent-arbiter.test.ts +104 -3
- package/dist/extensions/pi-subagents/test/unit/mission-lifecycle.test.ts +10 -1
- package/dist/extensions/pi-subagents/test/unit/mission-store.test.ts +31 -1
- package/dist/extensions/pi-subagents/test/unit/model-exclusions.test.ts +102 -51
- package/dist/extensions/pi-subagents/test/unit/model-fallback.test.ts +196 -6
- package/dist/extensions/pi-subagents/test/unit/native-supervisor-channel.test.ts +181 -38
- package/dist/extensions/pi-subagents/test/unit/nested-control.test.ts +62 -70
- package/dist/extensions/pi-subagents/test/unit/nested-events.test.ts +58 -53
- package/dist/extensions/pi-subagents/test/unit/notify-diagnostics.test.ts +42 -0
- package/dist/extensions/pi-subagents/test/unit/notify.test.ts +84 -0
- package/dist/extensions/pi-subagents/test/unit/orca-progress-tabs.test.ts +13 -5
- package/dist/extensions/pi-subagents/test/unit/package-manifest.test.ts +21 -5
- package/dist/extensions/pi-subagents/test/unit/parallel-handoff.test.ts +5 -4
- package/dist/extensions/pi-subagents/test/unit/permissions.test.ts +2 -6
- package/dist/extensions/pi-subagents/test/unit/pi-coding-agent-dir.test.ts +28 -2
- package/dist/extensions/pi-subagents/test/unit/pi-web-session-liveness.test.ts +209 -0
- package/dist/extensions/pi-subagents/test/unit/preflight.test.ts +38 -1
- package/dist/extensions/pi-subagents/test/unit/prompt-audit-optional-peers.test.ts +43 -0
- package/dist/extensions/pi-subagents/test/unit/public-execution.test.ts +24 -2
- package/dist/extensions/pi-subagents/test/unit/readonly-drain-observation.test.ts +174 -0
- package/dist/extensions/pi-subagents/test/unit/readonly-model-continuation.test.ts +94 -0
- package/dist/extensions/pi-subagents/test/unit/readonly-session-evidence.test.ts +1329 -0
- package/dist/extensions/pi-subagents/test/unit/recursion-guard.test.ts +29 -80
- package/dist/extensions/pi-subagents/test/unit/render-helpers.test.ts +11 -8
- package/dist/extensions/pi-subagents/test/unit/result-files.test.ts +2 -2
- package/dist/extensions/pi-subagents/test/unit/retained-nested-route-tracker.test.ts +175 -0
- package/dist/extensions/pi-subagents/test/unit/rpc.test.ts +38 -12
- package/dist/extensions/pi-subagents/test/unit/run-fanout-budget.test.ts +2 -5
- package/dist/extensions/pi-subagents/test/unit/run-status.test.ts +89 -1
- package/dist/extensions/pi-subagents/test/unit/runtime-acknowledged-extensions.test.ts +2 -16
- package/dist/extensions/pi-subagents/test/unit/scheduled-runs.test.ts +27 -3
- package/dist/extensions/pi-subagents/test/unit/scheduled-supervisor-demand.test.ts +215 -0
- package/dist/extensions/pi-subagents/test/unit/schemas.test.ts +15 -11
- package/dist/extensions/pi-subagents/test/unit/scripted-workflow.test.ts +237 -1
- package/dist/extensions/pi-subagents/test/unit/steering-action.test.ts +2 -5
- package/dist/extensions/pi-subagents/test/unit/streamed-progress-bounds.test.ts +2 -2
- package/dist/extensions/pi-subagents/test/unit/subagent-guide.test.ts +14 -1
- package/dist/extensions/pi-subagents/test/unit/subagent-prompt-runtime.test.ts +130 -739
- package/dist/extensions/pi-subagents/test/unit/supervisor-ask-registration.test.ts +682 -0
- package/dist/extensions/pi-subagents/test/unit/supervisor-ui.test.ts +137 -0
- package/dist/extensions/pi-subagents/test/unit/tool-budget.test.ts +1 -11
- package/dist/extensions/pi-subagents/test/unit/tool-description.test.ts +23 -3
- package/dist/extensions/pi-subagents/test/unit/wait-completions.test.ts +8 -1
- package/dist/extensions/pi-subagents/test/unit/watchdog-tool-actions.test.ts +19 -1
- package/dist/extensions/pi-subagents/test/unit/workflow-chat-progress.test.ts +72 -4
- package/dist/extensions/pi-subagents/test/unit/workflow-checklist.test.ts +17 -3
- package/dist/extensions/pi-subagents/test/unit/workflow-child-summary.test.ts +34 -0
- package/dist/extensions/pi-subagents/test/unit/workflow-detach-reconcile.test.ts +12 -2
- package/dist/extensions/pi-subagents/test/unit/workflow-launch-params.test.ts +46 -6
- package/dist/extensions/pi-subagents/test/unit/workflow-receipt.test.ts +3 -3
- package/dist/extensions/pi-subagents/test/unit/workflow-resources.test.ts +133 -1
- package/dist/extensions/pi-subagents/test/unit/workflow-resume-hint.test.ts +53 -2
- package/dist/extensions/pi-subagents/test/unit/worktree-cleanup-plan.test.ts +222 -14
- package/dist/extensions/pi-subagents/test/unit/worktree.test.ts +526 -85
- package/dist/extensions/pi-web-agent/src/backends/config.ts +1 -0
- package/dist/extensions/pi-web-agent/src/backends/settings-reader.ts +5 -3
- package/dist/extensions/pi-web-agent/src/search/tokenin.ts +7 -3
- package/dist/extensions/pi-web-agent/src/types.ts +1 -1
- package/dist/extensions/pi-zentui/README.md +17 -0
- package/dist/extensions/pi-zentui/assets/screenshots/footer-status-hyperlink.png +0 -0
- package/dist/extensions/pi-zentui/docs/configuration.md +71 -2
- package/dist/extensions/pi-zentui/extensions/zentui/config.ts +11 -0
- package/dist/extensions/pi-zentui/extensions/zentui/editor-transfer.ts +14 -0
- package/dist/extensions/pi-zentui/extensions/zentui/extension-status.ts +29 -13
- package/dist/extensions/pi-zentui/extensions/zentui/footer-layout.ts +5 -4
- package/dist/extensions/pi-zentui/extensions/zentui/footer-text.ts +11 -0
- package/dist/extensions/pi-zentui/extensions/zentui/footer.ts +11 -10
- package/dist/extensions/pi-zentui/extensions/zentui/index.ts +77 -3
- package/dist/extensions/pi-zentui/extensions/zentui/presets.ts +77 -0
- package/dist/extensions/pi-zentui/extensions/zentui/settings-command.ts +103 -2
- package/dist/extensions/pi-zentui/extensions/zentui/working-line-extension-segments.ts +115 -0
- package/dist/extensions/pi-zentui/extensions/zentui/working-line.ts +87 -5
- package/dist/extensions/pi-zentui/package-lock.json +277 -517
- package/dist/extensions/pi-zentui/package.json +7 -4
- package/dist/extensions/pi-zentui/test/config-presets.test.ts +238 -0
- package/dist/extensions/pi-zentui/test/editor-transfer.test.ts +24 -1
- package/dist/extensions/pi-zentui/test/extension-compliance.test.ts +570 -2
- package/dist/extensions/pi-zentui/test/extension-status.test.ts +90 -0
- package/dist/extensions/pi-zentui/test/footer-hyperlink.test.ts +243 -0
- package/dist/extensions/pi-zentui/test/package-contents.mjs +1 -0
- package/dist/extensions/pi-zentui/test/presets.test.ts +121 -0
- package/dist/extensions/pi-zentui/test/settings-command.test.ts +205 -1
- package/dist/extensions/pi-zentui/test/working-line-extension-segments.test.ts +139 -0
- package/dist/extensions/pi-zentui/test/working-line-lifecycle.integration.test.ts +237 -3
- package/dist/extensions/pi-zentui/test/working-line.test.ts +94 -2
- package/dist/index.d.ts +1 -1
- package/dist/main.js +4 -1
- package/dist/modes/interactive/chat-viewport.d.ts +19 -0
- package/dist/modes/interactive/chat-viewport.js +27 -0
- package/dist/modes/interactive/components/assistant-message.d.ts +6 -2
- package/dist/modes/interactive/components/assistant-message.js +30 -13
- package/dist/modes/interactive/components/custom-editor.d.ts +10 -1
- package/dist/modes/interactive/components/custom-editor.js +39 -1
- package/dist/modes/interactive/components/first-time-setup.js +1 -1
- package/dist/modes/interactive/components/index.d.ts +1 -1
- package/dist/modes/interactive/components/markdown-transform.d.ts +2 -0
- package/dist/modes/interactive/components/markdown-transform.js +18 -0
- package/dist/modes/interactive/components/model-selector.js +19 -17
- package/dist/modes/interactive/components/scoped-models-selector.js +21 -23
- package/dist/modes/interactive/components/settings-selector.d.ts +7 -1
- package/dist/modes/interactive/components/settings-selector.js +128 -20
- package/dist/modes/interactive/components/settings-submenu.d.ts +71 -0
- package/dist/modes/interactive/components/settings-submenu.js +164 -0
- package/dist/modes/interactive/components/status-indicator.d.ts +3 -1
- package/dist/modes/interactive/components/status-indicator.js +10 -3
- package/dist/modes/interactive/components/thinking-selector.d.ts +15 -3
- package/dist/modes/interactive/components/thinking-selector.js +75 -18
- package/dist/modes/interactive/components/tool-execution.d.ts +21 -4
- package/dist/modes/interactive/components/tool-execution.js +35 -33
- package/dist/modes/interactive/components/trust-selector.js +2 -2
- package/dist/modes/interactive/interactive-mode.d.ts +13 -15
- package/dist/modes/interactive/interactive-mode.js +144 -80
- package/dist/modes/interactive/session-share.d.ts +15 -0
- package/dist/modes/interactive/session-share.js +183 -0
- package/dist/modes/interactive/theme/dark.json +2 -1
- package/dist/modes/interactive/theme/light.json +2 -1
- package/dist/modes/interactive/theme/theme-controller.d.ts +1 -0
- package/dist/modes/interactive/theme/theme-controller.js +5 -0
- package/dist/modes/interactive/theme/theme-json.d.ts +83 -0
- package/dist/modes/interactive/theme/theme-json.js +129 -0
- package/dist/modes/interactive/theme/theme-schema.json +9 -1
- package/dist/modes/interactive/theme/theme.d.ts +14 -5
- package/dist/modes/interactive/theme/theme.js +18 -119
- package/dist/modes/interactive/tui-renderer.d.ts +20 -0
- package/dist/modes/interactive/tui-renderer.js +65 -0
- package/dist/utils/exif-orientation.js +2 -3
- package/dist/utils/management-http.d.ts +24 -0
- package/dist/utils/management-http.js +53 -0
- package/dist/utils/text.d.ts +7 -0
- package/dist/utils/text.js +8 -0
- package/dist/utils/tools-manager.d.ts +1 -0
- package/dist/utils/tools-manager.js +43 -21
- package/docs/docs.json +0 -4
- package/package.json +4 -4
- package/dist/extensions/pi-subagents/src/runs/shared/child-protocol.ts +0 -415
- package/dist/extensions/pi-subagents/src/runs/shared/pi-args.ts +0 -1059
- package/dist/extensions/pi-subagents/src/runs/shared/subagent-startup-retry.ts +0 -116
- package/dist/extensions/pi-subagents/src/shared/post-exit-stdio-guard.ts +0 -85
- package/dist/extensions/pi-subagents/test/e2e/real-session-subagent.test.ts +0 -224
- package/dist/extensions/pi-subagents/test/integration/async-execution.test.ts +0 -6986
- package/dist/extensions/pi-subagents/test/support/mock-pi-script.mjs +0 -447
- package/dist/extensions/pi-subagents/test/support/real-session-child-cli.mjs +0 -185
- package/dist/extensions/pi-subagents/test/support/real-session-runner.ts +0 -311
- package/dist/extensions/pi-subagents/test/unit/capability-ceiling-pi-args.test.ts +0 -84
- package/dist/extensions/pi-subagents/test/unit/child-protocol.test.ts +0 -202
- package/dist/extensions/pi-subagents/test/unit/close-grace-timer.test.ts +0 -101
- package/dist/extensions/pi-subagents/test/unit/pi-args.test.ts +0 -2347
- package/dist/extensions/pi-subagents/test/unit/subagent-startup-retry.test.ts +0 -104
- package/dist/extensions/pi-subagents/test/unit/windows-hide-spawn.test.ts +0 -49
- package/dist/skills/imagegen-frontend-mobile/SKILL.md +0 -1465
- package/dist/skills/imagegen-frontend-web/SKILL.md +0 -987
- package/dist/skills/implanger/SKILL.md +0 -70
- package/dist/skills/output/SKILL.md +0 -49
- package/dist/skills/planger/SKILL.md +0 -167
- package/dist/skills/workflow/SKILL.md +0 -95
- package/docs/workflows.md +0 -18
- /package/dist/bun/{register-bedrock.d.ts → runtime-setup.d.ts} +0 -0
|
@@ -14,13 +14,14 @@ import { appendAgentRefinementOverlay } from "../../agents/agent-refinements.ts"
|
|
|
14
14
|
import { createAtomicJsonWriter, writePrivateAtomicJson } from "../../shared/atomic-json.ts";
|
|
15
15
|
import { currentCompletionOwnerId } from "../../shared/completion-owner.ts";
|
|
16
16
|
import { planChildLaunch, resolveStepBehavior, suppressProgressForReadOnlyTask, type ResolvedStepBehavior } from "../shared/child-launch-plan.ts";
|
|
17
|
-
import { applyThinkingSuffix, projectLaunchResolvedChildExtensions, resolvePiLaunchToolPlan } from "../shared/
|
|
17
|
+
import { applyThinkingSuffix, projectLaunchResolvedChildExtensions, resolvePiLaunchToolPlan } from "../shared/child-tool-plan.ts";
|
|
18
18
|
import { injectOutputPathSystemPrompt, injectSingleOutputInstruction, normalizeSingleOutputOverride, resolveSingleOutputPath, validateFileOnlyOutputMode } from "../shared/single-output.ts";
|
|
19
19
|
import { applyWatchdogLaunchRules, sendRuleViolationWarning } from "../../watchdog/rules.ts";
|
|
20
20
|
import { buildChainInstructions, isDynamicParallelStep, isParallelStep, resolveExistingReadInstructionPaths, resolveExistingReadPaths, writeInitialProgressFile, type ChainStep, type SequentialStep, type StepOverrides } from "../../shared/settings.ts";
|
|
21
21
|
import type { RunnerStep } from "../shared/parallel-utils.ts";
|
|
22
22
|
import type { ContextMode } from "../shared/context-mode.ts";
|
|
23
|
-
import { resolveInstalledPiPackageRoot, resolvePiPackageRoot } from "../shared/pi-spawn.ts";
|
|
23
|
+
import { SELESAI_CODING_AGENT_PACKAGE, resolveInstalledPiPackageRoot, resolvePiPackageRoot } from "../shared/pi-spawn.ts";
|
|
24
|
+
import { JITI_ALIAS_ENV, resolveHostPeerAliases } from "./runner-aliases.ts";
|
|
24
25
|
import { backgroundProcessOptions } from "../shared/background-process-options.ts";
|
|
25
26
|
import { preflightLaunchCwd } from "../shared/launch-cwd.ts";
|
|
26
27
|
import { resolveNodeExecutable } from "../../shared/node-executable.ts";
|
|
@@ -31,7 +32,7 @@ import { buildModelCandidates, resolveEffectiveSubagentModel, resolveModelOrigin
|
|
|
31
32
|
import { resolveToolTimeoutMs, toolTimeoutFromEnv } from "../shared/tool-timeout.ts";
|
|
32
33
|
import { resolveModelScopesForAgent, type ModelScopeConfig } from "../shared/model-scope.ts";
|
|
33
34
|
import { findModelInfo, resolveEffectiveThinking } from "../../shared/model-info.ts";
|
|
34
|
-
import { assertThinkingWithinCeiling,
|
|
35
|
+
import { assertThinkingWithinCeiling, intersectThinkingCeilings, type ThinkingLevel } from "../../shared/thinking-ceiling.ts";
|
|
35
36
|
import { resolveExpectedWorktreeAgentCwd, resolveWorktreeProvider, shouldDeferWorktreeCwd, WORKTREE_AGENT_CWD_PLACEHOLDER } from "../shared/worktree.ts";
|
|
36
37
|
import { buildWorkflowGraphSnapshot } from "../shared/workflow-graph.ts";
|
|
37
38
|
import { ChainOutputValidationError, validateChainOutputBindings } from "../shared/chain-outputs.ts";
|
|
@@ -65,7 +66,10 @@ import {
|
|
|
65
66
|
getAsyncConfigPath,
|
|
66
67
|
resolveChildMaxSubagentDepth,
|
|
67
68
|
} from "../../shared/types.ts";
|
|
68
|
-
import {
|
|
69
|
+
import { inheritedNestedParentAddressOf, inheritedNestedRouteOf, nestedResultsPath, nestedSummaryFromAsyncStatus, writeNestedEvent } from "../shared/nested-events.ts";
|
|
70
|
+
import type { ChildRuntimeConfig } from "../shared/child-runtime-config.ts";
|
|
71
|
+
import { childSessionFactoryModule } from "../shared/child-session.ts";
|
|
72
|
+
import { inheritedChildRuntime } from "../shared/child-launch.ts";
|
|
69
73
|
import { resultFilePath } from "./result-files.ts";
|
|
70
74
|
import { validateToolBudgetConfig } from "../shared/tool-budget.ts";
|
|
71
75
|
import { usageBudgetState } from "../shared/usage-budget.ts";
|
|
@@ -75,7 +79,7 @@ import { finalizeProcessTerminal, initializeProcessTerminal, readProcessTerminal
|
|
|
75
79
|
import type { ActiveAsyncCapacityHandle } from "./active-async-capacity.ts";
|
|
76
80
|
import { statusStepDescription } from "./chain-append.ts";
|
|
77
81
|
import { SUBAGENT_PROCESS_TERMINAL_EVENT } from "../../shared/types.ts";
|
|
78
|
-
import { assertAgentAllowedByCapabilityCeiling,
|
|
82
|
+
import { assertAgentAllowedByCapabilityCeiling, intersectSubagentCapabilityCeilings, resolveCurrentSubagentCapabilityCeiling, type ResolvedSubagentCapabilityCeiling } from "../shared/capability-ceiling.ts";
|
|
79
83
|
import { agentDefinitionDigest, launchBindingDigest } from "../../shared/launch-contract.ts";
|
|
80
84
|
import { resolvePermissionRules, type PermissionConfig } from "../shared/permissions.ts";
|
|
81
85
|
import { normalizeExtensionBindings, omitExtensionBindingsEnv, type ExtensionBindings } from "../shared/extension-bindings.ts";
|
|
@@ -142,8 +146,11 @@ interface AsyncExecutionContext {
|
|
|
142
146
|
currentModel?: ParentModel;
|
|
143
147
|
/** Optional model-scope enforcement resolved from subagent settings. */
|
|
144
148
|
modelScope?: ModelScopeConfig;
|
|
149
|
+
modelResponseAliases?: Record<string, string[]>;
|
|
145
150
|
/** Whether the parent session has an interactive UI. */
|
|
146
151
|
interactive?: boolean;
|
|
152
|
+
/** The executor's own child runtime when the launch comes from an in-process child. */
|
|
153
|
+
childRuntime?: ChildRuntimeConfig;
|
|
147
154
|
}
|
|
148
155
|
|
|
149
156
|
export const DEFAULT_ASYNC_TIMEOUT_MS = 30 * 60 * 1000;
|
|
@@ -179,6 +186,7 @@ interface AsyncChainParams {
|
|
|
179
186
|
worktreeSetupHook?: string;
|
|
180
187
|
worktreeSetupHookTimeoutMs?: number;
|
|
181
188
|
worktreeBaseDir?: string;
|
|
189
|
+
baseRef?: string;
|
|
182
190
|
worktreeProvider?: import("../../shared/types.ts").WorktreeProvider;
|
|
183
191
|
worktreeBranchPrefix?: string;
|
|
184
192
|
controlConfig?: ResolvedControlConfig;
|
|
@@ -248,6 +256,7 @@ interface AsyncSingleParams {
|
|
|
248
256
|
worktreeSetupHook?: string;
|
|
249
257
|
worktreeSetupHookTimeoutMs?: number;
|
|
250
258
|
worktreeBaseDir?: string;
|
|
259
|
+
baseRef?: string;
|
|
251
260
|
worktreeProvider?: import("../../shared/types.ts").WorktreeProvider;
|
|
252
261
|
worktreeBranchPrefix?: string;
|
|
253
262
|
worktree?: boolean;
|
|
@@ -536,6 +545,13 @@ function spawnRunner(cfg: object, suffix: string, cwd: string, initialStatus: Om
|
|
|
536
545
|
if (!jitiCliPath) {
|
|
537
546
|
return { error: "upstream jiti for TypeScript execution could not be found; ensure package dependencies are installed" };
|
|
538
547
|
}
|
|
548
|
+
if (!piPackageRoot) {
|
|
549
|
+
return { error: `Background children require pi installed as the npm package (${SELESAI_CODING_AGENT_PACKAGE}); a standalone pi binary has no package directory, so the async runner cannot create child sessions. Run this child in the foreground (async: false) or install pi from npm.` };
|
|
550
|
+
}
|
|
551
|
+
const hostPeerAliases = resolveHostPeerAliases(piPackageRoot);
|
|
552
|
+
if (hostPeerAliases.missing.length > 0) {
|
|
553
|
+
return { error: `Background children require pi installed as the npm package (${SELESAI_CODING_AGENT_PACKAGE}) with its dependencies; ${piPackageRoot} does not provide ${hostPeerAliases.missing.join(", ")}, so the async runner cannot create child sessions. A standalone pi binary cannot run background children.` };
|
|
554
|
+
}
|
|
539
555
|
|
|
540
556
|
fs.mkdirSync(TEMP_ROOT_DIR, { recursive: true });
|
|
541
557
|
const cfgPath = getAsyncConfigPath(suffix);
|
|
@@ -571,13 +587,17 @@ function spawnRunner(cfg: object, suffix: string, cwd: string, initialStatus: Om
|
|
|
571
587
|
stdoutFd = fs.openSync(logPaths.stdoutPath, "a");
|
|
572
588
|
stderrFd = fs.openSync(logPaths.stderrPath, "a");
|
|
573
589
|
}
|
|
574
|
-
const
|
|
590
|
+
const preload = hostPeerAliases.supplemental.length > 0
|
|
591
|
+
? ["--import", new URL("../../../runner-server-preload.mjs", import.meta.url).href]
|
|
592
|
+
: [];
|
|
593
|
+
const proc = spawn(nodeCommand, [...preload, jitiCliPath, runner, cfgPath], {
|
|
575
594
|
cwd,
|
|
576
595
|
...backgroundProcessOptions(),
|
|
577
596
|
stdio: ["ignore", stdoutFd ?? "ignore", stderrFd ?? "ignore"],
|
|
578
597
|
env: {
|
|
579
598
|
...omitExtensionBindingsEnv(process.env),
|
|
580
|
-
|
|
599
|
+
[SELESAI_CODING_AGENT_PACKAGE_ROOT_ENV]: piPackageRoot,
|
|
600
|
+
[JITI_ALIAS_ENV]: JSON.stringify(hostPeerAliases.aliases),
|
|
581
601
|
},
|
|
582
602
|
});
|
|
583
603
|
closeFd(stdoutFd);
|
|
@@ -833,7 +853,7 @@ export function buildAsyncRunnerSteps(id: string, params: AsyncRunnerStepBuildPa
|
|
|
833
853
|
if (unsupported.length > 0) throw new AsyncStartValidationError(`Agent '${a.name}' uses runner.type='${externalRunnerType}' and does not support: ${unsupported.join(", ")}.`);
|
|
834
854
|
}
|
|
835
855
|
try {
|
|
836
|
-
assertAgentAllowedByCapabilityCeiling(a.name, intersectSubagentCapabilityCeilings(params.capabilityCeiling,
|
|
856
|
+
assertAgentAllowedByCapabilityCeiling(a.name, intersectSubagentCapabilityCeilings(params.capabilityCeiling, ctx.childRuntime?.capabilityCeiling));
|
|
837
857
|
} catch (error) {
|
|
838
858
|
throw new AsyncStartValidationError(error instanceof Error ? error.message : String(error));
|
|
839
859
|
}
|
|
@@ -913,7 +933,7 @@ export function buildAsyncRunnerSteps(id: string, params: AsyncRunnerStepBuildPa
|
|
|
913
933
|
const thinkingCeiling = externalRunner ? undefined : intersectThinkingCeilings(
|
|
914
934
|
params.thinkingCeiling,
|
|
915
935
|
a.maxThinking,
|
|
916
|
-
|
|
936
|
+
ctx.childRuntime?.thinkingCeiling,
|
|
917
937
|
);
|
|
918
938
|
if (!externalRunner) {
|
|
919
939
|
try {
|
|
@@ -957,7 +977,7 @@ export function buildAsyncRunnerSteps(id: string, params: AsyncRunnerStepBuildPa
|
|
|
957
977
|
model,
|
|
958
978
|
modelCandidates,
|
|
959
979
|
capabilityCeiling: params.capabilityCeiling,
|
|
960
|
-
inheritedCapabilityCeiling:
|
|
980
|
+
inheritedCapabilityCeiling: ctx.childRuntime?.capabilityCeiling,
|
|
961
981
|
agentName: a.name,
|
|
962
982
|
permissionRules,
|
|
963
983
|
runtimeSnapshotHost: ctx.pi,
|
|
@@ -1002,11 +1022,10 @@ export function buildAsyncRunnerSteps(id: string, params: AsyncRunnerStepBuildPa
|
|
|
1002
1022
|
thinking: resolveEffectiveThinking(model, effectiveThinking),
|
|
1003
1023
|
...(thinkingCeiling ? { thinkingCeiling } : {}),
|
|
1004
1024
|
launchResolvedExtensions,
|
|
1005
|
-
...(toolPlan.mcpConfig ? { mcpConfig: toolPlan.mcpConfig } : {}),
|
|
1006
|
-
...(toolPlan.runtimeServerNames ? { runtimeServerNames: toolPlan.runtimeServerNames } : {}),
|
|
1007
1025
|
modelCandidates: externalRunner ? undefined : modelCandidates,
|
|
1008
1026
|
...(primaryModelFromParent ? { skipPrimaryModelVerification: true } : {}),
|
|
1009
1027
|
...(availableModels && availableModels.length > 0 ? { modelVerificationRegistry: availableModels } : {}),
|
|
1028
|
+
...(ctx.modelResponseAliases ? { modelResponseAliases: ctx.modelResponseAliases } : {}),
|
|
1010
1029
|
tools: a.tools,
|
|
1011
1030
|
excludeTools: a.excludeTools,
|
|
1012
1031
|
allowNestedSubagents: a.allowNestedSubagents,
|
|
@@ -1207,6 +1226,7 @@ export function executeAsyncChain(
|
|
|
1207
1226
|
worktreeSetupHook,
|
|
1208
1227
|
worktreeSetupHookTimeoutMs,
|
|
1209
1228
|
worktreeBaseDir,
|
|
1229
|
+
baseRef,
|
|
1210
1230
|
worktreeProvider,
|
|
1211
1231
|
worktreeBranchPrefix,
|
|
1212
1232
|
controlConfig,
|
|
@@ -1224,8 +1244,8 @@ export function executeAsyncChain(
|
|
|
1224
1244
|
});
|
|
1225
1245
|
if (acceptanceErrors.length > 0) return formatAsyncStartError(resultMode, acceptanceErrors.join(" "));
|
|
1226
1246
|
const capabilityCeiling = params.capabilityCeiling ?? resolveCurrentSubagentCapabilityCeiling(ctx.currentSessionId);
|
|
1227
|
-
const inheritedNestedRoute =
|
|
1228
|
-
const nestedAddress = inheritedNestedRoute ?
|
|
1247
|
+
const inheritedNestedRoute = inheritedNestedRouteOf(ctx.childRuntime);
|
|
1248
|
+
const nestedAddress = inheritedNestedRoute ? inheritedNestedParentAddressOf(ctx.childRuntime) : undefined;
|
|
1229
1249
|
const asyncDir = inheritedNestedRoute
|
|
1230
1250
|
? path.join(TEMP_ROOT_DIR, "nested-subagent-runs", inheritedNestedRoute.rootRunId, id)
|
|
1231
1251
|
: path.join(DIRS.async, id);
|
|
@@ -1338,10 +1358,12 @@ export function executeAsyncChain(
|
|
|
1338
1358
|
completionOwnerId: ctx.completionOwnerId ?? currentCompletionOwnerId(),
|
|
1339
1359
|
...(capabilityCeiling ? { capabilityCeiling } : {}),
|
|
1340
1360
|
piPackageRoot,
|
|
1341
|
-
|
|
1361
|
+
childSessionFactoryModule: childSessionFactoryModule(),
|
|
1362
|
+
inheritedChildRuntime: inheritedChildRuntime(ctx.childRuntime),
|
|
1342
1363
|
worktreeSetupHook,
|
|
1343
1364
|
worktreeSetupHookTimeoutMs,
|
|
1344
1365
|
worktreeBaseDir,
|
|
1366
|
+
baseRef,
|
|
1345
1367
|
worktreeProvider,
|
|
1346
1368
|
worktreeBranchPrefix,
|
|
1347
1369
|
controlConfig,
|
|
@@ -1454,7 +1476,7 @@ export function executeAsyncChain(
|
|
|
1454
1476
|
path: nestedAddress.path,
|
|
1455
1477
|
asyncDir,
|
|
1456
1478
|
pid: spawnResult.pid,
|
|
1457
|
-
ownerIntercomTarget:
|
|
1479
|
+
ownerIntercomTarget: ctx.childRuntime?.intercomSessionName,
|
|
1458
1480
|
leafIntercomTarget: childIntercomTargets?.[0],
|
|
1459
1481
|
intercomTarget: childIntercomTargets?.[0],
|
|
1460
1482
|
ownerState: "live",
|
|
@@ -1541,6 +1563,7 @@ export function executeAsyncSingle(
|
|
|
1541
1563
|
worktreeSetupHook,
|
|
1542
1564
|
worktreeSetupHookTimeoutMs,
|
|
1543
1565
|
worktreeBaseDir,
|
|
1566
|
+
baseRef,
|
|
1544
1567
|
worktreeProvider,
|
|
1545
1568
|
worktreeBranchPrefix,
|
|
1546
1569
|
controlConfig,
|
|
@@ -1581,7 +1604,7 @@ export function executeAsyncSingle(
|
|
|
1581
1604
|
if (extensionBindings !== undefined) unsupported.push("extension bindings");
|
|
1582
1605
|
if (unsupported.length > 0) return formatAsyncStartError("single", `Agent '${agentConfig.name}' uses runner.type='${externalRunnerType}' and does not support: ${unsupported.join(", ")}.`);
|
|
1583
1606
|
}
|
|
1584
|
-
const capabilityCeiling = intersectSubagentCapabilityCeilings(params.capabilityCeiling ?? resolveCurrentSubagentCapabilityCeiling(ctx.currentSessionId),
|
|
1607
|
+
const capabilityCeiling = intersectSubagentCapabilityCeilings(params.capabilityCeiling ?? resolveCurrentSubagentCapabilityCeiling(ctx.currentSessionId), ctx.childRuntime?.capabilityCeiling);
|
|
1585
1608
|
try {
|
|
1586
1609
|
assertAgentAllowedByCapabilityCeiling(agentConfig.name, capabilityCeiling);
|
|
1587
1610
|
} catch (error) {
|
|
@@ -1624,8 +1647,8 @@ export function executeAsyncSingle(
|
|
|
1624
1647
|
}
|
|
1625
1648
|
systemPrompt = appendAgentRefinementOverlay(systemPrompt, { cwd: runnerCwd, agentName: agentConfig.name });
|
|
1626
1649
|
|
|
1627
|
-
const inheritedNestedRoute =
|
|
1628
|
-
const nestedAddress = inheritedNestedRoute ?
|
|
1650
|
+
const inheritedNestedRoute = inheritedNestedRouteOf(ctx.childRuntime);
|
|
1651
|
+
const nestedAddress = inheritedNestedRoute ? inheritedNestedParentAddressOf(ctx.childRuntime) : undefined;
|
|
1629
1652
|
const asyncDir = inheritedNestedRoute
|
|
1630
1653
|
? path.join(TEMP_ROOT_DIR, "nested-subagent-runs", inheritedNestedRoute.rootRunId, id)
|
|
1631
1654
|
: path.join(DIRS.async, id);
|
|
@@ -1690,7 +1713,7 @@ export function executeAsyncSingle(
|
|
|
1690
1713
|
const thinkingCeiling = externalRunner ? undefined : intersectThinkingCeilings(
|
|
1691
1714
|
params.thinkingCeiling,
|
|
1692
1715
|
agentConfig.maxThinking,
|
|
1693
|
-
|
|
1716
|
+
ctx.childRuntime?.thinkingCeiling,
|
|
1694
1717
|
);
|
|
1695
1718
|
if (!externalRunner) {
|
|
1696
1719
|
try {
|
|
@@ -1750,7 +1773,7 @@ export function executeAsyncSingle(
|
|
|
1750
1773
|
model,
|
|
1751
1774
|
modelCandidates,
|
|
1752
1775
|
capabilityCeiling,
|
|
1753
|
-
inheritedCapabilityCeiling:
|
|
1776
|
+
inheritedCapabilityCeiling: ctx.childRuntime?.capabilityCeiling,
|
|
1754
1777
|
agentName: agentConfig.name,
|
|
1755
1778
|
permissionRules: resolvePermissionRules(ctx.permissions, agentConfig.permissions),
|
|
1756
1779
|
runtimeSnapshotHost: ctx.pi,
|
|
@@ -1804,6 +1827,7 @@ export function executeAsyncSingle(
|
|
|
1804
1827
|
});
|
|
1805
1828
|
const recoveryAgentConfig = params.recoveryAgentConfig ?? agentConfig;
|
|
1806
1829
|
const recoveryDescriptor: SteeringRecoveryDescriptor = {
|
|
1830
|
+
...(ctx.modelResponseAliases ? { modelResponseAliases: ctx.modelResponseAliases } : {}),
|
|
1807
1831
|
version: 1,
|
|
1808
1832
|
...(lane ? { lane } : {}),
|
|
1809
1833
|
launchContractDigest,
|
|
@@ -1847,6 +1871,7 @@ export function executeAsyncSingle(
|
|
|
1847
1871
|
...(controlConfig ? { controlConfig } : {}),
|
|
1848
1872
|
...(params.context ? { context: params.context } : {}),
|
|
1849
1873
|
...(params.intercomBridge !== undefined ? { intercomBridge: params.intercomBridge } : {}),
|
|
1874
|
+
...(params.baseRef !== undefined ? { baseRef: params.baseRef } : {}),
|
|
1850
1875
|
...(deadlineAt !== undefined ? { absoluteDeadlineAt: deadlineAt } : {}),
|
|
1851
1876
|
...(resolvedToolBudget.budget ? { initialToolBudget: resolvedToolBudget.budget } : {}),
|
|
1852
1877
|
maxSubagentDepth: resolveChildMaxSubagentDepth(maxSubagentDepth, recoveryAgentConfig.maxSubagentDepth),
|
|
@@ -1891,14 +1916,13 @@ export function executeAsyncSingle(
|
|
|
1891
1916
|
modelCandidates,
|
|
1892
1917
|
...(modelOrigin === "inherited" ? { skipPrimaryModelVerification: true } : {}),
|
|
1893
1918
|
...(availableModels && availableModels.length > 0 ? { modelVerificationRegistry: availableModels } : {}),
|
|
1919
|
+
...(ctx.modelResponseAliases ? { modelResponseAliases: ctx.modelResponseAliases } : {}),
|
|
1894
1920
|
tools: agentConfig.tools,
|
|
1895
1921
|
excludeTools: agentConfig.excludeTools,
|
|
1896
1922
|
allowNestedSubagents: agentConfig.allowNestedSubagents,
|
|
1897
1923
|
extensions: agentConfig.extensions,
|
|
1898
1924
|
subagentOnlyExtensions: agentConfig.subagentOnlyExtensions,
|
|
1899
1925
|
mcpDirectTools: agentConfig.mcpDirectTools,
|
|
1900
|
-
...(toolPlan.mcpConfig ? { mcpConfig: toolPlan.mcpConfig } : {}),
|
|
1901
|
-
...(toolPlan.runtimeServerNames ? { runtimeServerNames: toolPlan.runtimeServerNames } : {}),
|
|
1902
1926
|
mutationTools: agentConfig.mutationTools,
|
|
1903
1927
|
completionGuard: agentConfig.completionGuard,
|
|
1904
1928
|
systemPrompt,
|
|
@@ -1944,10 +1968,12 @@ export function executeAsyncSingle(
|
|
|
1944
1968
|
completionOwnerId: ctx.completionOwnerId ?? currentCompletionOwnerId(),
|
|
1945
1969
|
...(capabilityCeiling ? { capabilityCeiling } : {}),
|
|
1946
1970
|
piPackageRoot,
|
|
1947
|
-
|
|
1971
|
+
childSessionFactoryModule: childSessionFactoryModule(),
|
|
1972
|
+
inheritedChildRuntime: inheritedChildRuntime(ctx.childRuntime),
|
|
1948
1973
|
worktreeSetupHook,
|
|
1949
1974
|
worktreeSetupHookTimeoutMs,
|
|
1950
1975
|
worktreeBaseDir,
|
|
1976
|
+
baseRef,
|
|
1951
1977
|
worktreeProvider,
|
|
1952
1978
|
worktreeBranchPrefix,
|
|
1953
1979
|
controlConfig,
|
|
@@ -2030,7 +2056,7 @@ export function executeAsyncSingle(
|
|
|
2030
2056
|
path: nestedAddress.path,
|
|
2031
2057
|
asyncDir,
|
|
2032
2058
|
pid: spawnResult.pid,
|
|
2033
|
-
ownerIntercomTarget:
|
|
2059
|
+
ownerIntercomTarget: ctx.childRuntime?.intercomSessionName,
|
|
2034
2060
|
leafIntercomTarget: childIntercomTarget?.(agent, 0),
|
|
2035
2061
|
intercomTarget: childIntercomTarget?.(agent, 0),
|
|
2036
2062
|
ownerState: "live",
|
|
@@ -26,6 +26,7 @@ import { EXTERNAL_JOB_BRIDGE_REQUEST_DIR, serviceExternalJobBridgeRequests } fro
|
|
|
26
26
|
import { shouldUseNativeFsWatch } from "../../shared/watch-strategy.ts";
|
|
27
27
|
import { parseWorkflowChildSummary } from "../../workflows/workflow-child-summary.ts";
|
|
28
28
|
import { validHostStepNodes } from "../shared/host-step-status.ts";
|
|
29
|
+
import { readProcessTerminal } from "./process-terminal.ts";
|
|
29
30
|
import { withCachedUiContext } from "../../shared/extension-context.ts";
|
|
30
31
|
|
|
31
32
|
interface AsyncJobTrackerOptions {
|
|
@@ -39,6 +40,8 @@ interface AsyncJobTrackerOptions {
|
|
|
39
40
|
watch?: typeof fs.watch;
|
|
40
41
|
kill?: (pid: number, signal?: NodeJS.Signals | 0) => boolean;
|
|
41
42
|
now?: () => number;
|
|
43
|
+
/** Resolve native supervisor requests without scanning supervisor mailboxes. */
|
|
44
|
+
supervisorRequestState?: (event: ControlEvent) => "pending" | "resolved" | "unknown";
|
|
42
45
|
}
|
|
43
46
|
|
|
44
47
|
const CONTROL_EVENT_READ_CHUNK_BYTES = 64 * 1024;
|
|
@@ -76,6 +79,9 @@ export function createAsyncJobTracker(pi: Pick<ExtensionAPI, "events">, state: S
|
|
|
76
79
|
let widgetRerenderTimer: ReturnType<typeof setTimeout> | undefined;
|
|
77
80
|
const runningJobIds = new Set<string>();
|
|
78
81
|
const externalJobBridgeRuns = new Set<string>();
|
|
82
|
+
// Early native failure is visible before its publisher finishes. Retain only
|
|
83
|
+
// that scoped observation, using the existing liveness sweep to renew delivery.
|
|
84
|
+
const terminalPublications = new Map<string, { instanceId: string; pending: true } | { pending: false }>();
|
|
79
85
|
const externalJobBridgeEligibility = (steps: AsyncJobState["steps"]): "required" | "not-required" | "unknown" => {
|
|
80
86
|
if (!Array.isArray(steps)) return "unknown";
|
|
81
87
|
for (const step of steps) {
|
|
@@ -293,6 +299,15 @@ export function createAsyncJobTracker(pi: Pick<ExtensionAPI, "events">, state: S
|
|
|
293
299
|
if ((parsed as { type?: unknown }).type !== "subagent.control") return;
|
|
294
300
|
const record = parsed as { event?: ControlEvent; channels?: string[]; childIntercomTarget?: string; noticeText?: string; intercom?: { to?: string; message?: string } };
|
|
295
301
|
if (!record.event || !Array.isArray(record.channels)) return;
|
|
302
|
+
if (record.event.type === "needs_attention" && record.event.reason === "supervisor_request" && options.supervisorRequestState) {
|
|
303
|
+
let requestState: "pending" | "resolved" | "unknown" = "unknown";
|
|
304
|
+
try {
|
|
305
|
+
requestState = options.supervisorRequestState(record.event);
|
|
306
|
+
} catch (error) {
|
|
307
|
+
console.error(`Failed to resolve supervisor request state for async control event in '${job.asyncDir}':`, error);
|
|
308
|
+
}
|
|
309
|
+
if (requestState === "resolved") return;
|
|
310
|
+
}
|
|
296
311
|
const payload = {
|
|
297
312
|
event: record.event,
|
|
298
313
|
source: "async" as const,
|
|
@@ -369,6 +384,7 @@ export function createAsyncJobTracker(pi: Pick<ExtensionAPI, "events">, state: S
|
|
|
369
384
|
refreshTimers.delete(asyncId);
|
|
370
385
|
runningJobIds.delete(asyncId);
|
|
371
386
|
externalJobBridgeRuns.delete(asyncId);
|
|
387
|
+
terminalPublications.delete(asyncId);
|
|
372
388
|
};
|
|
373
389
|
|
|
374
390
|
const refreshJob = (job: AsyncJobState): boolean => {
|
|
@@ -429,6 +445,7 @@ export function createAsyncJobTracker(pi: Pick<ExtensionAPI, "events">, state: S
|
|
|
429
445
|
if (status) {
|
|
430
446
|
const previousStatus = job.status;
|
|
431
447
|
job.status = status.state;
|
|
448
|
+
if (!terminalStatus(job.status)) terminalPublications.delete(job.asyncId);
|
|
432
449
|
if (job.status === "running") runningJobIds.add(job.asyncId);
|
|
433
450
|
else runningJobIds.delete(job.asyncId);
|
|
434
451
|
if (job.status !== "complete" && job.status !== "failed" && job.status !== "paused" && job.status !== "stopped") cancelCleanup(job.asyncId);
|
|
@@ -486,9 +503,30 @@ export function createAsyncJobTracker(pi: Pick<ExtensionAPI, "events">, state: S
|
|
|
486
503
|
job.wrapUpRequested = status.wrapUpRequested ?? job.wrapUpRequested;
|
|
487
504
|
job.sessionFile = status.sessionFile ?? job.sessionFile;
|
|
488
505
|
if (terminalStatus(job.status)) {
|
|
489
|
-
|
|
506
|
+
let publication = terminalPublications.get(job.asyncId);
|
|
507
|
+
if (!publication && status.mode !== "workflow" && status.processTerminal?.state === "pending"
|
|
508
|
+
&& status.runId === job.asyncId && status.sessionId === state.currentSessionId
|
|
509
|
+
&& status.completionOwnerId && status.completionOwnerId === state.completionOwnerId) {
|
|
510
|
+
publication = { instanceId: status.processTerminal.runnerProcessInstanceId, pending: true };
|
|
511
|
+
terminalPublications.set(job.asyncId, publication);
|
|
512
|
+
}
|
|
513
|
+
const wasPending = publication?.pending;
|
|
514
|
+
if (publication?.pending) {
|
|
515
|
+
// Reconciliation resolves pending as well as public payloads. The
|
|
516
|
+
// watcher already discovers exact tracked run IDs without promotion.
|
|
517
|
+
const published = reconciliation.resultPath && fs.existsSync(reconciliation.resultPath);
|
|
518
|
+
const closed = !published && readProcessTerminal(job.asyncDir, {
|
|
519
|
+
runId: job.asyncId, runnerProcessInstanceId: publication.instanceId,
|
|
520
|
+
})?.state === "observed";
|
|
521
|
+
if (published || closed) {
|
|
522
|
+
publication = { pending: false };
|
|
523
|
+
terminalPublications.set(job.asyncId, publication);
|
|
524
|
+
} else cancelCleanup(job.asyncId);
|
|
525
|
+
}
|
|
526
|
+
// Scan on close too: publication may have raced the payload check.
|
|
527
|
+
if (!terminalStatus(previousStatus) || (wasPending && !publication?.pending)) options.onJobTerminal?.();
|
|
490
528
|
rememberFleetJob(state, job);
|
|
491
|
-
if (!nestedRefreshFailed && !hasLiveNestedDescendants(job.nestedChildren) && (previousStatus !== job.status || !state.cleanupTimers.has(job.asyncId))) {
|
|
529
|
+
if (!publication?.pending && !nestedRefreshFailed && !hasLiveNestedDescendants(job.nestedChildren) && (previousStatus !== job.status || !state.cleanupTimers.has(job.asyncId))) {
|
|
492
530
|
scheduleCleanup(job.asyncId);
|
|
493
531
|
}
|
|
494
532
|
}
|
|
@@ -515,7 +553,7 @@ export function createAsyncJobTracker(pi: Pick<ExtensionAPI, "events">, state: S
|
|
|
515
553
|
}
|
|
516
554
|
runningJobIds.delete(job.asyncId);
|
|
517
555
|
rememberFleetJob(state, job);
|
|
518
|
-
if (!hasLiveNestedDescendants(job.nestedChildren) && !state.cleanupTimers.has(job.asyncId)) scheduleCleanup(job.asyncId);
|
|
556
|
+
if (!terminalPublications.get(job.asyncId)?.pending && !hasLiveNestedDescendants(job.nestedChildren) && !state.cleanupTimers.has(job.asyncId)) scheduleCleanup(job.asyncId);
|
|
519
557
|
}
|
|
520
558
|
return widgetRenderKey(job, widgetExpanded) !== widgetStateBefore;
|
|
521
559
|
};
|
|
@@ -657,6 +695,7 @@ export function createAsyncJobTracker(pi: Pick<ExtensionAPI, "events">, state: S
|
|
|
657
695
|
const sessionRoot = state.liveAsyncSessionRoots?.get(info.id);
|
|
658
696
|
state.liveAsyncSessionRoots?.delete(info.id);
|
|
659
697
|
externalJobBridgeRuns.delete(info.id);
|
|
698
|
+
terminalPublications.delete(info.id);
|
|
660
699
|
state.asyncJobs.set(info.id, {
|
|
661
700
|
asyncId: info.id,
|
|
662
701
|
asyncDir,
|
|
@@ -710,6 +749,9 @@ export function createAsyncJobTracker(pi: Pick<ExtensionAPI, "events">, state: S
|
|
|
710
749
|
job.asyncDir = result.asyncDir;
|
|
711
750
|
watchJob(job);
|
|
712
751
|
}
|
|
752
|
+
// Delivery can precede the first terminal status refresh. Remember its
|
|
753
|
+
// settlement even when no pending publication has been observed yet.
|
|
754
|
+
terminalPublications.set(asyncId, { pending: false });
|
|
713
755
|
try {
|
|
714
756
|
updateAsyncJobNestedProjection(job);
|
|
715
757
|
} catch (error) {
|
|
@@ -734,6 +776,7 @@ export function createAsyncJobTracker(pi: Pick<ExtensionAPI, "events">, state: S
|
|
|
734
776
|
widgetRerenderTimer = undefined;
|
|
735
777
|
runningJobIds.clear();
|
|
736
778
|
externalJobBridgeRuns.clear();
|
|
779
|
+
terminalPublications.clear();
|
|
737
780
|
};
|
|
738
781
|
|
|
739
782
|
const resetJobs = (ctx?: ExtensionContext) => {
|
|
@@ -12,8 +12,10 @@ import { reconcileAsyncRun } from "./stale-run-reconciler.ts";
|
|
|
12
12
|
import { resultFilePath, resultPayloadPathForIndexedRun } from "./result-files.ts";
|
|
13
13
|
import { canScanAsyncRunPrefix, MIN_SAFE_ASYNC_RUN_PREFIX_LENGTH } from "./run-id-query.ts";
|
|
14
14
|
import { parallelHandoffPath, resolveRetainedWorktreeCwd } from "../shared/parallel-handoff.ts";
|
|
15
|
+
import { normalizeWorktreeBaseRef } from "../shared/worktree.ts";
|
|
15
16
|
import { intersectThinkingCeilings, parseThinkingLevel, type ThinkingLevel } from "../../shared/thinking-ceiling.ts";
|
|
16
17
|
import { assertWorkflowGraphHostSteps } from "../shared/host-step-status.ts";
|
|
18
|
+
import { validateModelResponseAliases } from "../../shared/model-response-aliases.ts";
|
|
17
19
|
|
|
18
20
|
export interface AsyncResumeParams {
|
|
19
21
|
id?: string;
|
|
@@ -316,11 +318,11 @@ export function readAsyncRecoveryDescriptor(asyncDir: string | undefined): Steer
|
|
|
316
318
|
if (!value || typeof value !== "object" || Array.isArray(value)) throw new Error(`Invalid async recovery descriptor '${descriptorPath}': expected an object.`);
|
|
317
319
|
const parsed = value as Record<string, unknown>;
|
|
318
320
|
const allowedFields = new Set([
|
|
319
|
-
"version", "launchContractDigest", "sourceRunId", "agentContract", "agent", "sessionFile", "cwd", "model", "modelProvider", "modelOverrideFromParent", "modelOrigin", "fallbackModels", "thinking", "thinkingCeiling", "tools", "allowNestedSubagents", "extensions",
|
|
321
|
+
"modelResponseAliases", "version", "launchContractDigest", "sourceRunId", "agentContract", "agent", "sessionFile", "cwd", "model", "modelProvider", "modelOverrideFromParent", "modelOrigin", "fallbackModels", "thinking", "thinkingCeiling", "tools", "allowNestedSubagents", "extensions",
|
|
320
322
|
"subagentOnlyExtensions", "mcpDirectTools", "excludeTools", "mutationTools", "systemPrompt", "systemPromptMode", "inheritProjectContext", "inheritGlobalContext", "inheritSkills", "skills",
|
|
321
323
|
"skillPath", "agentFilePath", "completionGuard", "memory", "outputPath", "outputMode", "structuredOutputSchema", "acceptance", "sessionDir", "artifactConfig",
|
|
322
324
|
"artifactsDir", "maxOutput", "controlConfig", "context", "intercomBridge", "absoluteDeadlineAt", "initialTurnBudget", "initialToolBudget", "maxSubagentDepth", "share", "capabilityCeiling",
|
|
323
|
-
"launchResolvedExtensions", "runFanoutBudget", "lane",
|
|
325
|
+
"launchResolvedExtensions", "runFanoutBudget", "lane", "baseRef",
|
|
324
326
|
"extensionBindings",
|
|
325
327
|
]);
|
|
326
328
|
for (const field of Object.keys(parsed)) {
|
|
@@ -336,6 +338,7 @@ export function readAsyncRecoveryDescriptor(asyncDir: string | undefined): Steer
|
|
|
336
338
|
} catch (error) {
|
|
337
339
|
throw new Error(`Invalid async recovery descriptor '${descriptorPath}': ${error instanceof Error ? error.message : String(error)}`);
|
|
338
340
|
}
|
|
341
|
+
validateModelResponseAliases(parsed.modelResponseAliases, `async recovery descriptor '${descriptorPath}' modelResponseAliases`);
|
|
339
342
|
if (parsed.capabilityCeiling !== undefined) parsed.capabilityCeiling = parseSubagentCapabilityCeiling(parsed.capabilityCeiling, `async recovery descriptor '${descriptorPath}' capabilityCeiling`);
|
|
340
343
|
if (parsed.thinkingCeiling !== undefined) parsed.thinkingCeiling = parseThinkingLevel(parsed.thinkingCeiling, `async recovery descriptor '${descriptorPath}' thinkingCeiling`);
|
|
341
344
|
if (parsed.extensionBindings !== undefined) parsed.extensionBindings = normalizeExtensionBindings(parsed.extensionBindings)!.value;
|
|
@@ -366,6 +369,14 @@ export function readAsyncRecoveryDescriptor(asyncDir: string | undefined): Steer
|
|
|
366
369
|
for (const field of ["launchContractDigest", "sessionFile", "model", "modelProvider", "thinking", "agentFilePath", "outputPath", "sessionDir", "artifactsDir"] as const) {
|
|
367
370
|
if (parsed[field] !== undefined && (typeof parsed[field] !== "string" || !(parsed[field] as string).trim())) throw new Error(`Invalid async recovery descriptor '${descriptorPath}': ${field} must be a non-empty string.`);
|
|
368
371
|
}
|
|
372
|
+
if (parsed.baseRef !== undefined) {
|
|
373
|
+
if (typeof parsed.baseRef !== "string") throw new Error(`Invalid async recovery descriptor '${descriptorPath}': baseRef must be a string.`);
|
|
374
|
+
try {
|
|
375
|
+
parsed.baseRef = normalizeWorktreeBaseRef(parsed.baseRef);
|
|
376
|
+
} catch (error) {
|
|
377
|
+
throw new Error(`Invalid async recovery descriptor '${descriptorPath}': ${error instanceof Error ? error.message : String(error)}`);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
369
380
|
if (parsed.completionGuard !== undefined && typeof parsed.completionGuard !== "boolean") throw new Error(`Invalid async recovery descriptor '${descriptorPath}': completionGuard must be a boolean.`);
|
|
370
381
|
if (parsed.structuredOutputSchema !== undefined && (!parsed.structuredOutputSchema || typeof parsed.structuredOutputSchema !== "object" || Array.isArray(parsed.structuredOutputSchema))) throw new Error(`Invalid async recovery descriptor '${descriptorPath}': structuredOutputSchema must be an object.`);
|
|
371
382
|
if (parsed.memory !== undefined) {
|
|
@@ -623,7 +634,7 @@ export function buildRevivedAsyncTask(target: AsyncResumeTarget, message: string
|
|
|
623
634
|
`Original agent: ${target.agent}`,
|
|
624
635
|
target.sessionFile ? `Original session file: ${target.sessionFile}` : undefined,
|
|
625
636
|
"",
|
|
626
|
-
"Use the stored session context as background. Answer the orchestrator's follow-up below. Do not assume the original child
|
|
637
|
+
"Use the stored session context as background. Answer the orchestrator's follow-up below. Do not assume the original child session is still running.",
|
|
627
638
|
"",
|
|
628
639
|
"Follow-up:",
|
|
629
640
|
message,
|
|
@@ -320,7 +320,16 @@ function readCursor(root: string): RetentionCursor {
|
|
|
320
320
|
return value?.version === 1 ? value as unknown as RetentionCursor : { version: 1 };
|
|
321
321
|
}
|
|
322
322
|
|
|
323
|
+
let currentProcessStartIdentity: string | undefined | null = null;
|
|
324
|
+
|
|
323
325
|
function processStartIdentity(pid: number): string | undefined {
|
|
326
|
+
// Foreign PIDs can be reused while this process lives, so resolve them afresh.
|
|
327
|
+
if (pid !== process.pid) return computeProcessStartIdentity(pid);
|
|
328
|
+
if (currentProcessStartIdentity === null) currentProcessStartIdentity = computeProcessStartIdentity(pid);
|
|
329
|
+
return currentProcessStartIdentity;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
function computeProcessStartIdentity(pid: number): string | undefined {
|
|
324
333
|
if (process.platform === "linux") {
|
|
325
334
|
try {
|
|
326
335
|
const stat = fs.readFileSync(`/proc/${pid}/stat`).toString("utf8");
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { AsyncJobState, SubagentState } from "../../shared/types.ts";
|
|
2
2
|
import {
|
|
3
|
-
projectAsyncStatusSnapshot,
|
|
3
|
+
projectAsyncStatusSnapshot as buildAsyncStatusSnapshot,
|
|
4
4
|
type AsyncStatusSnapshotOptions,
|
|
5
|
-
type
|
|
5
|
+
type AsyncStatusSnapshot,
|
|
6
6
|
} from "../shared/async-status-projection.ts";
|
|
7
7
|
|
|
8
8
|
export {
|
|
@@ -10,22 +10,20 @@ export {
|
|
|
10
10
|
ASYNC_STATUS_SNAPSHOT_VERSION,
|
|
11
11
|
} from "../shared/async-status-projection.ts";
|
|
12
12
|
export type {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
13
|
+
AsyncStatusSnapshotActivity,
|
|
14
|
+
AsyncStatusSnapshotCaps,
|
|
15
|
+
AsyncStatusSnapshotHostStep,
|
|
16
16
|
AsyncStatusSnapshotKind,
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
AsyncStatusSnapshotNode,
|
|
18
|
+
AsyncStatusSnapshotOmitted,
|
|
19
19
|
AsyncStatusSnapshotOptions,
|
|
20
20
|
AsyncStatusSnapshotState,
|
|
21
|
-
|
|
21
|
+
AsyncStatusSnapshot,
|
|
22
22
|
} from "../shared/async-status-projection.ts";
|
|
23
23
|
|
|
24
24
|
export const ASYNC_STATUS_SNAPSHOT_WIDGET_PREFIX = "SELESAI_SUBAGENT_ASYNC_JSON:";
|
|
25
25
|
|
|
26
|
-
export
|
|
27
|
-
return projectAsyncStatusSnapshot(jobs, options);
|
|
28
|
-
}
|
|
26
|
+
export { buildAsyncStatusSnapshot };
|
|
29
27
|
|
|
30
28
|
export function asyncStatusSnapshotJobsForState(state: SubagentState | undefined, sessionId: string | null | undefined): AsyncJobState[] {
|
|
31
29
|
if (!state || !sessionId || state.currentSessionId !== sessionId) return [];
|
|
@@ -39,7 +37,7 @@ export function asyncStatusSnapshotJobsForState(state: SubagentState | undefined
|
|
|
39
37
|
return [...jobs.values()];
|
|
40
38
|
}
|
|
41
39
|
|
|
42
|
-
export function buildAsyncStatusSnapshotForState(state: SubagentState | undefined, sessionId: string | null | undefined, options: AsyncStatusSnapshotOptions = {}):
|
|
40
|
+
export function buildAsyncStatusSnapshotForState(state: SubagentState | undefined, sessionId: string | null | undefined, options: AsyncStatusSnapshotOptions = {}): AsyncStatusSnapshot {
|
|
43
41
|
return buildAsyncStatusSnapshot(asyncStatusSnapshotJobsForState(state, sessionId), options);
|
|
44
42
|
}
|
|
45
43
|
|