@1agh/maude 1.0.11 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/apps/studio/acp/bridge.ts +18 -13
- package/apps/studio/acp/transcript-io.ts +394 -0
- package/apps/studio/acp/transcript.ts +103 -38
- package/apps/studio/api.ts +139 -26
- package/apps/studio/bin/_import-figma.mjs +57 -11
- package/apps/studio/bin/_seed-fixture.mjs +163 -0
- package/apps/studio/canvas-imports.ts +89 -0
- package/apps/studio/client/app.jsx +257 -7
- package/apps/studio/client/export-center.jsx +15 -7
- package/apps/studio/client/panels/SyncPanel.jsx +125 -4
- package/apps/studio/client/report-bug.jsx +19 -1
- package/apps/studio/client/styles/3-shell-maude.css +34 -0
- package/apps/studio/client/styles/4-components.css +26 -0
- package/apps/studio/collab/persistence.ts +132 -16
- package/apps/studio/collab/registry.ts +10 -18
- package/apps/studio/debug-bundle.ts +13 -0
- package/apps/studio/dist/client.bundle.js +1128 -1128
- package/apps/studio/dist/styles.css +1 -1
- package/apps/studio/export-dialog.tsx +54 -0
- package/apps/studio/exporters/degraded.ts +19 -3
- package/apps/studio/exporters/ghostscript.ts +194 -0
- package/apps/studio/exporters/pdf-fonts.ts +261 -0
- package/apps/studio/exporters/pdf.ts +152 -3
- package/apps/studio/exporters/remote.ts +36 -1
- package/apps/studio/fs-watch.ts +45 -1
- package/apps/studio/http.ts +7 -1
- package/apps/studio/mem.ts +45 -9
- package/apps/studio/server.ts +11 -4
- package/apps/studio/sync/agent.ts +136 -29
- package/apps/studio/sync/asset-push.ts +1 -47
- package/apps/studio/sync/codec.ts +122 -31
- package/apps/studio/sync/cold-start-apply.ts +7 -0
- package/apps/studio/sync/cold-start.ts +118 -22
- package/apps/studio/sync/comment-identity.ts +68 -0
- package/apps/studio/sync/connection-state.ts +15 -1
- package/apps/studio/sync/file-ledger.ts +117 -0
- package/apps/studio/sync/file-plane.ts +623 -27
- package/apps/studio/sync/index.ts +711 -20
- package/apps/studio/sync/journal-client.ts +13 -1
- package/apps/studio/sync/migrate-seed.ts +40 -3
- package/apps/studio/sync/presentation.ts +26 -3
- package/apps/studio/sync/retry-after.ts +169 -0
- package/apps/studio/sync/seed-progress.ts +218 -0
- package/apps/studio/sync/status.ts +122 -5
- package/apps/studio/sync/transport-error.ts +111 -0
- package/apps/studio/whats-new.json +72 -0
- package/cli/bin/maude.mjs +2 -0
- package/cli/commands/codex.mjs +191 -0
- package/cli/commands/harness.mjs +1051 -0
- package/cli/commands/help.mjs +13 -0
- package/cli/lib/design-link.mjs +190 -2
- package/cli/lib/harness/capabilities.mjs +302 -0
- package/cli/lib/harness/codex-runtime.mjs +889 -0
- package/cli/lib/harness/compatibility.mjs +27 -0
- package/cli/lib/harness/discover-claude.mjs +1393 -0
- package/cli/lib/harness/managed-state.mjs +1296 -0
- package/cli/lib/harness/model.mjs +86 -0
- package/cli/lib/harness/secrets.mjs +390 -0
- package/cli/lib/harness/targets/codex.mjs +1141 -0
- package/cli/lib/harness/targets/opencode.mjs +807 -0
- package/cli/lib/harness/transaction.mjs +1099 -0
- package/cli/lib/hubs-config.mjs +35 -8
- package/cli/templates/harness/opencode/maude-projector.ts +58 -0
- package/docs/harness-capability-matrix.md +125 -0
- package/docs/harness-environment-projection.md +95 -0
- package/package.json +32 -9
- package/plugins/flow/.claude-plugin/config.schema.json +8 -0
- package/apps/studio/.ai/cache/_stats.json +0 -7
- package/apps/studio/bin/_agent-browser-safe.test.mjs +0 -165
- package/apps/studio/bin/_curl-local.test.mjs +0 -280
- package/apps/studio/bin/_pw-launch.test.mjs +0 -90
- package/apps/studio/bin/_smart-frames.test.mjs +0 -195
- package/apps/studio/bin/_transcribe.test.mjs +0 -80
- package/apps/studio/bun.lock +0 -928
- package/apps/studio/draw/test/animate.test.ts +0 -172
- package/apps/studio/draw/test/brush.test.ts +0 -213
- package/apps/studio/draw/test/composition.test.ts +0 -141
- package/apps/studio/draw/test/geometry.test.ts +0 -199
- package/apps/studio/draw/test/gradient.test.ts +0 -167
- package/apps/studio/draw/test/layout.test.ts +0 -120
- package/apps/studio/draw/test/morph.test.ts +0 -107
- package/apps/studio/draw/test/optimize.test.ts +0 -40
- package/apps/studio/draw/test/palette.test.ts +0 -123
- package/apps/studio/draw/test/primitives.test.ts +0 -129
- package/apps/studio/draw/test/serialize-animate.test.ts +0 -142
- package/apps/studio/draw/test/serialize.test.ts +0 -105
- package/apps/studio/figma/assets.test.ts +0 -464
- package/apps/studio/figma/client.test.ts +0 -395
- package/apps/studio/figma/codegen-client.test.ts +0 -276
- package/apps/studio/figma/codegen-fonts.test.ts +0 -103
- package/apps/studio/figma/codegen-values.test.ts +0 -179
- package/apps/studio/figma/comments-to-strokes.test.ts +0 -194
- package/apps/studio/figma/fig-decode.test.ts +0 -788
- package/apps/studio/figma/fig-differential.test.ts +0 -182
- package/apps/studio/figma/fig-translator.test.ts +0 -192
- package/apps/studio/figma/fig-vector.test.ts +0 -113
- package/apps/studio/figma/from-codegen.test.ts +0 -408
- package/apps/studio/figma/sanitize.test.ts +0 -325
- package/apps/studio/figma/tailwind-map.test.ts +0 -142
- package/apps/studio/figma/to-artboard.test.ts +0 -808
- package/apps/studio/figma/to-render.test.ts +0 -180
- package/apps/studio/figma/to-strokes-roundtrip.test.ts +0 -152
- package/apps/studio/figma/to-strokes.test.ts +0 -705
- package/apps/studio/figma/to-tokens.test.ts +0 -321
- package/apps/studio/figma/url.test.ts +0 -167
- package/apps/studio/footage/schema.test.ts +0 -287
- package/apps/studio/generation/adapters/groq.test.ts +0 -80
- package/apps/studio/generation/audio-library.test.ts +0 -95
- package/apps/studio/generation/captions.test.ts +0 -78
- package/apps/studio/generation/elevenlabs.test.ts +0 -223
- package/apps/studio/generation/gemini.test.ts +0 -350
- package/apps/studio/generation/jobs.test.ts +0 -128
- package/apps/studio/generation/keys.test.ts +0 -75
- package/apps/studio/generation/prefs.test.ts +0 -95
- package/apps/studio/generation/types.test.ts +0 -123
- package/apps/studio/generation/whisper-models.test.ts +0 -179
- package/apps/studio/test/_helpers.ts +0 -108
- package/apps/studio/test/acp-activity-endpoint.test.ts +0 -183
- package/apps/studio/test/acp-activity.test.ts +0 -154
- package/apps/studio/test/acp-ai-activity.test.ts +0 -182
- package/apps/studio/test/acp-attachment-serve.test.ts +0 -74
- package/apps/studio/test/acp-bootstrap-brief.test.ts +0 -178
- package/apps/studio/test/acp-branch-guard.test.ts +0 -123
- package/apps/studio/test/acp-bridge-lifetime.test.ts +0 -475
- package/apps/studio/test/acp-bridge.test.ts +0 -545
- package/apps/studio/test/acp-capabilities.test.ts +0 -123
- package/apps/studio/test/acp-caps-bridge.test.ts +0 -279
- package/apps/studio/test/acp-commands.test.ts +0 -119
- package/apps/studio/test/acp-elicitation-bridge.test.ts +0 -480
- package/apps/studio/test/acp-elicitation.test.ts +0 -251
- package/apps/studio/test/acp-env.test.ts +0 -95
- package/apps/studio/test/acp-mode-banner.test.ts +0 -45
- package/apps/studio/test/acp-origin-gate.test.ts +0 -160
- package/apps/studio/test/acp-permission-prompt.test.ts +0 -251
- package/apps/studio/test/acp-permission.test.ts +0 -278
- package/apps/studio/test/acp-plugin-bootstrap.test.ts +0 -89
- package/apps/studio/test/acp-session-allowed-tools.test.ts +0 -235
- package/apps/studio/test/acp-session-plugins.test.ts +0 -209
- package/apps/studio/test/acp-toolgroup.test.ts +0 -76
- package/apps/studio/test/acp-transcript-view.test.ts +0 -71
- package/apps/studio/test/acp-transcript.test.ts +0 -238
- package/apps/studio/test/acp-usage-bridge.test.ts +0 -141
- package/apps/studio/test/acp-usage.test.ts +0 -143
- package/apps/studio/test/acp-write-gate.test.ts +0 -323
- package/apps/studio/test/acp-write-scope.test.ts +0 -533
- package/apps/studio/test/active-state.test.ts +0 -186
- package/apps/studio/test/activity.test.ts +0 -189
- package/apps/studio/test/ai-activity.test.ts +0 -113
- package/apps/studio/test/annotate-write.test.ts +0 -1074
- package/apps/studio/test/annotation-strokes-command.test.ts +0 -166
- package/apps/studio/test/annotations-align.test.ts +0 -88
- package/apps/studio/test/annotations-api.test.ts +0 -145
- package/apps/studio/test/annotations-bindings.test.ts +0 -262
- package/apps/studio/test/annotations-draw-modifiers.test.ts +0 -206
- package/apps/studio/test/annotations-groups.test.ts +0 -231
- package/apps/studio/test/annotations-layer.test.ts +0 -1011
- package/apps/studio/test/annotations-roundtrip.test.ts +0 -663
- package/apps/studio/test/annotations-snap.test.ts +0 -135
- package/apps/studio/test/annotations-text-format.test.ts +0 -396
- package/apps/studio/test/artboard-activity-overlay.test.tsx +0 -56
- package/apps/studio/test/artboard-guides-overlay.test.tsx +0 -152
- package/apps/studio/test/artboard-hug-commit.test.ts +0 -36
- package/apps/studio/test/artboard-kinds.test.tsx +0 -83
- package/apps/studio/test/artboard-selection-attrs.test.ts +0 -69
- package/apps/studio/test/asset-api.test.ts +0 -149
- package/apps/studio/test/assets-s3.test.ts +0 -249
- package/apps/studio/test/binary-smoke.test.ts +0 -47
- package/apps/studio/test/boot-self-heal.test.ts +0 -87
- package/apps/studio/test/browse-posture.test.tsx +0 -107
- package/apps/studio/test/bundle-smoke.test.ts +0 -46
- package/apps/studio/test/camera-reveal.test.tsx +0 -173
- package/apps/studio/test/canvas-artifacts.test.ts +0 -125
- package/apps/studio/test/canvas-build-sandbox.test.ts +0 -69
- package/apps/studio/test/canvas-build.test.ts +0 -141
- package/apps/studio/test/canvas-create-api.test.ts +0 -676
- package/apps/studio/test/canvas-cursors.test.ts +0 -164
- package/apps/studio/test/canvas-edit.test.ts +0 -470
- package/apps/studio/test/canvas-freshness-deps.test.ts +0 -64
- package/apps/studio/test/canvas-header.test.ts +0 -127
- package/apps/studio/test/canvas-hide-chrome.test.ts +0 -88
- package/apps/studio/test/canvas-hmr-runtime.test.tsx +0 -114
- package/apps/studio/test/canvas-lib-inline.test.ts +0 -146
- package/apps/studio/test/canvas-lib-motion.test.ts +0 -131
- package/apps/studio/test/canvas-lib-resolver.test.ts +0 -111
- package/apps/studio/test/canvas-list-watch.test.ts +0 -388
- package/apps/studio/test/canvas-media-drop.test.ts +0 -187
- package/apps/studio/test/canvas-meta-api.test.ts +0 -707
- package/apps/studio/test/canvas-move-api.test.ts +0 -587
- package/apps/studio/test/canvas-origin-gate.test.ts +0 -417
- package/apps/studio/test/canvas-pipeline.test.ts +0 -180
- package/apps/studio/test/canvas-rects.test.ts +0 -198
- package/apps/studio/test/canvas-reorder.test.ts +0 -211
- package/apps/studio/test/canvas-route.test.ts +0 -179
- package/apps/studio/test/canvas-shell-base.test.ts +0 -107
- package/apps/studio/test/canvas-shell-build-error.test.ts +0 -52
- package/apps/studio/test/canvas-url.test.ts +0 -138
- package/apps/studio/test/canvas-wheel-delta.test.ts +0 -42
- package/apps/studio/test/canvas-zoom-floor.test.ts +0 -73
- package/apps/studio/test/capture-core.test.ts +0 -32
- package/apps/studio/test/capture-determinism-shape.test.ts +0 -135
- package/apps/studio/test/chat-attachments.test.ts +0 -117
- package/apps/studio/test/chat-context.test.ts +0 -129
- package/apps/studio/test/chat-markdown.test.tsx +0 -58
- package/apps/studio/test/clip-addressing.test.ts +0 -738
- package/apps/studio/test/clip-ops.test.ts +0 -922
- package/apps/studio/test/cloud-build.test.ts +0 -95
- package/apps/studio/test/cloud-connect-note.test.ts +0 -135
- package/apps/studio/test/cloud-endpoints.test.ts +0 -590
- package/apps/studio/test/cloud-history-hardening.test.ts +0 -165
- package/apps/studio/test/cloud-history-posture.test.ts +0 -230
- package/apps/studio/test/cloud-managed-save-surfaces.test.ts +0 -90
- package/apps/studio/test/cloud-renew.test.ts +0 -205
- package/apps/studio/test/cloud-session-role.test.ts +0 -161
- package/apps/studio/test/cloud-shell-surfaces.test.ts +0 -170
- package/apps/studio/test/cold-start-apply.test.ts +0 -303
- package/apps/studio/test/collab-annotations-bridge.test.ts +0 -55
- package/apps/studio/test/collab-awareness-bridge.test.ts +0 -223
- package/apps/studio/test/collab-bridge.test.ts +0 -79
- package/apps/studio/test/collab-loopback.test.ts +0 -63
- package/apps/studio/test/collab-origin-gate.test.ts +0 -323
- package/apps/studio/test/collab-protocol.test.ts +0 -146
- package/apps/studio/test/collab-readonly-gate.test.ts +0 -194
- package/apps/studio/test/collab-reseed-guard.test.ts +0 -78
- package/apps/studio/test/collab-room.test.ts +0 -188
- package/apps/studio/test/collab-session-survival.test.tsx +0 -176
- package/apps/studio/test/collab-stress.test.ts +0 -129
- package/apps/studio/test/comment-mount.test.ts +0 -97
- package/apps/studio/test/comment-relay-origin-gate.test.ts +0 -117
- package/apps/studio/test/comments-api.test.ts +0 -277
- package/apps/studio/test/comments-fs-rebroadcast.test.ts +0 -155
- package/apps/studio/test/comments-overlay.test.ts +0 -117
- package/apps/studio/test/compile-entry.test.ts +0 -133
- package/apps/studio/test/component-map.test.ts +0 -48
- package/apps/studio/test/config-projection.test.ts +0 -104
- package/apps/studio/test/config-reload.test.ts +0 -230
- package/apps/studio/test/config-version.test.ts +0 -88
- package/apps/studio/test/context-resolve-tokens.test.ts +0 -97
- package/apps/studio/test/convert-to-absolute.test.ts +0 -333
- package/apps/studio/test/credential-grammar.test.ts +0 -107
- package/apps/studio/test/csp-canvas-shell.test.ts +0 -62
- package/apps/studio/test/csrf-write-guard.test.ts +0 -141
- package/apps/studio/test/debug-bundle.test.ts +0 -105
- package/apps/studio/test/design-setup-readiness.test.ts +0 -155
- package/apps/studio/test/detach-component.test.ts +0 -94
- package/apps/studio/test/dns-rebinding-guard.test.ts +0 -101
- package/apps/studio/test/dom-selection.test.ts +0 -198
- package/apps/studio/test/dynamic-text-edit.test.ts +0 -162
- package/apps/studio/test/edit-css-occurrence.test.ts +0 -81
- package/apps/studio/test/edit-persistence.test.ts +0 -91
- package/apps/studio/test/edit-scope-api.test.ts +0 -119
- package/apps/studio/test/edit-source-command.test.ts +0 -142
- package/apps/studio/test/edit-suppress.test.ts +0 -170
- package/apps/studio/test/editing-presence.test.ts +0 -103
- package/apps/studio/test/element-resize.test.ts +0 -136
- package/apps/studio/test/element-structural-api.test.ts +0 -434
- package/apps/studio/test/element-structural-edit.test.ts +0 -750
- package/apps/studio/test/ensure-browser.test.ts +0 -92
- package/apps/studio/test/equal-spacing-detector.test.ts +0 -257
- package/apps/studio/test/export-assemble.test.ts +0 -53
- package/apps/studio/test/export-browser-lane.test.ts +0 -126
- package/apps/studio/test/export-capture-fidelity.test.ts +0 -146
- package/apps/studio/test/export-capture-hygiene.test.ts +0 -675
- package/apps/studio/test/export-center.test.tsx +0 -287
- package/apps/studio/test/export-e2e-lanes.test.ts +0 -857
- package/apps/studio/test/export-format-scope-coherence.test.ts +0 -89
- package/apps/studio/test/export-lane.test.ts +0 -245
- package/apps/studio/test/export-shim-multi-capture.test.ts +0 -83
- package/apps/studio/test/exporters/canva.test.ts +0 -63
- package/apps/studio/test/exporters/degraded-propagation.test.ts +0 -123
- package/apps/studio/test/exporters/endpoint.test.ts +0 -121
- package/apps/studio/test/exporters/history.test.ts +0 -107
- package/apps/studio/test/exporters/html.test.ts +0 -26
- package/apps/studio/test/exporters/jobs.test.ts +0 -342
- package/apps/studio/test/exporters/pdf.test.ts +0 -85
- package/apps/studio/test/exporters/png.test.ts +0 -103
- package/apps/studio/test/exporters/pptx-deck.test.ts +0 -112
- package/apps/studio/test/exporters/pptx.test.ts +0 -31
- package/apps/studio/test/exporters/pw-launch.test.ts +0 -49
- package/apps/studio/test/exporters/runtime.test.ts +0 -59
- package/apps/studio/test/exporters/scope.test.ts +0 -292
- package/apps/studio/test/exporters/svg.test.ts +0 -29
- package/apps/studio/test/exporters/unsupported-media.test.ts +0 -123
- package/apps/studio/test/exporters/zip.test.ts +0 -104
- package/apps/studio/test/fetch-asset-gate.test.ts +0 -189
- package/apps/studio/test/figjam-v3-model.test.ts +0 -342
- package/apps/studio/test/figma-explode.test.ts +0 -438
- package/apps/studio/test/figma-provenance.test.ts +0 -108
- package/apps/studio/test/figma-routes.test.ts +0 -294
- package/apps/studio/test/file-lock.test.ts +0 -84
- package/apps/studio/test/fixtures/backgrounding-claude-auth.sh +0 -12
- package/apps/studio/test/fixtures/fake-claude-auth.mjs +0 -23
- package/apps/studio/test/fixtures/figjam-v3-groups-bindings.svg +0 -1
- package/apps/studio/test/fixtures/mock-acp-agent-caps.mjs +0 -158
- package/apps/studio/test/fixtures/mock-acp-agent-commands.mjs +0 -44
- package/apps/studio/test/fixtures/mock-acp-agent-elicit-flood.mjs +0 -46
- package/apps/studio/test/fixtures/mock-acp-agent-elicit-url.mjs +0 -42
- package/apps/studio/test/fixtures/mock-acp-agent-elicit.mjs +0 -63
- package/apps/studio/test/fixtures/mock-acp-agent-permission-flood.mjs +0 -51
- package/apps/studio/test/fixtures/mock-acp-agent-permission.mjs +0 -50
- package/apps/studio/test/fixtures/mock-acp-agent-slow.mjs +0 -45
- package/apps/studio/test/fixtures/mock-acp-agent-usage.mjs +0 -56
- package/apps/studio/test/fixtures/mock-acp-agent-wedged.mjs +0 -37
- package/apps/studio/test/fixtures/mock-acp-agent-write.mjs +0 -118
- package/apps/studio/test/fixtures/mock-acp-agent.mjs +0 -69
- package/apps/studio/test/fixtures/noisy-claude-auth.mjs +0 -27
- package/apps/studio/test/fixtures/perf-canvas.mjs +0 -201
- package/apps/studio/test/fixtures/phase-20-annotations.svg +0 -1
- package/apps/studio/test/fixtures/phase-21-annotations.svg +0 -1
- package/apps/studio/test/fixtures/tiny-subset.woff2 +0 -0
- package/apps/studio/test/fixtures/video-comp-fixture.tsx +0 -82
- package/apps/studio/test/fixtures/wedged-claude-auth.sh +0 -11
- package/apps/studio/test/footage-store.test.ts +0 -100
- package/apps/studio/test/fs-mkdir-api.test.ts +0 -248
- package/apps/studio/test/fs-watch.test.ts +0 -41
- package/apps/studio/test/gemma-models.test.ts +0 -245
- package/apps/studio/test/generate-route.test.ts +0 -106
- package/apps/studio/test/git-api.test.ts +0 -0
- package/apps/studio/test/git-branches.test.ts +0 -341
- package/apps/studio/test/git-cloud-posture.test.ts +0 -59
- package/apps/studio/test/git-grouping.test.ts +0 -106
- package/apps/studio/test/git-lifecycle.test.ts +0 -100
- package/apps/studio/test/git-log-format.test.ts +0 -95
- package/apps/studio/test/git-safe-rel.test.ts +0 -132
- package/apps/studio/test/git-system-engine.test.ts +0 -135
- package/apps/studio/test/git-watch.test.ts +0 -97
- package/apps/studio/test/github-api.test.ts +0 -577
- package/apps/studio/test/grid-track-handles.test.ts +0 -160
- package/apps/studio/test/handoff-static-frames.test.ts +0 -215
- package/apps/studio/test/handoff.test.ts +0 -329
- package/apps/studio/test/history-rollback.test.ts +0 -88
- package/apps/studio/test/hmr-broadcast.test.ts +0 -236
- package/apps/studio/test/hmr-classify.test.ts +0 -87
- package/apps/studio/test/hub-link.test.ts +0 -80
- package/apps/studio/test/identity-cache.test.ts +0 -83
- package/apps/studio/test/import-asset-browser.test.ts +0 -64
- package/apps/studio/test/import-asset-route.test.ts +0 -71
- package/apps/studio/test/import-asset.test.ts +0 -427
- package/apps/studio/test/import-brand-browser.test.ts +0 -88
- package/apps/studio/test/import-brand-route.test.ts +0 -120
- package/apps/studio/test/import-brand.test.ts +0 -206
- package/apps/studio/test/import-figma.test.ts +0 -667
- package/apps/studio/test/import-tokens.test.ts +0 -722
- package/apps/studio/test/index-data-canvas-ds.test.ts +0 -97
- package/apps/studio/test/input-router.test.ts +0 -757
- package/apps/studio/test/inspect-script-syntax.test.ts +0 -53
- package/apps/studio/test/inspect-selections.test.ts +0 -219
- package/apps/studio/test/knob-props-authored.test.ts +0 -87
- package/apps/studio/test/layers-synthetic-groups.test.ts +0 -96
- package/apps/studio/test/locator.test.ts +0 -214
- package/apps/studio/test/marquee-overlay.test.ts +0 -94
- package/apps/studio/test/media-commit-chain.test.ts +0 -210
- package/apps/studio/test/mode-toggle.test.tsx +0 -226
- package/apps/studio/test/motion-sample.test.ts +0 -35
- package/apps/studio/test/move-artboards-command.test.ts +0 -108
- package/apps/studio/test/participants-chrome.test.ts +0 -65
- package/apps/studio/test/paths.test.ts +0 -88
- package/apps/studio/test/pdf-print-boxes.test.ts +0 -359
- package/apps/studio/test/peer-selection-follows-camera.test.tsx +0 -131
- package/apps/studio/test/perf-harness.ts +0 -193
- package/apps/studio/test/phase-3.6-smoke.test.ts +0 -79
- package/apps/studio/test/photo-bg-remove-validation.test.ts +0 -71
- package/apps/studio/test/photo-canvas-bundle.test.ts +0 -79
- package/apps/studio/test/photo-edit-api.test.ts +0 -201
- package/apps/studio/test/photo-filters.test.ts +0 -149
- package/apps/studio/test/photo-pipeline.test.ts +0 -106
- package/apps/studio/test/photo-taxonomy.test.ts +0 -96
- package/apps/studio/test/print-marks.test.ts +0 -113
- package/apps/studio/test/print-units.test.ts +0 -173
- package/apps/studio/test/read-annotations.test.ts +0 -727
- package/apps/studio/test/read-only-gate.test.ts +0 -188
- package/apps/studio/test/read-only-role.test.ts +0 -95
- package/apps/studio/test/readiness.test.ts +0 -337
- package/apps/studio/test/remote-ahead-behind-cache.test.ts +0 -89
- package/apps/studio/test/reorder-api.test.ts +0 -210
- package/apps/studio/test/repo-concurrency.test.ts +0 -146
- package/apps/studio/test/repo-lock.test.ts +0 -350
- package/apps/studio/test/report-proxy.test.ts +0 -125
- package/apps/studio/test/ripple.test.ts +0 -197
- package/apps/studio/test/runtime-bundle-error-mapping.test.ts +0 -43
- package/apps/studio/test/runtime-bundle.test.ts +0 -69
- package/apps/studio/test/sanitize-annotation-svg.test.ts +0 -238
- package/apps/studio/test/scaffold-design.test.ts +0 -122
- package/apps/studio/test/server-lifecycle.test.ts +0 -38
- package/apps/studio/test/session-runtime-state.test.ts +0 -226
- package/apps/studio/test/session-scope.test.ts +0 -100
- package/apps/studio/test/shared-doc-cell-pairing.test.ts +0 -642
- package/apps/studio/test/shared-doc-convergence.test.ts +0 -265
- package/apps/studio/test/shared-doc-foundation.test.ts +0 -63
- package/apps/studio/test/shared-doc-migrate.test.ts +0 -369
- package/apps/studio/test/shared-doc-projection.test.ts +0 -238
- package/apps/studio/test/shell-importmap.test.ts +0 -56
- package/apps/studio/test/sizing-mode.test.ts +0 -102
- package/apps/studio/test/slash-commands.test.ts +0 -117
- package/apps/studio/test/snap-distance-pill.test.ts +0 -68
- package/apps/studio/test/spacing-handles.test.ts +0 -138
- package/apps/studio/test/specimen-select.test.ts +0 -88
- package/apps/studio/test/sync-agent.test.ts +0 -660
- package/apps/studio/test/sync-annotations-cold-start.test.ts +0 -302
- package/apps/studio/test/sync-asset-push.test.ts +0 -931
- package/apps/studio/test/sync-atomic-write.test.ts +0 -62
- package/apps/studio/test/sync-attach-incremental.test.ts +0 -527
- package/apps/studio/test/sync-autocommit.test.ts +0 -537
- package/apps/studio/test/sync-canvas-path.test.ts +0 -200
- package/apps/studio/test/sync-cell-write-nudge.test.ts +0 -346
- package/apps/studio/test/sync-codec.test.ts +0 -230
- package/apps/studio/test/sync-cold-seed-dedup.test.ts +0 -187
- package/apps/studio/test/sync-cold-start.test.ts +0 -304
- package/apps/studio/test/sync-connect-honesty.test.ts +0 -114
- package/apps/studio/test/sync-connection-state.test.ts +0 -337
- package/apps/studio/test/sync-ctl-channel.test.ts +0 -508
- package/apps/studio/test/sync-decide-file.test.ts +0 -420
- package/apps/studio/test/sync-doc-name.test.ts +0 -281
- package/apps/studio/test/sync-echo-guard.test.ts +0 -96
- package/apps/studio/test/sync-file-ledger.test.ts +0 -334
- package/apps/studio/test/sync-file-membership.test.ts +0 -347
- package/apps/studio/test/sync-file-plane.test.ts +0 -976
- package/apps/studio/test/sync-file-pull.test.ts +0 -333
- package/apps/studio/test/sync-fresh-link-parity.test.ts +0 -267
- package/apps/studio/test/sync-fs-mirror.test.ts +0 -181
- package/apps/studio/test/sync-hardening.test.ts +0 -586
- package/apps/studio/test/sync-hub-listing.test.ts +0 -46
- package/apps/studio/test/sync-hubs-config.test.ts +0 -133
- package/apps/studio/test/sync-incident-replay.test.ts +0 -211
- package/apps/studio/test/sync-journal.test.ts +0 -176
- package/apps/studio/test/sync-meta-codec.test.ts +0 -199
- package/apps/studio/test/sync-migrate-flat-fallback.test.ts +0 -98
- package/apps/studio/test/sync-move-retirement.test.ts +0 -231
- package/apps/studio/test/sync-panel-surface.test.ts +0 -153
- package/apps/studio/test/sync-path-pull.test.ts +0 -531
- package/apps/studio/test/sync-presentation.test.ts +0 -262
- package/apps/studio/test/sync-pull-budget.test.ts +0 -169
- package/apps/studio/test/sync-remote-docs.test.ts +0 -333
- package/apps/studio/test/sync-resync-routes.test.ts +0 -168
- package/apps/studio/test/sync-runtime.test.ts +0 -1675
- package/apps/studio/test/sync-seed-defers-to-hub.test.ts +0 -83
- package/apps/studio/test/sync-settings-routes.test.ts +0 -195
- package/apps/studio/test/sync-settings.test.ts +0 -151
- package/apps/studio/test/sync-status.test.ts +0 -261
- package/apps/studio/test/sync-supervisor.test.ts +0 -262
- package/apps/studio/test/sync-tombstone-apply.test.ts +0 -111
- package/apps/studio/test/sync-trash.test.ts +0 -132
- package/apps/studio/test/sync-two-peer-discovery.test.ts +0 -343
- package/apps/studio/test/sync-untrusted.test.ts +0 -103
- package/apps/studio/test/system-endpoint.test.ts +0 -144
- package/apps/studio/test/text-editability-stamp.test.ts +0 -131
- package/apps/studio/test/timeline-comp-target.test.ts +0 -139
- package/apps/studio/test/timeline-media-cache.test.ts +0 -41
- package/apps/studio/test/timeline-parse.test.ts +0 -184
- package/apps/studio/test/timeline-scale.test.ts +0 -65
- package/apps/studio/test/timeline-snap.test.ts +0 -85
- package/apps/studio/test/tool-palette-insert-anchor.test.ts +0 -86
- package/apps/studio/test/tool-palette.test.tsx +0 -55
- package/apps/studio/test/tour-overlay.test.tsx +0 -90
- package/apps/studio/test/trusted-request-host.test.ts +0 -66
- package/apps/studio/test/undo-sequence-byte-compare.test.ts +0 -211
- package/apps/studio/test/undo-stack.test.ts +0 -244
- package/apps/studio/test/use-agent-presence.test.tsx +0 -117
- package/apps/studio/test/use-annotation-resize.test.ts +0 -402
- package/apps/studio/test/use-annotation-selection.test.tsx +0 -77
- package/apps/studio/test/use-artboard-drag.test.ts +0 -324
- package/apps/studio/test/use-canvas-activity.test.tsx +0 -206
- package/apps/studio/test/use-collab.test.ts +0 -0
- package/apps/studio/test/use-cursor-modifiers.test.ts +0 -59
- package/apps/studio/test/use-keyboard-discipline.test.ts +0 -27
- package/apps/studio/test/use-selection-set.test.tsx +0 -166
- package/apps/studio/test/use-snap-guides.test.ts +0 -271
- package/apps/studio/test/use-tool-mode.test.tsx +0 -186
- package/apps/studio/test/use-undo-stack.test.tsx +0 -223
- package/apps/studio/test/video-asset.test.ts +0 -163
- package/apps/studio/test/video-comp-fixture.test.ts +0 -50
- package/apps/studio/test/video-comp.test.ts +0 -270
- package/apps/studio/test/video-encode-lib.test.ts +0 -63
- package/apps/studio/test/video-render-bridge.test.ts +0 -171
- package/apps/studio/test/whats-new.test.ts +0 -113
- package/apps/studio/test/whisper-setup.test.ts +0 -97
- package/apps/studio/test/workspace-containment.test.ts +0 -382
- package/apps/studio/test/workspace-signin.test.ts +0 -292
- package/apps/studio/test/ws-handshake.test.ts +0 -33
- package/cli/commands/cache.test.mjs +0 -166
- package/cli/commands/design-link.test.mjs +0 -419
- package/cli/commands/design.test.mjs +0 -240
- package/cli/commands/doctor.test.mjs +0 -237
- package/cli/commands/hub-workspace.test.mjs +0 -275
- package/cli/commands/hub.test.mjs +0 -225
- package/cli/commands/kg.test.mjs +0 -142
- package/cli/commands/preflight.test.mjs +0 -46
- package/cli/lib/argv.test.mjs +0 -46
- package/cli/lib/cache.test.mjs +0 -303
- package/cli/lib/cell-plan.test.mjs +0 -225
- package/cli/lib/config-lint.test.mjs +0 -117
- package/cli/lib/ddr-to-kgai.test.mjs +0 -118
- package/cli/lib/design-ownership.test.mjs +0 -329
- package/cli/lib/fetch-asset.test.mjs +0 -213
- package/cli/lib/figma-codegen-reachability.test.mjs +0 -104
- package/cli/lib/figma-import-controls.test.mjs +0 -70
- package/cli/lib/flow-design-integration.test.mjs +0 -165
- package/cli/lib/gitignore-block.test.mjs +0 -136
- package/cli/lib/gitignore-drift.test.mjs +0 -156
- package/cli/lib/hubs-config.test.mjs +0 -165
- package/cli/lib/pkg-root.test.mjs +0 -111
- package/cli/lib/plugin-cli-reachability.test.mjs +0 -57
- package/cli/lib/plugin-name-namespace.test.mjs +0 -71
- package/cli/lib/reconstruct-toolset.test.mjs +0 -194
- package/cli/lib/stack-detect.test.mjs +0 -121
- package/cli/lib/update-check.test.mjs +0 -32
- package/cli/lib/workspace-plan.test.mjs +0 -699
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
// The canvas shell under a based origin — Cloud Phase 27 (DDR-209).
|
|
2
|
-
//
|
|
3
|
-
// The fleet's canvas origin puts the project in the PATH:
|
|
4
|
-
// `canvas.<zone>/<project>/_canvas-shell.html`. Every URL the shell builds must
|
|
5
|
-
// therefore hang off the path it was SERVED from, not off the origin root —
|
|
6
|
-
// otherwise the browser asks for `canvas.<zone>/.design/…`, the data plane reads
|
|
7
|
-
// `.design` as a project name, and every dynamic import fails with
|
|
8
|
-
// "Failed to fetch dynamically imported module".
|
|
9
|
-
//
|
|
10
|
-
// Two mechanisms, because the shell has two kinds of URL and only one of them
|
|
11
|
-
// can be built at runtime:
|
|
12
|
-
//
|
|
13
|
-
// built by JS → `withCap()` prefixes the derived base.
|
|
14
|
-
// the IMPORTMAP → cannot be: it must be static and present before any
|
|
15
|
-
// module loads, and the server cannot rewrite it either
|
|
16
|
-
// (the data plane strips the project segment before the
|
|
17
|
-
// request arrives, so only the browser knows the base).
|
|
18
|
-
// Importmap addresses resolve against the DOCUMENT's base
|
|
19
|
-
// URL, so `./` gets it for free.
|
|
20
|
-
|
|
21
|
-
import { describe, expect, test } from 'bun:test';
|
|
22
|
-
import { readFileSync } from 'node:fs';
|
|
23
|
-
import { join } from 'node:path';
|
|
24
|
-
|
|
25
|
-
const SHELL = readFileSync(
|
|
26
|
-
join(import.meta.dir, '..', '..', '..', 'plugins', 'design', 'templates', '_shell.html'),
|
|
27
|
-
'utf8'
|
|
28
|
-
);
|
|
29
|
-
|
|
30
|
-
/** The shell's own derivation, mirrored so the test breaks when it changes. */
|
|
31
|
-
const baseOf = (pathname: string) => pathname.replace(/\/_canvas-shell(\.html)?$/, '');
|
|
32
|
-
|
|
33
|
-
describe('the canvas shell hangs off the path it was served from', () => {
|
|
34
|
-
test('the base is derived from location, and is empty at the origin root', () => {
|
|
35
|
-
expect(baseOf('/alligators/_canvas-shell.html')).toBe('/alligators');
|
|
36
|
-
expect(baseOf('/alligators/_canvas-shell')).toBe('/alligators');
|
|
37
|
-
expect(baseOf('/_canvas-shell.html')).toBe('');
|
|
38
|
-
expect(baseOf('/_canvas-shell')).toBe('');
|
|
39
|
-
expect(SHELL).toContain("location.pathname.replace(/\\/_canvas-shell(\\.html)?$/, '')");
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
test('NO importmap entry is origin-absolute', () => {
|
|
43
|
-
// `"/_canvas-runtime/react.js"` resolves against the origin and drops the
|
|
44
|
-
// project. This is the one that cannot be fixed at runtime, so it is the one
|
|
45
|
-
// most worth pinning.
|
|
46
|
-
expect(SHELL).not.toContain('"/_canvas-runtime/');
|
|
47
|
-
expect(SHELL).toContain('"./_canvas-runtime/');
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
test('a relative importmap address resolves under the project, and at the root', () => {
|
|
51
|
-
// The actual browser rule, exercised rather than asserted.
|
|
52
|
-
expect(
|
|
53
|
-
new URL(
|
|
54
|
-
'./_canvas-runtime/react.js',
|
|
55
|
-
'https://canvas.cloud.maude.sh/alligators/_canvas-shell.html?t=x'
|
|
56
|
-
).href
|
|
57
|
-
).toBe('https://canvas.cloud.maude.sh/alligators/_canvas-runtime/react.js');
|
|
58
|
-
expect(
|
|
59
|
-
new URL('./_canvas-runtime/react.js', 'http://localhost:4399/_canvas-shell.html').href
|
|
60
|
-
).toBe('http://localhost:4399/_canvas-runtime/react.js');
|
|
61
|
-
});
|
|
62
|
-
|
|
63
|
-
test('withCap prefixes the base AND carries the capability', () => {
|
|
64
|
-
const base = '/alligators';
|
|
65
|
-
const cap = 'cap-1';
|
|
66
|
-
const withCap = (u: string) => {
|
|
67
|
-
const abs = u.startsWith('/') ? base + u : u;
|
|
68
|
-
return cap ? abs + (abs.includes('?') ? '&' : '?') + 't=' + encodeURIComponent(cap) : abs;
|
|
69
|
-
};
|
|
70
|
-
expect(withCap('/.design/ui/Home.tsx')).toBe('/alligators/.design/ui/Home.tsx?t=cap-1');
|
|
71
|
-
expect(withCap('/_api/canvas-meta?file=x')).toBe('/alligators/_api/canvas-meta?file=x&t=cap-1');
|
|
72
|
-
expect(SHELL).toContain("const abs = u.startsWith('/') ? base + u : u;");
|
|
73
|
-
});
|
|
74
|
-
|
|
75
|
-
test('EVERY absolute URL the shell requests goes through the base', () => {
|
|
76
|
-
// The systematic version of the three separate bugs this file records. Each
|
|
77
|
-
// was one absolute path that nobody had thought about: the module, then the
|
|
78
|
-
// importmap, then `comment-mount.js` — and the last one aborted the mount
|
|
79
|
-
// outright, because it is imported in the same `Promise.all` as the canvas.
|
|
80
|
-
//
|
|
81
|
-
// So this asserts the SHAPE rather than a list: nothing in the shell may
|
|
82
|
-
// form a request from an origin-absolute literal.
|
|
83
|
-
const offenders: string[] = [];
|
|
84
|
-
for (const re of [
|
|
85
|
-
/import\(\s*['"`]\//g, // import('/…')
|
|
86
|
-
/fetch\(\s*['"`]\//g, // fetch('/…')
|
|
87
|
-
/\.href\s*=\s*['"`]\//g, // el.href = '/…'
|
|
88
|
-
/\.src\s*=\s*['"`]\//g, // el.src = '/…'
|
|
89
|
-
/location\.host\s*\+\s*['"`]\//g, // ws://host + '/…'
|
|
90
|
-
]) {
|
|
91
|
-
for (const m of SHELL.matchAll(re)) offenders.push(m[0].trim());
|
|
92
|
-
}
|
|
93
|
-
expect(offenders).toEqual([]);
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
test('the URLs that DO appear are the ones withCap builds', () => {
|
|
97
|
-
// Belt to the brace above: the four paths the shell legitimately names must
|
|
98
|
-
// each be reachable only through `withCap`.
|
|
99
|
-
for (const path of ['/_client/comment-mount.js', '/_api/canvas-meta']) {
|
|
100
|
-
const at = SHELL.indexOf(path);
|
|
101
|
-
expect(at).toBeGreaterThan(0);
|
|
102
|
-
// `withCap(` appears within the same expression, before the literal.
|
|
103
|
-
const before = SHELL.slice(Math.max(0, at - 120), at);
|
|
104
|
-
expect(before).toContain('withCap(');
|
|
105
|
-
}
|
|
106
|
-
});
|
|
107
|
-
});
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
// Spike finding M8 (studyfi-design AWS run, 2026-08-20) — the mount's catch
|
|
2
|
-
// showed `err.stack`, which for a failed dynamic import is the bare
|
|
3
|
-
// "TypeError: Failed to fetch dynamically imported module". The 422 body the
|
|
4
|
-
// server wrote ("Canvas build error: this canvas imports …") names the culprit
|
|
5
|
-
// and the rule — and the browser throws it away on non-2xx. The spike spent
|
|
6
|
-
// several rounds on token/cookie hypotheses before a manual curl surfaced the
|
|
7
|
-
// body.
|
|
8
|
-
//
|
|
9
|
-
// The shell is a static template, so this suite pins the WIRING the way
|
|
10
|
-
// canvas-shell-base.test.ts does: the diagnosis helper exists, and both import
|
|
11
|
-
// failure paths (initial mount + soft reload) route through it instead of
|
|
12
|
-
// printing the TypeError.
|
|
13
|
-
|
|
14
|
-
import { describe, expect, test } from 'bun:test';
|
|
15
|
-
import { readFileSync } from 'node:fs';
|
|
16
|
-
import { join } from 'node:path';
|
|
17
|
-
|
|
18
|
-
const SHELL = readFileSync(
|
|
19
|
-
join(import.meta.dir, '..', '..', '..', 'plugins', 'design', 'templates', '_shell.html'),
|
|
20
|
-
'utf8'
|
|
21
|
-
);
|
|
22
|
-
|
|
23
|
-
describe('a canvas build error reaches the person (M8)', () => {
|
|
24
|
-
test('the shell carries the import-failure diagnosis helper', () => {
|
|
25
|
-
expect(SHELL).toContain('function diagnoseImportFailure(');
|
|
26
|
-
// It refetches the module URL to recover the discarded response body…
|
|
27
|
-
expect(SHELL).toMatch(/diagnoseImportFailure[\s\S]{0,400}fetch\(url/);
|
|
28
|
-
// …and shows the body, not just the status line.
|
|
29
|
-
expect(SHELL).toMatch(/r\.text\(\)/);
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
test('the initial mount catch routes through the diagnosis, not err.stack', () => {
|
|
33
|
-
expect(SHELL).toContain('diagnoseImportFailure(canvasUrl, err).then(showError)');
|
|
34
|
-
// The old shape — showError straight from the stack — must not come back.
|
|
35
|
-
expect(SHELL).not.toContain('showError((err && err.stack) || String(err))');
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
test('the soft-reload holding toast gets the same diagnosis', () => {
|
|
39
|
-
const soft = SHELL.slice(
|
|
40
|
-
SHELL.indexOf('function softReload'),
|
|
41
|
-
SHELL.indexOf('function softReload') + 1500
|
|
42
|
-
);
|
|
43
|
-
expect(soft).toContain('diagnoseImportFailure(canvasUrl, err)');
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
test('a 2xx refetch falls back to the original error — the diagnosis never masks a module-level throw', () => {
|
|
47
|
-
// If the module fetches fine, the failure was inside the module (a runtime
|
|
48
|
-
// throw at import time). Showing an "HTTP 200" line there would point the
|
|
49
|
-
// person at the network when the bug is in their code.
|
|
50
|
-
expect(SHELL).toMatch(/if \(r\.ok\) return fallback/);
|
|
51
|
-
});
|
|
52
|
-
});
|
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
// DDR-093 — canvasUrl() token-resolution. Regression guard for the
|
|
2
|
-
// "non-default-DS UI canvas renders unstyled" bug: every `ui/*.tsx` authored
|
|
3
|
-
// under a non-default design system used to load designSystems[0]'s tokens
|
|
4
|
-
// (scoped to a different `.<rootClass>` subtree) so every `var(--*)` went
|
|
5
|
-
// undefined and the canvas rendered white.
|
|
6
|
-
|
|
7
|
-
import { describe, expect, test } from 'bun:test';
|
|
8
|
-
|
|
9
|
-
import { canvasUrl, urlOf } from '../client/canvas-url.js';
|
|
10
|
-
|
|
11
|
-
// Mirrors this repo's real multi-DS config: `project` is the default (ds0),
|
|
12
|
-
// `maude` is the non-default one that the bug broke.
|
|
13
|
-
const cfg = {
|
|
14
|
-
designRel: '.design',
|
|
15
|
-
designSystems: [
|
|
16
|
-
{ name: 'project', path: 'system/project', tokensCssRel: 'system/project/colors_and_type.css' },
|
|
17
|
-
{ name: 'maude', path: 'system/maude', tokensCssRel: 'system/maude/colors_and_type.css' },
|
|
18
|
-
],
|
|
19
|
-
};
|
|
20
|
-
|
|
21
|
-
function paramsOf(url: string): URLSearchParams {
|
|
22
|
-
const qs = url.split('?')[1] ?? '';
|
|
23
|
-
return new URLSearchParams(qs);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
describe('canvasUrl — per-canvas design-system token resolution', () => {
|
|
27
|
-
test('explicit opts.ds resolves a non-default DS canvas to its OWN tokens', () => {
|
|
28
|
-
const p = paramsOf(canvasUrl('.design/ui/Studio.tsx', cfg, { ds: 'maude' }));
|
|
29
|
-
expect(p.get('tokens')).toBe('system/maude/colors_and_type.css');
|
|
30
|
-
expect(p.get('components')).toBe('system/maude/preview/_components.css');
|
|
31
|
-
});
|
|
32
|
-
|
|
33
|
-
test('RCA interface form — relative path + opts.ds', () => {
|
|
34
|
-
const p = paramsOf(canvasUrl('ui/Studio.tsx', cfg, { ds: 'maude' }));
|
|
35
|
-
expect(p.get('tokens')).toBe('system/maude/colors_and_type.css');
|
|
36
|
-
expect(p.get('components')).toBe('system/maude/preview/_components.css');
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
test('opts.ds = the default DS resolves to ds0 tokens', () => {
|
|
40
|
-
const p = paramsOf(canvasUrl('.design/ui/Studio.tsx', cfg, { ds: 'project' }));
|
|
41
|
-
expect(p.get('tokens')).toBe('system/project/colors_and_type.css');
|
|
42
|
-
expect(p.get('components')).toBe('system/project/preview/_components.css');
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
test('cfg.canvasDesignSystems map drives resolution when opts.ds is absent', () => {
|
|
46
|
-
const withMap = { ...cfg, canvasDesignSystems: { '.design/ui/Studio.tsx': 'maude' } };
|
|
47
|
-
const p = paramsOf(canvasUrl('.design/ui/Studio.tsx', withMap));
|
|
48
|
-
expect(p.get('tokens')).toBe('system/maude/colors_and_type.css');
|
|
49
|
-
expect(p.get('components')).toBe('system/maude/preview/_components.css');
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
test('opts.ds wins over the map', () => {
|
|
53
|
-
const withMap = { ...cfg, canvasDesignSystems: { '.design/ui/Studio.tsx': 'maude' } };
|
|
54
|
-
const p = paramsOf(canvasUrl('.design/ui/Studio.tsx', withMap, { ds: 'project' }));
|
|
55
|
-
expect(p.get('tokens')).toBe('system/project/colors_and_type.css');
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
test('unknown / no DS falls back to ds0 (single-DS + legacy behavior intact)', () => {
|
|
59
|
-
const p = paramsOf(canvasUrl('.design/ui/Plain.tsx', cfg, {}));
|
|
60
|
-
expect(p.get('tokens')).toBe('system/project/colors_and_type.css');
|
|
61
|
-
expect(p.get('components')).toBe('system/project/preview/_components.css');
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
test('an unknown DS name (not in designSystems) falls back to ds0, never undefined', () => {
|
|
65
|
-
const p = paramsOf(canvasUrl('.design/ui/Ghost.tsx', cfg, { ds: 'does-not-exist' }));
|
|
66
|
-
expect(p.get('tokens')).toBe('system/project/colors_and_type.css');
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
test('specimen paths stay path-resolved and are unaffected by the map', () => {
|
|
70
|
-
const withWrongMap = {
|
|
71
|
-
...cfg,
|
|
72
|
-
// A bogus map entry must NOT override the specimen branch.
|
|
73
|
-
canvasDesignSystems: { '.design/system/maude/preview/Buttons.tsx': 'project' },
|
|
74
|
-
};
|
|
75
|
-
const p = paramsOf(canvasUrl('.design/system/maude/preview/Buttons.tsx', withWrongMap));
|
|
76
|
-
expect(p.get('tokens')).toBe('system/maude/colors_and_type.css');
|
|
77
|
-
expect(p.get('layout')).toBe('system/maude/preview/_layout.css');
|
|
78
|
-
expect(p.get('components')).toBe('system/maude/preview/_components.css');
|
|
79
|
-
});
|
|
80
|
-
|
|
81
|
-
test('the bug it guards against: ds0 is the WRONG DS for a maude canvas', () => {
|
|
82
|
-
// Documents the failure mode — with neither opts.ds nor a map entry the
|
|
83
|
-
// resolver returns designSystems[0] (project), which is exactly what broke a
|
|
84
|
-
// maude canvas before DDR-093. The fix is that the map now supplies 'maude'.
|
|
85
|
-
const p = paramsOf(canvasUrl('.design/ui/Studio.tsx', cfg));
|
|
86
|
-
expect(p.get('tokens')).toBe('system/project/colors_and_type.css'); // ds0 — wrong for maude
|
|
87
|
-
const fixed = paramsOf(
|
|
88
|
-
canvasUrl('.design/ui/Studio.tsx', {
|
|
89
|
-
...cfg,
|
|
90
|
-
canvasDesignSystems: { '.design/ui/Studio.tsx': 'maude' },
|
|
91
|
-
})
|
|
92
|
-
);
|
|
93
|
-
expect(fixed.get('tokens')).toBe('system/maude/colors_and_type.css'); // fixed
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
test('non-tsx paths bypass the shell and return a direct URL', () => {
|
|
97
|
-
expect(canvasUrl('.design/ui/legacy.html', cfg)).toBe(urlOf('.design/ui/legacy.html'));
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
// Cloud Phase 25 C2 — the viewer role rides into the canvas as ?ro=1 so the
|
|
101
|
-
// iframe chrome is read-only from its very first paint (boot-static, no
|
|
102
|
-
// postMessage race).
|
|
103
|
-
test('cfg.readOnly stamps ro=1; absent/false omits it', () => {
|
|
104
|
-
expect(paramsOf(canvasUrl('.design/ui/Studio.tsx', { ...cfg, readOnly: true })).get('ro')).toBe(
|
|
105
|
-
'1'
|
|
106
|
-
);
|
|
107
|
-
expect(paramsOf(canvasUrl('.design/ui/Studio.tsx', cfg)).get('ro')).toBeNull();
|
|
108
|
-
expect(
|
|
109
|
-
paramsOf(canvasUrl('.design/ui/Studio.tsx', { ...cfg, readOnly: false })).get('ro')
|
|
110
|
-
).toBeNull();
|
|
111
|
-
});
|
|
112
|
-
});
|
|
113
|
-
|
|
114
|
-
// Cloud Phase 27 (DDR-209) — the canvas origin's capability.
|
|
115
|
-
//
|
|
116
|
-
// In the cloud the canvas origin is a cookieless, cross-site hostname: a cookie
|
|
117
|
-
// scoped widely enough to cover it would be readable by the untrusted canvas
|
|
118
|
-
// content itself, which is the one thing the DDR-054 split exists to prevent.
|
|
119
|
-
// So the capability rides in the URL. It reaches `cfg` through the `/_config`
|
|
120
|
-
// projection — which silently dropped it once, and would have 401'd every
|
|
121
|
-
// canvas iframe in production (see `config-projection.test.ts`).
|
|
122
|
-
|
|
123
|
-
test('a canvas URL carries the capability when the server minted one', () => {
|
|
124
|
-
const url = canvasUrl('.design/ui/Home.tsx', {
|
|
125
|
-
designRel: '.design',
|
|
126
|
-
canvasOrigin: 'https://canvas.cloud.maude.sh/alligators',
|
|
127
|
-
canvasToken: 'cap-abc123',
|
|
128
|
-
});
|
|
129
|
-
expect(url.startsWith('https://canvas.cloud.maude.sh/alligators/_canvas-shell.html?')).toBe(true);
|
|
130
|
-
expect(new URL(url).searchParams.get('t')).toBe('cap-abc123');
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
test('a desktop URL is byte-identical to before — no capability, no query', () => {
|
|
134
|
-
// The loopback canvas origin needs none, so this must not change for the
|
|
135
|
-
// shell that has always worked.
|
|
136
|
-
const url = canvasUrl('.design/ui/Home.tsx', { designRel: '.design' });
|
|
137
|
-
expect(new URL(url, 'http://x').searchParams.has('t')).toBe(false);
|
|
138
|
-
});
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
// canvas-wheel-delta — issue #94 dogfood report: mouse-wheel panning in the
|
|
2
|
-
// canvas is very slow. Root cause: `onWheel` fed raw `WheelEvent.deltaX`/
|
|
3
|
-
// `deltaY` straight into `panBy` as CSS pixels, but the Wheel Events spec
|
|
4
|
-
// lets a browser report deltas in pixel/line/page units (`deltaMode`).
|
|
5
|
-
// Physical mice on Firefox (and some browser/OS combos elsewhere) report
|
|
6
|
-
// LINE-mode deltas — a single integer like 3 per notch — which, read as
|
|
7
|
-
// pixels, panned the canvas only a few px per wheel notch. Trackpads report
|
|
8
|
-
// pixel-mode deltas already, so trackpad panning felt fine while mouse-wheel
|
|
9
|
-
// panning felt frozen. See .ai/logs/rca/issue-94-wheel-pan-slow.md.
|
|
10
|
-
//
|
|
11
|
-
// `wheelDeltaToPixels` is a pure function (no DOM needed) so this test
|
|
12
|
-
// doesn't need happy-dom, unlike canvas-zoom-floor.test.ts's computeFit case.
|
|
13
|
-
|
|
14
|
-
import { describe, expect, test } from 'bun:test';
|
|
15
|
-
|
|
16
|
-
import { wheelDeltaToPixels } from '../canvas-lib.tsx';
|
|
17
|
-
|
|
18
|
-
describe('wheelDeltaToPixels — normalizes WheelEvent units (issue #94)', () => {
|
|
19
|
-
test('pixel mode (deltaMode 0) passes the value through unchanged', () => {
|
|
20
|
-
expect(wheelDeltaToPixels(100, 0, 800)).toBe(100);
|
|
21
|
-
expect(wheelDeltaToPixels(-42.5, 0, 800)).toBe(-42.5);
|
|
22
|
-
});
|
|
23
|
-
|
|
24
|
-
test('line mode (deltaMode 1) scales a small per-notch delta up to a pixel-range step', () => {
|
|
25
|
-
// The regression: before the fix, `onWheel` fed the raw delta straight
|
|
26
|
-
// into `panBy`, so a line-mode notch of 3 panned only 3 CSS pixels —
|
|
27
|
-
// reproducing the "very slow" mouse-wheel report. This asserts the FIXED
|
|
28
|
-
// behavior: scaled up to a magnitude comparable to a trackpad's
|
|
29
|
-
// pixel-mode delta (~100 per gesture step). Pre-fix, `wheelDeltaToPixels`
|
|
30
|
-
// didn't exist and `onWheel` used the raw `3` — this assertion fails
|
|
31
|
-
// against that old code path (3 !== 48).
|
|
32
|
-
const raw = 3;
|
|
33
|
-
const scaled = wheelDeltaToPixels(raw, 1, 800);
|
|
34
|
-
expect(scaled).toBe(48);
|
|
35
|
-
expect(scaled).not.toBe(raw);
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
test('page mode (deltaMode 2) scales by the supplied page size', () => {
|
|
39
|
-
expect(wheelDeltaToPixels(1, 2, 800)).toBe(800);
|
|
40
|
-
expect(wheelDeltaToPixels(-2, 2, 600)).toBe(-1200);
|
|
41
|
-
});
|
|
42
|
-
});
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
// canvas-zoom-floor — issue #91 dogfood report: dragging an artboard across a
|
|
2
|
-
// large board, the user can't zoom out far enough to complete the move in one
|
|
3
|
-
// motion. Root cause: `clampZoom` applies a single hard-coded floor to every
|
|
4
|
-
// viewport write, including the programmatic `fit()` path — a board wider
|
|
5
|
-
// than ~10x the viewport could never be framed whole. See
|
|
6
|
-
// .ai/logs/rca/issue-91-canvas-zoom-floor.md.
|
|
7
|
-
//
|
|
8
|
-
// canvas-lib.tsx pulls in a React/DOM dependency graph, so we register
|
|
9
|
-
// happy-dom for this file (like camera-reveal.test.tsx) before importing.
|
|
10
|
-
|
|
11
|
-
import { afterAll, beforeAll, describe, expect, test } from 'bun:test';
|
|
12
|
-
import { GlobalRegistrator } from '@happy-dom/global-registrator';
|
|
13
|
-
|
|
14
|
-
beforeAll(() => {
|
|
15
|
-
GlobalRegistrator.register();
|
|
16
|
-
});
|
|
17
|
-
afterAll(() => {
|
|
18
|
-
GlobalRegistrator.unregister();
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
import { clampZoom, computeFit } from '../canvas-lib.tsx';
|
|
22
|
-
|
|
23
|
-
function fakeHost(clientWidth: number, clientHeight: number): HTMLElement {
|
|
24
|
-
const el = document.createElement('div');
|
|
25
|
-
Object.defineProperty(el, 'clientWidth', { value: clientWidth });
|
|
26
|
-
Object.defineProperty(el, 'clientHeight', { value: clientHeight });
|
|
27
|
-
return el;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
describe('clampZoom — the interactive zoom floor (issue #91)', () => {
|
|
31
|
-
test('a deep zoom-out below the OLD 0.1 floor is no longer clamped', () => {
|
|
32
|
-
expect(clampZoom(0.05)).toBe(0.05);
|
|
33
|
-
expect(clampZoom(0.02)).toBe(0.02);
|
|
34
|
-
});
|
|
35
|
-
|
|
36
|
-
test('still clamps below the new floor', () => {
|
|
37
|
-
expect(clampZoom(0.0001)).toBe(0.02);
|
|
38
|
-
expect(clampZoom(-5)).toBe(0.02);
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
test('still clamps above the max and normalizes non-finite input', () => {
|
|
42
|
-
expect(clampZoom(99)).toBe(4);
|
|
43
|
-
expect(clampZoom(Number.NaN)).toBe(1);
|
|
44
|
-
expect(clampZoom(Number.POSITIVE_INFINITY)).toBe(1);
|
|
45
|
-
});
|
|
46
|
-
});
|
|
47
|
-
|
|
48
|
-
describe('computeFit → clampZoom — fit() can now frame a wide board (issue #91)', () => {
|
|
49
|
-
test('a board ~20x the viewport width computes a zoom the old floor would have clamped up', () => {
|
|
50
|
-
// Viewport 1000x800; board 20000 wide — the exact "more than a screenful
|
|
51
|
-
// of artboards" shape from the report. Ideal fit zoom is well under 0.1.
|
|
52
|
-
const host = fakeHost(1000, 800);
|
|
53
|
-
const fit = computeFit([{ x: 0, y: 0, w: 20000, h: 800 }], host, 24);
|
|
54
|
-
|
|
55
|
-
expect(fit.zoom).toBeLessThan(0.1); // the bug: old floor would have clamped this
|
|
56
|
-
expect(fit.zoom).toBeGreaterThanOrEqual(0.02); // still within the new interactive floor
|
|
57
|
-
|
|
58
|
-
// The regression proper: applying the viewport funnel's clamp must be a
|
|
59
|
-
// no-op for this value now — before the fix (ZOOM_MIN = 0.1) this would
|
|
60
|
-
// have raised fit.zoom back up to 0.1, cropping the board.
|
|
61
|
-
expect(clampZoom(fit.zoom)).toBe(fit.zoom);
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
test('an extremely wide board (>50x viewport) still bottoms out at the interactive floor', () => {
|
|
65
|
-
const host = fakeHost(1000, 800);
|
|
66
|
-
const fit = computeFit([{ x: 0, y: 0, w: 100000, h: 800 }], host, 24);
|
|
67
|
-
|
|
68
|
-
// The ideal fit zoom is far below even the new floor — clampZoom must
|
|
69
|
-
// still protect the interactive floor for pathological board sizes.
|
|
70
|
-
expect(fit.zoom).toBeLessThan(0.02);
|
|
71
|
-
expect(clampZoom(fit.zoom)).toBe(0.02);
|
|
72
|
-
});
|
|
73
|
-
});
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
// capture-core.test.ts — pure-logic guards of the shared capture spine
|
|
2
|
-
// (DDR-231). The DOM-dependent half (svgForElement, rasterizeSvg) is exercised
|
|
3
|
-
// end-to-end by the fidelity gate (plan T6) — no DOM emulation here.
|
|
4
|
-
|
|
5
|
-
import { describe, expect, test } from 'bun:test';
|
|
6
|
-
|
|
7
|
-
import {
|
|
8
|
-
assertRasterSizeOk,
|
|
9
|
-
MAX_OUTPUT_BYTES,
|
|
10
|
-
MAX_OUTPUT_SIDE_PX,
|
|
11
|
-
} from '../exporters/capture-core.ts';
|
|
12
|
-
|
|
13
|
-
describe('assertRasterSizeOk — the raster render guard', () => {
|
|
14
|
-
test('a 1440×900 artboard at 2× passes', () => {
|
|
15
|
-
expect(() => assertRasterSizeOk(1440, 900, 2)).not.toThrow();
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
test('a 600dpi A0 poster still fits (the guard ceiling rationale)', () => {
|
|
19
|
-
// 9933×14043 px ≈ 558MB RGBA — deliberately inside the ~600MB ceiling.
|
|
20
|
-
expect(() => assertRasterSizeOk(9933 / 6.25, 14043 / 6.25, 6.25)).not.toThrow();
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
test('exceeding the side ceiling throws with an actionable max-DPI hint', () => {
|
|
24
|
-
expect(() => assertRasterSizeOk(MAX_OUTPUT_SIDE_PX, 900, 2)).toThrow(/max supported DPI/);
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
test('exceeding the byte ceiling throws even when both sides fit', () => {
|
|
28
|
-
// 15000×15000 × 4B = 900MB > ceiling while each side < 16000.
|
|
29
|
-
expect(15000 * 15000 * 4).toBeGreaterThan(MAX_OUTPUT_BYTES);
|
|
30
|
-
expect(() => assertRasterSizeOk(15000, 15000, 1)).toThrow(/render guard/);
|
|
31
|
-
});
|
|
32
|
-
});
|
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
// Source-shape gates for capture determinism.
|
|
2
|
-
//
|
|
3
|
-
// These guard properties that only manifest in a browser under load, which CI
|
|
4
|
-
// has no way to run — `test/exporters/pw-launch.test.ts` says as much ("the
|
|
5
|
-
// launch path itself is integration-shape (needs a real browser)"), and
|
|
6
|
-
// `test/export-shim-multi-capture.test.ts` exists precisely because of it. So,
|
|
7
|
-
// in that same house style, the FIX SHAPE is asserted at the source level.
|
|
8
|
-
//
|
|
9
|
-
// Why these particular shapes: the plan's original premise was that frame-step
|
|
10
|
-
// capture is "deterministic by construction" — a doc comment in video-comp.tsx
|
|
11
|
-
// with nothing enforcing it. It was not true. A seek could fail silently, and
|
|
12
|
-
// the capture wait could give up on a wall-clock timer and screenshot a stale
|
|
13
|
-
// frame. Serially both were survivable; under any parallel capture neither is.
|
|
14
|
-
// If someone deletes these guards, the resulting bug is a valid-looking video
|
|
15
|
-
// with wrong frames — invisible to every other test we have.
|
|
16
|
-
|
|
17
|
-
import { describe, expect, test } from 'bun:test';
|
|
18
|
-
import { readFileSync } from 'node:fs';
|
|
19
|
-
import { join } from 'node:path';
|
|
20
|
-
|
|
21
|
-
const STUDIO = join(import.meta.dir, '..');
|
|
22
|
-
const read = (rel: string) => readFileSync(join(STUDIO, rel), 'utf8');
|
|
23
|
-
|
|
24
|
-
describe('the seek bridge must not report a seek that did not happen', () => {
|
|
25
|
-
const src = () => read('video-comp.tsx');
|
|
26
|
-
|
|
27
|
-
test('no empty catch swallows a failed seekTo', () => {
|
|
28
|
-
// The exact regression: `catch { /* comment only */ }` around the seek.
|
|
29
|
-
const emptyCatch = /catch\s*\{\s*(?:\/\*[\s\S]*?\*\/|\/\/[^\n]*)?\s*\}/g;
|
|
30
|
-
const body = src();
|
|
31
|
-
const seekRegion = body.slice(
|
|
32
|
-
body.indexOf('__maude_seek__ = async'),
|
|
33
|
-
body.indexOf('Ordinary-artboard fallback')
|
|
34
|
-
);
|
|
35
|
-
expect(seekRegion.length).toBeGreaterThan(0);
|
|
36
|
-
expect(seekRegion.match(emptyCatch)).toBeNull();
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
test('an unlanded seek throws rather than resolving', () => {
|
|
40
|
-
expect(src()).toContain('refusing to report a seek that did not happen');
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
test('failures are counted where the shim can read them', () => {
|
|
44
|
-
expect(src()).toContain('__maude_seek_failures__');
|
|
45
|
-
});
|
|
46
|
-
|
|
47
|
-
test('a cold Player still gets bounded retries — the fix is not "fail faster"', () => {
|
|
48
|
-
expect(src()).toContain('SEEK_ATTEMPTS');
|
|
49
|
-
expect(src()).toContain('seekEntryWithRetry');
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
describe('the capture shim must refuse a capture built on stale frames', () => {
|
|
54
|
-
test('it reads the in-page failure count and throws on any', () => {
|
|
55
|
-
const shim = read('bin/_video-playwright.mjs');
|
|
56
|
-
expect(shim).toContain('__maude_seek_failures__');
|
|
57
|
-
expect(shim).toMatch(/seekFailures\s*>\s*0/);
|
|
58
|
-
expect(shim).toContain('Refusing to encode');
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
test('the refusal happens BEFORE the encoded output is written', () => {
|
|
62
|
-
const shim = read('bin/_video-playwright.mjs');
|
|
63
|
-
const guardAt = shim.indexOf('seekFailures');
|
|
64
|
-
const writeAt = shim.indexOf('writeFileSync(out, Buffer.from(enc.b64');
|
|
65
|
-
expect(guardAt).toBeGreaterThan(0);
|
|
66
|
-
expect(writeAt).toBeGreaterThan(0);
|
|
67
|
-
// Ordering is the whole point — a check after the write ships the bad file.
|
|
68
|
-
expect(guardAt).toBeLessThan(writeAt);
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
describe('encoder guards (unit-shape — these run without a browser)', () => {
|
|
73
|
-
const enc = () => read('exporters/video-encode-lib.ts');
|
|
74
|
-
|
|
75
|
-
test('a mismatched frame is rejected, never silently resampled', () => {
|
|
76
|
-
const src = enc();
|
|
77
|
-
expect(src).toContain('refusing to resample');
|
|
78
|
-
// The check must precede the draw, or the resample already happened.
|
|
79
|
-
const guardAt = src.indexOf('refusing to resample');
|
|
80
|
-
const drawAt = src.indexOf('vstate.ctx.drawImage(bmp, 0, 0');
|
|
81
|
-
expect(guardAt).toBeGreaterThan(0);
|
|
82
|
-
expect(guardAt).toBeLessThan(drawAt);
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
test("latencyMode is pinned to 'quality' — 'realtime' may drop frames", () => {
|
|
86
|
-
expect(enc()).toContain("latencyMode: 'quality'");
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
test('the encoder canvas is NOT cleared between frames — pinned deliberately', () => {
|
|
90
|
-
// Current behaviour: a transparent artboard ghosts the previous frame,
|
|
91
|
-
// because nothing clears the canvas before drawImage. That is a real defect
|
|
92
|
-
// for transparent comps, but changing it is a visual change to every export
|
|
93
|
-
// and belongs in its own change with its own before/after. Pinned here so
|
|
94
|
-
// the next person changes it ON PURPOSE rather than as a side effect.
|
|
95
|
-
expect(enc()).not.toContain('clearRect');
|
|
96
|
-
});
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
describe('bundle cache paths must be content-addressed', () => {
|
|
100
|
-
test('no fixed-name temp bundle two servers could race on', () => {
|
|
101
|
-
const src = read('exporters/_browser-bundles.ts');
|
|
102
|
-
expect(src).toContain('writeHashedBundle');
|
|
103
|
-
expect(src).not.toContain("'maude-video-encode-lib.mjs'");
|
|
104
|
-
expect(src).not.toContain("'maude-video-render-lib.mjs'");
|
|
105
|
-
});
|
|
106
|
-
});
|
|
107
|
-
|
|
108
|
-
describe('the video shim must guard its output size', () => {
|
|
109
|
-
test('it calls assertRenderOutputSizeOk like the pdf shim does', () => {
|
|
110
|
-
const shim = read('bin/_video-playwright.mjs');
|
|
111
|
-
expect(shim).toContain(
|
|
112
|
-
"assertRenderOutputSizeOk(clip.width, clip.height, deviceScaleFactor, '_video-playwright')"
|
|
113
|
-
);
|
|
114
|
-
});
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
describe('timing telemetry must not break the summary contract', () => {
|
|
118
|
-
test('MAUDE_TIMING is filtered in _runtime.ts, not in an adapter', () => {
|
|
119
|
-
const rt = read('exporters/_runtime.ts');
|
|
120
|
-
expect(rt).toContain('TIMING_LINE');
|
|
121
|
-
expect(rt).toContain('onTiming');
|
|
122
|
-
// video.ts parses stdoutLines.at(-1) as its summary JSON — an unfiltered
|
|
123
|
-
// trailing diagnostic line would break EVERY video export.
|
|
124
|
-
const video = read('exporters/video.ts');
|
|
125
|
-
expect(video).toContain('stdoutLines.at(-1)');
|
|
126
|
-
expect(video).not.toContain('MAUDE_TIMING');
|
|
127
|
-
});
|
|
128
|
-
|
|
129
|
-
test('both capture paths emit it, so they are comparable', () => {
|
|
130
|
-
const shim = read('bin/_video-playwright.mjs');
|
|
131
|
-
expect(shim).toContain("path: 'frame-step'");
|
|
132
|
-
expect(shim).toContain("path: 'renderer'");
|
|
133
|
-
expect(shim).toContain('stageMs');
|
|
134
|
-
});
|
|
135
|
-
});
|