@alexberardi/jarvis-admin 0.1.84 → 0.1.86

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/public/index.html CHANGED
@@ -5,8 +5,8 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <link rel="icon" type="image/png" href="/favicon.png" />
7
7
  <title>Jarvis Admin</title>
8
- <script type="module" crossorigin src="/assets/index-4y8tSbZj.js"></script>
9
- <link rel="stylesheet" crossorigin href="/assets/index-CAv1RM9y.css">
8
+ <script type="module" crossorigin src="/assets/index-BoF60OKD.js"></script>
9
+ <link rel="stylesheet" crossorigin href="/assets/index-4TF68MKN.css">
10
10
  </head>
11
11
  <body>
12
12
  <div id="root"></div>
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": "3.0.0",
3
- "platformVersion": "0.1.84",
3
+ "platformVersion": "0.1.86",
4
4
  "services": [
5
5
  {
6
6
  "id": "jarvis-config-service",
@@ -10,6 +10,7 @@ import { createDockerService } from './services/docker.js';
10
10
  import { createComposeService } from './services/compose.js';
11
11
  import { createRegistryService } from './services/registry.js';
12
12
  import { ensureDockerOnPath } from './services/docker-path.js';
13
+ import { resumeUpgradeIfPending } from './services/upgrade/resume.js';
13
14
  import { shouldRedirectWhenInstalled } from './services/admin-lifecycle.js';
14
15
  const REPO = 'alexberardi/jarvis-admin';
15
16
  function openBrowser(url) {
@@ -107,6 +108,13 @@ async function main() {
107
108
  const app = await buildApp({ config, docker, compose, registry });
108
109
  await app.listen({ port: config.port, host: '0.0.0.0' });
109
110
  console.log(`jarvis-admin server listening on port ${config.port}`);
111
+ // A standalone upgrade can't finish in one pass: selfUpdate() swaps the binary
112
+ // and restarts the process, killing the request mid-flight. It leaves a marker
113
+ // so THIS boot can finish the job (compose regen → pull → restart → verify).
114
+ // Deliberately not awaited: it pulls images and restarts containers, which
115
+ // takes minutes, and the UI must be up while it runs — that's where the user
116
+ // watches /api/update/status.
117
+ void resumeUpgradeIfPending(app, VERSION);
110
118
  openBrowser(`http://localhost:${config.port}`);
111
119
  }
112
120
  main().catch((err) => {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/routes/update.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAM9C,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,OAAO,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAkBD,wBAAsB,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAwDtE"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/routes/update.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAO9C,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,OAAO,CAAA;IACnB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAkBD,wBAAsB,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAkGtE"}
@@ -2,6 +2,7 @@ import { existsSync, readFileSync } from 'node:fs';
2
2
  import { join } from 'node:path';
3
3
  import { homedir } from 'node:os';
4
4
  import { requireSuperuser } from '../middleware/auth.js';
5
+ import { savePersistedConfig } from '../config.js';
5
6
  import { checkForUpdate } from '../services/update-checker.js';
6
7
  const UPGRADE_MARKER = join(homedir(), '.jarvis', 'upgrade-in-progress.json');
7
8
  function getUpgradeStatus() {
@@ -17,25 +18,61 @@ function getUpgradeStatus() {
17
18
  }
18
19
  }
19
20
  export async function updateRoutes(app) {
21
+ /**
22
+ * Read the box-level update opt-in.
23
+ *
24
+ * Unauthenticated, like `/check` — it's a single boolean about this box's own
25
+ * configuration, and the SPA needs it before login to render the update card
26
+ * honestly.
27
+ */
28
+ app.get('/settings', async (_request, reply) => {
29
+ return reply.send({ allowUpdates: app.config.allowUpdates });
30
+ });
31
+ /**
32
+ * Flip the box-level update opt-in (superuser only).
33
+ *
34
+ * This exists because the flag used to be reachable ONLY by hand-editing a
35
+ * launchd plist (or compose .env) and restarting the service — which put the
36
+ * documented update path out of reach of the non-technical self-hosters it was
37
+ * written for.
38
+ *
39
+ * Persisted to ~/.jarvis/admin.json, which `loadConfig` already prefers over
40
+ * the `JARVIS_ALLOW_UPDATES` env var, so it survives a restart. We also mutate
41
+ * the live config so it takes effect immediately — otherwise the user would
42
+ * flip the switch and nothing would happen until they restarted, which is the
43
+ * very papercut we're removing.
44
+ */
45
+ app.post('/settings', { preHandler: requireSuperuser }, async (request, reply) => {
46
+ const body = request.body;
47
+ const allowUpdates = body?.allowUpdates;
48
+ if (typeof allowUpdates !== 'boolean') {
49
+ return reply.code(400).send({ error: 'allowUpdates must be a boolean' });
50
+ }
51
+ savePersistedConfig({ allowUpdates });
52
+ app.config.allowUpdates = allowUpdates;
53
+ app.log.info({ allowUpdates }, 'update opt-in changed');
54
+ return reply.send({ allowUpdates });
55
+ });
20
56
  /** Check for available updates (no auth required — informational) */
21
57
  app.get('/check', async (_request, reply) => {
22
58
  const info = await checkForUpdate(false, app.config.allowUpdates);
23
- return reply.send(info);
59
+ return reply.send({ ...info, updatesEnabled: app.config.allowUpdates });
24
60
  });
25
61
  /** Force a fresh update check */
26
62
  app.post('/check', async (_request, reply) => {
27
63
  const info = await checkForUpdate(true, app.config.allowUpdates);
28
- return reply.send(info);
64
+ return reply.send({ ...info, updatesEnabled: app.config.allowUpdates });
29
65
  });
30
66
  /** Get current upgrade status (is an upgrade in progress?) */
31
67
  app.get('/status', async (_request, reply) => {
32
68
  return reply.send(getUpgradeStatus());
33
69
  });
34
70
  /** Apply an update — SSE endpoint that orchestrates the full upgrade */
35
- app.post('/apply', { preHandler: requireSuperuser }, async (request, reply) => {
71
+ app.post('/apply', { preHandler: requireSuperuser }, async (_request, reply) => {
36
72
  if (!app.config.allowUpdates) {
37
73
  return reply.code(403).send({
38
- error: 'Updates are disabled. Set JARVIS_ALLOW_UPDATES=true to allow update checks and applies.',
74
+ error: 'Updates are disabled. Turn on "Check for updates" in the admin UI ' +
75
+ '(or POST /api/update/settings {"allowUpdates":true}).',
39
76
  });
40
77
  }
41
78
  const info = await checkForUpdate(true, app.config.allowUpdates);
@@ -1 +1 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/routes/update.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/routes/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { FastifyInstance } from 'fastify';
2
+ /**
3
+ * Finish an upgrade that was interrupted by the admin restarting into its new
4
+ * binary.
5
+ *
6
+ * The standalone upgrade path can't complete in one pass: `selfUpdate()` swaps
7
+ * the binary and restarts the process, which kills the request (and the SSE
8
+ * stream) mid-flight. It leaves `~/.jarvis/upgrade-in-progress.json` behind so
9
+ * the NEW binary can pick up where the old one died — compose regen, image pull,
10
+ * service restart, health verify.
11
+ *
12
+ * That hand-off was never wired: `resumeUpgrade()` existed, and nothing called
13
+ * it. The result was that the Update button on native installs updated the admin
14
+ * binary and *nothing else* — services stayed on their old images, the marker
15
+ * sat at "binary-updated" forever, and `/api/update/status` reported an upgrade
16
+ * permanently in progress.
17
+ *
18
+ * Called from startup, deliberately NOT awaited by the listen path: the upgrade
19
+ * pulls images and restarts containers, which takes minutes, and the admin UI
20
+ * has to be up during it (that's where the user watches `/api/update/status`).
21
+ */
22
+ export declare function resumeUpgradeIfPending(app: FastifyInstance, runningVersion: string): Promise<void>;
23
+ //# sourceMappingURL=resume.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume.d.ts","sourceRoot":"","sources":["../../../src/services/upgrade/resume.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAwB9C;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,sBAAsB,CAC1C,GAAG,EAAE,eAAe,EACpB,cAAc,EAAE,MAAM,GACrB,OAAO,CAAC,IAAI,CAAC,CAiDf"}
@@ -0,0 +1,80 @@
1
+ import { existsSync, readFileSync, writeFileSync, unlinkSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { homedir } from 'node:os';
4
+ import { savePersistedConfig } from '../../config.js';
5
+ const MARKER = () => join(homedir(), '.jarvis', 'upgrade-in-progress.json');
6
+ function readMarker() {
7
+ const path = MARKER();
8
+ if (!existsSync(path))
9
+ return null;
10
+ try {
11
+ return JSON.parse(readFileSync(path, 'utf-8'));
12
+ }
13
+ catch {
14
+ // Corrupt marker: we can't know what it wanted. Drop it rather than block boot.
15
+ unlinkSync(path);
16
+ return null;
17
+ }
18
+ }
19
+ /**
20
+ * Finish an upgrade that was interrupted by the admin restarting into its new
21
+ * binary.
22
+ *
23
+ * The standalone upgrade path can't complete in one pass: `selfUpdate()` swaps
24
+ * the binary and restarts the process, which kills the request (and the SSE
25
+ * stream) mid-flight. It leaves `~/.jarvis/upgrade-in-progress.json` behind so
26
+ * the NEW binary can pick up where the old one died — compose regen, image pull,
27
+ * service restart, health verify.
28
+ *
29
+ * That hand-off was never wired: `resumeUpgrade()` existed, and nothing called
30
+ * it. The result was that the Update button on native installs updated the admin
31
+ * binary and *nothing else* — services stayed on their old images, the marker
32
+ * sat at "binary-updated" forever, and `/api/update/status` reported an upgrade
33
+ * permanently in progress.
34
+ *
35
+ * Called from startup, deliberately NOT awaited by the listen path: the upgrade
36
+ * pulls images and restarts containers, which takes minutes, and the admin UI
37
+ * has to be up during it (that's where the user watches `/api/update/status`).
38
+ */
39
+ export async function resumeUpgradeIfPending(app, runningVersion) {
40
+ const marker = readMarker();
41
+ if (!marker)
42
+ return;
43
+ // Already failed once. Don't retry on every boot — that would turn a broken
44
+ // upgrade into a pull/restart loop. Leave it so the UI can surface the error.
45
+ if (marker.phase === 'error') {
46
+ app.log.warn({ marker }, 'previous upgrade failed; not retrying automatically (clear ~/.jarvis/upgrade-in-progress.json to reset)');
47
+ return;
48
+ }
49
+ // The marker was written for a different version than the one now running, so
50
+ // the binary swap did not land the way the updater thought (rollback, or a
51
+ // hand-installed binary). Resuming would regenerate compose for a version we
52
+ // aren't running — worse than doing nothing.
53
+ if (marker.version !== runningVersion) {
54
+ app.log.warn({ markerVersion: marker.version, runningVersion }, 'discarding stale upgrade marker (version mismatch)');
55
+ unlinkSync(MARKER());
56
+ return;
57
+ }
58
+ app.log.info({ version: marker.version }, 'resuming upgrade after binary restart');
59
+ try {
60
+ const { resumeUpgrade } = await import('./orchestrator.js');
61
+ await resumeUpgrade(app, marker, (data) => {
62
+ app.log.info({ upgrade: data }, 'upgrade progress');
63
+ });
64
+ unlinkSync(MARKER());
65
+ // Only now is the upgrade real: the binary AND the services are on the new
66
+ // version. Recording it earlier would claim success for a stack that never
67
+ // moved.
68
+ savePersistedConfig({ installedVersion: marker.version });
69
+ app.log.info({ version: marker.version }, 'upgrade complete');
70
+ }
71
+ catch (err) {
72
+ const message = err instanceof Error ? err.message : String(err);
73
+ // Keep the marker so the failure is visible (and so we don't silently
74
+ // pretend the upgrade finished), but mark it failed so the next boot doesn't
75
+ // retry into the same wall.
76
+ writeFileSync(MARKER(), JSON.stringify({ ...marker, phase: 'error', error: message }));
77
+ app.log.error({ err: message, version: marker.version }, 'upgrade resume failed');
78
+ }
79
+ }
80
+ //# sourceMappingURL=resume.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume.js","sourceRoot":"","sources":["../../../src/services/upgrade/resume.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": "3.0.0",
3
- "platformVersion": "0.1.84",
3
+ "platformVersion": "0.1.86",
4
4
  "services": [
5
5
  {
6
6
  "id": "jarvis-config-service",