mixdog 0.9.63 → 0.9.64
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 +3 -0
- package/package.json +9 -2
- package/scripts/code-graph-description-contract.mjs +3 -3
- package/scripts/verify-release-assets.mjs +2 -2
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +11 -14
- package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +6 -6
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -2
- package/src/runtime/agent/orchestrator/agent-trace-format.mjs +1 -0
- package/src/runtime/agent/orchestrator/config.mjs +19 -124
- package/src/runtime/agent/orchestrator/context/collect.mjs +6 -6
- package/src/runtime/agent/orchestrator/dispatch-persist.mjs +2 -2
- package/src/runtime/agent/orchestrator/internal-agents.mjs +2 -2
- package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +1 -1
- package/src/runtime/agent/orchestrator/mcp/client.mjs +4 -4
- package/src/runtime/agent/orchestrator/providers/admission-scheduler.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-betas.mjs +4 -4
- package/src/runtime/agent/orchestrator/providers/anthropic-effort.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens.mjs +4 -4
- package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +333 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-model-resolve.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +4 -4
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +3 -277
- package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/custom-tool-wire.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +6 -6
- package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +196 -0
- package/src/runtime/agent/orchestrator/providers/grok-oauth-tokens.mjs +460 -0
- package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +14 -593
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +4 -4
- package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +5 -280
- package/src/runtime/agent/orchestrator/providers/openai-responses-payload.mjs +357 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-headers.mjs +216 -0
- package/src/runtime/agent/orchestrator/providers/openai-ws-pool.mjs +2 -188
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/provider-catalog-cache.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/registry.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/cache/prefetch-cache.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +3 -3
- package/src/runtime/agent/orchestrator/session/compact/budget.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/compact/file-reattach.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/compact/summary-schema.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/compact/summary.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/compact/text-utils.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/context-utils.mjs +4 -4
- package/src/runtime/agent/orchestrator/session/loop/deferred-call-through.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +17 -0
- package/src/runtime/agent/orchestrator/session/loop/steering.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/stored-tool-args.mjs +18 -26
- package/src/runtime/agent/orchestrator/session/loop/termination.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-classify.mjs +3 -3
- package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +1 -0
- package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/delivered-completions.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/status-telemetry.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/live-state.mjs +49 -0
- package/src/runtime/agent/orchestrator/session/store/load-cache.mjs +49 -0
- package/src/runtime/agent/orchestrator/session/store/save-worker.mjs +260 -0
- package/src/runtime/agent/orchestrator/session/store/serialize.mjs +72 -0
- package/src/runtime/agent/orchestrator/session/store/summary-cache.mjs +163 -0
- package/src/runtime/agent/orchestrator/session/store/write-guards.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/store.mjs +9 -561
- package/src/runtime/agent/orchestrator/session/tool-envelope.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +2 -2
- package/src/runtime/agent/orchestrator/stall-policy.mjs +11 -11
- package/src/runtime/agent/orchestrator/tools/bash-policy-scan.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/bash-session.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/advisory-lock.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/atomic-write.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +2 -154
- package/src/runtime/agent/orchestrator/tools/builtin/cache-layers.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/cwd-utils.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/fs-reachability.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/fuzzy-match.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/glob-walk.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/path-locks.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/path-utils.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-args.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +2 -3
- package/src/runtime/agent/orchestrator/tools/builtin/read-image-resize.mjs +4 -4
- package/src/runtime/agent/orchestrator/tools/builtin/read-open.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/rg-runner.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/search-path-diagnostics.mjs +5 -5
- package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/shell-job-paths.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/shell-job-process.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/shell-job-spawn.mjs +519 -0
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +5 -449
- package/src/runtime/agent/orchestrator/tools/builtin/snapshot-helpers.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +212 -0
- package/src/runtime/agent/orchestrator/tools/builtin.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/code-graph/build.mjs +1 -7
- package/src/runtime/agent/orchestrator/tools/code-graph/disk-cache.mjs +9 -36
- package/src/runtime/agent/orchestrator/tools/code-graph/dispatch.mjs +15 -3
- package/src/runtime/agent/orchestrator/tools/code-graph/search-references.mjs +429 -0
- package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +2 -395
- package/src/runtime/agent/orchestrator/tools/code-graph/symbol-index.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/code-graph/text-mask.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/code-graph/trusted-roots.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/code-graph-prewarm-worker.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/code-graph-state.mjs +3 -3
- package/src/runtime/agent/orchestrator/tools/mutation-planner.mjs +5 -5
- package/src/runtime/agent/orchestrator/tools/next-call-utils.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/patch/dispatch.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/patch/matcher.mjs +7 -7
- package/src/runtime/agent/orchestrator/tools/patch/orchestrator.mjs +72 -9
- package/src/runtime/agent/orchestrator/tools/patch/parsing.mjs +4 -4
- package/src/runtime/agent/orchestrator/tools/patch/paths.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/patch/v4a-convert.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/patch-tool-defs.mjs +4 -4
- package/src/runtime/agent/orchestrator/tools/patch.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/result-compression.mjs +3 -3
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +2 -444
- package/src/runtime/agent/orchestrator/tools/shell-exec-output.mjs +505 -0
- package/src/runtime/agent/orchestrator/tools/shell-exec-policy.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +1 -1
- package/src/runtime/channels/lib/backend-dispatch.mjs +20 -5
- package/src/runtime/channels/lib/scheduler.mjs +1 -1
- package/src/runtime/channels/lib/telegram-format.mjs +1 -1
- package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +4 -4
- package/src/runtime/channels/tool-defs.mjs +2 -3
- package/src/runtime/memory/index.mjs +1 -5
- package/src/runtime/memory/lib/core-memory-candidates.mjs +357 -0
- package/src/runtime/memory/lib/core-memory-store.mjs +7 -357
- package/src/runtime/memory/lib/cycle-signatures.mjs +1 -1
- package/src/runtime/memory/lib/embedding-model-config.mjs +1 -1
- package/src/runtime/memory/lib/embedding-provider.mjs +1 -5
- package/src/runtime/memory/lib/embedding-worker.mjs +1 -5
- package/src/runtime/memory/lib/ko-morph.mjs +2 -2
- package/src/runtime/memory/lib/memory-config-flags.mjs +2 -5
- package/src/runtime/memory/lib/memory-cycle-requests.mjs +3 -7
- package/src/runtime/memory/lib/memory-cycle1.mjs +4 -8
- package/src/runtime/memory/lib/memory-cycle2-gate.mjs +1 -1
- package/src/runtime/memory/lib/memory-cycle2-mutations.mjs +1 -1
- package/src/runtime/memory/lib/memory-cycle2-shared.mjs +2 -5
- package/src/runtime/memory/lib/memory-cycle3.mjs +1 -5
- package/src/runtime/memory/lib/memory-embed.mjs +2 -6
- package/src/runtime/memory/lib/memory-log.mjs +8 -0
- package/src/runtime/memory/lib/memory-ops-policy.mjs +4 -8
- package/src/runtime/memory/lib/memory-recall-scope-filter.mjs +1 -1
- package/src/runtime/memory/lib/memory-recall-store.mjs +2 -193
- package/src/runtime/memory/lib/memory-score.mjs +1 -1
- package/src/runtime/memory/lib/memory-text-utils.mjs +2 -2
- package/src/runtime/memory/lib/memory.mjs +2 -6
- package/src/runtime/memory/lib/pg/adapter.mjs +2 -6
- package/src/runtime/memory/lib/pg/process.mjs +1 -5
- package/src/runtime/memory/lib/pg/supervisor.mjs +1 -5
- package/src/runtime/memory/lib/recall-format.mjs +2 -2
- package/src/runtime/memory/lib/recall-scoring.mjs +195 -0
- package/src/runtime/memory/lib/runtime-fetcher.mjs +1 -5
- package/src/runtime/memory/lib/trace-store.mjs +2 -6
- package/src/runtime/search/lib/http-fetch.mjs +6 -6
- package/src/runtime/search/lib/web-tools.mjs +2 -2
- package/src/runtime/shared/buffered-appender.mjs +1 -1
- package/src/runtime/shared/child-guardian.mjs +1 -1
- package/src/runtime/shared/child-spawn-gate.mjs +1 -1
- package/src/runtime/shared/config.mjs +4 -4
- package/src/runtime/shared/launcher-control.mjs +9 -10
- package/src/runtime/shared/llm/index.mjs +5 -20
- package/src/runtime/shared/markdown-frontmatter.mjs +1 -1
- package/src/runtime/shared/memory-snapshot.mjs +4 -4
- package/src/runtime/shared/pristine-execution.mjs +1 -1
- package/src/runtime/shared/process-lifecycle.mjs +0 -1
- package/src/runtime/shared/process-shutdown.mjs +1 -1
- package/src/runtime/shared/resource-admission.mjs +2 -2
- package/src/runtime/shared/schedule-session-run.mjs +1 -1
- package/src/runtime/shared/schedules-db.mjs +1 -1
- package/src/runtime/shared/service-discovery.mjs +2 -2
- package/src/runtime/shared/staged-update.mjs +6 -6
- package/src/runtime/shared/tool-execution-contract.mjs +1 -1
- package/src/runtime/shared/tool-primitives.mjs +1 -1
- package/src/runtime/shared/tool-surface.mjs +2 -2
- package/src/runtime/shared/update-checker.mjs +1 -1
- package/src/runtime/shared/user-cwd.mjs +3 -3
- package/src/runtime/shared/user-data-guard.mjs +4 -4
- package/src/runtime/shared/workspace-router.mjs +5 -5
- package/src/session-runtime/config-helpers.mjs +2 -3
- package/src/session-runtime/config-lifecycle.mjs +1 -1
- package/src/session-runtime/hitch-profile.mjs +1 -1
- package/src/session-runtime/lifecycle-api.mjs +6 -4
- package/src/session-runtime/model-recency.mjs +5 -5
- package/src/session-runtime/plugin-mcp.mjs +1 -1
- package/src/session-runtime/provider-request-snapshot.mjs +338 -0
- package/src/session-runtime/session-text.mjs +4 -4
- package/src/session-runtime/tool-catalog-schema.mjs +197 -0
- package/src/session-runtime/tool-catalog.mjs +6 -483
- package/src/session-runtime/tool-defs.mjs +1 -1
- package/src/standalone/agent-task-status.mjs +1 -1
- package/src/standalone/agent-tool/helpers.mjs +2 -2
- package/src/standalone/channel-admin.mjs +4 -4
- package/src/standalone/explore-tool.mjs +3 -3
- package/src/standalone/hook-bus/config.mjs +1 -1
- package/src/standalone/hook-bus/constants.mjs +1 -1
- package/src/standalone/hook-bus/rules.mjs +1 -1
- package/src/standalone/projects.mjs +1 -1
- package/src/standalone/provider-admin.mjs +2 -2
- package/src/tui/app/app-format.mjs +2 -2
- package/src/tui/app/clipboard.mjs +3 -3
- package/src/tui/app/input-parsers.mjs +1 -1
- package/src/tui/app/text-layout.mjs +1 -1
- package/src/tui/app/transcript-row-estimate.mjs +360 -0
- package/src/tui/app/transcript-window.mjs +5 -347
- package/src/tui/app/use-mouse-input.mjs +1 -1
- package/src/tui/app/use-prompt-handlers.mjs +1 -1
- package/src/tui/components/tool-execution/surface-detail.mjs +9 -9
- package/src/tui/components/tool-execution/text-format.mjs +2 -2
- package/src/tui/components/tool-output-format.mjs +7 -7
- package/src/tui/display-width.mjs +4 -4
- package/src/tui/dist/index.mjs +63 -97
- package/src/tui/engine/agent-envelope.mjs +5 -5
- package/src/tui/engine/notification-plan.mjs +1 -1
- package/src/tui/engine/queue-helpers.mjs +3 -3
- package/src/tui/engine/render-timing.mjs +4 -5
- package/src/tui/engine/session-api-ext.mjs +3 -3
- package/src/tui/engine/tool-result-status.mjs +5 -5
- package/src/tui/engine/tool-result-text.mjs +1 -1
- package/src/tui/engine/transcript-spill.mjs +585 -0
- package/src/tui/engine/tui-steering-persist.mjs +1 -1
- package/src/tui/engine.mjs +2 -474
- package/src/tui/lib/voice-setup.mjs +1 -1
- package/src/tui/markdown/format-token.mjs +1 -1
- package/src/tui/markdown/render-ansi.mjs +1 -1
- package/src/tui/markdown/table-layout.mjs +4 -4
- package/src/tui/paste-attachments.mjs +1 -1
- package/src/tui/prompt-history-store.mjs +3 -3
- package/src/tui/statusline-ansi-bridge.mjs +2 -2
- package/src/tui/theme.mjs +1 -1
- package/src/tui/transcript-tool-failures.mjs +2 -2
- package/src/ui/ansi.mjs +0 -9
- package/src/ui/statusline-format.mjs +2 -4
- package/scripts/_bench-cwc.json +0 -20
- package/scripts/_jitter-fuzz.jsx +0 -42
- package/scripts/_jitter-fuzz2.jsx +0 -30
- package/scripts/_jitter-probe.jsx +0 -35
- package/scripts/_jp2.jsx +0 -16
- package/scripts/_smoke_wd.mjs +0 -7
- package/scripts/abort-recovery-test.mjs +0 -175
- package/scripts/agent-dispatch-abort-compose-test.mjs +0 -31
- package/scripts/agent-live-arg-guard-smoke.mjs +0 -20
- package/scripts/agent-live-path-suffix-smoke.mjs +0 -34
- package/scripts/agent-live-toolcall-args-smoke.mjs +0 -45
- package/scripts/agent-loop-policy-test.mjs +0 -37
- package/scripts/agent-model-liveness-test.mjs +0 -763
- package/scripts/agent-parallel-smoke.mjs +0 -435
- package/scripts/agent-route-batch-test.mjs +0 -40
- package/scripts/agent-tag-reuse-smoke.mjs +0 -441
- package/scripts/agent-terminal-reap-test.mjs +0 -252
- package/scripts/agent-trace-io-test.mjs +0 -133
- package/scripts/ansi-color-capability-test.mjs +0 -90
- package/scripts/anthropic-admission-retry-integration-test.mjs +0 -119
- package/scripts/anthropic-maxtokens-test.mjs +0 -119
- package/scripts/anthropic-oauth-refresh-race-test.mjs +0 -397
- package/scripts/anthropic-transport-policy-test.mjs +0 -726
- package/scripts/apply-patch-edit-smoke.mjs +0 -71
- package/scripts/arg-guard-test.mjs +0 -93
- package/scripts/async-notify-settlement-test.mjs +0 -99
- package/scripts/atomic-lock-tryonce-test.mjs +0 -125
- package/scripts/background-task-meta-smoke.mjs +0 -38
- package/scripts/bench-run.mjs +0 -508
- package/scripts/boot-smoke.mjs +0 -137
- package/scripts/build-runtime-windows.ps1 +0 -242
- package/scripts/channel-daemon-smoke.mjs +0 -1103
- package/scripts/code-graph-aggregate-cwd-test.mjs +0 -158
- package/scripts/code-graph-disk-hit-test.mjs +0 -290
- package/scripts/code-graph-dispatch-test.mjs +0 -96
- package/scripts/code-graph-root-federation-test.mjs +0 -273
- package/scripts/compact-active-turn-test.mjs +0 -68
- package/scripts/compact-file-reattach-test.mjs +0 -88
- package/scripts/compact-pressure-test.mjs +0 -788
- package/scripts/compact-prior-context-flatten-test.mjs +0 -252
- package/scripts/compact-recall-digest-test.mjs +0 -57
- package/scripts/compact-smoke.mjs +0 -1017
- package/scripts/compact-trigger-migration-smoke.mjs +0 -261
- package/scripts/compacted-placeholder-scrub-test.mjs +0 -63
- package/scripts/context-mcp-metering-test.mjs +0 -1406
- package/scripts/debounced-skills-async-save-test.mjs +0 -57
- package/scripts/deferred-tool-loading-test.mjs +0 -250
- package/scripts/desktop-session-bridge-test.mjs +0 -1013
- package/scripts/dispatch-persist-recovery-test.mjs +0 -141
- package/scripts/embedding-worker-exit-test.mjs +0 -76
- package/scripts/execution-completion-dedup-test.mjs +0 -205
- package/scripts/execution-pending-resume-kick-test.mjs +0 -151
- package/scripts/execution-resume-esc-integration-test.mjs +0 -176
- package/scripts/explore-bench-tmp.mjs +0 -36
- package/scripts/explore-bench.mjs +0 -248
- package/scripts/explore-prompt-policy-test.mjs +0 -256
- package/scripts/explore-timeout-cancel-test.mjs +0 -345
- package/scripts/find-fuzzy-hidden-test.mjs +0 -267
- package/scripts/forwarder-rebind-tail-test.mjs +0 -67
- package/scripts/freevar-smoke.mjs +0 -98
- package/scripts/gemini-provider-test.mjs +0 -1448
- package/scripts/generate-oc-icons.mjs +0 -11
- package/scripts/grok-oauth-refresh-race-test.mjs +0 -273
- package/scripts/headless-pristine-execution-test.mjs +0 -614
- package/scripts/hook-bus-test.mjs +0 -552
- package/scripts/ingest-pure-conversation-smoke.mjs +0 -175
- package/scripts/internal-comms-bench-test.mjs +0 -226
- package/scripts/internal-comms-bench.mjs +0 -853
- package/scripts/internal-comms-smoke.mjs +0 -277
- package/scripts/internal-tools-normalization-test.mjs +0 -62
- package/scripts/interrupted-turn-history-test.mjs +0 -399
- package/scripts/lead-workflow-smoke.mjs +0 -592
- package/scripts/lifecycle-api-test.mjs +0 -137
- package/scripts/live-share-test.mjs +0 -148
- package/scripts/live-worker-smoke.mjs +0 -333
- package/scripts/log-writer-guard-smoke.mjs +0 -131
- package/scripts/maintenance-default-routes-test.mjs +0 -164
- package/scripts/max-output-recovery-persist-test.mjs +0 -81
- package/scripts/max-output-recovery-test.mjs +0 -368
- package/scripts/mcp-client-normalization-test.mjs +0 -45
- package/scripts/mcp-grace-deferred-test.mjs +0 -225
- package/scripts/memory-core-input-test.mjs +0 -167
- package/scripts/memory-cycle-routing-test.mjs +0 -111
- package/scripts/memory-meta-concurrency-test.mjs +0 -20
- package/scripts/memory-pg-recovery-test.mjs +0 -59
- package/scripts/memory-rule-contract-test.mjs +0 -93
- package/scripts/model-list-sanitize-test.mjs +0 -37
- package/scripts/mouse-tracking-restore-smoke.mjs +0 -107
- package/scripts/native-edit-wire-test.mjs +0 -152
- package/scripts/notify-completion-mirror-test.mjs +0 -73
- package/scripts/openai-oauth-refresh-race-test.mjs +0 -120
- package/scripts/openai-oauth-ws-1006-retry-test.mjs +0 -954
- package/scripts/openai-ws-early-settle-test.mjs +0 -216
- package/scripts/output-style-bench.mjs +0 -292
- package/scripts/output-style-smoke.mjs +0 -145
- package/scripts/parent-abort-link-test.mjs +0 -90
- package/scripts/patch-binary-cache-test.mjs +0 -181
- package/scripts/path-suffix-test.mjs +0 -57
- package/scripts/pending-completion-drop-test.mjs +0 -239
- package/scripts/pending-messages-lock-nonblocking-test.mjs +0 -62
- package/scripts/pretool-ask-runtime-test.mjs +0 -54
- package/scripts/process-lifecycle-test.mjs +0 -461
- package/scripts/prompt-immediate-render-test.mjs +0 -89
- package/scripts/prompt-input-parity-test.mjs +0 -145
- package/scripts/provider-admission-scheduler-test.mjs +0 -681
- package/scripts/provider-contract-test.mjs +0 -632
- package/scripts/provider-stream-stall-test.mjs +0 -276
- package/scripts/provider-toolcall-test.mjs +0 -3063
- package/scripts/reactive-compact-persist-smoke.mjs +0 -203
- package/scripts/recall-bench.mjs +0 -359
- package/scripts/resource-admission-test.mjs +0 -792
- package/scripts/result-classification-test.mjs +0 -75
- package/scripts/rg-runner-test.mjs +0 -240
- package/scripts/routing-corpus-test.mjs +0 -349
- package/scripts/sanitize-tool-pairs-test.mjs +0 -260
- package/scripts/session-bench-cache-break-test.mjs +0 -102
- package/scripts/session-bench.mjs +0 -1708
- package/scripts/session-context-bench.mjs +0 -344
- package/scripts/session-heartbeat-lifecycle-test.mjs +0 -68
- package/scripts/session-ingest-compaction-smoke.mjs +0 -279
- package/scripts/session-ingest-smoke.mjs +0 -177
- package/scripts/session-orphan-sweep-test.mjs +0 -109
- package/scripts/set-effort-config-test.mjs +0 -41
- package/scripts/shell-failure-diagnostics-test.mjs +0 -280
- package/scripts/shell-hardening-test.mjs +0 -209
- package/scripts/shell-jobs-windows-hide-test.mjs +0 -164
- package/scripts/ship-mode-test.mjs +0 -98
- package/scripts/smoke-loop-failure-summary-test.mjs +0 -38
- package/scripts/smoke-loop-failure-summary.mjs +0 -16
- package/scripts/smoke-loop-report.mjs +0 -221
- package/scripts/smoke-loop.mjs +0 -202
- package/scripts/smoke-runtime-negative.ps1 +0 -106
- package/scripts/statusline-quota-hysteresis-test.mjs +0 -62
- package/scripts/steering-drain-buckets-test.mjs +0 -467
- package/scripts/steering-fold-provenance-test.mjs +0 -71
- package/scripts/streaming-tail-window-test.mjs +0 -175
- package/scripts/submit-commandbusy-race-test.mjs +0 -257
- package/scripts/task-bench.mjs +0 -205
- package/scripts/terminal-bench-isolation-guards-test.mjs +0 -102
- package/scripts/termio-input-smoke.mjs +0 -199
- package/scripts/tool-result-hook-test.mjs +0 -48
- package/scripts/tool-smoke.mjs +0 -2453
- package/scripts/tool-tui-presentation-test.mjs +0 -286
- package/scripts/toolcall-args-test.mjs +0 -239
- package/scripts/tui-ambiguous-width-test.mjs +0 -113
- package/scripts/tui-background-failure-smoke.mjs +0 -73
- package/scripts/tui-perf-run.ps1 +0 -26
- package/scripts/tui-render-smoke.mjs +0 -90
- package/scripts/tui-runtime-load-bench-entry.jsx +0 -608
- package/scripts/tui-runtime-load-bench.mjs +0 -50
- package/scripts/tui-store-frame-batch-test.mjs +0 -99
- package/scripts/tui-transcript-jitter-harness-entry.jsx +0 -383
- package/scripts/tui-transcript-perf-test.mjs +0 -934
- package/scripts/usage-metrics-epoch-smoke.mjs +0 -114
- package/scripts/verify-release-assets-test.mjs +0 -281
- package/scripts/web-fetch-routing-test.mjs +0 -158
- package/scripts/webhook-smoke.mjs +0 -201
- package/scripts/windows-hide-spawn-options-test.mjs +0 -19
- package/scripts/worker-notify-rejection-test.mjs +0 -51
- package/scripts/write-backpressure-test.mjs +0 -147
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import test from 'node:test';
|
|
2
|
-
import assert from 'node:assert/strict';
|
|
3
|
-
|
|
4
|
-
import { createFrameBatchedStorePublisher } from '../src/tui/engine/frame-batched-store.mjs';
|
|
5
|
-
|
|
6
|
-
function harness() {
|
|
7
|
-
let draft = { items: [], structureRevision: 4 };
|
|
8
|
-
let published = draft;
|
|
9
|
-
const listeners = new Set();
|
|
10
|
-
const timers = [];
|
|
11
|
-
let unrefs = 0;
|
|
12
|
-
let cancellations = 0;
|
|
13
|
-
const publisher = createFrameBatchedStorePublisher({
|
|
14
|
-
getState: () => draft,
|
|
15
|
-
publishState: (next) => {
|
|
16
|
-
published = Object.freeze(next);
|
|
17
|
-
draft = { ...next, stats: next.stats ? { ...next.stats } : next.stats };
|
|
18
|
-
},
|
|
19
|
-
listeners,
|
|
20
|
-
setTimer: (fn) => {
|
|
21
|
-
const timer = { fn, cancelled: false, unref: () => { unrefs += 1; } };
|
|
22
|
-
timers.push(timer);
|
|
23
|
-
return timer;
|
|
24
|
-
},
|
|
25
|
-
clearTimer: (timer) => {
|
|
26
|
-
timer.cancelled = true;
|
|
27
|
-
cancellations += 1;
|
|
28
|
-
},
|
|
29
|
-
});
|
|
30
|
-
return {
|
|
31
|
-
publisher,
|
|
32
|
-
listeners,
|
|
33
|
-
timers,
|
|
34
|
-
getState: () => published,
|
|
35
|
-
getDraft: () => draft,
|
|
36
|
-
mutate: (fn) => { draft = fn(draft); },
|
|
37
|
-
getUnrefs: () => unrefs,
|
|
38
|
-
getCancellations: () => cancellations,
|
|
39
|
-
};
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
test('frame publisher preserves mutation order and commits one revision/notification', () => {
|
|
43
|
-
const h = harness();
|
|
44
|
-
const snapshots = [];
|
|
45
|
-
h.listeners.add(() => snapshots.push(h.getState()));
|
|
46
|
-
h.mutate((state) => ({ ...state, items: [...state.items, 'agent-a'] }));
|
|
47
|
-
h.publisher.markStructureChange();
|
|
48
|
-
h.publisher.emit();
|
|
49
|
-
h.mutate((state) => ({ ...state, items: [...state.items, 'tool-b'] }));
|
|
50
|
-
h.publisher.markStructureChange();
|
|
51
|
-
h.publisher.emit();
|
|
52
|
-
|
|
53
|
-
assert.deepEqual(h.getDraft().items, ['agent-a', 'tool-b']);
|
|
54
|
-
assert.equal(h.getDraft().structureRevision, 4);
|
|
55
|
-
assert.deepEqual(h.getState().items, [], 'public snapshot stays on the prior atomic pair before flush');
|
|
56
|
-
assert.equal(h.getState().structureRevision, 4);
|
|
57
|
-
assert.equal(h.timers.length, 1);
|
|
58
|
-
assert.equal(h.getUnrefs(), 1);
|
|
59
|
-
h.timers[0].fn();
|
|
60
|
-
assert.equal(snapshots.length, 1);
|
|
61
|
-
assert.deepEqual(snapshots[0].items, ['agent-a', 'tool-b']);
|
|
62
|
-
assert.equal(snapshots[0].structureRevision, 5);
|
|
63
|
-
|
|
64
|
-
// A getState()-style write targets the detached draft, never the object
|
|
65
|
-
// already handed to useSyncExternalStore.
|
|
66
|
-
h.getDraft().items = ['draft-only'];
|
|
67
|
-
assert.deepEqual(h.getState().items, ['agent-a', 'tool-b']);
|
|
68
|
-
assert.equal(h.getState().structureRevision, 5);
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
test('immediate flush publishes the same terminal batch', async () => {
|
|
72
|
-
const h = harness();
|
|
73
|
-
let notifications = 0;
|
|
74
|
-
h.listeners.add(() => { notifications += 1; });
|
|
75
|
-
h.mutate((state) => ({ ...state, items: ['echo'] }));
|
|
76
|
-
h.publisher.markStructureChange();
|
|
77
|
-
h.publisher.emit();
|
|
78
|
-
h.publisher.flushImmediate();
|
|
79
|
-
await Promise.resolve();
|
|
80
|
-
assert.equal(notifications, 1);
|
|
81
|
-
assert.equal(h.getState().structureRevision, 5);
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
test('dispose publishes pending state once and cancels its timer', () => {
|
|
85
|
-
const h = harness();
|
|
86
|
-
const snapshots = [];
|
|
87
|
-
h.listeners.add(() => snapshots.push(h.getState()));
|
|
88
|
-
h.mutate((state) => ({ ...state, items: ['final'] }));
|
|
89
|
-
h.publisher.markStructureChange();
|
|
90
|
-
h.publisher.emit();
|
|
91
|
-
const timer = h.timers.at(-1);
|
|
92
|
-
h.publisher.dispose();
|
|
93
|
-
assert.equal(snapshots.length, 1);
|
|
94
|
-
assert.deepEqual(snapshots[0], { items: ['final'], structureRevision: 5 });
|
|
95
|
-
assert.equal(timer.cancelled, true);
|
|
96
|
-
assert.equal(h.getCancellations(), 1);
|
|
97
|
-
timer.fn();
|
|
98
|
-
assert.equal(snapshots.length, 1, 'cancelled timer cannot emit after dispose');
|
|
99
|
-
});
|
|
@@ -1,383 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { PassThrough } from 'node:stream';
|
|
3
|
-
import { Box, measureElement, render } from 'ink';
|
|
4
|
-
import { Item } from '../src/tui/components/TranscriptItem.jsx';
|
|
5
|
-
import { useTranscriptWindow } from '../src/tui/app/use-transcript-window.mjs';
|
|
6
|
-
import {
|
|
7
|
-
streamingMeasuredRowsById,
|
|
8
|
-
} from '../src/tui/app/transcript-window.mjs';
|
|
9
|
-
import {
|
|
10
|
-
resetAllStreamingMarkdownStablePrefixes,
|
|
11
|
-
resetStreamingMarkdownStablePrefix,
|
|
12
|
-
resolveStreamingMarkdownParts,
|
|
13
|
-
} from '../src/tui/markdown/streaming-markdown.mjs';
|
|
14
|
-
|
|
15
|
-
const COLUMNS = 42;
|
|
16
|
-
const VIEW_ROWS = 8;
|
|
17
|
-
const INITIAL_SCROLL = 8;
|
|
18
|
-
const STREAM_ID = 'jitter-fence-tail';
|
|
19
|
-
const HISTORY = Array.from({ length: 8 }, (_, index) => ({
|
|
20
|
-
id: `history-${index}`,
|
|
21
|
-
kind: 'notice',
|
|
22
|
-
tone: 'plain',
|
|
23
|
-
text: `H${index} stable history row`,
|
|
24
|
-
}));
|
|
25
|
-
const SCRIPT = [
|
|
26
|
-
'Here is the script:',
|
|
27
|
-
'',
|
|
28
|
-
'```js',
|
|
29
|
-
'const first = `',
|
|
30
|
-
'alpha',
|
|
31
|
-
'`;',
|
|
32
|
-
'const second = `',
|
|
33
|
-
'beta',
|
|
34
|
-
'`;',
|
|
35
|
-
'console.log(first, second);',
|
|
36
|
-
'```',
|
|
37
|
-
'',
|
|
38
|
-
'Done.',
|
|
39
|
-
].join('\n');
|
|
40
|
-
|
|
41
|
-
const frames = [];
|
|
42
|
-
globalThis.__mixdogTailGrowthProbe = null;
|
|
43
|
-
let commit = 0;
|
|
44
|
-
const identity = (value) => value;
|
|
45
|
-
const noop = () => {};
|
|
46
|
-
|
|
47
|
-
function Harness({
|
|
48
|
-
text,
|
|
49
|
-
step,
|
|
50
|
-
initialScroll = INITIAL_SCROLL,
|
|
51
|
-
streamId = STREAM_ID,
|
|
52
|
-
releasedSelection = null,
|
|
53
|
-
onPaint = noop,
|
|
54
|
-
onFrame = noop,
|
|
55
|
-
recordFrame = true,
|
|
56
|
-
}) {
|
|
57
|
-
const [scrollOffset, setScrollOffset] = React.useState(initialScroll);
|
|
58
|
-
const [measuredRowsVersion, setMeasuredRowsVersion] = React.useState(0);
|
|
59
|
-
const transcriptAnchorRef = React.useRef(null);
|
|
60
|
-
const transcriptAnchorDirtyRef = React.useRef(true);
|
|
61
|
-
const scrollTargetRef = React.useRef(initialScroll);
|
|
62
|
-
const scrollPositionRef = React.useRef(initialScroll);
|
|
63
|
-
const maxScrollRowsRef = React.useRef(0);
|
|
64
|
-
const transcriptGeomRef = React.useRef({});
|
|
65
|
-
const followingRef = React.useRef(false);
|
|
66
|
-
const dragRef = React.useRef({ active: false, rect: releasedSelection });
|
|
67
|
-
const transcriptViewportRef = React.useRef({ top: 0 });
|
|
68
|
-
const selectionLayoutRef = React.useRef(null);
|
|
69
|
-
const contentRef = React.useRef(null);
|
|
70
|
-
const tailRef = React.useRef(null);
|
|
71
|
-
const streamingTail = React.useMemo(() => ({
|
|
72
|
-
id: streamId,
|
|
73
|
-
kind: 'assistant',
|
|
74
|
-
text,
|
|
75
|
-
streaming: true,
|
|
76
|
-
}), [text]);
|
|
77
|
-
const transcriptItems = React.useMemo(() => [...HISTORY, streamingTail], [streamingTail]);
|
|
78
|
-
|
|
79
|
-
const preHookEntry = streamingMeasuredRowsById.get(STREAM_ID);
|
|
80
|
-
const preHookMeasuredRows = preHookEntry?.rows ?? null;
|
|
81
|
-
const preHookEstimateRows = preHookEntry?.estimateRows ?? null;
|
|
82
|
-
|
|
83
|
-
const {
|
|
84
|
-
transcriptWindow,
|
|
85
|
-
renderedTranscriptItems,
|
|
86
|
-
transcriptMeasureRef,
|
|
87
|
-
} = useTranscriptWindow({
|
|
88
|
-
items: HISTORY,
|
|
89
|
-
structureRevision: 1,
|
|
90
|
-
streamingTail,
|
|
91
|
-
themeEpoch: 0,
|
|
92
|
-
frameColumns: COLUMNS,
|
|
93
|
-
toolOutputExpanded: false,
|
|
94
|
-
transcriptContentHeight: VIEW_ROWS,
|
|
95
|
-
transcriptBottomSlackRows: 1,
|
|
96
|
-
transcriptGuardRows: 1,
|
|
97
|
-
floatingPanelRows: 0,
|
|
98
|
-
overlayHintRequested: false,
|
|
99
|
-
scrollOffset,
|
|
100
|
-
setScrollOffset,
|
|
101
|
-
transcriptAnchorRef,
|
|
102
|
-
transcriptAnchorDirtyRef,
|
|
103
|
-
scrollTargetRef,
|
|
104
|
-
scrollPositionRef,
|
|
105
|
-
maxScrollRowsRef,
|
|
106
|
-
transcriptGeomRef,
|
|
107
|
-
followingRef,
|
|
108
|
-
dragRef,
|
|
109
|
-
transcriptViewportRef,
|
|
110
|
-
selectionLayoutRef,
|
|
111
|
-
withSelectionClip: identity,
|
|
112
|
-
paintSelectionRect: onPaint,
|
|
113
|
-
stopSmoothScroll: noop,
|
|
114
|
-
measuredRowsVersion,
|
|
115
|
-
setMeasuredRowsVersion,
|
|
116
|
-
});
|
|
117
|
-
|
|
118
|
-
const growthProbe = globalThis.__mixdogTailGrowthProbe;
|
|
119
|
-
const tailHookRef = transcriptMeasureRef(streamingTail);
|
|
120
|
-
const combinedTailRef = React.useCallback((element) => {
|
|
121
|
-
tailHookRef?.(element);
|
|
122
|
-
tailRef.current = element;
|
|
123
|
-
}, [tailHookRef]);
|
|
124
|
-
|
|
125
|
-
React.useLayoutEffect(() => {
|
|
126
|
-
const geometry = transcriptGeomRef.current || {};
|
|
127
|
-
const prefix = geometry.prefixRows || [];
|
|
128
|
-
const physicalRows = measureElement(contentRef.current).height;
|
|
129
|
-
const tailYogaRows = measureElement(tailRef.current).height;
|
|
130
|
-
const renderScrollOffset = transcriptWindow.effectiveScrollOffset;
|
|
131
|
-
const visibleTopIndexed = transcriptWindow.totalRows - renderScrollOffset - VIEW_ROWS;
|
|
132
|
-
const visibleTopPhysical = physicalRows - renderScrollOffset - VIEW_ROWS;
|
|
133
|
-
const frame = {
|
|
134
|
-
commit: ++commit,
|
|
135
|
-
step,
|
|
136
|
-
char: text.at(-1) === '\n' ? '\\n' : (text.at(-1) || ''),
|
|
137
|
-
totalRows: transcriptWindow.totalRows,
|
|
138
|
-
renderScrollOffset,
|
|
139
|
-
visibleTopIndexed,
|
|
140
|
-
visibleTopPhysical,
|
|
141
|
-
physicalRows,
|
|
142
|
-
tailIndexedRows: prefix.length > 1 ? prefix.at(-1) - prefix.at(-2) : -1,
|
|
143
|
-
tailYogaRows,
|
|
144
|
-
mountedDelta: tailYogaRows - (prefix.length > 1 ? prefix.at(-1) - prefix.at(-2) : -1),
|
|
145
|
-
growthLive: growthProbe?.live ?? null,
|
|
146
|
-
growthBaseline: growthProbe?.baseline ?? null,
|
|
147
|
-
growthDelta: growthProbe?.delta ?? null,
|
|
148
|
-
suppressMeasured: geometry.suppressMeasuredRowHeights === true,
|
|
149
|
-
measuredRowsVersion,
|
|
150
|
-
preHookMeasuredRows,
|
|
151
|
-
preHookEstimateRows,
|
|
152
|
-
postHarvestMeasuredRows: streamingMeasuredRowsById.get(STREAM_ID)?.rows ?? null,
|
|
153
|
-
postHarvestEstimateRows: streamingMeasuredRowsById.get(STREAM_ID)?.estimateRows ?? null,
|
|
154
|
-
scrollTarget: scrollTargetRef.current,
|
|
155
|
-
following: followingRef.current,
|
|
156
|
-
anchor: transcriptAnchorRef.current?.id || '-',
|
|
157
|
-
};
|
|
158
|
-
if (recordFrame) frames.push(frame);
|
|
159
|
-
onFrame(frame);
|
|
160
|
-
}, [step, text, measuredRowsVersion, transcriptWindow.totalRows, transcriptWindow.effectiveScrollOffset,
|
|
161
|
-
transcriptAnchorRef, transcriptGeomRef]);
|
|
162
|
-
|
|
163
|
-
return (
|
|
164
|
-
<Box flexDirection="column" width={COLUMNS} height={VIEW_ROWS} overflow="hidden" justifyContent="flex-end">
|
|
165
|
-
<Box
|
|
166
|
-
ref={contentRef}
|
|
167
|
-
flexDirection="column"
|
|
168
|
-
width="100%"
|
|
169
|
-
flexShrink={0}
|
|
170
|
-
marginBottom={-transcriptWindow.effectiveScrollOffset}
|
|
171
|
-
>
|
|
172
|
-
{renderedTranscriptItems.map((item, index, all) => {
|
|
173
|
-
const hookRef = item.id === streamId ? combinedTailRef : transcriptMeasureRef(item);
|
|
174
|
-
return (
|
|
175
|
-
<Box key={item.id} ref={hookRef} flexDirection="column" flexShrink={0}>
|
|
176
|
-
<Item
|
|
177
|
-
item={item}
|
|
178
|
-
prevKind={index > 0 ? all[index - 1].kind : null}
|
|
179
|
-
columns={COLUMNS}
|
|
180
|
-
toolOutputExpanded={false}
|
|
181
|
-
/>
|
|
182
|
-
</Box>
|
|
183
|
-
);
|
|
184
|
-
})}
|
|
185
|
-
{transcriptWindow.bottomSpacerRows > 0
|
|
186
|
-
? <Box height={transcriptWindow.bottomSpacerRows} flexShrink={0} />
|
|
187
|
-
: null}
|
|
188
|
-
</Box>
|
|
189
|
-
</Box>
|
|
190
|
-
);
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
function fakeTty(columns, rows) {
|
|
194
|
-
const stream = new PassThrough();
|
|
195
|
-
stream.columns = columns;
|
|
196
|
-
stream.rows = rows;
|
|
197
|
-
stream.isTTY = true;
|
|
198
|
-
stream.getColorDepth = () => 1;
|
|
199
|
-
stream.hasColors = () => false;
|
|
200
|
-
stream.setRawMode = () => stream;
|
|
201
|
-
stream.on('data', () => {});
|
|
202
|
-
return stream;
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
async function settle(instance) {
|
|
206
|
-
await instance.waitUntilRenderFlush();
|
|
207
|
-
await new Promise((resolve) => setTimeout(resolve, 2));
|
|
208
|
-
await instance.waitUntilRenderFlush();
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
function assertStreamingMarkdownPartsCache() {
|
|
212
|
-
const key = 'streaming-parts-cache-coverage';
|
|
213
|
-
const longText = 'Settled paragraph.\n\n```js\nconst value = 1;';
|
|
214
|
-
const initial = resolveStreamingMarkdownParts(longText, key);
|
|
215
|
-
const repeated = resolveStreamingMarkdownParts(`${longText}\n\n`, key);
|
|
216
|
-
if (repeated !== initial) {
|
|
217
|
-
throw new Error('normalized-equivalent stream text did not reuse its resolved parts');
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
const regressed = resolveStreamingMarkdownParts('plain text', key);
|
|
221
|
-
if (regressed === initial || regressed.stablePrefix || regressed.unstableSuffix !== 'plain text') {
|
|
222
|
-
throw new Error('text regression served a stale streaming-markdown split');
|
|
223
|
-
}
|
|
224
|
-
|
|
225
|
-
const recomputed = resolveStreamingMarkdownParts(longText, key);
|
|
226
|
-
if (recomputed === initial) {
|
|
227
|
-
throw new Error('text change did not evict the prior streaming-markdown snapshot');
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
const resetSeed = recomputed;
|
|
231
|
-
resetStreamingMarkdownStablePrefix(key);
|
|
232
|
-
if (resolveStreamingMarkdownParts(longText, key) === resetSeed) {
|
|
233
|
-
throw new Error('streaming-markdown reset did not clear its resolved-parts snapshot');
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
assertStreamingMarkdownPartsCache();
|
|
238
|
-
resetAllStreamingMarkdownStablePrefixes();
|
|
239
|
-
streamingMeasuredRowsById.delete(STREAM_ID);
|
|
240
|
-
const stdout = fakeTty(COLUMNS, VIEW_ROWS);
|
|
241
|
-
const stderr = fakeTty(COLUMNS, VIEW_ROWS);
|
|
242
|
-
const stdin = fakeTty(COLUMNS, VIEW_ROWS);
|
|
243
|
-
const instance = render(<Harness text={SCRIPT.slice(0, 1)} step={1} />, {
|
|
244
|
-
stdout,
|
|
245
|
-
stderr,
|
|
246
|
-
stdin,
|
|
247
|
-
interactive: true,
|
|
248
|
-
patchConsole: false,
|
|
249
|
-
exitOnCtrlC: false,
|
|
250
|
-
maxFps: 1000,
|
|
251
|
-
});
|
|
252
|
-
await settle(instance);
|
|
253
|
-
for (let step = 2; step <= SCRIPT.length; step++) {
|
|
254
|
-
instance.rerender(<Harness text={SCRIPT.slice(0, step)} step={step} />);
|
|
255
|
-
await settle(instance);
|
|
256
|
-
}
|
|
257
|
-
instance.unmount();
|
|
258
|
-
await instance.waitUntilExit();
|
|
259
|
-
instance.cleanup();
|
|
260
|
-
|
|
261
|
-
const byStep = new Map();
|
|
262
|
-
for (const frame of frames) {
|
|
263
|
-
const list = byStep.get(frame.step) || [];
|
|
264
|
-
list.push(frame);
|
|
265
|
-
byStep.set(frame.step, list);
|
|
266
|
-
}
|
|
267
|
-
const dips = [];
|
|
268
|
-
let previousSettled = null;
|
|
269
|
-
for (const [step, list] of [...byStep.entries()].sort((a, b) => a[0] - b[0])) {
|
|
270
|
-
const first = list[0];
|
|
271
|
-
const settled = list.at(-1);
|
|
272
|
-
if (previousSettled
|
|
273
|
-
&& first.visibleTopPhysical !== previousSettled.visibleTopPhysical
|
|
274
|
-
&& settled.visibleTopPhysical === previousSettled.visibleTopPhysical) {
|
|
275
|
-
dips.push({ previous: previousSettled, transient: first, corrected: settled });
|
|
276
|
-
}
|
|
277
|
-
previousSettled = settled;
|
|
278
|
-
}
|
|
279
|
-
|
|
280
|
-
const print = (label, frame) => {
|
|
281
|
-
console.log(`${label} c${frame.commit} step=${frame.step} char=${JSON.stringify(frame.char)}`
|
|
282
|
-
+ ` totalRows=${frame.totalRows} renderScrollOffset=${frame.renderScrollOffset}`
|
|
283
|
-
+ ` visibleTop=${frame.visibleTopPhysical} indexedTop=${frame.visibleTopIndexed}`
|
|
284
|
-
+ ` physicalRows=${frame.physicalRows} tail(index/yoga)=${frame.tailIndexedRows}/${frame.tailYogaRows}`
|
|
285
|
-
+ ` mountedDelta=${frame.mountedDelta} helper(live/base/delta)=${frame.growthLive}/${frame.growthBaseline}/${frame.growthDelta}`
|
|
286
|
-
+ ` suppressMeasured=${frame.suppressMeasured ? 1 : 0}`
|
|
287
|
-
+ ` measuredVersion=${frame.measuredRowsVersion}`
|
|
288
|
-
+ ` baseline(measured/estimate)=${frame.preHookMeasuredRows}/${frame.preHookEstimateRows}`
|
|
289
|
-
+ ` harvest(measured/estimate)=${frame.postHarvestMeasuredRows}/${frame.postHarvestEstimateRows}`
|
|
290
|
-
+ ` target=${frame.scrollTarget} following=${frame.following ? 1 : 0} anchor=${frame.anchor}`);
|
|
291
|
-
};
|
|
292
|
-
|
|
293
|
-
console.log(`# scrolled-up fenced-script frame repro columns=${COLUMNS} viewRows=${VIEW_ROWS} initialScroll=${INITIAL_SCROLL}`);
|
|
294
|
-
console.log(`# append-only characters=${SCRIPT.length} commits=${frames.length} dip-snap events=${dips.length}`);
|
|
295
|
-
for (const event of dips.slice(0, 4)) {
|
|
296
|
-
print('before ', event.previous);
|
|
297
|
-
print('transient', event.transient);
|
|
298
|
-
print('harvest ', event.corrected);
|
|
299
|
-
console.log('');
|
|
300
|
-
}
|
|
301
|
-
const suppressValues = new Set(frames.map((frame) => frame.suppressMeasured));
|
|
302
|
-
console.log(`# suppressMeasuredRowHeights values during repro: ${[...suppressValues].map(Number).join(',')}`);
|
|
303
|
-
if (dips.length > 0) {
|
|
304
|
-
throw new Error(`expected no visible-top dip/snap while fenced script streams; observed ${dips.length}`);
|
|
305
|
-
}
|
|
306
|
-
if (suppressValues.size !== 1 || !suppressValues.has(true)) {
|
|
307
|
-
throw new Error('repro unexpectedly toggled suppressMeasuredRowHeights');
|
|
308
|
-
}
|
|
309
|
-
|
|
310
|
-
const SELECTION_STREAM_ID = 'released-selection-tail';
|
|
311
|
-
const releasedSelection = { mode: 'linear', x1: 0, y1: 3, x2: 4, y2: 3 };
|
|
312
|
-
const selectionHarvests = [];
|
|
313
|
-
const selectionFrames = [];
|
|
314
|
-
streamingMeasuredRowsById.delete(SELECTION_STREAM_ID);
|
|
315
|
-
const selectionInstance = render(
|
|
316
|
-
<Harness
|
|
317
|
-
text="seed"
|
|
318
|
-
step={0}
|
|
319
|
-
initialScroll={1}
|
|
320
|
-
streamId={SELECTION_STREAM_ID}
|
|
321
|
-
releasedSelection={releasedSelection}
|
|
322
|
-
recordFrame={false}
|
|
323
|
-
onPaint={(rect, options) => {
|
|
324
|
-
if (rect && options?.rememberText === false) selectionHarvests.push({ y1: rect.y1, y2: rect.y2 });
|
|
325
|
-
}}
|
|
326
|
-
onFrame={(frame) => selectionFrames.push(frame)}
|
|
327
|
-
/>,
|
|
328
|
-
{ stdout: fakeTty(COLUMNS, VIEW_ROWS), stderr: fakeTty(COLUMNS, VIEW_ROWS), stdin: fakeTty(COLUMNS, VIEW_ROWS), interactive: true, patchConsole: false, exitOnCtrlC: false, maxFps: 1000 },
|
|
329
|
-
);
|
|
330
|
-
await settle(selectionInstance);
|
|
331
|
-
const harvestsBeforeGrowth = selectionHarvests.length;
|
|
332
|
-
const framesBeforeGrowth = selectionFrames.length;
|
|
333
|
-
selectionInstance.rerender(
|
|
334
|
-
<Harness
|
|
335
|
-
text={'seed\none\nsecond\nthird'}
|
|
336
|
-
step={1}
|
|
337
|
-
initialScroll={1}
|
|
338
|
-
streamId={SELECTION_STREAM_ID}
|
|
339
|
-
releasedSelection={releasedSelection}
|
|
340
|
-
recordFrame={false}
|
|
341
|
-
onPaint={(rect, options) => {
|
|
342
|
-
if (rect && options?.rememberText === false) selectionHarvests.push({ y1: rect.y1, y2: rect.y2 });
|
|
343
|
-
}}
|
|
344
|
-
onFrame={(frame) => selectionFrames.push(frame)}
|
|
345
|
-
/>,
|
|
346
|
-
);
|
|
347
|
-
await settle(selectionInstance);
|
|
348
|
-
selectionInstance.unmount();
|
|
349
|
-
await selectionInstance.waitUntilExit();
|
|
350
|
-
selectionInstance.cleanup();
|
|
351
|
-
const growthFrames = selectionFrames.slice(framesBeforeGrowth);
|
|
352
|
-
if (!growthFrames.some((frame) => frame.scrollTarget > 1)) {
|
|
353
|
-
throw new Error('released-selection repro did not apply anchored growth at offset 1');
|
|
354
|
-
}
|
|
355
|
-
const growthHarvests = selectionHarvests.slice(harvestsBeforeGrowth);
|
|
356
|
-
const initialRenderOffset = selectionFrames[framesBeforeGrowth - 1]?.renderScrollOffset ?? 0;
|
|
357
|
-
const maxGrowthRenderOffset = Math.max(
|
|
358
|
-
initialRenderOffset,
|
|
359
|
-
...growthFrames.map((frame) => frame.renderScrollOffset),
|
|
360
|
-
);
|
|
361
|
-
const maxExpectedSelectionY = releasedSelection.y1 + maxGrowthRenderOffset - initialRenderOffset;
|
|
362
|
-
const doubleCountedHarvest = growthHarvests.find(
|
|
363
|
-
(harvest) => harvest.y1 > maxExpectedSelectionY || harvest.y2 > maxExpectedSelectionY,
|
|
364
|
-
);
|
|
365
|
-
const finalHarvest = growthHarvests.at(-1);
|
|
366
|
-
if (
|
|
367
|
-
doubleCountedHarvest
|
|
368
|
-
|| !finalHarvest
|
|
369
|
-
|| finalHarvest.y1 !== releasedSelection.y1
|
|
370
|
-
|| finalHarvest.y2 !== releasedSelection.y2
|
|
371
|
-
) {
|
|
372
|
-
throw new Error(`released selection harvested wrong row during anchored growth: ${JSON.stringify({
|
|
373
|
-
doubleCountedHarvest,
|
|
374
|
-
finalHarvest,
|
|
375
|
-
expectedFinal: releasedSelection,
|
|
376
|
-
maxExpectedSelectionY,
|
|
377
|
-
})}`);
|
|
378
|
-
}
|
|
379
|
-
console.log('tui-transcript-jitter-harness: ok');
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|