mixdog 0.9.172 → 0.9.173
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/package.json +3 -3
- package/scripts/code-graph-description-contract.mjs +1 -2
- package/scripts/context-renewal-live-check.mjs +1 -1
- package/scripts/coverage-query.mjs +27 -0
- package/scripts/generate-runtime-manifest.mjs +12 -16
- package/scripts/graph-parity.mjs +108 -75
- package/scripts/lib/coverage.mjs +309 -0
- package/scripts/lib/embedding-model-bench-core.mjs +4 -2
- package/scripts/lib/recall-bench-eval.mjs +4 -4
- package/scripts/lib/run-node-tests.mjs +137 -13
- package/scripts/lib/test-failure-records.mjs +46 -0
- package/scripts/lib/test-failure-summary.mjs +59 -0
- package/scripts/lib/test-summary-reporter.mjs +7 -3
- package/scripts/mouse-probe.mjs +1 -3
- package/scripts/office/build-pptx-icons.mjs +0 -1
- package/scripts/perf/transcript-runtime-probe.mjs +20 -4
- package/scripts/pg-memory-diet.mjs +2 -4
- package/scripts/routing-corpus.mjs +0 -2
- package/scripts/session-diag.mjs +0 -7
- package/scripts/session-sweep.mjs +102 -56
- package/scripts/test.mjs +113 -37
- package/scripts/tui-frame-harness.mjs +1 -1
- package/src/app.mjs +79 -74
- package/src/cli.mjs +0 -2
- package/src/defaults/skills/browser-use/SKILL.md +8 -6
- package/src/defaults/skills/code-tidy/SKILL.md +67 -17
- package/src/defaults/skills/code-tidy/references/agent-cleanup.md +26 -3
- package/src/defaults/skills/computer-use/SKILL.md +12 -5
- package/src/defaults/skills/goal-management/SKILL.md +16 -9
- package/src/defaults/skills/pdf/SKILL.md +2 -1
- package/src/defaults/skills/xlsx/SKILL.md +3 -3
- package/src/headless-exec.mjs +1 -2
- package/src/help.mjs +2 -2
- package/src/lib/rules-builder.cjs +0 -23
- package/src/repl/slash-commands.mjs +1 -5
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/turn.mjs +4 -4
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +25 -41
- package/src/runtime/agent/orchestrator/agent-trace-format.mjs +25 -24
- package/src/runtime/agent/orchestrator/agent-trace-io.mjs +15 -22
- package/src/runtime/agent/orchestrator/agent-trace.mjs +0 -22
- package/src/runtime/agent/orchestrator/config-providers-merge.mjs +56 -0
- package/src/runtime/agent/orchestrator/config.mjs +34 -76
- package/src/runtime/agent/orchestrator/context/role-instructions.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/admission-scheduler.mjs +40 -39
- package/src/runtime/agent/orchestrator/providers/anthropic-api-recovery.mjs +75 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +152 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-api-transport.mjs +168 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-midstream-recovery.mjs +248 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-midstream.mjs +16 -206
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-recovery.mjs +11 -63
- package/src/runtime/agent/orchestrator/providers/anthropic-recovery-guards.mjs +86 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +88 -0
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +87 -591
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth.mjs +32 -288
- package/src/runtime/agent/orchestrator/providers/antigravity-response.mjs +101 -0
- package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +161 -0
- package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +114 -0
- package/src/runtime/agent/orchestrator/providers/gemini-cache-policy.mjs +266 -0
- package/src/runtime/agent/orchestrator/providers/gemini-request-body.mjs +54 -0
- package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +145 -0
- package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +56 -39
- package/src/runtime/agent/orchestrator/providers/gemini-sdk-request.mjs +107 -0
- package/src/runtime/agent/orchestrator/providers/gemini.mjs +23 -533
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +10 -4
- package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +83 -32
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +41 -25
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-outcome.mjs +4 -98
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-stamps.mjs +114 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth-dispatch.mjs +258 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +48 -214
- package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +80 -60
- package/src/runtime/agent/orchestrator/providers/openai-ws-handshake.mjs +108 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-pool.mjs +8 -87
- package/src/runtime/agent/orchestrator/providers/openai-ws-send-outcome.mjs +52 -293
- package/src/runtime/agent/orchestrator/providers/openai-ws-send-trace.mjs +316 -0
- package/src/runtime/agent/orchestrator/providers/opencode-go-usage.mjs +76 -253
- package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +1 -7
- package/src/runtime/agent/orchestrator/session/compact/budget.mjs +17 -16
- package/src/runtime/agent/orchestrator/session/compact/runner.mjs +6 -4
- package/src/runtime/agent/orchestrator/session/compact/summary-schema.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/context-compaction-policy.mjs +9 -13
- package/src/runtime/agent/orchestrator/session/context-utils.mjs +1 -2
- package/src/runtime/agent/orchestrator/session/evidence-union.mjs +6 -9
- package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +2 -3
- package/src/runtime/agent/orchestrator/session/loop/diagnostics.mjs +1 -8
- package/src/runtime/agent/orchestrator/session/loop/tool-classify.mjs +1 -3
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/call-prep.mjs +1 -5
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +0 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +4 -55
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-steering-drain.mjs +63 -0
- package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/foreign-pending-messages.mjs +80 -65
- package/src/runtime/agent/orchestrator/session/manager/pending-claim-ledger.mjs +68 -0
- package/src/runtime/agent/orchestrator/session/manager/pending-delivered-ledger.mjs +56 -0
- package/src/runtime/agent/orchestrator/session/manager/pending-lifecycle-epoch.mjs +84 -0
- package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +51 -651
- package/src/runtime/agent/orchestrator/session/manager/pending-persist-queue.mjs +264 -0
- package/src/runtime/agent/orchestrator/session/manager/pending-spool-file.mjs +131 -0
- package/src/runtime/agent/orchestrator/session/manager/pending-spool-sweep.mjs +73 -0
- package/src/runtime/agent/orchestrator/session/manager/prepared-resume-cache.mjs +122 -0
- package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +5 -4
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +60 -35
- package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +3 -2
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +22 -646
- package/src/runtime/agent/orchestrator/session/manager/session-owner-liveness.mjs +135 -0
- package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +150 -0
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +154 -0
- package/src/runtime/agent/orchestrator/session/manager/session-tool-surface.mjs +135 -0
- package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +4 -11
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +0 -6
- package/src/runtime/agent/orchestrator/session/manager/usage-metrics.mjs +1 -3
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +11 -12
- package/src/runtime/agent/orchestrator/session/provider-prefix-guard.mjs +23 -32
- package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +275 -0
- package/src/runtime/agent/orchestrator/session/store/lifecycle-read.mjs +67 -0
- package/src/runtime/agent/orchestrator/session/store/listing.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/live-cache-eviction.mjs +72 -0
- package/src/runtime/agent/orchestrator/session/store/liveness-veto.mjs +53 -0
- package/src/runtime/agent/orchestrator/session/store/load-session.mjs +60 -0
- package/src/runtime/agent/orchestrator/session/store/pending-saves.mjs +55 -0
- package/src/runtime/agent/orchestrator/session/store/serialize.mjs +7 -15
- package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +149 -0
- package/src/runtime/agent/orchestrator/session/store/session-observers.mjs +55 -0
- package/src/runtime/agent/orchestrator/session/store/write-admission.mjs +108 -0
- package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +531 -0
- package/src/runtime/agent/orchestrator/session/store-summary-archived-agent.mjs +126 -0
- package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +24 -0
- package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +2 -10
- package/src/runtime/agent/orchestrator/session/store-summary-locations.mjs +46 -0
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +11 -791
- package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +126 -0
- package/src/runtime/agent/orchestrator/session/store.mjs +33 -771
- package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +13 -7
- package/src/runtime/agent/orchestrator/stable-hash-stringify.mjs +10 -0
- package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +50 -75
- package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +2 -1
- package/src/runtime/agent/orchestrator/tools/builtin/cache-layers.mjs +22 -21
- package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +0 -2
- package/src/runtime/agent/orchestrator/tools/builtin/git-command-policy.mjs +44 -27
- package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +36 -54
- package/src/runtime/agent/orchestrator/tools/builtin/git-partial-stage.mjs +8 -5
- package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-context-expander.mjs +8 -5
- package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-output.mjs +18 -9
- package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-request.mjs +2 -3
- package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-single-file-rescue.mjs +80 -67
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-task-output.mjs +12 -4
- package/src/runtime/agent/orchestrator/tools/builtin/native-search-client.mjs +1 -4
- package/src/runtime/agent/orchestrator/tools/builtin/path-diagnostics.mjs +61 -72
- package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +0 -5
- package/src/runtime/agent/orchestrator/tools/builtin/read-office-files.mjs +3 -3
- package/src/runtime/agent/orchestrator/tools/builtin/read-range-index.mjs +11 -14
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-render.mjs +3 -6
- package/src/runtime/agent/orchestrator/tools/builtin/read-special-files.mjs +1 -2
- package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +124 -94
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-dispatch.mjs +6 -3
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool/reach-preflight.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-windows.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/search-builders.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/search-glob-tool.mjs +6 -6
- package/src/runtime/agent/orchestrator/tools/builtin/search-grep-tool.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +21 -35
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +0 -3
- package/src/runtime/agent/orchestrator/tools/builtin/shell-lossless-compact.mjs +1 -3
- package/src/runtime/agent/orchestrator/tools/builtin/shell-output.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +0 -2
- package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +4 -3
- package/src/runtime/agent/orchestrator/tools/builtin/text-stats.mjs +6 -3
- package/src/runtime/agent/orchestrator/tools/builtin.mjs +0 -4
- package/src/runtime/agent/orchestrator/tools/code-graph/aggregate-roots.mjs +7 -7
- package/src/runtime/agent/orchestrator/tools/code-graph/ast-calls.mjs +0 -3
- package/src/runtime/agent/orchestrator/tools/code-graph/build-file-infos.mjs +182 -0
- package/src/runtime/agent/orchestrator/tools/code-graph/build.mjs +14 -159
- package/src/runtime/agent/orchestrator/tools/code-graph/constants.mjs +2 -3
- package/src/runtime/agent/orchestrator/tools/code-graph/dispatch.mjs +21 -8
- package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary.mjs +0 -3
- package/src/runtime/agent/orchestrator/tools/code-graph/search-references.mjs +5 -3
- package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +2 -3
- package/src/runtime/agent/orchestrator/tools/code-graph/symbol-index.mjs +1 -2
- package/src/runtime/agent/orchestrator/tools/code-graph/text-mask.golden.json +1 -1
- package/src/runtime/agent/orchestrator/tools/code-graph/text-mask.mjs +0 -1
- package/src/runtime/agent/orchestrator/tools/graph-manifest.json +11 -11
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/lib/shell-warm-standby.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/patch/dispatch.mjs +3 -6
- package/src/runtime/agent/orchestrator/tools/patch/mutation-output.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/patch/native-server.mjs +25 -39
- package/src/runtime/agent/orchestrator/tools/patch/parsing.mjs +9 -14
- package/src/runtime/agent/orchestrator/tools/patch/paths.mjs +11 -6
- package/src/runtime/agent/orchestrator/tools/patch/replay-capture.mjs +5 -6
- package/src/runtime/agent/orchestrator/tools/patch/text-lines.mjs +4 -4
- package/src/runtime/agent/orchestrator/tools/patch/v4a-anchors.mjs +10 -7
- package/src/runtime/agent/orchestrator/tools/patch/v4a-convert.mjs +20 -30
- package/src/runtime/agent/orchestrator/tools/patch/v4a-windows.mjs +4 -19
- package/src/runtime/agent/orchestrator/tools/patch/wave.mjs +13 -2
- package/src/runtime/agent/orchestrator/tools/patch.mjs +0 -19
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +60 -36
- package/src/runtime/agent/orchestrator/tools/shell-exec-output.mjs +0 -4
- package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +6 -7
- package/src/runtime/attachments/store.mjs +13 -12
- package/src/runtime/browser-bridge/client.mjs +19 -9
- package/src/runtime/channels/index.mjs +1 -1
- package/src/runtime/channels/lib/event-pipeline.mjs +8 -8
- package/src/runtime/channels/lib/event-queue.mjs +15 -20
- package/src/runtime/channels/lib/executor.mjs +10 -7
- package/src/runtime/channels/lib/owner-heartbeat.mjs +0 -4
- package/src/runtime/channels/lib/runtime-paths.mjs +30 -33
- package/src/runtime/channels/lib/scheduler.mjs +11 -20
- package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +0 -4
- package/src/runtime/channels/lib/voice-transcription.mjs +127 -104
- package/src/runtime/channels/lib/webhook/verification.mjs +33 -20
- package/src/runtime/channels/lib/worker-bootstrap.mjs +0 -2
- package/src/runtime/channels/lib/worker-main.mjs +2 -2
- package/src/runtime/computer-bridge/action-schema.mjs +20 -0
- package/src/runtime/computer-bridge/core-actions.mjs +15 -0
- package/src/runtime/github/client.mjs +2 -3
- package/src/runtime/github/commands.mjs +9 -3
- package/src/runtime/github/contract.mjs +7 -0
- package/src/runtime/local-provider/catalog.mjs +4 -3
- package/src/runtime/local-provider/hardware.mjs +7 -20
- package/src/runtime/local-provider/resumable-installations.mjs +12 -19
- package/src/runtime/media/auth.mjs +16 -13
- package/src/runtime/media/catalog.mjs +14 -6
- package/src/runtime/media/lanes.mjs +2 -1
- package/src/runtime/memory/index.mjs +5 -10
- package/src/runtime/memory/lib/core-memory-store.mjs +3 -7
- package/src/runtime/memory/lib/embedding-provider.mjs +9 -19
- package/src/runtime/memory/lib/embedding-worker.mjs +24 -28
- package/src/runtime/memory/lib/http-router/admin-routes.mjs +5 -51
- package/src/runtime/memory/lib/http-router/admin-trace-routes.mjs +65 -0
- package/src/runtime/memory/lib/memory-action-handlers/cycle-actions.mjs +18 -143
- package/src/runtime/memory/lib/memory-action-handlers/cycle-backfill-action.mjs +84 -0
- package/src/runtime/memory/lib/memory-action-handlers/cycle-rebuild-action.mjs +94 -0
- package/src/runtime/memory/lib/memory-action-handlers/manage-actions.mjs +92 -53
- package/src/runtime/memory/lib/memory-categories.mjs +13 -0
- package/src/runtime/memory/lib/memory-chunk-quality.mjs +134 -74
- package/src/runtime/memory/lib/memory-cycle-requests.mjs +64 -70
- package/src/runtime/memory/lib/memory-cycle1.mjs +17 -33
- package/src/runtime/memory/lib/memory-embed.mjs +10 -2
- package/src/runtime/memory/lib/memory-ops-policy.mjs +3 -2
- package/src/runtime/memory/lib/memory-recall-scope-filter.mjs +1 -1
- package/src/runtime/memory/lib/memory.mjs +7 -35
- package/src/runtime/memory/lib/pg/adapter.mjs +3 -4
- package/src/runtime/memory/lib/pg/process.mjs +23 -28
- package/src/runtime/memory/lib/pg/supervisor.mjs +10 -11
- package/src/runtime/memory/lib/query-hybrid-search.mjs +2 -2
- package/src/runtime/memory/lib/query-maintenance-handlers.mjs +112 -89
- package/src/runtime/memory/lib/query-ranking.mjs +8 -11
- package/src/runtime/memory/lib/recall-format.mjs +6 -12
- package/src/runtime/memory/lib/recall-hybrid/plan.mjs +1 -1
- package/src/runtime/memory/lib/runtime-fetcher.mjs +73 -65
- package/src/runtime/memory/lib/trace-store.mjs +10 -19
- package/src/runtime/memory/lib/transcript-ingest.mjs +7 -4
- package/src/runtime/memory/tool-defs.mjs +5 -8
- package/src/runtime/office/authoring/pptx-author-action.mjs +2 -2
- package/src/runtime/office/authoring/pptx-author-session.mjs +6 -9
- package/src/runtime/office/authoring/pptx-brief.mjs +11 -4
- package/src/runtime/office/authoring/pptx-receipt.mjs +79 -60
- package/src/runtime/office/bench/benchmark.mjs +102 -82
- package/src/runtime/office/capabilities-catalog.mjs +2 -0
- package/src/runtime/office/capabilities-signatures.mjs +8 -0
- package/src/runtime/office/capabilities.mjs +3 -4
- package/src/runtime/office/com/com-adapter.mjs +13 -1
- package/src/runtime/office/com/office-com-host.ps1 +63 -1
- package/src/runtime/office/core/office-actions-batch.mjs +12 -12
- package/src/runtime/office/core/office-actions-open.mjs +2 -7
- package/src/runtime/office/core/office-core.mjs +20 -1
- package/src/runtime/office/core/office-finalize/session-save.mjs +9 -6
- package/src/runtime/office/core/office-session-dispatch.mjs +86 -0
- package/src/runtime/office/core/office-sessionless-actions.mjs +115 -0
- package/src/runtime/office/core/office-sessions.mjs +2 -2
- package/src/runtime/office/core/office-transactions.mjs +2 -4
- package/src/runtime/office/core/tabular.mjs +13 -16
- package/src/runtime/office/design/composition-system.mjs +32 -28
- package/src/runtime/office/design/content-model.mjs +2 -1
- package/src/runtime/office/design/design-art-direction.mjs +17 -14
- package/src/runtime/office/design/design-creative-director.mjs +1 -1
- package/src/runtime/office/design/design-discipline.mjs +8 -0
- package/src/runtime/office/design/design-tokens.mjs +9 -5
- package/src/runtime/office/design/docx/design-docx-components.mjs +88 -156
- package/src/runtime/office/design/library/design-library-pack.mjs +11 -23
- package/src/runtime/office/design/library/design-library.mjs +15 -37
- package/src/runtime/office/design/library/design-template-index.mjs +1 -9
- package/src/runtime/office/design/library/design-template-induct.mjs +2 -1
- package/src/runtime/office/design/native-design.mjs +2 -3
- package/src/runtime/office/index.mjs +7 -160
- package/src/runtime/office/pdf/pdf-adapter.mjs +17 -2
- package/src/runtime/office/pdf/pdf-ocr.mjs +2 -1
- package/src/runtime/office/pdf/pdf-render.mjs +12 -13
- package/src/runtime/office/pdf/pdf-writer.mjs +135 -6
- package/src/runtime/office/portable/docx-revisions.mjs +5 -5
- package/src/runtime/office/portable/docx-runs.mjs +4 -7
- package/src/runtime/office/portable/docx-tracked-edits.mjs +14 -9
- package/src/runtime/office/portable/font-provisioner.mjs +2 -2
- package/src/runtime/office/portable/ooxml-validator.mjs +4 -1
- package/src/runtime/office/portable/portable-docx-edits.mjs +61 -45
- package/src/runtime/office/portable/portable-docx-operations.mjs +13 -4
- package/src/runtime/office/portable/portable-docx-parts.mjs +59 -70
- package/src/runtime/office/portable/portable-docx-xml.mjs +3 -5
- package/src/runtime/office/portable/portable-opc.mjs +63 -39
- package/src/runtime/office/portable/portable-package.mjs +5 -23
- package/src/runtime/office/portable/portable-pptx-chart.mjs +7 -6
- package/src/runtime/office/portable/portable-pptx-charts.mjs +27 -20
- package/src/runtime/office/portable/portable-pptx-core.mjs +10 -21
- package/src/runtime/office/portable/portable-pptx-deck.mjs +5 -8
- package/src/runtime/office/portable/portable-pptx-package.mjs +23 -30
- package/src/runtime/office/portable/portable-pptx-shapes.mjs +21 -57
- package/src/runtime/office/portable/portable-sheet-audits.mjs +14 -36
- package/src/runtime/office/portable/portable-sheet-page.mjs +22 -23
- package/src/runtime/office/portable/portable-sheet-parts.mjs +4 -5
- package/src/runtime/office/portable/portable-sheet-styles.mjs +11 -19
- package/src/runtime/office/portable/portable-sheet-xml.mjs +15 -7
- package/src/runtime/office/portable/portable-slide-shapes.mjs +4 -0
- package/src/runtime/office/portable/portable-snapshot-pptx.mjs +2 -2
- package/src/runtime/office/portable/portable-snapshot-shared.mjs +1 -1
- package/src/runtime/office/portable/portable-snapshot-xlsx.mjs +16 -17
- package/src/runtime/office/portable/portable-soffice.mjs +176 -13
- package/src/runtime/office/portable/portable-validation-package.mjs +16 -18
- package/src/runtime/office/portable/portable-validation.mjs +57 -31
- package/src/runtime/office/portable/portable-xlsx-cell-values.mjs +15 -0
- package/src/runtime/office/portable/portable-xlsx-charts.mjs +192 -0
- package/src/runtime/office/portable/portable-xlsx-drawings.mjs +323 -0
- package/src/runtime/office/portable/portable-xlsx-operations.mjs +29 -627
- package/src/runtime/office/portable/portable-xlsx-pivot-ops.mjs +94 -0
- package/src/runtime/office/portable/portable-xlsx-range-layout.mjs +236 -0
- package/src/runtime/office/portable/portable-xlsx-sheet-edits.mjs +19 -14
- package/src/runtime/office/portable/portable-xlsx.mjs +32 -0
- package/src/runtime/office/portable/portable-xml.mjs +9 -0
- package/src/runtime/office/portable/pptx-relations.mjs +11 -0
- package/src/runtime/office/portable/pptx-targets.mjs +2 -1
- package/src/runtime/office/portable/review-editability.mjs +4 -11
- package/src/runtime/office/portable/text-metrics.mjs +35 -55
- package/src/runtime/office/portable/xlsx-assertions.mjs +2 -15
- package/src/runtime/office/portable/xlsx-audit-support.mjs +2 -6
- package/src/runtime/office/portable/xlsx-contract.mjs +4 -0
- package/src/runtime/office/portable/xlsx-formula-audit.mjs +11 -4
- package/src/runtime/office/portable/xlsx-recalculate.mjs +1 -1
- package/src/runtime/office/portable/xlsx-sheet-hygiene.mjs +5 -1
- package/src/runtime/office/quality/assurance-rendered.mjs +3 -2
- package/src/runtime/office/quality/assurance-structure-pptx.mjs +16 -15
- package/src/runtime/office/quality/assurance-trust.mjs +25 -10
- package/src/runtime/office/quality/design-aesthetics.mjs +172 -145
- package/src/runtime/office/quality/design-deck-diversity.mjs +2 -5
- package/src/runtime/office/quality/design-review-authored.mjs +2 -2
- package/src/runtime/office/quality/design-review-critique.mjs +36 -37
- package/src/runtime/office/quality/design-review.mjs +113 -96
- package/src/runtime/office/quality/document-acceptance.mjs +10 -3
- package/src/runtime/office/quality/inline-audit.mjs +7 -2
- package/src/runtime/office/quality/pptx-deck-rubric.mjs +14 -6
- package/src/runtime/office/quality/pptx-slide-roles.mjs +7 -9
- package/src/runtime/office/quality/presentation-acceptance.mjs +2 -6
- package/src/runtime/office/quality/quality-pipeline.mjs +21 -14
- package/src/runtime/office/quality/quality-score.mjs +2 -2
- package/src/runtime/office/quality/render-air.mjs +12 -5
- package/src/runtime/shared/atomic-file.mjs +19 -8
- package/src/runtime/shared/config.mjs +7 -13
- package/src/runtime/shared/err-text.mjs +11 -6
- package/src/runtime/shared/file-lock.mjs +10 -6
- package/src/runtime/shared/inline-file-kind.mjs +51 -0
- package/src/runtime/shared/llm/usage-accounting.mjs +9 -6
- package/src/runtime/shared/llm/usage-ledger-rollup.mjs +272 -0
- package/src/runtime/shared/llm/usage-ledger.mjs +8 -218
- package/src/runtime/shared/pristine-execution.mjs +2 -6
- package/src/runtime/shared/process-lifecycle.mjs +34 -52
- package/src/runtime/shared/process-shutdown.mjs +1 -1
- package/src/runtime/shared/schedule-model-ref.mjs +14 -0
- package/src/runtime/shared/schedule-session-run.mjs +3 -13
- package/src/runtime/shared/schedules-db.mjs +16 -39
- package/src/runtime/shared/staged-child-result.mjs +2 -7
- package/src/runtime/shared/staged-update.mjs +1 -5
- package/src/runtime/shared/tool-card-model/agent-surface.mjs +8 -3
- package/src/runtime/shared/tool-card-model/card-status.mjs +2 -1
- package/src/runtime/shared/tool-card-model/displayed-result.mjs +2 -3
- package/src/runtime/shared/tool-card-model/generic-detail.mjs +5 -3
- package/src/runtime/shared/tool-card-model.golden-cases.mjs +10 -2
- package/src/runtime/shared/tool-card-model.golden.json +3 -12
- package/src/runtime/shared/tool-execution-contract.mjs +22 -26
- package/src/runtime/shared/tool-result-summary.mjs +7 -14
- package/src/runtime/shared/tool-surface.mjs +30 -33
- package/src/runtime/shared/tool-work-units.mjs +12 -8
- package/src/runtime/shared/turn-snapshot-store.mjs +2 -4
- package/src/runtime/shared/turn-worktree-snapshot.mjs +13 -16
- package/src/runtime/shared/update-checker.mjs +5 -0
- package/src/runtime/shared/user-data-guard.mjs +10 -17
- package/src/runtime/shared/webhook-session-run.mjs +3 -15
- package/src/runtime/tidy/history-comment.mjs +32 -27
- package/src/runtime/tidy/process.mjs +18 -21
- package/src/runtime/tidy/report.mjs +50 -9
- package/src/runtime/tidy/resolve.mjs +13 -14
- package/src/runtime/tidy/runners/air.mjs +2 -20
- package/src/runtime/tidy/runners/biome.mjs +4 -6
- package/src/runtime/tidy/runners/dprint.mjs +2 -23
- package/src/runtime/tidy/runners/mago.mjs +2 -20
- package/src/runtime/tidy/runners/ruff.mjs +2 -8
- package/src/runtime/tidy/runners/shared.mjs +35 -9
- package/src/runtime/tidy/runners/stylua.mjs +2 -20
- package/src/runtime/tidy/shadow.mjs +138 -0
- package/src/runtime/tidy/tool.mjs +33 -0
- package/src/runtime/tidy/worktree.mjs +114 -0
- package/src/runtime/web-search/index.mjs +64 -68
- package/src/runtime/web-search/lib/http-fetch.mjs +39 -54
- package/src/runtime/web-search/lib/ssrf-guard.mjs +19 -52
- package/src/runtime/web-search/lib/web-tools.mjs +2 -2
- package/src/session-runtime/config-helpers.mjs +9 -9
- package/src/session-runtime/context-inspection.mjs +64 -23
- package/src/session-runtime/context-status-cache.mjs +0 -2
- package/src/session-runtime/context-status-inspection.mjs +54 -25
- package/src/session-runtime/context-status-shape.mjs +1 -18
- package/src/session-runtime/goal-facade-api.mjs +15 -12
- package/src/session-runtime/goal-mutations.mjs +4 -3
- package/src/session-runtime/goal-runtime.mjs +5 -0
- package/src/session-runtime/goal-tasks.mjs +5 -10
- package/src/session-runtime/goal-text.mjs +46 -9
- package/src/session-runtime/goal-tool-defs.mjs +7 -8
- package/src/session-runtime/goal-tool-exec.mjs +1 -1
- package/src/session-runtime/goal-turns.mjs +54 -3
- package/src/session-runtime/hook-payload.mjs +2 -1
- package/src/session-runtime/inheritance-fit.mjs +3 -3
- package/src/session-runtime/lifecycle/teardown.mjs +9 -1
- package/src/session-runtime/mcp-glue/server-catalog.mjs +4 -6
- package/src/session-runtime/model-capabilities.mjs +1 -3
- package/src/session-runtime/notification-bus.mjs +30 -7
- package/src/session-runtime/plugin-mcp.mjs +0 -2
- package/src/session-runtime/provider-auth/accounts.mjs +2 -2
- package/src/session-runtime/provider-auth/login.mjs +0 -7
- package/src/session-runtime/provider-usage.mjs +1 -1
- package/src/session-runtime/runtime-paths.mjs +1 -3
- package/src/session-runtime/session-hooks.mjs +37 -96
- package/src/session-runtime/statusline-route.mjs +1 -4
- package/src/session-runtime/tool-catalog-schema.mjs +0 -6
- package/src/session-runtime/tool-catalog.mjs +10 -15
- package/src/session-runtime/workflow-ids.mjs +1 -2
- package/src/standalone/agent-task-status.mjs +1 -2
- package/src/standalone/agent-tool/close-flow/close-all.mjs +67 -0
- package/src/standalone/agent-tool/close-flow.mjs +2 -58
- package/src/standalone/agent-tool/execute-send.mjs +91 -0
- package/src/standalone/agent-tool/execute-spawn.mjs +76 -0
- package/src/standalone/agent-tool/execute.mjs +7 -147
- package/src/standalone/agent-tool/helpers.mjs +3 -6
- package/src/standalone/agent-tool/notify/early-completion.mjs +58 -0
- package/src/standalone/agent-tool/notify.mjs +7 -55
- package/src/standalone/agent-tool/provider-init.mjs +73 -64
- package/src/standalone/agent-tool/render.mjs +123 -115
- package/src/standalone/agent-tool/spawn-flow/spawn-plan.mjs +89 -0
- package/src/standalone/agent-tool/spawn-flow/spawn-prep.mjs +16 -75
- package/src/standalone/agent-tool/spawn-flow/spawn-run.mjs +1 -1
- package/src/standalone/agent-tool/worker-rows.mjs +0 -7
- package/src/standalone/channel-admin.mjs +13 -18
- package/src/standalone/channel-transport/remote-binding.mjs +10 -79
- package/src/standalone/channel-transport/remote-intent.mjs +52 -0
- package/src/standalone/channel-transport/remote-notify.mjs +15 -107
- package/src/standalone/channel-transport/remote-pointer.mjs +124 -0
- package/src/standalone/channel-transport/remote-state.mjs +47 -0
- package/src/standalone/daemon-agent-control.mjs +65 -0
- package/src/standalone/daemon-channels-loader.mjs +60 -0
- package/src/standalone/daemon-desktop-runtime.mjs +28 -0
- package/src/standalone/daemon-local-session-bridge.mjs +62 -0
- package/src/standalone/daemon-stored-session-views.mjs +55 -0
- package/src/standalone/daemon.mjs +175 -320
- package/src/standalone/desktop-service-registry.mjs +9 -7
- package/src/standalone/folder-dialog.mjs +11 -12
- package/src/standalone/hook-bus/command-handler.mjs +60 -49
- package/src/standalone/hook-bus/event-runner.mjs +7 -74
- package/src/standalone/hook-bus/handler-dispatch.mjs +75 -0
- package/src/standalone/provider-admin.mjs +14 -35
- package/src/standalone/session-client/attachment-calls.mjs +67 -0
- package/src/standalone/session-client/stream-link.mjs +85 -0
- package/src/standalone/session-client.mjs +31 -106
- package/src/standalone/session-frame-stream.mjs +4 -2
- package/src/standalone/session-protocol.mjs +0 -1
- package/src/standalone/session-runtime-agent-control-client.mjs +11 -27
- package/src/standalone/session-runtime-agent-control.mjs +85 -0
- package/src/standalone/session-runtime-host.mjs +30 -472
- package/src/standalone/session-runtime-inline-host/telemetry.mjs +38 -0
- package/src/standalone/session-runtime-inline-host.mjs +6 -37
- package/src/standalone/session-runtime-proxy.mjs +164 -0
- package/src/standalone/session-runtime-shard-router.mjs +4 -7
- package/src/standalone/session-runtime-spawn-leases.mjs +82 -0
- package/src/standalone/session-runtime-worker.mjs +27 -7
- package/src/standalone/session-service/agent-tree/agent-child.mjs +59 -0
- package/src/standalone/session-service/agent-tree/agent-turns.mjs +4 -55
- package/src/standalone/session-service/agent-tree.mjs +3 -1
- package/src/standalone/session-service/entries/disposal.mjs +72 -0
- package/src/standalone/session-service/entries/external-binding.mjs +6 -3
- package/src/standalone/session-service/entries/lifecycle.mjs +15 -59
- package/src/standalone/session-service/retention/busy.mjs +50 -0
- package/src/standalone/session-service/retention.mjs +5 -44
- package/src/standalone/session-service/session-calls/goal-recovery.mjs +44 -0
- package/src/standalone/session-service/session-calls/session-action.mjs +5 -8
- package/src/standalone/session-service/session-calls/session-turns.mjs +12 -42
- package/src/standalone/session-service/session-calls/session-views.mjs +8 -8
- package/src/standalone/session-transport/stack.mjs +131 -0
- package/src/standalone/session-transport.mjs +10 -103
- package/src/standalone/usage-dashboard.mjs +167 -165
- package/src/standalone/usage-stats-model.mjs +117 -97
- package/src/tui/App.jsx +27 -210
- package/src/tui/app/app-format.mjs +7 -0
- package/src/tui/app/app-view/floating-panel.jsx +229 -0
- package/src/tui/app/app-view/text-entry-labels.mjs +81 -0
- package/src/tui/app/app-view/transcript-viewport/trailing-bands.jsx +94 -0
- package/src/tui/app/app-view/transcript-viewport/transcript-rows.jsx +87 -0
- package/src/tui/app/app-view/transcript-viewport.jsx +74 -0
- package/src/tui/app/app-view.jsx +12 -450
- package/src/tui/app/core-memory-picker/core-rows.mjs +32 -0
- package/src/tui/app/core-memory-picker/entry-prompts.mjs +45 -0
- package/src/tui/app/core-memory-picker/list-panels.mjs +75 -0
- package/src/tui/app/core-memory-picker.mjs +26 -120
- package/src/tui/app/doctor.mjs +17 -12
- package/src/tui/app/extension-pickers/skills-pickers/project-skills.mjs +38 -0
- package/src/tui/app/extension-pickers/skills-pickers/skill-detail.mjs +80 -0
- package/src/tui/app/extension-pickers/skills-pickers/skill-items.mjs +44 -0
- package/src/tui/app/extension-pickers/skills-pickers.mjs +31 -137
- package/src/tui/app/model-picker/route-selection/context-window.mjs +47 -0
- package/src/tui/app/model-picker/route-selection/effort.mjs +87 -0
- package/src/tui/app/model-picker/route-selection/fast-parameters.mjs +84 -0
- package/src/tui/app/model-picker/route-selection/model-key.mjs +5 -0
- package/src/tui/app/model-picker/route-selection.mjs +34 -200
- package/src/tui/app/mouse-input/edge-autoscroll.mjs +53 -0
- package/src/tui/app/mouse-input/geometry.mjs +109 -0
- package/src/tui/app/mouse-input/sgr-buttons.mjs +14 -0
- package/src/tui/app/mouse-input/wheel-router.mjs +96 -0
- package/src/tui/app/panel-signature.mjs +58 -0
- package/src/tui/app/project-picker/project-service.mjs +3 -7
- package/src/tui/app/prompt-submit.mjs +2 -7
- package/src/tui/app/provider-setup/api-key-actions.mjs +7 -80
- package/src/tui/app/provider-setup/oauth-actions.mjs +2 -10
- package/src/tui/app/provider-setup/provider-items.mjs +20 -3
- package/src/tui/app/settings-picker/settings-toggles/cycled.mjs +4 -0
- package/src/tui/app/settings-picker/settings-toggles/listed-cyclers.mjs +77 -0
- package/src/tui/app/settings-picker/settings-toggles/store-toggles.mjs +61 -0
- package/src/tui/app/settings-picker/settings-toggles/theme-cycler.mjs +36 -0
- package/src/tui/app/settings-picker/settings-toggles.mjs +21 -149
- package/src/tui/app/slash-commands.mjs +14 -4
- package/src/tui/app/store-service-call.mjs +17 -0
- package/src/tui/app/text-entry-policy.mjs +1 -3
- package/src/tui/app/transcript-row-estimate.mjs +31 -91
- package/src/tui/app/transcript-window.mjs +19 -0
- package/src/tui/app/use-disabled-skills.mjs +52 -0
- package/src/tui/app/use-global-key-input/copy-first.mjs +43 -0
- package/src/tui/app/use-global-key-input/shift-arrow.mjs +30 -0
- package/src/tui/app/use-global-key-input.mjs +10 -67
- package/src/tui/app/use-model-catalog-cache.mjs +86 -0
- package/src/tui/app/use-mouse-input.mjs +64 -218
- package/src/tui/app/use-pasted-buffers.mjs +55 -81
- package/src/tui/app/use-prompt-draft-flow/draft-change.mjs +66 -0
- package/src/tui/app/use-prompt-draft-flow/prompt-cancels.mjs +40 -0
- package/src/tui/app/use-prompt-draft-flow.mjs +38 -77
- package/src/tui/app/use-prompt-queue-history/prompt-history.mjs +22 -0
- package/src/tui/app/use-prompt-queue-history/restore-to-prompt.mjs +147 -0
- package/src/tui/app/use-prompt-queue-history.mjs +20 -117
- package/src/tui/app/use-selection-focus.mjs +2 -1
- package/src/tui/app/use-selection-geometry.mjs +9 -12
- package/src/tui/app/use-selection-paint/paint-queue.mjs +90 -0
- package/src/tui/app/use-selection-paint/selection-clip.mjs +33 -0
- package/src/tui/app/use-selection-paint.mjs +31 -102
- package/src/tui/app/use-transcript-activity.mjs +1 -1
- package/src/tui/app/use-transcript-window/instance-state.mjs +1 -1
- package/src/tui/app/use-welcome-prompt-hint.mjs +1 -1
- package/src/tui/app/workflow-cycle.mjs +63 -0
- package/src/tui/components/AnsiText.jsx +47 -15
- package/src/tui/components/ItemRightHintOverprint.jsx +2 -15
- package/src/tui/components/Picker.jsx +9 -23
- package/src/tui/components/PromptInput.jsx +89 -335
- package/src/tui/components/QueuedCommands.jsx +1 -3
- package/src/tui/components/Spinner.jsx +1 -2
- package/src/tui/components/StatusLine.jsx +11 -21
- package/src/tui/components/TextEntryPanel.jsx +5 -52
- package/src/tui/components/ToolExecution.jsx +5 -14
- package/src/tui/components/TranscriptItem.jsx +0 -2
- package/src/tui/components/TurnDone.jsx +2 -14
- package/src/tui/components/prompt-input/cursor-anchor.mjs +65 -0
- package/src/tui/components/prompt-input/edit-helpers.mjs +1 -2
- package/src/tui/components/prompt-input/key-signals.mjs +122 -0
- package/src/tui/components/prompt-input/mouse-selection.mjs +114 -0
- package/src/tui/components/prompt-input/restore-policy.d.mts +0 -1
- package/src/tui/components/prompt-input/restore-policy.mjs +3 -8
- package/src/tui/components/prompt-input/selected-text.jsx +25 -0
- package/src/tui/components/prompt-input/undo-stack.mjs +75 -0
- package/src/tui/components/tool-output-format.mjs +1 -2
- package/src/tui/dist/index.mjs +2841 -2469
- package/src/tui/index.jsx +2 -2
- package/src/tui/markdown/measure-rendered-rows.mjs +8 -33
- package/src/tui/markdown/render-ansi.mjs +5 -5
- package/src/tui/markdown/table-layout/box-lines.mjs +46 -0
- package/src/tui/markdown/table-layout/cells.mjs +23 -0
- package/src/tui/markdown/table-layout/column-widths.mjs +65 -0
- package/src/tui/markdown/table-layout/vertical-lines.mjs +46 -0
- package/src/tui/markdown/table-layout.mjs +21 -151
- package/src/tui/prompt-history-store.mjs +0 -9
- package/src/tui/session/active-tool-summary.mjs +19 -27
- package/src/tui/session/agent-envelope.mjs +9 -9
- package/src/tui/session/live-share/owner.mjs +9 -7
- package/src/tui/session/live-share/retry.mjs +15 -0
- package/src/tui/session/live-share/viewer/frame-router.mjs +32 -0
- package/src/tui/session/live-share/viewer/pipe-client.mjs +108 -0
- package/src/tui/session/live-share/viewer.mjs +23 -114
- package/src/tui/session/notice-surface.mjs +1 -1
- package/src/tui/session/notice-text.mjs +21 -17
- package/src/tui/session/queue-helpers.mjs +12 -14
- package/src/tui/session/session-api/intake/submission.mjs +3 -8
- package/src/tui/session/session-api/integrations.mjs +0 -11
- package/src/tui/session/session-api/lifecycle/session-reset.mjs +76 -74
- package/src/tui/session/session-flow/drain.mjs +18 -5
- package/src/tui/session/session-flow/queue/entry-shape.mjs +53 -0
- package/src/tui/session/session-flow/queue/take-entries.mjs +82 -0
- package/src/tui/session/session-flow/queue.mjs +10 -112
- package/src/tui/session/session-flow/session-reset.mjs +2 -7
- package/src/tui/session/tool-approval.mjs +13 -17
- package/src/tui/session/tool-result-text.mjs +16 -28
- package/src/tui/session/transcript-spill.mjs +3 -7
- package/src/tui/session/transcript-store/replace-items.mjs +66 -0
- package/src/tui/session/transcript-store/streaming-tail.mjs +49 -0
- package/src/tui/session/transcript-store.mjs +16 -95
- package/src/tui/statusline-ansi-bridge.mjs +1 -40
- package/src/ui/markdown.mjs +3 -2
- package/src/ui/statusline-agents.mjs +9 -14
- package/src/ui/statusline.mjs +4 -4
- package/src/runtime/channels/lib/cli-worker-host.mjs +0 -2
- package/src/runtime/memory/lib/llm-worker-host.mjs +0 -11
- package/src/standalone/opencode-go-login.mjs +0 -140
|
@@ -40,8 +40,20 @@ const timed = async (name, action, repetitions = 5) => {
|
|
|
40
40
|
return { name, medianMs: +median(samples).toFixed(3), samplesMs: samples.map((n) => +n.toFixed(3)) };
|
|
41
41
|
};
|
|
42
42
|
const results = [];
|
|
43
|
-
results.push(
|
|
44
|
-
|
|
43
|
+
results.push(
|
|
44
|
+
await timed('token-floors-before', () => {
|
|
45
|
+
messages.forEach((m) => {
|
|
46
|
+
legacyTokenFloors(m.content);
|
|
47
|
+
});
|
|
48
|
+
})
|
|
49
|
+
);
|
|
50
|
+
results.push(
|
|
51
|
+
await timed('token-floors-after', () => {
|
|
52
|
+
messages.forEach((m) => {
|
|
53
|
+
currentFloors(m.content);
|
|
54
|
+
});
|
|
55
|
+
})
|
|
56
|
+
);
|
|
45
57
|
results.push(await timed('full-token-meter-after', () => estimateMessagesTokens(messages)));
|
|
46
58
|
results.push(await timed('context-summary-cold-after', () => summarizeContextMessages(structuredClone(messages))));
|
|
47
59
|
summarizeContextMessages(messages);
|
|
@@ -57,14 +69,18 @@ for (const [name, action] of [
|
|
|
57
69
|
[
|
|
58
70
|
'shared-loop-before',
|
|
59
71
|
() => {
|
|
60
|
-
messages.forEach((m) =>
|
|
72
|
+
messages.forEach((m) => {
|
|
73
|
+
legacyTokenFloors(m.content);
|
|
74
|
+
});
|
|
61
75
|
oldReader();
|
|
62
76
|
},
|
|
63
77
|
],
|
|
64
78
|
[
|
|
65
79
|
'shared-loop-after',
|
|
66
80
|
() => {
|
|
67
|
-
messages.forEach((m) =>
|
|
81
|
+
messages.forEach((m) => {
|
|
82
|
+
currentFloors(m.content);
|
|
83
|
+
});
|
|
68
84
|
currentReader(target, true);
|
|
69
85
|
},
|
|
70
86
|
],
|
|
@@ -5,6 +5,7 @@ import { join, resolve } from 'node:path';
|
|
|
5
5
|
import { spawn } from 'node:child_process';
|
|
6
6
|
import { createServer } from 'node:net';
|
|
7
7
|
import { createHash } from 'node:crypto';
|
|
8
|
+
import { fileURLToPath } from 'node:url';
|
|
8
9
|
import pg from 'pg';
|
|
9
10
|
import { searchRelevantHybrid } from '../src/runtime/memory/lib/memory-recall-store.mjs';
|
|
10
11
|
|
|
@@ -250,10 +251,7 @@ async function prepare(dataDir, runtimeDir, sourcePort) {
|
|
|
250
251
|
}
|
|
251
252
|
}
|
|
252
253
|
|
|
253
|
-
if (
|
|
254
|
-
process.argv[1] &&
|
|
255
|
-
resolve(process.argv[1]) === resolve(new URL(import.meta.url).pathname.replace(/^\/([A-Za-z]:)/, '$1'))
|
|
256
|
-
) {
|
|
254
|
+
if (process.argv[1] && resolve(process.argv[1]) === fileURLToPath(import.meta.url)) {
|
|
257
255
|
if (process.argv[2] !== 'prepare' || !process.argv[3] || !process.argv[4]) {
|
|
258
256
|
throw new Error('Usage: node scripts/pg-memory-diet.mjs prepare <data-dir> <runtime-dir> <source-port>');
|
|
259
257
|
}
|
|
@@ -292,13 +292,11 @@ function toolSequence(sorted, iters) {
|
|
|
292
292
|
if (it != null) iters.add(it);
|
|
293
293
|
const tool = field(r, 'tool_name') || '?';
|
|
294
294
|
const rawArgs = field(r, 'tool_args');
|
|
295
|
-
const summaryArgs = rawArgs;
|
|
296
295
|
sequence.push({
|
|
297
296
|
it: it ?? null,
|
|
298
297
|
tool,
|
|
299
298
|
args: argsSummary(tool, rawArgs),
|
|
300
299
|
rawArgs,
|
|
301
|
-
inspectArgs: summaryArgs,
|
|
302
300
|
argsHash: field(r, 'tool_args_hash'),
|
|
303
301
|
resultKind: field(r, 'result_kind'),
|
|
304
302
|
resultLines: Number(field(r, 'result_lines_est') || 0),
|
package/scripts/session-diag.mjs
CHANGED
|
@@ -149,11 +149,6 @@ function inferProviderFromModel(model) {
|
|
|
149
149
|
return null;
|
|
150
150
|
}
|
|
151
151
|
|
|
152
|
-
function sessionInclusive(provider) {
|
|
153
|
-
if (provider) return isInclusiveProvider(provider);
|
|
154
|
-
return true;
|
|
155
|
-
}
|
|
156
|
-
|
|
157
152
|
function usageDenom(row, provider) {
|
|
158
153
|
const prompt = numberField(row, 'prompt_tokens');
|
|
159
154
|
const input = numberField(row, 'input_tokens');
|
|
@@ -265,7 +260,6 @@ function deriveSessionMeta(rows) {
|
|
|
265
260
|
model = usage ? field(usage, 'model') : null;
|
|
266
261
|
}
|
|
267
262
|
if (!provider) provider = inferProviderFromModel(model);
|
|
268
|
-
const inclusive = sessionInclusive(provider);
|
|
269
263
|
const tsList = sorted.map((r) => Number(r.ts || 0)).filter((n) => n > 0);
|
|
270
264
|
const minTs = tsList.length ? Math.min(...tsList) : 0;
|
|
271
265
|
const maxTs = tsList.length ? Math.max(...tsList) : 0;
|
|
@@ -292,7 +286,6 @@ function deriveSessionMeta(rows) {
|
|
|
292
286
|
agent,
|
|
293
287
|
provider,
|
|
294
288
|
model,
|
|
295
|
-
inclusive,
|
|
296
289
|
minTs,
|
|
297
290
|
maxTs,
|
|
298
291
|
turns,
|
|
@@ -22,8 +22,7 @@
|
|
|
22
22
|
*
|
|
23
23
|
* This tool NEVER deletes. It only prints a report.
|
|
24
24
|
*/
|
|
25
|
-
import { existsSync, readdirSync, statSync } from 'node:fs';
|
|
26
|
-
import { readFileSync } from 'node:fs';
|
|
25
|
+
import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';
|
|
27
26
|
import { join } from 'node:path';
|
|
28
27
|
import { getPluginData } from '../src/runtime/agent/orchestrator/config.mjs';
|
|
29
28
|
import { summaryIndexPath, listStoredSessionSummaries } from '../src/runtime/agent/orchestrator/session/store.mjs';
|
|
@@ -153,27 +152,9 @@ function fmtTs(ms) {
|
|
|
153
152
|
}
|
|
154
153
|
}
|
|
155
154
|
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
const minClosedAgeMs = minClosedAgeDays * 24 * 60 * 60 * 1000;
|
|
160
|
-
|
|
161
|
-
const dir = join(getPluginData(), 'sessions');
|
|
162
|
-
if (!existsSync(dir)) {
|
|
163
|
-
process.stdout.write(`[session-sweep] no sessions dir at ${dir}\n`);
|
|
164
|
-
return;
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
// Authoritative lifecycle rows (read-only). rebuildIfMissing:false so this
|
|
168
|
-
// report never triggers a summary-index write.
|
|
169
|
-
const rows = listStoredSessionSummaries({ rebuildIfMissing: false });
|
|
170
|
-
const rowById = new Map();
|
|
171
|
-
for (const r of rows) if (r?.id) rowById.set(r.id, r);
|
|
172
|
-
|
|
173
|
-
// Disk scan for sizes + mtime fallback. `.hb` sidecar bytes are attributed
|
|
174
|
-
// to their session so reclaimable bytes reflect the full on-disk footprint.
|
|
175
|
-
const files = readdirSync(dir);
|
|
176
|
-
const jsonFiles = files.filter((f) => f.endsWith('.json'));
|
|
155
|
+
// `.hb` sidecar bytes are attributed to their session so reclaimable bytes
|
|
156
|
+
// reflect the full on-disk footprint of a session.
|
|
157
|
+
function collectHbSidecarSizes(dir, files) {
|
|
177
158
|
const hbSizeById = new Map();
|
|
178
159
|
for (const f of files) {
|
|
179
160
|
if (!f.endsWith('.hb')) continue;
|
|
@@ -184,7 +165,42 @@ function main() {
|
|
|
184
165
|
/* ignore */
|
|
185
166
|
}
|
|
186
167
|
}
|
|
168
|
+
return hbSizeById;
|
|
169
|
+
}
|
|
187
170
|
|
|
171
|
+
// Authoritative per-file lifecycle via cheap top-level scan; the summary
|
|
172
|
+
// index is stale here (most on-disk files are unindexed), so the file
|
|
173
|
+
// itself — not the index — decides closed/age. Fall back to the index
|
|
174
|
+
// row, then to file mtime, only when the scan can't resolve a field.
|
|
175
|
+
function classifySessionFile({ full, mtimeMs, row, now, maxAgeMs, minClosedAgeMs }) {
|
|
176
|
+
let scan = null;
|
|
177
|
+
try {
|
|
178
|
+
scan = scanTopLevelScalars(readFileSync(full, 'utf-8'));
|
|
179
|
+
} catch {
|
|
180
|
+
scan = null;
|
|
181
|
+
}
|
|
182
|
+
const closedScan = scan && (scan.closed === true || scan.status === 'closed');
|
|
183
|
+
const closedRow = row && (row.closed === true || row.status === 'closed');
|
|
184
|
+
const closed = scan ? !!closedScan : !!closedRow;
|
|
185
|
+
let updatedAt = scan && Number(scan.updatedAt) > 0 ? Number(scan.updatedAt) : 0;
|
|
186
|
+
if (!updatedAt && row && Number(row.updatedAt) > 0) updatedAt = Number(row.updatedAt);
|
|
187
|
+
if (!updatedAt) updatedAt = mtimeMs;
|
|
188
|
+
const ageMs = now - updatedAt;
|
|
189
|
+
// Min-closed-age gate: a closed session only qualifies once its close
|
|
190
|
+
// timestamp (closedAt when present, else updatedAt — markSessionClosed
|
|
191
|
+
// sets updatedAt=Date.now() at tombstone time) is older than the gate.
|
|
192
|
+
// Recently-closed sessions may still be resumed, so keep them.
|
|
193
|
+
const closedAt = scan && Number(scan.closedAt) > 0 ? Number(scan.closedAt) : updatedAt;
|
|
194
|
+
const closedAge = now - closedAt;
|
|
195
|
+
const closedQualifies =
|
|
196
|
+
closed && (minClosedAgeMs <= 0 || (Number.isFinite(closedAt) && closedAt > 0 && closedAge > minClosedAgeMs));
|
|
197
|
+
const ageOnly = !closed && maxAgeMs > 0 && Number.isFinite(updatedAt) && updatedAt > 0 && ageMs > maxAgeMs;
|
|
198
|
+
return { scanned: !!scan, closed, updatedAt, closedQualifies, ageOnly };
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// Disk scan for sizes + mtime fallback, then the retention verdict per file
|
|
202
|
+
// rolled into the totals the report prints.
|
|
203
|
+
function collectRetention({ dir, jsonFiles, hbSizeById, rowById, now, maxAgeMs, minClosedAgeMs }) {
|
|
188
204
|
let totalFiles = 0;
|
|
189
205
|
let totalBytes = 0;
|
|
190
206
|
const candidates = []; // { id, reason, updatedAt, bytes, inIndex }
|
|
@@ -217,44 +233,19 @@ function main() {
|
|
|
217
233
|
totalBytes += bytes;
|
|
218
234
|
|
|
219
235
|
const row = rowById.get(id) || null;
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
// itself — not the index — decides closed/age. Fall back to the index
|
|
223
|
-
// row, then to file mtime, only when the scan can't resolve a field.
|
|
224
|
-
let scan = null;
|
|
225
|
-
try {
|
|
226
|
-
scan = scanTopLevelScalars(readFileSync(full, 'utf-8'));
|
|
227
|
-
} catch {
|
|
228
|
-
scan = null;
|
|
229
|
-
}
|
|
230
|
-
if (!scan) scanFailFiles += 1;
|
|
231
|
-
const closedScan = scan && (scan.closed === true || scan.status === 'closed');
|
|
232
|
-
const closedRow = row && (row.closed === true || row.status === 'closed');
|
|
233
|
-
const closed = scan ? !!closedScan : !!closedRow;
|
|
234
|
-
let updatedAt = scan && Number(scan.updatedAt) > 0 ? Number(scan.updatedAt) : 0;
|
|
235
|
-
if (!updatedAt && row && Number(row.updatedAt) > 0) updatedAt = Number(row.updatedAt);
|
|
236
|
-
if (!updatedAt) updatedAt = mtimeMs;
|
|
237
|
-
const ageMs = now - updatedAt;
|
|
238
|
-
// Min-closed-age gate: a closed session only qualifies once its close
|
|
239
|
-
// timestamp (closedAt when present, else updatedAt — markSessionClosed
|
|
240
|
-
// sets updatedAt=Date.now() at tombstone time) is older than the gate.
|
|
241
|
-
// Recently-closed sessions may still be resumed, so keep them.
|
|
242
|
-
const closedAt = scan && Number(scan.closedAt) > 0 ? Number(scan.closedAt) : updatedAt;
|
|
243
|
-
const closedAge = now - closedAt;
|
|
244
|
-
const closedQualifies =
|
|
245
|
-
closed && (minClosedAgeMs <= 0 || (Number.isFinite(closedAt) && closedAt > 0 && closedAge > minClosedAgeMs));
|
|
246
|
-
const ageOnly = !closed && maxAgeMs > 0 && Number.isFinite(updatedAt) && updatedAt > 0 && ageMs > maxAgeMs;
|
|
236
|
+
const verdict = classifySessionFile({ full, mtimeMs, row, now, maxAgeMs, minClosedAgeMs });
|
|
237
|
+
if (!verdict.scanned) scanFailFiles += 1;
|
|
247
238
|
|
|
248
|
-
if (closed && !closedQualifies) {
|
|
239
|
+
if (verdict.closed && !verdict.closedQualifies) {
|
|
249
240
|
closedButFreshCount += 1;
|
|
250
241
|
closedButFreshBytes += bytes;
|
|
251
242
|
}
|
|
252
|
-
if (!closedQualifies && !ageOnly) continue; // keep
|
|
243
|
+
if (!verdict.closedQualifies && !verdict.ageOnly) continue; // keep
|
|
253
244
|
|
|
254
|
-
const reason = closedQualifies ? 'closed' : 'age';
|
|
255
|
-
candidates.push({ id, reason, updatedAt, bytes, inIndex: !!row });
|
|
245
|
+
const reason = verdict.closedQualifies ? 'closed' : 'age';
|
|
246
|
+
candidates.push({ id, reason, updatedAt: verdict.updatedAt, bytes, inIndex: !!row });
|
|
256
247
|
reclaimBytes += bytes;
|
|
257
|
-
if (closedQualifies) {
|
|
248
|
+
if (verdict.closedQualifies) {
|
|
258
249
|
closedCount += 1;
|
|
259
250
|
closedBytes += bytes;
|
|
260
251
|
} else {
|
|
@@ -264,6 +255,37 @@ function main() {
|
|
|
264
255
|
}
|
|
265
256
|
|
|
266
257
|
candidates.sort((a, b) => (a.updatedAt || 0) - (b.updatedAt || 0));
|
|
258
|
+
return {
|
|
259
|
+
totalFiles,
|
|
260
|
+
totalBytes,
|
|
261
|
+
candidates,
|
|
262
|
+
closedCount,
|
|
263
|
+
ageOnlyCount,
|
|
264
|
+
closedBytes,
|
|
265
|
+
ageOnlyBytes,
|
|
266
|
+
reclaimBytes,
|
|
267
|
+
scanFailFiles,
|
|
268
|
+
closedButFreshCount,
|
|
269
|
+
closedButFreshBytes,
|
|
270
|
+
fileIds,
|
|
271
|
+
};
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
function renderReport({ dir, rows, now, maxAgeDays, minClosedAgeDays, retention }) {
|
|
275
|
+
const {
|
|
276
|
+
totalFiles,
|
|
277
|
+
totalBytes,
|
|
278
|
+
candidates,
|
|
279
|
+
closedCount,
|
|
280
|
+
ageOnlyCount,
|
|
281
|
+
closedBytes,
|
|
282
|
+
ageOnlyBytes,
|
|
283
|
+
reclaimBytes,
|
|
284
|
+
scanFailFiles,
|
|
285
|
+
closedButFreshCount,
|
|
286
|
+
closedButFreshBytes,
|
|
287
|
+
fileIds,
|
|
288
|
+
} = retention;
|
|
267
289
|
const oldest = candidates[0] || null;
|
|
268
290
|
const newest = candidates[candidates.length - 1] || null;
|
|
269
291
|
const dropRows = candidates.filter((c) => c.inIndex).length;
|
|
@@ -304,7 +326,31 @@ function main() {
|
|
|
304
326
|
L.push(`index rows after : ${rebuiltIndexRows} (= surviving files; rebuild reindexes all remaining)`);
|
|
305
327
|
L.push('');
|
|
306
328
|
L.push('DRY-RUN ONLY — this tool performed no unlink and no disk writes.');
|
|
307
|
-
|
|
329
|
+
return `${L.join('\n')}\n`;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
function main() {
|
|
333
|
+
const { maxAgeDays, minClosedAgeDays, now } = parseArgs(process.argv.slice(2));
|
|
334
|
+
const maxAgeMs = maxAgeDays * 24 * 60 * 60 * 1000;
|
|
335
|
+
const minClosedAgeMs = minClosedAgeDays * 24 * 60 * 60 * 1000;
|
|
336
|
+
|
|
337
|
+
const dir = join(getPluginData(), 'sessions');
|
|
338
|
+
if (!existsSync(dir)) {
|
|
339
|
+
process.stdout.write(`[session-sweep] no sessions dir at ${dir}\n`);
|
|
340
|
+
return;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
// Authoritative lifecycle rows (read-only). rebuildIfMissing:false so this
|
|
344
|
+
// report never triggers a summary-index write.
|
|
345
|
+
const rows = listStoredSessionSummaries({ rebuildIfMissing: false });
|
|
346
|
+
const rowById = new Map();
|
|
347
|
+
for (const r of rows) if (r?.id) rowById.set(r.id, r);
|
|
348
|
+
|
|
349
|
+
const files = readdirSync(dir);
|
|
350
|
+
const jsonFiles = files.filter((f) => f.endsWith('.json'));
|
|
351
|
+
const hbSizeById = collectHbSidecarSizes(dir, files);
|
|
352
|
+
const retention = collectRetention({ dir, jsonFiles, hbSizeById, rowById, now, maxAgeMs, minClosedAgeMs });
|
|
353
|
+
process.stdout.write(renderReport({ dir, rows, now, maxAgeDays, minClosedAgeDays, retention }));
|
|
308
354
|
}
|
|
309
355
|
|
|
310
356
|
main();
|
package/scripts/test.mjs
CHANGED
|
@@ -2,33 +2,77 @@
|
|
|
2
2
|
// Discovery-based test entry (docs/testing.md). A test file joins the suite
|
|
3
3
|
// by existing; its lane comes from its name, never from a hand-kept list:
|
|
4
4
|
//
|
|
5
|
-
// *.test.mjs
|
|
6
|
-
// *.slow.test.mjs
|
|
7
|
-
// *.live.test.mjs
|
|
5
|
+
// *.test.mjs fast the default lane; every push, every local run
|
|
6
|
+
// *.slow.test.mjs slow files over ~10s; their own CI job
|
|
7
|
+
// *.live.test.mjs live need a built artifact or a live system
|
|
8
|
+
// *.electron.test.mjs electron need a real Electron or window-capture
|
|
9
|
+
// surface, so two runs of them cannot overlap
|
|
8
10
|
//
|
|
9
|
-
//
|
|
10
|
-
//
|
|
11
|
-
//
|
|
12
|
-
// --import forwarded to node (desktop passes its test-env and tsx loaders).
|
|
13
|
-
// --test-* forwarded to node --test (e.g. --test-name-pattern, --test-only).
|
|
11
|
+
// The electron lane rides the default lane (a plain run still covers it) and
|
|
12
|
+
// `--exclude-lane electron` is the explicit opt-out that lets a second run
|
|
13
|
+
// proceed concurrently; `--lane electron` runs those files alone.
|
|
14
14
|
//
|
|
15
|
-
//
|
|
16
|
-
//
|
|
15
|
+
// Usage — see USAGE below (`node scripts/test.mjs --help`).
|
|
16
|
+
//
|
|
17
|
+
// Runs from the package that invokes it: `src/`, `scripts/`, `lib/`, `deploy/`
|
|
18
|
+
// and the package root itself are searched under cwd, so the root package,
|
|
19
|
+
// apps/desktop and apps/relay share this one entry. A root a package does not
|
|
20
|
+
// have simply yields nothing.
|
|
17
21
|
import { glob } from 'node:fs/promises';
|
|
18
22
|
import { resolve } from 'node:path';
|
|
19
23
|
import { fileURLToPath } from 'node:url';
|
|
20
24
|
import { runNodeTests } from './lib/run-node-tests.mjs';
|
|
21
25
|
|
|
22
|
-
const
|
|
26
|
+
const FILE_LANES = ['fast', 'slow', 'live', 'electron'];
|
|
27
|
+
const LANES = [...FILE_LANES, 'all'];
|
|
28
|
+
|
|
29
|
+
export const USAGE = `Usage: node scripts/test.mjs [--lane ${LANES.join('|')}] [--exclude-lane <lane>]...
|
|
30
|
+
[--rerun-failed <n>] [--list] [--coverage]
|
|
31
|
+
[--import <spec>]... [--test-*]... [filter...]
|
|
32
|
+
filter substring of a file path; only matching files run.
|
|
33
|
+
--lane fast (default) also covers the electron lane, so a plain run
|
|
34
|
+
keeps testing it; --lane electron runs those files alone.
|
|
35
|
+
--exclude-lane drop one lane from the selection, repeatable. Electron and
|
|
36
|
+
window-capture tests cannot run twice at once, so a second
|
|
37
|
+
concurrent run uses --exclude-lane electron.
|
|
38
|
+
--rerun-failed <n> re-run the failed files up to n times (default 0 = off).
|
|
39
|
+
A test that passes on a re-run is reported as flaky and,
|
|
40
|
+
because the flag was passed, does NOT fail the run; a test
|
|
41
|
+
that fails every re-run still exits 1. Without the flag every
|
|
42
|
+
failure fails the run, as before.
|
|
43
|
+
--import forwarded to node (desktop passes its test-env and tsx loaders).
|
|
44
|
+
--test-* forwarded to node --test (e.g. --test-name-pattern, --test-only).
|
|
45
|
+
--coverage collect V8 coverage (NODE_V8_COVERAGE, no dependency) and fold
|
|
46
|
+
it into .runtime/coverage/coverage.json, which answers "did the
|
|
47
|
+
suite execute this function?" — see scripts/coverage-query.mjs.
|
|
48
|
+
Selection, lanes, reporting and exit codes are untouched.
|
|
49
|
+
--list print the selected files with their lane, run nothing.
|
|
50
|
+
|
|
51
|
+
Every run ends with a "[failure-summary]" block, printed after all other
|
|
52
|
+
output, naming each failed and flaky test by file and test name; every line of
|
|
53
|
+
it carries that tag, so it survives line filtering.`;
|
|
54
|
+
|
|
55
|
+
const ROOTS = ['.', 'src', 'scripts', 'lib', 'deploy'];
|
|
23
56
|
const PATTERNS = ['**/*.test.mjs', '**/*-test.mjs'];
|
|
57
|
+
// The package root is searched shallowly: a recursive pattern there would pull
|
|
58
|
+
// every workspace package into the invoking package's suite.
|
|
59
|
+
const ROOT_PATTERNS = ['*.test.mjs', '*-test.mjs'];
|
|
24
60
|
const EXCLUDED_DIRS = new Set(['node_modules', '.runtime', 'out', 'dist', 'target']);
|
|
25
61
|
|
|
26
62
|
export function laneOf(file) {
|
|
27
63
|
if (/\.live\.test\.mjs$/.test(file)) return 'live';
|
|
28
64
|
if (/\.slow\.test\.mjs$/.test(file)) return 'slow';
|
|
65
|
+
if (/\.electron\.test\.mjs$/.test(file)) return 'electron';
|
|
29
66
|
return 'fast';
|
|
30
67
|
}
|
|
31
68
|
|
|
69
|
+
function rerunCount(value) {
|
|
70
|
+
if (!/^\d+$/.test(String(value))) {
|
|
71
|
+
throw new Error(`--rerun-failed requires a non-negative integer (got "${value}")`);
|
|
72
|
+
}
|
|
73
|
+
return Number(value);
|
|
74
|
+
}
|
|
75
|
+
|
|
32
76
|
export function parseArgs(argv) {
|
|
33
77
|
const options = { lane: 'fast', list: false, nodeArgs: [], filters: [] };
|
|
34
78
|
for (let index = 0; index < argv.length; index++) {
|
|
@@ -36,12 +80,30 @@ export function parseArgs(argv) {
|
|
|
36
80
|
if (arg === '--lane') options.lane = argv[++index];
|
|
37
81
|
else if (arg.startsWith('--lane=')) options.lane = arg.slice('--lane='.length);
|
|
38
82
|
else if (arg === '--list') options.list = true;
|
|
39
|
-
|
|
40
|
-
|
|
83
|
+
// Opt-in only: an absent flag leaves the parsed options exactly as they
|
|
84
|
+
// were, so nothing downstream can branch on coverage, lane exclusion or
|
|
85
|
+
// re-runs by accident.
|
|
86
|
+
else if (arg === '--coverage') options.coverage = true;
|
|
87
|
+
else if (arg === '--help' || arg === '-h') options.help = true;
|
|
88
|
+
else if (arg === '--exclude-lane') options.excludeLanes = [...(options.excludeLanes ?? []), argv[++index]];
|
|
89
|
+
else if (arg.startsWith('--exclude-lane='))
|
|
90
|
+
options.excludeLanes = [...(options.excludeLanes ?? []), arg.slice('--exclude-lane='.length)];
|
|
91
|
+
else if (arg === '--rerun-failed') options.rerunFailed = rerunCount(argv[++index]);
|
|
92
|
+
else if (arg.startsWith('--rerun-failed=')) options.rerunFailed = rerunCount(arg.slice('--rerun-failed='.length));
|
|
93
|
+
else if (arg === '--import') {
|
|
94
|
+
const spec = argv[++index];
|
|
95
|
+
if (spec === undefined) throw new Error('--import requires a value');
|
|
96
|
+
options.nodeArgs.push(arg, spec);
|
|
97
|
+
} else if (arg.startsWith('--import=') || arg.startsWith('--test-')) options.nodeArgs.push(arg);
|
|
41
98
|
else options.filters.push(arg.replaceAll('\\', '/'));
|
|
42
99
|
}
|
|
43
|
-
if (!
|
|
44
|
-
throw new Error(`unknown lane "${options.lane}" (
|
|
100
|
+
if (!LANES.includes(options.lane)) {
|
|
101
|
+
throw new Error(`unknown lane "${options.lane}" (${LANES.join('|')})`);
|
|
102
|
+
}
|
|
103
|
+
for (const lane of options.excludeLanes ?? []) {
|
|
104
|
+
if (!FILE_LANES.includes(lane)) {
|
|
105
|
+
throw new Error(`unknown excluded lane "${lane}" (${FILE_LANES.join('|')})`);
|
|
106
|
+
}
|
|
45
107
|
}
|
|
46
108
|
return options;
|
|
47
109
|
}
|
|
@@ -49,29 +111,39 @@ export function parseArgs(argv) {
|
|
|
49
111
|
export async function discoverTestFiles(cwd = process.cwd()) {
|
|
50
112
|
const files = new Set();
|
|
51
113
|
for (const root of ROOTS) {
|
|
52
|
-
for await (const entry of glob(
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
.some((segment) => EXCLUDED_DIRS.has(segment)),
|
|
60
|
-
}
|
|
61
|
-
))
|
|
114
|
+
for await (const entry of glob(root === '.' ? ROOT_PATTERNS : PATTERNS.map((pattern) => `${root}/${pattern}`), {
|
|
115
|
+
cwd,
|
|
116
|
+
exclude: (path) =>
|
|
117
|
+
String(path)
|
|
118
|
+
.split(/[\\/]/)
|
|
119
|
+
.some((segment) => EXCLUDED_DIRS.has(segment)),
|
|
120
|
+
}))
|
|
62
121
|
files.add(entry.replaceAll('\\', '/'));
|
|
63
122
|
}
|
|
64
123
|
return [...files].sort();
|
|
65
124
|
}
|
|
66
125
|
|
|
67
|
-
|
|
126
|
+
// The electron lane rides the default lane so a plain `npm test` keeps
|
|
127
|
+
// covering an Electron/window-capture surface that no other lane owns;
|
|
128
|
+
// `--exclude-lane electron` is the explicit way to drop it.
|
|
129
|
+
export function laneSelected(lane, fileLane) {
|
|
130
|
+
if (lane === 'all' || lane === fileLane) return true;
|
|
131
|
+
return lane === 'fast' && fileLane === 'electron';
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
export function selectTestFiles(files, { lane, filters, excludeLanes = [] }) {
|
|
135
|
+
const excluded = new Set(excludeLanes);
|
|
68
136
|
return files
|
|
69
|
-
.filter((file) => lane
|
|
137
|
+
.filter((file) => laneSelected(lane, laneOf(file)) && !excluded.has(laneOf(file)))
|
|
70
138
|
.filter((file) => filters.length === 0 || filters.some((filter) => file.includes(filter)));
|
|
71
139
|
}
|
|
72
140
|
|
|
73
141
|
async function main() {
|
|
74
142
|
const options = parseArgs(process.argv.slice(2));
|
|
143
|
+
if (options.help) {
|
|
144
|
+
console.log(USAGE);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
75
147
|
const files = selectTestFiles(await discoverTestFiles(), options);
|
|
76
148
|
if (options.list) {
|
|
77
149
|
for (const file of files) console.log(`${laneOf(file).padEnd(5)} ${file}`);
|
|
@@ -82,16 +154,20 @@ async function main() {
|
|
|
82
154
|
process.exitCode = 1;
|
|
83
155
|
return;
|
|
84
156
|
}
|
|
85
|
-
await runNodeTests(
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
157
|
+
await runNodeTests(
|
|
158
|
+
[
|
|
159
|
+
...options.nodeArgs,
|
|
160
|
+
// node:test `mock.module` (module-boundary stubs such as the pinned fetch
|
|
161
|
+
// in the browser-document live suite) is still flag-gated on 22/24.
|
|
162
|
+
'--experimental-test-module-mocks',
|
|
163
|
+
'--test',
|
|
164
|
+
// A suite that leaves a handle open (a session runtime closed without
|
|
165
|
+
// waiting for its children) must not hang the whole run.
|
|
166
|
+
'--test-force-exit',
|
|
167
|
+
],
|
|
168
|
+
files,
|
|
169
|
+
{ coverage: options.coverage === true, rerunFailed: options.rerunFailed ?? 0 }
|
|
170
|
+
);
|
|
95
171
|
}
|
|
96
172
|
|
|
97
173
|
const invoked = process.argv[1] ? resolve(process.argv[1]) : '';
|
|
@@ -280,7 +280,7 @@ function makeDriver({ rows, cols, isWindows }) {
|
|
|
280
280
|
// (NON-fullscreen branch) → log-update relative cursorUp walk → one-row-low
|
|
281
281
|
// dip under Windows Terminal. A steady frame (shortByOne=false) fills the
|
|
282
282
|
// viewport, stays on the absolute cursorTo path, and is stable.
|
|
283
|
-
function frame({ rows, cols, palette, shortByOne, heightRows }) {
|
|
283
|
+
function frame({ rows, cols: _cols, palette, shortByOne, heightRows }) {
|
|
284
284
|
// [FAITHFUL] App.jsx pins the bottom cluster with the outer full-height
|
|
285
285
|
// column (height=resizeState.rows) + flexShrink={0} on the bottom bar. So the
|
|
286
286
|
// Yoga root height is `rows` when accounting is correct. When a reclaimed row
|