mixdog 1.2.3 → 1.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/scripts/gate-local.mjs +6 -4
- package/scripts/lib/gate-scheduler.mjs +29 -11
- package/scripts/mobile-release.mjs +5 -4
- package/scripts/probe-provider-catalog.mjs +31 -0
- package/scripts/provider-pingpong-live.mjs +128 -38
- package/scripts/session-sweep.mjs +5 -25
- package/src/agents/maintainer/AGENT.md +1 -1
- package/src/agents/maintainer/agent.json +1 -1
- package/src/agents/reviewer/AGENT.md +2 -4
- package/src/agents/security/AGENT.md +1 -2
- package/src/agents/writer/AGENT.md +2 -3
- package/src/defaults/shipped-history.json +7 -1
- package/src/defaults/skills/image/SKILL.md +21 -23
- package/src/lib/keychain-cjs.cjs +13 -11
- package/src/output-styles/common.md +2 -1
- package/src/rules/agent/AGENT.md +7 -5
- package/src/rules/lead/LEAD.md +13 -13
- package/src/rules/shared/45-destructive.md +4 -0
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/preset.mjs +1 -0
- package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +28 -7
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -11
- package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +101 -23
- package/src/runtime/agent/orchestrator/providers/account-pool.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-api-key-fetch.mjs +36 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-error-contract.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +2 -3
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/gzip-post.mjs +26 -44
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +2 -5
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +4 -0
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-catalog.mjs +41 -12
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth.mjs +13 -1
- package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +81 -10
- package/src/runtime/agent/orchestrator/providers/antigravity-retry-policy.mjs +109 -5
- package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +107 -37
- package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +4 -1
- package/src/runtime/agent/orchestrator/providers/cursor-auth.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/cursor-native-context.mjs +48 -0
- package/src/runtime/agent/orchestrator/providers/cursor-wire-exec.mjs +144 -34
- package/src/runtime/agent/orchestrator/providers/cursor-wire-protobuf.mjs +28 -4
- package/src/runtime/agent/orchestrator/providers/cursor-wire-request.mjs +8 -4
- package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-bridge.mjs +41 -11
- package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-messages.mjs +67 -5
- package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +14 -4
- package/src/runtime/agent/orchestrator/providers/cursor.mjs +14 -1
- package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +9 -6
- package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +7 -2
- package/src/runtime/agent/orchestrator/providers/effort-configuration.mjs +26 -4
- package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +12 -6
- package/src/runtime/agent/orchestrator/providers/gemini-error-contract.mjs +14 -6
- package/src/runtime/agent/orchestrator/providers/gemini-request-body.mjs +4 -4
- package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/gemini-rest-stream/watchdogs.mjs +16 -5
- package/src/runtime/agent/orchestrator/providers/gemini-retry-policy.mjs +6 -1
- package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +22 -10
- package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +4 -2
- package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +33 -7
- package/src/runtime/agent/orchestrator/providers/gemini.mjs +11 -2
- package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +9 -2
- package/src/runtime/agent/orchestrator/providers/lib/claude-bridge-schema.mjs +9 -5
- package/src/runtime/agent/orchestrator/providers/lib/request-compression.mjs +86 -0
- package/src/runtime/agent/orchestrator/providers/lib/wire-pairing.mjs +4 -2
- package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +16 -5
- package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/model-proxy-provider.mjs +60 -16
- package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +11 -13
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +30 -19
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +5 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +42 -5
- package/src/runtime/agent/orchestrator/providers/openai-compat-reasoning-field.mjs +13 -9
- package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +1 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-parity.fixtures.mjs +18 -7
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +36 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-retry-profile.mjs +51 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +11 -1
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-request.mjs +64 -52
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/terminal-frames.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/openai-responses-payload.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +1 -4
- package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/tool-calls.mjs +0 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +7 -6
- package/src/runtime/agent/orchestrator/providers/opencode-go-gemini.mjs +13 -2
- package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +4 -1
- package/src/runtime/agent/orchestrator/providers/openrouter.mjs +1 -2
- package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +5 -4
- package/src/runtime/agent/orchestrator/providers/registry.mjs +9 -1
- package/src/runtime/agent/orchestrator/providers/retry-classification.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/wire-gateway.mjs +11 -4
- package/src/runtime/agent/orchestrator/providers/wire-route.mjs +14 -4
- package/src/runtime/agent/orchestrator/providers/xai-tool-search.fixtures.mjs +15 -3
- package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +6 -2
- package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +8 -6
- package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +4 -1
- package/src/runtime/agent/orchestrator/runtime-core/goal-store.mjs +30 -2
- package/src/runtime/agent/orchestrator/runtime-core/goal-turns.mjs +3 -2
- package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +8 -3
- package/src/runtime/agent/orchestrator/runtime-core/skill-tool-loading.mjs +3 -1
- package/src/runtime/agent/orchestrator/runtime-core/tool-bridge-contract.mjs +6 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +10 -10
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +3 -1
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +46 -8
- package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +10 -8
- package/src/runtime/agent/orchestrator/session/agent-loop.mjs +1 -2
- package/src/runtime/agent/orchestrator/session/agent-pool-progress.mjs +24 -0
- package/src/runtime/agent/orchestrator/session/cache/tool-result-reuse.mjs +10 -2
- package/src/runtime/agent/orchestrator/session/catalog-db/index.mjs +2 -3
- package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +3 -11
- package/src/runtime/agent/orchestrator/session/catalog-db/worker.mjs +6 -22
- package/src/runtime/agent/orchestrator/session/compact/messages.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/compact/runner.mjs +16 -2
- package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +28 -0
- package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +0 -6
- package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +0 -6
- package/src/runtime/agent/orchestrator/session/eager-dispatch/admission.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/historical-session-closure.mjs +10 -0
- package/src/runtime/agent/orchestrator/session/loop/assistant-commit.mjs +2 -5
- package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +2 -4
- package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +3 -3
- package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +0 -27
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/output-limit.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/segments.mjs +4 -10
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +2 -9
- package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/loop/request-boundary.mjs +1 -4
- package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +76 -0
- package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +5 -1
- package/src/runtime/agent/orchestrator/session/loop/step-auto-effort.mjs +8 -9
- package/src/runtime/agent/orchestrator/session/loop/tool-classify.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +15 -2
- package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +1 -4
- package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +3 -4
- package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +33 -3
- package/src/runtime/agent/orchestrator/session/manager/ask-support.mjs +0 -4
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +21 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +38 -13
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-failure.mjs +33 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +5 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +19 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +57 -13
- package/src/runtime/agent/orchestrator/session/manager/failed-turn-rewind.mjs +16 -0
- package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +6 -120
- package/src/runtime/agent/orchestrator/session/manager/pending-persist-queue.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +29 -8
- package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +42 -49
- package/src/runtime/agent/orchestrator/session/manager/runtime-state.mjs +50 -0
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +32 -14
- package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +17 -33
- package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +29 -13
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +3 -3
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-recovery.mjs +45 -0
- package/src/runtime/agent/orchestrator/session/manager.mjs +2 -9
- package/src/runtime/agent/orchestrator/session/send-instrumentation.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +5 -2
- package/src/runtime/agent/orchestrator/session/side-question.mjs +12 -7
- package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +5 -12
- package/src/runtime/agent/orchestrator/session/store/lifecycle-read.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/listing.mjs +2 -6
- package/src/runtime/agent/orchestrator/session/store/live-cache-eviction.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/liveness-veto.mjs +46 -37
- package/src/runtime/agent/orchestrator/session/store/load-cache.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/load-session.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +5 -11
- package/src/runtime/agent/orchestrator/session/store/session-paths.mjs +59 -0
- package/src/runtime/agent/orchestrator/session/store/summary-cache.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/sweep/stale-sweep.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-finish.mjs +27 -32
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-plan.mjs +0 -8
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-record.mjs +6 -18
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-row.mjs +33 -106
- package/src/runtime/agent/orchestrator/session/store/write-admission.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store-agent-worker-pool.mjs +5 -8
- package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +160 -212
- package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +50 -116
- package/src/runtime/agent/orchestrator/session/store-summary-locations.mjs +3 -29
- package/src/runtime/agent/orchestrator/session/store-summary-reader-catalog-fixture.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +7 -8
- package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +9 -20
- package/src/runtime/agent/orchestrator/session/store.mjs +3 -16
- package/src/runtime/agent/orchestrator/session/tool-batch/execute-call.mjs +11 -12
- package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +37 -13
- package/src/runtime/agent/orchestrator/session/tool-batch/pre-dispatch.mjs +15 -4
- package/src/runtime/agent/orchestrator/session/tool-schema-rejection.mjs +4 -2
- package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +72 -15
- package/src/runtime/agent/orchestrator/session/turn-failure.mjs +45 -0
- package/src/runtime/agent/orchestrator/stall-policy.mjs +50 -0
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +5 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/inline-hoist.mjs +6 -2
- package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +204 -10
- package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +160 -39
- package/src/runtime/agent/orchestrator/tools/builtin/git-partial-stage.mjs +7 -5
- package/src/runtime/agent/orchestrator/tools/builtin/grep-formatting.mjs +14 -5
- package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-context-expander.mjs +4 -3
- package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-output.mjs +2 -1
- package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-path-fanout.mjs +48 -44
- package/src/runtime/agent/orchestrator/tools/builtin/lib/search-input-helpers.mjs +10 -3
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +200 -17
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-task-output.mjs +5 -4
- package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +6 -1
- package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +20 -0
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +101 -2
- package/src/runtime/agent/orchestrator/tools/code-graph-prewarm-worker.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/lib/owned-shell-trees.mjs +67 -0
- package/src/runtime/agent/orchestrator/tools/lib/process-table-fixture.mjs +50 -0
- package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +303 -63
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promote-job.mjs +2 -0
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +108 -18
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +77 -11
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +81 -5
- package/src/runtime/attachments/store.d.mts +9 -0
- package/src/runtime/attachments/store.mjs +80 -9
- package/src/runtime/browser-bridge/browser-action-contract.d.mts +0 -1
- package/src/runtime/browser-bridge/browser-action-contract.mjs +0 -2
- package/src/runtime/computer-bridge/action-schema.mjs +178 -178
- package/src/runtime/computer-bridge/linux-readiness.d.mts +0 -2
- package/src/runtime/computer-bridge/linux-readiness.mjs +0 -16
- package/src/runtime/effort-judge/judge-client.mjs +21 -4
- package/src/runtime/effort-judge/judge-worker.mjs +4 -1
- package/src/runtime/github/tool.mjs +118 -17
- package/src/runtime/media/adapters/codex-image.mjs +140 -21
- package/src/runtime/media/catalog.mjs +4 -4
- package/src/runtime/media/chatgpt-usage.mjs +55 -0
- package/src/runtime/media/defaults.mjs +37 -0
- package/src/runtime/media/jobs.mjs +12 -2
- package/src/runtime/media/lanes.mjs +12 -0
- package/src/runtime/media/tool-defs.mjs +15 -4
- package/src/runtime/media/tool.mjs +41 -12
- package/src/runtime/media/upstream-error.mjs +72 -6
- package/src/runtime/memory/lib/ingest/transcript-rows.mjs +1 -0
- package/src/runtime/memory/lib/pg/process.mjs +5 -7
- package/src/runtime/memory/lib/pg/supervisor.mjs +4 -1
- package/src/runtime/office/authoring/docx-html-runner.mjs +1 -1
- package/src/runtime/office/authoring/html-browser.mjs +18 -8
- package/src/runtime/office/authoring/pdf-html-runner.mjs +1 -1
- package/src/runtime/office/authoring/pptx-html-measure.mjs +1 -1
- package/src/runtime/office/authoring/xlsx-html-runner.mjs +1 -1
- package/src/runtime/office/core/office-write-ledger.mjs +1 -5
- package/src/runtime/office/index.mjs +2 -3
- package/src/runtime/office/pdf/pdf-analysis.mjs +0 -68
- package/src/runtime/session-search/session-search-ingest.mjs +1 -1
- package/src/runtime/shared/agent-reap-state.mjs +13 -0
- package/src/runtime/shared/atomic-file.d.mts +1 -1
- package/src/runtime/shared/background-tasks.mjs +6 -1
- package/src/runtime/shared/bounded-line-diff.mjs +11 -2
- package/src/runtime/shared/browser-launch.mjs +15 -0
- package/src/runtime/shared/err-text.mjs +42 -4
- package/src/runtime/shared/file-lock.mjs +6 -5
- package/src/runtime/shared/llm/anthropic-betas.mjs +1 -2
- package/src/runtime/shared/llm/provider-model-identities.mjs +1 -0
- package/src/runtime/shared/model-route-chain.d.mts +8 -0
- package/src/runtime/shared/model-route-chain.mjs +48 -0
- package/src/runtime/shared/model-route-fallback.mjs +22 -0
- package/src/runtime/shared/pid-liveness.mjs +12 -0
- package/src/runtime/shared/provider-api-key.mjs +6 -0
- package/src/runtime/shared/provider-timeout-phase.mjs +17 -0
- package/src/runtime/shared/quiet-progress.d.mts +35 -0
- package/src/runtime/shared/quiet-progress.mjs +101 -0
- package/src/runtime/shared/quota-resume-store.mjs +32 -1
- package/src/runtime/shared/read-row-numbers.mjs +44 -0
- package/src/runtime/shared/remote-intent.mjs +2 -42
- package/src/runtime/shared/slow-span.mjs +8 -1
- package/src/runtime/shared/statusline/statusline-segments.mjs +24 -2
- package/src/runtime/shared/tool-card-model/card-header.mjs +2 -1
- package/src/runtime/shared/tool-output-budget.mjs +2 -0
- package/src/runtime/shared/tool-result-summary.mjs +16 -2
- package/src/runtime/shared/tool-status.mjs +3 -2
- package/src/runtime/shared/tool-surface.mjs +2 -3
- package/src/runtime/shared/tool-work-units.mjs +22 -15
- package/src/runtime/shared/transcript-metadata.mjs +49 -1
- package/src/runtime/shared/transcript-turn-keys.mjs +33 -0
- package/src/runtime/shared/transcript-writer/transcript-file.mjs +10 -1
- package/src/runtime/shared/transcript-writer.mjs +14 -4
- package/src/runtime/shared/turn-changes.mjs +2 -1
- package/src/runtime/shared/turn-snapshot.mjs +11 -3
- package/src/runtime/shared/worktrees/activity-gate.mjs +175 -0
- package/src/runtime/shared/worktrees/branch-management.mjs +179 -0
- package/src/runtime/shared/worktrees/carry.mjs +6 -4
- package/src/runtime/shared/worktrees/contract.mjs +27 -1
- package/src/runtime/shared/worktrees/dependencies.mjs +456 -0
- package/src/runtime/shared/worktrees/file-recovery.mjs +29 -13
- package/src/runtime/shared/worktrees/git-head.mjs +22 -13
- package/src/runtime/shared/worktrees/include.mjs +125 -7
- package/src/runtime/shared/worktrees/lock.mjs +1 -1
- package/src/runtime/shared/worktrees/maintenance.mjs +20 -2
- package/src/runtime/shared/worktrees/manager.mjs +378 -32
- package/src/runtime/shared/worktrees/owner.mjs +2 -1
- package/src/runtime/shared/worktrees/preparation-report.mjs +79 -0
- package/src/runtime/shared/worktrees/setup-commands.mjs +232 -0
- package/src/runtime/shared/worktrees/workspace-visibility.mjs +17 -0
- package/src/runtime/terminal-bridge/client.mjs +14 -10
- package/src/session-runtime/boot/apis.mjs +7 -1
- package/src/session-runtime/boot/config.mjs +2 -0
- package/src/session-runtime/boot/facade.mjs +3 -0
- package/src/session-runtime/boot/session.mjs +3 -2
- package/src/session-runtime/boot/tools.mjs +3 -0
- package/src/session-runtime/conversation-import/service.mjs +1 -1
- package/src/session-runtime/goal-facade-api.mjs +2 -2
- package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +44 -18
- package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +4 -1
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +22 -8
- package/src/session-runtime/internal-tool-executor.mjs +2 -0
- package/src/session-runtime/lifecycle/cold-heir.mjs +0 -1
- package/src/session-runtime/lifecycle/session-catalog.mjs +14 -16
- package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +18 -53
- package/src/session-runtime/lifecycle/session-switch.mjs +1 -1
- package/src/session-runtime/lifecycle/shared.mjs +5 -6
- package/src/session-runtime/lifecycle/teardown/session-close.mjs +6 -5
- package/src/session-runtime/lifecycle/teardown.mjs +7 -16
- package/src/session-runtime/media-api.mjs +8 -0
- package/src/session-runtime/model-route/route-ownership.mjs +60 -0
- package/src/session-runtime/model-route/route-persist.mjs +3 -2
- package/src/session-runtime/model-route/set-route.mjs +114 -34
- package/src/session-runtime/model-route/web-search-route.mjs +7 -2
- package/src/session-runtime/model-route-api.mjs +4 -2
- package/src/session-runtime/native-web-search/routes.mjs +37 -24
- package/src/session-runtime/native-web-search.mjs +9 -8
- package/src/session-runtime/provider-auth/setup.mjs +4 -0
- package/src/session-runtime/provider-models/catalog-load.mjs +9 -0
- package/src/session-runtime/provider-models/web-search-catalog.mjs +23 -3
- package/src/session-runtime/provider-models.mjs +1 -0
- package/src/session-runtime/provider-usage.mjs +4 -0
- package/src/session-runtime/route-resolution.mjs +3 -1
- package/src/session-runtime/runtime-core.mjs +4 -0
- package/src/session-runtime/runtime-facade.mjs +6 -0
- package/src/session-runtime/services/agent-task-status.mjs +2 -0
- package/src/session-runtime/services/agent-tool/close-flow/close-all.mjs +0 -3
- package/src/session-runtime/services/agent-tool/close-flow.mjs +6 -7
- package/src/session-runtime/services/agent-tool/execute-send.mjs +2 -2
- package/src/session-runtime/services/agent-tool/execute-spawn.mjs +36 -3
- package/src/session-runtime/services/agent-tool/execute.mjs +9 -1
- package/src/session-runtime/services/agent-tool/helpers.mjs +30 -7
- package/src/session-runtime/services/agent-tool/job-task-reconcile.mjs +7 -2
- package/src/session-runtime/services/agent-tool/job-views/session-progress.mjs +6 -3
- package/src/session-runtime/services/agent-tool/lead-worker-index/lead-rows.mjs +3 -4
- package/src/session-runtime/services/agent-tool/lead-worker-index/reap-timers.mjs +9 -3
- package/src/session-runtime/services/agent-tool/lead-worker-index/row-settlement.mjs +7 -18
- package/src/session-runtime/services/agent-tool/lead-worker-index.mjs +9 -6
- package/src/session-runtime/services/agent-tool/model-select.mjs +82 -0
- package/src/session-runtime/services/agent-tool/send-flow.mjs +24 -6
- package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +3 -1
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +19 -5
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +5 -4
- package/src/session-runtime/services/agent-tool/spawn-flow.mjs +2 -1
- package/src/session-runtime/services/agent-tool/spawn-preset.mjs +3 -0
- package/src/session-runtime/services/agent-tool/tag-registry/tag-lookup.mjs +1 -3
- package/src/session-runtime/services/agent-tool/tag-registry/tag-refresh.mjs +1 -3
- package/src/session-runtime/services/agent-tool/tag-registry.mjs +3 -9
- package/src/session-runtime/services/agent-tool/terminal-reaper/scan-admission.mjs +8 -41
- package/src/session-runtime/services/agent-tool/terminal-reaper/stale-rows.mjs +3 -3
- package/src/session-runtime/services/agent-tool/terminal-reaper.mjs +6 -23
- package/src/session-runtime/services/agent-tool/terminal-trace.mjs +0 -1
- package/src/session-runtime/services/agent-tool/tool-def.mjs +7 -0
- package/src/session-runtime/services/agent-tool/worker-index/row-liveness.mjs +32 -20
- package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +5 -2
- package/src/session-runtime/services/agent-tool/worker-index.mjs +28 -8
- package/src/session-runtime/services/agent-tool.mjs +4 -0
- package/src/session-runtime/services/agent-watchdog-registry.mjs +2 -0
- package/src/session-runtime/services/provider-admin.mjs +77 -0
- package/src/session-runtime/session-create/session-options.mjs +7 -5
- package/src/session-runtime/session-create/session-start-hook.mjs +2 -1
- package/src/session-runtime/session-transcript.mjs +4 -5
- package/src/session-runtime/session-turn-api.mjs +3 -9
- package/src/session-runtime/settings-builtin-tools-api.mjs +9 -6
- package/src/session-runtime/setup-tool/executor.mjs +23 -5
- package/src/session-runtime/setup-tool/extended-actions.mjs +6 -6
- package/src/session-runtime/setup-tool/settings-contract.mjs +7 -2
- package/src/session-runtime/setup-tool/tool-defs.mjs +13 -1
- package/src/session-runtime/tool-policy-refresh.mjs +83 -32
- package/src/session-runtime/turn/agent-ops.mjs +49 -2
- package/src/session-runtime/turn/side-question-ops.mjs +1 -4
- package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +2 -0
- package/src/session-runtime/turn/turn-run/turn-prepare.mjs +4 -0
- package/src/session-runtime/turn/turn-run/turn-settle.mjs +8 -2
- package/src/session-runtime/turn/turn-run.mjs +1 -36
- package/src/session-runtime/usage-stats-api.mjs +4 -1
- package/src/session-runtime/workflow-agents-api/agent-route.mjs +16 -1
- package/src/session-runtime/workspace/admission-gate.mjs +44 -15
- package/src/session-runtime/workspace/project-branches.mjs +28 -36
- package/src/session-runtime/workspace/transition-steps.mjs +96 -95
- package/src/session-runtime/workspace/transitions.mjs +248 -68
- package/src/standalone/channel-transport.mjs +3 -4
- package/src/standalone/daemon-desktop-runtime.mjs +32 -1
- package/src/standalone/daemon-pg-stop.mjs +1 -3
- package/src/standalone/daemon-session-control.mjs +88 -0
- package/src/standalone/daemon-stored-session-views.mjs +23 -3
- package/src/standalone/daemon.mjs +2 -0
- package/src/standalone/desktop-service-registry.mjs +32 -5
- package/src/standalone/local-session-runtime.mjs +11 -12
- package/src/standalone/session-protocol.mjs +7 -0
- package/src/standalone/session-runtime-inline-host.mjs +2 -0
- package/src/standalone/session-service/agent-tree/agent-cancel.mjs +91 -49
- package/src/standalone/session-service/agent-tree/agent-child.mjs +19 -1
- package/src/standalone/session-service/agent-tree/agent-registry.mjs +25 -0
- package/src/standalone/session-service/agent-tree/agent-turns.mjs +9 -1
- package/src/standalone/session-service/agent-tree.mjs +28 -2
- package/src/standalone/session-service/entries/session-loads.mjs +16 -5
- package/src/standalone/session-service/entries.mjs +1 -0
- package/src/standalone/session-service/projection/transcript-window.mjs +39 -0
- package/src/standalone/session-service/quota-resume.mjs +28 -13
- package/src/standalone/session-service/session-calls/session-turns.mjs +17 -6
- package/src/standalone/session-service/session-calls/session-views.mjs +6 -0
- package/src/standalone/session-tool-output.mjs +82 -0
- package/src/tui/app/app-view.jsx +2 -1
- package/src/tui/app/provider-setup/provider-items.mjs +8 -0
- package/src/tui/app/provider-setup-picker.mjs +15 -3
- package/src/tui/app/slash-commands.mjs +6 -0
- package/src/tui/app/slash-dispatch/session-commands.mjs +49 -0
- package/src/tui/components/Spinner.jsx +4 -0
- package/src/tui/components/SpinnerByline.jsx +21 -2
- package/src/tui/components/status-line/local-line.mjs +10 -2
- package/src/tui/dist/index.mjs +529 -270
- package/src/tui/session/active-tool-summary.mjs +1 -1
- package/src/tui/session/context-state.mjs +0 -3
- package/src/tui/session/goal-continuation/continuation-queue.mjs +2 -3
- package/src/tui/session/goal-continuation/deadline-delivery.mjs +4 -2
- package/src/tui/session/goal-continuation/session-boundary.mjs +21 -0
- package/src/tui/session/quota-resume.mjs +140 -61
- package/src/tui/session/session-api/commands.mjs +4 -10
- package/src/tui/session/session-api/controls.mjs +12 -0
- package/src/tui/session/session-api/lifecycle/dispose.mjs +2 -9
- package/src/tui/session/session-api/lifecycle/resume.mjs +2 -7
- package/src/tui/session/session-api/lifecycle.mjs +13 -11
- package/src/tui/session/session-api/media.mjs +2 -0
- package/src/tui/session/session-api/routes.mjs +81 -57
- package/src/tui/session/session-api/settings.mjs +3 -3
- package/src/tui/session/session-api/worktree.mjs +3 -2
- package/src/tui/session/session-flow/auto-clear.mjs +1 -3
- package/src/tui/session/session-flow/drain.mjs +6 -4
- package/src/tui/session/session-flow/queue/entry-shape.mjs +2 -0
- package/src/tui/session/session-flow/queue/take-entries.mjs +2 -1
- package/src/tui/session/session-flow/queue.mjs +1 -1
- package/src/tui/session/tool-approval.mjs +17 -8
- package/src/tui/session/transcript-store/streaming-tail.mjs +1 -1
- package/src/tui/session/tui-steering-persist.mjs +3 -5
- package/src/tui/session/turn-quiet.mjs +53 -0
- package/src/tui/session/turn-stream.mjs +5 -1
- package/src/tui/session/turn.mjs +38 -31
- package/src/tui/session/worktree-setup-notice.mjs +38 -0
- package/src/tui/spinner-meta.mjs +10 -0
- package/src/tui/spinner-verbs.mjs +3 -0
- package/src/ui/statusline.mjs +13 -3
- package/src/ui/streaming-markdown-heal.mjs +70 -18
- package/src/runtime/agent/orchestrator/providers/model-pricing-rates.mjs +0 -1
- package/src/runtime/agent/orchestrator/session/manager/foreign-pending-messages.mjs +0 -346
- package/src/runtime/agent/orchestrator/session/manager/session-owner-liveness.mjs +0 -117
- package/src/runtime/agent/orchestrator/session/store/paths-heartbeat.mjs +0 -302
- package/src/session-runtime/services/agent-tool/terminal-reaper/reap-timers.mjs +0 -142
- package/src/session-runtime/turn/share-ops.mjs +0 -77
- package/src/tui/session/cross-surface-share.mjs +0 -406
- package/src/tui/session/live-share/delta.mjs +0 -153
- package/src/tui/session/live-share/mirror.mjs +0 -106
- package/src/tui/session/live-share/owner.mjs +0 -254
- package/src/tui/session/live-share/retry.mjs +0 -54
- package/src/tui/session/live-share/viewer/frame-router.mjs +0 -32
- package/src/tui/session/live-share/viewer/pipe-client.mjs +0 -108
- package/src/tui/session/live-share/viewer/submit-acks.mjs +0 -65
- package/src/tui/session/live-share/viewer/sync-waiters.mjs +0 -53
- package/src/tui/session/live-share/viewer.mjs +0 -99
- package/src/tui/session/live-share/wire.mjs +0 -44
- package/src/tui/session/live-share.mjs +0 -154
- package/src/tui/session/shared-dir-watch.mjs +0 -69
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
// Committed-but-unsealed text segments of one user turn.
|
|
2
2
|
//
|
|
3
|
-
// Max-output recovery parts plus
|
|
3
|
+
// Max-output recovery parts plus text-only continuation
|
|
4
4
|
// segments (provider pause_turn / terminal steering / stop hook). The terminal
|
|
5
5
|
// response returns content = parts + terminal so the UI row that accumulated
|
|
6
6
|
// every streamed segment is not overwritten down to only the last segment;
|
|
7
7
|
// historyContent keeps persistence single-copy.
|
|
8
8
|
import { buildIntermediateAssistantMessage, commitAssistantMessage } from '../assistant-commit.mjs';
|
|
9
9
|
|
|
10
|
-
export function createTurnSegments({ messages, opts
|
|
10
|
+
export function createTurnSegments({ messages, opts }) {
|
|
11
11
|
const parts = [];
|
|
12
12
|
return {
|
|
13
13
|
parts,
|
|
@@ -18,15 +18,9 @@ export function createTurnSegments({ messages, opts, suppressMidTurnText }) {
|
|
|
18
18
|
return true;
|
|
19
19
|
},
|
|
20
20
|
// Record a mid-turn segment for the caller-facing aggregate and surface it
|
|
21
|
-
// live
|
|
22
|
-
// text — except on the max-output ladder, whose parts must still rebuild
|
|
23
|
-
// the complete answer the caller receives (keepWhenSuppressed).
|
|
21
|
+
// live for every session.
|
|
24
22
|
// `committed: true` marks text that is the just-committed message's own.
|
|
25
|
-
record(text, {
|
|
26
|
-
if (suppressMidTurnText) {
|
|
27
|
-
if (keepWhenSuppressed) parts.push(text);
|
|
28
|
-
return;
|
|
29
|
-
}
|
|
23
|
+
record(text, { committed = false } = {}) {
|
|
30
24
|
parts.push(text);
|
|
31
25
|
try {
|
|
32
26
|
opts.onAssistantText?.(text, { committed });
|
|
@@ -19,15 +19,8 @@ import { resolveRefusal } from './no-tool-turn/refusal.mjs';
|
|
|
19
19
|
import { resumeContinuation } from './no-tool-turn/continuation.mjs';
|
|
20
20
|
import { nudgeEmptyTurn } from './no-tool-turn/empty-nudge.mjs';
|
|
21
21
|
|
|
22
|
-
export function createNoToolTurnResolver({
|
|
23
|
-
messages,
|
|
24
|
-
opts,
|
|
25
|
-
sessionId,
|
|
26
|
-
sessionAgent,
|
|
27
|
-
suppressMidTurnText,
|
|
28
|
-
drainSteering,
|
|
29
|
-
}) {
|
|
30
|
-
const segments = createTurnSegments({ messages, opts, suppressMidTurnText });
|
|
22
|
+
export function createNoToolTurnResolver({ messages, opts, sessionId, sessionAgent, drainSteering }) {
|
|
23
|
+
const segments = createTurnSegments({ messages, opts });
|
|
31
24
|
// Per-turn recovery counters shared by the ladders.
|
|
32
25
|
const state = {
|
|
33
26
|
maxOutputRecoveryCount: 0,
|
|
@@ -103,7 +103,10 @@ export function preDispatchDenyForSession(sessionRef, call) {
|
|
|
103
103
|
// its wire id with the projection error; call_tool itself never dispatches.
|
|
104
104
|
if (typeof call.bridgeError === 'string') return call.bridgeError;
|
|
105
105
|
if (name === BRIDGE_CALL_TOOL_NAME && isToolBridgeEnabled(sessionRef)) {
|
|
106
|
-
return bridgeErrorText(
|
|
106
|
+
return bridgeErrorText(
|
|
107
|
+
'BRIDGE_RECURSION',
|
|
108
|
+
'call_tool runs one tool named in its arguments and cannot be dispatched itself.'
|
|
109
|
+
);
|
|
107
110
|
}
|
|
108
111
|
const schemaName = String(call?.schemaName || name);
|
|
109
112
|
// A tool the provider left out of this request still exists in the session;
|
|
@@ -13,7 +13,10 @@ import { actionInputUnionFor } from '../../providers/lib/action-input-contract.m
|
|
|
13
13
|
import { isAntigravityClaude } from '../../providers/antigravity-request.mjs';
|
|
14
14
|
import { isResponsesFreeformTool } from '../../providers/custom-tool-wire.mjs';
|
|
15
15
|
import { ANTHROPIC_NATIVE_PROVIDERS } from '../../runtime-core/tool-catalog-schema.mjs';
|
|
16
|
-
import {
|
|
16
|
+
import {
|
|
17
|
+
finalizeProviderRequestTools,
|
|
18
|
+
providerNativeToolPrefixCount,
|
|
19
|
+
} from '../../runtime-core/provider-request-tools.mjs';
|
|
17
20
|
|
|
18
21
|
const sessions = new WeakMap();
|
|
19
22
|
|
|
@@ -5,10 +5,7 @@
|
|
|
5
5
|
import { repairTranscriptBeforeProviderSend } from './transcript-repair.mjs';
|
|
6
6
|
import { messagesArrayChanged } from './tool-helpers.mjs';
|
|
7
7
|
import { runPreSendCompactPass } from '../pre-send-compact.mjs';
|
|
8
|
-
import {
|
|
9
|
-
refreshDeferredMcpToolCatalog,
|
|
10
|
-
snapshotProviderRequestTools,
|
|
11
|
-
} from '../../runtime-core/tool-catalog.mjs';
|
|
8
|
+
import { refreshDeferredMcpToolCatalog, snapshotProviderRequestTools } from '../../runtime-core/tool-catalog.mjs';
|
|
12
9
|
import {
|
|
13
10
|
finalizeProviderRequestTools,
|
|
14
11
|
providerNativeToolPrefixCount,
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { canFallbackRoute } from '../../../../shared/model-route-fallback.mjs';
|
|
2
|
+
import { getProvider, initProviders } from '../../providers/registry.mjs';
|
|
3
|
+
import { loadConfig } from '../../config.mjs';
|
|
4
|
+
import { ensureProviderEnabled } from '../../runtime-core/config-helpers.mjs';
|
|
5
|
+
import { updateSessionRoute } from '../manager/session-lifecycle.mjs';
|
|
6
|
+
import { pinSessionWireRoute } from '../../providers/wire-route.mjs';
|
|
7
|
+
import { buildRequestSendOptions } from '../manager/ask-turn-loop-options.mjs';
|
|
8
|
+
import { prepareTurnEffortConfiguration } from '../../providers/effort-configuration.mjs';
|
|
9
|
+
import { resolveSessionContextMeta } from '../manager/context-meta.mjs';
|
|
10
|
+
|
|
11
|
+
export async function advanceAgentRoute(state, error) {
|
|
12
|
+
const session = state.sessionRef;
|
|
13
|
+
const index = session?.routeFallbackIndex || 0;
|
|
14
|
+
const next = session?.routeFallbacks?.[index];
|
|
15
|
+
const committed = state.toolCallsTotal > 0 || state.response != null;
|
|
16
|
+
if (!session?.agent || !next || !canFallbackRoute(error, { signal: state.signal, committed })) return false;
|
|
17
|
+
state.throwIfAborted();
|
|
18
|
+
const config = ensureProviderEnabled(loadConfig(), next.provider);
|
|
19
|
+
await initProviders(config.providers, { signal: state.signal });
|
|
20
|
+
state.throwIfAborted();
|
|
21
|
+
const provider = getProvider(next.provider);
|
|
22
|
+
if (!provider) throw new Error(`Provider "${next.provider}" not available`);
|
|
23
|
+
const oldOptions = buildRequestSendOptions({
|
|
24
|
+
sessionId: state.sessionId,
|
|
25
|
+
session,
|
|
26
|
+
signal: state.signal,
|
|
27
|
+
});
|
|
28
|
+
const updated = updateSessionRoute(
|
|
29
|
+
session.id,
|
|
30
|
+
{
|
|
31
|
+
...next,
|
|
32
|
+
effort: next.effort || null,
|
|
33
|
+
fast: next.fast === true,
|
|
34
|
+
autoEffort: next.autoEffort !== false,
|
|
35
|
+
modelParameters: next.modelParameters || {},
|
|
36
|
+
contextPercent: next.contextPercent,
|
|
37
|
+
contextTokens: next.contextTokens,
|
|
38
|
+
selectedContextWindow: resolveSessionContextMeta(provider, next.model, next).rawContextWindow,
|
|
39
|
+
},
|
|
40
|
+
{ crossProvider: true }
|
|
41
|
+
);
|
|
42
|
+
if (!updated) throw new Error('agent session closed during model fallback');
|
|
43
|
+
updated.routeFallbackIndex = index + 1;
|
|
44
|
+
await pinSessionWireRoute(updated, provider);
|
|
45
|
+
state.throwIfAborted();
|
|
46
|
+
state.messages.splice(0, state.messages.length, ...updated.messages);
|
|
47
|
+
updated.liveTurnMessages = state.messages;
|
|
48
|
+
state.sessionRef = updated;
|
|
49
|
+
state.provider = provider;
|
|
50
|
+
state.model = updated.model;
|
|
51
|
+
state.tools = updated.tools;
|
|
52
|
+
state.providerState = undefined;
|
|
53
|
+
state.providerStateUpdated = true;
|
|
54
|
+
state.prefixGuardState = null;
|
|
55
|
+
state.fixedProviderToolSurface = null;
|
|
56
|
+
state.cacheBreakTraceKeys.clear();
|
|
57
|
+
state.transportRetriesUsed = 0;
|
|
58
|
+
state.transportRetryMax = 0;
|
|
59
|
+
for (const key of Object.keys(oldOptions)) delete state.opts[key];
|
|
60
|
+
Object.assign(
|
|
61
|
+
state.opts,
|
|
62
|
+
buildRequestSendOptions({
|
|
63
|
+
sessionId: state.sessionId,
|
|
64
|
+
session: updated,
|
|
65
|
+
turnEffort: updated.effort,
|
|
66
|
+
effortConfiguration: prepareTurnEffortConfiguration(updated, provider),
|
|
67
|
+
signal: state.signal,
|
|
68
|
+
})
|
|
69
|
+
);
|
|
70
|
+
state.opts.onStageChange?.('connecting', {
|
|
71
|
+
provider: updated.provider,
|
|
72
|
+
model: updated.model,
|
|
73
|
+
reason: 'model-fallback',
|
|
74
|
+
});
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
@@ -18,6 +18,7 @@ import { runWithProviderRequestToolsScope } from '../../runtime-core/provider-re
|
|
|
18
18
|
import { REPEAT_FAIL_LIMIT } from './loop-state.mjs';
|
|
19
19
|
import { createToolCallIdResolver } from './tool-call-ids.mjs';
|
|
20
20
|
import { captureSideQuestionRequest } from '../side-question-store.mjs';
|
|
21
|
+
import { advanceAgentRoute } from './route-fallback.mjs';
|
|
21
22
|
import {
|
|
22
23
|
beginProviderToolExclusions,
|
|
23
24
|
dropSessionTool,
|
|
@@ -205,7 +206,8 @@ export async function sendProviderRequest(state, round) {
|
|
|
205
206
|
);
|
|
206
207
|
} catch (error) {
|
|
207
208
|
sideQuestion?.discard();
|
|
208
|
-
throw error;
|
|
209
|
+
if (!(await advanceAgentRoute(state, error))) throw error;
|
|
210
|
+
result = { action: 'retry_route' };
|
|
209
211
|
}
|
|
210
212
|
if (result.action === 'proceed') sideQuestion?.settle(result.response);
|
|
211
213
|
else sideQuestion?.discard();
|
|
@@ -233,6 +235,8 @@ function appendRecoveryNotice(state, notice) {
|
|
|
233
235
|
* instead of processing a response. */
|
|
234
236
|
export function applyRetryAction(state, result) {
|
|
235
237
|
switch (result.action) {
|
|
238
|
+
case 'retry_route':
|
|
239
|
+
return true;
|
|
236
240
|
case 'retry':
|
|
237
241
|
// Keep opts.cacheBreakIntent: the failed send never consumed the tag,
|
|
238
242
|
// and the reactive-compact retry that follows IS the tagged transition.
|
|
@@ -21,15 +21,14 @@ import { judgeTurn, recordEffortDecision } from '../../../../effort-judge/judge-
|
|
|
21
21
|
import { stepResultWindow } from '../../../../effort-judge/judge-input.mjs';
|
|
22
22
|
|
|
23
23
|
const TEXT_BLOCKS = new Set(['text', 'input_text', 'output_text']);
|
|
24
|
-
|
|
25
|
-
typeof content === 'string'
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
: '';
|
|
24
|
+
function textOf(content) {
|
|
25
|
+
if (typeof content === 'string') return content;
|
|
26
|
+
if (!Array.isArray(content)) return '';
|
|
27
|
+
return content
|
|
28
|
+
.filter((block) => block && TEXT_BLOCKS.has(block.type))
|
|
29
|
+
.map((block) => block.text)
|
|
30
|
+
.join('\n');
|
|
31
|
+
}
|
|
33
32
|
// Same argument text the training data was built from (head 600 code points).
|
|
34
33
|
const argText = (args) =>
|
|
35
34
|
Array.from(typeof args === 'string' ? args : JSON.stringify(args ?? {}))
|
|
@@ -14,6 +14,12 @@ export function _stripMcpPrefix(name) {
|
|
|
14
14
|
export function _isReadTool(name) {
|
|
15
15
|
return _stripMcpPrefix(name) === 'read';
|
|
16
16
|
}
|
|
17
|
+
|
|
18
|
+
// Cursor's native file protocol needs source content, not a receipt saying
|
|
19
|
+
// the model has already seen it. Keep actual read caching and permissions.
|
|
20
|
+
export function requiresReadBody(name, sessionRef) {
|
|
21
|
+
return name === 'read' && (sessionRef?.provider === 'cursor-oauth' || sessionRef?.provider === 'cursor-api');
|
|
22
|
+
}
|
|
17
23
|
export function _isMutationTool(name, args = null) {
|
|
18
24
|
const n = String(_stripMcpPrefix(name) || '').toLowerCase();
|
|
19
25
|
return n === 'apply_patch' || n === 'edit' || _isGitMutationTool(name, args);
|
|
@@ -15,6 +15,8 @@ import { executeInternalTool, isInternalTool } from '../../../internal-tools.mjs
|
|
|
15
15
|
import { buildSkillsListResponse, viewSkill } from '../tool-helpers.mjs';
|
|
16
16
|
import { isOnDeferredToolSurface } from '../deferred-call-through.mjs';
|
|
17
17
|
import { _executeCodeGraphToolLazy } from '../../manager/runtime-loaders.mjs';
|
|
18
|
+
import { requiresReadBody } from '../tool-classify.mjs';
|
|
19
|
+
import { executeCursorNativeBuiltin } from '../../../tools/builtin/external-tool-adapters.mjs';
|
|
18
20
|
|
|
19
21
|
function dispatchMcp(name, args, { cwd, callerSessionId, sessionRef, executeOpts }) {
|
|
20
22
|
const mcpScopeId = sessionRef?.mcpScopeId || null;
|
|
@@ -100,11 +102,22 @@ export function dispatchToolCall({ name, args }, ctx) {
|
|
|
100
102
|
if (name === 'shell' || isBuiltinTool(name) || isExternalAdapterTool(name)) {
|
|
101
103
|
const builtinOpts = {
|
|
102
104
|
...completionToolOpts,
|
|
103
|
-
...(executeOpts.suppressReadUnchangedStub
|
|
105
|
+
...(executeOpts.suppressReadUnchangedStub || requiresReadBody(name, sessionRef)
|
|
106
|
+
? { suppressReadUnchangedStub: true }
|
|
107
|
+
: {}),
|
|
104
108
|
// Runtime-granted only; any value inherited from executeOpts is overridden.
|
|
105
109
|
elevationApproved: ctx.elevationApproved === true,
|
|
106
110
|
};
|
|
107
|
-
return
|
|
111
|
+
return executeCursorNativeBuiltin(
|
|
112
|
+
name,
|
|
113
|
+
args,
|
|
114
|
+
cwd,
|
|
115
|
+
{
|
|
116
|
+
...builtinOpts,
|
|
117
|
+
toolCallId: executeOpts.toolCallId || null,
|
|
118
|
+
},
|
|
119
|
+
executeBuiltinTool
|
|
120
|
+
);
|
|
108
121
|
}
|
|
109
122
|
return formatUnknownBuiltinToolMessage(name, args, 'tool');
|
|
110
123
|
}
|
|
@@ -3,10 +3,7 @@
|
|
|
3
3
|
// applyDeferredToolSurface; this module adds what a changed request prefix
|
|
4
4
|
// invalidates: provider state, the prefix guard, the context baseline and the
|
|
5
5
|
// cache-break tag. Historical tool calls are never rewritten.
|
|
6
|
-
import {
|
|
7
|
-
applyDeferredToolSurface,
|
|
8
|
-
rebuildDeferredToolSurfaceForProvider,
|
|
9
|
-
} from '../../runtime-core/tool-catalog.mjs';
|
|
6
|
+
import { applyDeferredToolSurface, rebuildDeferredToolSurfaceForProvider } from '../../runtime-core/tool-catalog.mjs';
|
|
10
7
|
import {
|
|
11
8
|
bridgeSurfaceOutdated,
|
|
12
9
|
sessionToolExposure,
|
|
@@ -16,7 +16,7 @@ function isSleepLikeToolCall(call) {
|
|
|
16
16
|
}
|
|
17
17
|
|
|
18
18
|
export async function runToolPhase(state, round, sent, onToolCall) {
|
|
19
|
-
const { opts, messages, tools, sessionId, sessionRef, signal, response
|
|
19
|
+
const { opts, messages, tools, sessionId, sessionRef, signal, response } = state;
|
|
20
20
|
state.noToolTurn.noteToolCallTurn();
|
|
21
21
|
const calls = response.toolCalls;
|
|
22
22
|
round.resolveToolCallId.all(calls);
|
|
@@ -25,8 +25,7 @@ export async function runToolPhase(state, round, sent, onToolCall) {
|
|
|
25
25
|
// UI. Providers that stream via onTextDelta already rendered it; providers
|
|
26
26
|
// that return text only in response.content would otherwise show nothing
|
|
27
27
|
// before the tool card. The engine de-dups against already-streamed text.
|
|
28
|
-
|
|
29
|
-
if (!suppressMidTurnText && typeof response.content === 'string' && response.content.trim()) {
|
|
28
|
+
if (typeof response.content === 'string' && response.content.trim()) {
|
|
30
29
|
try {
|
|
31
30
|
opts.onAssistantText?.(response.content);
|
|
32
31
|
} catch {
|
|
@@ -39,7 +38,7 @@ export async function runToolPhase(state, round, sent, onToolCall) {
|
|
|
39
38
|
// The wire calls stay the transcript identity (assistant turn below).
|
|
40
39
|
const toolBatchId = recordToolBatch(sessionId, resolveExecutionToolCalls(calls, sessionRef), state.iterations);
|
|
41
40
|
await Promise.resolve(onToolCall?.(state.iterations, calls));
|
|
42
|
-
const assistantTurnMsg = buildToolCallAssistantMessage(response, { calls,
|
|
41
|
+
const assistantTurnMsg = buildToolCallAssistantMessage(response, { calls, opts });
|
|
43
42
|
commitAssistantMessage(messages, assistantTurnMsg, opts);
|
|
44
43
|
try {
|
|
45
44
|
opts.onToolPhaseStarted?.();
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
// abort-aware call wrapper is ask-call-interrupt. This file owns the lock,
|
|
7
7
|
// the loop and the runtime bookkeeping around each turn.
|
|
8
8
|
import { createHash } from 'node:crypto';
|
|
9
|
+
import { admitWorkspaceActivity } from '../../../../shared/worktrees/activity-gate.mjs';
|
|
9
10
|
import {
|
|
10
11
|
persistedAssistantTranscriptMetadata,
|
|
11
12
|
persistedUserTranscriptMetadata,
|
|
@@ -38,6 +39,16 @@ const traceAskStart = (sessionId, explicitPrefetch) => {
|
|
|
38
39
|
);
|
|
39
40
|
};
|
|
40
41
|
|
|
42
|
+
/** A background follow-up ask has no caller to reject to; its failure would
|
|
43
|
+
* otherwise strand the pending input silently. */
|
|
44
|
+
const logFollowUpFailure = (sessionId) => (error) => {
|
|
45
|
+
try {
|
|
46
|
+
process.stderr.write(`[agent-ask] follow-up ask failed session=${sessionId}: ${error?.message || error}\n`);
|
|
47
|
+
} catch {
|
|
48
|
+
/* best-effort */
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
|
|
41
52
|
/** The transcript timestamps the caller supplied for this ask: the persisted
|
|
42
53
|
* user metadata plus a one-shot reader for the assistant metadata. */
|
|
43
54
|
export function createAskTranscriptMeta(rawTranscriptMeta) {
|
|
@@ -66,7 +77,13 @@ export function createAskTranscriptMeta(rawTranscriptMeta) {
|
|
|
66
77
|
* the turn state and rethrows. Returns the terminal result preview and the
|
|
67
78
|
* follow-ups drained right after the provider accepted the turn. */
|
|
68
79
|
async function runAskTurn({ sessionId, opened, input, askOpts, onToolCall, cwdOverride, transcript, askStartedAt }) {
|
|
80
|
+
let releaseWorkspace;
|
|
69
81
|
try {
|
|
82
|
+
releaseWorkspace = await admitWorkspaceActivity(
|
|
83
|
+
sessionId,
|
|
84
|
+
cwdOverride || opened.turn.session.cwd || process.cwd(),
|
|
85
|
+
opened.runtime.controller?.signal
|
|
86
|
+
);
|
|
70
87
|
const prepared = await prepareAskTurn({ sessionId, opened, input, cwdOverride, transcriptMeta: transcript.user });
|
|
71
88
|
const result = await runAskAgentLoop({
|
|
72
89
|
sessionId,
|
|
@@ -105,8 +122,12 @@ async function runAskTurn({ sessionId, opened, input, askOpts, onToolCall, cwdOv
|
|
|
105
122
|
generation: opened.askGeneration,
|
|
106
123
|
turnCheckpointToken: opened.turnToken,
|
|
107
124
|
runtime: opened.runtime,
|
|
125
|
+
transcriptMeta: transcript.raw,
|
|
126
|
+
askStartedAt,
|
|
108
127
|
});
|
|
109
128
|
throw err;
|
|
129
|
+
} finally {
|
|
130
|
+
releaseWorkspace?.();
|
|
110
131
|
}
|
|
111
132
|
}
|
|
112
133
|
|
|
@@ -122,9 +143,12 @@ export async function askSession(sessionId, prompt, context, onToolCall, cwdOver
|
|
|
122
143
|
process.stderr.write(`[agent-trace] lock-acquired waitedMs=${Date.now() - askStartedAt}\n`);
|
|
123
144
|
}
|
|
124
145
|
// A non-empty cross-process sweep starts an empty follow-up ask once the
|
|
125
|
-
// current session lock is released; it never delays completion.
|
|
146
|
+
// current session lock is released; it never delays completion. The
|
|
147
|
+
// failed-turn retry identity is one-shot: a follow-up runs queued input,
|
|
148
|
+
// never the retried turn. Nobody awaits it, so a failure is logged.
|
|
149
|
+
const followUpOpts = { ...askOpts, retryFailedTurn: undefined, retryTurnId: undefined, retryAttemptId: undefined };
|
|
126
150
|
const kickFollowUpAsk = () => {
|
|
127
|
-
askSession(sessionId, '', null, onToolCall, cwdOverride, null,
|
|
151
|
+
askSession(sessionId, '', null, onToolCall, cwdOverride, null, followUpOpts).catch(logFollowUpFailure(sessionId));
|
|
128
152
|
};
|
|
129
153
|
// The mutex is held for the WHOLE askSession call, including any follow-up
|
|
130
154
|
// turns drained from the pending-message queue below — the single outer
|
|
@@ -141,6 +165,7 @@ export async function askSession(sessionId, prompt, context, onToolCall, cwdOver
|
|
|
141
165
|
// A failed-turn retry rewinds only the turn it retries, never a drained
|
|
142
166
|
// follow-up turn.
|
|
143
167
|
let retryFailedTurn = askOpts.retryFailedTurn === true;
|
|
168
|
+
let retryTurnId = askOpts.retryTurnId;
|
|
144
169
|
try {
|
|
145
170
|
// Turn loop (pendingMessages pattern): run the current prompt, then drain
|
|
146
171
|
// any `agent type=send` messages that were queued while this turn was in
|
|
@@ -163,6 +188,11 @@ export async function askSession(sessionId, prompt, context, onToolCall, cwdOver
|
|
|
163
188
|
input.retryFailedTurn = true;
|
|
164
189
|
retryFailedTurn = false;
|
|
165
190
|
}
|
|
191
|
+
if (retryTurnId) {
|
|
192
|
+
input.retryTurnId = retryTurnId;
|
|
193
|
+
input.retryAttemptId = askOpts.retryAttemptId;
|
|
194
|
+
retryTurnId = null;
|
|
195
|
+
}
|
|
166
196
|
// Synchronous pre-await setup (must happen before any await so
|
|
167
197
|
// closeSession() can't interleave between load and registration).
|
|
168
198
|
const claimed = claimTurnRuntime({
|
|
@@ -217,7 +247,7 @@ export async function askSession(sessionId, prompt, context, onToolCall, cwdOver
|
|
|
217
247
|
if (count <= 0) return;
|
|
218
248
|
kickFollowUpAsk();
|
|
219
249
|
})
|
|
220
|
-
.catch(()
|
|
250
|
+
.catch(logFollowUpFailure(sessionId));
|
|
221
251
|
});
|
|
222
252
|
return result;
|
|
223
253
|
}
|
|
@@ -13,10 +13,6 @@ export async function settleAskCleanup(promise, { timeoutMs } = {}) {
|
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
// Live Agent projection is a per-ask send opt, never a session field.
|
|
16
|
-
// Callers that pass onTextDelta/onAssistantText still need `liveProjection`
|
|
17
|
-
// to un-suppress provider streaming: askSession always wraps those
|
|
18
|
-
// callbacks for interruption tracking, so agent-loop cannot infer intent
|
|
19
|
-
// from `typeof opts.onTextDelta === 'function'`.
|
|
20
16
|
export function resolveAskLiveProjection(askOpts = {}) {
|
|
21
17
|
return askOpts?.liveProjection === true;
|
|
22
18
|
}
|
|
@@ -16,7 +16,12 @@ import {
|
|
|
16
16
|
} from '../../providers/auto-effort.mjs';
|
|
17
17
|
import { builtinFeatureActive } from '../../runtime-core/builtin-features.mjs';
|
|
18
18
|
import { effortOptionsFor, warnEmptyAutoEffortLadder } from '../../runtime-core/effort.mjs';
|
|
19
|
-
import {
|
|
19
|
+
import {
|
|
20
|
+
effortJudgeSupportsSteps,
|
|
21
|
+
judgeTurn,
|
|
22
|
+
prewarmEffortJudge,
|
|
23
|
+
recordEffortDecision,
|
|
24
|
+
} from '../../../../effort-judge/judge-client.mjs';
|
|
20
25
|
import { promptContentText } from './prompt-utils.mjs';
|
|
21
26
|
|
|
22
27
|
// Every cache-safe route judges its tool-result steps the same way. Measured
|
|
@@ -53,6 +58,21 @@ export function autoEffortMode() {
|
|
|
53
58
|
}
|
|
54
59
|
}
|
|
55
60
|
|
|
61
|
+
/**
|
|
62
|
+
* Starts the judge worker when a session is created or opened on a route that
|
|
63
|
+
* Auto effort can judge, so the first judged turn does not wait for the cold
|
|
64
|
+
* load. Fire-and-forget: it never throws and never waits on the load.
|
|
65
|
+
*/
|
|
66
|
+
export function prewarmSessionAutoEffort(session, provider) {
|
|
67
|
+
try {
|
|
68
|
+
if (autoEffortMode() === 'off' || session?.autoEffort === false) return false;
|
|
69
|
+
if (!turnEffortConfigurationMode(session, provider)) return false;
|
|
70
|
+
return prewarmEffortJudge();
|
|
71
|
+
} catch {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
56
76
|
function lastText(messages, role) {
|
|
57
77
|
for (let i = (messages?.length || 0) - 1; i >= 0; i--) {
|
|
58
78
|
const message = messages[i];
|
|
@@ -15,7 +15,7 @@ import { filterModelVisibleSessionMessages } from './message-sanitize.mjs';
|
|
|
15
15
|
import { _getAgentLoop } from './runtime-loaders.mjs';
|
|
16
16
|
import { runAbortable, throwIfAborted } from '../../../../shared/abort-race.mjs';
|
|
17
17
|
import { applyTurnContextMeta, buildUserTurn, startProviderPrewarm, traceTurnContext } from './ask-turn-prepare.mjs';
|
|
18
|
-
import { rewindUnansweredPrompt } from './failed-turn-rewind.mjs';
|
|
18
|
+
import { retainedFailedTurnInput, rewindUnansweredPrompt } from './failed-turn-rewind.mjs';
|
|
19
19
|
import { buildAgentLoopOptions, trackedToolCallHook } from './ask-turn-loop-options.mjs';
|
|
20
20
|
import { _api_call_with_interrupt } from './ask-call-interrupt.mjs';
|
|
21
21
|
import { backfillFallbackSessionTitle } from './session-fallback-title.mjs';
|
|
@@ -25,6 +25,9 @@ import { backfillFallbackSessionTitle } from './session-fallback-title.mjs';
|
|
|
25
25
|
export async function prepareAskTurn({ sessionId, opened, input, cwdOverride, transcriptMeta }) {
|
|
26
26
|
const { turn, runtime, turnSignal, askGeneration, checkpoint, turnToken, startedAt, codexTurnId } = opened;
|
|
27
27
|
const session = turn.session;
|
|
28
|
+
const retained = input.retryTurnId
|
|
29
|
+
? retainedFailedTurnInput(session.messages, input.retryTurnId, input.retryAttemptId)
|
|
30
|
+
: null;
|
|
28
31
|
const provider = getProvider(session.provider);
|
|
29
32
|
// Register the live session object for synchronous close snapshots.
|
|
30
33
|
runtime.session = session;
|
|
@@ -44,7 +47,7 @@ export async function prepareAskTurn({ sessionId, opened, input, cwdOverride, tr
|
|
|
44
47
|
// A failed-turn retry resubmits the prompt the failure left unanswered;
|
|
45
48
|
// rewind that copy so the model sees the prompt once (an answered tail is
|
|
46
49
|
// kept and the retry continues from it).
|
|
47
|
-
if (input.retryFailedTurn === true) rewindUnansweredPrompt(session, input.prompt);
|
|
50
|
+
if (input.retryFailedTurn === true && !input.retryTurnId) rewindUnansweredPrompt(session, input.prompt);
|
|
48
51
|
if (session.sessionStartMetaInjected !== true && !hasUserConversationMessage(session.messages)) {
|
|
49
52
|
refreshSessionBp3Environment(session, effectiveCwd);
|
|
50
53
|
}
|
|
@@ -61,16 +64,37 @@ export async function prepareAskTurn({ sessionId, opened, input, cwdOverride, tr
|
|
|
61
64
|
});
|
|
62
65
|
const [autoEffort, userTurn] = await Promise.all([
|
|
63
66
|
autoEffortPending,
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
67
|
+
retained
|
|
68
|
+
? (() => {
|
|
69
|
+
const historyMessages = filterModelVisibleSessionMessages(session.messages.slice(0, retained.index));
|
|
70
|
+
const { completion, ...previousTranscript } = retained.message.meta.transcript;
|
|
71
|
+
const userTurnMessage = {
|
|
72
|
+
...retained.message,
|
|
73
|
+
meta: {
|
|
74
|
+
...retained.message.meta,
|
|
75
|
+
transcript: {
|
|
76
|
+
...previousTranscript,
|
|
77
|
+
...transcriptMeta,
|
|
78
|
+
messageId: previousTranscript.messageId,
|
|
79
|
+
previousCompletions: [
|
|
80
|
+
...(previousTranscript.previousCompletions || []),
|
|
81
|
+
{ ...completion, at: completion.at ?? previousTranscript.at },
|
|
82
|
+
],
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
return { historyMessages, userTurnMessage, outgoing: [...historyMessages, userTurnMessage] };
|
|
87
|
+
})()
|
|
88
|
+
: buildUserTurn({
|
|
89
|
+
session,
|
|
90
|
+
prompt: input.prompt,
|
|
91
|
+
context: input.context,
|
|
92
|
+
explicitPrefetch: input.explicitPrefetch,
|
|
93
|
+
turnSignal,
|
|
94
|
+
transcriptMeta,
|
|
95
|
+
turnPromptSource: input.promptSource,
|
|
96
|
+
effortConfiguration: null,
|
|
97
|
+
}),
|
|
74
98
|
wireRoutePending,
|
|
75
99
|
]);
|
|
76
100
|
const turnEffort = autoEffort?.applied ? autoEffort.effort : session.effort || null;
|
|
@@ -163,6 +187,7 @@ export async function prepareAskTurn({ sessionId, opened, input, cwdOverride, tr
|
|
|
163
187
|
deferredToolDelta: userTurn.deferredToolDelta,
|
|
164
188
|
goalReminder: userTurn.goalReminder,
|
|
165
189
|
workspaceNotice: userTurn.workspaceNotice,
|
|
190
|
+
setupNotice: userTurn.setupNotice,
|
|
166
191
|
};
|
|
167
192
|
}
|
|
168
193
|
|
|
@@ -186,7 +211,7 @@ export async function runAskAgentLoop({
|
|
|
186
211
|
session.toolApprovalHook = askOpts.onToolApproval;
|
|
187
212
|
}
|
|
188
213
|
try {
|
|
189
|
-
if (!input.promptSource) {
|
|
214
|
+
if (!input.promptSource && !input.retryTurnId) {
|
|
190
215
|
const applied = await prepareExplicitSkills(input.prompt, outgoing, session, {
|
|
191
216
|
cwd: effectiveCwd,
|
|
192
217
|
signal: turnSignal,
|
|
@@ -17,6 +17,31 @@ import {
|
|
|
17
17
|
import { _getRuntimeEntry, markSessionCancelled, markSessionError } from './runtime-liveness.mjs';
|
|
18
18
|
import { SessionClosedError } from './session-errors.mjs';
|
|
19
19
|
import { clearTurnCheckpoint } from './turn-checkpoint.mjs';
|
|
20
|
+
import { attachFailedTurnCompletion } from './ask-turn-settle.mjs';
|
|
21
|
+
import { turnFailureRecord } from '../turn-failure.mjs';
|
|
22
|
+
import { transcriptRouteMetadataFields } from '../../../../shared/transcript-metadata.mjs';
|
|
23
|
+
|
|
24
|
+
/** The durable end of a failed turn: the live turndone's status, reason and
|
|
25
|
+
* quota stop, so a reopened session renders the same failure. */
|
|
26
|
+
function failedTurnCompletion({ session, err, transcriptMeta, askStartedAt }) {
|
|
27
|
+
const raw = transcriptMeta && typeof transcriptMeta === 'object' ? transcriptMeta : {};
|
|
28
|
+
const route = { provider: session?.provider || raw.provider, model: session?.model || raw.modelId };
|
|
29
|
+
const { errorKind, quota, detail, errorDetails } = turnFailureRecord(err, route);
|
|
30
|
+
const startedAt = Number(raw.at || askStartedAt || Date.now());
|
|
31
|
+
return {
|
|
32
|
+
status: 'failed',
|
|
33
|
+
attemptId: raw.attemptId || globalThis.crypto.randomUUID(),
|
|
34
|
+
at: startedAt,
|
|
35
|
+
verb: typeof raw.completionVerb === 'string' && raw.completionVerb ? raw.completionVerb : 'Thought',
|
|
36
|
+
elapsedMs: Math.max(0, Date.now() - startedAt),
|
|
37
|
+
...(typeof raw.checkpointId === 'string' && raw.checkpointId ? { checkpointId: raw.checkpointId } : {}),
|
|
38
|
+
...transcriptRouteMetadataFields(raw),
|
|
39
|
+
...(detail ? { detail } : {}),
|
|
40
|
+
...(errorDetails ? { errorDetails } : {}),
|
|
41
|
+
errorKind,
|
|
42
|
+
...(quota ? { quota } : {}),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
20
45
|
|
|
21
46
|
/** Durable failure identity: every surfaced (non-cancel) turn error logs ONE
|
|
22
47
|
* structured line to stderr — the shard host mirrors it into daemon.log — so
|
|
@@ -118,6 +143,8 @@ async function finalizeCancelledTurn({
|
|
|
118
143
|
* @param {number} input.generation the ask generation every save is scoped to
|
|
119
144
|
* @param {string} input.turnCheckpointToken
|
|
120
145
|
* @param {object} input.runtime the session's runtime entry at turn start
|
|
146
|
+
* @param {object} [input.transcriptMeta] the caller's raw transcript metadata
|
|
147
|
+
* @param {number} [input.askStartedAt]
|
|
121
148
|
*/
|
|
122
149
|
export async function finalizeAskTurnFailure({
|
|
123
150
|
sessionId,
|
|
@@ -129,9 +156,13 @@ export async function finalizeAskTurnFailure({
|
|
|
129
156
|
generation,
|
|
130
157
|
turnCheckpointToken,
|
|
131
158
|
runtime,
|
|
159
|
+
transcriptMeta = null,
|
|
160
|
+
askStartedAt = 0,
|
|
132
161
|
}) {
|
|
133
162
|
checkpoint.stop();
|
|
134
163
|
const session = turn.session;
|
|
164
|
+
const recordFailure = () =>
|
|
165
|
+
attachFailedTurnCompletion(session.messages, failedTurnCompletion({ session, err, transcriptMeta, askStartedAt }));
|
|
135
166
|
// Cancellation/error paths bypass the commit point; drop the live-turn
|
|
136
167
|
// alias so contextStatus() stops estimating from the stale in-flight array
|
|
137
168
|
// once the turn unwinds.
|
|
@@ -187,6 +218,7 @@ export async function finalizeAskTurnFailure({
|
|
|
187
218
|
let errorStateDurable = false;
|
|
188
219
|
if (preserveProviderPartial && session && interruption.hasResponseStarted()) {
|
|
189
220
|
const finalized = prepareCloseSnapshot('provider-error');
|
|
221
|
+
if (finalized.responsePreserved) recordFailure();
|
|
190
222
|
errorStateDurable = await persistFinalizedSession({
|
|
191
223
|
session,
|
|
192
224
|
sessionId,
|
|
@@ -208,6 +240,7 @@ export async function finalizeAskTurnFailure({
|
|
|
208
240
|
);
|
|
209
241
|
const promptPersisted = compactPersist.settled && compactPersist.value === true;
|
|
210
242
|
if (promptPersisted) {
|
|
243
|
+
recordFailure();
|
|
211
244
|
errorStateDurable = await persistFinalizedSession({
|
|
212
245
|
session,
|
|
213
246
|
sessionId,
|
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
suffixUserTurnReminders,
|
|
18
18
|
buildCurrentTimeBlock,
|
|
19
19
|
snapshotPendingWorkspaceNotice,
|
|
20
|
+
snapshotPendingSetupNotice,
|
|
20
21
|
} from './prompt-utils.mjs';
|
|
21
22
|
import { codexWireSendOpts } from './session-id.mjs';
|
|
22
23
|
import { _tryBridgeExplicitPrefetch } from './prefetch-bridge.mjs';
|
|
@@ -177,8 +178,11 @@ export async function buildUserTurn({
|
|
|
177
178
|
// A mid-conversation working-folder change: the system prompt keeps its
|
|
178
179
|
// old root (cache intact) and the new folder's facts ride this turn.
|
|
179
180
|
const workspaceNotice = snapshotPendingWorkspaceNotice(session);
|
|
181
|
+
// What preparing a new worktree linked, installed, ran, failed or skipped.
|
|
182
|
+
const setupNotice = snapshotPendingSetupNotice(session);
|
|
180
183
|
const reminderBlock = [
|
|
181
184
|
workspaceNotice?.content || '',
|
|
185
|
+
setupNotice?.content || '',
|
|
182
186
|
currentTimeBlock ? `<system-reminder>\n# Current Time\n${currentTimeBlock}\n</system-reminder>` : '',
|
|
183
187
|
deferredToolDelta?.content || '',
|
|
184
188
|
goalReminder?.content || '',
|
|
@@ -206,6 +210,7 @@ export async function buildUserTurn({
|
|
|
206
210
|
deferredToolDelta,
|
|
207
211
|
goalReminder,
|
|
208
212
|
workspaceNotice,
|
|
213
|
+
setupNotice,
|
|
209
214
|
userTurnMessage,
|
|
210
215
|
outgoing: [...historyMessages, userTurnMessage],
|
|
211
216
|
};
|