saros-proxy 1.1.2 → 1.2.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.
@@ -0,0 +1,549 @@
1
+ /**
2
+ * update.ts — `saros-proxy update`: replace a global npm install and restart
3
+ * whatever was serving.
4
+ *
5
+ * Safety rules:
6
+ * - only a package living in the npm global prefix is updated (--force
7
+ * overrides), so a git checkout is never replaced behind the user's back;
8
+ * - the running proxy is stopped first and is always restarted after a
9
+ * failed install, so the host is never left without a proxy;
10
+ * - success is verified by reading the installed package.json and by
11
+ * checking the restarted proxy's /health version, not by npm's exit code.
12
+ */
13
+ import { execFileSync } from 'node:child_process';
14
+ import { existsSync, lstatSync, readFileSync, realpathSync } from 'node:fs';
15
+ import { dirname, join, resolve } from 'node:path';
16
+ import { setTimeout as delay } from 'node:timers/promises';
17
+ import { fileURLToPath } from 'node:url';
18
+ import chalk from 'chalk';
19
+ import { confirm, isCancel } from './ui.js';
20
+ import { getSarosDir } from '../config.js';
21
+ import { getVersion } from '../version.js';
22
+ import { compareVersions, fetchLatestVersion as fetchRegistryLatestVersion, isValidVersion, } from './update-check.js';
23
+ import { daemonStart, daemonStop, getDaemonState as readDaemonState, probeProxyHealth, } from './daemon.js';
24
+ import { isSystemdUnitActive, startSystemdUnit, stopSystemdUnit, } from './autostart.js';
25
+ // ---------------------------------------------------------------------------
26
+ // Pure decisions
27
+ // ---------------------------------------------------------------------------
28
+ /** Parse `update` arguments. The first invalid option is reported. */
29
+ export function parseUpdateArgs(argv) {
30
+ const args = { check: false, yes: false, force: false };
31
+ for (let i = 0; i < argv.length; i++) {
32
+ const arg = argv[i];
33
+ if (arg === '--check') {
34
+ args.check = true;
35
+ }
36
+ else if (arg === '--yes') {
37
+ args.yes = true;
38
+ }
39
+ else if (arg === '--force') {
40
+ args.force = true;
41
+ }
42
+ else if (arg === '--port') {
43
+ const value = argv[++i];
44
+ const port = Number(value);
45
+ if (value === undefined || !Number.isInteger(port) || port < 1 || port > 65535) {
46
+ args.error = `--port requires a port between 1 and 65535 (got: ${value ?? 'nothing'})`;
47
+ return args;
48
+ }
49
+ args.port = port;
50
+ }
51
+ else if (arg === '--config') {
52
+ const value = argv[++i];
53
+ if (value === undefined || value === '') {
54
+ args.error = '--config requires a path';
55
+ return args;
56
+ }
57
+ args.config = value;
58
+ }
59
+ else {
60
+ args.error = `Unknown option: ${arg}`;
61
+ return args;
62
+ }
63
+ }
64
+ return args;
65
+ }
66
+ /**
67
+ * The proxy to restart: an active systemd unit outranks the PID-file daemon
68
+ * (a unit-managed process usually has no PID file), and nothing is started
69
+ * when neither was running before the update.
70
+ */
71
+ export function chooseRestartMode(daemonRunning, systemdActive) {
72
+ if (systemdActive)
73
+ return 'systemd';
74
+ return daemonRunning ? 'daemon' : 'none';
75
+ }
76
+ /** Is the running package the one npm considers global? */
77
+ export function isGlobalInstall(packageRoot, npmGlobalRoot, platform = process.platform) {
78
+ if (packageRoot === '' || npmGlobalRoot === '')
79
+ return false;
80
+ const expectedPath = join(npmGlobalRoot, 'saros-proxy');
81
+ // `npm link` leaves a symlink in the global prefix. Canonicalizing both
82
+ // sides would make the checkout look like the global install, and the
83
+ // update would replace the link (and the checkout) behind the user's back.
84
+ try {
85
+ if (lstatSync(expectedPath).isSymbolicLink())
86
+ return false;
87
+ }
88
+ catch {
89
+ // Missing path: fall through to the canonical comparison (tests and a
90
+ // first install both reach this).
91
+ }
92
+ const actual = canonicalPath(packageRoot);
93
+ const expected = canonicalPath(expectedPath);
94
+ return platform === 'win32'
95
+ ? actual.toLowerCase() === expected.toLowerCase()
96
+ : actual === expected;
97
+ }
98
+ /** Read `<packageRoot>/package.json`'s version, or null when unusable. */
99
+ export function readPackageVersion(packageRoot) {
100
+ try {
101
+ const raw = readFileSync(join(packageRoot, 'package.json'), 'utf-8');
102
+ const pkg = JSON.parse(raw);
103
+ return typeof pkg.version === 'string' && pkg.version.length > 0
104
+ ? pkg.version
105
+ : null;
106
+ }
107
+ catch {
108
+ return null;
109
+ }
110
+ }
111
+ /**
112
+ * Poll /health until it answers `status: ok` with the expected version.
113
+ * The version check is what distinguishes the freshly installed proxy from
114
+ * the old process that is still shutting down on the same port; `null`
115
+ * accepts any version, for a rollback that cannot know which release npm
116
+ * left on disk.
117
+ */
118
+ export async function waitForUpdatedProxy(probe, expectedVersion, attempts, delayMs, sleep) {
119
+ let result = { ok: false };
120
+ for (let attempt = 0; attempt < attempts; attempt++) {
121
+ result = await probe();
122
+ const versionMatches = expectedVersion === null || result.body?.version === expectedVersion;
123
+ if (result.ok && versionMatches)
124
+ return result;
125
+ if (attempt < attempts - 1)
126
+ await sleep(delayMs);
127
+ }
128
+ return result;
129
+ }
130
+ // ---------------------------------------------------------------------------
131
+ // Default dependencies
132
+ // ---------------------------------------------------------------------------
133
+ function canonicalPath(file) {
134
+ try {
135
+ return realpathSync(file);
136
+ }
137
+ catch {
138
+ return resolve(file);
139
+ }
140
+ }
141
+ function thisPackageRoot() {
142
+ return resolve(dirname(fileURLToPath(import.meta.url)), '..', '..');
143
+ }
144
+ function defaultExec(command, args, options = {}) {
145
+ const output = execFileSync(command, [...args], {
146
+ encoding: 'utf-8',
147
+ // npm is npm.cmd on Windows; CreateProcess cannot run a .cmd without a shell.
148
+ shell: process.platform === 'win32' && command === 'npm',
149
+ ...(options.inherit
150
+ ? { stdio: 'inherit' }
151
+ : { stdio: 'pipe', timeout: 30_000 }),
152
+ });
153
+ return typeof output === 'string' ? output.trim() : '';
154
+ }
155
+ async function confirmInTerminal(message) {
156
+ const answer = await confirm({ message });
157
+ return !isCancel(answer) && answer === true;
158
+ }
159
+ function defaultDaemonLogPath() {
160
+ try {
161
+ return join(getSarosDir(), 'daemon.log');
162
+ }
163
+ catch {
164
+ // No determinable home: keep the hint generic instead of failing the run.
165
+ return 'daemon.log';
166
+ }
167
+ }
168
+ /** Only the options the user actually supplied, so defaults stay defaults. */
169
+ function definedServiceOptions(args) {
170
+ const options = {};
171
+ if (args.port !== undefined)
172
+ options.port = args.port;
173
+ if (args.config !== undefined)
174
+ options.configPath = args.config;
175
+ return options;
176
+ }
177
+ function resolveDependencies(overrides, args) {
178
+ const platform = overrides.platform ?? process.platform;
179
+ const serviceOptions = definedServiceOptions(args);
180
+ return {
181
+ currentVersion: overrides.currentVersion ?? getVersion(),
182
+ fetchLatestVersion: overrides.fetchLatestVersion ?? (() => fetchRegistryLatestVersion()),
183
+ exec: overrides.exec ?? defaultExec,
184
+ packageRoot: overrides.packageRoot ?? thisPackageRoot(),
185
+ readInstalledVersion: overrides.readInstalledVersion ?? readPackageVersion,
186
+ isTTY: overrides.isTTY ?? Boolean(process.stdin.isTTY),
187
+ confirm: overrides.confirm ?? confirmInTerminal,
188
+ getDaemonState: overrides.getDaemonState ??
189
+ (async () => {
190
+ const state = await readDaemonState(serviceOptions);
191
+ return {
192
+ running: state.running,
193
+ port: state.port,
194
+ pid: state.pid,
195
+ health: state.health,
196
+ };
197
+ }),
198
+ daemonStop: overrides.daemonStop ??
199
+ ((options) => daemonStop({
200
+ exitOnComplete: false,
201
+ ...(options.port === undefined ? {} : { port: options.port }),
202
+ ...(options.configPath === undefined ? {} : { configPath: options.configPath }),
203
+ })),
204
+ daemonStart: overrides.daemonStart ??
205
+ ((options) => daemonStart(options.port, options.configPath, {
206
+ exitOnComplete: false,
207
+ entryPoint: options.entryPoint,
208
+ })),
209
+ systemdActive: overrides.systemdActive ?? isSystemdUnitActive,
210
+ systemdStop: overrides.systemdStop ?? stopSystemdUnit,
211
+ systemdStart: overrides.systemdStart ?? startSystemdUnit,
212
+ probeHealth: overrides.probeHealth ?? probeProxyHealth,
213
+ daemonLogPath: overrides.daemonLogPath ?? defaultDaemonLogPath(),
214
+ sleep: overrides.sleep ?? delay,
215
+ healthAttempts: overrides.healthAttempts ?? 20,
216
+ healthDelayMs: overrides.healthDelayMs ?? 500,
217
+ platform,
218
+ };
219
+ }
220
+ function errorMessage(err) {
221
+ return err instanceof Error ? err.message : String(err);
222
+ }
223
+ // ---------------------------------------------------------------------------
224
+ // Service lifecycle (shared by the success and rollback paths)
225
+ // ---------------------------------------------------------------------------
226
+ async function startService(mode, deps, options) {
227
+ if (mode === 'systemd')
228
+ deps.systemdStart();
229
+ else if (mode === 'daemon')
230
+ await deps.daemonStart(options);
231
+ }
232
+ async function stopService(mode, deps, options) {
233
+ if (mode === 'systemd') {
234
+ deps.systemdStop();
235
+ return true;
236
+ }
237
+ if (mode === 'daemon')
238
+ return deps.daemonStop(options);
239
+ return true;
240
+ }
241
+ function healthFailureDetail(health) {
242
+ if (!health.ok)
243
+ return 'did not answer /health';
244
+ const reported = health.body?.version;
245
+ return typeof reported === 'string'
246
+ ? `reports version ${reported}`
247
+ : 'does not report its version';
248
+ }
249
+ /**
250
+ * Resolve the npm global prefix the package must live in. Prints the reason
251
+ * and returns null when the caller must not touch the install. `--force`
252
+ * only bypasses a failed `npm root -g`; a checkout still needs it to find
253
+ * the installed package's entry point.
254
+ */
255
+ function resolveGlobalRoot(deps, args) {
256
+ let globalRoot = '';
257
+ try {
258
+ globalRoot = deps.exec('npm', ['root', '-g']);
259
+ }
260
+ catch (err) {
261
+ if (!args.force) {
262
+ console.error(chalk.red(`✗ Could not determine the npm global prefix: ${errorMessage(err)}`));
263
+ return null;
264
+ }
265
+ }
266
+ if (!isGlobalInstall(deps.packageRoot, globalRoot, deps.platform) &&
267
+ !args.force) {
268
+ console.error(chalk.red('✗ This install is not a global npm package — update the checkout instead.'));
269
+ return null;
270
+ }
271
+ return globalRoot;
272
+ }
273
+ // ---------------------------------------------------------------------------
274
+ // Command
275
+ // ---------------------------------------------------------------------------
276
+ /**
277
+ * Run `saros-proxy update [--check] [--yes] [--force]`.
278
+ * Returns the process exit code; never calls process.exit so the whole flow
279
+ * is testable.
280
+ */
281
+ export async function runUpdateCommand(argv, overrides = {}) {
282
+ const args = parseUpdateArgs(argv);
283
+ if (args.error) {
284
+ console.error(chalk.red(`✗ ${args.error}`));
285
+ return 1;
286
+ }
287
+ const deps = resolveDependencies(overrides, args);
288
+ const current = deps.currentVersion;
289
+ const serviceOptions = definedServiceOptions(args);
290
+ let latest;
291
+ try {
292
+ latest = await deps.fetchLatestVersion();
293
+ }
294
+ catch (err) {
295
+ console.error(chalk.red(`✗ Could not reach the npm registry: ${errorMessage(err)}`));
296
+ return 1;
297
+ }
298
+ if (!isValidVersion(latest)) {
299
+ console.error(chalk.red(`✗ The npm registry returned an invalid version: ${latest}`));
300
+ return 1;
301
+ }
302
+ const comparison = compareVersions(current, latest);
303
+ if (args.check) {
304
+ console.log(`installed ${current} / latest ${latest}`);
305
+ return comparison < 0 ? 1 : 0;
306
+ }
307
+ if (comparison === 0) {
308
+ return restartIfDaemonIsStale(deps, args, current, serviceOptions);
309
+ }
310
+ if (comparison > 0 && !args.force) {
311
+ console.log(chalk.yellow(`Installed ${current} is newer than the npm latest ${latest}; nothing to update. Re-run with --force to install ${latest} anyway.`));
312
+ return 0;
313
+ }
314
+ // Refuse before touching npm/systemd when the answer would have to be
315
+ // assumed: piped stdin is never treated as consent.
316
+ if (!args.yes && !deps.isTTY) {
317
+ console.error(chalk.red('✗ Refusing to update without a TTY. Re-run with --yes to skip confirmation.'));
318
+ return 1;
319
+ }
320
+ const globalRoot = resolveGlobalRoot(deps, args);
321
+ if (globalRoot === null)
322
+ return 1;
323
+ console.log(chalk.cyan(`Updating saros-proxy: ${current} → ${latest}`));
324
+ if (!args.yes) {
325
+ const approved = await deps.confirm(`Update saros-proxy ${current} → ${latest}?`);
326
+ if (!approved) {
327
+ console.log(chalk.yellow('Update cancelled.'));
328
+ return 1;
329
+ }
330
+ }
331
+ const before = await deps.getDaemonState();
332
+ if (pidWithoutHealth(before, args)) {
333
+ return refuseUnknownDaemonPort(before);
334
+ }
335
+ const systemdActive = deps.platform === 'linux' && deps.systemdActive();
336
+ const mode = chooseRestartMode(before.running, systemdActive);
337
+ const entryPoint = globalRoot === ''
338
+ ? undefined
339
+ : join(globalRoot, 'saros-proxy', 'dist', 'index.js');
340
+ const restartOptions = {
341
+ ...serviceOptions,
342
+ ...(entryPoint === undefined ? {} : { entryPoint }),
343
+ };
344
+ try {
345
+ if (!(await stopService(mode, deps, serviceOptions))) {
346
+ console.error(chalk.red('✗ Could not stop the running proxy; aborting before install.'));
347
+ return 1;
348
+ }
349
+ }
350
+ catch (err) {
351
+ console.error(chalk.red(`✗ Could not stop the running proxy: ${errorMessage(err)}`));
352
+ return 1;
353
+ }
354
+ try {
355
+ deps.exec('npm', ['install', '-g', `saros-proxy@${latest}`], {
356
+ inherit: true,
357
+ });
358
+ }
359
+ catch (err) {
360
+ console.error(chalk.red(`✗ npm install -g saros-proxy@${latest} failed: ${errorMessage(err)}`));
361
+ await rollback(mode, deps, before.port, current, restartOptions, false);
362
+ return 1;
363
+ }
364
+ const installedRoot = globalRoot === '' ? deps.packageRoot : join(globalRoot, 'saros-proxy');
365
+ const installedVersion = deps.readInstalledVersion(installedRoot);
366
+ if (installedVersion !== latest) {
367
+ console.error(chalk.red(`✗ The global package reports ${installedVersion ?? 'no version'}, expected ${latest}.`));
368
+ await rollback(mode, deps, before.port, current, restartOptions, false);
369
+ return 1;
370
+ }
371
+ if (mode === 'none') {
372
+ console.log(chalk.green(`✓ Installed saros-proxy ${latest}. The daemon was not running, so it was left stopped.`));
373
+ return 0;
374
+ }
375
+ try {
376
+ await startService(mode, deps, restartOptions);
377
+ }
378
+ catch (err) {
379
+ console.error(chalk.red(`✗ Updated to ${latest}, but the proxy failed to start: ${errorMessage(err)}`));
380
+ await rollback(mode, deps, before.port, current, restartOptions, false);
381
+ return 1;
382
+ }
383
+ const health = await waitForUpdatedProxy(() => deps.probeHealth(before.port), latest, deps.healthAttempts, deps.healthDelayMs, deps.sleep);
384
+ if (!health.ok || health.body?.version !== latest) {
385
+ console.error(chalk.red(`✗ saros-proxy ${latest} is installed, but the proxy on port ${before.port} ${healthFailureDetail(health)}.`));
386
+ await rollback(mode, deps, before.port, current, restartOptions, true);
387
+ return 1;
388
+ }
389
+ console.log(chalk.green(`✓ Updated to ${latest} and restarted the proxy on port ${before.port}.`));
390
+ return 0;
391
+ }
392
+ /**
393
+ * Consent for restarting a stale proxy. Returns the exit code to use when the
394
+ * restart must not happen, or null when it may proceed. No prompt is read
395
+ * from piped stdin.
396
+ */
397
+ async function consentToRestart(deps, args, current, state, serving) {
398
+ if (args.yes)
399
+ return null;
400
+ if (!deps.isTTY) {
401
+ console.log(chalk.yellow(`The package is already ${current}, but the proxy on port ${state.port} ${serving}. Re-run with \`saros-proxy update --yes\` to restart it.`));
402
+ return 0;
403
+ }
404
+ const approved = await deps.confirm(`The package is already ${current}, but the proxy on port ${state.port} ${serving}. Restart it?`);
405
+ if (approved)
406
+ return null;
407
+ console.log(chalk.yellow('Restart cancelled.'));
408
+ return 0;
409
+ }
410
+ /**
411
+ * Entry point of the installed package for a daemon restart, or null after
412
+ * printing why it cannot be used. The command must start the global package,
413
+ * never whichever checkout ran it.
414
+ */
415
+ function installedEntryPoint(deps, args, current) {
416
+ const globalRoot = resolveGlobalRoot(deps, args);
417
+ if (globalRoot === null)
418
+ return null;
419
+ const entryPoint = globalRoot === '' ? '' : join(globalRoot, 'saros-proxy', 'dist', 'index.js');
420
+ if (entryPoint !== '' && existsSync(entryPoint))
421
+ return entryPoint;
422
+ console.error(chalk.red(`✗ Cannot restart the proxy from the installed package: its entry point${entryPoint === '' ? '' : ` (${entryPoint})`} is not available. Reinstall it with \`npm install -g saros-proxy@${current}\`, then run \`saros-proxy restart\`.`));
423
+ return null;
424
+ }
425
+ /**
426
+ * The package is already `current`, but the process serving may not be: a
427
+ * manual install or an interrupted update leaves an old daemon behind. Restart
428
+ * it when its `/health` reports another version (or no version at all); do
429
+ * nothing when it matches.
430
+ */
431
+ async function restartIfDaemonIsStale(deps, args, current, serviceOptions) {
432
+ const state = await deps.getDaemonState();
433
+ if (pidWithoutHealth(state, args)) {
434
+ return refuseUnknownDaemonPort(state);
435
+ }
436
+ if (!state.running) {
437
+ console.log(chalk.green(`✓ Already on ${current}.`));
438
+ return 0;
439
+ }
440
+ const reported = typeof state.health?.version === 'string' ? state.health.version : null;
441
+ if (reported === current) {
442
+ console.log(chalk.green(`✓ Already on ${current}.`));
443
+ return 0;
444
+ }
445
+ const serving = reported === null ? 'does not report its version' : `reports ${reported}`;
446
+ const consent = await consentToRestart(deps, args, current, state, serving);
447
+ if (consent !== null)
448
+ return consent;
449
+ const systemdActive = deps.platform === 'linux' && deps.systemdActive();
450
+ const mode = chooseRestartMode(state.running, systemdActive);
451
+ const restartOptions = { ...serviceOptions };
452
+ if (mode === 'daemon') {
453
+ const entryPoint = installedEntryPoint(deps, args, current);
454
+ if (entryPoint === null)
455
+ return 1;
456
+ restartOptions.entryPoint = entryPoint;
457
+ }
458
+ console.log(chalk.cyan(`Package is already ${current}; the running proxy ${serving}. Restarting it.`));
459
+ try {
460
+ if (!(await stopService(mode, deps, serviceOptions))) {
461
+ console.error(chalk.red('✗ Could not stop the running proxy; stop it manually, then run `saros-proxy start`.'));
462
+ return 1;
463
+ }
464
+ }
465
+ catch (err) {
466
+ console.error(chalk.red(`✗ Could not stop the running proxy: ${errorMessage(err)}`));
467
+ return 1;
468
+ }
469
+ try {
470
+ await startService(mode, deps, restartOptions);
471
+ }
472
+ catch (err) {
473
+ console.error(chalk.red(`✗ saros-proxy ${current} is installed, but the restart failed: ${errorMessage(err)}`));
474
+ console.error(chalk.dim(`Check ${deps.daemonLogPath} and run \`saros-proxy status\`.`));
475
+ return 1;
476
+ }
477
+ const health = await waitForUpdatedProxy(() => deps.probeHealth(state.port), current, deps.healthAttempts, deps.healthDelayMs, deps.sleep);
478
+ if (!health.ok || health.body?.version !== current) {
479
+ console.error(chalk.red(`✗ saros-proxy ${current} is installed, but the proxy on port ${state.port} ${healthFailureDetail(health)}.`));
480
+ console.error(chalk.dim(`Check ${deps.daemonLogPath} and run \`saros-proxy status\`.`));
481
+ return 1;
482
+ }
483
+ console.log(chalk.green(`✓ Restarted saros-proxy ${current}; it was serving ${reported ?? 'an unknown version'}.`));
484
+ return 0;
485
+ }
486
+ /** A PID-file daemon exists but its port cannot be inferred from the config. */
487
+ function pidWithoutHealth(state, args) {
488
+ return Boolean(state.pid) && !state.health && args.port === undefined;
489
+ }
490
+ function refuseUnknownDaemonPort(state) {
491
+ console.error(chalk.red(`✗ A proxy daemon (PID ${state.pid}) is running, but /health did not answer on port ${state.port}. Re-run with --port <the port it serves> (and --config <path> if it uses one) so the update stops and restarts the right instance.`));
492
+ return 1;
493
+ }
494
+ /**
495
+ * Put the previous version back after a failed attempt: reinstall it (npm may
496
+ * already have removed the old tree), then start it and verify. When the
497
+ * reinstall itself fails, start whatever is on disk and say so; never pretend
498
+ * the old version is back.
499
+ */
500
+ async function rollback(mode, deps, port, version, options, stopFirst) {
501
+ if (mode === 'none') {
502
+ console.log(chalk.yellow('The daemon was not running before the update; it was left stopped.'));
503
+ return;
504
+ }
505
+ if (stopFirst) {
506
+ try {
507
+ if (!(await stopService(mode, deps, options))) {
508
+ console.error(chalk.yellow('! Could not stop the failed instance; continuing with the rollback.'));
509
+ }
510
+ }
511
+ catch (err) {
512
+ console.error(chalk.yellow(`! Could not stop the failed instance: ${errorMessage(err)}; continuing with the rollback.`));
513
+ }
514
+ }
515
+ let reinstalled = false;
516
+ try {
517
+ deps.exec('npm', ['install', '-g', `saros-proxy@${version}`], {
518
+ inherit: true,
519
+ });
520
+ reinstalled = true;
521
+ }
522
+ catch (err) {
523
+ console.error(chalk.yellow(`! Could not reinstall saros-proxy ${version}: ${errorMessage(err)}. Starting the package currently on disk instead.`));
524
+ }
525
+ try {
526
+ await startService(mode, deps, options);
527
+ }
528
+ catch (err) {
529
+ console.error(chalk.red(`✗ Could not restart saros-proxy ${version}: ${errorMessage(err)}`));
530
+ console.error(chalk.dim(`Check ${deps.daemonLogPath} and run \`saros-proxy status\`.`));
531
+ return;
532
+ }
533
+ const health = await waitForUpdatedProxy(() => deps.probeHealth(port), reinstalled ? version : null, deps.healthAttempts, deps.healthDelayMs, deps.sleep);
534
+ const expectedMet = reinstalled ? health.body?.version === version : true;
535
+ if (!health.ok || !expectedMet) {
536
+ console.error(chalk.red(reinstalled
537
+ ? `✗ saros-proxy ${version} was not running after the failed update: the proxy on port ${port} ${healthFailureDetail(health)}.`
538
+ : `✗ The package currently on disk did not become healthy on port ${port}: ${healthFailureDetail(health)}.`));
539
+ console.error(chalk.dim(`Check ${deps.daemonLogPath} and run \`saros-proxy status\`.`));
540
+ return;
541
+ }
542
+ if (reinstalled) {
543
+ console.log(chalk.green(`✓ Restarted saros-proxy ${version} (the previous install).`));
544
+ return;
545
+ }
546
+ const reported = health.body?.version;
547
+ console.log(chalk.yellow(`✓ Started the package currently on disk${typeof reported === 'string' ? ` (version ${reported})` : ''}; saros-proxy ${version} could not be reinstalled.`));
548
+ }
549
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/cli/update.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -9,8 +9,7 @@
9
9
  * saros-proxy setup # Run the interactive setup wizard
