@mindexec/cli 0.2.4 → 0.2.5

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/README.md +8 -0
  2. package/package.json +1 -1
  3. package/remote-hub.js +27 -4
  4. package/scripts/remote-hub-smoke.mjs +35 -1
  5. package/server.js +7 -2
  6. package/wwwroot/_content/MindExecution.Shared/js/mind-map-css3d-manager.js +50 -7
  7. package/wwwroot/_framework/MindExecution.Core.27f2blpou6.dll +0 -0
  8. package/wwwroot/_framework/{MindExecution.Kernel.8sz1fl3k6s.dll → MindExecution.Kernel.9wfplilp5l.dll} +0 -0
  9. package/wwwroot/_framework/{MindExecution.Plugins.Admin.iltai5c3i9.dll → MindExecution.Plugins.Admin.sb1vkmct0w.dll} +0 -0
  10. package/wwwroot/_framework/{MindExecution.Plugins.Business.mscgb1gwpf.dll → MindExecution.Plugins.Business.zr7rkofx44.dll} +0 -0
  11. package/wwwroot/_framework/{MindExecution.Plugins.Concept.s888y8snr4.dll → MindExecution.Plugins.Concept.g6wd36v92i.dll} +0 -0
  12. package/wwwroot/_framework/{MindExecution.Plugins.Directory.281klijdzl.dll → MindExecution.Plugins.Directory.bb5flwt0u7.dll} +0 -0
  13. package/wwwroot/_framework/{MindExecution.Plugins.PlanMaster.2gy2ozelqp.dll → MindExecution.Plugins.PlanMaster.me8v9fpgwc.dll} +0 -0
  14. package/wwwroot/_framework/{MindExecution.Plugins.YouTube.1v8o9nnlzq.dll → MindExecution.Plugins.YouTube.l811fqx9e0.dll} +0 -0
  15. package/wwwroot/_framework/{MindExecution.Shared.04anisxh35.dll → MindExecution.Shared.oseamdg577.dll} +0 -0
  16. package/wwwroot/_framework/MindExecution.Web.96r3nnp9is.dll +0 -0
  17. package/wwwroot/_framework/blazor.boot.json +21 -21
  18. package/wwwroot/index.html +1 -1
  19. package/wwwroot/service-worker-assets.js +24 -24
  20. package/wwwroot/service-worker.js +1 -1
  21. package/wwwroot/_framework/MindExecution.Core.rydw4mhsbd.dll +0 -0
  22. package/wwwroot/_framework/MindExecution.Web.0qdidsf6sl.dll +0 -0
package/README.md CHANGED
@@ -95,6 +95,14 @@ curl -X POST -H "X-Bridge-Token: <bridge-token>" -H "Content-Type: application/j
95
95
  http://127.0.0.1:5147/api/remote/tasks
96
96
  ```
97
97
 
98
+ Queue an opt-in text-only AI assist task for agents started with `--ai`:
99
+
100
+ ```bash
101
+ curl -X POST -H "X-Bridge-Token: <bridge-token>" -H "Content-Type: application/json" \
102
+ -d "{\"instruction\":\"Summarize what this computer should do next.\",\"allConnected\":true,\"approvalLevel\":\"ai-assist\"}" \
103
+ http://127.0.0.1:5147/api/remote/tasks
104
+ ```
105
+
98
106
  ?먮뒗 ?꾩뿭 ?ㅼ튂 ???ㅽ뻾?⑸땲??
99
107
 
100
108
  ```bash
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mindexec/cli",
3
- "version": "0.2.4",
3
+ "version": "0.2.5",
4
4
  "description": "MindExec local runtime and bridge CLI",
5
5
  "main": "server.js",
6
6
  "type": "module",
package/remote-hub.js CHANGED
@@ -45,6 +45,22 @@ function safeText(value, maxLength = 1000) {
45
45
  return String(value ?? '').replace(/\0/g, '').trim().slice(0, maxLength);
46
46
  }
47
47
 
