@mindexec/cli 0.2.51 → 0.2.52

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 +1 -1
  2. package/remote-hub.js +6 -0
  3. package/server.js +5 -3
  4. package/wwwroot/_content/MindExecution.Shared/js/mind-map-css3d-manager.js +270 -4
  5. package/wwwroot/_framework/MindExecution.Core.07ktly047n.dll +0 -0
  6. package/wwwroot/_framework/{MindExecution.Kernel.necgouk2lu.dll → MindExecution.Kernel.jgfwunsvz4.dll} +0 -0
  7. package/wwwroot/_framework/{MindExecution.Plugins.Admin.i1bsxgnkwb.dll → MindExecution.Plugins.Admin.uz1ws5p7x5.dll} +0 -0
  8. package/wwwroot/_framework/{MindExecution.Plugins.Business.opnf5esnox.dll → MindExecution.Plugins.Business.yeedyl4etv.dll} +0 -0
  9. package/wwwroot/_framework/{MindExecution.Plugins.Concept.3c5vvjh1ax.dll → MindExecution.Plugins.Concept.i8wxwseow8.dll} +0 -0
  10. package/wwwroot/_framework/{MindExecution.Plugins.Directory.mcs5ilkrby.dll → MindExecution.Plugins.Directory.mbuksx1hqq.dll} +0 -0
  11. package/wwwroot/_framework/{MindExecution.Plugins.PlanMaster.ofkqkx5csm.dll → MindExecution.Plugins.PlanMaster.vp3cl6bvxb.dll} +0 -0
  12. package/wwwroot/_framework/{MindExecution.Plugins.YouTube.si9ylbnkqo.dll → MindExecution.Plugins.YouTube.snkp6shzuk.dll} +0 -0
  13. package/wwwroot/_framework/{MindExecution.Shared.w5v05uuccd.dll → MindExecution.Shared.irzb0k7hye.dll} +0 -0
  14. package/wwwroot/_framework/MindExecution.Web.td6ps8xw4t.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.fv9epd367q.dll +0 -0
  20. package/wwwroot/_framework/MindExecution.Web.y71txqhdir.dll +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mindexec/cli",
3
- "version": "0.2.51",
3
+ "version": "0.2.52",
4
4
  "description": "MindExec local runtime and bridge CLI",
5
5
  "main": "server.js",
6
6
  "type": "module",
package/remote-hub.js CHANGED
@@ -304,6 +304,7 @@ export function createRemoteHub(options = {}) {
304
304
  DEFAULT_AGENT_TASK_TIMEOUT_MS);
305
305
  const managerPackage = safeString(options.managerPackage ?? env.MINDEXEC_MANAGER_PACKAGE ?? '@mindexec/cli', 128);
306
306
  const managerVersion = safeString(options.managerVersion ?? env.MINDEXEC_MANAGER_VERSION ?? '', 64);
307
+ const hostInstanceId = safeString(options.hostInstanceId ?? env.MINDEXEC_BRIDGE_INSTANCE_ID ?? crypto.randomUUID(), 128) || crypto.randomUUID();
307
308
  const publicEndpoint = safeString(env.MINDEXEC_REMOTE_PUBLIC_ENDPOINT || env.REMOTE_HUB_PUBLIC_ENDPOINT, 256);
308
309
  const publicHost = safeString(env.MINDEXEC_REMOTE_PUBLIC_HOST || env.REMOTE_HUB_PUBLIC_HOST, 128);
