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
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
// Per-send callback instrumentation for sendWithRecovery: bench-only turn
|
|
2
|
+
// timing, the loop-side exposure witness and the retry-visibility relay. The
|
|
3
|
+
// wrappers are installed on the caller's opts in place for ONE send, and the
|
|
4
|
+
// returned restore unwinds only our own wrappers.
|
|
5
|
+
import { isVisibleStreamProgress } from '../../../shared/stream-progress.mjs';
|
|
6
|
+
|
|
7
|
+
// Bench-only turn timing (MIXDOG_TURN_TIMING=1): one stderr line per
|
|
8
|
+
// provider request — TTFT (first visible model progress) and total stream
|
|
9
|
+
// time. Transport/header and response-created acknowledgements do not count.
|
|
10
|
+
// Inert unless the env flag is set; used to profile harness vs model
|
|
11
|
+
// latency in Terminal-Bench runs.
|
|
12
|
+
function beginTurnTiming(opts, model) {
|
|
13
|
+
const turnT0 = process.env.MIXDOG_TURN_TIMING === '1' ? Date.now() : 0;
|
|
14
|
+
if (!turnT0) return { timedOpts: opts, log() {} };
|
|
15
|
+
let turnFirstDelta = 0;
|
|
16
|
+
const prevDelta = typeof opts?.onStreamDelta === 'function' ? opts.onStreamDelta : null;
|
|
17
|
+
const timedOpts = {
|
|
18
|
+
...(opts || {}),
|
|
19
|
+
onStreamDelta: (kind) => {
|
|
20
|
+
if (!turnFirstDelta && isVisibleStreamProgress(kind)) turnFirstDelta = Date.now();
|
|
21
|
+
if (prevDelta) prevDelta(kind);
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
return {
|
|
25
|
+
timedOpts,
|
|
26
|
+
log(status) {
|
|
27
|
+
const now = Date.now();
|
|
28
|
+
const ttft = turnFirstDelta ? turnFirstDelta - turnT0 : -1;
|
|
29
|
+
try {
|
|
30
|
+
console.error(`[turn-timing] status=${status} ttft=${ttft}ms total=${now - turnT0}ms model=${model}`);
|
|
31
|
+
} catch {
|
|
32
|
+
/* logging must never break the send path */
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// Retry visibility (reference parity). codex surfaces EVERY stream retry to
|
|
39
|
+
// the front-end ("Reconnecting... n/max") precisely so a replayed request
|
|
40
|
+
// cannot read as ordinary thinking; gemini-cli requires an onRetry hook for
|
|
41
|
+
// the same reason. Emitting the reconnect stage only for the backoff wait
|
|
42
|
+
// let the replayed send report plain 'requesting'/'streaming' again, so
|
|
43
|
+
// three stalled retries rendered as ~20 minutes of a normal spinner with
|
|
44
|
+
// nothing to explain it. Hold the reconnect stage across the whole replay
|
|
45
|
+
// until THIS attempt shows visible progress: the replacement stream's first
|
|
46
|
+
// visible delta ends the reconnect display, and from that point the turn is
|
|
47
|
+
// healthy and must read as a normal response.
|
|
48
|
+
function retryVisibilityWrappers(opts, timedOpts, retryAttemptNumber, retryMaxForDisplay) {
|
|
49
|
+
const prevOnStageChange = typeof opts?.onStageChange === 'function' ? opts.onStageChange : null;
|
|
50
|
+
const prevOptsOnStreamDelta = typeof opts?.onStreamDelta === 'function' ? opts.onStreamDelta : null;
|
|
51
|
+
const retryDeltaBase = timedOpts || opts;
|
|
52
|
+
const prevOnStreamDeltaForRetry =
|
|
53
|
+
typeof retryDeltaBase?.onStreamDelta === 'function' ? retryDeltaBase.onStreamDelta : null;
|
|
54
|
+
const wrappers = {
|
|
55
|
+
onStageChange: null,
|
|
56
|
+
onStreamDelta: null,
|
|
57
|
+
prevOnStageChange,
|
|
58
|
+
prevOptsOnStreamDelta,
|
|
59
|
+
prevOnStreamDeltaForRetry,
|
|
60
|
+
};
|
|
61
|
+
if (!(retryAttemptNumber > 0 && prevOnStageChange)) return wrappers;
|
|
62
|
+
let progressObserved = false;
|
|
63
|
+
wrappers.onStageChange = (stage, detail) => {
|
|
64
|
+
if (!progressObserved && (stage === 'requesting' || stage === 'streaming')) {
|
|
65
|
+
return prevOnStageChange('reconnecting', {
|
|
66
|
+
...(detail && typeof detail === 'object' ? detail : {}),
|
|
67
|
+
attempt: retryAttemptNumber,
|
|
68
|
+
max: retryMaxForDisplay,
|
|
69
|
+
message: `Reconnecting... ${retryAttemptNumber}/${retryMaxForDisplay}`,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
return prevOnStageChange(stage, detail);
|
|
73
|
+
};
|
|
74
|
+
wrappers.onStreamDelta = (kind, ...rest) => {
|
|
75
|
+
if (!progressObserved && isVisibleStreamProgress(kind)) {
|
|
76
|
+
progressObserved = true;
|
|
77
|
+
try {
|
|
78
|
+
prevOnStageChange('streaming', { recoveredAfterRetry: retryAttemptNumber });
|
|
79
|
+
} catch {
|
|
80
|
+
/* display-only */
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return prevOnStreamDeltaForRetry?.(kind, ...rest);
|
|
84
|
+
};
|
|
85
|
+
return wrappers;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Wraps the caller's stream callbacks in place for ONE send — bench-only
|
|
89
|
+
// turn timing, the loop-side exposure witness and the retry-visibility
|
|
90
|
+
// relay — and hands back the restore that unwinds only our own wrappers.
|
|
91
|
+
export function instrumentSendCallbacks(opts, { model, retryAttemptNumber, retryMaxForDisplay }) {
|
|
92
|
+
const timing = beginTurnTiming(opts, model);
|
|
93
|
+
const { timedOpts } = timing;
|
|
94
|
+
// Loop-side exposure witness. Some providers throw truncation/stall
|
|
95
|
+
// errors that carry only partialContent — neither liveTextEmitted nor
|
|
96
|
+
// unsafeToRetry — so an outcome read from the ERROR alone can report
|
|
97
|
+
// replaySafe even though this very send already relayed text to the
|
|
98
|
+
// client through opts.onTextDelta, or dispatched a tool call through
|
|
99
|
+
// opts.onToolCall. Replaying such a send would duplicate output the user
|
|
100
|
+
// already saw (or re-run a side effect), so record what THIS send
|
|
101
|
+
// actually exposed and merge it into every outcome read. The callbacks
|
|
102
|
+
// are wrapped in place and restored conditionally: the overflow-retry
|
|
103
|
+
// branch intentionally clears opts.onToolCall, and that clear must
|
|
104
|
+
// survive the restore.
|
|
105
|
+
const witness = relayWitnessWrappers(opts);
|
|
106
|
+
const retry = retryVisibilityWrappers(opts, timedOpts, retryAttemptNumber, retryMaxForDisplay);
|
|
107
|
+
const install = (target) => {
|
|
108
|
+
if (witness.onTextDelta) target.onTextDelta = witness.onTextDelta;
|
|
109
|
+
if (witness.onToolCall) target.onToolCall = witness.onToolCall;
|
|
110
|
+
if (witness.onTextReset) target.onTextReset = witness.onTextReset;
|
|
111
|
+
if (retry.onStageChange) target.onStageChange = retry.onStageChange;
|
|
112
|
+
if (retry.onStreamDelta) target.onStreamDelta = retry.onStreamDelta;
|
|
113
|
+
};
|
|
114
|
+
if (opts) install(opts);
|
|
115
|
+
if (timedOpts !== opts && timedOpts) install(timedOpts);
|
|
116
|
+
return {
|
|
117
|
+
timedOpts,
|
|
118
|
+
relayWitness: witness.relayWitness,
|
|
119
|
+
logTurnTiming: timing.log,
|
|
120
|
+
restore: () => restoreSendCallbacks(opts, timedOpts, witness, retry),
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Wraps opts.onTextDelta / opts.onToolCall / opts.onTextReset so the witness
|
|
125
|
+
// records what this send actually put on screen and dispatched: the relayed
|
|
126
|
+
// text net of acknowledged retractions (a provider's own non-streaming
|
|
127
|
+
// fallback retracts through the same callback), and the ids of dispatched
|
|
128
|
+
// calls. Null wrappers where the caller subscribed to nothing.
|
|
129
|
+
function relayWitnessWrappers(opts) {
|
|
130
|
+
const relayWitness = { textEmitted: false, text: '', toolCallsDispatched: 0, dispatchedToolCallIds: new Set() };
|
|
131
|
+
const prevOnTextDelta = typeof opts?.onTextDelta === 'function' ? opts.onTextDelta : null;
|
|
132
|
+
const prevOnToolCall = typeof opts?.onToolCall === 'function' ? opts.onToolCall : null;
|
|
133
|
+
const prevOnTextReset = typeof opts?.onTextReset === 'function' ? opts.onTextReset : null;
|
|
134
|
+
const onTextDelta = prevOnTextDelta
|
|
135
|
+
? (...args) => {
|
|
136
|
+
if (typeof args[0] === 'string' && args[0].length > 0) {
|
|
137
|
+
relayWitness.textEmitted = true;
|
|
138
|
+
relayWitness.text += args[0];
|
|
139
|
+
}
|
|
140
|
+
return prevOnTextDelta(...args);
|
|
141
|
+
}
|
|
142
|
+
: null;
|
|
143
|
+
const onToolCall = prevOnToolCall
|
|
144
|
+
? (...args) => {
|
|
145
|
+
relayWitness.toolCallsDispatched += 1;
|
|
146
|
+
if (args[0]?.id) relayWitness.dispatchedToolCallIds.add(String(args[0].id));
|
|
147
|
+
return prevOnToolCall(...args);
|
|
148
|
+
}
|
|
149
|
+
: null;
|
|
150
|
+
const onTextReset = prevOnTextReset
|
|
151
|
+
? async (...args) => {
|
|
152
|
+
const acked = await prevOnTextReset(...args);
|
|
153
|
+
if (acked === true) {
|
|
154
|
+
const kept = relayWitness.text.length - Math.max(0, Number(args[0]?.chars) || 0);
|
|
155
|
+
relayWitness.text = relayWitness.text.slice(0, Math.max(0, kept));
|
|
156
|
+
if (!relayWitness.text) relayWitness.textEmitted = false;
|
|
157
|
+
}
|
|
158
|
+
return acked;
|
|
159
|
+
}
|
|
160
|
+
: null;
|
|
161
|
+
return {
|
|
162
|
+
relayWitness,
|
|
163
|
+
onTextDelta,
|
|
164
|
+
onToolCall,
|
|
165
|
+
onTextReset,
|
|
166
|
+
prevOnTextDelta,
|
|
167
|
+
prevOnToolCall,
|
|
168
|
+
prevOnTextReset,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Conditional restore: only unwind our own wrappers. An intentional
|
|
173
|
+
// opts.onToolCall = undefined (overflow-retry branch) stays cleared.
|
|
174
|
+
function restoreSendCallbacks(opts, timedOpts, witness, retry) {
|
|
175
|
+
if (opts) {
|
|
176
|
+
if (witness.onTextDelta && opts.onTextDelta === witness.onTextDelta) opts.onTextDelta = witness.prevOnTextDelta;
|
|
177
|
+
if (witness.onToolCall && opts.onToolCall === witness.onToolCall) opts.onToolCall = witness.prevOnToolCall;
|
|
178
|
+
if (witness.onTextReset && opts.onTextReset === witness.onTextReset) opts.onTextReset = witness.prevOnTextReset;
|
|
179
|
+
if (retry.onStageChange && opts.onStageChange === retry.onStageChange) {
|
|
180
|
+
opts.onStageChange = retry.prevOnStageChange;
|
|
181
|
+
}
|
|
182
|
+
if (retry.onStreamDelta && opts.onStreamDelta === retry.onStreamDelta) {
|
|
183
|
+
opts.onStreamDelta = retry.prevOptsOnStreamDelta;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
if (timedOpts && timedOpts !== opts) {
|
|
187
|
+
if (retry.onStageChange && timedOpts.onStageChange === retry.onStageChange) {
|
|
188
|
+
timedOpts.onStageChange = retry.prevOnStageChange;
|
|
189
|
+
}
|
|
190
|
+
if (retry.onStreamDelta && timedOpts.onStreamDelta === retry.onStreamDelta) {
|
|
191
|
+
timedOpts.onStreamDelta = retry.prevOnStreamDeltaForRetry;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
@@ -39,7 +39,7 @@ import { resolveWorkerCompactPolicy } from './loop/compact-policy.mjs';
|
|
|
39
39
|
import { agentContextOverflowError } from './loop/context-overflow.mjs';
|
|
40
40
|
import { estimateMessagesTokensSafe } from './loop/compact-debug.mjs';
|
|
41
41
|
import { isOutputLimitStopReason } from './loop/termination.mjs';
|
|
42
|
-
import {
|
|
42
|
+
import { instrumentSendCallbacks } from './send-instrumentation.mjs';
|
|
43
43
|
|
|
44
44
|
function normalizedIncompleteUsage(raw) {
|
|
45
45
|
if (!raw || typeof raw !== 'object') return undefined;
|
|
@@ -119,20 +119,17 @@ const CONNECTION_RETRY_BACKOFF_MS = retryLadderFromEnv('MIXDOG_CONNECTION_RETRY_
|
|
|
119
119
|
// cycles, and each cycle re-enters the provider's ordinary retries (reference:
|
|
120
120
|
// bounded post-exhaustion auto-recovery on a jittered 15/30/60/60/60 s
|
|
121
121
|
// schedule).
|
|
122
|
-
const RECOVERY_RETRY_BACKOFF_MS = retryLadderFromEnv(
|
|
123
|
-
|
|
124
|
-
30_000,
|
|
125
|
-
|
|
126
|
-
60_000,
|
|
127
|
-
60_000,
|
|
128
|
-
]);
|
|
122
|
+
const RECOVERY_RETRY_BACKOFF_MS = retryLadderFromEnv(
|
|
123
|
+
'MIXDOG_RECOVERY_RETRY_BACKOFF_MS',
|
|
124
|
+
[15_000, 30_000, 60_000, 60_000, 60_000]
|
|
125
|
+
);
|
|
129
126
|
|
|
130
127
|
// A server-advised wait (Retry-After) replaces the ladder step: a provider that
|
|
131
128
|
// names its own cooldown knows better, within reason — one loop-level wait
|
|
132
129
|
// never parks longer than this.
|
|
133
130
|
const LOOP_RETRY_AFTER_CAP_MS = 120_000;
|
|
134
131
|
|
|
135
|
-
// Jittering every backoff by 0.9–1.1
|
|
132
|
+
// Jittering every backoff by 0.9–1.1 means parallel workers that lose the
|
|
136
133
|
// same uplink do not resume in lockstep; our provider layers already jitter
|
|
137
134
|
// (10% WS / 20% shared), this brings the loop ladder in line.
|
|
138
135
|
const TRANSPORT_RETRY_JITTER_RATIO = 0.1;
|
|
@@ -234,195 +231,6 @@ export async function sendWithRecovery(ctx) {
|
|
|
234
231
|
}
|
|
235
232
|
}
|
|
236
233
|
|
|
237
|
-
// Bench-only turn timing (MIXDOG_TURN_TIMING=1): one stderr line per
|
|
238
|
-
// provider request — TTFT (first visible model progress) and total stream
|
|
239
|
-
// time. Transport/header and response-created acknowledgements do not count.
|
|
240
|
-
// Inert unless the env flag is set; used to profile harness vs model
|
|
241
|
-
// latency in Terminal-Bench runs.
|
|
242
|
-
function beginTurnTiming(opts, model) {
|
|
243
|
-
const turnT0 = process.env.MIXDOG_TURN_TIMING === '1' ? Date.now() : 0;
|
|
244
|
-
if (!turnT0) return { timedOpts: opts, log() {} };
|
|
245
|
-
let turnFirstDelta = 0;
|
|
246
|
-
const prevDelta = typeof opts?.onStreamDelta === 'function' ? opts.onStreamDelta : null;
|
|
247
|
-
const timedOpts = {
|
|
248
|
-
...(opts || {}),
|
|
249
|
-
onStreamDelta: (kind) => {
|
|
250
|
-
if (!turnFirstDelta && isVisibleStreamProgress(kind)) turnFirstDelta = Date.now();
|
|
251
|
-
if (prevDelta) prevDelta(kind);
|
|
252
|
-
},
|
|
253
|
-
};
|
|
254
|
-
return {
|
|
255
|
-
timedOpts,
|
|
256
|
-
log(status) {
|
|
257
|
-
const now = Date.now();
|
|
258
|
-
const ttft = turnFirstDelta ? turnFirstDelta - turnT0 : -1;
|
|
259
|
-
try {
|
|
260
|
-
console.error(`[turn-timing] status=${status} ttft=${ttft}ms total=${now - turnT0}ms model=${model}`);
|
|
261
|
-
} catch {
|
|
262
|
-
/* logging must never break the send path */
|
|
263
|
-
}
|
|
264
|
-
},
|
|
265
|
-
};
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
// Retry visibility (reference parity). codex surfaces EVERY stream retry to
|
|
269
|
-
// the front-end ("Reconnecting... n/max") precisely so a replayed request
|
|
270
|
-
// cannot read as ordinary thinking; gemini-cli requires an onRetry hook for
|
|
271
|
-
// the same reason. Emitting the reconnect stage only for the backoff wait
|
|
272
|
-
// let the replayed send report plain 'requesting'/'streaming' again, so
|
|
273
|
-
// three stalled retries rendered as ~20 minutes of a normal spinner with
|
|
274
|
-
// nothing to explain it. Hold the reconnect stage across the whole replay
|
|
275
|
-
// until THIS attempt shows visible progress: the replacement stream's first
|
|
276
|
-
// visible delta ends the reconnect display, and from that point the turn is
|
|
277
|
-
// healthy and must read as a normal response.
|
|
278
|
-
function retryVisibilityWrappers(opts, timedOpts, retryAttemptNumber, retryMaxForDisplay) {
|
|
279
|
-
const prevOnStageChange = typeof opts?.onStageChange === 'function' ? opts.onStageChange : null;
|
|
280
|
-
const prevOptsOnStreamDelta = typeof opts?.onStreamDelta === 'function' ? opts.onStreamDelta : null;
|
|
281
|
-
const retryDeltaBase = timedOpts || opts;
|
|
282
|
-
const prevOnStreamDeltaForRetry =
|
|
283
|
-
typeof retryDeltaBase?.onStreamDelta === 'function' ? retryDeltaBase.onStreamDelta : null;
|
|
284
|
-
const wrappers = {
|
|
285
|
-
onStageChange: null,
|
|
286
|
-
onStreamDelta: null,
|
|
287
|
-
prevOnStageChange,
|
|
288
|
-
prevOptsOnStreamDelta,
|
|
289
|
-
prevOnStreamDeltaForRetry,
|
|
290
|
-
};
|
|
291
|
-
if (!(retryAttemptNumber > 0 && prevOnStageChange)) return wrappers;
|
|
292
|
-
let progressObserved = false;
|
|
293
|
-
wrappers.onStageChange = (stage, detail) => {
|
|
294
|
-
if (!progressObserved && (stage === 'requesting' || stage === 'streaming')) {
|
|
295
|
-
return prevOnStageChange('reconnecting', {
|
|
296
|
-
...(detail && typeof detail === 'object' ? detail : {}),
|
|
297
|
-
attempt: retryAttemptNumber,
|
|
298
|
-
max: retryMaxForDisplay,
|
|
299
|
-
message: `Reconnecting... ${retryAttemptNumber}/${retryMaxForDisplay}`,
|
|
300
|
-
});
|
|
301
|
-
}
|
|
302
|
-
return prevOnStageChange(stage, detail);
|
|
303
|
-
};
|
|
304
|
-
wrappers.onStreamDelta = (kind, ...rest) => {
|
|
305
|
-
if (!progressObserved && isVisibleStreamProgress(kind)) {
|
|
306
|
-
progressObserved = true;
|
|
307
|
-
try {
|
|
308
|
-
prevOnStageChange('streaming', { recoveredAfterRetry: retryAttemptNumber });
|
|
309
|
-
} catch {
|
|
310
|
-
/* display-only */
|
|
311
|
-
}
|
|
312
|
-
}
|
|
313
|
-
return prevOnStreamDeltaForRetry?.(kind, ...rest);
|
|
314
|
-
};
|
|
315
|
-
return wrappers;
|
|
316
|
-
}
|
|
317
|
-
|
|
318
|
-
// Wraps the caller's stream callbacks in place for ONE send — bench-only
|
|
319
|
-
// turn timing, the loop-side exposure witness and the retry-visibility
|
|
320
|
-
// relay — and hands back the restore that unwinds only our own wrappers.
|
|
321
|
-
function instrumentSendCallbacks(opts, { model, retryAttemptNumber, retryMaxForDisplay }) {
|
|
322
|
-
const timing = beginTurnTiming(opts, model);
|
|
323
|
-
const { timedOpts } = timing;
|
|
324
|
-
// Loop-side exposure witness. Some providers throw truncation/stall
|
|
325
|
-
// errors that carry only partialContent — neither liveTextEmitted nor
|
|
326
|
-
// unsafeToRetry — so an outcome read from the ERROR alone can report
|
|
327
|
-
// replaySafe even though this very send already relayed text to the
|
|
328
|
-
// client through opts.onTextDelta, or dispatched a tool call through
|
|
329
|
-
// opts.onToolCall. Replaying such a send would duplicate output the user
|
|
330
|
-
// already saw (or re-run a side effect), so record what THIS send
|
|
331
|
-
// actually exposed and merge it into every outcome read. The callbacks
|
|
332
|
-
// are wrapped in place and restored conditionally: the overflow-retry
|
|
333
|
-
// branch intentionally clears opts.onToolCall, and that clear must
|
|
334
|
-
// survive the restore.
|
|
335
|
-
const witness = relayWitnessWrappers(opts);
|
|
336
|
-
const retry = retryVisibilityWrappers(opts, timedOpts, retryAttemptNumber, retryMaxForDisplay);
|
|
337
|
-
const install = (target) => {
|
|
338
|
-
if (witness.onTextDelta) target.onTextDelta = witness.onTextDelta;
|
|
339
|
-
if (witness.onToolCall) target.onToolCall = witness.onToolCall;
|
|
340
|
-
if (witness.onTextReset) target.onTextReset = witness.onTextReset;
|
|
341
|
-
if (retry.onStageChange) target.onStageChange = retry.onStageChange;
|
|
342
|
-
if (retry.onStreamDelta) target.onStreamDelta = retry.onStreamDelta;
|
|
343
|
-
};
|
|
344
|
-
if (opts) install(opts);
|
|
345
|
-
if (timedOpts !== opts && timedOpts) install(timedOpts);
|
|
346
|
-
return {
|
|
347
|
-
timedOpts,
|
|
348
|
-
relayWitness: witness.relayWitness,
|
|
349
|
-
logTurnTiming: timing.log,
|
|
350
|
-
restore: () => restoreSendCallbacks(opts, timedOpts, witness, retry),
|
|
351
|
-
};
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
// Wraps opts.onTextDelta / opts.onToolCall / opts.onTextReset so the witness
|
|
355
|
-
// records what this send actually put on screen and dispatched: the relayed
|
|
356
|
-
// text net of acknowledged retractions (a provider's own non-streaming
|
|
357
|
-
// fallback retracts through the same callback), and the ids of dispatched
|
|
358
|
-
// calls. Null wrappers where the caller subscribed to nothing.
|
|
359
|
-
function relayWitnessWrappers(opts) {
|
|
360
|
-
const relayWitness = { textEmitted: false, text: '', toolCallsDispatched: 0, dispatchedToolCallIds: new Set() };
|
|
361
|
-
const prevOnTextDelta = typeof opts?.onTextDelta === 'function' ? opts.onTextDelta : null;
|
|
362
|
-
const prevOnToolCall = typeof opts?.onToolCall === 'function' ? opts.onToolCall : null;
|
|
363
|
-
const prevOnTextReset = typeof opts?.onTextReset === 'function' ? opts.onTextReset : null;
|
|
364
|
-
const onTextDelta = prevOnTextDelta
|
|
365
|
-
? (...args) => {
|
|
366
|
-
if (typeof args[0] === 'string' && args[0].length > 0) {
|
|
367
|
-
relayWitness.textEmitted = true;
|
|
368
|
-
relayWitness.text += args[0];
|
|
369
|
-
}
|
|
370
|
-
return prevOnTextDelta(...args);
|
|
371
|
-
}
|
|
372
|
-
: null;
|
|
373
|
-
const onToolCall = prevOnToolCall
|
|
374
|
-
? (...args) => {
|
|
375
|
-
relayWitness.toolCallsDispatched += 1;
|
|
376
|
-
if (args[0]?.id) relayWitness.dispatchedToolCallIds.add(String(args[0].id));
|
|
377
|
-
return prevOnToolCall(...args);
|
|
378
|
-
}
|
|
379
|
-
: null;
|
|
380
|
-
const onTextReset = prevOnTextReset
|
|
381
|
-
? async (...args) => {
|
|
382
|
-
const acked = await prevOnTextReset(...args);
|
|
383
|
-
if (acked === true) {
|
|
384
|
-
const kept = relayWitness.text.length - Math.max(0, Number(args[0]?.chars) || 0);
|
|
385
|
-
relayWitness.text = relayWitness.text.slice(0, Math.max(0, kept));
|
|
386
|
-
if (!relayWitness.text) relayWitness.textEmitted = false;
|
|
387
|
-
}
|
|
388
|
-
return acked;
|
|
389
|
-
}
|
|
390
|
-
: null;
|
|
391
|
-
return {
|
|
392
|
-
relayWitness,
|
|
393
|
-
onTextDelta,
|
|
394
|
-
onToolCall,
|
|
395
|
-
onTextReset,
|
|
396
|
-
prevOnTextDelta,
|
|
397
|
-
prevOnToolCall,
|
|
398
|
-
prevOnTextReset,
|
|
399
|
-
};
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
// Conditional restore: only unwind our own wrappers. An intentional
|
|
403
|
-
// opts.onToolCall = undefined (overflow-retry branch) stays cleared.
|
|
404
|
-
function restoreSendCallbacks(opts, timedOpts, witness, retry) {
|
|
405
|
-
if (opts) {
|
|
406
|
-
if (witness.onTextDelta && opts.onTextDelta === witness.onTextDelta) opts.onTextDelta = witness.prevOnTextDelta;
|
|
407
|
-
if (witness.onToolCall && opts.onToolCall === witness.onToolCall) opts.onToolCall = witness.prevOnToolCall;
|
|
408
|
-
if (witness.onTextReset && opts.onTextReset === witness.onTextReset) opts.onTextReset = witness.prevOnTextReset;
|
|
409
|
-
if (retry.onStageChange && opts.onStageChange === retry.onStageChange) {
|
|
410
|
-
opts.onStageChange = retry.prevOnStageChange;
|
|
411
|
-
}
|
|
412
|
-
if (retry.onStreamDelta && opts.onStreamDelta === retry.onStreamDelta) {
|
|
413
|
-
opts.onStreamDelta = retry.prevOptsOnStreamDelta;
|
|
414
|
-
}
|
|
415
|
-
}
|
|
416
|
-
if (timedOpts && timedOpts !== opts) {
|
|
417
|
-
if (retry.onStageChange && timedOpts.onStageChange === retry.onStageChange) {
|
|
418
|
-
timedOpts.onStageChange = retry.prevOnStageChange;
|
|
419
|
-
}
|
|
420
|
-
if (retry.onStreamDelta && timedOpts.onStreamDelta === retry.onStreamDelta) {
|
|
421
|
-
timedOpts.onStreamDelta = retry.prevOnStreamDeltaForRetry;
|
|
422
|
-
}
|
|
423
|
-
}
|
|
424
|
-
}
|
|
425
|
-
|
|
426
234
|
function loopTag({ sessionId, nextIteration }) {
|
|
427
235
|
return `sess=${sessionId || 'unknown'} iter=${nextIteration}`;
|
|
428
236
|
}
|
|
@@ -343,13 +343,6 @@ export function createCanonicalSessionReader({
|
|
|
343
343
|
};
|
|
344
344
|
return Object.assign(read, {
|
|
345
345
|
forget,
|
|
346
|
-
/**
|
|
347
|
-
* A strict parse another reader already made of bytes it proved to
|
|
348
|
-
* belong to `stamp` (stat → read → stat, unchanged): cached exactly as
|
|
349
|
-
* this reader's own lifecycle reads are — settled stamps only, reused
|
|
350
|
-
* only while the full stamp is unchanged. Own-commit-only checks never
|
|
351
|
-
* consult it.
|
|
352
|
-
*/
|
|
353
346
|
/**
|
|
354
347
|
* A lifecycle barrier this realm just renamed into place. Barrier
|
|
355
348
|
* rewrites are deliberately NOT own commits (write authority re-reads
|
|
@@ -375,6 +368,13 @@ export function createCanonicalSessionReader({
|
|
|
375
368
|
}
|
|
376
369
|
remember(target, stamp, lifecycle);
|
|
377
370
|
},
|
|
371
|
+
/**
|
|
372
|
+
* A strict parse another reader already made of bytes it proved to
|
|
373
|
+
* belong to `stamp` (stat → read → stat, unchanged): cached exactly as
|
|
374
|
+
* this reader's own lifecycle reads are — settled stamps only, reused
|
|
375
|
+
* only while the full stamp is unchanged. Own-commit-only checks never
|
|
376
|
+
* consult it.
|
|
377
|
+
*/
|
|
378
378
|
rememberStrictVerdict(target, stamp, record) {
|
|
379
379
|
if (!stamp || isLifecycleUnreadable(record) || !settledStamp(stamp, nowNs())) return;
|
|
380
380
|
remember(target, stamp, Object.freeze({ id: record.id, closed: record.closed, generation: record.generation }));
|
|
@@ -20,23 +20,6 @@ const PROBE_UNREADABLE = 'unreadable';
|
|
|
20
20
|
// session load path uses).
|
|
21
21
|
const ABSENT_CODES = new Set(['ENOENT', 'ENOTDIR']);
|
|
22
22
|
|
|
23
|
-
// Deterministic fault seam (tests only): invoked with the path before every
|
|
24
|
-
// stat and every read (`phase` is 'stat' or 'read'); returning an Error makes
|
|
25
|
-
// that syscall fail. Structurally gated — without the explicit test-mode env
|
|
26
|
-
// the hook cannot be installed and an already installed one goes inert.
|
|
27
|
-
const PROBE_FAULT_ENV = 'MIXDOG_SESSION_LOAD_FAULT_HOOKS';
|
|
28
|
-
let _probeFaultHook = null;
|
|
29
|
-
|
|
30
|
-
function _probeFault(path, phase) {
|
|
31
|
-
if (!_probeFaultHook) return;
|
|
32
|
-
if (process.env[PROBE_FAULT_ENV] !== '1') {
|
|
33
|
-
_probeFaultHook = null; // gate revoked after install: stay inert
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
const injected = _probeFaultHook(path, phase);
|
|
37
|
-
if (injected instanceof Error) throw injected;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
23
|
// The absent/unreadable verdict for a failed stat or read.
|
|
41
24
|
function _failureVerdict(err) {
|
|
42
25
|
const code = err?.code || 'EUNKNOWN';
|
|
@@ -49,7 +32,6 @@ function _failureVerdict(err) {
|
|
|
49
32
|
*/
|
|
50
33
|
export function probePath(path) {
|
|
51
34
|
try {
|
|
52
|
-
_probeFault(path, 'stat');
|
|
53
35
|
const info = statSync(path);
|
|
54
36
|
return {
|
|
55
37
|
state: PROBE_PRESENT,
|
|
@@ -75,7 +57,6 @@ export function probePath(path) {
|
|
|
75
57
|
*/
|
|
76
58
|
export function readTextFile(path) {
|
|
77
59
|
try {
|
|
78
|
-
_probeFault(path, 'read');
|
|
79
60
|
return { state: PROBE_PRESENT, text: readFileSync(path, 'utf8'), code: null };
|
|
80
61
|
} catch (err) {
|
|
81
62
|
const { state, code } = _failureVerdict(err);
|
|
@@ -5,11 +5,12 @@
|
|
|
5
5
|
* they bypass the save queue entirely — that is why they live apart from the
|
|
6
6
|
* write pipeline — and both fence late saves through the generation counter.
|
|
7
7
|
*/
|
|
8
|
-
import {
|
|
8
|
+
import { writeFileSync } from 'node:fs';
|
|
9
9
|
import { randomBytes } from 'node:crypto';
|
|
10
10
|
import { join } from 'node:path';
|
|
11
11
|
import { getPluginData } from '../../config.mjs';
|
|
12
|
-
import {
|
|
12
|
+
import { PLUGIN_LOG_MAX_BYTES, PLUGIN_LOG_KEEP_BYTES } from '../../../../../lib/mixdog-debug.cjs';
|
|
13
|
+
import { createAsyncLogAppender } from '../../../../shared/async-log-appender.mjs';
|
|
13
14
|
import { sessionPath, deleteHeartbeat } from './paths-heartbeat.mjs';
|
|
14
15
|
import {
|
|
15
16
|
readCanonicalSessionRecord as _readCanonicalRecord,
|
|
@@ -130,6 +131,13 @@ function _writeLifecycleRecord(id, record, existing, reason) {
|
|
|
130
131
|
// funnels through markSessionClosed. lifeMs = updatedAt-createdAt straddles
|
|
131
132
|
// the tombstone (updatedAt was just set to Date.now()), so it reflects the
|
|
132
133
|
// session's full lifetime including the close turn.
|
|
134
|
+
const closeMetricLog = createAsyncLogAppender({ maxBytes: PLUGIN_LOG_MAX_BYTES, keepBytes: PLUGIN_LOG_KEEP_BYTES });
|
|
135
|
+
|
|
136
|
+
/** Resolves once every queued session-close metric line is written. */
|
|
137
|
+
export function flushSessionCloseMetrics() {
|
|
138
|
+
return closeMetricLog.flush();
|
|
139
|
+
}
|
|
140
|
+
|
|
133
141
|
function _logSessionCloseMetric(id, existing, closedAt, reason) {
|
|
134
142
|
try {
|
|
135
143
|
const dataDir = getPluginData();
|
|
@@ -138,12 +146,11 @@ function _logSessionCloseMetric(id, existing, closedAt, reason) {
|
|
|
138
146
|
const lifeMs = typeof existing.createdAt === 'number' && existing.createdAt > 0 ? closedAt - existing.createdAt : 0;
|
|
139
147
|
const agent = existing.agent || '-';
|
|
140
148
|
const owner = existing.owner || '-';
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
//
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
toolEventsPath,
|
|
149
|
+
// Queued, not written inline: a close must not pay a stat + append (and
|
|
150
|
+
// an occasional rewrite) on the caller's thread. `flushSessionCloseMetrics`
|
|
151
|
+
// lets a caller that tears the data dir down wait for the write.
|
|
152
|
+
closeMetricLog.append(
|
|
153
|
+
join(dataDir, 'tool-events.log'),
|
|
147
154
|
`[${ts}] [session-close] owner=${owner} agent=${agent} reason=${reason} lifeMs=${lifeMs} id=${id}\n`
|
|
148
155
|
);
|
|
149
156
|
} catch {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
// Session listing
|
|
2
|
-
// owns the persistence half
|
|
3
|
-
// the in-flight save
|
|
4
|
-
//
|
|
5
|
-
import { readFileSync, readdirSync
|
|
1
|
+
// Session listing and summary projection (the stale-session sweep is
|
|
2
|
+
// sweep/stale-sweep.mjs); store.mjs owns the persistence half
|
|
3
|
+
// (save/load/close/delete). Both read the in-flight save maps so an
|
|
4
|
+
// unpersisted session still shows up in listings.
|
|
5
|
+
import { readFileSync, readdirSync } from 'node:fs';
|
|
6
6
|
import { Worker } from 'node:worker_threads';
|
|
7
7
|
import { getPluginData } from '../../config.mjs';
|
|
8
8
|
import { getStoreDir } from './paths-heartbeat.mjs';
|
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
_hasUnsettledSummaryOps,
|
|
18
18
|
settleSummaryIndexWrites,
|
|
19
19
|
} from '../store-summary-index.mjs';
|
|
20
|
+
import { applySummaryLogText, readSummaryLogText, summaryIndexStampMs } from '../store-summary-log.mjs';
|
|
20
21
|
import {
|
|
21
22
|
_ensureSummaryCacheDataDir,
|
|
22
23
|
_cachedSummaryRows,
|
|
@@ -27,7 +28,7 @@ import {
|
|
|
27
28
|
} from './summary-cache.mjs';
|
|
28
29
|
import { _saveAsyncQueued, _saveWorkerPending } from './save-worker.mjs';
|
|
29
30
|
import { STORED_SESSION_UNREADABLE, _ensureLifecycleFields, _storedSessionFromFile } from './serialize.mjs';
|
|
30
|
-
import { _savePending } from '
|
|
31
|
+
import { _savePending } from './pending-saves.mjs';
|
|
31
32
|
import { isOrdinarySession } from '../store-summary-visibility.mjs';
|
|
32
33
|
|
|
33
34
|
// Disk mtime of the summary index when the in-memory cache was last refreshed
|
|
@@ -36,10 +37,6 @@ let _summaryIndexMtimeSeen = 0;
|
|
|
36
37
|
let _summaryRebuildWorker = null;
|
|
37
38
|
let _summaryRebuildDataDir = '';
|
|
38
39
|
|
|
39
|
-
// The stale-session sweep lives in store/sweep/ and is re-exported below so
|
|
40
|
-
// importers keep this module as the listing entry point.
|
|
41
|
-
export { sweepStaleSessions, sweepStaleSessionsCooperative } from './sweep/stale-sweep.mjs';
|
|
42
|
-
|
|
43
40
|
export function listStoredSessions(options = {}) {
|
|
44
41
|
const dir = getStoreDir();
|
|
45
42
|
// Only ENOENT/ENOTDIR is absence. An unreadable directory (EACCES/EIO) is
|
|
@@ -138,11 +135,7 @@ function scheduleSessionSummaryIndexRebuild() {
|
|
|
138
135
|
};
|
|
139
136
|
worker.on('message', (message) => {
|
|
140
137
|
if (message?.ok !== true || message.dataDir !== getPluginData() || !Array.isArray(message.rows)) return;
|
|
141
|
-
|
|
142
|
-
_summaryIndexMtimeSeen = statSync(summaryIndexPath()).mtimeMs || 0;
|
|
143
|
-
} catch {
|
|
144
|
-
/* stat only */
|
|
145
|
-
}
|
|
138
|
+
_summaryIndexMtimeSeen = summaryIndexStampMs(summaryIndexPath());
|
|
146
139
|
_setSummaryRowsCache(message.rows);
|
|
147
140
|
});
|
|
148
141
|
worker.on('error', clear);
|
|
@@ -217,15 +210,13 @@ function _warmSummaryRows() {
|
|
|
217
210
|
// never fired for terminal-owned growth). One stat per call; when the
|
|
218
211
|
// index advanced, re-read the cheap index JSON as the new cache base
|
|
219
212
|
// (local optimistic overlays stay applied on top).
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
} catch {
|
|
224
|
-
/* no index yet */
|
|
225
|
-
}
|
|
213
|
+
// Stamp = newest mtime of base + delta log, taken BEFORE the reads so a
|
|
214
|
+
// change landing mid-read is seen again on the next call.
|
|
215
|
+
const diskMtime = summaryIndexStampMs(summaryIndexPath());
|
|
226
216
|
if (diskMtime <= _summaryIndexMtimeSeen) return _cachedSummaryRows().slice();
|
|
227
217
|
try {
|
|
228
|
-
const
|
|
218
|
+
const logText = readSummaryLogText(summaryIndexPath());
|
|
219
|
+
const raw = applySummaryLogText(JSON.parse(readFileSync(summaryIndexPath(), 'utf-8')), logText);
|
|
229
220
|
if (Number(raw?.version) === SESSION_SUMMARY_INDEX_VERSION) {
|
|
230
221
|
_summaryIndexMtimeSeen = diskMtime;
|
|
231
222
|
return _setSummaryRowsCache(_normalizeSummaryIndex(raw).rows).slice();
|
|
@@ -247,6 +238,8 @@ function _coldSummaryRows() {
|
|
|
247
238
|
hasIndex = probe.state === PROBE_PRESENT;
|
|
248
239
|
if (probe.state !== PROBE_PRESENT && probe.state !== PROBE_ABSENT) indexUnreadable = true;
|
|
249
240
|
if (hasIndex) {
|
|
241
|
+
const stampBeforeRead = summaryIndexStampMs(p);
|
|
242
|
+
const logText = readSummaryLogText(p);
|
|
250
243
|
let text;
|
|
251
244
|
try {
|
|
252
245
|
text = readFileSync(p, 'utf-8');
|
|
@@ -259,15 +252,11 @@ function _coldSummaryRows() {
|
|
|
259
252
|
if (code !== 'ENOENT' && code !== 'ENOTDIR') indexUnreadable = true;
|
|
260
253
|
throw err;
|
|
261
254
|
}
|
|
262
|
-
const raw = JSON.parse(text);
|
|
255
|
+
const raw = applySummaryLogText(JSON.parse(text), logText);
|
|
263
256
|
hasIndex = Number(raw?.version) === SESSION_SUMMARY_INDEX_VERSION;
|
|
264
|
-
if (hasIndex) indexedRows = _normalizeSummaryIndex(raw).rows;
|
|
265
257
|
if (hasIndex) {
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
} catch {
|
|
269
|
-
/* stat only */
|
|
270
|
-
}
|
|
258
|
+
indexedRows = _normalizeSummaryIndex(raw).rows;
|
|
259
|
+
_summaryIndexMtimeSeen = stampBeforeRead;
|
|
271
260
|
}
|
|
272
261
|
}
|
|
273
262
|
} catch {
|