@justfortytwo/installer 1.0.0-8 → 1.0.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.
@@ -9,7 +9,8 @@
9
9
  import { existsSync, readFileSync } from 'node:fs';
10
10
  import { join } from 'node:path';
11
11
  import { liveRuntime, serviceRunning } from '../runtime.js';
12
- import { defaultDoctorDeps, HEARTBEAT_STALE_MS } from './doctor.js';
12
+ import { defaultDoctorDeps, extensionWiringProblems, readMcpExtensions, HEARTBEAT_STALE_MS } from './doctor.js';
13
+ import { readInstalledVersion, readSelfCompatRanges } from '../engine.js';
13
14
  /** The status lines (pure, for tests). */
14
15
  export function statusLines(i) {
15
16
  const row = (label, value) => `${label.padEnd(11)}${value}`;
@@ -25,6 +26,8 @@ export function statusLines(i) {
25
26
  : hb ? `not running (last heartbeat ${hb.ts})`
26
27
  : 'not running'));
27
28
  lines.push(row('Memory', i.memoryConfigured ? 'configured via MCP (Claude Code starts it on demand)' : 'not configured (run `fortytwo init`)'));
29
+ for (const p of i.extensionProblems ?? [])
30
+ lines.push(row('Warning', p));
28
31
  return lines;
29
32
  }
30
33
  function memoryConfigured(root) {
@@ -46,6 +49,7 @@ export async function runStatus(_argv) {
46
49
  runtime,
47
50
  schedulerHeartbeat: defaultDoctorDeps().schedulerHeartbeat(),
48
51
  memoryConfigured: memoryConfigured(root),
52
+ extensionProblems: extensionWiringProblems(readMcpExtensions(root), (s) => readInstalledVersion(s, root), readSelfCompatRanges()),
49
53
  nowMs: Date.now(),
50
54
  });
51
55
  process.stdout.write(lines.join('\n') + '\n');
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../src/commands/stop.ts"],"names":[],"mappings":"AAWA,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAuBjG"}
1
+ {"version":3,"file":"stop.d.ts","sourceRoot":"","sources":["../../src/commands/stop.ts"],"names":[],"mappings":"AAWA,wBAAsB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,IAAI,GAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAyBjG"}
@@ -1,10 +1,10 @@
1
1
  // stop — stop a `fortytwo start` running for this project.
2
2
  //
3
3
  // Signals ONLY the supervisor recorded in .fortytwo/runtime.json, and only while
4
- // its heartbeat is fresh (see runtime.ts), so a stale file can never hit a
5
- // reused pid. It never searches for or kills processes by name. The supervisor
4
+ // its heartbeat is fresh and OS process identity matches (see runtime.ts).
5
+ // It never searches for or kills processes by name. The supervisor
6
6
  // then stops its own services. Under Docker/systemd prefer their own stop.
7
- import { isPidAlive, liveRuntime } from '../runtime.js';
7
+ import { sameRuntimeProcess, liveRuntime } from '../runtime.js';
8
8
  const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
