@mindexec/cli 0.2.58 → 0.2.60
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 +2 -2
- package/remote-hub.js +52 -0
- package/scripts/remote-http-smoke.mjs +13 -0
- package/scripts/remote-hub-smoke.mjs +19 -1
- package/server.js +4 -0
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-css3d-manager.js +548 -10
- package/wwwroot/_framework/MindExecution.Core.csfu1xtj3l.dll +0 -0
- package/wwwroot/_framework/{MindExecution.Kernel.cqcbagjpqb.dll → MindExecution.Kernel.mdo1lzjvvp.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Plugins.Admin.tsn0j478un.dll → MindExecution.Plugins.Admin.5fctwf65dx.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Plugins.Business.xg74dmn0vz.dll → MindExecution.Plugins.Business.nwivpk9djf.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Plugins.Concept.xyf0dtv4lr.dll → MindExecution.Plugins.Concept.308c7mlarq.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Plugins.Directory.9i4bd043ia.dll → MindExecution.Plugins.Directory.jnzcrwl049.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Plugins.PlanMaster.6awpgrbi0w.dll → MindExecution.Plugins.PlanMaster.aehonaq3ui.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Plugins.YouTube.phonjrgb40.dll → MindExecution.Plugins.YouTube.kfaju22v9d.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Shared.wv4gm07egs.dll → MindExecution.Shared.f6pcmyacv7.dll} +0 -0
- package/wwwroot/_framework/MindExecution.Web.md0zip1dt5.dll +0 -0
- package/wwwroot/_framework/blazor.boot.json +21 -21
- package/wwwroot/index.html +3 -3
- package/wwwroot/service-worker-assets.js +24 -24
- package/wwwroot/service-worker.js +1 -1
- package/wwwroot/_framework/MindExecution.Core.fu1rl67yt3.dll +0 -0
- package/wwwroot/_framework/MindExecution.Web.2qteyfmk41.dll +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mindexec/cli",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.60",
|
|
4
4
|
"description": "MindExec local runtime and bridge CLI",
|
|
5
5
|
"main": "server.js",
|
|
6
6
|
"type": "module",
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"node": ">=20"
|
|
47
47
|
},
|
|
48
48
|
"dependencies": {
|
|
49
|
-
"@mindexec/remote": "^0.1.
|
|
49
|
+
"@mindexec/remote": "^0.1.13",
|
|
50
50
|
"@openai/codex-sdk": "^0.137.0",
|
|
51
51
|
"chokidar": "^3.6.0",
|
|
52
52
|
"cors": "^2.8.5",
|
package/remote-hub.js
CHANGED
|
@@ -107,6 +107,29 @@ function normalizeApprovalLevel(value) {
|
|
|
107
107
|
return level === 'ai-assist' ? 'ai-assist' : 'task-only';
|
|
108
108
|
}
|
|
109
109
|
|
|
110
|
+
function normalizeRemoteInputEvent(value = {}) {
|
|
111
|
+
const input = value && typeof value === 'object' ? value : {};
|
|
112
|
+
const type = safeString(input.type || input.Type, 48);
|
|
113
|
+
const normalizedX = Number(input.normalizedX ?? input.NormalizedX);
|
|
114
|
+
const normalizedY = Number(input.normalizedY ?? input.NormalizedY);
|
|
115
|
+
const deltaX = Number(input.deltaX ?? input.DeltaX);
|
|
116
|
+
const deltaY = Number(input.deltaY ?? input.DeltaY);
|
|
117
|
+
return {
|
|
118
|
+
type,
|
|
119
|
+
normalizedX: Number.isFinite(normalizedX) ? Math.max(0, Math.min(1, normalizedX)) : undefined,
|
|
120
|
+
normalizedY: Number.isFinite(normalizedY) ? Math.max(0, Math.min(1, normalizedY)) : undefined,
|
|
121
|
+
button: safeString(input.button || input.Button, 24),
|
|
122
|
+
deltaX: Number.isFinite(deltaX) ? Math.max(-4096, Math.min(4096, deltaX)) : 0,
|
|
123
|
+
deltaY: Number.isFinite(deltaY) ? Math.max(-4096, Math.min(4096, deltaY)) : 0,
|
|
124
|
+
key: safeString(input.key || input.Key, 80),
|
|
125
|
+
code: safeString(input.code || input.Code, 80),
|
|
126
|
+
text: safeText(input.text || input.Text, 256),
|
|
127
|
+
repeat: input.repeat === true || input.Repeat === true,
|
|
128
|
+
controlLeaseId: safeString(input.controlLeaseId || input.ControlLeaseId, 128),
|
|
129
|
+
issuedAt: safeString(input.issuedAt || input.IssuedAt, 80)
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
|
|
110
133
|
function readCapabilityFlag(capabilities, key) {
|
|
111
134
|
const value = capabilities?.[key];
|
|
112
135
|
if (typeof value === 'boolean') {
|
|
@@ -1722,6 +1745,34 @@ export function createRemoteHub(options = {}) {
|
|
|
1722
1745
|
return { ok: true, commandId };
|
|
1723
1746
|
}
|
|
1724
1747
|
|
|
1748
|
+
function sendInputControl(deviceId, input = {}) {
|
|
1749
|
+
const device = devices.get(String(deviceId || ''));
|
|
1750
|
+
if (!device) {
|
|
1751
|
+
return { ok: false, error: 'device-not-found' };
|
|
1752
|
+
}
|
|
1753
|
+
|
|
1754
|
+
if (!device.connected) {
|
|
1755
|
+
return { ok: false, error: 'device-not-connected' };
|
|
1756
|
+
}
|
|
1757
|
+
|
|
1758
|
+
if (!readCapabilityFlag(device.capabilities, 'control')) {
|
|
1759
|
+
return { ok: false, error: 'device-input-control-unavailable' };
|
|
1760
|
+
}
|
|
1761
|
+
|
|
1762
|
+
const normalized = normalizeRemoteInputEvent(input);
|
|
1763
|
+
if (!normalized.type) {
|
|
1764
|
+
return { ok: false, error: 'missing-input-type' };
|
|
1765
|
+
}
|
|
1766
|
+
|
|
1767
|
+
return sendCommand(deviceId, {
|
|
1768
|
+
command: 'input.control',
|
|
1769
|
+
payload: {
|
|
1770
|
+
...normalized,
|
|
1771
|
+
issuedAt: normalized.issuedAt || new Date().toISOString()
|
|
1772
|
+
}
|
|
1773
|
+
});
|
|
1774
|
+
}
|
|
1775
|
+
|
|
1725
1776
|
function requestAgentTask(deviceId, options = {}) {
|
|
1726
1777
|
const device = devices.get(String(deviceId || ''));
|
|
1727
1778
|
if (!device) {
|
|
@@ -2131,6 +2182,7 @@ export function createRemoteHub(options = {}) {
|
|
|
2131
2182
|
listDeviceFrames,
|
|
2132
2183
|
disconnectDevice,
|
|
2133
2184
|
sendCommand,
|
|
2185
|
+
sendInputControl,
|
|
2134
2186
|
requestAgentTask,
|
|
2135
2187
|
requestAgentTaskBatch,
|
|
2136
2188
|
setHostTarget,
|
|
@@ -270,6 +270,19 @@ async function runSyntheticEnabledSmoke() {
|
|
|
270
270
|
assert.equal(devicesResult.payload?.devices?.length, SYNTHETIC_COUNT);
|
|
271
271
|
assert.equal(devicesResult.payload.devices.some(device => device.connected === false), true);
|
|
272
272
|
|
|
273
|
+
const noControlTarget = devicesResult.payload.devices.find(device => device.connected);
|
|
274
|
+
assert.ok(noControlTarget);
|
|
275
|
+
const inputUnavailable = await fetchJson(`${baseUrl}/api/remote/devices/${encodeURIComponent(noControlTarget.deviceId)}/input`, {
|
|
276
|
+
method: 'POST',
|
|
277
|
+
token: BRIDGE_TOKEN,
|
|
278
|
+
body: JSON.stringify({
|
|
279
|
+
type: 'noop'
|
|
280
|
+
})
|
|
281
|
+
});
|
|
282
|
+
assert.equal(inputUnavailable.ok, true, JSON.stringify(inputUnavailable.payload));
|
|
283
|
+
assert.equal(inputUnavailable.payload?.ok, false);
|
|
284
|
+
assert.equal(inputUnavailable.payload?.error, 'device-input-control-unavailable');
|
|
285
|
+
|
|
273
286
|
const connectedTargets = devicesResult.payload.devices
|
|
274
287
|
.filter(device => device.connected && device.capabilities?.taskDispatch)
|
|
275
288
|
.slice(0, 500)
|
|
@@ -73,7 +73,7 @@ try {
|
|
|
73
73
|
capabilities: {
|
|
74
74
|
status: true,
|
|
75
75
|
thumbnail: false,
|
|
76
|
-
control:
|
|
76
|
+
control: true,
|
|
77
77
|
liveStream: true,
|
|
78
78
|
computerAgent: true,
|
|
79
79
|
taskDispatch: true,
|
|
@@ -99,6 +99,24 @@ try {
|
|
|
99
99
|
assert.equal(devices[0].connected, true);
|
|
100
100
|
assert.equal(hub.getStatus().deviceCount, 1);
|
|
101
101
|
|
|
102
|
+
const inputCommand = hub.sendInputControl('smoke-device', {
|
|
103
|
+
type: 'noop'
|
|
104
|
+
});
|
|
105
|
+
assert.equal(inputCommand.ok, true);
|
|
106
|
+
writeJsonLine(socket, {
|
|
107
|
+
type: 'command.result',
|
|
108
|
+
commandId: inputCommand.commandId,
|
|
109
|
+
result: {
|
|
110
|
+
input: true,
|
|
111
|
+
handled: true
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
const inputDevice = await waitFor(() => {
|
|
115
|
+
const current = hub.listDevices();
|
|
116
|
+
return current[0]?.counters?.commandResultsReceived === 1 ? current[0] : null;
|
|
117
|
+
});
|
|
118
|
+
assert.equal(inputDevice.counters.commandsSent, 1);
|
|
119
|
+
|
|
102
120
|
const thumbnailCommand = hub.requestThumbnail('smoke-device', {
|
|
103
121
|
streamId: 'smoke-thumb',
|
|
104
122
|
maxWidth: 320,
|
package/server.js
CHANGED
|
@@ -7398,6 +7398,10 @@ app.post('/api/remote/devices/:deviceId/ping', (req, res) => {
|
|
|
7398
7398
|
}));
|
|
7399
7399
|
});
|
|
7400
7400
|
|
|
7401
|
+
app.post('/api/remote/devices/:deviceId/input', (req, res) => {
|
|
7402
|
+
res.json(remoteHub.sendInputControl(req.params.deviceId, req.body || {}));
|
|
7403
|
+
});
|
|
7404
|
+
|
|
7401
7405
|
app.post('/api/remote/devices/:deviceId/tasks', (req, res) => {
|
|
7402
7406
|
res.json(remoteHub.requestAgentTask(req.params.deviceId, {
|
|
7403
7407
|
instruction: req.body?.instruction,
|
|
@@ -12863,6 +12863,7 @@
|
|
|
12863
12863
|
const REMOTE_FLEET_HOST_LEASE_REFRESH_MS = 10000;
|
|
12864
12864
|
const remoteFleetHostLeaseTimers = new Map();
|
|
12865
12865
|
const remoteFleetLocalHostTargets = new Map();
|
|
12866
|
+
let activeRemoteFleetControlPopup = null;
|
|
12866
12867
|
|
|
12867
12868
|
function findRemoteFleetBodyByNodeId(nodeId) {
|
|
12868
12869
|
const id = String(nodeId || '').trim();
|
|
@@ -13233,7 +13234,7 @@
|
|
|
13233
13234
|
if (canvas.height !== nextHeight) {
|
|
13234
13235
|
canvas.height = nextHeight;
|
|
13235
13236
|
}
|
|
13236
|
-
return { width: nextWidth, height: nextHeight };
|
|
13237
|
+
return { width: nextWidth, height: nextHeight, cssWidth, cssHeight, dpr };
|
|
13237
13238
|
}
|
|
13238
13239
|
|
|
13239
13240
|
function getRemoteFleetBitmapSize(bitmap) {
|
|
@@ -13245,7 +13246,7 @@
|
|
|
13245
13246
|
};
|
|
13246
13247
|
}
|
|
13247
13248
|
|
|
13248
|
-
function drawRemoteFleetFrameToCanvas(canvas, bitmap) {
|
|
13249
|
+
function drawRemoteFleetFrameToCanvas(canvas, bitmap, fitMode = 'cover') {
|
|
13249
13250
|
if (!canvas || !bitmap) {
|
|
13250
13251
|
return false;
|
|
13251
13252
|
}
|
|
@@ -13272,18 +13273,40 @@
|
|
|
13272
13273
|
let sy = 0;
|
|
13273
13274
|
let sw = source.width;
|
|
13274
13275
|
let sh = source.height;
|
|
13275
|
-
|
|
13276
|
-
|
|
13277
|
-
|
|
13278
|
-
|
|
13279
|
-
|
|
13280
|
-
|
|
13276
|
+
let dx = 0;
|
|
13277
|
+
let dy = 0;
|
|
13278
|
+
let dw = size.width;
|
|
13279
|
+
let dh = size.height;
|
|
13280
|
+
if (fitMode === 'contain') {
|
|
13281
|
+
if (sourceAspect > targetAspect) {
|
|
13282
|
+
dh = size.width / sourceAspect;
|
|
13283
|
+
dy = (size.height - dh) / 2;
|
|
13284
|
+
} else if (sourceAspect < targetAspect) {
|
|
13285
|
+
dw = size.height * sourceAspect;
|
|
13286
|
+
dx = (size.width - dw) / 2;
|
|
13287
|
+
}
|
|
13288
|
+
} else {
|
|
13289
|
+
if (sourceAspect > targetAspect) {
|
|
13290
|
+
sw = source.height * targetAspect;
|
|
13291
|
+
sx = (source.width - sw) / 2;
|
|
13292
|
+
} else if (sourceAspect < targetAspect) {
|
|
13293
|
+
sh = source.width / targetAspect;
|
|
13294
|
+
sy = (source.height - sh) / 2;
|
|
13295
|
+
}
|
|
13281
13296
|
}
|
|
13282
13297
|
|
|
13283
13298
|
context.imageSmoothingEnabled = true;
|
|
13284
13299
|
context.imageSmoothingQuality = 'medium';
|
|
13300
|
+
context.fillStyle = '#020617';
|
|
13285
13301
|
context.clearRect(0, 0, size.width, size.height);
|
|
13286
|
-
context.
|
|
13302
|
+
context.fillRect(0, 0, size.width, size.height);
|
|
13303
|
+
context.drawImage(bitmap, sx, sy, sw, sh, dx, dy, dw, dh);
|
|
13304
|
+
canvas._remoteFleetContentRect = {
|
|
13305
|
+
left: dx / size.dpr,
|
|
13306
|
+
top: dy / size.dpr,
|
|
13307
|
+
width: dw / size.dpr,
|
|
13308
|
+
height: dh / size.dpr
|
|
13309
|
+
};
|
|
13287
13310
|
return true;
|
|
13288
13311
|
}
|
|
13289
13312
|
|
|
@@ -13696,6 +13719,503 @@
|
|
|
13696
13719
|
bodyView._remoteFleetFrameLoopRaf = requestRemoteFleetFrameLoopFrame(loop);
|
|
13697
13720
|
}
|
|
13698
13721
|
|
|
13722
|
+
function getRemoteFleetControlPoint(event, canvas, allowClamp = false) {
|
|
13723
|
+
if (!event || !canvas) {
|
|
13724
|
+
return null;
|
|
13725
|
+
}
|
|
13726
|
+
|
|
13727
|
+
const canvasRect = canvas.getBoundingClientRect?.();
|
|
13728
|
+
if (!canvasRect || canvasRect.width <= 0 || canvasRect.height <= 0) {
|
|
13729
|
+
return null;
|
|
13730
|
+
}
|
|
13731
|
+
|
|
13732
|
+
const content = canvas._remoteFleetContentRect || {
|
|
13733
|
+
left: 0,
|
|
13734
|
+
top: 0,
|
|
13735
|
+
width: canvasRect.width,
|
|
13736
|
+
height: canvasRect.height
|
|
13737
|
+
};
|
|
13738
|
+
if (!content.width || !content.height) {
|
|
13739
|
+
return null;
|
|
13740
|
+
}
|
|
13741
|
+
|
|
13742
|
+
let x = event.clientX - canvasRect.left - content.left;
|
|
13743
|
+
let y = event.clientY - canvasRect.top - content.top;
|
|
13744
|
+
const outside = x < 0 || y < 0 || x > content.width || y > content.height;
|
|
13745
|
+
if (outside && !allowClamp) {
|
|
13746
|
+
return null;
|
|
13747
|
+
}
|
|
13748
|
+
|
|
13749
|
+
x = Math.max(0, Math.min(content.width, x));
|
|
13750
|
+
y = Math.max(0, Math.min(content.height, y));
|
|
13751
|
+
return {
|
|
13752
|
+
normalizedX: x / content.width,
|
|
13753
|
+
normalizedY: y / content.height
|
|
13754
|
+
};
|
|
13755
|
+
}
|
|
13756
|
+
|
|
13757
|
+
function getRemoteFleetPointerButton(event) {
|
|
13758
|
+
switch (Number(event?.button ?? 0)) {
|
|
13759
|
+
case 1:
|
|
13760
|
+
return 'middle';
|
|
13761
|
+
case 2:
|
|
13762
|
+
return 'right';
|
|
13763
|
+
default:
|
|
13764
|
+
return 'left';
|
|
13765
|
+
}
|
|
13766
|
+
}
|
|
13767
|
+
|
|
13768
|
+
function closeRemoteFleetControlPopup(reason = 'close') {
|
|
13769
|
+
const session = activeRemoteFleetControlPopup;
|
|
13770
|
+
if (!session) {
|
|
13771
|
+
return;
|
|
13772
|
+
}
|
|
13773
|
+
|
|
13774
|
+
activeRemoteFleetControlPopup = null;
|
|
13775
|
+
session.active = false;
|
|
13776
|
+
if (session.timer) {
|
|
13777
|
+
clearTimeout(session.timer);
|
|
13778
|
+
session.timer = null;
|
|
13779
|
+
}
|
|
13780
|
+
if (session.moveTimer) {
|
|
13781
|
+
clearTimeout(session.moveTimer);
|
|
13782
|
+
session.moveTimer = null;
|
|
13783
|
+
}
|
|
13784
|
+
session.overlay?.remove?.();
|
|
13785
|
+
window.RuntimeTrace?.emit?.('remote.control.closed', {
|
|
13786
|
+
nodeId: session.nodeId,
|
|
13787
|
+
deviceId: session.deviceId,
|
|
13788
|
+
reason
|
|
13789
|
+
});
|
|
13790
|
+
|
|
13791
|
+
if (session.startedStream && !session.wasLiveActive) {
|
|
13792
|
+
invokeDotNetAsync('StopRemoteFleetLiveStreamFromJs', session.nodeId, session.deviceId, session.streamId || '')
|
|
13793
|
+
.catch(() => undefined);
|
|
13794
|
+
}
|
|
13795
|
+
}
|
|
13796
|
+
|
|
13797
|
+
async function paintRemoteFleetControlFrame(session, frame) {
|
|
13798
|
+
if (!session?.active || !frame || !isRemoteFleetFrameSource(frame.frameUrl)) {
|
|
13799
|
+
return false;
|
|
13800
|
+
}
|
|
13801
|
+
|
|
13802
|
+
try {
|
|
13803
|
+
const bitmap = await loadRemoteFleetFrameBitmap(frame);
|
|
13804
|
+
if (!bitmap || !session.active) {
|
|
13805
|
+
return false;
|
|
13806
|
+
}
|
|
13807
|
+
|
|
13808
|
+
requestRemoteFleetFrameLoopFrame(() => {
|
|
13809
|
+
if (!session.active || !document.body.contains(session.overlay)) {
|
|
13810
|
+
if (typeof bitmap.close === 'function') {
|
|
13811
|
+
bitmap.close();
|
|
13812
|
+
}
|
|
13813
|
+
return;
|
|
13814
|
+
}
|
|
13815
|
+
|
|
13816
|
+
drawRemoteFleetFrameToCanvas(session.canvas, bitmap, 'contain');
|
|
13817
|
+
session.canvas.style.display = 'block';
|
|
13818
|
+
if (typeof bitmap.close === 'function') {
|
|
13819
|
+
bitmap.close();
|
|
13820
|
+
}
|
|
13821
|
+
});
|
|
13822
|
+
return true;
|
|
13823
|
+
} catch {
|
|
13824
|
+
return false;
|
|
13825
|
+
}
|
|
13826
|
+
}
|
|
13827
|
+
|
|
13828
|
+
function sendRemoteFleetControlInput(session, payload, throttleMove = false) {
|
|
13829
|
+
if (!session?.active || !payload?.type) {
|
|
13830
|
+
return;
|
|
13831
|
+
}
|
|
13832
|
+
|
|
13833
|
+
const send = next => {
|
|
13834
|
+
if (!session.active) {
|
|
13835
|
+
return;
|
|
13836
|
+
}
|
|
13837
|
+
invokeDotNetAsync('SendRemoteFleetInputFromJs', session.nodeId, session.deviceId, {
|
|
13838
|
+
...next,
|
|
13839
|
+
controlLeaseId: session.controlLeaseId,
|
|
13840
|
+
issuedAt: new Date().toISOString()
|
|
13841
|
+
}).catch(error => {
|
|
13842
|
+
session.status.textContent = error?.message || 'Input failed';
|
|
13843
|
+
});
|
|
13844
|
+
};
|
|
13845
|
+
|
|
13846
|
+
if (!throttleMove) {
|
|
13847
|
+
send(payload);
|
|
13848
|
+
return;
|
|
13849
|
+
}
|
|
13850
|
+
|
|
13851
|
+
const now = performance.now();
|
|
13852
|
+
const elapsed = now - (session.lastMoveSentAt || 0);
|
|
13853
|
+
if (elapsed >= 32) {
|
|
13854
|
+
session.lastMoveSentAt = now;
|
|
13855
|
+
send(payload);
|
|
13856
|
+
return;
|
|
13857
|
+
}
|
|
13858
|
+
|
|
13859
|
+
session.pendingMove = payload;
|
|
13860
|
+
if (session.moveTimer) {
|
|
13861
|
+
return;
|
|
13862
|
+
}
|
|
13863
|
+
|
|
13864
|
+
session.moveTimer = setTimeout(() => {
|
|
13865
|
+
session.moveTimer = null;
|
|
13866
|
+
const next = session.pendingMove;
|
|
13867
|
+
session.pendingMove = null;
|
|
13868
|
+
if (next) {
|
|
13869
|
+
session.lastMoveSentAt = performance.now();
|
|
13870
|
+
send(next);
|
|
13871
|
+
}
|
|
13872
|
+
}, Math.max(1, 32 - elapsed));
|
|
13873
|
+
}
|
|
13874
|
+
|
|
13875
|
+
function bindRemoteFleetControlInput(session) {
|
|
13876
|
+
const { overlay, shell, stage, canvas } = session;
|
|
13877
|
+
let pointerActive = false;
|
|
13878
|
+
|
|
13879
|
+
['mousedown', 'mouseup', 'click', 'dblclick', 'keydown', 'keyup', 'wheel', 'contextmenu'].forEach(eventName => {
|
|
13880
|
+
overlay.addEventListener(eventName, event => event.stopPropagation(), true);
|
|
13881
|
+
});
|
|
13882
|
+
|
|
13883
|
+
stage.addEventListener('pointerdown', event => {
|
|
13884
|
+
const point = getRemoteFleetControlPoint(event, canvas, false);
|
|
13885
|
+
if (!point) {
|
|
13886
|
+
return;
|
|
13887
|
+
}
|
|
13888
|
+
|
|
13889
|
+
event.preventDefault();
|
|
13890
|
+
event.stopPropagation();
|
|
13891
|
+
pointerActive = true;
|
|
13892
|
+
shell.focus({ preventScroll: true });
|
|
13893
|
+
stage.setPointerCapture?.(event.pointerId);
|
|
13894
|
+
sendRemoteFleetControlInput(session, {
|
|
13895
|
+
type: 'pointerDown',
|
|
13896
|
+
...point,
|
|
13897
|
+
button: getRemoteFleetPointerButton(event)
|
|
13898
|
+
});
|
|
13899
|
+
});
|
|
13900
|
+
|
|
13901
|
+
stage.addEventListener('pointermove', event => {
|
|
13902
|
+
const point = getRemoteFleetControlPoint(event, canvas, pointerActive);
|
|
13903
|
+
if (!point) {
|
|
13904
|
+
return;
|
|
13905
|
+
}
|
|
13906
|
+
|
|
13907
|
+
event.preventDefault();
|
|
13908
|
+
event.stopPropagation();
|
|
13909
|
+
sendRemoteFleetControlInput(session, {
|
|
13910
|
+
type: 'pointerMove',
|
|
13911
|
+
...point,
|
|
13912
|
+
button: getRemoteFleetPointerButton(event)
|
|
13913
|
+
}, true);
|
|
13914
|
+
});
|
|
13915
|
+
|
|
13916
|
+
stage.addEventListener('pointerup', event => {
|
|
13917
|
+
const point = getRemoteFleetControlPoint(event, canvas, true);
|
|
13918
|
+
event.preventDefault();
|
|
13919
|
+
event.stopPropagation();
|
|
13920
|
+
pointerActive = false;
|
|
13921
|
+
stage.releasePointerCapture?.(event.pointerId);
|
|
13922
|
+
if (!point) {
|
|
13923
|
+
return;
|
|
13924
|
+
}
|
|
13925
|
+
|
|
13926
|
+
sendRemoteFleetControlInput(session, {
|
|
13927
|
+
type: 'pointerUp',
|
|
13928
|
+
...point,
|
|
13929
|
+
button: getRemoteFleetPointerButton(event)
|
|
13930
|
+
});
|
|
13931
|
+
});
|
|
13932
|
+
|
|
13933
|
+
stage.addEventListener('pointercancel', event => {
|
|
13934
|
+
pointerActive = false;
|
|
13935
|
+
stage.releasePointerCapture?.(event.pointerId);
|
|
13936
|
+
});
|
|
13937
|
+
|
|
13938
|
+
stage.addEventListener('wheel', event => {
|
|
13939
|
+
const point = getRemoteFleetControlPoint(event, canvas, false);
|
|
13940
|
+
if (!point) {
|
|
13941
|
+
return;
|
|
13942
|
+
}
|
|
13943
|
+
|
|
13944
|
+
event.preventDefault();
|
|
13945
|
+
event.stopPropagation();
|
|
13946
|
+
sendRemoteFleetControlInput(session, {
|
|
13947
|
+
type: 'wheel',
|
|
13948
|
+
...point,
|
|
13949
|
+
deltaX: event.deltaX,
|
|
13950
|
+
deltaY: event.deltaY
|
|
13951
|
+
});
|
|
13952
|
+
}, { passive: false });
|
|
13953
|
+
|
|
13954
|
+
stage.addEventListener('contextmenu', event => {
|
|
13955
|
+
event.preventDefault();
|
|
13956
|
+
event.stopPropagation();
|
|
13957
|
+
});
|
|
13958
|
+
|
|
13959
|
+
shell.addEventListener('keydown', event => {
|
|
13960
|
+
if (event.target?.closest?.('[data-remote-fleet-control-close="true"]')) {
|
|
13961
|
+
return;
|
|
13962
|
+
}
|
|
13963
|
+
|
|
13964
|
+
event.preventDefault();
|
|
13965
|
+
event.stopPropagation();
|
|
13966
|
+
sendRemoteFleetControlInput(session, {
|
|
13967
|
+
type: 'keyDown',
|
|
13968
|
+
key: event.key,
|
|
13969
|
+
code: event.code,
|
|
13970
|
+
repeat: event.repeat === true
|
|
13971
|
+
});
|
|
13972
|
+
});
|
|
13973
|
+
|
|
13974
|
+
shell.addEventListener('keyup', event => {
|
|
13975
|
+
if (event.target?.closest?.('[data-remote-fleet-control-close="true"]')) {
|
|
13976
|
+
return;
|
|
13977
|
+
}
|
|
13978
|
+
|
|
13979
|
+
event.preventDefault();
|
|
13980
|
+
event.stopPropagation();
|
|
13981
|
+
sendRemoteFleetControlInput(session, {
|
|
13982
|
+
type: 'keyUp',
|
|
13983
|
+
key: event.key,
|
|
13984
|
+
code: event.code,
|
|
13985
|
+
repeat: event.repeat === true
|
|
13986
|
+
});
|
|
13987
|
+
});
|
|
13988
|
+
}
|
|
13989
|
+
|
|
13990
|
+
function openRemoteFleetControlPopup(bodyView, nodeModel, deviceId) {
|
|
13991
|
+
const nodeId = String(nodeModel?.id ?? nodeModel?.Id ?? '').trim();
|
|
13992
|
+
const targetId = String(deviceId || '').trim();
|
|
13993
|
+
if (!bodyView || !nodeId || !targetId) {
|
|
13994
|
+
return;
|
|
13995
|
+
}
|
|
13996
|
+
|
|
13997
|
+
closeRemoteFleetControlPopup('replace');
|
|
13998
|
+
const devices = parseRemoteFleetDevices(nodeModel);
|
|
13999
|
+
const device = devices.find(item => getRemoteFleetDeviceId(item) === targetId) || null;
|
|
14000
|
+
const name = device ? getRemoteFleetDeviceName(device) : targetId;
|
|
14001
|
+
const wasLiveActive = device ? isRemoteFleetLiveActive(device) : false;
|
|
14002
|
+
|
|
14003
|
+
const overlay = document.createElement('div');
|
|
14004
|
+
overlay.dataset.remoteFleetControlPopup = 'true';
|
|
14005
|
+
overlay.style.cssText = `
|
|
14006
|
+
position: fixed;
|
|
14007
|
+
inset: 0;
|
|
14008
|
+
z-index: 2147483000;
|
|
14009
|
+
display: grid;
|
|
14010
|
+
place-items: center;
|
|
14011
|
+
padding: 24px;
|
|
14012
|
+
background: rgba(15, 23, 42, 0.24);
|
|
14013
|
+
pointer-events: auto;
|
|
14014
|
+
box-sizing: border-box;
|
|
14015
|
+
`;
|
|
14016
|
+
|
|
14017
|
+
const shell = document.createElement('section');
|
|
14018
|
+
shell.tabIndex = 0;
|
|
14019
|
+
shell.dataset.remoteFleetControlShell = 'true';
|
|
14020
|
+
shell.style.cssText = `
|
|
14021
|
+
width: min(96vw, 1280px);
|
|
14022
|
+
height: min(90vh, 860px);
|
|
14023
|
+
min-width: min(720px, calc(100vw - 28px));
|
|
14024
|
+
min-height: min(420px, calc(100vh - 28px));
|
|
14025
|
+
display: flex;
|
|
14026
|
+
flex-direction: column;
|
|
14027
|
+
overflow: hidden;
|
|
14028
|
+
border-radius: 8px;
|
|
14029
|
+
border: 1px solid rgba(148, 163, 184, 0.34);
|
|
14030
|
+
background: #020617;
|
|
14031
|
+
box-shadow: 0 24px 70px rgba(15, 23, 42, 0.35);
|
|
14032
|
+
outline: none;
|
|
14033
|
+
box-sizing: border-box;
|
|
14034
|
+
`;
|
|
14035
|
+
|
|
14036
|
+
const header = document.createElement('header');
|
|
14037
|
+
header.style.cssText = `
|
|
14038
|
+
flex: 0 0 auto;
|
|
14039
|
+
height: 42px;
|
|
14040
|
+
display: flex;
|
|
14041
|
+
align-items: center;
|
|
14042
|
+
justify-content: space-between;
|
|
14043
|
+
gap: 12px;
|
|
14044
|
+
padding: 0 10px 0 14px;
|
|
14045
|
+
background: rgba(15, 23, 42, 0.96);
|
|
14046
|
+
border-bottom: 1px solid rgba(148, 163, 184, 0.20);
|
|
14047
|
+
box-sizing: border-box;
|
|
14048
|
+
`;
|
|
14049
|
+
|
|
14050
|
+
const title = document.createElement('strong');
|
|
14051
|
+
title.textContent = name;
|
|
14052
|
+
title.title = `${name} (${targetId})`;
|
|
14053
|
+
title.style.cssText = `
|
|
14054
|
+
min-width: 0;
|
|
14055
|
+
color: #f8fafc;
|
|
14056
|
+
font-size: 13px;
|
|
14057
|
+
font-weight: 950;
|
|
14058
|
+
line-height: 1;
|
|
14059
|
+
letter-spacing: 0;
|
|
14060
|
+
overflow: hidden;
|
|
14061
|
+
text-overflow: ellipsis;
|
|
14062
|
+
white-space: nowrap;
|
|
14063
|
+
`;
|
|
14064
|
+
|
|
14065
|
+
const right = document.createElement('div');
|
|
14066
|
+
right.style.cssText = 'flex:0 0 auto;display:flex;align-items:center;gap:8px;min-width:0;';
|
|
14067
|
+
const status = document.createElement('span');
|
|
14068
|
+
status.dataset.remoteFleetControlStatus = 'true';
|
|
14069
|
+
status.textContent = 'Connecting';
|
|
14070
|
+
status.style.cssText = `
|
|
14071
|
+
color: #cbd5e1;
|
|
14072
|
+
font-size: 11px;
|
|
14073
|
+
font-weight: 850;
|
|
14074
|
+
letter-spacing: 0;
|
|
14075
|
+
white-space: nowrap;
|
|
14076
|
+
`;
|
|
14077
|
+
const closeButton = document.createElement('button');
|
|
14078
|
+
closeButton.type = 'button';
|
|
14079
|
+
closeButton.dataset.remoteFleetControlClose = 'true';
|
|
14080
|
+
closeButton.textContent = 'X';
|
|
14081
|
+
closeButton.title = 'Close';
|
|
14082
|
+
closeButton.style.cssText = `
|
|
14083
|
+
width: 30px;
|
|
14084
|
+
height: 30px;
|
|
14085
|
+
display: inline-flex;
|
|
14086
|
+
align-items: center;
|
|
14087
|
+
justify-content: center;
|
|
14088
|
+
border-radius: 7px;
|
|
14089
|
+
border: 1px solid rgba(148, 163, 184, 0.34);
|
|
14090
|
+
background: rgba(30, 41, 59, 0.96);
|
|
14091
|
+
color: #f8fafc;
|
|
14092
|
+
font-size: 13px;
|
|
14093
|
+
font-weight: 950;
|
|
14094
|
+
line-height: 1;
|
|
14095
|
+
cursor: pointer;
|
|
14096
|
+
pointer-events: auto;
|
|
14097
|
+
`;
|
|
14098
|
+
|
|
14099
|
+
const stage = document.createElement('div');
|
|
14100
|
+
stage.dataset.remoteFleetControlStage = 'true';
|
|
14101
|
+
stage.style.cssText = `
|
|
14102
|
+
position: relative;
|
|
14103
|
+
flex: 1 1 auto;
|
|
14104
|
+
min-height: 0;
|
|
14105
|
+
overflow: hidden;
|
|
14106
|
+
background: #020617;
|
|
14107
|
+
cursor: crosshair;
|
|
14108
|
+
touch-action: none;
|
|
14109
|
+
`;
|
|
14110
|
+
|
|
14111
|
+
const canvas = document.createElement('canvas');
|
|
14112
|
+
canvas.dataset.remoteFleetControlCanvas = 'true';
|
|
14113
|
+
canvas.style.cssText = `
|
|
14114
|
+
position: absolute;
|
|
14115
|
+
inset: 0;
|
|
14116
|
+
width: 100%;
|
|
14117
|
+
height: 100%;
|
|
14118
|
+
display: block;
|
|
14119
|
+
background: #020617;
|
|
14120
|
+
`;
|
|
14121
|
+
|
|
14122
|
+
right.appendChild(status);
|
|
14123
|
+
right.appendChild(closeButton);
|
|
14124
|
+
header.appendChild(title);
|
|
14125
|
+
header.appendChild(right);
|
|
14126
|
+
stage.appendChild(canvas);
|
|
14127
|
+
shell.appendChild(header);
|
|
14128
|
+
shell.appendChild(stage);
|
|
14129
|
+
overlay.appendChild(shell);
|
|
14130
|
+
document.body.appendChild(overlay);
|
|
14131
|
+
|
|
14132
|
+
const session = {
|
|
14133
|
+
active: true,
|
|
14134
|
+
nodeId,
|
|
14135
|
+
deviceId: targetId,
|
|
14136
|
+
overlay,
|
|
14137
|
+
shell,
|
|
14138
|
+
stage,
|
|
14139
|
+
canvas,
|
|
14140
|
+
status,
|
|
14141
|
+
wasLiveActive,
|
|
14142
|
+
startedStream: false,
|
|
14143
|
+
streamId: '',
|
|
14144
|
+
controlLeaseId: `control-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`,
|
|
14145
|
+
timer: null,
|
|
14146
|
+
moveTimer: null,
|
|
14147
|
+
pendingMove: null,
|
|
14148
|
+
lastMoveSentAt: 0
|
|
14149
|
+
};
|
|
14150
|
+
activeRemoteFleetControlPopup = session;
|
|
14151
|
+
bindRemoteFleetControlInput(session);
|
|
14152
|
+
|
|
14153
|
+
const refresh = async () => {
|
|
14154
|
+
if (!session.active) {
|
|
14155
|
+
return;
|
|
14156
|
+
}
|
|
14157
|
+
|
|
14158
|
+
try {
|
|
14159
|
+
const result = await invokeDotNetAsync('GetRemoteFleetFrameFromJs', nodeId, targetId, 'live');
|
|
14160
|
+
const frame = normalizeRemoteFleetFramePayload(result?.frame || result?.Frame, 'live');
|
|
14161
|
+
if (frame) {
|
|
14162
|
+
frame.deviceId = frame.deviceId || targetId;
|
|
14163
|
+
await paintRemoteFleetControlFrame(session, frame);
|
|
14164
|
+
applyRemoteFleetFramePatches(bodyView, [frame]);
|
|
14165
|
+
status.textContent = 'Control';
|
|
14166
|
+
} else if (result?.error || result?.Error) {
|
|
14167
|
+
status.textContent = result.error || result.Error;
|
|
14168
|
+
}
|
|
14169
|
+
} catch (error) {
|
|
14170
|
+
status.textContent = error?.message || 'Frame failed';
|
|
14171
|
+
} finally {
|
|
14172
|
+
if (session.active) {
|
|
14173
|
+
session.timer = setTimeout(refresh, REMOTE_FLEET_LIVE_FRAME_REFRESH_MS);
|
|
14174
|
+
}
|
|
14175
|
+
}
|
|
14176
|
+
};
|
|
14177
|
+
|
|
14178
|
+
closeButton.addEventListener('click', event => {
|
|
14179
|
+
event.preventDefault();
|
|
14180
|
+
event.stopPropagation();
|
|
14181
|
+
closeRemoteFleetControlPopup('button');
|
|
14182
|
+
});
|
|
14183
|
+
overlay.addEventListener('pointerdown', event => {
|
|
14184
|
+
if (event.target === overlay) {
|
|
14185
|
+
event.preventDefault();
|
|
14186
|
+
event.stopPropagation();
|
|
14187
|
+
shell.focus({ preventScroll: true });
|
|
14188
|
+
}
|
|
14189
|
+
});
|
|
14190
|
+
|
|
14191
|
+
shell.focus({ preventScroll: true });
|
|
14192
|
+
window.RuntimeTrace?.emit?.('remote.control.opened', {
|
|
14193
|
+
nodeId,
|
|
14194
|
+
deviceId: targetId
|
|
14195
|
+
});
|
|
14196
|
+
|
|
14197
|
+
invokeDotNetAsync('StartRemoteFleetLiveStreamFromJs', nodeId, targetId)
|
|
14198
|
+
.then(async result => {
|
|
14199
|
+
if (!session.active) {
|
|
14200
|
+
return;
|
|
14201
|
+
}
|
|
14202
|
+
|
|
14203
|
+
await syncRemoteFleetNodeStateFromResult(result);
|
|
14204
|
+
session.startedStream = result?.success === true || result?.Success === true;
|
|
14205
|
+
session.streamId = String(result?.streamId || result?.StreamId || '');
|
|
14206
|
+
status.textContent = session.startedStream ? 'Control' : (result?.error || result?.Error || 'View');
|
|
14207
|
+
refresh();
|
|
14208
|
+
})
|
|
14209
|
+
.catch(error => {
|
|
14210
|
+
if (!session.active) {
|
|
14211
|
+
return;
|
|
14212
|
+
}
|
|
14213
|
+
|
|
14214
|
+
status.textContent = error?.message || 'Start failed';
|
|
14215
|
+
refresh();
|
|
14216
|
+
});
|
|
14217
|
+
}
|
|
14218
|
+
|
|
13699
14219
|
function isRemoteFleetLiveActive(device) {
|
|
13700
14220
|
return getRemoteFleetDeviceField(device, 'liveStreamActive', 'LiveStreamActive', false) === true;
|
|
13701
14221
|
}
|
|
@@ -15155,7 +15675,15 @@
|
|
|
15155
15675
|
: 'Offline';
|
|
15156
15676
|
|
|
15157
15677
|
panel.dataset.deviceId = deviceId;
|
|
15158
|
-
|
|
15678
|
+
const detailPreview = createDevicePreview(device, 'detail');
|
|
15679
|
+
detailPreview.style.cursor = 'pointer';
|
|
15680
|
+
detailPreview.addEventListener('dblclick', event => {
|
|
15681
|
+
event.preventDefault();
|
|
15682
|
+
event.stopPropagation();
|
|
15683
|
+
bodyView.dataset.remoteFleetSelectedDeviceId = deviceId;
|
|
15684
|
+
openRemoteFleetControlPopup(bodyView, nodeModel, deviceId);
|
|
15685
|
+
});
|
|
15686
|
+
panel.appendChild(detailPreview);
|
|
15159
15687
|
|
|
15160
15688
|
const header = document.createElement('div');
|
|
15161
15689
|
header.style.cssText = 'display:flex;align-items:flex-start;justify-content:space-between;gap:8px;min-width:0;';
|
|
@@ -15712,6 +16240,14 @@
|
|
|
15712
16240
|
['mousedown', 'mouseup', 'dblclick'].forEach(eventName => {
|
|
15713
16241
|
card.addEventListener(eventName, event => event.stopPropagation());
|
|
15714
16242
|
});
|
|
16243
|
+
card.addEventListener('dblclick', event => {
|
|
16244
|
+
event.preventDefault();
|
|
16245
|
+
event.stopPropagation();
|
|
16246
|
+
const deviceId = String(card.dataset.deviceId || '').trim();
|
|
16247
|
+
if (!deviceId) return;
|
|
16248
|
+
bodyView.dataset.remoteFleetSelectedDeviceId = deviceId;
|
|
16249
|
+
openRemoteFleetControlPopup(bodyView, nodeModel, deviceId);
|
|
16250
|
+
});
|
|
15715
16251
|
const selectCard = event => {
|
|
15716
16252
|
event.preventDefault();
|
|
15717
16253
|
event.stopPropagation();
|
|
@@ -20057,6 +20593,8 @@
|
|
|
20057
20593
|
renderRemoteFleetMonitorForTest: renderRemoteFleetMonitor,
|
|
20058
20594
|
renderRemoteFleetDeviceForTest: renderRemoteFleetDevice,
|
|
20059
20595
|
applyRemoteFleetFramePatchesForTest: applyRemoteFleetFramePatches,
|
|
20596
|
+
openRemoteFleetControlPopupForTest: openRemoteFleetControlPopup,
|
|
20597
|
+
closeRemoteFleetControlPopupForTest: closeRemoteFleetControlPopup,
|
|
20060
20598
|
renderBusinessAutomationEdges: renderBusinessAutomationEdges,
|
|
20061
20599
|
scheduleBusinessAutomationEdgeRender: scheduleBusinessAutomationEdgeRender,
|
|
20062
20600
|
syncBusinessAutomationSelectionContext: syncBusinessAutomationSelectionContext,
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"mainAssemblyName": "MindExecution.Web",
|
|
3
3
|
"resources": {
|
|
4
|
-
"hash": "sha256-
|
|
4
|
+
"hash": "sha256-l0rUZQzwxawYMB769NYWezdvZX6nmiykgEkj3JAhG6I=",
|
|
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.brmz7yk5qh.dll": "System.dll",
|
|
124
124
|
"netstandard.yvr3prsx0x.dll": "netstandard.dll",
|
|
125
125
|
"System.Private.CoreLib.56o0tq2bfs.dll": "System.Private.CoreLib.dll",
|
|
126
|
-
"MindExecution.Core.
|
|
127
|
-
"MindExecution.Kernel.
|
|
128
|
-
"MindExecution.Plugins.Admin.
|
|
129
|
-
"MindExecution.Plugins.Business.
|
|
130
|
-
"MindExecution.Plugins.Concept.
|
|
131
|
-
"MindExecution.Plugins.Directory.
|
|
132
|
-
"MindExecution.Plugins.PlanMaster.
|
|
133
|
-
"MindExecution.Plugins.YouTube.
|
|
134
|
-
"MindExecution.Shared.
|
|
135
|
-
"MindExecution.Web.
|
|
126
|
+
"MindExecution.Core.csfu1xtj3l.dll": "MindExecution.Core.dll",
|
|
127
|
+
"MindExecution.Kernel.mdo1lzjvvp.dll": "MindExecution.Kernel.dll",
|
|
128
|
+
"MindExecution.Plugins.Admin.5fctwf65dx.dll": "MindExecution.Plugins.Admin.dll",
|
|
129
|
+
"MindExecution.Plugins.Business.nwivpk9djf.dll": "MindExecution.Plugins.Business.dll",
|
|
130
|
+
"MindExecution.Plugins.Concept.308c7mlarq.dll": "MindExecution.Plugins.Concept.dll",
|
|
131
|
+
"MindExecution.Plugins.Directory.jnzcrwl049.dll": "MindExecution.Plugins.Directory.dll",
|
|
132
|
+
"MindExecution.Plugins.PlanMaster.aehonaq3ui.dll": "MindExecution.Plugins.PlanMaster.dll",
|
|
133
|
+
"MindExecution.Plugins.YouTube.kfaju22v9d.dll": "MindExecution.Plugins.YouTube.dll",
|
|
134
|
+
"MindExecution.Shared.f6pcmyacv7.dll": "MindExecution.Shared.dll",
|
|
135
|
+
"MindExecution.Web.md0zip1dt5.dll": "MindExecution.Web.dll",
|
|
136
136
|
"dotnet.js": "dotnet.js",
|
|
137
137
|
"dotnet.native.qc8g39g30v.js": "dotnet.native.js",
|
|
138
138
|
"dotnet.native.boem75ye5i.wasm": "dotnet.native.wasm",
|
|
@@ -278,18 +278,18 @@
|
|
|
278
278
|
"System.Xml.XDocument.sn51jas17n.dll": "sha256-GNI2kFgFmPTwzuzwUn8gxK+AzGLUWRJFdg9JzIbrybQ=",
|
|
279
279
|
"System.brmz7yk5qh.dll": "sha256-CfM2miyj1KHApFmqMdLYWio3S/jrdON2pW9Xr2nTwlo=",
|
|
280
280
|
"netstandard.yvr3prsx0x.dll": "sha256-EksNn8Luo4bOWqJ6X7dIe9qG9oOqwOVzjH2xYyMNi+E=",
|
|
281
|
-
"MindExecution.Core.
|
|
282
|
-
"MindExecution.Kernel.
|
|
283
|
-
"MindExecution.Plugins.Concept.
|
|
284
|
-
"MindExecution.Plugins.PlanMaster.
|
|
285
|
-
"MindExecution.Shared.
|
|
286
|
-
"MindExecution.Web.
|
|
281
|
+
"MindExecution.Core.csfu1xtj3l.dll": "sha256-lP9GUQU4xFLsUU4IOwpUjt09mQO5M/bgLAAS8UnjLMs=",
|
|
282
|
+
"MindExecution.Kernel.mdo1lzjvvp.dll": "sha256-Vj21M+Th5MKfLG5Hvg6/uwlDDdwAJwzeIxfWsK9gYhM=",
|
|
283
|
+
"MindExecution.Plugins.Concept.308c7mlarq.dll": "sha256-ff0bbOHIEgPR3PxOrzh40D/UKFrSpfy82lAsDBVqm3A=",
|
|
284
|
+
"MindExecution.Plugins.PlanMaster.aehonaq3ui.dll": "sha256-Eq3h56Eo+hYMUyXzKrw99DBsuKUnubRt3AsEAPpbiqw=",
|
|
285
|
+
"MindExecution.Shared.f6pcmyacv7.dll": "sha256-d0jjV+LnnDo2ZKgByZD+UzDZXUVwHBeKi1Jl18yVarw=",
|
|
286
|
+
"MindExecution.Web.md0zip1dt5.dll": "sha256-qpKJIKiOZc48Iu2mkzaYuED5LUl8Gf9wL9diDRwie+Y="
|
|
287
287
|
},
|
|
288
288
|
"lazyAssembly": {
|
|
289
|
-
"MindExecution.Plugins.Admin.
|
|
290
|
-
"MindExecution.Plugins.Business.
|
|
291
|
-
"MindExecution.Plugins.Directory.
|
|
292
|
-
"MindExecution.Plugins.YouTube.
|
|
289
|
+
"MindExecution.Plugins.Admin.5fctwf65dx.dll": "sha256-37+Egd35menNv18hEZ64qjiu0x1r+wFOuO5zDiOGfug=",
|
|
290
|
+
"MindExecution.Plugins.Business.nwivpk9djf.dll": "sha256-iTV0NyCB7fnU+l8brClBd+KYnBDw628yHCwoRrQdTWE=",
|
|
291
|
+
"MindExecution.Plugins.Directory.jnzcrwl049.dll": "sha256-fwo2q8bt+WNuVUMnJCOcfLAy151cjLZCQa0Z+iKdsRs=",
|
|
292
|
+
"MindExecution.Plugins.YouTube.kfaju22v9d.dll": "sha256-cD63GnjmbdTK8M07roYgXEn4sq3PcyDFgZRJmJg0E2w="
|
|
293
293
|
}
|
|
294
294
|
},
|
|
295
295
|
"cacheBootResources": true,
|
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=20260614-remote-
|
|
11
|
-
<link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260614-remote-
|
|
10
|
+
<link rel="stylesheet" href="_content/MindExecution.Shared/css/app.css?v=20260614-remote-control-popup-v520" />
|
|
11
|
+
<link rel="stylesheet" href="_content/MindExecution.Shared/css/mind-map-overrides.css?v=20260614-remote-control-popup-v520" />
|
|
12
12
|
<!-- ?쇄뼹??Font Awesome (local) ?쇄뼹??-->
|
|
13
13
|
<link rel="stylesheet" href="_content/MindExecution.Shared/lib/font-awesome/css/all.min.css" />
|
|
14
14
|
<!-- ?꿎뼯??-->
|
|
@@ -558,7 +558,7 @@
|
|
|
558
558
|
}
|
|
559
559
|
|
|
560
560
|
const base = '_content/MindExecution.Shared/js/';
|
|
561
|
-
const scriptVersion = '20260614-remote-
|
|
561
|
+
const scriptVersion = '20260614-remote-control-popup-v520';
|
|
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": "
|
|
2
|
+
"version": "q4nQljvv",
|
|
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-Hpm8C+QVeeNTm2sl5AYRvBSgYwhltotJq8mBTm06u5s=",
|
|
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-
|
|
414
|
-
"url": "_framework/MindExecution.Core.
|
|
413
|
+
"hash": "sha256-lP9GUQU4xFLsUU4IOwpUjt09mQO5M/bgLAAS8UnjLMs=",
|
|
414
|
+
"url": "_framework/MindExecution.Core.csfu1xtj3l.dll"
|
|
415
415
|
},
|
|
416
416
|
{
|
|
417
|
-
"hash": "sha256-
|
|
418
|
-
"url": "_framework/MindExecution.Kernel.
|
|
417
|
+
"hash": "sha256-Vj21M+Th5MKfLG5Hvg6/uwlDDdwAJwzeIxfWsK9gYhM=",
|
|
418
|
+
"url": "_framework/MindExecution.Kernel.mdo1lzjvvp.dll"
|
|
419
419
|
},
|
|
420
420
|
{
|
|
421
|
-
"hash": "sha256-
|
|
422
|
-
"url": "_framework/MindExecution.Plugins.Admin.
|
|
421
|
+
"hash": "sha256-37+Egd35menNv18hEZ64qjiu0x1r+wFOuO5zDiOGfug=",
|
|
422
|
+
"url": "_framework/MindExecution.Plugins.Admin.5fctwf65dx.dll"
|
|
423
423
|
},
|
|
424
424
|
{
|
|
425
|
-
"hash": "sha256-
|
|
426
|
-
"url": "_framework/MindExecution.Plugins.Business.
|
|
425
|
+
"hash": "sha256-iTV0NyCB7fnU+l8brClBd+KYnBDw628yHCwoRrQdTWE=",
|
|
426
|
+
"url": "_framework/MindExecution.Plugins.Business.nwivpk9djf.dll"
|
|
427
427
|
},
|
|
428
428
|
{
|
|
429
|
-
"hash": "sha256-
|
|
430
|
-
"url": "_framework/MindExecution.Plugins.Concept.
|
|
429
|
+
"hash": "sha256-ff0bbOHIEgPR3PxOrzh40D/UKFrSpfy82lAsDBVqm3A=",
|
|
430
|
+
"url": "_framework/MindExecution.Plugins.Concept.308c7mlarq.dll"
|
|
431
431
|
},
|
|
432
432
|
{
|
|
433
|
-
"hash": "sha256-
|
|
434
|
-
"url": "_framework/MindExecution.Plugins.Directory.
|
|
433
|
+
"hash": "sha256-fwo2q8bt+WNuVUMnJCOcfLAy151cjLZCQa0Z+iKdsRs=",
|
|
434
|
+
"url": "_framework/MindExecution.Plugins.Directory.jnzcrwl049.dll"
|
|
435
435
|
},
|
|
436
436
|
{
|
|
437
|
-
"hash": "sha256-
|
|
438
|
-
"url": "_framework/MindExecution.Plugins.PlanMaster.
|
|
437
|
+
"hash": "sha256-Eq3h56Eo+hYMUyXzKrw99DBsuKUnubRt3AsEAPpbiqw=",
|
|
438
|
+
"url": "_framework/MindExecution.Plugins.PlanMaster.aehonaq3ui.dll"
|
|
439
439
|
},
|
|
440
440
|
{
|
|
441
|
-
"hash": "sha256-
|
|
442
|
-
"url": "_framework/MindExecution.Plugins.YouTube.
|
|
441
|
+
"hash": "sha256-cD63GnjmbdTK8M07roYgXEn4sq3PcyDFgZRJmJg0E2w=",
|
|
442
|
+
"url": "_framework/MindExecution.Plugins.YouTube.kfaju22v9d.dll"
|
|
443
443
|
},
|
|
444
444
|
{
|
|
445
|
-
"hash": "sha256-
|
|
446
|
-
"url": "_framework/MindExecution.Shared.
|
|
445
|
+
"hash": "sha256-d0jjV+LnnDo2ZKgByZD+UzDZXUVwHBeKi1Jl18yVarw=",
|
|
446
|
+
"url": "_framework/MindExecution.Shared.f6pcmyacv7.dll"
|
|
447
447
|
},
|
|
448
448
|
{
|
|
449
|
-
"hash": "sha256
|
|
450
|
-
"url": "_framework/MindExecution.Web.
|
|
449
|
+
"hash": "sha256-qpKJIKiOZc48Iu2mkzaYuED5LUl8Gf9wL9diDRwie+Y=",
|
|
450
|
+
"url": "_framework/MindExecution.Web.md0zip1dt5.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-
|
|
773
|
+
"hash": "sha256-CDOU2IS0GIaVy4XgMH6a58a/snr2MNiRrkgC6bDYh2c=",
|
|
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-YLUJP8pDrnICpJVJMu74xySAXab4MDvWn40Ox6fsNbg=",
|
|
838
838
|
"url": "index.html"
|
|
839
839
|
},
|
|
840
840
|
{
|
|
Binary file
|
|
Binary file
|