@mindexec/cli 0.2.442 → 0.2.443

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 (19) hide show
  1. package/package.json +1 -1
  2. package/remote-hub.js +35 -4
  3. package/server.js +11 -2
  4. package/wwwroot/_content/MindExecution.Shared/js/mind-map-css3d-manager.js +12 -8
  5. package/wwwroot/_content/MindExecution.Shared/js/mind-map-remote-codecs.js +75 -2
  6. package/wwwroot/_framework/{MindExecution.Core.nxjlewduna.dll → MindExecution.Core.4moacskf64.dll} +0 -0
  7. package/wwwroot/_framework/{MindExecution.Kernel.vrfi63yg9f.dll → MindExecution.Kernel.pa251cfsz4.dll} +0 -0
  8. package/wwwroot/_framework/{MindExecution.Plugins.Admin.1rcwhdxl0r.dll → MindExecution.Plugins.Admin.dxyuwmxv1s.dll} +0 -0
  9. package/wwwroot/_framework/{MindExecution.Plugins.Business.rx0eieg51y.dll → MindExecution.Plugins.Business.7uj5erqhhn.dll} +0 -0
  10. package/wwwroot/_framework/{MindExecution.Plugins.Concept.zzczjzhvk1.dll → MindExecution.Plugins.Concept.108rmsxc96.dll} +0 -0
  11. package/wwwroot/_framework/{MindExecution.Plugins.Directory.bsorcntiwp.dll → MindExecution.Plugins.Directory.ccsy3g0fe5.dll} +0 -0
  12. package/wwwroot/_framework/{MindExecution.Plugins.PlanMaster.i5j9t4f1jf.dll → MindExecution.Plugins.PlanMaster.1vjpuoe9ff.dll} +0 -0
  13. package/wwwroot/_framework/{MindExecution.Plugins.YouTube.1mpn9satft.dll → MindExecution.Plugins.YouTube.q8ml98phj9.dll} +0 -0
  14. package/wwwroot/_framework/{MindExecution.Shared.mpi1gzau9b.dll → MindExecution.Shared.2pywq19zjy.dll} +0 -0
  15. package/wwwroot/_framework/{MindExecution.Web.nxykcyxd02.dll → MindExecution.Web.qucbls1wfr.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 +25 -25
  19. package/wwwroot/service-worker.js +1 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mindexec/cli",
3
- "version": "0.2.442",
3
+ "version": "0.2.443",
4
4
  "description": "MindExec local runtime and bridge CLI",
5
5
  "main": "server.js",
6
6
  "type": "module",
package/remote-hub.js CHANGED
@@ -60,6 +60,17 @@ const REMOTE_FRAME_MODE_PROFILES = Object.freeze({
60
60
  modeVersion: 1,
61
61
  implemented: true
62
62
  }),
63
+ 'mode2-lzo': Object.freeze({
64
+ mode: 'mode2-lzo',
65
+ label: 'Mode 2 RGB565 LZO Wall',
66
+ transport: 'ws-binary',
67
+ encoding: 'image-raw',
68
+ codec: 'rgb565',
69
+ compression: 'lzo1x',
70
+ profile: 'mode2-lzo-rgb565-v1',
71
+ modeVersion: 2,
72
+ implemented: true
73
+ }),
63
74
  'mode3-h264-hw': Object.freeze({
64
75
  mode: 'mode3-h264-hw',
65
76
  label: 'Mode 3 H.264 Control',
@@ -103,6 +114,13 @@ const REMOTE_FRAME_MODE_ALIASES = new Map([
103
114
  ['remotequality', 'remote-quality'],
104
115
  ['remote_quality', 'remote-quality'],
105
116
  ['remote-quality', 'remote-quality'],
117
+ ['2', 'mode2-lzo'],
118
+ ['mode2', 'mode2-lzo'],
119
+ ['mode-2', 'mode2-lzo'],
120
+ ['mode2-lzo', 'mode2-lzo'],
121
+ ['lzo', 'mode2-lzo'],
122
+ ['lzo1x', 'mode2-lzo'],
123
+ ['rgb565', 'mode2-lzo'],
106
124
  ['mode3-h264', 'mode3-h264-hw'],
107
125
  ['mode3-h264-hw', 'mode3-h264-hw'],
108
126
  ['h264', 'mode3-h264-hw'],
@@ -2449,6 +2467,12 @@ export function createRemoteHub(options = {}) {
2449
2467
  fps: Number.isFinite(Number(message.fps)) ? Number(message.fps) : device.activeLiveStream.fps,
2450
2468
  streamPurpose: safeString(message.streamPurpose, 32),
2451
2469
  monitorIndex: Number.isFinite(Number(message.monitorIndex)) ? Number(message.monitorIndex) : 0,
2470
+ monitorCount: Number.isFinite(Number(message.monitorCount)) ? Number(message.monitorCount) : 0,
2471
+ pixelFormat: safeString(message.pixelFormat, 24),
2472
+ bytesPerPixel: Number.isFinite(Number(message.bytesPerPixel)) ? Number(message.bytesPerPixel) : 0,
2473
+ uncompressedByteLength: Number.isFinite(Number(message.uncompressedByteLength)) ? Number(message.uncompressedByteLength) : 0,
2474
+ sourceWidth: Number.isFinite(Number(message.sourceWidth)) ? Number(message.sourceWidth) : 0,
2475
+ sourceHeight: Number.isFinite(Number(message.sourceHeight)) ? Number(message.sourceHeight) : 0,
2452
2476
  h264Format: safeString(message.h264Format, 24),
2453
2477
  isKeyFrame: message.isKeyFrame === true,
2454
2478
  chunkType: safeString(message.chunkType, 24),
@@ -3260,9 +3284,11 @@ export function createRemoteHub(options = {}) {
3260
3284
 
3261
3285
  const now = new Date().toISOString();
3262
3286
  const streamId = safeString(options.streamId, 128) || `live-${Date.now()}`;
3263
- const fps = clampNumber(options.fps, 1, 30, 20);
3287
+ const streamPurpose = safeString(options.streamPurpose, 32).toLowerCase();
3288
+ const requestedMode = options.mode || (streamPurpose === 'control' ? 'mode3-h264-hw' : 'mode2-lzo');
3289
+ const fps = clampNumber(options.fps, 1, 30, streamPurpose === 'control' ? 30 : 20);
3264
3290
  const commandId = safeString(options.commandId, 128) || crypto.randomUUID();
3265
- const transfer = buildRemoteFrameTransferDescriptor(options.mode || DEFAULT_REMOTE_FRAME_MODE);
3291
+ const transfer = buildRemoteFrameTransferDescriptor(requestedMode, streamPurpose === 'control' ? 'mode3-h264-hw' : 'mode2-lzo');
3266
3292
  device.counters.commandsSent += 1;
3267
3293
  device.activeLiveStream = {
3268
3294
  streamId,
@@ -3281,6 +3307,7 @@ export function createRemoteHub(options = {}) {
3281
3307
  transferProtocolVersion: transfer.transferProtocolVersion,
3282
3308
  handshake: transfer.handshake,
3283
3309
  fps,
3310
+ streamPurpose,
3284
3311
  startedAt: now,
3285
3312
  stoppedAt: '',
3286
3313
  stopReason: '',
@@ -3314,9 +3341,11 @@ export function createRemoteHub(options = {}) {
3314
3341
 
3315
3342
  const now = new Date().toISOString();
3316
3343
  const streamId = safeString(options.streamId, 128) || `live-${Date.now()}`;
3317
- const fps = clampNumber(options.fps, 1, 30, 20);
3344
+ const streamPurpose = safeString(options.streamPurpose, 32).toLowerCase();
3345
+ const requestedMode = options.mode || (streamPurpose === 'control' ? 'mode3-h264-hw' : 'mode2-lzo');
3346
+ const fps = clampNumber(options.fps, 1, 30, streamPurpose === 'control' ? 30 : 20);
3318
3347
  const commandId = safeString(options.commandId, 128) || crypto.randomUUID();
3319
- const transfer = buildRemoteFrameTransferDescriptor(options.mode || DEFAULT_REMOTE_FRAME_MODE);
3348
+ const transfer = buildRemoteFrameTransferDescriptor(requestedMode, streamPurpose === 'control' ? 'mode3-h264-hw' : 'mode2-lzo');
3320
3349
  const result = sendCommand(deviceId, {
3321
3350
  command: 'stream.start',
3322
3351
  commandId,
@@ -3331,6 +3360,7 @@ export function createRemoteHub(options = {}) {
3331
3360
  transferProtocol: transfer.transferProtocol,
3332
3361
  transferProtocolVersion: transfer.transferProtocolVersion,
3333
3362
  handshake: transfer.handshake,
3363
+ streamPurpose,
3334
3364
  fps,
3335
3365
  maxWidth: clampNumber(options.maxWidth, 320, 2560, 960),
3336
3366
  maxHeight: clampNumber(options.maxHeight, 180, 1440, 540),
@@ -3360,6 +3390,7 @@ export function createRemoteHub(options = {}) {
3360
3390
  transferProtocolVersion: transfer.transferProtocolVersion,
3361
3391
  handshake: transfer.handshake,
3362
3392
  fps,
3393
+ streamPurpose,
3363
3394
  startedAt: now,
3364
3395
  stoppedAt: '',
3365
3396
  stopReason: '',
package/server.js CHANGED
@@ -2581,8 +2581,9 @@ function clampRemoteFrameWsNumber(value, min, max, fallback) {
2581
2581
  }
2582
2582
 
2583
2583
  function normalizeRemoteFrameWsLiveOptions(payload = {}) {
2584
- const mode = String(payload.frameMode || payload.mode || 'remote-fast').trim() || 'remote-fast';
2585
2584
  const streamPurpose = String(payload.streamPurpose || '').trim().toLowerCase();
2585
+ const defaultMode = streamPurpose === 'control' ? 'mode3-h264-hw' : 'mode2-lzo';
2586
+ const mode = String(payload.frameMode || payload.mode || defaultMode).trim() || defaultMode;
2586
2587
  const defaultFps = streamPurpose === 'control' || mode === 'mode3-h264-hw' ? 30 : REMOTE_FRAME_WS_DEFAULT_FPS;
2587
2588
  return {
2588
2589
  fps: clampRemoteFrameWsNumber(payload.fps, 1, 30, defaultFps),
@@ -2725,6 +2726,12 @@ function buildRemoteFrameBinaryPacket(frameEvent) {
2725
2726
  sameContentStreak: Number(frame.sameContentStreak || 0) || 0,
2726
2727
  streamPurpose: frame.streamPurpose || '',
2727
2728
  monitorIndex: Number.isFinite(Number(frame.monitorIndex)) ? Number(frame.monitorIndex) : 0,
2729
+ monitorCount: Number.isFinite(Number(frame.monitorCount)) ? Number(frame.monitorCount) : 0,
2730
+ pixelFormat: frame.pixelFormat || '',
2731
+ bytesPerPixel: Number.isFinite(Number(frame.bytesPerPixel)) ? Number(frame.bytesPerPixel) : 0,
2732
+ uncompressedByteLength: Number.isFinite(Number(frame.uncompressedByteLength)) ? Number(frame.uncompressedByteLength) : 0,
2733
+ sourceWidth: Number.isFinite(Number(frame.sourceWidth)) ? Number(frame.sourceWidth) : 0,
2734
+ sourceHeight: Number.isFinite(Number(frame.sourceHeight)) ? Number(frame.sourceHeight) : 0,
2728
2735
  codec: frame.codec || '',
2729
2736
  h264Format: frame.h264Format || '',
2730
2737
  isKeyFrame: frame.isKeyFrame === true,
@@ -12819,9 +12826,11 @@ app.get('/api/remote/devices/:deviceId/live/frame', (req, res) => {
12819
12826
  });
12820
12827
 
12821
12828
  app.post('/api/remote/devices/:deviceId/live/start', (req, res) => {
12829
+ const streamPurpose = String(req.body?.streamPurpose || '').trim().toLowerCase();
12822
12830
  res.json(remoteHub.startLiveStream(req.params.deviceId, {
12823
12831
  streamId: req.body?.streamId,
12824
- mode: req.body?.frameMode || req.body?.mode || 'mode3-h264-hw',
12832
+ mode: req.body?.frameMode || req.body?.mode || (streamPurpose === 'control' ? 'mode3-h264-hw' : 'mode2-lzo'),
12833
+ streamPurpose,
12825
12834
  fps: req.body?.fps,
12826
12835
  maxWidth: req.body?.maxWidth,
12827
12836
  maxHeight: req.body?.maxHeight,
@@ -15955,7 +15955,7 @@
15955
15955
  maxWidth: Number(options.maxWidth || 960) || 960,
15956
15956
  maxHeight: Number(options.maxHeight || 540) || 540,
15957
15957
  quality: Number(options.quality || 60) || 60,
15958
- mode: String(options.mode || 'mode3-h264-hw'),
15958
+ mode: String(options.mode || 'mode2-lzo'),
15959
15959
  streamPurpose: String(options.streamPurpose || 'wall')
15960
15960
  };
15961
15961
  bodyView._remoteFleetBinaryFrameSession = session;
@@ -17192,13 +17192,15 @@
17192
17192
  function applyRemoteFleetFramePatchToPreview(preview, frame) {
17193
17193
  if (frame?._remoteFleetBinaryFrame === true
17194
17194
  && frame?._remoteFleetPayloadBlob
17195
- && String(frame.codec || '').toLowerCase().includes('h264')
17196
- && window.MindExecRemoteCodecs?.decodeH264Frame) {
17195
+ && (String(frame.codec || '').toLowerCase().includes('h264')
17196
+ || (String(frame.frameMode || frame.mode || '').toLowerCase() === 'mode2-lzo'
17197
+ && String(frame.compression || '').toLowerCase() === 'lzo1x'))
17198
+ && window.MindExecRemoteCodecs?.decodeFrame) {
17197
17199
  const canvas = ensureRemoteFleetFrameCanvas(preview);
17198
17200
  if (canvas) {
17199
17201
  canvas.style.display = 'block';
17200
17202
  preview.querySelector?.('img[data-remote-fleet-frame-image="true"]')?.style.setProperty('display', 'none');
17201
- window.MindExecRemoteCodecs.decodeH264Frame(canvas, frame).catch?.(() => undefined);
17203
+ window.MindExecRemoteCodecs.decodeFrame(canvas, frame).catch?.(() => undefined);
17202
17204
  preview.dataset.remoteFleetFrameKind = String(frame.kind || 'live').toLowerCase();
17203
17205
  preview.dataset.remoteFleetFrameSeq = String(frame.frameSeq || 0);
17204
17206
  return true;
@@ -17535,9 +17537,11 @@
17535
17537
  }
17536
17538
 
17537
17539
  if (frame._remoteFleetPayloadBlob
17538
- && String(frame.codec || '').toLowerCase().includes('h264')
17539
- && window.MindExecRemoteCodecs?.decodeH264Frame) {
17540
- const painted = await window.MindExecRemoteCodecs.decodeH264Frame(session.canvas, frame);
17540
+ && (String(frame.codec || '').toLowerCase().includes('h264')
17541
+ || (String(frame.frameMode || frame.mode || '').toLowerCase() === 'mode2-lzo'
17542
+ && String(frame.compression || '').toLowerCase() === 'lzo1x'))
17543
+ && window.MindExecRemoteCodecs?.decodeFrame) {
17544
+ const painted = await window.MindExecRemoteCodecs.decodeFrame(session.canvas, frame);
17541
17545
  if (painted && session.active) {
17542
17546
  session.canvas.dataset.remoteFleetFrameKind = 'live';
17543
17547
  session.canvas.dataset.remoteFleetFrameSeq = String(frameSeq || 0);
@@ -20717,7 +20721,7 @@
20717
20721
  maxWidth: 960,
20718
20722
  maxHeight: 540,
20719
20723
  quality: 60,
20720
- mode: 'mode3-h264-hw',
20724
+ mode: 'mode2-lzo',
20721
20725
  streamPurpose: 'wall'
20722
20726
  });
20723
20727
  if (!binaryFrameSocketStarted) {
@@ -3,6 +3,7 @@
3
3
 
4
4
  const decoderByCanvas = new WeakMap();
5
5
  const MAX_DECODE_QUEUE = 3;
6
+ const rawFrameByCanvas = new WeakMap();
6
7
 
7
8
  function emit(type, data) {
8
9
  window.RuntimeTrace?.emit?.(type, data);
@@ -30,6 +31,73 @@
30
31
  state.pending = 0;
31
32
  }
32
33
 
34
+ // LiveDesk Mode 2 payloads are LZO1X-compressed little-endian RGB565.
35
+ // Keep this decoder local to the wall path so H.264 control surfaces remain
36
+ // fully independent.
37
+ function decodeLzo1x(input, outputLength) {
38
+ if (!(input instanceof Uint8Array) || input.length < 3) throw new Error('Invalid LZO1X block');
39
+ const output = new Uint8Array(outputLength);
40
+ const s = { i: 0, o: 0 };
41
+ const need = (n) => { if (s.i + n > input.length) throw new Error('LZO input overrun'); };
42
+ const literals = (n) => {
43
+ need(n);
44
+ if (s.o + n > output.length) throw new Error('LZO output overrun');
45
+ output.set(input.subarray(s.i, s.i + n), s.o); s.i += n; s.o += n;
46
+ };
47
+ const ext = (basis) => { let zeros = 0; while (true) { need(1); if (input[s.i] !== 0) break; zeros++; s.i++; } return zeros * 255 + basis + input[s.i++]; };
48
+ const match = (at, length) => {
49
+ const distance = s.o - at;
50
+ if (distance <= 0 || s.o + length > output.length) throw new Error('LZO match overrun');
51
+ for (let n = 0; n < length; n++) output[s.o++] = output[at + (n % distance)];
52
+ };
53
+ let state = 0; let matchLength = 0;
54
+ if (input[0] >= 22) { s.i++; literals(input[0] - 17); state = 4; }
55
+ else if (input[0] >= 18) { s.i++; state = input[0] - 17; literals(state); }
56
+ while (true) {
57
+ need(1); const instruction = input[s.i++]; let nextState; let at;
58
+ if ((instruction & 0xc0) !== 0) {
59
+ need(1); at = s.o - ((input[s.i++] << 3) + ((instruction >> 2) & 7) + 1); matchLength = (instruction >> 5) + 1; nextState = instruction & 3;
60
+ } else if ((instruction & 0x20) !== 0) {
61
+ matchLength = (instruction & 0x1f) + 2; if (matchLength === 2) matchLength += ext(31); need(2); const encoded = input[s.i++] | (input[s.i++] << 8); at = s.o - ((encoded >> 2) + 1); nextState = encoded & 3;
62
+ } else if ((instruction & 0x10) !== 0) {
63
+ matchLength = (instruction & 7) + 2; if (matchLength === 2) matchLength += ext(7); need(2); const encoded = input[s.i++] | (input[s.i++] << 8); at = s.o - (((instruction & 8) << 11) + (encoded >> 2)); nextState = encoded & 3; if (at === s.o) break; at -= 0x4000;
64
+ } else if (state === 0) {
65
+ let length = instruction + 3; if (length === 3) length += ext(15); literals(length); state = 4; continue;
66
+ } else {
67
+ need(1); nextState = instruction & 3; at = s.o - ((instruction >> 2) + (input[s.i++] << 2) + (state === 4 ? 2049 : 1)); matchLength = state === 4 ? 3 : 2;
68
+ }
69
+ if (at < 0 || s.o + matchLength + nextState > output.length) throw new Error('LZO lookbehind overrun');
70
+ match(at, matchLength); state = nextState; literals(nextState);
71
+ }
72
+ if (matchLength !== 3 || s.i !== input.length || s.o !== output.length) throw new Error('Incomplete LZO block');
73
+ return output;
74
+ }
75
+
76
+ async function decodeMode2Frame(canvas, frame) {
77
+ const payload = frame?._remoteFleetPayloadBlob;
78
+ if (!canvas || !payload) return false;
79
+ const width = Math.max(1, Number(frame.width || 0) | 0);
80
+ const height = Math.max(1, Number(frame.height || 0) | 0);
81
+ const expected = width * height * 2;
82
+ if (Number(frame.bytesPerPixel || 2) !== 2 || (Number(frame.uncompressedByteLength || expected) !== expected)) return false;
83
+ const state = rawFrameByCanvas.get(canvas) || { lastSeq: 0 };
84
+ const seq = Number(frame.streamFrameSeq || frame.frameSeq || 0) || 0;
85
+ if (seq > 0 && seq <= state.lastSeq) return true;
86
+ const compressed = new Uint8Array(await payload.arrayBuffer());
87
+ const rgb565 = decodeLzo1x(compressed, expected);
88
+ const rgba = new Uint8ClampedArray(width * height * 4);
89
+ for (let source = 0, target = 0; source < rgb565.length; source += 2, target += 4) {
90
+ const pixel = rgb565[source] | (rgb565[source + 1] << 8);
91
+ const r = (pixel >> 11) & 31; const g = (pixel >> 5) & 63; const b = pixel & 31;
92
+ rgba[target] = (r << 3) | (r >> 2); rgba[target + 1] = (g << 2) | (g >> 4); rgba[target + 2] = (b << 3) | (b >> 2); rgba[target + 3] = 255;
93
+ }
94
+ canvas.width = width; canvas.height = height;
95
+ canvas.getContext('2d', { alpha: false, desynchronized: true })?.putImageData(new ImageData(rgba, width, height), 0, 0);
96
+ state.lastSeq = seq; rawFrameByCanvas.set(canvas, state);
97
+ emit('remote.mode2.paint', { frameSeq: seq, width, height });
98
+ return true;
99
+ }
100
+
33
101
  function ensureDecoder(canvas, frame, state) {
34
102
  if (typeof VideoDecoder !== 'function' || typeof EncodedVideoChunk !== 'function') {
35
103
  return null;
@@ -88,9 +156,14 @@
88
156
 
89
157
  async function decode(canvas, frame) {
90
158
  const payload = frame?._remoteFleetPayloadBlob;
91
- if (!canvas || !payload || !String(frame?.codec || '').toLowerCase().includes('h264')) {
159
+ if (!canvas || !payload) {
92
160
  return false;
93
161
  }
162
+ const mode = String(frame?.frameMode || frame?.mode || '').toLowerCase();
163
+ if (mode === 'mode2-lzo' || String(frame?.compression || '').toLowerCase() === 'lzo1x' || String(frame?.mimeType || '').toLowerCase() === 'application/vnd.livedesk.lzo-rgb565') {
164
+ try { return await decodeMode2Frame(canvas, frame); } catch (error) { emit('remote.mode2.decodeFailed', { error: error?.message || String(error || '') }); return false; }
165
+ }
166
+ if (!String(frame?.codec || '').toLowerCase().includes('h264')) return false;
94
167
  const state = getDecoderState(canvas);
95
168
  const seq = Number(frame.streamFrameSeq || frame.frameSeq || 0) || 0;
96
169
  if (seq > 0 && seq <= state.lastSeq) return true;
@@ -122,5 +195,5 @@
122
195
  }
123
196
  }
124
197
 
125
- window.MindExecRemoteCodecs = Object.freeze({ decodeH264Frame: decode });
198
+ window.MindExecRemoteCodecs = Object.freeze({ decodeH264Frame: decode, decodeFrame: decode });
126
199
  })();
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "mainAssemblyName": "MindExecution.Web",
3
3
  "resources": {
4
- "hash": "sha256-WNzAmWuVhn9JyBiHwwIttruk/GbsVNnakpghIldcLg8=",
4
+ "hash": "sha256-vyIwPs5NXG0WvUn1crlwB/OCRyxH6tUNE8CXfOaHuOI=",
5
5
  "fingerprinting": {
6
6
  "Google.Protobuf.9h59ukbel7.dll": "Google.Protobuf.dll",
7
7
  "Markdig.d1j7v41cl1.dll": "Markdig.dll",
@@ -122,16 +122,16 @@
122
122
  "System.brmz7yk5qh.dll": "System.dll",
123
123
  "netstandard.b50t77veor.dll": "netstandard.dll",
124
124
  "System.Private.CoreLib.g6ztz7cmo2.dll": "System.Private.CoreLib.dll",
125
- "MindExecution.Core.nxjlewduna.dll": "MindExecution.Core.dll",
126
- "MindExecution.Kernel.vrfi63yg9f.dll": "MindExecution.Kernel.dll",
127
- "MindExecution.Plugins.Admin.1rcwhdxl0r.dll": "MindExecution.Plugins.Admin.dll",
128
- "MindExecution.Plugins.Business.rx0eieg51y.dll": "MindExecution.Plugins.Business.dll",
129
- "MindExecution.Plugins.Concept.zzczjzhvk1.dll": "MindExecution.Plugins.Concept.dll",
130
- "MindExecution.Plugins.Directory.bsorcntiwp.dll": "MindExecution.Plugins.Directory.dll",
131
- "MindExecution.Plugins.PlanMaster.i5j9t4f1jf.dll": "MindExecution.Plugins.PlanMaster.dll",
132
- "MindExecution.Plugins.YouTube.1mpn9satft.dll": "MindExecution.Plugins.YouTube.dll",
133
- "MindExecution.Shared.mpi1gzau9b.dll": "MindExecution.Shared.dll",
134
- "MindExecution.Web.nxykcyxd02.dll": "MindExecution.Web.dll",
125
+ "MindExecution.Core.4moacskf64.dll": "MindExecution.Core.dll",
126
+ "MindExecution.Kernel.pa251cfsz4.dll": "MindExecution.Kernel.dll",
127
+ "MindExecution.Plugins.Admin.dxyuwmxv1s.dll": "MindExecution.Plugins.Admin.dll",
128
+ "MindExecution.Plugins.Business.7uj5erqhhn.dll": "MindExecution.Plugins.Business.dll",
129
+ "MindExecution.Plugins.Concept.108rmsxc96.dll": "MindExecution.Plugins.Concept.dll",
130
+ "MindExecution.Plugins.Directory.ccsy3g0fe5.dll": "MindExecution.Plugins.Directory.dll",
131
+ "MindExecution.Plugins.PlanMaster.1vjpuoe9ff.dll": "MindExecution.Plugins.PlanMaster.dll",
132
+ "MindExecution.Plugins.YouTube.q8ml98phj9.dll": "MindExecution.Plugins.YouTube.dll",
133
+ "MindExecution.Shared.2pywq19zjy.dll": "MindExecution.Shared.dll",
134
+ "MindExecution.Web.qucbls1wfr.dll": "MindExecution.Web.dll",
135
135
  "dotnet.native.566r55w3xu.js": "dotnet.native.js",
136
136
  "dotnet.native.x6q5aixc38.wasm": "dotnet.native.wasm",
137
137
  "dotnet.js": "dotnet.js",
@@ -276,18 +276,18 @@
276
276
  "System.Xml.XDocument.sn51jas17n.dll": "sha256-GNI2kFgFmPTwzuzwUn8gxK+AzGLUWRJFdg9JzIbrybQ=",
277
277
  "System.brmz7yk5qh.dll": "sha256-CfM2miyj1KHApFmqMdLYWio3S/jrdON2pW9Xr2nTwlo=",
278
278
  "netstandard.b50t77veor.dll": "sha256-//jQGOXjb8ET8WtXgOJrAxLx6E7zDJ5RjRRutwkvmxo=",
279
- "MindExecution.Core.nxjlewduna.dll": "sha256-K/aYKYR7u21eWdPhsuyT3DfAcldItQ9fUJDpyAW1Yk8=",
280
- "MindExecution.Kernel.vrfi63yg9f.dll": "sha256-pQ3AG4I0yHOE+LjWf41pPTzD6WAPx5QEVQR99tgmjv8=",
281
- "MindExecution.Plugins.Business.rx0eieg51y.dll": "sha256-wXky9gfkYuS9LpiAJcaHL2ySg388QTlafZ7dDYaYGkc=",
282
- "MindExecution.Plugins.Concept.zzczjzhvk1.dll": "sha256-caSJdsMUA/y2XoLlC69Ml7LVPyEklu9iUqK8LbLH/Ac=",
283
- "MindExecution.Plugins.PlanMaster.i5j9t4f1jf.dll": "sha256-NsaH6mfDGUtq96FRS/yR+b5QyLzjVWublyCQBKugpss=",
284
- "MindExecution.Shared.mpi1gzau9b.dll": "sha256-Bk/J98QCHrurXfAfiETiavqv5g5jXQ73yvEdYibuIrU=",
285
- "MindExecution.Web.nxykcyxd02.dll": "sha256-JW4hqFR8NT2yFKIvMflIhM8Wks9Dec4w+0ofv69tU6w="
279
+ "MindExecution.Core.4moacskf64.dll": "sha256-5OiBWkHcOvL4NsaHtQ7O3z5N1Ba7nTRi3xkehUMMgkE=",
280
+ "MindExecution.Kernel.pa251cfsz4.dll": "sha256-4dswyE6zmKAS+CnExpbXK871UMxIp+a7SPMIMwmZ+2Q=",
281
+ "MindExecution.Plugins.Business.7uj5erqhhn.dll": "sha256-URKvk2etEOiEa/URXJpkYx7aJcPQd1Xs0Yxn3Uqg/ok=",
282
+ "MindExecution.Plugins.Concept.108rmsxc96.dll": "sha256-QTd+zvSVcfwz3gYaKZ3pP0wgxrj9R1aP6qQKsByDRR0=",
283
+ "MindExecution.Plugins.PlanMaster.1vjpuoe9ff.dll": "sha256-M3Fvm8WU5xbx24cTyACzH1IuZXuIY06dkeCfNCgeUT4=",
284
+ "MindExecution.Shared.2pywq19zjy.dll": "sha256-Wjp+pPwb4TDj0YtYTzvNQGIzQI7xAg9DeyO0g/jxyxU=",
285
+ "MindExecution.Web.qucbls1wfr.dll": "sha256-0kpuM4z2XvRReo2Eiy7cJ/SAfoF/dVnn6WChaz//lGc="
286
286
  },
287
287
  "lazyAssembly": {
288
- "MindExecution.Plugins.Admin.1rcwhdxl0r.dll": "sha256-jV0N8WevIxIidWNinjH1vZ+NS+eKshBtlZpvb6vCfmg=",
289
- "MindExecution.Plugins.Directory.bsorcntiwp.dll": "sha256-O07lrIPzxWQRivTDifZBsSoG+ZMptwdu2Ey2e9sF0M0=",
290
- "MindExecution.Plugins.YouTube.1mpn9satft.dll": "sha256-l6UnB6LB9UHscjF/q5j8F2fKCunQ63w6mkwEEuWK3tg="
288
+ "MindExecution.Plugins.Admin.dxyuwmxv1s.dll": "sha256-URTQOP1nUuBC2leUgGdGWb+rc/1blCxbpbhRGE1MW/I=",
289
+ "MindExecution.Plugins.Directory.ccsy3g0fe5.dll": "sha256-BFk4mut2rsioBC9unD8+BoxnoJqTJlS5uZV7uXr8i5E=",
290
+ "MindExecution.Plugins.YouTube.q8ml98phj9.dll": "sha256-2vzs6nizBsYO1JjXPxdSi6O7uyZLpqFblwE0q09mvfw="
291
291
  }
292
292
  },
293
293
  "cacheBootResources": true,
@@ -579,7 +579,7 @@
579
579
  }
580
580
 
581
581
  const base = '_content/MindExecution.Shared/js/';
582
- const scriptVersion = '20260717-livedesk-h264-transport-v936';
582
+ const scriptVersion = '20260717-livedesk-wall-lzo-control-h264-v937';
583
583
  const scriptUrl = (script) => `${base}${script}?v=${scriptVersion}`;
584
584
  console.log(`[Script Loader] Shared JS version: ${scriptVersion}`);
585
585
  const criticalScripts = [
@@ -1,5 +1,5 @@
1
1
  self.assetsManifest = {
2
- "version": "Zf4S1may",
2
+ "version": "rJ2/x4YC",
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-GFA+cRQbVmpUXxFLk/Zl7kBOUgISlLjY6DdZ7N+Yx8A=",
89
+ "hash": "sha256-UG57W/xx2is6r0blcR4M4YYFG2zpW7oRyflGw5UE6yQ=",
90
90
  "url": "_content/MindExecution.Shared/js/mind-map-css3d-manager.js"
91
91
  },
92
92
  {
@@ -154,7 +154,7 @@
154
154
  "url": "_content/MindExecution.Shared/js/mind-map-pipeline.js"
155
155
  },
156
156
  {
157
- "hash": "sha256-xPo+OHw25ABSIGVNplBuKGRyqjJHsSLHGz2Ra3FwI24=",
157
+ "hash": "sha256-sSOS0P5WQJR45J7JqcTrit9KCONG59fFYCgUfYgA/+c=",
158
158
  "url": "_content/MindExecution.Shared/js/mind-map-remote-codecs.js"
159
159
  },
160
160
  {
@@ -422,44 +422,44 @@
422
422
  "url": "_framework/MimeMapping.og9ys58ylm.dll"
423
423
  },
424
424
  {
425
- "hash": "sha256-K/aYKYR7u21eWdPhsuyT3DfAcldItQ9fUJDpyAW1Yk8=",
426
- "url": "_framework/MindExecution.Core.nxjlewduna.dll"
425
+ "hash": "sha256-5OiBWkHcOvL4NsaHtQ7O3z5N1Ba7nTRi3xkehUMMgkE=",
426
+ "url": "_framework/MindExecution.Core.4moacskf64.dll"
427
427
  },
428
428
  {
429
- "hash": "sha256-pQ3AG4I0yHOE+LjWf41pPTzD6WAPx5QEVQR99tgmjv8=",
430
- "url": "_framework/MindExecution.Kernel.vrfi63yg9f.dll"
429
+ "hash": "sha256-4dswyE6zmKAS+CnExpbXK871UMxIp+a7SPMIMwmZ+2Q=",
430
+ "url": "_framework/MindExecution.Kernel.pa251cfsz4.dll"
431
431
  },
432
432
  {
433
- "hash": "sha256-jV0N8WevIxIidWNinjH1vZ+NS+eKshBtlZpvb6vCfmg=",
434
- "url": "_framework/MindExecution.Plugins.Admin.1rcwhdxl0r.dll"
433
+ "hash": "sha256-URTQOP1nUuBC2leUgGdGWb+rc/1blCxbpbhRGE1MW/I=",
434
+ "url": "_framework/MindExecution.Plugins.Admin.dxyuwmxv1s.dll"
435
435
  },
436
436
  {
437
- "hash": "sha256-wXky9gfkYuS9LpiAJcaHL2ySg388QTlafZ7dDYaYGkc=",
438
- "url": "_framework/MindExecution.Plugins.Business.rx0eieg51y.dll"
437
+ "hash": "sha256-URKvk2etEOiEa/URXJpkYx7aJcPQd1Xs0Yxn3Uqg/ok=",
438
+ "url": "_framework/MindExecution.Plugins.Business.7uj5erqhhn.dll"
439
439
  },
440
440
  {
441
- "hash": "sha256-caSJdsMUA/y2XoLlC69Ml7LVPyEklu9iUqK8LbLH/Ac=",
442
- "url": "_framework/MindExecution.Plugins.Concept.zzczjzhvk1.dll"
441
+ "hash": "sha256-QTd+zvSVcfwz3gYaKZ3pP0wgxrj9R1aP6qQKsByDRR0=",
442
+ "url": "_framework/MindExecution.Plugins.Concept.108rmsxc96.dll"
443
443
  },
444
444
  {
445
- "hash": "sha256-O07lrIPzxWQRivTDifZBsSoG+ZMptwdu2Ey2e9sF0M0=",
446
- "url": "_framework/MindExecution.Plugins.Directory.bsorcntiwp.dll"
445
+ "hash": "sha256-BFk4mut2rsioBC9unD8+BoxnoJqTJlS5uZV7uXr8i5E=",
446
+ "url": "_framework/MindExecution.Plugins.Directory.ccsy3g0fe5.dll"
447
447
  },
448
448
  {
449
- "hash": "sha256-NsaH6mfDGUtq96FRS/yR+b5QyLzjVWublyCQBKugpss=",
450
- "url": "_framework/MindExecution.Plugins.PlanMaster.i5j9t4f1jf.dll"
449
+ "hash": "sha256-M3Fvm8WU5xbx24cTyACzH1IuZXuIY06dkeCfNCgeUT4=",
450
+ "url": "_framework/MindExecution.Plugins.PlanMaster.1vjpuoe9ff.dll"
451
451
  },
452
452
  {
453
- "hash": "sha256-l6UnB6LB9UHscjF/q5j8F2fKCunQ63w6mkwEEuWK3tg=",
454
- "url": "_framework/MindExecution.Plugins.YouTube.1mpn9satft.dll"
453
+ "hash": "sha256-2vzs6nizBsYO1JjXPxdSi6O7uyZLpqFblwE0q09mvfw=",
454
+ "url": "_framework/MindExecution.Plugins.YouTube.q8ml98phj9.dll"
455
455
  },
456
456
  {
457
- "hash": "sha256-Bk/J98QCHrurXfAfiETiavqv5g5jXQ73yvEdYibuIrU=",
458
- "url": "_framework/MindExecution.Shared.mpi1gzau9b.dll"
457
+ "hash": "sha256-Wjp+pPwb4TDj0YtYTzvNQGIzQI7xAg9DeyO0g/jxyxU=",
458
+ "url": "_framework/MindExecution.Shared.2pywq19zjy.dll"
459
459
  },
460
460
  {
461
- "hash": "sha256-JW4hqFR8NT2yFKIvMflIhM8Wks9Dec4w+0ofv69tU6w=",
462
- "url": "_framework/MindExecution.Web.nxykcyxd02.dll"
461
+ "hash": "sha256-0kpuM4z2XvRReo2Eiy7cJ/SAfoF/dVnn6WChaz//lGc=",
462
+ "url": "_framework/MindExecution.Web.qucbls1wfr.dll"
463
463
  },
464
464
  {
465
465
  "hash": "sha256-IsZJ91/OW+fHzNqIgEc7Y072ns8z9dGritiSyvR9Wgc=",
@@ -778,7 +778,7 @@
778
778
  "url": "_framework/Websocket.Client.vapounvmnl.dll"
779
779
  },
780
780
  {
781
- "hash": "sha256-efYVBj4Jm4ZnmPFM+XlCUI1QryxIbUGpXgESbyxFr4g=",
781
+ "hash": "sha256-SodYBsgd8t15/lAV4kw0t8S8pVMaovSwrWPF2PO4ZeM=",
782
782
  "url": "_framework/blazor.boot.json"
783
783
  },
784
784
  {
@@ -838,7 +838,7 @@
838
838
  "url": "icon-512.png"
839
839
  },
840
840
  {
841
- "hash": "sha256-vfaRB6KlJZ7SQhWJYbdLn8EiiizshJMwvL4n4HkCEpM=",
841
+ "hash": "sha256-APqqcB+gM4o0ey/YKw0z/i3QKVnlJxEV9xJ4Uu+UF7I=",
842
842
  "url": "index.html"
843
843
  },
844
844
  {
@@ -1,4 +1,4 @@
1
- /* Manifest version: Zf4S1may */
1
+ /* Manifest version: rJ2/x4YC */
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