9
9
  export async function runStop(_argv, opts = {}) {
10
10
  const runtime = liveRuntime(process.cwd());
@@ -13,6 +13,9 @@ export async function runStop(_argv, opts = {}) {
13
13
  return 0;
14
14
  }
15
15
  process.stdout.write(`Stopping fortytwo (pid ${runtime.pid})…\n`);
16
+ // Revalidate the original generation immediately before signalling.
17
+ if (!sameRuntimeProcess(runtime))
18
+ return 0;
16
19
  try {
17
20
  process.kill(runtime.pid, 'SIGTERM');
18
21
  }
@@ -22,7 +25,7 @@ export async function runStop(_argv, opts = {}) {
22
25
  }
23
26
  const deadline = Date.now() + (opts.timeoutMs ?? 20_000);
24
27
  while (Date.now() < deadline) {
25
- if (!isPidAlive(runtime.pid)) {
28
+ if (!sameRuntimeProcess(runtime)) {
26
29
  process.stdout.write('fortytwo stopped.\n');
27
30
  return 0;
28
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/commands/stop.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,EAAE;AACF,iFAAiF;AACjF,2EAA2E;AAC3E,+EAA+E;AAC/E,2EAA2E;AAE3E,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAExD,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAEpE,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,KAAe,EAAE,OAA+B,EAAE;IAC9E,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QACnD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;IAClE,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,OAAO,CAAC,GAAG,KAAM,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC;QAC/F,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,CAAC;IACzD,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;YAC5C,OAAO,CAAC,CAAC;QACX,CAAC;QACD,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,OAAO,CAAC,GAAG,qCAAqC,CAAC,CAAC;IAC9F,OAAO,CAAC,CAAC;AACX,CAAC"}
1
+ {"version":3,"file":"stop.js","sourceRoot":"","sources":["../../src/commands/stop.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,EAAE;AACF,iFAAiF;AACjF,2EAA2E;AAC3E,mEAAmE;AACnE,2EAA2E;AAE3E,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEhE,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAEpE,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,KAAe,EAAE,OAA+B,EAAE;IAC9E,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IAC3C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;QACnD,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,0BAA0B,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC;IAClE,oEAAoE;IACpE,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC;QAAE,OAAO,CAAC,CAAC;IAC3C,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IACvC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,8BAA8B,OAAO,CAAC,GAAG,KAAM,GAAa,CAAC,OAAO,IAAI,CAAC,CAAC;QAC/F,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,MAAM,CAAC,CAAC;IACzD,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;YACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;YAC5C,OAAO,CAAC,CAAC;QACX,CAAC;QACD,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,OAAO,CAAC,GAAG,qCAAqC,CAAC,CAAC;IAC9F,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -1,5 +1,12 @@
1
1
  import { type VersionPin, type InstallState } from '../state.js';
2
2
  import { type CheckResult } from './doctor.js';
3
+ import { type MigrationResult } from '../transcript-migration.js';
4
+ /**
5
+ * Siblings that extend memory: when memory is installed and this CLI declares
6
+ * one the project lacks, update installs it (it is new to the contract, not a
7
+ * sibling the user chose to omit).
8
+ */
9
+ export declare const MEMORY_COMPANIONS: readonly string[];
3
10
  /** Semver precedence (-1 / 0 / 1), pre-release aware (`1.0.0-0 < 1.0.0`). */
4
11
  export declare function compareVersions(a: string, b: string): number;
5
12
  /** Highest version in `versions` that satisfies `range`, or null if none do. */
@@ -11,7 +18,13 @@ export interface InstallResult {
11
18
  detail: string;
12
19
  }
13
20
  export interface UpdateDeps {
21
+ /** Running CLI, not the target project package; optional for embedded callers. */
22
+ runningInstallerVersion?: () => string | null;
23
+ persistInstaller?: (exactSpec: string) => InstallResult;
14
24
  readState: () => InstallState | null;
25
+ runtimeActive?: () => boolean;
26
+ /** Pre-change sanity check (e.g. .mcp.json parses); a message aborts before anything changes. */
27
+ preflight?: () => string | null;
15
28
  installedVersion: (spec: string) => string | null;
16
29
  /** spec -> declared semver range (this CLI's fortytwo.compat). */
17
30
  compatRanges: Record<string, string>;
@@ -26,8 +39,8 @@ export interface UpdateDeps {
26
39
  }>;
27
40
  /** Persist the resolved set, rotating current -> previous. */
28
41
  record: (pins: VersionPin[]) => void;
29
- /** Re-render the persona scaffold (idempotent). */
30
- render: () => void;
42
+ /** Reconcile machine-owned runtime assets; never render persona context. */
43
+ reconcile: () => Promise<void>;
31
44
  out: (s: string) => void;
32
45
  err: (s: string) => void;
33
46
  }
@@ -46,6 +59,12 @@ export declare function performUpdate(deps: UpdateDeps, flags: {
46
59
  dryRun?: boolean;
47
60
  }): Promise<number>;
48
61
  export declare function performRollback(deps: RollbackDeps): Promise<number>;
62
+ /**
63
+ * Post-update reconciliation of machine-owned runtime assets. The memory MCP
64
+ * entry is re-wired FIRST (with the transcript extension when installed), so
65
+ * moving chat out of memory never leaves the agent without transcript search.
66
+ */
67
+ export declare function reconcileRuntime(root: string): Promise<MigrationResult>;
49
68
  /** Published versions of a package via `npm view`; [] if unknown/unreachable. */
50
69
  export declare function fetchPublishedVersions(pkg: string): Promise<string[]>;
51
70
  export declare function runUpdate(argv: string[]): Promise<number>;
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
@@ -3,23 +3,37 @@
3
3
  // Distribution policy: "semver ranges, latest-compatible". There is NO curated
4
4
  // bill-of-materials. update:
5
5
  // 1. RESOLVE latest-in-range for every installed @justfortytwo/* sibling
6
- // (the ranges in this CLI's fortytwo.compat).
6
+ // (the ranges in this CLI's fortytwo.compat), plus any memory companion
7
+ // (transcript) this CLI declares but the project lacks, when memory is
8
+ // installed — otherwise chat would silently stop being recorded.
7
9
  // 2. INSTALL that set (npm).
8
10
  // 3. ROTATE the ledger (state.json: previous := the pre-update set) the moment
9
11
  // the install lands, so rollback always targets the set that was running.
10
12
  // 4. POST-VERIFY with doctor. On failure: leave the new set in place but LOUDLY
11
13
  // point at `fortytwo rollback` — rollback is MANUAL by design (never auto-
12
- // revert, so the user can inspect first). On success: re-render the persona
13
- // scaffold (idempotent) in case a new template version shipped.
14
+ // revert, so the user can inspect first). On success: reconcile machine-owned
15
+ // runtime assets only, then print doctor's view of the reconciled project.
16
+ // Existing context is never re-rendered by update.
14
17
  //
15
18
  // rollback re-installs state.json's `previous` set and rotates the ledger back.
16
19
  // Both share the resolve/install primitives below and are unit-tested through an
17
20
  // injected `*Deps` (so no test touches the network or the real npm).
18
21
  import { spawnSync } from 'node:child_process';
19
- import { recordVersionSet, readState, readIdentity, } from '../state.js';
20
- import { compareSemver, readInstalledVersion, readSelfCompatRanges, satisfiesRange } from '../engine.js';
22
+ import { isPidAlive, liveRuntime } from '../runtime.js';
23
+ import { HEARTBEAT_STALE_MS } from './doctor.js';
24
+ import { recordVersionSet, readState, } from '../state.js';
25
+ import { compareSemver, readInstalledVersion, readSelfCompatRanges, readSelfVersion, satisfiesRange } from '../engine.js';
21
26
  import { runDoctorChecks, defaultDoctorDeps } from './doctor.js';
22
- import { renderPersona } from '../render.js';
27
+ import { reconcileOneiros } from '../oneiros.js';
28
+ import { migrateChatSafely } from '../transcript-migration.js';
29
+ import { readProjectSetting, readMcpJson, writeMcpJson, DEFAULT_DB_PATH, DEFAULT_OLLAMA_BASE_URL, CLI_PACKAGE, cliInstallSpec, TRANSCRIPT_PACKAGE, } from './init.js';
30
+ const MEMORY_PACKAGE = '@justfortytwo/memory';
31
+ /**
32
+ * Siblings that extend memory: when memory is installed and this CLI declares
33
+ * one the project lacks, update installs it (it is new to the contract, not a
34
+ * sibling the user chose to omit).
35
+ */
36
+ export const MEMORY_COMPANIONS = [TRANSCRIPT_PACKAGE];
23
37
  // --- pure: pick the latest published version satisfying a range ---
24
38
  /** Semver precedence (-1 / 0 / 1), pre-release aware (`1.0.0-0 < 1.0.0`). */
25
39
  export function compareVersions(a, b) {
@@ -54,14 +68,52 @@ export async function performUpdate(deps, flags) {
54
68
  deps.err('update: no install found — run `fortytwo init` first.\n');
55
69
  return 2;
56
70
  }
71
+ if (!flags.dryRun && deps.runtimeActive?.()) {
72
+ deps.err('update: stop the running runtime first (`fortytwo stop`, or your service manager), run `fortytwo update`, then `fortytwo start`. No packages or context were changed.\n');
73
+ return 1;
74
+ }
75
+ const blocked = deps.preflight?.();
76
+ if (blocked) {
77
+ deps.err(`update: ${blocked}\nNothing was installed or recorded.\n`);
78
+ return 1;
79
+ }
80
+ if (deps.runningInstallerVersion) {
81
+ const running = deps.runningInstallerVersion();
82
+ const installed = deps.installedVersion(CLI_PACKAGE);
83
+ if (!running || !deps.persistInstaller) {
84
+ deps.err('update: cannot determine or persist the running installer version.\n');
85
+ return 1;
86
+ }
87
+ if (installed && compareVersions(running, installed) < 0) {
88
+ deps.err('update: the project installer is newer than this command. Use the project-local fortytwo update.\n');
89
+ return 1;
90
+ }
91
+ const spec = cliInstallSpec(running, installed);
92
+ if (spec) {
93
+ deps.out(`update: pin project installer to ${spec}${flags.dryRun ? ' (dry-run)' : ''}\n`);
94
+ if (!flags.dryRun) {
95
+ const result = deps.persistInstaller(spec);
96
+ if (!result.ok) {
97
+ deps.err(`update: installer persistence failed (${result.detail}). Retry update before starting services.\n`);
98
+ return 1;
99
+ }
100
+ }
101
+ }
102
+ }
57
103
  // The engine = the declared compat siblings that are CURRENTLY installed. We
58
104
  // upgrade what's there; we don't pull in siblings the user deliberately omitted.
105
+ // Exception: memory companions (transcript) join the set whenever memory is
106
+ // installed, so an update onto a CLI that declares them actually installs them.
107
+ const memoryInstalled = deps.installedVersion(MEMORY_PACKAGE) !== null;
59
108
  const ranges = {};
60
109
  const current = [];
61
110
  for (const [name, range] of Object.entries(deps.compatRanges)) {
62
111
  const resolved = deps.installedVersion(name);
63
- if (resolved === null)
112
+ if (resolved === null) {
113
+ if (memoryInstalled && MEMORY_COMPANIONS.includes(name))
114
+ ranges[name] = range;
64
115
  continue;
116
+ }
65
117
  ranges[name] = range;
66
118
  current.push({ name, range, resolved });
67
119
  }
@@ -73,6 +125,8 @@ export async function performUpdate(deps, flags) {
73
125
  const versionOf = (pins, name) => pins.find((p) => p.name === name)?.resolved;
74
126
  const changed = target.filter((t) => versionOf(current, t.name) !== t.resolved);
75
127
  if (changed.length === 0) {
128
+ if (!flags.dryRun)
129
+ await deps.reconcile();
76
130
  deps.out('update: already at the latest in-range version:\n' +
77
131
  current.map((p) => ` ${p.name}@${p.resolved} (${p.range})`).join('\n') + '\n');
78
132
  return 0;
@@ -80,7 +134,9 @@ export async function performUpdate(deps, flags) {
80
134
  deps.out('update: resolving latest-in-range →\n' +
81
135
  target.map((t) => {
82
136
  const from = versionOf(current, t.name);
83
- return ` ${t.name}: ${from && from !== t.resolved ? `${from} → ${t.resolved}` : `${t.resolved} (unchanged)`}`;
137
+ if (!from)
138
+ return ` ${t.name}: ${t.resolved} (new)`;
139
+ return ` ${t.name}: ${from !== t.resolved ? `${from} → ${t.resolved}` : `${t.resolved} (unchanged)`}`;
84
140
  }).join('\n') + '\n');
85
141
  if (flags.dryRun) {
86
142
  deps.out('update: --dry-run, nothing installed.\n');
@@ -95,14 +151,24 @@ export async function performUpdate(deps, flags) {
95
151
  }
96
152
  // Install landed → rotate the ledger so `previous` = the pre-update set.
97
153
  deps.record(target);
154
+ const failed = '\nupdate: installed, but doctor reports required checks FAILED. Inspect, then run `fortytwo rollback` to restore the previous set.\n';
155
+ const pre = await deps.doctor();
156
+ if (!pre.ok) {
157
+ printChecks(pre.results, deps.out);
158
+ deps.err(failed);
159
+ return 1;
160
+ }
161
+ // Reconcile (re-wire .mcp.json, oneiros, chat migration), then report doctor's
162
+ // view of the RECONCILED project: the pre-reconcile run would still flag the
163
+ // extension wiring that reconcile just fixed.
164
+ await deps.reconcile();
98
165
  const { results, ok } = await deps.doctor();
99
166
  printChecks(results, deps.out);
100
167
  if (!ok) {
101
- deps.err('\nupdate: installed, but doctor reports required checks FAILED. Inspect, then run `fortytwo rollback` to restore the previous set.\n');
168
+ deps.err(failed);
102
169
  return 1;
103
170
  }
104
- deps.render();
105
- deps.out('\nupdate: healthy — engine upgraded.\n');
171
+ deps.out('\nupdate: healthy — engine upgraded. Start services with `fortytwo start` (or your service manager).\n');
106
172
  return 0;
107
173
  }
108
174
  export async function performRollback(deps) {
@@ -129,6 +195,27 @@ export async function performRollback(deps) {
129
195
  return ok ? 0 : 1;
130
196
  }
131
197
  // --- real wiring ---
198
+ /** The Ollama URL the memory server runs with now (its .mcp.json env), else .env, else the default. */
199
+ function currentOllamaBaseUrl(root) {
200
+ const cfg = readMcpJson(root);
201
+ const url = cfg?.mcpServers?.['fortytwo-memory']?.env?.OLLAMA_BASE_URL;
202
+ if (typeof url === 'string' && url.trim())
203
+ return url;
204
+ return readProjectSetting('OLLAMA_BASE_URL', root) ?? DEFAULT_OLLAMA_BASE_URL;
205
+ }
206
+ /**
207
+ * Post-update reconciliation of machine-owned runtime assets. The memory MCP
208
+ * entry is re-wired FIRST (with the transcript extension when installed), so
209
+ * moving chat out of memory never leaves the agent without transcript search.
210
+ */
211
+ export async function reconcileRuntime(root) {
212
+ const dbPath = readProjectSetting('DB_PATH', root) ?? DEFAULT_DB_PATH;
213
+ writeMcpJson(root, dbPath, currentOllamaBaseUrl(root));
214
+ await reconcileOneiros(root, dbPath);
215
+ // A failed migration (malformed row, SQLITE_BUSY) is reported, never fatal:
216
+ // memory stays intact and a later init/update retries it.
217
+ return migrateChatSafely(root, dbPath);
218
+ }
132
219
  /** Published versions of a package via `npm view`; [] if unknown/unreachable. */
133
220
  export function fetchPublishedVersions(pkg) {
134
221
  return Promise.resolve().then(() => {
@@ -144,8 +231,8 @@ export function fetchPublishedVersions(pkg) {
144
231
  }
145
232
  });
146
233
  }
147
- function npmInstall(specs, root) {
148
- const res = spawnSync('npm', ['install', '--no-audit', '--no-fund', ...specs], { cwd: root, stdio: 'inherit' });
234
+ function npmInstall(specs, root, flags = []) {
235
+ const res = spawnSync('npm', ['install', '--no-audit', '--no-fund', ...flags, ...specs], { cwd: root, stdio: 'inherit' });
149
236
  if (res.status === 0)
150
237
  return { ok: true, detail: 'ok' };
151
238
  return { ok: false, detail: res.error ? res.error.message : `npm exited ${res.status}` };
@@ -156,15 +243,37 @@ function parseUpdateArgs(argv) {
156
243
  export async function runUpdate(argv) {
157
244
  const root = process.cwd();
158
245
  const deps = {
246
+ runningInstallerVersion: readSelfVersion,
247
+ persistInstaller: (spec) => npmInstall([spec], root, ['--save-exact']),
159
248
  readState: () => readState(root),
249
+ preflight: () => {
250
+ try {
251
+ readMcpJson(root);
252
+ return null;
253
+ }
254
+ catch (err) {
255
+ return err.message;
256
+ }
257
+ },
258
+ runtimeActive: () => {
259
+ if (liveRuntime(root))
260
+ return true;
261
+ const heartbeat = defaultDoctorDeps().schedulerHeartbeat();
262
+ return !!heartbeat && Date.now() - Date.parse(heartbeat.ts) <= HEARTBEAT_STALE_MS && isPidAlive(heartbeat.pid);
263
+ },
160
264
  installedVersion: readInstalledVersion,
161
265
  compatRanges: readSelfCompatRanges(),
162
266
  fetchVersions: fetchPublishedVersions,
163
267
  install: (specs) => npmInstall(specs, root),
164
268
  doctor: () => runDoctorChecks(defaultDoctorDeps()),
165
269
  record: (pins) => { recordVersionSet(pins, root); },
166
- render: () => { const id = readIdentity(root); if (id)
167
- renderPersona(id, { root }); },
270
+ reconcile: async () => {
271
+ const { moved, error } = await reconcileRuntime(root);
272
+ if (moved > 0)
273
+ process.stdout.write(`update: moved ${moved} chat row(s) from memory to the transcript\n`);
274
+ if (error)
275
+ process.stderr.write(`update: chat migration skipped: ${error} (memory left intact; fix the cause and re-run \`fortytwo update\`)\n`);
276
+ },
168
277
  out: (s) => process.stdout.write(s),
169
278
  err: (s) => process.stderr.write(s),
170
279
  };
@@ -1 +1 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/commands/update.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function reconcileOneiros(root: string, dbPath: string): Promise<void>;
2
+ //# sourceMappingURL=oneiros.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oneiros.d.ts","sourceRoot":"","sources":["../src/oneiros.ts"],"names":[],"mappings":"AAgBA,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAelF"}
@@ -0,0 +1,28 @@
1
+ // Additive runtime reconciliation: never renders or writes owner context.
2
+ import { mkdirSync } from 'node:fs';
3
+ import { dirname, resolve } from 'node:path';
4
+ import { findSiblingDir, loadSibling } from './engine.js';
5
+ export async function reconcileOneiros(root, dbPath) {
6
+ // Respect intentionally partial installs. Installed-but-broken packages fail loud.
7
+ const specs = ['@justfortytwo/persona', '@justfortytwo/memory', '@justfortytwo/scheduler'];
8
+ if (specs.some(s => !findSiblingDir(s, root)))
9
+ return;
10
+ const persona = await loadSibling(specs[0], root);
11
+ const memory = await loadSibling(specs[1], root);
12
+ const scheduler = await loadSibling(specs[2], root);
13
+ if (!persona?.initialize || !memory?.memoryHead || !scheduler?.seedOneiros)
14
+ throw new Error('Oneiros requires compatible persona, memory and scheduler packages');
15
+ const path = resolve(root, dbPath);
16
+ mkdirSync(dirname(path), { recursive: true });
17
+ const h = memory.openDb(path);
18
+ try {
19
+ await memory.runMigrations(h.k);
20
+ persona.initialize(root, memory.memoryHead(h));
21
+ scheduler.seedOneiros(h, new Date().toISOString(), scheduler.recurrenceNext);
22
+ }
23
+ finally {
24
+ await h.k.destroy();
25
+ h.raw.close();
26
+ }
27
+ }
28
+ //# sourceMappingURL=oneiros.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oneiros.js","sourceRoot":"","sources":["../src/oneiros.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAa1D,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY,EAAE,MAAc;IACjE,mFAAmF;IACnF,MAAM,KAAK,GAAG,CAAC,uBAAuB,EAAE,sBAAsB,EAAE,yBAAyB,CAAC,CAAC;IAC3F,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,EAAC,IAAI,CAAC,CAAC;QAAE,OAAO;IACrD,MAAM,OAAO,GAAG,MAAM,WAAW,CAAU,KAAK,CAAC,CAAC,CAAE,EAAC,IAAI,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,MAAM,WAAW,CAAS,KAAK,CAAC,CAAC,CAAE,EAAC,IAAI,CAAC,CAAC;IACzD,MAAM,SAAS,GAAG,MAAM,WAAW,CAAY,KAAK,CAAC,CAAC,CAAE,EAAC,IAAI,CAAC,CAAC;IAC/D,IAAI,CAAC,OAAO,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,UAAU,IAAI,CAAC,SAAS,EAAE,WAAW;QAAE,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAC;IAClK,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,EAAC,MAAM,CAAC,CAAC;IAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAC,EAAC,SAAS,EAAC,IAAI,EAAC,CAAC,CAAC;IAC7E,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC,OAAO,CAAC,UAAU,CAAC,IAAI,EAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,SAAS,CAAC,WAAW,CAAC,CAAC,EAAC,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAC,SAAS,CAAC,cAAc,CAAC,CAAC;IAC7E,CAAC;YAAS,CAAC;QAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;QAAC,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;IAAC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** null means identity cannot be established; never fall back to PID existence. */
2
+ export declare function readProcessIdentity(pid: number, platform?: NodeJS.Platform): string | null;
3
+ //# sourceMappingURL=process-identity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-identity.d.ts","sourceRoot":"","sources":["../src/process-identity.ts"],"names":[],"mappings":"AAIA,mFAAmF;AACnF,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAM,CAAC,QAA2B,GAAG,MAAM,GAAG,IAAI,CA6B5G"}
@@ -0,0 +1,42 @@
1
+ // OS process generation identity, independent of the project's heartbeat.
2
+ import { readFileSync, readlinkSync } from 'node:fs';
3
+ import { spawnSync } from 'node:child_process';
4
+ /** null means identity cannot be established; never fall back to PID existence. */
5
+ export function readProcessIdentity(pid, platform = process.platform) {
6
+ if (!Number.isSafeInteger(pid) || pid <= 0)
7
+ return null;
8
+ try {
9
+ if (platform === 'linux') {
10
+ const stat = readFileSync(`/proc/${pid}/stat`, 'utf8');
11
+ // comm (field 2) is parenthesized, but may itself contain ')' or whitespace.
12
+ const end = stat.lastIndexOf(')');
13
+ if (!stat.startsWith(`${pid} (`) || end < 0)
14
+ return null;
15
+ const fields = stat.slice(end + 1).trim().split(/\s+/);
16
+ const start = fields[19]; // fields[0] is state (field 3); starttime is field 22
17
+ if (!start || !/^\d+$/.test(start) || ['Z', 'X', 'x'].includes(fields[0] ?? ''))
18
+ return null;
19
+ const boot = readFileSync('/proc/sys/kernel/random/boot_id', 'utf8').trim();
20
+ const namespace = readlinkSync(`/proc/${pid}/ns/pid`);
21
+ if (!boot || !/^pid:\[\d+\]$/.test(namespace))
22
+ return null;
23
+ return `linux:${boot}:${namespace}:${start}`;
24
+ }
25
+ // BSD/macOS ps exposes an OS-derived start time (second resolution).
26
+ // Fix locale/timezone so callers with different environments compare equally.
27
+ const result = spawnSync('ps', ['-p', String(pid), '-o', 'lstart='], {
28
+ encoding: 'utf8', timeout: 2000, env: { ...process.env, LC_ALL: 'C', TZ: 'UTC' },
29
+ stdio: ['ignore', 'pipe', 'ignore'],
30
+ });
31
+ if (result.error || result.status !== 0)
32
+ return null;
33
+ const start = result.stdout.trim().replace(/\s+/g, ' ');
34
+ if (!/^[A-Z][a-z]{2} [A-Z][a-z]{2} \d{1,2} \d{2}:\d{2}:\d{2} \d{4}$/.test(start))
35
+ return null;
36
+ return `ps:${platform}:${start}`;
37
+ }
38
+ catch {
39
+ return null;
40
+ }
41
+ }
42
+ //# sourceMappingURL=process-identity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-identity.js","sourceRoot":"","sources":["../src/process-identity.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAE/C,mFAAmF;AACnF,MAAM,UAAU,mBAAmB,CAAC,GAAW,EAAE,WAA4B,OAAO,CAAC,QAAQ;IAC3F,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACxD,IAAI,CAAC;QACH,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,YAAY,CAAC,SAAS,GAAG,OAAO,EAAE,MAAM,CAAC,CAAC;YACvD,6EAA6E;YAC7E,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YAClC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;YACzD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACvD,MAAM,KAAK,GAAG,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,sDAAsD;YAChF,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC7F,MAAM,IAAI,GAAG,YAAY,CAAC,iCAAiC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YAC5E,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,GAAG,SAAS,CAAC,CAAC;YACtD,IAAI,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,CAAC;gBAAE,OAAO,IAAI,CAAC;YAC3D,OAAO,SAAS,IAAI,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;QAC/C,CAAC;QACD,qEAAqE;QACrE,8EAA8E;QAC9E,MAAM,MAAM,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,EAAE;YACnE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE;YAChF,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC;SACpC,CAAC,CAAC;QACH,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACrD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QACxD,IAAI,CAAC,+DAA+D,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAC9F,OAAO,MAAM,QAAQ,IAAI,KAAK,EAAE,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
package/dist/runtime.d.ts CHANGED
@@ -33,6 +33,8 @@ export declare function planServices(root: string, env: NodeJS.ProcessEnv, specs
33
33
  export interface RuntimeState {
34
34
  /** The `fortytwo start` supervisor process. */
35
35
  pid: number;
36
+ /** OS process generation; absent in legacy records, which are not trusted. */
37
+ processIdentity?: string;
36
38
  startedAt: string;
37
39
  /** Refreshed every few seconds while the supervisor is alive. */
38
40
  heartbeatAt: string;
@@ -48,7 +50,9 @@ export declare const RUNTIME_STALE_MS = 30000;
48
50
  export declare function runtimeStatePath(root: string): string;
49
51
  export declare function readRuntimeState(root: string): RuntimeState | null;
50
52
  export declare function isPidAlive(pid: number): boolean;
51
- /** The running supervisor's state, or null if none: no file, stale heartbeat, or dead pid. */
53
+ /** Match a recorded process generation, including when waiting for shutdown. */
54
+ export declare function sameRuntimeProcess(state: RuntimeState, alive?: (pid: number) => boolean, identity?: (pid: number) => string | null): boolean;
55
+ /** A live supervisor requires a fresh heartbeat AND the same OS process. */
52
56
  export declare function liveRuntime(root: string, nowMs?: number, alive?: (pid: number) => boolean): RuntimeState | null;
53
57
  /** True when a live `fortytwo start` is currently running the named service. */
54
58
  export declare function serviceRunning(state: RuntimeState | null, name: string): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAKhD,6DAA6D;AAC7D,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,0CAA0C;IAC1C,GAAG,EAAE,MAAM,CAAC;IACZ,gEAAgE;IAChE,GAAG,EAAE,MAAM,CAAC;IACZ,kFAAkF;IAClF,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,eAAO,MAAM,QAAQ,EAAE,WAAW,EAGjC,CAAC;AAEF,MAAM,WAAW,cAAc;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AAChE,MAAM,WAAW,cAAc;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AAEhE;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,UAAU,EAAE,MAAM,CAAC,UAAU,EAC7B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,IAAI,EAAE,MAAM,GACX,MAAM,CAAC,UAAU,CAKnB;AAED,0GAA0G;AAC1G,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,CAAC,UAAU,EACtB,KAAK,GAAE,WAAW,EAAa,GAC9B;IAAE,GAAG,EAAE,cAAc,EAAE,CAAC;IAAC,OAAO,EAAE,cAAc,EAAE,CAAA;CAAE,CAsBtD;AAID,MAAM,WAAW,YAAY;IAC3B,+CAA+C;IAC/C,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,KAAK,EAAE,SAAS,GAAG,QAAQ,CAAA;KAAE,EAAE,CAAC;IAC9E,OAAO,EAAE,cAAc,EAAE,CAAC;CAC3B;AAED,yFAAyF;AACzF,eAAO,MAAM,gBAAgB,QAAS,CAAC;AAEvC,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAMlE;AAUD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAO/C;AAED,8FAA8F;AAC9F,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,KAAK,GAAE,MAAmB,EAC1B,KAAK,GAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAoB,GAC3C,YAAY,GAAG,IAAI,CAMrB;AAED,gFAAgF;AAChF,wBAAgB,cAAc,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAEhF;AAID,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,OAAO,CAAC,EAAE,cAAc,EAAE,CAAC;IAC3B,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,8EAA8E;IAC9E,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,kEAAkE;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uCAAuC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,cAAc,EAAE,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,CAAC,CAsF7F"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"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"}