48
+ function normalizeApprovalLevel(value) {
49
+ const level = safeString(value, 80).toLowerCase();
50
+ return level === 'ai-assist' ? 'ai-assist' : 'task-only';
51
+ }
52
+
53
+ function readCapabilityFlag(capabilities, key) {
54
+ const value = capabilities?.[key];
55
+ if (typeof value === 'boolean') {
56
+ return value;
57
+ }
58
+ if (typeof value === 'number') {
59
+ return value !== 0;
60
+ }
61
+ return /^(1|true|yes|on)$/i.test(String(value || '').trim());
62
+ }
63
+
48
64
  function normalizeDeviceId(value) {
49
65
  const id = safeString(value, 128).replace(/[^a-zA-Z0-9_.:-]/g, '-');
50
66
  return id || crypto.randomUUID();
@@ -644,6 +660,11 @@ export function createRemoteHub(options = {}) {
644
660
  }
645
661
 
646
662
  const now = new Date().toISOString();
663
+ const approvalLevel = normalizeApprovalLevel(options.approvalLevel);
664
+ if (approvalLevel === 'ai-assist' && !readCapabilityFlag(device.capabilities, 'aiAssist')) {
665
+ return { ok: false, error: 'device-ai-assist-unavailable' };
666
+ }
667
+
647
668
  const commandId = safeString(options.commandId, 128) || crypto.randomUUID();
648
669
  const taskId = safeString(options.taskId, 128) || crypto.randomUUID();
649
670
  const title = safeString(options.title, 120)
@@ -655,7 +676,7 @@ export function createRemoteHub(options = {}) {
655
676
  title,
656
677
  instructionPreview: safeText(instruction, 320),
657
678
  status: 'queued',
658
- approvalLevel: 'task-only',
679
+ approvalLevel,
659
680
  requestedAt: now,
660
681
  sentAt: now,
661
682
  updatedAt: now,
@@ -673,7 +694,8 @@ export function createRemoteHub(options = {}) {
673
694
  taskId,
674
695
  title,
675
696
  instruction,
676
- approvalLevel: 'task-only',
697
+ approvalLevel,
698
+ model: safeString(options.model, 120),
677
699
  requestedAt: now
678
700
  },
679
701
  issuedAt: now
@@ -689,9 +711,10 @@ export function createRemoteHub(options = {}) {
689
711
  emitRemoteEvent('RemoteTaskQueued', device, {
690
712
  commandId,
691
713
  taskId,
692
- title
714
+ title,
715
+ approvalLevel
693
716
  });
694
- return { ok: true, commandId, taskId };
717
+ return { ok: true, commandId, taskId, approvalLevel };
695
718
  }
696
719
 
697
720
  function requestThumbnail(deviceId, options = {}) {
@@ -62,7 +62,9 @@ try {
62
62
  thumbnail: false,
63
63
  control: false,
64
64
  computerAgent: true,
65
- taskDispatch: true
65
+ taskDispatch: true,
66
+ aiAssist: true,
67
+ aiModel: 'fake-ai'
66
68
  }
67
69
  });
68
70
  writeJsonLine(socket, {
@@ -138,6 +140,38 @@ try {
138
140
  assert.equal(taskDevice.counters.tasksQueued, 1);
139
141
  assert.equal(taskDevice.counters.taskResultsReceived, 1);
140
142
 
143
+ const aiTaskCommand = hub.requestAgentTask('smoke-device', {
144
+ instruction: 'Use AI assist to summarize the smoke test state.',
145
+ title: 'Smoke AI task',
146
+ approvalLevel: 'ai-assist'
147
+ });
148
+ assert.equal(aiTaskCommand.ok, true);
149
+ assert.equal(aiTaskCommand.approvalLevel, 'ai-assist');
150
+ writeJsonLine(socket, {
151
+ type: 'command.result',
152
+ commandId: aiTaskCommand.commandId,
153
+ result: {
154
+ kind: 'agent.task',
155
+ mode: 'ai-assist',
156
+ taskId: aiTaskCommand.taskId,
157
+ status: 'completed',
158
+ summary: 'Smoke AI task accepted.',
159
+ completedAt: new Date().toISOString()
160
+ }
161
+ });
162
+
163
+ const aiTaskDevice = await waitFor(() => {
164
+ const current = hub.listDevices();
165
+ return current[0]?.latestTask?.taskId === aiTaskCommand.taskId
166
+ && current[0]?.latestTask?.approvalLevel === 'ai-assist'
167
+ && current[0]?.latestTask?.status === 'completed'
168
+ ? current[0]
169
+ : null;
170
+ });
171
+ assert.equal(aiTaskDevice.latestTask.resultSummary, 'Smoke AI task accepted.');
172
+ assert.equal(aiTaskDevice.counters.tasksQueued, 2);
173
+ assert.equal(aiTaskDevice.counters.taskResultsReceived, 2);
174
+
141
175
  socket.destroy();
142
176
  await waitFor(() => hub.listDevices()[0]?.connected === false);
143
177
  console.log('RemoteHub smoke OK');
package/server.js CHANGED
@@ -6992,7 +6992,9 @@ app.post('/api/remote/devices/:deviceId/tasks', (req, res) => {
6992
6992
  instruction: req.body?.instruction,
6993
6993
  title: req.body?.title,
6994
6994
  taskId: req.body?.taskId,
6995
- commandId: req.body?.commandId
6995
+ commandId: req.body?.commandId,
6996
+ approvalLevel: req.body?.approvalLevel,
6997
+ model: req.body?.model
6996
6998
  }));
6997
6999
  });
6998
7000
 
@@ -7010,7 +7012,9 @@ app.post('/api/remote/tasks', (req, res) => {
7010
7012
  deviceId,
7011
7013
  ...remoteHub.requestAgentTask(deviceId, {
7012
7014
  instruction: req.body?.instruction,
7013
- title: req.body?.title
7015
+ title: req.body?.title,
7016
+ approvalLevel: req.body?.approvalLevel,
7017
+ model: req.body?.model
7014
7018
  })
7015
7019
  }));
