mixdog 1.2.1 → 1.2.3
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 +19 -3
- package/scripts/model-catalog-audit.mjs +1 -15
- package/scripts/provider-pingpong-live.mjs +509 -0
- package/src/agents/advisor/AGENT.md +1 -1
- package/src/agents/advisor/agent.json +1 -1
- package/src/agents/reviewer/AGENT.md +3 -3
- package/src/agents/reviewer/agent.json +1 -1
- package/src/defaults/shipped-history.json +6 -0
- 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 +7 -4
- package/src/output-styles/common.md +11 -10
- package/src/repl/slash-commands.mjs +16 -1
- package/src/rules/agent/AGENT.md +5 -5
- package/src/rules/lead/LEAD.md +5 -5
- package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +29 -4
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +10 -0
- 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/client-config.mjs +36 -7
- package/src/runtime/agent/orchestrator/mcp/client-handshake.mjs +49 -10
- package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +40 -3
- package/src/runtime/agent/orchestrator/mcp/client.mjs +230 -96
- package/src/runtime/agent/orchestrator/mcp/oauth-callback.mjs +103 -0
- package/src/runtime/agent/orchestrator/mcp/oauth-credentials.mjs +150 -0
- package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +111 -0
- package/src/runtime/agent/orchestrator/mcp/oauth-probe.mjs +87 -0
- package/src/runtime/agent/orchestrator/mcp/oauth-provider.mjs +95 -0
- package/src/runtime/agent/orchestrator/mcp/oauth-request.mjs +122 -0
- package/src/runtime/agent/orchestrator/mcp/oauth-shared.mjs +9 -0
- package/src/runtime/agent/orchestrator/mcp/oauth.mjs +229 -0
- package/src/runtime/agent/orchestrator/providers/account-pool.mjs +188 -29
- package/src/runtime/agent/orchestrator/providers/anthropic-api-recovery.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +48 -20
- package/src/runtime/agent/orchestrator/providers/anthropic-api-transport.mjs +94 -31
- package/src/runtime/agent/orchestrator/providers/anthropic-error-contract.mjs +98 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-fast-mode.mjs +39 -18
- package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens-recovery.mjs +55 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens.mjs +48 -37
- package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +10 -7
- package/src/runtime/agent/orchestrator/providers/anthropic-midstream-recovery.mjs +18 -4
- package/src/runtime/agent/orchestrator/providers/anthropic-model-resolve.mjs +13 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-midstream.mjs +10 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-recovery.mjs +23 -9
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/initial-status.mjs +46 -20
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request.mjs +14 -9
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +102 -45
- package/src/runtime/agent/orchestrator/providers/anthropic-overload-fallback.mjs +69 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-server-fallback.mjs +4 -0
- 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 +10 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +9 -0
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +40 -7
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-catalog.mjs +30 -9
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth.mjs +7 -0
- package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +88 -21
- package/src/runtime/agent/orchestrator/providers/antigravity-response.mjs +30 -10
- package/src/runtime/agent/orchestrator/providers/antigravity-retry-policy.mjs +106 -0
- package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +10 -61
- package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +94 -15
- 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 +75 -10
- package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/cursor-wire-guards.mjs +97 -2
- package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-bridge.mjs +103 -23
- package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-messages.mjs +43 -2
- package/src/runtime/agent/orchestrator/providers/cursor-wire-transport.mjs +103 -33
- package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +32 -6
- package/src/runtime/agent/orchestrator/providers/cursor.mjs +27 -3
- package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +64 -1
- package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +70 -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 +80 -18
- package/src/runtime/agent/orchestrator/providers/gemini-cache-policy.mjs +11 -4
- package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +46 -8
- package/src/runtime/agent/orchestrator/providers/gemini-error-contract.mjs +273 -0
- package/src/runtime/agent/orchestrator/providers/gemini-family.mjs +9 -0
- package/src/runtime/agent/orchestrator/providers/gemini-history-signatures.mjs +9 -4
- package/src/runtime/agent/orchestrator/providers/gemini-request-body.mjs +41 -5
- package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/gemini-retry-policy.mjs +180 -0
- package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +369 -112
- package/src/runtime/agent/orchestrator/providers/gemini-sdk-request.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +140 -35
- package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +70 -24
- package/src/runtime/agent/orchestrator/providers/gemini.mjs +80 -29
- package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/grok-oauth-tokens.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +69 -19
- 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 +246 -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 +388 -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/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 +48 -22
- package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +119 -18
- package/src/runtime/agent/orchestrator/providers/mimo-oauth-profile.mjs +13 -15
- package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/model-list-sanitize.mjs +2 -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 +33 -1
- package/src/runtime/agent/orchestrator/providers/muse-code-oauth.mjs +4 -9
- package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/openai-codex-metadata.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +123 -61
- 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 +27 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +37 -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 +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-error-contract.mjs +50 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +47 -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 +151 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +64 -23
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +79 -33
- 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 +172 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-state.mjs +3 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +144 -15
- package/src/runtime/agent/orchestrator/providers/openai-compat-retry-profile.mjs +193 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-stream-common.mjs +66 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +9 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-trace.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +109 -26
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +27 -6
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +34 -20
- package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +23 -4
- package/src/runtime/agent/orchestrator/providers/openai-direct-request.mjs +37 -28
- package/src/runtime/agent/orchestrator/providers/openai-error-contract.mjs +274 -0
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-request.mjs +72 -32
- 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 +43 -15
- 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 +5 -2
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-stamps.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-state.mjs +7 -3
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/text-relay.mjs +9 -1
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-watchdogs.mjs +1 -3
- package/src/runtime/agent/orchestrator/providers/openai-model-capabilities.mjs +80 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth-dispatch.mjs +37 -4
- package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +12 -1
- package/src/runtime/agent/orchestrator/providers/openai-oauth-tokens.mjs +22 -2
- package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +12 -1
- package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +76 -33
- package/src/runtime/agent/orchestrator/providers/openai-responses-payload-parity.fixture.json +323 -0
- package/src/runtime/agent/orchestrator/providers/openai-responses-payload.mjs +44 -16
- package/src/runtime/agent/orchestrator/providers/openai-retry-policy.mjs +9 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +7 -16
- package/src/runtime/agent/orchestrator/providers/openai-ws-handshake.mjs +16 -8
- 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 -35
- package/src/runtime/agent/orchestrator/providers/openai-ws-response-state.mjs +30 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/attempt-context.mjs +1 -2
- package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/policy.mjs +25 -14
- 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-terminal.mjs +18 -11
- package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +41 -22
- package/src/runtime/agent/orchestrator/providers/opencode-go-gemini.mjs +170 -0
- package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +75 -70
- package/src/runtime/agent/orchestrator/providers/openrouter.mjs +75 -0
- package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +720 -0
- package/src/runtime/agent/orchestrator/providers/registry.mjs +4 -1
- package/src/runtime/agent/orchestrator/providers/retry-backoff.mjs +46 -7
- package/src/runtime/agent/orchestrator/providers/retry-classification.mjs +123 -219
- package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/retry-executor.mjs +148 -45
- package/src/runtime/agent/orchestrator/providers/retry-midstream.mjs +81 -16
- 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 +157 -0
- package/src/runtime/agent/orchestrator/providers/wire-route.mjs +512 -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 +183 -0
- package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +100 -0
- package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +3 -0
- package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +21 -0
- package/src/runtime/agent/orchestrator/runtime-core/effort.mjs +15 -0
- package/src/runtime/agent/orchestrator/runtime-core/goal-reminder.mjs +0 -18
- package/src/runtime/agent/orchestrator/runtime-core/model-capabilities.mjs +57 -28
- package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +19 -16
- package/src/runtime/agent/orchestrator/runtime-core/plugin-mcp.mjs +1 -97
- 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 +14 -3
- 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 +176 -71
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +62 -10
- package/src/runtime/agent/orchestrator/runtime-core/tool-exposure.mjs +96 -0
- package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +5 -1
- package/src/runtime/agent/orchestrator/session/compact/constants.mjs +3 -2
- package/src/runtime/agent/orchestrator/session/compact/messages.mjs +14 -93
- package/src/runtime/agent/orchestrator/session/compact/summary-anchor.mjs +5 -0
- package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +120 -0
- 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/eager-dispatch/admission.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +6 -1
- package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +91 -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 -0
- package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +21 -10
- package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +132 -0
- package/src/runtime/agent/orchestrator/session/loop/request-boundary.mjs +30 -0
- package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +67 -20
- package/src/runtime/agent/orchestrator/session/loop/step-auto-effort.mjs +104 -19
- package/src/runtime/agent/orchestrator/session/loop/tool-call-resolution.mjs +95 -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 +15 -4
- package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +15 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +150 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +7 -2
- package/src/runtime/agent/orchestrator/session/manager/ask-queue.mjs +30 -2
- package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +11 -2
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-commit.mjs +34 -12
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +57 -21
- 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 +6 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +8 -0
- package/src/runtime/agent/orchestrator/session/manager/pending-message-entry.mjs +5 -10
- package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +208 -14
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +16 -4
- package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +25 -3
- package/src/runtime/agent/orchestrator/session/manager/session-fallback-title.mjs +82 -0
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +19 -2
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +18 -7
- package/src/runtime/agent/orchestrator/session/manager.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +168 -29
- package/src/runtime/agent/orchestrator/session/side-question-store.mjs +96 -0
- package/src/runtime/agent/orchestrator/session/side-question.mjs +192 -0
- package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +17 -3
- package/src/runtime/agent/orchestrator/session/store/live-state.mjs +23 -0
- package/src/runtime/agent/orchestrator/session/store/paths-heartbeat.mjs +58 -2
- package/src/runtime/agent/orchestrator/session/store/save-worker.mjs +6 -3
- package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +41 -28
- package/src/runtime/agent/orchestrator/session/store/session-observers.mjs +4 -2
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-finish.mjs +12 -1
- package/src/runtime/agent/orchestrator/session/store/write-admission.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/store/write-guards.mjs +16 -0
- package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +22 -10
- package/src/runtime/agent/orchestrator/session/store-summary-archived-agent.mjs +34 -15
- package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +13 -0
- package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +13 -1
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +10 -2
- package/src/runtime/agent/orchestrator/session/store.mjs +19 -3
- package/src/runtime/agent/orchestrator/session/tool-batch/execute-call.mjs +1 -0
- package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +1 -1
- 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 +77 -0
- package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +20 -1
- package/src/runtime/agent/orchestrator/tools/bash-policy-scan.mjs +8 -2
- package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/command-preflight.mjs +3 -3
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/deadline-plan.mjs +12 -15
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +4 -1
- package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +5 -5
- package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +14 -10
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +49 -34
- package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +23 -1
- 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/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/computer-bridge/action-schema.mjs +44 -21
- package/src/runtime/github/tool.mjs +92 -2
- 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/pg/adapter.mjs +98 -1
- package/src/runtime/memory/lib/pg/process.mjs +65 -50
- package/src/runtime/memory/lib/pg/run-child.mjs +49 -0
- package/src/runtime/memory/lib/pg/supervisor.mjs +124 -16
- 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 +2 -2
- package/src/runtime/office/authoring/html-document-author.mjs +2 -0
- package/src/runtime/office/authoring/pptx-contact-sheet.mjs +2 -0
- package/src/runtime/office/authoring/pptx-html-measure.mjs +2 -0
- package/src/runtime/office/authoring/pptx-html-runner.mjs +2 -0
- package/src/runtime/office/authoring/xlsx-html-runner.mjs +2 -0
- 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 +98 -0
- package/src/runtime/office/design/library/templates/mixdog-executive.mixdog-edit.pptx +0 -0
- package/src/runtime/office/index.mjs +30 -0
- 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/office/shared/values.mjs +0 -5
- package/src/runtime/shared/background-tasks.mjs +92 -14
- package/src/runtime/shared/bounded-file-read.mjs +13 -0
- package/src/runtime/shared/bounded-line-diff.mjs +182 -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 +31 -0
- package/src/runtime/shared/error-presentation.mjs +159 -19
- 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 +4 -3
- package/src/runtime/shared/llm/anthropic-effort.mjs +129 -134
- package/src/runtime/shared/llm/anthropic-thinking-contract.mjs +50 -14
- package/src/runtime/shared/llm/model-catalog.mjs +53 -40
- package/src/runtime/shared/llm/openai-daybreak.mjs +4 -16
- package/src/runtime/shared/llm/provider-catalog-registry.mjs +11 -0
- package/src/runtime/shared/llm/provider-model-identities.mjs +13 -4
- 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/llm/usage-rollup.mjs +0 -1
- package/src/runtime/shared/loopback-listener.mjs +9 -0
- package/src/runtime/shared/model-display.mjs +13 -0
- package/src/runtime/shared/provider-api-key.mjs +2 -0
- package/src/runtime/shared/quota-resume-store.mjs +11 -0
- package/src/runtime/shared/review-diff.mjs +52 -0
- package/src/runtime/shared/session-baseline-store.mjs +960 -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 +114 -0
- package/src/runtime/shared/statusline/statusline-format.mjs +4 -4
- package/src/runtime/shared/statusline/statusline-segments.mjs +28 -4
- package/src/runtime/shared/task-notification-envelope.mjs +2 -2
- package/src/runtime/shared/tool-card-model/card-header.mjs +6 -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-limit.mjs +4 -0
- package/src/runtime/shared/tool-primitives.mjs +13 -0
- package/src/runtime/shared/tool-result-summary.mjs +8 -1
- package/src/runtime/shared/tool-surface.mjs +18 -3
- package/src/runtime/shared/tool-work-units.mjs +40 -4
- package/src/runtime/shared/transcript-writer/purge.mjs +74 -0
- package/src/runtime/shared/transcript-writer.mjs +10 -2
- package/src/runtime/shared/turn-changes.mjs +670 -274
- package/src/runtime/shared/turn-review-reply.mjs +8 -39
- package/src/runtime/shared/turn-snapshot-store.mjs +94 -2
- package/src/runtime/shared/turn-snapshot.mjs +986 -690
- package/src/runtime/shared/turn-worktree-snapshot.mjs +279 -262
- package/src/runtime/shared/user-data-guard.mjs +262 -49
- package/src/runtime/shared/worktrees/carry.mjs +531 -0
- package/src/runtime/shared/worktrees/contract.mjs +34 -24
- package/src/runtime/shared/worktrees/file-recovery.mjs +68 -0
- package/src/runtime/shared/worktrees/git-head.mjs +205 -0
- package/src/runtime/shared/worktrees/git.mjs +8 -3
- package/src/runtime/shared/worktrees/maintenance.mjs +1 -1
- package/src/runtime/shared/worktrees/manager.mjs +156 -8
- package/src/runtime/shared/worktrees/merge.mjs +31 -21
- package/src/runtime/shared/worktrees/paths.d.mts +6 -0
- package/src/runtime/shared/worktrees/test-support.mjs +19 -4
- package/src/runtime/terminal-bridge/client.mjs +44 -11
- 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 +19 -5
- package/src/session-runtime/boot/facade.mjs +1 -0
- package/src/session-runtime/boot/infrastructure.mjs +12 -1
- package/src/session-runtime/boot/session.mjs +0 -1
- package/src/session-runtime/boot/tools.mjs +4 -1
- package/src/session-runtime/cwd-plugins/cwd-apply.mjs +12 -5
- package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +65 -0
- package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -1
- package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +11 -4
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +115 -18
- package/src/session-runtime/internal-tool-executor.mjs +6 -2
- package/src/session-runtime/lifecycle/cold-heir.mjs +188 -0
- package/src/session-runtime/lifecycle/inheritance.mjs +71 -27
- package/src/session-runtime/lifecycle/session-catalog.mjs +14 -3
- package/src/session-runtime/lifecycle/session-switch/resume.mjs +6 -0
- package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +29 -6
- package/src/session-runtime/lifecycle/teardown.mjs +73 -8
- package/src/session-runtime/lifecycle-api.mjs +1 -0
- package/src/session-runtime/mcp-glue/connect.mjs +46 -14
- package/src/session-runtime/mcp-glue/server-catalog.mjs +20 -3
- package/src/session-runtime/mcp-glue.mjs +3 -0
- package/src/session-runtime/mcp-oauth-login.mjs +174 -0
- package/src/session-runtime/model-route/model-switch-target.mjs +34 -0
- package/src/session-runtime/model-route/set-route.mjs +85 -17
- package/src/session-runtime/model-route/web-search-route.mjs +1 -1
- package/src/session-runtime/native-web-search/routes.mjs +22 -3
- package/src/session-runtime/native-web-search-usage.mjs +51 -0
- package/src/session-runtime/native-web-search.mjs +10 -1
- 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-models/model-meta.mjs +12 -3
- package/src/session-runtime/quick-model-rows/web-search-rows.mjs +13 -8
- package/src/session-runtime/quick-web-search-models.mjs +13 -38
- package/src/session-runtime/resource-extension-sync.mjs +4 -0
- package/src/session-runtime/resource-mcp-api.mjs +98 -2
- package/src/session-runtime/resource-scope-decorate.mjs +10 -3
- package/src/session-runtime/runtime-review-api.mjs +21 -2
- package/src/session-runtime/services/agent-tool/index-write-queue.mjs +81 -20
- package/src/session-runtime/services/agent-tool/job-task-reconcile.mjs +13 -1
- package/src/session-runtime/services/agent-tool/job-views/agent-list.mjs +7 -2
- 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.mjs +73 -7
- package/src/session-runtime/services/agent-tool/send-flow.mjs +22 -4
- package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +2 -0
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +22 -5
- package/src/session-runtime/services/agent-tool/tag-registry.mjs +15 -1
- package/src/session-runtime/services/agent-tool/worker-index/row-liveness.mjs +8 -1
- package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +2 -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 +46 -7
- package/src/session-runtime/services/agent-tool/worker-rows.mjs +17 -0
- package/src/session-runtime/services/agent-tool.mjs +3 -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 +81 -15
- package/src/session-runtime/session-transcript-purge.mjs +32 -0
- package/src/session-runtime/session-turn-api.mjs +14 -5
- package/src/session-runtime/settings-builtin-tools-api.mjs +9 -0
- package/src/session-runtime/settings-compaction-api.mjs +1 -0
- package/src/session-runtime/setup-tool/executor.mjs +36 -6
- package/src/session-runtime/setup-tool/extended-actions.mjs +86 -6
- package/src/session-runtime/setup-tool/settings-contract.mjs +13 -3
- package/src/session-runtime/setup-tool/tool-defs.mjs +13 -4
- package/src/session-runtime/skills-api.mjs +3 -5
- package/src/session-runtime/tool-surface.mjs +5 -1
- 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 +22 -0
- package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +5 -1
- package/src/session-runtime/turn/turn-run/turn-prepare.mjs +8 -3
- package/src/session-runtime/turn/turn-run/turn-settle.mjs +10 -0
- package/src/session-runtime/turn/turn-run/turn-timing.mjs +4 -3
- package/src/session-runtime/turn/turn-run.mjs +25 -9
- package/src/session-runtime/usage-stats-api.mjs +43 -11
- package/src/session-runtime/workspace/project-branches.mjs +7 -5
- package/src/session-runtime/workspace/transition-steps.mjs +129 -31
- package/src/session-runtime/workspace/transitions.mjs +190 -15
- package/src/standalone/daemon-agent-control.mjs +9 -1
- package/src/standalone/daemon-drain-policy.mjs +8 -0
- 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 +51 -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 +2 -0
- package/src/standalone/daemon-telemetry.mjs +74 -0
- package/src/standalone/daemon.mjs +64 -8
- package/src/standalone/desktop-service-registry.mjs +5 -0
- package/src/standalone/local-session-runtime.mjs +70 -19
- 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 +1 -0
- package/src/standalone/session-service/agent-tree/agent-cancel.mjs +33 -2
- package/src/standalone/session-service/agent-tree/agent-turns.mjs +26 -10
- package/src/standalone/session-service/agent-tree.mjs +12 -0
- package/src/standalone/session-service/quota-resume.mjs +8 -0
- package/src/standalone/session-service/retention/busy.mjs +15 -1
- package/src/standalone/session-service/session-calls/session-action.mjs +18 -3
- package/src/standalone/session-service-api.mjs +11 -1
- package/src/standalone/session-service.mjs +1 -0
- package/src/standalone/session-state-patch.d.mts +2 -1
- package/src/standalone/session-state-patch.mjs +41 -1
- 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 +1 -0
- package/src/tui/app/btw-controller.mjs +118 -0
- package/src/tui/app/create-app-pickers.mjs +6 -0
- package/src/tui/app/extension-pickers/mcp-login.mjs +107 -0
- package/src/tui/app/extension-pickers/mcp-servers-picker.mjs +2 -1
- package/src/tui/app/extension-pickers.mjs +2 -1
- package/src/tui/app/model-options.mjs +11 -16
- 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 +20 -5
- package/src/tui/app/slash-dispatch/panel-commands.mjs +16 -1
- package/src/tui/app/slash-dispatch/session-commands.mjs +19 -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/StatusLine.jsx +2 -0
- package/src/tui/components/question-panel-model.mjs +156 -0
- package/src/tui/components/status-line/local-line.mjs +5 -2
- package/src/tui/components/status-line/use-statusline-text.mjs +7 -1
- package/src/tui/dist/index.mjs +3221 -1500
- package/src/tui/session/context-state.mjs +4 -2
- package/src/tui/session/quota-resume.mjs +46 -14
- package/src/tui/session/session-api/commands.mjs +43 -24
- package/src/tui/session/session-api/controls.mjs +2 -2
- package/src/tui/session/session-api/extensions.mjs +22 -0
- package/src/tui/session/session-api/integrations.mjs +16 -2
- package/src/tui/session/session-api/lifecycle/dispose.mjs +1 -0
- package/src/tui/session/session-api/lifecycle.mjs +7 -2
- package/src/tui/session/session-api/routes.mjs +71 -7
- package/src/tui/session/session-api/settings.mjs +11 -14
- package/src/tui/session/session-api.mjs +1 -0
- package/src/tui/session/session-flow/drain.mjs +7 -1
- package/src/tui/session/session-flow/failed-turn-rewind.mjs +10 -4
- package/src/tui/session/tool-approval.mjs +10 -7
- package/src/tui/session/transcript-spill.mjs +14 -7
- package/src/tui/session/turn-stream.mjs +174 -31
- package/src/tui/session/turn.mjs +46 -16
- package/src/tui/statusline-ansi-bridge.mjs +1 -1
- package/src/ui/statusline-agents.mjs +15 -4
- package/src/ui/statusline.mjs +7 -3
- package/src/ui/streaming-markdown-heal.mjs +34 -3
- package/src/vendor/statusline/src/gateway/claude-current.mjs +14 -4
- package/src/workflows/default/WORKFLOW.md +3 -1
- package/src/runtime/memory/lib/memory-session-merge.mjs +0 -32
- package/src/runtime/shared/llm/usage-session-history.mjs +0 -266
|
@@ -65,7 +65,8 @@ import {
|
|
|
65
65
|
} from '../runtime/agent/orchestrator/providers/stream-json-pool.mjs';
|
|
66
66
|
import { createAgentDispatchBroker } from './agent-dispatch-broker.mjs';
|
|
67
67
|
import { createChannelTransport } from './channel-transport.mjs';
|
|
68
|
-
import { drainDeferral } from './daemon-drain-policy.mjs';
|
|
68
|
+
import { drainDeferral, idleGcEligible } from './daemon-drain-policy.mjs';
|
|
69
|
+
import { createDaemonPgStop } from './daemon-pg-stop.mjs';
|
|
69
70
|
import { createChannelSessionRouter } from '../session-runtime/services/channel-session-router.mjs';
|
|
70
71
|
import { createSessionTransport } from './session-transport.mjs';
|
|
71
72
|
import { createSessionService } from './session-service.mjs';
|
|
@@ -75,6 +76,7 @@ import * as quotaResumeStore from '../runtime/shared/quota-resume-store.mjs';
|
|
|
75
76
|
import { registerWorktreeCacheCleanups } from '../runtime/shared/worktrees/cache-cleanups.mjs';
|
|
76
77
|
import { createInlineSessionRuntimeHost } from './session-runtime-inline-host.mjs';
|
|
77
78
|
import { getStandaloneMemoryRuntime } from '../session-runtime/services/memory-runtime-proxy.mjs';
|
|
79
|
+
import { registerTranscriptPurgeHook } from '../session-runtime/session-transcript-purge.mjs';
|
|
78
80
|
import { createBootPhaseProfiler } from './boot-phase-profiler.mjs';
|
|
79
81
|
import { createDaemonBootCoordinator } from './daemon-boot-coordinator.mjs';
|
|
80
82
|
import { createDaemonLog } from './daemon-log.mjs';
|
|
@@ -83,11 +85,13 @@ import {
|
|
|
83
85
|
installDaemonExitRecorder,
|
|
84
86
|
reconcileLostDaemonCaptures,
|
|
85
87
|
} from '../session-runtime/services/daemon-crash-capture/daemon-exit-record.mjs';
|
|
86
|
-
import { createDaemonTelemetry } from './daemon-telemetry.mjs';
|
|
88
|
+
import { createDaemonTelemetry, createStallDescriber } from './daemon-telemetry.mjs';
|
|
89
|
+
import { slowSpans } from '../runtime/shared/slow-span.mjs';
|
|
87
90
|
import { createLagProfiler } from './daemon-lag-profiler.mjs';
|
|
88
91
|
import { createChannelsRuntimeLoader } from './daemon-channels-loader.mjs';
|
|
89
92
|
import { createDesktopRuntime } from './daemon-desktop-runtime.mjs';
|
|
90
93
|
import { createCanonicalAgentControl } from './daemon-agent-control.mjs';
|
|
94
|
+
import { flushAllIndexWrites } from '../session-runtime/services/agent-tool/index-write-queue.mjs';
|
|
91
95
|
import { registerAutomationAgentTool } from '../session-runtime/automation-agents.mjs';
|
|
92
96
|
import {
|
|
93
97
|
compareRuntimeVersions,
|
|
@@ -132,7 +136,9 @@ let sessionTransport = null;
|
|
|
132
136
|
let sessionService = null;
|
|
133
137
|
let sessionRuntimeHost = null;
|
|
134
138
|
let localSessionBridge = null;
|
|
139
|
+
let canonicalAgentControl = null;
|
|
135
140
|
let memoryRuntime = null;
|
|
141
|
+
let transcriptPurgeUnregister = null;
|
|
136
142
|
let agentDispatchBroker = null;
|
|
137
143
|
let remoteSessionState = { enabled: false, sessionId: null };
|
|
138
144
|
let shuttingDown = false;
|
|
@@ -161,6 +167,13 @@ function registerMemoryRuntimeLazy() {
|
|
|
161
167
|
// real memory call (memory/recall tools, the Memory install) starts the
|
|
162
168
|
// singleton; nothing warms it at boot. The PG cluster itself usually starts
|
|
163
169
|
// earlier: the channels schedules/webhooks stores open it at boot.
|
|
170
|
+
// Deleting a session removes its transcript file here, and its memory ingest
|
|
171
|
+
// offsets once the memory runtime exists (none when memory is skipped).
|
|
172
|
+
if (!transcriptPurgeUnregister) {
|
|
173
|
+
transcriptPurgeUnregister = registerTranscriptPurgeHook({
|
|
174
|
+
forgetOffsets: (transcriptPaths) => memoryRuntime?.forgetTranscripts(transcriptPaths),
|
|
175
|
+
});
|
|
176
|
+
}
|
|
164
177
|
if (process.env.MIXDOG_DAEMON_SKIP_MEMORY === '1') {
|
|
165
178
|
log('memory runtime skipped (MIXDOG_DAEMON_SKIP_MEMORY=1)');
|
|
166
179
|
return;
|
|
@@ -201,6 +214,8 @@ function eventLoopStatus() {
|
|
|
201
214
|
/** Ceiling for the whole teardown sequence, above the slowest individual stop
|
|
202
215
|
* (channels/memory) so a healthy shutdown always finishes on its own. */
|
|
203
216
|
const SHUTDOWN_BUDGET_MS = 15_000;
|
|
217
|
+
/** Graceful PostgreSQL stop bound inside that budget (pg_ctl stop -m fast). */
|
|
218
|
+
const PG_STOP_TIMEOUT_MS = 6_000;
|
|
204
219
|
|
|
205
220
|
async function shutdown(reason, code = 0) {
|
|
206
221
|
if (shuttingDown) return;
|
|
@@ -221,6 +236,9 @@ async function shutdown(reason, code = 0) {
|
|
|
221
236
|
process.exit(code);
|
|
222
237
|
}, SHUTDOWN_BUDGET_MS);
|
|
223
238
|
forcedExit.unref?.();
|
|
239
|
+
// PostgreSQL stops after its users below (durable writes drained first), or
|
|
240
|
+
// at the fallback point just before the launcher's kill, whichever is first.
|
|
241
|
+
const pgStop = createDaemonPgStop({ log, stopTimeoutMs: PG_STOP_TIMEOUT_MS });
|
|
224
242
|
try {
|
|
225
243
|
setChannelNotifySink(null);
|
|
226
244
|
} catch {}
|
|
@@ -241,6 +259,15 @@ async function shutdown(reason, code = 0) {
|
|
|
241
259
|
} catch (e) {
|
|
242
260
|
log(`session runtime host stop failed: ${e?.message || e}`);
|
|
243
261
|
}
|
|
262
|
+
// Every runtime is closed: drain the canonical agent's index writers (and any
|
|
263
|
+
// other queued index write) before process.exit, whose 'exit' hook cannot
|
|
264
|
+
// finish async work.
|
|
265
|
+
try {
|
|
266
|
+
await canonicalAgentControl?.dispose?.();
|
|
267
|
+
await flushAllIndexWrites();
|
|
268
|
+
} catch (e) {
|
|
269
|
+
log(`agent index drain failed: ${e?.message || e}`);
|
|
270
|
+
}
|
|
244
271
|
// Host-side Computer Use workers and target claims are reaped only on an
|
|
245
272
|
// explicit release; the runtime's deferred timer is unref'd and never fires
|
|
246
273
|
// once this process exits.
|
|
@@ -271,6 +298,11 @@ async function shutdown(reason, code = 0) {
|
|
|
271
298
|
} catch (e) {
|
|
272
299
|
log(`memory.stop failed: ${e?.message || e}`);
|
|
273
300
|
}
|
|
301
|
+
// PostgreSQL this daemon started through its stores (schedules, webhooks,
|
|
302
|
+
// session search) after every user of it above is closed. `pg_ctl start`
|
|
303
|
+
// daemonizes the postmaster outside this process tree, so without this stop
|
|
304
|
+
// it outlives the daemon. A cluster another live process owns is left to it.
|
|
305
|
+
await pgStop.finish();
|
|
274
306
|
try {
|
|
275
307
|
agentDispatchBroker?.close?.(reason);
|
|
276
308
|
} catch (e) {
|
|
@@ -309,11 +341,15 @@ function inFlightWork() {
|
|
|
309
341
|
queuedCalls: (transport?.queuedCount ?? 0) + (sessionTransport?.queuedCount ?? 0),
|
|
310
342
|
busySessions: sessionService?.busyCount ?? 0,
|
|
311
343
|
busyMemoryAgents: agentDispatchBroker?.snapshot?.().inFlight ?? 0,
|
|
344
|
+
turnBusySessions: sessionService?.turnBusyCount ?? 0,
|
|
312
345
|
};
|
|
313
346
|
}
|
|
314
347
|
|
|
315
348
|
// Opt-in CPU profiling of lag windows while DATA_DIR/lag-profile.on exists.
|
|
316
349
|
const lagProfiler = createLagProfiler({ dataDir: DATA_DIR, log });
|
|
350
|
+
// Request spans share the heartbeat's performance.now() clock; `[slow-op]` lines
|
|
351
|
+
// and stall attribution come from the same recorder.
|
|
352
|
+
slowSpans.setLog(log);
|
|
317
353
|
|
|
318
354
|
daemonTelemetry = createDaemonTelemetry({
|
|
319
355
|
log,
|
|
@@ -353,11 +389,6 @@ daemonTelemetry = createDaemonTelemetry({
|
|
|
353
389
|
},
|
|
354
390
|
});
|
|
355
391
|
|
|
356
|
-
function daemonHasWorkInFlight() {
|
|
357
|
-
const work = inFlightWork();
|
|
358
|
-
return work.activeCalls > 0 || work.queuedCalls > 0 || work.busySessions > 0 || work.busyMemoryAgents > 0;
|
|
359
|
-
}
|
|
360
|
-
|
|
361
392
|
/** One process, two front doors (channels + sessions): an idle side must never
|
|
362
393
|
* evict a busy one, so every self-shutdown trigger checks BOTH registries. */
|
|
363
394
|
let _lastDeferredLog = { key: '', at: 0, suppressed: 0 };
|
|
@@ -510,6 +541,7 @@ async function claimDaemonOwnership(bootPhases) {
|
|
|
510
541
|
tickMs: timings.tickMs,
|
|
511
542
|
stallMs: timings.stallMs,
|
|
512
543
|
log,
|
|
544
|
+
describeStall: createStallDescriber({ spans: slowSpans, getWork: inFlightWork }),
|
|
513
545
|
onBeat: republishMissingDiscovery,
|
|
514
546
|
onSuperseded: (record) => fenceDaemon(`owner claim superseded by pid=${record?.pid}`),
|
|
515
547
|
onFenced: ({ lastRefreshAt, sinceMs }) =>
|
|
@@ -700,6 +732,22 @@ function announceDaemonReady({ port, token, startedAt, bootPhases }) {
|
|
|
700
732
|
});
|
|
701
733
|
}
|
|
702
734
|
|
|
735
|
+
/** After ready, off every request path: arm the last-chance PostgreSQL stop on
|
|
736
|
+
* exit, then open the schedules/webhooks stores. On an existing cluster that
|
|
737
|
+
* starts PostgreSQL here, so the first catalog read (the desktop sidebar's
|
|
738
|
+
* channel setup) joins this start instead of being the one that runs it; a
|
|
739
|
+
* data dir with no cluster yet starts nothing (channel-admin). Loaded after
|
|
740
|
+
* the stderr redirect, so the PG layer's logs reach daemon.log. */
|
|
741
|
+
function startPostgresInBackground() {
|
|
742
|
+
void import('../runtime/memory/lib/pg/adapter.mjs')
|
|
743
|
+
.then((pg) => {
|
|
744
|
+
pg.installOwnedPgExitStop();
|
|
745
|
+
if (shuttingDown) return null;
|
|
746
|
+
return import('../session-runtime/services/channel-admin.mjs').then((admin) => admin.hasActiveAutomation());
|
|
747
|
+
})
|
|
748
|
+
.catch((error) => log(`postgres background start failed: ${error?.message || error}`));
|
|
749
|
+
}
|
|
750
|
+
|
|
703
751
|
/** The channels front door: pointer-routed calls over HTTP+SSE. Creating the
|
|
704
752
|
* transport also wires the channels notification sink (session-bound
|
|
705
753
|
* notifications reach the session service, the rest fan out to channel
|
|
@@ -823,7 +871,7 @@ async function main() {
|
|
|
823
871
|
// Reclaim deferred garbage while nothing is in flight. V8 keeps a long-lived
|
|
824
872
|
// daemon's dead transcripts resident for as long as the heap limit stays out
|
|
825
873
|
// of sight; a measured sweep on this daemon returned 140MB in 98ms.
|
|
826
|
-
idleGc = createIdleGc({ isBusy:
|
|
874
|
+
idleGc = createIdleGc({ isBusy: () => !idleGcEligible(inFlightWork()), log });
|
|
827
875
|
if (idleGc.arm()) log('idle gc armed');
|
|
828
876
|
|
|
829
877
|
const channelsRuntime = createChannelsRuntimeLoader({
|
|
@@ -848,6 +896,7 @@ async function main() {
|
|
|
848
896
|
getSessionRuntimeHost: () => sessionRuntimeHost,
|
|
849
897
|
cwd: CWD,
|
|
850
898
|
});
|
|
899
|
+
canonicalAgentControl = agentControl;
|
|
851
900
|
// Schedules and webhooks run headless here; their sessions reach the same
|
|
852
901
|
// canonical agent control through the automation tool scope.
|
|
853
902
|
registerAutomationAgentTool(agentControl.execute);
|
|
@@ -942,6 +991,13 @@ async function main() {
|
|
|
942
991
|
log(`session front door on 127.0.0.1:${sessionEndpoint.port}`);
|
|
943
992
|
|
|
944
993
|
announceDaemonReady({ port, token, startedAt, bootPhases });
|
|
994
|
+
// After ready, off the boot path: load the session-runtime module tree so
|
|
995
|
+
// the first session.create does not block the loop on synchronous module
|
|
996
|
+
// compilation. Failures fall back to the lazy import inside create.
|
|
997
|
+
setImmediate(() => {
|
|
998
|
+
void sessionRuntimeHost?.warmLocalRuntime?.();
|
|
999
|
+
});
|
|
1000
|
+
startPostgresInBackground();
|
|
945
1001
|
|
|
946
1002
|
// Automation may spawn the shared daemon; keep schedules/webhooks live.
|
|
947
1003
|
// A TUI-spawned daemon keeps the historical eager start (its channels client
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { createRequire } from 'node:module';
|
|
2
2
|
import { fileURLToPath } from 'node:url';
|
|
3
3
|
import { sanitizeForWire } from './session-wire-values.mjs';
|
|
4
|
+
import { annotateSpan } from '../runtime/shared/slow-span.mjs';
|
|
4
5
|
import { modelProxyClientMode } from '../runtime/shared/model-proxy-mode.mjs';
|
|
5
6
|
import { getModelProxyChannel } from '../runtime/agent/orchestrator/providers/model-proxy-channel.mjs';
|
|
6
7
|
|
|
@@ -217,6 +218,10 @@ export class DesktopServiceRegistry {
|
|
|
217
218
|
const { service } = this.#requireSubscribed(desktopId, ctx);
|
|
218
219
|
const name = String(method || '');
|
|
219
220
|
if (!name) throw new TypeError('desktop service method is required');
|
|
221
|
+
// `[slow-op] desktop.invoke` names the call it timed: a desktop operation
|
|
222
|
+
// (Git reads) or a session capability, not only the generic route.
|
|
223
|
+
const target = name === 'invokeDesktopOperation' || name === 'invokeCapability' ? String(args?.[0] || '') : '';
|
|
224
|
+
annotateSpan(target ? `${name}:${target}` : name);
|
|
220
225
|
return sanitizeForWire(await service.instance.invoke(name, Array.isArray(args) ? args : [])) ?? null;
|
|
221
226
|
}
|
|
222
227
|
|
|
@@ -19,6 +19,7 @@ import { createContextState } from '../tui/session/context-state.mjs';
|
|
|
19
19
|
import { createSessionFlow } from '../tui/session/session-flow.mjs';
|
|
20
20
|
import { createRunTurn } from '../tui/session/turn.mjs';
|
|
21
21
|
import { createQuotaResumeLane } from '../tui/session/quota-resume.mjs';
|
|
22
|
+
import { createGitHeadWatcher } from '../runtime/shared/worktrees/git-head.mjs';
|
|
22
23
|
import { publicQuotaResume, quotaResumeEntry } from '../runtime/shared/quota-resume-store.mjs';
|
|
23
24
|
import { createSessionApi } from '../tui/session/session-api.mjs';
|
|
24
25
|
import { createSessionDraftStore } from '../tui/session/draft-store.mjs';
|
|
@@ -33,18 +34,54 @@ import { formatDoctorReport, runDoctorChecks } from '../tui/app/doctor.mjs';
|
|
|
33
34
|
// tuiDebug is an opt-in diagnostic trace for the hang chain (runTurn start/end,
|
|
34
35
|
// busy-queue enqueue/drain). Quiet by default so it can never tear through
|
|
35
36
|
// the alternate-screen render; enable with MIXDOG_TUI_DEBUG=1.
|
|
36
|
-
import {
|
|
37
|
+
import {
|
|
38
|
+
tuiDebug,
|
|
39
|
+
nextId,
|
|
40
|
+
createTranscriptSpillBuffer,
|
|
41
|
+
sweepStaleTranscriptSpillDirsOnce,
|
|
42
|
+
} from '../tui/session/transcript-spill.mjs';
|
|
37
43
|
|
|
38
44
|
const SESSION_RUNTIME_MODULE = '../mixdog-session-runtime.mjs';
|
|
39
45
|
|
|
40
46
|
// Shared across create calls so concurrent session startups import the
|
|
41
47
|
// runtime graph once.
|
|
42
48
|
let sessionRuntimeModulePromise = null;
|
|
49
|
+
let sessionRuntimeImporter = () => import(SESSION_RUNTIME_MODULE);
|
|
43
50
|
function importSessionRuntimeModule() {
|
|
44
|
-
|
|
51
|
+
// A failed import is forgotten so the next caller retries lazily.
|
|
52
|
+
sessionRuntimeModulePromise ??= Promise.resolve()
|
|
53
|
+
.then(() => sessionRuntimeImporter())
|
|
54
|
+
.catch((error) => {
|
|
55
|
+
sessionRuntimeModulePromise = null;
|
|
56
|
+
throw error;
|
|
57
|
+
});
|
|
45
58
|
return sessionRuntimeModulePromise;
|
|
46
59
|
}
|
|
47
60
|
|
|
61
|
+
/**
|
|
62
|
+
* Background warm-up for the daemon (scheduled after the ready signal): loads
|
|
63
|
+
* the session-runtime module tree and runs the one-per-process transcript
|
|
64
|
+
* spill sweep, so the first session.create pays for neither. Failures are
|
|
65
|
+
* swallowed — create falls back to the same lazy import.
|
|
66
|
+
*/
|
|
67
|
+
export async function warmLocalSessionRuntime() {
|
|
68
|
+
try {
|
|
69
|
+
await importSessionRuntimeModule();
|
|
70
|
+
// Separate turn: let queued I/O run between the import and the sync sweep.
|
|
71
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
72
|
+
sweepStaleTranscriptSpillDirsOnce();
|
|
73
|
+
return true;
|
|
74
|
+
} catch {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** Test seam: replace the dynamic import of the session-runtime module. */
|
|
80
|
+
export function setSessionRuntimeImporterForTest(importer) {
|
|
81
|
+
sessionRuntimeImporter = importer || (() => import(SESSION_RUNTIME_MODULE));
|
|
82
|
+
sessionRuntimeModulePromise = null;
|
|
83
|
+
}
|
|
84
|
+
|
|
48
85
|
const TOOL_APPROVAL_TIMEOUT_MS = (() => {
|
|
49
86
|
const value = Number(process.env.MIXDOG_TOOL_APPROVAL_TIMEOUT_MS);
|
|
50
87
|
return Number.isFinite(value) && value > 0 ? Math.max(1000, Math.round(value)) : 120_000;
|
|
@@ -98,7 +135,7 @@ export function createRuntimePulse({
|
|
|
98
135
|
if (!set(changed)) emit();
|
|
99
136
|
return true;
|
|
100
137
|
};
|
|
101
|
-
|
|
138
|
+
const pulse = () => {
|
|
102
139
|
if (flags.disposed) return;
|
|
103
140
|
if (flags.pendingSessionReset) return;
|
|
104
141
|
// Attached viewer with a live pipe: the owner's frames are authoritative
|
|
@@ -115,6 +152,12 @@ export function createRuntimePulse({
|
|
|
115
152
|
...agentStatusState(),
|
|
116
153
|
});
|
|
117
154
|
};
|
|
155
|
+
/** Publishes just the workspace (a HEAD change): no stats or agent recompute. */
|
|
156
|
+
pulse.publishWorkspace = () => {
|
|
157
|
+
if (flags.disposed || flags.pendingSessionReset) return;
|
|
158
|
+
publishChanged({ workspace: routeState().workspace });
|
|
159
|
+
};
|
|
160
|
+
return pulse;
|
|
118
161
|
}
|
|
119
162
|
|
|
120
163
|
export async function createLocalSessionRuntime({
|
|
@@ -277,20 +320,29 @@ export async function createLocalSessionRuntime({
|
|
|
277
320
|
timeoutMs: TOOL_APPROVAL_TIMEOUT_MS,
|
|
278
321
|
}
|
|
279
322
|
);
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
323
|
+
const runtimePulse = createRuntimePulse({
|
|
324
|
+
flags,
|
|
325
|
+
liveShareMirroring: () => bag.liveShareMirroring?.() === true,
|
|
326
|
+
getState,
|
|
327
|
+
getPublishedState,
|
|
328
|
+
set,
|
|
329
|
+
emit: store.emit,
|
|
330
|
+
routeState,
|
|
331
|
+
agentStatusState,
|
|
332
|
+
syncContextStats,
|
|
333
|
+
});
|
|
334
|
+
// A `git switch` from any terminal reaches the island within ~a frame; the
|
|
335
|
+
// pulse retargets the watch when the session's folder moves.
|
|
336
|
+
const headWatch = createGitHeadWatcher({
|
|
337
|
+
getCwd: () => runtime.getLiveWorkspace?.()?.cwd || runtime.cwd,
|
|
338
|
+
onChange: runtimePulse.publishWorkspace,
|
|
339
|
+
});
|
|
340
|
+
headWatch.retarget();
|
|
341
|
+
lifecycle.unsubscribeGitHeadWatch = headWatch.dispose;
|
|
342
|
+
lifecycle.runtimePulseTimer = setInterval(() => {
|
|
343
|
+
headWatch.retarget();
|
|
344
|
+
runtimePulse();
|
|
345
|
+
}, 2000);
|
|
294
346
|
lifecycle.runtimePulseTimer.unref?.();
|
|
295
347
|
|
|
296
348
|
const {
|
|
@@ -405,8 +457,7 @@ export async function createLocalSessionRuntime({
|
|
|
405
457
|
Object.assign(bag, createSessionFlow(bag));
|
|
406
458
|
// Runtime-driven completion wakes (no attached surface acked the completion)
|
|
407
459
|
// get the same idle auto-clear as a user submit.
|
|
408
|
-
lifecycle.unsubscribeCompletionWakeGate =
|
|
409
|
-
runtime.setCompletionWakeGate?.(() => bag.autoClearBeforeWake()) || null;
|
|
460
|
+
lifecycle.unsubscribeCompletionWakeGate = runtime.setCompletionWakeGate?.(() => bag.autoClearBeforeWake()) || null;
|
|
410
461
|
Object.assign(
|
|
411
462
|
bag,
|
|
412
463
|
createGoalContinuation({
|
|
@@ -21,6 +21,7 @@ import { withHeapCap } from '../runtime/shared/heap-cap.mjs';
|
|
|
21
21
|
import { daemonCrashCaptureDir, daemonDataDir } from '../session-runtime/services/daemon-crash-capture.mjs';
|
|
22
22
|
import { forkDaemonCandidate } from '../session-runtime/services/daemon-candidate.mjs';
|
|
23
23
|
import { daemonOwnerIsStale, proveDaemonOwnerRecord } from './daemon-owner.mjs';
|
|
24
|
+
import { IN_TREE_DAEMON_STOP_GRACE_MS } from './daemon-stop-budget.mjs';
|
|
24
25
|
import { createAttachmentCalls } from './session-client/attachment-calls.mjs';
|
|
25
26
|
import { daemonUnavailableError } from './session-client/daemon-unavailable.mjs';
|
|
26
27
|
import { createLeaseHeartbeat } from './session-client/lease-heartbeat.mjs';
|
|
@@ -324,6 +325,12 @@ async function replaceLowerDaemon(discovery, initialHealth, { log, onUpgradeWait
|
|
|
324
325
|
* caller then re-reads discovery and attaches to whoever won. The shared fork
|
|
325
326
|
* and crash capture live in ./daemon-candidate.mjs.
|
|
326
327
|
* `entry` is a test seam; production always forks the real daemon. */
|
|
328
|
+
// Daemons this process forked into its own process tree (daemonShouldDetach
|
|
329
|
+
// false: the packaged Windows Desktop). Such a child is killed with its
|
|
330
|
+
// launcher (libuv's kill-on-close job), which skips its whole teardown —
|
|
331
|
+
// PostgreSQL stop included — so the launcher's quit stops it first.
|
|
332
|
+
const inTreeDaemons = new Map();
|
|
333
|
+
|
|
327
334
|
export function spawnDaemonCandidate({ cwd, log, timeoutMs = 30_000, entry = daemonEntry() }) {
|
|
328
335
|
const t0 = performance.now();
|
|
329
336
|
const at = () => Math.round(performance.now() - t0);
|
|
@@ -353,6 +360,10 @@ export function spawnDaemonCandidate({ cwd, log, timeoutMs = 30_000, entry = dae
|
|
|
353
360
|
const forkMs = at();
|
|
354
361
|
child.once('spawn', () => {
|
|
355
362
|
log(`daemon fork: forkMs=${forkMs} spawnEventMs=${at()}`);
|
|
363
|
+
if (!detached && child.pid) {
|
|
364
|
+
inTreeDaemons.set(child.pid, child);
|
|
365
|
+
child.once('exit', () => inTreeDaemons.delete(child.pid));
|
|
366
|
+
}
|
|
356
367
|
});
|
|
357
368
|
},
|
|
358
369
|
onReady: () => log(`daemon ready at=${at()}ms`),
|
|
@@ -634,6 +645,37 @@ export async function shutdownDaemon(
|
|
|
634
645
|
return true;
|
|
635
646
|
}
|
|
636
647
|
|
|
648
|
+
/** Launcher quit: a daemon this process forked into its own tree would die
|
|
649
|
+
* with it, so ask the serving one to stop (forced — its work cannot outlive
|
|
650
|
+
* this tree anyway) and wait, bounded, for every such child's graceful exit.
|
|
651
|
+
* One that already unpublished its endpoint is mid-teardown: only waited on.
|
|
652
|
+
* False when no such child is alive (detached, or another launcher's). */
|
|
653
|
+
export async function stopInTreeDaemon({
|
|
654
|
+
timeoutMs = IN_TREE_DAEMON_STOP_GRACE_MS,
|
|
655
|
+
discovery = readSessionDiscovery(),
|
|
656
|
+
} = {}) {
|
|
657
|
+
const pids = [...inTreeDaemons.keys()].filter((pid) => isPidAlive(pid));
|
|
658
|
+
if (!pids.length) return false;
|
|
659
|
+
if (discovery?.port && pids.includes(Number(discovery.pid))) {
|
|
660
|
+
try {
|
|
661
|
+
await request({
|
|
662
|
+
port: discovery.port,
|
|
663
|
+
token: discovery.token,
|
|
664
|
+
method: 'POST',
|
|
665
|
+
path: '/stop',
|
|
666
|
+
body: { force: true },
|
|
667
|
+
timeoutMs: 3000,
|
|
668
|
+
control: true,
|
|
669
|
+
});
|
|
670
|
+
} catch {
|
|
671
|
+
// Past its front door already: only the wait remains.
|
|
672
|
+
}
|
|
673
|
+
}
|
|
674
|
+
const deadline = Date.now() + Math.max(1, Number(timeoutMs) || IN_TREE_DAEMON_STOP_GRACE_MS);
|
|
675
|
+
while (pids.some((pid) => isPidAlive(pid)) && Date.now() < deadline) await delay(50);
|
|
676
|
+
return !pids.some((pid) => isPidAlive(pid));
|
|
677
|
+
}
|
|
678
|
+
|
|
637
679
|
export async function shutdownDaemonForRuntimeRoot(root, options = {}) {
|
|
638
680
|
const runtimeRoot = String(root || '').trim();
|
|
639
681
|
if (!runtimeRoot) return false;
|
|
@@ -19,6 +19,7 @@ export const SESSION_READ_ACTIONS = Object.freeze([
|
|
|
19
19
|
'getMediaDefault',
|
|
20
20
|
'getMediaJob',
|
|
21
21
|
'getMcpServerConfig',
|
|
22
|
+
'getMcpOAuthLoginStatus',
|
|
22
23
|
'getOnboardingStatus',
|
|
23
24
|
'getOAuthProviderLoginStatus',
|
|
24
25
|
'getOutputStyle',
|
|
@@ -29,6 +30,7 @@ export const SESSION_READ_ACTIONS = Object.freeze([
|
|
|
29
30
|
'getQuotaAutoResume',
|
|
30
31
|
'getQuotaHistory',
|
|
31
32
|
'getRecapSettings',
|
|
33
|
+
'getSessionTitleSettings',
|
|
32
34
|
'getWebSearchRoute',
|
|
33
35
|
'getSettingsSnapshot',
|
|
34
36
|
'getSystemShell',
|
|
@@ -40,9 +42,11 @@ export const SESSION_READ_ACTIONS = Object.freeze([
|
|
|
40
42
|
'inspectHuggingFaceModel',
|
|
41
43
|
'getLocalProviderModelDetails',
|
|
42
44
|
'getSessionReviewDiff',
|
|
45
|
+
'getSessionReviewFilePatch',
|
|
43
46
|
'getSessionUsage',
|
|
44
47
|
'getTurnChanges',
|
|
45
48
|
'getTurnReviewDiff',
|
|
49
|
+
'getTurnReviewFilePatch',
|
|
46
50
|
'getTurnLiveness',
|
|
47
51
|
'getUpdateSettings',
|
|
48
52
|
'getUpdateStatus',
|
|
@@ -83,18 +87,23 @@ export const SESSION_CONFIGURE_ACTIONS = Object.freeze([
|
|
|
83
87
|
'addPlugin',
|
|
84
88
|
'addSkill',
|
|
85
89
|
'agentControl',
|
|
90
|
+
'askSide',
|
|
86
91
|
'authenticateProvider',
|
|
87
92
|
'beginOAuthProviderLogin',
|
|
93
|
+
'beginMcpOAuthLogin',
|
|
88
94
|
'updateProviderAccounts',
|
|
89
95
|
'cacheMediaThumbnail',
|
|
90
96
|
'cancelMediaJob',
|
|
91
97
|
'cancelOAuthProviderLogin',
|
|
98
|
+
'cancelMcpOAuthLogin',
|
|
92
99
|
'cancelConversationImport',
|
|
100
|
+
'cancelSide',
|
|
93
101
|
'checkForUpdate',
|
|
94
102
|
'clear',
|
|
95
103
|
'compact',
|
|
96
104
|
'completeOnboarding',
|
|
97
105
|
'completeOAuthProviderLogin',
|
|
106
|
+
'completeMcpOAuthLogin',
|
|
98
107
|
'consumeCodexRateLimitResetCredit',
|
|
99
108
|
'createWorkflow',
|
|
100
109
|
'deleteAgentDefinition',
|
|
@@ -106,6 +115,7 @@ export const SESSION_CONFIGURE_ACTIONS = Object.freeze([
|
|
|
106
115
|
'removeCustomProvider',
|
|
107
116
|
'updateCustomProviderModel',
|
|
108
117
|
'testCustomProvider',
|
|
118
|
+
'checkCustomProviderKeyEnv',
|
|
109
119
|
'discoverCustomProviderModels',
|
|
110
120
|
'deleteSession',
|
|
111
121
|
'deleteWebhook',
|
|
@@ -118,6 +128,7 @@ export const SESSION_CONFIGURE_ACTIONS = Object.freeze([
|
|
|
118
128
|
'memoryControl',
|
|
119
129
|
'openMediaAsset',
|
|
120
130
|
'openMediaFolder',
|
|
131
|
+
'probeMcpServerAuth',
|
|
121
132
|
'pushNotice',
|
|
122
133
|
'recall',
|
|
123
134
|
'reconnectMcp',
|
|
@@ -143,6 +154,7 @@ export const SESSION_CONFIGURE_ACTIONS = Object.freeze([
|
|
|
143
154
|
'revertTurnReviewFile',
|
|
144
155
|
'revertTurnChanges',
|
|
145
156
|
'reapplyTurnChanges',
|
|
157
|
+
'clearSessionChangeHistory',
|
|
146
158
|
'rewindToItem',
|
|
147
159
|
'runDoctor',
|
|
148
160
|
'runScheduleNow',
|
|
@@ -188,6 +200,7 @@ export const SESSION_CONFIGURE_ACTIONS = Object.freeze([
|
|
|
188
200
|
'setProfile',
|
|
189
201
|
'setProgressHint',
|
|
190
202
|
'setRecapEnabled',
|
|
203
|
+
'setAiSessionTitles',
|
|
191
204
|
'setRoute',
|
|
192
205
|
'setScheduleEnabled',
|
|
193
206
|
'setWebSearchRoute',
|
|
@@ -200,6 +213,7 @@ export const SESSION_CONFIGURE_ACTIONS = Object.freeze([
|
|
|
200
213
|
'setWebhookEnabled',
|
|
201
214
|
'setWorkflow',
|
|
202
215
|
'setOrchestrationMode',
|
|
216
|
+
'signOutMcpServer',
|
|
203
217
|
'saveStarterGuideState',
|
|
204
218
|
'skipOnboarding',
|
|
205
219
|
'startConversationImport',
|
|
@@ -8,6 +8,35 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { applySessionStatePatch } from '../session-state-patch.mjs';
|
|
10
10
|
|
|
11
|
+
// Desktop-only live fields: `streamingPartial` is the unfinished streamed
|
|
12
|
+
// line the desktop paints ahead of the line-gated tail. This terminal view
|
|
13
|
+
// keeps the line-gated text, so it never holds the field nor re-renders for it.
|
|
14
|
+
const DESKTOP_ONLY_FIELDS = ['streamingPartial'];
|
|
15
|
+
|
|
16
|
+
function terminalState(full) {
|
|
17
|
+
if (!full || typeof full !== 'object' || !DESKTOP_ONLY_FIELDS.some((key) => Object.hasOwn(full, key))) return full;
|
|
18
|
+
const next = { ...full };
|
|
19
|
+
for (const key of DESKTOP_ONLY_FIELDS) delete next[key];
|
|
20
|
+
return next;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** The patch without desktop-only fields, or null when nothing else moved. */
|
|
24
|
+
function terminalPatch(patch) {
|
|
25
|
+
const set = patch.set && typeof patch.set === 'object' ? patch.set : {};
|
|
26
|
+
const remove = Array.isArray(patch.remove) ? patch.remove : [];
|
|
27
|
+
if (!patch.partialAppend && !DESKTOP_ONLY_FIELDS.some((key) => Object.hasOwn(set, key) || remove.includes(key))) {
|
|
28
|
+
return patch;
|
|
29
|
+
}
|
|
30
|
+
const nextSet = { ...set };
|
|
31
|
+
for (const key of DESKTOP_ONLY_FIELDS) delete nextSet[key];
|
|
32
|
+
const nextRemove = remove.filter((key) => !DESKTOP_ONLY_FIELDS.includes(key));
|
|
33
|
+
if (Object.keys(nextSet).length === 0 && nextRemove.length === 0 && !patch.itemsAppend && !patch.itemsPrepend) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
const { partialAppend: _desktopOnly, ...rest } = patch;
|
|
37
|
+
return { ...rest, set: nextSet, remove: nextRemove };
|
|
38
|
+
}
|
|
39
|
+
|
|
11
40
|
export function createProjection({ binding, log }) {
|
|
12
41
|
let state = {};
|
|
13
42
|
let revision = 0;
|
|
@@ -40,7 +69,7 @@ export function createProjection({ binding, log }) {
|
|
|
40
69
|
const incomingRevision = Number(body.revision);
|
|
41
70
|
if (revisionAttachment !== sourceAttachment || revisionSessionId !== binding.sessionId) {
|
|
42
71
|
if (body.full === undefined || body.full === null) return false;
|
|
43
|
-
state = body.full;
|
|
72
|
+
state = terminalState(body.full);
|
|
44
73
|
revision = Number.isFinite(incomingRevision) ? incomingRevision : 0;
|
|
45
74
|
revisionAttachment = sourceAttachment;
|
|
46
75
|
revisionSessionId = binding.sessionId;
|
|
@@ -49,7 +78,7 @@ export function createProjection({ binding, log }) {
|
|
|
49
78
|
}
|
|
50
79
|
if (Number.isFinite(incomingRevision) && incomingRevision < revision) return true;
|
|
51
80
|
if (body.full !== undefined && body.full !== null) {
|
|
52
|
-
state = body.full;
|
|
81
|
+
state = terminalState(body.full);
|
|
53
82
|
revision = Number.isFinite(incomingRevision) ? incomingRevision : revision;
|
|
54
83
|
emit();
|
|
55
84
|
return true;
|
|
@@ -57,8 +86,16 @@ export function createProjection({ binding, log }) {
|
|
|
57
86
|
if (body.patch) {
|
|
58
87
|
if (Number(body.revision) === revision && Number(body.baseRevision) === revision - 1) return true;
|
|
59
88
|
if (Number(body.baseRevision) !== revision) return false;
|
|
60
|
-
|
|
89
|
+
const patch = terminalPatch(body.patch);
|
|
90
|
+
// Only a desktop-only field moved: the terminal view advances silently.
|
|
91
|
+
if (!patch) {
|
|
92
|
+
revision = Number(body.revision) || revision;
|
|
93
|
+
return true;
|
|
94
|
+
}
|
|
95
|
+
const patched = applySessionStatePatch(state, patch);
|
|
96
|
+
if (!patched) return false;
|
|
61
97
|
revision = Number(body.revision) || revision;
|
|
98
|
+
state = patched;
|
|
62
99
|
emit();
|
|
63
100
|
return true;
|
|
64
101
|
}
|
|
@@ -76,7 +113,7 @@ export function createProjection({ binding, log }) {
|
|
|
76
113
|
return {
|
|
77
114
|
// The create result seeds the projection for the current binding.
|
|
78
115
|
seed(created) {
|
|
79
|
-
state = created?.full ?? {};
|
|
116
|
+
state = terminalState(created?.full ?? {});
|
|
80
117
|
revision = Number(created?.revision) || 0;
|
|
81
118
|
revisionAttachment = binding.attachment;
|
|
82
119
|
revisionSessionId = binding.sessionId;
|
|
@@ -50,6 +50,20 @@ export function createInlineBootLoaders({
|
|
|
50
50
|
return localModulePromise;
|
|
51
51
|
}
|
|
52
52
|
|
|
53
|
+
// Background warm-up of the session-local module graph. Independent of the
|
|
54
|
+
// keychain gate (the ESM cache makes the later localModule() import free);
|
|
55
|
+
// never throws — a failed warm-up leaves create on its lazy path.
|
|
56
|
+
async function warmLocalRuntime() {
|
|
57
|
+
if (isClosed()) return false;
|
|
58
|
+
try {
|
|
59
|
+
const module = await loadLocalModule();
|
|
60
|
+
if (isClosed()) return false;
|
|
61
|
+
return (await module.warmLocalSessionRuntime?.()) !== false;
|
|
62
|
+
} catch {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
53
67
|
function agentGraph() {
|
|
54
68
|
agentGraphPromise ??= measured('agent-dispatch-graph-import', () => {
|
|
55
69
|
assertOpen();
|
|
@@ -92,5 +106,5 @@ export function createInlineBootLoaders({
|
|
|
92
106
|
await tracked;
|
|
93
107
|
}
|
|
94
108
|
|
|
95
|
-
return { prewarmKeychain, localModule, agentGraph, prepareAgentProviders };
|
|
109
|
+
return { prewarmKeychain, warmLocalRuntime, localModule, agentGraph, prepareAgentProviders };
|
|
96
110
|
}
|
|
@@ -74,6 +74,7 @@ export function createInlineSessionRuntimeHost({
|
|
|
74
74
|
return {
|
|
75
75
|
create,
|
|
76
76
|
prewarmKeychain: loaders.prewarmKeychain,
|
|
77
|
+
warmLocalRuntime: loaders.warmLocalRuntime,
|
|
77
78
|
agentDispatch: dispatch.agentDispatch,
|
|
78
79
|
async agentControl(args = {}, context = {}) {
|
|
79
80
|
if (closed) throw new Error('session runtime host is closed');
|