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
|
@@ -15,10 +15,12 @@ import { createGoalContinuation } from '../tui/session/goal-continuation.mjs';
|
|
|
15
15
|
import { createToolApproval } from '../tui/session/tool-approval.mjs';
|
|
16
16
|
import { createToolCardResults } from '../tui/session/tool-card-results.mjs';
|
|
17
17
|
import { createAgentJobFeed } from '../tui/session/agent-job-feed.mjs';
|
|
18
|
+
import { createWorktreeSetupNotices } from '../tui/session/worktree-setup-notice.mjs';
|
|
18
19
|
import { createContextState } from '../tui/session/context-state.mjs';
|
|
19
20
|
import { createSessionFlow } from '../tui/session/session-flow.mjs';
|
|
20
21
|
import { createRunTurn } from '../tui/session/turn.mjs';
|
|
21
22
|
import { createQuotaResumeLane } from '../tui/session/quota-resume.mjs';
|
|
23
|
+
import { createGitHeadWatcher } from '../runtime/shared/worktrees/git-head.mjs';
|
|
22
24
|
import { publicQuotaResume, quotaResumeEntry } from '../runtime/shared/quota-resume-store.mjs';
|
|
23
25
|
import { createSessionApi } from '../tui/session/session-api.mjs';
|
|
24
26
|
import { createSessionDraftStore } from '../tui/session/draft-store.mjs';
|
|
@@ -27,24 +29,60 @@ import { createActiveToolTracker } from '../tui/session/active-tool-summary.mjs'
|
|
|
27
29
|
import { createTranscriptStore } from '../tui/session/transcript-store.mjs';
|
|
28
30
|
import { createTranscriptIntake } from '../tui/session/transcript-intake.mjs';
|
|
29
31
|
import { createNoticeSurface } from '../tui/session/notice-surface.mjs';
|
|
30
|
-
import {
|
|
32
|
+
import { rearmGoalContinuationOnSessionBoundaries } from '../tui/session/goal-continuation/session-boundary.mjs';
|
|
31
33
|
import { createTranscriptRouteMetadata } from '../runtime/shared/transcript-metadata.mjs';
|
|
32
34
|
import { formatDoctorReport, runDoctorChecks } from '../tui/app/doctor.mjs';
|
|
33
35
|
// tuiDebug is an opt-in diagnostic trace for the hang chain (runTurn start/end,
|
|
34
36
|
// busy-queue enqueue/drain). Quiet by default so it can never tear through
|
|
35
37
|
// the alternate-screen render; enable with MIXDOG_TUI_DEBUG=1.
|
|
36
|
-
import {
|
|
38
|
+
import {
|
|
39
|
+
tuiDebug,
|
|
40
|
+
nextId,
|
|
41
|
+
createTranscriptSpillBuffer,
|
|
42
|
+
sweepStaleTranscriptSpillDirsOnce,
|
|
43
|
+
} from '../tui/session/transcript-spill.mjs';
|
|
37
44
|
|
|
38
45
|
const SESSION_RUNTIME_MODULE = '../mixdog-session-runtime.mjs';
|
|
39
46
|
|
|
40
47
|
// Shared across create calls so concurrent session startups import the
|
|
41
48
|
// runtime graph once.
|
|
42
49
|
let sessionRuntimeModulePromise = null;
|
|
50
|
+
let sessionRuntimeImporter = () => import(SESSION_RUNTIME_MODULE);
|
|
43
51
|
function importSessionRuntimeModule() {
|
|
44
|
-
|
|
52
|
+
// A failed import is forgotten so the next caller retries lazily.
|
|
53
|
+
sessionRuntimeModulePromise ??= Promise.resolve()
|
|
54
|
+
.then(() => sessionRuntimeImporter())
|
|
55
|
+
.catch((error) => {
|
|
56
|
+
sessionRuntimeModulePromise = null;
|
|
57
|
+
throw error;
|
|
58
|
+
});
|
|
45
59
|
return sessionRuntimeModulePromise;
|
|
46
60
|
}
|
|
47
61
|
|
|
62
|
+
/**
|
|
63
|
+
* Background warm-up for the daemon (scheduled after the ready signal): loads
|
|
64
|
+
* the session-runtime module tree and runs the one-per-process transcript
|
|
65
|
+
* spill sweep, so the first session.create pays for neither. Failures are
|
|
66
|
+
* swallowed — create falls back to the same lazy import.
|
|
67
|
+
*/
|
|
68
|
+
export async function warmLocalSessionRuntime() {
|
|
69
|
+
try {
|
|
70
|
+
await importSessionRuntimeModule();
|
|
71
|
+
// Separate turn: let queued I/O run between the import and the sync sweep.
|
|
72
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
73
|
+
sweepStaleTranscriptSpillDirsOnce();
|
|
74
|
+
return true;
|
|
75
|
+
} catch {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/** Test seam: replace the dynamic import of the session-runtime module. */
|
|
81
|
+
export function setSessionRuntimeImporterForTest(importer) {
|
|
82
|
+
sessionRuntimeImporter = importer || (() => import(SESSION_RUNTIME_MODULE));
|
|
83
|
+
sessionRuntimeModulePromise = null;
|
|
84
|
+
}
|
|
85
|
+
|
|
48
86
|
const TOOL_APPROVAL_TIMEOUT_MS = (() => {
|
|
49
87
|
const value = Number(process.env.MIXDOG_TOOL_APPROVAL_TIMEOUT_MS);
|
|
50
88
|
return Number.isFinite(value) && value > 0 ? Math.max(1000, Math.round(value)) : 120_000;
|
|
@@ -72,7 +110,6 @@ export { parseBackgroundTaskEnvelope } from '../tui/session/agent-envelope.mjs';
|
|
|
72
110
|
*/
|
|
73
111
|
export function createRuntimePulse({
|
|
74
112
|
flags,
|
|
75
|
-
liveShareMirroring,
|
|
76
113
|
getState,
|
|
77
114
|
getPublishedState,
|
|
78
115
|
set,
|
|
@@ -98,16 +135,9 @@ 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
|
-
// Attached viewer with a live pipe: the owner's frames are authoritative
|
|
105
|
-
// for stats/agent/tool state. Recomputing them locally here would stomp
|
|
106
|
-
// the mirror with this process's empty registries every 2s.
|
|
107
|
-
if (liveShareMirroring()) {
|
|
108
|
-
publishChanged({ ...routeState() });
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
141
|
syncContextStats({ allowEstimated: true });
|
|
112
142
|
publishChanged({
|
|
113
143
|
...routeState(),
|
|
@@ -115,6 +145,12 @@ export function createRuntimePulse({
|
|
|
115
145
|
...agentStatusState(),
|
|
116
146
|
});
|
|
117
147
|
};
|
|
148
|
+
/** Publishes just the workspace (a HEAD change): no stats or agent recompute. */
|
|
149
|
+
pulse.publishWorkspace = () => {
|
|
150
|
+
if (flags.disposed || flags.pendingSessionReset) return;
|
|
151
|
+
publishChanged({ workspace: routeState().workspace });
|
|
152
|
+
};
|
|
153
|
+
return pulse;
|
|
118
154
|
}
|
|
119
155
|
|
|
120
156
|
export async function createLocalSessionRuntime({
|
|
@@ -134,6 +170,7 @@ export async function createLocalSessionRuntime({
|
|
|
134
170
|
sessionProfile,
|
|
135
171
|
worktree,
|
|
136
172
|
executeAgentControl,
|
|
173
|
+
executeSessionControl,
|
|
137
174
|
} = {}) {
|
|
138
175
|
const startedAt = performance.now();
|
|
139
176
|
bootProfile('session:create:start', { provider: providerName, model, toolMode, remote });
|
|
@@ -166,6 +203,7 @@ export async function createLocalSessionRuntime({
|
|
|
166
203
|
// Session creation worktree intent; consumed by the workspace transition scope.
|
|
167
204
|
...(worktree && typeof worktree === 'object' ? { worktree } : {}),
|
|
168
205
|
...(typeof executeAgentControl === 'function' ? { executeAgentControl } : {}),
|
|
206
|
+
...(typeof executeSessionControl === 'function' ? { executeSessionControl } : {}),
|
|
169
207
|
});
|
|
170
208
|
bootProfile('session:create:runtime-ready', { ms: (performance.now() - startedAt).toFixed(1) });
|
|
171
209
|
const runtimeCwd = runtime.cwd || process.cwd();
|
|
@@ -277,20 +315,28 @@ export async function createLocalSessionRuntime({
|
|
|
277
315
|
timeoutMs: TOOL_APPROVAL_TIMEOUT_MS,
|
|
278
316
|
}
|
|
279
317
|
);
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
318
|
+
const runtimePulse = createRuntimePulse({
|
|
319
|
+
flags,
|
|
320
|
+
getState,
|
|
321
|
+
getPublishedState,
|
|
322
|
+
set,
|
|
323
|
+
emit: store.emit,
|
|
324
|
+
routeState,
|
|
325
|
+
agentStatusState,
|
|
326
|
+
syncContextStats,
|
|
327
|
+
});
|
|
328
|
+
// A `git switch` from any terminal reaches the island within ~a frame; the
|
|
329
|
+
// pulse retargets the watch when the session's folder moves.
|
|
330
|
+
const headWatch = createGitHeadWatcher({
|
|
331
|
+
getCwd: () => runtime.getLiveWorkspace?.()?.cwd || runtime.cwd,
|
|
332
|
+
onChange: runtimePulse.publishWorkspace,
|
|
333
|
+
});
|
|
334
|
+
headWatch.retarget();
|
|
335
|
+
lifecycle.unsubscribeGitHeadWatch = headWatch.dispose;
|
|
336
|
+
lifecycle.runtimePulseTimer = setInterval(() => {
|
|
337
|
+
headWatch.retarget();
|
|
338
|
+
runtimePulse();
|
|
339
|
+
}, 2000);
|
|
294
340
|
lifecycle.runtimePulseTimer.unref?.();
|
|
295
341
|
|
|
296
342
|
const {
|
|
@@ -322,9 +368,14 @@ export async function createLocalSessionRuntime({
|
|
|
322
368
|
itemIndexById,
|
|
323
369
|
});
|
|
324
370
|
lifecycle.unsubscribeRuntimeNotifications = subscribeRuntimeNotifications();
|
|
371
|
+
if (typeof runtime.onWorktreeSetup === 'function') {
|
|
372
|
+
lifecycle.unsubscribeWorktreeSetup = runtime.onWorktreeSetup(
|
|
373
|
+
createWorktreeSetupNotices({ pushItem, patchItem, nextId })
|
|
374
|
+
);
|
|
375
|
+
}
|
|
325
376
|
if (typeof runtime.onAgentStatusChange === 'function') {
|
|
326
377
|
lifecycle.unsubscribeAgentStatus = runtime.onAgentStatusChange(() => {
|
|
327
|
-
if (flags.disposed || flags.pendingSessionReset
|
|
378
|
+
if (flags.disposed || flags.pendingSessionReset) return;
|
|
328
379
|
set({ ...agentStatusState({ force: true }) });
|
|
329
380
|
bag.scheduleGoalContinuation?.();
|
|
330
381
|
});
|
|
@@ -405,8 +456,7 @@ export async function createLocalSessionRuntime({
|
|
|
405
456
|
Object.assign(bag, createSessionFlow(bag));
|
|
406
457
|
// Runtime-driven completion wakes (no attached surface acked the completion)
|
|
407
458
|
// get the same idle auto-clear as a user submit.
|
|
408
|
-
lifecycle.unsubscribeCompletionWakeGate =
|
|
409
|
-
runtime.setCompletionWakeGate?.(() => bag.autoClearBeforeWake()) || null;
|
|
459
|
+
lifecycle.unsubscribeCompletionWakeGate = runtime.setCompletionWakeGate?.(() => bag.autoClearBeforeWake()) || null;
|
|
410
460
|
Object.assign(
|
|
411
461
|
bag,
|
|
412
462
|
createGoalContinuation({
|
|
@@ -423,7 +473,7 @@ export async function createLocalSessionRuntime({
|
|
|
423
473
|
bag.runTurn = createRunTurn(bag);
|
|
424
474
|
bag.doctor = { runDoctorChecks, formatDoctorReport };
|
|
425
475
|
const api = createSessionApi(bag);
|
|
426
|
-
|
|
476
|
+
rearmGoalContinuationOnSessionBoundaries({ api, bag });
|
|
427
477
|
void Promise.resolve(bag.restoreLeadSteeringFromDisk())
|
|
428
478
|
.catch(() => {})
|
|
429
479
|
.finally(() => {
|
|
@@ -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;
|
|
@@ -6,6 +6,8 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
export const SESSION_READ_ACTIONS = Object.freeze([
|
|
9
|
+
'inspectProjectBranch',
|
|
10
|
+
'isSessionTerminal',
|
|
9
11
|
'contextStatus',
|
|
10
12
|
'getAgentDefinition',
|
|
11
13
|
'getAutoClear',
|
|
@@ -18,6 +20,7 @@ export const SESSION_READ_ACTIONS = Object.freeze([
|
|
|
18
20
|
'getDisabledSkills',
|
|
19
21
|
'getMediaDefault',
|
|
20
22
|
'getMediaJob',
|
|
23
|
+
'getMediaPins',
|
|
21
24
|
'getMcpServerConfig',
|
|
22
25
|
'getMcpOAuthLoginStatus',
|
|
23
26
|
'getOnboardingStatus',
|
|
@@ -30,6 +33,7 @@ export const SESSION_READ_ACTIONS = Object.freeze([
|
|
|
30
33
|
'getQuotaAutoResume',
|
|
31
34
|
'getQuotaHistory',
|
|
32
35
|
'getRecapSettings',
|
|
36
|
+
'getSessionTitleSettings',
|
|
33
37
|
'getWebSearchRoute',
|
|
34
38
|
'getSettingsSnapshot',
|
|
35
39
|
'getSystemShell',
|
|
@@ -41,9 +45,11 @@ export const SESSION_READ_ACTIONS = Object.freeze([
|
|
|
41
45
|
'inspectHuggingFaceModel',
|
|
42
46
|
'getLocalProviderModelDetails',
|
|
43
47
|
'getSessionReviewDiff',
|
|
48
|
+
'getSessionReviewFilePatch',
|
|
44
49
|
'getSessionUsage',
|
|
45
50
|
'getTurnChanges',
|
|
46
51
|
'getTurnReviewDiff',
|
|
52
|
+
'getTurnReviewFilePatch',
|
|
47
53
|
'getTurnLiveness',
|
|
48
54
|
'getUpdateSettings',
|
|
49
55
|
'getUpdateStatus',
|
|
@@ -68,6 +74,7 @@ export const SESSION_READ_ACTIONS = Object.freeze([
|
|
|
68
74
|
'listProviders',
|
|
69
75
|
'listWebSearchModels',
|
|
70
76
|
'listThemes',
|
|
77
|
+
'listShellJobs',
|
|
71
78
|
'listWorkflows',
|
|
72
79
|
'mcpStatus',
|
|
73
80
|
'pluginsStatus',
|
|
@@ -84,6 +91,7 @@ export const SESSION_CONFIGURE_ACTIONS = Object.freeze([
|
|
|
84
91
|
'addPlugin',
|
|
85
92
|
'addSkill',
|
|
86
93
|
'agentControl',
|
|
94
|
+
'askSide',
|
|
87
95
|
'authenticateProvider',
|
|
88
96
|
'beginOAuthProviderLogin',
|
|
89
97
|
'beginMcpOAuthLogin',
|
|
@@ -93,6 +101,7 @@ export const SESSION_CONFIGURE_ACTIONS = Object.freeze([
|
|
|
93
101
|
'cancelOAuthProviderLogin',
|
|
94
102
|
'cancelMcpOAuthLogin',
|
|
95
103
|
'cancelConversationImport',
|
|
104
|
+
'cancelSide',
|
|
96
105
|
'checkForUpdate',
|
|
97
106
|
'clear',
|
|
98
107
|
'compact',
|
|
@@ -110,6 +119,7 @@ export const SESSION_CONFIGURE_ACTIONS = Object.freeze([
|
|
|
110
119
|
'removeCustomProvider',
|
|
111
120
|
'updateCustomProviderModel',
|
|
112
121
|
'testCustomProvider',
|
|
122
|
+
'checkCustomProviderKeyEnv',
|
|
113
123
|
'discoverCustomProviderModels',
|
|
114
124
|
'deleteSession',
|
|
115
125
|
'deleteWebhook',
|
|
@@ -188,12 +198,14 @@ export const SESSION_CONFIGURE_ACTIONS = Object.freeze([
|
|
|
188
198
|
'startLocalProviderModelMaintenance',
|
|
189
199
|
'deleteLocalProviderModel',
|
|
190
200
|
'setMediaDefault',
|
|
201
|
+
'setMediaPin',
|
|
191
202
|
'setModel',
|
|
192
203
|
'setOutputStyle',
|
|
193
204
|
'setPluginEnabled',
|
|
194
205
|
'setProfile',
|
|
195
206
|
'setProgressHint',
|
|
196
207
|
'setRecapEnabled',
|
|
208
|
+
'setAiSessionTitles',
|
|
197
209
|
'setRoute',
|
|
198
210
|
'setScheduleEnabled',
|
|
199
211
|
'setWebSearchRoute',
|
|
@@ -212,6 +224,7 @@ export const SESSION_CONFIGURE_ACTIONS = Object.freeze([
|
|
|
212
224
|
'startConversationImport',
|
|
213
225
|
'startMediaJob',
|
|
214
226
|
'stopShellJob',
|
|
227
|
+
'releaseShellJob',
|
|
215
228
|
'switchContext',
|
|
216
229
|
'taskControl',
|
|
217
230
|
'testWebhook',
|
|
@@ -226,6 +239,7 @@ export const SESSION_CONFIGURE_ACTIONS = Object.freeze([
|
|
|
226
239
|
'selectBranch',
|
|
227
240
|
'selectProjectBranch',
|
|
228
241
|
'mergeProjectBranch',
|
|
242
|
+
'manageProjectBranch',
|
|
229
243
|
'requestWorktree',
|
|
230
244
|
'mergeWorkspace',
|
|
231
245
|
'removeWorktree',
|
|
@@ -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
|
}
|
|
@@ -27,6 +27,7 @@ export function createInlineSessionRuntimeHost({
|
|
|
27
27
|
await keychain.prewarmSecrets();
|
|
28
28
|
},
|
|
29
29
|
executeAgentControl = null,
|
|
30
|
+
executeSessionControl = null,
|
|
30
31
|
} = {}) {
|
|
31
32
|
let closed = false;
|
|
32
33
|
let closePromise = null;
|
|
@@ -59,6 +60,7 @@ export function createInlineSessionRuntimeHost({
|
|
|
59
60
|
...options,
|
|
60
61
|
...(options.cwd ? {} : { cwd }),
|
|
61
62
|
...(typeof executeAgentControl === 'function' ? { executeAgentControl } : {}),
|
|
63
|
+
...(typeof executeSessionControl === 'function' ? { executeSessionControl } : {}),
|
|
62
64
|
});
|
|
63
65
|
if (closed) {
|
|
64
66
|
try {
|
|
@@ -74,6 +76,7 @@ export function createInlineSessionRuntimeHost({
|
|
|
74
76
|
return {
|
|
75
77
|
create,
|
|
76
78
|
prewarmKeychain: loaders.prewarmKeychain,
|
|
79
|
+
warmLocalRuntime: loaders.warmLocalRuntime,
|
|
77
80
|
agentDispatch: dispatch.agentDispatch,
|
|
78
81
|
async agentControl(args = {}, context = {}) {
|
|
79
82
|
if (closed) throw new Error('session runtime host is closed');
|
|
@@ -24,7 +24,7 @@ export function createAgentCancellation({
|
|
|
24
24
|
log,
|
|
25
25
|
rememberCancelTranscript,
|
|
26
26
|
}) {
|
|
27
|
-
const
|
|
27
|
+
const agentCloseRuns = new Map();
|
|
28
28
|
|
|
29
29
|
/** The runtime entry that can close this descriptor: the live owner, else a
|
|
30
30
|
* freshly loaded one (null when loading fails, which is logged). */
|
|
@@ -44,66 +44,108 @@ export function createAgentCancellation({
|
|
|
44
44
|
}
|
|
45
45
|
};
|
|
46
46
|
|
|
47
|
-
function
|
|
48
|
-
const
|
|
49
|
-
if (!id) return Promise.resolve(false);
|
|
50
|
-
const active = agentCancelRuns.get(id);
|
|
47
|
+
function closeOne(id, reason, options) {
|
|
48
|
+
const active = agentCloseRuns.get(id);
|
|
51
49
|
if (active) return active;
|
|
52
50
|
let run;
|
|
53
|
-
run = (
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
51
|
+
run = Promise.resolve()
|
|
52
|
+
.then(async () => {
|
|
53
|
+
cancelBackgroundTasks({
|
|
54
|
+
surface: 'agent',
|
|
55
|
+
callerSessionId: id,
|
|
56
|
+
reason,
|
|
57
|
+
});
|
|
58
|
+
cancelOwnAgentTasks(id, reason);
|
|
59
|
+
const descriptor = registry.get(id);
|
|
60
|
+
if (!descriptor) return false;
|
|
61
|
+
if ((await sessionOwner(id)?.runtime?.isSessionTerminal?.()) === true) return true;
|
|
62
|
+
const entry = await closableEntry(id, descriptor);
|
|
63
|
+
const closeCanonical = entry?.runtime?.closeCanonicalSession;
|
|
64
|
+
if (typeof closeCanonical !== 'function') {
|
|
65
|
+
throw new TypeError('session runtime must implement closeCanonicalSession');
|
|
66
|
+
}
|
|
67
|
+
// The close clears the transcript: capture a running turn's transcript
|
|
68
|
+
// first so the cancelled turn still hands off its partial output.
|
|
69
|
+
if (descriptor.status === 'running') {
|
|
70
|
+
try {
|
|
71
|
+
const { messages } = await entry.runtime.readModelMessages(0);
|
|
72
|
+
rememberCancelTranscript(id, messages);
|
|
73
|
+
} catch (error) {
|
|
74
|
+
log(`agent cancel transcript read failed session=${id}: ${error?.message || error}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const closed = await closeCanonical.call(entry.runtime, reason, { tombstone: options.tombstone === true });
|
|
78
|
+
if (closed !== true) throw new Error(`agent session ${id} could not be durably closed`);
|
|
79
|
+
descriptor.closed = options.tombstone === true;
|
|
80
|
+
descriptor.status = descriptor.closed ? 'closed' : 'cancelled';
|
|
81
|
+
descriptor.stage = descriptor.status;
|
|
82
|
+
descriptor.updatedAt = Date.now();
|
|
83
|
+
return true;
|
|
84
|
+
})
|
|
85
|
+
.finally(() => {
|
|
86
|
+
if (agentCloseRuns.get(id) === run) agentCloseRuns.delete(id);
|
|
59
87
|
});
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
88
|
+
agentCloseRuns.set(id, run);
|
|
89
|
+
return run;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
async function cancelAgentTree(sessionId, reason = 'agent session cancelled', options = {}) {
|
|
93
|
+
const id = String(sessionId || '').trim();
|
|
94
|
+
if (!id) return false;
|
|
95
|
+
await rehydrateAgentSessions();
|
|
96
|
+
const seen = new Set();
|
|
97
|
+
const ordered = [];
|
|
98
|
+
const visit = (current) => {
|
|
99
|
+
if (seen.has(current)) return;
|
|
100
|
+
seen.add(current);
|
|
101
|
+
for (const child of registry.childrenOf(current)) visit(child);
|
|
102
|
+
ordered.push(current);
|
|
103
|
+
};
|
|
104
|
+
visit(id);
|
|
105
|
+
const release = registry.beginCancellation(ordered);
|
|
106
|
+
try {
|
|
107
|
+
let closed = false;
|
|
108
|
+
const failures = [];
|
|
109
|
+
// Descendant-first, one at a time; a failed member never skips the rest.
|
|
110
|
+
for (const current of ordered) {
|
|
74
111
|
try {
|
|
75
|
-
|
|
76
|
-
rememberCancelTranscript(id, messages);
|
|
112
|
+
closed = (await closeOne(current, reason, options)) || closed;
|
|
77
113
|
} catch (error) {
|
|
78
|
-
log(`agent cancel
|
|
114
|
+
log(`agent cancel failed session=${current}: ${error?.message || error}`);
|
|
115
|
+
failures.push(error);
|
|
79
116
|
}
|
|
80
117
|
}
|
|
81
|
-
|
|
82
|
-
if (
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
|
|
118
|
+
if (failures.length === 1) throw failures[0];
|
|
119
|
+
if (failures.length) {
|
|
120
|
+
const details = failures.map((error) => error?.message || String(error)).join('; ');
|
|
121
|
+
throw new AggregateError(
|
|
122
|
+
failures,
|
|
123
|
+
`agent tree cancel failed for ${failures.length} of ${ordered.length} sessions: ${details}`
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
return closed;
|
|
127
|
+
} finally {
|
|
128
|
+
release();
|
|
129
|
+
}
|
|
93
130
|
}
|
|
94
131
|
|
|
95
132
|
async function cancelAgentDescendants(parentSessionId, reason = 'parent session cancelled') {
|
|
96
133
|
await rehydrateAgentSessions();
|
|
97
134
|
const parentId = String(parentSessionId || '');
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
135
|
+
const release = registry.beginCancellation([parentId]);
|
|
136
|
+
try {
|
|
137
|
+
cancelBackgroundTasks({
|
|
138
|
+
surface: 'agent',
|
|
139
|
+
callerSessionId: parentId,
|
|
140
|
+
reason,
|
|
141
|
+
});
|
|
142
|
+
const children = registry.childrenOf(parentId);
|
|
143
|
+
if (!children.length) return false;
|
|
144
|
+
await Promise.all(children.map((childId) => cancelAgentTree(childId, reason)));
|
|
145
|
+
return true;
|
|
146
|
+
} finally {
|
|
147
|
+
release();
|
|
148
|
+
}
|
|
107
149
|
}
|
|
108
150
|
|
|
109
151
|
return { cancelAgentTree, cancelAgentDescendants };
|