@mindexec/cli 0.2.102 → 0.2.104

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 (20) 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/css/mind-map-overrides.css +31 -0
  5. package/wwwroot/_content/MindExecution.Shared/js/mind-map-css3d-manager.js +82 -5
  6. package/wwwroot/_framework/MindExecution.Core.fc9cjbjplq.dll +0 -0
  7. package/wwwroot/_framework/{MindExecution.Kernel.7k773jan4j.dll → MindExecution.Kernel.pbzp3jfync.dll} +0 -0
  8. package/wwwroot/_framework/{MindExecution.Plugins.Admin.nr5ioavpvn.dll → MindExecution.Plugins.Admin.gxzwlji1cf.dll} +0 -0
  9. package/wwwroot/_framework/{MindExecution.Plugins.Business.qq63kom73x.dll → MindExecution.Plugins.Business.vtaey8c59y.dll} +0 -0
  10. package/wwwroot/_framework/{MindExecution.Plugins.Concept.za4g3ep0s3.dll → MindExecution.Plugins.Concept.ksc3wkuptm.dll} +0 -0
  11. package/wwwroot/_framework/{MindExecution.Plugins.Directory.u6p6pxpwxp.dll → MindExecution.Plugins.Directory.zc8ffaoknd.dll} +0 -0
  12. package/wwwroot/_framework/{MindExecution.Plugins.PlanMaster.dybjnpy716.dll → MindExecution.Plugins.PlanMaster.flzcb87jvl.dll} +0 -0
  13. package/wwwroot/_framework/{MindExecution.Plugins.YouTube.77htf13h5q.dll → MindExecution.Plugins.YouTube.q4tvods1po.dll} +0 -0
  14. package/wwwroot/_framework/{MindExecution.Shared.d74ehlrxzm.dll → MindExecution.Shared.r8pan6upd8.dll} +0 -0
  15. package/wwwroot/_framework/{MindExecution.Web.0bxjy0fhk2.dll → MindExecution.Web.3b8az6ed0q.dll} +0 -0
  16. package/wwwroot/_framework/blazor.boot.json +21 -21
  17. package/wwwroot/index.html +3 -3
  18. package/wwwroot/service-worker-assets.js +25 -25
  19. package/wwwroot/service-worker.js +1 -1
  20. 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.104",
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));
@@ -1925,6 +1925,37 @@ body.is-panning .mind-map-text-overlay-v2-card.is-passive .mind-map-text-overlay
1925
1925
  caret-color: auto !important;
1926
1926
  }
1927
1927
 
1928
+ .css3d-resolution-wrapper.node-type-csv-table,
1929
+ .css3d-resolution-wrapper.node-type-csv-table > .map-node,
1930
+ .css3d-resolution-wrapper.node-type-csv-table .node-content-wrapper,
1931
+ .map-node-csv-table .node-content-wrapper--csv-table {
1932
+ min-width: 0 !important;
1933
+ min-height: 0 !important;
1934
+ max-width: 100% !important;
1935
+ max-height: 100% !important;
1936
+ box-sizing: border-box !important;
1937
+ overflow: hidden !important;
1938
+ }
1939
+
1940
+ .css3d-resolution-wrapper.node-type-csv-table .node-content-wrapper,
1941
+ .map-node-csv-table .node-content-wrapper--csv-table {
1942
+ display: flex !important;
1943
+ flex-direction: column !important;
1944
+ }
1945
+
1946
+ .css3d-resolution-wrapper.node-type-csv-table .node-response.csv-table-scroll,
1947
+ .map-node-csv-table .node-response.csv-table-scroll {
1948
+ width: 100% !important;
1949
+ height: auto !important;
1950
+ max-height: 100% !important;
1951
+ flex: 1 1 0% !important;
1952
+ min-height: 0 !important;
1953
+ overflow: auto !important;
1954
+ scrollbar-gutter: stable both-edges !important;
1955
+ padding-right: 0 !important;
1956
+ overscroll-behavior: contain;
1957
+ }
1958
+
1928
1959
  .css3d-resolution-wrapper.node-type-image,
1929
1960
  .css3d-resolution-wrapper.node-type-video,
