@mindexec/cli 0.2.96 → 0.2.98

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 (17) hide show
  1. package/package.json +2 -2
  2. package/server.js +64 -3
  3. package/wwwroot/_content/MindExecution.Shared/js/mind-map-css3d-manager.js +133 -16
  4. package/wwwroot/_framework/{MindExecution.Core.eyl4o4qxg8.dll → MindExecution.Core.cdplo34sb2.dll} +0 -0
  5. package/wwwroot/_framework/{MindExecution.Kernel.hxyapaztgr.dll → MindExecution.Kernel.7k773jan4j.dll} +0 -0
  6. package/wwwroot/_framework/{MindExecution.Plugins.Admin.7kemovesa7.dll → MindExecution.Plugins.Admin.nr5ioavpvn.dll} +0 -0
  7. package/wwwroot/_framework/{MindExecution.Plugins.Business.t370in2g1b.dll → MindExecution.Plugins.Business.qq63kom73x.dll} +0 -0
  8. package/wwwroot/_framework/{MindExecution.Plugins.Concept.oqhv1116kb.dll → MindExecution.Plugins.Concept.y4ipk4t13u.dll} +0 -0
  9. package/wwwroot/_framework/{MindExecution.Plugins.Directory.0v80a0hi9m.dll → MindExecution.Plugins.Directory.u6p6pxpwxp.dll} +0 -0
  10. package/wwwroot/_framework/{MindExecution.Plugins.PlanMaster.hn5sfx4z2l.dll → MindExecution.Plugins.PlanMaster.3gd195fq5t.dll} +0 -0
  11. package/wwwroot/_framework/{MindExecution.Plugins.YouTube.c8sc0tlc6o.dll → MindExecution.Plugins.YouTube.sb0cb9cans.dll} +0 -0
  12. package/wwwroot/_framework/{MindExecution.Shared.osv9nbh3ym.dll → MindExecution.Shared.ib8s249hay.dll} +0 -0
  13. package/wwwroot/_framework/{MindExecution.Web.q1jwri2r1p.dll → MindExecution.Web.bfrevq2q4y.dll} +0 -0
  14. package/wwwroot/_framework/blazor.boot.json +21 -21
  15. package/wwwroot/index.html +3 -3
  16. package/wwwroot/service-worker-assets.js +24 -24
  17. package/wwwroot/service-worker.js +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mindexec/cli",
3
- "version": "0.2.96",
3
+ "version": "0.2.98",
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.15",
51
51
  "@openai/codex-sdk": "^0.137.0",
52
52
  "chokidar": "^3.6.0",
53
53
  "cors": "^2.8.5",
package/server.js CHANGED
@@ -2993,15 +2993,72 @@ function resolveRemoteAgentLauncher() {
2993
2993
  // Fall back to npx for source checkouts or older package installs.
2994
2994
  }
2995
2995
 
2996
- const npxCommand = process.platform === 'win32' ? 'npx.cmd' : 'npx';
2996
+ const npxCli = resolveNpxCliLauncher();
2997
+ if (npxCli) {
2998
+ return {
2999
+ command: process.execPath,
3000
+ argsPrefix: [npxCli, '-y', '@mindexec/remote@latest'],
3001
+ launcher: npxCli,
3002
+ usingNpx: true
3003
+ };
3004
+ }
3005
+
3006
+ if (process.platform === 'win32') {
3007
+ return {
3008
+ command: process.env.ComSpec || 'cmd.exe',
3009
+ argsPrefix: ['/d', '/s', '/c', 'npx.cmd', '-y', '@mindexec/remote@latest'],
3010
+ launcher: 'cmd.exe /c npx.cmd',
3011
+ usingNpx: true
3012
+ };
3013
+ }
3014
+
2997
3015
  return {
2998
- command: npxCommand,
3016
+ command: 'npx',
2999
3017
  argsPrefix: ['-y', '@mindexec/remote@latest'],
3000
- launcher: npxCommand,
3018
+ launcher: 'npx',
3001
3019
  usingNpx: true
3002
3020
  };
3003
3021
  }
3004
3022
 
