@mindexec/cli 0.2.22 → 0.2.24

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 (22) hide show
  1. package/package.json +1 -1
  2. package/remote-hub.js +4 -0
  3. package/scripts/remote-fleet-render-smoke.mjs +61 -1
  4. package/scripts/remote-http-smoke.mjs +31 -3
  5. package/scripts/remote-hub-scale-smoke.mjs +3 -3
  6. package/server.js +25 -4
  7. package/wwwroot/_content/MindExecution.Shared/js/mind-map-css3d-manager.js +20 -0
  8. package/wwwroot/_framework/MindExecution.Core.ri6sjbi2qk.dll +0 -0
  9. package/wwwroot/_framework/{MindExecution.Kernel.badrt1tkvv.dll → MindExecution.Kernel.qt0p5apeu2.dll} +0 -0
  10. package/wwwroot/_framework/{MindExecution.Plugins.Admin.73w1bvz4r1.dll → MindExecution.Plugins.Admin.i9eswmhltm.dll} +0 -0
  11. package/wwwroot/_framework/{MindExecution.Plugins.Business.dvd82y422m.dll → MindExecution.Plugins.Business.1eayoj2kvc.dll} +0 -0
  12. package/wwwroot/_framework/{MindExecution.Plugins.Concept.m3ukc0xvom.dll → MindExecution.Plugins.Concept.a3850nmm3d.dll} +0 -0
  13. package/wwwroot/_framework/{MindExecution.Plugins.Directory.23tm2uvfvu.dll → MindExecution.Plugins.Directory.l3rmdlu7o7.dll} +0 -0
  14. package/wwwroot/_framework/{MindExecution.Plugins.PlanMaster.8nrc7ge4ob.dll → MindExecution.Plugins.PlanMaster.2x5gsi74yi.dll} +0 -0
  15. package/wwwroot/_framework/{MindExecution.Plugins.YouTube.3ox59073d8.dll → MindExecution.Plugins.YouTube.vbl462eegw.dll} +0 -0
  16. package/wwwroot/_framework/{MindExecution.Shared.va1gxp0crd.dll → MindExecution.Shared.l2w05i7sd6.dll} +0 -0
  17. package/wwwroot/_framework/{MindExecution.Web.jmawk7z8d3.dll → MindExecution.Web.i4ojmz00kp.dll} +0 -0
  18. package/wwwroot/_framework/blazor.boot.json +21 -21
  19. package/wwwroot/index.html +1 -1
  20. package/wwwroot/service-worker-assets.js +24 -24
  21. package/wwwroot/service-worker.js +1 -1
  22. package/wwwroot/_framework/MindExecution.Core.c9fyqe953v.dll +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mindexec/cli",
3
- "version": "0.2.22",
3
+ "version": "0.2.24",
4
4
  "description": "MindExec local runtime and bridge CLI",
5
5
  "main": "server.js",
6
6
  "type": "module",
package/remote-hub.js CHANGED
@@ -205,6 +205,8 @@ export function createRemoteHub(options = {}) {
205
205
  50,
206
206
  30 * 60 * 1000,
207
207
  DEFAULT_AGENT_TASK_TIMEOUT_MS);
208
+ const managerPackage = safeString(options.managerPackage ?? env.MINDEXEC_MANAGER_PACKAGE ?? '@mindexec/cli', 128);
209
+ const managerVersion = safeString(options.managerVersion ?? env.MINDEXEC_MANAGER_VERSION ?? '', 64);
208
210
  const pairToken = safeString(
209
211
  env.REMOTE_HUB_PAIR_TOKEN || env.MINDEXEC_REMOTE_PAIR_TOKEN || crypto.randomBytes(6).toString('hex'),
210
212
  256);
