@mindexec/cli 0.2.11 → 0.2.13

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 (21) hide show
  1. package/package.json +3 -2
  2. package/remote-hub.js +12 -0
  3. package/scripts/remote-fleet-render-smoke.mjs +594 -0
  4. package/scripts/remote-hub-scale-smoke.mjs +4 -2
  5. package/scripts/remote-hub-smoke.mjs +4 -0
  6. package/wwwroot/_content/MindExecution.Shared/js/mind-map-css3d-manager.js +16 -2
  7. package/wwwroot/_framework/MindExecution.Core.q469sducjw.dll +0 -0
  8. package/wwwroot/_framework/{MindExecution.Kernel.dt3w864bqn.dll → MindExecution.Kernel.lqglgq2jmo.dll} +0 -0
  9. package/wwwroot/_framework/{MindExecution.Plugins.Admin.z93cu32xru.dll → MindExecution.Plugins.Admin.2jqptn6ylw.dll} +0 -0
  10. package/wwwroot/_framework/{MindExecution.Plugins.Business.b6da8sg85t.dll → MindExecution.Plugins.Business.8hzwity3fl.dll} +0 -0
  11. package/wwwroot/_framework/{MindExecution.Plugins.Concept.sj3ujw4e72.dll → MindExecution.Plugins.Concept.4jfcx4yb6n.dll} +0 -0
  12. package/wwwroot/_framework/{MindExecution.Plugins.Directory.rjod6rdmly.dll → MindExecution.Plugins.Directory.hr2p0grenr.dll} +0 -0
  13. package/wwwroot/_framework/{MindExecution.Plugins.PlanMaster.ec8ccog2o3.dll → MindExecution.Plugins.PlanMaster.gnc7ediozd.dll} +0 -0
  14. package/wwwroot/_framework/{MindExecution.Plugins.YouTube.mk7a07org5.dll → MindExecution.Plugins.YouTube.nb68y61g8l.dll} +0 -0
  15. package/wwwroot/_framework/{MindExecution.Shared.mc9gi9kvqg.dll → MindExecution.Shared.fut0ze7fxs.dll} +0 -0
  16. package/wwwroot/_framework/{MindExecution.Web.n70z8m41l3.dll → MindExecution.Web.gzr3k0ca14.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.pnw79cgqjx.dll +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mindexec/cli",
3
- "version": "0.2.11",
3
+ "version": "0.2.13",
4
4
  "description": "MindExec local runtime and bridge CLI",
5
5
  "main": "server.js",
6
6
  "type": "module",
@@ -20,9 +20,10 @@
20
20
  "scripts": {
21
21
  "start": "node launch-bridge.cjs",
22
22
  "dev": "node launch-bridge.cjs --watch",
23
- "test:syntax": "node --check server.js && node --check remote-hub.js && node --check codex-runtime.js && node --check launch-bridge.cjs && node --check port-guard.cjs && node --check scripts/setup-tree-sitter-grammars.mjs && node --check scripts/remote-hub-smoke.mjs && node --check scripts/remote-hub-scale-smoke.mjs",
23
+ "test:syntax": "node --check server.js && node --check remote-hub.js && node --check codex-runtime.js && node --check launch-bridge.cjs && node --check port-guard.cjs && node --check scripts/setup-tree-sitter-grammars.mjs && node --check scripts/remote-hub-smoke.mjs && node --check scripts/remote-hub-scale-smoke.mjs && node --check scripts/remote-fleet-render-smoke.mjs",
24
24
  "test:remote": "node scripts/remote-hub-smoke.mjs",
25
25
  "test:remote:scale": "node scripts/remote-hub-scale-smoke.mjs",
26
+ "test:remote:render": "node scripts/remote-fleet-render-smoke.mjs",
26
27
  "pack:dry": "npm pack --dry-run",
27
28
  "setup:grammars": "node scripts/setup-tree-sitter-grammars.mjs",
28
29
  "postinstall": "npm run setup:grammars"
package/remote-hub.js CHANGED
@@ -377,6 +377,8 @@ export function createRemoteHub(options = {}) {
377
377
  completedAt: taskStatus === 'completed' || taskStatus === 'failed' ? seenAt : '',
378
378
  error: taskStatus === 'failed' ? 'Synthetic task failure sample.' : '',
379
379
  resultKind: 'synthetic-agent-task',
380
+ resultModel: hasAiAssist ? 'synthetic-ai' : '',
381
+ resultResponseId: hasAiAssist ? `synthetic-response-${ordinal}` : '',
380
382
  resultSummary: taskStatus === 'failed'
381
383
  ? 'Synthetic task reported a sample issue.'
382
384
  : 'Synthetic task completed for scale validation.'
@@ -638,6 +640,8 @@ export function createRemoteHub(options = {}) {
638
640
  task.error = error;
639
641
  task.resultSummary = error || summarizeTaskResult(result);
640
642
  task.resultKind = safeString(result?.kind || result?.mode || 'agent-task', 80);
643
+ task.resultModel = safeString(result?.model || result?.aiModel || '', 120);
644
+ task.resultResponseId = safeString(result?.responseId || result?.id || '', 160);
641
645
  device.latestTask = task;
642
646
  device.pendingTaskCommands.delete(commandId);
643
647
  device.counters.taskResultsReceived += 1;
@@ -1046,6 +1050,12 @@ export function createRemoteHub(options = {}) {
1046
1050
  completedAt: now,
1047
1051
  error: '',
1048
1052
  resultKind: approvalLevel === 'ai-assist' ? 'synthetic-ai-assist' : 'synthetic-agent-task',
1053
+ resultModel: approvalLevel === 'ai-assist'
1054
+ ? safeString(options.model, 120) || 'synthetic-ai'
1055
+ : '',
1056
+ resultResponseId: approvalLevel === 'ai-assist'
1057
+ ? `synthetic-response-${taskId}`
1058
+ : '',
1049
1059
  resultSummary: approvalLevel === 'ai-assist'
1050
1060
  ? `Synthetic AI assist completed for ${device.deviceName}.`
1051
1061
  : `Synthetic task accepted by ${device.deviceName}.`
@@ -1108,6 +1118,8 @@ export function createRemoteHub(options = {}) {
1108
1118
  completedAt: '',
1109
1119
  error: '',
1110
1120
  resultKind: '',
1121
+ resultModel: '',
1122
+ resultResponseId: '',
1111
1123
  resultSummary: ''
1112
1124
  };
1113
1125
 
@@ -0,0 +1,594 @@
1
+ #!/usr/bin/env node
2
+
3
+ import assert from 'node:assert/strict';
4
+ import fs from 'node:fs/promises';
5
+ import path from 'node:path';
6
+ import vm from 'node:vm';
7
+ import { fileURLToPath } from 'node:url';
8
+ import { createRemoteHub } from '../remote-hub.js';
9
+
10
+ const SYNTHETIC_COUNT = Number(process.env.REMOTE_FLEET_RENDER_SMOKE_COUNT || 250);
11
+
12
+ function dataAttributeToDatasetKey(name) {
13
+ return String(name || '').replace(/^data-/, '').replace(/-([a-z])/g, (_, char) => char.toUpperCase());
14
+ }
15
+
16
+ class MiniStyle {
17
+ constructor() {
18
+ this._cssText = '';
19
+ }
20
+
21
+ get cssText() {
22
+ return this._cssText;
23
+ }
24
+
25
+ set cssText(value) {
26
+ this._cssText = String(value || '');
27
+ const displayMatch = /(?:^|;)\s*display\s*:\s*([^;]+)/i.exec(this._cssText);
28
+ if (displayMatch) {
29
+ this.display = displayMatch[1].trim();
30
+ }
31
+ }
32
+
33
+ setProperty(name, value) {
34
+ this[String(name)] = String(value);
35
+ }
36
+ }
37
+
38
+ class MiniClassList {
39
+ constructor(owner) {
40
+ this.owner = owner;
41
+ this.tokens = new Set();
42
+ }
43
+
44
+ add(...tokens) {
45
+ tokens.forEach(token => {
46
+ const value = String(token || '').trim();
47
+ if (value) {
48
+ this.tokens.add(value);
49
+ }
50
+ });
51
+ this.sync();
52
+ }
53
+
54
+ remove(...tokens) {
55
+ tokens.forEach(token => this.tokens.delete(String(token || '').trim()));
56
+ this.sync();
57
+ }
58
+
59
+ contains(token) {
60
+ return this.tokens.has(String(token || '').trim());
61
+ }
62
+
63
+ toggle(token, force) {
64
+ const value = String(token || '').trim();
65
+ if (!value) return false;
66
+ const shouldAdd = force === undefined ? !this.tokens.has(value) : !!force;
67
+ if (shouldAdd) {
68
+ this.tokens.add(value);
69
+ } else {
70
+ this.tokens.delete(value);
71
+ }
72
+ this.sync();
73
+ return shouldAdd;
74
+ }
75
+
76
+ sync() {
77
+ this.owner.className = [...this.tokens].join(' ');
78
+ }
79
+ }
80
+
81
+ class MiniElement {
82
+ constructor(tagName, ownerDocument) {
83
+ this.tagName = String(tagName || '').toUpperCase();
84
+ this.nodeName = this.tagName;
85
+ this.ownerDocument = ownerDocument;
86
+ this.parentElement = null;
87
+ this.children = [];
88
+ this.attributes = {};
89
+ this.dataset = {};
90
+ this.style = new MiniStyle();
91
+ this.classList = new MiniClassList(this);
92
+ this.className = '';
93
+ this._textContent = '';
94
+ this._listeners = new Map();
95
+ this.value = '';
96
+ this.checked = false;
97
+ this.disabled = false;
98
+ }
99
+
100
+ get textContent() {
101
+ return `${this._textContent}${this.children.map(child => child.textContent).join('')}`;
102
+ }
103
+
104
+ set textContent(value) {
105
+ this.children.forEach(child => {
106
+ child.parentElement = null;
107
+ });
108
+ this.children = [];
109
+ this._textContent = String(value ?? '');
110
+ }
111
+
112
+ get innerHTML() {
113
+ return '';
114
+ }
115
+
116
+ set innerHTML(_value) {
117
+ this.children.forEach(child => {
118
+ child.parentElement = null;
119
+ });
120
+ this.children = [];
121
+ this._textContent = '';
122
+ }
123
+
124
+ appendChild(child) {
125
+ if (!child) return child;
126
+ if (child.parentElement) {
127
+ child.parentElement.children = child.parentElement.children.filter(item => item !== child);
128
+ }
129
+ child.parentElement = this;
130
+ this.children.push(child);
131
+ return child;
132
+ }
133
+
134
+ remove() {
135
+ if (!this.parentElement) return;
136
+ this.parentElement.children = this.parentElement.children.filter(child => child !== this);
137
+ this.parentElement = null;
138
+ }
139
+
140
+ setAttribute(name, value) {
141
+ const key = String(name || '');
142
+ const text = String(value ?? '');
143
+ this.attributes[key] = text;
144
+ if (key === 'id') {
145
+ this.id = text;
146
+ } else if (key === 'class') {
147
+ this.className = text;
148
+ this.classList.tokens = new Set(text.split(/\s+/).filter(Boolean));
149
+ } else if (key.startsWith('data-')) {
150
+ this.dataset[dataAttributeToDatasetKey(key)] = text;
151
+ } else if (key === 'aria-label') {
152
+ this.ariaLabel = text;
153
+ }
154
+ }
155
+
156
+ getAttribute(name) {
157
+ const key = String(name || '');
158
+ if (key.startsWith('data-')) {
159
+ return this.dataset[dataAttributeToDatasetKey(key)];
160
+ }
161
+ return this.attributes[key];
162
+ }
163
+
164
+ addEventListener(type, listener) {
165
+ const key = String(type || '');
166
+ if (!this._listeners.has(key)) {
167
+ this._listeners.set(key, []);
168
+ }
169
+ this._listeners.get(key).push(listener);
170
+ }
171
+
172
+ dispatchEvent(event) {
173
+ const payload = typeof event === 'string' ? { type: event } : { ...(event || {}) };
174
+ payload.type = payload.type || 'event';
175
+ payload.target = payload.target || this;
176
+ payload.currentTarget = this;
177
+ payload.preventDefault = payload.preventDefault || (() => {});
178
+ payload.stopPropagation = payload.stopPropagation || (() => {});
179
+ for (const listener of this._listeners.get(payload.type) || []) {
180
+ listener(payload);
181
+ }
182
+ return true;
183
+ }
184
+
185
+ querySelector(selector) {
186
+ return this.querySelectorAll(selector)[0] || null;
187
+ }
188
+
189
+ querySelectorAll(selector) {
190
+ const matches = [];
191
+ const visit = element => {
192
+ for (const child of element.children) {
193
+ if (matchesSelector(child, selector)) {
194
+ matches.push(child);
195
+ }
196
+ visit(child);
197
+ }
198
+ };
199
+ visit(this);
200
+ return matches;
201
+ }
202
+
203
+ closest(selector) {
204
+ let current = this;
205
+ while (current) {
206
+ if (matchesSelector(current, selector)) {
207
+ return current;
208
+ }
209
+ current = current.parentElement;
210
+ }
211
+ return null;
212
+ }
213
+
214
+ contains(node) {
215
+ let current = node;
216
+ while (current) {
217
+ if (current === this) return true;
218
+ current = current.parentElement;
219
+ }
220
+ return false;
221
+ }
222
+ }
223
+
224
+ class MiniDocument {
225
+ constructor() {
226
+ this.body = new MiniElement('body', this);
227
+ this.head = new MiniElement('head', this);
228
+ }
229
+
230
+ createElement(tagName) {
231
+ return new MiniElement(tagName, this);
232
+ }
233
+
234
+ getElementById(id) {
235
+ const target = String(id || '');
236
+ return [this.head, this.body]
237
+ .flatMap(root => root.querySelectorAll('*'))
238
+ .find(element => element.id === target) || null;
239
+ }
240
+
241
+ querySelector(selector) {
242
+ return this.body.querySelector(selector) || this.head.querySelector(selector);
243
+ }
244
+
245
+ querySelectorAll(selector) {
246
+ return [
247
+ ...this.head.querySelectorAll(selector),
248
+ ...this.body.querySelectorAll(selector)
249
+ ];
250
+ }
251
+ }
252
+
253
+ function matchesSelector(element, selector) {
254
+ const text = String(selector || '').trim();
255
+ if (!text || !element) return false;
256
+ if (text === '*') return true;
257
+
258
+ const tagMatch = /^[a-zA-Z][\w-]*/.exec(text);
259
+ if (tagMatch && element.tagName.toLowerCase() !== tagMatch[0].toLowerCase()) {
260
+ return false;
261
+ }
262
+
263
+ for (const classMatch of text.matchAll(/\.([\w-]+)/g)) {
264
+ if (!element.classList.contains(classMatch[1])) {
265
+ return false;
266
+ }
267
+ }
268
+
269
+ for (const attrMatch of text.matchAll(/\[([^\]=]+)(?:="([^"]*)")?\]/g)) {
270
+ const attrName = attrMatch[1];
271
+ const expected = attrMatch[2];
272
+ const actual = attrName.startsWith('data-')
273
+ ? element.dataset[dataAttributeToDatasetKey(attrName)]
274
+ : element.getAttribute(attrName);
275
+ if (actual === undefined || actual === null) {
276
+ return false;
277
+ }
278
+ if (expected !== undefined && String(actual) !== expected) {
279
+ return false;
280
+ }
281
+ }
282
+
283
+ return true;
284
+ }
285
+
286
+ function readStatusNumber(status, key) {
287
+ const value = status?.[key];
288
+ return Number.isFinite(Number(value)) ? Number(value) : null;
289
+ }
290
+
291
+ function readLoad1(status) {
292
+ const value = status?.loadavg;
293
+ return Array.isArray(value) && Number.isFinite(Number(value[0])) ? Number(value[0]) : null;
294
+ }
295
+
296
+ function projectDevice(device) {
297
+ const status = device.status || {};
298
+ const capabilities = device.capabilities || {};
299
+ const thumbnail = device.latestThumbnail || {};
300
+ const liveFrame = device.latestLiveFrame || {};
301
+ const liveStream = device.activeLiveStream || {};
302
+ const latestTask = device.latestTask || {};
303
+ const platform = String(status.platform || device.platform || 'unknown');
304
+
305
+ return {
306
+ DeviceId: String(device.deviceId || ''),
307
+ SessionId: String(device.sessionId || ''),
308
+ Name: String(device.deviceName || device.hostname || device.deviceId || 'device'),
309
+ Hostname: String(device.hostname || ''),
310
+ Platform: platform,
311
+ Release: String(status.release || ''),
312
+ Arch: String(device.arch || ''),
313
+ AgentVersion: String(device.agentVersion || ''),
314
+ Connected: device.connected === true,
315
+ ConnectedAt: String(device.connectedAt || ''),
316
+ DisconnectedAt: String(device.disconnectedAt || ''),
317
+ LastSeenAt: String(device.lastSeenAt || ''),
318
+ LastStatusAt: String(device.lastStatusAt || ''),
319
+ LastDisconnectReason: String(device.lastDisconnectReason || ''),
320
+ RemoteAddress: String(device.remoteAddress || ''),
321
+ RemotePort: Number(device.remotePort || 0),
322
+ UptimeSec: readStatusNumber(status, 'uptimeSec'),
323
+ UsedMemRatio: readStatusNumber(status, 'usedMemRatio'),
324
+ Load1: readLoad1(status),
325
+ StatusEnabled: capabilities.status === true,
326
+ ThumbnailEnabled: capabilities.thumbnail === true,
327
+ LiveStreamEnabled: capabilities.liveStream === true,
328
+ ControlEnabled: capabilities.control === true,
329
+ ComputerAgentEnabled: capabilities.computerAgent === true || capabilities.taskDispatch === true,
330
+ AiAssistEnabled: capabilities.aiAssist === true,
331
+ AiModel: String(capabilities.aiModel || ''),
332
+ AiProvider: String(capabilities.aiProvider || ''),
333
+ ThumbnailStreamId: String(thumbnail.streamId || ''),
334
+ ThumbnailFrameSeq: Number(thumbnail.frameSeq || 0),
335
+ ThumbnailWidth: Number(thumbnail.width || 0),
336
+ ThumbnailHeight: Number(thumbnail.height || 0),
337
+ ThumbnailMimeType: String(thumbnail.mimeType || thumbnail.format || ''),
338
+ ThumbnailCapturedAt: String(thumbnail.capturedAt || ''),
339
+ ThumbnailReceivedAt: String(thumbnail.receivedAt || ''),
340
+ ThumbnailDataUrl: String(thumbnail.dataUrl || ''),
341
+ LiveStreamActive: liveStream.active === true,
342
+ LiveStreamId: String(liveStream.streamId || ''),
343
+ LiveStreamMode: String(liveStream.mode || ''),
344
+ LiveStreamFps: Number(liveStream.fps || 0),
345
+ LiveStreamStartedAt: String(liveStream.startedAt || ''),
346
+ LiveStreamStoppedAt: String(liveStream.stoppedAt || ''),
347
+ LiveStreamLastFrameAt: String(liveStream.lastFrameAt || ''),
348
+ LiveStreamFrameSeq: Number(liveStream.lastFrameSeq || 0),
349
+ LiveFrameStreamId: String(liveFrame.streamId || ''),
350
+ LiveFrameSeq: Number(liveFrame.frameSeq || 0),
351
+ LiveFrameWidth: Number(liveFrame.width || 0),
352
+ LiveFrameHeight: Number(liveFrame.height || 0),
353
+ LiveFrameMimeType: String(liveFrame.mimeType || liveFrame.format || ''),
354
+ LiveFrameCapturedAt: String(liveFrame.capturedAt || ''),
355
+ LiveFrameReceivedAt: String(liveFrame.receivedAt || ''),
356
+ LiveFrameDataUrl: String(liveFrame.dataUrl || ''),
357
+ LatestTaskId: String(latestTask.taskId || ''),
358
+ LatestTaskCommandId: String(latestTask.commandId || ''),
359
+ LatestTaskTitle: String(latestTask.title || ''),
360
+ LatestTaskInstructionPreview: String(latestTask.instructionPreview || ''),
361
+ LatestTaskStatus: String(latestTask.status || ''),
362
+ LatestTaskApprovalLevel: String(latestTask.approvalLevel || ''),
363
+ LatestTaskUpdatedAt: String(latestTask.updatedAt || latestTask.completedAt || latestTask.sentAt || ''),
364
+ LatestTaskError: String(latestTask.error || ''),
365
+ LatestTaskResultModel: String(latestTask.resultModel || ''),
366
+ LatestTaskResultResponseId: String(latestTask.resultResponseId || ''),
367
+ LatestTaskResultSummary: String(latestTask.resultSummary || '')
368
+ };
369
+ }
370
+
371
+ async function loadCss3DManager() {
372
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
373
+ const managerPath = path.resolve(__dirname, '../../MindExecution.Shared/wwwroot/js/mind-map-css3d-manager.js');
374
+ const source = await fs.readFile(managerPath, 'utf8');
375
+ const document = new MiniDocument();
376
+ const context = {
377
+ console,
378
+ document,
379
+ navigator: {
380
+ clipboard: {
381
+ writeText: async () => {}
382
+ }
383
+ },
384
+ setInterval: () => 0,
385
+ clearInterval: () => {},
386
+ setTimeout,
387
+ clearTimeout,
388
+ Date,
389
+ Math,
390
+ Number,
391
+ String,
392
+ Boolean,
393
+ Array,
394
+ Object,
395
+ JSON,
396
+ RegExp,
397
+ Map,
398
+ Set,
399
+ WeakMap,
400
+ THREE: createThreeStub(),
401
+ URL,
402
+ Promise
403
+ };
404
+ context.window = context;
405
+ context.self = context;
406
+
407
+ vm.runInNewContext(source, context, { filename: managerPath });
408
+ return { manager: context.window.MindMapCss3DManager, document };
409
+ }
410
+
411
+ function buildMonitorNode(devices, hubStatus) {
412
+ const connected = devices.filter(device => device.Connected).length;
413
+ const endpoint = hubStatus.agentEndpoint || '127.0.0.1:5197';
414
+ const pairToken = hubStatus.pairToken || 'render-smoke-token';
415
+ return {
416
+ id: 'remote-fleet-render-smoke',
417
+ contentType: 'memo',
418
+ metadata: {
419
+ SemanticType: 'RemoteFleetMonitor',
420
+ RemoteFleetSchemaVersion: 'remote-fleet@1',
421
+ RemoteFleetViewMode: 'all-devices',
422
+ RemoteFleetLastRefreshAtUtc: new Date().toISOString(),
423
+ RemoteFleetHubStatus: 'online',
424
+ RemoteFleetHubEndpoint: endpoint,
425
+ RemoteFleetAgentPackage: '@mindexec/remote',
426
+ RemoteFleetPairTokenPreview: '<pair-token>',
427
+ RemoteFleetConnectCommand: `npx @mindexec/remote connect --manager ${endpoint} --pair ${pairToken}`,
428
+ RemoteFleetDeviceCount: String(devices.length),
429
+ RemoteFleetConnectedDeviceCount: String(connected),
430
+ RemoteFleetCanvasPagination: 'none',
431
+ RemoteFleetDevicesJson: JSON.stringify(devices),
432
+ RemoteFleetLastError: ''
433
+ }
434
+ };
435
+ }
436
+
437
+ function buildDeviceNode(device, hubStatus) {
438
+ const endpoint = hubStatus.agentEndpoint || '127.0.0.1:5197';
439
+ return {
440
+ id: 'remote-device-render-smoke',
441
+ contentType: 'memo',
442
+ metadata: {
443
+ SemanticType: 'RemoteFleetDevice',
444
+ RemoteFleetSchemaVersion: 'remote-device@1',
445
+ RemoteFleetViewMode: 'pinned-device',
446
+ RemoteFleetLastRefreshAtUtc: new Date().toISOString(),
447
+ RemoteFleetHubStatus: 'online',
448
+ RemoteFleetHubEndpoint: endpoint,
449
+ RemoteFleetAgentPackage: '@mindexec/remote',
450
+ RemoteFleetPinnedDeviceId: device.DeviceId,
451
+ RemoteFleetPinnedDeviceJson: JSON.stringify(device),
452
+ RemoteFleetLastError: ''
453
+ }
454
+ };
455
+ }
456
+
457
+ function createThreeStub() {
458
+ class Vector3 {
459
+ constructor(x = 0, y = 0, z = 0) {
460
+ this.x = x;
461
+ this.y = y;
462
+ this.z = z;
463
+ }
464
+
465
+ set(x = 0, y = 0, z = 0) {
466
+ this.x = x;
467
+ this.y = y;
468
+ this.z = z;
469
+ return this;
470
+ }
471
+ }
472
+
473
+ class Matrix4 {
474
+ multiplyMatrices() { return this; }
475
+ }
476
+
477
+ class Frustum {
478
+ setFromProjectionMatrix() { return this; }
479
+ intersectsBox() { return true; }
480
+ }
481
+
482
+ class Quaternion {}
483
+
484
+ class Box3 {
485
+ setFromCenterAndSize() { return this; }
486
+ }
487
+
488
+ return { Box3, Frustum, Matrix4, Quaternion, Vector3 };
489
+ }
490
+
491
+ const hub = createRemoteHub({
492
+ env: {
493
+ MINDEXEC_REMOTE_HUB: '1',
494
+ REMOTE_HUB_HOST: '127.0.0.1',
495
+ REMOTE_HUB_PORT: '0',
496
+ REMOTE_HUB_PAIR_TOKEN: 'render-smoke-token'
497
+ }
498
+ });
499
+
500
+ try {
501
+ await hub.start();
502
+ const seeded = hub.seedSyntheticFleet({
503
+ count: SYNTHETIC_COUNT,
504
+ connectedRatio: 0.84,
505
+ thumbnailRatio: 0.72,
506
+ aiAssistRatio: 0.42,
507
+ liveCount: 0
508
+ });
509
+ assert.equal(seeded.ok, true);
510
+ assert.equal(seeded.seeded, SYNTHETIC_COUNT);
511
+
512
+ const seededAiTarget = hub.listDevices().find(device =>
513
+ device.connected && device.capabilities?.taskDispatch && device.capabilities?.aiAssist);
514
+ assert.ok(seededAiTarget);
515
+ const renderAiTask = hub.requestAgentTask(seededAiTarget.deviceId, {
516
+ instruction: 'Synthetic render smoke AI task: report model metadata to the canvas.',
517
+ title: 'Render smoke AI task',
518
+ approvalLevel: 'ai-assist',
519
+ model: 'synthetic-render-ai'
520
+ });
521
+ assert.equal(renderAiTask.ok, true);
522
+
523
+ const rawDevices = hub.listDevices();
524
+ const devices = rawDevices.map(projectDevice);
525
+ const connectedCount = devices.filter(device => device.Connected).length;
526
+ const offlineCount = devices.length - connectedCount;
527
+ const aiCount = devices.filter(device => device.Connected && device.AiAssistEnabled).length;
528
+ const focusedDevice = devices.find(device => device.Connected);
529
+ assert.ok(focusedDevice);
530
+
531
+ const { manager, document } = await loadCss3DManager();
532
+ assert.equal(typeof manager?.renderRemoteFleetMonitorForTest, 'function');
533
+ assert.equal(typeof manager?.renderRemoteFleetDeviceForTest, 'function');
534
+
535
+ const bodyView = document.createElement('div');
536
+ bodyView.dataset.remoteFleetAutoMonitor = 'false';
537
+ bodyView.dataset.remoteFleetFocusDeviceId = focusedDevice.DeviceId;
538
+ document.body.appendChild(bodyView);
539
+
540
+ manager.renderRemoteFleetMonitorForTest(bodyView, buildMonitorNode(devices, hub.getStatus({ includeSecrets: true })));
541
+
542
+ let cards = bodyView.querySelectorAll('article[data-device-id]');
543
+ assert.equal(cards.length, SYNTHETIC_COUNT);
544
+ assert.equal(bodyView.querySelector('[data-remote-fleet-match-count="true"]')?.textContent, `${SYNTHETIC_COUNT}/${SYNTHETIC_COUNT}`);
545
+ assert.equal(bodyView.querySelectorAll('[data-remote-fleet-action="pin-device"]').length, SYNTHETIC_COUNT);
546
+ assert.equal(bodyView.querySelectorAll('[data-remote-fleet-action="task-device"]').length, connectedCount);
547
+ assert.equal(bodyView.querySelectorAll('[data-remote-fleet-action="thumbnail-device"]').length, devices.filter(device => device.Connected && device.ThumbnailEnabled).length);
548
+ assert.equal(bodyView.querySelector('[data-remote-fleet-live-panel="true"]')?.dataset.deviceId, focusedDevice.DeviceId);
549
+ assert.equal(bodyView.querySelector('[data-remote-fleet-action="task-visible"]')?.disabled, false);
550
+ assert.ok(bodyView.textContent.includes('all devices, no paging'));
551
+ assert.ok(bodyView.querySelector('code')?.textContent.includes('npx @mindexec/remote connect'));
552
+ assert.ok(bodyView.textContent.includes('synthetic-render-ai'));
553
+ assert.ok(devices.some(device => /^synthetic-response-/.test(device.LatestTaskResultResponseId)));
554
+
555
+ const searchInput = bodyView.querySelector('[data-remote-fleet-search="true"]');
556
+ searchInput.value = 'synthetic pc 0001';
557
+ searchInput.dispatchEvent({ type: 'input' });
558
+ cards = bodyView.querySelectorAll('article[data-device-id]');
559
+ assert.equal(cards.filter(card => card.style.display !== 'none').length, 1);
560
+ assert.equal(bodyView.querySelector('[data-remote-fleet-match-count="true"]')?.textContent, `1/${SYNTHETIC_COUNT}`);
561
+
562
+ const selects = bodyView.querySelectorAll('select');
563
+ assert.equal(selects.length, 4);
564
+ const [filterSelect, , groupSelect] = selects;
565
+ searchInput.value = '';
566
+ searchInput.dispatchEvent({ type: 'input' });
567
+ filterSelect.value = 'offline';
568
+ filterSelect.dispatchEvent({ type: 'change' });
569
+ assert.equal(bodyView.querySelector('[data-remote-fleet-match-count="true"]')?.textContent, `${offlineCount}/${SYNTHETIC_COUNT}`);
570
+
571
+ filterSelect.value = 'ai';
572
+ filterSelect.dispatchEvent({ type: 'change' });
573
+ assert.equal(bodyView.querySelector('[data-remote-fleet-match-count="true"]')?.textContent, `${aiCount}/${SYNTHETIC_COUNT}`);
574
+
575
+ filterSelect.value = 'all';
576
+ filterSelect.dispatchEvent({ type: 'change' });
577
+ groupSelect.value = 'status';
578
+ groupSelect.dispatchEvent({ type: 'change' });
579
+ assert.equal(bodyView.dataset.remoteFleetGroup, 'status');
580
+ assert.ok(bodyView.querySelectorAll('[data-remote-fleet-group-header="true"]').length >= 2);
581
+ assert.equal(bodyView.querySelectorAll('article[data-device-id]').length, SYNTHETIC_COUNT);
582
+
583
+ const deviceBody = document.createElement('div');
584
+ document.body.appendChild(deviceBody);
585
+ manager.renderRemoteFleetDeviceForTest(deviceBody, buildDeviceNode(focusedDevice, hub.getStatus()));
586
+ assert.ok(deviceBody.textContent.includes(focusedDevice.Name));
587
+ assert.ok(deviceBody.querySelector('[data-remote-fleet-action="refresh-device"]'));
588
+ assert.ok(deviceBody.querySelector('[data-remote-fleet-action="task-device"]'));
589
+ assert.ok(deviceBody.textContent.includes(focusedDevice.DeviceId));
590
+
591
+ console.log(`RemoteFleet render smoke OK (${SYNTHETIC_COUNT} synthetic devices, ${connectedCount} connected, ${aiCount} AI-ready)`);
592
+ } finally {
593
+ await hub.close();
594
+ }
@@ -95,8 +95,10 @@ try {
95
95
  });
96
96
  assert.equal(aiResult.ok, true);
97
97
  assert.equal(aiResult.approvalLevel, 'ai-assist');
98
- assert.equal(hub.listDevices().find(device => device.deviceId === aiTarget.deviceId)
99
- ?.latestTask?.approvalLevel, 'ai-assist');
98
+ const updatedAiTarget = hub.listDevices().find(device => device.deviceId === aiTarget.deviceId);
99
+ assert.equal(updatedAiTarget?.latestTask?.approvalLevel, 'ai-assist');
100
+ assert.equal(updatedAiTarget?.latestTask?.resultModel, 'synthetic-ai');
101
+ assert.match(updatedAiTarget?.latestTask?.resultResponseId || '', /^synthetic-response-/);
100
102
 
101
103
  const cleared = hub.clearSyntheticFleet();
102
104
  assert.equal(cleared.ok, true);
@@ -210,6 +210,8 @@ try {
210
210
  taskId: aiTaskCommand.taskId,
211
211
  status: 'completed',
212
212
  summary: 'Smoke AI task accepted.',
213
+ model: 'smoke-ai-model',
214
+ responseId: 'smoke-ai-response',
213
215
  completedAt: new Date().toISOString()
214
216
  }
215
217
  });
@@ -223,6 +225,8 @@ try {
223
225
  : null;
224
226
  });
225
227
  assert.equal(aiTaskDevice.latestTask.resultSummary, 'Smoke AI task accepted.');
228
+ assert.equal(aiTaskDevice.latestTask.resultModel, 'smoke-ai-model');
229
+ assert.equal(aiTaskDevice.latestTask.resultResponseId, 'smoke-ai-response');
226
230
  assert.equal(aiTaskDevice.counters.tasksQueued, 2);
227
231
  assert.equal(aiTaskDevice.counters.taskResultsReceived, 2);
228
232
 
@@ -12292,6 +12292,8 @@
12292
12292
  isRemoteFleetLiveActive(device) ? 'live active remote-fast' : '',
12293
12293
  getRemoteFleetDeviceField(device, 'latestTaskTitle', 'LatestTaskTitle', ''),
12294
12294
  getRemoteFleetDeviceField(device, 'latestTaskStatus', 'LatestTaskStatus', ''),
12295
+ getRemoteFleetDeviceField(device, 'latestTaskResultModel', 'LatestTaskResultModel', ''),
12296
+ getRemoteFleetDeviceField(device, 'latestTaskResultResponseId', 'LatestTaskResultResponseId', ''),
12295
12297
  getRemoteFleetDeviceField(device, 'latestTaskResultSummary', 'LatestTaskResultSummary', ''),
12296
12298
  getRemoteFleetDeviceField(device, 'latestTaskError', 'LatestTaskError', '')
12297
12299
  ].join(' ').toLowerCase();