7016
7020
  const queued = results.filter(result => result.ok === true).length;
@@ -7018,6 +7022,7 @@ app.post('/api/remote/tasks', (req, res) => {
7018
7022
  ok: queued > 0,
7019
7023
  total: uniqueTargetIds.length,
7020
7024
  queued,
7025
+ approvalLevel: req.body?.approvalLevel === 'ai-assist' ? 'ai-assist' : 'task-only',
7021
7026
  results,
7022
7027
  error: queued > 0 ? undefined : (uniqueTargetIds.length === 0 ? 'no-target-devices' : 'no-task-queued')
7023
7028
  });
@@ -12163,7 +12163,7 @@
12163
12163
  const taskRow = document.createElement('div');
12164
12164
  taskRow.style.cssText = `
12165
12165
  display: grid;
12166
- grid-template-columns: minmax(0, 1fr) auto;
12166
+ grid-template-columns: minmax(0, 1fr) auto auto;
12167
12167
  gap: 8px;
12168
12168
  align-items: stretch;
12169
12169
  flex: 0 0 auto;
@@ -12189,9 +12189,44 @@
12189
12189
  outline: none;
12190
12190
  pointer-events: auto;
12191
12191
  `;
12192
+ const aiToggleLabel = document.createElement('label');
12193
+ aiToggleLabel.title = 'Use AI assist on agents that expose it';
12194
+ aiToggleLabel.style.cssText = `
12195
+ display: inline-flex;
12196
+ align-items: center;
12197
+ justify-content: center;
12198
+ gap: 6px;
12199
+ min-width: 54px;
12200
+ height: 54px;
12201
+ padding: 0 9px;
12202
+ border-radius: 7px;
12203
+ border: 1px solid rgba(14, 165, 233, 0.32);
12204
+ background: rgba(240, 249, 255, 0.88);
12205
+ color: #0369a1;
12206
+ font-size: 11px;
12207
+ font-weight: 900;
12208
+ letter-spacing: 0;
12209
+ cursor: pointer;
12210
+ pointer-events: auto;
12211
+ user-select: none;
12212
+ `;
12213
+ const aiToggle = document.createElement('input');
12214
+ aiToggle.type = 'checkbox';
12215
+ aiToggle.dataset.remoteFleetAiToggle = 'true';
12216
+ aiToggle.style.cssText = `
12217
+ width: 14px;
12218
+ height: 14px;
12219
+ margin: 0;
12220
+ accent-color: #0284c7;
12221
+ `;
12222
+ const aiToggleText = document.createElement('span');
12223
+ aiToggleText.textContent = 'AI';
12224
+ aiToggleLabel.appendChild(aiToggle);
12225
+ aiToggleLabel.appendChild(aiToggleText);
12192
12226
  const sendConnectedButton = createRemoteFleetButton('Send connected', 'Dispatch task to all connected task-capable devices', 'task-connected');