@@ -229,6 +231,8 @@ export function createRemoteHub(options = {}) {
229
231
  protocolVersion: REMOTE_PROTOCOL_VERSION,
230
232
  heartbeatMs,
231
233
  taskTimeoutMs,
234
+ managerPackage,
235
+ managerVersion,
232
236
  agentPackage: '@mindexec/remote',
233
237
  agentEndpoint: `${host}:${boundPort || requestedPort}`,
234
238
  pairToken: includeSecrets ? pairToken : undefined,
@@ -7,7 +7,7 @@ import vm from 'node:vm';
7
7
  import { fileURLToPath } from 'node:url';
8
8
  import { createRemoteHub } from '../remote-hub.js';
9
9
 
10
- const SYNTHETIC_COUNT = Number(process.env.REMOTE_FLEET_RENDER_SMOKE_COUNT || 250);
10
+ const SYNTHETIC_COUNT = Number(process.env.REMOTE_FLEET_RENDER_SMOKE_COUNT || 500);
11
11
 
12
12
  function dataAttributeToDatasetKey(name) {
13
13
  return String(name || '').replace(/^data-/, '').replace(/-([a-z])/g, (_, char) => char.toUpperCase());
@@ -426,6 +426,8 @@ function buildMonitorNode(devices, hubStatus, latestTaskBatch = null, recentTask
426
426
  RemoteFleetLastRefreshAtUtc: new Date().toISOString(),
427
427
  RemoteFleetHubStatus: 'online',
428
428
  RemoteFleetHubEndpoint: endpoint,
429
+ RemoteFleetManagerPackage: hubStatus.managerPackage || '@mindexec/cli',
430
+ RemoteFleetManagerVersion: hubStatus.managerVersion || 'render-smoke-manager',
429
431
  RemoteFleetAgentPackage: '@mindexec/remote',
430
432
  RemoteFleetPairTokenPreview: '<pair-token>',
431
433
  RemoteFleetConnectCommand: `npx @mindexec/remote connect --manager ${endpoint} --pair ${pairToken}`,
@@ -452,6 +454,8 @@ function buildDeviceNode(device, hubStatus) {
452
454
  RemoteFleetLastRefreshAtUtc: new Date().toISOString(),
453
455
  RemoteFleetHubStatus: 'online',
454
456
  RemoteFleetHubEndpoint: endpoint,
457
+ RemoteFleetManagerPackage: hubStatus.managerPackage || '@mindexec/cli',
458
+ RemoteFleetManagerVersion: hubStatus.managerVersion || 'render-smoke-manager',
455
459
  RemoteFleetAgentPackage: '@mindexec/remote',
456
460
  RemoteFleetPinnedDeviceId: device.DeviceId,
457
461
  RemoteFleetPinnedDeviceJson: JSON.stringify(device),
@@ -495,6 +499,8 @@ function createThreeStub() {
495
499
  }
496
500
 
497
501
  const hub = createRemoteHub({
502
+ managerPackage: '@mindexec/cli',
503
+ managerVersion: 'render-smoke-manager',
498
504
  env: {
499
505
  MINDEXEC_REMOTE_HUB: '1',
500
506
  REMOTE_HUB_HOST: '127.0.0.1',
@@ -627,6 +633,18 @@ try {
627
633
  };
628
634
  }
629
635
 
636
+ if (methodName === 'DispatchRemoteFleetTaskFromJs') {
637
+ const useAiAssist = args[3] === true;
638
+ const total = useAiAssist ? aiCount : connectedCount;
639
+ return {
640
+ success: true,
641
+ total,
642
+ queued: total,
643
+ failed: 0,
644
+ approvalLevel: useAiAssist ? 'ai-assist' : 'task-only'
645
+ };
646
+ }
647
+
630
648
  return { success: true };
631
649
  }
632
650
  };
@@ -649,6 +667,7 @@ try {
649
667
  assert.equal(livePanel?.dataset.deviceId, focusedDevice.DeviceId);
650
668
  assert.equal(bodyView.querySelector('[data-remote-fleet-action="task-visible"]')?.disabled, false);
651
669
  assert.ok(bodyView.textContent.includes('all devices, no paging'));
670
+ assert.match(bodyView.querySelector('[data-remote-fleet-manager-version="true"]')?.textContent || '', /^@mindexec\/cli render-smoke-manager - 127\.0\.0\.1:\d+$/);
652
671
  assert.ok(livePanel?.textContent.includes('RemoteFast 20 fps'), livePanel?.textContent || bodyView.textContent);
653
672
  assert.ok(bodyView.querySelector('code')?.textContent.includes('npx @mindexec/remote connect'));
654
673
  assert.ok(bodyView.textContent.includes('synthetic-render-ai'));
@@ -717,6 +736,47 @@ try {
717
736
  assert.match(feedback.textContent, new RegExp(`Queued ${connectedCount - 1}/${connectedCount} visible remote task\\(s\\); 1 failed`));
718
737
  assert.match(feedback.textContent, /device-ai-assist-unavailable/);
719
738
 
739
+ const activeSelects = bodyView.querySelectorAll('select');
740
+ assert.equal(activeSelects.length, 4);
741
+ const [aiFilterSelect] = activeSelects;
742
+ const aiToggle = bodyView.querySelector('[data-remote-fleet-ai-toggle="true"]');
743
+ assert.ok(aiToggle);
744
+ aiFilterSelect.value = 'ai';
745
+ aiFilterSelect.dispatchEvent({ type: 'change' });
746
+ aiToggle.checked = true;
747
+ aiToggle.dispatchEvent({ type: 'change' });
748
+ assert.equal(bodyView.querySelector('[data-remote-fleet-match-count="true"]')?.textContent, `${aiCount}/${SYNTHETIC_COUNT}`);
749
+ assert.equal(sendVisibleButton.disabled, false);
750
+ taskInput.value = 'Dispatch visible AI smoke';
751
+ const aiDispatchCallStart = dotNetCalls.length;
752
+ sendVisibleButton.dispatchEvent({ type: 'click' });
753
+ await wait();
754
+ const aiBatchCall = dotNetCalls
755
+ .slice(aiDispatchCallStart)
756
+ .find(call => call.methodName === 'DispatchRemoteFleetTaskBatchFromJs');
757
+ assert.ok(aiBatchCall);
758
+ const aiTargetIds = Array.isArray(aiBatchCall.args[1]) ? aiBatchCall.args[1] : [];
759
+ const expectedAiTargetIds = devices
760
+ .filter(device => device.Connected && device.AiAssistEnabled)
761
+ .map(device => device.DeviceId)
762
+ .sort();
763
+ assert.deepEqual([...aiTargetIds].sort(), expectedAiTargetIds);
764
+ assert.equal(aiBatchCall.args[3], true);
765
+
766
+ const sendConnectedButton = bodyView.querySelector('[data-remote-fleet-action="task-connected"]');
767
+ assert.ok(sendConnectedButton);
768
+ taskInput.value = 'Dispatch all AI smoke';
769
+ const allAiDispatchCallStart = dotNetCalls.length;
770
+ sendConnectedButton.dispatchEvent({ type: 'click' });
771
+ await wait();
772
+ const allAiCall = dotNetCalls
773
+ .slice(allAiDispatchCallStart)
774
+ .find(call => call.methodName === 'DispatchRemoteFleetTaskFromJs');
775
+ assert.ok(allAiCall);
776
+ assert.equal(allAiCall.args[1], '');
777
+ assert.equal(allAiCall.args[3], true);
778
+ assert.match(feedback.textContent, new RegExp(`Queued ${aiCount}/${aiCount} AI task\\(s\\)`));
779
+
720
780
  const deviceBody = document.createElement('div');
721
781
  document.body.appendChild(deviceBody);
722
782
  manager.renderRemoteFleetDeviceForTest(deviceBody, buildDeviceNode(focusedDevice, hub.getStatus()));
@@ -8,7 +8,7 @@ import { fileURLToPath } from 'node:url';
8
8
 
9
9
  const BRIDGE_TOKEN = 'remote-http-smoke-token';
10
10
  const PAIR_TOKEN = 'remote-http-pair-token';
11
- const SYNTHETIC_COUNT = Number(process.env.REMOTE_HTTP_SMOKE_COUNT || 250);
11
+ const SYNTHETIC_COUNT = Number(process.env.REMOTE_HTTP_SMOKE_COUNT || 500);
12
12
 
13
13
  function wait(ms) {
14
14
  return new Promise(resolve => setTimeout(resolve, ms));
@@ -108,6 +108,8 @@ try {
108
108
  const status = await waitForBridge(baseUrl, details);
109
109
  assert.equal(status.started, true);
110
110
  assert.equal(status.port, remoteHubPort);
111
+ assert.equal(status.managerPackage, '@mindexec/cli');
112
+ assert.equal(status.managerVersion, '0.2.24');
111
113
  assert.equal(status.agentPackage, '@mindexec/remote');
112
114
  assert.equal(status.canvasPagination, 'none');
113
115
  assert.equal(status.canvasDeviceListMode, 'all-devices');
@@ -148,9 +150,9 @@ try {
148
150
 
149
151
  const connectedTargets = devicesResult.payload.devices
150
152
  .filter(device => device.connected && device.capabilities?.taskDispatch)
151
- .slice(0, 200)
153
+ .slice(0, 500)
152
154
  .map(device => device.deviceId);
153
- assert.ok(connectedTargets.length >= 100);
155
+ assert.ok(connectedTargets.length >= 400);
154
156
 
155
157
  const batch = await fetchJson(`${baseUrl}/api/remote/tasks`, {
156
158
  method: 'POST',
@@ -171,6 +173,32 @@ try {
171
173
  assert.equal(batch.payload?.batch?.failed, 0);
172
174
  assert.equal(batch.payload?.batch?.status, 'completed');
173
175
 
176
+ const aiTargets = devicesResult.payload.devices
177
+ .filter(device => device.connected && device.capabilities?.taskDispatch && device.capabilities?.aiAssist)
178
+ .map(device => device.deviceId);
179
+ assert.ok(aiTargets.length >= 200);
180
+ const allAiBatch = await fetchJson(`${baseUrl}/api/remote/tasks`, {
181
+ method: 'POST',
182
+ token: BRIDGE_TOKEN,
183
+ body: JSON.stringify({
184
+ allConnected: true,
185
+ title: 'HTTP smoke all AI task batch',
186
+ instruction: 'HTTP smoke AI batch: summarize fleet condition only on AI-capable agents.',
187
+ approvalLevel: 'ai-assist'
188
+ })
189
+ });
190
+ assert.equal(allAiBatch.ok, true, JSON.stringify(allAiBatch.payload));
191
+ assert.equal(allAiBatch.payload?.ok, true);
192
+ assert.equal(allAiBatch.payload?.approvalLevel, 'ai-assist');
193
+ assert.equal(allAiBatch.payload?.total, aiTargets.length);
194
+ assert.equal(allAiBatch.payload?.queued, aiTargets.length);
195
+ assert.equal(allAiBatch.payload?.batch?.completed, aiTargets.length);
196
+ assert.equal(allAiBatch.payload?.batch?.failed, 0);
197
+ assert.equal(allAiBatch.payload?.batch?.status, 'completed');
198
+ assert.deepEqual(
199
+ [...(allAiBatch.payload?.results || []).map(result => result.deviceId)].sort(),
200
+ [...aiTargets].sort());
201
+
174
202
  const aiTarget = devicesResult.payload.devices.find(device =>
175
203
  device.connected && device.capabilities?.taskDispatch && device.capabilities?.aiAssist);
176
204
  assert.ok(aiTarget);
@@ -3,7 +3,7 @@
3
3
  import assert from 'assert/strict';
4
4
  import { createRemoteHub } from '../remote-hub.js';
5
5
 
6
- const SYNTHETIC_COUNT = Number(process.env.REMOTE_HUB_SCALE_SMOKE_COUNT || 250);
6
+ const SYNTHETIC_COUNT = Number(process.env.REMOTE_HUB_SCALE_SMOKE_COUNT || 500);
7
7
 
8
8
  const hub = createRemoteHub({
9
9
  env: {
@@ -76,8 +76,8 @@ try {
76
76
 
77
77
  const connectedTargets = hub.listDevices()
78
78
  .filter(device => device.connected && device.capabilities?.taskDispatch)
79
- .slice(0, 200);
80
- assert.ok(connectedTargets.length >= 100);
79
+ .slice(0, 500);
80
+ assert.ok(connectedTargets.length >= 400);
81
81
  const scaleBatch = hub.requestAgentTaskBatch(connectedTargets.map(device => device.deviceId), {
82
82
  instruction: 'Synthetic scale task: report current status to the manager.',
83
83
  title: 'Scale task batch'
package/server.js CHANGED
@@ -2464,7 +2464,9 @@ const remoteHub = createRemoteHub({
2464
2464
  logEvent,
2465
2465
  logWarn,
2466
2466
  logError,
2467
- emitEvent: emitBridgeEvent
2467
+ emitEvent: emitBridgeEvent,
2468
+ managerPackage: BRIDGE_PACKAGE_NAME,
2469
+ managerVersion: BRIDGE_VERSION
2468
2470
  });
2469
2471
 
2470
2472
  function trimShellOutput(value, maxLength) {
@@ -7038,15 +7040,21 @@ app.post('/api/remote/tasks', (req, res) => {
7038
7040
  ? req.body.deviceIds.map(value => String(value || '').trim()).filter(Boolean)
7039
7041
  : [];
7040
7042
  const allConnected = req.body?.allConnected !== false;
7043
+ const approvalLevel = req.body?.approvalLevel === 'ai-assist' ? 'ai-assist' : 'task-only';
7041
7044
  const devices = remoteHub.listDevices();
7042
7045
  const targetIds = requestedDeviceIds.length > 0
7043
7046
  ? requestedDeviceIds
7044
- : (allConnected ? devices.filter(device => device.connected).map(device => device.deviceId) : []);
7047
+ : (allConnected
7048
+ ? devices
7049
+ .filter(device => device.connected)
7050
+ .filter(device => approvalLevel !== 'ai-assist' || isRemoteCapabilityEnabled(device, 'aiAssist'))
7051
+ .map(device => device.deviceId)
7052
+ : []);
7045
7053
  const uniqueTargetIds = [...new Set(targetIds)].slice(0, 500);
7046
7054
  const result = remoteHub.requestAgentTaskBatch(uniqueTargetIds, {
7047
7055
  instruction: req.body?.instruction,
7048
7056
  title: req.body?.title,
7049
- approvalLevel: req.body?.approvalLevel,
7057
+ approvalLevel,
7050
7058
  model: req.body?.model,
7051
7059
  batchId: req.body?.batchId
7052
7060
  });
@@ -7055,11 +7063,24 @@ app.post('/api/remote/tasks', (req, res) => {
7055
7063
  ok: result.ok === true,
7056
7064
  total: uniqueTargetIds.length,
7057
7065
  queued: result.queued || 0,
7058
- approvalLevel: req.body?.approvalLevel === 'ai-assist' ? 'ai-assist' : 'task-only',
7066
+ approvalLevel,
7059
7067
  error: result.ok === true ? undefined : (uniqueTargetIds.length === 0 ? 'no-target-devices' : (result.error || 'no-task-queued'))
7060
7068
  });
7061
7069
  });
7062
7070
 
7071
+ function isRemoteCapabilityEnabled(device, key) {
7072
+ const value = device?.capabilities?.[key];
7073
+ if (typeof value === 'boolean') {
7074
+ return value;
7075
+ }
7076
+
7077
+ if (typeof value === 'number') {
7078
+ return value !== 0;
7079
+ }
7080
+
7081
+ return /^(1|true|yes|on)$/i.test(String(value || '').trim());
7082
+ }
7083
+
7063
7084
  app.get('/api/remote/devices/:deviceId/thumbnail', (req, res) => {
7064
7085
  res.setHeader('Cache-Control', 'no-store');
7065
7086
  const thumbnail = remoteHub.getDeviceThumbnail(req.params.deviceId);
@@ -13005,6 +13005,8 @@
13005
13005
  const taskCapableCount = devices.filter(device => isRemoteFleetDeviceConnected(device) && isRemoteFleetDeviceTaskCapable(device)).length;
13006
13006
  const aiCapableCount = devices.filter(device => isRemoteFleetDeviceConnected(device) && isRemoteFleetDeviceAiCapable(device)).length;
13007
13007
  const endpoint = getRemoteFleetMetadataValue(nodeModel, 'RemoteFleetHubEndpoint', '127.0.0.1:5197');
13008
+ const managerPackage = getRemoteFleetMetadataValue(nodeModel, 'RemoteFleetManagerPackage', '@mindexec/cli');
13009
+ const managerVersion = getRemoteFleetMetadataValue(nodeModel, 'RemoteFleetManagerVersion', '');
13008
13010
  const command = getRemoteFleetMetadataValue(
13009
13011
  nodeModel,
13010
13012
  'RemoteFleetConnectCommand',
@@ -13041,6 +13043,24 @@
13041
13043
  top.appendChild(createRemoteFleetStat('AI', String(aiCapableCount), aiCapableCount > 0 ? 'online' : 'default'));
13042
13044
  bodyView.appendChild(top);
13043
13045
 
13046
+ const managerRow = document.createElement('div');
13047
+ managerRow.dataset.remoteFleetManagerVersion = 'true';
13048
+ managerRow.textContent = `${managerPackage}${managerVersion ? ` ${managerVersion}` : ''} - ${endpoint}`;
13049
+ managerRow.title = managerRow.textContent;
13050
+ managerRow.style.cssText = `
13051
+ flex: 0 0 auto;
13052
+ min-width: 0;
13053
+ overflow: hidden;
13054
+ text-overflow: ellipsis;
13055
+ white-space: nowrap;
13056
+ color: #475569;
13057
+ font-size: 10px;
13058
+ font-weight: 850;
13059
+ line-height: 1.2;
13060
+ letter-spacing: 0;
13061
+ `;
13062
+ bodyView.appendChild(managerRow);
13063
+
13044
13064
  const commandRow = document.createElement('div');
13045
13065
  commandRow.style.cssText = `
13046
13066
  display: grid;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "mainAssemblyName": "MindExecution.Web",
3
3
  "resources": {
4
- "hash": "sha256-U10u85TRNQ5EuHSJ6CDlslJbcSBCmbE+UPKJl/T8OtY=",
4
+ "hash": "sha256-TBrdo/L5p3Cw2s6LRukBbwjM9LHR4+ESnUYrHifvIvk=",
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.m05i39uvk9.dll": "System.dll",
124
124
  "netstandard.0xet7jg7ky.dll": "netstandard.dll",
125
125
  "System.Private.CoreLib.rkafq04oma.dll": "System.Private.CoreLib.dll",
126
- "MindExecution.Core.c9fyqe953v.dll": "MindExecution.Core.dll",
127
- "MindExecution.Kernel.badrt1tkvv.dll": "MindExecution.Kernel.dll",
128
- "MindExecution.Plugins.Admin.73w1bvz4r1.dll": "MindExecution.Plugins.Admin.dll",
129
- "MindExecution.Plugins.Business.dvd82y422m.dll": "MindExecution.Plugins.Business.dll",
130
- "MindExecution.Plugins.Concept.m3ukc0xvom.dll": "MindExecution.Plugins.Concept.dll",
131
- "MindExecution.Plugins.Directory.23tm2uvfvu.dll": "MindExecution.Plugins.Directory.dll",
132
- "MindExecution.Plugins.PlanMaster.8nrc7ge4ob.dll": "MindExecution.Plugins.PlanMaster.dll",
133
- "MindExecution.Plugins.YouTube.3ox59073d8.dll": "MindExecution.Plugins.YouTube.dll",
134
- "MindExecution.Shared.va1gxp0crd.dll": "MindExecution.Shared.dll",
135
- "MindExecution.Web.jmawk7z8d3.dll": "MindExecution.Web.dll",
126
+ "MindExecution.Core.ri6sjbi2qk.dll": "MindExecution.Core.dll",
127
+ "MindExecution.Kernel.qt0p5apeu2.dll": "MindExecution.Kernel.dll",
128
+ "MindExecution.Plugins.Admin.i9eswmhltm.dll": "MindExecution.Plugins.Admin.dll",
129
+ "MindExecution.Plugins.Business.1eayoj2kvc.dll": "MindExecution.Plugins.Business.dll",
130
+ "MindExecution.Plugins.Concept.a3850nmm3d.dll": "MindExecution.Plugins.Concept.dll",
131
+ "MindExecution.Plugins.Directory.l3rmdlu7o7.dll": "MindExecution.Plugins.Directory.dll",
132
+ "MindExecution.Plugins.PlanMaster.2x5gsi74yi.dll": "MindExecution.Plugins.PlanMaster.dll",
133
+ "MindExecution.Plugins.YouTube.vbl462eegw.dll": "MindExecution.Plugins.YouTube.dll",
134
+ "MindExecution.Shared.l2w05i7sd6.dll": "MindExecution.Shared.dll",
135
+ "MindExecution.Web.i4ojmz00kp.dll": "MindExecution.Web.dll",
136
136
  "dotnet.js": "dotnet.js",
137
137
  "dotnet.native.xsn1d6x2kd.js": "dotnet.native.js",
138
138
  "dotnet.native.vz0adxojrz.wasm": "dotnet.native.wasm",
@@ -278,18 +278,18 @@
278
278
  "System.Xml.XDocument.c539ki6cuq.dll": "sha256-MPTRJkptrL9nGa2tl4kF46+wErNUYRPCGblX3ANoKoY=",
279
279
  "System.m05i39uvk9.dll": "sha256-5jDfIdbYAigw7/Q/lMzt5W/+cayGbW9ko9FvuaN1GsQ=",
280
280
  "netstandard.0xet7jg7ky.dll": "sha256-xENDv620uJ8fHwLJ2bdhrTHz4QPjvqXOztnk2a4wr0c=",
281
- "MindExecution.Core.c9fyqe953v.dll": "sha256-QFzKrrCvQhHKuzHmjZNnWfLRs8Zvg90nlG23JMRuPiA=",
282
- "MindExecution.Kernel.badrt1tkvv.dll": "sha256-Ay3ypEtsJuNsBYsha1gUwQ98jBnWGZFyOEEd2TmsNew=",
283
- "MindExecution.Plugins.Concept.m3ukc0xvom.dll": "sha256-YjENe8QVAOo4XYknnQD3hSMouQMSQQQ7sryMHObA0Qc=",
284
- "MindExecution.Plugins.PlanMaster.8nrc7ge4ob.dll": "sha256-DGJpulGGAuvc9KS9plHJi8BLX8EBiqV3A90QMAadYCY=",
285
- "MindExecution.Shared.va1gxp0crd.dll": "sha256-ly99wDAapShB+jZ1V95wYNfWyd1Q+JNGxL870fY6XKI=",
286
- "MindExecution.Web.jmawk7z8d3.dll": "sha256-yz2Mpwuz+oEBj6sVtdQOjSPIrLj4cQICK7ZDFVWwy5o="
281
+ "MindExecution.Core.ri6sjbi2qk.dll": "sha256-A69V9d0kzCp+iY+KnM7eHOv/27i9bfe2wtxlFOxm8Kk=",
282
+ "MindExecution.Kernel.qt0p5apeu2.dll": "sha256-kpJt0Eht2tGK6ktrORK+3/hqw7SeMflvlcpGbDnajlE=",
283
+ "MindExecution.Plugins.Concept.a3850nmm3d.dll": "sha256-yqv7m/QtIKalEkjNw4A7Ksk9/Ciy6jDx87gIwttVONk=",
284
+ "MindExecution.Plugins.PlanMaster.2x5gsi74yi.dll": "sha256-Cur6A51vfwizKh8ZploBOcFLdnRu70ZH/LIlegZOelw=",
285
+ "MindExecution.Shared.l2w05i7sd6.dll": "sha256-Xb89XTFwyGt7N0yWSr/WkKSK7ForWYQbrlDe8OJAgvo=",
286
+ "MindExecution.Web.i4ojmz00kp.dll": "sha256-Hr2hEAVt7gvf6c5PGgE3niNlycDnfyzuNuOjMsnZQ3g="
287
287
  },
288
288
  "lazyAssembly": {
289
- "MindExecution.Plugins.Admin.73w1bvz4r1.dll": "sha256-s0/shhl1o5sjys9RDDMPM5TWYZNk64K5RggeZ8gsDKA=",
290
- "MindExecution.Plugins.Business.dvd82y422m.dll": "sha256-OcLlpkGPe6VinOzGw5cDKNjIcQLZW+nv6zGjvzewc8w=",
291
- "MindExecution.Plugins.Directory.23tm2uvfvu.dll": "sha256-vmai+Tkzmk5CeReKLxTMz/gp+uPrt8EaftPIbljEZ0E=",
292
- "MindExecution.Plugins.YouTube.3ox59073d8.dll": "sha256-Te3jpmTgl3HFoKoMct4HMXhg6a9PgTHmVaQltQjKrak="
289
+ "MindExecution.Plugins.Admin.i9eswmhltm.dll": "sha256-Nr8CJnrJlr1DjTXzYCNpcoL8o7749jo/5FTUhMCnFAU=",
290
+ "MindExecution.Plugins.Business.1eayoj2kvc.dll": "sha256-5zJsPlmobzX35e+/HNwVnYIC4p+96/1+NrWFjgHKdGI=",
291
+ "MindExecution.Plugins.Directory.l3rmdlu7o7.dll": "sha256-T4yX6p+2KVC9dZ0VPDCigulg7chN5A4fqEP6Y6Ikkbg=",
292
+ "MindExecution.Plugins.YouTube.vbl462eegw.dll": "sha256-+7IsoWyR315sxA+mdYwO0rANkjsJlEiuqVmw8KvVCzs="
293
293
  }
294
294
  },
295
295
  "cacheBootResources": true,
@@ -558,7 +558,7 @@
558
558
  }
559
559
 
560
560
  const base = '_content/MindExecution.Shared/js/';
561
- const scriptVersion = '20260612-remote-fast-20fps-v479';
561
+ const scriptVersion = '20260612-remote-manager-version-v480';
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": "4y4C9wve",
2
+ "version": "1HroJ9IY",
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-E6d/sEnHvzwsyrryEFowSagM2Y3LCxsotUHJe+5X9mE=",
89
+ "hash": "sha256-QedRf7v7YnCte6Sd32UIRL0HQWCsdyUKwOCozszPrGs=",
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-QFzKrrCvQhHKuzHmjZNnWfLRs8Zvg90nlG23JMRuPiA=",
414
- "url": "_framework/MindExecution.Core.c9fyqe953v.dll"
413
+ "hash": "sha256-A69V9d0kzCp+iY+KnM7eHOv/27i9bfe2wtxlFOxm8Kk=",
414
+ "url": "_framework/MindExecution.Core.ri6sjbi2qk.dll"
415
415
  },
416
416
  {
417
- "hash": "sha256-Ay3ypEtsJuNsBYsha1gUwQ98jBnWGZFyOEEd2TmsNew=",
418
- "url": "_framework/MindExecution.Kernel.badrt1tkvv.dll"
417
+ "hash": "sha256-kpJt0Eht2tGK6ktrORK+3/hqw7SeMflvlcpGbDnajlE=",
418
+ "url": "_framework/MindExecution.Kernel.qt0p5apeu2.dll"
419
419
  },
420
420
  {
421
- "hash": "sha256-s0/shhl1o5sjys9RDDMPM5TWYZNk64K5RggeZ8gsDKA=",
422
- "url": "_framework/MindExecution.Plugins.Admin.73w1bvz4r1.dll"
421
+ "hash": "sha256-Nr8CJnrJlr1DjTXzYCNpcoL8o7749jo/5FTUhMCnFAU=",
422
+ "url": "_framework/MindExecution.Plugins.Admin.i9eswmhltm.dll"
423
423
  },
424
424
  {
425
- "hash": "sha256-OcLlpkGPe6VinOzGw5cDKNjIcQLZW+nv6zGjvzewc8w=",
426
- "url": "_framework/MindExecution.Plugins.Business.dvd82y422m.dll"
425
+ "hash": "sha256-5zJsPlmobzX35e+/HNwVnYIC4p+96/1+NrWFjgHKdGI=",
426
+ "url": "_framework/MindExecution.Plugins.Business.1eayoj2kvc.dll"
427
427
  },
428
428
  {
429
- "hash": "sha256-YjENe8QVAOo4XYknnQD3hSMouQMSQQQ7sryMHObA0Qc=",
430
- "url": "_framework/MindExecution.Plugins.Concept.m3ukc0xvom.dll"
429
+ "hash": "sha256-yqv7m/QtIKalEkjNw4A7Ksk9/Ciy6jDx87gIwttVONk=",
430
+ "url": "_framework/MindExecution.Plugins.Concept.a3850nmm3d.dll"
431
431
  },
432
432
  {
433
- "hash": "sha256-vmai+Tkzmk5CeReKLxTMz/gp+uPrt8EaftPIbljEZ0E=",
434
- "url": "_framework/MindExecution.Plugins.Directory.23tm2uvfvu.dll"
433
+ "hash": "sha256-T4yX6p+2KVC9dZ0VPDCigulg7chN5A4fqEP6Y6Ikkbg=",
434
+ "url": "_framework/MindExecution.Plugins.Directory.l3rmdlu7o7.dll"
435
435
  },
436
436
  {
437
- "hash": "sha256-DGJpulGGAuvc9KS9plHJi8BLX8EBiqV3A90QMAadYCY=",
438
- "url": "_framework/MindExecution.Plugins.PlanMaster.8nrc7ge4ob.dll"
437
+ "hash": "sha256-Cur6A51vfwizKh8ZploBOcFLdnRu70ZH/LIlegZOelw=",
438
+ "url": "_framework/MindExecution.Plugins.PlanMaster.2x5gsi74yi.dll"
439
439
  },
440
440
  {
441
- "hash": "sha256-Te3jpmTgl3HFoKoMct4HMXhg6a9PgTHmVaQltQjKrak=",
442
- "url": "_framework/MindExecution.Plugins.YouTube.3ox59073d8.dll"
441
+ "hash": "sha256-+7IsoWyR315sxA+mdYwO0rANkjsJlEiuqVmw8KvVCzs=",
442
+ "url": "_framework/MindExecution.Plugins.YouTube.vbl462eegw.dll"
443
443
  },
444
444
  {
445
- "hash": "sha256-ly99wDAapShB+jZ1V95wYNfWyd1Q+JNGxL870fY6XKI=",
446
- "url": "_framework/MindExecution.Shared.va1gxp0crd.dll"
445
+ "hash": "sha256-Xb89XTFwyGt7N0yWSr/WkKSK7ForWYQbrlDe8OJAgvo=",
446
+ "url": "_framework/MindExecution.Shared.l2w05i7sd6.dll"
447
447
  },
448
448
  {
449
- "hash": "sha256-yz2Mpwuz+oEBj6sVtdQOjSPIrLj4cQICK7ZDFVWwy5o=",
450
- "url": "_framework/MindExecution.Web.jmawk7z8d3.dll"
449
+ "hash": "sha256-Hr2hEAVt7gvf6c5PGgE3niNlycDnfyzuNuOjMsnZQ3g=",
450
+ "url": "_framework/MindExecution.Web.i4ojmz00kp.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-YFYbUXsuU5KT0E7N+xUyIA0vztkOHHRPlmdp4kBB67c=",
773
+ "hash": "sha256-kWM7D8ztulFtIBvyTggeZrTU4K9z6TNVgEBfC0OsUGw=",
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-tL38lnMES1WBgTPkRcwiazc1i1T3td1aYgwrUvoxQOo=",
837
+ "hash": "sha256-V1c/38AnYBUof00rr3qeKPcgRTdH+0yfa26Igec5DT0=",
838
838
  "url": "index.html"
839
839
  },
840
840
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: 4y4C9wve */
1
+ /* Manifest version: 1HroJ9IY */
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