@mindexec/cli 0.2.121 → 0.2.123
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/scripts/remote-fleet-render-smoke.mjs +107 -3
- package/server.js +119 -5
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-css3d-manager.js +31 -4
- package/wwwroot/_framework/{MindExecution.Shared.uwkrc41o75.dll → MindExecution.Shared.vki6dm13ef.dll} +0 -0
- package/wwwroot/_framework/blazor.boot.json +3 -3
- package/wwwroot/index.html +3 -3
- package/wwwroot/service-worker-assets.js +6 -6
- package/wwwroot/service-worker.js +1 -1
package/package.json
CHANGED
|
@@ -95,6 +95,10 @@ class MiniElement {
|
|
|
95
95
|
this.value = '';
|
|
96
96
|
this.checked = false;
|
|
97
97
|
this.disabled = false;
|
|
98
|
+
this.clientWidth = 320;
|
|
99
|
+
this.clientHeight = 180;
|
|
100
|
+
this.width = 0;
|
|
101
|
+
this.height = 0;
|
|
98
102
|
}
|
|
99
103
|
|
|
100
104
|
get textContent() {
|
|
@@ -182,6 +186,44 @@ class MiniElement {
|
|
|
182
186
|
return true;
|
|
183
187
|
}
|
|
184
188
|
|
|
189
|
+
getBoundingClientRect() {
|
|
190
|
+
return {
|
|
191
|
+
left: 0,
|
|
192
|
+
top: 0,
|
|
193
|
+
right: this.clientWidth,
|
|
194
|
+
bottom: this.clientHeight,
|
|
195
|
+
width: this.clientWidth,
|
|
196
|
+
height: this.clientHeight
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
getContext(type) {
|
|
201
|
+
if (this.tagName !== 'CANVAS' || String(type || '').toLowerCase() !== '2d') {
|
|
202
|
+
return null;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
if (this._canvasContext) {
|
|
206
|
+
return this._canvasContext;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
const owner = this.ownerDocument;
|
|
210
|
+
this._canvasContext = {
|
|
211
|
+
imageSmoothingEnabled: false,
|
|
212
|
+
imageSmoothingQuality: 'low',
|
|
213
|
+
fillStyle: '#000',
|
|
214
|
+
clearRect: (...args) => {
|
|
215
|
+
owner.canvasDrawCalls.push({ canvas: this, op: 'clearRect', args });
|
|
216
|
+
},
|
|
217
|
+
fillRect: (...args) => {
|
|
218
|
+
owner.canvasDrawCalls.push({ canvas: this, op: 'fillRect', args });
|
|
219
|
+
},
|
|
220
|
+
drawImage: (...args) => {
|
|
221
|
+
owner.canvasDrawCalls.push({ canvas: this, op: 'drawImage', args });
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
return this._canvasContext;
|
|
225
|
+
}
|
|
226
|
+
|
|
185
227
|
querySelector(selector) {
|
|
186
228
|
return this.querySelectorAll(selector)[0] || null;
|
|
187
229
|
}
|
|
@@ -225,6 +267,7 @@ class MiniDocument {
|
|
|
225
267
|
constructor() {
|
|
226
268
|
this.body = new MiniElement('body', this);
|
|
227
269
|
this.head = new MiniElement('head', this);
|
|
270
|
+
this.canvasDrawCalls = [];
|
|
228
271
|
}
|
|
229
272
|
|
|
230
273
|
createElement(tagName) {
|
|
@@ -373,6 +416,17 @@ async function loadCss3DManager() {
|
|
|
373
416
|
const managerPath = path.resolve(__dirname, '../../MindExecution.Shared/wwwroot/js/mind-map-css3d-manager.js');
|
|
374
417
|
const source = await fs.readFile(managerPath, 'utf8');
|
|
375
418
|
const document = new MiniDocument();
|
|
419
|
+
const objectUrlCalls = [];
|
|
420
|
+
const revokedObjectUrls = [];
|
|
421
|
+
const imageBitmapCalls = [];
|
|
422
|
+
class SmokeURL extends URL {}
|
|
423
|
+
SmokeURL.createObjectURL = blob => {
|
|
424
|
+
objectUrlCalls.push(blob);
|
|
425
|
+
return `blob:remote-fleet-smoke-${objectUrlCalls.length}`;
|
|
426
|
+
};
|
|
427
|
+
SmokeURL.revokeObjectURL = value => {
|
|
428
|
+
revokedObjectUrls.push(String(value || ''));
|
|
429
|
+
};
|
|
376
430
|
const context = {
|
|
377
431
|
console,
|
|
378
432
|
document,
|
|
@@ -397,15 +451,36 @@ async function loadCss3DManager() {
|
|
|
397
451
|
Map,
|
|
398
452
|
Set,
|
|
399
453
|
WeakMap,
|
|
454
|
+
Blob,
|
|
455
|
+
requestAnimationFrame: callback => setTimeout(() => callback(Date.now()), 0),
|
|
456
|
+
cancelAnimationFrame: id => clearTimeout(id),
|
|
457
|
+
createImageBitmap: async blob => {
|
|
458
|
+
imageBitmapCalls.push(blob);
|
|
459
|
+
return {
|
|
460
|
+
width: 64,
|
|
461
|
+
height: 36,
|
|
462
|
+
close() {
|
|
463
|
+
this.closed = true;
|
|
464
|
+
}
|
|
465
|
+
};
|
|
466
|
+
},
|
|
400
467
|
THREE: createThreeStub(),
|
|
401
|
-
URL,
|
|
468
|
+
URL: SmokeURL,
|
|
402
469
|
Promise
|
|
403
470
|
};
|
|
404
471
|
context.window = context;
|
|
405
472
|
context.self = context;
|
|
406
473
|
|
|
407
474
|
vm.runInNewContext(source, context, { filename: managerPath });
|
|
408
|
-
return {
|
|
475
|
+
return {
|
|
476
|
+
manager: context.window.MindMapCss3DManager,
|
|
477
|
+
document,
|
|
478
|
+
diagnostics: {
|
|
479
|
+
objectUrlCalls,
|
|
480
|
+
revokedObjectUrls,
|
|
481
|
+
imageBitmapCalls
|
|
482
|
+
}
|
|
483
|
+
};
|
|
409
484
|
}
|
|
410
485
|
|
|
411
486
|
function wait(ms = 0) {
|
|
@@ -646,7 +721,7 @@ try {
|
|
|
646
721
|
}
|
|
647
722
|
];
|
|
648
723
|
|
|
649
|
-
const { manager, document } = await loadCss3DManager();
|
|
724
|
+
const { manager, document, diagnostics } = await loadCss3DManager();
|
|
650
725
|
assert.equal(typeof manager?.renderRemoteFleetMonitorForTest, 'function');
|
|
651
726
|
assert.equal(typeof manager?.renderRemoteFleetDeviceForTest, 'function');
|
|
652
727
|
assert.equal(typeof manager?.applyRemoteFleetFramePatchesForTest, 'function');
|
|
@@ -765,6 +840,35 @@ try {
|
|
|
765
840
|
assert.ok(patchPreview.querySelector('canvas[data-remote-fleet-frame-canvas="true"]'));
|
|
766
841
|
assert.equal(patchPreview.querySelector('img[data-remote-fleet-frame-image="true"]')?.dataset.remoteFleetFrameUrl, patchUrl);
|
|
767
842
|
assert.equal(patchPreview.querySelector('[data-remote-fleet-frame-badge="true"]'), null);
|
|
843
|
+
|
|
844
|
+
const objectUrlCountBeforeBinary = diagnostics.objectUrlCalls.length;
|
|
845
|
+
const imageBitmapCountBeforeBinary = diagnostics.imageBitmapCalls.length;
|
|
846
|
+
const drawCountBeforeBinary = document.canvasDrawCalls.length;
|
|
847
|
+
const binaryPatchCount = manager.applyRemoteFleetFramePatchesForTest(bodyView, [{
|
|
848
|
+
deviceId: patchTarget.DeviceId,
|
|
849
|
+
kind: 'live',
|
|
850
|
+
frameSeq: 10000,
|
|
851
|
+
frameUrl: '',
|
|
852
|
+
streamId: 'render-smoke-binary-live',
|
|
853
|
+
contentHash: 'render-smoke-binary-live-10000',
|
|
854
|
+
receivedAt: new Date().toISOString(),
|
|
855
|
+
_remoteFleetPayloadBlob: new Blob([new Uint8Array([0xff, 0xd8, 0xff, 0xd9])], { type: 'image/jpeg' }),
|
|
856
|
+
_remoteFleetBinaryFrame: true
|
|
857
|
+
}]);
|
|
858
|
+
assert.equal(binaryPatchCount, 1);
|
|
859
|
+
await wait(20);
|
|
860
|
+
const binaryCanvas = patchPreview.querySelector('canvas[data-remote-fleet-frame-canvas="true"]');
|
|
861
|
+
const binaryImage = patchPreview.querySelector('img[data-remote-fleet-frame-image="true"]');
|
|
862
|
+
assert.equal(patchPreview.dataset.remoteFleetFrameKind, 'live');
|
|
863
|
+
assert.equal(patchPreview.dataset.remoteFleetFrameSeq, '10000');
|
|
864
|
+
assert.equal(binaryCanvas?.dataset.remoteFleetFrameSeq, '10000');
|
|
865
|
+
assert.equal(binaryCanvas?.style.display, 'block');
|
|
866
|
+
assert.equal(binaryImage?.style.display, 'none');
|
|
867
|
+
assert.equal(diagnostics.imageBitmapCalls.length, imageBitmapCountBeforeBinary + 1);
|
|
868
|
+
assert.equal(diagnostics.objectUrlCalls.length, objectUrlCountBeforeBinary);
|
|
869
|
+
assert.ok(
|
|
870
|
+
document.canvasDrawCalls.slice(drawCountBeforeBinary).some(call => call.op === 'drawImage'),
|
|
871
|
+
'expected binary Blob frame to draw directly to canvas');
|
|
768
872
|
const alternateDevice = devices.find(device =>
|
|
769
873
|
device.Connected === true
|
|
770
874
|
&& device.DeviceId !== focusedDevice.DeviceId);
|
package/server.js
CHANGED
|
@@ -2909,12 +2909,17 @@ const REMOTE_AGENT_DEFAULT_ENGINE = 'auto';
|
|
|
2909
2909
|
const REMOTE_AGENT_SYNC_REPORT_LOG_REPEAT_MS = 30000;
|
|
2910
2910
|
const REMOTE_AGENT_RACE_START_STAGGER_MS = 120;
|
|
2911
2911
|
const REMOTE_AGENT_MAX_PARALLEL_CANDIDATES = 6;
|
|
2912
|
+
const REMOTE_AGENT_RECENT_MANAGER_CACHE_TTL_MS = 30 * 24 * 60 * 60 * 1000;
|
|
2913
|
+
const REMOTE_AGENT_RECENT_MANAGER_CACHE_LIMIT = 64;
|
|
2914
|
+
const REMOTE_AGENT_RECENT_MANAGER_DEFAULT_KEY = 'default';
|
|
2912
2915
|
let remoteAgentState = createRemoteAgentIdleState();
|
|
2913
2916
|
let remoteAgentSyncReportState = null;
|
|
2914
2917
|
let remoteAgentSyncReportLogKey = '';
|
|
2915
2918
|
let remoteAgentSyncReportLogAt = 0;
|
|
2916
2919
|
let remoteAgentConnectPromise = null;
|
|
2917
2920
|
const remoteAgentRecentSuccessfulManagers = new Map();
|
|
2921
|
+
let remoteAgentRecentSuccessfulManagersLoaded = false;
|
|
2922
|
+
let remoteAgentRecentSuccessfulManagersSavePromise = null;
|
|
2918
2923
|
|
|
2919
2924
|
function createRemoteAgentIdleState(overrides = {}) {
|
|
2920
2925
|
return {
|
|
@@ -3216,7 +3221,104 @@ function createRemoteAgentConnectionKey(manager, leaseId) {
|
|
|
3216
3221
|
}
|
|
3217
3222
|
|
|
3218
3223
|
function getRemoteAgentRecentManagerKey(leaseId = '') {
|
|
3219
|
-
return safeRemoteAgentField(leaseId ||
|
|
3224
|
+
return safeRemoteAgentField(leaseId || REMOTE_AGENT_RECENT_MANAGER_DEFAULT_KEY, 128)
|
|
3225
|
+
|| REMOTE_AGENT_RECENT_MANAGER_DEFAULT_KEY;
|
|
3226
|
+
}
|
|
3227
|
+
|
|
3228
|
+
function getRemoteAgentRecentManagerCachePath() {
|
|
3229
|
+
return path.join(getDataRoot(workspacePath), 'cache', 'remote-agent-recent-managers.json');
|
|
3230
|
+
}
|
|
3231
|
+
|
|
3232
|
+
function normalizeRemoteAgentRecentManagerEntry(entry) {
|
|
3233
|
+
const endpoint = normalizeRemoteManagerEndpoint(entry?.endpoint);
|
|
3234
|
+
const updatedAt = Number(entry?.updatedAt || 0);
|
|
3235
|
+
if (!endpoint || !Number.isFinite(updatedAt) || updatedAt <= 0) {
|
|
3236
|
+
return null;
|
|
3237
|
+
}
|
|
3238
|
+
|
|
3239
|
+
const now = Date.now();
|
|
3240
|
+
if (now - updatedAt > REMOTE_AGENT_RECENT_MANAGER_CACHE_TTL_MS) {
|
|
3241
|
+
return null;
|
|
3242
|
+
}
|
|
3243
|
+
|
|
3244
|
+
return {
|
|
3245
|
+
endpoint,
|
|
3246
|
+
updatedAt
|
|
3247
|
+
};
|
|
3248
|
+
}
|
|
3249
|
+
|
|
3250
|
+
function loadRemoteAgentRecentSuccessfulManagers() {
|
|
3251
|
+
if (remoteAgentRecentSuccessfulManagersLoaded) {
|
|
3252
|
+
return;
|
|
3253
|
+
}
|
|
3254
|
+
|
|
3255
|
+
remoteAgentRecentSuccessfulManagersLoaded = true;
|
|
3256
|
+
const cachePath = getRemoteAgentRecentManagerCachePath();
|
|
3257
|
+
let payload = null;
|
|
3258
|
+
try {
|
|
3259
|
+
payload = JSON.parse(readFileSync(cachePath, 'utf8'));
|
|
3260
|
+
} catch (err) {
|
|
3261
|
+
if (err?.code !== 'ENOENT') {
|
|
3262
|
+
logWarn('remote', `managed RemoteAgent recent manager cache ignored: ${err?.message || err}`);
|
|
3263
|
+
}
|
|
3264
|
+
return;
|
|
3265
|
+
}
|
|
3266
|
+
|
|
3267
|
+
const rawEntries = Array.isArray(payload?.entries)
|
|
3268
|
+
? payload.entries
|
|
3269
|
+
: Object.entries(payload?.managers || {}).map(([key, value]) => ({ key, ...value }));
|
|
3270
|
+
let loaded = 0;
|
|
3271
|
+
for (const rawEntry of rawEntries) {
|
|
3272
|
+
if (loaded >= REMOTE_AGENT_RECENT_MANAGER_CACHE_LIMIT) {
|
|
3273
|
+
break;
|
|
3274
|
+
}
|
|
3275
|
+
|
|
3276
|
+
const key = getRemoteAgentRecentManagerKey(rawEntry?.key || rawEntry?.leaseId || '');
|
|
3277
|
+
const entry = normalizeRemoteAgentRecentManagerEntry(rawEntry);
|
|
3278
|
+
if (!entry) {
|
|
3279
|
+
continue;
|
|
3280
|
+
}
|
|
3281
|
+
|
|
3282
|
+
remoteAgentRecentSuccessfulManagers.set(key, entry);
|
|
3283
|
+
loaded += 1;
|
|
3284
|
+
}
|
|
3285
|
+
}
|
|
3286
|
+
|
|
3287
|
+
async function saveRemoteAgentRecentSuccessfulManagers() {
|
|
3288
|
+
const entries = Array.from(remoteAgentRecentSuccessfulManagers.entries())
|
|
3289
|
+
.map(([key, value]) => ({
|
|
3290
|
+
key,
|
|
3291
|
+
endpoint: normalizeRemoteManagerEndpoint(value?.endpoint),
|
|
3292
|
+
updatedAt: Number(value?.updatedAt || 0)
|
|
3293
|
+
}))
|
|
3294
|
+
.map(entry => ({
|
|
3295
|
+
...entry,
|
|
3296
|
+
normalized: normalizeRemoteAgentRecentManagerEntry(entry)
|
|
3297
|
+
}))
|
|
3298
|
+
.filter(entry => entry.normalized)
|
|
3299
|
+
.sort((left, right) => Number(right.updatedAt || 0) - Number(left.updatedAt || 0))
|
|
3300
|
+
.slice(0, REMOTE_AGENT_RECENT_MANAGER_CACHE_LIMIT)
|
|
3301
|
+
.map(entry => ({
|
|
3302
|
+
key: entry.key,
|
|
3303
|
+
endpoint: entry.normalized.endpoint,
|
|
3304
|
+
updatedAt: entry.normalized.updatedAt
|
|
3305
|
+
}));
|
|
3306
|
+
|
|
3307
|
+
const payload = {
|
|
3308
|
+
version: 1,
|
|
3309
|
+
savedAt: new Date().toISOString(),
|
|
3310
|
+
entries
|
|
3311
|
+
};
|
|
3312
|
+
await writeFileAtomically(getRemoteAgentRecentManagerCachePath(), JSON.stringify(payload, null, 2), 'utf8');
|
|
3313
|
+
}
|
|
3314
|
+
|
|
3315
|
+
function scheduleRemoteAgentRecentSuccessfulManagersSave() {
|
|
3316
|
+
remoteAgentRecentSuccessfulManagersSavePromise = Promise.resolve(remoteAgentRecentSuccessfulManagersSavePromise)
|
|
3317
|
+
.catch(() => null)
|
|
3318
|
+
.then(() => saveRemoteAgentRecentSuccessfulManagers())
|
|
3319
|
+
.catch(err => {
|
|
3320
|
+
logWarn('remote', `managed RemoteAgent recent manager cache save failed: ${err?.message || err}`);
|
|
3321
|
+
});
|
|
3220
3322
|
}
|
|
3221
3323
|
|
|
3222
3324
|
function rememberRemoteAgentSuccessfulManager(manager, leaseId = '') {
|
|
@@ -3225,10 +3327,14 @@ function rememberRemoteAgentSuccessfulManager(manager, leaseId = '') {
|
|
|
3225
3327
|
return;
|
|
3226
3328
|
}
|
|
3227
3329
|
|
|
3228
|
-
|
|
3330
|
+
loadRemoteAgentRecentSuccessfulManagers();
|
|
3331
|
+
const entry = {
|
|
3229
3332
|
endpoint,
|
|
3230
3333
|
updatedAt: Date.now()
|
|
3231
|
-
}
|
|
3334
|
+
};
|
|
3335
|
+
remoteAgentRecentSuccessfulManagers.set(getRemoteAgentRecentManagerKey(leaseId), entry);
|
|
3336
|
+
remoteAgentRecentSuccessfulManagers.set(REMOTE_AGENT_RECENT_MANAGER_DEFAULT_KEY, entry);
|
|
3337
|
+
scheduleRemoteAgentRecentSuccessfulManagersSave();
|
|
3232
3338
|
}
|
|
3233
3339
|
|
|
3234
3340
|
function prioritizeRemoteAgentManagers(managers, leaseId = '') {
|
|
@@ -3237,8 +3343,10 @@ function prioritizeRemoteAgentManagers(managers, leaseId = '') {
|
|
|
3237
3343
|
return normalized;
|
|
3238
3344
|
}
|
|
3239
3345
|
|
|
3240
|
-
|
|
3241
|
-
const
|
|
3346
|
+
loadRemoteAgentRecentSuccessfulManagers();
|
|
3347
|
+
const leaseRecent = remoteAgentRecentSuccessfulManagers.get(getRemoteAgentRecentManagerKey(leaseId));
|
|
3348
|
+
const defaultRecent = remoteAgentRecentSuccessfulManagers.get(REMOTE_AGENT_RECENT_MANAGER_DEFAULT_KEY);
|
|
3349
|
+
const recentEndpoint = normalizeRemoteManagerEndpoint(leaseRecent?.endpoint || defaultRecent?.endpoint);
|
|
3242
3350
|
if (!recentEndpoint) {
|
|
3243
3351
|
return normalized;
|
|
3244
3352
|
}
|
|
@@ -10333,6 +10441,12 @@ async function shutdownBridge(signal) {
|
|
|
10333
10441
|
// Ignore managed RemoteAgent close errors during shutdown
|
|
10334
10442
|
}
|
|
10335
10443
|
|
|
10444
|
+
try {
|
|
10445
|
+
await remoteAgentRecentSuccessfulManagersSavePromise;
|
|
10446
|
+
} catch {
|
|
10447
|
+
// Ignore recent-manager cache save errors during shutdown
|
|
10448
|
+
}
|
|
10449
|
+
|
|
10336
10450
|
try {
|
|
10337
10451
|
await remoteHub.close();
|
|
10338
10452
|
} catch {
|
|
@@ -13463,6 +13463,8 @@
|
|
|
13463
13463
|
const REMOTE_FLEET_THUMBNAIL_FRAME_DECODE_TIMEOUT_MS = 1200;
|
|
13464
13464
|
const REMOTE_FLEET_BINARY_FRAME_WS_RECONNECT_MS = 1500;
|
|
13465
13465
|
const REMOTE_FLEET_BINARY_FRAME_SUBSCRIBE_MS = 1000;
|
|
13466
|
+
const REMOTE_FLEET_BINARY_FRAME_STALE_FALLBACK_MS = 1400;
|
|
13467
|
+
const REMOTE_FLEET_BINARY_FRAME_CONNECT_GRACE_MS = 1600;
|
|
13466
13468
|
const REMOTE_FLEET_AUTO_LIVE_START_MAX_PARALLEL = 8;
|
|
13467
13469
|
const REMOTE_FLEET_AUTO_LIVE_START_COOLDOWN_MS = 3000;
|
|
13468
13470
|
const REMOTE_FLEET_TASK_FOLLOW_INITIAL_MS = 250;
|
|
@@ -13677,6 +13679,12 @@
|
|
|
13677
13679
|
return candidates;
|
|
13678
13680
|
}
|
|
13679
13681
|
|
|
13682
|
+
function getRemoteFleetFrameNow() {
|
|
13683
|
+
return typeof performance !== 'undefined' && typeof performance.now === 'function'
|
|
13684
|
+
? performance.now()
|
|
13685
|
+
: Date.now();
|
|
13686
|
+
}
|
|
13687
|
+
|
|
13680
13688
|
async function getRemoteFleetBridgeStatusForFrames() {
|
|
13681
13689
|
if (remoteFleetBridgeStatusPromise) {
|
|
13682
13690
|
return remoteFleetBridgeStatusPromise;
|
|
@@ -13863,9 +13871,11 @@
|
|
|
13863
13871
|
|
|
13864
13872
|
const ws = new WebSocket(wsUrl);
|
|
13865
13873
|
session.ws = ws;
|
|
13874
|
+
session.wsOpeningAt = getRemoteFleetFrameNow();
|
|
13866
13875
|
session.subscriptionKey = '';
|
|
13867
13876
|
ws.binaryType = 'arraybuffer';
|
|
13868
13877
|
ws.onopen = () => {
|
|
13878
|
+
session.wsOpenedAt = getRemoteFleetFrameNow();
|
|
13869
13879
|
window.RuntimeTrace?.emit?.('remote.frame.wsOpen', { nodeId: session.nodeId });
|
|
13870
13880
|
refreshRemoteFleetBinaryFrameSubscription(session, true);
|
|
13871
13881
|
if (!session.subscriptionTimer) {
|
|
@@ -13894,9 +13904,15 @@
|
|
|
13894
13904
|
}
|
|
13895
13905
|
|
|
13896
13906
|
let applied = 0;
|
|
13907
|
+
const frameAt = getRemoteFleetFrameNow();
|
|
13908
|
+
session.lastBinaryFrameAt = frameAt;
|
|
13897
13909
|
session.bodies.forEach(body => {
|
|
13898
13910
|
if (document.body.contains(body)) {
|
|
13899
|
-
|
|
13911
|
+
const bodyApplied = applyRemoteFleetFramePatches(body, [frame]);
|
|
13912
|
+
if (bodyApplied > 0) {
|
|
13913
|
+
body._remoteFleetLastBinaryFrameAt = frameAt;
|
|
13914
|
+
}
|
|
13915
|
+
applied += bodyApplied;
|
|
13900
13916
|
}
|
|
13901
13917
|
});
|
|
13902
13918
|
|
|
@@ -14998,9 +15014,20 @@
|
|
|
14998
15014
|
if (binarySocket
|
|
14999
15015
|
&& typeof WebSocket !== 'undefined'
|
|
15000
15016
|
&& (binarySocket.readyState === WebSocket.OPEN || binarySocket.readyState === WebSocket.CONNECTING)) {
|
|
15001
|
-
|
|
15002
|
-
|
|
15003
|
-
|
|
15017
|
+
const lastBinaryFrameAt = Number(bodyView._remoteFleetLastBinaryFrameAt || binarySession?.lastBinaryFrameAt || 0);
|
|
15018
|
+
const wsStartedAt = Number(binarySession?.wsOpenedAt || binarySession?.wsOpeningAt || 0);
|
|
15019
|
+
const hasRecentBinaryFrame =
|
|
15020
|
+
lastBinaryFrameAt > 0
|
|
15021
|
+
&& timestamp - lastBinaryFrameAt <= REMOTE_FLEET_BINARY_FRAME_STALE_FALLBACK_MS;
|
|
15022
|
+
const stillWithinConnectGrace =
|
|
15023
|
+
wsStartedAt > 0
|
|
15024
|
+
&& lastBinaryFrameAt <= 0
|
|
15025
|
+
&& timestamp - wsStartedAt <= REMOTE_FLEET_BINARY_FRAME_CONNECT_GRACE_MS;
|
|
15026
|
+
if (hasRecentBinaryFrame || stillWithinConnectGrace) {
|
|
15027
|
+
lastTick = timestamp;
|
|
15028
|
+
bodyView._remoteFleetFrameLoopRaf = requestRemoteFleetFrameLoopFrame(loop);
|
|
15029
|
+
return;
|
|
15030
|
+
}
|
|
15004
15031
|
}
|
|
15005
15032
|
|
|
15006
15033
|
if (timestamp - lastTick >= intervalMs && bodyView._remoteFleetFrameRefreshInFlight !== true) {
|
|
Binary file
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"mainAssemblyName": "MindExecution.Web",
|
|
3
3
|
"resources": {
|
|
4
|
-
"hash": "sha256-
|
|
4
|
+
"hash": "sha256-aGxH2r2LOpixHAksGBYXRcA86Dv8rGHPIhoagHBUV2M=",
|
|
5
5
|
"fingerprinting": {
|
|
6
6
|
"Google.Protobuf.9h59ukbel7.dll": "Google.Protobuf.dll",
|
|
7
7
|
"Markdig.d1j7v41cl1.dll": "Markdig.dll",
|
|
@@ -131,7 +131,7 @@
|
|
|
131
131
|
"MindExecution.Plugins.Directory.jc0g7fvyzv.dll": "MindExecution.Plugins.Directory.dll",
|
|
132
132
|
"MindExecution.Plugins.PlanMaster.2sugb66h95.dll": "MindExecution.Plugins.PlanMaster.dll",
|
|
133
133
|
"MindExecution.Plugins.YouTube.vy0nsbcoo4.dll": "MindExecution.Plugins.YouTube.dll",
|
|
134
|
-
"MindExecution.Shared.
|
|
134
|
+
"MindExecution.Shared.vki6dm13ef.dll": "MindExecution.Shared.dll",
|
|
135
135
|
"MindExecution.Web.994sb3nzuy.dll": "MindExecution.Web.dll",
|
|
136
136
|
"dotnet.js": "dotnet.js",
|
|
137
137
|
"dotnet.native.qc8g39g30v.js": "dotnet.native.js",
|
|
@@ -282,7 +282,7 @@
|
|
|
282
282
|
"MindExecution.Kernel.3zom09ir6j.dll": "sha256-78vR2SNkF9FwdQv0fEItSyz4HzgyzwGUROJAnpripPA=",
|
|
283
283
|
"MindExecution.Plugins.Concept.lxunwcdjgq.dll": "sha256-WVyvjaxW6UoGQvGW0icChLsXwYVCcdn0BLTftzlkCKc=",
|
|
284
284
|
"MindExecution.Plugins.PlanMaster.2sugb66h95.dll": "sha256-Lp0AieRHDo2H4Yl0Il1pPruy9nFUHJsX9t1AblXGD6Y=",
|
|
285
|
-
"MindExecution.Shared.
|
|
285
|
+
"MindExecution.Shared.vki6dm13ef.dll": "sha256-cUcgQfOJa1LaZuLSXdrmi1RrrueXoKuP49M/cjsbguU=",
|
|
286
286
|
"MindExecution.Web.994sb3nzuy.dll": "sha256-jQshtLmhEC4xenzdD9PqHjaCuKvJf/frzaKBi2weDAg="
|
|
287
287
|
},
|
|
288
288
|
"lazyAssembly": {
|
package/wwwroot/index.html
CHANGED
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
<title>MindExec | Run your ideas as AI task graphs</title>
|
|
8
8
|
<meta name="description" content="MindExec is an AI execution canvas for solo builders, researchers, developers, and creators. Start with free browser tools, then move serious work into saved MindCanvas projects." />
|
|
9
9
|
<base href="/" />
|
|
10
|
-
<link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260616-mdm-
|
|
11
|
-
<link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260616-mdm-
|
|
10
|
+
<link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260616-mdm-ws-watchdog-v577" />
|
|
11
|
+
<link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260616-mdm-ws-watchdog-v577" />
|
|
12
12
|
<!-- ?쇄뼹??Font Awesome (local) ?쇄뼹??-->
|
|
13
13
|
<link rel="stylesheet" href="_content/MindExecution.Shared/lib/font-awesome/css/all.min.css" />
|
|
14
14
|
<!-- ?꿎뼯??-->
|
|
@@ -579,7 +579,7 @@
|
|
|
579
579
|
}
|
|
580
580
|
|
|
581
581
|
const base = '_content/MindExecution.Shared/js/';
|
|
582
|
-
const scriptVersion = '20260616-mdm-
|
|
582
|
+
const scriptVersion = '20260616-mdm-ws-watchdog-v577';
|
|
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": "PVMqIJP0",
|
|
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-04ZcgwZFW2ICQSVXCeuy61QLIexXoiGLVAIR1UDv3UQ=",
|
|
90
90
|
"url": "_content/MindExecution.Shared/js/mind-map-css3d-manager.js"
|
|
91
91
|
},
|
|
92
92
|
{
|
|
@@ -442,8 +442,8 @@
|
|
|
442
442
|
"url": "_framework/MindExecution.Plugins.YouTube.vy0nsbcoo4.dll"
|
|
443
443
|
},
|
|
444
444
|
{
|
|
445
|
-
"hash": "sha256-
|
|
446
|
-
"url": "_framework/MindExecution.Shared.
|
|
445
|
+
"hash": "sha256-cUcgQfOJa1LaZuLSXdrmi1RrrueXoKuP49M/cjsbguU=",
|
|
446
|
+
"url": "_framework/MindExecution.Shared.vki6dm13ef.dll"
|
|
447
447
|
},
|
|
448
448
|
{
|
|
449
449
|
"hash": "sha256-jQshtLmhEC4xenzdD9PqHjaCuKvJf/frzaKBi2weDAg=",
|
|
@@ -770,7 +770,7 @@
|
|
|
770
770
|
"url": "_framework/Websocket.Client.vapounvmnl.dll"
|
|
771
771
|
},
|
|
772
772
|
{
|
|
773
|
-
"hash": "sha256-
|
|
773
|
+
"hash": "sha256-RIddmeeu4/GO5kDBZ6kmWUv1o1+x8NzfFxWruTBtPec=",
|
|
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-
|
|
837
|
+
"hash": "sha256-a13nNlTLpG4s9DEqkhUdxDJRAp9L+OnnPbRXafbvBCo=",
|
|
838
838
|
"url": "index.html"
|
|
839
839
|
},
|
|
840
840
|
{
|