mixdog 0.9.174 → 1.0.0
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 +11 -12
- package/package.json +2 -2
- package/scripts/agent-turn-trace-probe.mjs +1 -1
- package/scripts/build-ffmpeg-runtime.sh +16 -0
- package/scripts/build-runtime-linux.sh +8 -2
- package/scripts/build-runtime-macos.sh +8 -2
- package/scripts/computer-task-cost-report.mjs +1 -9
- package/scripts/context-renewal-live-check.mjs +2 -1
- package/scripts/graph-parity.mjs +78 -55
- package/scripts/lib/bench-sandbox.mjs +67 -0
- package/scripts/lib/bench-sandbox.test.mjs +54 -0
- package/scripts/lib/coverage.mjs +2 -4
- package/scripts/lib/run-node-tests.mjs +24 -1
- package/scripts/lib/session-bench-fmt.mjs +65 -0
- package/scripts/lib/session-bench-render.mjs +394 -0
- package/scripts/lib/smoke-loop-shared.mjs +28 -0
- package/scripts/lib/smoke-loop-shared.test.mjs +22 -0
- package/scripts/lib/trace-row.mjs +40 -0
- package/scripts/lib/trace-row.test.mjs +47 -0
- package/scripts/lib/trace-stats.mjs +7 -0
- package/scripts/lib/trace-stats.test.mjs +7 -1
- package/scripts/llm-trace-summary.mjs +2 -44
- package/scripts/memory-chunk-quality.mjs +1 -1
- package/scripts/memory-layer2-check.mjs +1 -1
- package/scripts/pg-memory-diet.mjs +1 -1
- package/scripts/plan-runtime-release-tag.mjs +57 -0
- package/scripts/prepare-native-assets.mjs +1 -1
- package/scripts/provider-contract-test-env.mjs +21 -0
- package/scripts/release-paths.mjs +1 -0
- package/scripts/routing-corpus.mjs +1 -11
- package/scripts/session-diag.mjs +2 -44
- package/scripts/smoke-runtime-negative.sh +7 -1
- package/scripts/test-data-dir.mjs +19 -0
- package/scripts/tidy/sync-engines-manifest.mjs +8 -10
- package/scripts/tool-efficiency-diag.mjs +1 -4
- package/scripts/voice-runtime-config.json +1 -1
- package/src/app.mjs +1 -1
- package/src/defaults/skills/code-tidy/SKILL.md +5 -2
- package/src/defaults/skills/pptx/SKILL.md +1 -1
- package/src/defaults/skills/pptx/references/pictures.md +1 -1
- package/src/defaults/skills/pptx/scripts/review-deck.mjs +13 -4
- package/src/defaults/skills/skill-creator/scripts/validate-skill.mjs +40 -40
- package/src/defaults/skills/xlsx/SKILL.md +1 -0
- package/src/headless-exec.mjs +4 -2
- package/src/headless-role.mjs +81 -68
- package/src/lib/keychain-cjs.cjs +26 -49
- package/src/lib/mixdog-debug.cjs +1 -1
- package/src/lib/rules-builder.cjs +4 -3
- package/src/mixdog-session-runtime.mjs +2 -2
- package/src/repl/slash-commands.mjs +1 -1
- package/src/repl/stream-sink.mjs +1 -1
- package/src/repl/turn-output.mjs +2 -2
- package/src/repl.mjs +1 -1
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/session-prep.mjs +1 -1
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +20 -16
- package/src/runtime/agent/orchestrator/agent-runtime/session-builder.mjs +0 -3
- package/src/runtime/agent/orchestrator/agent-trace-format.mjs +23 -22
- package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +2 -2
- package/src/runtime/{shared/llm/index.mjs → agent/orchestrator/maintenance-preset.mjs} +2 -2
- package/src/runtime/agent/orchestrator/mcp/client-config.mjs +2 -1
- package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +7 -36
- package/src/runtime/agent/orchestrator/mcp/client.mjs +28 -2
- package/src/runtime/agent/orchestrator/providers/admission-scheduler.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-api-transport.mjs +6 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-betas.mjs +1 -47
- package/src/runtime/agent/orchestrator/providers/anthropic-effort.mjs +1 -383
- package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +2 -59
- package/src/runtime/agent/orchestrator/providers/anthropic-midstream-recovery.mjs +32 -31
- package/src/runtime/agent/orchestrator/providers/anthropic-model-resolve.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +10 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +12 -61
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/gzip-post.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +30 -67
- package/src/runtime/agent/orchestrator/providers/anthropic-recovery-guards.mjs +9 -12
- package/src/runtime/agent/orchestrator/providers/anthropic-server-fallback.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/leak-guard.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-stop.mjs +20 -12
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events.mjs +12 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-outcome.mjs +4 -3
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn.mjs +5 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-watchdogs.mjs +18 -10
- package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +20 -16
- package/src/runtime/agent/orchestrator/providers/anthropic-thinking-contract.mjs +1 -26
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +9 -13
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-catalog.mjs +8 -3
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-login.mjs +4 -8
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-tokens.mjs +21 -30
- package/src/runtime/agent/orchestrator/providers/antigravity-response.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +4 -2
- package/src/runtime/agent/orchestrator/providers/api-usage.mjs +10 -8
- package/src/runtime/agent/orchestrator/providers/cursor-auth.mjs +13 -10
- package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +29 -0
- package/src/runtime/agent/orchestrator/providers/cursor-wire-guards.mjs +0 -1
- package/src/runtime/agent/orchestrator/providers/cursor-wire-protobuf.mjs +10 -26
- package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-bridge.mjs +2 -3
- package/src/runtime/agent/orchestrator/providers/cursor-wire-transport.mjs +7 -3
- package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +9 -15
- package/src/runtime/agent/orchestrator/providers/cursor.mjs +31 -5
- package/src/runtime/agent/orchestrator/providers/gemini-cache-policy.mjs +1 -2
- package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +1 -4
- package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +48 -46
- package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +18 -19
- package/src/runtime/agent/orchestrator/providers/gemini.mjs +3 -26
- package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +41 -0
- package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +5 -19
- package/src/runtime/agent/orchestrator/providers/grok-oauth-tokens.mjs +16 -83
- package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +26 -8
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-models.mjs +8 -0
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +30 -1
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-stream-labels.mjs +6 -0
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-system-blocks.mjs +17 -0
- package/src/runtime/agent/orchestrator/providers/{anthropic-leaked-toolcall.mjs → lib/leaked-toolcall.mjs} +7 -7
- package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +44 -0
- package/src/runtime/agent/orchestrator/providers/lib/send-callbacks.mjs +12 -0
- package/src/runtime/agent/orchestrator/providers/lib/sse-framing.mjs +9 -8
- package/src/runtime/agent/orchestrator/providers/lib/transport-fallback-trace.mjs +25 -0
- package/src/runtime/agent/orchestrator/providers/model-catalog-projection.mjs +1 -181
- package/src/runtime/agent/orchestrator/providers/model-catalog.mjs +1 -796
- package/src/runtime/agent/orchestrator/providers/model-pricing-rates.mjs +1 -71
- package/src/runtime/agent/orchestrator/providers/npm-cli-version.mjs +87 -0
- package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +4 -5
- package/src/runtime/agent/orchestrator/providers/openai-codex-metadata.mjs +4 -5
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +2 -21
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-result.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +2 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/tool-call-acc.mjs +1 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-options.mjs +4 -8
- package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +45 -32
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-state.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +6 -12
- package/src/runtime/agent/orchestrator/providers/openai-compat-stream-common.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-trace.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +14 -22
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +25 -34
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +14 -14
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-request.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/terminal-frames.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-items.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-outcome.mjs +2 -13
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-state.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/text-relay.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/openai-oauth-tokens.mjs +2 -44
- package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +2 -16
- package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +6 -5
- package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +4 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws-pool.mjs +3 -2
- package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/tool-calls.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/openai-ws-text-relay.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +6 -4
- package/src/runtime/agent/orchestrator/providers/opencode-go-usage.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/provider-catalog-cache.mjs +1 -130
- package/src/runtime/agent/orchestrator/providers/registry.mjs +20 -16
- package/src/runtime/agent/orchestrator/providers/retry-classification.mjs +21 -20
- package/src/runtime/agent/orchestrator/providers/retry-executor.mjs +17 -17
- package/src/runtime/agent/orchestrator/runtime-core/builtin-features.mjs +193 -0
- package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +421 -0
- package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/context-inspection.mjs +17 -17
- package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/context-status-inspection.mjs +1 -1
- package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/context-status-shape.mjs +3 -3
- package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/context-status.mjs +1 -1
- package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-delta.mjs +101 -0
- package/src/runtime/agent/orchestrator/runtime-core/effort.mjs +145 -0
- package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/extension-scopes.mjs +5 -5
- package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/fs-utils.mjs +1 -1
- package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/goal-control.mjs +2 -2
- package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/goal-mutations.mjs +2 -2
- package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/goal-reminder.mjs +1 -1
- package/src/runtime/agent/orchestrator/runtime-core/goal-state.mjs +326 -0
- package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/goal-storage.mjs +2 -2
- package/src/runtime/agent/orchestrator/runtime-core/goal-tasks.mjs +148 -0
- package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/goal-title.mjs +2 -2
- package/src/runtime/agent/orchestrator/runtime-core/goal-tool-defs.mjs +140 -0
- package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/goal-turns.mjs +1 -1
- package/src/runtime/agent/orchestrator/runtime-core/model-capabilities.mjs +140 -0
- package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/orchestration.mjs +1 -1
- package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/plugin-mcp.mjs +2 -2
- package/src/runtime/agent/orchestrator/runtime-core/session-id.mjs +2 -0
- package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/session-route-policy.mjs +2 -2
- package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/session-text.mjs +3 -3
- package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/session-title.mjs +1 -2
- package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/skill-tool-loading.mjs +1 -1
- package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/tool-catalog-schema.mjs +1 -1
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +747 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +149 -0
- package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/workflow/agents.mjs +11 -7
- package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/workflow/context.mjs +6 -4
- package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/workflow/packs.mjs +2 -3
- package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/workflow-ids.mjs +1 -1
- package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +255 -0
- package/src/runtime/agent/orchestrator/session/agent-loop.mjs +3 -4
- package/src/runtime/agent/orchestrator/session/cache/prefetch-cache.mjs +2 -4
- package/src/runtime/agent/orchestrator/session/cache/read-cache.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/context-identity-writer.mjs +162 -0
- package/src/runtime/agent/orchestrator/session/context-tool-pairs.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/context-tool-schema.mjs +87 -0
- package/src/runtime/agent/orchestrator/session/context-utils.mjs +3 -245
- package/src/runtime/agent/orchestrator/session/eager-dispatch/admission.mjs +2 -3
- package/src/runtime/agent/orchestrator/session/eager-dispatch/mutation-paths.mjs +54 -0
- package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/lifecycle-scan.mjs +1 -16
- package/src/runtime/agent/orchestrator/session/loop/arg-schema-coerce.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +13 -1
- package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +3 -3
- package/src/runtime/agent/orchestrator/session/loop/deferred-call-through.mjs +4 -4
- package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/continuation.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +2 -3
- package/src/runtime/agent/orchestrator/session/loop/request-boundary.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +6 -3
- package/src/runtime/agent/orchestrator/session/loop/tool-classify.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/call-prep.mjs +3 -2
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +6 -10
- package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop.mjs +5 -6
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-commit.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +5 -5
- package/src/runtime/agent/orchestrator/session/manager/foreign-pending-messages.mjs +40 -64
- package/src/runtime/agent/orchestrator/session/manager/pending-lifecycle-epoch.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +24 -16
- package/src/runtime/agent/orchestrator/session/manager/pending-persist-queue.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/pending-spool-file.mjs +7 -13
- package/src/runtime/agent/orchestrator/session/manager/pending-spool-path.mjs +17 -2
- package/src/runtime/agent/orchestrator/session/manager/pending-spool-shard.mjs +139 -0
- package/src/runtime/agent/orchestrator/session/manager/pending-spool-sweep.mjs +34 -14
- package/src/runtime/agent/orchestrator/session/manager/prefetch-bridge/file-prefetch.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +4 -18
- package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +10 -18
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/manager/session-tool-surface.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +6 -10
- package/src/runtime/agent/orchestrator/session/manager.mjs +1 -2
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +11 -6
- package/src/runtime/agent/orchestrator/session/result-classification.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/send-instrumentation.mjs +194 -0
- package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +6 -198
- package/src/runtime/agent/orchestrator/session/store/canonical-reader.mjs +7 -7
- package/src/runtime/agent/orchestrator/session/store/fs-probe.mjs +0 -19
- package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +15 -8
- package/src/runtime/agent/orchestrator/session/store/listing.mjs +18 -29
- package/src/runtime/agent/orchestrator/session/store/load-cache.mjs +6 -36
- package/src/runtime/agent/orchestrator/session/store/save-delta.mjs +148 -0
- package/src/runtime/agent/orchestrator/session/store/save-fault.mjs +3 -3
- package/src/runtime/agent/orchestrator/session/store/save-worker.mjs +15 -142
- package/src/runtime/agent/orchestrator/session/store/summary-cache.mjs +3 -3
- package/src/runtime/agent/orchestrator/session/store/sweep/stale-sweep.mjs +4 -2
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-finish.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-row.mjs +3 -2
- package/src/runtime/agent/orchestrator/session/store/write-admission.mjs +9 -22
- package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +14 -6
- package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +200 -52
- package/src/runtime/agent/orchestrator/session/store-summary-log.mjs +81 -0
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +38 -4
- package/src/runtime/agent/orchestrator/session/store-transcript-cache.mjs +5 -2
- package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +3 -5
- package/src/runtime/agent/orchestrator/session/store-transcript-worker.mjs +54 -0
- package/src/runtime/agent/orchestrator/session/store.mjs +5 -9
- package/src/runtime/agent/orchestrator/session/tool-batch/execute-call.mjs +19 -8
- package/src/runtime/agent/orchestrator/session/tool-batch/flush.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/tool-batch/pre-dispatch.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/tool-batch/record-outcome.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/transcript-restore/agent-envelope.mjs +489 -0
- package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +419 -0
- package/src/runtime/agent/orchestrator/session/transcript-restore/tool-result-status.mjs +358 -0
- package/src/runtime/agent/orchestrator/session/transcript-restore/tool-result-text.mjs +157 -0
- package/src/runtime/agent/orchestrator/tools/bash-policy-scan.mjs +2 -3
- package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +32 -11
- package/src/runtime/agent/orchestrator/tools/builtin/atomic-write.mjs +1 -31
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/benign-exit.mjs +7 -3
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/deadline-plan.mjs +11 -3
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/spawn-env.mjs +4 -0
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +13 -7
- package/src/runtime/agent/orchestrator/tools/builtin/binary-file.mjs +6 -3
- package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +11 -5
- package/src/runtime/agent/orchestrator/tools/builtin/device-paths.mjs +1 -206
- package/src/runtime/agent/orchestrator/tools/builtin/find-files-tool.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +39 -3
- package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-path-fanout.mjs +5 -7
- package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-request.mjs +7 -25
- package/src/runtime/agent/orchestrator/tools/builtin/lib/list-helpers.mjs +27 -1
- package/src/runtime/agent/orchestrator/tools/builtin/lib/search-input-helpers.mjs +37 -0
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-insights.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +28 -18
- package/src/runtime/agent/orchestrator/tools/builtin/native-search-client.mjs +6 -10
- package/src/runtime/agent/orchestrator/tools/builtin/path-utils.mjs +15 -17
- package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +3 -3
- package/src/runtime/agent/orchestrator/tools/builtin/read-image-resize.mjs +1 -399
- package/src/runtime/agent/orchestrator/tools/builtin/read-line-collector.mjs +3 -2
- package/src/runtime/agent/orchestrator/tools/builtin/read-office-files.mjs +8 -15
- package/src/runtime/agent/orchestrator/tools/builtin/read-range-index.mjs +5 -8
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-render.mjs +3 -2
- package/src/runtime/agent/orchestrator/tools/builtin/read-source-windows.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +6 -5
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-dispatch.mjs +50 -5
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-render.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-snapshot.mjs +2 -5
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool.mjs +11 -1
- package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/search-glob-tool.mjs +3 -35
- package/src/runtime/agent/orchestrator/tools/builtin/search-grep-tool.mjs +0 -12
- package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +50 -0
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +9 -26
- package/src/runtime/agent/orchestrator/tools/builtin/shell-lossless-compact.mjs +2 -1
- package/src/runtime/agent/orchestrator/tools/builtin/shell-output.mjs +6 -5
- package/src/runtime/agent/orchestrator/tools/builtin/snapshot-helpers.mjs +8 -3
- package/src/runtime/agent/orchestrator/tools/builtin/snapshot-store.mjs +6 -14
- package/src/runtime/agent/orchestrator/tools/builtin/snapshot-validation.mjs +3 -9
- package/src/runtime/agent/orchestrator/tools/builtin/tool-output-limit.mjs +1 -60
- package/src/runtime/agent/orchestrator/tools/builtin.mjs +10 -32
- package/src/runtime/agent/orchestrator/tools/code-graph/disk-cache.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/code-graph/modes/calls.mjs +3 -3
- package/src/runtime/agent/orchestrator/tools/code-graph/project-root.mjs +3 -7
- package/src/runtime/agent/orchestrator/tools/code-graph/search-references.mjs +15 -10
- package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +6 -10
- package/src/runtime/agent/orchestrator/tools/code-graph/symbol-index.mjs +4 -0
- package/src/runtime/agent/orchestrator/tools/code-graph/text-columns.mjs +3 -3
- package/src/runtime/agent/orchestrator/tools/code-graph/trusted-roots.mjs +3 -7
- package/src/runtime/agent/orchestrator/tools/code-graph-state.mjs +1 -84
- package/src/runtime/agent/orchestrator/tools/destructive-warning.mjs +11 -11
- package/src/runtime/agent/orchestrator/tools/graph-manifest.json +13 -13
- package/src/runtime/agent/orchestrator/tools/io-trace.mjs +28 -0
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +38 -5
- package/src/runtime/agent/orchestrator/tools/lib/shell-warm-standby.mjs +10 -4
- package/src/runtime/agent/orchestrator/tools/patch/apply-patch/codex-batch.mjs +6 -26
- package/src/runtime/agent/orchestrator/tools/patch/apply-patch/request.mjs +0 -3
- package/src/runtime/agent/orchestrator/tools/patch/dispatch/native-report.mjs +2 -1
- package/src/runtime/agent/orchestrator/tools/patch/dispatch.mjs +3 -10
- package/src/runtime/agent/orchestrator/tools/patch/matcher.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/patch/mutation-output.mjs +6 -19
- package/src/runtime/agent/orchestrator/tools/patch/native-server.mjs +5 -15
- package/src/runtime/agent/orchestrator/tools/patch/orchestrator.mjs +1 -3
- package/src/runtime/agent/orchestrator/tools/patch/paths.mjs +4 -0
- package/src/runtime/agent/orchestrator/tools/patch/sequence/run.mjs +1 -3
- package/src/runtime/agent/orchestrator/tools/patch/sequence/units.mjs +4 -10
- package/src/runtime/agent/orchestrator/tools/patch/sequence.mjs +1 -2
- package/src/runtime/agent/orchestrator/tools/patch/v4a-convert.mjs +5 -11
- package/src/runtime/agent/orchestrator/tools/patch-binary-fetcher.mjs +1 -2
- package/src/runtime/agent/orchestrator/tools/patch-manifest-path.mjs +3 -0
- package/src/runtime/agent/orchestrator/tools/patch-manifest.json +12 -12
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +87 -12
- package/src/runtime/agent/orchestrator/tools/shell-exec-output.mjs +6 -3
- package/src/runtime/agent/orchestrator/tools/shell-exec-policy.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +15 -25
- package/src/runtime/agent/orchestrator/tools/spawn-manifest.json +13 -13
- package/src/runtime/{shared/llm → agent/orchestrator}/usage-log.mjs +1 -1
- package/src/runtime/attachments/pdf-extract.mjs +32 -29
- package/src/runtime/attachments/store.mjs +2 -1
- package/src/runtime/browser-bridge/browser-action-contract.d.mts +0 -2
- package/src/runtime/browser-bridge/client.mjs +30 -9
- package/src/runtime/channels/data/voice-runtime-manifest.json +21 -21
- package/src/runtime/channels/lib/config.mjs +4 -4
- package/src/runtime/channels/lib/event-pipeline.mjs +3 -3
- package/src/runtime/channels/lib/event-queue.mjs +1 -0
- package/src/runtime/channels/lib/executor.mjs +3 -25
- package/src/runtime/channels/lib/runtime-paths.mjs +36 -41
- package/src/runtime/channels/lib/scheduler.mjs +28 -44
- package/src/runtime/{shared → channels/lib}/schedules-db.mjs +3 -3
- package/src/runtime/channels/lib/tool-dispatch.mjs +3 -8
- package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +19 -23
- package/src/runtime/channels/lib/voice-transcription.mjs +13 -9
- package/src/runtime/channels/lib/webhook/log.mjs +2 -29
- package/src/runtime/channels/lib/webhook/request-handler.mjs +4 -5
- package/src/runtime/channels/lib/webhook/session-dispatch.mjs +8 -12
- package/src/runtime/channels/lib/webhook/signature.mjs +15 -19
- package/src/runtime/channels/lib/webhook/untrusted-fence.mjs +9 -0
- package/src/runtime/channels/lib/webhook.mjs +1 -1
- package/src/runtime/{shared → channels/lib}/webhooks-db.mjs +3 -3
- package/src/runtime/channels/lib/whisper-server.mjs +3 -2
- package/src/runtime/channels/lib/worker-bootstrap.mjs +19 -21
- package/src/runtime/channels/lib/worker-main.mjs +49 -58
- package/src/runtime/computer-bridge/client.mjs +7 -10
- package/src/runtime/computer-bridge/core-actions.mjs +1 -1
- package/src/runtime/computer-bridge/limits.d.mts +0 -1
- package/src/runtime/github/client.mjs +11 -6
- package/src/runtime/github/commands.mjs +4 -2
- package/src/runtime/github/contract.mjs +3 -1
- package/src/runtime/local-provider/hugging-face.mjs +3 -3
- package/src/runtime/local-provider/registered-models.mjs +3 -1
- package/src/runtime/local-provider/request-queue.mjs +24 -29
- package/src/runtime/local-provider/serial-chain.mjs +19 -0
- package/src/runtime/local-provider/server-process.mjs +2 -10
- package/src/runtime/media/adapters/antigravity-image.mjs +2 -2
- package/src/runtime/media/adapters/codex-image.mjs +2 -2
- package/src/runtime/media/adapters/gemini-image.mjs +2 -1
- package/src/runtime/media/adapters/gemini-video.mjs +3 -7
- package/src/runtime/media/adapters/xai-media.mjs +3 -7
- package/src/runtime/media/bounded-signal.mjs +13 -0
- package/src/runtime/media/store.mjs +9 -3
- package/src/runtime/memory/data/runtime-manifest.json +11 -11
- package/src/runtime/memory/index.mjs +6 -21
- package/src/runtime/memory/lib/core-memory-file.mjs +1 -1
- package/src/runtime/memory/lib/cycle-scheduler/backlog-probe.mjs +2 -1
- package/src/runtime/memory/lib/cycle1/cycle1-plan.mjs +1 -1
- package/src/runtime/memory/lib/embedding-idle-lease.mjs +18 -0
- package/src/runtime/memory/lib/embedding-provider.mjs +13 -0
- package/src/runtime/memory/lib/embedding-worker.mjs +12 -1
- package/src/runtime/memory/lib/http-router/ingest-routes.mjs +1 -1
- package/src/runtime/memory/lib/http-router/session-routes.mjs +1 -1
- package/src/runtime/memory/lib/ingest/transcript-discovery.mjs +1 -1
- package/src/runtime/memory/lib/memory-action-handlers/manage-actions.mjs +1 -1
- package/src/runtime/memory/lib/memory-cycle1.mjs +24 -1
- package/src/runtime/memory/lib/memory-cycle2-quarantine.mjs +99 -0
- package/src/runtime/memory/lib/memory-cycle2-review.mjs +8 -2
- package/src/runtime/memory/lib/memory-cycle2.mjs +49 -9
- package/src/runtime/memory/lib/memory-embed.mjs +3 -2
- package/src/runtime/memory/lib/memory-extraction.mjs +1 -2
- package/src/runtime/memory/lib/memory-fingerprint.mjs +1 -1
- package/src/runtime/memory/lib/memory-ops-policy.mjs +18 -2
- package/src/runtime/memory/lib/memory-retrievers.mjs +2 -2
- package/src/runtime/memory/lib/memory-text-utils.mjs +1 -1
- package/src/runtime/memory/lib/pg/adapter.mjs +3 -3
- package/src/runtime/memory/lib/pg/process.mjs +2 -2
- package/src/runtime/memory/lib/pg/supervisor.mjs +1 -2
- package/src/runtime/memory/lib/query-ranking.mjs +2 -2
- package/src/runtime/memory/lib/query-search-plan.mjs +1 -1
- package/src/runtime/memory/lib/recall-format.mjs +3 -4
- package/src/runtime/memory/lib/runtime-fetcher.mjs +94 -23
- package/src/runtime/memory/lib/session-ingest-runtime.mjs +1 -1
- package/src/runtime/memory/lib/trace-store.mjs +6 -2
- package/src/runtime/office/authoring/pptx-author-action.mjs +8 -3
- package/src/runtime/office/authoring/pptx-brief.mjs +3 -3
- package/src/runtime/office/authoring/pptx-html-build.mjs +109 -37
- package/src/runtime/office/authoring/pptx-html-geometry.mjs +188 -46
- package/src/runtime/office/authoring/pptx-html-measure.mjs +60 -21
- package/src/runtime/office/authoring/pptx-html-runner.mjs +83 -29
- package/src/runtime/office/authoring/pptx-script-normalize.mjs +156 -16
- package/src/runtime/office/bench/polish-benchmark.mjs +204 -201
- package/src/runtime/office/bench/quality-live-benchmark.mjs +8 -4
- package/src/runtime/office/capabilities-catalog.mjs +12 -1
- package/src/runtime/office/capabilities-signatures.mjs +31 -11
- package/src/runtime/office/capabilities.mjs +39 -20
- package/src/runtime/office/com/com-adapter.mjs +16 -14
- package/src/runtime/office/com/office-com-host.ps1 +118 -140
- package/src/runtime/office/core/excel-snapshot-normalize.mjs +149 -0
- package/src/runtime/office/core/office-actions-batch.mjs +4 -7
- package/src/runtime/office/core/office-actions-inspect.mjs +17 -14
- package/src/runtime/office/core/office-actions-open.mjs +1 -6
- package/src/runtime/office/core/office-core.mjs +107 -49
- package/src/runtime/office/core/office-finalize/review-stage.mjs +4 -1
- package/src/runtime/office/core/office-qa/design-review-stage.mjs +2 -9
- package/src/runtime/office/core/office-qa/review-assembly.mjs +9 -7
- package/src/runtime/office/core/office-sessions.mjs +10 -149
- package/src/runtime/office/design/composition-system.mjs +5 -10
- package/src/runtime/office/design/design-system.mjs +1 -2
- package/src/runtime/office/design/docx/design-docx/section.mjs +1 -1
- package/src/runtime/office/design/docx/design-docx-components.mjs +2 -1
- package/src/runtime/office/design/docx/design-docx.mjs +2 -2
- package/src/runtime/office/design/xlsx/design-xlsx.mjs +6 -2
- package/src/runtime/office/pdf/pdf-analysis.mjs +39 -32
- package/src/runtime/office/pdf/pdf-batch-content.mjs +1 -1
- package/src/runtime/office/pdf/pdf-writer.mjs +26 -22
- package/src/runtime/office/portable/docx-tracked-edits.mjs +6 -6
- package/src/runtime/office/portable/font-provisioner.mjs +37 -11
- package/src/runtime/office/portable/portable-cells.mjs +2 -6
- package/src/runtime/office/portable/portable-chart.mjs +6 -6
- package/src/runtime/office/portable/portable-docx-edits.mjs +4 -9
- package/src/runtime/office/portable/portable-docx-operations.mjs +16 -13
- package/src/runtime/office/portable/portable-docx-parts.mjs +7 -2
- package/src/runtime/office/portable/portable-docx-xml.mjs +36 -28
- package/src/runtime/office/portable/portable-opc.mjs +11 -13
- package/src/runtime/office/portable/portable-package.mjs +3 -4
- package/src/runtime/office/portable/portable-pivot.mjs +7 -3
- package/src/runtime/office/portable/portable-pptx-charts.mjs +59 -42
- package/src/runtime/office/portable/portable-pptx-core.mjs +14 -4
- package/src/runtime/office/portable/portable-pptx-package.mjs +5 -4
- package/src/runtime/office/portable/portable-pptx-shapes.mjs +25 -8
- package/src/runtime/office/portable/portable-sheet-audits.mjs +4 -8
- package/src/runtime/office/portable/portable-sheet-page.mjs +2 -2
- package/src/runtime/office/portable/portable-sheet-xml.mjs +1 -1
- package/src/runtime/office/portable/portable-snapshot-docx.mjs +2 -3
- package/src/runtime/office/portable/portable-snapshot-pptx.mjs +3 -1
- package/src/runtime/office/portable/portable-soffice.mjs +27 -22
- package/src/runtime/office/portable/portable-validation-package.mjs +1 -2
- package/src/runtime/office/portable/portable-validation.mjs +9 -3
- package/src/runtime/office/portable/portable-xlsx-operations.mjs +2 -49
- package/src/runtime/office/portable/portable-xlsx-pivot-ops.mjs +10 -5
- package/src/runtime/office/portable/portable-xlsx-range-layout.mjs +3 -2
- package/src/runtime/office/portable/portable-xlsx-reference-shift.mjs +189 -98
- package/src/runtime/office/portable/portable-xlsx-sheet-edits.mjs +26 -6
- package/src/runtime/office/portable/portable-xml.mjs +1 -4
- package/src/runtime/office/portable/text-metrics.mjs +14 -17
- package/src/runtime/office/portable/xlsx-contract.mjs +37 -3
- package/src/runtime/office/portable/xlsx-formula-engine.mjs +7 -1
- package/src/runtime/office/quality/assurance-checklist.mjs +1 -1
- package/src/runtime/office/quality/assurance-rendered.mjs +1 -1
- package/src/runtime/office/quality/assurance-structure-pptx.mjs +17 -8
- package/src/runtime/office/quality/assurance-structure.mjs +0 -2
- package/src/runtime/office/quality/design-aesthetics.mjs +2 -9
- package/src/runtime/office/quality/design-deck-diversity.mjs +2 -9
- package/src/runtime/office/quality/design-review.mjs +3 -3
- package/src/runtime/office/quality/pptx-slide-roles.mjs +3 -3
- package/src/runtime/office/shared/line-breaks.mjs +3 -1
- package/src/runtime/office/tool-defs.mjs +2 -2
- package/src/runtime/shared/async-log-appender.mjs +83 -0
- package/src/runtime/shared/automation-presence.mjs +9 -0
- package/src/runtime/shared/buffered-appender.mjs +10 -7
- package/src/runtime/shared/child-spawn-gate.mjs +2 -37
- package/src/runtime/shared/code-graph-state.mjs +84 -0
- package/src/runtime/shared/config.mjs +71 -89
- package/src/runtime/shared/context-inspection.mjs +56 -0
- package/src/runtime/shared/context-measurement.mjs +83 -0
- package/src/runtime/shared/device-paths.mjs +206 -0
- package/src/{standalone → runtime/shared}/fair-call-scheduler/owner-groups.mjs +1 -1
- package/src/runtime/shared/fair-call-scheduler.mjs +198 -0
- package/src/runtime/shared/file-lock.mjs +85 -55
- package/src/runtime/shared/http-request-body.mjs +3 -1
- package/src/runtime/shared/llm/anthropic-betas.mjs +46 -0
- package/src/runtime/shared/llm/anthropic-effort.mjs +378 -0
- package/src/runtime/shared/llm/anthropic-thinking-contract.mjs +29 -0
- package/src/runtime/shared/llm/cost.mjs +19 -10
- package/src/runtime/shared/llm/model-catalog-projection.mjs +182 -0
- package/src/runtime/shared/llm/model-catalog.mjs +799 -0
- package/src/runtime/shared/llm/model-pricing-rates.mjs +78 -0
- package/src/runtime/shared/llm/provider-catalog-cache.mjs +130 -0
- package/src/runtime/shared/llm/usage-accounting.mjs +12 -11
- package/src/runtime/shared/llm/usage-context.mjs +7 -0
- package/src/runtime/shared/llm/usage-ledger-import.mjs +14 -3
- package/src/runtime/shared/llm/usage-ledger-quota.mjs +97 -37
- package/src/runtime/shared/llm/usage-ledger-repair.mjs +3 -1
- package/src/runtime/shared/llm/usage-ledger-rollup.mjs +6 -10
- package/src/runtime/shared/llm/usage-ledger.mjs +6 -7
- package/src/runtime/shared/llm/usage-pricing-refresh.mjs +1 -1
- package/src/runtime/shared/llm/usage-rollup.mjs +0 -1
- package/src/runtime/shared/model-display.mjs +178 -0
- package/src/runtime/shared/notify-trace.mjs +14 -3
- package/src/runtime/shared/owner-fair-gate.mjs +1 -1
- package/src/runtime/shared/pending-json-projection.mjs +17 -0
- package/src/runtime/shared/pristine-execution.mjs +4 -3
- package/src/runtime/shared/process-lifecycle.mjs +18 -7
- package/src/runtime/shared/read-image-resize.mjs +399 -0
- package/src/runtime/shared/schedule-model-ref.mjs +2 -2
- package/src/runtime/shared/staged-update.mjs +7 -36
- package/src/runtime/shared/statusline/ansi.mjs +161 -0
- package/src/{ui → runtime/shared/statusline}/statusline-format.mjs +5 -5
- package/src/{ui → runtime/shared/statusline}/statusline-segments.mjs +54 -50
- package/src/runtime/shared/tool-card-model/background-task.mjs +1 -1
- package/src/runtime/shared/tool-card-model/card-detail.mjs +2 -2
- package/src/runtime/shared/tool-card-model/card-status.mjs +7 -5
- package/src/runtime/shared/tool-card-model/git-result.mjs +10 -0
- package/src/runtime/shared/tool-card-model/terminal-status.mjs +6 -2
- package/src/runtime/shared/tool-card-model.golden-cases.mjs +2 -1
- package/src/runtime/shared/tool-output-limit.mjs +60 -0
- package/src/runtime/shared/tool-primitives.mjs +1 -1
- package/src/runtime/shared/tool-result-summary.mjs +1 -0
- package/src/runtime/shared/tool-status.mjs +35 -2
- package/src/runtime/shared/transcript-metadata.mjs +1 -1
- package/src/runtime/shared/transcript-writer/transcript-file.mjs +1 -2
- package/src/runtime/shared/turn-snapshot-store.mjs +23 -17
- package/src/runtime/shared/turn-worktree-snapshot.mjs +8 -4
- package/src/runtime/shared/update-checker.mjs +1 -3
- package/src/runtime/tidy/apply.mjs +2 -2
- package/src/runtime/tidy/function-length.mjs +63 -0
- package/src/runtime/tidy/report.mjs +6 -3
- package/src/runtime/tidy/runners/shared.mjs +1 -0
- package/src/runtime/tidy/runners/shellcheck.mjs +1 -1
- package/src/runtime/tidy/tool.mjs +10 -3
- package/src/runtime/web-search/index.mjs +6 -17
- package/src/runtime/web-search/lib/cache.mjs +8 -54
- package/src/runtime/web-search/lib/config.mjs +2 -6
- package/src/runtime/web-search/lib/debounced-json-writer.mjs +62 -0
- package/src/runtime/web-search/lib/http-fetch.mjs +24 -112
- package/src/runtime/web-search/lib/package-version.mjs +10 -0
- package/src/runtime/web-search/lib/ssrf-guard.mjs +34 -28
- package/src/runtime/web-search/lib/state.mjs +8 -53
- package/src/runtime/web-search/lib/web-tools.mjs +5 -5
- package/src/session-runtime/agent-tool-routing.mjs +3 -9
- package/src/{runtime/shared → session-runtime}/automation-workflow.mjs +4 -4
- package/src/session-runtime/boot/apis.mjs +4 -5
- package/src/session-runtime/boot/begin.mjs +1 -1
- package/src/session-runtime/boot/config.mjs +2 -2
- package/src/session-runtime/boot/facade.mjs +2 -2
- package/src/session-runtime/boot/infrastructure.mjs +4 -4
- package/src/session-runtime/boot/providers.mjs +6 -6
- package/src/session-runtime/boot/session.mjs +1 -1
- package/src/session-runtime/boot/shared.mjs +5 -7
- package/src/session-runtime/boot/tools.mjs +6 -6
- package/src/session-runtime/bridge-first-use-gate.mjs +1 -1
- package/src/session-runtime/builtin-features.mjs +1 -193
- package/src/session-runtime/channel-config-api.mjs +3 -3
- package/src/session-runtime/config-helpers.mjs +1 -420
- package/src/session-runtime/config-lifecycle.mjs +2 -2
- package/src/session-runtime/cwd-plugins/core-memory-context.mjs +2 -2
- package/src/session-runtime/cwd-plugins/plugin-status.mjs +1 -1
- package/src/session-runtime/deferred-tool-delta.mjs +1 -101
- package/src/session-runtime/effort.mjs +1 -145
- package/src/session-runtime/goal-facade-api.mjs +1 -1
- package/src/session-runtime/goal-state.mjs +1 -325
- package/src/session-runtime/goal-tasks.mjs +1 -137
- package/src/session-runtime/goal-tool-defs.mjs +1 -140
- package/src/session-runtime/hook-payload.mjs +4 -5
- package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -3
- package/src/session-runtime/internal-tool-executor/caller-context.mjs +8 -0
- package/src/session-runtime/internal-tool-executor/feature-tools.mjs +3 -2
- package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +4 -6
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +2 -2
- package/src/session-runtime/internal-tool-executor.mjs +1 -1
- package/src/session-runtime/lifecycle/inheritance.mjs +1 -1
- package/src/session-runtime/lifecycle/session-catalog.mjs +3 -3
- package/src/session-runtime/lifecycle/session-switch/resume.mjs +2 -2
- package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +1 -1
- package/src/session-runtime/lifecycle/session-switch.mjs +1 -1
- package/src/session-runtime/lifecycle/shared.mjs +1 -1
- package/src/session-runtime/mcp-glue/connect.mjs +1 -1
- package/src/session-runtime/mcp-glue/server-catalog.mjs +1 -1
- package/src/session-runtime/mcp-glue/server-input.mjs +1 -1
- package/src/session-runtime/model-capabilities.mjs +1 -140
- package/src/session-runtime/model-recency.mjs +1 -1
- package/src/session-runtime/model-route/route-persist.mjs +2 -2
- package/src/session-runtime/model-route/route-tuning.mjs +3 -3
- package/src/session-runtime/model-route/set-route.mjs +6 -6
- package/src/session-runtime/model-route/web-search-route.mjs +5 -5
- package/src/session-runtime/model-route-api.mjs +1 -1
- package/src/session-runtime/native-web-search/routes.mjs +1 -1
- package/src/session-runtime/native-web-search/tool-shape.mjs +2 -2
- package/src/session-runtime/output-styles.mjs +2 -2
- package/src/session-runtime/prewarm/channel-start.mjs +1 -0
- package/src/session-runtime/provider-auth/accounts.mjs +7 -2
- package/src/session-runtime/provider-auth/login.mjs +1 -1
- package/src/session-runtime/provider-auth-api.mjs +1 -1
- package/src/session-runtime/provider-models/model-meta.mjs +1 -1
- package/src/session-runtime/provider-models/row-hydration.mjs +3 -3
- package/src/session-runtime/provider-usage.mjs +2 -2
- package/src/session-runtime/quick-model-rows/model-meta.mjs +1 -1
- package/src/session-runtime/quick-model-rows/provider-rows.mjs +1 -1
- package/src/session-runtime/quick-model-rows/web-search-rows.mjs +2 -2
- package/src/session-runtime/resource-api.mjs +2 -2
- package/src/session-runtime/resource-mcp-api.mjs +3 -3
- package/src/session-runtime/resource-plugins-api.mjs +3 -3
- package/src/session-runtime/resource-recall-api.mjs +2 -2
- package/src/session-runtime/resource-scope-decorate.mjs +2 -2
- package/src/session-runtime/route-resolution.mjs +3 -3
- package/src/session-runtime/route-state.mjs +4 -4
- package/src/session-runtime/runtime-bootstrap.mjs +1 -1
- package/src/session-runtime/runtime-facade.mjs +1 -1
- package/src/session-runtime/runtime-feature-gates.mjs +2 -2
- package/src/session-runtime/runtime-modules.mjs +3 -3
- package/src/session-runtime/runtime-paths.mjs +6 -2
- package/src/session-runtime/runtime-tool-routing.mjs +2 -2
- package/src/{runtime/shared → session-runtime}/schedule-session-run.mjs +5 -5
- package/src/{standalone → session-runtime/services}/agent-task-status.mjs +1 -1
- package/src/{standalone → session-runtime/services}/agent-tool/close-flow/close-all.mjs +2 -2
- package/src/{standalone → session-runtime/services}/agent-tool/close-flow.mjs +1 -1
- package/src/{standalone → session-runtime/services}/agent-tool/execute.mjs +1 -1
- package/src/{standalone → session-runtime/services}/agent-tool/helpers.mjs +6 -6
- package/src/session-runtime/services/agent-tool/index-write-queue.mjs +209 -0
- package/src/{standalone → session-runtime/services}/agent-tool/job-task-reconcile.mjs +2 -2
- package/src/{standalone → session-runtime/services}/agent-tool/job-views/job-lookup.mjs +5 -1
- package/src/{standalone → session-runtime/services}/agent-tool/job-views/job-render.mjs +1 -1
- package/src/session-runtime/services/agent-tool/job-views/session-progress.mjs +101 -0
- package/src/{standalone → session-runtime/services}/agent-tool/job-views/spawn-meta.mjs +1 -1
- package/src/session-runtime/services/agent-tool/job-views.mjs +59 -0
- package/src/session-runtime/services/agent-tool/lead-worker-index/index-file.mjs +48 -0
- package/src/{standalone → session-runtime/services}/agent-tool/lead-worker-index/row-settlement.mjs +3 -3
- package/src/{standalone → session-runtime/services}/agent-tool/lead-worker-index.mjs +10 -2
- package/src/{standalone → session-runtime/services}/agent-tool/notify/early-completion.mjs +2 -2
- package/src/{standalone → session-runtime/services}/agent-tool/notify.mjs +4 -4
- package/src/{standalone → session-runtime/services}/agent-tool/render.mjs +2 -2
- package/src/{standalone → session-runtime/services}/agent-tool/send-flow.mjs +6 -2
- package/src/{standalone → session-runtime/services}/agent-tool/spawn-flow/job-start.mjs +2 -2
- package/src/{standalone → session-runtime/services}/agent-tool/spawn-flow/spawn-plan.mjs +3 -3
- package/src/{standalone → session-runtime/services}/agent-tool/spawn-flow/spawn-prep.mjs +3 -3
- package/src/{standalone → session-runtime/services}/agent-tool/spawn-flow/spawn-run.mjs +3 -3
- package/src/{standalone → session-runtime/services}/agent-tool/spawn-preset.mjs +1 -1
- package/src/session-runtime/services/agent-tool/tag-registry.mjs +121 -0
- package/src/{standalone → session-runtime/services}/agent-tool/terminal-reaper/reap-timers.mjs +1 -1
- package/src/{standalone → session-runtime/services}/agent-tool/terminal-reaper/scan-admission.mjs +1 -1
- package/src/{standalone → session-runtime/services}/agent-tool/terminal-reaper/stale-rows.mjs +1 -1
- package/src/{standalone → session-runtime/services}/agent-tool/terminal-reaper/tombstones.mjs +5 -2
- package/src/session-runtime/services/agent-tool/tool-def.mjs +60 -0
- package/src/{standalone → session-runtime/services}/agent-tool/turn-review.mjs +1 -1
- package/src/{standalone → session-runtime/services}/agent-tool/worker-index/row-liveness.mjs +1 -1
- package/src/{standalone → session-runtime/services}/agent-tool/worker-index/row-store.mjs +46 -20
- package/src/{standalone → session-runtime/services}/agent-tool/worker-index.mjs +8 -1
- package/src/{standalone → session-runtime/services}/agent-tool/worker-rows.mjs +1 -1
- package/src/session-runtime/services/agent-tool.mjs +151 -0
- package/src/{standalone → session-runtime/services}/agent-watchdog-registry.mjs +1 -1
- package/src/{standalone → session-runtime/services}/channel-admin.mjs +8 -10
- package/src/{standalone → session-runtime/services}/channel-client.mjs +1 -1
- package/src/{standalone → session-runtime/services}/channel-session-router.mjs +1 -1
- package/src/{standalone → session-runtime/services}/channel-worker/client-heartbeat.mjs +1 -1
- package/src/{standalone → session-runtime/services}/channel-worker/daemon-attach.mjs +1 -1
- package/src/{standalone → session-runtime/services}/channel-worker/daemon-spawn.mjs +5 -5
- package/src/session-runtime/services/channel-worker.mjs +140 -0
- package/src/session-runtime/services/daemon-crash-capture/daemon-exit-record.mjs +189 -0
- package/src/{standalone → session-runtime/services}/daemon-crash-capture/retention.mjs +1 -1
- package/src/{standalone → session-runtime/services}/daemon-crash-capture/spawn-capture.mjs +12 -1
- package/src/{standalone → session-runtime/services}/daemon-crash-capture.mjs +6 -0
- package/src/{standalone → session-runtime/services}/hook-bus/command-handler.mjs +1 -1
- package/src/{standalone → session-runtime/services}/hook-bus/event-runner.mjs +1 -1
- package/src/{standalone → session-runtime/services}/hook-bus/handler-dispatch.mjs +1 -1
- package/src/{standalone → session-runtime/services}/hook-bus/handlers.mjs +5 -4
- package/src/{standalone → session-runtime/services}/hook-bus/rule-file.mjs +2 -2
- package/src/{standalone → session-runtime/services}/hook-bus/tool-gate.mjs +1 -1
- package/src/{standalone → session-runtime/services}/memory-runtime-proxy/client-registry.mjs +1 -1
- package/src/{standalone → session-runtime/services}/memory-runtime-proxy/daemon-spawn.mjs +4 -4
- package/src/{standalone → session-runtime/services}/memory-runtime-proxy/discovery.mjs +5 -5
- package/src/{standalone → session-runtime/services}/memory-runtime-proxy/owner-claim.mjs +2 -2
- package/src/{standalone → session-runtime/services}/memory-runtime-proxy/rpc.mjs +0 -4
- package/src/{standalone → session-runtime/services}/memory-runtime-proxy/start.mjs +1 -1
- package/src/{standalone → session-runtime/services}/memory-runtime-proxy/tool-wire.mjs +1 -1
- package/src/session-runtime/services/memory-runtime-proxy.mjs +130 -0
- package/src/{standalone → session-runtime/services}/plugin-admin.mjs +6 -6
- package/src/session-runtime/services/provider-admin.mjs +576 -0
- package/src/{standalone → session-runtime/services}/seeds.mjs +3 -3
- package/src/{standalone → session-runtime/services}/usage-dashboard-model.mjs +1 -1
- package/src/session-runtime/services/usage-dashboard.mjs +278 -0
- package/src/{standalone → session-runtime/services}/usage-stats-hours.mjs +1 -1
- package/src/session-runtime/services/usage-stats-model.mjs +657 -0
- package/src/session-runtime/services/usage-stats-period.mjs +178 -0
- package/src/session-runtime/session-create/materialize.mjs +3 -3
- package/src/session-runtime/session-create/session-options.mjs +14 -7
- package/src/session-runtime/session-lifecycle.mjs +2 -2
- package/src/session-runtime/settings-builtin-tools-api.mjs +1 -1
- package/src/session-runtime/setup-tool/executor.mjs +2 -2
- package/src/session-runtime/skills-api.mjs +2 -2
- package/src/session-runtime/statusline-route.mjs +1 -1
- package/src/session-runtime/tool-catalog.mjs +1 -753
- package/src/session-runtime/tool-defs.mjs +1 -149
- package/src/session-runtime/tool-policy-refresh.mjs +7 -5
- package/src/session-runtime/tool-surface.mjs +5 -5
- package/src/session-runtime/turn/agent-ops.mjs +2 -2
- package/src/session-runtime/turn/session-ops.mjs +2 -2
- package/src/session-runtime/turn/share-ops.mjs +4 -3
- package/src/session-runtime/turn/turn-run/turn-prepare.mjs +1 -1
- package/src/session-runtime/turn/turn-run/turn-settle.mjs +4 -4
- package/src/session-runtime/usage-stats-api.mjs +18 -2
- package/src/session-runtime/warmup/statusline-usage-warmup.mjs +2 -2
- package/src/{runtime/shared → session-runtime}/webhook-session-run.mjs +5 -5
- package/src/session-runtime/workflow-agents-api/agent-editor.mjs +2 -2
- package/src/session-runtime/workflow-agents-api/agent-route.mjs +4 -4
- package/src/session-runtime/workflow-agents-api/onboarding.mjs +2 -2
- package/src/session-runtime/workflow-agents-api/shared.mjs +4 -6
- package/src/session-runtime/workflow-agents-api/workflow-packs.mjs +1 -1
- package/src/session-runtime/workflow.mjs +1 -255
- package/src/standalone/agent-tool/job-views/session-progress.mjs +1 -101
- package/src/standalone/agent-tool/job-views.mjs +1 -59
- package/src/standalone/agent-tool/tag-registry.mjs +1 -121
- package/src/standalone/agent-tool/tool-def.mjs +1 -60
- package/src/standalone/agent-tool.mjs +1 -151
- package/src/standalone/channel-worker.mjs +1 -140
- package/src/standalone/daemon-agent-control.mjs +1 -1
- package/src/standalone/daemon-desktop-runtime.mjs +2 -2
- package/src/standalone/daemon-stored-session-views.mjs +1 -1
- package/src/standalone/daemon.mjs +38 -5
- package/src/standalone/fair-call-scheduler.mjs +1 -198
- package/src/standalone/folder-dialog.mjs +12 -8
- package/src/standalone/memory-runtime-proxy.mjs +1 -130
- package/src/standalone/provider-admin.mjs +1 -576
- package/src/standalone/session-client/frame-stream.mjs +1 -1
- package/src/standalone/session-client.mjs +2 -2
- package/src/standalone/session-service/agent-tree/agent-child.mjs +1 -1
- package/src/standalone/session-service/projection/transcript-window.mjs +2 -2
- package/src/standalone/usage-dashboard.mjs +1 -278
- package/src/standalone/usage-stats-model.mjs +1 -653
- package/src/standalone/usage-stats-period.mjs +1 -178
- package/src/tui/App.jsx +107 -256
- package/src/tui/app/app-view/floating-panel.jsx +3 -12
- package/src/tui/app/app-view/welcome-banner.jsx +36 -0
- package/src/tui/app/app-view.jsx +18 -45
- package/src/tui/app/create-app-pickers.mjs +1 -1
- package/src/tui/app/doctor.mjs +15 -1
- package/src/tui/app/extension-pickers/mcp-servers-picker.mjs +7 -3
- package/src/tui/app/maintenance-pickers/auto-clear-picker.mjs +5 -8
- package/src/tui/app/model-options.mjs +2 -3
- package/src/tui/app/model-picker/model-footer.mjs +1 -1
- package/src/tui/app/model-picker/route-selection.mjs +1 -3
- package/src/tui/app/mouse-input/button-gestures.mjs +13 -31
- package/src/tui/app/mouse-input/wheel-router.mjs +22 -32
- package/src/tui/app/picker-enter-latch.mjs +21 -0
- package/src/tui/app/picker-index-mode.mjs +34 -0
- package/src/tui/app/shell-layout/panel-transition.mjs +7 -12
- package/src/tui/app/shell-layout/row-budgets.mjs +4 -9
- package/src/tui/app/slash-palette.mjs +31 -0
- package/src/tui/app/text-layout.mjs +1 -1
- package/src/tui/app/theme-effort-pickers.mjs +1 -1
- package/src/tui/app/transcript-window.mjs +1 -5
- package/src/tui/app/usage-context-panels/context-model.mjs +1 -1
- package/src/tui/app/use-global-key-input.mjs +0 -1
- package/src/tui/app/use-interaction-refs.mjs +55 -0
- package/src/tui/app/use-onboarding-start.mjs +45 -0
- package/src/tui/app/use-panel-transition.mjs +40 -0
- package/src/tui/app/use-prompt-draft-flow.mjs +4 -13
- package/src/tui/app/use-prompt-layout-rows.mjs +39 -0
- package/src/tui/app/use-prompt-queue-history/prompt-history.mjs +1 -1
- package/src/tui/app/use-prompt-state.mjs +40 -0
- package/src/tui/app/use-selection-paint.mjs +9 -5
- package/src/tui/app/use-transcript-scroll-state.mjs +61 -0
- package/src/tui/app/use-transcript-window.mjs +0 -1
- package/src/tui/app/use-ui-open-request.mjs +18 -0
- package/src/tui/app/use-workflow-tab-cycle.mjs +39 -0
- package/src/tui/components/ContextInspector.jsx +1 -1
- package/src/tui/components/ContextPanel.jsx +1 -1
- package/src/tui/components/Picker.jsx +41 -322
- package/src/tui/components/PromptInput.jsx +34 -468
- package/src/tui/components/StatusLine.jsx +8 -555
- package/src/tui/components/TextEntryPanel.jsx +25 -211
- package/src/tui/components/ToolExecution.jsx +43 -328
- package/src/tui/components/UsagePanel.jsx +1 -1
- package/src/tui/components/picker/PickerItemRow.jsx +85 -0
- package/src/tui/components/picker/picker-layout.mjs +46 -0
- package/src/tui/components/picker/use-picker-input.mjs +165 -0
- package/src/tui/components/picker/use-picker-selection.mjs +67 -0
- package/src/tui/components/prompt-input/edit-chords.mjs +87 -0
- package/src/tui/components/prompt-input/edit-helpers.mjs +15 -12
- package/src/tui/components/prompt-input/escape-key.mjs +87 -0
- package/src/tui/components/prompt-input/key-handler.mjs +364 -0
- package/src/tui/components/status-line/boot-schedule.mjs +83 -0
- package/src/tui/components/status-line/local-line.mjs +213 -0
- package/src/tui/components/status-line/use-statusline-text.mjs +319 -0
- package/src/tui/components/statusline-module-loader.mjs +21 -0
- package/src/tui/components/text-entry-layout.mjs +104 -0
- package/src/tui/components/text-entry-value.jsx +47 -0
- package/src/tui/components/tool-execution/aggregate-card.jsx +141 -0
- package/src/tui/components/tool-execution/pending-placeholder.jsx +24 -0
- package/src/tui/components/tool-execution/standard-card.jsx +229 -0
- package/src/tui/components/tool-output-format.mjs +3 -5
- package/src/tui/dist/index.mjs +3616 -3022
- package/src/tui/index.jsx +85 -66
- package/src/tui/markdown/format-token.mjs +3 -3
- package/src/tui/paste-attachments.mjs +1 -1
- package/src/tui/prompt-history-store.mjs +17 -6
- package/src/tui/session/agent-envelope.mjs +1 -489
- package/src/tui/session/context-state.mjs +2 -2
- package/src/tui/session/goal-continuation/continuation-queue.mjs +1 -1
- package/src/tui/session/goal-continuation/deadline-delivery.mjs +1 -1
- package/src/tui/session/goal-continuation/goal-visibility.mjs +1 -1
- package/src/tui/session/initial-state.mjs +1 -1
- package/src/tui/session/live-share/wire.mjs +3 -0
- package/src/tui/session/oauth-flows.mjs +1 -7
- package/src/tui/session/session-api/commands.mjs +5 -3
- package/src/tui/session/session-api/controls.mjs +1 -1
- package/src/tui/session/session-api/intake/submission.mjs +8 -3
- package/src/tui/session/session-api/integrations.mjs +1 -1
- package/src/tui/session/session-api/routes.mjs +9 -8
- package/src/tui/session/session-api/settings.mjs +24 -23
- package/src/tui/session/session-api/shared.mjs +13 -2
- package/src/tui/session/session-api-ext.mjs +7 -415
- package/src/tui/session/session-flow/drain.mjs +86 -82
- package/src/tui/session/session-flow/queue.mjs +3 -1
- package/src/tui/session/tool-result-status.mjs +1 -354
- package/src/tui/session/tool-result-text.mjs +1 -157
- package/src/tui/session/transcript-intake.mjs +1 -1
- package/src/tui/session/transcript-spill/spill-dir.mjs +4 -1
- package/src/tui/session/transcript-spill/spill-writer.mjs +1 -1
- package/src/tui/session/tui-steering-persist.mjs +44 -86
- package/src/tui/session-local.mjs +8 -5
- package/src/tui/statusline-ansi-bridge.mjs +1 -1
- package/src/tui/theme.mjs +1 -1
- package/src/ui/ansi.mjs +1 -161
- package/src/ui/context-inspection.mjs +1 -56
- package/src/ui/context-measurement.mjs +1 -83
- package/src/ui/markdown.mjs +3 -3
- package/src/ui/model-display.mjs +1 -173
- package/src/ui/statusline-agents.mjs +22 -21
- package/src/ui/statusline.mjs +21 -24
- package/src/ui/stream-finalize.mjs +1 -1
- package/src/ui/tool-card.mjs +1 -1
- package/src/vendor/statusline/src/gateway/route-meta.mjs +157 -29
- package/scripts/fixtures/spawn-lease-child-harness.mjs +0 -8
- package/scripts/fixtures/spawn-lease-fixture-worker.mjs +0 -37
- package/src/runtime/agent/orchestrator/activity-bus.mjs +0 -31
- package/src/runtime/shared/child-spawn-remote.mjs +0 -210
- package/src/runtime/shared/session-runtime-health.mjs +0 -201
- package/src/standalone/agent-tool/lead-worker-index/index-file.mjs +0 -45
- package/src/standalone/session-runtime-agent-control-client.mjs +0 -117
- package/src/standalone/session-runtime-agent-control.mjs +0 -85
- package/src/standalone/session-runtime-host-factory.mjs +0 -22
- package/src/standalone/session-runtime-host.mjs +0 -742
- package/src/standalone/session-runtime-provider-cooldown.mjs +0 -78
- package/src/standalone/session-runtime-proxy.mjs +0 -164
- package/src/standalone/session-runtime-record.mjs +0 -18
- package/src/standalone/session-runtime-shard-router.mjs +0 -151
- package/src/standalone/session-runtime-spawn-leases.mjs +0 -82
- package/src/standalone/session-runtime-worker.mjs +0 -678
- package/src/standalone/session-runtime-workload.mjs +0 -98
- /package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/context-status-cache.mjs +0 -0
- /package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/deferred-tool-availability.mjs +0 -0
- /package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/goal-deadlines.mjs +0 -0
- /package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/goal-runtime.mjs +0 -0
- /package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/goal-store.mjs +0 -0
- /package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/goal-text.mjs +0 -0
- /package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/goal-tool-exec.mjs +0 -0
- /package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/provider-request-snapshot.mjs +0 -0
- /package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/provider-request-tools.mjs +0 -0
- /package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/tool-catalog-data.mjs +0 -0
- /package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/tool-profile.mjs +0 -0
- /package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/workflow/shared-scan-cache.mjs +0 -0
- /package/src/{standalone → runtime/shared}/fair-call-scheduler/queue-item.mjs +0 -0
- /package/src/runtime/{agent/orchestrator/providers → shared/llm}/provider-model-identities.mjs +0 -0
- /package/src/{standalone → runtime/shared}/projects.mjs +0 -0
- /package/src/{standalone → session-runtime/services}/agent-tool/execute-send.mjs +0 -0
- /package/src/{standalone → session-runtime/services}/agent-tool/execute-spawn.mjs +0 -0
- /package/src/{standalone → session-runtime/services}/agent-tool/job-views/agent-list.mjs +0 -0
- /package/src/{standalone → session-runtime/services}/agent-tool/lead-worker-index/lead-rows.mjs +0 -0
- /package/src/{standalone → session-runtime/services}/agent-tool/lead-worker-index/reap-timers.mjs +0 -0
- /package/src/{standalone → session-runtime/services}/agent-tool/provider-init.mjs +0 -0
- /package/src/{standalone → session-runtime/services}/agent-tool/spawn-flow/deferred-spawn.mjs +0 -0
- /package/src/{standalone → session-runtime/services}/agent-tool/spawn-flow.mjs +0 -0
- /package/src/{standalone → session-runtime/services}/agent-tool/tag-maps.mjs +0 -0
- /package/src/{standalone → session-runtime/services}/agent-tool/tag-registry/tag-lookup.mjs +0 -0
- /package/src/{standalone → session-runtime/services}/agent-tool/tag-registry/tag-refresh.mjs +0 -0
- /package/src/{standalone → session-runtime/services}/agent-tool/terminal-reaper/row-helpers.mjs +0 -0
- /package/src/{standalone → session-runtime/services}/agent-tool/terminal-reaper.mjs +0 -0
- /package/src/{standalone → session-runtime/services}/agent-tool/terminal-trace.mjs +0 -0
- /package/src/{standalone → session-runtime/services}/agent-tool/worker-index/mutation-batch.mjs +0 -0
- /package/src/{standalone → session-runtime/services}/agent-tool/worker-index/row-shape.mjs +0 -0
- /package/src/{standalone → session-runtime/services}/channel-client/daemon-request.mjs +0 -0
- /package/src/{standalone → session-runtime/services}/channel-client/notify-stream.mjs +0 -0
- /package/src/{standalone → session-runtime/services}/channel-client/reconnect.mjs +0 -0
- /package/src/{standalone → session-runtime/services}/channel-client/registration.mjs +0 -0
- /package/src/{standalone → session-runtime/services}/daemon-candidate.mjs +0 -0
- /package/src/{standalone → session-runtime/services}/daemon-crash-capture/paths.mjs +0 -0
- /package/src/{standalone → session-runtime/services}/hook-bus/config-loader.mjs +0 -0
- /package/src/{standalone → session-runtime/services}/hook-bus/config.mjs +0 -0
- /package/src/{standalone → session-runtime/services}/hook-bus/constants.mjs +0 -0
- /package/src/{standalone → session-runtime/services}/hook-bus/event-log.mjs +0 -0
- /package/src/{standalone → session-runtime/services}/hook-bus/handler-timeout.mjs +0 -0
- /package/src/{standalone → session-runtime/services}/hook-bus/payload.mjs +0 -0
- /package/src/{standalone → session-runtime/services}/hook-bus/rule-store.mjs +0 -0
- /package/src/{standalone → session-runtime/services}/hook-bus/rules.mjs +0 -0
- /package/src/{standalone → session-runtime/services}/hook-bus.mjs +0 -0
- /package/src/{standalone → session-runtime/services}/memory-runtime-proxy/calls.mjs +0 -0
- /package/src/{standalone → session-runtime/services}/memory-runtime-proxy/state.mjs +0 -0
- /package/src/{standalone → session-runtime/services}/sse-frames.mjs +0 -0
|
@@ -175,33 +175,6 @@ export function sessionLoadCacheStats() {
|
|
|
175
175
|
// on genuine corruption instead of spinning.
|
|
176
176
|
const SESSION_LOAD_STABLE_ATTEMPTS = 5;
|
|
177
177
|
|
|
178
|
-
// Deterministic fault injection point (tests only): invoked immediately
|
|
179
|
-
// before every stat and every read with { phase, path, attempt }. The hook
|
|
180
|
-
// may mutate the file system (simulating an atomic rename landing between
|
|
181
|
-
// the two syscalls) or return an Error to make that syscall fail.
|
|
182
|
-
//
|
|
183
|
-
// STRUCTURAL GATE: the seam is inert unless the process was started in
|
|
184
|
-
// explicit fault-injection test mode. Installing a hook without the gate is
|
|
185
|
-
// a no-op (returns false), and an already-installed hook is dropped the
|
|
186
|
-
// moment the gate stops being set, so a production build can never activate
|
|
187
|
-
// it accidentally — not via a stray import, not via a leaked reference.
|
|
188
|
-
const SESSION_LOAD_FAULT_ENV = 'MIXDOG_SESSION_LOAD_FAULT_HOOKS';
|
|
189
|
-
let _sessionLoadFaultHook = null;
|
|
190
|
-
|
|
191
|
-
function _faultHooksEnabled() {
|
|
192
|
-
return process.env[SESSION_LOAD_FAULT_ENV] === '1';
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
function _fault(phase, path, attempt) {
|
|
196
|
-
if (!_sessionLoadFaultHook) return;
|
|
197
|
-
if (!_faultHooksEnabled()) {
|
|
198
|
-
_sessionLoadFaultHook = null; // gate revoked after install: stay inert
|
|
199
|
-
return;
|
|
200
|
-
}
|
|
201
|
-
const injected = _sessionLoadFaultHook({ phase, path, attempt });
|
|
202
|
-
if (injected instanceof Error) throw injected;
|
|
203
|
-
}
|
|
204
|
-
|
|
205
178
|
// Only these mean "nothing is at this path right now". Everything else
|
|
206
179
|
// (EACCES, EPERM, EIO, EBUSY, EMFILE, ELOOP, unknown) means a file is very
|
|
207
180
|
// likely THERE and we simply cannot look at it: that must never be reported
|
|
@@ -211,9 +184,8 @@ const ABSENT_CODES = new Set(['ENOENT', 'ENOTDIR']);
|
|
|
211
184
|
|
|
212
185
|
// Observation states: 'present' (signature valid), 'absent' (ENOENT-class),
|
|
213
186
|
// 'unreadable' (persistent/transient failure — fail closed).
|
|
214
|
-
function _observe(path
|
|
187
|
+
function _observe(path) {
|
|
215
188
|
try {
|
|
216
|
-
_fault('stat', path, attempt);
|
|
217
189
|
const info = statSync(path, { bigint: true });
|
|
218
190
|
return {
|
|
219
191
|
state: 'present',
|
|
@@ -314,13 +286,12 @@ function _releaseDocument(entry) {
|
|
|
314
286
|
// from the observation alone — reporting {exists:true, session:null} for a
|
|
315
287
|
// perfectly readable replacement is the same false corruption the retry loop
|
|
316
288
|
// exists to avoid. Uncached: no identity was verified around this read.
|
|
317
|
-
function _decisiveReplacementSnapshot(id, path
|
|
318
|
-
const observed = _observe(path
|
|
289
|
+
function _decisiveReplacementSnapshot(id, path) {
|
|
290
|
+
const observed = _observe(path);
|
|
319
291
|
if (observed.state === 'absent') return { exists: false, session: null };
|
|
320
292
|
if (observed.state !== 'present') return { exists: true, session: null };
|
|
321
293
|
let text = null;
|
|
322
294
|
try {
|
|
323
|
-
_fault('read', path, attempt);
|
|
324
295
|
text = readFileSync(path, 'utf-8');
|
|
325
296
|
} catch (err) {
|
|
326
297
|
const code = err?.code || 'EUNKNOWN';
|
|
@@ -338,7 +309,7 @@ export function _readStoredSessionCached(id, path, { preferInMemory = null } = {
|
|
|
338
309
|
// parsed (if its bytes are readable and ours) or reported as
|
|
339
310
|
// present-but-invalid, never as absence.
|
|
340
311
|
const isFinal = attempt === SESSION_LOAD_STABLE_ATTEMPTS - 1;
|
|
341
|
-
const before = _observe(path
|
|
312
|
+
const before = _observe(path);
|
|
342
313
|
last = before;
|
|
343
314
|
if (before.state !== 'present') {
|
|
344
315
|
// Absent: possibly the unlink → rename hole, retry.
|
|
@@ -386,7 +357,6 @@ export function _readStoredSessionCached(id, path, { preferInMemory = null } = {
|
|
|
386
357
|
let text = null;
|
|
387
358
|
let readCode = null;
|
|
388
359
|
try {
|
|
389
|
-
_fault('read', path, attempt);
|
|
390
360
|
text = readFileSync(path, 'utf-8');
|
|
391
361
|
} catch (err) {
|
|
392
362
|
readCode = err?.code || 'EUNKNOWN';
|
|
@@ -405,10 +375,10 @@ export function _readStoredSessionCached(id, path, { preferInMemory = null } = {
|
|
|
405
375
|
last = { state: 'absent', signature: null, code: readCode };
|
|
406
376
|
// On the last boundary there is no retry left: read the
|
|
407
377
|
// replacement rather than classify it from a bare stat.
|
|
408
|
-
if (isFinal) return _decisiveReplacementSnapshot(id, path
|
|
378
|
+
if (isFinal) return _decisiveReplacementSnapshot(id, path);
|
|
409
379
|
continue;
|
|
410
380
|
}
|
|
411
|
-
const after = _observe(path
|
|
381
|
+
const after = _observe(path);
|
|
412
382
|
if (after.state !== 'present' || after.signature !== before.signature) {
|
|
413
383
|
// A rename landed around the read — these bytes may belong to a
|
|
414
384
|
// different inode than `before`, so they must never be cached
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { hash } from 'node:crypto';
|
|
2
|
+
import { _messagesForDisk, _sessionForDisk } from './serialize.mjs';
|
|
3
|
+
|
|
4
|
+
// ── Delta handoff to the save worker ─────────────────────────────────────────
|
|
5
|
+
// Worker.postMessage structured-clones on the CALLER's thread, so a full-
|
|
6
|
+
// transcript payload per turn cost O(whole conversation) on the engine thread.
|
|
7
|
+
// Turns normally APPEND to the message list (the array is replaced but the
|
|
8
|
+
// settled message objects are reused by reference), so the parent tracks the
|
|
9
|
+
// exact refs last handed to the worker and, on a pure append, ships only the
|
|
10
|
+
// header + projected tail — O(turn). Any prefix change (compaction, clear,
|
|
11
|
+
// repair), a broken chain (failure/restart), or the periodic full resync
|
|
12
|
+
// falls back to a full snapshot. Lock-free and per-id: sessions stay fully
|
|
13
|
+
// parallel and the single worker's per-id FIFO preserves chain order.
|
|
14
|
+
//
|
|
15
|
+
// Unbounded by count (a count cap pushed every save past N concurrent
|
|
16
|
+
// sessions onto the full path): an entry lives until an invalidation, a hard
|
|
17
|
+
// delete or the session's runtime teardown (forgetSessionSaveBaseline).
|
|
18
|
+
//
|
|
19
|
+
// No deep copy of the transcript is kept here: the worker already holds the
|
|
20
|
+
// sent messages. Each sent message is identified by its live reference plus a
|
|
21
|
+
// fingerprint of the projection that was sent, taken once when it was first
|
|
22
|
+
// sent (and again on every periodic resync). Failure evidence is rebuilt from
|
|
23
|
+
// the references only while every fingerprint still matches — an in-place
|
|
24
|
+
// edit since the send makes the parent's evidence unprovable, and none is
|
|
25
|
+
// recorded (the worker's own reply carries the exact attempt when it can).
|
|
26
|
+
const _deltaBaseline = new Map(); // id → { refs: message[], prints: (string|null)[] | null, deltasSinceFull }
|
|
27
|
+
const DELTA_FULL_RESYNC_EVERY = 25;
|
|
28
|
+
|
|
29
|
+
export function _invalidateDeltaBaseline(id) {
|
|
30
|
+
_deltaBaseline.delete(id);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Drop one id's baseline; true when it had one. */
|
|
34
|
+
export function _dropDeltaBaseline(id) {
|
|
35
|
+
return _deltaBaseline.delete(id);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function _clearDeltaBaselines() {
|
|
39
|
+
_deltaBaseline.clear();
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** Read-only inspector: does the parent still hold a delta baseline for `id`? */
|
|
43
|
+
export function _hasSessionSaveBaseline(id) {
|
|
44
|
+
return _deltaBaseline.has(id);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export function _cloneOrNull(value) {
|
|
48
|
+
try {
|
|
49
|
+
return structuredClone(value);
|
|
50
|
+
} catch {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** Fingerprint of one projected (disk-shape) message, or null when it has none. */
|
|
56
|
+
function _messagePrint(message) {
|
|
57
|
+
try {
|
|
58
|
+
return hash('sha1', JSON.stringify(message) ?? 'undefined', 'base64');
|
|
59
|
+
} catch {
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Fingerprints for `diskMessages` (the disk projection of `live`). A message
|
|
66
|
+
* whose live reference is unchanged since `prev` keeps the fingerprint taken
|
|
67
|
+
* when it was first sent; only changed/new messages are fingerprinted.
|
|
68
|
+
*/
|
|
69
|
+
function _printMessages(live, diskMessages, prev) {
|
|
70
|
+
const reuse = new Map();
|
|
71
|
+
if (prev?.prints) {
|
|
72
|
+
for (let index = 0; index < prev.refs.length; index += 1) reuse.set(prev.refs[index], prev.prints[index]);
|
|
73
|
+
}
|
|
74
|
+
return diskMessages.map((message, index) =>
|
|
75
|
+
reuse.has(live[index]) ? reuse.get(live[index]) : _messagePrint(message)
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/**
|
|
80
|
+
* What one attempt sent, without copying the transcript: a detached copy of
|
|
81
|
+
* the (small) header, the live message references and their fingerprints.
|
|
82
|
+
*/
|
|
83
|
+
function _attemptRecord(header, refs, prints) {
|
|
84
|
+
if (!prints) return null;
|
|
85
|
+
const detached = _cloneOrNull({ ...header, messages: [] });
|
|
86
|
+
return detached ? { header: detached, refs, prints } : null;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Failure evidence for one attempt, rebuilt from its references only while
|
|
91
|
+
* every message still projects to exactly what was sent; otherwise none.
|
|
92
|
+
* (_recordSaveFailure detaches whatever it keeps.)
|
|
93
|
+
*/
|
|
94
|
+
export function _attemptEvidence(attempt) {
|
|
95
|
+
if (!attempt) return null;
|
|
96
|
+
const messages = _messagesForDisk(attempt.refs);
|
|
97
|
+
for (let index = 0; index < messages.length; index += 1) {
|
|
98
|
+
const print = attempt.prints[index];
|
|
99
|
+
if (print === null || _messagePrint(messages[index]) !== print) return null;
|
|
100
|
+
}
|
|
101
|
+
return { ...attempt.header, messages };
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function _isPureAppend(refs, live) {
|
|
105
|
+
if (live.length < refs.length) return false;
|
|
106
|
+
for (let index = 0; index < refs.length; index += 1) {
|
|
107
|
+
if (live[index] !== refs[index]) return false;
|
|
108
|
+
}
|
|
109
|
+
return true;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export function _buildWirePayload(id, session, forceFull = false) {
|
|
113
|
+
const live = Array.isArray(session.messages) ? session.messages : [];
|
|
114
|
+
const base = forceFull ? null : _deltaBaseline.get(id);
|
|
115
|
+
const resyncDue = !base || base.deltasSinceFull >= DELTA_FULL_RESYNC_EVERY;
|
|
116
|
+
if (!resyncDue && _isPureAppend(base.refs, live)) {
|
|
117
|
+
// Header: full disk projection with an empty message list (strips
|
|
118
|
+
// transient aliases); tail: per-message projection of the appended
|
|
119
|
+
// suffix only. Both use the same idempotent per-message projection
|
|
120
|
+
// as a full send, so worker-side reconstruction is byte-identical.
|
|
121
|
+
const header = _sessionForDisk({ ...session, messages: [] });
|
|
122
|
+
const tailMessages = _messagesForDisk(live.slice(base.refs.length));
|
|
123
|
+
// The EXACT payload the worker will reconstruct and write is the sent
|
|
124
|
+
// baseline + this delta. Its evidence is fingerprint-checked against
|
|
125
|
+
// what was sent, never a fresh projection of the mutable live session
|
|
126
|
+
// (an in-place nested edit of an already-sent message is NOT part of a
|
|
127
|
+
// reference-identity delta). Only the tail is fingerprinted.
|
|
128
|
+
const prints = base.prints ? base.prints.concat(tailMessages.map(_messagePrint)) : null;
|
|
129
|
+
const refs = live.slice();
|
|
130
|
+
_deltaBaseline.set(id, { refs, deltasSinceFull: base.deltasSinceFull + 1, prints });
|
|
131
|
+
return {
|
|
132
|
+
delta: { baseCount: base.refs.length, header, tailMessages },
|
|
133
|
+
attempt: _attemptRecord(header, refs, prints),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
const full = _sessionForDisk(session);
|
|
137
|
+
const diskMessages = Array.isArray(full.messages) ? full.messages : [];
|
|
138
|
+
// A prefix change (compaction, edit, repair) keeps the fingerprints of
|
|
139
|
+
// every unchanged message. The periodic resync, a forced full retry and a
|
|
140
|
+
// missing baseline re-fingerprint everything, so in-place nested edits of
|
|
141
|
+
// settled messages become provable evidence again at least every
|
|
142
|
+
// DELTA_FULL_RESYNC_EVERY saves.
|
|
143
|
+
const refs = live.slice();
|
|
144
|
+
const prints = _printMessages(live, diskMessages, resyncDue ? null : base);
|
|
145
|
+
_deltaBaseline.set(id, { refs, deltasSinceFull: 0, prints });
|
|
146
|
+
// (saveSessionAsync normalizes `messages` to an array before any post.)
|
|
147
|
+
return { session: full, attempt: _attemptRecord(full, refs, prints) };
|
|
148
|
+
}
|
|
@@ -13,8 +13,8 @@
|
|
|
13
13
|
* canonical file first. There is deliberately NO env-driven fault
|
|
14
14
|
* configuration: nothing in a production environment can arm this.
|
|
15
15
|
* 2. Conservative reclamation of the store's OWN abandoned scratch files.
|
|
16
|
-
* A failed commit can leave `<id>.json.<hex>.tmp` bytes behind
|
|
17
|
-
*
|
|
16
|
+
* A failed commit can leave `<id>.json.<hex>.tmp` bytes behind, and a
|
|
17
|
+
* swallowed unlink failure would leak them forever. Only paths
|
|
18
18
|
* THIS realm minted and then failed to unlink are retried, and only when
|
|
19
19
|
* they match the store's exact scratch naming. The sessions directory is
|
|
20
20
|
* never scanned: an unregistered scratch file may be the save worker's or
|
|
@@ -74,7 +74,7 @@ export function _registerOrphanSaveTmp(tmp) {
|
|
|
74
74
|
/**
|
|
75
75
|
* Drop a scratch file. Retries the transient win32 codes once, and on final
|
|
76
76
|
* failure registers the path so the bounded sweeper retries it later instead
|
|
77
|
-
* of leaking it
|
|
77
|
+
* of leaking it.
|
|
78
78
|
*/
|
|
79
79
|
export function _discardSaveTmp(tmp) {
|
|
80
80
|
if (!tmp) return true;
|
|
@@ -1,7 +1,14 @@
|
|
|
1
|
-
import { hash } from 'node:crypto';
|
|
2
1
|
import { MessageChannel, Worker } from 'node:worker_threads';
|
|
3
2
|
import { guardedSaveOptions as _guardedSaveOptions } from './write-guards.mjs';
|
|
4
|
-
import { _ensureLifecycleFields
|
|
3
|
+
import { _ensureLifecycleFields } from './serialize.mjs';
|
|
4
|
+
import {
|
|
5
|
+
_attemptEvidence,
|
|
6
|
+
_buildWirePayload,
|
|
7
|
+
_clearDeltaBaselines,
|
|
8
|
+
_cloneOrNull,
|
|
9
|
+
_dropDeltaBaseline,
|
|
10
|
+
_invalidateDeltaBaseline,
|
|
11
|
+
} from './save-delta.mjs';
|
|
5
12
|
import {
|
|
6
13
|
setLiveSession,
|
|
7
14
|
_recordSaveFailure,
|
|
@@ -46,34 +53,8 @@ let _saveWorkerRefCount = 0;
|
|
|
46
53
|
let _deferredSaveReqId = 0;
|
|
47
54
|
export const _deferredSessionSaves = new Map();
|
|
48
55
|
|
|
49
|
-
//
|
|
50
|
-
|
|
51
|
-
// transcript payload per turn cost O(whole conversation) on the engine thread.
|
|
52
|
-
// Turns normally APPEND to the message list (the array is replaced but the
|
|
53
|
-
// settled message objects are reused by reference), so the parent tracks the
|
|
54
|
-
// exact refs last handed to the worker and, on a pure append, ships only the
|
|
55
|
-
// header + projected tail — O(turn). Any prefix change (compaction, clear,
|
|
56
|
-
// repair), a broken chain (failure/restart), or the periodic full resync
|
|
57
|
-
// falls back to a full snapshot. Lock-free and per-id: sessions stay fully
|
|
58
|
-
// parallel and the single worker's per-id FIFO preserves chain order.
|
|
59
|
-
//
|
|
60
|
-
// Unbounded by count (a count cap pushed every save past N concurrent
|
|
61
|
-
// sessions onto the full path): an entry lives until an invalidation, a hard
|
|
62
|
-
// delete or the session's runtime teardown (forgetSessionSaveBaseline).
|
|
63
|
-
//
|
|
64
|
-
// No deep copy of the transcript is kept here: the worker already holds the
|
|
65
|
-
// sent messages. Each sent message is identified by its live reference plus a
|
|
66
|
-
// fingerprint of the projection that was sent, taken once when it was first
|
|
67
|
-
// sent (and again on every periodic resync). Failure evidence is rebuilt from
|
|
68
|
-
// the references only while every fingerprint still matches — an in-place
|
|
69
|
-
// edit since the send makes the parent's evidence unprovable, and none is
|
|
70
|
-
// recorded (the worker's own reply carries the exact attempt when it can).
|
|
71
|
-
const _deltaBaseline = new Map(); // id → { refs: message[], prints: (string|null)[] | null, deltasSinceFull }
|
|
72
|
-
const DELTA_FULL_RESYNC_EVERY = 25;
|
|
73
|
-
|
|
74
|
-
function _invalidateDeltaBaseline(id) {
|
|
75
|
-
_deltaBaseline.delete(id);
|
|
76
|
-
}
|
|
56
|
+
// The parent-side delta baseline and wire-payload builder live in save-delta.mjs.
|
|
57
|
+
export { _hasSessionSaveBaseline } from './save-delta.mjs';
|
|
77
58
|
|
|
78
59
|
/**
|
|
79
60
|
* Release everything the save path retains for a session that went away: the
|
|
@@ -84,7 +65,7 @@ function _invalidateDeltaBaseline(id) {
|
|
|
84
65
|
*/
|
|
85
66
|
export function forgetSessionSaveBaseline(id) {
|
|
86
67
|
if (!id) return false;
|
|
87
|
-
const had =
|
|
68
|
+
const had = _dropDeltaBaseline(id);
|
|
88
69
|
if (_saveWorker) {
|
|
89
70
|
try {
|
|
90
71
|
_saveWorker.postMessage({ __forgetBase: String(id) });
|
|
@@ -95,114 +76,6 @@ export function forgetSessionSaveBaseline(id) {
|
|
|
95
76
|
return had;
|
|
96
77
|
}
|
|
97
78
|
|
|
98
|
-
/** Read-only inspector: does the parent still hold a delta baseline for `id`? */
|
|
99
|
-
export function _hasSessionSaveBaseline(id) {
|
|
100
|
-
return _deltaBaseline.has(id);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
function _cloneOrNull(value) {
|
|
104
|
-
try {
|
|
105
|
-
return structuredClone(value);
|
|
106
|
-
} catch {
|
|
107
|
-
return null;
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/** Fingerprint of one projected (disk-shape) message, or null when it has none. */
|
|
112
|
-
function _messagePrint(message) {
|
|
113
|
-
try {
|
|
114
|
-
return hash('sha1', JSON.stringify(message) ?? 'undefined', 'base64');
|
|
115
|
-
} catch {
|
|
116
|
-
return null;
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* Fingerprints for `diskMessages` (the disk projection of `live`). A message
|
|
122
|
-
* whose live reference is unchanged since `prev` keeps the fingerprint taken
|
|
123
|
-
* when it was first sent; only changed/new messages are fingerprinted.
|
|
124
|
-
*/
|
|
125
|
-
function _printMessages(live, diskMessages, prev) {
|
|
126
|
-
const reuse = new Map();
|
|
127
|
-
if (prev?.prints) {
|
|
128
|
-
for (let index = 0; index < prev.refs.length; index += 1) reuse.set(prev.refs[index], prev.prints[index]);
|
|
129
|
-
}
|
|
130
|
-
return diskMessages.map((message, index) =>
|
|
131
|
-
reuse.has(live[index]) ? reuse.get(live[index]) : _messagePrint(message)
|
|
132
|
-
);
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* What one attempt sent, without copying the transcript: a detached copy of
|
|
137
|
-
* the (small) header, the live message references and their fingerprints.
|
|
138
|
-
*/
|
|
139
|
-
function _attemptRecord(header, refs, prints) {
|
|
140
|
-
if (!prints) return null;
|
|
141
|
-
const detached = _cloneOrNull({ ...header, messages: [] });
|
|
142
|
-
return detached ? { header: detached, refs, prints } : null;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
/**
|
|
146
|
-
* Failure evidence for one attempt, rebuilt from its references only while
|
|
147
|
-
* every message still projects to exactly what was sent; otherwise none.
|
|
148
|
-
* (_recordSaveFailure detaches whatever it keeps.)
|
|
149
|
-
*/
|
|
150
|
-
function _attemptEvidence(attempt) {
|
|
151
|
-
if (!attempt) return null;
|
|
152
|
-
const messages = _messagesForDisk(attempt.refs);
|
|
153
|
-
for (let index = 0; index < messages.length; index += 1) {
|
|
154
|
-
const print = attempt.prints[index];
|
|
155
|
-
if (print === null || _messagePrint(messages[index]) !== print) return null;
|
|
156
|
-
}
|
|
157
|
-
return { ...attempt.header, messages };
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
function _isPureAppend(refs, live) {
|
|
161
|
-
if (live.length < refs.length) return false;
|
|
162
|
-
for (let index = 0; index < refs.length; index += 1) {
|
|
163
|
-
if (live[index] !== refs[index]) return false;
|
|
164
|
-
}
|
|
165
|
-
return true;
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
function _buildWirePayload(id, session, forceFull = false) {
|
|
169
|
-
const live = Array.isArray(session.messages) ? session.messages : [];
|
|
170
|
-
const base = forceFull ? null : _deltaBaseline.get(id);
|
|
171
|
-
const resyncDue = !base || base.deltasSinceFull >= DELTA_FULL_RESYNC_EVERY;
|
|
172
|
-
if (!resyncDue && _isPureAppend(base.refs, live)) {
|
|
173
|
-
// Header: full disk projection with an empty message list (strips
|
|
174
|
-
// transient aliases); tail: per-message projection of the appended
|
|
175
|
-
// suffix only. Both use the same idempotent per-message projection
|
|
176
|
-
// as a full send, so worker-side reconstruction is byte-identical.
|
|
177
|
-
const header = _sessionForDisk({ ...session, messages: [] });
|
|
178
|
-
const tailMessages = _messagesForDisk(live.slice(base.refs.length));
|
|
179
|
-
// The EXACT payload the worker will reconstruct and write is the sent
|
|
180
|
-
// baseline + this delta. Its evidence is fingerprint-checked against
|
|
181
|
-
// what was sent, never a fresh projection of the mutable live session
|
|
182
|
-
// (an in-place nested edit of an already-sent message is NOT part of a
|
|
183
|
-
// reference-identity delta). Only the tail is fingerprinted.
|
|
184
|
-
const prints = base.prints ? base.prints.concat(tailMessages.map(_messagePrint)) : null;
|
|
185
|
-
const refs = live.slice();
|
|
186
|
-
_deltaBaseline.set(id, { refs, deltasSinceFull: base.deltasSinceFull + 1, prints });
|
|
187
|
-
return {
|
|
188
|
-
delta: { baseCount: base.refs.length, header, tailMessages },
|
|
189
|
-
attempt: _attemptRecord(header, refs, prints),
|
|
190
|
-
};
|
|
191
|
-
}
|
|
192
|
-
const full = _sessionForDisk(session);
|
|
193
|
-
const diskMessages = Array.isArray(full.messages) ? full.messages : [];
|
|
194
|
-
// A prefix change (compaction, edit, repair) keeps the fingerprints of
|
|
195
|
-
// every unchanged message. The periodic resync, a forced full retry and a
|
|
196
|
-
// missing baseline re-fingerprint everything, so in-place nested edits of
|
|
197
|
-
// settled messages become provable evidence again at least every
|
|
198
|
-
// DELTA_FULL_RESYNC_EVERY saves.
|
|
199
|
-
const refs = live.slice();
|
|
200
|
-
const prints = _printMessages(live, diskMessages, resyncDue ? null : base);
|
|
201
|
-
_deltaBaseline.set(id, { refs, deltasSinceFull: 0, prints });
|
|
202
|
-
// (saveSessionAsync normalizes `messages` to an array before any post.)
|
|
203
|
-
return { session: full, attempt: _attemptRecord(full, refs, prints) };
|
|
204
|
-
}
|
|
205
|
-
|
|
206
79
|
// ── Fault-state mirroring (parent → worker) ─────────────────────────────────
|
|
207
80
|
// The worker thread is long-lived and owns its own module instance of
|
|
208
81
|
// save-fault.mjs, which setSessionSaveFault() never reaches, so the parent
|
|
@@ -491,7 +364,7 @@ function _releaseIdleWorker(worker) {
|
|
|
491
364
|
_saveWorker = null;
|
|
492
365
|
_faultSyncedKey = null;
|
|
493
366
|
// Its delta bases go with it: the parent baselines would only miss.
|
|
494
|
-
|
|
367
|
+
_clearDeltaBaselines();
|
|
495
368
|
// Adopts the worker's last commit stamps, then closes the channel.
|
|
496
369
|
connectOwnCommitPeer(null);
|
|
497
370
|
worker.terminate().catch(() => {});
|
|
@@ -558,7 +431,7 @@ function _onWorkerReply(worker, reply) {
|
|
|
558
431
|
function _retireWorkerBookkeeping(err) {
|
|
559
432
|
_saveWorker = null;
|
|
560
433
|
_faultSyncedKey = null;
|
|
561
|
-
|
|
434
|
+
_clearDeltaBaselines();
|
|
562
435
|
for (const [, p] of _saveWorkerPending) {
|
|
563
436
|
_failWorkerWrite(p.id, p.summaryVersion, p.waiters, err, p.epoch, p.incarnation, _attemptEvidence(p.attempt));
|
|
564
437
|
_releaseSessionIncarnation(p.incarnation);
|
|
@@ -884,7 +757,7 @@ export function _resetSaveWorkerBookkeeping() {
|
|
|
884
757
|
_saveAsyncQueued.clear();
|
|
885
758
|
_saveAsyncInflight.clear();
|
|
886
759
|
_saveWorkerRefCount = 0;
|
|
887
|
-
|
|
760
|
+
_clearDeltaBaselines();
|
|
888
761
|
}
|
|
889
762
|
|
|
890
763
|
const _noopSettle = () => {};
|
|
@@ -155,9 +155,9 @@ export function _queueSummaryIndexPrune(ids) {
|
|
|
155
155
|
}
|
|
156
156
|
|
|
157
157
|
// ── Incremental storage scan ────────────────────────────────────────────────
|
|
158
|
-
// refreshFromStorage
|
|
159
|
-
// multi-MB files) on each desktop sidebar refresh
|
|
160
|
-
// its file changes, so key a per-file row cache on (mtimeMs, size): unchanged
|
|
158
|
+
// A refreshFromStorage that re-parsed EVERY session JSON (full transcripts,
|
|
159
|
+
// multi-MB files) on each desktop sidebar refresh would be far too costly. A
|
|
160
|
+
// summary only changes when its file changes, so key a per-file row cache on (mtimeMs, size): unchanged
|
|
161
161
|
// files reuse the cached row, changed/new files re-parse, vanished files drop
|
|
162
162
|
// out. Storage stays the truth source — the sidecar index is never trusted.
|
|
163
163
|
const _summaryScanCache = new Map(); // filename → { mtimeMs, size, row|null }
|
|
@@ -20,8 +20,10 @@ function* sweepStaleSessionSteps(ttlMs, options = {}) {
|
|
|
20
20
|
const dir = getStoreDir();
|
|
21
21
|
// An unreadable store dir is not an empty one: sweeping (deleting,
|
|
22
22
|
// closing, pruning) on a probe we could not make is never allowed.
|
|
23
|
-
if (probePath(dir).state !== PROBE_PRESENT)
|
|
24
|
-
|
|
23
|
+
if (probePath(dir).state !== PROBE_PRESENT) {
|
|
24
|
+
const { openCandidates: _candidates, ...empty } = createSweepTally();
|
|
25
|
+
return empty;
|
|
26
|
+
}
|
|
25
27
|
const rows = collectSweepRows(dir);
|
|
26
28
|
pruneSweepRecordCache(new Set(rows.map((row) => row?.id).filter(Boolean)));
|
|
27
29
|
const ctx = { plan, dir, now: Date.now(), tally: createSweepTally() };
|
|
@@ -5,7 +5,7 @@ import { readdirSync, unlinkSync } from 'node:fs';
|
|
|
5
5
|
import { join } from 'node:path';
|
|
6
6
|
import { probePath, PROBE_PRESENT, PROBE_ABSENT } from '../fs-probe.mjs';
|
|
7
7
|
import { _queueSummaryIndexPrune } from '../summary-cache.mjs';
|
|
8
|
-
import { deleteSession } from '
|
|
8
|
+
import { deleteSession } from '../session-delete.mjs';
|
|
9
9
|
|
|
10
10
|
/** Retention cap: prune resumable open (non-tombstone) sessions newest-first
|
|
11
11
|
* — keep the most recent openMaxCount, prune anything older than openMaxAgeMs
|
|
@@ -8,11 +8,12 @@ import { readFileSync } from 'node:fs';
|
|
|
8
8
|
import { join } from 'node:path';
|
|
9
9
|
import { isAgentOwner } from '../../../agent-owner.mjs';
|
|
10
10
|
import { readTopLevelLifecycleRecord, isLifecycleUnreadable } from '../../lifecycle-scan.mjs';
|
|
11
|
-
import { resolveAgentTerminalReapMs } from '
|
|
11
|
+
import { resolveAgentTerminalReapMs } from '../../../runtime-core/config-helpers.mjs';
|
|
12
12
|
import { sessionPath } from '../paths-heartbeat.mjs';
|
|
13
13
|
import { probePath, PROBE_PRESENT, PROBE_ABSENT } from '../fs-probe.mjs';
|
|
14
14
|
import { _queueSessionSummaryUpsert, _queueSessionSummaryRemoval } from '../summary-cache.mjs';
|
|
15
|
-
import { deleteSession
|
|
15
|
+
import { deleteSession } from '../session-delete.mjs';
|
|
16
|
+
import { markSessionClosed } from '../lifecycle-barriers.mjs';
|
|
16
17
|
import {
|
|
17
18
|
AGENT_TERMINAL_STATUSES,
|
|
18
19
|
BLANK_SCRATCH_MAX_AGE_MS,
|
|
@@ -12,6 +12,8 @@ import {
|
|
|
12
12
|
statSessionStamp as _statSessionStamp,
|
|
13
13
|
sameSessionStamp as _sameSessionStamp,
|
|
14
14
|
} from './canonical-reader.mjs';
|
|
15
|
+
import { isCancelledWrite as _isCancelledWrite } from './write-guards.mjs';
|
|
16
|
+
import { _setSessionWriteAuthorityCheck } from './save-worker.mjs';
|
|
15
17
|
|
|
16
18
|
const _observeStamp = (target) => {
|
|
17
19
|
try {
|
|
@@ -48,8 +50,6 @@ function _writeAuthorityRecord(target, attempt) {
|
|
|
48
50
|
}
|
|
49
51
|
return record;
|
|
50
52
|
}
|
|
51
|
-
import { isCancelledWrite as _isCancelledWrite } from './write-guards.mjs';
|
|
52
|
-
import { _setSessionWriteAuthorityCheck } from './save-worker.mjs';
|
|
53
53
|
|
|
54
54
|
/**
|
|
55
55
|
* Write admission for ONE save attempt. Consulted upfront, after the scratch
|
|
@@ -66,11 +66,9 @@ import { _setSessionWriteAuthorityCheck } from './save-worker.mjs';
|
|
|
66
66
|
* record just because it carries no
|
|
67
67
|
* expectedGeneration;
|
|
68
68
|
* ours → apply the generation rules below.
|
|
69
|
-
* NOTHING is exempt
|
|
70
|
-
*
|
|
71
|
-
*
|
|
72
|
-
* it would have been able to skip the absent-vs-owned-vs-ambiguous check
|
|
73
|
-
* entirely — the exact hole this guard exists to close.
|
|
69
|
+
* NOTHING is exempt: there is no opt-out that skips the absent-vs-owned-vs-
|
|
70
|
+
* ambiguous check (the lifecycle barriers write the canonical file themselves,
|
|
71
|
+
* under their own authority read).
|
|
74
72
|
*/
|
|
75
73
|
export function _shouldDrop(id, opts, attempt = null) {
|
|
76
74
|
if (_isCancelledWrite(opts)) return true;
|
|
@@ -113,22 +111,11 @@ export function _shouldDrop(id, opts, attempt = null) {
|
|
|
113
111
|
return generation > expected;
|
|
114
112
|
}
|
|
115
113
|
|
|
116
|
-
//
|
|
117
|
-
//
|
|
118
|
-
// write,
|
|
119
|
-
// rewrite inside one clock tick — a generation bump such as 1 → 2 — so no
|
|
120
|
-
// memo keys on them. The only reuse is this realm's OWN last rename, stamped
|
|
121
|
-
// { dev, ino, size, mtimeNs, ctimeNs } right after the commit and verified to
|
|
122
|
-
// be our inode: every writer replaces the file by rename (new inode, new
|
|
123
|
-
// ctime), so any foreign replacement misses the stamp and is re-read and
|
|
124
|
-
// strictly parsed exactly as before.
|
|
125
|
-
//
|
|
126
|
-
// Three distinct outcomes, never collapsed: `null` = no file (write freely),
|
|
127
|
-
// LIFECYCLE_AMBIGUOUS = a file exists but its bytes cannot be trusted (refuse
|
|
128
|
-
// the write), otherwise the strict record itself ({ doc, id, closed,
|
|
114
|
+
// Three distinct read outcomes, never collapsed: `null` = no file (write
|
|
115
|
+
// freely), LIFECYCLE_AMBIGUOUS = a file exists but its bytes cannot be trusted
|
|
116
|
+
// (refuse the write), otherwise the strict record itself ({ doc, id, closed,
|
|
129
117
|
// generation }) — the single disk authority shared by the save guard and the
|
|
130
|
-
// lifecycle barriers.
|
|
131
|
-
// Full lifecycle barriers still parse a private document.
|
|
118
|
+
// lifecycle barriers. Stamp-keyed reuse lives in canonical-reader.mjs.
|
|
132
119
|
|
|
133
120
|
// Pre-admission authority for the async/worker path (registered here because
|
|
134
121
|
// save-worker.mjs cannot import this module back). A refusal keeps the caller
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
import { readFileSync } from 'node:fs';
|
|
13
13
|
import { join } from 'node:path';
|
|
14
14
|
import { probePath, PROBE_PRESENT } from './store/fs-probe.mjs';
|
|
15
|
+
import { readJsonProjection } from '../../../shared/pending-json-projection.mjs';
|
|
15
16
|
import { listStoredAgentWorkers as assembleStoredAgentWorkers } from './store-agent-worker-pool.mjs';
|
|
16
17
|
import {
|
|
17
18
|
TAG_TOMBSTONE_TTL_MS,
|
|
@@ -162,8 +163,12 @@ function preferUnconfirmedCancel(a, b) {
|
|
|
162
163
|
}
|
|
163
164
|
|
|
164
165
|
function storedAgentWorkerIndex() {
|
|
166
|
+
const path = storedAgentWorkerIndexPath();
|
|
167
|
+
// This process's own queued (not yet persisted) writes win over the file.
|
|
168
|
+
const projected = readJsonProjection(path);
|
|
169
|
+
if (projected) return projected;
|
|
165
170
|
try {
|
|
166
|
-
return JSON.parse(readFileSync(
|
|
171
|
+
return JSON.parse(readFileSync(path, 'utf8'));
|
|
167
172
|
} catch {
|
|
168
173
|
return null;
|
|
169
174
|
}
|
|
@@ -405,11 +410,14 @@ function promoteHeartbeatSidecar(bySessionId, sessionId, heartbeatAt) {
|
|
|
405
410
|
}
|
|
406
411
|
|
|
407
412
|
function storedLeadWorkerRows() {
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
+
const path = storedLeadWorkerIndexPath();
|
|
414
|
+
let parsed = readJsonProjection(path);
|
|
415
|
+
if (!parsed) {
|
|
416
|
+
try {
|
|
417
|
+
parsed = JSON.parse(readFileSync(path, 'utf8'));
|
|
418
|
+
} catch {
|
|
419
|
+
/* no resident Lead pool */
|
|
420
|
+
}
|
|
413
421
|
}
|
|
414
422
|
return workerRows(parsed);
|
|
415
423
|
}
|