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
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* src/tui/session/active-tool-summary.mjs - surfaced-tool activity summary.
|
|
3
3
|
*
|
|
4
4
|
* Status surfaces must react at tool start, before a shell is backgrounded or
|
|
5
|
-
* an agent worker
|
|
5
|
+
* an agent worker row exists. Track the three surfaced categories
|
|
6
6
|
* directly; background shell records and worker rows later dedupe by max.
|
|
7
7
|
*/
|
|
8
8
|
// Tool category -> the activeTools key it publishes under. Iteration order is
|
|
@@ -47,9 +47,6 @@ export function createContextState({
|
|
|
47
47
|
// (fresh id, copied transcript), hosts validating "resume returned the
|
|
48
48
|
// requested session" must accept the fork by its origin id.
|
|
49
49
|
sessionForkedFrom: runtime.session?.forkedFrom || null,
|
|
50
|
-
// Remote-attach marker: this surface is a live viewer on a session owned
|
|
51
|
-
// by another process; submits are injected, transcript follows disk.
|
|
52
|
-
sessionRemoteAttached: runtime.session?.remoteAttached === true,
|
|
53
50
|
clientHostPid: runtime.clientHostPid || null,
|
|
54
51
|
model: runtime.model,
|
|
55
52
|
provider: runtime.provider,
|
|
@@ -71,8 +68,10 @@ export function createContextState({
|
|
|
71
68
|
// Lead workspace record (worktrees/contract.mjs SessionWorkspace): the
|
|
72
69
|
// registered Project, the execution root, the worktree binding and its
|
|
73
70
|
// revision. Null while the session has never left its project folder.
|
|
74
|
-
// Identity-stable until a transition commits.
|
|
75
|
-
|
|
71
|
+
// Identity-stable until a transition commits. A project-folder session in a
|
|
72
|
+
// git repository publishes the folder's branch / detached commit too
|
|
73
|
+
// (getLiveWorkspace reads HEAD without spawning git).
|
|
74
|
+
workspace: runtime.getLiveWorkspace?.() ?? runtime.getWorkspace?.() ?? null,
|
|
76
75
|
systemShell: runtime.systemShell || { source: 'auto', command: '', effective: '' },
|
|
77
76
|
webSearchRoute: runtime.getWebSearchRoute?.() || runtime.webSearchRoute || null,
|
|
78
77
|
autoClear: autoClearState(),
|
|
@@ -8,7 +8,7 @@ import { isGoalQueuedEntry } from '../queue-helpers.mjs';
|
|
|
8
8
|
export function createContinuationQueue({ runtime, flags, getState, getPending, enqueue, visibility }) {
|
|
9
9
|
let scheduled = null;
|
|
10
10
|
let disposed = false;
|
|
11
|
-
const halted = () => disposed || flags.disposed || flags.pendingSessionReset;
|
|
11
|
+
const halted = () => disposed || flags.disposed || flags.pendingSessionReset || flags.quotaResumePending;
|
|
12
12
|
|
|
13
13
|
const cancelQueuedGoalContinuations = ({ keepCloseoutFor = null } = {}) => {
|
|
14
14
|
const pending = getPending();
|
|
@@ -38,7 +38,6 @@ export function createContinuationQueue({ runtime, flags, getState, getPending,
|
|
|
38
38
|
|
|
39
39
|
const shouldRunGoalContinuation = (entry) => {
|
|
40
40
|
if (halted()) return false;
|
|
41
|
-
if (getState().sessionRemoteAttached) return false;
|
|
42
41
|
if (entry?.mode === 'goal-closeout') {
|
|
43
42
|
const goal = visibility.refreshGoalState();
|
|
44
43
|
return goal?.status === 'duration_reached' && clean(entry.goalId) === clean(goal.id);
|
|
@@ -55,7 +54,7 @@ export function createContinuationQueue({ runtime, flags, getState, getPending,
|
|
|
55
54
|
scheduled = null;
|
|
56
55
|
if (halted()) return;
|
|
57
56
|
const state = getState();
|
|
58
|
-
if (state.busy || state.commandBusy
|
|
57
|
+
if (state.busy || state.commandBusy) return;
|
|
59
58
|
// Queued user work runs first, and a queued Goal entry already carries
|
|
60
59
|
// the next continuation.
|
|
61
60
|
if (getPending().length > 0) return;
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
// Deadline notices for the running Goal: the advance warning and the closeout
|
|
2
2
|
// once the duration is reached.
|
|
3
3
|
import { clean } from '../../../runtime/shared/clean.mjs';
|
|
4
|
-
import {
|
|
4
|
+
import {
|
|
5
|
+
goalDeadlineReached,
|
|
6
|
+
goalDeadlineWarning,
|
|
7
|
+
} from '../../../runtime/agent/orchestrator/runtime-core/goal-text.mjs';
|
|
5
8
|
import { isGoalQueuedEntry } from '../queue-helpers.mjs';
|
|
6
9
|
|
|
7
10
|
export function createDeadlineDelivery({ runtime, getState, getPending, enqueue, halted }) {
|
|
@@ -54,7 +57,6 @@ export function createDeadlineDelivery({ runtime, getState, getPending, enqueue,
|
|
|
54
57
|
const deliverGoalCloseout = (goal) => {
|
|
55
58
|
if (halted()) return;
|
|
56
59
|
const state = getState();
|
|
57
|
-
if (state.sessionRemoteAttached) return;
|
|
58
60
|
if (!state.busy && getPending().some((entry) => !isGoalQueuedEntry(entry))) {
|
|
59
61
|
runtime.markGoalReminder?.('deadline-reached');
|
|
60
62
|
return;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/tui/session/goal-continuation/session-boundary.mjs - a session boundary
|
|
3
|
+
* (resume, new session, context switch) changes which Goal is current, so the
|
|
4
|
+
* continuation queued for the previous session is dropped and the current
|
|
5
|
+
* session's Goal is re-read and re-armed once the boundary settles.
|
|
6
|
+
*/
|
|
7
|
+
const SESSION_BOUNDARY_METHODS = ['resume', 'newSession', 'switchContext'];
|
|
8
|
+
|
|
9
|
+
export function rearmGoalContinuationOnSessionBoundaries({ api, bag }) {
|
|
10
|
+
for (const method of SESSION_BOUNDARY_METHODS) {
|
|
11
|
+
if (typeof api[method] !== 'function') continue;
|
|
12
|
+
const base = api[method].bind(api);
|
|
13
|
+
api[method] = async (...args) => {
|
|
14
|
+
const result = await base(...args);
|
|
15
|
+
bag.cancelQueuedGoalContinuations?.();
|
|
16
|
+
bag.refreshGoalState?.();
|
|
17
|
+
bag.scheduleGoalContinuation?.();
|
|
18
|
+
return result;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -11,42 +11,23 @@
|
|
|
11
11
|
import {
|
|
12
12
|
cancelQuotaResumeEntry,
|
|
13
13
|
forgetQuotaSuspendedGoal,
|
|
14
|
-
isAgentOnlySession,
|
|
15
14
|
noteQuotaSuspendedGoal,
|
|
16
15
|
publicQuotaResume,
|
|
17
16
|
quotaAutoResumeEnabled,
|
|
18
17
|
quotaResumeEntry,
|
|
19
18
|
quotaSuspendedGoal,
|
|
19
|
+
rekeyQuotaResumeTurn,
|
|
20
20
|
scheduleQuotaResumeEntry,
|
|
21
21
|
subscribeQuotaResume,
|
|
22
22
|
} from '../../runtime/shared/quota-resume-store.mjs';
|
|
23
|
-
import { createSubmissionIntake } from './session-api/intake/submission.mjs';
|
|
24
23
|
|
|
25
24
|
export const RETRY_CONTINUE_INSTRUCTION = 'Continue from where you left off.';
|
|
25
|
+
import { transcriptTurnKeys } from '../../runtime/shared/transcript-turn-keys.mjs';
|
|
26
|
+
export { transcriptTurnKeys };
|
|
26
27
|
|
|
27
28
|
// Rows that frame a turn rather than carry its output (desktop transcript-rows).
|
|
28
29
|
const TURN_CHROME_KINDS = new Set(['user', 'turndone', 'statusdone', 'notice']);
|
|
29
30
|
|
|
30
|
-
function stableItemKey(item, index) {
|
|
31
|
-
if (item?.id !== undefined && item?.id !== null) return String(item.id);
|
|
32
|
-
return `${item?.kind || 'item'}:${item?.text || item?.label || item?.status || ''}:${index}`;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/** Turn identity per transcript row — the same keys the desktop derives. */
|
|
36
|
-
export function transcriptTurnKeys(items) {
|
|
37
|
-
const transcript = Array.isArray(items) ? items : [];
|
|
38
|
-
const keys = [];
|
|
39
|
-
let activeTurn = null;
|
|
40
|
-
for (let index = 0; index < transcript.length; index += 1) {
|
|
41
|
-
const item = transcript[index];
|
|
42
|
-
if (item?.kind === 'user') activeTurn = `turn:${stableItemKey(item, index)}`;
|
|
43
|
-
if (!activeTurn) activeTurn = `segment:${stableItemKey(item, index)}`;
|
|
44
|
-
keys.push(activeTurn);
|
|
45
|
-
if (item?.kind === 'turndone') activeTurn = null;
|
|
46
|
-
}
|
|
47
|
-
return keys;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
31
|
/** The failed turndone that ended the transcript on exhausted provider quota,
|
|
51
32
|
* when no later turn has begun: { turnKey, quota: { provider, model, resetAt|null } }. */
|
|
52
33
|
export function latestQuotaFailure(items) {
|
|
@@ -106,7 +87,7 @@ export function failedTurnRetryPrompt(items, turnKey) {
|
|
|
106
87
|
}
|
|
107
88
|
if (!TURN_CHROME_KINDS.has(String(item?.kind || ''))) sampled = true;
|
|
108
89
|
}
|
|
109
|
-
if (!prompt) return null;
|
|
90
|
+
if (!prompt) return sampled ? RETRY_CONTINUE_INSTRUCTION : null;
|
|
110
91
|
// Transcript rows keep only attachment metadata, so a text-only replay
|
|
111
92
|
// would drop the attachments and the rewind would delete the original row.
|
|
112
93
|
if (hasAttachments && !sampled) return null;
|
|
@@ -116,11 +97,6 @@ export function failedTurnRetryPrompt(items, turnKey) {
|
|
|
116
97
|
export function createQuotaResumeLane(bag) {
|
|
117
98
|
const { runtime, flags, getState, set, pending } = bag;
|
|
118
99
|
const currentId = () => String(getState().sessionId || '');
|
|
119
|
-
let intake = null;
|
|
120
|
-
const submitAsync = (...args) => {
|
|
121
|
-
intake ??= createSubmissionIntake(bag);
|
|
122
|
-
return intake.submitAsync(...args);
|
|
123
|
-
};
|
|
124
100
|
|
|
125
101
|
const publishQuotaResume = () => {
|
|
126
102
|
const next = publicQuotaResume(quotaResumeEntry(currentId()));
|
|
@@ -140,8 +116,6 @@ export function createQuotaResumeLane(bag) {
|
|
|
140
116
|
routeProvider: String(runtime.sessionProvider ?? runtime.provider ?? ''),
|
|
141
117
|
routeModel: String(runtime.sessionModel ?? runtime.model ?? ''),
|
|
142
118
|
});
|
|
143
|
-
// A delegated agent child never owns a resume: the Lead decides its retries.
|
|
144
|
-
const agentOnly = () => isAgentOnlySession({ id: currentId(), ...runtime.session });
|
|
145
119
|
const queueResume = (sessionId, failure) =>
|
|
146
120
|
scheduleQuotaResumeEntry({ sessionId, turnKey: failure.turnKey, ...failure.quota, ...sessionRoute() });
|
|
147
121
|
|
|
@@ -151,6 +125,7 @@ export function createQuotaResumeLane(bag) {
|
|
|
151
125
|
// that window also keeps the settlement from recording the Goal.
|
|
152
126
|
let settlement = null;
|
|
153
127
|
let cancelEpoch = 0;
|
|
128
|
+
let retryClaim = '';
|
|
154
129
|
|
|
155
130
|
const cancelFor = (sessionId) => {
|
|
156
131
|
cancelEpoch += 1;
|
|
@@ -169,24 +144,107 @@ export function createQuotaResumeLane(bag) {
|
|
|
169
144
|
state.commandBusy ||
|
|
170
145
|
flags.autoClearRunning ||
|
|
171
146
|
flags.draining ||
|
|
147
|
+
flags.quotaResumePending ||
|
|
172
148
|
pending.length > 0
|
|
173
149
|
);
|
|
174
150
|
};
|
|
175
151
|
|
|
176
|
-
/**
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
152
|
+
/** A resume preserves its history rather than running idle auto-clear. */
|
|
153
|
+
function retainedRetryInput() {
|
|
154
|
+
const messages = runtime.readModelMessages?.().messages;
|
|
155
|
+
const message = Array.isArray(messages) ? messages.findLast((item) => item?.role !== 'system') : null;
|
|
156
|
+
const transcript = message?.meta?.transcript;
|
|
157
|
+
if (message?.role !== 'user' || !transcript?.messageId || transcript?.completion?.status !== 'failed') return null;
|
|
158
|
+
return { content: message.content, messageId: transcript.messageId, attemptId: transcript.completion.attemptId };
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
function retryFailedTurn(turnKey) {
|
|
162
|
+
const retained = retainedRetryInput();
|
|
163
|
+
if (retained) {
|
|
164
|
+
return bag.enqueue(retained.content, {
|
|
165
|
+
mode: 'prompt',
|
|
166
|
+
id: bag.nextId(),
|
|
167
|
+
retryFailedTurn: true,
|
|
168
|
+
retryTurnId: retained.messageId,
|
|
169
|
+
retryAttemptId: retained.attemptId,
|
|
170
|
+
suppressDisplay: true,
|
|
171
|
+
skipSlashCommands: true,
|
|
172
|
+
});
|
|
173
|
+
}
|
|
180
174
|
const prompt = failedTurnRetryPrompt(getState().items, turnKey);
|
|
181
175
|
if (!prompt) return false;
|
|
182
|
-
|
|
183
|
-
|
|
176
|
+
return bag.enqueue(prompt, { mode: 'prompt', id: bag.nextId(), displayText: prompt, retryFailedTurn: true });
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function finishResume(id, entry, goalId = '') {
|
|
180
|
+
if (entry) cancelQuotaResumeEntry(id, { generation: entry.generation });
|
|
181
|
+
if (goalId && quotaSuspendedGoal(id, entry?.turnKey || latestFailedTurnKey(getState().items)) === goalId) {
|
|
182
|
+
forgetQuotaSuspendedGoal(id);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
async function resumeGoal(id, key, goalId, entry, claim) {
|
|
187
|
+
const token = { epoch: cancelEpoch, admitted: false };
|
|
188
|
+
const generation = entry?.generation ?? null;
|
|
189
|
+
const current = () =>
|
|
190
|
+
currentId() === id &&
|
|
191
|
+
cancelEpoch === token.epoch &&
|
|
192
|
+
!flags.disposed &&
|
|
193
|
+
(flags.admission || 'open') === 'open' &&
|
|
194
|
+
latestFailedTurnKey(getState().items) === key &&
|
|
195
|
+
(quotaResumeEntry(id)?.generation ?? null) === generation;
|
|
196
|
+
const prompt = failedTurnRetryPrompt(getState().items, key);
|
|
197
|
+
const retained = retainedRetryInput();
|
|
198
|
+
flags.quotaResumePending = token;
|
|
199
|
+
let accepted = false;
|
|
200
|
+
let recoveryFailed = false;
|
|
201
|
+
try {
|
|
202
|
+
if (typeof runtime.reactivateUsageLimitedGoal !== 'function') throw new Error('Goal resume is unavailable.');
|
|
203
|
+
const goal = await runtime.reactivateUsageLimitedGoal(goalId, {
|
|
204
|
+
isCurrent: current,
|
|
205
|
+
accept: () => {
|
|
206
|
+
if (!current()) return false;
|
|
207
|
+
if ((retained || prompt) && retryFailedTurn(key) === false) return false;
|
|
208
|
+
token.admitted = true;
|
|
209
|
+
return true;
|
|
210
|
+
},
|
|
211
|
+
});
|
|
212
|
+
accepted = goal?.status === 'active' && token.admitted;
|
|
213
|
+
if (accepted) finishResume(id, entry, goalId);
|
|
214
|
+
return accepted;
|
|
215
|
+
} catch (error) {
|
|
216
|
+
recoveryFailed = error?.quotaResumeRollbackFailed === true;
|
|
217
|
+
bag.pushNotice?.(`Goal resume failed: ${error?.message || error}`, 'warn', { transcript: true });
|
|
218
|
+
throw error;
|
|
219
|
+
} finally {
|
|
220
|
+
if (!accepted && retryClaim === claim) retryClaim = '';
|
|
221
|
+
if (!recoveryFailed && flags.quotaResumePending === token) {
|
|
222
|
+
flags.quotaResumePending = null;
|
|
223
|
+
void bag.drain?.();
|
|
224
|
+
if (accepted && !retained && !prompt) bag.scheduleGoalContinuation?.();
|
|
225
|
+
}
|
|
184
226
|
}
|
|
185
|
-
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
function hasResumeInput(key) {
|
|
230
|
+
if (retainedRetryInput()) return true;
|
|
231
|
+
if (failedTurnRetryPrompt(getState().items, key)) return true;
|
|
232
|
+
if (key.startsWith('turn:')) return false;
|
|
233
|
+
return Boolean(
|
|
234
|
+
quotaSuspendedGoal(currentId(), key) ||
|
|
235
|
+
(runtime.goalStatus?.()?.id && typeof runtime.reactivateUsageLimitedGoal === 'function')
|
|
236
|
+
);
|
|
186
237
|
}
|
|
187
238
|
|
|
188
239
|
return {
|
|
189
240
|
publishQuotaResume,
|
|
241
|
+
reconcileQuotaResume() {
|
|
242
|
+
const items = getState().items;
|
|
243
|
+
const key = latestFailedTurnKey(items);
|
|
244
|
+
const failure = items?.findLast((item) => item?.kind === 'turndone');
|
|
245
|
+
if (!key || failure?.attemptId || !failure?.checkpointId) return false;
|
|
246
|
+
return rekeyQuotaResumeTurn(currentId(), `turn:${failure.checkpointId}`, key);
|
|
247
|
+
},
|
|
190
248
|
disposeQuotaResume: unsubscribe,
|
|
191
249
|
|
|
192
250
|
/** Turn close, synchronously with the failed turndone: with a known reset
|
|
@@ -198,7 +256,13 @@ export function createQuotaResumeLane(bag) {
|
|
|
198
256
|
settlement = null;
|
|
199
257
|
if (!id || !failure) return null;
|
|
200
258
|
settlement = { sessionId: id, turnKey: failure.turnKey, epoch: cancelEpoch };
|
|
201
|
-
if (failure.quota.resetAt === null || !quotaAutoResumeEnabled()
|
|
259
|
+
if (failure.quota.resetAt === null || !quotaAutoResumeEnabled()) return null;
|
|
260
|
+
if (!hasResumeInput(failure.turnKey)) {
|
|
261
|
+
bag.pushNotice?.('This turn cannot be resumed automatically. Send a new message to continue.', 'warn', {
|
|
262
|
+
transcript: true,
|
|
263
|
+
});
|
|
264
|
+
return null;
|
|
265
|
+
}
|
|
202
266
|
return queueResume(id, failure);
|
|
203
267
|
},
|
|
204
268
|
|
|
@@ -220,22 +284,24 @@ export function createQuotaResumeLane(bag) {
|
|
|
220
284
|
/** Explicit request to auto-resume the latest quota-failed turn. */
|
|
221
285
|
scheduleQuotaResume(sessionId) {
|
|
222
286
|
requireAddressed(sessionId);
|
|
223
|
-
if (agentOnly()) throw new Error('agent sessions do not auto-resume; the Lead decides retries');
|
|
224
287
|
const failure = latestQuotaFailure(getState().items);
|
|
225
288
|
if (!failure || failure.quota.resetAt === null) {
|
|
226
289
|
throw new Error('latest turn did not fail on exhausted provider quota with a known reset time');
|
|
227
290
|
}
|
|
291
|
+
if (!hasResumeInput(failure.turnKey))
|
|
292
|
+
throw new Error('This turn cannot be resumed automatically. Send a new message to continue.');
|
|
228
293
|
queueResume(sessionId, failure);
|
|
229
294
|
return true;
|
|
230
295
|
},
|
|
231
296
|
|
|
232
297
|
cancelQuotaResume(sessionId) {
|
|
233
298
|
requireAddressed(sessionId);
|
|
299
|
+
cancelEpoch += 1;
|
|
234
300
|
cancelQuotaResumeEntry(sessionId);
|
|
235
301
|
return true;
|
|
236
302
|
},
|
|
237
303
|
|
|
238
|
-
/** A
|
|
304
|
+
/** A session clear/delete supersedes the wait. */
|
|
239
305
|
supersedeQuotaResume(sessionId) {
|
|
240
306
|
if (sessionId) cancelFor(String(sessionId));
|
|
241
307
|
},
|
|
@@ -248,7 +314,23 @@ export function createQuotaResumeLane(bag) {
|
|
|
248
314
|
requireAddressed(sessionId);
|
|
249
315
|
const key = String(turnKey || '');
|
|
250
316
|
if (!key || retryBlocked() || latestFailedTurnKey(getState().items) !== key) return false;
|
|
251
|
-
|
|
317
|
+
const claim = `${sessionId}\u0000${key}`;
|
|
318
|
+
if (retryClaim === claim) return false;
|
|
319
|
+
const goalId = quotaSuspendedGoal(sessionId, key);
|
|
320
|
+
if (!retainedRetryInput() && !failedTurnRetryPrompt(getState().items, key) && !goalId) {
|
|
321
|
+
return false;
|
|
322
|
+
}
|
|
323
|
+
retryClaim = claim;
|
|
324
|
+
const entry = quotaResumeEntry(sessionId);
|
|
325
|
+
if (goalId) return resumeGoal(sessionId, key, goalId, entry, claim);
|
|
326
|
+
let accepted = false;
|
|
327
|
+
try {
|
|
328
|
+
accepted = retryFailedTurn(key) !== false;
|
|
329
|
+
if (accepted) finishResume(sessionId, entry);
|
|
330
|
+
return accepted;
|
|
331
|
+
} finally {
|
|
332
|
+
if (!accepted && retryClaim === claim) retryClaim = '';
|
|
333
|
+
}
|
|
252
334
|
},
|
|
253
335
|
|
|
254
336
|
/** Scheduler fire for the entry of `generation`, after a usable reading.
|
|
@@ -258,10 +340,6 @@ export function createQuotaResumeLane(bag) {
|
|
|
258
340
|
const id = currentId();
|
|
259
341
|
const entry = quotaResumeEntry(id);
|
|
260
342
|
if (!id || !entry || entry.generation !== generation) return 'stale';
|
|
261
|
-
if (agentOnly()) {
|
|
262
|
-
cancelQuotaResumeEntry(id, { generation });
|
|
263
|
-
return 'agent-session';
|
|
264
|
-
}
|
|
265
343
|
const state = getState();
|
|
266
344
|
if (retryBlocked()) return 'busy';
|
|
267
345
|
const failure = latestQuotaFailure(state.items);
|
|
@@ -269,28 +347,29 @@ export function createQuotaResumeLane(bag) {
|
|
|
269
347
|
cancelQuotaResumeEntry(id, { generation });
|
|
270
348
|
return 'superseded';
|
|
271
349
|
}
|
|
272
|
-
const route = sessionRoute();
|
|
273
|
-
if (route.routeProvider !== entry.routeProvider || route.routeModel !== entry.routeModel) {
|
|
274
|
-
cancelQuotaResumeEntry(id, { generation });
|
|
275
|
-
return 'route-changed';
|
|
276
|
-
}
|
|
277
350
|
const goalId = quotaSuspendedGoal(id, entry.turnKey);
|
|
278
351
|
// A user turn replays its prompt; an automatic Goal turn has no user row
|
|
279
352
|
// and resumes as its Goal's next continuation.
|
|
280
|
-
|
|
281
|
-
|
|
353
|
+
if (!retainedRetryInput() && !failedTurnRetryPrompt(state.items, entry.turnKey) && !goalId) {
|
|
354
|
+
bag.pushNotice?.('This turn cannot be resumed automatically. Send a new message to continue.', 'warn', {
|
|
355
|
+
transcript: true,
|
|
356
|
+
});
|
|
282
357
|
cancelQuotaResumeEntry(id, { generation });
|
|
283
358
|
return 'unreplayable';
|
|
284
359
|
}
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
if (
|
|
293
|
-
|
|
360
|
+
const claim = `${id}\u0000${entry.turnKey}`;
|
|
361
|
+
if (retryClaim === claim) return 'stale';
|
|
362
|
+
retryClaim = claim;
|
|
363
|
+
if (goalId)
|
|
364
|
+
return resumeGoal(id, entry.turnKey, goalId, entry, claim).then((accepted) =>
|
|
365
|
+
accepted ? 'fired' : 'rejected'
|
|
366
|
+
);
|
|
367
|
+
if (retryFailedTurn(entry.turnKey) === false) {
|
|
368
|
+
retryClaim = '';
|
|
369
|
+
return 'rejected';
|
|
370
|
+
}
|
|
371
|
+
finishResume(id, entry);
|
|
372
|
+
return 'fired';
|
|
294
373
|
},
|
|
295
374
|
};
|
|
296
375
|
}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
* commands.mjs — the session object's long-running slash commands: memory
|
|
3
3
|
* control, recall, doctor, and manual compaction (scheduled for turn end when
|
|
4
4
|
* a turn is running). Each shows a command status while it holds the lock.
|
|
5
|
+
* /btw side questions (askSide/cancelSide) run beside them, lock-free.
|
|
5
6
|
*/
|
|
6
7
|
import { compactEventDetail } from '../labels.mjs';
|
|
7
8
|
import { archiveItemsForCompaction, compactionArchivedRows } from '../compaction-view.mjs';
|
|
@@ -92,16 +93,14 @@ export function createSessionCommandsApi(bag) {
|
|
|
92
93
|
};
|
|
93
94
|
};
|
|
94
95
|
|
|
95
|
-
// The compaction pass
|
|
96
|
-
|
|
97
|
-
// would not reduce anything and then adds no row for it.
|
|
98
|
-
async function runCompaction(startedAt, { quiet = false } = {}) {
|
|
96
|
+
// The explicit compaction pass, under a lock its caller holds.
|
|
97
|
+
async function runCompaction(startedAt) {
|
|
99
98
|
// Give Ink one event-loop turn to paint the compacting spinner before
|
|
100
99
|
// runtime.compact() starts synchronous session/transcript work (same
|
|
101
100
|
// yield as the auto-clear path; without it /compact looks frozen with
|
|
102
101
|
// no spinner until the compact already finished).
|
|
103
102
|
await new Promise((resolve) => setTimeout(resolve, 0));
|
|
104
|
-
const result = await runtime.compact({ recoverAgent: true
|
|
103
|
+
const result = await runtime.compact({ recoverAgent: true });
|
|
105
104
|
const compactChanged = Boolean(result && !result.error && result.changed !== false);
|
|
106
105
|
syncContextStats({
|
|
107
106
|
allowEstimated: true,
|
|
@@ -114,16 +113,12 @@ export function createSessionCommandsApi(bag) {
|
|
|
114
113
|
archived: compactionArchivedRows(result),
|
|
115
114
|
});
|
|
116
115
|
set({ items: replaceItems(items, { preserveSpill: true }) });
|
|
117
|
-
} else
|
|
116
|
+
} else {
|
|
118
117
|
pushItem(compactDoneItem(result, startedAt));
|
|
119
118
|
}
|
|
120
119
|
return result;
|
|
121
120
|
}
|
|
122
121
|
|
|
123
|
-
// An in-place model switch compacts first on the current model (routes.mjs
|
|
124
|
-
// holds the command lock and shows the compacting status meanwhile).
|
|
125
|
-
bag.compactBeforeModelSwitch = () => runCompaction(Date.now(), { quiet: true });
|
|
126
|
-
|
|
127
122
|
async function compactCommand() {
|
|
128
123
|
if (getState().commandBusy) return null;
|
|
129
124
|
if (getState().busy) return scheduleCompactForTurnEnd(compactCommand);
|
|
@@ -175,5 +170,14 @@ export function createSessionCommandsApi(bag) {
|
|
|
175
170
|
});
|
|
176
171
|
},
|
|
177
172
|
compact: compactCommand,
|
|
173
|
+
// /btw: answered from the conversation so far while a turn keeps running.
|
|
174
|
+
// No command lock and no transcript row: the answer is only returned.
|
|
175
|
+
askSide: (question) => runtime.askSide(question),
|
|
176
|
+
// `sessionId` names the session the side question was asked in (it may
|
|
177
|
+
// no longer be the current one after a switch); omitted, the current one.
|
|
178
|
+
cancelSide: (sessionId) => {
|
|
179
|
+
if (typeof sessionId === 'string' && sessionId) runtime.cancelSide(sessionId);
|
|
180
|
+
else runtime.cancelSide();
|
|
181
|
+
},
|
|
178
182
|
};
|
|
179
183
|
}
|
|
@@ -67,6 +67,18 @@ export function createSessionControlsApi(bag) {
|
|
|
67
67
|
stopShellJob: async (taskId) => {
|
|
68
68
|
return (await runtime.stopShellJob?.(taskId)) ?? { stopped: false, error: 'shell job control is unavailable' };
|
|
69
69
|
},
|
|
70
|
+
// Explicit force-release of a shell whose termination is unconfirmed:
|
|
71
|
+
// { released, error? }. Surfaces confirm with the user before calling.
|
|
72
|
+
releaseShellJob: async (taskId) => {
|
|
73
|
+
return (
|
|
74
|
+
(await runtime.releaseShellJob?.(taskId)) ?? { released: false, error: 'shell job control is unavailable' }
|
|
75
|
+
);
|
|
76
|
+
},
|
|
77
|
+
// This session's live shell jobs, each flagged when its termination is
|
|
78
|
+
// unconfirmed: { jobs }.
|
|
79
|
+
listShellJobs: async () => {
|
|
80
|
+
return (await runtime.listShellJobs?.()) ?? { jobs: [] };
|
|
81
|
+
},
|
|
70
82
|
goalControl: async (args = {}) => {
|
|
71
83
|
const result = await runtime.goalControl?.(args);
|
|
72
84
|
if (['pause', 'stop'].includes(result?.action)) {
|
|
@@ -91,8 +103,8 @@ export function createSessionControlsApi(bag) {
|
|
|
91
103
|
);
|
|
92
104
|
return result;
|
|
93
105
|
},
|
|
94
|
-
setCwd: (path, options = {}) => {
|
|
95
|
-
const next = runtime.setCwd(path);
|
|
106
|
+
setCwd: async (path, options = {}) => {
|
|
107
|
+
const next = await runtime.setCwd(path);
|
|
96
108
|
// Republish up-arrow history for the NEW project: current session prompts
|
|
97
109
|
// merged with the cwd-scoped persisted store for the new cwd.
|
|
98
110
|
const sessionList = recomputePromptHistory(getState().items);
|
|
@@ -38,8 +38,8 @@ export function createSessionIntegrationsApi(bag, { oauthFlows }) {
|
|
|
38
38
|
getQuotaHistory: async (options = {}) => {
|
|
39
39
|
return await runtime.getQuotaHistory?.(options);
|
|
40
40
|
},
|
|
41
|
-
getSessionUsage: async () => {
|
|
42
|
-
return await runtime.getSessionUsage?.();
|
|
41
|
+
getSessionUsage: async (options = {}) => {
|
|
42
|
+
return await runtime.getSessionUsage?.(options);
|
|
43
43
|
},
|
|
44
44
|
consumeCodexRateLimitResetCredit: async (options = {}) => {
|
|
45
45
|
// Desktop capability parity: without this delegation the session runtime
|
|
@@ -52,6 +52,12 @@ export function createSessionIntegrationsApi(bag, { oauthFlows }) {
|
|
|
52
52
|
getSessionReviewDiff: async () => {
|
|
53
53
|
return (await runtime.getSessionReviewDiff?.()) ?? { supported: false, files: [], patch: '' };
|
|
54
54
|
},
|
|
55
|
+
getSessionReviewFilePatch: async (file, oldPath) => {
|
|
56
|
+
return (await runtime.getSessionReviewFilePatch?.(file, oldPath)) ?? { supported: false, patch: '' };
|
|
57
|
+
},
|
|
58
|
+
getTurnReviewFilePatch: async (file) => {
|
|
59
|
+
return (await runtime.getTurnReviewFilePatch?.(file)) ?? { supported: false, patch: '' };
|
|
60
|
+
},
|
|
55
61
|
revertTurnReview: async (checkpointId) => {
|
|
56
62
|
return await requireRuntimeMethod('revertTurnReview', 'Turn review revert is unavailable')(checkpointId);
|
|
57
63
|
},
|
|
@@ -140,6 +146,7 @@ export function createSessionIntegrationsApi(bag, { oauthFlows }) {
|
|
|
140
146
|
return result;
|
|
141
147
|
},
|
|
142
148
|
testCustomProvider: (input) => runtime.testCustomProvider(input),
|
|
149
|
+
checkCustomProviderKeyEnv: (name) => runtime.checkCustomProviderKeyEnv(name),
|
|
143
150
|
discoverCustomProviderModels: (input) => runtime.discoverCustomProviderModels(input),
|
|
144
151
|
saveOpenCodeGoUsageAuth: async (opts) => {
|
|
145
152
|
await runtime.saveOpenCodeGoUsageAuth(opts);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// Dispose: release
|
|
1
|
+
// Dispose: release timers, subscriptions, approvals and OAuth flows,
|
|
2
2
|
// persist steering, then close the runtime — once.
|
|
3
3
|
import { flushTuiSteeringPersist } from '../../tui-steering-persist.mjs';
|
|
4
4
|
|
|
@@ -20,14 +20,6 @@ export function createDisposeAction(bag, { oauthFlows }) {
|
|
|
20
20
|
if (flags.disposed) return;
|
|
21
21
|
disposeEmit?.();
|
|
22
22
|
flags.disposed = true;
|
|
23
|
-
// Release the interactive-presence beacon so a cross-open after this
|
|
24
|
-
// surface exits takes normal ownership instead of viewer-attaching to a
|
|
25
|
-
// dead owner (crash paths fall back to the 2min staleness window).
|
|
26
|
-
try {
|
|
27
|
-
runtime.clearSessionPresence?.();
|
|
28
|
-
} catch {
|
|
29
|
-
/* best-effort */
|
|
30
|
-
}
|
|
31
23
|
clearToastTimers();
|
|
32
24
|
disposeTranscriptSpill?.();
|
|
33
25
|
disposeGoalContinuation?.();
|
|
@@ -40,6 +32,8 @@ export function createDisposeAction(bag, { oauthFlows }) {
|
|
|
40
32
|
'unsubscribeAgentStatus',
|
|
41
33
|
'unsubscribeRemoteState',
|
|
42
34
|
'unsubscribeCompletionWakeGate',
|
|
35
|
+
'unsubscribeGitHeadWatch',
|
|
36
|
+
'unsubscribeWorktreeSetup',
|
|
43
37
|
]) {
|
|
44
38
|
try {
|
|
45
39
|
lifecycle[key]?.();
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// Resume: reopen a stored session, rebuild the visible transcript from its
|
|
2
|
-
// messages and reconcile
|
|
2
|
+
// messages and reconcile steering at the same boundary.
|
|
3
3
|
import { primeContextEstimates } from '../../../../runtime/agent/orchestrator/session/context-utils.mjs';
|
|
4
4
|
import { resumedTranscriptArchive } from '../../compaction-view.mjs';
|
|
5
5
|
|
|
@@ -63,12 +63,7 @@ export function createResumeAction(bag, { restoreTranscriptItems }) {
|
|
|
63
63
|
...routeState(),
|
|
64
64
|
stats: { ...getState().stats },
|
|
65
65
|
});
|
|
66
|
-
|
|
67
|
-
// start). The 3s share tick otherwise leaves a live-owned session on
|
|
68
|
-
// the stale disk snapshot and then full-swaps it seconds after entry —
|
|
69
|
-
// the visible transcript lurch. Connecting here makes the owner's
|
|
70
|
-
// full frame land at the resume boundary, so entry paints settled.
|
|
71
|
-
bag.ensureLiveShare?.();
|
|
66
|
+
bag.reconcileQuotaResume?.();
|
|
72
67
|
// A shard/process restart recreates the runtime before resuming its
|
|
73
68
|
// durable session. Restore accepted steering while commandBusy is
|
|
74
69
|
// still held so the central release hook drains it exactly once after
|