309
310
  const pairToken = safeString(
@@ -367,6 +368,7 @@ export function createRemoteHub(options = {}) {
367
368
  active: false,
368
369
  nodeId: '',
369
370
  leaseId: '',
371
+ hostInstanceId: '',
370
372
  endpoint: '',
371
373
  activatedAt: '',
372
374
  updatedAt: '',
@@ -378,6 +380,7 @@ export function createRemoteHub(options = {}) {
378
380
  active: true,
379
381
  nodeId: target.nodeId,
380
382
  leaseId: target.leaseId,
383
+ hostInstanceId: target.hostInstanceId || hostInstanceId,
381
384
  endpoint: target.endpoint,
382
385
  activatedAt: target.activatedAt,
383
386
  updatedAt: target.updatedAt,
@@ -437,6 +440,7 @@ export function createRemoteHub(options = {}) {
437
440
  hostTarget = {
438
441
  nodeId,
439
442
  leaseId: activeSameNode && previous?.leaseId ? previous.leaseId : crypto.randomUUID(),
443
+ hostInstanceId,
440
444
  endpoint: getAgentEndpoint(),
441
445
  activatedAt: activeSameNode && previous?.activatedAt ? previous.activatedAt : now.toISOString(),
442
446
  updatedAt: now.toISOString(),
@@ -469,6 +473,7 @@ export function createRemoteHub(options = {}) {
469
473
  taskTimeoutMs,
470
474
  managerPackage,
471
475
  managerVersion,
476
+ hostInstanceId,
472
477
  agentPackage: '@mindexec/remote',
473
478
  agentEndpoint: getAgentEndpoint(),
474
479
  pairToken: includeSecrets ? pairToken : undefined,
@@ -480,6 +485,7 @@ export function createRemoteHub(options = {}) {
480
485
  hostTargetActive: activeHostTarget.active,
481
486
  hostTargetNodeId: activeHostTarget.nodeId,
482
487
  hostTargetLeaseId: activeHostTarget.leaseId,
488
+ hostTargetHostInstanceId: activeHostTarget.hostInstanceId,
483
489
  hostTargetEndpoint: activeHostTarget.endpoint,
484
490
  hostTargetActivatedAt: activeHostTarget.activatedAt,
485
491
  hostTargetUpdatedAt: activeHostTarget.updatedAt,
package/server.js CHANGED
@@ -33,8 +33,9 @@ const app = express();
33
33
  const PORT = normalizePort(process.env.BRIDGE_PORT);
34
34
  const BRIDGE_ROOT = path.dirname(fileURLToPath(import.meta.url));
35
35
  const PACKAGE_INFO = JSON.parse(readFileSync(path.join(BRIDGE_ROOT, 'package.json'), 'utf8'));
36
- const BRIDGE_PACKAGE_NAME = String(PACKAGE_INFO.name || '@mindexec/cli');
37
- const BRIDGE_VERSION = String(PACKAGE_INFO.version || '0.1.0');
36
+ const BRIDGE_PACKAGE_NAME = String(PACKAGE_INFO.name || '@mindexec/cli');
37
+ const BRIDGE_VERSION = String(PACKAGE_INFO.version || '0.1.0');
38
+ const BRIDGE_INSTANCE_ID = String(process.env.MINDEXEC_BRIDGE_INSTANCE_ID || crypto.randomUUID()).trim() || crypto.randomUUID();
38
39
  const TREE_SITTER_GRAMMAR_DIR = path.join(BRIDGE_ROOT, 'tree-sitter-grammars');
39
40
  const VERBOSE_CODEX_TRACE = /^(1|true|yes|on)$/i.test(String(process.env.BRIDGE_VERBOSE_CODEX || ''));
40
41
  const COLOR_LOGS_ENABLED = Boolean(process.stdout.isTTY) && !process.env.NO_COLOR;
@@ -2515,7 +2516,8 @@ const remoteHub = createRemoteHub({
2515
2516
  logError,
2516
2517
  emitEvent: emitBridgeEvent,
2517
2518
  managerPackage: BRIDGE_PACKAGE_NAME,
2518
- managerVersion: BRIDGE_VERSION
2519
+ managerVersion: BRIDGE_VERSION,
2520
+ hostInstanceId: BRIDGE_INSTANCE_ID
2519
2521
  });
2520
2522
 
2521
2523
  const REMOTE_AGENT_STDIO_TAIL_CHARS = 12000;
@@ -12765,8 +12765,10 @@
12765
12765
  return select;
12766
12766
  }
12767
12767
 
12768
- const REMOTE_FLEET_MONITOR_REFRESH_MS = 5000;
12769
- const REMOTE_FLEET_LIVE_REFRESH_MS = 1000;
12768
+ const REMOTE_FLEET_MONITOR_REFRESH_MS = 10000;
12769
+ const REMOTE_FLEET_LIVE_REFRESH_MS = 5000;
12770
+ const REMOTE_FLEET_LIVE_FRAME_REFRESH_MS = 50;
12771
+ const REMOTE_FLEET_THUMBNAIL_FRAME_REFRESH_MS = 2000;
12770
12772
  const REMOTE_FLEET_TASK_FOLLOW_INITIAL_MS = 250;
12771
12773
  const REMOTE_FLEET_TASK_FOLLOW_REFRESH_MS = 2000;
12772
12774
  const REMOTE_FLEET_TASK_FOLLOW_MAX_TICKS = 60;
@@ -12917,6 +12919,12 @@
12917
12919
  clearInterval(bodyView._remoteFleetMonitorRefreshTimer);
12918
12920
  bodyView._remoteFleetMonitorRefreshTimer = null;
12919
12921
  }
12922
+ if (bodyView._remoteFleetFrameLoopRaf) {
12923
+ cancelAnimationFrame(bodyView._remoteFleetFrameLoopRaf);
12924
+ bodyView._remoteFleetFrameLoopRaf = null;
12925
+ }
12926
+ bodyView._remoteFleetFrameLoopActive = false;
12927
+ bodyView._remoteFleetFrameRefreshInFlight = false;
12920
12928
  if (bodyView._remoteFleetTaskFollowTimer) {
12921
12929
  clearTimeout(bodyView._remoteFleetTaskFollowTimer);
12922
12930
  bodyView._remoteFleetTaskFollowTimer = null;
@@ -12983,6 +12991,200 @@
12983
12991
  || getRemoteFleetDeviceField(device, 'thumbnailDataUrl', 'ThumbnailDataUrl', ''));
12984
12992
  }
12985
12993
 
12994
+ function getRemoteFleetFrameSeq(device, frameKind) {
12995
+ const raw = frameKind === 'live'
12996
+ ? getRemoteFleetDeviceField(device, 'liveFrameSeq', 'LiveFrameSeq', 0)
12997
+ : getRemoteFleetDeviceField(device, 'thumbnailFrameSeq', 'ThumbnailFrameSeq', 0);
12998
+ const seq = Number(raw);
12999
+ return Number.isFinite(seq) ? Math.floor(seq) : 0;
13000
+ }
13001
+
13002
+ function normalizeRemoteFleetFramePayload(payload, fallbackKind = 'thumbnail') {
13003
+ if (!payload || typeof payload !== 'object') {
13004
+ return null;
13005
+ }
13006
+
13007
+ const frame = payload.frame || payload.Frame || payload;
13008
+ if (!frame || typeof frame !== 'object') {
13009
+ return null;
13010
+ }
13011
+
13012
+ const source = String(
13013
+ readRemoteFleetObjectField(frame, 'frameUrl', 'FrameUrl', '')
13014
+ || readRemoteFleetObjectField(frame, 'framePath', 'FramePath', '')
13015
+ || readRemoteFleetObjectField(frame, 'dataUrl', 'DataUrl', '')).trim();
13016
+ if (!isRemoteFleetFrameSource(source)) {
13017
+ return null;
13018
+ }
13019
+
13020
+ const seq = Number(readRemoteFleetObjectField(frame, 'frameSeq', 'FrameSeq', 0));
13021
+ return {
13022
+ deviceId: String(readRemoteFleetObjectField(frame, 'deviceId', 'DeviceId', '')).trim(),
13023
+ kind: String(readRemoteFleetObjectField(frame, 'kind', 'Kind', fallbackKind) || fallbackKind).trim().toLowerCase(),
13024
+ frameSeq: Number.isFinite(seq) ? Math.floor(seq) : 0,
13025
+ frameUrl: source,
13026
+ receivedAt: String(readRemoteFleetObjectField(frame, 'receivedAt', 'ReceivedAt', '') || '').trim(),
13027
+ capturedAt: String(readRemoteFleetObjectField(frame, 'capturedAt', 'CapturedAt', '') || '').trim(),
13028
+ streamId: String(readRemoteFleetObjectField(frame, 'streamId', 'StreamId', '') || '').trim()
13029
+ };
13030
+ }
13031
+
13032
+ function normalizeRemoteFleetDeviceFramePatches(result) {
13033
+ const rows = result?.frames || result?.Frames || [];
13034
+ if (!Array.isArray(rows)) {
13035
+ return [];
13036
+ }
13037
+
13038
+ const patches = [];
13039
+ rows.forEach(row => {
13040
+ const deviceId = String(readRemoteFleetObjectField(row, 'deviceId', 'DeviceId', '') || '').trim();
13041
+ const live = normalizeRemoteFleetFramePayload(row?.live || row?.Live, 'live');
13042
+ const thumbnail = normalizeRemoteFleetFramePayload(row?.thumbnail || row?.Thumbnail, 'thumbnail');
13043
+ [thumbnail, live].forEach(frame => {
13044
+ if (!frame) return;
13045
+ frame.deviceId = frame.deviceId || deviceId;
13046
+ patches.push(frame);
13047
+ });
13048
+ });
13049
+ return patches;
13050
+ }
13051
+
13052
+ function ensureRemoteFleetFrameImage(preview, frame) {
13053
+ let image = preview?.querySelector?.('img[data-remote-fleet-frame-image="true"]');
13054
+ if (image) {
13055
+ return image;
13056
+ }
13057
+
13058
+ image = document.createElement('img');
13059
+ image.dataset.remoteFleetFrameImage = 'true';
13060
+ image.alt = frame.kind === 'live' ? 'Live screen' : 'Remote screen';
13061
+ image.loading = frame.kind === 'thumbnail' ? 'lazy' : 'eager';
13062
+ image.decoding = 'async';
13063
+ image.style.cssText = 'width:100%;height:100%;object-fit:cover;display:block;';
13064
+ const placeholder = preview?.querySelector?.('[data-remote-fleet-screen-placeholder="true"]');
13065
+ if (placeholder) {
13066
+ placeholder.remove();
13067
+ }
13068
+ preview?.insertBefore?.(image, preview.firstChild || null);
13069
+ return image;
13070
+ }
13071
+
13072
+ function applyRemoteFleetFramePatchToPreview(preview, frame) {
13073
+ if (!preview || !frame || !isRemoteFleetFrameSource(frame.frameUrl)) {
13074
+ return false;
13075
+ }
13076
+
13077
+ const currentSeq = Number(preview.dataset.remoteFleetFrameSeq || '0');
13078
+ const nextSeq = Number(frame.frameSeq || 0);
13079
+ const currentKind = String(preview.dataset.remoteFleetFrameKind || '').toLowerCase();
13080
+ const isNewer = frame.kind === 'live' && currentKind !== 'live'
13081
+ || !Number.isFinite(currentSeq)
13082
+ || nextSeq <= 0
13083
+ || nextSeq > currentSeq
13084
+ || String(preview.dataset.remoteFleetFrameUrl || '') !== frame.frameUrl;
13085
+ if (!isNewer) {
13086
+ return false;
13087
+ }
13088
+
13089
+ const image = ensureRemoteFleetFrameImage(preview, frame);
13090
+ if (!image) {
13091
+ return false;
13092
+ }
13093
+
13094
+ image.dataset.remoteFleetFrameKind = frame.kind;
13095
+ image.dataset.remoteFleetFrameSeq = String(nextSeq || 0);
13096
+ image.dataset.remoteFleetFrameUrl = frame.frameUrl;
13097
+ image.loading = frame.kind === 'thumbnail' ? 'lazy' : 'eager';
13098
+ if (image.src !== frame.frameUrl) {
13099
+ image.src = frame.frameUrl;
13100
+ }
13101
+
13102
+ preview.dataset.remoteFleetFrameKind = frame.kind;
13103
+ preview.dataset.remoteFleetFrameSeq = String(nextSeq || 0);
13104
+ preview.dataset.remoteFleetFrameUrl = frame.frameUrl;
13105
+ preview.dataset.remoteFleetFrameAt = frame.receivedAt || frame.capturedAt || '';
13106
+
13107
+ const badge = preview.querySelector('[data-remote-fleet-frame-badge="true"]');
13108
+ if (badge) {
13109
+ const at = frame.receivedAt || frame.capturedAt || '';
13110
+ badge.textContent = frame.kind === 'live'
13111
+ ? `LIVE ${at ? formatRemoteFleetAge(at) : ''}`.trim()
13112
+ : (at ? formatRemoteFleetAge(at) : 'Screen');
13113
+ badge.style.display = 'inline-flex';
13114
+ badge.style.background = frame.kind === 'live'
13115
+ ? 'rgba(220, 38, 38, 0.84)'
13116
+ : 'rgba(15, 23, 42, 0.72)';
13117
+ }
13118
+
13119
+ return true;
13120
+ }
13121
+
13122
+ function applyRemoteFleetFramePatches(bodyView, patches) {
13123
+ if (!bodyView || !Array.isArray(patches) || patches.length === 0) {
13124
+ return 0;
13125
+ }
13126
+
13127
+ let applied = 0;
13128
+ patches.forEach(frame => {
13129
+ const deviceId = String(frame?.deviceId || '').trim();
13130
+ if (!deviceId) return;
13131
+
13132
+ bodyView.querySelectorAll('[data-remote-fleet-device-preview][data-device-id]').forEach(preview => {
13133
+ if (String(preview.dataset.deviceId || '').trim() !== deviceId) return;
13134
+ const currentKind = String(preview.dataset.remoteFleetFrameKind || '').toLowerCase();
13135
+ if (currentKind === 'live' && frame.kind !== 'live') return;
13136
+ if (applyRemoteFleetFramePatchToPreview(preview, frame)) {
13137
+ applied += 1;
13138
+ }
13139
+ });
13140
+
13141
+ bodyView.querySelectorAll(`article[data-device-id]`).forEach(card => {
13142
+ if (String(card.dataset.deviceId || '').trim() === deviceId && frame.kind) {
13143
+ card.dataset.remoteFleetHasFrame = 'true';
13144
+ }
13145
+ });
13146
+ });
13147
+
13148
+ if (applied > 0) {
13149
+ window.RuntimeTrace?.emit?.('remote.frame.uiPatched', {
13150
+ count: applied
13151
+ });
13152
+ }
13153
+
13154
+ return applied;
13155
+ }
13156
+
13157
+ function startRemoteFleetFrameLoop(bodyView, intervalMs, refreshCallback) {
13158
+ if (!bodyView || typeof refreshCallback !== 'function') {
13159
+ return;
13160
+ }
13161
+
13162
+ bodyView._remoteFleetFrameLoopActive = true;
13163
+ let lastTick = 0;
13164
+ const loop = timestamp => {
13165
+ if (!bodyView._remoteFleetFrameLoopActive || !document.body.contains(bodyView)) {
13166
+ clearRemoteFleetTimers(bodyView);
13167
+ return;
13168
+ }
13169
+
13170
+ if (timestamp - lastTick >= intervalMs && bodyView._remoteFleetFrameRefreshInFlight !== true) {
13171
+ lastTick = timestamp;
13172
+ bodyView._remoteFleetFrameRefreshInFlight = true;
13173
+ Promise.resolve(refreshCallback())
13174
+ .catch(() => {
13175
+ clearRemoteFleetTimers(bodyView);
13176
+ })
13177
+ .finally(() => {
13178
+ bodyView._remoteFleetFrameRefreshInFlight = false;
13179
+ });
13180
+ }
13181
+
13182
+ bodyView._remoteFleetFrameLoopRaf = requestAnimationFrame(loop);
13183
+ };
13184
+
13185
+ bodyView._remoteFleetFrameLoopRaf = requestAnimationFrame(loop);
13186
+ }
13187
+
12986
13188
  function isRemoteFleetLiveActive(device) {
12987
13189
  return getRemoteFleetDeviceField(device, 'liveStreamActive', 'LiveStreamActive', false) === true;
12988
13190
  }
@@ -13215,6 +13417,15 @@
13215
13417
  bodyView._remoteFleetRefreshInFlight = false;
13216
13418
  }
13217
13419
  };
13420
+ const refreshRemoteDeviceFrame = async (kind = 'live') => {
13421
+ const result = await invokeDotNetAsync('GetRemoteFleetFrameFromJs', nodeId, deviceId, kind);
13422
+ const frame = normalizeRemoteFleetFramePayload(result?.frame || result?.Frame, kind);
13423
+ if (frame) {
13424
+ frame.deviceId = frame.deviceId || deviceId;
13425
+ applyRemoteFleetFramePatches(bodyView, [frame]);
13426
+ }
13427
+ return result;
13428
+ };
13218
13429
 
13219
13430
  if (!device || !deviceId) {
13220
13431
  const empty = document.createElement('div');
@@ -13314,6 +13525,12 @@
13314
13525
  bodyView.appendChild(header);
13315
13526
 
13316
13527
  const preview = document.createElement('div');
13528
+ preview.dataset.remoteFleetDevicePreview = 'pinned';
13529
+ preview.dataset.deviceId = deviceId;
13530
+ preview.dataset.remoteFleetFrameKind = hasLiveFrame ? 'live' : (hasThumbnail ? 'thumbnail' : '');
13531
+ preview.dataset.remoteFleetFrameSeq = String(hasLiveFrame
13532
+ ? getRemoteFleetDeviceField(device, 'liveFrameSeq', 'LiveFrameSeq', 0)
13533
+ : getRemoteFleetDeviceField(device, 'thumbnailFrameSeq', 'ThumbnailFrameSeq', 0));
13317
13534
  preview.style.cssText = `
13318
13535
  position: relative;
13319
13536
  flex: 0 0 auto;
@@ -13326,6 +13543,9 @@
13326
13543
  `;
13327
13544
  if (hasLiveFrame || hasThumbnail) {
13328
13545
  const image = document.createElement('img');
13546
+ image.dataset.remoteFleetFrameImage = 'true';
13547
+ image.dataset.remoteFleetFrameKind = hasLiveFrame ? 'live' : 'thumbnail';
13548
+ image.dataset.remoteFleetFrameSeq = preview.dataset.remoteFleetFrameSeq;
13329
13549
  image.src = previewSource;
13330
13550
  image.alt = `${name} screen`;
13331
13551
  image.loading = 'lazy';
@@ -13334,6 +13554,7 @@
13334
13554
  preview.appendChild(image);
13335
13555
  } else {
13336
13556
  const placeholder = document.createElement('div');
13557
+ placeholder.dataset.remoteFleetScreenPlaceholder = 'true';
13337
13558
  placeholder.textContent = thumbnailEnabled ? 'No frame yet' : 'Status only';
13338
13559
  placeholder.style.cssText = `
13339
13560
  position: absolute;
@@ -13349,6 +13570,7 @@
13349
13570
  preview.appendChild(placeholder);
13350
13571
  }
13351
13572
  const previewBadge = document.createElement('span');
13573
+ previewBadge.dataset.remoteFleetFrameBadge = 'true';
13352
13574
  previewBadge.textContent = hasLiveFrame
13353
13575
  ? `LIVE ${previewAt ? formatRemoteFleetAge(previewAt) : ''}`.trim()
13354
13576
  : (previewAt ? formatRemoteFleetAge(previewAt) : (hubStatus === 'online' ? 'Pinned' : 'Hub offline'));
@@ -13627,6 +13849,7 @@
13627
13849
  });
13628
13850
 
13629
13851
  if (liveActive) {
13852
+ startRemoteFleetFrameLoop(bodyView, REMOTE_FLEET_LIVE_FRAME_REFRESH_MS, () => refreshRemoteDeviceFrame('live'));
13630
13853
  bodyView._remoteFleetLiveRefreshTimer = setInterval(async () => {
13631
13854
  if (!document.body.contains(bodyView)) {
13632
13855
  clearRemoteFleetTimers(bodyView);
@@ -14141,6 +14364,10 @@
14141
14364
  `;
14142
14365
 
14143
14366
  const livePreview = document.createElement('div');
14367
+ livePreview.dataset.remoteFleetDevicePreview = 'focused-live';
14368
+ livePreview.dataset.deviceId = focusedId;
14369
+ livePreview.dataset.remoteFleetFrameKind = hasLiveFrame ? 'live' : '';
14370
+ livePreview.dataset.remoteFleetFrameSeq = String(getRemoteFleetDeviceField(focusedDevice, 'liveFrameSeq', 'LiveFrameSeq', 0));
14144
14371
  livePreview.style.cssText = `
14145
14372
  position: relative;
14146
14373
  min-width: 0;
@@ -14152,6 +14379,9 @@
14152
14379
  `;
14153
14380
  if (hasLiveFrame) {
14154
14381
  const image = document.createElement('img');
14382
+ image.dataset.remoteFleetFrameImage = 'true';
14383
+ image.dataset.remoteFleetFrameKind = 'live';
14384
+ image.dataset.remoteFleetFrameSeq = livePreview.dataset.remoteFleetFrameSeq;
14155
14385
  image.src = liveFrameSource;
14156
14386
  image.alt = `${focusedName} live screen`;
14157
14387
  image.decoding = 'async';
@@ -14164,6 +14394,7 @@
14164
14394
  livePreview.appendChild(image);
14165
14395
  } else {
14166
14396
  const placeholder = document.createElement('div');
14397
+ placeholder.dataset.remoteFleetScreenPlaceholder = 'true';
14167
14398
  placeholder.textContent = liveActive ? 'Waiting for live frame' : 'Live view idle';
14168
14399
  placeholder.style.cssText = `
14169
14400
  position: absolute;
@@ -14179,6 +14410,7 @@
14179
14410
  livePreview.appendChild(placeholder);
14180
14411
  }
14181
14412
  const liveBadge = document.createElement('span');
14413
+ liveBadge.dataset.remoteFleetFrameBadge = 'true';
14182
14414
  liveBadge.textContent = liveActive
14183
14415
  ? `LIVE ${liveFrameAt ? formatRemoteFleetAge(liveFrameAt) : ''}`.trim()
14184
14416
  : 'FOCUS';
@@ -14267,6 +14499,11 @@
14267
14499
 
14268
14500
  const preview = document.createElement('div');
14269
14501
  preview.dataset.remoteFleetDevicePreview = mode;
14502
+ preview.dataset.deviceId = getRemoteFleetDeviceId(device);
14503
+ preview.dataset.remoteFleetFrameKind = hasLiveFrame ? 'live' : (hasThumbnail ? 'thumbnail' : '');
14504
+ preview.dataset.remoteFleetFrameSeq = String(hasLiveFrame
14505
+ ? getRemoteFleetDeviceField(device, 'liveFrameSeq', 'LiveFrameSeq', 0)
14506
+ : getRemoteFleetDeviceField(device, 'thumbnailFrameSeq', 'ThumbnailFrameSeq', 0));
14270
14507
  preview.style.cssText = `
14271
14508
  position: relative;
14272
14509
  width: 100%;
@@ -14279,6 +14516,9 @@
14279
14516
 
14280
14517
  if (hasLiveFrame || hasThumbnail) {
14281
14518
  const image = document.createElement('img');
14519
+ image.dataset.remoteFleetFrameImage = 'true';
14520
+ image.dataset.remoteFleetFrameKind = hasLiveFrame ? 'live' : 'thumbnail';
14521
+ image.dataset.remoteFleetFrameSeq = preview.dataset.remoteFleetFrameSeq;
14282
14522
  image.src = previewSource;
14283
14523
  image.alt = hasLiveFrame ? `${name} live frame` : `${name} thumbnail`;
14284
14524
  image.loading = 'lazy';
@@ -14316,6 +14556,7 @@
14316
14556
 
14317
14557
  if (hasLiveFrame || (isDetail && previewAt)) {
14318
14558
  const badge = document.createElement('span');
14559
+ badge.dataset.remoteFleetFrameBadge = 'true';
14319
14560
  badge.textContent = hasLiveFrame
14320
14561
  ? (isDetail && previewAt ? `LIVE ${formatRemoteFleetAge(previewAt)}` : 'LIVE')
14321
14562
  : formatRemoteFleetAge(previewAt);
@@ -14738,6 +14979,19 @@
14738
14979
  const readTaskInstruction = () => String(taskInput.value || '').trim();
14739
14980
  const useAiAssist = () => aiToggle.checked === true;
14740
14981
  const getDeviceCards = () => Array.from(grid.querySelectorAll('article[data-device-id]'));
14982
+ const getVisibleFrameDeviceIds = () => {
14983
+ const ids = getDeviceCards()
14984
+ .filter(card => card.style.display !== 'none')
14985
+ .map(card => String(card.dataset.deviceId || '').trim())
14986
+ .filter(Boolean);
14987
+ if (focusedDevice) {
14988
+ const focusedId = getRemoteFleetDeviceId(focusedDevice);
14989
+ if (focusedId) {
14990
+ ids.unshift(focusedId);
14991
+ }
14992
+ }
14993
+ return Array.from(new Set(ids)).slice(0, 120);
14994
+ };
14741
14995
  const refreshRemoteFleetNode = async () => {
14742
14996
  if (bodyView._remoteFleetRefreshInFlight === true) {
14743
14997
  return null;
@@ -14752,6 +15006,11 @@
14752
15006
  bodyView._remoteFleetRefreshInFlight = false;
14753
15007
  }
14754
15008
  };
15009
+ const refreshRemoteFleetVisibleFrames = async (requestThumbnails = false) => {
15010
+ const result = await invokeDotNetAsync('RefreshRemoteFleetFramesFromJs', nodeId, getVisibleFrameDeviceIds(), requestThumbnails === true);
15011
+ applyRemoteFleetFramePatches(bodyView, normalizeRemoteFleetDeviceFramePatches(result));
15012
+ return result;
15013
+ };
14755
15014
  const prepareRemoteFleetTaskFollow = batch => {
14756
15015
  if (!isRemoteFleetTaskBatchActive(batch)) {
14757
15016
  bodyView.dataset.remoteFleetTaskFollowActive = 'false';
@@ -15023,6 +15282,7 @@
15023
15282
 
15024
15283
  const setRemoteFleetHostTarget = async (enabled, options = {}) => {
15025
15284
  const quiet = options?.quiet === true;
15285
+ const renew = options?.renew === true || quiet;
15026
15286
  const activeButton = enabled ? hostButton : stopHostButton;
15027
15287
  if (!quiet && activeButton) {
15028
15288
  activeButton.disabled = true;
@@ -15032,10 +15292,11 @@
15032
15292
  setTaskFeedback(enabled ? 'Setting host target...' : 'Stopping host target...');
15033
15293
  }
15034
15294
  try {
15035
- const result = await invokeDotNetAsync('SetRemoteFleetHostFromJs', nodeId, enabled === true);
15295
+ const result = await invokeDotNetAsync('SetRemoteFleetHostFromJs', nodeId, enabled === true, renew === true);
15036
15296
  window.RuntimeTrace?.emit?.('remote.hostTarget.result', {
15037
15297
  nodeId,
15038
15298
  enabled: enabled === true,
15299
+ renew: renew === true,
15039
15300
  success: isRemoteFleetResultSuccess(result),
15040
15301
  active: isRemoteFleetResultActive(result),
15041
15302
  error: result?.error || result?.Error || ''
@@ -15043,6 +15304,9 @@
15043
15304
  rememberRemoteFleetLocalHostTarget(nodeId, enabled === true, result);
15044
15305
  await syncRemoteFleetNodeStateFromResult(result);
15045
15306
  if (quiet) {
15307
+ if (!isRemoteFleetResultSuccess(result) || !isRemoteFleetResultActive(result)) {
15308
+ stopRemoteFleetHostLeaseTimer(nodeId);
15309
+ }
15046
15310
  return result;
15047
15311
  }
15048
15312
  if (isRemoteFleetResultSuccess(result) && enabled !== true) {
@@ -15205,10 +15469,11 @@
15205
15469
  });
15206
15470
 
15207
15471
  if (isHostingTarget) {
15208
- startRemoteFleetHostLeaseTimer(nodeId, () => setRemoteFleetHostTarget(true, { quiet: true }));
15472
+ startRemoteFleetHostLeaseTimer(nodeId, () => setRemoteFleetHostTarget(true, { quiet: true, renew: true }));
15209
15473
  }
15210
15474
 
15211
15475
  if (hasActiveLiveStream) {
15476
+ startRemoteFleetFrameLoop(bodyView, REMOTE_FLEET_LIVE_FRAME_REFRESH_MS, () => refreshRemoteFleetVisibleFrames(false));
15212
15477
  bodyView._remoteFleetLiveRefreshTimer = setInterval(async () => {
15213
15478
  if (!document.body.contains(bodyView)) {
15214
15479
  clearRemoteFleetTimers(bodyView);
@@ -15222,6 +15487,7 @@
15222
15487
  }
15223
15488
  }, REMOTE_FLEET_LIVE_REFRESH_MS);
15224
15489
  } else if (autoMonitorState && hasMonitorTargets) {
15490
+ startRemoteFleetFrameLoop(bodyView, REMOTE_FLEET_THUMBNAIL_FRAME_REFRESH_MS, () => refreshRemoteFleetVisibleFrames(true));
15225
15491
  bodyView._remoteFleetMonitorRefreshTimer = setInterval(async () => {
15226
15492
  if (!document.body.contains(bodyView)) {
15227
15493
  clearRemoteFleetTimers(bodyView);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "mainAssemblyName": "MindExecution.Web",
3
3
  "resources": {
4
- "hash": "sha256-9/5POBUnUjRLHnaTUce3v/cfR0oqf0jzjsZLKmmaF9k=",
4
+ "hash": "sha256-9JUxLgIdet6zJ56ZG7ShauqiLsfwURY2wj+UzGbhN6o=",
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.ns29bor93l.dll": "System.Private.CoreLib.dll",
126
- "MindExecution.Core.fv9epd367q.dll": "MindExecution.Core.dll",
127
- "MindExecution.Kernel.necgouk2lu.dll": "MindExecution.Kernel.dll",
128
- "MindExecution.Plugins.Admin.i1bsxgnkwb.dll": "MindExecution.Plugins.Admin.dll",
129
- "MindExecution.Plugins.Business.opnf5esnox.dll": "MindExecution.Plugins.Business.dll",
130
- "MindExecution.Plugins.Concept.3c5vvjh1ax.dll": "MindExecution.Plugins.Concept.dll",
131
- "MindExecution.Plugins.Directory.mcs5ilkrby.dll": "MindExecution.Plugins.Directory.dll",
132
- "MindExecution.Plugins.PlanMaster.ofkqkx5csm.dll": "MindExecution.Plugins.PlanMaster.dll",
133
- "MindExecution.Plugins.YouTube.si9ylbnkqo.dll": "MindExecution.Plugins.YouTube.dll",
134
- "MindExecution.Shared.w5v05uuccd.dll": "MindExecution.Shared.dll",
135
- "MindExecution.Web.y71txqhdir.dll": "MindExecution.Web.dll",
126
+ "MindExecution.Core.07ktly047n.dll": "MindExecution.Core.dll",
127
+ "MindExecution.Kernel.jgfwunsvz4.dll": "MindExecution.Kernel.dll",
128
+ "MindExecution.Plugins.Admin.uz1ws5p7x5.dll": "MindExecution.Plugins.Admin.dll",
129
+ "MindExecution.Plugins.Business.yeedyl4etv.dll": "MindExecution.Plugins.Business.dll",
130
+ "MindExecution.Plugins.Concept.i8wxwseow8.dll": "MindExecution.Plugins.Concept.dll",
131
+ "MindExecution.Plugins.Directory.mbuksx1hqq.dll": "MindExecution.Plugins.Directory.dll",
132
+ "MindExecution.Plugins.PlanMaster.vp3cl6bvxb.dll": "MindExecution.Plugins.PlanMaster.dll",
133
+ "MindExecution.Plugins.YouTube.snkp6shzuk.dll": "MindExecution.Plugins.YouTube.dll",
134
+ "MindExecution.Shared.irzb0k7hye.dll": "MindExecution.Shared.dll",
135
+ "MindExecution.Web.td6ps8xw4t.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.fv9epd367q.dll": "sha256-e+bWfgea05kkjqA0d7SoScYnRUTDwrAa8jGcE/9efgM=",
282
- "MindExecution.Kernel.necgouk2lu.dll": "sha256-MU33gJtnXnCTK0arVlYP8NdKUNQmQCeew/ywgj2tgvA=",
283
- "MindExecution.Plugins.Concept.3c5vvjh1ax.dll": "sha256-wyfXidn4Mwhv1tdPa/Zg2SA6siukk/wKFM5m4njh5Fk=",
284
- "MindExecution.Plugins.PlanMaster.ofkqkx5csm.dll": "sha256-9PE8rjbSnD0GOryMtJHtpn5riVUL5GdBFDxDTXp4rqM=",
285
- "MindExecution.Shared.w5v05uuccd.dll": "sha256-xNquLGF4gJlatw7ttFI6XIhlRHGjfcYPAKQLxbrpA60=",
286
- "MindExecution.Web.y71txqhdir.dll": "sha256-bmQOJzNyNjQHR3e5FXnYm2vV7vU8U/EzqTJlJ4KwcGo="
281
+ "MindExecution.Core.07ktly047n.dll": "sha256-hPd6g1aLjuHKYrK39vB2e2zNIT03JHDIOogVdJisxpg=",
282
+ "MindExecution.Kernel.jgfwunsvz4.dll": "sha256-QzAvoq5JLTdZZjwWkIuHVhCHFMjw92dGhzrYo0NM978=",
283
+ "MindExecution.Plugins.Concept.i8wxwseow8.dll": "sha256-chFP/WITGF1EPbkmHMqQmY90WQwsNG7jI+gjohLg744=",
284
+ "MindExecution.Plugins.PlanMaster.vp3cl6bvxb.dll": "sha256-0xofgEHFyL96OcvSI34znXAL5ruOaGdGsci5Sh5T+mI=",
285
+ "MindExecution.Shared.irzb0k7hye.dll": "sha256-MvbceH+10w3Ss5amK8K4BC4Hx6trEMyXe1vAXQSdDyA=",
286
+ "MindExecution.Web.td6ps8xw4t.dll": "sha256-b0daeUMZRom6Z1kV+P0QhVWDaovg0QbC91vQIvA2ClQ="
287
287
  },
288
288
  "lazyAssembly": {
289
- "MindExecution.Plugins.Admin.i1bsxgnkwb.dll": "sha256-5pd/Pw8FqxoZ/PqvlOz4EJuXGLmmTggZYpYjpj3chjA=",
290
- "MindExecution.Plugins.Business.opnf5esnox.dll": "sha256-ND2mM989Ka3iOmyVqQtXkMVkR74oGR67uenBuStXGTA=",
291
- "MindExecution.Plugins.Directory.mcs5ilkrby.dll": "sha256-xuSRgmxlBfx2qx0YiiyxrAvD6S5XKJrCdfxRCOWloqY=",
292
- "MindExecution.Plugins.YouTube.si9ylbnkqo.dll": "sha256-TOoWWas3rXuwWEVbujJUco7sNB8P/fS4k2yB0Vqs0AY="
289
+ "MindExecution.Plugins.Admin.uz1ws5p7x5.dll": "sha256-5g1F71Jv0PP/HXccx2jBR5k8bgq2d2dK8XDYyObESnc=",
290
+ "MindExecution.Plugins.Business.yeedyl4etv.dll": "sha256-OiBtEdBJooJG9IAH2Zuhfh2NsJEtpbLoJ+jnC3a9VPU=",
291
+ "MindExecution.Plugins.Directory.mbuksx1hqq.dll": "sha256-fhmxuuTKS1ndouHTj3FSu+KwUqWILi9nJAN1WJabAIs=",
292
+ "MindExecution.Plugins.YouTube.snkp6shzuk.dll": "sha256-KEV5qk5uwybBSFgCjGFWSO07ZObjBSXhi6iP41dyxt0="
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-registry-v511" />
11
- <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260614-remote-registry-v511" />
10
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260614-remote-realtime-frame-v512" />
11
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260614-remote-realtime-frame-v512" />
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-registry-v511';
561
+ const scriptVersion = '20260614-remote-realtime-frame-v512';
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": "Mphxacza",
2
+ "version": "kgm0PdX0",
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-2LFL3oGey+usyB7lpywzpKYMhBmlMhrXi9IZdtdUJZU=",
89
+ "hash": "sha256-V1OuXmwqGhSExZg1kWPPENZLaSPZWu/q/PgBwC3cQwg=",
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-e+bWfgea05kkjqA0d7SoScYnRUTDwrAa8jGcE/9efgM=",
414
- "url": "_framework/MindExecution.Core.fv9epd367q.dll"
413
+ "hash": "sha256-hPd6g1aLjuHKYrK39vB2e2zNIT03JHDIOogVdJisxpg=",
414
+ "url": "_framework/MindExecution.Core.07ktly047n.dll"
415
415
  },
416
416
  {
417
- "hash": "sha256-MU33gJtnXnCTK0arVlYP8NdKUNQmQCeew/ywgj2tgvA=",
418
- "url": "_framework/MindExecution.Kernel.necgouk2lu.dll"
417
+ "hash": "sha256-QzAvoq5JLTdZZjwWkIuHVhCHFMjw92dGhzrYo0NM978=",
418
+ "url": "_framework/MindExecution.Kernel.jgfwunsvz4.dll"
419
419
  },
420
420
  {
421
- "hash": "sha256-5pd/Pw8FqxoZ/PqvlOz4EJuXGLmmTggZYpYjpj3chjA=",
422
- "url": "_framework/MindExecution.Plugins.Admin.i1bsxgnkwb.dll"
421
+ "hash": "sha256-5g1F71Jv0PP/HXccx2jBR5k8bgq2d2dK8XDYyObESnc=",
422
+ "url": "_framework/MindExecution.Plugins.Admin.uz1ws5p7x5.dll"
423
423
  },
424
424
  {
425
- "hash": "sha256-ND2mM989Ka3iOmyVqQtXkMVkR74oGR67uenBuStXGTA=",
426
- "url": "_framework/MindExecution.Plugins.Business.opnf5esnox.dll"
425
+ "hash": "sha256-OiBtEdBJooJG9IAH2Zuhfh2NsJEtpbLoJ+jnC3a9VPU=",
426
+ "url": "_framework/MindExecution.Plugins.Business.yeedyl4etv.dll"
427
427
  },
428
428
  {
429
- "hash": "sha256-wyfXidn4Mwhv1tdPa/Zg2SA6siukk/wKFM5m4njh5Fk=",
430
- "url": "_framework/MindExecution.Plugins.Concept.3c5vvjh1ax.dll"
429
+ "hash": "sha256-chFP/WITGF1EPbkmHMqQmY90WQwsNG7jI+gjohLg744=",
430
+ "url": "_framework/MindExecution.Plugins.Concept.i8wxwseow8.dll"
431
431
  },
432
432
  {
433
- "hash": "sha256-xuSRgmxlBfx2qx0YiiyxrAvD6S5XKJrCdfxRCOWloqY=",
434
- "url": "_framework/MindExecution.Plugins.Directory.mcs5ilkrby.dll"
433
+ "hash": "sha256-fhmxuuTKS1ndouHTj3FSu+KwUqWILi9nJAN1WJabAIs=",
434
+ "url": "_framework/MindExecution.Plugins.Directory.mbuksx1hqq.dll"
435
435
  },
436
436
  {
437
- "hash": "sha256-9PE8rjbSnD0GOryMtJHtpn5riVUL5GdBFDxDTXp4rqM=",
438
- "url": "_framework/MindExecution.Plugins.PlanMaster.ofkqkx5csm.dll"
437
+ "hash": "sha256-0xofgEHFyL96OcvSI34znXAL5ruOaGdGsci5Sh5T+mI=",
438
+ "url": "_framework/MindExecution.Plugins.PlanMaster.vp3cl6bvxb.dll"
439
439
  },
440
440
  {
441
- "hash": "sha256-TOoWWas3rXuwWEVbujJUco7sNB8P/fS4k2yB0Vqs0AY=",
442
- "url": "_framework/MindExecution.Plugins.YouTube.si9ylbnkqo.dll"
441
+ "hash": "sha256-KEV5qk5uwybBSFgCjGFWSO07ZObjBSXhi6iP41dyxt0=",
442
+ "url": "_framework/MindExecution.Plugins.YouTube.snkp6shzuk.dll"
443
443
  },
444
444
  {
445
- "hash": "sha256-xNquLGF4gJlatw7ttFI6XIhlRHGjfcYPAKQLxbrpA60=",
446
- "url": "_framework/MindExecution.Shared.w5v05uuccd.dll"
445
+ "hash": "sha256-MvbceH+10w3Ss5amK8K4BC4Hx6trEMyXe1vAXQSdDyA=",
446
+ "url": "_framework/MindExecution.Shared.irzb0k7hye.dll"
447
447
  },
448
448
  {
449
- "hash": "sha256-bmQOJzNyNjQHR3e5FXnYm2vV7vU8U/EzqTJlJ4KwcGo=",
450
- "url": "_framework/MindExecution.Web.y71txqhdir.dll"
449
+ "hash": "sha256-b0daeUMZRom6Z1kV+P0QhVWDaovg0QbC91vQIvA2ClQ=",
450
+ "url": "_framework/MindExecution.Web.td6ps8xw4t.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-Dp7hmEZrcfmwHqq9wTzyrgD8uX+Rjk/Nca/UfWIO0ao=",
773
+ "hash": "sha256-wGyB8Myog0UDbOOCHb4dhxOV/v55f4CdT7ZvxeRk7Z4=",
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-UcE/wpl6GRqeR7eg9lYKHo6tvWbqZSMb//rVca+L8qg=",
837
+ "hash": "sha256-9BW4+BDrFuEuMemTbJ1oaH74zwmzsmqIe1JmRtmlqEg=",
838
838
  "url": "index.html"
839
839
  },
840
840
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: Mphxacza */
1
+ /* Manifest version: kgm0PdX0 */
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