@mindexec/cli 0.2.102 → 0.2.103

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.
Files changed (19) hide show
  1. package/package.json +2 -2
  2. package/remote-hub.js +51 -2
  3. package/scripts/remote-hub-smoke.mjs +8 -0
  4. package/wwwroot/_content/MindExecution.Shared/js/mind-map-css3d-manager.js +44 -2
  5. package/wwwroot/_framework/MindExecution.Core.fc9cjbjplq.dll +0 -0
  6. package/wwwroot/_framework/{MindExecution.Kernel.7k773jan4j.dll → MindExecution.Kernel.pbzp3jfync.dll} +0 -0
  7. package/wwwroot/_framework/{MindExecution.Plugins.Admin.nr5ioavpvn.dll → MindExecution.Plugins.Admin.gxzwlji1cf.dll} +0 -0
  8. package/wwwroot/_framework/{MindExecution.Plugins.Business.qq63kom73x.dll → MindExecution.Plugins.Business.vtaey8c59y.dll} +0 -0
  9. package/wwwroot/_framework/{MindExecution.Plugins.Concept.za4g3ep0s3.dll → MindExecution.Plugins.Concept.ksc3wkuptm.dll} +0 -0
  10. package/wwwroot/_framework/{MindExecution.Plugins.Directory.u6p6pxpwxp.dll → MindExecution.Plugins.Directory.zc8ffaoknd.dll} +0 -0
  11. package/wwwroot/_framework/{MindExecution.Plugins.PlanMaster.dybjnpy716.dll → MindExecution.Plugins.PlanMaster.flzcb87jvl.dll} +0 -0
  12. package/wwwroot/_framework/{MindExecution.Plugins.YouTube.77htf13h5q.dll → MindExecution.Plugins.YouTube.q4tvods1po.dll} +0 -0
  13. package/wwwroot/_framework/{MindExecution.Shared.d74ehlrxzm.dll → MindExecution.Shared.jv6r2n1bvg.dll} +0 -0
  14. package/wwwroot/_framework/{MindExecution.Web.0bxjy0fhk2.dll → MindExecution.Web.3b8az6ed0q.dll} +0 -0
  15. package/wwwroot/_framework/blazor.boot.json +21 -21
  16. package/wwwroot/index.html +3 -3
  17. package/wwwroot/service-worker-assets.js +24 -24
  18. package/wwwroot/service-worker.js +1 -1
  19. package/wwwroot/_framework/MindExecution.Core.cdplo34sb2.dll +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mindexec/cli",
3
- "version": "0.2.102",
3
+ "version": "0.2.103",
4
4
  "description": "MindExec local runtime and bridge CLI",
5
5
  "main": "server.js",
6
6
  "type": "module",
@@ -47,7 +47,7 @@
47
47
  "node": ">=20"
48
48
  },
