@alexberardi/jarvis-admin 0.1.85 → 0.1.87

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,7 +5,7 @@
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-BoF60OKD.js"></script>
8
+ <script type="module" crossorigin src="/assets/index-Bjfrxnl3.js"></script>
9
9
  <link rel="stylesheet" crossorigin href="/assets/index-4TF68MKN.css">
10
10
  </head>
11
11
  <body>
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": "3.0.0",
3
- "platformVersion": "0.1.85",
3
+ "platformVersion": "0.1.87",
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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"}
@@ -4,6 +4,8 @@ export interface UpgradeStatus {
4
4
  phase?: string;
5
5
  version?: string;
6
6
  startedAt?: string;
7
+ /** Set when the startup resume failed; `phase` is then "error". */
8
+ error?: string;
7
9
  }
8
10
  export declare function updateRoutes(app: FastifyInstance): Promise<void>;
9
11
  //# sourceMappingURL=update.d.ts.map
@@ -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;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"}
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;IAClB,mEAAmE;IACnE,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAsBD,wBAAsB,YAAY,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAkGtE"}
@@ -11,7 +11,10 @@ function getUpgradeStatus() {
11
11
  }
12
12
  try {
13
13
  const data = JSON.parse(readFileSync(UPGRADE_MARKER, 'utf-8'));
14
- return { inProgress: true, ...data };
14
+ // A failed resume leaves the marker behind on purpose (so the failure is
15
+ // visible), but the upgrade is over — reporting inProgress would leave the
16
+ // UI spinning forever on something that already stopped.
17
+ return { inProgress: data.phase !== 'error', ...data };
15
18
  }
16
19
  catch {
17
20
  return { inProgress: false };
@@ -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":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAC7E,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAEjC,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAErD,MAAM,MAAM,GAAG,GAAW,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,0BAA0B,CAAC,CAAA;AASnF,SAAS,UAAU;IACjB,MAAM,IAAI,GAAG,MAAM,EAAE,CAAA;IACrB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAA;IAClC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAkB,CAAA;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,gFAAgF;QAChF,UAAU,CAAC,IAAI,CAAC,CAAA;QAChB,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,GAAoB,EACpB,cAAsB;IAEtB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,IAAI,CAAC,MAAM;QAAE,OAAM;IAEnB,4EAA4E;IAC5E,8EAA8E;IAC9E,IAAI,MAAM,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;QAC7B,GAAG,CAAC,GAAG,CAAC,IAAI,CACV,EAAE,MAAM,EAAE,EACV,yGAAyG,CAC1G,CAAA;QACD,OAAM;IACR,CAAC;IAED,8EAA8E;IAC9E,2EAA2E;IAC3E,6EAA6E;IAC7E,6CAA6C;IAC7C,IAAI,MAAM,CAAC,OAAO,KAAK,cAAc,EAAE,CAAC;QACtC,GAAG,CAAC,GAAG,CAAC,IAAI,CACV,EAAE,aAAa,EAAE,MAAM,CAAC,OAAO,EAAE,cAAc,EAAE,EACjD,oDAAoD,CACrD,CAAA;QACD,UAAU,CAAC,MAAM,EAAE,CAAC,CAAA;QACpB,OAAM;IACR,CAAC;IAED,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,uCAAuC,CAAC,CAAA;IAElF,IAAI,CAAC;QACH,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAA;QAC3D,MAAM,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;YACxC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,kBAAkB,CAAC,CAAA;QACrD,CAAC,CAAC,CAAA;QAEF,UAAU,CAAC,MAAM,EAAE,CAAC,CAAA;QACpB,2EAA2E;QAC3E,2EAA2E;QAC3E,SAAS;QACT,mBAAmB,CAAC,EAAE,gBAAgB,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAA;QACzD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,kBAAkB,CAAC,CAAA;IAC/D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAChE,sEAAsE;QACtE,6EAA6E;QAC7E,4BAA4B;QAC5B,aAAa,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA;QACtF,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,EAAE,uBAAuB,CAAC,CAAA;IACnF,CAAC;AACH,CAAC"}
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": "3.0.0",
3
- "platformVersion": "0.1.85",
3
+ "platformVersion": "0.1.87",
4
4
  "services": [
5
5
  {
6
6
  "id": "jarvis-config-service",