@mindexec/cli 0.2.478 → 0.2.479
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/README.md +323 -323
- package/codex-model-catalog.js +202 -202
- package/codex-runtime.js +1608 -1608
- package/desktop-workspace-state.cjs +120 -120
- package/electron/main.cjs +517 -517
- package/electron/preload.cjs +17 -17
- package/electron/recurring-update-owner-smoke.mjs +55 -55
- package/electron/recurring-update-owner.cjs +97 -97
- package/electron/source-smoke.mjs +108 -108
- package/electron/update-feed-resolver.cjs +79 -79
- package/electron/update-feed.json +10 -10
- package/electron/update-manager-smoke.mjs +146 -146
- package/electron/update-manager.cjs +297 -297
- package/electron/windows-package-smoke.mjs +156 -156
- package/launch-bridge.cjs +236 -236
- package/lzo1x.js +110 -110
- package/mode4-atlas-worker.js +440 -440
- package/mode4-atlas.js +130 -130
- package/package.json +1 -1
- package/port-guard.cjs +285 -285
- package/remote-fast/osx-arm64/MacScreenCaptureKitH264.swift +339 -339
- package/remote-fast/osx-arm64/MacSystemAudioCapture.swift +214 -214
- package/remote-fast/osx-arm64/UnixRawCaptureHelper.mjs +80 -80
- package/remote-fast/osx-arm64/livedesk-raw-capture-resampler.mjs +73 -73
- package/remote-fast/osx-arm64/mindexec-remote-fast.dll +0 -0
- package/remote-fast/osx-x64/MacScreenCaptureKitH264.swift +339 -339
- package/remote-fast/osx-x64/MacSystemAudioCapture.swift +214 -214
- package/remote-fast/osx-x64/UnixRawCaptureHelper.mjs +80 -80
- package/remote-fast/osx-x64/livedesk-raw-capture-resampler.mjs +73 -73
- package/remote-fast/osx-x64/mindexec-remote-fast.dll +0 -0
- package/remote-fast/win-x64/mindexec-remote-fast.dll +0 -0
- package/remote-hub.js +3698 -3698
- package/scripts/auth-session-smoke.mjs +262 -262
- package/scripts/board-render-ownership-smoke.mjs +85 -85
- package/scripts/codex-model-catalog-smoke.mjs +150 -150
- package/scripts/codex-runtime-home-smoke.mjs +58 -58
- package/scripts/codex-sdk-image-live-smoke.mjs +43 -43
- package/scripts/codex-sdk-image-runtime-smoke.mjs +122 -122
- package/scripts/codex-sdk-runtime-smoke.mjs +89 -89
- package/scripts/desktop-update-publisher-smoke.mjs +89 -89
- package/scripts/desktop-update-worker-smoke.mjs +72 -72
- package/scripts/desktop-workspace-state-smoke.mjs +81 -81
- package/scripts/drive-installed-update-smoke.mjs +67 -67
- package/scripts/npm-fresh-install-smoke.mjs +216 -216
- package/scripts/publish-mindexec-desktop-updates.mjs +224 -224
- package/scripts/remote-agent-managed-smoke.mjs +318 -318
- package/scripts/remote-agent-package-smoke.mjs +64 -64
- package/scripts/remote-agent-ws-smoke.mjs +269 -269
- package/scripts/remote-fast-live-rate-smoke.mjs +343 -343
- package/scripts/remote-fast-mdm-browser-smoke.mjs +453 -453
- package/scripts/remote-fleet-render-smoke.mjs +1350 -1350
- package/scripts/remote-frame-ws-smoke.mjs +234 -234
- package/scripts/remote-http-smoke.mjs +592 -592
- package/scripts/remote-hub-identity-smoke.mjs +146 -146
- package/scripts/remote-hub-scale-smoke.mjs +124 -124
- package/scripts/remote-hub-smoke.mjs +699 -699
- package/scripts/remote-input-ws-smoke.mjs +263 -263
- package/scripts/remote-registry-follower-smoke.mjs +815 -815
- package/scripts/setup-tree-sitter-grammars.mjs +59 -59
- package/server.js +7510 -7510
- package/start-bridge.bat +32 -32
- package/start-bridge.sh +81 -81
- package/tree-sitter-grammars/README.md +18 -0
- package/tree-sitter-grammars/tree-sitter-c_sharp.wasm +0 -0
- package/tree-sitter-grammars/tree-sitter-go.wasm +0 -0
- package/tree-sitter-grammars/tree-sitter-java.wasm +0 -0
- package/tree-sitter-grammars/tree-sitter-javascript.wasm +0 -0
- package/tree-sitter-grammars/tree-sitter-python.wasm +0 -0
- package/tree-sitter-grammars/tree-sitter-rust.wasm +0 -0
- package/tree-sitter-grammars/tree-sitter-tsx.wasm +0 -0
- package/tree-sitter-grammars/tree-sitter-typescript.wasm +0 -0
- package/wwwroot/_content/MindExecution.Plugins.Admin/css/admin-dashboard.css +546 -546
- package/wwwroot/_content/MindExecution.Plugins.Directory/background.png +0 -0
- package/wwwroot/_content/MindExecution.Plugins.YouTube/css/youtube-search.css +251 -251
- package/wwwroot/_content/MindExecution.Shared/css/mind-map-overrides.css +3789 -3789
- package/wwwroot/_content/MindExecution.Shared/fonts/NotoSansKR-Bold.ttf +0 -0
- package/wwwroot/_content/MindExecution.Shared/fonts/NotoSansKR-Regular.ttf +0 -0
- package/wwwroot/_content/MindExecution.Shared/js/agent-visualization.js +27 -27
- package/wwwroot/_content/MindExecution.Shared/js/background-themes.js +1449 -1449
- package/wwwroot/_content/MindExecution.Shared/js/code-master.js +8316 -8316
- package/wwwroot/_content/MindExecution.Shared/js/file-system-helper.js +338 -338
- package/wwwroot/_content/MindExecution.Shared/js/marked.min.js +69 -69
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-animated-image-preview.js +270 -270
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-automation-edge-motion.js +170 -170
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-board-render-ownership.js +81 -81
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-core.js +10506 -10506
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-core.js.backup +1059 -0
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-css3d-hotpath.js +902 -902
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-css3d-manager.js +24637 -24637
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-dev-guards.js +325 -325
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-dnd.js +1491 -1491
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-dnd.js.bak +434 -0
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-glow-shader.js +70 -70
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-image-policy.js +218 -218
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-interactions.js +7078 -7078
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-lod-plan-worker.js +160 -160
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-lod-renderer.js +9958 -9958
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-lod-video-placeholder.js +107 -107
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-logic-workers.js +1004 -1004
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-menu-manager.js +1351 -1351
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-multi-select.js +865 -865
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-node-search-worker.js +554 -554
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-nodes.js +4744 -4744
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-normal-boundary-optimizer.js +624 -624
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-object-manager.js +241 -241
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-object-manager.js.backup +372 -0
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-pipeline.js +2290 -2290
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-remote-codecs.js +202 -202
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-render-plan.js +1971 -1971
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-text-lod-system.js +93 -93
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-texture-factory.js +2391 -2391
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-texture-factory.js.backup +1258 -0
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-video-playback-controls.js +95 -95
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-visibility-worker.js +895 -895
- package/wwwroot/_content/MindExecution.Shared/js/mindmap-toolbar.js +636 -636
- package/wwwroot/_content/MindExecution.Shared/js/native-drop-handler.js +45 -45
- package/wwwroot/_content/MindExecution.Shared/js/plan-master.js +117 -117
- package/wwwroot/_content/MindExecution.Shared/js/renderers/CSS3DRenderer.js +114 -114
- package/wwwroot/_content/MindExecution.Shared/js/texture-worker-manager.js +10 -10
- package/wwwroot/_content/MindExecution.Shared/js/three.min.js +6 -6
- package/wwwroot/_content/MindExecution.Shared/js/token-manager.js +7 -7
- package/wwwroot/_content/MindExecution.Shared/js/troika-bundle.js +6 -6
- package/wwwroot/_content/MindExecution.Shared/js/troika-bundle.js.map +2 -2
- package/wwwroot/_content/MindExecution.Shared/lib/font-awesome/css/all.min.css +8 -8
- package/wwwroot/_content/MindExecution.Shared/models/vocab.txt +30522 -30522
- package/wwwroot/_framework/{Google.Protobuf.33g2gb5is0.dll → Google.Protobuf.9h59ukbel7.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Core.z100xo4mg0.dll → MindExecution.Core.xxsj2s456b.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Kernel.i9cldrx8yc.dll → MindExecution.Kernel.5jofnc0wrd.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Plugins.Admin.48lzqddb0a.dll → MindExecution.Plugins.Admin.t7m4jnqjg3.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Plugins.Business.7m8u1q142p.dll → MindExecution.Plugins.Business.6yjlhhavap.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Plugins.Concept.cl5wmr53od.dll → MindExecution.Plugins.Concept.iikqq5zxu0.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Plugins.Directory.slipi39041.dll → MindExecution.Plugins.Directory.c5ribyne4m.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Plugins.PlanMaster.qfge05l671.dll → MindExecution.Plugins.PlanMaster.365bbuifr9.dll} +0 -0
- package/wwwroot/_framework/{MindExecution.Plugins.YouTube.tn7v29ut77.dll → MindExecution.Plugins.YouTube.ax415cilpk.dll} +0 -0
- package/wwwroot/_framework/MindExecution.Shared.21e2nvf86u.dll +0 -0
- package/wwwroot/_framework/{MindExecution.Web.rwawrxxk38.dll → MindExecution.Web.ppgm8rey59.dll} +0 -0
- package/wwwroot/_framework/{System.Collections.23yxgetbju.dll → System.Collections.zyvbaq6mpd.dll} +0 -0
- package/wwwroot/_framework/blazor.boot.json +25 -25
- package/wwwroot/_headers +40 -40
- package/wwwroot/_redirects +1 -1
- package/wwwroot/index.html +772 -772
- package/wwwroot/js/marketing-tool.js +180 -180
- package/wwwroot/manifest.webmanifest +23 -23
- package/wwwroot/service-worker-assets.js +109 -81
- package/wwwroot/service-worker.js +33 -33
- package/wwwroot/_framework/MindExecution.Shared.rjqlf0umjn.dll +0 -0
package/launch-bridge.cjs
CHANGED
|
@@ -1,236 +1,236 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
const path = require('path');
|
|
4
|
-
const fs = require('fs');
|
|
5
|
-
const { spawn } = require('child_process');
|
|
6
|
-
const packageInfo = require('./package.json');
|
|
7
|
-
const { normalizePort, releaseBridgePort } = require('./port-guard.cjs');
|
|
8
|
-
|
|
9
|
-
const bridgeRoot = __dirname;
|
|
10
|
-
const serverPath = path.resolve(bridgeRoot, 'server.js');
|
|
11
|
-
const inheritedWorkspacePath = String(process.env.WORKSPACE_PATH || '').trim();
|
|
12
|
-
const rawArgs = process.argv.slice(2);
|
|
13
|
-
const parsedArgs = extractWorkspaceArg(rawArgs);
|
|
14
|
-
const cliArgs = parsedArgs.args;
|
|
15
|
-
const workspacePath = path.resolve(
|
|
16
|
-
parsedArgs.workspacePath || inheritedWorkspacePath || getDefaultWorkspacePath()
|
|
17
|
-
);
|
|
18
|
-
const appUrl = `http://localhost:${normalizePort(process.env.BRIDGE_PORT)}/mindcanvas`;
|
|
19
|
-
const statusUrl = `http://127.0.0.1:${normalizePort(process.env.BRIDGE_PORT)}/api/status`;
|
|
20
|
-
|
|
21
|
-
function isSamePath(left, right) {
|
|
22
|
-
return path.resolve(left).toLowerCase() === path.resolve(right).toLowerCase();
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
function pathExists(...segments) {
|
|
26
|
-
return fs.existsSync(path.join(...segments));
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
function looksLikeWorkspaceRoot(candidate) {
|
|
30
|
-
return pathExists(candidate, '.mindexec')
|
|
31
|
-
|| pathExists(candidate, 'MindExecution.Web')
|
|
32
|
-
|| pathExists(candidate, 'MindExecution.Shared')
|
|
33
|
-
|| pathExists(candidate, 'LocalBridge');
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
function getDefaultWorkspacePath() {
|
|
37
|
-
const cwd = process.cwd();
|
|
38
|
-
const bridgeParent = path.resolve(bridgeRoot, '..');
|
|
39
|
-
|
|
40
|
-
if (isSamePath(cwd, bridgeRoot) && looksLikeWorkspaceRoot(bridgeParent)) {
|
|
41
|
-
return bridgeParent;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
return cwd;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
function extractWorkspaceArg(args) {
|
|
48
|
-
const filteredArgs = [];
|
|
49
|
-
let workspacePath = '';
|
|
50
|
-
|
|
51
|
-
for (let index = 0; index < args.length; index += 1) {
|
|
52
|
-
const arg = args[index];
|
|
53
|
-
if (arg === '--workspace' || arg === '--workspace-path') {
|
|
54
|
-
workspacePath = String(args[index + 1] || '').trim();
|
|
55
|
-
if (!workspacePath) {
|
|
56
|
-
console.error(`[MindExec CLI] ${arg} requires a path.`);
|
|
57
|
-
process.exit(1);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
index += 1;
|
|
61
|
-
continue;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
if (arg.startsWith('--workspace=')) {
|
|
65
|
-
workspacePath = arg.slice('--workspace='.length).trim();
|
|
66
|
-
continue;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
if (arg.startsWith('--workspace-path=')) {
|
|
70
|
-
workspacePath = arg.slice('--workspace-path='.length).trim();
|
|
71
|
-
continue;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
filteredArgs.push(arg);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
return {
|
|
78
|
-
args: filteredArgs,
|
|
79
|
-
workspacePath
|
|
80
|
-
};
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
function printHelp() {
|
|
84
|
-
console.log(`MindExec CLI ${packageInfo.version}
|
|
85
|
-
|
|
86
|
-
Usage:
|
|
87
|
-
mindexec [start] [options] [node-options]
|
|
88
|
-
npx @mindexec/cli [options]
|
|
89
|
-
|
|
90
|
-
Runs the MindExec local app and bridge on http://localhost:5147/mindcanvas by default.
|
|
91
|
-
|
|
92
|
-
Options:
|
|
93
|
-
--workspace <path>
|
|
94
|
-
Workspace root. Defaults to the current directory for npx/global runs
|
|
95
|
-
--no-open Do not open the local app in the default browser
|
|
96
|
-
|
|
97
|
-
Environment:
|
|
98
|
-
BRIDGE_PORT Local bridge port. Default: 5147
|
|
99
|
-
WORKSPACE_PATH Workspace root. Overridden by --workspace when both are set
|
|
100
|
-
BRIDGE_TOKEN Fixed token for protected REST APIs
|
|
101
|
-
MINDEXEC_WEB_ROOT Published MindCanvas wwwroot override. Default: package wwwroot
|
|
102
|
-
MINDEXEC_NO_OPEN=1
|
|
103
|
-
Do not open the local app in the default browser
|
|
104
|
-
BRIDGE_SKIP_PORT_REAP=1
|
|
105
|
-
Do not stop an existing MindExec bridge on the same port
|
|
106
|
-
BRIDGE_FORCE_KILL_PORT_OWNER=1
|
|
107
|
-
Stop any process that owns BRIDGE_PORT before starting
|
|
108
|
-
|
|
109
|
-
Examples:
|
|
110
|
-
mindexec
|
|
111
|
-
mindexec --no-open
|
|
112
|
-
mindexec --workspace /path/to/work
|
|
113
|
-
npx @mindexec/cli --workspace /path/to/work
|
|
114
|
-
BRIDGE_PORT=8080 WORKSPACE_PATH=/path/to/work mindexec
|
|
115
|
-
mindexec --watch
|
|
116
|
-
`);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
if (cliArgs.includes('--help') || cliArgs.includes('-h')) {
|
|
120
|
-
printHelp();
|
|
121
|
-
process.exit(0);
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
if (cliArgs.includes('--version') || cliArgs.includes('-v')) {
|
|
125
|
-
console.log(packageInfo.version);
|
|
126
|
-
process.exit(0);
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
const command = cliArgs[0];
|
|
130
|
-
const commandArgs = command === 'start' || command === 'bridge'
|
|
131
|
-
? cliArgs.slice(1)
|
|
132
|
-
: cliArgs;
|
|
133
|
-
const shouldOpenApp = !commandArgs.some(arg => arg === '--no-open' || arg === '--no-browser')
|
|
134
|
-
&& !/^(1|true|yes|on)$/i.test(String(process.env.MINDEXEC_NO_OPEN || '').trim())
|
|
135
|
-
&& !/^(0|false|no|off)$/i.test(String(process.env.MINDEXEC_OPEN_APP || '').trim());
|
|
136
|
-
const runtimeArgs = commandArgs.filter(arg => arg !== '--no-open' && arg !== '--no-browser');
|
|
137
|
-
const childArgs = [...runtimeArgs, serverPath];
|
|
138
|
-
const port = normalizePort(process.env.BRIDGE_PORT);
|
|
139
|
-
|
|
140
|
-
function delay(ms) {
|
|
141
|
-
return new Promise(resolve => setTimeout(resolve, ms));
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
async function waitForBridgeReady(timeoutMs = 15000) {
|
|
145
|
-
const startedAt = Date.now();
|
|
146
|
-
while (Date.now() - startedAt < timeoutMs) {
|
|
147
|
-
try {
|
|
148
|
-
const response = await fetch(statusUrl, { cache: 'no-store' });
|
|
149
|
-
if (response.ok) {
|
|
150
|
-
return true;
|
|
151
|
-
}
|
|
152
|
-
} catch {
|
|
153
|
-
// Server is still booting.
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
await delay(300);
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
return false;
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
function openLocalApp() {
|
|
163
|
-
let child;
|
|
164
|
-
if (process.platform === 'win32') {
|
|
165
|
-
child = spawn('cmd', ['/c', 'start', '', appUrl], {
|
|
166
|
-
detached: true,
|
|
167
|
-
stdio: 'ignore',
|
|
168
|
-
windowsHide: true
|
|
169
|
-
});
|
|
170
|
-
} else if (process.platform === 'darwin') {
|
|
171
|
-
child = spawn('open', [appUrl], {
|
|
172
|
-
detached: true,
|
|
173
|
-
stdio: 'ignore'
|
|
174
|
-
});
|
|
175
|
-
} else {
|
|
176
|
-
child = spawn('xdg-open', [appUrl], {
|
|
177
|
-
detached: true,
|
|
178
|
-
stdio: 'ignore'
|
|
179
|
-
});
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
child.on('error', () => {
|
|
183
|
-
console.log(`[MindExec CLI] Open the app manually: ${appUrl}`);
|
|
184
|
-
});
|
|
185
|
-
child.unref();
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
async function main() {
|
|
189
|
-
await releaseBridgePort({
|
|
190
|
-
port,
|
|
191
|
-
bridgeRoot,
|
|
192
|
-
log: message => console.log(`[MindExec CLI] ${message}`)
|
|
193
|
-
});
|
|
194
|
-
|
|
195
|
-
const child = spawn(process.execPath, childArgs, {
|
|
196
|
-
cwd: bridgeRoot,
|
|
197
|
-
env: {
|
|
198
|
-
...process.env,
|
|
199
|
-
WORKSPACE_PATH: workspacePath
|
|
200
|
-
},
|
|
201
|
-
stdio: 'inherit',
|
|
202
|
-
windowsHide: false
|
|
203
|
-
});
|
|
204
|
-
|
|
205
|
-
child.on('exit', (code, signal) => {
|
|
206
|
-
if (signal) {
|
|
207
|
-
process.kill(process.pid, signal);
|
|
208
|
-
return;
|
|
209
|
-
}
|
|
210
|
-
|
|
211
|
-
process.exit(code ?? 0);
|
|
212
|
-
});
|
|
213
|
-
|
|
214
|
-
child.on('error', (error) => {
|
|
215
|
-
console.error('[MindExec CLI] Failed to start local bridge:', error);
|
|
216
|
-
process.exit(1);
|
|
217
|
-
});
|
|
218
|
-
|
|
219
|
-
if (shouldOpenApp) {
|
|
220
|
-
void (async () => {
|
|
221
|
-
const ready = await waitForBridgeReady();
|
|
222
|
-
if (!ready || child.exitCode !== null) {
|
|
223
|
-
console.log(`[MindExec CLI] Open the app manually: ${appUrl}`);
|
|
224
|
-
return;
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
console.log(`[MindExec CLI] opening ${appUrl}`);
|
|
228
|
-
openLocalApp();
|
|
229
|
-
})();
|
|
230
|
-
}
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
main().catch(error => {
|
|
234
|
-
console.error('[MindExec CLI] Failed to prepare local bridge port:', error.message || error);
|
|
235
|
-
process.exit(1);
|
|
236
|
-
});
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const path = require('path');
|
|
4
|
+
const fs = require('fs');
|
|
5
|
+
const { spawn } = require('child_process');
|
|
6
|
+
const packageInfo = require('./package.json');
|
|
7
|
+
const { normalizePort, releaseBridgePort } = require('./port-guard.cjs');
|
|
8
|
+
|
|
9
|
+
const bridgeRoot = __dirname;
|
|
10
|
+
const serverPath = path.resolve(bridgeRoot, 'server.js');
|
|
11
|
+
const inheritedWorkspacePath = String(process.env.WORKSPACE_PATH || '').trim();
|
|
12
|
+
const rawArgs = process.argv.slice(2);
|
|
13
|
+
const parsedArgs = extractWorkspaceArg(rawArgs);
|
|
14
|
+
const cliArgs = parsedArgs.args;
|
|
15
|
+
const workspacePath = path.resolve(
|
|
16
|
+
parsedArgs.workspacePath || inheritedWorkspacePath || getDefaultWorkspacePath()
|
|
17
|
+
);
|
|
18
|
+
const appUrl = `http://localhost:${normalizePort(process.env.BRIDGE_PORT)}/mindcanvas`;
|
|
19
|
+
const statusUrl = `http://127.0.0.1:${normalizePort(process.env.BRIDGE_PORT)}/api/status`;
|
|
20
|
+
|
|
21
|
+
function isSamePath(left, right) {
|
|
22
|
+
return path.resolve(left).toLowerCase() === path.resolve(right).toLowerCase();
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function pathExists(...segments) {
|
|
26
|
+
return fs.existsSync(path.join(...segments));
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function looksLikeWorkspaceRoot(candidate) {
|
|
30
|
+
return pathExists(candidate, '.mindexec')
|
|
31
|
+
|| pathExists(candidate, 'MindExecution.Web')
|
|
32
|
+
|| pathExists(candidate, 'MindExecution.Shared')
|
|
33
|
+
|| pathExists(candidate, 'LocalBridge');
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function getDefaultWorkspacePath() {
|
|
37
|
+
const cwd = process.cwd();
|
|
38
|
+
const bridgeParent = path.resolve(bridgeRoot, '..');
|
|
39
|
+
|
|
40
|
+
if (isSamePath(cwd, bridgeRoot) && looksLikeWorkspaceRoot(bridgeParent)) {
|
|
41
|
+
return bridgeParent;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return cwd;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function extractWorkspaceArg(args) {
|
|
48
|
+
const filteredArgs = [];
|
|
49
|
+
let workspacePath = '';
|
|
50
|
+
|
|
51
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
52
|
+
const arg = args[index];
|
|
53
|
+
if (arg === '--workspace' || arg === '--workspace-path') {
|
|
54
|
+
workspacePath = String(args[index + 1] || '').trim();
|
|
55
|
+
if (!workspacePath) {
|
|
56
|
+
console.error(`[MindExec CLI] ${arg} requires a path.`);
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
index += 1;
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (arg.startsWith('--workspace=')) {
|
|
65
|
+
workspacePath = arg.slice('--workspace='.length).trim();
|
|
66
|
+
continue;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
if (arg.startsWith('--workspace-path=')) {
|
|
70
|
+
workspacePath = arg.slice('--workspace-path='.length).trim();
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
filteredArgs.push(arg);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return {
|
|
78
|
+
args: filteredArgs,
|
|
79
|
+
workspacePath
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function printHelp() {
|
|
84
|
+
console.log(`MindExec CLI ${packageInfo.version}
|
|
85
|
+
|
|
86
|
+
Usage:
|
|
87
|
+
mindexec [start] [options] [node-options]
|
|
88
|
+
npx @mindexec/cli [options]
|
|
89
|
+
|
|
90
|
+
Runs the MindExec local app and bridge on http://localhost:5147/mindcanvas by default.
|
|
91
|
+
|
|
92
|
+
Options:
|
|
93
|
+
--workspace <path>
|
|
94
|
+
Workspace root. Defaults to the current directory for npx/global runs
|
|
95
|
+
--no-open Do not open the local app in the default browser
|
|
96
|
+
|
|
97
|
+
Environment:
|
|
98
|
+
BRIDGE_PORT Local bridge port. Default: 5147
|
|
99
|
+
WORKSPACE_PATH Workspace root. Overridden by --workspace when both are set
|
|
100
|
+
BRIDGE_TOKEN Fixed token for protected REST APIs
|
|
101
|
+
MINDEXEC_WEB_ROOT Published MindCanvas wwwroot override. Default: package wwwroot
|
|
102
|
+
MINDEXEC_NO_OPEN=1
|
|
103
|
+
Do not open the local app in the default browser
|
|
104
|
+
BRIDGE_SKIP_PORT_REAP=1
|
|
105
|
+
Do not stop an existing MindExec bridge on the same port
|
|
106
|
+
BRIDGE_FORCE_KILL_PORT_OWNER=1
|
|
107
|
+
Stop any process that owns BRIDGE_PORT before starting
|
|
108
|
+
|
|
109
|
+
Examples:
|
|
110
|
+
mindexec
|
|
111
|
+
mindexec --no-open
|
|
112
|
+
mindexec --workspace /path/to/work
|
|
113
|
+
npx @mindexec/cli --workspace /path/to/work
|
|
114
|
+
BRIDGE_PORT=8080 WORKSPACE_PATH=/path/to/work mindexec
|
|
115
|
+
mindexec --watch
|
|
116
|
+
`);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (cliArgs.includes('--help') || cliArgs.includes('-h')) {
|
|
120
|
+
printHelp();
|
|
121
|
+
process.exit(0);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
if (cliArgs.includes('--version') || cliArgs.includes('-v')) {
|
|
125
|
+
console.log(packageInfo.version);
|
|
126
|
+
process.exit(0);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const command = cliArgs[0];
|
|
130
|
+
const commandArgs = command === 'start' || command === 'bridge'
|
|
131
|
+
? cliArgs.slice(1)
|
|
132
|
+
: cliArgs;
|
|
133
|
+
const shouldOpenApp = !commandArgs.some(arg => arg === '--no-open' || arg === '--no-browser')
|
|
134
|
+
&& !/^(1|true|yes|on)$/i.test(String(process.env.MINDEXEC_NO_OPEN || '').trim())
|
|
135
|
+
&& !/^(0|false|no|off)$/i.test(String(process.env.MINDEXEC_OPEN_APP || '').trim());
|
|
136
|
+
const runtimeArgs = commandArgs.filter(arg => arg !== '--no-open' && arg !== '--no-browser');
|
|
137
|
+
const childArgs = [...runtimeArgs, serverPath];
|
|
138
|
+
const port = normalizePort(process.env.BRIDGE_PORT);
|
|
139
|
+
|
|
140
|
+
function delay(ms) {
|
|
141
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
async function waitForBridgeReady(timeoutMs = 15000) {
|
|
145
|
+
const startedAt = Date.now();
|
|
146
|
+
while (Date.now() - startedAt < timeoutMs) {
|
|
147
|
+
try {
|
|
148
|
+
const response = await fetch(statusUrl, { cache: 'no-store' });
|
|
149
|
+
if (response.ok) {
|
|
150
|
+
return true;
|
|
151
|
+
}
|
|
152
|
+
} catch {
|
|
153
|
+
// Server is still booting.
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
await delay(300);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return false;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
function openLocalApp() {
|
|
163
|
+
let child;
|
|
164
|
+
if (process.platform === 'win32') {
|
|
165
|
+
child = spawn('cmd', ['/c', 'start', '', appUrl], {
|
|
166
|
+
detached: true,
|
|
167
|
+
stdio: 'ignore',
|
|
168
|
+
windowsHide: true
|
|
169
|
+
});
|
|
170
|
+
} else if (process.platform === 'darwin') {
|
|
171
|
+
child = spawn('open', [appUrl], {
|
|
172
|
+
detached: true,
|
|
173
|
+
stdio: 'ignore'
|
|
174
|
+
});
|
|
175
|
+
} else {
|
|
176
|
+
child = spawn('xdg-open', [appUrl], {
|
|
177
|
+
detached: true,
|
|
178
|
+
stdio: 'ignore'
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
child.on('error', () => {
|
|
183
|
+
console.log(`[MindExec CLI] Open the app manually: ${appUrl}`);
|
|
184
|
+
});
|
|
185
|
+
child.unref();
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
async function main() {
|
|
189
|
+
await releaseBridgePort({
|
|
190
|
+
port,
|
|
191
|
+
bridgeRoot,
|
|
192
|
+
log: message => console.log(`[MindExec CLI] ${message}`)
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
const child = spawn(process.execPath, childArgs, {
|
|
196
|
+
cwd: bridgeRoot,
|
|
197
|
+
env: {
|
|
198
|
+
...process.env,
|
|
199
|
+
WORKSPACE_PATH: workspacePath
|
|
200
|
+
},
|
|
201
|
+
stdio: 'inherit',
|
|
202
|
+
windowsHide: false
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
child.on('exit', (code, signal) => {
|
|
206
|
+
if (signal) {
|
|
207
|
+
process.kill(process.pid, signal);
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
process.exit(code ?? 0);
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
child.on('error', (error) => {
|
|
215
|
+
console.error('[MindExec CLI] Failed to start local bridge:', error);
|
|
216
|
+
process.exit(1);
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
if (shouldOpenApp) {
|
|
220
|
+
void (async () => {
|
|
221
|
+
const ready = await waitForBridgeReady();
|
|
222
|
+
if (!ready || child.exitCode !== null) {
|
|
223
|
+
console.log(`[MindExec CLI] Open the app manually: ${appUrl}`);
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
console.log(`[MindExec CLI] opening ${appUrl}`);
|
|
228
|
+
openLocalApp();
|
|
229
|
+
})();
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
main().catch(error => {
|
|
234
|
+
console.error('[MindExec CLI] Failed to prepare local bridge port:', error.message || error);
|
|
235
|
+
process.exit(1);
|
|
236
|
+
});
|