@1agh/maude 0.60.5 → 0.60.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@1agh/maude",
3
- "version": "0.60.5",
3
+ "version": "0.60.6",
4
4
  "description": "Marketplace of Claude Code plugins by Michal Dovrtěl: `design` (canvas-first design iteration) + `flow` (generic agentic workflow loop with .ai second brain). Ships the `maude` CLI (with `mdcc` legacy alias) to scaffold workspace, run the design dev server, and manage configs.",
5
5
  "type": "module",
6
6
  "engines": {
@@ -54,13 +54,13 @@
54
54
  "test:e2e:desktop:parity:cloud": "pnpm --filter @maude/desktop-e2e e2e:parity:cloud"
55
55
  },
56
56
  "optionalDependencies": {
57
- "@1agh/maude-darwin-arm64": "0.60.5",
58
- "@1agh/maude-darwin-x64": "0.60.5",
59
- "@1agh/maude-linux-arm64": "0.60.5",
60
- "@1agh/maude-linux-arm64-musl": "0.60.5",
61
- "@1agh/maude-linux-x64": "0.60.5",
62
- "@1agh/maude-linux-x64-musl": "0.60.5",
63
- "@1agh/maude-win32-x64": "0.60.5"
57
+ "@1agh/maude-darwin-arm64": "0.60.6",
58
+ "@1agh/maude-darwin-x64": "0.60.6",
59
+ "@1agh/maude-linux-arm64": "0.60.6",
60
+ "@1agh/maude-linux-arm64-musl": "0.60.6",
61
+ "@1agh/maude-linux-x64": "0.60.6",
62
+ "@1agh/maude-linux-x64-musl": "0.60.6",
63
+ "@1agh/maude-win32-x64": "0.60.6"
64
64
  },
65
65
  "files": [
66
66
  "cli",
@@ -463,6 +463,37 @@
463
463
  .catch(() => {
464
464
  /* network blip — next interaction will retry */
465
465
  });
466
+ } else if (msg.mode === 'asset') {
467
+ // 2026-08-15 annotations-assets RCA — a synced-down media file
468
+ // just landed on disk. Any <img> / SVG <image> that already
469
+ // 404'd on it shows the broken glyph FOREVER (browsers never
470
+ // retry a failed load), so the heal was invisible: the bytes
471
+ // arrived, the canvas stayed broken until a manual reload.
472
+ // Re-point matching, still-broken elements at a cache-busted
473
+ // URL — no reload, no React state loss. A later React render
474
+ // restoring the clean URL refetches it fresh (the file exists
475
+ // now), so both URLs converge on the good bytes.
476
+ const assetName = (msg.file || '').split('/').pop();
477
+ if (!assetName) return;
478
+ const v = msg.version || Date.now();
479
+ const nameMatches = function (u) {
480
+ if (!u) return false;
481
+ return u.indexOf(assetName) !== -1 || u.indexOf(encodeURIComponent(assetName)) !== -1;
482
+ };
483
+ for (const img of document.querySelectorAll('img')) {
484
+ const src = img.getAttribute('src');
485
+ if (!nameMatches(src)) continue;
486
+ // Already rendering fine — don't churn a working image.
487
+ if (img.complete && img.naturalWidth > 0) continue;
488
+ img.setAttribute('src', src.split('?')[0] + '?v=' + v);
489
+ }
490
+ for (const el of document.querySelectorAll('image')) {
491
+ const href = el.getAttribute('href') || el.getAttribute('xlink:href');
492
+ if (!nameMatches(href)) continue;
493
+ // SVG <image> exposes no broken-state flag — re-pointing a
494
+ // working one is a cheap refetch of now-cached bytes.
495
+ el.setAttribute('href', href.split('?')[0] + '?v=' + v);
496
+ }
466
497
  }
467
498
  } catch (e) {
468
499
  console.warn('[canvas-shell] HMR message parse error', e);