@@ -12470,6 +12472,8 @@
12470
12472
  const latestTaskApproval = String(getRemoteFleetDeviceField(device, 'latestTaskApprovalLevel', 'LatestTaskApprovalLevel', ''));
12471
12473
  const latestTaskUpdatedAt = String(getRemoteFleetDeviceField(device, 'latestTaskUpdatedAt', 'LatestTaskUpdatedAt', ''));
12472
12474
  const latestTaskError = String(getRemoteFleetDeviceField(device, 'latestTaskError', 'LatestTaskError', ''));
12475
+ const latestTaskResultModel = String(getRemoteFleetDeviceField(device, 'latestTaskResultModel', 'LatestTaskResultModel', ''));
12476
+ const latestTaskResultResponseId = String(getRemoteFleetDeviceField(device, 'latestTaskResultResponseId', 'LatestTaskResultResponseId', ''));
12473
12477
  const latestTaskResult = String(getRemoteFleetDeviceField(device, 'latestTaskResultSummary', 'LatestTaskResultSummary', ''));
12474
12478
 
12475
12479
  const header = document.createElement('div');
@@ -12587,7 +12591,10 @@
12587
12591
  `;
12588
12592
  const taskLine = document.createElement('div');
12589
12593
  const taskModeLabel = latestTaskApproval === 'ai-assist' ? 'AI' : 'Task';
12590
- taskLine.textContent = `${taskModeLabel} ${latestTaskStatus || 'task'}${latestTaskUpdatedAt ? ` - ${formatRemoteFleetAge(latestTaskUpdatedAt)}` : ''}`;
12594
+ taskLine.textContent = `${taskModeLabel} ${latestTaskStatus || 'task'}${latestTaskUpdatedAt ? ` - ${formatRemoteFleetAge(latestTaskUpdatedAt)}` : ''}${latestTaskResultModel ? ` - ${latestTaskResultModel}` : ''}`;
12595
+ taskLine.title = latestTaskResultResponseId
12596
+ ? `${taskLine.textContent} (${latestTaskResultResponseId})`
12597
+ : taskLine.textContent;
12591
12598
  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;`;