3023
+ function resolveNpxCliLauncher() {
3024
+ const candidates = [];
3025
+ const npmExecPath = String(process.env.npm_execpath || '').trim();
3026
+ if (npmExecPath) {
3027
+ const normalized = npmExecPath.replace(/\\/g, '/');
3028
+ if (/\/npx-cli\.js$/i.test(normalized)) {
3029
+ candidates.push(npmExecPath);
3030
+ } else if (/\/npm-cli\.js$/i.test(normalized)) {
3031
+ candidates.push(path.join(path.dirname(npmExecPath), 'npx-cli.js'));
3032
+ }
3033
+ }
3034
+
3035
+ const nodeRoot = path.dirname(process.execPath);
3036
+ candidates.push(
3037
+ path.join(nodeRoot, 'node_modules', 'npm', 'bin', 'npx-cli.js'),
3038
+ path.join(BRIDGE_ROOT, 'node_modules', 'npm', 'bin', 'npx-cli.js')
3039
+ );
3040
+
3041
+ const seen = new Set();
3042
+ for (const candidate of candidates) {
3043
+ const resolved = path.resolve(candidate);
3044
+ const key = resolved.toLowerCase();
3045
+ if (seen.has(key)) {
3046
+ continue;
3047
+ }
3048
+
3049
+ seen.add(key);
3050
+ try {
3051
+ if (statSync(resolved).isFile()) {
3052
+ return resolved;
3053
+ }
3054
+ } catch {
3055
+ // Try the next possible npm installation.
3056
+ }
3057
+ }
3058
+
3059
+ return '';
3060
+ }
3061
+
3005
3062
  async function stopRemoteAgentConnection(reason = 'stopped') {
3006
3063
  const previous = remoteAgentState;
3007
3064
  if (previous.proc) {
@@ -3156,6 +3213,10 @@ async function startRemoteAgentConnectionAttempt(options = {}) {
3156
3213
 
3157
3214
  let child;
3158
3215
  try {
3216
+ logEvent(
3217
+ 'remote',
3218
+ `managed RemoteAgent launch ${formatKeyValue('launcher', launcher.launcher)} ${formatKeyValue('manager', manager)}`,
3219
+ 'remote');
3159
3220
  child = spawn(launcher.command, args, {
3160
3221
  cwd: BRIDGE_ROOT,
3161
3222
  stdio: ['ignore', 'pipe', 'pipe'],
@@ -12974,16 +12974,20 @@
12974
12974
  }
12975
12975
 
12976
12976
  const REMOTE_FLEET_MONITOR_REFRESH_MS = 10000;
12977
- const REMOTE_FLEET_LIVE_REFRESH_MS = 5000;
12978
- const REMOTE_FLEET_LIVE_FRAME_REFRESH_MS = 50;
12977
+ const REMOTE_FLEET_LIVE_REFRESH_MS = 30000;
12978
+ const REMOTE_FLEET_FOCUSED_LIVE_FPS = 10;
12979
+ const REMOTE_FLEET_LIVE_FRAME_REFRESH_MS = Math.round(1000 / REMOTE_FLEET_FOCUSED_LIVE_FPS);
12979
12980
  const REMOTE_FLEET_THUMBNAIL_FRAME_REFRESH_MS = 2000;
12980
12981
  const REMOTE_FLEET_FRAME_CANVAS_MAX_DPR = 2;
12982
+ const REMOTE_FLEET_FRAME_BLOB_CACHE_MS = 10000;
12983
+ const REMOTE_FLEET_FRAME_BLOB_CACHE_LIMIT = 96;
12981
12984
  const REMOTE_FLEET_TASK_FOLLOW_INITIAL_MS = 250;
12982
12985
  const REMOTE_FLEET_TASK_FOLLOW_REFRESH_MS = 2000;
12983
12986
  const REMOTE_FLEET_TASK_FOLLOW_MAX_TICKS = 60;
12984
12987
  const REMOTE_FLEET_HOST_LEASE_REFRESH_MS = 10000;
12985
12988
  const remoteFleetHostLeaseTimers = new Map();
12986
12989
  const remoteFleetLocalHostTargets = new Map();
12990
+ const remoteFleetFrameBlobCache = new Map();
12987
12991
  let activeRemoteFleetControlPopup = null;
12988
12992
 
12989
12993
  function findRemoteFleetBodyByNodeId(nodeId) {
@@ -13206,6 +13210,10 @@
13206
13210
  return getRemoteFleetDeviceField(device, 'aiAssistEnabled', 'AiAssistEnabled', false) === true;
13207
13211
  }
13208
13212
 
13213
+ function isRemoteFleetLiveCapable(device) {
13214
+ return getRemoteFleetDeviceField(device, 'liveStreamEnabled', 'LiveStreamEnabled', false) === true;
13215
+ }
13216
+
13209
13217
  function hasRemoteFleetThumbnail(device) {
13210
13218
  return isRemoteFleetFrameSource(getRemoteFleetFrameSource(device, 'thumbnail'));
13211
13219
  }
@@ -13440,15 +13448,41 @@
13440
13448
  return null;
13441
13449
  }
13442
13450
 
13443
- const response = await fetch(frame.frameUrl, {
13444
- cache: 'no-store',
13445
- credentials: 'omit'
13446
- });
13447
- if (!response.ok) {
13448
- throw new Error(`remote-frame-fetch-${response.status}`);
13451
+ const now = typeof performance !== 'undefined' ? performance.now() : Date.now();
13452
+ for (const [key, entry] of remoteFleetFrameBlobCache) {
13453
+ if (!entry || entry.expiresAt <= now || remoteFleetFrameBlobCache.size > REMOTE_FLEET_FRAME_BLOB_CACHE_LIMIT) {
13454
+ remoteFleetFrameBlobCache.delete(key);
13455
+ }
13449
13456
  }
13450
13457
 
13451
- const blob = await response.blob();
13458
+ const identity = getRemoteFleetFrameIdentity(frame);
13459
+ let entry = remoteFleetFrameBlobCache.get(identity);
13460
+ if (!entry) {
13461
+ const promise = fetch(frame.frameUrl, {
13462
+ cache: 'no-store',
13463
+ credentials: 'omit'
13464
+ })
13465
+ .then(response => {
13466
+ if (!response.ok) {
13467
+ throw new Error(`remote-frame-fetch-${response.status}`);
13468
+ }
13469
+ return response.blob();
13470
+ })
13471
+ .catch(error => {
13472
+ remoteFleetFrameBlobCache.delete(identity);
13473
+ throw error;
13474
+ });
13475
+
13476
+ entry = {
13477
+ promise,
13478
+ expiresAt: now + REMOTE_FLEET_FRAME_BLOB_CACHE_MS
13479
+ };
13480
+ remoteFleetFrameBlobCache.set(identity, entry);
13481
+ } else {
13482
+ entry.expiresAt = now + REMOTE_FLEET_FRAME_BLOB_CACHE_MS;
13483
+ }
13484
+
13485
+ const blob = await entry.promise;
13452
13486
  return createImageBitmap(blob);
13453
13487
  }
13454
13488
 
@@ -14620,7 +14654,7 @@
14620
14654
  const taskEnabled = isRemoteFleetDeviceTaskCapable(device);
14621
14655
  const aiAssistEnabled = isRemoteFleetDeviceAiCapable(device);
14622
14656
  const thumbnailEnabled = isRemoteFleetThumbnailCapable(device);
14623
- const liveStreamEnabled = getRemoteFleetDeviceField(device, 'liveStreamEnabled', 'LiveStreamEnabled', false) === true;
14657
+ const liveStreamEnabled = isRemoteFleetLiveCapable(device);
14624
14658
  const liveActive = isRemoteFleetLiveActive(device);
14625
14659
  const liveStreamId = String(getRemoteFleetDeviceField(device, 'liveStreamId', 'LiveStreamId', ''));
14626
14660
  const hasLiveFrame = hasRemoteFleetLiveFrame(device);
@@ -15625,7 +15659,7 @@
15625
15659
 
15626
15660
  const liveActions = document.createElement('div');
15627
15661
  liveActions.style.cssText = 'display:flex;align-items:center;gap:8px;flex-wrap:wrap;';
15628
- if (isRemoteFleetDeviceConnected(focusedDevice) && getRemoteFleetDeviceField(focusedDevice, 'liveStreamEnabled', 'LiveStreamEnabled', false) === true) {
15662
+ if (isRemoteFleetDeviceConnected(focusedDevice) && isRemoteFleetLiveCapable(focusedDevice)) {
15629
15663
  const startLiveButton = createRemoteFleetButton(liveActive ? 'Restart live' : 'Start live', 'Start focused view-only live stream', 'live-start');
15630
15664
  startLiveButton.dataset.deviceId = focusedId;
15631
15665
  startLiveButton.style.height = '30px';
@@ -15783,7 +15817,7 @@
15783
15817
  .join(' / ') || 'unknown';
15784
15818
  const release = String(device?.release || device?.Release || '');
15785
15819
  const thumbnailEnabled = device?.thumbnailEnabled === true || device?.ThumbnailEnabled === true;
15786
- const liveStreamEnabled = device?.liveStreamEnabled === true || device?.LiveStreamEnabled === true;
15820
+ const liveStreamEnabled = isRemoteFleetLiveCapable(device);
15787
15821
  const liveStreamActive = isRemoteFleetLiveActive(device);
15788
15822
  const liveStreamId = String(device?.liveStreamId || device?.LiveStreamId || '');
15789
15823
  const taskEnabled = isRemoteFleetDeviceTaskCapable(device);
@@ -15999,7 +16033,7 @@
15999
16033
  const connectedDevice = isRemoteFleetDeviceConnected(device);
16000
16034
  const name = getRemoteFleetDeviceName(device);
16001
16035
  const deviceId = getRemoteFleetDeviceId(device);
16002
- const liveStreamEnabled = device?.liveStreamEnabled === true || device?.LiveStreamEnabled === true;
16036
+ const liveStreamEnabled = isRemoteFleetLiveCapable(device);
16003
16037
  const liveStreamActive = isRemoteFleetLiveActive(device);
16004
16038
  const hasThumbnail = hasRemoteFleetThumbnail(device);
16005
16039
  const hasLiveFrame = hasRemoteFleetLiveFrame(device);
@@ -16181,6 +16215,12 @@
16181
16215
  const readTaskInstruction = () => String(taskInput.value || '').trim();
16182
16216
  const useAiAssist = () => aiToggle.checked === true;
16183
16217
  const getDeviceCards = () => Array.from(grid.querySelectorAll('article[data-device-id]'));
16218
+ const pushUniqueFrameDeviceId = (ids, device) => {
16219
+ const id = getRemoteFleetDeviceId(device);
16220
+ if (id && !ids.includes(id)) {
16221
+ ids.push(id);
16222
+ }
16223
+ };
16184
16224
  const getVisibleFrameDeviceIds = () => {
16185
16225
  const ids = getDeviceCards()
16186
16226
  .filter(card => card.style.display !== 'none')
@@ -16194,6 +16234,64 @@
16194
16234
  }
16195
16235
  return Array.from(new Set(ids)).slice(0, 120);
16196
16236
  };
16237
+ const getFocusedLiveFrameDeviceIds = () => {
16238
+ const ids = [];
16239
+ if (selectedDevice
16240
+ && isRemoteFleetDeviceConnected(selectedDevice)
16241
+ && (isRemoteFleetLiveCapable(selectedDevice) || isRemoteFleetLiveActive(selectedDevice))) {
16242
+ pushUniqueFrameDeviceId(ids, selectedDevice);
16243
+ }
16244
+ if (focusedDevice
16245
+ && isRemoteFleetDeviceConnected(focusedDevice)
16246
+ && (isRemoteFleetLiveCapable(focusedDevice) || isRemoteFleetLiveActive(focusedDevice))) {
16247
+ pushUniqueFrameDeviceId(ids, focusedDevice);
16248
+ }
16249
+ devices
16250
+ .filter(device => isRemoteFleetDeviceConnected(device) && isRemoteFleetLiveActive(device))
16251
+ .slice(0, 6)
16252
+ .forEach(device => pushUniqueFrameDeviceId(ids, device));
16253
+ return ids.slice(0, 8);
16254
+ };
16255
+ const getAutoLiveDevice = () => {
16256
+ if (selectedDevice && isRemoteFleetDeviceConnected(selectedDevice) && isRemoteFleetLiveCapable(selectedDevice)) {
16257
+ return selectedDevice;
16258
+ }
16259
+ if (focusedDevice && isRemoteFleetDeviceConnected(focusedDevice) && isRemoteFleetLiveCapable(focusedDevice)) {
16260
+ return focusedDevice;
16261
+ }
16262
+ return null;
16263
+ };
16264
+ const ensureFocusedRemoteFleetLiveStream = async () => {
16265
+ const target = getAutoLiveDevice();
16266
+ if (!target || isRemoteFleetLiveActive(target)) {
16267
+ return null;
16268
+ }
16269
+
16270
+ const deviceId = getRemoteFleetDeviceId(target);
16271
+ if (!deviceId || bodyView._remoteFleetAutoLiveStartInFlight === deviceId) {
16272
+ return null;
16273
+ }
16274
+
16275
+ bodyView._remoteFleetAutoLiveStartInFlight = deviceId;
16276
+ try {
16277
+ const result = await invokeDotNetAsync('StartRemoteFleetLiveStreamFromJs', nodeId, deviceId);
16278
+ window.RuntimeTrace?.emit?.('remote.live.autoStart', {
16279
+ nodeId,
16280
+ deviceId,
16281
+ success: isRemoteFleetResultSuccess(result),
16282
+ fps: result?.fps || result?.Fps || 0,
16283
+ error: result?.error || result?.Error || ''
16284
+ });
16285
+ if (isRemoteFleetResultSuccess(result)) {
16286
+ await syncRemoteFleetNodeStateFromResult(result);
16287
+ }
16288
+ return result;
16289
+ } finally {
16290
+ if (bodyView._remoteFleetAutoLiveStartInFlight === deviceId) {
16291
+ bodyView._remoteFleetAutoLiveStartInFlight = '';
16292
+ }
16293
+ }
16294
+ };
16197
16295
  const refreshRemoteFleetNode = async () => {
16198
16296
  if (bodyView._remoteFleetRefreshInFlight === true) {
16199
16297
  return null;
@@ -16213,6 +16311,18 @@
16213
16311
  applyRemoteFleetFramePatches(bodyView, normalizeRemoteFleetDeviceFramePatches(result));
16214
16312
  return result;
16215
16313
  };
16314
+ const refreshRemoteFleetFocusedLiveFrames = async () => {
16315
+ const deviceIds = getFocusedLiveFrameDeviceIds();
16316
+ if (deviceIds.length === 0) {
16317
+ return null;
16318
+ }
16319
+
16320
+ const result = await invokeDotNetAsync('RefreshRemoteFleetFramesFromJs', nodeId, deviceIds, false);
16321
+ const patches = normalizeRemoteFleetDeviceFramePatches(result)
16322
+ .filter(frame => String(frame.kind || '').toLowerCase() === 'live');
16323
+ applyRemoteFleetFramePatches(bodyView, patches);
16324
+ return result;
16325
+ };
16216
16326
  const prepareRemoteFleetTaskFollow = batch => {
16217
16327
  if (!isRemoteFleetTaskBatchActive(batch)) {
16218
16328
  bodyView.dataset.remoteFleetTaskFollowActive = 'false';
@@ -16514,13 +16624,13 @@
16514
16624
  error: result?.error || result?.Error || ''
16515
16625
  });
16516
16626
  rememberRemoteFleetLocalHostTarget(nodeId, enabled === true, result);
16517
- await syncRemoteFleetNodeStateFromResult(result);
16518
16627
  if (quiet) {
16519
16628
  if (!isRemoteFleetResultSuccess(result) || !isRemoteFleetResultActive(result)) {
16520
16629
  stopRemoteFleetHostLeaseTimer(nodeId);
16521
16630
  }
16522
16631
  return result;
16523
16632
  }
16633
+ await syncRemoteFleetNodeStateFromResult(result);
16524
16634
  if (isRemoteFleetResultSuccess(result) && enabled !== true) {
16525
16635
  stopRemoteFleetHostLeaseTimer(nodeId);
16526
16636
  }
@@ -16704,8 +16814,15 @@
16704
16814
  startRemoteFleetHostLeaseTimer(nodeId, () => setRemoteFleetHostTarget(true, { quiet: true, renew: true }));
16705
16815
  }
16706
16816
 
16707
- if (hasActiveLiveStream) {
16708
- startRemoteFleetFrameLoop(bodyView, REMOTE_FLEET_LIVE_FRAME_REFRESH_MS, () => refreshRemoteFleetVisibleFrames(false));
16817
+ const hasFocusedLiveTarget = getFocusedLiveFrameDeviceIds().length > 0 || !!getAutoLiveDevice();
16818
+ if (hasFocusedLiveTarget || hasActiveLiveStream) {
16819
+ ensureFocusedRemoteFleetLiveStream().catch(error => {
16820
+ window.RuntimeTrace?.emit?.('remote.live.autoStartFailed', {
16821
+ nodeId,
16822
+ error: error?.message || String(error || '')
16823
+ });
16824
+ });
16825
+ startRemoteFleetFrameLoop(bodyView, REMOTE_FLEET_LIVE_FRAME_REFRESH_MS, () => refreshRemoteFleetFocusedLiveFrames());
16709
16826
  bodyView._remoteFleetLiveRefreshTimer = setInterval(async () => {
16710
16827
  if (!document.body.contains(bodyView)) {
16711
16828
  clearRemoteFleetTimers(bodyView);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "mainAssemblyName": "MindExecution.Web",
3
3
  "resources": {
4
- "hash": "sha256-S5i7mkxpxBzpYozfgxXvhV6AnfLnexeTJfewiJ8jOtA=",
4
+ "hash": "sha256-aehUBy4ZKXMCMfDXLIq7332pdALPad8G/hoFfyL1YcY=",
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.eyl4o4qxg8.dll": "MindExecution.Core.dll",
127
- "MindExecution.Kernel.hxyapaztgr.dll": "MindExecution.Kernel.dll",
128
- "MindExecution.Plugins.Admin.7kemovesa7.dll": "MindExecution.Plugins.Admin.dll",
129
- "MindExecution.Plugins.Business.t370in2g1b.dll": "MindExecution.Plugins.Business.dll",
130
- "MindExecution.Plugins.Concept.oqhv1116kb.dll": "MindExecution.Plugins.Concept.dll",
131
- "MindExecution.Plugins.Directory.0v80a0hi9m.dll": "MindExecution.Plugins.Directory.dll",
132
- "MindExecution.Plugins.PlanMaster.hn5sfx4z2l.dll": "MindExecution.Plugins.PlanMaster.dll",
133
- "MindExecution.Plugins.YouTube.c8sc0tlc6o.dll": "MindExecution.Plugins.YouTube.dll",
134
- "MindExecution.Shared.osv9nbh3ym.dll": "MindExecution.Shared.dll",
135
- "MindExecution.Web.q1jwri2r1p.dll": "MindExecution.Web.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.y4ipk4t13u.dll": "MindExecution.Plugins.Concept.dll",
131
+ "MindExecution.Plugins.Directory.u6p6pxpwxp.dll": "MindExecution.Plugins.Directory.dll",
132
+ "MindExecution.Plugins.PlanMaster.3gd195fq5t.dll": "MindExecution.Plugins.PlanMaster.dll",
133
+ "MindExecution.Plugins.YouTube.sb0cb9cans.dll": "MindExecution.Plugins.YouTube.dll",
134
+ "MindExecution.Shared.ib8s249hay.dll": "MindExecution.Shared.dll",
135
+ "MindExecution.Web.bfrevq2q4y.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.eyl4o4qxg8.dll": "sha256-JtBC04XSxkMOl0cZOA2ZWvyV88yYPyU0nkIbBCF9Jtc=",
282
- "MindExecution.Kernel.hxyapaztgr.dll": "sha256-q59U8/001rTsB1m+pkA4PkI9a9lvf5fijDWKXbN7uQ4=",
283
- "MindExecution.Plugins.Concept.oqhv1116kb.dll": "sha256-kEAfhSpocd0AdwocZnMU2+v0W2y6HJV7TRiOB6FbmDY=",
284
- "MindExecution.Plugins.PlanMaster.hn5sfx4z2l.dll": "sha256-Y2F3UYa2JgW9pCxL/YlCHo6gUohqHjQ4Z59cL/fdDBU=",
285
- "MindExecution.Shared.osv9nbh3ym.dll": "sha256-yKMhEPXMN1XCDYyFMEbhio9mvn7j2JkPK/upMkWEfOE=",
286
- "MindExecution.Web.q1jwri2r1p.dll": "sha256-bovOzmI58+BvUxaKQrGot/z4TEAg+VMmAkhiLkkfg1k="
281
+ "MindExecution.Core.cdplo34sb2.dll": "sha256-sLc0yEeGYQhFPxxNKLQsHllAhwjKhNn+pfgRY0bHbpo=",
282
+ "MindExecution.Kernel.7k773jan4j.dll": "sha256-B5H6hzB6g8sWLqXUoXifv8CbLqVt7g1lLkkinTBKF8E=",
283
+ "MindExecution.Plugins.Concept.y4ipk4t13u.dll": "sha256-ElyrQZwOP6pofpDFl6jxXzggowpO1TJO2Rg7ipnXrVE=",
284
+ "MindExecution.Plugins.PlanMaster.3gd195fq5t.dll": "sha256-U0cqGsVxa696XZuKmipYMdlZ3Da761XTPmB5H+7oX7I=",
285
+ "MindExecution.Shared.ib8s249hay.dll": "sha256-HrtN17KC7pAEJ7wf9AihBGmtftOOKR+S1iaj4FTtlwU=",
286
+ "MindExecution.Web.bfrevq2q4y.dll": "sha256-qbbJ5AlXO8D8IEMvXHyA9a64eJEidL8Ksn4a/SD7pu8="
287
287
  },
288
288
  "lazyAssembly": {
289
- "MindExecution.Plugins.Admin.7kemovesa7.dll": "sha256-N8cYgaOErldVhLpnvnh4R9kf7f7fmt+16KhBWlnfG1I=",
290
- "MindExecution.Plugins.Business.t370in2g1b.dll": "sha256-B66uDzMZQfzN3fDnRSM1TvWh0uZjD6AVfUvJAyuGMdI=",
291
- "MindExecution.Plugins.Directory.0v80a0hi9m.dll": "sha256-JPn9UkEDTmb2CO4o/CnuG76R4RgQStGYZ6jH5pzblXk=",
292
- "MindExecution.Plugins.YouTube.c8sc0tlc6o.dll": "sha256-7P2anWE7Z/EXJfm/2CSQ1SWL1qPRtZG+gMwZEeqQaKM="
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.sb0cb9cans.dll": "sha256-WIQjip313fTDOOZ82NrcgM3dSrtgE8+A3grbIyBDMDE="
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-mdm-host-route-v556" />
11
- <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260616-mdm-host-route-v556" />
10
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260616-mdm-live-10fps-v557" />
11
+ <link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260616-mdm-live-10fps-v557" />
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-mdm-host-route-v556';
582
+ const scriptVersion = '20260616-mdm-live-10fps-v557';
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": "CHEnV4yd",
2
+ "version": "ubjvvUaQ",
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-C/+w78To8XgmLIpNeOK3HtqkdKCQKklm792P0hSCaMk=",
89
+ "hash": "sha256-jqoAthq+GECm6zHrHdOnHyBxLrin0deFSEmEXlCpIqg=",
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-JtBC04XSxkMOl0cZOA2ZWvyV88yYPyU0nkIbBCF9Jtc=",
414
- "url": "_framework/MindExecution.Core.eyl4o4qxg8.dll"
413
+ "hash": "sha256-sLc0yEeGYQhFPxxNKLQsHllAhwjKhNn+pfgRY0bHbpo=",
414
+ "url": "_framework/MindExecution.Core.cdplo34sb2.dll"
415
415
  },
416
416
  {
417
- "hash": "sha256-q59U8/001rTsB1m+pkA4PkI9a9lvf5fijDWKXbN7uQ4=",
418
- "url": "_framework/MindExecution.Kernel.hxyapaztgr.dll"
417
+ "hash": "sha256-B5H6hzB6g8sWLqXUoXifv8CbLqVt7g1lLkkinTBKF8E=",
418
+ "url": "_framework/MindExecution.Kernel.7k773jan4j.dll"
419
419
  },
420
420
  {
421
- "hash": "sha256-N8cYgaOErldVhLpnvnh4R9kf7f7fmt+16KhBWlnfG1I=",
422
- "url": "_framework/MindExecution.Plugins.Admin.7kemovesa7.dll"
421
+ "hash": "sha256-TWIfHGuEUUD1JtyuhfH4NM5JkvqAt8KcDVrWxvmwnVc=",
422
+ "url": "_framework/MindExecution.Plugins.Admin.nr5ioavpvn.dll"
423
423
  },
424
424
  {
425
- "hash": "sha256-B66uDzMZQfzN3fDnRSM1TvWh0uZjD6AVfUvJAyuGMdI=",
426
- "url": "_framework/MindExecution.Plugins.Business.t370in2g1b.dll"
425
+ "hash": "sha256-4lgIcKclWQIjijrBJJFu84fgAH4MsDCN/myhG/K9OOU=",
426
+ "url": "_framework/MindExecution.Plugins.Business.qq63kom73x.dll"
427
427
  },
428
428
  {
429
- "hash": "sha256-kEAfhSpocd0AdwocZnMU2+v0W2y6HJV7TRiOB6FbmDY=",
430
- "url": "_framework/MindExecution.Plugins.Concept.oqhv1116kb.dll"
429
+ "hash": "sha256-ElyrQZwOP6pofpDFl6jxXzggowpO1TJO2Rg7ipnXrVE=",
430
+ "url": "_framework/MindExecution.Plugins.Concept.y4ipk4t13u.dll"
431
431
  },
432
432
  {
433
- "hash": "sha256-JPn9UkEDTmb2CO4o/CnuG76R4RgQStGYZ6jH5pzblXk=",
434
- "url": "_framework/MindExecution.Plugins.Directory.0v80a0hi9m.dll"
433
+ "hash": "sha256-BjJ6/XNfp5wd/1RTdh99X9RR0I1GV6t4bp5A+RlAK9s=",
434
+ "url": "_framework/MindExecution.Plugins.Directory.u6p6pxpwxp.dll"
435
435
  },
436
436
  {
437
- "hash": "sha256-Y2F3UYa2JgW9pCxL/YlCHo6gUohqHjQ4Z59cL/fdDBU=",
438
- "url": "_framework/MindExecution.Plugins.PlanMaster.hn5sfx4z2l.dll"
437
+ "hash": "sha256-U0cqGsVxa696XZuKmipYMdlZ3Da761XTPmB5H+7oX7I=",
438
+ "url": "_framework/MindExecution.Plugins.PlanMaster.3gd195fq5t.dll"
439
439
  },
440
440
  {
441
- "hash": "sha256-7P2anWE7Z/EXJfm/2CSQ1SWL1qPRtZG+gMwZEeqQaKM=",
442
- "url": "_framework/MindExecution.Plugins.YouTube.c8sc0tlc6o.dll"
441
+ "hash": "sha256-WIQjip313fTDOOZ82NrcgM3dSrtgE8+A3grbIyBDMDE=",
442
+ "url": "_framework/MindExecution.Plugins.YouTube.sb0cb9cans.dll"
443
443
  },
444
444
  {
445
- "hash": "sha256-yKMhEPXMN1XCDYyFMEbhio9mvn7j2JkPK/upMkWEfOE=",
446
- "url": "_framework/MindExecution.Shared.osv9nbh3ym.dll"
445
+ "hash": "sha256-HrtN17KC7pAEJ7wf9AihBGmtftOOKR+S1iaj4FTtlwU=",
446
+ "url": "_framework/MindExecution.Shared.ib8s249hay.dll"
447
447
  },
448
448
  {
449
- "hash": "sha256-bovOzmI58+BvUxaKQrGot/z4TEAg+VMmAkhiLkkfg1k=",
450
- "url": "_framework/MindExecution.Web.q1jwri2r1p.dll"
449
+ "hash": "sha256-qbbJ5AlXO8D8IEMvXHyA9a64eJEidL8Ksn4a/SD7pu8=",
450
+ "url": "_framework/MindExecution.Web.bfrevq2q4y.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-Ep+Ov81XThtcE2HBQd0whA+KI3/0iJDNLBCtGNYC4TI=",
773
+ "hash": "sha256-lwdIDm7MRgjojZnnKDxY0mgEXEahNVpbFzIiLxbPh9k=",
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-CMNyRVOFnluZqvSs3T+1/tCH4AvEwjV6UNWBUvplyuA=",
837
+ "hash": "sha256-oH92qacgFgianR88nktzfiIq92f7S1DnX+p/mh/U5yQ=",
838
838
  "url": "index.html"
839
839
  },
840
840
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: CHEnV4yd */
1
+ /* Manifest version: ubjvvUaQ */
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