10
10
  */
11
11
  import { serve } from '@hono/node-server';
12
- import { dirname, resolve } from 'node:path';
13
- import { fileURLToPath } from 'node:url';
12
+ import { dirname } from 'node:path';
14
13
  import { loadConfig, resolveConfigPath } from './config.js';
15
14
  import { createProxyApp } from './proxy.js';
16
15
  import { flushModelStats } from './model-stats.js';
@@ -20,6 +19,7 @@ import { redactSecrets } from './log-redact.js';
20
19
  import { FORCE_SHUTDOWN_TIMEOUT_MS } from './constants.js';
21
20
  import { daemonStart, daemonStop, daemonStatus, daemonRestart } from './cli/daemon.js';
22
21
  import { runUsageCommand } from './cli/usage.js';
22
+ import { runUpdateCommand } from './cli/update.js';
23
23
  import { getDefaultOpencodeConfigPath } from './cli/opencode-config.js';
24
24
  import { autostartInstall, autostartUninstall, autostartStatus } from './cli/autostart.js';
25
25
  import { checkForUpdate } from './cli/update-check.js';
@@ -34,7 +34,6 @@ import { runKeysCommand } from './cli/keys.js';
34
34
  import { buildBootLog, prepareBootPassphrase } from './secrets/boot.js';
