@mindexec/cli 0.2.53 → 0.2.55

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": "@mindexec/cli",
3
- "version": "0.2.53",
3
+ "version": "0.2.55",
4
4
  "description": "MindExec local runtime and bridge CLI",
5
5
  "main": "server.js",
6
6
  "type": "module",
@@ -649,6 +649,7 @@ try {
649
649
  const { manager, document } = await loadCss3DManager();
650
650
  assert.equal(typeof manager?.renderRemoteFleetMonitorForTest, 'function');
651
651
  assert.equal(typeof manager?.renderRemoteFleetDeviceForTest, 'function');
652
+ assert.equal(typeof manager?.applyRemoteFleetFramePatchesForTest, 'function');
652
653
  assert.equal(typeof manager?.setModuleForTest, 'function');
653
654
 
654
655
  const dotNetCalls = [];
@@ -683,7 +684,9 @@ try {
683
684
  if (methodName === 'SetRemoteFleetHostFromJs') {
684
685
  return {
685
686
  success: true,
686
- active: args[1] === true
687
+ active: args[1] === true,
688
+ registryStatus: args[1] === true ? 'local' : 'inactive',
689
+ registryReason: args[1] === true ? 'registry-render-smoke' : 'inactive'
687
690
  };
688
691
  }
689
692
 
@@ -712,7 +715,8 @@ try {
712
715
  assert.ok(bodyChildOrder.endsWith('remoteFleetStatusRail'), bodyChildOrder);
713
716
  assert.ok(statusFooter.style.cssText.includes('flex-direction: row'));
714
717
  assert.match(statusFooter.style.cssText, /box-sizing:\s*border-box;/);
715
- assert.equal(statusFooter.querySelectorAll('[data-remote-fleet-status-item]').length, 4);
718
+ assert.equal(statusFooter.querySelectorAll('[data-remote-fleet-status-item]').length, 5);
719
+ assert.ok(statusFooter.querySelector('[data-remote-fleet-status-item="route"]'));
716
720
  const initialDetailPanel = bodyView.querySelector('[data-remote-fleet-detail-panel="true"]');
717
721
  assert.equal(initialDetailPanel?.dataset.deviceId, focusedDevice.DeviceId);
718
722
  assert.equal(bodyView.querySelectorAll('[data-remote-fleet-action="pin-device"]').length, 1);
@@ -724,6 +728,24 @@ try {
724
728
  assert.ok(initialDetailPanel?.textContent.includes('Load'));
725
729
  assert.ok(cards[0]?.querySelector('[data-remote-fleet-device-preview="tile"]'));
726
730
  assert.equal(/\b(Seen|Uptime|Mem|Load)\b/.test(cards[0]?.textContent || ''), false);
731
+ const patchTarget = devices.find(device => device.ThumbnailEnabled === true && device.LiveStreamActive !== true);
732
+ assert.ok(patchTarget);
733
+ const patchCard = Array.from(cards).find(card => card.dataset.deviceId === patchTarget.DeviceId);
734
+ const patchPreview = patchCard?.querySelector('[data-remote-fleet-device-preview="tile"]');
735
+ assert.ok(patchPreview);
736
+ const patchUrl = `/api/remote/devices/${encodeURIComponent(patchTarget.DeviceId)}/thumbnail?token=render-smoke-frame&seq=9999`;
737
+ const patchCount = manager.applyRemoteFleetFramePatchesForTest(bodyView, [{
738
+ deviceId: patchTarget.DeviceId,
739
+ kind: 'thumbnail',
740
+ frameSeq: 9999,
741
+ frameUrl: patchUrl,
742
+ receivedAt: new Date().toISOString()
743
+ }]);
744
+ assert.equal(patchCount, 1);
745
+ assert.equal(patchPreview.dataset.remoteFleetFrameSeq, '9999');
746
+ assert.equal(patchPreview.dataset.remoteFleetFrameUrl, patchUrl);
747
+ assert.equal(patchPreview.dataset.remoteFleetPendingFrameUrl || '', '');
748
+ assert.equal(patchPreview.querySelector('img[data-remote-fleet-frame-image="true"]')?.dataset.remoteFleetFrameUrl, patchUrl);
727
749
  const alternateDevice = devices.find(device => device.DeviceId !== focusedDevice.DeviceId);
728
750
  assert.ok(alternateDevice);
729
751
  const alternateCard = Array.from(cards).find(card => card.dataset.deviceId === alternateDevice.DeviceId);
@@ -12541,6 +12541,7 @@
12541
12541
  const tone = String(item?.tone || 'default');
12542
12542
  const row = document.createElement('div');
12543
12543
  row.dataset.remoteFleetStatusItem = item?.key || '';
12544
+ row.title = String(item?.title || '').trim();
12544
12545
  row.style.cssText = `
12545
12546
  flex: 0 0 auto;
12546
12547
  display: inline-flex;
@@ -12580,7 +12581,8 @@
12580
12581
 
12581
12582
  const valueEl = document.createElement('strong');
12582
12583
  valueEl.textContent = item?.value || '';
12583
- valueEl.title = `${labelEl.textContent} ${valueEl.textContent}`.trim();
12584
+ valueEl.title = String(item?.title || '').trim()
12585
+ || `${labelEl.textContent} ${valueEl.textContent}`.trim();
12584
12586
  valueEl.style.cssText = `
12585
12587
  color: ${tone === 'online' ? '#047857' : '#0f172a'};
12586
12588
  font-size: 10px;
@@ -12602,6 +12604,75 @@
12602
12604
  return rail;
12603
12605
  }
12604
12606
 
12607
+ function getRemoteFleetRegistryRouteInfo(registryStatus, registryReason, hostTargetState) {
12608
+ const status = String(registryStatus || '').trim().toLowerCase();
12609
+ const reason = String(registryReason || '').trim();
12610
+ const hostState = String(hostTargetState || '').trim().toLowerCase();
12611
+
12612
+ if (hostState === 'other-monitor') {
12613
+ return {
12614
+ value: 'Other',
12615
+ tone: 'default',
12616
+ title: reason || 'Another monitor currently owns the host route.'
12617
+ };
12618
+ }
12619
+
12620
+ if (hostState !== 'hosting') {
12621
+ return {
12622
+ value: 'Idle',
12623
+ tone: 'default',
12624
+ title: reason || 'No active host route.'
12625
+ };
12626
+ }
12627
+
12628
+ if (status === 'account') {
12629
+ return {
12630
+ value: 'Account',
12631
+ tone: 'online',
12632
+ title: reason || 'Published to the account route registry for same-account agent pairing.'
12633
+ };
12634
+ }
12635
+
12636
+ if (status === 'blocked') {
12637
+ return {
12638
+ value: 'Blocked',
12639
+ tone: 'warn',
12640
+ title: reason || 'The local host is active, but account route publishing failed.'
12641
+ };
12642
+ }
12643
+
12644
+ return {
12645
+ value: 'Local',
12646
+ tone: 'warn',
12647
+ title: reason || 'The local host is active, but account route publishing is not available.'
12648
+ };
12649
+ }
12650
+
12651
+ function getRemoteFleetResultRegistryStatus(result) {
12652
+ return String(result?.registryStatus ?? result?.RegistryStatus ?? '').trim().toLowerCase();
12653
+ }
12654
+
12655
+ function getRemoteFleetHostFeedbackText(enabled, result) {
12656
+ if (enabled !== true) {
12657
+ return 'Host target stopped.';
12658
+ }
12659
+
12660
+ const status = getRemoteFleetResultRegistryStatus(result);
12661
+ if (status === 'account') {
12662
+ return 'Host target set.';
12663
+ }
12664
+
12665
+ if (status === 'local') {
12666
+ return 'Host set locally. Account route pending.';
12667
+ }
12668
+
12669
+ if (status === 'blocked') {
12670
+ return 'Host route blocked.';
12671
+ }
12672
+
12673
+ return 'Host target set.';
12674
+ }
12675
+
12605
12676
  function createRemoteFleetButton(label, title, action) {
12606
12677
  const button = document.createElement('button');
12607
12678
  button.type = 'button';
@@ -13093,15 +13164,37 @@
13093
13164
  image.loading = frame.kind === 'thumbnail' ? 'lazy' : 'eager';
13094
13165
  image.decoding = 'async';
13095
13166
  image.style.cssText = 'width:100%;height:100%;object-fit:cover;display:block;';
13096
- const placeholder = preview?.querySelector?.('[data-remote-fleet-screen-placeholder="true"]');
13097
- if (placeholder) {
13098
- placeholder.remove();
13167
+ if (typeof preview?.insertBefore === 'function') {
13168
+ preview.insertBefore(image, preview.firstChild || null);
13169
+ } else {
13170
+ preview?.appendChild?.(image);
13099
13171
  }
13100
- preview?.insertBefore?.(image, preview.firstChild || null);
13101
13172
  return image;
13102
13173
  }
13103
13174
 
13104
- function applyRemoteFleetFramePatchToPreview(preview, frame) {
13175
+ function getRemoteFleetFrameIdentity(frame) {
13176
+ return [
13177
+ String(frame?.deviceId || '').trim(),
13178
+ String(frame?.kind || '').trim().toLowerCase(),
13179
+ String(frame?.streamId || '').trim(),
13180
+ String(Number(frame?.frameSeq || 0) || 0),
13181
+ String(frame?.frameUrl || '').trim()
13182
+ ].join('|');
13183
+ }
13184
+
13185
+ function cloneRemoteFleetFramePatch(frame) {
13186
+ return {
13187
+ deviceId: String(frame?.deviceId || '').trim(),
13188
+ kind: String(frame?.kind || 'thumbnail').trim().toLowerCase(),
13189
+ frameSeq: Number.isFinite(Number(frame?.frameSeq)) ? Math.floor(Number(frame.frameSeq)) : 0,
13190
+ frameUrl: String(frame?.frameUrl || '').trim(),
13191
+ receivedAt: String(frame?.receivedAt || '').trim(),
13192
+ capturedAt: String(frame?.capturedAt || '').trim(),
13193
+ streamId: String(frame?.streamId || '').trim()
13194
+ };
13195
+ }
13196
+
13197
+ function isRemoteFleetFrameNewerForPreview(preview, frame, comparePending = false) {
13105
13198
  if (!preview || !frame || !isRemoteFleetFrameSource(frame.frameUrl)) {
13106
13199
  return false;
13107
13200
  }
@@ -13118,11 +13211,73 @@
13118
13211
  return false;
13119
13212
  }
13120
13213
 
13121
- const image = ensureRemoteFleetFrameImage(preview, frame);
13122
- if (!image) {
13214
+ if (comparePending) {
13215
+ const pendingUrl = String(preview.dataset.remoteFleetPendingFrameUrl || '');
13216
+ const pendingKind = String(preview.dataset.remoteFleetPendingFrameKind || '').toLowerCase();
13217
+ const pendingSeq = Number(preview.dataset.remoteFleetPendingFrameSeq || '0');
13218
+ if (pendingUrl) {
13219
+ const samePending = pendingKind === frame.kind
13220
+ && pendingSeq === nextSeq
13221
+ && pendingUrl === frame.frameUrl;
13222
+ if (samePending) {
13223
+ return false;
13224
+ }
13225
+
13226
+ if (pendingKind === 'live' && frame.kind !== 'live') {
13227
+ return false;
13228
+ }
13229
+
13230
+ if (pendingKind === frame.kind
13231
+ && Number.isFinite(pendingSeq)
13232
+ && pendingSeq > 0
13233
+ && Number.isFinite(nextSeq)
13234
+ && nextSeq > 0
13235
+ && nextSeq < pendingSeq) {
13236
+ return false;
13237
+ }
13238
+ }
13239
+ }
13240
+
13241
+ return true;
13242
+ }
13243
+
13244
+ function ensureRemoteFleetFrameBadge(preview, frame) {
13245
+ let badge = preview?.querySelector?.('[data-remote-fleet-frame-badge="true"]');
13246
+ if (badge) {
13247
+ return badge;
13248
+ }
13249
+
13250
+ badge = document.createElement('span');
13251
+ badge.dataset.remoteFleetFrameBadge = 'true';
13252
+ const previewMode = String(preview?.dataset?.remoteFleetDevicePreview || '');
13253
+ const isDetail = previewMode === 'detail';
13254
+ badge.style.cssText = `
13255
+ position: absolute;
13256
+ right: ${isDetail ? '9px' : '6px'};
13257
+ bottom: ${isDetail ? '9px' : '6px'};
13258
+ max-width: calc(100% - ${isDetail ? '18px' : '12px'});
13259
+ padding: ${isDetail ? '4px 7px' : '3px 6px'};
13260
+ border-radius: 999px;
13261
+ background: ${frame?.kind === 'live' ? 'rgba(220, 38, 38, 0.84)' : 'rgba(15, 23, 42, 0.72)'};
13262
+ color: #e2e8f0;
13263
+ font-size: ${isDetail ? '9px' : '8px'};
13264
+ font-weight: 950;
13265
+ line-height: 1;
13266
+ overflow: hidden;
13267
+ text-overflow: ellipsis;
13268
+ white-space: nowrap;
13269
+ letter-spacing: 0;
13270
+ `;
13271
+ preview?.appendChild?.(badge);
13272
+ return badge;
13273
+ }
13274
+
13275
+ function commitRemoteFleetFrameToPreview(preview, image, frame) {
13276
+ if (!preview || !image || !isRemoteFleetFrameNewerForPreview(preview, frame, false)) {
13123
13277
  return false;
13124
13278
  }
13125
13279
 
13280
+ const nextSeq = Number(frame.frameSeq || 0);
13126
13281
  image.dataset.remoteFleetFrameKind = frame.kind;
13127
13282
  image.dataset.remoteFleetFrameSeq = String(nextSeq || 0);
13128
13283
  image.dataset.remoteFleetFrameUrl = frame.frameUrl;
@@ -13136,7 +13291,12 @@
13136
13291
  preview.dataset.remoteFleetFrameUrl = frame.frameUrl;
13137
13292
  preview.dataset.remoteFleetFrameAt = frame.receivedAt || frame.capturedAt || '';
13138
13293
 
13139
- const badge = preview.querySelector('[data-remote-fleet-frame-badge="true"]');
13294
+ const placeholder = preview.querySelector('[data-remote-fleet-screen-placeholder="true"]');
13295
+ if (placeholder) {
13296
+ placeholder.remove();
13297
+ }
13298
+
13299
+ const badge = ensureRemoteFleetFrameBadge(preview, frame);
13140
13300
  if (badge) {
13141
13301
  const at = frame.receivedAt || frame.capturedAt || '';
13142
13302
  badge.textContent = frame.kind === 'live'
@@ -13151,6 +13311,96 @@
13151
13311
  return true;
13152
13312
  }
13153
13313
 
13314
+ function clearRemoteFleetPendingFrameDataset(preview, frame) {
13315
+ if (!preview) {
13316
+ return;
13317
+ }
13318
+
13319
+ if (!frame
13320
+ || getRemoteFleetFrameIdentity(preview._remoteFleetPendingFrame) === getRemoteFleetFrameIdentity(frame)) {
13321
+ delete preview.dataset.remoteFleetPendingFrameKind;
13322
+ delete preview.dataset.remoteFleetPendingFrameSeq;
13323
+ delete preview.dataset.remoteFleetPendingFrameUrl;
13324
+ preview._remoteFleetPendingFrame = null;
13325
+ }
13326
+ }
13327
+
13328
+ function processRemoteFleetFrameQueue(preview, image) {
13329
+ if (!preview || !image || preview._remoteFleetFrameLoaderActive === true) {
13330
+ return;
13331
+ }
13332
+
13333
+ const frame = preview._remoteFleetPendingFrame;
13334
+ if (!frame || !isRemoteFleetFrameSource(frame.frameUrl)) {
13335
+ clearRemoteFleetPendingFrameDataset(preview, frame);
13336
+ return;
13337
+ }
13338
+
13339
+ preview._remoteFleetFrameLoaderActive = true;
13340
+ const frameIdentity = getRemoteFleetFrameIdentity(frame);
13341
+ const finish = loaded => {
13342
+ const currentPending = preview._remoteFleetPendingFrame;
13343
+ const stillLatest = getRemoteFleetFrameIdentity(currentPending) === frameIdentity;
13344
+ let committed = false;
13345
+ if (loaded && stillLatest) {
13346
+ committed = commitRemoteFleetFrameToPreview(preview, image, frame);
13347
+ window.RuntimeTrace?.emit?.('remote.frame.uiPatched', {
13348
+ count: committed ? 1 : 0,
13349
+ kind: frame.kind,
13350
+ seq: frame.frameSeq
13351
+ });
13352
+ }
13353
+
13354
+ if (stillLatest) {
13355
+ clearRemoteFleetPendingFrameDataset(preview, frame);
13356
+ }
13357
+
13358
+ preview._remoteFleetFrameLoaderActive = false;
13359
+ if (preview._remoteFleetPendingFrame) {
13360
+ processRemoteFleetFrameQueue(preview, image);
13361
+ }
13362
+ };
13363
+
13364
+ if (typeof Image !== 'function') {
13365
+ finish(true);
13366
+ return;
13367
+ }
13368
+
13369
+ const loader = new Image();
13370
+ loader.decoding = 'async';
13371
+ loader.onload = () => {
13372
+ const decoded = typeof loader.decode === 'function'
13373
+ ? loader.decode().catch(() => undefined)
13374
+ : Promise.resolve();
13375
+ decoded.then(() => finish(true));
13376
+ };
13377
+ loader.onerror = () => finish(false);
13378
+ loader.src = frame.frameUrl;
13379
+ }
13380
+
13381
+ function queueRemoteFleetFrameImageSwap(preview, frame) {
13382
+ if (!preview || !frame || !isRemoteFleetFrameNewerForPreview(preview, frame, true)) {
13383
+ return false;
13384
+ }
13385
+
13386
+ const image = ensureRemoteFleetFrameImage(preview, frame);
13387
+ if (!image) {
13388
+ return false;
13389
+ }
13390
+
13391
+ const nextFrame = cloneRemoteFleetFramePatch(frame);
13392
+ preview._remoteFleetPendingFrame = nextFrame;
13393
+ preview.dataset.remoteFleetPendingFrameKind = nextFrame.kind;
13394
+ preview.dataset.remoteFleetPendingFrameSeq = String(nextFrame.frameSeq || 0);
13395
+ preview.dataset.remoteFleetPendingFrameUrl = nextFrame.frameUrl;
13396
+ processRemoteFleetFrameQueue(preview, image);
13397
+ return true;
13398
+ }
13399
+
13400
+ function applyRemoteFleetFramePatchToPreview(preview, frame) {
13401
+ return queueRemoteFleetFrameImageSwap(preview, frame);
13402
+ }
13403
+
13154
13404
  function applyRemoteFleetFramePatches(bodyView, patches) {
13155
13405
  if (!bodyView || !Array.isArray(patches) || patches.length === 0) {
13156
13406
  return 0;
@@ -13178,7 +13428,7 @@
13178
13428
  });
13179
13429
 
13180
13430
  if (applied > 0) {
13181
- window.RuntimeTrace?.emit?.('remote.frame.uiPatched', {
13431
+ window.RuntimeTrace?.emit?.('remote.frame.uiQueued', {
13182
13432
  count: applied
13183
13433
  });
13184
13434
  }
@@ -13956,6 +14206,9 @@
13956
14206
  const refreshedAt = getRemoteFleetMetadataValue(nodeModel, 'RemoteFleetLastRefreshAtUtc', '');
13957
14207
  const lastError = getRemoteFleetMetadataValue(nodeModel, 'RemoteFleetLastError', '');
13958
14208
  const hostTargetState = String(getRemoteFleetMetadataValue(nodeModel, 'RemoteFleetHostTargetState', 'inactive')).trim().toLowerCase();
14209
+ const registryStatus = String(getRemoteFleetMetadataValue(nodeModel, 'RemoteFleetRegistryStatus', '')).trim().toLowerCase();
14210
+ const registryReason = String(getRemoteFleetMetadataValue(nodeModel, 'RemoteFleetRegistryReason', '')).trim();
14211
+ const routeInfo = getRemoteFleetRegistryRouteInfo(registryStatus, registryReason, hostTargetState);
13959
14212
  const isHostingTarget = hostTargetState === 'hosting';
13960
14213
 
13961
14214
  if (!isHostingTarget) {
@@ -14024,6 +14277,13 @@
14024
14277
  label: 'AI',
14025
14278
  value: String(aiCapableCount),
14026
14279
  tone: aiCapableCount > 0 ? 'online' : 'default'
14280
+ },
14281
+ {
14282
+ key: 'route',
14283
+ label: 'Route',
14284
+ value: routeInfo.value,
14285
+ tone: routeInfo.tone,
14286
+ title: routeInfo.title
14027
14287
  }
14028
14288
  ], lastError);
14029
14289
 
@@ -15331,6 +15591,8 @@
15331
15591
  renew: renew === true,
15332
15592
  success: isRemoteFleetResultSuccess(result),
15333
15593
  active: isRemoteFleetResultActive(result),
15594
+ registryStatus: result?.registryStatus || result?.RegistryStatus || '',
15595
+ registryReason: result?.registryReason || result?.RegistryReason || '',
15334
15596
  error: result?.error || result?.Error || ''
15335
15597
  });
15336
15598
  rememberRemoteFleetLocalHostTarget(nodeId, enabled === true, result);
@@ -15345,7 +15607,7 @@
15345
15607
  stopRemoteFleetHostLeaseTimer(nodeId);
15346
15608
  }
15347
15609
  if (isRemoteFleetResultSuccess(result)) {
15348
- setTaskFeedback(enabled ? 'Host target set.' : 'Host target stopped.', 'success');
15610
+ setTaskFeedback(getRemoteFleetHostFeedbackText(enabled, result), 'success');
15349
15611
  } else {
15350
15612
  setTaskFeedback(result?.error || result?.Error || 'Host target update failed.', 'error');
15351
15613
  }
@@ -19565,6 +19827,7 @@
19565
19827
  setModuleForTest: setModuleForTest,
19566
19828
  renderRemoteFleetMonitorForTest: renderRemoteFleetMonitor,
19567
19829
  renderRemoteFleetDeviceForTest: renderRemoteFleetDevice,
19830
+ applyRemoteFleetFramePatchesForTest: applyRemoteFleetFramePatches,
19568
19831
  renderBusinessAutomationEdges: renderBusinessAutomationEdges,
19569
19832
  scheduleBusinessAutomationEdgeRender: scheduleBusinessAutomationEdgeRender,
19570
19833
  syncBusinessAutomationSelectionContext: syncBusinessAutomationSelectionContext,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "mainAssemblyName": "MindExecution.Web",
3
3
  "resources": {
4
- "hash": "sha256-FI1aVvJXZHMtJ4l634osWbTe8sQ5rfdCKfSBgDnqQ70=",
4
+ "hash": "sha256-Cmqf+RyAv8tEys9YULuN18p/g9CFkEKzpsawt4ia1As=",
5
5
  "fingerprinting": {
6
6
  "Google.Protobuf.9h59ukbel7.dll": "Google.Protobuf.dll",
7
7
  "Markdig.d1j7v41cl1.dll": "Markdig.dll",
@@ -127,12 +127,12 @@
127
127
  "MindExecution.Kernel.cqcbagjpqb.dll": "MindExecution.Kernel.dll",
128
128
  "MindExecution.Plugins.Admin.tsn0j478un.dll": "MindExecution.Plugins.Admin.dll",
129
129
  "MindExecution.Plugins.Business.xg74dmn0vz.dll": "MindExecution.Plugins.Business.dll",
130
- "MindExecution.Plugins.Concept.j0zntvuecv.dll": "MindExecution.Plugins.Concept.dll",
130
+ "MindExecution.Plugins.Concept.tggchun4s7.dll": "MindExecution.Plugins.Concept.dll",
131
131
  "MindExecution.Plugins.Directory.9i4bd043ia.dll": "MindExecution.Plugins.Directory.dll",
132
- "MindExecution.Plugins.PlanMaster.vml3qie2ji.dll": "MindExecution.Plugins.PlanMaster.dll",
133
- "MindExecution.Plugins.YouTube.0gfbwq1jfg.dll": "MindExecution.Plugins.YouTube.dll",
134
- "MindExecution.Shared.f3bclzo6k4.dll": "MindExecution.Shared.dll",
135
- "MindExecution.Web.4jhsxoiqgz.dll": "MindExecution.Web.dll",
132
+ "MindExecution.Plugins.PlanMaster.ffy1iht980.dll": "MindExecution.Plugins.PlanMaster.dll",
133
+ "MindExecution.Plugins.YouTube.kqg5bcmjkz.dll": "MindExecution.Plugins.YouTube.dll",
134
+ "MindExecution.Shared.wb65y6ok9q.dll": "MindExecution.Shared.dll",
135
+ "MindExecution.Web.nlrvrfkobr.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",
@@ -280,16 +280,16 @@
280
280
  "netstandard.yvr3prsx0x.dll": "sha256-EksNn8Luo4bOWqJ6X7dIe9qG9oOqwOVzjH2xYyMNi+E=",
281
281
  "MindExecution.Core.fu1rl67yt3.dll": "sha256-6cDbehKdjX71zeL9Ro5GNupn7wqRYfb7yLW2w3Wp05g=",
282
282
  "MindExecution.Kernel.cqcbagjpqb.dll": "sha256-zPB0tmwi/UKdJ//g0xMH1Y02ahDX5ii6ZKdB3yiQQz4=",
283
- "MindExecution.Plugins.Concept.j0zntvuecv.dll": "sha256-/XUaopvgQk71o+jBdb3ljhCAQkXrda6XxCzS0242pIo=",
284
- "MindExecution.Plugins.PlanMaster.vml3qie2ji.dll": "sha256-uS3p/j4Kq171sz/xkiEn08DZni3X6HLbq2OHsYcxIjg=",
285
- "MindExecution.Shared.f3bclzo6k4.dll": "sha256-1ZuF0eTN8dm8o0BzDJX+lyuKB1Wlc8MO2+kPJx/TYec=",
286
- "MindExecution.Web.4jhsxoiqgz.dll": "sha256-QPegscpX6rm9Fp7lPqHdeKDVUFshfip6frFo62NWuss="
283
+ "MindExecution.Plugins.Concept.tggchun4s7.dll": "sha256-o8i4Fz1pef7TgTF7aag8edr4MdRsrTR1SEkGm62oLKI=",
284
+ "MindExecution.Plugins.PlanMaster.ffy1iht980.dll": "sha256-i6pAnXFj3WlRjMHtqgNslLm4oeXdH0gkewCReTcFmE8=",
285
+ "MindExecution.Shared.wb65y6ok9q.dll": "sha256-TGnCszDJ//ZUEVbqHFM8SRC0QtJJENOwpPBXP2PrPwI=",
286
+ "MindExecution.Web.nlrvrfkobr.dll": "sha256-e3TEkMbAHFkyRHYn1HRFL7wflpqIgLd0tilPfLN2Hwo="
287
287
  },
288
288
  "lazyAssembly": {
289
289
  "MindExecution.Plugins.Admin.tsn0j478un.dll": "sha256-g5Q4Ihy2PJKx6EFB6k78dIszLgK4hZ3Xintjvso/zmw=",
290
290
  "MindExecution.Plugins.Business.xg74dmn0vz.dll": "sha256-0bP/QgMyXSk9IlQVun63rnWvkwqqZmJcRe90QoPC6jw=",
291
291
  "MindExecution.Plugins.Directory.9i4bd043ia.dll": "sha256-b+fpVz2RkQC8uL4dIvN6wMWWefoII84Jyfe85EU/URk=",
292
- "MindExecution.Plugins.YouTube.0gfbwq1jfg.dll": "sha256-EEXiqTRw/mDzke0TaI/QAlp2DRCQCfL4lzGSH0pRZ4c="
292
+ "MindExecution.Plugins.YouTube.kqg5bcmjkz.dll": "sha256-/J6Xgi2QF8Aaq4IHL6H6qkkhyFK/mk8gYF/ETHCNso4="
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=20260614-remote-frame-meta-v513" />
11
- <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260614-remote-frame-meta-v513" />
10
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260614-remote-route-status-v515" />
11
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260614-remote-route-status-v515" />
12
12
  <!-- ?쇄뼹??Font Awesome (local) ?쇄뼹??-->
13
13
  <link rel="stylesheet" href="_content/MindExecution.Shared/lib/font-awesome/css/all.min.css" />
14
14
  <!-- ?꿎뼯??-->
@@ -558,7 +558,7 @@
558
558
  }
559
559
 
560
560
  const base = '_content/MindExecution.Shared/js/';
561
- const scriptVersion = '20260614-remote-frame-meta-v513';
561
+ const scriptVersion = '20260614-remote-route-status-v515';
562
562
  const scriptUrl = (script) => `${base}${script}?v=${scriptVersion}`;
563
563
  console.log(`[Script Loader] Shared JS version: ${scriptVersion}`);
564
564
  const criticalScripts = [
@@ -1,5 +1,5 @@
1
1
  self.assetsManifest = {
2
- "version": "3rReX/U0",
2
+ "version": "Go1009q7",
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-U5R3dUgCFR7qo8wM4p3MlIDxa9ZCd686fnrWvQFfSfs=",
89
+ "hash": "sha256-pfqJn3HbG2hf6mQB5J36TJM5Ko6Jj7R0B7EqxBnfo20=",
90
90
  "url": "_content/MindExecution.Shared/js/mind-map-css3d-manager.js"
91
91
  },
92
92
  {
@@ -426,28 +426,28 @@
426
426
  "url": "_framework/MindExecution.Plugins.Business.xg74dmn0vz.dll"
427
427
  },
428
428
  {
429
- "hash": "sha256-/XUaopvgQk71o+jBdb3ljhCAQkXrda6XxCzS0242pIo=",
430
- "url": "_framework/MindExecution.Plugins.Concept.j0zntvuecv.dll"
429
+ "hash": "sha256-o8i4Fz1pef7TgTF7aag8edr4MdRsrTR1SEkGm62oLKI=",
430
+ "url": "_framework/MindExecution.Plugins.Concept.tggchun4s7.dll"
431
431
  },
432
432
  {
433
433
  "hash": "sha256-b+fpVz2RkQC8uL4dIvN6wMWWefoII84Jyfe85EU/URk=",
434
434
  "url": "_framework/MindExecution.Plugins.Directory.9i4bd043ia.dll"
435
435
  },
436
436
  {
437
- "hash": "sha256-uS3p/j4Kq171sz/xkiEn08DZni3X6HLbq2OHsYcxIjg=",
438
- "url": "_framework/MindExecution.Plugins.PlanMaster.vml3qie2ji.dll"
437
+ "hash": "sha256-i6pAnXFj3WlRjMHtqgNslLm4oeXdH0gkewCReTcFmE8=",
438
+ "url": "_framework/MindExecution.Plugins.PlanMaster.ffy1iht980.dll"
439
439
  },
440
440
  {
441
- "hash": "sha256-EEXiqTRw/mDzke0TaI/QAlp2DRCQCfL4lzGSH0pRZ4c=",
442
- "url": "_framework/MindExecution.Plugins.YouTube.0gfbwq1jfg.dll"
441
+ "hash": "sha256-/J6Xgi2QF8Aaq4IHL6H6qkkhyFK/mk8gYF/ETHCNso4=",
442
+ "url": "_framework/MindExecution.Plugins.YouTube.kqg5bcmjkz.dll"
443
443
  },
444
444
  {
445
- "hash": "sha256-1ZuF0eTN8dm8o0BzDJX+lyuKB1Wlc8MO2+kPJx/TYec=",
446
- "url": "_framework/MindExecution.Shared.f3bclzo6k4.dll"
445
+ "hash": "sha256-TGnCszDJ//ZUEVbqHFM8SRC0QtJJENOwpPBXP2PrPwI=",
446
+ "url": "_framework/MindExecution.Shared.wb65y6ok9q.dll"
447
447
  },
448
448
  {
449
- "hash": "sha256-QPegscpX6rm9Fp7lPqHdeKDVUFshfip6frFo62NWuss=",
450
- "url": "_framework/MindExecution.Web.4jhsxoiqgz.dll"
449
+ "hash": "sha256-e3TEkMbAHFkyRHYn1HRFL7wflpqIgLd0tilPfLN2Hwo=",
450
+ "url": "_framework/MindExecution.Web.nlrvrfkobr.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-XdUGtIDw1SDDWXPLtg2RaeuvCW6T6yjMxok5H9KUFaE=",
773
+ "hash": "sha256-WvZp/Otmujh/rLRTGQ5ChJh7Aqrz921nYaaoa05WuJQ=",
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-KqDHFUlmca/5qM/MGimpiIQKNxh1Udxo7/O1bDIsk+s=",
837
+ "hash": "sha256-vpZAej4L7RfIPjq1j/sme3Zfc3tSwR3ezcT+P6sogrc=",
838
838
  "url": "index.html"
839
839
  },
840
840
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: 3rReX/U0 */
1
+ /* Manifest version: Go1009q7 */
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