myrlin-workbook 0.9.16 → 0.9.18
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/logs/server.pid +1 -1
- package/package.json +1 -1
- package/src/supervisor.js +49 -17
- package/src/web/public/app.js +3 -1
package/logs/server.pid
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
21156
|
package/package.json
CHANGED
package/src/supervisor.js
CHANGED
|
@@ -33,25 +33,57 @@ if (process.argv.includes('--daemon')) {
|
|
|
33
33
|
const logDir = path.join(__dirname, '..', 'logs');
|
|
34
34
|
if (!fs.existsSync(logDir)) fs.mkdirSync(logDir, { recursive: true });
|
|
35
35
|
const logFile = path.join(logDir, 'server.log');
|
|
36
|
-
const
|
|
37
|
-
const err = fs.openSync(logFile, 'a');
|
|
36
|
+
const pidFile = path.join(logDir, 'server.pid');
|
|
38
37
|
|
|
39
38
|
// Strip --daemon from args so the child runs in foreground (supervised) mode
|
|
40
39
|
const childArgs = process.argv.slice(2).filter(a => a !== '--daemon');
|
|
41
|
-
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
40
|
+
const nodeExe = process.execPath;
|
|
41
|
+
const scriptArgs = [__filename, ...childArgs].map(a => `"${a}"`).join(' ');
|
|
42
|
+
|
|
43
|
+
if (process.platform === 'win32') {
|
|
44
|
+
// On Windows, Node's detached:true still inherits the console session's
|
|
45
|
+
// Job Object. When the parent shell (Git Bash, cmd, Claude Code) exits,
|
|
46
|
+
// Windows kills the entire job group. Use cmd.exe /c start to create a
|
|
47
|
+
// process in a completely new console session, then redirect its output.
|
|
48
|
+
const { execSync } = require('child_process');
|
|
49
|
+
const cmd = `cmd.exe /c start /b "" "${nodeExe}" --max-old-space-size=1024 ${scriptArgs} >> "${logFile}" 2>&1`;
|
|
50
|
+
execSync(cmd, { stdio: 'ignore', windowsHide: true });
|
|
51
|
+
|
|
52
|
+
// The PID isn't directly available from start /b. Write a marker so we
|
|
53
|
+
// can find it via tasklist. Wait briefly for the process to appear.
|
|
54
|
+
setTimeout(() => {
|
|
55
|
+
try {
|
|
56
|
+
const { execSync: es } = require('child_process');
|
|
57
|
+
const psCmd = `powershell.exe -NoProfile -Command "Get-CimInstance Win32_Process | Where-Object { $_.CommandLine -like '*supervisor.js*' -and $_.CommandLine -notlike '*--daemon*' } | Select-Object -ExpandProperty ProcessId"`;
|
|
58
|
+
const out = es(psCmd, { encoding: 'utf8', timeout: 10000 });
|
|
59
|
+
const pids = out.trim().split('\n').map(l => l.trim()).filter(Boolean);
|
|
60
|
+
if (pids.length > 0) {
|
|
61
|
+
const pid = pids[pids.length - 1];
|
|
62
|
+
fs.writeFileSync(pidFile, pid, 'utf8');
|
|
63
|
+
console.log(`[supervisor] Daemonized server (PID ${pid}), logs at ${logFile}`);
|
|
64
|
+
} else {
|
|
65
|
+
console.log(`[supervisor] Daemonized server, logs at ${logFile}`);
|
|
66
|
+
}
|
|
67
|
+
} catch (_) {
|
|
68
|
+
console.log(`[supervisor] Daemonized server, logs at ${logFile}`);
|
|
69
|
+
}
|
|
70
|
+
process.exit(0);
|
|
71
|
+
}, 2000);
|
|
72
|
+
} else {
|
|
73
|
+
// Unix: standard detach with file descriptors
|
|
74
|
+
const out = fs.openSync(logFile, 'a');
|
|
75
|
+
const err = fs.openSync(logFile, 'a');
|
|
76
|
+
const child = spawn(nodeExe, ['--max-old-space-size=1024', __filename, ...childArgs], {
|
|
77
|
+
stdio: ['ignore', out, err],
|
|
78
|
+
detached: true,
|
|
79
|
+
env: { ...process.env },
|
|
80
|
+
});
|
|
81
|
+
fs.writeFileSync(pidFile, String(child.pid), 'utf8');
|
|
82
|
+
child.unref();
|
|
83
|
+
console.log(`[supervisor] Daemonized server (PID ${child.pid}), logs at ${logFile}`);
|
|
84
|
+
process.exit(0);
|
|
85
|
+
}
|
|
86
|
+
return; // Guard: don't fall through to supervisor logic while waiting
|
|
55
87
|
}
|
|
56
88
|
|
|
57
89
|
// ─── EPIPE Protection ────────────────────────────────────
|
|
@@ -83,7 +115,7 @@ function startChild() {
|
|
|
83
115
|
lastStartTime = Date.now();
|
|
84
116
|
console.log(`[supervisor] Starting GUI server (attempt ${consecutiveRestarts + 1})...`);
|
|
85
117
|
|
|
86
|
-
child = spawn(process.execPath, ['--max-old-space-size=
|
|
118
|
+
child = spawn(process.execPath, ['--max-old-space-size=1024', guiScript, ...guiArgs], {
|
|
87
119
|
stdio: 'inherit',
|
|
88
120
|
env: { ...process.env, CWM_NO_OPEN: consecutiveRestarts > 0 ? '1' : '' },
|
|
89
121
|
});
|
package/src/web/public/app.js
CHANGED
|
@@ -1822,7 +1822,9 @@ class CWMApp {
|
|
|
1822
1822
|
this.showApp();
|
|
1823
1823
|
this.initDragAndDrop();
|
|
1824
1824
|
this.initTerminalResize();
|
|
1825
|
-
|
|
1825
|
+
// Terminal group restore spawns PTY sessions and can be slow.
|
|
1826
|
+
// Run it in the background so login resolves immediately.
|
|
1827
|
+
this.initTerminalGroups().catch(e => console.error('Terminal groups init:', e));
|
|
1826
1828
|
this.initTerminalPaneSwipe();
|
|
1827
1829
|
this.initNotesEditor();
|
|
1828
1830
|
this.initAIInsights();
|