@mindexec/cli 0.2.15 → 0.2.16

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 +94 -0
  3. package/scripts/remote-fleet-render-smoke.mjs +11 -0
  4. package/scripts/remote-hub-smoke.mjs +21 -1
  5. package/wwwroot/_content/MindExecution.Shared/js/mind-map-css3d-manager.js +18 -2
  6. package/wwwroot/_framework/MindExecution.Core.gvaopvh5wg.dll +0 -0
  7. package/wwwroot/_framework/{MindExecution.Kernel.lqglgq2jmo.dll → MindExecution.Kernel.hpf3wr4dv3.dll} +0 -0
  8. package/wwwroot/_framework/{MindExecution.Plugins.Admin.2jqptn6ylw.dll → MindExecution.Plugins.Admin.y0euqt1gu1.dll} +0 -0
  9. package/wwwroot/_framework/{MindExecution.Plugins.Business.8hzwity3fl.dll → MindExecution.Plugins.Business.9zzc31j54n.dll} +0 -0
  10. package/wwwroot/_framework/{MindExecution.Plugins.Concept.gc38fmee62.dll → MindExecution.Plugins.Concept.sihn2obrrn.dll} +0 -0
  11. package/wwwroot/_framework/{MindExecution.Plugins.Directory.hr2p0grenr.dll → MindExecution.Plugins.Directory.zwbshhfvpb.dll} +0 -0
  12. package/wwwroot/_framework/{MindExecution.Plugins.PlanMaster.ivqd47y3cx.dll → MindExecution.Plugins.PlanMaster.47f3afsrf8.dll} +0 -0
  13. package/wwwroot/_framework/{MindExecution.Plugins.YouTube.tpgm4p80hh.dll → MindExecution.Plugins.YouTube.rpolgpee6c.dll} +0 -0
  14. package/wwwroot/_framework/{MindExecution.Shared.2r4r7zx1ek.dll → MindExecution.Shared.zm6btxgvlg.dll} +0 -0
  15. package/wwwroot/_framework/{MindExecution.Web.stbecd1tk9.dll → MindExecution.Web.7b082n0t0o.dll} +0 -0
  16. package/wwwroot/_framework/blazor.boot.json +21 -21
  17. package/wwwroot/index.html +1 -1
  18. package/wwwroot/service-worker-assets.js +24 -24
  19. package/wwwroot/service-worker.js +1 -1
  20. package/wwwroot/_framework/MindExecution.Core.q469sducjw.dll +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mindexec/cli",
3
- "version": "0.2.15",
3
+ "version": "0.2.16",
4
4
  "description": "MindExec local runtime and bridge CLI",
5
5
  "main": "server.js",
6
6
  "type": "module",
package/remote-hub.js CHANGED
@@ -5,6 +5,7 @@ import crypto from 'crypto';
5
5
  const DEFAULT_REMOTE_HUB_PORT = 5197;
6
6
  const DEFAULT_REMOTE_HUB_HOST = '127.0.0.1';
7
7
  const DEFAULT_HEARTBEAT_MS = 5000;
8
+ const DEFAULT_AGENT_TASK_TIMEOUT_MS = 120000;
8
9
  const MAX_LINE_CHARS = 4 * 1024 * 1024;
9
10
  const MAX_THUMBNAIL_BASE64_CHARS = 3 * 1024 * 1024;
10
11
  const MAX_STREAM_BASE64_CHARS = 3 * 1024 * 1024;
@@ -79,6 +80,7 @@ function createDeviceCounters(overrides = {}) {
79
80
  tasksQueued: 0,
80
81
  taskResultsReceived: 0,
81
82
  taskResultsFailed: 0,
83
+ taskResultsTimedOut: 0,
82
84
  ...overrides
83
85
  };
84
86
  }