1930
1961
  .css3d-resolution-wrapper.node-type-embed {
@@ -384,6 +384,34 @@
384
384
  .csv-table-scroll:hover::-webkit-scrollbar-thumb {
385
385
  background: rgba(71, 85, 105, 0.48);
386
386
  }
387
+ .css3d-resolution-wrapper.node-type-csv-table,
388
+ .css3d-resolution-wrapper.node-type-csv-table > .map-node,
389
+ .css3d-resolution-wrapper.node-type-csv-table .node-content-wrapper,
390
+ .map-node-csv-table .node-content-wrapper--csv-table {
391
+ min-width: 0 !important;
392
+ min-height: 0 !important;
393
+ max-width: 100% !important;
394
+ max-height: 100% !important;
395
+ box-sizing: border-box !important;
396
+ overflow: hidden !important;
397
+ }
398
+ .css3d-resolution-wrapper.node-type-csv-table .node-content-wrapper,
399
+ .map-node-csv-table .node-content-wrapper--csv-table {
400
+ display: flex !important;
401
+ flex-direction: column !important;
402
+ }
403
+ .css3d-resolution-wrapper.node-type-csv-table .node-response.csv-table-scroll,
404
+ .map-node-csv-table .node-response.csv-table-scroll {
405
+ width: 100% !important;
406
+ height: auto !important;
407
+ max-height: 100% !important;
408
+ flex: 1 1 0% !important;
409
+ min-height: 0 !important;
410
+ overflow: auto !important;
411
+ scrollbar-gutter: stable both-edges !important;
412
+ padding-right: 0 !important;
413
+ overscroll-behavior: contain;
414
+ }
387
415
  .csv-table {
388
416
  width: max-content;
389
417
  min-width: 100%;
@@ -13637,7 +13665,10 @@
13637
13665
  frameUrl: source,
13638
13666
  receivedAt: String(readRemoteFleetObjectField(frame, 'receivedAt', 'ReceivedAt', '') || '').trim(),
13639
13667
  capturedAt: String(readRemoteFleetObjectField(frame, 'capturedAt', 'CapturedAt', '') || '').trim(),
13640
- streamId: String(readRemoteFleetObjectField(frame, 'streamId', 'StreamId', '') || '').trim()
13668
+ streamId: String(readRemoteFleetObjectField(frame, 'streamId', 'StreamId', '') || '').trim(),
13669
+ contentHash: String(readRemoteFleetObjectField(frame, 'contentHash', 'ContentHash', '') || '').trim(),
13670
+ captureMs: Number(readRemoteFleetObjectField(frame, 'captureMs', 'CaptureMs', 0)) || 0,
13671
+ sameContentStreak: Number(readRemoteFleetObjectField(frame, 'sameContentStreak', 'SameContentStreak', 0)) || 0
13641
13672
  };
13642
13673
  }
13643
13674
 
@@ -13910,7 +13941,10 @@
13910
13941
  frameUrl: String(frame?.frameUrl || '').trim(),
13911
13942
  receivedAt: String(frame?.receivedAt || '').trim(),
13912
13943
  capturedAt: String(frame?.capturedAt || '').trim(),
13913
- streamId: String(frame?.streamId || '').trim()
13944
+ streamId: String(frame?.streamId || '').trim(),
13945
+ contentHash: String(frame?.contentHash || '').trim(),
13946
+ captureMs: Number(frame?.captureMs || 0) || 0,
13947
+ sameContentStreak: Number(frame?.sameContentStreak || 0) || 0
13914
13948
  };
13915
13949
  }
13916
13950
 
@@ -14002,6 +14036,9 @@
14002
14036
  preview.dataset.remoteFleetFrameSeq = String(nextSeq || 0);
14003
14037
  preview.dataset.remoteFleetFrameUrl = frame.frameUrl;
14004
14038
  preview.dataset.remoteFleetFrameAt = frame.receivedAt || frame.capturedAt || '';
14039
+ preview.dataset.remoteFleetFrameHash = frame.contentHash || '';
14040
+ preview.dataset.remoteFleetFrameCaptureMs = String(Number(frame.captureMs || 0) || 0);
14041
+ preview.dataset.remoteFleetFrameSameContentStreak = String(Number(frame.sameContentStreak || 0) || 0);
14005
14042
 
14006
14043
  const placeholder = preview.querySelector('[data-remote-fleet-screen-placeholder="true"]');
