@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,6 +14,9 @@
|
|
|
14
14
|
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
15
15
|
|
|
16
16
|
import { safeDetail, safeName, syncPresentation } from '../../sync/presentation.ts';
|
|
17
|
+
import { TeamProjectsDialog } from './TeamProjects.jsx';
|
|
18
|
+
import SourceConflictPanel from './SourceConflictPanel.jsx';
|
|
19
|
+
import { isNativeApp } from '../github.js';
|
|
17
20
|
|
|
18
21
|
/**
|
|
19
22
|
* How long Resync stays disabled after a cycle finishes.
|
|
@@ -98,6 +101,39 @@ function readFiles(raw) {
|
|
|
98
101
|
return raw;
|
|
99
102
|
}
|
|
100
103
|
|
|
104
|
+
/**
|
|
105
|
+
* The seed progress model, or null when absent/untrustworthy.
|
|
106
|
+
*
|
|
107
|
+
* Absent is the norm on an older dev-server, and this panel must render
|
|
108
|
+
* exactly as it did before when it is — every field here is additive.
|
|
109
|
+
*/
|
|
110
|
+
function readProgress(raw) {
|
|
111
|
+
if (!raw || typeof raw !== 'object') return null;
|
|
112
|
+
if (![raw.tracked, raw.delivered, raw.remaining].every(isCount)) return null;
|
|
113
|
+
if (typeof raw.phase !== 'string') return null;
|
|
114
|
+
const blocked = Array.isArray(raw.blocked)
|
|
115
|
+
? raw.blocked.filter((b) => b && typeof b.class === 'string' && isCount(b.count))
|
|
116
|
+
: [];
|
|
117
|
+
return { ...raw, blocked };
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/** One sentence per phase, in the user's terms — never the machine's. */
|
|
121
|
+
const PHASE_TEXT = {
|
|
122
|
+
scanning: 'Looking through the project…',
|
|
123
|
+
seeding: null, // the counts say it better than a sentence would
|
|
124
|
+
paused: 'Paused — nothing is lost; this resumes by itself.',
|
|
125
|
+
blocked: 'Nothing is moving on its own — the files below need a decision.',
|
|
126
|
+
converged: 'Everything is up to date.',
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
/** What each wall means, and what a person can do about it. */
|
|
130
|
+
const BLOCKED_TEXT = {
|
|
131
|
+
'too-large': 'too big for this workspace',
|
|
132
|
+
quota: "this hour's upload allowance is used up",
|
|
133
|
+
unreachable: 'the workspace could not be reached',
|
|
134
|
+
refused: 'the workspace would not take them',
|
|
135
|
+
};
|
|
136
|
+
|
|
101
137
|
/** Consent-class notices (feature-before-first-external-users Task 1), or []
|
|
102
138
|
* when the shape can't be trusted. Absent is the norm — the payload carries
|
|
103
139
|
* `notices` only when a boot raised one (shared-doc ON, TSX bodies). */
|
|
@@ -226,6 +262,50 @@ export default function SyncPanel({
|
|
|
226
262
|
onClose,
|
|
227
263
|
}) {
|
|
228
264
|
const p = syncPresentation(status, { project });
|
|
265
|
+
// Plan T20/T22 — a refused workspace on the desktop is usually a sign-in that
|
|
266
|
+
// ran out. Signing in again re-mints the credential and reopens the same copy.
|
|
267
|
+
const [signInAgain, setSignInAgain] = useState(false);
|
|
268
|
+
// Plan T19 — "Download everything for offline".
|
|
269
|
+
const [offline, setOffline] = useState('');
|
|
270
|
+
const [offlineBusy, setOfflineBusy] = useState(false);
|
|
271
|
+
async function prepareOffline() {
|
|
272
|
+
setOfflineBusy(true);
|
|
273
|
+
setOffline('');
|
|
274
|
+
try {
|
|
275
|
+
const r = await fetch('/_api/sync/offline', { method: 'POST' });
|
|
276
|
+
const j = await r.json().catch(() => ({}));
|
|
277
|
+
if (!j.ok) setOffline(j.error || 'Could not download the project right now.');
|
|
278
|
+
else if (j.complete) setOffline(`Everything is on this device${j.pulled ? ` — ${j.pulled} file${j.pulled === 1 ? '' : 's'} came down` : ''}.`);
|
|
279
|
+
else setOffline(`${j.pulled} file${j.pulled === 1 ? '' : 's'} came down; ${j.failed} still to come — Maude keeps trying.`);
|
|
280
|
+
} catch {
|
|
281
|
+
setOffline('Maude isn’t reachable right now.');
|
|
282
|
+
} finally {
|
|
283
|
+
setOfflineBusy(false);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
// Plan T28 — the conflict being resolved (a canvas slug), or null.
|
|
287
|
+
const [resolving, setResolving] = useState(null);
|
|
288
|
+
// Plan T16 — the person's decision on an unfinished AI edit.
|
|
289
|
+
const [aiBusy, setAiBusy] = useState('');
|
|
290
|
+
const [aiNote, setAiNote] = useState('');
|
|
291
|
+
const aiHeld = status?.aiAction?.state === 'held' ? status.aiAction : null;
|
|
292
|
+
async function resolveAi(choice) {
|
|
293
|
+
setAiBusy(choice);
|
|
294
|
+
setAiNote('');
|
|
295
|
+
try {
|
|
296
|
+
const r = await fetch('/_api/project/ai-action', {
|
|
297
|
+
method: 'POST',
|
|
298
|
+
headers: { 'Content-Type': 'application/json' },
|
|
299
|
+
body: JSON.stringify({ choice }),
|
|
300
|
+
});
|
|
301
|
+
const j = await r.json().catch(() => ({}));
|
|
302
|
+
if (!j.ok) setAiNote(j.error || (j.code ? `The project refused it (${j.code}).` : 'That did not work.'));
|
|
303
|
+
} catch {
|
|
304
|
+
setAiNote('Maude isn’t reachable right now.');
|
|
305
|
+
} finally {
|
|
306
|
+
setAiBusy('');
|
|
307
|
+
}
|
|
308
|
+
}
|
|
229
309
|
const [resyncing, setResyncing] = useState(false);
|
|
230
310
|
const [cooling, setCooling] = useState(false);
|
|
231
311
|
const [note, setNote] = useState('');
|
|
@@ -279,6 +359,7 @@ export default function SyncPanel({
|
|
|
279
359
|
const files = readFiles(status?.files);
|
|
280
360
|
|
|
281
361
|
const delivery = useMemo(() => readDelivery(status?.files?.delivery), [status?.files?.delivery]);
|
|
362
|
+
const progress = useMemo(() => readProgress(status?.files?.progress), [status?.files?.progress]);
|
|
282
363
|
|
|
283
364
|
// Sync settings (Task 2) — fetched once on mount; `settings` stays null when
|
|
284
365
|
// no hub is linked, which is also the render gate for the whole section.
|
|
@@ -496,6 +577,18 @@ export default function SyncPanel({
|
|
|
496
577
|
continuous now, so nobody needs this button to pick up a new
|
|
497
578
|
canvas — it is a repair tool, and repairing a cell is the hub's
|
|
498
579
|
job. See `.ai/logs/rca/issue-cloud-assets-open-findings.md` §5. */}
|
|
580
|
+
{!cloud && status?.files && (
|
|
581
|
+
<button
|
|
582
|
+
type="button"
|
|
583
|
+
className="sp-resync"
|
|
584
|
+
data-testid="sync-offline"
|
|
585
|
+
onClick={prepareOffline}
|
|
586
|
+
disabled={offlineBusy}
|
|
587
|
+
title="Download every file of the project to this device now, to work offline"
|
|
588
|
+
>
|
|
589
|
+
{offlineBusy ? 'Downloading…' : 'Download all'}
|
|
590
|
+
</button>
|
|
591
|
+
)}
|
|
499
592
|
{!cloud && (
|
|
500
593
|
<button
|
|
501
594
|
type="button"
|
|
@@ -517,6 +610,11 @@ export default function SyncPanel({
|
|
|
517
610
|
{safeDetail(note, '')}
|
|
518
611
|
</div>
|
|
519
612
|
)}
|
|
613
|
+
{offline && (
|
|
614
|
+
<div className="sp-resync-note" role="status" aria-live="polite" data-testid="sync-offline-note">
|
|
615
|
+
{safeDetail(offline, '')}
|
|
616
|
+
</div>
|
|
617
|
+
)}
|
|
520
618
|
{/* The one-rule sentence, live — same aria pattern as the rail note:
|
|
521
619
|
a polite announcement when the phase changes, never a focus steal. */}
|
|
522
620
|
{p && (
|
|
@@ -526,8 +624,26 @@ export default function SyncPanel({
|
|
|
526
624
|
{p.title}
|
|
527
625
|
{p.next ? ` ${p.next}` : ''}
|
|
528
626
|
</span>
|
|
627
|
+
{p.phase === 'refused' && !cloud && isNativeApp() && (
|
|
628
|
+
<button
|
|
629
|
+
type="button"
|
|
630
|
+
className="btn btn--sm"
|
|
631
|
+
data-testid="sync-signin-again"
|
|
632
|
+
onClick={() => setSignInAgain(true)}
|
|
633
|
+
>
|
|
634
|
+
Sign in again
|
|
635
|
+
</button>
|
|
636
|
+
)}
|
|
529
637
|
</div>
|
|
530
638
|
)}
|
|
639
|
+
{resolving && <SourceConflictPanel slug={resolving} onClose={() => setResolving(null)} />}
|
|
640
|
+
{signInAgain && (
|
|
641
|
+
<TeamProjectsDialog
|
|
642
|
+
title="Sign in again"
|
|
643
|
+
initialServer={typeof status?.url === 'string' ? status.url : ''}
|
|
644
|
+
onClose={() => setSignInAgain(false)}
|
|
645
|
+
/>
|
|
646
|
+
)}
|
|
531
647
|
</div>
|
|
532
648
|
|
|
533
649
|
<div className="sp-body">
|
|
@@ -535,11 +651,42 @@ export default function SyncPanel({
|
|
|
535
651
|
(shared-doc buffer, TSX bodies) and used to live only in a
|
|
536
652
|
console.warn a desktop user never sees. Dismiss is per (notice,
|
|
537
653
|
hub) on this machine — a new hub resurfaces them by design. */}
|
|
654
|
+
{aiHeld && (
|
|
655
|
+
<section aria-label="Unfinished AI edit" className="sp-notice sp-ai-held" data-testid="sync-ai-held">
|
|
656
|
+
<p className="sp-notice-text">
|
|
657
|
+
<b>An unfinished AI edit is kept on this device.</b>{' '}
|
|
658
|
+
{safeDetail(aiHeld.label, 'AI edit')} changed{' '}
|
|
659
|
+
{Array.isArray(aiHeld.canvases) ? aiHeld.canvases.length : 0} canvas
|
|
660
|
+
{Array.isArray(aiHeld.canvases) && aiHeld.canvases.length === 1 ? '' : 'es'} and did not finish,
|
|
661
|
+
so nothing of it is shared yet. Publish it as it stands, or discard it — the
|
|
662
|
+
discarded bytes stay in recovery.
|
|
663
|
+
</p>
|
|
664
|
+
<div className="sp-ai-actions">
|
|
665
|
+
<button type="button" className="btn btn--sm btn--primary" disabled={!!aiBusy} onClick={() => resolveAi('publish')} data-testid="sync-ai-publish">
|
|
666
|
+
{aiBusy === 'publish' ? 'Publishing…' : 'Publish'}
|
|
667
|
+
</button>
|
|
668
|
+
<button type="button" className="btn btn--sm btn--ghost" disabled={!!aiBusy} onClick={() => resolveAi('discard')} data-testid="sync-ai-discard">
|
|
669
|
+
{aiBusy === 'discard' ? 'Discarding…' : 'Discard'}
|
|
670
|
+
</button>
|
|
671
|
+
</div>
|
|
672
|
+
{aiNote && <p className="sp-notice-text" role="alert">{safeDetail(aiNote, '')}</p>}
|
|
673
|
+
</section>
|
|
674
|
+
)}
|
|
538
675
|
{notices.length > 0 && (
|
|
539
676
|
<section aria-label="Notices" data-testid="sync-notices">
|
|
540
677
|
{notices.map((n) => (
|
|
541
678
|
<div key={n.id} className="sp-notice" data-testid={`sync-notice-${n.id}`}>
|
|
542
679
|
<p className="sp-notice-text">{safeNoticeText(n.text)}</p>
|
|
680
|
+
{n.id.startsWith('source-conflict-') && (
|
|
681
|
+
<button
|
|
682
|
+
type="button"
|
|
683
|
+
className="btn btn--sm"
|
|
684
|
+
data-testid={`sync-resolve-${n.id.slice('source-conflict-'.length)}`}
|
|
685
|
+
onClick={() => setResolving(n.id.slice('source-conflict-'.length))}
|
|
686
|
+
>
|
|
687
|
+
Resolve…
|
|
688
|
+
</button>
|
|
689
|
+
)}
|
|
543
690
|
<button
|
|
544
691
|
type="button"
|
|
545
692
|
className="sp-notice-dismiss"
|
|
@@ -648,17 +795,98 @@ export default function SyncPanel({
|
|
|
648
795
|
{files && (
|
|
649
796
|
<section aria-label="Project files" data-testid="sync-files">
|
|
650
797
|
<div className="gp-sect-label">
|
|
651
|
-
project files
|
|
652
|
-
|
|
653
|
-
<div className="sp-assets-line">
|
|
654
|
-
{`${files.synced} synced` + (files.pulled > 0 ? ` · ${files.pulled} pulled` : '')}
|
|
798
|
+
project files{' '}
|
|
799
|
+
<span className="gp-group-count">{progress ? progress.tracked : files.synced}</span>
|
|
655
800
|
</div>
|
|
801
|
+
{progress ? (
|
|
802
|
+
<>
|
|
803
|
+
<div className="sp-progress-track" data-testid="sync-files-progress">
|
|
804
|
+
<div
|
|
805
|
+
className="sp-progress-fill"
|
|
806
|
+
style={{
|
|
807
|
+
width: `${
|
|
808
|
+
progress.tracked > 0
|
|
809
|
+
? Math.min(100, Math.round((progress.delivered / progress.tracked) * 100))
|
|
810
|
+
: 100
|
|
811
|
+
}%`,
|
|
812
|
+
}}
|
|
813
|
+
/>
|
|
814
|
+
</div>
|
|
815
|
+
<div className="sp-assets-line" data-testid="sync-files-remaining">
|
|
816
|
+
{`${progress.delivered} of ${progress.tracked} delivered`}
|
|
817
|
+
{progress.remaining > 0 ? ` · ${progress.remaining} waiting` : ''}
|
|
818
|
+
</div>
|
|
819
|
+
{PHASE_TEXT[progress.phase] && (
|
|
820
|
+
<div className="sp-assets-line" data-testid="sync-files-phase">
|
|
821
|
+
{PHASE_TEXT[progress.phase]}
|
|
822
|
+
</div>
|
|
823
|
+
)}
|
|
824
|
+
{progress.passCapped && progress.remaining > 0 && (
|
|
825
|
+
<div className="sp-assets-line">
|
|
826
|
+
More is on the way — the last pass reached its limit and picks up where it
|
|
827
|
+
left off.
|
|
828
|
+
</div>
|
|
829
|
+
)}
|
|
830
|
+
{progress.blocked.map((b) => (
|
|
831
|
+
<div
|
|
832
|
+
key={b.class}
|
|
833
|
+
className="sp-assets-retry"
|
|
834
|
+
data-testid={`sync-blocked-${b.class}`}
|
|
835
|
+
>
|
|
836
|
+
{b.count} file{b.count === 1 ? '' : 's'} —{' '}
|
|
837
|
+
{BLOCKED_TEXT[b.class] ?? 'the workspace would not take them'}.
|
|
838
|
+
</div>
|
|
839
|
+
))}
|
|
840
|
+
{/*
|
|
841
|
+
THE RAW COUNTERS STAY. A panel derived from the same source it
|
|
842
|
+
displays cannot be cross-checked, and DDR-214's whole lesson is
|
|
843
|
+
that a status surface has to be falsifiable — so the numbers the
|
|
844
|
+
passes actually reported remain here to disagree with.
|
|
845
|
+
*/}
|
|
846
|
+
<div className="sp-assets-line sp-raw-counters">
|
|
847
|
+
{`raw: ${files.synced} synced`}
|
|
848
|
+
{files.pushed ? ` · ${files.pushed} pushed` : ''}
|
|
849
|
+
{files.pulled > 0 ? ` · ${files.pulled} pulled` : ''}
|
|
850
|
+
</div>
|
|
851
|
+
</>
|
|
852
|
+
) : (
|
|
853
|
+
<div className="sp-assets-line">
|
|
854
|
+
{`${files.synced} synced` + (files.pulled > 0 ? ` · ${files.pulled} pulled` : '')}
|
|
855
|
+
</div>
|
|
856
|
+
)}
|
|
656
857
|
{files.conflicts > 0 && (
|
|
657
858
|
<div className="sp-assets-retry" data-testid="sync-files-conflicts">
|
|
658
859
|
{files.conflicts} conflict{files.conflicts === 1 ? '' : 's'} — the older copies are
|
|
659
860
|
kept in Trash, below.
|
|
660
861
|
</div>
|
|
661
862
|
)}
|
|
863
|
+
{/*
|
|
864
|
+
A PAUSE IS NOT A FAILURE, and it gets its own words. The
|
|
865
|
+
workspace asked us to slow down; nothing is wrong, nothing is
|
|
866
|
+
lost, and the only correct action is to wait — which is exactly
|
|
867
|
+
what a person cannot infer from a count of failures (issue #109).
|
|
868
|
+
It comes FIRST because it explains the failure line below it.
|
|
869
|
+
*/}
|
|
870
|
+
{files.rateLimited && (
|
|
871
|
+
<div className="sp-assets-retry" data-testid="sync-files-rate-limited">
|
|
872
|
+
<strong>syncing paused for a moment.</strong> The workspace asked this machine to
|
|
873
|
+
slow down.{' '}
|
|
874
|
+
{files.rateLimited.waiting > 0
|
|
875
|
+
? `${files.rateLimited.waiting} file${files.rateLimited.waiting === 1 ? '' : 's'} still on the way — nothing is lost, they arrive when the pause lifts.`
|
|
876
|
+
: 'It resumes by itself.'}
|
|
877
|
+
</div>
|
|
878
|
+
)}
|
|
879
|
+
{/*
|
|
880
|
+
AND A FAILURE IS NOT A SYNC. This had no field at all, so a pass
|
|
881
|
+
that refused every file rendered as "N synced" and a person saw
|
|
882
|
+
broken images with the cause only in a terminal they never open.
|
|
883
|
+
*/}
|
|
884
|
+
{files.failed > 0 && !files.rateLimited && (
|
|
885
|
+
<div className="sp-assets-retry" data-testid="sync-files-failed">
|
|
886
|
+
{files.failed} file{files.failed === 1 ? '' : 's'} did not come through on the last
|
|
887
|
+
check — sync retries them by itself. The list is below.
|
|
888
|
+
</div>
|
|
889
|
+
)}
|
|
662
890
|
{/*
|
|
663
891
|
A HELD BREAKER, said out loud. These used to exist only as a
|
|
664
892
|
console.warn, which on a machine whose user never opens a
|
|
@@ -717,6 +945,12 @@ export default function SyncPanel({
|
|
|
717
945
|
</li>
|
|
718
946
|
))}
|
|
719
947
|
{delivery.fine.length > 200 && <li>…and {delivery.fine.length - 200} more</li>}
|
|
948
|
+
{files.deliveryTruncated > 0 && (
|
|
949
|
+
<li className="sp-truncated">
|
|
950
|
+
…and {files.deliveryTruncated} more not listed here — the list is capped so
|
|
951
|
+
the files that need attention always fit.
|
|
952
|
+
</li>
|
|
953
|
+
)}
|
|
720
954
|
</ul>
|
|
721
955
|
</details>
|
|
722
956
|
)}
|