12193
12227
  sendConnectedButton.style.height = '54px';
12194
12228
  taskRow.appendChild(taskInput);
12229
+ taskRow.appendChild(aiToggleLabel);
12195
12230
  taskRow.appendChild(sendConnectedButton);
12196
12231
  bodyView.appendChild(taskRow);
12197
12232
 
@@ -12275,8 +12310,11 @@
12275
12310
  const thumbnailCapturedAt = String(device?.thumbnailCapturedAt || device?.ThumbnailCapturedAt || '');
12276
12311
  const hasThumbnail = /^data:image\/(png|jpe?g|webp|svg\+xml);base64,/i.test(thumbnailDataUrl);
12277
12312
  const taskEnabled = device?.computerAgentEnabled === true || device?.ComputerAgentEnabled === true;
12313
+ const aiAssistEnabled = device?.aiAssistEnabled === true || device?.AiAssistEnabled === true;
12314
+ const aiModel = String(device?.aiModel || device?.AiModel || '');
12278
12315
  const latestTaskStatus = String(device?.latestTaskStatus || device?.LatestTaskStatus || '');
12279
12316
  const latestTaskTitle = String(device?.latestTaskTitle || device?.LatestTaskTitle || '');
12317
+ const latestTaskApproval = String(device?.latestTaskApprovalLevel || device?.LatestTaskApprovalLevel || '');
12280
12318
  const latestTaskUpdatedAt = String(device?.latestTaskUpdatedAt || device?.LatestTaskUpdatedAt || '');
12281
12319
  const latestTaskError = String(device?.latestTaskError || device?.LatestTaskError || '');
12282
12320
  const latestTaskResult = String(device?.latestTaskResultSummary || device?.LatestTaskResultSummary || '');
@@ -12450,7 +12488,8 @@
12450
12488
  border: 1px solid ${taskTone === 'error' ? 'rgba(248, 113, 113, 0.24)' : taskTone === 'done' ? 'rgba(16, 185, 129, 0.20)' : 'rgba(37, 99, 235, 0.16)'};
12451
12489
  `;
12452
12490
  const taskLine = document.createElement('div');
12453
- taskLine.textContent = `${latestTaskStatus || 'task'}${latestTaskUpdatedAt ? ` - ${formatRemoteFleetAge(latestTaskUpdatedAt)}` : ''}`;
12491
+ const taskModeLabel = latestTaskApproval === 'ai-assist' ? 'AI' : 'Task';
12492
+ taskLine.textContent = `${taskModeLabel} ${latestTaskStatus || 'task'}${latestTaskUpdatedAt ? ` - ${formatRemoteFleetAge(latestTaskUpdatedAt)}` : ''}`;
12454
12493
  taskLine.style.cssText = `
12455
12494
  color: ${taskTone === 'error' ? '#991b1b' : taskTone === 'done' ? '#047857' : '#1d4ed8'};
12456
12495
  font-size: 10px;