12592
12599
  const taskSummary = document.createElement('div');
12593
12600
  taskSummary.textContent = latestTaskError || latestTaskResult || latestTaskTitle || 'Task queued';
@@ -13376,6 +13383,8 @@
13376
13383
  const latestTaskApproval = String(device?.latestTaskApprovalLevel || device?.LatestTaskApprovalLevel || '');
13377
13384
  const latestTaskUpdatedAt = String(device?.latestTaskUpdatedAt || device?.LatestTaskUpdatedAt || '');
13378
13385
  const latestTaskError = String(device?.latestTaskError || device?.LatestTaskError || '');
13386
+ const latestTaskResultModel = String(device?.latestTaskResultModel || device?.LatestTaskResultModel || '');
13387
+ const latestTaskResultResponseId = String(device?.latestTaskResultResponseId || device?.LatestTaskResultResponseId || '');
13379
13388
  const latestTaskResult = String(device?.latestTaskResultSummary || device?.LatestTaskResultSummary || '');
13380
13389
  const groupInfo = getRemoteFleetGroupInfo(device, groupState);
13381
13390
  if (groupState !== 'none' && groupInfo.key && groupInfo.key !== lastGroupKey) {
@@ -13613,7 +13622,10 @@
13613
13622
  `;
13614
13623
  const taskLine = document.createElement('div');
13615
13624
  const taskModeLabel = latestTaskApproval === 'ai-assist' ? 'AI' : 'Task';
13616
- taskLine.textContent = `${taskModeLabel} ${latestTaskStatus || 'task'}${latestTaskUpdatedAt ? ` - ${formatRemoteFleetAge(latestTaskUpdatedAt)}` : ''}`;
13625
+ taskLine.textContent = `${taskModeLabel} ${latestTaskStatus || 'task'}${latestTaskUpdatedAt ? ` - ${formatRemoteFleetAge(latestTaskUpdatedAt)}` : ''}${latestTaskResultModel ? ` - ${latestTaskResultModel}` : ''}`;
13626
+ taskLine.title = latestTaskResultResponseId
13627
+ ? `${taskLine.textContent} (${latestTaskResultResponseId})`
13628
+ : taskLine.textContent;
13617
13629
  taskLine.style.cssText = `
13618
13630
  color: ${taskTone === 'error' ? '#991b1b' : taskTone === 'done' ? '#047857' : '#1d4ed8'};
13619
13631
  font-size: 10px;
@@ -18079,6 +18091,8 @@
18079
18091
  syncVideoNodeVisibilityPlayback: syncVideoNodeVisibilityPlayback,
18080
18092
  syncEditingOverlay: syncEditingOverlay,
18081
18093
  syncTextOverlays: syncTextOverlays,
18094
+ renderRemoteFleetMonitorForTest: renderRemoteFleetMonitor,
18095
+ renderRemoteFleetDeviceForTest: renderRemoteFleetDevice,
18082
18096
  renderBusinessAutomationEdges: renderBusinessAutomationEdges,
18083
18097
  scheduleBusinessAutomationEdgeRender: scheduleBusinessAutomationEdgeRender,
18084
18098
  hideBusinessAutomationFloatingTooltipForNode: hideBusinessAutomationFloatingTooltipForNode,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "mainAssemblyName": "MindExecution.Web",
3
3
  "resources": {
4
- "hash": "sha256-AfctgIeogWni4PMiafMrW/TiX1otsT+MSNhvCPr7EjA=",
4
+ "hash": "sha256-0k5T2HJtoTcXNrqcYPQNVAHSTuKIGNo59QRDVoAnHl4=",
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.pnw79cgqjx.dll": "MindExecution.Core.dll",
127
- "MindExecution.Kernel.dt3w864bqn.dll": "MindExecution.Kernel.dll",
128
- "MindExecution.Plugins.Admin.z93cu32xru.dll": "MindExecution.Plugins.Admin.dll",
129
- "MindExecution.Plugins.Business.b6da8sg85t.dll": "MindExecution.Plugins.Business.dll",
130
- "MindExecution.Plugins.Concept.sj3ujw4e72.dll": "MindExecution.Plugins.Concept.dll",
131
- "MindExecution.Plugins.Directory.rjod6rdmly.dll": "MindExecution.Plugins.Directory.dll",
132
- "MindExecution.Plugins.PlanMaster.ec8ccog2o3.dll": "MindExecution.Plugins.PlanMaster.dll",
133
- "MindExecution.Plugins.YouTube.mk7a07org5.dll": "MindExecution.Plugins.YouTube.dll",
134
- "MindExecution.Shared.mc9gi9kvqg.dll": "MindExecution.Shared.dll",
135
- "MindExecution.Web.n70z8m41l3.dll": "MindExecution.Web.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.4jfcx4yb6n.dll": "MindExecution.Plugins.Concept.dll",
131
+ "MindExecution.Plugins.Directory.hr2p0grenr.dll": "MindExecution.Plugins.Directory.dll",
132
+ "MindExecution.Plugins.PlanMaster.gnc7ediozd.dll": "MindExecution.Plugins.PlanMaster.dll",
133
+ "MindExecution.Plugins.YouTube.nb68y61g8l.dll": "MindExecution.Plugins.YouTube.dll",
134
+ "MindExecution.Shared.fut0ze7fxs.dll": "MindExecution.Shared.dll",
135
+ "MindExecution.Web.gzr3k0ca14.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.pnw79cgqjx.dll": "sha256-64VJ+VCnq+r7lgfYzm99hPX3yo5u2QCC4guGqsrVTus=",
282
- "MindExecution.Kernel.dt3w864bqn.dll": "sha256-r0Q9mY7CB+L/3j7KlKlNiyLBlXcwBkPRtjGh0RBZOFs=",
283
- "MindExecution.Plugins.Concept.sj3ujw4e72.dll": "sha256-eKBzfvFolc9FJhorB30L48rhIU4Ue/8vt1QO2wvOT0w=",
284
- "MindExecution.Plugins.PlanMaster.ec8ccog2o3.dll": "sha256-PiE9Rs3TkNAWvj38n/uaLil6xi2eRYeFUTQhDsdiuA4=",
285
- "MindExecution.Shared.mc9gi9kvqg.dll": "sha256-qlYWbNOfw5WCQm9YXBQj3DT2pPJcHtDxdeQ/99jrpTs=",
286
- "MindExecution.Web.n70z8m41l3.dll": "sha256-04vr/dzHUHxf++L+m7zQsKAtV3khH9yNrcl4CouSppw="
281
+ "MindExecution.Core.q469sducjw.dll": "sha256-tqgvXepOZPfdkyxH1BK3KlhL8azJjoV+iV/BismieCc=",
282
+ "MindExecution.Kernel.lqglgq2jmo.dll": "sha256-AyAPsZpAwsH/HeC6cWVzRH50hBjGAoamzGup6clWJTg=",
283
+ "MindExecution.Plugins.Concept.4jfcx4yb6n.dll": "sha256-YPWPQZNVfc6RXAiQjyj/WFnsRDCdJNDJymWZb88v93Q=",
284
+ "MindExecution.Plugins.PlanMaster.gnc7ediozd.dll": "sha256-zH2yvZLPWKNI6dutFs8Dt3WctekhA9G4R2NpOgNgFWs=",
285
+ "MindExecution.Shared.fut0ze7fxs.dll": "sha256-F8IWkvkVKPcwPF/L7AY48/QBX6Bbh5H3mWr7bO8/+cE=",
286
+ "MindExecution.Web.gzr3k0ca14.dll": "sha256-bIRn+xBPamwTWtFM/BGSzGH6FN2PngGLx2Qc7ewoARc="
287
287
  },
288
288
  "lazyAssembly": {
289
- "MindExecution.Plugins.Admin.z93cu32xru.dll": "sha256-aToPZeovhBXkB0URHkzYdYDAmg1+HxsvojgiefL4pkY=",
290
- "MindExecution.Plugins.Business.b6da8sg85t.dll": "sha256-M1macJ1ZqfBCrj/1WPw2JQxnFtFX31HxydBxQKa3Cgw=",
291
- "MindExecution.Plugins.Directory.rjod6rdmly.dll": "sha256-hx8N04/7sIYB8PdHSyVTLhPfPb7ZkmqM1RPBB1J0iuw=",
292
- "MindExecution.Plugins.YouTube.mk7a07org5.dll": "sha256-1gBQNQ4XkMp71HDUpy2X4q/IG5lrrMhuhwPdASIp0TA="
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.nb68y61g8l.dll": "sha256-/eNjC7gKzfLxjrGniD+Bv2L+4ZlxzV4ocXSe12owKDs="
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-device-pin-v470';
561
+ const scriptVersion = '20260612-remote-ai-result-metadata-v472';
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": "x1hfM46o",
2
+ "version": "+m3+ATnr",
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-LSO5/TRH4+1bNtJc7X09UZHrFfaIF1SkX012PLDVndg=",
89
+ "hash": "sha256-TRPlxHfTd5M/XAy1bnnYRmTFqExG/OMAo4jSJSVcZjk=",
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-64VJ+VCnq+r7lgfYzm99hPX3yo5u2QCC4guGqsrVTus=",
414
- "url": "_framework/MindExecution.Core.pnw79cgqjx.dll"
413
+ "hash": "sha256-tqgvXepOZPfdkyxH1BK3KlhL8azJjoV+iV/BismieCc=",
414
+ "url": "_framework/MindExecution.Core.q469sducjw.dll"
415
415
  },
416
416
  {
417
- "hash": "sha256-r0Q9mY7CB+L/3j7KlKlNiyLBlXcwBkPRtjGh0RBZOFs=",
418
- "url": "_framework/MindExecution.Kernel.dt3w864bqn.dll"
417
+ "hash": "sha256-AyAPsZpAwsH/HeC6cWVzRH50hBjGAoamzGup6clWJTg=",
418
+ "url": "_framework/MindExecution.Kernel.lqglgq2jmo.dll"
419
419
  },
420
420
  {
421
- "hash": "sha256-aToPZeovhBXkB0URHkzYdYDAmg1+HxsvojgiefL4pkY=",
422
- "url": "_framework/MindExecution.Plugins.Admin.z93cu32xru.dll"
421
+ "hash": "sha256-ctRNgHtUfPq0pCvAeG0DCzZPBRTgLtQC2c4pjGFM+Go=",
422
+ "url": "_framework/MindExecution.Plugins.Admin.2jqptn6ylw.dll"
423
423
  },
424
424
  {
425
- "hash": "sha256-M1macJ1ZqfBCrj/1WPw2JQxnFtFX31HxydBxQKa3Cgw=",
426
- "url": "_framework/MindExecution.Plugins.Business.b6da8sg85t.dll"
425
+ "hash": "sha256-ZL74Jut/WgaNdDBWZzhC6ECsjBdm+0cB1P5fx4ACugM=",
426
+ "url": "_framework/MindExecution.Plugins.Business.8hzwity3fl.dll"
427
427
  },
428
428
  {
429
- "hash": "sha256-eKBzfvFolc9FJhorB30L48rhIU4Ue/8vt1QO2wvOT0w=",
430
- "url": "_framework/MindExecution.Plugins.Concept.sj3ujw4e72.dll"
429
+ "hash": "sha256-YPWPQZNVfc6RXAiQjyj/WFnsRDCdJNDJymWZb88v93Q=",
430
+ "url": "_framework/MindExecution.Plugins.Concept.4jfcx4yb6n.dll"
431
431
  },
432
432
  {
433
- "hash": "sha256-hx8N04/7sIYB8PdHSyVTLhPfPb7ZkmqM1RPBB1J0iuw=",
434
- "url": "_framework/MindExecution.Plugins.Directory.rjod6rdmly.dll"
433
+ "hash": "sha256-PUrdpFqGptJ5kxYaarWNwB2NmZ1TphHnFHlnyQL48DI=",
434
+ "url": "_framework/MindExecution.Plugins.Directory.hr2p0grenr.dll"
435
435
  },
436
436
  {
437
- "hash": "sha256-PiE9Rs3TkNAWvj38n/uaLil6xi2eRYeFUTQhDsdiuA4=",
438
- "url": "_framework/MindExecution.Plugins.PlanMaster.ec8ccog2o3.dll"
437
+ "hash": "sha256-zH2yvZLPWKNI6dutFs8Dt3WctekhA9G4R2NpOgNgFWs=",
438
+ "url": "_framework/MindExecution.Plugins.PlanMaster.gnc7ediozd.dll"
439
439
  },
440
440
  {
441
- "hash": "sha256-1gBQNQ4XkMp71HDUpy2X4q/IG5lrrMhuhwPdASIp0TA=",
442
- "url": "_framework/MindExecution.Plugins.YouTube.mk7a07org5.dll"
441
+ "hash": "sha256-/eNjC7gKzfLxjrGniD+Bv2L+4ZlxzV4ocXSe12owKDs=",
442
+ "url": "_framework/MindExecution.Plugins.YouTube.nb68y61g8l.dll"
443
443
  },
444
444
  {
445
- "hash": "sha256-qlYWbNOfw5WCQm9YXBQj3DT2pPJcHtDxdeQ/99jrpTs=",
446
- "url": "_framework/MindExecution.Shared.mc9gi9kvqg.dll"
445
+ "hash": "sha256-F8IWkvkVKPcwPF/L7AY48/QBX6Bbh5H3mWr7bO8/+cE=",
446
+ "url": "_framework/MindExecution.Shared.fut0ze7fxs.dll"
447
447
  },
448
448
  {
449
- "hash": "sha256-04vr/dzHUHxf++L+m7zQsKAtV3khH9yNrcl4CouSppw=",
450
- "url": "_framework/MindExecution.Web.n70z8m41l3.dll"
449
+ "hash": "sha256-bIRn+xBPamwTWtFM/BGSzGH6FN2PngGLx2Qc7ewoARc=",
450
+ "url": "_framework/MindExecution.Web.gzr3k0ca14.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-T6ZFGjsJ+b+J0Je7Wr8VCbBYyPPOsuCXwkoNQny1pak=",
773
+ "hash": "sha256-WXFIc3YdM6GgUBzkhMFzph+q2JHFQ5Tl3qtMOd09268=",
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-JxMVTLs/BdFFsgJ34YMkq3lh37rBZLnvhbj3f+MxRYo=",
837
+ "hash": "sha256-o+XpLh2krvIrD5ft3X1+naDQ0KDO4W8xARptLooMC6Q=",
838
838
  "url": "index.html"
839
839
  },
840
840
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: x1hfM46o */
1
+ /* Manifest version: +m3+ATnr */
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