mixdog 1.2.2 → 1.2.4
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/README.md +18 -0
- package/package.json +2 -1
- package/scripts/gate-local.mjs +6 -4
- package/scripts/lib/gate-scheduler.mjs +29 -11
- package/scripts/probe-provider-catalog.mjs +31 -0
- package/scripts/provider-pingpong-live.mjs +599 -0
- package/scripts/session-sweep.mjs +5 -25
- package/src/agents/advisor/AGENT.md +1 -1
- package/src/agents/advisor/agent.json +1 -1
- 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 +11 -1
- package/src/defaults/skills/image/SKILL.md +21 -23
- package/src/defaults/skills/setup/SKILL.md +6 -1
- package/src/defaults/skills/setup/references/actions.md +44 -22
- package/src/defaults/skills/setup/references/surfaces.md +10 -8
- package/src/headless-exec.mjs +15 -8
- package/src/lib/keychain-cjs.cjs +20 -15
- package/src/output-styles/common.md +11 -10
- package/src/rules/agent/AGENT.md +6 -4
- package/src/rules/lead/LEAD.md +7 -9
- 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/agent-trace-io.mjs +92 -61
- package/src/runtime/agent/orchestrator/cache-mtime.mjs +10 -1
- package/src/runtime/agent/orchestrator/config-providers-merge.mjs +7 -0
- package/src/runtime/agent/orchestrator/config.mjs +5 -0
- package/src/runtime/agent/orchestrator/context/collect.mjs +1 -0
- package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +26 -7
- package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +112 -7
- 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-api-request.mjs +48 -20
- package/src/runtime/agent/orchestrator/providers/anthropic-error-contract.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens.mjs +24 -17
- package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +9 -9
- 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 +31 -15
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-blocks.mjs +20 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-delta.mjs +15 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-start.mjs +11 -4
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/message-events.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events.mjs +12 -5
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-outcome.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-state.mjs +14 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +9 -0
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +10 -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 +131 -9
- package/src/runtime/agent/orchestrator/providers/antigravity-response.mjs +29 -10
- package/src/runtime/agent/orchestrator/providers/antigravity-retry-policy.mjs +125 -8
- package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +12 -62
- package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +117 -41
- package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +117 -72
- package/src/runtime/agent/orchestrator/providers/compat-request-policy.mjs +78 -2
- package/src/runtime/agent/orchestrator/providers/cursor-auth.mjs +39 -5
- 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 +42 -11
- package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-messages.mjs +109 -6
- package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +17 -4
- package/src/runtime/agent/orchestrator/providers/cursor.mjs +22 -2
- package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +73 -7
- package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +75 -6
- package/src/runtime/agent/orchestrator/providers/custom-reasoning.mjs +34 -7
- package/src/runtime/agent/orchestrator/providers/custom-tool-wire.mjs +32 -6
- package/src/runtime/agent/orchestrator/providers/deepseek.mjs +67 -0
- package/src/runtime/agent/orchestrator/providers/effort-configuration.mjs +29 -5
- package/src/runtime/agent/orchestrator/providers/gemini-cache-policy.mjs +11 -4
- package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +36 -13
- package/src/runtime/agent/orchestrator/providers/gemini-error-contract.mjs +101 -11
- package/src/runtime/agent/orchestrator/providers/gemini-request-body.mjs +41 -5
- 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 +19 -14
- package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +371 -41
- package/src/runtime/agent/orchestrator/providers/gemini-sdk-request.mjs +1 -2
- package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +97 -49
- package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +81 -10
- package/src/runtime/agent/orchestrator/providers/gemini.mjs +35 -8
- package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/lib/action-input-contract.mjs +60 -0
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-native-blocks.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +253 -42
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-server-tool-usage.mjs +18 -0
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-system-blocks.mjs +27 -6
- package/src/runtime/agent/orchestrator/providers/lib/claude-bridge-schema.mjs +392 -0
- package/src/runtime/agent/orchestrator/providers/lib/inclusive-usage.mjs +54 -0
- package/src/runtime/agent/orchestrator/providers/lib/origin-bound-fetch.mjs +16 -0
- package/src/runtime/agent/orchestrator/providers/lib/request-compression.mjs +86 -0
- package/src/runtime/agent/orchestrator/providers/lib/responses-terminal-fields.mjs +11 -0
- package/src/runtime/agent/orchestrator/providers/lib/usage-primitives.mjs +8 -0
- package/src/runtime/agent/orchestrator/providers/lib/wire-pairing.mjs +50 -22
- package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +133 -21
- package/src/runtime/agent/orchestrator/providers/mimo-oauth-profile.mjs +13 -15
- package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/model-proxy-channel.d.mts +1 -1
- package/src/runtime/agent/orchestrator/providers/model-proxy-channel.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/model-proxy-provider.mjs +92 -16
- package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +13 -13
- package/src/runtime/agent/orchestrator/providers/openai-codex-metadata.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +133 -62
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/chunk-events.mjs +35 -14
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-result.mjs +5 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +39 -7
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/tool-call-acc.mjs +2 -9
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +5 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-error-contract.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +84 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-options.mjs +47 -25
- package/src/runtime/agent/orchestrator/providers/openai-compat-presets.mjs +5 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-reasoning-field.mjs +155 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +40 -24
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +63 -25
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-head-parity.json +2901 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-parity.fixtures.mjs +183 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +87 -6
- package/src/runtime/agent/orchestrator/providers/openai-compat-retry-profile.mjs +51 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-trace.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +103 -26
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +23 -4
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +11 -6
- package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +17 -2
- package/src/runtime/agent/orchestrator/providers/openai-direct-request.mjs +15 -23
- 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/output-items.mjs +23 -10
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/terminal-frames.mjs +28 -5
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events.mjs +10 -0
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-items.mjs +18 -7
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-outcome.mjs +4 -0
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-state.mjs +5 -0
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/text-relay.mjs +9 -1
- package/src/runtime/agent/orchestrator/providers/openai-model-capabilities.mjs +80 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth-dispatch.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +7 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +72 -24
- package/src/runtime/agent/orchestrator/providers/openai-responses-payload-parity.fixture.json +323 -0
- package/src/runtime/agent/orchestrator/providers/openai-responses-payload.mjs +50 -16
- package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +7 -19
- package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/refusals.mjs +60 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/tool-calls.mjs +51 -36
- package/src/runtime/agent/orchestrator/providers/openai-ws-response-state.mjs +30 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +12 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream/terminal-frames.mjs +25 -6
- package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +18 -9
- package/src/runtime/agent/orchestrator/providers/opencode-go-gemini.mjs +181 -0
- package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +78 -70
- package/src/runtime/agent/orchestrator/providers/openrouter.mjs +74 -0
- package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +150 -10
- package/src/runtime/agent/orchestrator/providers/registry.mjs +13 -2
- package/src/runtime/agent/orchestrator/providers/retry-classification.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/transport-scope.d.mts +6 -0
- package/src/runtime/agent/orchestrator/providers/transport-scope.mjs +28 -0
- package/src/runtime/agent/orchestrator/providers/wire-gateway.mjs +164 -0
- package/src/runtime/agent/orchestrator/providers/wire-route.mjs +522 -0
- package/src/runtime/agent/orchestrator/providers/xai-tool-search-head-parity.json +1131 -0
- package/src/runtime/agent/orchestrator/providers/xai-tool-search.fixtures.mjs +195 -0
- package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +104 -0
- package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +8 -6
- package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +24 -0
- package/src/runtime/agent/orchestrator/runtime-core/effort.mjs +15 -0
- 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/provider-request-snapshot.mjs +7 -3
- package/src/runtime/agent/orchestrator/runtime-core/session-title.mjs +21 -1
- package/src/runtime/agent/orchestrator/runtime-core/skill-tool-loading.mjs +16 -3
- package/src/runtime/agent/orchestrator/runtime-core/tool-bridge-contract.mjs +6 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +526 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +3 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-schema.mjs +10 -7
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +178 -71
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +102 -12
- package/src/runtime/agent/orchestrator/runtime-core/tool-exposure.mjs +96 -0
- 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 +5 -11
- package/src/runtime/agent/orchestrator/session/catalog-db/worker.mjs +6 -22
- package/src/runtime/agent/orchestrator/session/compact/constants.mjs +3 -2
- package/src/runtime/agent/orchestrator/session/compact/messages.mjs +16 -93
- package/src/runtime/agent/orchestrator/session/compact/runner.mjs +16 -2
- package/src/runtime/agent/orchestrator/session/compact/summary-anchor.mjs +5 -0
- package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +148 -0
- package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/context-tool-schema.mjs +17 -2
- package/src/runtime/agent/orchestrator/session/context-utils.mjs +8 -4
- 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 +3 -2
- package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +6 -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 +89 -1
- package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +56 -0
- package/src/runtime/agent/orchestrator/session/loop/deferred-call-through.mjs +18 -8
- package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +1 -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 +24 -10
- package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +135 -0
- package/src/runtime/agent/orchestrator/session/loop/request-boundary.mjs +31 -4
- package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +76 -0
- package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +67 -20
- package/src/runtime/agent/orchestrator/session/loop/step-auto-effort.mjs +10 -10
- package/src/runtime/agent/orchestrator/session/loop/tool-call-resolution.mjs +95 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-classify.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +30 -3
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +29 -5
- package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +15 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +147 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +7 -5
- 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 +23 -2
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-commit.mjs +34 -12
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +54 -13
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-failure.mjs +33 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +57 -25
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +11 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +22 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +57 -13
- package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +8 -0
- 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 +231 -16
- 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 +47 -17
- package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +26 -4
- package/src/runtime/agent/orchestrator/session/manager/session-fallback-title.mjs +82 -0
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +36 -35
- package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +29 -13
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +6 -3
- package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-recovery.mjs +45 -0
- package/src/runtime/agent/orchestrator/session/manager.mjs +4 -10
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/send-instrumentation.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +17 -1
- package/src/runtime/agent/orchestrator/session/side-question-store.mjs +96 -0
- package/src/runtime/agent/orchestrator/session/side-question.mjs +197 -0
- package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +22 -15
- 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/live-state.mjs +23 -0
- 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 +44 -37
- package/src/runtime/agent/orchestrator/session/store/session-observers.mjs +4 -2
- 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 -21
- 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 +4 -2
- package/src/runtime/agent/orchestrator/session/store-agent-worker-pool.mjs +5 -8
- package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +136 -196
- package/src/runtime/agent/orchestrator/session/store-summary-archived-agent.mjs +34 -15
- package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +53 -115
- package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +8 -0
- package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +10 -1
- 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 +17 -10
- package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +9 -20
- package/src/runtime/agent/orchestrator/session/store.mjs +22 -19
- package/src/runtime/agent/orchestrator/session/tool-batch/execute-call.mjs +12 -12
- package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +38 -14
- package/src/runtime/agent/orchestrator/session/tool-batch/pre-dispatch.mjs +15 -4
- package/src/runtime/agent/orchestrator/session/tool-batch/record-outcome.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/tool-batch/state.mjs +7 -1
- package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/tool-schema-rejection.mjs +79 -0
- 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/bash-policy-scan.mjs +8 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/command-preflight.mjs +3 -3
- 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/bash-tool.mjs +4 -1
- package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +218 -20
- 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 +247 -49
- 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/runtime-capabilities.mjs +23 -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/dispatch/root-resolution.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +1 -1
- 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/agent/orchestrator/tools/patch/ui-diff.mjs +73 -39
- package/src/runtime/agent/orchestrator/tools/progress-message.mjs +18 -1
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +7 -4
- package/src/runtime/agent/orchestrator/tools/shell-exec-policy.mjs +88 -12
- package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +2 -0
- 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 +219 -196
- 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 +208 -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/index.mjs +1 -0
- package/src/runtime/memory/lib/http-router/ingest-routes.mjs +22 -1
- package/src/runtime/memory/lib/ingest/transcript-offsets.mjs +2 -0
- package/src/runtime/memory/lib/ingest/transcript-rows.mjs +1 -0
- package/src/runtime/memory/lib/pg/adapter.mjs +98 -1
- package/src/runtime/memory/lib/pg/process.mjs +36 -33
- package/src/runtime/memory/lib/pg/run-child.mjs +49 -0
- package/src/runtime/memory/lib/pg/supervisor.mjs +112 -4
- package/src/runtime/memory/lib/runtime-fetcher.mjs +12 -13
- package/src/runtime/memory/lib/transcript-ingest.mjs +14 -0
- package/src/runtime/office/README.md +1 -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/html-document-author.mjs +2 -0
- package/src/runtime/office/authoring/pdf-html-runner.mjs +1 -1
- package/src/runtime/office/authoring/pptx-contact-sheet.mjs +2 -0
- package/src/runtime/office/authoring/pptx-html-measure.mjs +3 -1
- package/src/runtime/office/authoring/pptx-html-runner.mjs +2 -0
- package/src/runtime/office/authoring/xlsx-html-runner.mjs +3 -1
- package/src/runtime/office/core/office-actions-read.mjs +3 -0
- package/src/runtime/office/core/office-render-preview.mjs +2 -0
- package/src/runtime/office/core/office-session-dispatch.mjs +7 -0
- package/src/runtime/office/core/office-sessionless-actions.mjs +8 -0
- package/src/runtime/office/core/office-sessions.mjs +5 -0
- package/src/runtime/office/core/office-transactions.mjs +3 -0
- package/src/runtime/office/core/office-write-ledger.mjs +94 -0
- package/src/runtime/office/design/library/templates/mixdog-executive.mixdog-edit.pptx +0 -0
- package/src/runtime/office/index.mjs +29 -0
- package/src/runtime/office/pdf/pdf-analysis.mjs +0 -68
- package/src/runtime/office/pdf/pdf-edit-document.mjs +2 -0
- package/src/runtime/office/pdf/pdf-render.mjs +23 -7
- package/src/runtime/office/pdf/pdf-security.mjs +2 -0
- package/src/runtime/office/portable/portable-opc.mjs +4 -1
- package/src/runtime/office/quality/visual-diff.mjs +2 -0
- 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-file-read.mjs +13 -0
- package/src/runtime/shared/bounded-line-diff.mjs +191 -0
- package/src/runtime/shared/browser-launch.mjs +15 -0
- package/src/runtime/shared/buffered-appender.mjs +18 -0
- package/src/runtime/shared/config.mjs +78 -18
- package/src/runtime/shared/err-text.mjs +48 -4
- package/src/runtime/shared/file-lock.mjs +6 -5
- package/src/runtime/shared/file-permissions.d.mts +6 -1
- package/src/runtime/shared/file-permissions.mjs +54 -6
- package/src/runtime/shared/llm/anthropic-betas.mjs +1 -2
- package/src/runtime/shared/llm/anthropic-effort.mjs +6 -0
- package/src/runtime/shared/llm/provider-model-identities.mjs +1 -0
- package/src/runtime/shared/llm/usage-accounting.mjs +5 -2
- package/src/runtime/shared/llm/usage-ledger-rollup.mjs +3 -0
- package/src/runtime/shared/loopback-listener.mjs +9 -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 +8 -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/review-diff.mjs +52 -0
- package/src/runtime/shared/session-sidebar-host.d.mts +4 -0
- package/src/runtime/shared/session-sidebar-host.mjs +38 -0
- package/src/runtime/shared/slow-span.mjs +121 -0
- package/src/runtime/shared/statusline/statusline-segments.mjs +52 -6
- package/src/runtime/shared/tool-card-model/card-header.mjs +7 -1
- package/src/runtime/shared/tool-card-model/generic-detail.mjs +39 -5
- package/src/runtime/shared/tool-card-model.mjs +5 -2
- package/src/runtime/shared/tool-output-budget.mjs +2 -0
- package/src/runtime/shared/tool-output-limit.mjs +4 -0
- package/src/runtime/shared/tool-primitives.mjs +13 -0
- package/src/runtime/shared/tool-result-summary.mjs +22 -1
- package/src/runtime/shared/tool-status.mjs +3 -2
- package/src/runtime/shared/tool-surface.mjs +20 -6
- package/src/runtime/shared/tool-work-units.mjs +54 -11
- 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/purge.mjs +74 -0
- package/src/runtime/shared/transcript-writer/transcript-file.mjs +10 -1
- package/src/runtime/shared/transcript-writer.mjs +24 -6
- package/src/runtime/shared/turn-changes.mjs +269 -100
- package/src/runtime/shared/turn-review-reply.mjs +8 -39
- package/src/runtime/shared/turn-snapshot-store.mjs +19 -108
- package/src/runtime/shared/turn-snapshot.mjs +865 -683
- package/src/runtime/shared/turn-worktree-snapshot.mjs +183 -255
- package/src/runtime/shared/user-data-guard.mjs +262 -49
- 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 +533 -0
- package/src/runtime/shared/worktrees/contract.mjs +60 -0
- package/src/runtime/shared/worktrees/dependencies.mjs +456 -0
- package/src/runtime/shared/worktrees/file-recovery.mjs +84 -0
- package/src/runtime/shared/worktrees/git-head.mjs +214 -0
- package/src/runtime/shared/worktrees/git.mjs +8 -3
- 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 +525 -31
- package/src/runtime/shared/worktrees/merge.mjs +31 -21
- package/src/runtime/shared/worktrees/owner.mjs +2 -1
- package/src/runtime/shared/worktrees/paths.d.mts +6 -0
- 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 +57 -20
- package/src/runtime/terminal-bridge/tool-defs.mjs +13 -6
- package/src/runtime/tidy/apply.mjs +47 -2
- package/src/runtime/tidy/run-engines.mjs +11 -5
- package/src/session-runtime/agent-tool-routing.mjs +19 -13
- package/src/session-runtime/boot/apis.mjs +20 -6
- package/src/session-runtime/boot/config.mjs +2 -0
- package/src/session-runtime/boot/facade.mjs +4 -0
- package/src/session-runtime/boot/infrastructure.mjs +6 -1
- package/src/session-runtime/boot/session.mjs +3 -3
- package/src/session-runtime/boot/tools.mjs +7 -1
- package/src/session-runtime/conversation-import/service.mjs +1 -1
- package/src/session-runtime/cwd-plugins/cwd-apply.mjs +12 -5
- package/src/session-runtime/goal-facade-api.mjs +2 -2
- package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +91 -0
- package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -1
- package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +15 -5
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +137 -26
- package/src/session-runtime/internal-tool-executor.mjs +8 -2
- package/src/session-runtime/lifecycle/cold-heir.mjs +187 -0
- package/src/session-runtime/lifecycle/inheritance.mjs +71 -27
- package/src/session-runtime/lifecycle/session-catalog.mjs +25 -18
- package/src/session-runtime/lifecycle/session-switch/resume.mjs +6 -0
- package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +36 -48
- 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 +70 -14
- package/src/session-runtime/lifecycle-api.mjs +1 -0
- package/src/session-runtime/mcp-glue/connect.mjs +17 -5
- 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 +116 -36
- 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-usage.mjs +51 -0
- package/src/session-runtime/native-web-search.mjs +19 -9
- package/src/session-runtime/new-session-config.mjs +4 -2
- package/src/session-runtime/provider-auth/login.mjs +4 -0
- 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/resource-scope-decorate.mjs +10 -3
- 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/runtime-review-api.mjs +8 -2
- 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/index-write-queue.mjs +81 -20
- 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/forgotten-leads.mjs +29 -0
- package/src/session-runtime/services/agent-tool/lead-worker-index/index-file.mjs +1 -1
- 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 +82 -13
- 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 +18 -10
- 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/row-store.mjs +10 -1
- package/src/session-runtime/services/agent-tool/worker-index.mjs +74 -15
- package/src/session-runtime/services/agent-tool.mjs +7 -0
- package/src/session-runtime/services/agent-watchdog-registry.mjs +2 -0
- package/src/session-runtime/services/channel-admin.mjs +19 -3
- package/src/session-runtime/services/memory-runtime-proxy/calls.mjs +4 -0
- package/src/session-runtime/services/memory-runtime-proxy.mjs +1 -0
- package/src/session-runtime/services/provider-admin.mjs +158 -15
- 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-purge.mjs +32 -0
- package/src/session-runtime/session-transcript.mjs +4 -5
- package/src/session-runtime/session-turn-api.mjs +17 -14
- package/src/session-runtime/settings-builtin-tools-api.mjs +18 -6
- package/src/session-runtime/setup-tool/executor.mjs +57 -9
- package/src/session-runtime/setup-tool/extended-actions.mjs +86 -6
- package/src/session-runtime/setup-tool/settings-contract.mjs +18 -3
- package/src/session-runtime/setup-tool/tool-defs.mjs +25 -4
- package/src/session-runtime/skills-api.mjs +3 -5
- package/src/session-runtime/tool-policy-refresh.mjs +83 -32
- package/src/session-runtime/tool-surface.mjs +5 -1
- package/src/session-runtime/turn/agent-ops.mjs +49 -2
- package/src/session-runtime/turn/compaction-gate.mjs +25 -0
- package/src/session-runtime/turn/session-ops.mjs +7 -5
- package/src/session-runtime/turn/side-question-ops.mjs +19 -0
- package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +7 -1
- package/src/session-runtime/turn/turn-run/turn-prepare.mjs +12 -3
- package/src/session-runtime/turn/turn-run/turn-settle.mjs +18 -2
- package/src/session-runtime/turn/turn-run/turn-timing.mjs +4 -3
- package/src/session-runtime/turn/turn-run.mjs +26 -45
- package/src/session-runtime/usage-stats-api.mjs +46 -11
- 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 +35 -41
- package/src/session-runtime/workspace/transition-steps.mjs +215 -116
- package/src/session-runtime/workspace/transitions.mjs +428 -73
- package/src/standalone/channel-transport.mjs +3 -4
- package/src/standalone/daemon-agent-control.mjs +9 -1
- package/src/standalone/daemon-desktop-runtime.mjs +32 -1
- package/src/standalone/daemon-local-session-bridge.mjs +14 -1
- package/src/standalone/daemon-owner.mjs +17 -4
- package/src/standalone/daemon-pg-stop.mjs +49 -0
- package/src/standalone/daemon-session-control.mjs +88 -0
- package/src/standalone/daemon-stop-budget.d.mts +2 -0
- package/src/standalone/daemon-stop-budget.mjs +18 -0
- package/src/standalone/daemon-stored-session-views.mjs +25 -3
- package/src/standalone/daemon-telemetry.mjs +19 -0
- package/src/standalone/daemon.mjs +63 -1
- package/src/standalone/desktop-service-registry.mjs +5 -0
- package/src/standalone/local-session-runtime.mjs +80 -30
- package/src/standalone/session-client.mjs +42 -0
- package/src/standalone/session-protocol.mjs +14 -0
- package/src/standalone/session-proxy/projection.mjs +41 -4
- package/src/standalone/session-runtime-inline-host/boot-loaders.mjs +15 -1
- package/src/standalone/session-runtime-inline-host.mjs +3 -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-action.mjs +18 -3
- 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-service-api.mjs +6 -1
- package/src/standalone/session-state-patch.d.mts +2 -1
- package/src/standalone/session-state-patch.mjs +41 -1
- package/src/standalone/session-tool-output.mjs +82 -0
- package/src/tui/App.jsx +25 -0
- package/src/tui/app/app-view/floating-panel.jsx +26 -1
- package/src/tui/app/app-view.jsx +2 -1
- package/src/tui/app/btw-controller.mjs +118 -0
- package/src/tui/app/create-app-pickers.mjs +2 -0
- 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/shell-layout/row-budgets.mjs +11 -1
- package/src/tui/app/shell-layout/surfaces.mjs +3 -1
- package/src/tui/app/slash-commands.mjs +19 -3
- package/src/tui/app/slash-dispatch/session-commands.mjs +68 -6
- package/src/tui/app/use-global-key-input/approval-shortcut.mjs +12 -0
- package/src/tui/app/use-global-key-input.mjs +5 -12
- package/src/tui/app/use-prompt-handlers.mjs +11 -0
- package/src/tui/components/BtwPanel.jsx +53 -0
- package/src/tui/components/QuestionPanel.jsx +275 -0
- package/src/tui/components/Spinner.jsx +4 -0
- package/src/tui/components/SpinnerByline.jsx +21 -2
- package/src/tui/components/question-panel-model.mjs +156 -0
- package/src/tui/components/status-line/local-line.mjs +10 -2
- package/src/tui/dist/index.mjs +2897 -1722
- package/src/tui/session/active-tool-summary.mjs +1 -1
- package/src/tui/session/context-state.mjs +4 -5
- 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 +14 -10
- package/src/tui/session/session-api/controls.mjs +14 -2
- package/src/tui/session/session-api/integrations.mjs +9 -2
- package/src/tui/session/session-api/lifecycle/dispose.mjs +3 -9
- package/src/tui/session/session-api/lifecycle/resume.mjs +2 -7
- package/src/tui/session/session-api/lifecycle.mjs +14 -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 +9 -3
- package/src/tui/session/session-api/worktree.mjs +3 -2
- package/src/tui/session/session-api.mjs +1 -0
- 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 +20 -8
- package/src/tui/session/transcript-spill.mjs +14 -7
- 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 +179 -32
- package/src/tui/session/turn.mjs +50 -36
- 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/workflows/default/WORKFLOW.md +3 -1
- 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 -246
- 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
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
// (runAskAgentLoop). Provider-not-available and trim failures throw here so
|
|
6
6
|
// the caller marks the session errored instead of leaving stage='connecting'.
|
|
7
7
|
import { getProvider } from '../../providers/registry.mjs';
|
|
8
|
+
import { pinSessionWireRoute } from '../../providers/wire-route.mjs';
|
|
8
9
|
import { notifySkillsApplied, prepareExplicitSkills, recordAppliedSkills } from '../explicit-skills.mjs';
|
|
9
10
|
import { prepareTurnEffortConfiguration } from '../../providers/effort-configuration.mjs';
|
|
10
11
|
import { resolveTurnAutoEffort, turnStepAutoEffort } from './ask-turn-auto-effort.mjs';
|
|
@@ -14,19 +15,27 @@ import { filterModelVisibleSessionMessages } from './message-sanitize.mjs';
|
|
|
14
15
|
import { _getAgentLoop } from './runtime-loaders.mjs';
|
|
15
16
|
import { runAbortable, throwIfAborted } from '../../../../shared/abort-race.mjs';
|
|
16
17
|
import { applyTurnContextMeta, buildUserTurn, startProviderPrewarm, traceTurnContext } from './ask-turn-prepare.mjs';
|
|
17
|
-
import { rewindUnansweredPrompt } from './failed-turn-rewind.mjs';
|
|
18
|
+
import { retainedFailedTurnInput, rewindUnansweredPrompt } from './failed-turn-rewind.mjs';
|
|
18
19
|
import { buildAgentLoopOptions, trackedToolCallHook } from './ask-turn-loop-options.mjs';
|
|
19
20
|
import { _api_call_with_interrupt } from './ask-call-interrupt.mjs';
|
|
21
|
+
import { backfillFallbackSessionTitle } from './session-fallback-title.mjs';
|
|
20
22
|
|
|
21
23
|
/** Resolves the provider, builds the user turn and pre-commits it; returns
|
|
22
24
|
* what the loop and the commit need from this preparation. */
|
|
23
25
|
export async function prepareAskTurn({ sessionId, opened, input, cwdOverride, transcriptMeta }) {
|
|
24
26
|
const { turn, runtime, turnSignal, askGeneration, checkpoint, turnToken, startedAt, codexTurnId } = opened;
|
|
25
27
|
const session = turn.session;
|
|
28
|
+
const retained = input.retryTurnId
|
|
29
|
+
? retainedFailedTurnInput(session.messages, input.retryTurnId, input.retryAttemptId)
|
|
30
|
+
: null;
|
|
26
31
|
const provider = getProvider(session.provider);
|
|
27
32
|
// Register the live session object for synchronous close snapshots.
|
|
28
33
|
runtime.session = session;
|
|
29
34
|
if (!provider) throw new Error(`Provider "${session.provider}" not available`);
|
|
35
|
+
// The session's wire is pinned before its first request (an existing
|
|
36
|
+
// session keeps the wire it started on); read from the history as the turn
|
|
37
|
+
// found it, awaited with the user turn below.
|
|
38
|
+
const wireRoutePending = pinSessionWireRoute(session, provider);
|
|
30
39
|
// The turn-level judgment runs while the rest of the turn is prepared; it
|
|
31
40
|
// reads the session as the turn found it (synchronously, on this call).
|
|
32
41
|
// The first request still carries its decision: it is awaited below,
|
|
@@ -38,7 +47,7 @@ export async function prepareAskTurn({ sessionId, opened, input, cwdOverride, tr
|
|
|
38
47
|
// A failed-turn retry resubmits the prompt the failure left unanswered;
|
|
39
48
|
// rewind that copy so the model sees the prompt once (an answered tail is
|
|
40
49
|
// kept and the retry continues from it).
|
|
41
|
-
if (input.retryFailedTurn === true) rewindUnansweredPrompt(session, input.prompt);
|
|
50
|
+
if (input.retryFailedTurn === true && !input.retryTurnId) rewindUnansweredPrompt(session, input.prompt);
|
|
42
51
|
if (session.sessionStartMetaInjected !== true && !hasUserConversationMessage(session.messages)) {
|
|
43
52
|
refreshSessionBp3Environment(session, effectiveCwd);
|
|
44
53
|
}
|
|
@@ -55,16 +64,38 @@ export async function prepareAskTurn({ sessionId, opened, input, cwdOverride, tr
|
|
|
55
64
|
});
|
|
56
65
|
const [autoEffort, userTurn] = await Promise.all([
|
|
57
66
|
autoEffortPending,
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
+
}),
|
|
98
|
+
wireRoutePending,
|
|
68
99
|
]);
|
|
69
100
|
const turnEffort = autoEffort?.applied ? autoEffort.effort : session.effort || null;
|
|
70
101
|
const effortConfiguration = prepareTurnEffortConfiguration(
|
|
@@ -107,6 +138,14 @@ export async function prepareAskTurn({ sessionId, opened, input, cwdOverride, tr
|
|
|
107
138
|
// user turn is introduced.
|
|
108
139
|
session.messages = filterModelVisibleSessionMessages(outgoing);
|
|
109
140
|
session.liveTurnMessages = outgoing;
|
|
141
|
+
// Name a titleless session from its first human prompt before the first
|
|
142
|
+
// save, so the title outlives any later compaction of the transcript. The
|
|
143
|
+
// earliest human turn already in the history wins; this turn's prompt is the
|
|
144
|
+
// fallback (runtime-injected turns carrying a promptSource never name it).
|
|
145
|
+
backfillFallbackSessionTitle(session, [
|
|
146
|
+
...historyMessages,
|
|
147
|
+
...(input.promptSource ? [] : [{ role: 'user', content: input.prompt }]),
|
|
148
|
+
]);
|
|
110
149
|
session.activeTurnCheckpoint = {
|
|
111
150
|
version: 1,
|
|
112
151
|
turnToken,
|
|
@@ -147,6 +186,8 @@ export async function prepareAskTurn({ sessionId, opened, input, cwdOverride, tr
|
|
|
147
186
|
beforeCount: historyMessages.length + 1,
|
|
148
187
|
deferredToolDelta: userTurn.deferredToolDelta,
|
|
149
188
|
goalReminder: userTurn.goalReminder,
|
|
189
|
+
workspaceNotice: userTurn.workspaceNotice,
|
|
190
|
+
setupNotice: userTurn.setupNotice,
|
|
150
191
|
};
|
|
151
192
|
}
|
|
152
193
|
|
|
@@ -170,7 +211,7 @@ export async function runAskAgentLoop({
|
|
|
170
211
|
session.toolApprovalHook = askOpts.onToolApproval;
|
|
171
212
|
}
|
|
172
213
|
try {
|
|
173
|
-
if (!input.promptSource) {
|
|
214
|
+
if (!input.promptSource && !input.retryTurnId) {
|
|
174
215
|
const applied = await prepareExplicitSkills(input.prompt, outgoing, session, {
|
|
175
216
|
cwd: effectiveCwd,
|
|
176
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,
|
|
@@ -18,6 +18,53 @@ const relay = (fn, ...args) => {
|
|
|
18
18
|
}
|
|
19
19
|
};
|
|
20
20
|
|
|
21
|
+
/**
|
|
22
|
+
* The callback-free send options that shape a turn's provider request (effort,
|
|
23
|
+
* model parameters, cache routing, continuation state, Codex wire identity and
|
|
24
|
+
* the session's provider cache settings). agentLoop's options spread them, and
|
|
25
|
+
* a /btw request built before any turn has run uses them as they are.
|
|
26
|
+
*/
|
|
27
|
+
export function buildRequestSendOptions({
|
|
28
|
+
sessionId,
|
|
29
|
+
session,
|
|
30
|
+
turnEffort,
|
|
31
|
+
effortConfiguration,
|
|
32
|
+
stepAutoEffort,
|
|
33
|
+
codexTurnId,
|
|
34
|
+
startedAtMs,
|
|
35
|
+
signal,
|
|
36
|
+
}) {
|
|
37
|
+
return {
|
|
38
|
+
effort: turnEffort,
|
|
39
|
+
effortConfiguration,
|
|
40
|
+
// { request, base } when each tool-result step is judged (step-auto-effort.mjs).
|
|
41
|
+
stepAutoEffort: stepAutoEffort || null,
|
|
42
|
+
fast: session.fast === true,
|
|
43
|
+
modelParameters: session.modelParameters || {},
|
|
44
|
+
selectedContextWindow: session.selectedContextWindow || session.contextWindow || null,
|
|
45
|
+
sessionId,
|
|
46
|
+
// Same projection compaction uses, so a session presents one identity on
|
|
47
|
+
// every request it makes.
|
|
48
|
+
...(codexWireSendOpts(session, { turnId: codexTurnId, startedAtMs }) || {}),
|
|
49
|
+
promptCacheKey: session.promptCacheKey || sessionId,
|
|
50
|
+
// Provider-scoped cache key (mixdog-codex, mixdog-claude…). Distinct
|
|
51
|
+
// from sessionId — providers that pool sockets per-session (openai-oauth
|
|
52
|
+
// WS) use sessionId as the pool bucket and providerCacheKey as the
|
|
53
|
+
// server-side prompt-cache shard so parallel callers don't collide on a
|
|
54
|
+
// mid-turn socket while still sharing prefix cache.
|
|
55
|
+
providerCacheKey: session.promptCacheKey || null,
|
|
56
|
+
signal,
|
|
57
|
+
providerState: session.providerState ?? undefined,
|
|
58
|
+
// The wire this session is pinned to (wire-route.mjs).
|
|
59
|
+
wireRoute: session.wireRoute ?? undefined,
|
|
60
|
+
session,
|
|
61
|
+
// Agent Runtime cache settings — merged last so session overrides don't
|
|
62
|
+
// get overridden by defaults. When session has no profile,
|
|
63
|
+
// providerCacheOpts is null and this spread is a no-op.
|
|
64
|
+
...(session.providerCacheOpts || {}),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
21
68
|
/**
|
|
22
69
|
* @param {object} input
|
|
23
70
|
* @param {string} input.sessionId
|
|
@@ -49,14 +96,6 @@ export function buildAgentLoopOptions({
|
|
|
49
96
|
// (ask-turn-steering-drain.mjs).
|
|
50
97
|
const drainSteering = createAskSteeringDrain({ sessionId, turn, askOpts });
|
|
51
98
|
return {
|
|
52
|
-
effort: turnEffort,
|
|
53
|
-
effortConfiguration,
|
|
54
|
-
// { request, base } when each tool-result step is judged (step-auto-effort.mjs).
|
|
55
|
-
stepAutoEffort: stepAutoEffort || null,
|
|
56
|
-
fast: session.fast === true,
|
|
57
|
-
modelParameters: session.modelParameters || {},
|
|
58
|
-
selectedContextWindow: session.selectedContextWindow || session.contextWindow || null,
|
|
59
|
-
sessionId,
|
|
60
99
|
onTextDelta: (chunk) => {
|
|
61
100
|
interruption.recordTextDelta(chunk);
|
|
62
101
|
checkpoint.schedule();
|
|
@@ -157,23 +196,16 @@ export function buildAgentLoopOptions({
|
|
|
157
196
|
relay(askOpts?.onSkillsApplied, names, detail);
|
|
158
197
|
},
|
|
159
198
|
notifyFn: optionalFn(askOpts?.notifyFn),
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
signal,
|
|
171
|
-
providerState: session.providerState ?? undefined,
|
|
172
|
-
session,
|
|
173
|
-
// Agent Runtime cache settings — merged last so session overrides don't
|
|
174
|
-
// get overridden by defaults. When session has no profile,
|
|
175
|
-
// providerCacheOpts is null and this spread is a no-op.
|
|
176
|
-
...(session.providerCacheOpts || {}),
|
|
199
|
+
...buildRequestSendOptions({
|
|
200
|
+
sessionId,
|
|
201
|
+
session,
|
|
202
|
+
turnEffort,
|
|
203
|
+
effortConfiguration,
|
|
204
|
+
stepAutoEffort,
|
|
205
|
+
codexTurnId,
|
|
206
|
+
startedAtMs,
|
|
207
|
+
signal,
|
|
208
|
+
}),
|
|
177
209
|
onStageChange: (stage, detail) => {
|
|
178
210
|
updateSessionStage(sessionId, stage);
|
|
179
211
|
relay(askOpts?.onStageChange, stage, detail);
|
|
@@ -16,6 +16,8 @@ import {
|
|
|
16
16
|
prefixUserTurnContent,
|
|
17
17
|
suffixUserTurnReminders,
|
|
18
18
|
buildCurrentTimeBlock,
|
|
19
|
+
snapshotPendingWorkspaceNotice,
|
|
20
|
+
snapshotPendingSetupNotice,
|
|
19
21
|
} from './prompt-utils.mjs';
|
|
20
22
|
import { codexWireSendOpts } from './session-id.mjs';
|
|
21
23
|
import { _tryBridgeExplicitPrefetch } from './prefetch-bridge.mjs';
|
|
@@ -173,7 +175,14 @@ export async function buildUserTurn({
|
|
|
173
175
|
// input intake: either can precede the previous turn's pause.
|
|
174
176
|
// This supplies context only; it never resumes the Goal.
|
|
175
177
|
const goalReminder = snapshotPendingGoalReminder(session, { includePaused: true });
|
|
178
|
+
// A mid-conversation working-folder change: the system prompt keeps its
|
|
179
|
+
// old root (cache intact) and the new folder's facts ride this turn.
|
|
180
|
+
const workspaceNotice = snapshotPendingWorkspaceNotice(session);
|
|
181
|
+
// What preparing a new worktree linked, installed, ran, failed or skipped.
|
|
182
|
+
const setupNotice = snapshotPendingSetupNotice(session);
|
|
176
183
|
const reminderBlock = [
|
|
184
|
+
workspaceNotice?.content || '',
|
|
185
|
+
setupNotice?.content || '',
|
|
177
186
|
currentTimeBlock ? `<system-reminder>\n# Current Time\n${currentTimeBlock}\n</system-reminder>` : '',
|
|
178
187
|
deferredToolDelta?.content || '',
|
|
179
188
|
goalReminder?.content || '',
|
|
@@ -200,6 +209,8 @@ export async function buildUserTurn({
|
|
|
200
209
|
historyMessages,
|
|
201
210
|
deferredToolDelta,
|
|
202
211
|
goalReminder,
|
|
212
|
+
workspaceNotice,
|
|
213
|
+
setupNotice,
|
|
203
214
|
userTurnMessage,
|
|
204
215
|
outgoing: [...historyMessages, userTurnMessage],
|
|
205
216
|
};
|
|
@@ -8,6 +8,7 @@ import { ingestSessionTurn } from '../../../../session-search/session-search-ing
|
|
|
8
8
|
import { persistedAssistantTranscriptMetadata } from '../../../../shared/transcript-metadata.mjs';
|
|
9
9
|
import { acknowledgePendingDeferredToolDelta } from '../../runtime-core/deferred-tool-delta.mjs';
|
|
10
10
|
import { acknowledgePendingGoalReminder } from '../../runtime-core/goal-reminder.mjs';
|
|
11
|
+
import { acknowledgePendingSetupNotice, acknowledgePendingWorkspaceNotice } from './prompt-utils.mjs';
|
|
11
12
|
import {
|
|
12
13
|
finalizePendingMessageDelivery,
|
|
13
14
|
drainPendingMessages,
|
|
@@ -42,6 +43,8 @@ export function attachAssistantTranscriptCompletion(messages, completion, turnSt
|
|
|
42
43
|
}
|
|
43
44
|
for (let index = messages.length - 1; index > turnStart; index -= 1) {
|
|
44
45
|
const message = messages[index];
|
|
46
|
+
// An earlier turn's recorded end bounds this turn.
|
|
47
|
+
if (message?.meta?.transcript?.completion) break;
|
|
45
48
|
if (message?.role !== 'assistant') continue;
|
|
46
49
|
const content = message.content;
|
|
47
50
|
const hasVisibleText =
|
|
@@ -71,6 +74,21 @@ export function attachAssistantTranscriptCompletion(messages, completion, turnSt
|
|
|
71
74
|
return false;
|
|
72
75
|
}
|
|
73
76
|
|
|
77
|
+
/** Records a failed turn's end on its last message: its tool result, its
|
|
78
|
+
* last reply, or the prompt itself when the turn produced nothing. Only for
|
|
79
|
+
* a turn whose prompt survived in `messages`, so that message is the turn's. */
|
|
80
|
+
export function attachFailedTurnCompletion(messages, completion) {
|
|
81
|
+
if (!Array.isArray(messages) || !completion || typeof completion !== 'object') return false;
|
|
82
|
+
const index = messages.length - 1;
|
|
83
|
+
const message = messages[index];
|
|
84
|
+
if (!message || message.role === 'system') return false;
|
|
85
|
+
const meta = message.meta && typeof message.meta === 'object' ? message.meta : {};
|
|
86
|
+
const transcript = meta.transcript && typeof meta.transcript === 'object' ? meta.transcript : {};
|
|
87
|
+
// A new object: the save worker detects changed messages by identity.
|
|
88
|
+
messages[index] = { ...message, meta: { ...meta, transcript: { ...transcript, completion } } };
|
|
89
|
+
return true;
|
|
90
|
+
}
|
|
91
|
+
|
|
74
92
|
/** Commits the loop result into the session: messages, usage, provider state
|
|
75
93
|
* and queue acknowledgements. Returns the terminal result preview. */
|
|
76
94
|
export async function commitAskTurn({ sessionId, opened, prepared, result, rawTranscriptMeta, askStartedAt }) {
|
|
@@ -121,6 +139,10 @@ export async function commitAskTurn({ sessionId, opened, prepared, result, rawTr
|
|
|
121
139
|
if (prepared.goalReminder) {
|
|
122
140
|
acknowledgePendingGoalReminder(session, prepared.goalReminder.revision);
|
|
123
141
|
}
|
|
142
|
+
if (prepared.workspaceNotice) {
|
|
143
|
+
acknowledgePendingWorkspaceNotice(session, prepared.workspaceNotice.revision);
|
|
144
|
+
}
|
|
145
|
+
if (prepared.setupNotice) acknowledgePendingSetupNotice(session, prepared.setupNotice.revision);
|
|
124
146
|
return {
|
|
125
147
|
...result,
|
|
126
148
|
trimmed: messagesDropped > 0,
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
// throttled crash-recovery checkpoint sidecar, and the close snapshot that
|
|
4
4
|
// canonicalizes the transcript when the turn is interrupted.
|
|
5
5
|
import { captureTurnCheckpointContextState, createTurnCheckpointRecorder } from './turn-checkpoint.mjs';
|
|
6
|
+
import { finalizeTurnInterruptionSnapshot } from './turn-interruption.mjs';
|
|
6
7
|
|
|
7
8
|
// Coalescing window for streaming-delta flushes. Each flush journals only the
|
|
8
9
|
// delta since the previous one, so the window just bounds syscalls.
|
|
@@ -83,28 +84,46 @@ export function createTurnCheckpointScheduler({ sessionId, generation, turnToken
|
|
|
83
84
|
};
|
|
84
85
|
}
|
|
85
86
|
|
|
87
|
+
// The live-session fields a staged close snapshot rewrites.
|
|
88
|
+
const CLOSE_SNAPSHOT_SESSION_FIELDS = [
|
|
89
|
+
'liveTurnMessages',
|
|
90
|
+
'_providerPrefixGuardState',
|
|
91
|
+
'messages',
|
|
92
|
+
'activeTurnCheckpoint',
|
|
93
|
+
'providerState',
|
|
94
|
+
'updatedAt',
|
|
95
|
+
'lastUsedAt',
|
|
96
|
+
];
|
|
97
|
+
|
|
86
98
|
/** closeSession is synchronous and generation-first by design. This turn-local
|
|
87
99
|
* hook lets it canonicalize the in-flight transcript before
|
|
88
100
|
* bumpSessionGeneration()/markSessionClosed() writes the disk snapshot and
|
|
89
101
|
* invalidates the ordinary cancellation cleanup save. Finalizes at most once;
|
|
90
|
-
* later calls return the same snapshot.
|
|
102
|
+
* later calls return the same snapshot.
|
|
103
|
+
*
|
|
104
|
+
* `prepare.tentative(reason)` stages the snapshot on the live session only:
|
|
105
|
+
* the checkpoint scheduler and the interruption tracker keep running until
|
|
106
|
+
* `commit()`, and `rollback()` restores the live session exactly, so a close
|
|
107
|
+
* whose lifecycle barrier is refused leaves the turn as it was. */
|
|
91
108
|
export function createCloseSnapshot({ turn, interruption, checkpoint, runtime }) {
|
|
92
109
|
let snapshot = null;
|
|
93
|
-
|
|
94
|
-
if (snapshot) return snapshot;
|
|
110
|
+
const stage = (abortReason) => {
|
|
95
111
|
const session = turn.session;
|
|
96
112
|
if (!session) return null;
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
//
|
|
100
|
-
//
|
|
101
|
-
|
|
102
|
-
interruption.restoreTombstonedText();
|
|
103
|
-
const finalized = interruption.finalize({
|
|
113
|
+
const saved = CLOSE_SNAPSHOT_SESSION_FIELDS.map((key) => [key, Object.hasOwn(session, key), session[key]]);
|
|
114
|
+
const savedRuntimeSession = runtime.session;
|
|
115
|
+
// The tracker snapshot already counts retracted (tombstoned) text as
|
|
116
|
+
// output, so finalizing from it leaves the tracker itself untouched.
|
|
117
|
+
const finalized = finalizeTurnInterruptionSnapshot({
|
|
104
118
|
turnOutgoing: turn.outgoing || session.messages,
|
|
105
119
|
currentUserContent: turn.userTurnContent,
|
|
106
|
-
|
|
120
|
+
snapshot: interruption.snapshot(),
|
|
121
|
+
abortReason: abortReason ?? null,
|
|
107
122
|
});
|
|
123
|
+
session.liveTurnMessages = null;
|
|
124
|
+
// The finalized transcript is a rewrite; the mid-turn provider prefix
|
|
125
|
+
// snapshot must not survive it.
|
|
126
|
+
delete session._providerPrefixGuardState;
|
|
108
127
|
session.messages = finalized.messages;
|
|
109
128
|
delete session.activeTurnCheckpoint;
|
|
110
129
|
// A preserved response — or a non-user detach that keeps the provisional
|
|
@@ -113,7 +132,32 @@ export function createCloseSnapshot({ turn, interruption, checkpoint, runtime })
|
|
|
113
132
|
session.updatedAt = Date.now();
|
|
114
133
|
session.lastUsedAt = Date.now();
|
|
115
134
|
runtime.session = session;
|
|
116
|
-
|
|
117
|
-
|
|
135
|
+
return {
|
|
136
|
+
snapshot: finalized,
|
|
137
|
+
commit() {
|
|
138
|
+
checkpoint.stop();
|
|
139
|
+
interruption.restoreTombstonedText();
|
|
140
|
+
snapshot = finalized;
|
|
141
|
+
},
|
|
142
|
+
rollback() {
|
|
143
|
+
for (const [key, had, value] of saved) {
|
|
144
|
+
if (had) session[key] = value;
|
|
145
|
+
else delete session[key];
|
|
146
|
+
}
|
|
147
|
+
runtime.session = savedRuntimeSession;
|
|
148
|
+
},
|
|
149
|
+
};
|
|
150
|
+
};
|
|
151
|
+
const prepare = (abortReason) => {
|
|
152
|
+
if (snapshot) return snapshot;
|
|
153
|
+
const staged = stage(abortReason);
|
|
154
|
+
if (!staged) return null;
|
|
155
|
+
staged.commit();
|
|
156
|
+
return staged.snapshot;
|
|
157
|
+
};
|
|
158
|
+
prepare.tentative = (abortReason) => {
|
|
159
|
+
if (snapshot) return { snapshot, commit() {}, rollback() {} };
|
|
160
|
+
return stage(abortReason);
|
|
118
161
|
};
|
|
162
|
+
return prepare;
|
|
119
163
|
}
|
|
@@ -21,7 +21,9 @@ import { uncachedInputTokensForProvider } from './usage-metrics.mjs';
|
|
|
21
21
|
import { pruneOffloadSession } from '../tool-result-offload.mjs';
|
|
22
22
|
import { _getPendingMessagesForSession } from './pending-messages.mjs';
|
|
23
23
|
import { isSessionCompactionBlocked } from './runtime-liveness.mjs';
|
|
24
|
+
import { backfillFallbackSessionTitle } from './session-fallback-title.mjs';
|
|
24
25
|
import { resetReadStateAfterCompaction } from '../read-dedup.mjs';
|
|
26
|
+
import { applyPendingWorkspaceReroot } from './prompt-utils.mjs';
|
|
25
27
|
import {
|
|
26
28
|
compactTargetBudget as compactTargetBudgetForPolicy,
|
|
27
29
|
compactDisplayBeforeTokens,
|
|
@@ -629,7 +631,13 @@ async function commitSessionCompaction(plan, run, compactStartedAt) {
|
|
|
629
631
|
let unchangedReason = null;
|
|
630
632
|
if (!changed) unchangedReason = force ? 'nothing to compact' : 'below threshold';
|
|
631
633
|
const now = Date.now();
|
|
634
|
+
// Older titleless sessions: keep a name before the transcript that carries
|
|
635
|
+
// the first prompt is replaced.
|
|
636
|
+
if (changed) backfillFallbackSessionTitle(session, messages);
|
|
632
637
|
session.messages = transcript;
|
|
638
|
+
// The compacted transcript breaks the cache anyway: a staged working-folder
|
|
639
|
+
// change re-roots the system prompt now and needs no notice any more.
|
|
640
|
+
if (changed) applyPendingWorkspaceReroot(session);
|
|
633
641
|
if (changed) resetReadStateAfterCompaction(resolvedSessionId);
|
|
634
642
|
await pruneCompactedOffloads(session, resolvedSessionId);
|
|
635
643
|
if (changed) session.providerState = undefined;
|
|
@@ -45,3 +45,19 @@ export function rewindUnansweredPrompt(session, prompt) {
|
|
|
45
45
|
delete session._providerPrefixGuardState;
|
|
46
46
|
return true;
|
|
47
47
|
}
|
|
48
|
+
|
|
49
|
+
/** Resolve a retry against the durable failure, never against display text. */
|
|
50
|
+
export function retainedFailedTurnInput(messages, messageId, attemptId) {
|
|
51
|
+
const list = Array.isArray(messages) ? messages : [];
|
|
52
|
+
const index = list.findLastIndex((message) => message?.role !== 'system');
|
|
53
|
+
const message = list[index];
|
|
54
|
+
const transcript = message?.meta?.transcript;
|
|
55
|
+
if (!messageId || transcript?.messageId !== messageId || transcript?.completion?.status !== 'failed') {
|
|
56
|
+
throw new Error('The failed turn is no longer the latest execution.');
|
|
57
|
+
}
|
|
58
|
+
if (transcript.completion.attemptId && transcript.completion.attemptId !== attemptId) {
|
|
59
|
+
throw new Error('The failed attempt is no longer the latest execution.');
|
|
60
|
+
}
|
|
61
|
+
if (message.role !== 'user') return null;
|
|
62
|
+
return { index, message };
|
|
63
|
+
}
|