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
|
@@ -8,10 +8,9 @@
|
|
|
8
8
|
// (targeted routing, never broadcast — see channel-transport/remote-notify.mjs).
|
|
9
9
|
//
|
|
10
10
|
// This module owns ONLY the transport (sockets, client registry, notify
|
|
11
|
-
// routing and lifecycle). The channels runtime
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
// (stub runtime, no Discord token).
|
|
11
|
+
// routing and lifecycle). The channels runtime is injected via `handleCall`
|
|
12
|
+
// so the same transport is exercised by the real daemon entry AND the smoke
|
|
13
|
+
// harness (stub runtime, no Discord token).
|
|
15
14
|
//
|
|
16
15
|
// Composition root: the shared transport state below is read and written by
|
|
17
16
|
// the sub-services in channel-transport/ (remote binding, client registry,
|
|
@@ -68,5 +68,13 @@ export function createCanonicalAgentControl({ getSessionService, getSessionRunti
|
|
|
68
68
|
return await tool.execute(args, scopedContext);
|
|
69
69
|
}
|
|
70
70
|
|
|
71
|
-
|
|
71
|
+
/** Graceful shutdown: drain and release the canonical agent's index writers.
|
|
72
|
+
* Never builds the tool just to dispose it. */
|
|
73
|
+
async function dispose() {
|
|
74
|
+
if (!canonicalAgentToolPromise) return;
|
|
75
|
+
const tool = await canonicalAgentToolPromise.catch(() => null);
|
|
76
|
+
await tool?.disposeAsync?.({ settle: true });
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
return { canonicalAgentTool, execute, dispose };
|
|
72
80
|
}
|
|
@@ -8,7 +8,31 @@
|
|
|
8
8
|
// created after this surface is handed to the session service).
|
|
9
9
|
// Output: the desktopRuntime object consumed by session-service.
|
|
10
10
|
|
|
11
|
+
/** The stored-session reader, with the Agents pool's running state taken from
|
|
12
|
+
* this daemon's in-memory turn activity (every session runs inline here, so
|
|
13
|
+
* it is the single source of truth; worker index files only declare work). */
|
|
14
|
+
async function loadSessionStoreWithRuntimeActivity() {
|
|
15
|
+
const [store, runtime, progress] = await Promise.all([
|
|
16
|
+
import('../runtime/agent/orchestrator/session/store-summary-reader.mjs'),
|
|
17
|
+
// The import-free leaf holding the runtime map: no session manager graph.
|
|
18
|
+
import('../runtime/agent/orchestrator/session/manager/runtime-state.mjs'),
|
|
19
|
+
import('../runtime/agent/orchestrator/session/agent-pool-progress.mjs'),
|
|
20
|
+
]);
|
|
21
|
+
return {
|
|
22
|
+
...store,
|
|
23
|
+
// Running rows also carry their turn's progress stamp and stage (the
|
|
24
|
+
// quiet-time cue), read from the same runtime map.
|
|
25
|
+
listStoredAgentWorkers: () =>
|
|
26
|
+
progress.withTurnProgress(
|
|
27
|
+
store.listStoredAgentWorkers({ runningSessionIds: runtime.inFlightSessionActivity().working }),
|
|
28
|
+
(sessionId) => runtime.runtimeState.get(sessionId),
|
|
29
|
+
runtime.isTurnInFlight
|
|
30
|
+
),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
11
34
|
export function createDesktopRuntime({ getLocalSessionBridge }) {
|
|
35
|
+
let sessionStore = null;
|
|
12
36
|
return {
|
|
13
37
|
async attachSessionClient(options = {}) {
|
|
14
38
|
const bridge = getLocalSessionBridge();
|
|
@@ -17,7 +41,14 @@ export function createDesktopRuntime({ getLocalSessionBridge }) {
|
|
|
17
41
|
},
|
|
18
42
|
loadProjects: () => import('../runtime/shared/projects.mjs'),
|
|
19
43
|
loadWorktrees: () => import('../runtime/shared/worktrees/manager.mjs'),
|
|
20
|
-
loadSessionStore
|
|
44
|
+
loadSessionStore() {
|
|
45
|
+
// A failed import is forgotten so the next caller retries.
|
|
46
|
+
sessionStore ??= loadSessionStoreWithRuntimeActivity().catch((error) => {
|
|
47
|
+
sessionStore = null;
|
|
48
|
+
throw error;
|
|
49
|
+
});
|
|
50
|
+
return sessionStore;
|
|
51
|
+
},
|
|
21
52
|
loadSessionSearch: () => import('../runtime/session-search/session-search-db.mjs'),
|
|
22
53
|
loadStatuslineSegments: () => import('../runtime/shared/statusline/statusline-segments.mjs'),
|
|
23
54
|
loadConfig: () => import('../runtime/shared/config.mjs'),
|
|
@@ -22,9 +22,22 @@ export function createLocalSessionBridge({ getSessionService, log, pid = process
|
|
|
22
22
|
return createSessionProtocolClient({
|
|
23
23
|
call(name, args = {}, options = {}) {
|
|
24
24
|
if (closed) throw new Error('daemon-local session client is closed');
|
|
25
|
-
|
|
25
|
+
const signal = options?.signal;
|
|
26
|
+
signal?.throwIfAborted();
|
|
27
|
+
const result = getSessionService().handleCall(name, args, {
|
|
26
28
|
clientToken,
|
|
27
29
|
...(options?.callId ? { callId: String(options.callId) } : {}),
|
|
30
|
+
...(signal ? { signal } : {}),
|
|
31
|
+
});
|
|
32
|
+
if (!signal) return result;
|
|
33
|
+
// The in-process service has no cancellation of its own: an abort
|
|
34
|
+
// frees the caller, whose late reply is dropped.
|
|
35
|
+
return new Promise((resolve, reject) => {
|
|
36
|
+
const onAbort = () => reject(signal.reason);
|
|
37
|
+
signal.addEventListener('abort', onAbort, { once: true });
|
|
38
|
+
Promise.resolve(result)
|
|
39
|
+
.then(resolve, reject)
|
|
40
|
+
.finally(() => signal.removeEventListener('abort', onAbort));
|
|
28
41
|
});
|
|
29
42
|
},
|
|
30
43
|
async close(reason = 'local session view closed') {
|
|
@@ -246,6 +246,7 @@ export function daemonOwnerIsStale(
|
|
|
246
246
|
* - No successful refresh for `fenceMs`: fenced, never renewed (`onFenced`).
|
|
247
247
|
* - The record names another pid: `onSuperseded(record)`.
|
|
248
248
|
* - A turn gap over `stallMs`: `admit()` refuses work until a refresh succeeds.
|
|
249
|
+
* The gap is logged once, with `describeStall(fromMono, toMono)` appended.
|
|
249
250
|
* Both callbacks must make this process stop serving.
|
|
250
251
|
*/
|
|
251
252
|
export function createOwnerHeartbeat({
|
|
@@ -259,6 +260,7 @@ export function createOwnerHeartbeat({
|
|
|
259
260
|
monoNow = () => performance.now(),
|
|
260
261
|
refresh = refreshSingletonOwner,
|
|
261
262
|
log = () => {},
|
|
263
|
+
describeStall = null,
|
|
262
264
|
onBeat = () => {},
|
|
263
265
|
onSuperseded,
|
|
264
266
|
onFenced,
|
|
@@ -290,11 +292,22 @@ export function createOwnerHeartbeat({
|
|
|
290
292
|
}
|
|
291
293
|
|
|
292
294
|
function noteTurn(t) {
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
}
|
|
295
|
+
const from = lastTurnAt;
|
|
296
|
+
// Rebased before reporting: one long block is one gap, however many
|
|
297
|
+
// callers (tick, admit) observe it afterwards.
|
|
297
298
|
lastTurnAt = t;
|
|
299
|
+
if (t - from <= stallMs) return;
|
|
300
|
+
needsVerify = true;
|
|
301
|
+
let detail = '';
|
|
302
|
+
try {
|
|
303
|
+
detail = describeStall?.(from, t) || '';
|
|
304
|
+
} catch {
|
|
305
|
+
/* attribution must not disturb the lease */
|
|
306
|
+
}
|
|
307
|
+
log(
|
|
308
|
+
`event loop stalled ${Math.round(t - from)}ms — owner lease must be re-verified before serving` +
|
|
309
|
+
(detail ? ` | ${detail}` : '')
|
|
310
|
+
);
|
|
298
311
|
}
|
|
299
312
|
|
|
300
313
|
function beat() {
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// The daemon's PostgreSQL stop inside its shutdown. The normal teardown stops
|
|
2
|
+
// PostgreSQL after every user of it has closed, letting durable writes still in
|
|
3
|
+
// flight commit first; a fallback timer stops it regardless just before the
|
|
4
|
+
// launcher's kill (PG_FORCED_STOP_AT_MS), because a daemon killed before
|
|
5
|
+
// `pg_ctl stop` leaves the daemonized postmaster running.
|
|
6
|
+
import { PG_FORCED_STOP_AT_MS } from './daemon-stop-budget.mjs';
|
|
7
|
+
|
|
8
|
+
const ADAPTER = '../runtime/memory/lib/pg/adapter.mjs';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Arm at shutdown start. `finish()` is the ordered teardown step: it drains
|
|
12
|
+
* durable writes until the fallback point, then stops. Idempotent: whichever
|
|
13
|
+
* of finish/fallback comes first runs the one stop; the other joins it.
|
|
14
|
+
*/
|
|
15
|
+
export function createDaemonPgStop({
|
|
16
|
+
log,
|
|
17
|
+
stopTimeoutMs,
|
|
18
|
+
forcedStopAtMs = PG_FORCED_STOP_AT_MS,
|
|
19
|
+
loadAdapter = () => import(ADAPTER),
|
|
20
|
+
}) {
|
|
21
|
+
const startedAt = Date.now();
|
|
22
|
+
let stopping = null;
|
|
23
|
+
// The drain budget is what remains until the fallback point once the adapter
|
|
24
|
+
// has loaded, so a slow load never stretches the drain past that point.
|
|
25
|
+
const drainBudget = () => Math.max(0, startedAt + forcedStopAtMs - Date.now());
|
|
26
|
+
const run = (drain) => {
|
|
27
|
+
stopping ??= loadAdapter()
|
|
28
|
+
.then(({ shutdownOwnedPg }) => shutdownOwnedPg({ timeoutMs: stopTimeoutMs, drainMs: drain ? drainBudget() : 0 }))
|
|
29
|
+
.then(
|
|
30
|
+
(stopped) => {
|
|
31
|
+
if (stopped) log('postgres stopped');
|
|
32
|
+
},
|
|
33
|
+
(e) => log(`postgres stop failed: ${e?.message || e}`)
|
|
34
|
+
);
|
|
35
|
+
return stopping;
|
|
36
|
+
};
|
|
37
|
+
const fallback = setTimeout(() => {
|
|
38
|
+
if (stopping) return; // the ordered stop is draining; its bound is this same point
|
|
39
|
+
log(`teardown still running ${forcedStopAtMs}ms into shutdown; stopping postgres before the launcher's kill`);
|
|
40
|
+
void run(false);
|
|
41
|
+
}, forcedStopAtMs);
|
|
42
|
+
fallback.unref?.();
|
|
43
|
+
return {
|
|
44
|
+
finish() {
|
|
45
|
+
clearTimeout(fallback);
|
|
46
|
+
return run(true);
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { SESSION_ID_PATTERN } from '../runtime/agent/orchestrator/runtime-core/session-id.mjs';
|
|
2
|
+
import { sessionListOutput, sessionReadOutput, SESSION_TOOL_OUTPUT_BYTES } from './session-tool-output.mjs';
|
|
3
|
+
|
|
4
|
+
const TARGET_ACTIONS = new Set(['status', 'read', 'send', 'cancel', 'delete']);
|
|
5
|
+
const MUTATING_ACTIONS = new Set(['send', 'cancel', 'delete']);
|
|
6
|
+
|
|
7
|
+
/** Model-facing session operations over the same service used by desktop and TUI. */
|
|
8
|
+
export function createSessionControl({ getSessionService }) {
|
|
9
|
+
return async function executeSessionControl(args = {}, context = {}) {
|
|
10
|
+
const action = args.action;
|
|
11
|
+
if (action !== 'list' && !TARGET_ACTIONS.has(action)) {
|
|
12
|
+
throw new Error(`session: unsupported remote action "${action}"`);
|
|
13
|
+
}
|
|
14
|
+
const caller = context.callerSessionId;
|
|
15
|
+
if (typeof caller !== 'string' || !SESSION_ID_PATTERN.test(caller)) {
|
|
16
|
+
throw new Error('session: caller session is required');
|
|
17
|
+
}
|
|
18
|
+
const sessionId = typeof args.session_id === 'string' ? args.session_id.trim() : '';
|
|
19
|
+
if (TARGET_ACTIONS.has(action) && (typeof sessionId !== 'string' || !SESSION_ID_PATTERN.test(sessionId))) {
|
|
20
|
+
throw new Error(`session: session_id is required for action=${action}`);
|
|
21
|
+
}
|
|
22
|
+
if (MUTATING_ACTIONS.has(action) && sessionId === caller) {
|
|
23
|
+
throw new Error(`session: ${action} must target another session`);
|
|
24
|
+
}
|
|
25
|
+
const limit = args.limit ?? 25;
|
|
26
|
+
if (!Number.isInteger(limit) || limit < 1 || limit > 100) {
|
|
27
|
+
throw new Error('session: limit must be an integer from 1 to 100');
|
|
28
|
+
}
|
|
29
|
+
const offset = args.offset ?? 0;
|
|
30
|
+
const textOffset = args.text_offset ?? 0;
|
|
31
|
+
if (!Number.isSafeInteger(offset) || offset < 0 || !Number.isSafeInteger(offset + limit)) {
|
|
32
|
+
throw new Error('session: offset must be a nonnegative safe integer');
|
|
33
|
+
}
|
|
34
|
+
if (!Number.isSafeInteger(textOffset) || textOffset < 0) throw new Error('session: invalid text_offset');
|
|
35
|
+
if (args.text_offset !== undefined && (args.offset === undefined || limit !== 1 || !args.item_id)) {
|
|
36
|
+
throw new Error('session: text_offset requires offset, limit:1 and item_id from read');
|
|
37
|
+
}
|
|
38
|
+
const service = getSessionService();
|
|
39
|
+
if (!service) throw new Error('session: session service is unavailable');
|
|
40
|
+
if (action === 'list') {
|
|
41
|
+
const page = await service.listSessionCatalog({ page: { limit, cursor: args.cursor || null } });
|
|
42
|
+
return sessionListOutput(page, limit);
|
|
43
|
+
}
|
|
44
|
+
if (action === 'send') {
|
|
45
|
+
if (typeof args.prompt !== 'string' || !args.prompt.trim()) {
|
|
46
|
+
throw new Error('session: prompt is required for action=send');
|
|
47
|
+
}
|
|
48
|
+
const result = await service.submitSession({
|
|
49
|
+
sessionId,
|
|
50
|
+
prompt: args.prompt,
|
|
51
|
+
options: { mode: 'prompt', transcriptMeta: { sender: 'lead' } },
|
|
52
|
+
});
|
|
53
|
+
return { sessionId, accepted: result.accepted === true };
|
|
54
|
+
}
|
|
55
|
+
if (action === 'cancel') {
|
|
56
|
+
const result = await service.abortSession({ sessionId });
|
|
57
|
+
return { sessionId, aborted: result.aborted === true };
|
|
58
|
+
}
|
|
59
|
+
if (action === 'delete') {
|
|
60
|
+
const result = await service.configureSession(
|
|
61
|
+
{ sessionId, action: 'deleteSession', args: [sessionId] },
|
|
62
|
+
{ revision: 1 }
|
|
63
|
+
);
|
|
64
|
+
return { sessionId, deleted: result.value === true };
|
|
65
|
+
}
|
|
66
|
+
if (action === 'read') {
|
|
67
|
+
const result = await service.readSession({ sessionId, transcriptRange: { offset, limit } });
|
|
68
|
+
return sessionReadOutput(sessionId, result.range, { textOffset, itemId: args.item_id });
|
|
69
|
+
}
|
|
70
|
+
const result = await service.readSession({
|
|
71
|
+
sessionId,
|
|
72
|
+
transcriptItemLimit: action === 'status' ? 1 : limit,
|
|
73
|
+
transcriptByteBudget: SESSION_TOOL_OUTPUT_BYTES,
|
|
74
|
+
});
|
|
75
|
+
const snapshot = result.full;
|
|
76
|
+
if (!snapshot) throw new Error(`session: ${sessionId} is unavailable`);
|
|
77
|
+
const status = {
|
|
78
|
+
sessionId,
|
|
79
|
+
title: snapshot.title ?? null,
|
|
80
|
+
cwd: snapshot.cwd ?? null,
|
|
81
|
+
provider: snapshot.provider ?? null,
|
|
82
|
+
model: snapshot.model ?? null,
|
|
83
|
+
busy: snapshot.busy === true,
|
|
84
|
+
quotaResume: snapshot.quotaResume ?? null,
|
|
85
|
+
};
|
|
86
|
+
return status;
|
|
87
|
+
};
|
|
88
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
// Time budget of an in-tree daemon's stop, shared by the launcher that waits
|
|
2
|
+
// for it (desktop quit) and the daemon that has to finish inside it.
|
|
3
|
+
|
|
4
|
+
/** How long a launcher waits for an in-tree daemon to exit after asking it to
|
|
5
|
+
* stop. Past this the launcher exits and the daemon dies with its process
|
|
6
|
+
* tree — on Windows without any exit hook. A healthy daemon stop (PostgreSQL
|
|
7
|
+
* included) measures ~0.6 s; the rest is room for a slow teardown to finish
|
|
8
|
+
* its writes. The desktop window is hidden before this wait begins. */
|
|
9
|
+
export const IN_TREE_DAEMON_STOP_GRACE_MS = 5_000;
|
|
10
|
+
|
|
11
|
+
/** `pg_ctl stop` spawn + signal delivery. Once signalled, the postmaster
|
|
12
|
+
* finishes its shutdown on its own even if the daemon is then killed. */
|
|
13
|
+
const PG_STOP_SIGNAL_MARGIN_MS = 800;
|
|
14
|
+
|
|
15
|
+
/** Fallback point (from shutdown start) at which the daemon stops PostgreSQL
|
|
16
|
+
* even while earlier teardown steps still run: just before the launcher's
|
|
17
|
+
* kill, so a slow-but-healthy teardown keeps its writes until then. */
|
|
18
|
+
export const PG_FORCED_STOP_AT_MS = IN_TREE_DAEMON_STOP_GRACE_MS - PG_STOP_SIGNAL_MARGIN_MS;
|
|
@@ -11,6 +11,23 @@ import {
|
|
|
11
11
|
readStoredGoalSnapshot,
|
|
12
12
|
} from '../runtime/agent/orchestrator/runtime-core/goal-runtime.mjs';
|
|
13
13
|
|
|
14
|
+
/** Catalog rows with the daemon's in-memory turn activity overlaid: `working`
|
|
15
|
+
* on a session whose own turn is in flight, `agentWorking` on a Lead with an
|
|
16
|
+
* in-flight Agent session. Every session runs in this process, so the runtime
|
|
17
|
+
* state is the whole answer — storage carries no liveness. */
|
|
18
|
+
async function withRuntimeActivity(rows) {
|
|
19
|
+
// The import-free leaf holding the runtime map: no session manager graph.
|
|
20
|
+
const { inFlightSessionActivity } = await import('../runtime/agent/orchestrator/session/manager/runtime-state.mjs');
|
|
21
|
+
const { working, agentWorking } = inFlightSessionActivity();
|
|
22
|
+
if (!working.size) return rows;
|
|
23
|
+
return rows.map((row) => {
|
|
24
|
+
const own = working.has(row?.id);
|
|
25
|
+
const agents = agentWorking.has(row?.id);
|
|
26
|
+
if (!own && !agents) return row;
|
|
27
|
+
return { ...row, ...(own ? { working: true } : {}), ...(agents ? { agentWorking: true } : {}) };
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
|
|
14
31
|
export function createStoredSessionViews({ desktopRuntime, dataDir }) {
|
|
15
32
|
return {
|
|
16
33
|
// Settled identity of the files a stored projection is built from; the
|
|
@@ -38,6 +55,8 @@ export function createStoredSessionViews({ desktopRuntime, dataDir }) {
|
|
|
38
55
|
const review = createRuntimeReviewApi({ getCwd: () => metadata.cwd || '', getSessionId: () => sessionId });
|
|
39
56
|
// The runtime review API answers `known`/`summary` itself (turnReviewReply).
|
|
40
57
|
if (action === 'getSessionReviewDiff') return review.getSessionReviewDiff();
|
|
58
|
+
if (action === 'getSessionReviewFilePatch') return review.getSessionReviewFilePatch(args[0], args[1]);
|
|
59
|
+
if (action === 'getTurnReviewFilePatch') return review.getTurnReviewFilePatch(args[0]);
|
|
41
60
|
// A cold session runs no turn: its change record is final.
|
|
42
61
|
if (action === 'getTurnChanges') return review.getTurnChanges(args[0]);
|
|
43
62
|
return review.getTurnReviewDiff(args[0]);
|
|
@@ -84,11 +103,14 @@ export function createStoredSessionViews({ desktopRuntime, dataDir }) {
|
|
|
84
103
|
// ignored, full array). An authoritative refresh is never paged.
|
|
85
104
|
const page = options.page && typeof options.page === 'object' ? options.page : null;
|
|
86
105
|
if (page && !refreshFromStorage && store.listStoredSessionSummaryPage) {
|
|
87
|
-
|
|
106
|
+
const listed = await store.listStoredSessionSummaryPage({ limit: page.limit, cursor: page.cursor });
|
|
107
|
+
return { ...listed, sessions: await withRuntimeActivity(listed.sessions) };
|
|
88
108
|
}
|
|
89
109
|
// The async listing may answer from the session catalog DB.
|
|
90
|
-
|
|
91
|
-
|
|
110
|
+
const rows = store.listStoredSessionSummariesAsync
|
|
111
|
+
? await store.listStoredSessionSummariesAsync({ refreshFromStorage })
|
|
112
|
+
: store.listStoredSessionSummaries({ refreshFromStorage });
|
|
113
|
+
return withRuntimeActivity(rows);
|
|
92
114
|
},
|
|
93
115
|
};
|
|
94
116
|
}
|
|
@@ -139,6 +139,25 @@ export function createPostGcHeapTracker({
|
|
|
139
139
|
};
|
|
140
140
|
}
|
|
141
141
|
|
|
142
|
+
/**
|
|
143
|
+
* Builds the `describeStall(fromMono, toMono)` the owner heartbeat appends to
|
|
144
|
+
* its stall line: the spans that overlapped the stall window plus the in-flight
|
|
145
|
+
* work snapshot at report time. Counters and labels only.
|
|
146
|
+
*/
|
|
147
|
+
export function createStallDescriber({ spans, getWork = () => ({}), limit = 3 } = {}) {
|
|
148
|
+
return (fromMono, toMono) => {
|
|
149
|
+
const parts = [];
|
|
150
|
+
const overlapping = spans?.describe(fromMono, toMono, limit);
|
|
151
|
+
if (overlapping) parts.push(overlapping);
|
|
152
|
+
const work = workCounts(getWork());
|
|
153
|
+
parts.push(
|
|
154
|
+
`in-flight: activeCalls=${work.activeCalls} queuedCalls=${work.queuedCalls}` +
|
|
155
|
+
` busySessions=${work.busySessions} busyMemoryAgents=${work.busyMemoryAgents}`
|
|
156
|
+
);
|
|
157
|
+
return parts.join(' | ');
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
|
|
142
161
|
export function formatDaemonTelemetry(record, reason = 'periodic') {
|
|
143
162
|
const row = record && typeof record === 'object' ? record : collectDaemonTelemetry();
|
|
144
163
|
return [
|
|
@@ -66,6 +66,7 @@ import {
|
|
|
66
66
|
import { createAgentDispatchBroker } from './agent-dispatch-broker.mjs';
|
|
67
67
|
import { createChannelTransport } from './channel-transport.mjs';
|
|
68
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,14 @@ 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 { createSessionControl } from './daemon-session-control.mjs';
|
|
95
|
+
import { flushAllIndexWrites } from '../session-runtime/services/agent-tool/index-write-queue.mjs';
|
|
91
96
|
import { registerAutomationAgentTool } from '../session-runtime/automation-agents.mjs';
|
|
92
97
|
import {
|
|
93
98
|
compareRuntimeVersions,
|
|
@@ -132,7 +137,9 @@ let sessionTransport = null;
|
|
|
132
137
|
let sessionService = null;
|
|
133
138
|
let sessionRuntimeHost = null;
|
|
134
139
|
let localSessionBridge = null;
|
|
140
|
+
let canonicalAgentControl = null;
|
|
135
141
|
let memoryRuntime = null;
|
|
142
|
+
let transcriptPurgeUnregister = null;
|
|
136
143
|
let agentDispatchBroker = null;
|
|
137
144
|
let remoteSessionState = { enabled: false, sessionId: null };
|
|
138
145
|
let shuttingDown = false;
|
|
@@ -161,6 +168,13 @@ function registerMemoryRuntimeLazy() {
|
|
|
161
168
|
// real memory call (memory/recall tools, the Memory install) starts the
|
|
162
169
|
// singleton; nothing warms it at boot. The PG cluster itself usually starts
|
|
163
170
|
// earlier: the channels schedules/webhooks stores open it at boot.
|
|
171
|
+
// Deleting a session removes its transcript file here, and its memory ingest
|
|
172
|
+
// offsets once the memory runtime exists (none when memory is skipped).
|
|
173
|
+
if (!transcriptPurgeUnregister) {
|
|
174
|
+
transcriptPurgeUnregister = registerTranscriptPurgeHook({
|
|
175
|
+
forgetOffsets: (transcriptPaths) => memoryRuntime?.forgetTranscripts(transcriptPaths),
|
|
176
|
+
});
|
|
177
|
+
}
|
|
164
178
|
if (process.env.MIXDOG_DAEMON_SKIP_MEMORY === '1') {
|
|
165
179
|
log('memory runtime skipped (MIXDOG_DAEMON_SKIP_MEMORY=1)');
|
|
166
180
|
return;
|
|
@@ -201,6 +215,8 @@ function eventLoopStatus() {
|
|
|
201
215
|
/** Ceiling for the whole teardown sequence, above the slowest individual stop
|
|
202
216
|
* (channels/memory) so a healthy shutdown always finishes on its own. */
|
|
203
217
|
const SHUTDOWN_BUDGET_MS = 15_000;
|
|
218
|
+
/** Graceful PostgreSQL stop bound inside that budget (pg_ctl stop -m fast). */
|
|
219
|
+
const PG_STOP_TIMEOUT_MS = 6_000;
|
|
204
220
|
|
|
205
221
|
async function shutdown(reason, code = 0) {
|
|
206
222
|
if (shuttingDown) return;
|
|
@@ -221,6 +237,9 @@ async function shutdown(reason, code = 0) {
|
|
|
221
237
|
process.exit(code);
|
|
222
238
|
}, SHUTDOWN_BUDGET_MS);
|
|
223
239
|
forcedExit.unref?.();
|
|
240
|
+
// PostgreSQL stops after its users below (durable writes drained first), or
|
|
241
|
+
// at the fallback point just before the launcher's kill, whichever is first.
|
|
242
|
+
const pgStop = createDaemonPgStop({ log, stopTimeoutMs: PG_STOP_TIMEOUT_MS });
|
|
224
243
|
try {
|
|
225
244
|
setChannelNotifySink(null);
|
|
226
245
|
} catch {}
|
|
@@ -241,6 +260,15 @@ async function shutdown(reason, code = 0) {
|
|
|
241
260
|
} catch (e) {
|
|
242
261
|
log(`session runtime host stop failed: ${e?.message || e}`);
|
|
243
262
|
}
|
|
263
|
+
// Every runtime is closed: drain the canonical agent's index writers (and any
|
|
264
|
+
// other queued index write) before process.exit, whose 'exit' hook cannot
|
|
265
|
+
// finish async work.
|
|
266
|
+
try {
|
|
267
|
+
await canonicalAgentControl?.dispose?.();
|
|
268
|
+
await flushAllIndexWrites();
|
|
269
|
+
} catch (e) {
|
|
270
|
+
log(`agent index drain failed: ${e?.message || e}`);
|
|
271
|
+
}
|
|
244
272
|
// Host-side Computer Use workers and target claims are reaped only on an
|
|
245
273
|
// explicit release; the runtime's deferred timer is unref'd and never fires
|
|
246
274
|
// once this process exits.
|
|
@@ -271,6 +299,11 @@ async function shutdown(reason, code = 0) {
|
|
|
271
299
|
} catch (e) {
|
|
272
300
|
log(`memory.stop failed: ${e?.message || e}`);
|
|
273
301
|
}
|
|
302
|
+
// PostgreSQL this daemon started through its stores (schedules, webhooks,
|
|
303
|
+
// session search) after every user of it above is closed. `pg_ctl start`
|
|
304
|
+
// daemonizes the postmaster outside this process tree, so without this stop
|
|
305
|
+
// it outlives the daemon. A cluster another live process owns is left to it.
|
|
306
|
+
await pgStop.finish();
|
|
274
307
|
try {
|
|
275
308
|
agentDispatchBroker?.close?.(reason);
|
|
276
309
|
} catch (e) {
|
|
@@ -315,6 +348,9 @@ function inFlightWork() {
|
|
|
315
348
|
|
|
316
349
|
// Opt-in CPU profiling of lag windows while DATA_DIR/lag-profile.on exists.
|
|
317
350
|
const lagProfiler = createLagProfiler({ dataDir: DATA_DIR, log });
|
|
351
|
+
// Request spans share the heartbeat's performance.now() clock; `[slow-op]` lines
|
|
352
|
+
// and stall attribution come from the same recorder.
|
|
353
|
+
slowSpans.setLog(log);
|
|
318
354
|
|
|
319
355
|
daemonTelemetry = createDaemonTelemetry({
|
|
320
356
|
log,
|
|
@@ -506,6 +542,7 @@ async function claimDaemonOwnership(bootPhases) {
|
|
|
506
542
|
tickMs: timings.tickMs,
|
|
507
543
|
stallMs: timings.stallMs,
|
|
508
544
|
log,
|
|
545
|
+
describeStall: createStallDescriber({ spans: slowSpans, getWork: inFlightWork }),
|
|
509
546
|
onBeat: republishMissingDiscovery,
|
|
510
547
|
onSuperseded: (record) => fenceDaemon(`owner claim superseded by pid=${record?.pid}`),
|
|
511
548
|
onFenced: ({ lastRefreshAt, sinceMs }) =>
|
|
@@ -696,6 +733,22 @@ function announceDaemonReady({ port, token, startedAt, bootPhases }) {
|
|
|
696
733
|
});
|
|
697
734
|
}
|
|
698
735
|
|
|
736
|
+
/** After ready, off every request path: arm the last-chance PostgreSQL stop on
|
|
737
|
+
* exit, then open the schedules/webhooks stores. On an existing cluster that
|
|
738
|
+
* starts PostgreSQL here, so the first catalog read (the desktop sidebar's
|
|
739
|
+
* channel setup) joins this start instead of being the one that runs it; a
|
|
740
|
+
* data dir with no cluster yet starts nothing (channel-admin). Loaded after
|
|
741
|
+
* the stderr redirect, so the PG layer's logs reach daemon.log. */
|
|
742
|
+
function startPostgresInBackground() {
|
|
743
|
+
void import('../runtime/memory/lib/pg/adapter.mjs')
|
|
744
|
+
.then((pg) => {
|
|
745
|
+
pg.installOwnedPgExitStop();
|
|
746
|
+
if (shuttingDown) return null;
|
|
747
|
+
return import('../session-runtime/services/channel-admin.mjs').then((admin) => admin.hasActiveAutomation());
|
|
748
|
+
})
|
|
749
|
+
.catch((error) => log(`postgres background start failed: ${error?.message || error}`));
|
|
750
|
+
}
|
|
751
|
+
|
|
699
752
|
/** The channels front door: pointer-routed calls over HTTP+SSE. Creating the
|
|
700
753
|
* transport also wires the channels notification sink (session-bound
|
|
701
754
|
* notifications reach the session service, the rest fan out to channel
|
|
@@ -844,6 +897,7 @@ async function main() {
|
|
|
844
897
|
getSessionRuntimeHost: () => sessionRuntimeHost,
|
|
845
898
|
cwd: CWD,
|
|
846
899
|
});
|
|
900
|
+
canonicalAgentControl = agentControl;
|
|
847
901
|
// Schedules and webhooks run headless here; their sessions reach the same
|
|
848
902
|
// canonical agent control through the automation tool scope.
|
|
849
903
|
registerAutomationAgentTool(agentControl.execute);
|
|
@@ -860,6 +914,7 @@ async function main() {
|
|
|
860
914
|
log,
|
|
861
915
|
measureBootPhase: bootPhases.measure,
|
|
862
916
|
executeAgentControl: agentControl.execute,
|
|
917
|
+
executeSessionControl: createSessionControl({ getSessionService: () => sessionService }),
|
|
863
918
|
});
|
|
864
919
|
// Codex-style runtime: daemon routing and independent async session actors
|
|
865
920
|
// share one V8 isolate and module graph. CPU-heavy work stays in bounded
|
|
@@ -938,6 +993,13 @@ async function main() {
|
|
|
938
993
|
log(`session front door on 127.0.0.1:${sessionEndpoint.port}`);
|
|
939
994
|
|
|
940
995
|
announceDaemonReady({ port, token, startedAt, bootPhases });
|
|
996
|
+
// After ready, off the boot path: load the session-runtime module tree so
|
|
997
|
+
// the first session.create does not block the loop on synchronous module
|
|
998
|
+
// compilation. Failures fall back to the lazy import inside create.
|
|
999
|
+
setImmediate(() => {
|
|
1000
|
+
void sessionRuntimeHost?.warmLocalRuntime?.();
|
|
1001
|
+
});
|
|
1002
|
+
startPostgresInBackground();
|
|
941
1003
|
|
|
942
1004
|
// Automation may spawn the shared daemon; keep schedules/webhooks live.
|
|
943
1005
|
// 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
|
|