@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.
- package/package.json +1 -1
- package/remote-hub.js +35 -4
- package/server.js +11 -2
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-css3d-manager.js +12 -8
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-remote-codecs.js +75 -2
- package/wwwroot/_framework/{MindExecution.Core.nxjlewduna.dll → MindExecution.Core.4moacskf64.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Kernel.vrfi63yg9f.dll → MindExecution.Kernel.pa251cfsz4.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Plugins.Admin.1rcwhdxl0r.dll → MindExecution.Plugins.Admin.dxyuwmxv1s.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Plugins.Business.rx0eieg51y.dll → MindExecution.Plugins.Business.7uj5erqhhn.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Plugins.Concept.zzczjzhvk1.dll → MindExecution.Plugins.Concept.108rmsxc96.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Plugins.Directory.bsorcntiwp.dll → MindExecution.Plugins.Directory.ccsy3g0fe5.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Plugins.PlanMaster.i5j9t4f1jf.dll → MindExecution.Plugins.PlanMaster.1vjpuoe9ff.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Plugins.YouTube.1mpn9satft.dll → MindExecution.Plugins.YouTube.q8ml98phj9.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Shared.mpi1gzau9b.dll → MindExecution.Shared.2pywq19zjy.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Web.nxykcyxd02.dll → MindExecution.Web.qucbls1wfr.dll} +0 -0
- package/wwwroot/_framework/blazor.boot.json +21 -21
- package/wwwroot/index.html +1 -1
- package/wwwroot/service-worker-assets.js +25 -25
- package/wwwroot/service-worker.js +1 -1
package/package.json
CHANGED
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
|
|
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(
|
|
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
|
|
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(
|
|
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 || '
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
17540
|
-
|
|
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: '
|
|
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
|
|
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
|
})();
|
package/wwwroot/_framework/{MindExecution.Core.nxjlewduna.dll → MindExecution.Core.4moacskf64.dll}
RENAMED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/wwwroot/_framework/{MindExecution.Web.nxykcyxd02.dll → MindExecution.Web.qucbls1wfr.dll}
RENAMED
|
Binary file
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"mainAssemblyName": "MindExecution.Web",
|
|
3
3
|
"resources": {
|
|
4
|
-
"hash": "sha256-
|
|
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.
|
|
126
|
-
"MindExecution.Kernel.
|
|
127
|
-
"MindExecution.Plugins.Admin.
|
|
128
|
-
"MindExecution.Plugins.Business.
|
|
129
|
-
"MindExecution.Plugins.Concept.
|
|
130
|
-
"MindExecution.Plugins.Directory.
|
|
131
|
-
"MindExecution.Plugins.PlanMaster.
|
|
132
|
-
"MindExecution.Plugins.YouTube.
|
|
133
|
-
"MindExecution.Shared.
|
|
134
|
-
"MindExecution.Web.
|
|
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.
|
|
280
|
-
"MindExecution.Kernel.
|
|
281
|
-
"MindExecution.Plugins.Business.
|
|
282
|
-
"MindExecution.Plugins.Concept.
|
|
283
|
-
"MindExecution.Plugins.PlanMaster.
|
|
284
|
-
"MindExecution.Shared.
|
|
285
|
-
"MindExecution.Web.
|
|
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.
|
|
289
|
-
"MindExecution.Plugins.Directory.
|
|
290
|
-
"MindExecution.Plugins.YouTube.
|
|
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,
|
package/wwwroot/index.html
CHANGED
|
@@ -579,7 +579,7 @@
|
|
|
579
579
|
}
|
|
580
580
|
|
|
581
581
|
const base = '_content/MindExecution.Shared/js/';
|
|
582
|
-
const scriptVersion = '20260717-livedesk-h264-
|
|
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": "
|
|
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-
|
|
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-
|
|
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-
|
|
426
|
-
"url": "_framework/MindExecution.Core.
|
|
425
|
+
"hash": "sha256-5OiBWkHcOvL4NsaHtQ7O3z5N1Ba7nTRi3xkehUMMgkE=",
|
|
426
|
+
"url": "_framework/MindExecution.Core.4moacskf64.dll"
|
|
427
427
|
},
|
|
428
428
|
{
|
|
429
|
-
"hash": "sha256-
|
|
430
|
-
"url": "_framework/MindExecution.Kernel.
|
|
429
|
+
"hash": "sha256-4dswyE6zmKAS+CnExpbXK871UMxIp+a7SPMIMwmZ+2Q=",
|
|
430
|
+
"url": "_framework/MindExecution.Kernel.pa251cfsz4.dll"
|
|
431
431
|
},
|
|
432
432
|
{
|
|
433
|
-
"hash": "sha256-
|
|
434
|
-
"url": "_framework/MindExecution.Plugins.Admin.
|
|
433
|
+
"hash": "sha256-URTQOP1nUuBC2leUgGdGWb+rc/1blCxbpbhRGE1MW/I=",
|
|
434
|
+
"url": "_framework/MindExecution.Plugins.Admin.dxyuwmxv1s.dll"
|
|
435
435
|
},
|
|
436
436
|
{
|
|
437
|
-
"hash": "sha256-
|
|
438
|
-
"url": "_framework/MindExecution.Plugins.Business.
|
|
437
|
+
"hash": "sha256-URKvk2etEOiEa/URXJpkYx7aJcPQd1Xs0Yxn3Uqg/ok=",
|
|
438
|
+
"url": "_framework/MindExecution.Plugins.Business.7uj5erqhhn.dll"
|
|
439
439
|
},
|
|
440
440
|
{
|
|
441
|
-
"hash": "sha256-
|
|
442
|
-
"url": "_framework/MindExecution.Plugins.Concept.
|
|
441
|
+
"hash": "sha256-QTd+zvSVcfwz3gYaKZ3pP0wgxrj9R1aP6qQKsByDRR0=",
|
|
442
|
+
"url": "_framework/MindExecution.Plugins.Concept.108rmsxc96.dll"
|
|
443
443
|
},
|
|
444
444
|
{
|
|
445
|
-
"hash": "sha256-
|
|
446
|
-
"url": "_framework/MindExecution.Plugins.Directory.
|
|
445
|
+
"hash": "sha256-BFk4mut2rsioBC9unD8+BoxnoJqTJlS5uZV7uXr8i5E=",
|
|
446
|
+
"url": "_framework/MindExecution.Plugins.Directory.ccsy3g0fe5.dll"
|
|
447
447
|
},
|
|
448
448
|
{
|
|
449
|
-
"hash": "sha256-
|
|
450
|
-
"url": "_framework/MindExecution.Plugins.PlanMaster.
|
|
449
|
+
"hash": "sha256-M3Fvm8WU5xbx24cTyACzH1IuZXuIY06dkeCfNCgeUT4=",
|
|
450
|
+
"url": "_framework/MindExecution.Plugins.PlanMaster.1vjpuoe9ff.dll"
|
|
451
451
|
},
|
|
452
452
|
{
|
|
453
|
-
"hash": "sha256-
|
|
454
|
-
"url": "_framework/MindExecution.Plugins.YouTube.
|
|
453
|
+
"hash": "sha256-2vzs6nizBsYO1JjXPxdSi6O7uyZLpqFblwE0q09mvfw=",
|
|
454
|
+
"url": "_framework/MindExecution.Plugins.YouTube.q8ml98phj9.dll"
|
|
455
455
|
},
|
|
456
456
|
{
|
|
457
|
-
"hash": "sha256-
|
|
458
|
-
"url": "_framework/MindExecution.Shared.
|
|
457
|
+
"hash": "sha256-Wjp+pPwb4TDj0YtYTzvNQGIzQI7xAg9DeyO0g/jxyxU=",
|
|
458
|
+
"url": "_framework/MindExecution.Shared.2pywq19zjy.dll"
|
|
459
459
|
},
|
|
460
460
|
{
|
|
461
|
-
"hash": "sha256-
|
|
462
|
-
"url": "_framework/MindExecution.Web.
|
|
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-
|
|
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-
|
|
841
|
+
"hash": "sha256-APqqcB+gM4o0ey/YKw0z/i3QKVnlJxEV9xJ4Uu+UF7I=",
|
|
842
842
|
"url": "index.html"
|
|
843
843
|
},
|
|
844
844
|
{
|