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
|
@@ -7,7 +7,7 @@ import { getProvider } from '../../providers/registry.mjs';
|
|
|
7
7
|
import { invalidateContextUsageSnapshot, invalidateProviderContextBaseline } from '../loop/compact-policy.mjs';
|
|
8
8
|
import { saveSession, saveSessionAsync, saveSessionAsyncDeferred, loadSession, setLiveSession } from '../store.mjs';
|
|
9
9
|
import { _liveSessions } from '../store/live-state.mjs';
|
|
10
|
-
import {
|
|
10
|
+
import { _recoverTurnCheckpointDurably } from './turn-checkpoint-recovery.mjs';
|
|
11
11
|
import { isAgentOwner } from '../../agent-owner.mjs';
|
|
12
12
|
import { getHiddenAgent } from '../../internal-agents.mjs';
|
|
13
13
|
import { loadConfig } from '../../config.mjs';
|
|
@@ -37,13 +37,15 @@ import { getAgentRuntimeSync, warnAgentRuntimeResolveFailureOnce } from './agent
|
|
|
37
37
|
import { ensureCodexWireSessionId, mintSessionId } from './session-id.mjs';
|
|
38
38
|
import { providerCacheKey } from './provider-cache-key.mjs';
|
|
39
39
|
import { buildSessionRecord, normalizeDesktopSessionMetadata, sessionOriginFields } from './session-record.mjs';
|
|
40
|
-
import {
|
|
40
|
+
import { normalizeWorkflowRoute } from '../../runtime-core/workflow.mjs';
|
|
41
|
+
import { applyPendingWorkspaceReroot, refreshSessionBp3Environment } from './prompt-utils.mjs';
|
|
41
42
|
import { isWorktreeBound } from '../../../../shared/worktrees/contract.mjs';
|
|
43
|
+
import { applyAgentToolExposure } from '../loop/tool-exposure-migration.mjs';
|
|
44
|
+
import { prewarmSessionAutoEffort } from './ask-turn-auto-effort.mjs';
|
|
42
45
|
|
|
43
|
-
//
|
|
44
|
-
//
|
|
45
|
-
|
|
46
|
-
export { isSessionOwnerGone, recoverSessionAfterProcessRestart } from './session-owner-liveness.mjs';
|
|
46
|
+
// Durable turn-checkpoint recovery; re-exported so prior importers of this
|
|
47
|
+
// module stay unchanged.
|
|
48
|
+
export { recoverSessionAfterProcessRestart } from './turn-checkpoint-recovery.mjs';
|
|
47
49
|
// Prepared-surface cache warmers (desktop hover prefetch, pane projection);
|
|
48
50
|
// re-exported so prior importers of this module stay unchanged.
|
|
49
51
|
export { prefetchSession, prepareSessionProjection } from './prepared-resume-cache.mjs';
|
|
@@ -210,6 +212,11 @@ export function createSession(opts) {
|
|
|
210
212
|
const { profile } = resolved;
|
|
211
213
|
const route = resolveSessionRoute(opts, presetObj, profile);
|
|
212
214
|
const { providerName, modelName, provider, toolPreset, id } = route;
|
|
215
|
+
const routeFallbacks = normalizeWorkflowRoute({
|
|
216
|
+
provider: providerName,
|
|
217
|
+
model: modelName,
|
|
218
|
+
fallbacks: Object.hasOwn(opts, 'routeFallbacks') ? opts.routeFallbacks : presetObj?.fallbacks,
|
|
219
|
+
})?.fallbacks;
|
|
213
220
|
// Provider cache strategy — agentRuntime.resolveSync() above is a
|
|
214
221
|
// best-effort injection point (setAgentRuntime() has no live caller
|
|
215
222
|
// today, so that branch never fires); build it directly here so every
|
|
@@ -217,11 +224,7 @@ export function createSession(opts) {
|
|
|
217
224
|
// 'lead', or no agent at all — raw/CLI callers) get their BP4 message
|
|
218
225
|
// tail TTL linked to the user's autoClear idle-sweep config; hidden and
|
|
219
226
|
// public agents keep the flat 5m default (see cache-strategy.mjs docs).
|
|
220
|
-
// Scoped to explicit-breakpoint (Anthropic-family) providers only
|
|
221
|
-
// non-Anthropic branches of buildProviderCacheOpts (e.g. the 'openai'
|
|
222
|
-
// cacheRetention:'24h' shape) were never exercised by createSession
|
|
223
|
-
// before this change, and are left untouched to avoid altering live
|
|
224
|
-
// OpenAI/other-provider request shape as a side effect of this fix.
|
|
227
|
+
// Scoped to explicit-breakpoint (Anthropic-family) providers only.
|
|
225
228
|
const providerCacheOpts = resolved.providerCacheOpts || buildSessionProviderCacheOpts(providerName, id, opts.agent);
|
|
226
229
|
const surface = resolveSessionToolSurface(opts, { profile, toolPreset, modelName });
|
|
227
230
|
const prompt = composeSessionSystem(opts, { profile, providerName, modelName, surface });
|
|
@@ -243,11 +246,15 @@ export function createSession(opts) {
|
|
|
243
246
|
origin: sessionOriginFields(opts, { profile, presetObj, providerCacheOpts, surface }),
|
|
244
247
|
});
|
|
245
248
|
session.providerCacheOptsOverride = Boolean(resolved.providerCacheOpts);
|
|
249
|
+
if (routeFallbacks?.length) session.routeFallbacks = routeFallbacks;
|
|
250
|
+
// A non-native agent sends core + bridge, built from its filtered tools.
|
|
251
|
+
applyAgentToolExposure(session);
|
|
246
252
|
refreshSessionBp3Environment(session, opts.cwd);
|
|
247
253
|
// In-process registry + async debounced save: same-process create → load
|
|
248
254
|
// reads live memory; disk flush is for cross-process / restart durability.
|
|
249
255
|
setLiveSession(session);
|
|
250
256
|
saveSession(session);
|
|
257
|
+
prewarmSessionAutoEffort(session, provider);
|
|
251
258
|
return session;
|
|
252
259
|
}
|
|
253
260
|
|
|
@@ -367,6 +374,11 @@ function resetSessionForRouteChange(id, session, previousModel, previousProvider
|
|
|
367
374
|
session.lastContextTokensUpdatedAt = Date.now();
|
|
368
375
|
session.lastContextTokensStaleAfterCompact = false;
|
|
369
376
|
session.providerState = undefined;
|
|
377
|
+
// The previous route's prefix snapshot measured another prompt (model line,
|
|
378
|
+
// stripped replay); the new chain baselines on its first send.
|
|
379
|
+
delete session._providerPrefixGuardState;
|
|
380
|
+
// The new route resolves its own wire before its first request.
|
|
381
|
+
session.wireRoute = null;
|
|
370
382
|
const prepared = _prepareResumeTools(session, session.preset || 'full');
|
|
371
383
|
session.tools = prepared.tools;
|
|
372
384
|
session.toolSpec = prepared.toolSpec;
|
|
@@ -384,6 +396,7 @@ function resetSessionForRouteChange(id, session, previousModel, previousProvider
|
|
|
384
396
|
]) {
|
|
385
397
|
if (Array.isArray(session[key])) session[key] = filterModelEditToolNames(session[key], session.model);
|
|
386
398
|
}
|
|
399
|
+
applyAgentToolExposure(session, { existing: true });
|
|
387
400
|
_refreshSessionRuleVariantsForModel(session, previousModel, previousProvider);
|
|
388
401
|
_forgetPreparedResume(id);
|
|
389
402
|
}
|
|
@@ -436,6 +449,9 @@ export function updateSessionRoute(id, route = {}, options = {}) {
|
|
|
436
449
|
// route and set sessionStartMetaInjected, so the ask-time refresh guard
|
|
437
450
|
// skips it and an empty-session route change would otherwise keep the old
|
|
438
451
|
// model line in the system prompt (model self-identity confusion).
|
|
452
|
+
// A new route starts a cold cache: a staged working-folder change re-roots
|
|
453
|
+
// the prompt now instead of riding a notice.
|
|
454
|
+
if (routeChanged) applyPendingWorkspaceReroot(session);
|
|
439
455
|
refreshSessionBp3Environment(session, session.cwd);
|
|
440
456
|
session.updatedAt = Date.now();
|
|
441
457
|
setLiveSession(session);
|
|
@@ -448,9 +464,8 @@ export function updateSessionRoute(id, route = {}, options = {}) {
|
|
|
448
464
|
}
|
|
449
465
|
|
|
450
466
|
// --- resume (reload tools for a stored session) ---
|
|
451
|
-
//
|
|
452
|
-
//
|
|
453
|
-
// the prepared tool surface it consumes is cached in prepared-resume-cache.mjs.
|
|
467
|
+
// Interrupted-turn recovery lives in turn-checkpoint-recovery.mjs; the
|
|
468
|
+
// prepared tool surface it consumes is cached in prepared-resume-cache.mjs.
|
|
454
469
|
|
|
455
470
|
// Desktop callers pass their selected durable classification as a
|
|
456
471
|
// capability check. Refuse a stale/tampered cross-class resume before any
|
|
@@ -484,25 +499,6 @@ function _applyDesktopResumeScope(session, options) {
|
|
|
484
499
|
return true;
|
|
485
500
|
}
|
|
486
501
|
|
|
487
|
-
// ATTACH (viewer mode, zero ownership): hand back the live transcript
|
|
488
|
-
// under the SAME id, flagged remoteAttached. No tool refresh, no save,
|
|
489
|
-
// no generation claim — the session file remains exclusively the
|
|
490
|
-
// owner's. session-turn-api routes this surface's submits into the
|
|
491
|
-
// shared pending spool instead of running a local turn.
|
|
492
|
-
function _attachViewerSession(session, sessionId) {
|
|
493
|
-
const attached = { ...session, remoteAttached: true };
|
|
494
|
-
delete attached.liveTurnMessages;
|
|
495
|
-
delete attached.toolApprovalHook;
|
|
496
|
-
if (process.env.MIXDOG_DEBUG_SESSION_LOG) {
|
|
497
|
-
try {
|
|
498
|
-
process.stderr.write(`[session] attach-on-resume: ${sessionId} is live elsewhere → viewer attach\n`);
|
|
499
|
-
} catch {
|
|
500
|
-
/* best-effort */
|
|
501
|
-
}
|
|
502
|
-
}
|
|
503
|
-
return attached;
|
|
504
|
-
}
|
|
505
|
-
|
|
506
502
|
// Refreshes the session's tool surface from the prepared resume when it still
|
|
507
503
|
// matches, warning about tools the preset no longer offers.
|
|
508
504
|
function _refreshResumedTools(session, sessionId, preset) {
|
|
@@ -513,7 +509,12 @@ function _refreshResumedTools(session, sessionId, preset) {
|
|
|
513
509
|
// Keep the persisted tool mode in sync on resume (see createSession note).
|
|
514
510
|
session.toolSpec = prepared.toolSpec;
|
|
515
511
|
session.tools = prepared.tools;
|
|
516
|
-
|
|
512
|
+
applyAgentToolExposure(session, { existing: true });
|
|
513
|
+
// A bridge surface keeps the rest of its tools in the catalog.
|
|
514
|
+
const available = new Set(
|
|
515
|
+
[...session.tools, ...(session.deferredToolCatalog || [])].map((tool) => tool?.name).filter(Boolean)
|
|
516
|
+
);
|
|
517
|
+
const missing = oldTools.filter((t) => !available.has(t.name));
|
|
517
518
|
if (missing.length) {
|
|
518
519
|
process.stderr.write(
|
|
519
520
|
`[session] Warning: ${missing.length} tools no longer available: ${missing.map((t) => t.name).join(', ')}\n`
|
|
@@ -534,7 +535,6 @@ export async function resumeSession(sessionId, preset, options = {}) {
|
|
|
534
535
|
if (Object.hasOwn(options, 'mcpScopeId')) {
|
|
535
536
|
session.mcpScopeId = String(options.mcpScopeId || '').trim() || null;
|
|
536
537
|
}
|
|
537
|
-
if (_isActivelyOwnedElsewhere(session, sessionId)) return _attachViewerSession(session, sessionId);
|
|
538
538
|
_recoverTurnCheckpointDurably(session, sessionId);
|
|
539
539
|
_refreshResumedTools(session, sessionId, preset);
|
|
540
540
|
refreshSessionProviderCacheOpts(session);
|
|
@@ -546,5 +546,6 @@ export async function resumeSession(sessionId, preset, options = {}) {
|
|
|
546
546
|
process.stderr.write(`[session] resume save failed: ${err?.message || err}\n`);
|
|
547
547
|
} catch {}
|
|
548
548
|
});
|
|
549
|
+
prewarmSessionAutoEffort(session, session.provider ? getProvider(session.provider) : null);
|
|
549
550
|
return session;
|
|
550
551
|
}
|
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
} from '../../tools/builtin/runtime-capabilities.mjs';
|
|
19
19
|
import { captureOriginalUserCwd } from '../../../../shared/user-cwd.mjs';
|
|
20
20
|
import { delegationDisabled } from './session-tool-surface.mjs';
|
|
21
|
+
import { contextAckMessage } from '../compact/user-message-kind.mjs';
|
|
21
22
|
|
|
22
23
|
// Preserve the exact pre-layout environment payload: Lead carried the
|
|
23
24
|
// shell preference in Profile Preferences, while any routing surface with
|
|
@@ -89,6 +90,23 @@ export function buildWorkspacePromptContext(session, cwd) {
|
|
|
89
90
|
|
|
90
91
|
// BP1/BP2/BP3 rule blocks plus the volatile environment, composed into the
|
|
91
92
|
// four system blocks; environmentTailContext is the persisted env tail.
|
|
93
|
+
export function sessionRolePromptFields(identity, { ownerIsAgent, toolFreeRole, delegationFree }) {
|
|
94
|
+
const skipRules = identity.skipAgentRules || toolFreeRole;
|
|
95
|
+
let roleRules = '';
|
|
96
|
+
if (!skipRules) {
|
|
97
|
+
roleRules = ownerIsAgent
|
|
98
|
+
? _buildAgentRules(identity.agentRulesProfile)
|
|
99
|
+
: _buildLeadRules({ includeLeadBrief: !delegationFree });
|
|
100
|
+
}
|
|
101
|
+
return {
|
|
102
|
+
roleRules,
|
|
103
|
+
userPrompt: identity.systemPrompt,
|
|
104
|
+
skipRoleCatalog: !ownerIsAgent,
|
|
105
|
+
agent: identity.agent,
|
|
106
|
+
profile: { skip: identity.profileSkip },
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
|
|
92
110
|
export function composeSessionSystem(opts, { profile, providerName, modelName, surface }) {
|
|
93
111
|
const { ownerIsAgent, resolvedAgent, skills } = surface;
|
|
94
112
|
// A tool-free hidden role (a one-shot classifier or title writer) carries
|
|
@@ -105,12 +123,14 @@ export function composeSessionSystem(opts, { profile, providerName, modelName, s
|
|
|
105
123
|
model: modelName,
|
|
106
124
|
});
|
|
107
125
|
const delegationFree = delegationDisabled(opts, ownerIsAgent);
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
126
|
+
const promptIdentity = {
|
|
127
|
+
systemPrompt: opts.systemPrompt || '',
|
|
128
|
+
skipAgentRules: opts.skipAgentRules === true,
|
|
129
|
+
profileSkip: { ...profile?.skip },
|
|
130
|
+
agent: resolvedAgent,
|
|
131
|
+
agentRulesProfile: surface.agentRulesProfile,
|
|
132
|
+
};
|
|
133
|
+
const roleFields = sessionRolePromptFields(promptIdentity, { ownerIsAgent, toolFreeRole, delegationFree });
|
|
114
134
|
const leadOnly = !skipAgentRules && !ownerIsAgent;
|
|
115
135
|
const metaContext = leadOnly ? _buildLeadMetaContext() : '';
|
|
116
136
|
// Lead-only response language; closes the environment block so no English
|
|
@@ -132,14 +152,10 @@ export function composeSessionSystem(opts, { profile, providerName, modelName, s
|
|
|
132
152
|
? ''
|
|
133
153
|
: loadInstructionFilesContext({ mode: configuredInstructionFilesMode(), cwd: opts.cwd });
|
|
134
154
|
const composed = composeSystemPrompt({
|
|
135
|
-
|
|
155
|
+
...roleFields,
|
|
136
156
|
agentRules: injectedRules || undefined,
|
|
137
|
-
roleRules: roleRules || undefined,
|
|
138
157
|
metaContext: metaContext || undefined,
|
|
139
158
|
languageContext: languageContext || undefined,
|
|
140
|
-
skipRoleCatalog: !ownerIsAgent,
|
|
141
|
-
profile: profile || undefined,
|
|
142
|
-
agent: resolvedAgent,
|
|
143
159
|
workflowContext: opts.workflowContext || null,
|
|
144
160
|
coreMemoryContext: opts.coreMemoryContext || null,
|
|
145
161
|
instructionFilesContext: instructionFilesContext || null,
|
|
@@ -147,7 +163,7 @@ export function composeSessionSystem(opts, { profile, providerName, modelName, s
|
|
|
147
163
|
environmentContext: shellEnvironmentContext,
|
|
148
164
|
provider: providerName || null,
|
|
149
165
|
});
|
|
150
|
-
return { ...composed, environmentTailContext };
|
|
166
|
+
return { ...composed, environmentTailContext, promptIdentity };
|
|
151
167
|
}
|
|
152
168
|
|
|
153
169
|
// 4-BP layout (see composeSystemPrompt docs):
|
|
@@ -188,7 +204,7 @@ export function seedSessionMessages({ baseRules, stableSystemContext, sessionMar
|
|
|
188
204
|
if (files?.length) {
|
|
189
205
|
const fileContext = files.map((f) => `### ${f.path}\n\`\`\`\n${f.content}\n\`\`\``).join('\n\n');
|
|
190
206
|
messages.push({ role: 'user', content: `Reference files:\n\n${fileContext}` });
|
|
191
|
-
messages.push(
|
|
207
|
+
messages.push(contextAckMessage());
|
|
192
208
|
}
|
|
193
209
|
return messages;
|
|
194
210
|
}
|
|
@@ -109,6 +109,9 @@ export function buildSessionRecord({ opts, route, presetObj, surface, prompt, me
|
|
|
109
109
|
codexWireSessionId: providerName === 'openai-oauth' ? mintUuidV7() : null,
|
|
110
110
|
provider: providerName,
|
|
111
111
|
model: modelName,
|
|
112
|
+
// Resolved and pinned before the first request (wire-route.mjs). null —
|
|
113
|
+
// not absent — marks a session created under the per-model wire table.
|
|
114
|
+
wireRoute: null,
|
|
112
115
|
messages,
|
|
113
116
|
contextWindow: contextMeta.contextWindow,
|
|
114
117
|
rawContextWindow: contextMeta.rawContextWindow,
|
|
@@ -135,6 +138,8 @@ export function buildSessionRecord({ opts, route, presetObj, surface, prompt, me
|
|
|
135
138
|
agent: opts.agent,
|
|
136
139
|
owner: opts.owner || 'user',
|
|
137
140
|
bp3CoreContext: prompt.sessionMarkerCore,
|
|
141
|
+
promptIdentity: prompt.promptIdentity,
|
|
142
|
+
callerDisallowedTools: [...(opts.callerDisallowedTools ?? opts.disallowedTools ?? [])],
|
|
138
143
|
bp3EnvironmentContext: prompt.environmentTailContext,
|
|
139
144
|
// BP3 core and the volatile environment live in SEPARATE system
|
|
140
145
|
// blocks (cacheTier 'tier3' vs 'env'). Legacy persisted sessions
|
|
@@ -159,9 +164,7 @@ export function buildSessionRecord({ opts, route, presetObj, surface, prompt, me
|
|
|
159
164
|
totalInputTokens: 0,
|
|
160
165
|
totalOutputTokens: 0,
|
|
161
166
|
totalToolCalls: 0,
|
|
162
|
-
// Refreshed on each completed ask() — surfaced by agent type=list
|
|
163
|
-
// debugging + consumed by store.mjs's idle-sweep to reclaim stalled
|
|
164
|
-
// agent sessions past RUNNING_STALL_MS.
|
|
167
|
+
// Refreshed on each completed ask() — surfaced by agent type=list.
|
|
165
168
|
lastUsedAt: Date.now(),
|
|
166
169
|
tokensCumulative: 0,
|
|
167
170
|
...origin,
|
|
@@ -48,6 +48,9 @@ const SESSION_ROUTE_TOOL_RANK = new Map(
|
|
|
48
48
|
const FILESYSTEM_TOOL_NAMES = new Set(['code_graph', 'find', 'glob', 'list', 'grep', 'read', 'edit', 'apply_patch']);
|
|
49
49
|
const READONLY_FS_TOOL_NAMES = new Set(['code_graph', 'find', 'glob', 'list', 'grep', 'read']);
|
|
50
50
|
|
|
51
|
+
// Lead-only control tools: never part of a worker/sub-agent session surface.
|
|
52
|
+
export const AGENT_WORKER_DENIED_TOOLS = Object.freeze(new Set(['agent', 'ask_user', 'session']));
|
|
53
|
+
|
|
51
54
|
export function finalizeSessionToolList(
|
|
52
55
|
tools,
|
|
53
56
|
{ schemaAllowedTools = null, disallowedTools = null, ownerIsAgent = false } = {}
|
|
@@ -64,7 +67,7 @@ export function finalizeSessionToolList(
|
|
|
64
67
|
out = out.filter((t) => !denySet.has(String(t?.name || '').toLowerCase()));
|
|
65
68
|
}
|
|
66
69
|
if (ownerIsAgent) {
|
|
67
|
-
out = out.filter((t) => String(t?.name || '').toLowerCase()
|
|
70
|
+
out = out.filter((t) => !AGENT_WORKER_DENIED_TOOLS.has(String(t?.name || '').toLowerCase()));
|
|
68
71
|
out = orderSessionTools(out);
|
|
69
72
|
}
|
|
70
73
|
return out;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// manager/turn-checkpoint-recovery.mjs
|
|
2
|
+
// Durable recovery of a turn interrupted by a process restart: an interrupted
|
|
3
|
+
// turn checkpoint is committed as interrupted on resume. Every session runs in
|
|
4
|
+
// the daemon, so a turn is live while this process runs it or while another
|
|
5
|
+
// live process owns the daemon; reads never recover a live turn.
|
|
6
|
+
import { join } from 'node:path';
|
|
7
|
+
import { readSingletonOwner } from '../../../../shared/singleton-owner.mjs';
|
|
8
|
+
import { loadSession, saveSession } from '../store.mjs';
|
|
9
|
+
import { dataDir } from '../store-summary-locations.mjs';
|
|
10
|
+
import { runtimeState, isTurnInFlight } from './runtime-state.mjs';
|
|
11
|
+
import { clearTurnCheckpoint, recoverTurnCheckpoint } from './turn-checkpoint.mjs';
|
|
12
|
+
|
|
13
|
+
/** Whether this session's turn may still be running: in flight in this
|
|
14
|
+
* process, or owned by another live process holding the daemon record. */
|
|
15
|
+
export function isSessionTurnLive(sessionId) {
|
|
16
|
+
if (isTurnInFlight(runtimeState.get(sessionId))) return true;
|
|
17
|
+
const { owner, alive } = readSingletonOwner(join(dataDir(), 'daemon-owner.json'));
|
|
18
|
+
return alive && Number(owner.pid) !== process.pid;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function _recoverTurnCheckpointDurably(session, sessionId) {
|
|
22
|
+
const recovery = recoverTurnCheckpoint(session);
|
|
23
|
+
if (!recovery.changed) return recovery;
|
|
24
|
+
// Recovery is a durable reconnect boundary, not a renderer-only view.
|
|
25
|
+
// Persist before removing the checkpoint so a second crash leaves at
|
|
26
|
+
// least one complete copy of the interrupted turn.
|
|
27
|
+
saveSession(session, {
|
|
28
|
+
sync: true,
|
|
29
|
+
expectedGeneration: session.generation,
|
|
30
|
+
});
|
|
31
|
+
if (recovery.turnToken) {
|
|
32
|
+
clearTurnCheckpoint(sessionId, recovery.turnToken);
|
|
33
|
+
}
|
|
34
|
+
return recovery;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Reconnect-safe historical read used by desktop pane peeks. Unlike a normal
|
|
38
|
+
// read-only load, it resolves a dead owner's durable turn checkpoint before
|
|
39
|
+
// returning the transcript; a live turn is returned untouched.
|
|
40
|
+
export function recoverSessionAfterProcessRestart(sessionId) {
|
|
41
|
+
const session = loadSession(sessionId);
|
|
42
|
+
if (!session || session.closed === true || isSessionTurnLive(sessionId)) return session || null;
|
|
43
|
+
_recoverTurnCheckpointDurably(session, sessionId);
|
|
44
|
+
return session;
|
|
45
|
+
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Thin facade over the split session-manager modules in ./manager/.
|
|
3
3
|
//
|
|
4
4
|
// Module map:
|
|
5
|
-
// manager/runtime-liveness.mjs — in-memory stage/
|
|
5
|
+
// manager/runtime-liveness.mjs — in-memory stage/progress + accessors
|
|
6
6
|
// manager/tool-resolution.mjs — tool policy resolution/narrowing
|
|
7
7
|
// manager/context-meta.mjs — context-window / compact-trigger meta
|
|
8
8
|
// manager/prompt-utils.mjs — prompt content shaping helpers
|
|
@@ -45,6 +45,7 @@ export {
|
|
|
45
45
|
markSessionError,
|
|
46
46
|
markSessionCancelled,
|
|
47
47
|
getSessionRuntime,
|
|
48
|
+
isSessionTurnInFlight,
|
|
48
49
|
isSessionCompactionBlocked,
|
|
49
50
|
getSessionProgressSnapshot,
|
|
50
51
|
forEachSessionRuntime,
|
|
@@ -59,19 +60,12 @@ export { previewSessionTools } from './manager/tool-resolution.mjs';
|
|
|
59
60
|
export {
|
|
60
61
|
_mergePendingMessageEntries,
|
|
61
62
|
enqueuePendingMessage,
|
|
62
|
-
enqueueRemotePendingMessage,
|
|
63
|
-
drainForeignUserInjections,
|
|
64
63
|
drainPendingMessages,
|
|
65
64
|
// Shutdown drain so buffered/in-flight spool writes are never abandoned.
|
|
66
65
|
settlePendingMessageWrites,
|
|
67
66
|
markCompletionEntry,
|
|
68
67
|
COMPLETION_NOTIFICATION_KIND,
|
|
69
|
-
pendingMessagesSpoolPath,
|
|
70
68
|
} from './manager/pending-messages.mjs';
|
|
71
|
-
// Interactive-presence sidecar (idle-open ownership signal for the
|
|
72
|
-
// attach-on-resume guard) — resolved through the manager facade so the
|
|
73
|
-
// session-runtime turn API reaches it as mgr.publishSessionPresence.
|
|
74
|
-
export { publishSessionPresence, deleteSessionPresence } from './store.mjs';
|
|
75
69
|
|
|
76
70
|
// ── Usage-metrics surface — re-exported unchanged so loop.mjs / smoke scripts
|
|
77
71
|
// keep resolving these through the facade. ────────────────────────────────
|
|
@@ -105,7 +99,6 @@ export {
|
|
|
105
99
|
prefetchSession,
|
|
106
100
|
prepareSessionProjection,
|
|
107
101
|
resumeSession,
|
|
108
|
-
isSessionOwnerGone,
|
|
109
102
|
recoverSessionAfterProcessRestart,
|
|
110
103
|
} from './manager/session-lifecycle.mjs';
|
|
111
104
|
export { askSession, _api_call_with_interrupt } from './manager/ask-session.mjs';
|
|
@@ -123,9 +116,10 @@ export {
|
|
|
123
116
|
updateSessionStatus,
|
|
124
117
|
updateSessionGeneratedTitle,
|
|
125
118
|
updateSessionManualTitle,
|
|
119
|
+
updateSessionAiTitle,
|
|
126
120
|
flushSessionMetrics,
|
|
127
121
|
} from './manager/session-crud.mjs';
|
|
128
|
-
export { deleteSession, listOwnedAgentSessionIds } from './store.mjs';
|
|
122
|
+
export { deleteSession, listOwnedAgentSessionIds, fenceSessionWrites } from './store.mjs';
|
|
129
123
|
// Read-only parsed-session access (desktop pane peek): no resume, no
|
|
130
124
|
// ownership, no liveness side effects.
|
|
131
125
|
export { loadSession } from './store.mjs';
|
|
@@ -31,6 +31,8 @@ import { bumpUsageMetricsEpoch } from './manager/usage-metrics.mjs';
|
|
|
31
31
|
import { resetReadStateAfterCompaction } from './read-dedup.mjs';
|
|
32
32
|
import { scheduleCompactionArchive, stampCompactionMessageIds } from './compaction-archive-capture.mjs';
|
|
33
33
|
import { writeStderrBestEffort } from '../../../shared/best-effort-stderr.mjs';
|
|
34
|
+
import { applyPendingWorkspaceReroot } from './manager/prompt-utils.mjs';
|
|
35
|
+
import { backfillFallbackSessionTitle } from './manager/session-fallback-title.mjs';
|
|
34
36
|
import {
|
|
35
37
|
acknowledgePendingGoalReminder,
|
|
36
38
|
markPendingGoalReminder,
|
|
@@ -378,6 +380,7 @@ function adoptCompactedTranscript(ctx, run) {
|
|
|
378
380
|
const { state } = ctx;
|
|
379
381
|
const { messages, sessionRef, sessionId, opts } = state;
|
|
380
382
|
const replaced = messages.slice();
|
|
383
|
+
if (sessionRef) backfillFallbackSessionTitle(sessionRef, replaced);
|
|
381
384
|
messages.length = 0;
|
|
382
385
|
messages.push(...run.compacted);
|
|
383
386
|
// Display-only archive of the dropped conversation; the projection and the
|
|
@@ -388,6 +391,9 @@ function adoptCompactedTranscript(ctx, run) {
|
|
|
388
391
|
ctx.droppedMessages = archived?.dropped ?? 0;
|
|
389
392
|
ctx.droppedIdentities = archived?.identities ?? null;
|
|
390
393
|
acknowledgeGoalReminder(sessionRef, run);
|
|
394
|
+
// The compacted transcript breaks the cache anyway: a staged working-folder
|
|
395
|
+
// change re-roots the system prompt now and needs no notice any more.
|
|
396
|
+
if (sessionRef) applyPendingWorkspaceReroot(sessionRef, messages);
|
|
391
397
|
resetReadStateAfterCompaction(sessionId);
|
|
392
398
|
// Cross-turn receipts reference tool results that compaction just removed
|
|
393
399
|
// from context; a stub for them would point at nothing. Clear in place so
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
// wrappers are installed on the caller's opts in place for ONE send, and the
|
|
4
4
|
// returned restore unwinds only our own wrappers.
|
|
5
5
|
import { isVisibleStreamProgress } from '../../../shared/stream-progress.mjs';
|
|
6
|
+
import { MODEL_THINKING_STAGE } from '../../../shared/quiet-progress.mjs';
|
|
6
7
|
|
|
7
8
|
// Bench-only turn timing (MIXDOG_TURN_TIMING=1): one stderr line per
|
|
8
9
|
// provider request — TTFT (first visible model progress) and total stream
|
|
@@ -61,7 +62,7 @@ function retryVisibilityWrappers(opts, timedOpts, retryAttemptNumber, retryMaxFo
|
|
|
61
62
|
if (!(retryAttemptNumber > 0 && prevOnStageChange)) return wrappers;
|
|
62
63
|
let progressObserved = false;
|
|
63
64
|
wrappers.onStageChange = (stage, detail) => {
|
|
64
|
-
if (!progressObserved && (stage === 'requesting' || stage === 'streaming')) {
|
|
65
|
+
if (!progressObserved && (stage === 'requesting' || stage === 'streaming' || stage === MODEL_THINKING_STAGE)) {
|
|
65
66
|
return prevOnStageChange('reconnecting', {
|
|
66
67
|
...(detail && typeof detail === 'object' ? detail : {}),
|
|
67
68
|
attempt: retryAttemptNumber,
|
|
@@ -37,13 +37,14 @@ import {
|
|
|
37
37
|
isThinkingReplayRejection,
|
|
38
38
|
repairThinkingReplayInPlace,
|
|
39
39
|
} from './thinking-replay-recovery.mjs';
|
|
40
|
-
import { readStreamOutcome } from '../providers/lib/stream-outcome.mjs';
|
|
40
|
+
import { readStreamOutcome, stampStreamOutcome } from '../providers/lib/stream-outcome.mjs';
|
|
41
41
|
import { cloneProviderReplay } from '../providers/lib/provider-replay.mjs';
|
|
42
42
|
import { resolveWorkerCompactPolicy } from './loop/compact-policy.mjs';
|
|
43
43
|
import { agentContextOverflowError } from './loop/context-overflow.mjs';
|
|
44
44
|
import { estimateMessagesTokensSafe } from './loop/compact-debug.mjs';
|
|
45
45
|
import { isOutputLimitStopReason } from './loop/termination.mjs';
|
|
46
46
|
import { instrumentSendCallbacks } from './send-instrumentation.mjs';
|
|
47
|
+
import { rejectedToolSchema } from './tool-schema-rejection.mjs';
|
|
47
48
|
|
|
48
49
|
function normalizedIncompleteUsage(raw) {
|
|
49
50
|
if (!raw || typeof raw !== 'object') return undefined;
|
|
@@ -259,6 +260,7 @@ export async function sendWithRecovery(ctx) {
|
|
|
259
260
|
hooks.logTurnTiming('ok');
|
|
260
261
|
} catch (sendErr) {
|
|
261
262
|
hooks.logTurnTiming(`err:${sendErr?.code || sendErr?.name || 'unknown'}`);
|
|
263
|
+
stampStreamOutcome(sendErr, hooks.relayWitness);
|
|
262
264
|
return await recoverFromSendError(sendErr, { ...ctx, relayWitness: hooks.relayWitness });
|
|
263
265
|
}
|
|
264
266
|
return { action: 'proceed', response };
|
|
@@ -405,6 +407,7 @@ async function recoverFromSendError(sendErr, state) {
|
|
|
405
407
|
transportRetriesUsed = 0,
|
|
406
408
|
imageStripUsed = false,
|
|
407
409
|
thinkingReplayRepairUsed = false,
|
|
410
|
+
toolSchemaDropUsed = false,
|
|
408
411
|
relayWitness,
|
|
409
412
|
} = state;
|
|
410
413
|
const outcome = readStreamOutcome(sendErr, relayWitness);
|
|
@@ -446,6 +449,19 @@ async function recoverFromSendError(sendErr, state) {
|
|
|
446
449
|
) {
|
|
447
450
|
return retryTransport(sendErr, state);
|
|
448
451
|
}
|
|
452
|
+
// A 400 naming one tool's input schema: the session drops that tool (with
|
|
453
|
+
// the notice) and the turn is replayed once without it. Nothing was
|
|
454
|
+
// generated, and the same body would fail every later turn.
|
|
455
|
+
if (toolSchemaDropUsed !== true) {
|
|
456
|
+
const exclusion = rejectedToolSchema(sendErr, state);
|
|
457
|
+
if (exclusion) {
|
|
458
|
+
logLoop(
|
|
459
|
+
`[loop] provider rejected tool schema "${exclusion.name}" (${loopTag(state)}); dropping it and replaying once`
|
|
460
|
+
);
|
|
461
|
+
traceLoop(state, 'tool_schema_drop', { tool: exclusion.name });
|
|
462
|
+
return { action: 'retry_tool_schema_drop', exclusion };
|
|
463
|
+
}
|
|
464
|
+
}
|
|
449
465
|
// Anthropic replay-shape refusal: the latest assistant turn carries
|
|
450
466
|
// thinking blocks the API will not accept back (a thinking run it did not
|
|
451
467
|
// produce, or an empty text block). This is deterministic — the same body
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
// side-question-store.mjs — the in-memory state behind /btw side questions:
|
|
2
|
+
// per session, the latest provider request the main loop sent (the request a
|
|
3
|
+
// side question forks) and the side question in flight. It holds live
|
|
4
|
+
// provider/tool objects, so it never reaches the session record or disk.
|
|
5
|
+
import { isAgentOwner } from '../agent-owner.mjs';
|
|
6
|
+
|
|
7
|
+
// sessionId -> { provider, model, messages, tools, opts, response }
|
|
8
|
+
const requests = new Map();
|
|
9
|
+
// sessionId -> AbortController of the side question in flight.
|
|
10
|
+
const inFlight = new Map();
|
|
11
|
+
|
|
12
|
+
// Send options that steer the live loop rather than shape the request: its
|
|
13
|
+
// abort signal, a one-shot cache-break trace tag and the per-request stall
|
|
14
|
+
// budget. A forced tool choice is dropped too (a side question must be able
|
|
15
|
+
// to answer in text); the hard-cap `none` choice is kept.
|
|
16
|
+
const LOOP_ONLY_OPTIONS = new Set(['signal', 'cacheBreakIntent', '_stallRetryBudget', 'toolChoice']);
|
|
17
|
+
|
|
18
|
+
function requestOptions(opts) {
|
|
19
|
+
const out = {};
|
|
20
|
+
for (const [key, value] of Object.entries(opts || {})) {
|
|
21
|
+
if (typeof value === 'function' || LOOP_ONLY_OPTIONS.has(key)) continue;
|
|
22
|
+
out[key] = value;
|
|
23
|
+
}
|
|
24
|
+
if (opts?.toolChoice === 'none') out.toolChoice = 'none';
|
|
25
|
+
return out;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** A request in the stored shape: its own message list and only the send
|
|
29
|
+
* options a fork may reuse. `response` is null until the reply settles. */
|
|
30
|
+
export function sideQuestionRequestSnapshot({ provider, model, messages, tools, opts }) {
|
|
31
|
+
return {
|
|
32
|
+
provider,
|
|
33
|
+
model,
|
|
34
|
+
messages: [...messages],
|
|
35
|
+
tools: Array.isArray(tools) ? tools : [],
|
|
36
|
+
opts: requestOptions(opts),
|
|
37
|
+
response: null,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Record a provider request the main loop is sending as the session's latest
|
|
43
|
+
* one. Agent sessions record nothing (/btw is a Lead command). The handle
|
|
44
|
+
* attaches the reply once the send proceeds, or puts the previous request
|
|
45
|
+
* back when this one fails, so only a successfully sent request is kept.
|
|
46
|
+
*/
|
|
47
|
+
export function captureSideQuestionRequest({ sessionId, sessionRef, provider, model, messages, tools, opts }) {
|
|
48
|
+
if (!sessionId || !provider || isAgentOwner(sessionRef)) return null;
|
|
49
|
+
const previous = requests.get(sessionId);
|
|
50
|
+
const request = sideQuestionRequestSnapshot({ provider, model, messages, tools, opts });
|
|
51
|
+
requests.set(sessionId, request);
|
|
52
|
+
return {
|
|
53
|
+
settle(response) {
|
|
54
|
+
request.response = response || null;
|
|
55
|
+
},
|
|
56
|
+
discard() {
|
|
57
|
+
if (requests.get(sessionId) !== request) return;
|
|
58
|
+
if (previous) requests.set(sessionId, previous);
|
|
59
|
+
else requests.delete(sessionId);
|
|
60
|
+
},
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function sideQuestionRequest(sessionId) {
|
|
65
|
+
return (sessionId && requests.get(sessionId)) || null;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** Start the session's side question, aborting the one still in flight. */
|
|
69
|
+
export function beginSideQuestion(sessionId) {
|
|
70
|
+
cancelSideQuestion(sessionId);
|
|
71
|
+
const controller = new AbortController();
|
|
72
|
+
inFlight.set(sessionId, controller);
|
|
73
|
+
return {
|
|
74
|
+
signal: controller.signal,
|
|
75
|
+
end() {
|
|
76
|
+
if (inFlight.get(sessionId) === controller) inFlight.delete(sessionId);
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export function cancelSideQuestion(sessionId) {
|
|
82
|
+
const controller = sessionId ? inFlight.get(sessionId) : null;
|
|
83
|
+
if (!controller) return false;
|
|
84
|
+
inFlight.delete(sessionId);
|
|
85
|
+
controller.abort(new Error('Side question canceled.'));
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** The transcript the saved request carried is gone (clear, rewind): a later
|
|
90
|
+
* side question waits for the next request. `cancel` also aborts the side
|
|
91
|
+
* question in flight (session close / runtime unload). */
|
|
92
|
+
export function forgetSideQuestion(sessionId, { cancel = false } = {}) {
|
|
93
|
+
if (!sessionId) return;
|
|
94
|
+
requests.delete(sessionId);
|
|
95
|
+
if (cancel) cancelSideQuestion(sessionId);
|
|
96
|
+
}
|