35
35
  import chalk from 'chalk';
36
36
  import { printHelp } from './cli/help.js';
37
- import { readFileSync } from 'node:fs';
38
37
  // ---------------------------------------------------------------------------
39
38
  // Help text (re-exported for testing)
40
39
  // ---------------------------------------------------------------------------
@@ -148,9 +147,7 @@ else if (subcommand === 'autostart') {
148
147
  }
149
148
  }
150
149
  else if (subcommand === '--version' || subcommand === '-v') {
151
- const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..');
152
- const pkg = JSON.parse(readFileSync(resolve(packageRoot, 'package.json'), 'utf-8'));
153
- console.log(pkg.version);
150
+ console.log(getVersion());
154
151
  process.exit(0);
155
152
  }
156
153
  else if (subcommand === 'help' || subcommand === '--help' || subcommand === '-h') {
@@ -273,6 +270,9 @@ else if (subcommand === 'probe') {
273
270
  console.log(chalk.dim(`\nSummary: ${toProbe.length + cached.length}/${modelsToProbe.length} models probed, ${cached.length} skipped (cached)`));
274
271
  process.exit(0);
275
272
  }
273
+ else if (subcommand === 'update') {
274
+ process.exit(await runUpdateCommand(process.argv.slice(3)));
275
+ }
276
276
  else if (subcommand === 'usage') {
277
277
  process.exit(await runUsageCommand());
278
278
  }