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,399 @@
|
|
|
1
|
+
// Optional-sharp image resize / downsample helper: a `read` on an image
|
|
2
|
+
// returns a viewable, budget-bounded image block instead of refusing
|
|
3
|
+
// oversized originals.
|
|
4
|
+
//
|
|
5
|
+
// sharp is a direct runtime dependency. Entry points still degrade to `null`
|
|
6
|
+
// when a platform-native binding cannot load so a damaged install reports the
|
|
7
|
+
// existing bounded fallback instead of crashing the whole daemon. A loaded
|
|
8
|
+
// sharp rejecting the bytes is different: corrupt images must never fall
|
|
9
|
+
// through to raw provider pass-through.
|
|
10
|
+
|
|
11
|
+
import { createHash } from 'node:crypto';
|
|
12
|
+
|
|
13
|
+
// Anthropic inline-image input is capped near 5MB base64 (API rejects on the
|
|
14
|
+
// base64 LENGTH, not raw bytes). IMAGE_TARGET_RAW_SIZE is the raw-byte target
|
|
15
|
+
// that stays under that cap after the 4/3 base64 inflation.
|
|
16
|
+
export const API_IMAGE_MAX_BASE64_SIZE = 5 * 1024 * 1024; // 5 MB
|
|
17
|
+
export const IMAGE_TARGET_RAW_SIZE = (API_IMAGE_MAX_BASE64_SIZE * 3) / 4; // 3.75 MB
|
|
18
|
+
// Vision billing counts 28x28 patches, not bytes: a lossless recompression
|
|
19
|
+
// saves upload but not one token. Dimensions are the only lever, and standard
|
|
20
|
+
// models cap an image at 1568px on its longest edge before processing — pixels
|
|
21
|
+
// sent beyond that are downscaled away server-side, so they cost upload and
|
|
22
|
+
// (until now) an inflated local estimate while the model saw the same picture.
|
|
23
|
+
export const IMAGE_MAX_WIDTH = 1568;
|
|
24
|
+
export const IMAGE_MAX_HEIGHT = 1568;
|
|
25
|
+
// Floor for the shortest edge. Patch tiling rejects a degenerate sub-patch
|
|
26
|
+
// image (the 1x1 PNG an empty render emits) with a hard 400 that fails the
|
|
27
|
+
// whole request, so such an image is scaled UP instead of passed through.
|
|
28
|
+
const IMAGE_MIN_DIMENSION = 200;
|
|
29
|
+
// Token budget for a single image. est tokens = base64.length * 0.125 (the
|
|
30
|
+
// common per-image heuristic). Default aligns to the 5MB base64 API ceiling so the
|
|
31
|
+
// dimension/raw-size resize governs the common case and the token gate only
|
|
32
|
+
// fires on pathologically dense images.
|
|
33
|
+
const DEFAULT_IMAGE_MAX_TOKENS = Math.ceil(API_IMAGE_MAX_BASE64_SIZE * 0.125);
|
|
34
|
+
const OPENAI_IMAGE_MAX_DIMENSION = 2048;
|
|
35
|
+
const OPENAI_IMAGE_PATCH_SIZE = 32;
|
|
36
|
+
const OPENAI_IMAGE_MAX_PATCHES = 1536;
|
|
37
|
+
// Anthropic bills 28x28 patches and a standard-tier image may spend 1568 of
|
|
38
|
+
// them, so the patch budget usually binds before the edge ceiling does:
|
|
39
|
+
// 1568x882 clears 1568px on both edges yet still needs 1792 patches. That is
|
|
40
|
+
// why the documented rendition of a 1080p frame lands near 1456x819 rather
|
|
41
|
+
// than at the edge limit.
|
|
42
|
+
const ANTHROPIC_IMAGE_PATCH_SIZE = 28;
|
|
43
|
+
const ANTHROPIC_IMAGE_MAX_PATCHES = 1568;
|
|
44
|
+
const IMAGE_RESIZE_CACHE_MAX_BYTES = 64 * 1024 * 1024;
|
|
45
|
+
const imageResizeCache = new Map();
|
|
46
|
+
let imageResizeCacheBytes = 0;
|
|
47
|
+
let imageResizeCacheHits = 0;
|
|
48
|
+
let imageResizeCacheMisses = 0;
|
|
49
|
+
|
|
50
|
+
class InvalidImageDataError extends Error {
|
|
51
|
+
constructor(cause = null) {
|
|
52
|
+
const detail = cause instanceof Error && cause.message ? `: ${cause.message}` : '';
|
|
53
|
+
super(`invalid or corrupt image data${detail}`);
|
|
54
|
+
this.name = 'InvalidImageDataError';
|
|
55
|
+
this.code = 'INVALID_IMAGE_DATA';
|
|
56
|
+
if (cause) this.cause = cause;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export function imageProfileForProvider(provider) {
|
|
61
|
+
const value = String(provider || '')
|
|
62
|
+
.trim()
|
|
63
|
+
.toLowerCase();
|
|
64
|
+
return /^(?:openai|xai|grok|deepseek|opencode-go|mixdog-local)(?:-|$)/.test(value) ? 'openai' : 'anthropic';
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function imagePatchCount(width, height, patchSize) {
|
|
68
|
+
return (
|
|
69
|
+
Math.ceil(Math.max(1, Number(width) || 1) / patchSize) * Math.ceil(Math.max(1, Number(height) || 1) / patchSize)
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function openAIImagePatchCount(width, height) {
|
|
74
|
+
return imagePatchCount(width, height, OPENAI_IMAGE_PATCH_SIZE);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function resizeCacheKey(buffer, ext, maxTokens, profile) {
|
|
78
|
+
return createHash('sha256')
|
|
79
|
+
.update(String(ext || ''))
|
|
80
|
+
.update('\0')
|
|
81
|
+
.update(String(maxTokens || 0))
|
|
82
|
+
.update('\0')
|
|
83
|
+
.update(String(profile || ''))
|
|
84
|
+
.update('\0')
|
|
85
|
+
.update(buffer)
|
|
86
|
+
.digest('hex');
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function cloneResizeResult(result) {
|
|
90
|
+
return {
|
|
91
|
+
...result,
|
|
92
|
+
...(result?.dimensions ? { dimensions: { ...result.dimensions } } : {}),
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function rememberResizeResult(key, result) {
|
|
97
|
+
const bytes = Buffer.byteLength(String(result?.data || ''), 'base64');
|
|
98
|
+
if (bytes <= 0 || bytes > IMAGE_RESIZE_CACHE_MAX_BYTES) return;
|
|
99
|
+
const existing = imageResizeCache.get(key);
|
|
100
|
+
if (existing) {
|
|
101
|
+
imageResizeCacheBytes -= existing.bytes;
|
|
102
|
+
imageResizeCache.delete(key);
|
|
103
|
+
}
|
|
104
|
+
imageResizeCache.set(key, { result: cloneResizeResult(result), bytes });
|
|
105
|
+
imageResizeCacheBytes += bytes;
|
|
106
|
+
while (imageResizeCacheBytes > IMAGE_RESIZE_CACHE_MAX_BYTES && imageResizeCache.size > 0) {
|
|
107
|
+
const oldest = imageResizeCache.keys().next().value;
|
|
108
|
+
const evicted = imageResizeCache.get(oldest);
|
|
109
|
+
imageResizeCache.delete(oldest);
|
|
110
|
+
imageResizeCacheBytes -= evicted?.bytes || 0;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
export function imageResizeCacheStats() {
|
|
115
|
+
return {
|
|
116
|
+
entries: imageResizeCache.size,
|
|
117
|
+
bytes: imageResizeCacheBytes,
|
|
118
|
+
maxBytes: IMAGE_RESIZE_CACHE_MAX_BYTES,
|
|
119
|
+
hits: imageResizeCacheHits,
|
|
120
|
+
misses: imageResizeCacheMisses,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Cached dynamic import. Resolves to the sharp factory or null (absent /
|
|
125
|
+
// failed). Cached so repeated reads don't re-attempt a failing import.
|
|
126
|
+
let _sharpPromise;
|
|
127
|
+
async function loadSharp() {
|
|
128
|
+
if (_sharpPromise === undefined) {
|
|
129
|
+
_sharpPromise = (async () => {
|
|
130
|
+
try {
|
|
131
|
+
const mod = await import('sharp');
|
|
132
|
+
const sharp = mod?.default || mod || null;
|
|
133
|
+
// libvips' internal operation cache (default ~50MB per
|
|
134
|
+
// process) duplicates the JS-level resize cache above and the
|
|
135
|
+
// on-disk rendition cache; keep pixels out of native memory.
|
|
136
|
+
try {
|
|
137
|
+
sharp?.cache(false);
|
|
138
|
+
} catch {
|
|
139
|
+
/* cache stays default */
|
|
140
|
+
}
|
|
141
|
+
return sharp;
|
|
142
|
+
} catch {
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
})();
|
|
146
|
+
}
|
|
147
|
+
return _sharpPromise;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function estTokens(base64) {
|
|
151
|
+
return Math.ceil((base64?.length || 0) * 0.125);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
function normalizeFmt(fmt) {
|
|
155
|
+
if (!fmt) return 'png';
|
|
156
|
+
const f = String(fmt).toLowerCase();
|
|
157
|
+
return f === 'jpg' ? 'jpeg' : f;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Build the metadata text block prepended to a resized image:
|
|
161
|
+
// "[Image: WxH, displayed at ...]" plus a coordinate
|
|
162
|
+
// scale note when the image was downsampled.
|
|
163
|
+
export function imageMetadataText(dims, sourcePath) {
|
|
164
|
+
if (!dims) return sourcePath ? `[Image source: ${sourcePath}]` : null;
|
|
165
|
+
const { originalWidth, originalHeight, displayWidth, displayHeight } = dims;
|
|
166
|
+
if (!originalWidth || !originalHeight || !displayWidth || !displayHeight || displayWidth <= 0 || displayHeight <= 0) {
|
|
167
|
+
return sourcePath ? `[Image source: ${sourcePath}]` : null;
|
|
168
|
+
}
|
|
169
|
+
const wasResized = originalWidth !== displayWidth || originalHeight !== displayHeight;
|
|
170
|
+
const parts = [];
|
|
171
|
+
if (sourcePath) parts.push(`source: ${sourcePath}`);
|
|
172
|
+
parts.push(`${originalWidth}x${originalHeight}`);
|
|
173
|
+
if (wasResized) {
|
|
174
|
+
const scale = originalWidth / displayWidth;
|
|
175
|
+
parts.push(
|
|
176
|
+
`displayed at ${displayWidth}x${displayHeight}. Multiply coordinates by ${scale.toFixed(2)} to map to the original image.`
|
|
177
|
+
);
|
|
178
|
+
} else {
|
|
179
|
+
parts.push(`displayed at ${displayWidth}x${displayHeight}`);
|
|
180
|
+
}
|
|
181
|
+
return `[Image: ${parts.join(', ')}]`;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
const IMAGE_PROFILE_LIMITS = {
|
|
185
|
+
openai: {
|
|
186
|
+
maxWidth: OPENAI_IMAGE_MAX_DIMENSION,
|
|
187
|
+
maxHeight: OPENAI_IMAGE_MAX_DIMENSION,
|
|
188
|
+
patchSize: OPENAI_IMAGE_PATCH_SIZE,
|
|
189
|
+
maxPatches: OPENAI_IMAGE_MAX_PATCHES,
|
|
190
|
+
},
|
|
191
|
+
anthropic: {
|
|
192
|
+
maxWidth: IMAGE_MAX_WIDTH,
|
|
193
|
+
maxHeight: IMAGE_MAX_HEIGHT,
|
|
194
|
+
patchSize: ANTHROPIC_IMAGE_PATCH_SIZE,
|
|
195
|
+
maxPatches: ANTHROPIC_IMAGE_MAX_PATCHES,
|
|
196
|
+
},
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
// Constrain dimensions while preserving aspect ratio. Both limits bind, and
|
|
200
|
+
// either one can be the tighter: the per-edge ceiling governs an elongated
|
|
201
|
+
// image, the patch budget a wide one.
|
|
202
|
+
function targetDimensions(originalWidth, originalHeight, normalizedProfile) {
|
|
203
|
+
let width = originalWidth;
|
|
204
|
+
let height = originalHeight;
|
|
205
|
+
const { maxWidth, maxHeight, patchSize, maxPatches } =
|
|
206
|
+
IMAGE_PROFILE_LIMITS[normalizedProfile === 'openai' ? 'openai' : 'anthropic'];
|
|
207
|
+
const scale = Math.min(
|
|
208
|
+
1,
|
|
209
|
+
maxWidth / width,
|
|
210
|
+
maxHeight / height,
|
|
211
|
+
Math.sqrt((maxPatches * patchSize ** 2) / (width * height))
|
|
212
|
+
);
|
|
213
|
+
width = Math.max(1, Math.floor(width * scale));
|
|
214
|
+
height = Math.max(1, Math.floor(height * scale));
|
|
215
|
+
// Lift a sub-patch image to the floor, but never past the profile's own
|
|
216
|
+
// ceiling: an extreme aspect ratio keeps its shape rather than being
|
|
217
|
+
// blown up to satisfy its short edge.
|
|
218
|
+
let allowEnlargement = false;
|
|
219
|
+
const shortestEdge = Math.min(width, height);
|
|
220
|
+
if (shortestEdge < IMAGE_MIN_DIMENSION) {
|
|
221
|
+
const ceiling = Math.min(maxWidth, maxHeight);
|
|
222
|
+
const upscale = Math.min(IMAGE_MIN_DIMENSION / shortestEdge, ceiling / Math.max(width, height));
|
|
223
|
+
if (upscale > 1) {
|
|
224
|
+
width = Math.max(1, Math.round(width * upscale));
|
|
225
|
+
height = Math.max(1, Math.round(height * upscale));
|
|
226
|
+
allowEnlargement = true;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
// Area scaling is exact, but rounding a partial patch up can still leave
|
|
230
|
+
// one row or column over budget; trim the longer edge until it fits.
|
|
231
|
+
while (imagePatchCount(width, height, patchSize) > maxPatches && (width > 1 || height > 1)) {
|
|
232
|
+
if (width >= height) width -= 1;
|
|
233
|
+
else height -= 1;
|
|
234
|
+
}
|
|
235
|
+
return { width, height, allowEnlargement };
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// Token-budget gate: recompress to jpeg q50 at the (already resized) display
|
|
239
|
+
// dimensions, then the 400x400 jpeg q20 hard fallback. Fresh sharp instance
|
|
240
|
+
// per op — reusing an instance after toBuffer() drops the format conversion.
|
|
241
|
+
async function fitRenditionToTokenBudget(sharp, buffer, rendition, maxTokens) {
|
|
242
|
+
const { originalWidth, originalHeight } = rendition;
|
|
243
|
+
try {
|
|
244
|
+
let s = sharp(buffer);
|
|
245
|
+
if (rendition.displayWidth && rendition.displayHeight) {
|
|
246
|
+
s = s.resize(rendition.displayWidth, rendition.displayHeight, { fit: 'inside', withoutEnlargement: true });
|
|
247
|
+
}
|
|
248
|
+
const jpeg = await s.jpeg({ quality: 50 }).toBuffer({ resolveWithObject: true });
|
|
249
|
+
rendition.mediaType = 'jpeg';
|
|
250
|
+
rendition.base64 = jpeg.data.toString('base64');
|
|
251
|
+
rendition.displayWidth = jpeg.info.width || rendition.displayWidth;
|
|
252
|
+
rendition.displayHeight = jpeg.info.height || rendition.displayHeight;
|
|
253
|
+
} catch {
|
|
254
|
+
/* keep the q-pre buffer; the 400x400 fallback runs next */
|
|
255
|
+
}
|
|
256
|
+
if (estTokens(rendition.base64) <= maxTokens) return;
|
|
257
|
+
try {
|
|
258
|
+
const fb = await sharp(buffer)
|
|
259
|
+
.resize(400, 400, { fit: 'inside', withoutEnlargement: true })
|
|
260
|
+
.jpeg({ quality: 20 })
|
|
261
|
+
.toBuffer();
|
|
262
|
+
rendition.mediaType = 'jpeg';
|
|
263
|
+
rendition.base64 = fb.toString('base64');
|
|
264
|
+
if (originalWidth && originalHeight) {
|
|
265
|
+
const scale = Math.min(400 / originalWidth, 400 / originalHeight, 1);
|
|
266
|
+
rendition.displayWidth = Math.max(1, Math.round(originalWidth * scale));
|
|
267
|
+
rendition.displayHeight = Math.max(1, Math.round(originalHeight * scale));
|
|
268
|
+
}
|
|
269
|
+
} catch {
|
|
270
|
+
/* keep whatever we have */
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
// A cached rendition, refreshed to most-recently-used; null on a miss.
|
|
275
|
+
function recallResizeResult(cacheKey) {
|
|
276
|
+
const cached = imageResizeCache.get(cacheKey);
|
|
277
|
+
if (!cached) {
|
|
278
|
+
imageResizeCacheMisses += 1;
|
|
279
|
+
return null;
|
|
280
|
+
}
|
|
281
|
+
imageResizeCacheHits += 1;
|
|
282
|
+
imageResizeCache.delete(cacheKey);
|
|
283
|
+
imageResizeCache.set(cacheKey, cached);
|
|
284
|
+
return cloneResizeResult(cached.result);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// metadata() only parses headers; libpng can still reject a corrupt IDAT
|
|
288
|
+
// stream later. Force one full pixel decode before any original bytes are
|
|
289
|
+
// allowed through unchanged.
|
|
290
|
+
async function decodedImageMeta(sharp, buffer) {
|
|
291
|
+
const meta = await sharp(buffer).metadata();
|
|
292
|
+
await sharp(buffer, {
|
|
293
|
+
sequentialRead: true,
|
|
294
|
+
limitInputPixels: 64 * 1024 * 1024,
|
|
295
|
+
})
|
|
296
|
+
.raw()
|
|
297
|
+
.toBuffer();
|
|
298
|
+
return meta;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
// The rendition inside the profile's target box. Trimming the edges
|
|
302
|
+
// separately can leave a box the picture does not fill: fit:'inside' keeps
|
|
303
|
+
// the aspect ratio, so the rendition is smaller than the box that was asked
|
|
304
|
+
// for. Report what came out — the metadata line and its coordinate scale are
|
|
305
|
+
// read as the truth about this image.
|
|
306
|
+
async function renderRendition(sharp, buffer, meta, ext, profile) {
|
|
307
|
+
const originalWidth = meta.width;
|
|
308
|
+
const originalHeight = meta.height;
|
|
309
|
+
const rendition = {
|
|
310
|
+
base64: '',
|
|
311
|
+
mediaType: normalizeFmt(meta.format || ext),
|
|
312
|
+
originalWidth,
|
|
313
|
+
originalHeight,
|
|
314
|
+
displayWidth: originalWidth,
|
|
315
|
+
displayHeight: originalHeight,
|
|
316
|
+
};
|
|
317
|
+
let outBuf = buffer;
|
|
318
|
+
if (originalWidth && originalHeight) {
|
|
319
|
+
const { width, height, allowEnlargement } = targetDimensions(originalWidth, originalHeight, profile);
|
|
320
|
+
const needsResize = width !== originalWidth || height !== originalHeight;
|
|
321
|
+
if (needsResize || buffer.length > IMAGE_TARGET_RAW_SIZE) {
|
|
322
|
+
const resized = await sharp(buffer)
|
|
323
|
+
.resize(width, height, { fit: 'inside', withoutEnlargement: !allowEnlargement })
|
|
324
|
+
.toBuffer({ resolveWithObject: true });
|
|
325
|
+
outBuf = resized.data;
|
|
326
|
+
rendition.displayWidth = resized.info.width || width;
|
|
327
|
+
rendition.displayHeight = resized.info.height || height;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
rendition.base64 = outBuf.toString('base64');
|
|
331
|
+
return rendition;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
// Resize / downsample an image buffer with sharp.
|
|
335
|
+
//
|
|
336
|
+
// Pipeline (resize / downsample under a token budget):
|
|
337
|
+
// 1. metadata() plus one full decode — format, dimensions, integrity.
|
|
338
|
+
// 2. resize fit:inside to the profile's edge and patch limits (only when
|
|
339
|
+
// over them OR over the 3.75MB raw target).
|
|
340
|
+
// 3. est tokens (base64.len * 0.125); if over budget, recompress jpeg q<=50.
|
|
341
|
+
// 4. still over budget -> 400x400 jpeg q20 hard fallback.
|
|
342
|
+
//
|
|
343
|
+
// Returns { data (base64), mimeType ("image/..."), dimensions } on success,
|
|
344
|
+
// null only when sharp is unavailable, and throws InvalidImageDataError when
|
|
345
|
+
// the decoder rejects the bytes.
|
|
346
|
+
export async function resizeImageBuffer(
|
|
347
|
+
buffer,
|
|
348
|
+
ext,
|
|
349
|
+
{ maxTokens = DEFAULT_IMAGE_MAX_TOKENS, profile = 'anthropic' } = {}
|
|
350
|
+
) {
|
|
351
|
+
if (!Buffer.isBuffer(buffer) || buffer.length === 0) return null;
|
|
352
|
+
const normalizedProfile = profile === 'openai' ? 'openai' : 'anthropic';
|
|
353
|
+
const cacheKey = resizeCacheKey(buffer, ext, maxTokens, normalizedProfile);
|
|
354
|
+
const cached = recallResizeResult(cacheKey);
|
|
355
|
+
if (cached) return cached;
|
|
356
|
+
const sharp = await loadSharp();
|
|
357
|
+
if (!sharp) return null;
|
|
358
|
+
try {
|
|
359
|
+
const meta = await decodedImageMeta(sharp, buffer);
|
|
360
|
+
const rendition = await renderRendition(sharp, buffer, meta, ext, normalizedProfile);
|
|
361
|
+
if (estTokens(rendition.base64) > maxTokens) await fitRenditionToTokenBudget(sharp, buffer, rendition, maxTokens);
|
|
362
|
+
const result = {
|
|
363
|
+
data: rendition.base64,
|
|
364
|
+
mimeType: `image/${rendition.mediaType}`,
|
|
365
|
+
dimensions: {
|
|
366
|
+
originalWidth: rendition.originalWidth,
|
|
367
|
+
originalHeight: rendition.originalHeight,
|
|
368
|
+
displayWidth: rendition.displayWidth,
|
|
369
|
+
displayHeight: rendition.displayHeight,
|
|
370
|
+
},
|
|
371
|
+
};
|
|
372
|
+
rememberResizeResult(cacheKey, result);
|
|
373
|
+
return result;
|
|
374
|
+
} catch (error) {
|
|
375
|
+
// A present decoder rejected the payload. Passing the original bytes
|
|
376
|
+
// through poisons the conversation and makes every later request 400.
|
|
377
|
+
throw new InvalidImageDataError(error);
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
// Build an image content block (+ optional metadata text) from a raw buffer.
|
|
382
|
+
// Returns { textBlock, imageBlock } on success, or null on fallback. Used by
|
|
383
|
+
// the notebook reader to embed cell-output images.
|
|
384
|
+
export async function imageBlocksFromBuffer(buffer, mimeType, { sourcePath, maxTokens } = {}) {
|
|
385
|
+
const ext = (mimeType || '').split('/')[1] || 'png';
|
|
386
|
+
let resized;
|
|
387
|
+
try {
|
|
388
|
+
resized = await resizeImageBuffer(buffer, ext, maxTokens ? { maxTokens } : {});
|
|
389
|
+
} catch (error) {
|
|
390
|
+
if (error?.code === 'INVALID_IMAGE_DATA') return null;
|
|
391
|
+
throw error;
|
|
392
|
+
}
|
|
393
|
+
if (!resized) return null;
|
|
394
|
+
const metaText = imageMetadataText(resized.dimensions, sourcePath);
|
|
395
|
+
return {
|
|
396
|
+
textBlock: metaText ? { type: 'text', text: metaText } : null,
|
|
397
|
+
imageBlock: { type: 'image', data: resized.data, mimeType: resized.mimeType },
|
|
398
|
+
};
|
|
399
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// schedule.model wire format shared by the channels-worker scheduler and the
|
|
2
2
|
// engine-side run-now dispatch: either a config.presets id/name (legacy) or a
|
|
3
3
|
// direct "provider/model[@effort][+fast][?parameter=value]" route string written
|
|
4
|
-
// by the desktop schedule editor. Slash-form values become
|
|
5
|
-
//
|
|
4
|
+
// by the desktop schedule editor. Slash-form values become direct route
|
|
5
|
+
// objects, which agent-dispatch consumes without a presets lookup.
|
|
6
6
|
// The optional route fields an automation run carries, from a preset, a
|
|
7
7
|
// maintenance slot or a parsed route ref. One shape so schedule and webhook
|
|
8
8
|
// runs cannot drift when a field is added. modelParameters is copied so a
|
|
@@ -173,8 +173,13 @@ function inProgressLock(verDir) {
|
|
|
173
173
|
// Try to claim the staging lock for verDir. Returns true if claimed (caller
|
|
174
174
|
// must release), false if another live worker holds a fresh lock.
|
|
175
175
|
function claimStagingLock(verDir) {
|
|
176
|
-
const lock = inProgressLock(verDir);
|
|
177
176
|
mkdirSync(verDir, { recursive: true });
|
|
177
|
+
return claimPidLockFile(inProgressLock(verDir));
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// Exclusive `<pid> <ms>` lock file. An existing lock is stolen only when stale
|
|
181
|
+
// (dead owner or old mtime). Returns true when this process now holds it.
|
|
182
|
+
function claimPidLockFile(lock) {
|
|
178
183
|
const write = () => {
|
|
179
184
|
const fd = openSync(lock, 'wx');
|
|
180
185
|
try {
|
|
@@ -188,7 +193,6 @@ function claimStagingLock(verDir) {
|
|
|
188
193
|
return true;
|
|
189
194
|
} catch (err) {
|
|
190
195
|
if (err?.code !== 'EEXIST') return false;
|
|
191
|
-
// Existing lock: steal only if stale (dead owner or old mtime).
|
|
192
196
|
let owner = 0;
|
|
193
197
|
let ageMs = Infinity;
|
|
194
198
|
try {
|
|
@@ -608,38 +612,5 @@ function claimSwapLock(lock) {
|
|
|
608
612
|
try {
|
|
609
613
|
mkdirSync(dirname(lock), { recursive: true });
|
|
610
614
|
} catch {}
|
|
611
|
-
|
|
612
|
-
const fd = openSync(lock, 'wx');
|
|
613
|
-
try {
|
|
614
|
-
writeSync(fd, `${process.pid} ${Date.now()}`);
|
|
615
|
-
} finally {
|
|
616
|
-
closeSync(fd);
|
|
617
|
-
}
|
|
618
|
-
return true;
|
|
619
|
-
} catch (err) {
|
|
620
|
-
if (err?.code !== 'EEXIST') return false;
|
|
621
|
-
let owner = 0;
|
|
622
|
-
let ageMs = Infinity;
|
|
623
|
-
try {
|
|
624
|
-
owner = Number.parseInt(String(readFileSync(lock, 'utf8')).trim().split(/\s+/)[0], 10);
|
|
625
|
-
} catch {}
|
|
626
|
-
try {
|
|
627
|
-
ageMs = Date.now() - statSync(lock).mtimeMs;
|
|
628
|
-
} catch {}
|
|
629
|
-
if (pidAlive(owner) && ageMs < STALE_INPROGRESS_MS) return false;
|
|
630
|
-
try {
|
|
631
|
-
unlinkSync(lock);
|
|
632
|
-
} catch {}
|
|
633
|
-
try {
|
|
634
|
-
const fd = openSync(lock, 'wx');
|
|
635
|
-
try {
|
|
636
|
-
writeSync(fd, `${process.pid} ${Date.now()}`);
|
|
637
|
-
} finally {
|
|
638
|
-
closeSync(fd);
|
|
639
|
-
}
|
|
640
|
-
return true;
|
|
641
|
-
} catch {
|
|
642
|
-
return false;
|
|
643
|
-
}
|
|
644
|
-
}
|
|
615
|
+
return claimPidLockFile(lock);
|
|
645
616
|
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* src/ui/ansi.mjs — tiny ANSI color/style helpers (zero deps).
|
|
3
|
+
*
|
|
4
|
+
* Philosophy: minimal. We write raw SGR escape sequences directly rather
|
|
5
|
+
* than pull in chalk/kleur. Every helper is a `(text) => string` that wraps the
|
|
6
|
+
* text in an escape pair and resets afterwards.
|
|
7
|
+
*
|
|
8
|
+
* Color is suppressed (helpers return the text unchanged) when EITHER:
|
|
9
|
+
* - the NO_COLOR env var is set (any value) — https://no-color.org, or
|
|
10
|
+
* - stdout is not a TTY (piped/redirected/CI) — `process.stdout.isTTY` falsy.
|
|
11
|
+
*
|
|
12
|
+
* The decision is computed once at import time.
|
|
13
|
+
*/
|
|
14
|
+
import { stdout, env } from 'node:process';
|
|
15
|
+
|
|
16
|
+
const COLOR_ENABLED = computeColorEnabled();
|
|
17
|
+
|
|
18
|
+
function computeColorEnabled() {
|
|
19
|
+
if (env.NO_COLOR !== undefined && env.NO_COLOR !== '') return false;
|
|
20
|
+
// FORCE_COLOR overrides the TTY check (common in CI snapshots).
|
|
21
|
+
if (env.FORCE_COLOR !== undefined && env.FORCE_COLOR !== '0' && env.FORCE_COLOR !== '') {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
return Boolean(stdout?.isTTY);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Whether styling is currently active. */
|
|
28
|
+
export function colorEnabled() {
|
|
29
|
+
return COLOR_ENABLED;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const ESC = '\x1b[';
|
|
33
|
+
const RESET = `${ESC}0m`;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Whether the terminal can render 24-bit SGR colors.
|
|
37
|
+
*
|
|
38
|
+
* Apple Terminal is the one explicit negative because it advertises a normal
|
|
39
|
+
* xterm TERM while not implementing truecolor. Unknown terminals retain the
|
|
40
|
+
* historical truecolor default.
|
|
41
|
+
*/
|
|
42
|
+
function supportsTruecolor(environment = env) {
|
|
43
|
+
const termProgram = String(environment?.TERM_PROGRAM || '')
|
|
44
|
+
.trim()
|
|
45
|
+
.toLowerCase();
|
|
46
|
+
return termProgram !== 'apple_terminal';
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const ANSI_256_CUBE_LEVELS = Object.freeze([0, 95, 135, 175, 215, 255]);
|
|
50
|
+
|
|
51
|
+
function colorByte(value) {
|
|
52
|
+
const n = Number(value);
|
|
53
|
+
return Number.isFinite(n) ? Math.max(0, Math.min(255, Math.round(n))) : 0;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function nearestCubeLevel(value) {
|
|
57
|
+
let best = 0;
|
|
58
|
+
let bestDistance = Infinity;
|
|
59
|
+
for (let i = 0; i < ANSI_256_CUBE_LEVELS.length; i++) {
|
|
60
|
+
const distance = Math.abs(value - ANSI_256_CUBE_LEVELS[i]);
|
|
61
|
+
if (distance < bestDistance) {
|
|
62
|
+
best = i;
|
|
63
|
+
bestDistance = distance;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
return best;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** Convert an RGB triplet to the nearest stable xterm 256-color palette index. */
|
|
70
|
+
export function rgbToAnsi256(r, g, b) {
|
|
71
|
+
const red = colorByte(r);
|
|
72
|
+
const green = colorByte(g);
|
|
73
|
+
const blue = colorByte(b);
|
|
74
|
+
|
|
75
|
+
const redLevel = nearestCubeLevel(red);
|
|
76
|
+
const greenLevel = nearestCubeLevel(green);
|
|
77
|
+
const blueLevel = nearestCubeLevel(blue);
|
|
78
|
+
const cubeRed = ANSI_256_CUBE_LEVELS[redLevel];
|
|
79
|
+
const cubeGreen = ANSI_256_CUBE_LEVELS[greenLevel];
|
|
80
|
+
const cubeBlue = ANSI_256_CUBE_LEVELS[blueLevel];
|
|
81
|
+
const cubeDistance = (red - cubeRed) ** 2 + (green - cubeGreen) ** 2 + (blue - cubeBlue) ** 2;
|
|
82
|
+
|
|
83
|
+
const average = (red + green + blue) / 3;
|
|
84
|
+
const grayLevel = Math.max(0, Math.min(23, Math.round((average - 8) / 10)));
|
|
85
|
+
const grayValue = 8 + grayLevel * 10;
|
|
86
|
+
const grayDistance = (red - grayValue) ** 2 + (green - grayValue) ** 2 + (blue - grayValue) ** 2;
|
|
87
|
+
|
|
88
|
+
if (grayDistance < cubeDistance) return 232 + grayLevel;
|
|
89
|
+
return 16 + 36 * redLevel + 6 * greenLevel + blueLevel;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** Raw RGB SGR prefix, downsampled to 256 colors when truecolor is unavailable. */
|
|
93
|
+
export function rgbSgr(r, g, b, background = false) {
|
|
94
|
+
const channel = background ? 48 : 38;
|
|
95
|
+
if (supportsTruecolor()) return `${ESC}${channel};2;${r};${g};${b}m`;
|
|
96
|
+
return `${ESC}${channel};5;${rgbToAnsi256(r, g, b)}m`;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function supportedSgrOpen(open) {
|
|
100
|
+
const match = /^(38|48);2;([^;]+);([^;]+);([^;]+)$/.exec(String(open));
|
|
101
|
+
if (!match || supportsTruecolor()) return open;
|
|
102
|
+
return `${match[1]};5;${rgbToAnsi256(match[2], match[3], match[4])}`;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/** Build a `(text) => string` wrapper for the given SGR open code(s). */
|
|
106
|
+
function sgr(open) {
|
|
107
|
+
return (text) => {
|
|
108
|
+
if (!COLOR_ENABLED) return String(text ?? '');
|
|
109
|
+
const s = String(text ?? '');
|
|
110
|
+
const openSeq = `${ESC}${supportedSgrOpen(open)}m`;
|
|
111
|
+
// Re-open after any nested reset so composed styles survive concatenation.
|
|
112
|
+
return openSeq + s.replace(/\x1b\[0m/g, RESET + openSeq) + RESET;
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// --- Styles -----------------------------------------------------------------
|
|
117
|
+
export const bold = sgr('1');
|
|
118
|
+
export const dim = sgr('38;2;136;136;136');
|
|
119
|
+
export const italic = sgr('3');
|
|
120
|
+
export const underline = sgr('4');
|
|
121
|
+
export const inverse = sgr('7');
|
|
122
|
+
export const strike = sgr('9');
|
|
123
|
+
|
|
124
|
+
// --- Foreground colors ------------------------------------------------------
|
|
125
|
+
export const black = sgr('30');
|
|
126
|
+
export const red = sgr('38;2;220;70;88');
|
|
127
|
+
export const green = sgr('38;2;0;170;75');
|
|
128
|
+
export const yellow = sgr('38;2;255;193;7');
|
|
129
|
+
export const blue = sgr('38;2;77;159;255');
|
|
130
|
+
export const magenta = sgr('38;2;177;133;219');
|
|
131
|
+
export const cyan = sgr('38;2;136;136;136');
|
|
132
|
+
export const white = sgr('38;2;198;198;198');
|
|
133
|
+
export const gray = sgr('38;2;198;198;198');
|
|
134
|
+
export const grey = gray;
|
|
135
|
+
|
|
136
|
+
// Bright variants (used sparingly for headings / accents).
|
|
137
|
+
export const brightGreen = sgr('38;2;0;185;88');
|
|
138
|
+
|
|
139
|
+
// --- RGB colors --------------------------------------------------------------
|
|
140
|
+
// Emit 24-bit SGR where supported, otherwise use the nearest 256-color entry.
|
|
141
|
+
// Honors NO_COLOR / TTY exactly like the named helpers above.
|
|
142
|
+
|
|
143
|
+
/** Foreground truecolor wrapper: `rgb(215,119,87)('x')`. */
|
|
144
|
+
export function rgb(r, g, b) {
|
|
145
|
+
return sgr(`38;2;${r};${g};${b}`);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/** Strip every SGR escape from a string (for width math / non-TTY fallbacks). */
|
|
149
|
+
export function stripAnsi(text) {
|
|
150
|
+
return String(text ?? '').replace(/\x1b\[[0-9;]*m/g, '');
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/** Visible width of a string ignoring ANSI escapes (approx, 1 col/char). */
|
|
154
|
+
export function visibleWidth(text) {
|
|
155
|
+
return stripAnsi(text).length;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
/** Compose multiple style fns left-to-right: compose(bold, red)('x'). */
|
|
159
|
+
export function compose(...fns) {
|
|
160
|
+
return (text) => fns.reduceRight((acc, fn) => fn(acc), String(text ?? ''));
|
|
161
|
+
}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* src/
|
|
2
|
+
* src/runtime/shared/statusline/statusline-format.mjs — pure formatting primitives for the footer.
|
|
3
3
|
*
|
|
4
4
|
* ANSI SGR constants, the context%
|
|
5
5
|
* bar/segment formatters, and small numeric helpers. Elapsed labels come from
|
|
6
6
|
* the shared runtime formatter so L2 matches TUI/desktop cards.
|
|
7
7
|
*/
|
|
8
8
|
import { colorEnabled, rgb, rgbSgr } from './ansi.mjs';
|
|
9
|
-
import { displayModelName, shortenModelName } from '
|
|
10
|
-
import { getModelMetadataSync } from '../
|
|
11
|
-
import { contextMeasurementLabel } from '
|
|
12
|
-
import { formatElapsed } from '../
|
|
9
|
+
import { displayModelName, shortenModelName } from '../model-display.mjs';
|
|
10
|
+
import { getModelMetadataSync } from '../llm/model-catalog.mjs';
|
|
11
|
+
import { contextMeasurementLabel } from '../context-measurement.mjs';
|
|
12
|
+
import { formatElapsed } from '../time-format.mjs';
|
|
13
13
|
|
|
14
14
|
export { formatElapsed };
|
|
15
15
|
|