14007
14044
  if (placeholder) {
@@ -14038,6 +14075,9 @@
14038
14075
  image.dataset.remoteFleetFrameKind = frame.kind;
14039
14076
  image.dataset.remoteFleetFrameSeq = String(nextSeq || 0);
14040
14077
  image.dataset.remoteFleetFrameUrl = frame.frameUrl;
14078
+ image.dataset.remoteFleetFrameHash = frame.contentHash || '';
14079
+ image.dataset.remoteFleetFrameCaptureMs = String(Number(frame.captureMs || 0) || 0);
14080
+ image.dataset.remoteFleetFrameSameContentStreak = String(Number(frame.sameContentStreak || 0) || 0);
14041
14081
  image.loading = frame.kind === 'thumbnail' ? 'lazy' : 'eager';
14042
14082
  image.style.display = 'block';
14043
14083
  if (image.src !== frame.frameUrl) {
@@ -14238,6 +14278,36 @@
14238
14278
  }
14239
14279
 
14240
14280
  function applyRemoteFleetFramePatchToPreview(preview, frame) {
14281
+ if (String(frame?.kind || '').toLowerCase() === 'live') {
14282
+ if (!preview || !isRemoteFleetFrameNewerForPreview(preview, frame, false)) {
14283
+ return false;
14284
+ }
14285
+
14286
+ const image = ensureRemoteFleetFrameImage(preview, frame);
14287
+ if (!image) {
14288
+ return false;
14289
+ }
14290
+
14291
+ preview._remoteFleetPendingFrame = null;
14292
+ delete preview.dataset.remoteFleetPendingFrameKind;
14293
+ delete preview.dataset.remoteFleetPendingFrameSeq;
14294
+ delete preview.dataset.remoteFleetPendingFrameUrl;
14295
+
14296
+ const committed = commitRemoteFleetFrameToPreview(preview, image, cloneRemoteFleetFramePatch(frame));
14297
+ if (committed) {
14298
+ window.RuntimeTrace?.emit?.('remote.frame.uiPatched', {
14299
+ count: 1,
14300
+ kind: frame.kind,
14301
+ seq: frame.frameSeq,
14302
+ surface: 'img-direct-live',
14303
+ contentHash: frame.contentHash || '',
14304
+ sameContentStreak: Number(frame.sameContentStreak || 0) || 0,
14305
+ captureMs: Number(frame.captureMs || 0) || 0
14306
+ });
14307
+ }
14308
+ return committed;
14309
+ }
14310
+
14241
14311
  return queueRemoteFleetFramePaint(preview, frame);
14242
14312
  }
14243
14313
 
@@ -19547,14 +19617,18 @@
19547
19617
 
19548
19618
  // 콘텐츠 래퍼 생성
19549
19619
  const contentWrapper = document.createElement('div');
19550
- contentWrapper.className = 'node-content-wrapper';
19620
+ contentWrapper.className = isCsvTableNode
19621
+ ? 'node-content-wrapper node-content-wrapper--csv-table'
19622
+ : 'node-content-wrapper';
19551
19623
  contentWrapper.style.cssText = `
19552
19624
  width: 100%;
19553
19625
  height: 100%;
19626
+ max-height: 100%;
19554
19627
  overflow: hidden;
19555
19628
  display: ${isMediaNode ? 'block' : 'flex'};
19556
19629
  flex-direction: ${isMediaNode ? 'initial' : 'column'};
19557
19630
  min-height: ${isMediaNode ? 'auto' : '0'};
19631
+ min-width: 0;
19558
19632
  position: ${isMediaNode ? 'relative' : 'static'};
19559
19633
  transform: none;
19560
19634
  will-change: auto;
@@ -19649,10 +19723,13 @@
19649
19723
  responseDiv.className = 'node-response csv-table-scroll';
19650
19724
  responseDiv.style.cssText = `
19651
19725
  width: 100%;
19652
- height: 100%;
19653
- flex: 1 1 auto;
19726
+ height: auto;
19727
+ max-height: 100%;
19728
+ flex: 1 1 0%;
19654
19729
  min-height: 0;
19655
19730
  overflow: auto;
19731
+ overscroll-behavior: contain;
19732
+ scrollbar-gutter: stable both-edges;
19656
19733
  pointer-events: auto;
19657
19734
  box-sizing: border-box;
19658
19735
  user-select: text;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "mainAssemblyName": "MindExecution.Web",
3
3
  "resources": {
4
- "hash": "sha256-UGhBNyGMI2YVNBv0VAxRK/+ISHOLlYLKc6pg6eePs8k=",
4
+ "hash": "sha256-ncmibpfP4OVaoSZXQLmDLiOOSi8GW6wTmwlKPOWGtWk=",
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.r8pan6upd8.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.r8pan6upd8.dll": "sha256-Sw26dtjM8Rd82Nk3uWpkPPjrzCULyX1GwGdX9uJ0zzw=",
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-csv-import-scroll-v564" />
11
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260616-csv-import-scroll-v564" />
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-csv-import-scroll-v564';
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": "dcqbmuSQ",
3
3
  "assets": [
4
4
  {
5
5
  "hash": "sha256-+CSYMcqLNTsq3VnH11jgYyOCCdxvHzL74CBmo4sCmMU=",
@@ -42,7 +42,7 @@
42
42
  "url": "_content/MindExecution.Shared/css/app.css"
43
43
  },
44
44
  {
45
- "hash": "sha256-bM3TPSd4WDlrAJjzMh91OLXSpkFX5/3qUs84piTAEKA=",
45
+ "hash": "sha256-Z/qOemFxT1byK3tSyusCzWleiFLxcMRdsEc/0DoSPbk=",
46
46
  "url": "_content/MindExecution.Shared/css/mind-map-overrides.css"
47
47
  },
48
48
  {
@@ -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-argv1cbei7H0a1mJ744ULYCoG8vmNo2LOIjjqeVe+v8=",
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-Sw26dtjM8Rd82Nk3uWpkPPjrzCULyX1GwGdX9uJ0zzw=",
446
+ "url": "_framework/MindExecution.Shared.r8pan6upd8.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-X5tMd8TgdpyfWLfjIOQZ6EsVxGF+b/KYBX2d/htH6Qo=",
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-6d4BMAFu8S+buYLIfn/YU12rChaOPCkPEswE7eGNQAA=",
838
838
  "url": "index.html"
839
839
  },
840
840
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: trZeDvyF */
1
+ /* Manifest version: dcqbmuSQ */
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