@@ -172,6 +174,11 @@ export function createRemoteHub(options = {}) {
172
174
  const host = safeString(env.REMOTE_HUB_HOST || DEFAULT_REMOTE_HUB_HOST, 128);
173
175
  const requestedPort = normalizePort(env.REMOTE_HUB_PORT || DEFAULT_REMOTE_HUB_PORT);
174
176
  const heartbeatMs = clampNumber(env.REMOTE_HUB_HEARTBEAT_MS, 1000, 60000, DEFAULT_HEARTBEAT_MS);
177
+ const taskTimeoutMs = clampNumber(
178
+ options.taskTimeoutMs ?? env.REMOTE_HUB_TASK_TIMEOUT_MS,
179
+ 50,
180
+ 30 * 60 * 1000,
181
+ DEFAULT_AGENT_TASK_TIMEOUT_MS);
175
182
  const pairToken = safeString(
176
183
  env.REMOTE_HUB_PAIR_TOKEN || env.MINDEXEC_REMOTE_PAIR_TOKEN || crypto.randomBytes(6).toString('hex'),
177
184
  256);
@@ -194,6 +201,7 @@ export function createRemoteHub(options = {}) {
194
201
  protocol: 'tcp-jsonl',
195
202
  protocolVersion: REMOTE_PROTOCOL_VERSION,
196
203
  heartbeatMs,
204
+ taskTimeoutMs,
197
205
  agentPackage: '@mindexec/remote',
198
206
  agentEndpoint: `${host}:${boundPort || requestedPort}`,
199
207
  pairToken: includeSecrets ? pairToken : undefined,
@@ -307,6 +315,7 @@ export function createRemoteHub(options = {}) {
307
315
  }
308
316
 
309
317
  existing.lastDisconnectReason = 'replaced-by-new-session';
318
+ failAllPendingTasks(existing, 'replaced-by-new-session');
310
319
  writeJsonLine(existing.socket, {
311
320
  type: 'disconnect',
312
321
  reason: 'replaced-by-new-session',
@@ -427,6 +436,7 @@ export function createRemoteHub(options = {}) {
427
436
  latestTask,
428
437
  recentTasks: latestTask ? [latestTask] : [],
429
438
  pendingTaskCommands: new Map(),
439
+ pendingTaskTimers: new Map(),
430
440
  counters: createDeviceCounters({
431
441
  messagesReceived: 1,
432
442
  statusReceived: 1,
@@ -532,6 +542,7 @@ export function createRemoteHub(options = {}) {
532
542
  latestTask: null,
533
543
  recentTasks: [],
534
544
  pendingTaskCommands: new Map(),
545
+ pendingTaskTimers: new Map(),
535
546
  synthetic: false,
536
547
  counters: createDeviceCounters({ messagesReceived: 1 })
537
548
  };
@@ -573,6 +584,7 @@ export function createRemoteHub(options = {}) {
573
584
  device.activeLiveStream.stoppedAt = device.disconnectedAt;
574
585
  device.activeLiveStream.stopReason = reason;
575
586
  }
587
+ failAllPendingTasks(device, 'device-disconnected');
576
588
  logWarn('remote', `device disconnected ${device.deviceName} (${deviceId}): ${reason}`);
577
589
  emitRemoteEvent('RemoteDeviceDisconnected', device, { reason });
578
590
  }
@@ -601,6 +613,84 @@ export function createRemoteHub(options = {}) {
601
613
  return task;
602
614
  }
603
615
 
616
+ function clearTaskTimeout(device, commandId) {
617
+ const key = safeString(commandId, 128);
618
+ if (!device?.pendingTaskTimers || !key) {
619
+ return;
620
+ }
621
+
622
+ const timer = device.pendingTaskTimers.get(key);
623
+ if (timer) {
624
+ clearTimeout(timer);
625
+ }
626
+ device.pendingTaskTimers.delete(key);
627
+ }
628
+
629
+ function failPendingTask(device, commandId, error = 'task-timeout') {
630
+ const key = safeString(commandId, 128);
631
+ if (!device?.pendingTaskCommands || !key) {
632
+ return null;
633
+ }
634
+
635
+ const task = device.pendingTaskCommands.get(key);
636
+ if (!task) {
637
+ clearTaskTimeout(device, key);
638
+ return null;
639
+ }
640
+
641
+ const now = new Date().toISOString();
642
+ clearTaskTimeout(device, key);
643
+ task.status = 'failed';
644
+ task.updatedAt = now;
645
+ task.completedAt = now;
646
+ task.error = safeString(error, 500) || 'task-timeout';
647
+ task.resultSummary = task.error;
648
+ task.resultKind = task.resultKind || 'agent-task';
649
+ device.latestTask = task;
650
+ device.pendingTaskCommands.delete(key);
651
+ device.counters.taskResultsReceived += 1;
652
+ device.counters.taskResultsFailed += 1;
653
+ if (task.error === 'task-timeout') {
654
+ device.counters.taskResultsTimedOut += 1;
655
+ }
656
+ emitRemoteEvent('RemoteTaskResult', device, {
657
+ commandId: key,
658
+ taskId: task.taskId,
659
+ status: task.status,
660
+ error: task.error
661
+ });
662
+ return task;
663
+ }
664
+
665
+ function failAllPendingTasks(device, error = 'device-disconnected') {
666
+ if (!device?.pendingTaskCommands) {
667
+ return 0;
668
+ }
669
+
670
+ const commandIds = [...device.pendingTaskCommands.keys()];
671
+ let failed = 0;
672
+ for (const commandId of commandIds) {
673
+ if (failPendingTask(device, commandId, error)) {
674
+ failed += 1;
675
+ }
676
+ }
677
+ return failed;
678
+ }
679
+
680
+ function scheduleTaskTimeout(device, task) {
681
+ const commandId = safeString(task?.commandId, 128);
682
+ if (!device?.pendingTaskTimers || !commandId) {
683
+ return;
684
+ }
685
+
686
+ clearTaskTimeout(device, commandId);
687
+ const timer = setTimeout(() => {
688
+ failPendingTask(device, commandId, 'task-timeout');
689
+ }, taskTimeoutMs);
690
+ timer.unref?.();
691
+ device.pendingTaskTimers.set(commandId, timer);
692
+ }
693
+
604
694
  function summarizeTaskResult(result) {
605
695
  if (result && typeof result === 'object') {
606
696
  return safeText(
@@ -634,6 +724,7 @@ export function createRemoteHub(options = {}) {
634
724
  const status = error
635
725
  ? 'failed'
636
726
  : safeString(result?.status, 40) || 'completed';
727
+ clearTaskTimeout(device, commandId);
637
728
  task.status = status;
638
729
  task.updatedAt = now;
639
730
  task.completedAt = safeString(result?.completedAt, 80) || now;
@@ -903,6 +994,7 @@ export function createRemoteHub(options = {}) {
903
994
 
904
995
  async function close() {
905
996
  for (const device of devices.values()) {
997
+ failAllPendingTasks(device, 'hub-shutdown');
906
998
  if (device.socket && !device.socket.destroyed) {
907
999
  writeJsonLine(device.socket, { type: 'disconnect', reason: 'hub-shutdown' });
908
1000
  device.socket.destroy();
@@ -958,6 +1050,7 @@ export function createRemoteHub(options = {}) {
958
1050
  device.activeLiveStream.stoppedAt = device.disconnectedAt;
959
1051
  device.activeLiveStream.stopReason = reason;
960
1052
  }
1053
+ failAllPendingTasks(device, 'device-disconnected');
961
1054
  emitRemoteEvent('RemoteDeviceDisconnected', device, { reason, synthetic: true });
962
1055
  return true;
963
1056
  }
@@ -1145,6 +1238,7 @@ export function createRemoteHub(options = {}) {
1145
1238
  device.counters.commandsSent += 1;
1146
1239
  device.counters.tasksQueued += 1;
1147
1240
  rememberDeviceTask(device, task);
1241
+ scheduleTaskTimeout(device, task);
1148
1242
  emitRemoteEvent('RemoteTaskQueued', device, {
1149
1243
  commandId,
1150
1244
  taskId,
@@ -531,6 +531,15 @@ try {
531
531
  const aiCount = devices.filter(device => device.Connected && device.AiAssistEnabled).length;
532
532
  const focusedDevice = devices.find(device => device.Connected);
533
533
  assert.ok(focusedDevice);
534
+ focusedDevice.LatestTaskId = 'render-smoke-timeout-task';
535
+ focusedDevice.LatestTaskCommandId = 'render-smoke-timeout-command';
536
+ focusedDevice.LatestTaskTitle = 'Timed out smoke task';
537
+ focusedDevice.LatestTaskInstructionPreview = 'This synthetic task timed out before the agent replied.';
538
+ focusedDevice.LatestTaskStatus = 'failed';
539
+ focusedDevice.LatestTaskApprovalLevel = 'task-only';
540
+ focusedDevice.LatestTaskUpdatedAt = new Date().toISOString();
541
+ focusedDevice.LatestTaskError = 'task-timeout';
542
+ focusedDevice.LatestTaskResultSummary = '';
534
543
 
535
544
  const { manager, document } = await loadCss3DManager();
536
545
  assert.equal(typeof manager?.renderRemoteFleetMonitorForTest, 'function');
@@ -577,6 +586,7 @@ try {
577
586
  assert.ok(bodyView.textContent.includes('all devices, no paging'));
578
587
  assert.ok(bodyView.querySelector('code')?.textContent.includes('npx @mindexec/remote connect'));
579
588
  assert.ok(bodyView.textContent.includes('synthetic-render-ai'));
589
+ assert.ok(bodyView.textContent.includes('Task timed out waiting for the agent response.'));
580
590
  assert.ok(devices.some(device => /^synthetic-response-/.test(device.LatestTaskResultResponseId)));
581
591
 
582
592
  const searchInput = bodyView.querySelector('[data-remote-fleet-search="true"]');
@@ -630,6 +640,7 @@ try {
630
640
  assert.ok(deviceBody.textContent.includes(focusedDevice.Name));
631
641
  assert.ok(deviceBody.querySelector('[data-remote-fleet-action="refresh-device"]'));
632
642
  assert.ok(deviceBody.querySelector('[data-remote-fleet-action="task-device"]'));
643
+ assert.ok(deviceBody.textContent.includes('Task timed out waiting for the agent response.'));
633
644
  assert.ok(deviceBody.textContent.includes(focusedDevice.DeviceId));
634
645
 
635
646
  console.log(`RemoteFleet render smoke OK (${SYNTHETIC_COUNT} synthetic devices, ${connectedCount} connected, ${aiCount} AI-ready)`);
@@ -30,7 +30,8 @@ const hub = createRemoteHub({
30
30
  MINDEXEC_REMOTE_HUB: '1',
31
31
  REMOTE_HUB_HOST: '127.0.0.1',
32
32
  REMOTE_HUB_PORT: '0',
33
- REMOTE_HUB_PAIR_TOKEN: 'smoke-token'
33
+ REMOTE_HUB_PAIR_TOKEN: 'smoke-token',
34
+ REMOTE_HUB_TASK_TIMEOUT_MS: '120'
34
35
  }
35
36
  });
36
37
 
@@ -230,6 +231,25 @@ try {
230
231
  assert.equal(aiTaskDevice.counters.tasksQueued, 2);
231
232
  assert.equal(aiTaskDevice.counters.taskResultsReceived, 2);
232
233
 
234
+ const timeoutTaskCommand = hub.requestAgentTask('smoke-device', {
235
+ instruction: 'This task intentionally receives no agent response.',
236
+ title: 'Timeout task'
237
+ });
238
+ assert.equal(timeoutTaskCommand.ok, true);
239
+ const timeoutTaskDevice = await waitFor(() => {
240
+ const current = hub.listDevices();
241
+ return current[0]?.latestTask?.taskId === timeoutTaskCommand.taskId
242
+ && current[0]?.latestTask?.status === 'failed'
243
+ ? current[0]
244
+ : null;
245
+ }, 1000);
246
+ assert.equal(timeoutTaskDevice.latestTask.error, 'task-timeout');
247
+ assert.equal(timeoutTaskDevice.latestTask.resultSummary, 'task-timeout');
248
+ assert.equal(timeoutTaskDevice.counters.tasksQueued, 3);
249
+ assert.equal(timeoutTaskDevice.counters.taskResultsReceived, 3);
250
+ assert.equal(timeoutTaskDevice.counters.taskResultsFailed, 1);
251
+ assert.equal(timeoutTaskDevice.counters.taskResultsTimedOut, 1);
252
+
233
253
  socket.destroy();
234
254
  await waitFor(() => hub.listDevices()[0]?.connected === false);
235
255
  console.log('RemoteHub smoke OK');
@@ -12204,6 +12204,22 @@
12204
12204
  return getRemoteFleetDeviceField(device, 'thumbnailEnabled', 'ThumbnailEnabled', false) === true;
12205
12205
  }
12206
12206
 
12207
+ function formatRemoteFleetTaskError(error) {
12208
+ const value = String(error || '').trim();
12209
+ switch (value) {
12210
+ case 'task-timeout':
12211
+ return 'Task timed out waiting for the agent response.';
12212
+ case 'device-disconnected':
12213
+ return 'Agent disconnected before returning a task result.';
12214
+ case 'replaced-by-new-session':
12215
+ return 'Agent reconnected before returning a task result.';
12216
+ case 'hub-shutdown':
12217
+ return 'RemoteHub shut down before the task completed.';
12218
+ default:
12219
+ return value;
12220
+ }
12221
+ }
12222
+
12207
12223
  function getRemoteFleetGroupInfo(device, groupMode) {
12208
12224
  const mode = String(groupMode || 'none');
12209
12225
  const connected = isRemoteFleetDeviceConnected(device);
@@ -12601,7 +12617,7 @@
12601
12617
  : taskLine.textContent;
12602
12618
  taskLine.style.cssText = `color:${taskTone === 'error' ? '#991b1b' : taskTone === 'done' ? '#047857' : '#1d4ed8'};font-size:10px;font-weight:900;line-height:1.2;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;letter-spacing:0;`;
12603
12619
  const taskSummary = document.createElement('div');
12604
- taskSummary.textContent = latestTaskError || latestTaskResult || latestTaskTitle || 'Task queued';
12620
+ taskSummary.textContent = formatRemoteFleetTaskError(latestTaskError) || latestTaskResult || latestTaskTitle || 'Task queued';
12605
12621
  taskSummary.title = taskSummary.textContent;
12606
12622
  taskSummary.style.cssText = 'color:#334155;font-size:11px;font-weight:750;line-height:1.3;overflow:hidden;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;letter-spacing:0;';
12607
12623
  taskBox.appendChild(taskLine);
@@ -13641,7 +13657,7 @@
13641
13657
  letter-spacing: 0;
13642
13658
  `;
13643
13659
  const taskSummary = document.createElement('div');
13644
- taskSummary.textContent = latestTaskError || latestTaskResult || latestTaskTitle || 'Task queued';
13660
+ taskSummary.textContent = formatRemoteFleetTaskError(latestTaskError) || latestTaskResult || latestTaskTitle || 'Task queued';
13645
13661
  taskSummary.title = taskSummary.textContent;
13646
13662
  taskSummary.style.cssText = `
13647
13663
  color: #334155;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "mainAssemblyName": "MindExecution.Web",
3
3
  "resources": {
4
- "hash": "sha256-SDDoFz4/uzWopUhjgpkiIgiLuIxFbjw0fze0ljEluiQ=",
4
+ "hash": "sha256-EOXWPNQzw1iOoooim3bWEvapz9AQ4G5jOFZbf4RgdGg=",
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.q469sducjw.dll": "MindExecution.Core.dll",
127
- "MindExecution.Kernel.lqglgq2jmo.dll": "MindExecution.Kernel.dll",
128
- "MindExecution.Plugins.Admin.2jqptn6ylw.dll": "MindExecution.Plugins.Admin.dll",
129
- "MindExecution.Plugins.Business.8hzwity3fl.dll": "MindExecution.Plugins.Business.dll",
130
- "MindExecution.Plugins.Concept.gc38fmee62.dll": "MindExecution.Plugins.Concept.dll",
131
- "MindExecution.Plugins.Directory.hr2p0grenr.dll": "MindExecution.Plugins.Directory.dll",
132
- "MindExecution.Plugins.PlanMaster.ivqd47y3cx.dll": "MindExecution.Plugins.PlanMaster.dll",
133
- "MindExecution.Plugins.YouTube.tpgm4p80hh.dll": "MindExecution.Plugins.YouTube.dll",
134
- "MindExecution.Shared.2r4r7zx1ek.dll": "MindExecution.Shared.dll",
135
- "MindExecution.Web.stbecd1tk9.dll": "MindExecution.Web.dll",
126
+ "MindExecution.Core.gvaopvh5wg.dll": "MindExecution.Core.dll",
127
+ "MindExecution.Kernel.hpf3wr4dv3.dll": "MindExecution.Kernel.dll",
128
+ "MindExecution.Plugins.Admin.y0euqt1gu1.dll": "MindExecution.Plugins.Admin.dll",
129
+ "MindExecution.Plugins.Business.9zzc31j54n.dll": "MindExecution.Plugins.Business.dll",
130
+ "MindExecution.Plugins.Concept.sihn2obrrn.dll": "MindExecution.Plugins.Concept.dll",
131
+ "MindExecution.Plugins.Directory.zwbshhfvpb.dll": "MindExecution.Plugins.Directory.dll",
132
+ "MindExecution.Plugins.PlanMaster.47f3afsrf8.dll": "MindExecution.Plugins.PlanMaster.dll",
133
+ "MindExecution.Plugins.YouTube.rpolgpee6c.dll": "MindExecution.Plugins.YouTube.dll",
134
+ "MindExecution.Shared.zm6btxgvlg.dll": "MindExecution.Shared.dll",
135
+ "MindExecution.Web.7b082n0t0o.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.q469sducjw.dll": "sha256-tqgvXepOZPfdkyxH1BK3KlhL8azJjoV+iV/BismieCc=",
282
- "MindExecution.Kernel.lqglgq2jmo.dll": "sha256-AyAPsZpAwsH/HeC6cWVzRH50hBjGAoamzGup6clWJTg=",
283
- "MindExecution.Plugins.Concept.gc38fmee62.dll": "sha256-EFZnHpuHNJzdkWPTkGXV7EYsZIkpMMOAHf6R5FBGzQ0=",
284
- "MindExecution.Plugins.PlanMaster.ivqd47y3cx.dll": "sha256-slYqPeIeQ3yugnSA4ABLJ1eGGd7opYVqd11waq+hJBo=",
285
- "MindExecution.Shared.2r4r7zx1ek.dll": "sha256-znMYyuG18GNFULfWrkwczymEkg1ZtSPHpHXKkw13h2A=",
286
- "MindExecution.Web.stbecd1tk9.dll": "sha256-oJwTIFv6bY3dnlzZQafAf01epgSK3gOAbo2XK7nLaQA="
281
+ "MindExecution.Core.gvaopvh5wg.dll": "sha256-DDLjV7zNlhxfza3LBE+Fbjpke9h8yItLJ3qWzf4Yp74=",
282
+ "MindExecution.Kernel.hpf3wr4dv3.dll": "sha256-RV4W3gMSRwcM23iZfhh4tKgdBlTU0Tfuqld6kSEfxhw=",
283
+ "MindExecution.Plugins.Concept.sihn2obrrn.dll": "sha256-dMpQJwHdXztt3B/lhRoqgpaiEoO7HbZie+ST5g1BAIk=",
284
+ "MindExecution.Plugins.PlanMaster.47f3afsrf8.dll": "sha256-sNW33IqNle0U1uYsT1h4saM9T4UN2hDK13YYWPzOIq4=",
285
+ "MindExecution.Shared.zm6btxgvlg.dll": "sha256-WxdOHLbsCW4r0JnzhaIHm4+nSVJW7WbVpjnf1Uwkk2c=",
286
+ "MindExecution.Web.7b082n0t0o.dll": "sha256-k/Gq3iOPlGciTli3OjQY+EZ/29D4FlrU0tzk6Vu2b4E="
287
287
  },
288
288
  "lazyAssembly": {
289
- "MindExecution.Plugins.Admin.2jqptn6ylw.dll": "sha256-ctRNgHtUfPq0pCvAeG0DCzZPBRTgLtQC2c4pjGFM+Go=",
290
- "MindExecution.Plugins.Business.8hzwity3fl.dll": "sha256-ZL74Jut/WgaNdDBWZzhC6ECsjBdm+0cB1P5fx4ACugM=",
291
- "MindExecution.Plugins.Directory.hr2p0grenr.dll": "sha256-PUrdpFqGptJ5kxYaarWNwB2NmZ1TphHnFHlnyQL48DI=",
292
- "MindExecution.Plugins.YouTube.tpgm4p80hh.dll": "sha256-3/nB2+iWQdfNdzktROztp/oVkSJbxu64mmWRShW2QMo="
289
+ "MindExecution.Plugins.Admin.y0euqt1gu1.dll": "sha256-gqBZLGmu1nofX9cZu7NzT0StnMnDwaG/eLtHfk95Dg8=",
290
+ "MindExecution.Plugins.Business.9zzc31j54n.dll": "sha256-JTgGpzDyzUUKzJelltauxS03YhSFpdAt31BBx1Ng4pg=",
291
+ "MindExecution.Plugins.Directory.zwbshhfvpb.dll": "sha256-rY/yH9+h3canhVFmdWrcynxahBsnQ4PT5wtCx5OQGFg=",
292
+ "MindExecution.Plugins.YouTube.rpolgpee6c.dll": "sha256-X+TTYJklqCsulTbHi89CZkB4lDXfkTLEj6FH5dJZoDs="
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-dispatch-feedback-v474';
561
+ const scriptVersion = '20260612-remote-task-timeout-v475';
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": "0KR50DAc",
2
+ "version": "HOeNy0HC",
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-E87osNoVqhikMqj3XaJ+fZpNqyY0377QlQIjHfzZPhc=",
89
+ "hash": "sha256-e/aMJjefLL0i7yi8x7tn/EY9wrD0pIxU42m2QKgIYz4=",
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-tqgvXepOZPfdkyxH1BK3KlhL8azJjoV+iV/BismieCc=",
414
- "url": "_framework/MindExecution.Core.q469sducjw.dll"
413
+ "hash": "sha256-DDLjV7zNlhxfza3LBE+Fbjpke9h8yItLJ3qWzf4Yp74=",
414
+ "url": "_framework/MindExecution.Core.gvaopvh5wg.dll"
415
415
  },
416
416
  {
417
- "hash": "sha256-AyAPsZpAwsH/HeC6cWVzRH50hBjGAoamzGup6clWJTg=",
418
- "url": "_framework/MindExecution.Kernel.lqglgq2jmo.dll"
417
+ "hash": "sha256-RV4W3gMSRwcM23iZfhh4tKgdBlTU0Tfuqld6kSEfxhw=",
418
+ "url": "_framework/MindExecution.Kernel.hpf3wr4dv3.dll"
419
419
  },
420
420
  {
421
- "hash": "sha256-ctRNgHtUfPq0pCvAeG0DCzZPBRTgLtQC2c4pjGFM+Go=",
422
- "url": "_framework/MindExecution.Plugins.Admin.2jqptn6ylw.dll"
421
+ "hash": "sha256-gqBZLGmu1nofX9cZu7NzT0StnMnDwaG/eLtHfk95Dg8=",
422
+ "url": "_framework/MindExecution.Plugins.Admin.y0euqt1gu1.dll"
423
423
  },
424
424
  {
425
- "hash": "sha256-ZL74Jut/WgaNdDBWZzhC6ECsjBdm+0cB1P5fx4ACugM=",
426
- "url": "_framework/MindExecution.Plugins.Business.8hzwity3fl.dll"
425
+ "hash": "sha256-JTgGpzDyzUUKzJelltauxS03YhSFpdAt31BBx1Ng4pg=",
426
+ "url": "_framework/MindExecution.Plugins.Business.9zzc31j54n.dll"
427
427
  },
428
428
  {
429
- "hash": "sha256-EFZnHpuHNJzdkWPTkGXV7EYsZIkpMMOAHf6R5FBGzQ0=",
430
- "url": "_framework/MindExecution.Plugins.Concept.gc38fmee62.dll"
429
+ "hash": "sha256-dMpQJwHdXztt3B/lhRoqgpaiEoO7HbZie+ST5g1BAIk=",
430
+ "url": "_framework/MindExecution.Plugins.Concept.sihn2obrrn.dll"
431
431
  },
432
432
  {
433
- "hash": "sha256-PUrdpFqGptJ5kxYaarWNwB2NmZ1TphHnFHlnyQL48DI=",
434
- "url": "_framework/MindExecution.Plugins.Directory.hr2p0grenr.dll"
433
+ "hash": "sha256-rY/yH9+h3canhVFmdWrcynxahBsnQ4PT5wtCx5OQGFg=",
434
+ "url": "_framework/MindExecution.Plugins.Directory.zwbshhfvpb.dll"
435
435
  },
436
436
  {
437
- "hash": "sha256-slYqPeIeQ3yugnSA4ABLJ1eGGd7opYVqd11waq+hJBo=",
438
- "url": "_framework/MindExecution.Plugins.PlanMaster.ivqd47y3cx.dll"
437
+ "hash": "sha256-sNW33IqNle0U1uYsT1h4saM9T4UN2hDK13YYWPzOIq4=",
438
+ "url": "_framework/MindExecution.Plugins.PlanMaster.47f3afsrf8.dll"
439
439
  },
440
440
  {
441
- "hash": "sha256-3/nB2+iWQdfNdzktROztp/oVkSJbxu64mmWRShW2QMo=",
442
- "url": "_framework/MindExecution.Plugins.YouTube.tpgm4p80hh.dll"
441
+ "hash": "sha256-X+TTYJklqCsulTbHi89CZkB4lDXfkTLEj6FH5dJZoDs=",
442
+ "url": "_framework/MindExecution.Plugins.YouTube.rpolgpee6c.dll"
443
443
  },
444
444
  {
445
- "hash": "sha256-znMYyuG18GNFULfWrkwczymEkg1ZtSPHpHXKkw13h2A=",
446
- "url": "_framework/MindExecution.Shared.2r4r7zx1ek.dll"
445
+ "hash": "sha256-WxdOHLbsCW4r0JnzhaIHm4+nSVJW7WbVpjnf1Uwkk2c=",
446
+ "url": "_framework/MindExecution.Shared.zm6btxgvlg.dll"
447
447
  },
448
448
  {
449
- "hash": "sha256-oJwTIFv6bY3dnlzZQafAf01epgSK3gOAbo2XK7nLaQA=",
450
- "url": "_framework/MindExecution.Web.stbecd1tk9.dll"
449
+ "hash": "sha256-k/Gq3iOPlGciTli3OjQY+EZ/29D4FlrU0tzk6Vu2b4E=",
450
+ "url": "_framework/MindExecution.Web.7b082n0t0o.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-y6Kp7jPu3NDwDsVpfK/DXAaN7ZSNGvq3LDKrIhURBio=",
773
+ "hash": "sha256-sP1JkizV14ASUo9oVPOopzpprSlzkoXZqpimYvOYBIw=",
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-kK0fdbwqbRSdpNq5r4LyomSjE6FQ2lhjrXkQVBWacL8=",
837
+ "hash": "sha256-ZWKMY1yo6lJvnKON0C9AmGH2YMwnIs07SFC4mTUDTsQ=",
838
838
  "url": "index.html"
839
839
  },
840
840
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: 0KR50DAc */
1
+ /* Manifest version: HOeNy0HC */
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