49
49
  "dependencies": {
50
- "@mindexec/remote": "^0.1.15",
50
+ "@mindexec/remote": "^0.1.16",
51
51
  "@openai/codex-sdk": "^0.137.0",
52
52
  "chokidar": "^3.6.0",
53
53
  "cors": "^2.8.5",
package/remote-hub.js CHANGED
@@ -20,6 +20,7 @@ const MAX_SYNTHETIC_DEVICES = 1000;
20
20
  const DEFAULT_HOST_TARGET_LEASE_MS = 30000;
21
21
  const SYNTHETIC_FRAME_DATA_URL = 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAABCAYAAAD0In+KAAAADElEQVR42mP8z8AAAAMBAQDJ/pLvAAAAAElFTkSuQmCC';
22
22
  const SYNTHETIC_FRAME_PAYLOAD = Buffer.from(SYNTHETIC_FRAME_DATA_URL.split(',')[1], 'base64');
23
+ const SYNTHETIC_FRAME_HASH = crypto.createHash('sha256').update(SYNTHETIC_FRAME_PAYLOAD).digest('hex').slice(0, 16);
23
24
 
24
25
  function isEnabledValue(value, fallback = true) {
25
26
  if (value === undefined || value === null || value === '') {
@@ -785,6 +786,9 @@ export function createRemoteHub(options = {}) {
785
786
  receivedAt: now,
786
787
  byteLength: 68,
787
788
  transport: 'synthetic',
789
+ contentHash: SYNTHETIC_FRAME_HASH,
790
+ captureMs: 0,
791
+ sameContentStreak: 0,
788
792
  dataUrl: SYNTHETIC_FRAME_DATA_URL,
789
793
  payload: SYNTHETIC_FRAME_PAYLOAD,
790
794
  accessToken: createFrameAccessToken()
@@ -1468,6 +1472,37 @@ export function createRemoteHub(options = {}) {
1468
1472
  return Buffer.from(base64, 'base64');
1469
1473
  }
1470
1474
 
1475
+ function buildFrameContentHash(message, payload) {
1476
+ const provided = safeString(message.contentHash || message.frameHash || message.hash, 96)
1477
+ .toLowerCase()
1478
+ .replace(/[^a-z0-9:_-]/g, '')
1479
+ .slice(0, 64);
1480
+ if (provided) {
1481
+ return provided;
1482
+ }
1483
+
1484
+ if (!Buffer.isBuffer(payload) || payload.length === 0) {
1485
+ return '';
1486
+ }
1487
+
1488
+ return crypto.createHash('sha256').update(payload).digest('hex').slice(0, 16);
1489
+ }
1490
+
1491
+ function readFrameCaptureMs(message) {
1492
+ const value = Number(message.captureMs);
1493
+ return Number.isFinite(value) && value >= 0
1494
+ ? Math.round(value)
1495
+ : 0;
1496
+ }
1497
+
1498
+ function computeSameContentStreak(previousFrame, contentHash) {
1499
+ if (!contentHash || !previousFrame?.contentHash || previousFrame.contentHash !== contentHash) {
1500
+ return 0;
1501
+ }
1502
+
1503
+ return clampNumber(Number(previousFrame.sameContentStreak || 0) + 1, 0, 1000000, 1);
1504
+ }
1505
+
1471
1506
  function applyThumbnailFrame(device, message, framePayload, transport = 'json-base64') {
1472
1507
  const frameData = Buffer.isBuffer(framePayload)
1473
1508
  ? ''
@@ -1489,6 +1524,8 @@ export function createRemoteHub(options = {}) {
1489
1524
  const mimeType = safeString(message.mimeType || message.format || 'image/jpeg', 80) || 'image/jpeg';
1490
1525
  const capturedAt = safeString(message.capturedAt, 80) || device.lastSeenAt;
1491
1526
  const payload = buildFramePayloadBuffer(framePayload, frameData);
1527
+ const contentHash = buildFrameContentHash(message, payload);
1528
+ const sameContentStreak = computeSameContentStreak(device.latestThumbnail, contentHash);
1492
1529
  device.latestThumbnail = {
1493
1530
  streamId: safeString(message.streamId, 128) || 'thumbnail',
1494
1531
  frameSeq,
@@ -1501,6 +1538,9 @@ export function createRemoteHub(options = {}) {
1501
1538
  receivedAt: device.lastSeenAt,
1502
1539
  byteLength,
1503
1540
  transport,
1541
+ contentHash,
1542
+ captureMs: readFrameCaptureMs(message),
1543
+ sameContentStreak,
1504
1544
  dataUrl: buildFrameDataUrl(framePayload, frameData, mimeType),
1505
1545
  payload,
1506
1546
  accessToken: createFrameAccessToken()
@@ -1511,7 +1551,9 @@ export function createRemoteHub(options = {}) {
1511
1551
  frameSeq,
1512
1552
  width: device.latestThumbnail.width,
1513
1553
  height: device.latestThumbnail.height,
1514
- transport
1554
+ transport,
1555
+ contentHash,
1556
+ sameContentStreak
1515
1557
  });
1516
1558
  return true;
1517
1559
  }
@@ -1550,6 +1592,8 @@ export function createRemoteHub(options = {}) {
1550
1592
  const mimeType = safeString(message.mimeType || message.format || 'image/jpeg', 80) || 'image/jpeg';
1551
1593
  const capturedAt = safeString(message.capturedAt, 80) || device.lastSeenAt;
1552
1594
  const payload = buildFramePayloadBuffer(framePayload, frameData);
1595
+ const contentHash = buildFrameContentHash(message, payload);
1596
+ const sameContentStreak = computeSameContentStreak(device.latestLiveFrame, contentHash);
1553
1597
  device.latestLiveFrame = {
1554
1598
  streamId,
1555
1599
  frameSeq,
@@ -1564,6 +1608,9 @@ export function createRemoteHub(options = {}) {
1564
1608
  receivedAt: device.lastSeenAt,
1565
1609
  byteLength,
1566
1610
  transport,
1611
+ contentHash,
1612
+ captureMs: readFrameCaptureMs(message),
1613
+ sameContentStreak,
1567
1614
  dataUrl: buildFrameDataUrl(framePayload, frameData, mimeType),
1568
1615
  payload,
1569
1616
  accessToken: createFrameAccessToken()
@@ -1578,7 +1625,9 @@ export function createRemoteHub(options = {}) {
1578
1625
  width: device.latestLiveFrame.width,
1579
1626
  height: device.latestLiveFrame.height,
1580
1627
  mode: device.latestLiveFrame.mode,
1581
- transport
1628
+ transport,
1629
+ contentHash,
1630
+ sameContentStreak
1582
1631
  });
1583
1632
  return true;
1584
1633
  }
@@ -169,10 +169,14 @@ try {
169
169
  assert.equal(binaryThumbnailDevice.latestThumbnail.streamId, 'smoke-thumb-binary');
170
170
  assert.equal(binaryThumbnailDevice.latestThumbnail.transport, 'binary');
171
171
  assert.equal(binaryThumbnailDevice.latestThumbnail.byteLength, smokePngFrame.length);
172
+ assert.equal(typeof binaryThumbnailDevice.latestThumbnail.contentHash, 'string');
173
+ assert.equal(binaryThumbnailDevice.latestThumbnail.contentHash.length, 16);
174
+ assert.equal(binaryThumbnailDevice.latestThumbnail.sameContentStreak, 1);
172
175
  assert.equal(binaryThumbnailDevice.counters.thumbnailFramesReceived, 2);
173
176
  const serializedBinaryThumbnail = hub.getDeviceThumbnail('smoke-device', { includeDataUrl: false });
174
177
  assert.equal(serializedBinaryThumbnail.streamId, 'smoke-thumb-binary');
175
178
  assert.equal(serializedBinaryThumbnail.frameSeq, 4);
179
+ assert.equal(serializedBinaryThumbnail.contentHash, binaryThumbnailDevice.latestThumbnail.contentHash);
176
180
  assert.ok(serializedBinaryThumbnail.framePath.includes('/api/remote/devices/smoke-device/thumbnail?'));
177
181
  assert.ok(!('dataUrl' in serializedBinaryThumbnail));
178
182
  assert.ok(!('payload' in serializedBinaryThumbnail));
@@ -242,10 +246,14 @@ try {
242
246
  assert.equal(binaryLiveDevice.latestLiveFrame.streamId, 'smoke-live');
243
247
  assert.equal(binaryLiveDevice.latestLiveFrame.transport, 'binary');
244
248
  assert.equal(binaryLiveDevice.latestLiveFrame.byteLength, smokePngFrame.length);
249
+ assert.equal(typeof binaryLiveDevice.latestLiveFrame.contentHash, 'string');
250
+ assert.equal(binaryLiveDevice.latestLiveFrame.contentHash.length, 16);
251
+ assert.equal(binaryLiveDevice.latestLiveFrame.sameContentStreak, 1);
245
252
  assert.equal(binaryLiveDevice.counters.liveFramesReceived, 2);
246
253
  const serializedBinaryLiveFrame = hub.getDeviceLiveFrame('smoke-device', { includeDataUrl: false });
247
254
  assert.equal(serializedBinaryLiveFrame.streamId, 'smoke-live');
248
255
  assert.equal(serializedBinaryLiveFrame.frameSeq, 5);
256
+ assert.equal(serializedBinaryLiveFrame.contentHash, binaryLiveDevice.latestLiveFrame.contentHash);
249
257
  assert.ok(serializedBinaryLiveFrame.framePath.includes('/api/remote/devices/smoke-device/live/frame?'));
250
258
  assert.ok(!('dataUrl' in serializedBinaryLiveFrame));
251
259
  assert.ok(!('payload' in serializedBinaryLiveFrame));
@@ -13637,7 +13637,10 @@
13637
13637
  frameUrl: source,
13638
13638
  receivedAt: String(readRemoteFleetObjectField(frame, 'receivedAt', 'ReceivedAt', '') || '').trim(),
13639
13639
  capturedAt: String(readRemoteFleetObjectField(frame, 'capturedAt', 'CapturedAt', '') || '').trim(),
13640
- streamId: String(readRemoteFleetObjectField(frame, 'streamId', 'StreamId', '') || '').trim()
13640
+ streamId: String(readRemoteFleetObjectField(frame, 'streamId', 'StreamId', '') || '').trim(),
13641
+ contentHash: String(readRemoteFleetObjectField(frame, 'contentHash', 'ContentHash', '') || '').trim(),
13642
+ captureMs: Number(readRemoteFleetObjectField(frame, 'captureMs', 'CaptureMs', 0)) || 0,
13643
+ sameContentStreak: Number(readRemoteFleetObjectField(frame, 'sameContentStreak', 'SameContentStreak', 0)) || 0
13641
13644
  };
13642
13645
  }
13643
13646
 
@@ -13910,7 +13913,10 @@
13910
13913
  frameUrl: String(frame?.frameUrl || '').trim(),
13911
13914
  receivedAt: String(frame?.receivedAt || '').trim(),
13912
13915
  capturedAt: String(frame?.capturedAt || '').trim(),
13913
- streamId: String(frame?.streamId || '').trim()
13916
+ streamId: String(frame?.streamId || '').trim(),
13917
+ contentHash: String(frame?.contentHash || '').trim(),
13918
+ captureMs: Number(frame?.captureMs || 0) || 0,
13919
+ sameContentStreak: Number(frame?.sameContentStreak || 0) || 0
13914
13920
  };
13915
13921
  }
13916
13922
 
@@ -14002,6 +14008,9 @@
14002
14008
  preview.dataset.remoteFleetFrameSeq = String(nextSeq || 0);
14003
14009
  preview.dataset.remoteFleetFrameUrl = frame.frameUrl;
14004
14010
  preview.dataset.remoteFleetFrameAt = frame.receivedAt || frame.capturedAt || '';
14011
+ preview.dataset.remoteFleetFrameHash = frame.contentHash || '';
14012
+ preview.dataset.remoteFleetFrameCaptureMs = String(Number(frame.captureMs || 0) || 0);
14013
+ preview.dataset.remoteFleetFrameSameContentStreak = String(Number(frame.sameContentStreak || 0) || 0);
14005
14014
 
14006
14015
  const placeholder = preview.querySelector('[data-remote-fleet-screen-placeholder="true"]');
14007
14016
  if (placeholder) {
@@ -14038,6 +14047,9 @@
14038
14047
  image.dataset.remoteFleetFrameKind = frame.kind;
14039
14048
  image.dataset.remoteFleetFrameSeq = String(nextSeq || 0);
14040
14049
  image.dataset.remoteFleetFrameUrl = frame.frameUrl;
14050
+ image.dataset.remoteFleetFrameHash = frame.contentHash || '';
14051
+ image.dataset.remoteFleetFrameCaptureMs = String(Number(frame.captureMs || 0) || 0);
14052
+ image.dataset.remoteFleetFrameSameContentStreak = String(Number(frame.sameContentStreak || 0) || 0);
14041
14053
  image.loading = frame.kind === 'thumbnail' ? 'lazy' : 'eager';
14042
14054
  image.style.display = 'block';
14043
14055
  if (image.src !== frame.frameUrl) {
@@ -14238,6 +14250,36 @@
14238
14250
  }
14239
14251
 
14240
14252
  function applyRemoteFleetFramePatchToPreview(preview, frame) {
14253
+ if (String(frame?.kind || '').toLowerCase() === 'live') {
14254
+ if (!preview || !isRemoteFleetFrameNewerForPreview(preview, frame, false)) {
14255
+ return false;
14256
+ }
14257
+
14258
+ const image = ensureRemoteFleetFrameImage(preview, frame);
14259
+ if (!image) {
14260
+ return false;
14261
+ }
14262
+
14263
+ preview._remoteFleetPendingFrame = null;
14264
+ delete preview.dataset.remoteFleetPendingFrameKind;
14265
+ delete preview.dataset.remoteFleetPendingFrameSeq;
14266
+ delete preview.dataset.remoteFleetPendingFrameUrl;
14267
+
14268
+ const committed = commitRemoteFleetFrameToPreview(preview, image, cloneRemoteFleetFramePatch(frame));
14269
+ if (committed) {
14270
+ window.RuntimeTrace?.emit?.('remote.frame.uiPatched', {
14271
+ count: 1,
14272
+ kind: frame.kind,
14273
+ seq: frame.frameSeq,
14274
+ surface: 'img-direct-live',
14275
+ contentHash: frame.contentHash || '',
14276
+ sameContentStreak: Number(frame.sameContentStreak || 0) || 0,
14277
+ captureMs: Number(frame.captureMs || 0) || 0
14278
+ });
14279
+ }
14280
+ return committed;
14281
+ }
14282
+
14241
14283
  return queueRemoteFleetFramePaint(preview, frame);
14242
14284
  }
14243
14285
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "mainAssemblyName": "MindExecution.Web",
3
3
  "resources": {
4
- "hash": "sha256-UGhBNyGMI2YVNBv0VAxRK/+ISHOLlYLKc6pg6eePs8k=",
4
+ "hash": "sha256-Br4DWyqxlRmH44i0F0OYs/cbiMcQZSXhuRDCRobDEAQ=",
5
5
  "fingerprinting": {
6
6
  "Google.Protobuf.9h59ukbel7.dll": "Google.Protobuf.dll",
7
7
  "Markdig.d1j7v41cl1.dll": "Markdig.dll",
@@ -123,16 +123,16 @@
123
123
  "System.brmz7yk5qh.dll": "System.dll",
124
124
  "netstandard.yvr3prsx0x.dll": "netstandard.dll",
125
125
  "System.Private.CoreLib.c1dbswx1b2.dll": "System.Private.CoreLib.dll",
126
- "MindExecution.Core.cdplo34sb2.dll": "MindExecution.Core.dll",
127
- "MindExecution.Kernel.7k773jan4j.dll": "MindExecution.Kernel.dll",
128
- "MindExecution.Plugins.Admin.nr5ioavpvn.dll": "MindExecution.Plugins.Admin.dll",
129
- "MindExecution.Plugins.Business.qq63kom73x.dll": "MindExecution.Plugins.Business.dll",
130
- "MindExecution.Plugins.Concept.za4g3ep0s3.dll": "MindExecution.Plugins.Concept.dll",
131
- "MindExecution.Plugins.Directory.u6p6pxpwxp.dll": "MindExecution.Plugins.Directory.dll",
132
- "MindExecution.Plugins.PlanMaster.dybjnpy716.dll": "MindExecution.Plugins.PlanMaster.dll",
133
- "MindExecution.Plugins.YouTube.77htf13h5q.dll": "MindExecution.Plugins.YouTube.dll",
134
- "MindExecution.Shared.d74ehlrxzm.dll": "MindExecution.Shared.dll",
135
- "MindExecution.Web.0bxjy0fhk2.dll": "MindExecution.Web.dll",
126
+ "MindExecution.Core.fc9cjbjplq.dll": "MindExecution.Core.dll",
127
+ "MindExecution.Kernel.pbzp3jfync.dll": "MindExecution.Kernel.dll",
128
+ "MindExecution.Plugins.Admin.gxzwlji1cf.dll": "MindExecution.Plugins.Admin.dll",
129
+ "MindExecution.Plugins.Business.vtaey8c59y.dll": "MindExecution.Plugins.Business.dll",
130
+ "MindExecution.Plugins.Concept.ksc3wkuptm.dll": "MindExecution.Plugins.Concept.dll",
131
+ "MindExecution.Plugins.Directory.zc8ffaoknd.dll": "MindExecution.Plugins.Directory.dll",
132
+ "MindExecution.Plugins.PlanMaster.flzcb87jvl.dll": "MindExecution.Plugins.PlanMaster.dll",
133
+ "MindExecution.Plugins.YouTube.q4tvods1po.dll": "MindExecution.Plugins.YouTube.dll",
134
+ "MindExecution.Shared.jv6r2n1bvg.dll": "MindExecution.Shared.dll",
135
+ "MindExecution.Web.3b8az6ed0q.dll": "MindExecution.Web.dll",
136
136
  "dotnet.js": "dotnet.js",
137
137
  "dotnet.native.qc8g39g30v.js": "dotnet.native.js",
138
138
  "dotnet.native.boem75ye5i.wasm": "dotnet.native.wasm",
@@ -278,18 +278,18 @@
278
278
  "System.Xml.XDocument.sn51jas17n.dll": "sha256-GNI2kFgFmPTwzuzwUn8gxK+AzGLUWRJFdg9JzIbrybQ=",
279
279
  "System.brmz7yk5qh.dll": "sha256-CfM2miyj1KHApFmqMdLYWio3S/jrdON2pW9Xr2nTwlo=",
280
280
  "netstandard.yvr3prsx0x.dll": "sha256-EksNn8Luo4bOWqJ6X7dIe9qG9oOqwOVzjH2xYyMNi+E=",
281
- "MindExecution.Core.cdplo34sb2.dll": "sha256-sLc0yEeGYQhFPxxNKLQsHllAhwjKhNn+pfgRY0bHbpo=",
282
- "MindExecution.Kernel.7k773jan4j.dll": "sha256-B5H6hzB6g8sWLqXUoXifv8CbLqVt7g1lLkkinTBKF8E=",
283
- "MindExecution.Plugins.Concept.za4g3ep0s3.dll": "sha256-NRvSoxbUc1XekEfarbQRsx+C7Q5zF8CSX8leSW6sUpA=",
284
- "MindExecution.Plugins.PlanMaster.dybjnpy716.dll": "sha256-u+FNpu8goaKb3wbqL/kEQ/1iB9qwPxPBJGzSjEhxRU0=",
285
- "MindExecution.Shared.d74ehlrxzm.dll": "sha256-ySEVzQvBsNIQdJhAk6znArycY1ZuaHW8XrzGIzNZL9U=",
286
- "MindExecution.Web.0bxjy0fhk2.dll": "sha256-pD4Kd3YtszSDufXc+DeiOjslAUWzpeSMY0CHpwwRyKc="
281
+ "MindExecution.Core.fc9cjbjplq.dll": "sha256-TymUFwryFLdbCYy2U5qdgE2ZV1yHaLR9bgyrmx6Tcp0=",
282
+ "MindExecution.Kernel.pbzp3jfync.dll": "sha256-Ff6WHyLD39V0fEjUiQlxX9Y+edssyTH+7T4zfBdj3s0=",
283
+ "MindExecution.Plugins.Concept.ksc3wkuptm.dll": "sha256-fIy3+/z7i12WktCVlAHG6hJGVOSgzWJNGXiDrArviYU=",
284
+ "MindExecution.Plugins.PlanMaster.flzcb87jvl.dll": "sha256-zYXs1kS13yT6eDgbsthOX4Ku1n3P+TnPn8oIhJVwxQ0=",
285
+ "MindExecution.Shared.jv6r2n1bvg.dll": "sha256-cdYJze5sGTmNGOvWL+BktfURuCHsKmec9PB0emQVJ38=",
286
+ "MindExecution.Web.3b8az6ed0q.dll": "sha256-cbwDzpFNXJ2mcIVtZC6fNkvXq4K+q0QTXJ5EGuTKL7w="
287
287
  },
288
288
  "lazyAssembly": {
289
- "MindExecution.Plugins.Admin.nr5ioavpvn.dll": "sha256-TWIfHGuEUUD1JtyuhfH4NM5JkvqAt8KcDVrWxvmwnVc=",
290
- "MindExecution.Plugins.Business.qq63kom73x.dll": "sha256-4lgIcKclWQIjijrBJJFu84fgAH4MsDCN/myhG/K9OOU=",
291
- "MindExecution.Plugins.Directory.u6p6pxpwxp.dll": "sha256-BjJ6/XNfp5wd/1RTdh99X9RR0I1GV6t4bp5A+RlAK9s=",
292
- "MindExecution.Plugins.YouTube.77htf13h5q.dll": "sha256-rYCDS5JysOa68J0RrPVkS461WQtEM50fU7lwzDwx4uY="
289
+ "MindExecution.Plugins.Admin.gxzwlji1cf.dll": "sha256-5D5B2ZuUMj46zBMgH2dRA7CbQf++uukMPrEliFLuZWs=",
290
+ "MindExecution.Plugins.Business.vtaey8c59y.dll": "sha256-rU9MzRRmHuj0/IluV1dvE6x3aRCK/DA4DWKy1DO4VVg=",
291
+ "MindExecution.Plugins.Directory.zc8ffaoknd.dll": "sha256-Ey/HajaVuBxB/Ou4qsM70nhAZBoODeCENzG1J/uEsxs=",
292
+ "MindExecution.Plugins.YouTube.q4tvods1po.dll": "sha256-OhEl9VDjIXBCZq3inYSQyNDRco3oQAp7G95eZIq9IeM="
293
293
  }
294
294
  },
295
295
  "cacheBootResources": true,
@@ -7,8 +7,8 @@
7
7
  <title>MindExec | Run your ideas as AI task graphs</title>
8
8
  <meta name="description" content="MindExec is an AI execution canvas for solo builders, researchers, developers, and creators. Start with free browser tools, then move serious work into saved MindCanvas projects." />
9
9
  <base href="/" />
10
- <link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260616-csv-table-node-v562" />
11
- <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260616-csv-table-node-v562" />
10
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260616-remote-live-fresh-v563" />
11
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260616-remote-live-fresh-v563" />
12
12
  <!-- ?쇄뼹??Font Awesome (local) ?쇄뼹??-->
13
13
  <link rel="stylesheet" href="_content/MindExecution.Shared/lib/font-awesome/css/all.min.css" />
14
14
  <!-- ?꿎뼯??-->
@@ -579,7 +579,7 @@
579
579
  }
580
580
 
581
581
  const base = '_content/MindExecution.Shared/js/';
582
- const scriptVersion = '20260616-csv-table-node-v562';
582
+ const scriptVersion = '20260616-remote-live-fresh-v563';
583
583
  const scriptUrl = (script) => `${base}${script}?v=${scriptVersion}`;
584
584
  console.log(`[Script Loader] Shared JS version: ${scriptVersion}`);
585
585
  const criticalScripts = [
@@ -1,5 +1,5 @@
1
1
  self.assetsManifest = {
2
- "version": "trZeDvyF",
2
+ "version": "0GkQkAf6",
3
3
  "assets": [
4
4
  {
5
5
  "hash": "sha256-+CSYMcqLNTsq3VnH11jgYyOCCdxvHzL74CBmo4sCmMU=",
@@ -86,7 +86,7 @@
86
86
  "url": "_content/MindExecution.Shared/js/mind-map-core.js.backup"
87
87
  },
88
88
  {
89
- "hash": "sha256-AXK7W1xsaRJiZWWYSc7SrzizpChwI0pRl9jvcC3x518=",
89
+ "hash": "sha256-DhSn/UhaZNiUWVI6SxAXUCT4ZJ1rTb0M4ZAzWBF4ibU=",
90
90
  "url": "_content/MindExecution.Shared/js/mind-map-css3d-manager.js"
91
91
  },
92
92
  {
@@ -410,44 +410,44 @@
410
410
  "url": "_framework/MimeMapping.og9ys58ylm.dll"
411
411
  },
412
412
  {
413
- "hash": "sha256-sLc0yEeGYQhFPxxNKLQsHllAhwjKhNn+pfgRY0bHbpo=",
414
- "url": "_framework/MindExecution.Core.cdplo34sb2.dll"
413
+ "hash": "sha256-TymUFwryFLdbCYy2U5qdgE2ZV1yHaLR9bgyrmx6Tcp0=",
414
+ "url": "_framework/MindExecution.Core.fc9cjbjplq.dll"
415
415
  },
416
416
  {
417
- "hash": "sha256-B5H6hzB6g8sWLqXUoXifv8CbLqVt7g1lLkkinTBKF8E=",
418
- "url": "_framework/MindExecution.Kernel.7k773jan4j.dll"
417
+ "hash": "sha256-Ff6WHyLD39V0fEjUiQlxX9Y+edssyTH+7T4zfBdj3s0=",
418
+ "url": "_framework/MindExecution.Kernel.pbzp3jfync.dll"
419
419
  },
420
420
  {
421
- "hash": "sha256-TWIfHGuEUUD1JtyuhfH4NM5JkvqAt8KcDVrWxvmwnVc=",
422
- "url": "_framework/MindExecution.Plugins.Admin.nr5ioavpvn.dll"
421
+ "hash": "sha256-5D5B2ZuUMj46zBMgH2dRA7CbQf++uukMPrEliFLuZWs=",
422
+ "url": "_framework/MindExecution.Plugins.Admin.gxzwlji1cf.dll"
423
423
  },
424
424
  {
425
- "hash": "sha256-4lgIcKclWQIjijrBJJFu84fgAH4MsDCN/myhG/K9OOU=",
426
- "url": "_framework/MindExecution.Plugins.Business.qq63kom73x.dll"
425
+ "hash": "sha256-rU9MzRRmHuj0/IluV1dvE6x3aRCK/DA4DWKy1DO4VVg=",
426
+ "url": "_framework/MindExecution.Plugins.Business.vtaey8c59y.dll"
427
427
  },
428
428
  {
429
- "hash": "sha256-NRvSoxbUc1XekEfarbQRsx+C7Q5zF8CSX8leSW6sUpA=",
430
- "url": "_framework/MindExecution.Plugins.Concept.za4g3ep0s3.dll"
429
+ "hash": "sha256-fIy3+/z7i12WktCVlAHG6hJGVOSgzWJNGXiDrArviYU=",
430
+ "url": "_framework/MindExecution.Plugins.Concept.ksc3wkuptm.dll"
431
431
  },
432
432
  {
433
- "hash": "sha256-BjJ6/XNfp5wd/1RTdh99X9RR0I1GV6t4bp5A+RlAK9s=",
434
- "url": "_framework/MindExecution.Plugins.Directory.u6p6pxpwxp.dll"
433
+ "hash": "sha256-Ey/HajaVuBxB/Ou4qsM70nhAZBoODeCENzG1J/uEsxs=",
434
+ "url": "_framework/MindExecution.Plugins.Directory.zc8ffaoknd.dll"
435
435
  },
436
436
  {
437
- "hash": "sha256-u+FNpu8goaKb3wbqL/kEQ/1iB9qwPxPBJGzSjEhxRU0=",
438
- "url": "_framework/MindExecution.Plugins.PlanMaster.dybjnpy716.dll"
437
+ "hash": "sha256-zYXs1kS13yT6eDgbsthOX4Ku1n3P+TnPn8oIhJVwxQ0=",
438
+ "url": "_framework/MindExecution.Plugins.PlanMaster.flzcb87jvl.dll"
439
439
  },
440
440
  {
441
- "hash": "sha256-rYCDS5JysOa68J0RrPVkS461WQtEM50fU7lwzDwx4uY=",
442
- "url": "_framework/MindExecution.Plugins.YouTube.77htf13h5q.dll"
441
+ "hash": "sha256-OhEl9VDjIXBCZq3inYSQyNDRco3oQAp7G95eZIq9IeM=",
442
+ "url": "_framework/MindExecution.Plugins.YouTube.q4tvods1po.dll"
443
443
  },
444
444
  {
445
- "hash": "sha256-ySEVzQvBsNIQdJhAk6znArycY1ZuaHW8XrzGIzNZL9U=",
446
- "url": "_framework/MindExecution.Shared.d74ehlrxzm.dll"
445
+ "hash": "sha256-cdYJze5sGTmNGOvWL+BktfURuCHsKmec9PB0emQVJ38=",
446
+ "url": "_framework/MindExecution.Shared.jv6r2n1bvg.dll"
447
447
  },
448
448
  {
449
- "hash": "sha256-pD4Kd3YtszSDufXc+DeiOjslAUWzpeSMY0CHpwwRyKc=",
450
- "url": "_framework/MindExecution.Web.0bxjy0fhk2.dll"
449
+ "hash": "sha256-cbwDzpFNXJ2mcIVtZC6fNkvXq4K+q0QTXJ5EGuTKL7w=",
450
+ "url": "_framework/MindExecution.Web.3b8az6ed0q.dll"
451
451
  },
452
452
  {
453
453
  "hash": "sha256-IsZJ91/OW+fHzNqIgEc7Y072ns8z9dGritiSyvR9Wgc=",
@@ -770,7 +770,7 @@
770
770
  "url": "_framework/Websocket.Client.vapounvmnl.dll"
771
771
  },
772
772
  {
773
- "hash": "sha256-QgwmwowtArQ5iNVyNt2nUZTQbYBdG21lKd44yCDJOos=",
773
+ "hash": "sha256-5j809S+7v/sq5DbtGGZHh2z8V4kL+rCKD7nhboJYuxQ=",
774
774
  "url": "_framework/blazor.boot.json"
775
775
  },
776
776
  {
@@ -834,7 +834,7 @@
834
834
  "url": "image-manifest.json"
835
835
  },
836
836
  {
837
- "hash": "sha256-WIDt2/+ryWe5EOcz23Yqn18VQk2Y8TmNDtuwUyIZEgM=",
837
+ "hash": "sha256-2B93M5xFDpgqUOcnXJPakFVZ1W1wwThzsOo3U1cQtto=",
838
838
  "url": "index.html"
839
839
  },
840
840
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: trZeDvyF */
1
+ /* Manifest version: 0GkQkAf6 */
2
2
  // Hosted deployments should prefer the network over stale offline caches.
3
3
  // This service worker immediately clears old Blazor offline caches and unregisters itself.
4
4