@1agh/maude 1.0.11 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/apps/studio/acp/bridge.ts +18 -13
- package/apps/studio/acp/index.ts +43 -7
- package/apps/studio/acp/transcript-io.ts +394 -0
- package/apps/studio/acp/transcript.ts +103 -38
- package/apps/studio/annotations-layer.tsx +191 -116
- package/apps/studio/annotations-model.ts +39 -0
- package/apps/studio/annotations-sync.ts +50 -0
- package/apps/studio/api.ts +821 -55
- package/apps/studio/bin/_import-figma.mjs +57 -11
- package/apps/studio/bin/_seed-fixture.mjs +163 -0
- package/apps/studio/bin/annotate.mjs +3 -1
- package/apps/studio/bin/server-up.sh +17 -2
- package/apps/studio/canvas-edit.ts +391 -7
- package/apps/studio/canvas-imports.ts +89 -0
- package/apps/studio/canvas-lib.tsx +82 -18
- package/apps/studio/canvas-notice-message.ts +16 -0
- package/apps/studio/canvas-notifications.tsx +19 -0
- package/apps/studio/canvas-shell.tsx +57 -6
- package/apps/studio/client/app.jsx +943 -248
- package/apps/studio/client/apply-edit-request.ts +55 -0
- package/apps/studio/client/export-center.jsx +125 -67
- package/apps/studio/client/github.js +38 -1
- package/apps/studio/client/index-loader.ts +76 -0
- package/apps/studio/client/panels/CloudBar.jsx +52 -6
- package/apps/studio/client/panels/GitPanel.jsx +103 -0
- package/apps/studio/client/panels/OnboardingWizard.jsx +36 -7
- package/apps/studio/client/panels/RepoBranchSwitcher.jsx +92 -27
- package/apps/studio/client/panels/SourceConflictPanel.jsx +166 -0
- package/apps/studio/client/panels/SyncPanel.jsx +238 -4
- package/apps/studio/client/panels/TeamProjects.jsx +376 -0
- package/apps/studio/client/panels/file-deep-link-dialog.jsx +54 -0
- package/apps/studio/client/photo-knobs.jsx +3 -0
- package/apps/studio/client/report-bug.jsx +19 -1
- package/apps/studio/client/share-dialog.jsx +91 -0
- package/apps/studio/client/share-link.js +94 -0
- package/apps/studio/client/styles/3-shell-maude.css +69 -18
- package/apps/studio/client/styles/4-components.css +44 -1
- package/apps/studio/client/tree-row-menu.jsx +48 -3
- package/apps/studio/client/whats-new.jsx +26 -32
- package/apps/studio/cloud/endpoints.ts +132 -0
- package/apps/studio/collab/index.ts +4 -0
- package/apps/studio/collab/persistence.ts +137 -17
- package/apps/studio/collab/registry.ts +19 -21
- package/apps/studio/collab/room.ts +13 -2
- package/apps/studio/context.ts +59 -0
- package/apps/studio/debug-bundle.ts +13 -0
- package/apps/studio/dist/client.bundle.js +1911 -1879
- package/apps/studio/dist/runtime/.min-sizes.json +1 -0
- package/apps/studio/dist/runtime/sonner.js +1 -0
- 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 +296 -19
- package/apps/studio/inspect.ts +19 -0
- package/apps/studio/managed-projects.ts +150 -0
- package/apps/studio/mem.ts +45 -9
- package/apps/studio/notifications.tsx +292 -0
- package/apps/studio/runtime-bundle.ts +2 -0
- package/apps/studio/server.ts +69 -6
- package/apps/studio/sync/accepted-cold-start.ts +225 -0
- package/apps/studio/sync/accepted-link.ts +320 -0
- package/apps/studio/sync/action-stage.ts +343 -0
- package/apps/studio/sync/agent.ts +104 -45
- package/apps/studio/sync/asset-push.ts +1 -47
- package/apps/studio/sync/cell-file-events.ts +3 -0
- package/apps/studio/sync/codec.ts +192 -34
- 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/ctl-provider.ts +15 -2
- package/apps/studio/sync/document-discovery.ts +81 -0
- package/apps/studio/sync/file-ledger.ts +117 -0
- package/apps/studio/sync/file-membership.ts +10 -2
- package/apps/studio/sync/file-plane.ts +926 -47
- package/apps/studio/sync/index.ts +1786 -36
- package/apps/studio/sync/journal-client.ts +13 -1
- package/apps/studio/sync/migrate-seed.ts +150 -22
- package/apps/studio/sync/poke.ts +4 -2
- package/apps/studio/sync/presentation.ts +311 -5
- package/apps/studio/sync/projection.ts +820 -23
- package/apps/studio/sync/repeated-module.ts +73 -0
- package/apps/studio/sync/retry-after.ts +169 -0
- package/apps/studio/sync/revision-barrier.ts +129 -0
- package/apps/studio/sync/seed-progress.ts +218 -0
- package/apps/studio/sync/seed-repair.ts +46 -0
- package/apps/studio/sync/source-merge.ts +100 -0
- package/apps/studio/sync/source-ops.ts +289 -0
- package/apps/studio/sync/source-recovery.ts +70 -0
- package/apps/studio/sync/source-validation.ts +56 -0
- package/apps/studio/sync/status.ts +201 -6
- package/apps/studio/sync/transaction-client.ts +460 -0
- package/apps/studio/sync/transport-error.ts +111 -0
- package/apps/studio/sync/writer-registry.ts +236 -0
- package/apps/studio/text-caret.ts +35 -0
- package/apps/studio/undo-hud.tsx +9 -87
- package/apps/studio/use-canvas-media-drop.tsx +4 -39
- package/apps/studio/whats-new.json +173 -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 +892 -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 +33 -9
- package/plugins/design/dependencies.json +3 -3
- package/plugins/design/templates/_shell.html +47 -0
- package/plugins/flow/.claude-plugin/config.schema.json +8 -0
- package/plugins/flow/dependencies.json +3 -3
- 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
|
@@ -14,11 +14,16 @@
|
|
|
14
14
|
|
|
15
15
|
import type { AssetPushProgress } from './asset-push.ts';
|
|
16
16
|
import type { SyncStatusSnapshot } from './connection-state.ts';
|
|
17
|
+
import type { SeedProgress } from './seed-progress.ts';
|
|
17
18
|
|
|
18
19
|
// `cold-start-hub-wins` stays in the union for OLD payload readers (additive
|
|
19
20
|
// evolution — the NoSyncablePayload discriminator pattern); new conflicts are
|
|
20
21
|
// recorded as `cold-start-diverged` with the DDR-102 winner + snapshot refs.
|
|
21
|
-
export type ConflictKind =
|
|
22
|
+
export type ConflictKind =
|
|
23
|
+
| 'cold-start-hub-wins'
|
|
24
|
+
| 'cold-start-diverged'
|
|
25
|
+
| 'git-pull'
|
|
26
|
+
| 'body-rejected';
|
|
22
27
|
|
|
23
28
|
export interface SyncConflict {
|
|
24
29
|
slug: string;
|
|
@@ -32,6 +37,8 @@ export interface SyncConflict {
|
|
|
32
37
|
/** DDR-102 fail-closed (F1) — the local snapshot didn't land, so a hub-wins
|
|
33
38
|
* overwrite was refused (local kept). Surfaces the degraded `_history/` write. */
|
|
34
39
|
snapshotFailed?: boolean;
|
|
40
|
+
/** #121 — source refused before materializing or importing. */
|
|
41
|
+
reason?: 'invalid-source' | 'local-edit' | 'history-failed' | 'merge-budget';
|
|
35
42
|
}
|
|
36
43
|
|
|
37
44
|
export interface SyncStatusPayload extends SyncStatusSnapshot {
|
|
@@ -41,6 +48,11 @@ export interface SyncStatusPayload extends SyncStatusSnapshot {
|
|
|
41
48
|
canvases: number;
|
|
42
49
|
/** Recent conflict notifications (most-recent-last, capped). */
|
|
43
50
|
conflicts: SyncConflict[];
|
|
51
|
+
/**
|
|
52
|
+
* When the ConnectionMonitor last spoke, as distinct from when this payload
|
|
53
|
+
* was built (`updatedAt`). Additive — see the note in `payload()`.
|
|
54
|
+
*/
|
|
55
|
+
connectionUpdatedAt?: number;
|
|
44
56
|
/**
|
|
45
57
|
* Phase 9.2 (DDR-064) — true when the unified single-shared-doc model is
|
|
46
58
|
* active (MAUDE_SHARED_DOC). Lets `maude design status` + the browser banner
|
|
@@ -69,6 +81,28 @@ export interface SyncStatusPayload extends SyncStatusSnapshot {
|
|
|
69
81
|
* panel and keeps a machine-local dismiss ack keyed on (id, hub url).
|
|
70
82
|
*/
|
|
71
83
|
notices?: SyncNotice[];
|
|
84
|
+
/**
|
|
85
|
+
* Plan T29 — accepted revisions: what a person is waiting on. Additive;
|
|
86
|
+
* absent until the project saves through accepted revisions.
|
|
87
|
+
*/
|
|
88
|
+
accepted?: AcceptedSaveStatus;
|
|
89
|
+
/**
|
|
90
|
+
* Plan T29 — cold open: ms from the runtime's start until every canvas was
|
|
91
|
+
* in step, and until the file plane first converged (media complete).
|
|
92
|
+
* Additive; each appears once it happens.
|
|
93
|
+
*/
|
|
94
|
+
coldOpen?: { canvasesMs?: number; filesMs?: number };
|
|
95
|
+
/** Plan T29 — the newest accepted revision this checkout has written (vs the hub's head). */
|
|
96
|
+
appliedRevision?: number;
|
|
97
|
+
/** Plan T16 — an AI action open or held (unfinished). Absent when none. */
|
|
98
|
+
aiAction?: { state: 'open' | 'held'; label: string; canvases: string[]; since: number };
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export interface AcceptedSaveStatus {
|
|
102
|
+
pending: number;
|
|
103
|
+
oldestPendingAt: number | null;
|
|
104
|
+
ackMs: { last: number | null; p95: number | null; n: number };
|
|
105
|
+
rejected: number;
|
|
72
106
|
}
|
|
73
107
|
|
|
74
108
|
export interface SyncNotice {
|
|
@@ -112,6 +146,25 @@ export interface FilePlaneStatus {
|
|
|
112
146
|
/** One sentence, in the user's terms, about what is waiting and why. */
|
|
113
147
|
detail: string;
|
|
114
148
|
}[];
|
|
149
|
+
/**
|
|
150
|
+
* Files this lane could NOT move on the last pass — issue #109.
|
|
151
|
+
*
|
|
152
|
+
* `held` covers the breakers, which are deliberate refusals this machine
|
|
153
|
+
* made. This covers the other half: a transfer the hub refused, or a write
|
|
154
|
+
* that failed. It had no field at all, so ~200 refused assets rendered as a
|
|
155
|
+
* status bar reading `synced` and a person seeing broken images with no
|
|
156
|
+
* cause anywhere but a terminal they never open. Same disease `held` was
|
|
157
|
+
* added to cure, one lane over.
|
|
158
|
+
*/
|
|
159
|
+
failed?: number;
|
|
160
|
+
/**
|
|
161
|
+
* The hub asked us to slow down and the WHOLE LANE is paused until `until`.
|
|
162
|
+
*
|
|
163
|
+
* Distinguished from `failed` because the answer is different: nothing is
|
|
164
|
+
* wrong, nothing is lost, and there is nothing to do but wait — which is
|
|
165
|
+
* exactly what a person cannot infer from a count of failures.
|
|
166
|
+
*/
|
|
167
|
+
rateLimited?: { until: number; waiting: number };
|
|
115
168
|
/**
|
|
116
169
|
* THE DORUČENKA (DDR-226 §7) — per-path delivery state.
|
|
117
170
|
*
|
|
@@ -126,6 +179,26 @@ export interface FilePlaneStatus {
|
|
|
126
179
|
* as the thing to disagree with.
|
|
127
180
|
*/
|
|
128
181
|
delivery?: Record<string, string>;
|
|
182
|
+
/**
|
|
183
|
+
* How many delivery rows were dropped from `delivery` by its cap.
|
|
184
|
+
*
|
|
185
|
+
* The map used to be unbounded — one entry per ledger row, so 2 961 keys for
|
|
186
|
+
* a real project, re-serialized into `_sync.json` AND broadcast over the
|
|
187
|
+
* WebSocket on EVERY status change, including 200 ms-throttled asset-progress
|
|
188
|
+
* emits. Same bounding shape `items`/`itemsTruncated` already uses.
|
|
189
|
+
*/
|
|
190
|
+
deliveryTruncated?: number;
|
|
191
|
+
/**
|
|
192
|
+
* THE DENOMINATOR (feature-large-project-seed).
|
|
193
|
+
*
|
|
194
|
+
* Derived from the LEDGER rather than from per-pass results — see
|
|
195
|
+
* `seed-progress.ts` for why the per-pass counters read zero for twenty
|
|
196
|
+
* minutes while 2 961 rows changed underneath them. The raw counters above
|
|
197
|
+
* stay beside it deliberately: a panel derived from the same source it
|
|
198
|
+
* displays cannot be cross-checked, and DDR-214's lesson is that a status
|
|
199
|
+
* surface has to be falsifiable.
|
|
200
|
+
*/
|
|
201
|
+
progress?: SeedProgress;
|
|
129
202
|
}
|
|
130
203
|
|
|
131
204
|
export interface SyncStatusStoreOptions {
|
|
@@ -139,6 +212,8 @@ export interface SyncStatusStoreOptions {
|
|
|
139
212
|
broadcast?: (payload: SyncStatusPayload) => void;
|
|
140
213
|
/** Max conflict notifications retained. Default 20. */
|
|
141
214
|
maxConflicts?: number;
|
|
215
|
+
/** Floor between two writes/broadcasts. 0 disables coalescing (tests). */
|
|
216
|
+
flushIntervalMs?: number;
|
|
142
217
|
now?: () => number;
|
|
143
218
|
}
|
|
144
219
|
|
|
@@ -154,19 +229,35 @@ export interface SyncStatusStore {
|
|
|
154
229
|
/** feature-sync-file-plane — merge Plane B counts + persist + broadcast.
|
|
155
230
|
* Same reasoning as `updateAssets`: a lane, not a connection. */
|
|
156
231
|
updateFiles(files: FilePlaneStatus): void;
|
|
232
|
+
/** Plan T29 — accepted-revisions save counters. */
|
|
233
|
+
updateAccepted(next: AcceptedSaveStatus): void;
|
|
234
|
+
/** Plan T29 — the newest accepted revision written to this checkout. */
|
|
235
|
+
noteAppliedRevision(revision: number): void;
|
|
236
|
+
/** Plan T16 — the AI action stage (null clears it). */
|
|
237
|
+
updateAiAction(next: SyncStatusPayload['aiAction'] | null): void;
|
|
157
238
|
/** Record a consent-class notice (A7) + persist + broadcast. Idempotent by
|
|
158
239
|
* `id` — the notice sites fire once per boot, and a repeat is a no-op
|
|
159
240
|
* rather than a duplicate row. */
|
|
160
241
|
notice(notice: Omit<SyncNotice, 'at'>): void;
|
|
242
|
+
/** Remove a resolved source-sync warning; consent notices are untouched. */
|
|
243
|
+
clearSourceConflict(slug: string): void;
|
|
161
244
|
/** Current payload (defensive copy). */
|
|
162
245
|
get(): SyncStatusPayload;
|
|
163
246
|
}
|
|
164
247
|
|
|
165
248
|
const DEFAULT_MAX_CONFLICTS = 20;
|
|
166
249
|
|
|
250
|
+
/** Floor between two status writes/broadcasts. Matches `asset-push.ts`'s own
|
|
251
|
+
* `PROGRESS_INTERVAL_MS` — the lane that emits fastest sets the pace. */
|
|
252
|
+
export const STATUS_FLUSH_MS = 200;
|
|
253
|
+
|
|
254
|
+
/** Delivery rows one payload carries, actionable-first. See `deliveryTruncated`. */
|
|
255
|
+
export const MAX_DELIVERY_ROWS = 300;
|
|
256
|
+
|
|
167
257
|
export function createSyncStatusStore(opts: SyncStatusStoreOptions): SyncStatusStore {
|
|
168
258
|
const now = opts.now ?? Date.now;
|
|
169
259
|
const maxConflicts = opts.maxConflicts ?? DEFAULT_MAX_CONFLICTS;
|
|
260
|
+
const flushIntervalMs = opts.flushIntervalMs ?? STATUS_FLUSH_MS;
|
|
170
261
|
const conflicts: SyncConflict[] = [];
|
|
171
262
|
|
|
172
263
|
let snapshot: SyncStatusSnapshot = {
|
|
@@ -183,22 +274,61 @@ export function createSyncStatusStore(opts: SyncStatusStoreOptions): SyncStatusS
|
|
|
183
274
|
|
|
184
275
|
let assets: AssetPushProgress | undefined;
|
|
185
276
|
let files: FilePlaneStatus | undefined;
|
|
277
|
+
let accepted: AcceptedSaveStatus | undefined;
|
|
278
|
+
let aiAction: SyncStatusPayload['aiAction'] | undefined;
|
|
279
|
+
const bootAt = now();
|
|
280
|
+
const coldOpen: { canvasesMs?: number; filesMs?: number } = {};
|
|
281
|
+
let appliedRevision: number | undefined;
|
|
186
282
|
const notices: SyncNotice[] = [];
|
|
187
283
|
|
|
188
284
|
function payload(): SyncStatusPayload {
|
|
189
285
|
return {
|
|
190
286
|
...snapshot,
|
|
287
|
+
// WHEN THIS PAYLOAD WAS BUILT, not when the connection monitor last
|
|
288
|
+
// spoke. `updatedAt` arrived here by spreading the monitor's snapshot,
|
|
289
|
+
// which only `update()` refreshes — so `updateFiles()` and
|
|
290
|
+
// `updateAssets()` flushed payloads carrying a stale timestamp ABOUT
|
|
291
|
+
// THEMSELVES. Measured at 130 s stale against a ledger that was current
|
|
292
|
+
// to within a second, on a file being rewritten continuously. A
|
|
293
|
+
// freshness stamp that lies is worse than none: it is what a person (and
|
|
294
|
+
// `maude design status`) uses to decide whether sync is alive at all.
|
|
295
|
+
updatedAt: now(),
|
|
296
|
+
// The monitor's own stamp, preserved under a name that says what it is,
|
|
297
|
+
// so nothing that depended on the old meaning silently changes meaning.
|
|
298
|
+
connectionUpdatedAt: snapshot.updatedAt,
|
|
191
299
|
url: opts.url,
|
|
192
300
|
canvases: opts.canvases,
|
|
193
301
|
conflicts: conflicts.slice(),
|
|
194
302
|
...(opts.sharedDoc ? { sharedDoc: true } : {}),
|
|
195
303
|
...(assets ? { assets } : {}),
|
|
196
304
|
...(files ? { files } : {}),
|
|
305
|
+
...(accepted ? { accepted } : {}),
|
|
306
|
+
...(aiAction ? { aiAction } : {}),
|
|
307
|
+
...(coldOpen.canvasesMs !== undefined || coldOpen.filesMs !== undefined
|
|
308
|
+
? { coldOpen: { ...coldOpen } }
|
|
309
|
+
: {}),
|
|
310
|
+
...(appliedRevision !== undefined ? { appliedRevision } : {}),
|
|
197
311
|
...(notices.length ? { notices: notices.slice() } : {}),
|
|
198
312
|
};
|
|
199
313
|
}
|
|
200
314
|
|
|
201
|
-
|
|
315
|
+
/**
|
|
316
|
+
* Write + broadcast, COALESCED.
|
|
317
|
+
*
|
|
318
|
+
* Every emit used to re-serialize the whole payload — including an unbounded
|
|
319
|
+
* per-path delivery map — to disk and to every open tab. During a seed the
|
|
320
|
+
* asset lane alone emits every 200 ms, and the file lane emits per pass, so
|
|
321
|
+
* the cost was paid continuously for a payload nobody could read that fast.
|
|
322
|
+
*
|
|
323
|
+
* `immediate` is not an optimisation escape hatch: conflicts, notices and
|
|
324
|
+
* terminal transitions are the events a person is waiting on, and delaying
|
|
325
|
+
* those by even a debounce window is the class of lie this file exists to
|
|
326
|
+
* avoid.
|
|
327
|
+
*/
|
|
328
|
+
let flushTimer: ReturnType<typeof setTimeout> | null = null;
|
|
329
|
+
let pendingFlush = false;
|
|
330
|
+
|
|
331
|
+
function emit(): void {
|
|
202
332
|
const p = payload();
|
|
203
333
|
try {
|
|
204
334
|
opts.write(p);
|
|
@@ -212,28 +342,93 @@ export function createSyncStatusStore(opts: SyncStatusStoreOptions): SyncStatusS
|
|
|
212
342
|
}
|
|
213
343
|
}
|
|
214
344
|
|
|
345
|
+
function flush(immediate = false): void {
|
|
346
|
+
if (flushIntervalMs <= 0) {
|
|
347
|
+
emit();
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
if (!immediate && flushTimer !== null) {
|
|
351
|
+
pendingFlush = true;
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
// An immediate flush jumps the queue but still OPENS the window — without
|
|
355
|
+
// that, every urgent write was followed by a free un-coalesced one, so a
|
|
356
|
+
// conflict during a seed re-admitted the whole burst it was jumping ahead of.
|
|
357
|
+
if (flushTimer !== null) {
|
|
358
|
+
clearTimeout(flushTimer);
|
|
359
|
+
flushTimer = null;
|
|
360
|
+
}
|
|
361
|
+
pendingFlush = false;
|
|
362
|
+
emit();
|
|
363
|
+
flushTimer = setTimeout(() => {
|
|
364
|
+
flushTimer = null;
|
|
365
|
+
// Only if something arrived while we were waiting — an idle store must
|
|
366
|
+
// not keep a timer alive forever.
|
|
367
|
+
if (pendingFlush) {
|
|
368
|
+
pendingFlush = false;
|
|
369
|
+
flush();
|
|
370
|
+
}
|
|
371
|
+
}, flushIntervalMs);
|
|
372
|
+
flushTimer.unref?.();
|
|
373
|
+
}
|
|
374
|
+
|
|
215
375
|
return {
|
|
216
376
|
update(next) {
|
|
377
|
+
const changed = snapshot.state !== next.state;
|
|
217
378
|
snapshot = next;
|
|
218
|
-
|
|
379
|
+
const d = next.docs;
|
|
380
|
+
if (coldOpen.canvasesMs === undefined && d && d.synced > 0 && d.pending === 0) {
|
|
381
|
+
coldOpen.canvasesMs = now() - bootAt;
|
|
382
|
+
}
|
|
383
|
+
// A connection state CHANGE is the headline; a heartbeat is not.
|
|
384
|
+
flush(changed);
|
|
219
385
|
},
|
|
220
386
|
addConflict(conflict) {
|
|
221
387
|
conflicts.push({ ...conflict, at: now() });
|
|
222
388
|
if (conflicts.length > maxConflicts) conflicts.splice(0, conflicts.length - maxConflicts);
|
|
223
|
-
flush();
|
|
389
|
+
flush(true);
|
|
224
390
|
},
|
|
225
391
|
updateAssets(progress) {
|
|
226
392
|
assets = progress;
|
|
227
393
|
flush();
|
|
228
394
|
},
|
|
395
|
+
noteAppliedRevision(revision) {
|
|
396
|
+
if (appliedRevision !== undefined && revision <= appliedRevision) return;
|
|
397
|
+
appliedRevision = revision;
|
|
398
|
+
flush();
|
|
399
|
+
},
|
|
400
|
+
updateAiAction(next) {
|
|
401
|
+
aiAction = next ?? undefined;
|
|
402
|
+
flush(true);
|
|
403
|
+
},
|
|
404
|
+
updateAccepted(next) {
|
|
405
|
+
const was = accepted;
|
|
406
|
+
accepted = next;
|
|
407
|
+
// Going from waiting to caught-up (or back) is news; a latency tick is not.
|
|
408
|
+
flush(
|
|
409
|
+
((was?.pending ?? 0) === 0) !== (next.pending === 0) || next.rejected !== was?.rejected
|
|
410
|
+
);
|
|
411
|
+
},
|
|
229
412
|
updateFiles(next) {
|
|
230
413
|
files = next;
|
|
231
|
-
|
|
414
|
+
if (coldOpen.filesMs === undefined && next.progress?.phase === 'converged') {
|
|
415
|
+
coldOpen.filesMs = now() - bootAt;
|
|
416
|
+
}
|
|
417
|
+
// A finished or stalled seed is what a person is waiting to see; a
|
|
418
|
+
// mid-seed tick is not.
|
|
419
|
+
flush(next.progress?.phase === 'converged' || next.progress?.phase === 'blocked');
|
|
232
420
|
},
|
|
233
421
|
notice(next) {
|
|
234
422
|
if (notices.some((n) => n.id === next.id)) return;
|
|
235
423
|
notices.push({ ...next, at: now() });
|
|
236
|
-
flush();
|
|
424
|
+
flush(true);
|
|
425
|
+
},
|
|
426
|
+
clearSourceConflict(slug) {
|
|
427
|
+
const id = `source-conflict-${slug}`;
|
|
428
|
+
const index = notices.findIndex((n) => n.id === id);
|
|
429
|
+
if (index < 0) return;
|
|
430
|
+
notices.splice(index, 1);
|
|
431
|
+
flush(true);
|
|
237
432
|
},
|
|
238
433
|
get: payload,
|
|
239
434
|
};
|