aicodeman 1.13.0 → 1.14.0
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 +26 -2
- package/dist/ai-checker-base.d.ts +2 -0
- package/dist/ai-checker-base.d.ts.map +1 -1
- package/dist/ai-checker-base.js +31 -3
- package/dist/ai-checker-base.js.map +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +142 -14
- package/dist/cli.js.map +1 -1
- package/dist/config/service-names.d.ts +23 -0
- package/dist/config/service-names.d.ts.map +1 -0
- package/dist/config/service-names.js +29 -0
- package/dist/config/service-names.js.map +1 -0
- package/dist/daemon-control.d.ts +126 -0
- package/dist/daemon-control.d.ts.map +1 -0
- package/dist/daemon-control.js +433 -0
- package/dist/daemon-control.js.map +1 -0
- package/dist/hooks-config.d.ts +28 -8
- package/dist/hooks-config.d.ts.map +1 -1
- package/dist/hooks-config.js +205 -29
- package/dist/hooks-config.js.map +1 -1
- package/dist/service-installer.d.ts +96 -0
- package/dist/service-installer.d.ts.map +1 -0
- package/dist/service-installer.js +333 -0
- package/dist/service-installer.js.map +1 -0
- package/dist/web/public/admin-ui.js.gz +0 -0
- package/dist/web/public/api-client.c9b1cddc.js.gz +0 -0
- package/dist/web/public/app.b24f795e.js.gz +0 -0
- package/dist/web/public/constants.e7175b95.js.gz +0 -0
- package/dist/web/public/cron-ui.js.gz +0 -0
- package/dist/web/public/entrance-animations.js.gz +0 -0
- package/dist/web/public/i18n.da34cfaf.js.gz +0 -0
- package/dist/web/public/image-input.ee16ad88.js.gz +0 -0
- package/dist/web/public/index.html +1 -1
- package/dist/web/public/index.html.br +0 -0
- package/dist/web/public/index.html.gz +0 -0
- package/dist/web/public/input-cjk.63794d0b.js.gz +0 -0
- package/dist/web/public/keyboard-accessory.9936227d.js.gz +0 -0
- package/dist/web/public/mobile-handlers.32fdd57f.js.gz +0 -0
- package/dist/web/public/mobile-overview.js.gz +0 -0
- package/dist/web/public/mobile.32cacde5.css.gz +0 -0
- package/dist/web/public/notification-manager.5d229063.js.gz +0 -0
- package/dist/web/public/orchestrator-panel.js.gz +0 -0
- package/dist/web/public/panels-ui.1d4203e0.js.gz +0 -0
- package/dist/web/public/ralph-panel.6de2d0f8.js.gz +0 -0
- package/dist/web/public/ralph-wizard.13a1831e.js.gz +0 -0
- package/dist/web/public/respawn-ui.ff0dae4c.js.gz +0 -0
- package/dist/web/public/sanitize-html.bc7078d6.js.gz +0 -0
- package/dist/web/public/session-ui.1356a4f4.js.gz +0 -0
- package/dist/web/public/settings-ui.ea63d5db.js.gz +0 -0
- package/dist/web/public/styles.b10e5edd.css.gz +0 -0
- package/dist/web/public/subagent-windows.4cc8b005.js.gz +0 -0
- package/dist/web/public/sw.js.gz +0 -0
- package/dist/web/public/{terminal-ui.78c71f3a.js → terminal-ui.d5ae6dcf.js} +2 -2
- package/dist/web/public/terminal-ui.d5ae6dcf.js.br +0 -0
- package/dist/web/public/terminal-ui.d5ae6dcf.js.gz +0 -0
- package/dist/web/public/ultracode-panel.js.gz +0 -0
- package/dist/web/public/ultracode-windows.js.gz +0 -0
- package/dist/web/public/upload.html.gz +0 -0
- package/dist/web/public/vendor/dompurify.min.js.gz +0 -0
- package/dist/web/public/vendor/marked.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-fit.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-serialize.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-unicode11.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-addon-webgl.min.js.gz +0 -0
- package/dist/web/public/vendor/xterm-zerolag-input.137ad9f0.js.gz +0 -0
- package/dist/web/public/vendor/xterm.css.gz +0 -0
- package/dist/web/public/vendor/xterm.min.js.gz +0 -0
- package/dist/web/public/voice-input.085e9e73.js.gz +0 -0
- package/dist/web/public/webview-tabs.js.gz +0 -0
- package/dist/web/self-update.d.ts.map +1 -1
- package/dist/web/self-update.js +4 -4
- package/dist/web/self-update.js.map +1 -1
- package/package.json +1 -1
- package/dist/web/public/terminal-ui.78c71f3a.js.br +0 -0
- package/dist/web/public/terminal-ui.78c71f3a.js.gz +0 -0
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview `codeman service install|uninstall|status`: write and load the
|
|
3
|
+
* systemd user unit (Linux) or LaunchAgent (macOS) that supervises `codeman web`.
|
|
4
|
+
*
|
|
5
|
+
* This is the "always running" half of issue #231, next to the "detached right
|
|
6
|
+
* now" half in daemon-control.ts. `install.sh` already does this for people who
|
|
7
|
+
* install with the one-liner; this exists for `npm i -g aicodeman` users, who
|
|
8
|
+
* otherwise have to hand-write a plist.
|
|
9
|
+
*
|
|
10
|
+
* Two details are load-bearing and easy to get wrong by hand:
|
|
11
|
+
*
|
|
12
|
+
* - **PATH.** launchd hands a job `/usr/bin:/bin:/usr/sbin:/sbin` and systemd's
|
|
13
|
+
* user manager is nearly as bare, so a Homebrew or nvm `node`, `tmux` or
|
|
14
|
+
* `claude` is simply not found and sessions fail in a way that reads as a
|
|
15
|
+
* Codeman bug. The unit therefore carries the PATH of the shell that ran the
|
|
16
|
+
* install, with the running node's own directory in front.
|
|
17
|
+
* - **The job name.** It is the one `install.sh` and the self-updater already use
|
|
18
|
+
* (config/service-names.ts), so re-running install.sh later updates this unit
|
|
19
|
+
* instead of supervising a second copy of the server.
|
|
20
|
+
*
|
|
21
|
+
* Secrets are deliberately NOT written here. `CODEMAN_PASSWORD` in the installing
|
|
22
|
+
* shell is not copied into the unit; the caller is told where to add it instead,
|
|
23
|
+
* because a unit file is long-lived, world-readable by default, and gets copied
|
|
24
|
+
* into bug reports.
|
|
25
|
+
*
|
|
26
|
+
* The file writers are pure string builders so they can be unit-tested without
|
|
27
|
+
* touching launchctl/systemctl.
|
|
28
|
+
*
|
|
29
|
+
* @module service-installer
|
|
30
|
+
*/
|
|
31
|
+
import { execFileSync } from 'node:child_process';
|
|
32
|
+
import { existsSync, mkdirSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
33
|
+
import { homedir, userInfo } from 'node:os';
|
|
34
|
+
import { dirname, join } from 'node:path';
|
|
35
|
+
import { LAUNCHD_LABEL, SYSTEMD_UNIT } from './config/service-names.js';
|
|
36
|
+
import { CODEMAN_INSTANCE } from './config/instance.js';
|
|
37
|
+
import { EXEC_TIMEOUT_MS } from './config/exec-timeout.js';
|
|
38
|
+
import { buildBaseUrl, buildStatusUrl, buildWebArgs, logFilePath, probeServer, } from './daemon-control.js';
|
|
39
|
+
/** Directories worth having on PATH even when the installing shell lacked them. */
|
|
40
|
+
const FALLBACK_PATH_DIRS = ['/opt/homebrew/bin', '/usr/local/bin', '/usr/bin', '/bin', '/usr/sbin', '/sbin'];
|
|
41
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
42
|
+
// Pure builders
|
|
43
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
44
|
+
/** XML text escaping for plist `<string>` values. */
|
|
45
|
+
export function xmlEscape(value) {
|
|
46
|
+
return value
|
|
47
|
+
.replace(/&/g, '&')
|
|
48
|
+
.replace(/</g, '<')
|
|
49
|
+
.replace(/>/g, '>')
|
|
50
|
+
.replace(/"/g, '"')
|
|
51
|
+
.replace(/'/g, ''');
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* PATH for the supervised process: the running node's directory first (so an nvm
|
|
55
|
+
* or Homebrew node is used rather than whatever the supervisor finds), then the
|
|
56
|
+
* installing shell's PATH, then the fallbacks that are still missing.
|
|
57
|
+
*
|
|
58
|
+
* `node_modules/.bin` entries are dropped. npm and npx inject those for the
|
|
59
|
+
* lifetime of one command, and baking a project's local bin dir into a unit file
|
|
60
|
+
* that outlives the checkout is how a service ends up running a binary the
|
|
61
|
+
* operator deleted months ago.
|
|
62
|
+
*/
|
|
63
|
+
export function buildServicePath(nodeDir, currentPath, home) {
|
|
64
|
+
const seen = new Set();
|
|
65
|
+
const ordered = [];
|
|
66
|
+
const push = (dir) => {
|
|
67
|
+
const trimmed = dir.trim();
|
|
68
|
+
if (!trimmed || seen.has(trimmed))
|
|
69
|
+
return;
|
|
70
|
+
if (/(^|\/)node_modules\/\.bin\/?$/.test(trimmed))
|
|
71
|
+
return;
|
|
72
|
+
seen.add(trimmed);
|
|
73
|
+
ordered.push(trimmed);
|
|
74
|
+
};
|
|
75
|
+
push(nodeDir);
|
|
76
|
+
for (const dir of currentPath.split(':'))
|
|
77
|
+
push(dir);
|
|
78
|
+
push(join(home, '.local', 'bin'));
|
|
79
|
+
for (const dir of FALLBACK_PATH_DIRS)
|
|
80
|
+
push(dir);
|
|
81
|
+
return ordered.join(':');
|
|
82
|
+
}
|
|
83
|
+
/** Environment written into the unit. Never includes secrets (see module docs). */
|
|
84
|
+
export function buildServiceEnv(nodeDir, currentPath, home, lang) {
|
|
85
|
+
const env = {
|
|
86
|
+
PATH: buildServicePath(nodeDir, currentPath, home),
|
|
87
|
+
HOME: home,
|
|
88
|
+
LANG: lang || 'en_US.UTF-8',
|
|
89
|
+
};
|
|
90
|
+
if (CODEMAN_INSTANCE)
|
|
91
|
+
env.CODEMAN_INSTANCE = CODEMAN_INSTANCE;
|
|
92
|
+
return env;
|
|
93
|
+
}
|
|
94
|
+
/** systemd accepts double-quoted values; escape the two characters that matter. */
|
|
95
|
+
export function systemdQuote(value) {
|
|
96
|
+
return `"${value.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`;
|
|
97
|
+
}
|
|
98
|
+
export function buildLaunchAgentPlist(plan) {
|
|
99
|
+
const programArguments = [plan.nodePath, ...plan.execArgv, plan.scriptPath, ...plan.args]
|
|
100
|
+
.map((arg) => ` <string>${xmlEscape(arg)}</string>`)
|
|
101
|
+
.join('\n');
|
|
102
|
+
const environment = Object.entries(plan.env)
|
|
103
|
+
.map(([key, value]) => ` <key>${xmlEscape(key)}</key>\n <string>${xmlEscape(value)}</string>`)
|
|
104
|
+
.join('\n');
|
|
105
|
+
return `<?xml version="1.0" encoding="UTF-8"?>
|
|
106
|
+
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
107
|
+
<plist version="1.0">
|
|
108
|
+
<dict>
|
|
109
|
+
<key>Label</key>
|
|
110
|
+
<string>${xmlEscape(plan.name)}</string>
|
|
111
|
+
<key>ProgramArguments</key>
|
|
112
|
+
<array>
|
|
113
|
+
${programArguments}
|
|
114
|
+
</array>
|
|
115
|
+
<key>EnvironmentVariables</key>
|
|
116
|
+
<dict>
|
|
117
|
+
${environment}
|
|
118
|
+
</dict>
|
|
119
|
+
<key>WorkingDirectory</key>
|
|
120
|
+
<string>${xmlEscape(plan.workingDir)}</string>
|
|
121
|
+
<key>RunAtLoad</key>
|
|
122
|
+
<true/>
|
|
123
|
+
<key>KeepAlive</key>
|
|
124
|
+
<true/>
|
|
125
|
+
<key>ThrottleInterval</key>
|
|
126
|
+
<integer>10</integer>
|
|
127
|
+
<key>StandardOutPath</key>
|
|
128
|
+
<string>${xmlEscape(plan.logPath)}</string>
|
|
129
|
+
<key>StandardErrorPath</key>
|
|
130
|
+
<string>${xmlEscape(plan.logPath)}</string>
|
|
131
|
+
</dict>
|
|
132
|
+
</plist>
|
|
133
|
+
`;
|
|
134
|
+
}
|
|
135
|
+
export function buildSystemdUnit(plan) {
|
|
136
|
+
const execStart = [plan.nodePath, ...plan.execArgv, plan.scriptPath, ...plan.args]
|
|
137
|
+
.map((arg) => (/[\s"'\\]/.test(arg) ? systemdQuote(arg) : arg))
|
|
138
|
+
.join(' ');
|
|
139
|
+
const environment = Object.entries(plan.env)
|
|
140
|
+
.map(([key, value]) => `Environment=${systemdQuote(`${key}=${value}`)}`)
|
|
141
|
+
.join('\n');
|
|
142
|
+
return `[Unit]
|
|
143
|
+
Description=Codeman Web Server
|
|
144
|
+
After=network.target
|
|
145
|
+
|
|
146
|
+
[Service]
|
|
147
|
+
Type=simple
|
|
148
|
+
WorkingDirectory=${plan.workingDir}
|
|
149
|
+
ExecStart=${execStart}
|
|
150
|
+
Restart=always
|
|
151
|
+
RestartSec=10
|
|
152
|
+
# Agents keep running in tmux when the server restarts, so only signal the
|
|
153
|
+
# server itself.
|
|
154
|
+
KillMode=process
|
|
155
|
+
${environment}
|
|
156
|
+
StandardOutput=journal
|
|
157
|
+
StandardError=journal
|
|
158
|
+
SyslogIdentifier=codeman
|
|
159
|
+
LimitNOFILE=65536
|
|
160
|
+
|
|
161
|
+
[Install]
|
|
162
|
+
WantedBy=default.target
|
|
163
|
+
`;
|
|
164
|
+
}
|
|
165
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
166
|
+
// Environment resolution
|
|
167
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
168
|
+
export function detectServiceKind() {
|
|
169
|
+
if (process.platform === 'darwin')
|
|
170
|
+
return 'launchd';
|
|
171
|
+
if (process.platform === 'linux')
|
|
172
|
+
return 'systemd';
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
export function unitPathFor(kind) {
|
|
176
|
+
return kind === 'launchd'
|
|
177
|
+
? join(homedir(), 'Library', 'LaunchAgents', `${LAUNCHD_LABEL}.plist`)
|
|
178
|
+
: join(homedir(), '.config', 'systemd', 'user', SYSTEMD_UNIT);
|
|
179
|
+
}
|
|
180
|
+
function entryScript() {
|
|
181
|
+
const script = process.argv[1];
|
|
182
|
+
if (!script)
|
|
183
|
+
throw new Error('cannot determine the codeman entry script to supervise');
|
|
184
|
+
return script;
|
|
185
|
+
}
|
|
186
|
+
/** Resolve a full plan from the current process and the requested web options. */
|
|
187
|
+
export function resolveServicePlan(kind, options) {
|
|
188
|
+
const home = homedir();
|
|
189
|
+
return {
|
|
190
|
+
kind,
|
|
191
|
+
name: kind === 'launchd' ? LAUNCHD_LABEL : SYSTEMD_UNIT,
|
|
192
|
+
nodePath: process.execPath,
|
|
193
|
+
execArgv: [...process.execArgv],
|
|
194
|
+
scriptPath: entryScript(),
|
|
195
|
+
args: buildWebArgs(options),
|
|
196
|
+
env: buildServiceEnv(dirname(process.execPath), process.env.PATH || '', home, process.env.LANG),
|
|
197
|
+
logPath: logFilePath(),
|
|
198
|
+
workingDir: home,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
function run(command, args) {
|
|
202
|
+
try {
|
|
203
|
+
const output = execFileSync(command, args, {
|
|
204
|
+
encoding: 'utf-8',
|
|
205
|
+
timeout: EXEC_TIMEOUT_MS,
|
|
206
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
207
|
+
});
|
|
208
|
+
return { ok: true, output: output.trim() };
|
|
209
|
+
}
|
|
210
|
+
catch (err) {
|
|
211
|
+
const e = err;
|
|
212
|
+
const stderr = typeof e.stderr === 'string' ? e.stderr : e.stderr?.toString('utf-8');
|
|
213
|
+
return { ok: false, output: (stderr || e.message || '').trim() };
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
217
|
+
// Install / uninstall / status
|
|
218
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
219
|
+
/**
|
|
220
|
+
* Write the unit, load it, and confirm the server actually answers before
|
|
221
|
+
* reporting success. `launchctl load` and `systemctl enable` are both quiet about
|
|
222
|
+
* a job that starts and immediately dies, which is the whole reason install.sh
|
|
223
|
+
* verifies too.
|
|
224
|
+
*/
|
|
225
|
+
export async function installService(options) {
|
|
226
|
+
const kind = detectServiceKind();
|
|
227
|
+
if (!kind) {
|
|
228
|
+
return { ok: false, message: `no supported supervisor on ${process.platform}; use \`codeman web -d\` instead` };
|
|
229
|
+
}
|
|
230
|
+
const plan = resolveServicePlan(kind, options);
|
|
231
|
+
const unitPath = unitPathFor(kind);
|
|
232
|
+
const warnings = [];
|
|
233
|
+
mkdirSync(dirname(unitPath), { recursive: true });
|
|
234
|
+
if (kind === 'launchd') {
|
|
235
|
+
const uid = process.getuid?.() ?? 0;
|
|
236
|
+
// Unload any previous copy first, otherwise bootstrap fails with "service
|
|
237
|
+
// already loaded" and leaves the OLD job running against the NEW file.
|
|
238
|
+
run('launchctl', ['bootout', `gui/${uid}/${LAUNCHD_LABEL}`]);
|
|
239
|
+
writeFileSync(unitPath, buildLaunchAgentPlist(plan), { encoding: 'utf-8', mode: 0o600 });
|
|
240
|
+
const bootstrap = run('launchctl', ['bootstrap', `gui/${uid}`, unitPath]);
|
|
241
|
+
if (!bootstrap.ok) {
|
|
242
|
+
const legacy = run('launchctl', ['load', unitPath]);
|
|
243
|
+
if (!legacy.ok) {
|
|
244
|
+
return {
|
|
245
|
+
ok: false,
|
|
246
|
+
unitPath,
|
|
247
|
+
message: `wrote ${unitPath} but launchctl refused to load it: ${bootstrap.output}`,
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
writeFileSync(unitPath, buildSystemdUnit(plan), { encoding: 'utf-8', mode: 0o600 });
|
|
254
|
+
const reload = run('systemctl', ['--user', 'daemon-reload']);
|
|
255
|
+
if (!reload.ok) {
|
|
256
|
+
return {
|
|
257
|
+
ok: false,
|
|
258
|
+
unitPath,
|
|
259
|
+
message: `wrote ${unitPath} but \`systemctl --user daemon-reload\` failed: ${reload.output}`,
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
const enable = run('systemctl', ['--user', 'enable', '--now', SYSTEMD_UNIT]);
|
|
263
|
+
if (!enable.ok) {
|
|
264
|
+
return { ok: false, unitPath, message: `wrote ${unitPath} but enabling it failed: ${enable.output}` };
|
|
265
|
+
}
|
|
266
|
+
// Without lingering the unit stops at logout, which is exactly what someone
|
|
267
|
+
// installing a service does not want. Best effort: it needs polkit rights.
|
|
268
|
+
const linger = run('loginctl', ['enable-linger', userInfo().username]);
|
|
269
|
+
if (!linger.ok) {
|
|
270
|
+
warnings.push(`could not enable lingering, so the service will stop when you log out. Run: sudo loginctl enable-linger ${userInfo().username}`);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
const url = buildBaseUrl(options);
|
|
274
|
+
const statusUrl = buildStatusUrl(options);
|
|
275
|
+
const deadline = Date.now() + 30_000;
|
|
276
|
+
while (Date.now() < deadline) {
|
|
277
|
+
const probe = await probeServer(statusUrl, 1000);
|
|
278
|
+
if (probe.up) {
|
|
279
|
+
return { ok: true, unitPath, warnings, message: `service installed and responding at ${url}` };
|
|
280
|
+
}
|
|
281
|
+
await new Promise((resolve) => setTimeout(resolve, 500));
|
|
282
|
+
}
|
|
283
|
+
const hint = kind === 'launchd' ? `tail -20 ${plan.logPath}` : `journalctl --user -u ${SYSTEMD_UNIT} -n 20 --no-pager`;
|
|
284
|
+
return {
|
|
285
|
+
ok: false,
|
|
286
|
+
unitPath,
|
|
287
|
+
warnings,
|
|
288
|
+
message: `wrote and loaded ${unitPath}, but nothing answered ${url} within 30s. Check: ${hint}`,
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
export function uninstallService() {
|
|
292
|
+
const kind = detectServiceKind();
|
|
293
|
+
if (!kind)
|
|
294
|
+
return { ok: false, message: `no supported supervisor on ${process.platform}` };
|
|
295
|
+
const unitPath = unitPathFor(kind);
|
|
296
|
+
if (!existsSync(unitPath)) {
|
|
297
|
+
return { ok: false, unitPath, message: `no service installed at ${unitPath}` };
|
|
298
|
+
}
|
|
299
|
+
if (kind === 'launchd') {
|
|
300
|
+
const uid = process.getuid?.() ?? 0;
|
|
301
|
+
const bootout = run('launchctl', ['bootout', `gui/${uid}/${LAUNCHD_LABEL}`]);
|
|
302
|
+
if (!bootout.ok)
|
|
303
|
+
run('launchctl', ['unload', unitPath]);
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
run('systemctl', ['--user', 'disable', '--now', SYSTEMD_UNIT]);
|
|
307
|
+
}
|
|
308
|
+
try {
|
|
309
|
+
unlinkSync(unitPath);
|
|
310
|
+
}
|
|
311
|
+
catch (err) {
|
|
312
|
+
return { ok: false, unitPath, message: `stopped the service but could not remove ${unitPath}: ${String(err)}` };
|
|
313
|
+
}
|
|
314
|
+
if (kind === 'systemd')
|
|
315
|
+
run('systemctl', ['--user', 'daemon-reload']);
|
|
316
|
+
return { ok: true, unitPath, message: `service stopped and ${unitPath} removed. Your tmux sessions are untouched.` };
|
|
317
|
+
}
|
|
318
|
+
export async function serviceStatus(options) {
|
|
319
|
+
const kind = detectServiceKind();
|
|
320
|
+
const url = buildBaseUrl(options);
|
|
321
|
+
if (!kind) {
|
|
322
|
+
return { kind: null, name: '', unitPath: '', installed: false, loaded: false, responding: false, url };
|
|
323
|
+
}
|
|
324
|
+
const unitPath = unitPathFor(kind);
|
|
325
|
+
const name = kind === 'launchd' ? LAUNCHD_LABEL : SYSTEMD_UNIT;
|
|
326
|
+
const installed = existsSync(unitPath);
|
|
327
|
+
const loaded = kind === 'launchd'
|
|
328
|
+
? run('launchctl', ['list', LAUNCHD_LABEL]).ok
|
|
329
|
+
: run('systemctl', ['--user', 'is-active', SYSTEMD_UNIT]).output === 'active';
|
|
330
|
+
const probe = await probeServer(buildStatusUrl(options), 2000);
|
|
331
|
+
return { kind, name, unitPath, installed, loaded, responding: probe.up, version: probe.version, url };
|
|
332
|
+
}
|
|
333
|
+
//# sourceMappingURL=service-installer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-installer.js","sourceRoot":"","sources":["../src/service-installer.ts"],"names":[],"mappings":"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"}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -2677,7 +2677,7 @@
|
|
|
2677
2677
|
<!-- Hardened markdown HTML sanitizer (wires DOMPurify). Must precede app.js. -->
|
|
2678
2678
|
<script defer src="sanitize-html.bc7078d6.js"></script>
|
|
2679
2679
|
<script defer src="app.b24f795e.js"></script>
|
|
2680
|
-
<script defer src="terminal-ui.
|
|
2680
|
+
<script defer src="terminal-ui.d5ae6dcf.js"></script>
|
|
2681
2681
|
<script defer src="respawn-ui.ff0dae4c.js"></script>
|
|
2682
2682
|
<script defer src="ralph-panel.6de2d0f8.js"></script>
|
|
2683
2683
|
<script defer src="orchestrator-panel.js"></script>
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/dist/web/public/sw.js.gz
CHANGED
|
Binary file
|