@@ -12483,7 +12522,9 @@
12483
12522
  const actions = document.createElement('div');
12484
12523
  actions.style.cssText = 'display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:auto;';
12485
12524
  const status = document.createElement('span');
12486
- status.textContent = connectedDevice ? 'Connected' : 'Offline';
12525
+ status.textContent = connectedDevice
12526
+ ? (aiAssistEnabled ? `AI ${aiModel || 'ready'}` : 'Connected')
12527
+ : 'Offline';
12487
12528
  status.style.cssText = `
12488
12529
  min-width: 0;
12489
12530
  color: ${connectedDevice ? '#047857' : '#64748b'};
@@ -12558,6 +12599,7 @@
12558
12599
  };
12559
12600
 
12560
12601
  const readTaskInstruction = () => String(taskInput.value || '').trim();
12602
+ const useAiAssist = () => aiToggle.checked === true;
12561
12603
 
12562
12604
  sendConnectedButton.addEventListener('click', async event => {
12563
12605
  event.preventDefault();
@@ -12572,10 +12614,11 @@
12572
12614
  sendConnectedButton.disabled = true;
12573
12615
  setTaskFeedback('Dispatching task to connected devices...');
12574
12616
  try {
12575
- const result = await invokeDotNetAsync('DispatchRemoteFleetTaskFromJs', nodeId, '', instruction);
12617
+ const result = await invokeDotNetAsync('DispatchRemoteFleetTaskFromJs', nodeId, '', instruction, useAiAssist());
12576
12618
  await syncRemoteFleetNodeStateFromResult(result);
12577
12619
  if (result?.success) {
12578
- setTaskFeedback(`Queued ${result.queued || result.total || 1} remote task(s).`, 'success');
12620
+ const mode = useAiAssist() ? 'AI task' : 'remote task';
12621
+ setTaskFeedback(`Queued ${result.queued || result.total || 1} ${mode}(s).`, 'success');
12579
12622
  } else {
12580
12623
  setTaskFeedback(result?.error || 'Task dispatch failed.', 'error');
12581
12624
  }
@@ -12618,10 +12661,10 @@
12618
12661
  button.disabled = true;
12619
12662
  setTaskFeedback('Dispatching task to device...');
12620
12663
  try {
12621
- const result = await invokeDotNetAsync('DispatchRemoteFleetTaskFromJs', nodeId, button.dataset.deviceId || '', instruction);
12664
+ const result = await invokeDotNetAsync('DispatchRemoteFleetTaskFromJs', nodeId, button.dataset.deviceId || '', instruction, useAiAssist());
12622
12665
  await syncRemoteFleetNodeStateFromResult(result);
12623
12666
  if (result?.success) {
12624
- setTaskFeedback('Queued remote task.', 'success');
12667
+ setTaskFeedback(useAiAssist() ? 'Queued AI task.' : 'Queued remote task.', 'success');
12625
12668
  } else {
12626
12669
  setTaskFeedback(result?.error || 'Task dispatch failed.', 'error');
12627
12670
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "mainAssemblyName": "MindExecution.Web",
3
3
  "resources": {
4
- "hash": "sha256-ei2Zh3i4bzfRC0LQiNOOGqlx8qC3i1LaPPF8R1ZZfiI=",
4
+ "hash": "sha256-pNivN7EJaBIokgTOUsXUgk3uMPTdJMPxWR5WEc3XWNk=",
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.rydw4mhsbd.dll": "MindExecution.Core.dll",
127
- "MindExecution.Kernel.8sz1fl3k6s.dll": "MindExecution.Kernel.dll",
128
- "MindExecution.Plugins.Admin.iltai5c3i9.dll": "MindExecution.Plugins.Admin.dll",
129
- "MindExecution.Plugins.Business.mscgb1gwpf.dll": "MindExecution.Plugins.Business.dll",
130
- "MindExecution.Plugins.Concept.s888y8snr4.dll": "MindExecution.Plugins.Concept.dll",
131
- "MindExecution.Plugins.Directory.281klijdzl.dll": "MindExecution.Plugins.Directory.dll",
132
- "MindExecution.Plugins.PlanMaster.2gy2ozelqp.dll": "MindExecution.Plugins.PlanMaster.dll",
133
- "MindExecution.Plugins.YouTube.1v8o9nnlzq.dll": "MindExecution.Plugins.YouTube.dll",
134
- "MindExecution.Shared.04anisxh35.dll": "MindExecution.Shared.dll",
135
- "MindExecution.Web.0qdidsf6sl.dll": "MindExecution.Web.dll",
126
+ "MindExecution.Core.27f2blpou6.dll": "MindExecution.Core.dll",
127
+ "MindExecution.Kernel.9wfplilp5l.dll": "MindExecution.Kernel.dll",
128
+ "MindExecution.Plugins.Admin.sb1vkmct0w.dll": "MindExecution.Plugins.Admin.dll",
129
+ "MindExecution.Plugins.Business.zr7rkofx44.dll": "MindExecution.Plugins.Business.dll",
130
+ "MindExecution.Plugins.Concept.g6wd36v92i.dll": "MindExecution.Plugins.Concept.dll",
131
+ "MindExecution.Plugins.Directory.bb5flwt0u7.dll": "MindExecution.Plugins.Directory.dll",
132
+ "MindExecution.Plugins.PlanMaster.me8v9fpgwc.dll": "MindExecution.Plugins.PlanMaster.dll",
133
+ "MindExecution.Plugins.YouTube.l811fqx9e0.dll": "MindExecution.Plugins.YouTube.dll",
134
+ "MindExecution.Shared.oseamdg577.dll": "MindExecution.Shared.dll",
135
+ "MindExecution.Web.96r3nnp9is.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.rydw4mhsbd.dll": "sha256-s7r1GaMpvZ1RlLjiZO0RM4QK7CrQNbP6hcxpGO4H2vs=",
282
- "MindExecution.Kernel.8sz1fl3k6s.dll": "sha256-aH4xUmfv18Zuwc1QVpIg1lZwyeNq2j/gnwEYRCiSgGs=",
283
- "MindExecution.Plugins.Concept.s888y8snr4.dll": "sha256-RCJ1pfe7Pu+W0O7jNXCoR8X6IPK4+0ShVNdJyFM7DvY=",
284
- "MindExecution.Plugins.PlanMaster.2gy2ozelqp.dll": "sha256-4r45+0ahnIZ9fvQ60VJb4OymhE8XTFMZ7jIF71DPrfE=",
285
- "MindExecution.Shared.04anisxh35.dll": "sha256-8CQC4804ef5KlfH9/MULdbWZzL7YvpS7elf263ZYRlw=",
286
- "MindExecution.Web.0qdidsf6sl.dll": "sha256-CF3kk5RKIgyaPytT7v1WVS9qj73pzXVbQ+vMxfyQQ2Y="
281
+ "MindExecution.Core.27f2blpou6.dll": "sha256-bqjP4oZY0UUVrmz+2Ctlf51S2Uo5Y/AKoPqoHy4pOnw=",
282
+ "MindExecution.Kernel.9wfplilp5l.dll": "sha256-uWkVGORohTBq4U8aic2oWXUFy9SnLejWJO5jA4AYUv4=",
283
+ "MindExecution.Plugins.Concept.g6wd36v92i.dll": "sha256-2DAMmcKQQlL5nDSjz2wZpO3rsJZCKV47BD19znoecJc=",
284
+ "MindExecution.Plugins.PlanMaster.me8v9fpgwc.dll": "sha256-ThFpjeyaMI19u6kLpApau9CFMDFKu0qAXvW45raEf4A=",
285
+ "MindExecution.Shared.oseamdg577.dll": "sha256-aNNAxyXR5QAJc8/7NHb0SkPoCV/ZfKxUpI1EutwVPoU=",
286
+ "MindExecution.Web.96r3nnp9is.dll": "sha256-Ua8v/da0JRYdWnLlYTo7RN8X+fLqj0Fx2ep9gtN0GS4="
287
287
  },
288
288
  "lazyAssembly": {
289
- "MindExecution.Plugins.Admin.iltai5c3i9.dll": "sha256-VrqPUOhOEQtnZuf97TfpU1ueaYKncgML/ylgcY3/3H4=",
290
- "MindExecution.Plugins.Business.mscgb1gwpf.dll": "sha256-OsxBerI3pzCELMXu5vIOAQI5wQyKcWoOwc2d+N/nvCM=",
291
- "MindExecution.Plugins.Directory.281klijdzl.dll": "sha256-MnBG5SBYBloYJ15miLmaRwTM/7/CE9KM/vcMgVPDGK8=",
292
- "MindExecution.Plugins.YouTube.1v8o9nnlzq.dll": "sha256-I6jStz9j3BGIhprlmF+TfL5WpVuBKSVm3XYovlD5f+w="
289
+ "MindExecution.Plugins.Admin.sb1vkmct0w.dll": "sha256-iDuN0GDy4cf1SBO0F9oNo6GO3m98b3TfcSaQWtQK5q8=",
290
+ "MindExecution.Plugins.Business.zr7rkofx44.dll": "sha256-H4Q/ZDzQZhQkspAue90LyhKxSx6KmvoqYZrQYavlsN4=",
291
+ "MindExecution.Plugins.Directory.bb5flwt0u7.dll": "sha256-WbJHd3y3nymvVCvYGNYYw7/ywI8NraYmG8Y2IFch1u8=",
292
+ "MindExecution.Plugins.YouTube.l811fqx9e0.dll": "sha256-e9zKVUmEONig5ScJXvPEPBQf+MAVyfEqyCTncHnO8Y0="
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-task-v464';
561
+ const scriptVersion = '20260612-remote-ai-v465';
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": "xZ2srqoC",
2
+ "version": "wLEvF+gp",
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-oCghpRmu/8JqF3GAUtmueGLrHLWHpaF3XIcK+VUwY64=",
89
+ "hash": "sha256-hBSas6gvVUMu0hBpxyG+W6xv8+NN7JcjiSq0+C6ZjGU=",
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-s7r1GaMpvZ1RlLjiZO0RM4QK7CrQNbP6hcxpGO4H2vs=",
414
- "url": "_framework/MindExecution.Core.rydw4mhsbd.dll"
413
+ "hash": "sha256-bqjP4oZY0UUVrmz+2Ctlf51S2Uo5Y/AKoPqoHy4pOnw=",
414
+ "url": "_framework/MindExecution.Core.27f2blpou6.dll"
415
415
  },
416
416
  {
417
- "hash": "sha256-aH4xUmfv18Zuwc1QVpIg1lZwyeNq2j/gnwEYRCiSgGs=",
418
- "url": "_framework/MindExecution.Kernel.8sz1fl3k6s.dll"
417
+ "hash": "sha256-uWkVGORohTBq4U8aic2oWXUFy9SnLejWJO5jA4AYUv4=",
418
+ "url": "_framework/MindExecution.Kernel.9wfplilp5l.dll"
419
419
  },
420
420
  {
421
- "hash": "sha256-VrqPUOhOEQtnZuf97TfpU1ueaYKncgML/ylgcY3/3H4=",
422
- "url": "_framework/MindExecution.Plugins.Admin.iltai5c3i9.dll"
421
+ "hash": "sha256-iDuN0GDy4cf1SBO0F9oNo6GO3m98b3TfcSaQWtQK5q8=",
422
+ "url": "_framework/MindExecution.Plugins.Admin.sb1vkmct0w.dll"
423
423
  },
424
424
  {
425
- "hash": "sha256-OsxBerI3pzCELMXu5vIOAQI5wQyKcWoOwc2d+N/nvCM=",
426
- "url": "_framework/MindExecution.Plugins.Business.mscgb1gwpf.dll"
425
+ "hash": "sha256-H4Q/ZDzQZhQkspAue90LyhKxSx6KmvoqYZrQYavlsN4=",
426
+ "url": "_framework/MindExecution.Plugins.Business.zr7rkofx44.dll"
427
427
  },
428
428
  {
429
- "hash": "sha256-RCJ1pfe7Pu+W0O7jNXCoR8X6IPK4+0ShVNdJyFM7DvY=",
430
- "url": "_framework/MindExecution.Plugins.Concept.s888y8snr4.dll"
429
+ "hash": "sha256-2DAMmcKQQlL5nDSjz2wZpO3rsJZCKV47BD19znoecJc=",
430
+ "url": "_framework/MindExecution.Plugins.Concept.g6wd36v92i.dll"
431
431
  },
432
432
  {
433
- "hash": "sha256-MnBG5SBYBloYJ15miLmaRwTM/7/CE9KM/vcMgVPDGK8=",
434
- "url": "_framework/MindExecution.Plugins.Directory.281klijdzl.dll"
433
+ "hash": "sha256-WbJHd3y3nymvVCvYGNYYw7/ywI8NraYmG8Y2IFch1u8=",
434
+ "url": "_framework/MindExecution.Plugins.Directory.bb5flwt0u7.dll"
435
435
  },
436
436
  {
437
- "hash": "sha256-4r45+0ahnIZ9fvQ60VJb4OymhE8XTFMZ7jIF71DPrfE=",
438
- "url": "_framework/MindExecution.Plugins.PlanMaster.2gy2ozelqp.dll"
437
+ "hash": "sha256-ThFpjeyaMI19u6kLpApau9CFMDFKu0qAXvW45raEf4A=",
438
+ "url": "_framework/MindExecution.Plugins.PlanMaster.me8v9fpgwc.dll"
439
439
  },
440
440
  {
441
- "hash": "sha256-I6jStz9j3BGIhprlmF+TfL5WpVuBKSVm3XYovlD5f+w=",
442
- "url": "_framework/MindExecution.Plugins.YouTube.1v8o9nnlzq.dll"
441
+ "hash": "sha256-e9zKVUmEONig5ScJXvPEPBQf+MAVyfEqyCTncHnO8Y0=",
442
+ "url": "_framework/MindExecution.Plugins.YouTube.l811fqx9e0.dll"
443
443
  },
444
444
  {
445
- "hash": "sha256-8CQC4804ef5KlfH9/MULdbWZzL7YvpS7elf263ZYRlw=",
446
- "url": "_framework/MindExecution.Shared.04anisxh35.dll"
445
+ "hash": "sha256-aNNAxyXR5QAJc8/7NHb0SkPoCV/ZfKxUpI1EutwVPoU=",
446
+ "url": "_framework/MindExecution.Shared.oseamdg577.dll"
447
447
  },
448
448
  {
449
- "hash": "sha256-CF3kk5RKIgyaPytT7v1WVS9qj73pzXVbQ+vMxfyQQ2Y=",
450
- "url": "_framework/MindExecution.Web.0qdidsf6sl.dll"
449
+ "hash": "sha256-Ua8v/da0JRYdWnLlYTo7RN8X+fLqj0Fx2ep9gtN0GS4=",
450
+ "url": "_framework/MindExecution.Web.96r3nnp9is.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-pgZK03P5rDjSp61sZae0rpKy7fjg88JxqpQFSe7f/6Q=",
773
+ "hash": "sha256-kTyP4Fsv/AOm0/MqoZ+M1/9yt5ZgNrXfJE8PEsMaTqQ=",
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-O+OZkgaXnLILhly2Of1gV09vQgw+YgNGMz375BoNSTk=",
837
+ "hash": "sha256-Cf/mSFH1jP/r7yYXdv2Fyy4jqSjg5ouxZIKPgeRRLQI=",
838
838
  "url": "index.html"
839
839
  },
840
840
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: xZ2srqoC */
1
+ /* Manifest version: wLEvF+gp */
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