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
|
@@ -14,6 +14,8 @@ import {
|
|
|
14
14
|
// shared shell tokenizers, so quoted/commented `;` `|` `grep` can never
|
|
15
15
|
// masquerade as a connector/command and hide a real failure.
|
|
16
16
|
const _SEARCH_HEADS = new Set(['select-string', 'sls', 'grep', 'egrep', 'fgrep', 'findstr']);
|
|
17
|
+
// `git diff` flags whose exit 1 reports a difference, not a failure.
|
|
18
|
+
export const GIT_DIFF_EXIT_SIGNAL_FLAGS = new Set(['--exit-code', '--quiet', '--check']);
|
|
17
19
|
const _GIT_GLOBAL_VALUE_OPTS = new Set([
|
|
18
20
|
'-c',
|
|
19
21
|
'-C',
|
|
@@ -75,12 +77,14 @@ export function _isBenignSearchExitOne(command, exitCode, signal, stderr) {
|
|
|
75
77
|
const head = _normalizeHead(tokens[0]);
|
|
76
78
|
if (_SEARCH_HEADS.has(head)) return true;
|
|
77
79
|
if (head !== 'git') return false;
|
|
78
|
-
// `git [global-opts]
|
|
79
|
-
// diff-index/diff-files/difftool —
|
|
80
|
+
// `git [global-opts] grep ...` (no match), or `git [global-opts] diff ...`
|
|
81
|
+
// only — exact `diff` subcommand, never diff-index/diff-files/difftool —
|
|
82
|
+
// with exit-code semantics.
|
|
80
83
|
let i = 1;
|
|
81
84
|
while (i < tokens.length && tokens[i].startsWith('-')) {
|
|
82
85
|
i += _GIT_GLOBAL_VALUE_OPTS.has(tokens[i]) && !tokens[i].includes('=') ? 2 : 1;
|
|
83
86
|
}
|
|
87
|
+
if (tokens[i] === 'grep') return true;
|
|
84
88
|
if (tokens[i] !== 'diff') return false;
|
|
85
|
-
return tokens.slice(i + 1).some((t) => t
|
|
89
|
+
return tokens.slice(i + 1).some((t) => GIT_DIFF_EXIT_SIGNAL_FLAGS.has(t));
|
|
86
90
|
}
|
|
@@ -17,13 +17,16 @@ const TIMER_MAX_MS = 2_147_483_647;
|
|
|
17
17
|
// completion is pushed to the owner. MIXDOG_SHELL_AUTO_BACKGROUND_MS
|
|
18
18
|
// overrides; an explicit 0 disables. Gated on backgroundOnTimeout so
|
|
19
19
|
// disabled background tasks remain foreground.
|
|
20
|
-
|
|
20
|
+
// A per-call wait_ms replaces that default for the call, capped by the
|
|
21
|
+
// foreground maximum.
|
|
22
|
+
function autoBackgroundBudget(backgroundOnTimeout, timeout, waitMs, maxForegroundMs) {
|
|
21
23
|
const raw = process.env.MIXDOG_SHELL_AUTO_BACKGROUND_MS;
|
|
22
24
|
const parsed = Number(raw);
|
|
23
|
-
|
|
25
|
+
let defaultMs =
|
|
24
26
|
raw != null && String(raw).trim() !== '' && Number.isFinite(parsed) && parsed >= 0
|
|
25
27
|
? Math.floor(parsed)
|
|
26
28
|
: DEFAULT_SHELL_AUTO_BACKGROUND_MS;
|
|
29
|
+
if (waitMs > 0) defaultMs = Math.min(waitMs, maxForegroundMs);
|
|
27
30
|
if (!backgroundOnTimeout || defaultMs <= 0) return 0;
|
|
28
31
|
return timeout > 0 ? Math.min(defaultMs, timeout) : defaultMs;
|
|
29
32
|
}
|
|
@@ -70,6 +73,11 @@ export function planShellDeadlines({ args, wmicRewrite, backgroundOnTimeout }) {
|
|
|
70
73
|
// Soft/interrupt promotion happens before the foreground cap; an explicit
|
|
71
74
|
// total deadline is preserved separately.
|
|
72
75
|
backgroundDeadlineMs: hasHardDeadline ? totalTimeout : backgroundMaxBudget(),
|
|
73
|
-
autoBackgroundMs: autoBackgroundBudget(
|
|
76
|
+
autoBackgroundMs: autoBackgroundBudget(
|
|
77
|
+
backgroundOnTimeout,
|
|
78
|
+
timeout,
|
|
79
|
+
typeof args.wait_ms === 'number' ? args.wait_ms : 0,
|
|
80
|
+
maxForegroundMs
|
|
81
|
+
),
|
|
74
82
|
};
|
|
75
83
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { resourceAdmission } from '../../../../../shared/resource-admission.mjs';
|
|
1
2
|
import {
|
|
2
3
|
applyShellEgressPolicy,
|
|
3
4
|
scrubLoaderVars,
|
|
@@ -8,6 +9,9 @@ import {
|
|
|
8
9
|
export function buildShellSpawnEnv(cwd, baseEnv = process.env) {
|
|
9
10
|
const spawnEnv = {
|
|
10
11
|
...baseEnv,
|
|
12
|
+
// Lets fan-out-heavy children (the test runner) size themselves to their
|
|
13
|
+
// share of the machine: up to this many shells run concurrently.
|
|
14
|
+
MIXDOG_SHELL_CONCURRENCY_CAP: String(resourceAdmission.limits.maxShells),
|
|
11
15
|
LANG: 'C.UTF-8',
|
|
12
16
|
LC_ALL: 'C.UTF-8',
|
|
13
17
|
MIXDOG_SESSION_CWD: String(cwd || ''),
|
|
@@ -38,9 +38,9 @@ export { buildShellSpawnEnv } from './bash-tool/spawn-env.mjs';
|
|
|
38
38
|
export { executeTaskTool } from './task-tool.mjs';
|
|
39
39
|
|
|
40
40
|
// Reads cached after a mutating command must not serve pre-command state. A
|
|
41
|
-
// promoted command has barely started when the tool returns
|
|
42
|
-
//
|
|
43
|
-
function settleMutationCaches(shellEffects, backgroundJobId) {
|
|
41
|
+
// promoted command has barely started when the tool returns and a queued one
|
|
42
|
+
// has not started at all, so the invalidation repeats when it settles.
|
|
43
|
+
function settleMutationCaches(shellEffects, backgroundJobId, queuedSettled = null) {
|
|
44
44
|
const invalidate = () => {
|
|
45
45
|
if (shellEffects.mutationMode === 'paths') {
|
|
46
46
|
invalidateBuiltinResultCache(shellEffects.paths);
|
|
@@ -54,6 +54,7 @@ function settleMutationCaches(shellEffects, backgroundJobId) {
|
|
|
54
54
|
if (backgroundJobId && shellEffects.mutationMode !== 'none') {
|
|
55
55
|
subscribeShellJobSettled(backgroundJobId, invalidate);
|
|
56
56
|
}
|
|
57
|
+
if (queuedSettled && shellEffects.mutationMode !== 'none') queuedSettled.then(invalidate).catch(() => {});
|
|
57
58
|
}
|
|
58
59
|
|
|
59
60
|
export async function executeBashTool(args, workDir, options = {}) {
|
|
@@ -83,6 +84,7 @@ export async function executeBashTool(args, workDir, options = {}) {
|
|
|
83
84
|
let combinedAbort = null;
|
|
84
85
|
let backgrounded = false;
|
|
85
86
|
let backgroundJobId = null;
|
|
87
|
+
let queuedSettled = null;
|
|
86
88
|
try {
|
|
87
89
|
const invocation = await planShellInvocation({ command, resolvedSpec, cwd: bashWorkDir });
|
|
88
90
|
if (invocation.failure) return invocation.failure;
|
|
@@ -117,6 +119,7 @@ export async function executeBashTool(args, workDir, options = {}) {
|
|
|
117
119
|
});
|
|
118
120
|
backgrounded = result.backgrounded === true;
|
|
119
121
|
backgroundJobId = backgrounded ? result.jobId || null : null;
|
|
122
|
+
queuedSettled = backgrounded ? result.settled || null : null;
|
|
120
123
|
const stdout = stripAnsi(result.stdout || '');
|
|
121
124
|
const stderr = stripAnsi(result.stderr || '');
|
|
122
125
|
recordShellCaptureTelemetry(options?.resultTelemetry, result, stdout, stderr);
|
|
@@ -140,11 +143,14 @@ export async function executeBashTool(args, workDir, options = {}) {
|
|
|
140
143
|
} finally {
|
|
141
144
|
combinedAbort?.cleanup?.();
|
|
142
145
|
if (hoisted.hoistPath) {
|
|
143
|
-
// A promoted command still runs from the hoisted file; a
|
|
144
|
-
// is done with it now (an unconfirmed kill may keep it
|
|
145
|
-
|
|
146
|
+
// A promoted or queued command still runs from the hoisted file; a
|
|
147
|
+
// foreground one is done with it now (an unconfirmed kill may keep it
|
|
148
|
+
// locked — retried).
|
|
149
|
+
if (queuedSettled) {
|
|
150
|
+
queuedSettled.then(() => removeTransportFileNow(hoisted.hoistPath)).catch(() => {});
|
|
151
|
+
} else if (backgrounded) cleanupArtifactOnTaskSettled(hoisted.hoistPath, backgroundJobId);
|
|
146
152
|
else removeTransportFileNow(hoisted.hoistPath);
|
|
147
153
|
}
|
|
148
|
-
settleMutationCaches(shellEffects, backgroundJobId);
|
|
154
|
+
settleMutationCaches(shellEffects, backgroundJobId, queuedSettled);
|
|
149
155
|
}
|
|
150
156
|
}
|
|
@@ -3,6 +3,7 @@ import { open } from 'node:fs/promises';
|
|
|
3
3
|
|
|
4
4
|
const HEAD_CAP = 64 * 1024;
|
|
5
5
|
const TAIL_SIZE = 4 * 1024;
|
|
6
|
+
const BINARY_PREVIEW_BYTES = 256;
|
|
6
7
|
|
|
7
8
|
function hasUtf16Bom(buf, length = buf?.length || 0) {
|
|
8
9
|
return length >= 2 && ((buf[0] === 0xff && buf[1] === 0xfe) || (buf[0] === 0xfe && buf[1] === 0xff));
|
|
@@ -79,7 +80,11 @@ export function isBinaryBuffer(buf, fileSize = buf?.length || 0) {
|
|
|
79
80
|
* Returns the head bytes even when the null marker is in the tail so callers
|
|
80
81
|
* can render a hex preview without reopening the file.
|
|
81
82
|
*/
|
|
82
|
-
export async function inspectBinaryFile(
|
|
83
|
+
export async function inspectBinaryFile(
|
|
84
|
+
fullPath,
|
|
85
|
+
fileSize = 0,
|
|
86
|
+
{ previewBytes = BINARY_PREVIEW_BYTES, handle = null } = {}
|
|
87
|
+
) {
|
|
83
88
|
const headBytes = fileSize > 0 ? Math.min(fileSize, HEAD_CAP) : HEAD_CAP;
|
|
84
89
|
let fh;
|
|
85
90
|
try {
|
|
@@ -107,8 +112,6 @@ export async function inspectBinaryFile(fullPath, fileSize = 0, { previewBytes =
|
|
|
107
112
|
}
|
|
108
113
|
}
|
|
109
114
|
|
|
110
|
-
const BINARY_PREVIEW_BYTES = 256;
|
|
111
|
-
|
|
112
115
|
export function formatBinaryReadPreviewFromBuffer(
|
|
113
116
|
buffer,
|
|
114
117
|
displayPath,
|
|
@@ -48,7 +48,7 @@ export const BUILTIN_TOOLS = [
|
|
|
48
48
|
compressible: false,
|
|
49
49
|
},
|
|
50
50
|
description:
|
|
51
|
-
"Read file windows or images. One call per read stage: {file_path, offset, limit} entries for every located site (≤10 per call), never a whole large file. Content in context is never read again. Missing paths are reported, never replaced. Directories: list. Binaries: bounded hex. Rows carry no line numbers; `[lines a-b]` gives each block's range. Never count rows: before writing a line number, copy it from grep, code_graph or git diff output; otherwise cite path and symbol.",
|
|
51
|
+
"Read file windows or images. One call per read stage: {file_path, offset, limit} entries for every located site (≤10 files per call), never a whole large file. Content in context is never read again. Missing paths are reported, never replaced. Directories: list. Binaries: bounded hex. Rows carry no line numbers; `[lines a-b]` gives each block's range. Never count rows: before writing a line number, copy it from grep, code_graph or git diff output; otherwise cite path and symbol.",
|
|
52
52
|
inputSchema: {
|
|
53
53
|
type: 'object',
|
|
54
54
|
properties: {
|
|
@@ -66,7 +66,7 @@ export const BUILTIN_TOOLS = [
|
|
|
66
66
|
type: 'object',
|
|
67
67
|
properties: {
|
|
68
68
|
file_path: { type: 'string' },
|
|
69
|
-
offset: { type: 'integer', minimum: 1
|
|
69
|
+
offset: { type: 'integer', minimum: 1 },
|
|
70
70
|
limit: { type: 'integer', minimum: 1, maximum: PUBLIC_READ_WINDOW_MAX },
|
|
71
71
|
},
|
|
72
72
|
required: ['file_path'],
|
|
@@ -82,7 +82,6 @@ export const BUILTIN_TOOLS = [
|
|
|
82
82
|
offset: {
|
|
83
83
|
type: 'integer',
|
|
84
84
|
minimum: 1,
|
|
85
|
-
maximum: PUBLIC_READ_WINDOW_MAX,
|
|
86
85
|
description: '1-based start line; default 1; batch default.',
|
|
87
86
|
},
|
|
88
87
|
limit: {
|
|
@@ -147,7 +146,7 @@ export const BUILTIN_TOOLS = [
|
|
|
147
146
|
openWorldHint: true,
|
|
148
147
|
compressible: true,
|
|
149
148
|
},
|
|
150
|
-
description: `Run programs, builds, tests and computation. Never use shell commands or scripts for work covered by dedicated tools: cat/head/tail→read, ls→list, find→glob, filename lookup→find, grep/rg→grep, code structure→code_graph, file edits/writes (sed/awk/redirection)→edit/apply_patch, Git→git when that tool is on the surface. Tool names are not shell commands. ${_shellBackgroundDisabled ? 'Commands run in the foreground until completion.' : 'After a 10s foreground window (not a timeout), unfinished work continues under task_id; use task wait, not read polling.'}`,
|
|
149
|
+
description: `Run programs, builds, tests and computation. Never use shell commands or scripts for work covered by dedicated tools: cat/head/tail→read, ls→list, find→glob, filename lookup→find, grep/rg→grep, code structure→code_graph, file edits/writes (sed/awk/redirection)→edit/apply_patch, Git→git when that tool is on the surface. Tool names are not shell commands. ${_shellBackgroundDisabled ? 'Commands run in the foreground until completion.' : 'After a 10s foreground window (not a timeout; wait_ms extends it up to 120s for one call, e.g. a test suite), unfinished work continues under task_id; use task wait, not read polling. If no execution slot frees within the admission wait, the command is queued as a background task with a task_id.'}`,
|
|
151
150
|
inputSchema: {
|
|
152
151
|
type: 'object',
|
|
153
152
|
properties: {
|
|
@@ -158,6 +157,13 @@ export const BUILTIN_TOOLS = [
|
|
|
158
157
|
description:
|
|
159
158
|
'Hard kill deadline in ms (omit or 0 = none), separate from the 10s foreground window; set one for throwaway probes so a slow check fails fast.',
|
|
160
159
|
},
|
|
160
|
+
wait_ms: {
|
|
161
|
+
type: 'integer',
|
|
162
|
+
minimum: 1000,
|
|
163
|
+
maximum: 120000,
|
|
164
|
+
description:
|
|
165
|
+
'Foreground wait in ms before unfinished work continues as a background task (default 10000); raise it for a command that should return its result in this call.',
|
|
166
|
+
},
|
|
161
167
|
},
|
|
162
168
|
required: ['command'],
|
|
163
169
|
additionalProperties: false,
|
|
@@ -364,7 +370,7 @@ export const BUILTIN_TOOLS = [
|
|
|
364
370
|
description: 'Known directory; defaults to the current Project.',
|
|
365
371
|
},
|
|
366
372
|
hidden: { type: 'boolean', description: 'Include dotfiles.' },
|
|
367
|
-
meta: { type: 'boolean', description: 'Per-entry size bytes, UTC mtime, octal mode.' },
|
|
373
|
+
meta: { type: 'boolean', description: 'Per-entry size bytes, UTC mtime, octal mode; text files also get a line count.' },
|
|
368
374
|
limit: {
|
|
369
375
|
type: 'integer',
|
|
370
376
|
minimum: 0,
|
|
@@ -1,206 +1 @@
|
|
|
1
|
-
|
|
2
|
-
// would either hang (waiting for stdin / tty) or produce infinite output
|
|
3
|
-
// (/dev/zero, /dev/random). The device block list catches pseudo-files on
|
|
4
|
-
// POSIX hosts that a user-allowed path can still hit.
|
|
5
|
-
const BLOCKED_DEVICE_PATHS = new Set([
|
|
6
|
-
'/dev/zero',
|
|
7
|
-
'/dev/random',
|
|
8
|
-
'/dev/urandom',
|
|
9
|
-
'/dev/full',
|
|
10
|
-
'/dev/stdin',
|
|
11
|
-
'/dev/tty',
|
|
12
|
-
'/dev/console',
|
|
13
|
-
'/dev/stdout',
|
|
14
|
-
'/dev/stderr',
|
|
15
|
-
'/dev/fd/0',
|
|
16
|
-
'/dev/fd/1',
|
|
17
|
-
'/dev/fd/2',
|
|
18
|
-
]);
|
|
19
|
-
|
|
20
|
-
export function isBlockedDevicePath(p) {
|
|
21
|
-
if (BLOCKED_DEVICE_PATHS.has(p)) return true;
|
|
22
|
-
// /proc/self/fd/0-2 and /proc/<pid>/fd/0-2 are Linux aliases for stdio.
|
|
23
|
-
if (
|
|
24
|
-
typeof p === 'string' &&
|
|
25
|
-
p.startsWith('/proc/') &&
|
|
26
|
-
(p.endsWith('/fd/0') || p.endsWith('/fd/1') || p.endsWith('/fd/2'))
|
|
27
|
-
)
|
|
28
|
-
return true;
|
|
29
|
-
return false;
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
// R1: UNC / SMB share paths (\\server\share or //server/share). Reading these
|
|
33
|
-
// causes Windows to auto-authenticate to the remote host, leaking the NTLM
|
|
34
|
-
// hash of the current user to any attacker-controlled SMB target. The prefix
|
|
35
|
-
// is rejected before stat. Accepts both
|
|
36
|
-
// backslash and forward-slash leaders so a normalize that picked either form
|
|
37
|
-
// is caught.
|
|
38
|
-
export function isUncPath(p) {
|
|
39
|
-
if (typeof p !== 'string' || p.length < 2) return false;
|
|
40
|
-
return (p[0] === '\\' && p[1] === '\\') || (p[0] === '/' && p[1] === '/');
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// R2: Windows reserved device basenames (CON, NUL, PRN, AUX, COM0-9, LPT0-9)
|
|
44
|
-
// and raw-device namespace prefixes (\\.\ DosDevices, \\?\ NT namespace).
|
|
45
|
-
// CON/NUL etc. are kernel-level aliases that never resolve to real files
|
|
46
|
-
// when used as bare names; \\.\PhysicalDrive0 / \\.\CON allow raw device
|
|
47
|
-
// access. Basenames with a real extension (nul.bin) are ordinary files.
|
|
48
|
-
const WIN_RESERVED_BASENAMES = new Set([
|
|
49
|
-
'CON',
|
|
50
|
-
'NUL',
|
|
51
|
-
'PRN',
|
|
52
|
-
'AUX',
|
|
53
|
-
// CONIN$ / CONOUT$ are the console input/output device aliases; the
|
|
54
|
-
// trailing '$' is part of the name and survives stem extraction
|
|
55
|
-
// (cut happens at the first '.'/':' only).
|
|
56
|
-
'CONIN$',
|
|
57
|
-
'CONOUT$',
|
|
58
|
-
'COM0',
|
|
59
|
-
'COM1',
|
|
60
|
-
'COM2',
|
|
61
|
-
'COM3',
|
|
62
|
-
'COM4',
|
|
63
|
-
'COM5',
|
|
64
|
-
'COM6',
|
|
65
|
-
'COM7',
|
|
66
|
-
'COM8',
|
|
67
|
-
'COM9',
|
|
68
|
-
'LPT0',
|
|
69
|
-
'LPT1',
|
|
70
|
-
'LPT2',
|
|
71
|
-
'LPT3',
|
|
72
|
-
'LPT4',
|
|
73
|
-
'LPT5',
|
|
74
|
-
'LPT6',
|
|
75
|
-
'LPT7',
|
|
76
|
-
'LPT8',
|
|
77
|
-
'LPT9',
|
|
78
|
-
// Win32 normalizes the Latin-1 superscript digits ¹ (U+00B9), ²
|
|
79
|
-
// (U+00B2), ³ (U+00B3) to 1/2/3 when resolving device names, so
|
|
80
|
-
// COM¹/COM²/COM³ and LPT¹/LPT²/LPT³ open the real COM1-3/LPT1-3
|
|
81
|
-
// devices. toUpperCase() leaves these codepoints unchanged, so they
|
|
82
|
-
// must be listed literally.
|
|
83
|
-
'COM\u00B9',
|
|
84
|
-
'COM\u00B2',
|
|
85
|
-
'COM\u00B3',
|
|
86
|
-
'LPT\u00B9',
|
|
87
|
-
'LPT\u00B2',
|
|
88
|
-
'LPT\u00B3',
|
|
89
|
-
]);
|
|
90
|
-
// Unicode invisibles (BOM, zero-width joiners, bidi controls) that Win32
|
|
91
|
-
// path-open codepaths collapse or ignore.
|
|
92
|
-
const WIN32_IGNORED_INVISIBLES = /[\uFEFF\u200B-\u200F\u202A-\u202E\u2066-\u2069]/g;
|
|
93
|
-
export function isWindowsDevicePath(p) {
|
|
94
|
-
if (typeof p !== 'string' || p.length === 0) return false;
|
|
95
|
-
// \\.\ and \\?\ raw-device / DOS-device namespace (both slash forms).
|
|
96
|
-
if (p.startsWith('\\\\.\\') || p.startsWith('\\\\?\\')) return true;
|
|
97
|
-
if (p.startsWith('//./') || p.startsWith('//?/')) return true;
|
|
98
|
-
// Reserved basenames (CON/NUL/PRN/AUX/COM*/LPT*) are device aliases ONLY on
|
|
99
|
-
// Windows; on POSIX a file literally named `con.txt` is a normal regular
|
|
100
|
-
// file. Gate the basename check to win32 so non-Windows reads of such names
|
|
101
|
-
// aren't false-rejected (the \\.\ / \\?\ namespace checks above stay
|
|
102
|
-
// unconditional). reviewer-flagged false positive.
|
|
103
|
-
if (process.platform !== 'win32') return false;
|
|
104
|
-
// Basename match, case-insensitive, extension-stripped. R12: splitting
|
|
105
|
-
// on '.' alone missed NTFS ADS suffixes (NUL:stream, CON:stream) and
|
|
106
|
-
// trailing Win32-ignored dots/spaces ("CON. ", "NUL. ") that the
|
|
107
|
-
// kernel still resolves to the reserved device. Compute the stem by
|
|
108
|
-
// cutting at the FIRST '.' or ':' in the basename, then stripping
|
|
109
|
-
// any trailing dots/spaces that Win32 silently drops.
|
|
110
|
-
const lastSep = Math.max(p.lastIndexOf('\\'), p.lastIndexOf('/'));
|
|
111
|
-
const base = lastSep >= 0 ? p.slice(lastSep + 1) : p;
|
|
112
|
-
let cut = base.length;
|
|
113
|
-
for (let i = 0; i < base.length; i += 1) {
|
|
114
|
-
const ch = base.charCodeAt(i);
|
|
115
|
-
if (ch === 0x2e /* . */ || ch === 0x3a /* : */) {
|
|
116
|
-
cut = i;
|
|
117
|
-
break;
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
let stem = base.slice(0, cut);
|
|
121
|
-
// R14: strip Unicode invisibles (BOM, zero-width joiners, bidi controls)
|
|
122
|
-
// BEFORE the trailing-dot / reserved-name checks. Win32 GetFinalPathName
|
|
123
|
-
// and a number of file APIs collapse / ignore these characters when
|
|
124
|
-
// opening, so "CON\u200B" or "\uFEFFCON" can resolve to the CON device
|
|
125
|
-
// even though byte-comparison says "not reserved". Drop them defensively.
|
|
126
|
-
stem = stem.replace(WIN32_IGNORED_INVISIBLES, '');
|
|
127
|
-
// Strip trailing dots / spaces — Win32 ignores them when opening a
|
|
128
|
-
// file, so "CON. " and "CON " resolve to CON. Loop instead of regex
|
|
129
|
-
// to keep allocation-free hot path.
|
|
130
|
-
let end = stem.length;
|
|
131
|
-
while (end > 0) {
|
|
132
|
-
const ch = stem.charCodeAt(end - 1);
|
|
133
|
-
if (ch === 0x2e /* . */ || ch === 0x20 /* SP */) {
|
|
134
|
-
end -= 1;
|
|
135
|
-
continue;
|
|
136
|
-
}
|
|
137
|
-
break;
|
|
138
|
-
}
|
|
139
|
-
stem = stem.slice(0, end).toUpperCase();
|
|
140
|
-
if (!WIN_RESERVED_BASENAMES.has(stem)) return false;
|
|
141
|
-
// Bare device alias only (NUL, CON, …). A dotted extension means a normal
|
|
142
|
-
// file even when the stem matches a reserved name (dir/nul.bin).
|
|
143
|
-
return cut >= base.length;
|
|
144
|
-
}
|
|
145
|
-
|
|
146
|
-
// R12: Win32 path-component guard. Rejects any path component that
|
|
147
|
-
// (a) ends in '.' or ' ' — Win32 silently strips trailing dots/spaces
|
|
148
|
-
// when opening, so the kernel resolves a DIFFERENT path than the one
|
|
149
|
-
// the guard sees, bypassing string-based device/UNC checks; or
|
|
150
|
-
// (b) contains ':' after the optional `<drive>:` prefix — colon inside
|
|
151
|
-
// a component names an NTFS Alternate Data Stream (e.g. `file.txt:hidden`),
|
|
152
|
-
// which is a hidden writable channel attached to another file.
|
|
153
|
-
// Legitimate Windows filenames never have trailing dot/space or embedded
|
|
154
|
-
// ':' in any component, so unconditional rejection is safe.
|
|
155
|
-
export function hasUnsafeWin32Component(p) {
|
|
156
|
-
if (process.platform !== 'win32') return false;
|
|
157
|
-
if (typeof p !== 'string' || p.length === 0) return false;
|
|
158
|
-
// Strip optional drive prefix (`C:` / `c:`) so the drive colon is not
|
|
159
|
-
// mistaken for an ADS marker. \\.\ / \\?\ raw-device prefixes are
|
|
160
|
-
// already rejected by isWindowsDevicePath; treat their bytes as
|
|
161
|
-
// ordinary components here so a `\\?\C:\foo:stream` still trips.
|
|
162
|
-
let rest = p;
|
|
163
|
-
if (
|
|
164
|
-
rest.length >= 2 &&
|
|
165
|
-
rest.charCodeAt(1) === 0x3a /* : */ &&
|
|
166
|
-
((rest.charCodeAt(0) >= 0x41 && rest.charCodeAt(0) <= 0x5a) ||
|
|
167
|
-
(rest.charCodeAt(0) >= 0x61 && rest.charCodeAt(0) <= 0x7a))
|
|
168
|
-
) {
|
|
169
|
-
rest = rest.slice(2);
|
|
170
|
-
}
|
|
171
|
-
// Split on both Win32 separators.
|
|
172
|
-
const parts = rest.split(/[\\/]+/);
|
|
173
|
-
for (const rawPart of parts) {
|
|
174
|
-
if (!rawPart) continue;
|
|
175
|
-
// R14: strip Unicode invisibles (BOM, zero-width joiners, bidi controls)
|
|
176
|
-
// BEFORE the trailing-dot / ADS-colon checks. Win32 ignores these
|
|
177
|
-
// characters in many path-open codepaths, so "foo \u200B" (trailing
|
|
178
|
-
// space + ZWSP) or "name\uFEFF:stream" must still trip the guard.
|
|
179
|
-
const part = rawPart.replace(WIN32_IGNORED_INVISIBLES, '');
|
|
180
|
-
if (!part) continue;
|
|
181
|
-
// `.` and `..` are the standard current/parent-dir components — they end
|
|
182
|
-
// in '.' but are NOT a trailing-dot bypass, so exempt them (without this
|
|
183
|
-
// a default relative path like "." or "src/.." is rejected on Windows).
|
|
184
|
-
// Any other trailing dot/space is still unsafe.
|
|
185
|
-
if (part === '.' || part === '..') continue;
|
|
186
|
-
const last = part.charCodeAt(part.length - 1);
|
|
187
|
-
if (last === 0x2e /* . */ || last === 0x20 /* SP */) return true;
|
|
188
|
-
if (part.indexOf(':') >= 0) return true;
|
|
189
|
-
}
|
|
190
|
-
return false;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
// R2: Stat-based special-file reject. FIFOs, character devices, block devices,
|
|
194
|
-
// and sockets pass a normal statSync but reading them either hangs (FIFO with
|
|
195
|
-
// no writer, socket) or produces unbounded output (/dev/zero, /dev/random).
|
|
196
|
-
// Must be called AFTER statSync (or fstatSync) — the string-based device
|
|
197
|
-
// guard catches well-known paths, this catches arbitrary user paths that
|
|
198
|
-
// happen to point at a special inode (custom mknod, symlink targets, etc.).
|
|
199
|
-
export function isSpecialFileStat(st) {
|
|
200
|
-
if (!st || typeof st !== 'object') return false;
|
|
201
|
-
try {
|
|
202
|
-
return st.isFIFO() || st.isCharacterDevice() || st.isBlockDevice() || st.isSocket();
|
|
203
|
-
} catch {
|
|
204
|
-
return false;
|
|
205
|
-
}
|
|
206
|
-
}
|
|
1
|
+
export * from '../../../../shared/device-paths.mjs';
|
|
@@ -247,7 +247,7 @@ function invalidWindowError(field, value) {
|
|
|
247
247
|
// The find request as the walk sees it: the root, the name pattern (a glob
|
|
248
248
|
// in `path` becomes the pattern), the filters and the page.
|
|
249
249
|
function findFilesRequest(args, workDir) {
|
|
250
|
-
args.path = coerceReadFamilyPathArg(args.path
|
|
250
|
+
args.path = coerceReadFamilyPathArg(args.path);
|
|
251
251
|
args.path = normalizeInputPath(args.path);
|
|
252
252
|
let inputPath = args.path || '.';
|
|
253
253
|
let namePattern = typeof args.name === 'string' ? args.name : null;
|
|
@@ -3,6 +3,7 @@ import { mkdtemp, rm, writeFile } from 'node:fs/promises';
|
|
|
3
3
|
import { tmpdir } from 'node:os';
|
|
4
4
|
import { basename, dirname, join, resolve } from 'node:path';
|
|
5
5
|
import { tokenizeDirectArgv } from './shell-direct-exe.mjs';
|
|
6
|
+
import { GIT_DIFF_EXIT_SIGNAL_FLAGS } from './bash-tool/benign-exit.mjs';
|
|
6
7
|
import { withBuiltinPathLocks } from './path-locks.mjs';
|
|
7
8
|
import { withAdvisoryLocks } from './advisory-lock.mjs';
|
|
8
9
|
import { withGitRepoReadLock, withGitRepoWriteLock } from './git-repo-rw-lock.mjs';
|
|
@@ -154,8 +155,13 @@ function commandResult(plan, result, limit) {
|
|
|
154
155
|
const output = capOutput(appendText(String(result.stdout || ''), String(result.stderr || '')), limit);
|
|
155
156
|
if (succeeded(result)) return { text: output, failed: false };
|
|
156
157
|
const processError = result.error || result.timedOut || result.aborted || result.overflow || result.exitCode == null;
|
|
158
|
+
// An exit signal is still a non-zero exit, so a command array stops on it;
|
|
159
|
+
// the outcome line only keeps the card from reporting a failure.
|
|
160
|
+
const exitHeader = exitSignal(plan, result)
|
|
161
|
+
? `exit ${result.exitCode}\n[outcome: no-match]`
|
|
162
|
+
: `exit ${result.exitCode}`;
|
|
157
163
|
return {
|
|
158
|
-
text: appendText(processError ? fail(gitFailureReason(plan, result)) :
|
|
164
|
+
text: appendText(processError ? fail(gitFailureReason(plan, result)) : exitHeader, output),
|
|
159
165
|
failed: true,
|
|
160
166
|
};
|
|
161
167
|
}
|
|
@@ -337,6 +343,18 @@ function succeeded(result) {
|
|
|
337
343
|
return result?.exitCode === 0 && !result.error && !result.timedOut && !result.aborted && !result.overflow;
|
|
338
344
|
}
|
|
339
345
|
|
|
346
|
+
// `git grep` exits 1 for no match and `git diff --exit-code/--quiet/--check`
|
|
347
|
+
// exits 1 to report a difference; the shell tool marks the same exits as
|
|
348
|
+
// signals, so the git tool does too.
|
|
349
|
+
function exitSignal(plan, result) {
|
|
350
|
+
if (result.exitCode !== 1 || String(result.stderr || '').trim()) return false;
|
|
351
|
+
if (plan.operation === 'grep') return true;
|
|
352
|
+
if (plan.operation !== 'diff') return false;
|
|
353
|
+
const separator = plan.args.indexOf('--');
|
|
354
|
+
const options = separator === -1 ? plan.args : plan.args.slice(0, separator);
|
|
355
|
+
return options.some((arg) => GIT_DIFF_EXIT_SIGNAL_FLAGS.has(arg));
|
|
356
|
+
}
|
|
357
|
+
|
|
340
358
|
// ENOENT from the spawn itself is a capability fact, not a git error: the
|
|
341
359
|
// executable is absent. Naming it stops the caller from re-running git a
|
|
342
360
|
// different way to find out.
|
|
@@ -780,8 +798,26 @@ function splitChainedGitCommands(command) {
|
|
|
780
798
|
return commands.length > 1 ? commands : null;
|
|
781
799
|
}
|
|
782
800
|
|
|
783
|
-
|
|
784
|
-
|
|
801
|
+
// The tool only runs git, so a submitted command that omits the leading `git`
|
|
802
|
+
// ("status --short") gets it instead of a rejection. Only whole submitted
|
|
803
|
+
// commands are prefixed; a `&&` piece after the first still has to be a full
|
|
804
|
+
// git command, so non-git chain segments stay refused.
|
|
805
|
+
function withGitPrefix(command) {
|
|
806
|
+
if (typeof command !== 'string') return command;
|
|
807
|
+
const text = String(unwrapQuotedCommand(command)).trim();
|
|
808
|
+
const first = text ? tokenizeDirectArgv(text)?.[0] : '';
|
|
809
|
+
if (!first || /(^|[\\/])git(?:\.exe)?$/i.test(first)) return command;
|
|
810
|
+
return `git ${text}`;
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
export async function executeGitTool(rawInput, workDir, options = {}) {
|
|
814
|
+
if (!rawInput || typeof rawInput !== 'object' || Array.isArray(rawInput))
|
|
815
|
+
return fail('git requires an arguments object');
|
|
816
|
+
const input = {
|
|
817
|
+
...rawInput,
|
|
818
|
+
command: Array.isArray(rawInput.command) ? rawInput.command.map(withGitPrefix) : withGitPrefix(rawInput.command),
|
|
819
|
+
};
|
|
820
|
+
if (rawInput.command === undefined) delete input.command;
|
|
785
821
|
const action = input.action ?? 'command';
|
|
786
822
|
if (action === 'stage') {
|
|
787
823
|
if (input.command !== undefined || input.include_stage_ids !== undefined) {
|
|
@@ -16,7 +16,7 @@ import { runRgWindowedLines } from '../native-search-runner.mjs';
|
|
|
16
16
|
import { statReachable } from '../fs-reachability.mjs';
|
|
17
17
|
import { markScopedCacheIncomplete } from '../../../session/cache/scoped-cache-outcome.mjs';
|
|
18
18
|
import { GREP_CONTEXT_MAX, hasUnsupportedRipgrepRegex } from '../arg-guard.mjs';
|
|
19
|
-
import {
|
|
19
|
+
import { resolveSearchWindow } from './search-input-helpers.mjs';
|
|
20
20
|
import { formatGrepFanoutSections, formatGrepOutput, grepNoMatchesBody } from './grep-output.mjs';
|
|
21
21
|
import { expandGrepAnchorContextOutput } from './grep-context-expander.mjs';
|
|
22
22
|
|
|
@@ -55,10 +55,8 @@ function combinedPathRequest(args, defaultHeadLimit) {
|
|
|
55
55
|
const rawMode = typeof args.output_mode === 'string' ? args.output_mode.trim() : '';
|
|
56
56
|
if (!['', 'content', 'content_with_context', 'files_with_matches'].includes(rawMode)) return null;
|
|
57
57
|
const outMode = rawMode === 'files_with_matches' ? 'files_with_matches' : 'content';
|
|
58
|
-
const
|
|
59
|
-
if (
|
|
60
|
-
const offRaw = coerceNonNegInt(args.offset);
|
|
61
|
-
if (Number.isNaN(offRaw)) return null;
|
|
58
|
+
const window = resolveSearchWindow(args, defaultHeadLimit);
|
|
59
|
+
if (window.error) return null;
|
|
62
60
|
const ctxRaw = args['-C'] !== undefined && args['-C'] !== null && args['-C'] !== '' ? args['-C'] : args.context;
|
|
63
61
|
let contextN = null;
|
|
64
62
|
if (ctxRaw !== undefined && ctxRaw !== null && ctxRaw !== '') {
|
|
@@ -69,8 +67,8 @@ function combinedPathRequest(args, defaultHeadLimit) {
|
|
|
69
67
|
return {
|
|
70
68
|
pattern,
|
|
71
69
|
outMode,
|
|
72
|
-
headLimit:
|
|
73
|
-
offset:
|
|
70
|
+
headLimit: window.headLimit,
|
|
71
|
+
offset: window.offset,
|
|
74
72
|
contextN,
|
|
75
73
|
// Leave contextN null for the automatic window: the expander reads that as
|
|
76
74
|
// "no caller-requested radius" and applies the asymmetric default.
|
|
@@ -3,7 +3,6 @@
|
|
|
3
3
|
// an early answer (`result`), a delegation to the glob tool (`delegate`), or
|
|
4
4
|
// the resolved `request` the search itself runs from.
|
|
5
5
|
import { isAbsolute } from 'node:path';
|
|
6
|
-
import { markScopedCacheIncomplete } from '../../../session/cache/scoped-cache-outcome.mjs';
|
|
7
6
|
import { applyGrepContextLeadPolicy, GREP_CONTEXT_MAX, hasUnsupportedRipgrepRegex } from '../arg-guard.mjs';
|
|
8
7
|
import { statReachable } from '../fs-reachability.mjs';
|
|
9
8
|
import {
|
|
@@ -20,9 +19,9 @@ import { isUncOrSmbPath, resolveSearchScope, uncRefusalMessage } from '../search
|
|
|
20
19
|
import { _grepDefaultHeadLimit } from './grep-context-expander.mjs';
|
|
21
20
|
import { grepMissingPatternMessage } from './grep-output.mjs';
|
|
22
21
|
import {
|
|
23
|
-
|
|
22
|
+
capPatternList,
|
|
24
23
|
isRedundantAllFilesGlob,
|
|
25
|
-
|
|
24
|
+
resolveSearchWindow,
|
|
26
25
|
stringList,
|
|
27
26
|
uniqueStrings,
|
|
28
27
|
} from './search-input-helpers.mjs';
|
|
@@ -137,19 +136,9 @@ function resolveGrepWindow(args) {
|
|
|
137
136
|
// Filename-only and count searches are explicit: callers must opt into
|
|
138
137
|
// `files_with_matches` or `count` when they only need existence/count data.
|
|
139
138
|
const outputMode = rawOutputMode === 'content_with_context' ? 'content' : rawOutputMode || 'content';
|
|
140
|
-
const
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
return {
|
|
144
|
-
result: `Error: invalid limit ${JSON.stringify(headLimitRaw)}; expected a non-negative integer (0 = unlimited)`,
|
|
145
|
-
};
|
|
146
|
-
}
|
|
147
|
-
const headLimit = resolveHeadLimit(headLimitCoerced, _grepDefaultHeadLimit());
|
|
148
|
-
const offsetCoerced = coerceNonNegInt(args.offset);
|
|
149
|
-
if (Number.isNaN(offsetCoerced)) {
|
|
150
|
-
return { result: `Error: invalid offset ${JSON.stringify(args.offset)}; expected a non-negative integer` };
|
|
151
|
-
}
|
|
152
|
-
const offset = offsetCoerced || 0;
|
|
139
|
+
const window = resolveSearchWindow(args, _grepDefaultHeadLimit());
|
|
140
|
+
if (window.error) return { result: window.error };
|
|
141
|
+
const { headLimit, headLimitCoerced, offset } = window;
|
|
153
142
|
const context = resolveGrepContextFlags(args, wantAutoContext);
|
|
154
143
|
if (context.result !== undefined) return context;
|
|
155
144
|
return { outputMode, headLimit, headLimitCoerced, offset, ...context };
|
|
@@ -215,15 +204,8 @@ function resolveGrepFileType(rawType) {
|
|
|
215
204
|
// never cache it as complete. Applies to every downstream path (fan-out,
|
|
216
205
|
// chunk-merge, single combined).
|
|
217
206
|
function capGrepPatterns(requested, options) {
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
}
|
|
221
|
-
if (options?.scopedCacheOutcome) markScopedCacheIncomplete(options.scopedCacheOutcome);
|
|
222
|
-
return {
|
|
223
|
-
patterns: requested.slice(0, GREP_PATTERN_ARRAY_CAP),
|
|
224
|
-
patternCapNote: `[capped at ${GREP_PATTERN_ARRAY_CAP} of ${requested.length} patterns]\n`,
|
|
225
|
-
patternCapTotal: requested.length,
|
|
226
|
-
};
|
|
207
|
+
const { patterns, note, total } = capPatternList(requested, GREP_PATTERN_ARRAY_CAP, options);
|
|
208
|
+
return { patterns, patternCapNote: note, patternCapTotal: total };
|
|
227
209
|
}
|
|
228
210
|
|
|
229
211
|
// A pattern-less grep with a glob or magic path is a file search in disguise.
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import { buildNotFoundHint, finalizeReadFamilyEnoentTail } from '../search-path-diagnostics.mjs';
|
|
2
|
+
import { open } from 'node:fs/promises';
|
|
2
3
|
import { normalizeErrorMessage } from '../path-diagnostics.mjs';
|
|
4
|
+
import { isBinaryBuffer } from '../binary-file.mjs';
|
|
3
5
|
import { isUncPath, isWindowsDevicePath, hasUnsafeWin32Component } from '../device-paths.mjs';
|
|
4
6
|
import { normalizeOutputPath, resolveAgainstCwd } from '../path-utils.mjs';
|
|
5
7
|
|
|
@@ -29,7 +31,7 @@ export function normalizeListHeadLimit(raw, defaultCap) {
|
|
|
29
31
|
// remote host (NTLM hash leak); a raw-device / reserved-name path can
|
|
30
32
|
// hang or grant raw access. Mirrors the read path's string-based checks.
|
|
31
33
|
// Returns an Error string when the path is blocked, else null.
|
|
32
|
-
|
|
34
|
+
function listGuardPath(p) {
|
|
33
35
|
if (isUncPath(p))
|
|
34
36
|
return `Error: cannot walk UNC / SMB path (network credential leak risk): ${normalizeOutputPath(p)}`;
|
|
35
37
|
if (isWindowsDevicePath(p))
|
|
@@ -53,3 +55,27 @@ export function guardedWalkRoot(inputPath, workDir) {
|
|
|
53
55
|
export function pageContinuationLine(offset, shown, total) {
|
|
54
56
|
return `... [entries ${offset + 1}-${offset + shown} of ${total}; pass offset:${offset + shown} to continue]`;
|
|
55
57
|
}
|
|
58
|
+
|
|
59
|
+
const LINE_COUNT_MAX_BYTES = 2 * 1024 * 1024;
|
|
60
|
+
|
|
61
|
+
/** Line count of a text file for list meta rows; null for binaries, files over
|
|
62
|
+
* the size cap, and anything unreadable. */
|
|
63
|
+
export async function countTextFileLines(fullPath, size) {
|
|
64
|
+
if (!(size <= LINE_COUNT_MAX_BYTES)) return null;
|
|
65
|
+
let handle;
|
|
66
|
+
try {
|
|
67
|
+
handle = await open(fullPath, 'r');
|
|
68
|
+
const buf = Buffer.alloc(size);
|
|
69
|
+
const { bytesRead } = await handle.read(buf, 0, size, 0);
|
|
70
|
+
const data = buf.subarray(0, bytesRead);
|
|
71
|
+
if (bytesRead === 0) return 0;
|
|
72
|
+
if (isBinaryBuffer(data, bytesRead)) return null;
|
|
73
|
+
let lines = 0;
|
|
74
|
+
for (let i = data.indexOf(10); i !== -1; i = data.indexOf(10, i + 1)) lines += 1;
|
|
75
|
+
return data[bytesRead - 1] === 10 ? lines : lines + 1;
|
|
76
|
+
} catch {
|
|
77
|
+
return null;
|
|
78
|
+
} finally {
|
|
79
|
+
await handle?.close().catch(() => {});
|
|
80
|
+
}
|
|
81
|
+
}
|