@getrift/rift 0.1.0-beta.19 → 0.1.0-beta.20

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.
Files changed (30) hide show
  1. package/dist/src/cli/commands/status.d.ts.map +1 -1
  2. package/dist/src/cli/commands/status.js +38 -2
  3. package/dist/src/cli/commands/status.js.map +1 -1
  4. package/dist/src/cli/commands/update.d.ts +56 -5
  5. package/dist/src/cli/commands/update.d.ts.map +1 -1
  6. package/dist/src/cli/commands/update.js +250 -21
  7. package/dist/src/cli/commands/update.js.map +1 -1
  8. package/dist/src/cli/http-client.d.ts +25 -1
  9. package/dist/src/cli/http-client.d.ts.map +1 -1
  10. package/dist/src/cli/http-client.js +82 -0
  11. package/dist/src/cli/http-client.js.map +1 -1
  12. package/dist/src/cli/status/friend-header.d.ts.map +1 -1
  13. package/dist/src/cli/status/friend-header.js +3 -0
  14. package/dist/src/cli/status/friend-header.js.map +1 -1
  15. package/dist/src/diagnostics/codex-preflight.d.ts +1 -1
  16. package/dist/src/diagnostics/codex-preflight.d.ts.map +1 -1
  17. package/dist/src/diagnostics/codex-preflight.js +12 -0
  18. package/dist/src/diagnostics/codex-preflight.js.map +1 -1
  19. package/dist/src/diagnostics/doctor.d.ts.map +1 -1
  20. package/dist/src/diagnostics/doctor.js +2 -0
  21. package/dist/src/diagnostics/doctor.js.map +1 -1
  22. package/dist/src/observability/tool-usage-stats.d.ts.map +1 -1
  23. package/dist/src/observability/tool-usage-stats.js +14 -1
  24. package/dist/src/observability/tool-usage-stats.js.map +1 -1
  25. package/dist/src/providers/codex-cli-runner.d.ts.map +1 -1
  26. package/dist/src/providers/codex-cli-runner.js +43 -4
  27. package/dist/src/providers/codex-cli-runner.js.map +1 -1
  28. package/operator/swiftbar/render-menu.py +61 -18
  29. package/operator/swiftbar/rift.10s.sh +52 -28
  30. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,wBAAgB,iBAAiB,IAAI,OAAO,CA4F3C"}
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAcpC,wBAAgB,iBAAiB,IAAI,OAAO,CA6H3C"}
@@ -13,7 +13,7 @@
13
13
  * header still prints (with an "unreachable" line) and the map is omitted.
14
14
  */
15
15
  import { Command } from "commander";
16
- import { createHttpClient, probeDefaultDaemonHealth, readToken, resolveBaseUrl, CliError, } from "../http-client.js";
16
+ import { createHttpClient, probeDefaultDaemonHealth, readToken, resolveBaseUrl, resolveBaseUrlLenient, CliError, } from "../http-client.js";
17
17
  import { printError, printJson, printText } from "../output.js";
18
18
  import { renderFriendHeader } from "../status/friend-header.js";
19
19
  import { readLocalSignals } from "../status/local-signals.js";
@@ -31,6 +31,11 @@ export function makeStatusCommand() {
31
31
  // resolveBaseUrl can't load a config; render a no-config-yet
32
32
  // header instead of erroring out.
33
33
  let baseUrl;
34
+ // When set, the config is newer than this CLI (an unknown top-level
35
+ // key like `codex_cli` from a later beta). We still render status —
36
+ // diagnostics must not die on a forward-compatible config — but we
37
+ // surface this line so the friend knows to update their CLI.
38
+ let staleCliNote = null;
34
39
  try {
35
40
  baseUrl = resolveBaseUrl(globalOpts.config);
36
41
  }
@@ -39,7 +44,33 @@ export function makeStatusCommand() {
39
44
  await renderNoConfigStatus(globalOpts.json, globalOpts.config);
40
45
  return;
41
46
  }
42
- throw err;
47
+ // Per A-2.3a: status is the diagnostic command and must stay useful
48
+ // when an OLDER CLI meets a NEWER config. Strict Zod parsing fails
49
+ // closed on an unrecognized top-level key, but for status we only
50
+ // need the daemon's host/port — read those leniently and keep going.
51
+ // This does NOT weaken validation for daemon startup or write paths.
52
+ //
53
+ // Crucially, only a FORWARD-COMPAT failure (code "config_too_new":
54
+ // the config carries keys this CLI doesn't know) earns this path. A
55
+ // genuinely broken config (code "invalid": a known field with a bad
56
+ // value) must still surface as "config invalid" — otherwise status
57
+ // would tell the friend "your CLI is older than your config" when
58
+ // the real problem is a typo in their config. That diagnostic lie is
59
+ // exactly the failure mode this whole fix exists to kill.
60
+ if (err instanceof CliError && err.code === "config_too_new") {
61
+ const lenient = resolveBaseUrlLenient(globalOpts.config);
62
+ if (lenient) {
63
+ baseUrl = lenient;
64
+ staleCliNote =
65
+ "Your Rift CLI is older than your config. Update with: rift update (or npm install -g @getrift/rift@beta).";
66
+ }
67
+ else {
68
+ throw err;
69
+ }
70
+ }
71
+ else {
72
+ throw err;
73
+ }
43
74
  }
44
75
  const token = await readToken();
45
76
  if (!token) {
@@ -72,6 +103,9 @@ export function makeStatusCommand() {
72
103
  header: headerLines.join("\n"),
73
104
  friend,
74
105
  capability_map: capabilityMap,
106
+ // Present only when an older CLI read a newer config; consumers
107
+ // (menu bar) can surface the "update your CLI" nudge.
108
+ stale_cli: staleCliNote,
75
109
  // Structured client-connection list for non-human consumers
76
110
  // (the menu bar). The human header already folds this in;
77
111
  // exposing it here keeps `rift status` the single source of
@@ -86,6 +120,8 @@ export function makeStatusCommand() {
86
120
  }
87
121
  for (const line of headerLines)
88
122
  printText(line);
123
+ if (staleCliNote)
124
+ printText(`Heads up: ${staleCliNote}`);
89
125
  if (opts.tools && capabilityMap) {
90
126
  printText("");
91
127
  printText(capabilityMap);
@@ -1 +1 @@
1
- {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,46 @@
1
1
  import { Command } from "commander";
2
2
  import { kickstartDaemon, waitForHealth } from "../../onboarding/daemon-control.js";
3
3
  import { installMenuBar } from "./menubar.js";
4
+ /**
5
+ * Where the `rift` the friend's shell actually runs lives, and what version
6
+ * it reports. Resolved by running the binary on PATH — never by trusting the
7
+ * currently-executing process, which is still the OLD build mid-update.
8
+ */
9
+ export interface ActiveCliLocation {
10
+ /** Absolute path of `rift` resolved on PATH (e.g. /opt/homebrew/bin/rift), or null. */
11
+ binPath: string | null;
12
+ /** Install prefix owning that binary (parent of its bin dir), or null. */
13
+ prefix: string | null;
14
+ }
4
15
  export interface UpdateRunner {
5
16
  /**
6
- * Run `npm install -g <spec>`. Returns the exit code so the command
7
- * can decide whether to retry with sudo. stderr/stdout pass through
8
- * to the friend's terminal so progress is visible.
17
+ * Run `npm install -g <spec>`, optionally pinned to a global `--prefix`.
18
+ * Returns the exit code so the command can decide whether to retry with
19
+ * sudo. stderr/stdout pass through to the friend's terminal so progress
20
+ * is visible. When `prefix` is provided we install into that prefix so
21
+ * the copy on the friend's PATH is the copy that gets upgraded.
9
22
  */
10
- runNpmInstall: (spec: string, useSudo: boolean) => Promise<number>;
23
+ runNpmInstall: (spec: string, useSudo: boolean, prefix?: string | null) => Promise<number>;
24
+ /**
25
+ * Resolve where the `rift` on PATH lives (before install) so we can target
26
+ * its prefix and later diagnose a prefix mismatch.
27
+ */
28
+ resolveActiveCli: () => Promise<ActiveCliLocation>;
29
+ /**
30
+ * Version the `rift` on PATH reports right now (`rift --version`). Called
31
+ * AFTER install to confirm the upgrade actually took. null if it can't run.
32
+ */
33
+ getActiveCliVersion: () => Promise<string | null>;
34
+ /**
35
+ * Expected version: `npm view @getrift/rift@beta version`. null on probe
36
+ * failure (offline / registry hiccup). A null expected version FAILS
37
+ * verification as `unverified` — we cannot prove the install landed, so we
38
+ * never claim success. (This is the invariant that keeps `rift update` from
39
+ * lying; see `evaluateUpgrade`.)
40
+ */
41
+ getExpectedVersion: () => Promise<string | null>;
42
+ /** npm's own global prefix (`npm prefix -g`) — where a bare `-g` install lands. */
43
+ getNpmGlobalPrefix: () => Promise<string | null>;
11
44
  /** Kickstart the daemon. Defaults to the launchctl helper. */
12
45
  kickstart: typeof kickstartDaemon;
13
46
  /** Poll /health. Defaults to the onboarding helper. */
@@ -18,7 +51,7 @@ export interface UpdateRunner {
18
51
  export declare function makeUpdateCommand(): Command;
19
52
  export interface UpdateResult {
20
53
  ok: boolean;
21
- step?: "npm" | "kickstart" | "health";
54
+ step?: "npm" | "verify" | "kickstart" | "health";
22
55
  transcript: string[];
23
56
  }
24
57
  /**
@@ -26,4 +59,22 @@ export interface UpdateResult {
26
59
  * always returns — exit-code mapping is the caller's job.
27
60
  */
28
61
  export declare function runUpdate(runner: UpdateRunner): Promise<UpdateResult>;
62
+ type UpgradeFailure = "no_binary" | "unverified" | "mismatch";
63
+ /**
64
+ * Decide whether the active CLI actually upgraded. The contract is strict and
65
+ * biased toward honesty — "could not confirm" is a FAILURE, never a pass:
66
+ * - no active version at all → the binary is broken (`no_binary`).
67
+ * - no expected version → we couldn't reach the registry to learn the latest
68
+ * beta, so we cannot claim the update landed (`unverified`). This is the
69
+ * deliberate fix for "couldn't verify" silently becoming "updated".
70
+ * - active != expected → still the old (or wrong) build (`mismatch`).
71
+ * Only an active version that equals a freshly-resolved expected version is OK.
72
+ */
73
+ export declare function evaluateUpgrade(expected: string | null, activeVersion: string | null): {
74
+ ok: true;
75
+ } | {
76
+ ok: false;
77
+ reason: UpgradeFailure;
78
+ };
79
+ export {};
29
80
  //# sourceMappingURL=update.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/update.ts"],"names":[],"mappings":"AAkCA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,eAAe,EACf,aAAa,EACd,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAO9C,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,aAAa,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACnE,8DAA8D;IAC9D,SAAS,EAAE,OAAO,eAAe,CAAC;IAClC,uDAAuD;IACvD,aAAa,EAAE,OAAO,aAAa,CAAC;IACpC,kFAAkF;IAClF,cAAc,EAAE,OAAO,cAAc,CAAC;CACvC;AASD,wBAAgB,iBAAiB,IAAI,OAAO,CAa3C;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,KAAK,GAAG,WAAW,GAAG,QAAQ,CAAC;IACtC,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAsE3E"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/update.ts"],"names":[],"mappings":"AAyDA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,eAAe,EACf,aAAa,EACd,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAS9C;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC,uFAAuF;IACvF,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,0EAA0E;IAC1E,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B;;;;;;OAMG;IACH,aAAa,EAAE,CACb,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,OAAO,EAChB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,KACnB,OAAO,CAAC,MAAM,CAAC,CAAC;IACrB;;;OAGG;IACH,gBAAgB,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACnD;;;OAGG;IACH,mBAAmB,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAClD;;;;;;OAMG;IACH,kBAAkB,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACjD,mFAAmF;IACnF,kBAAkB,EAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACjD,8DAA8D;IAC9D,SAAS,EAAE,OAAO,eAAe,CAAC;IAClC,uDAAuD;IACvD,aAAa,EAAE,OAAO,aAAa,CAAC;IACpC,kFAAkF;IAClF,cAAc,EAAE,OAAO,cAAc,CAAC;CACvC;AAaD,wBAAgB,iBAAiB,IAAI,OAAO,CAa3C;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;IACjD,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAmH3E;AAED,KAAK,cAAc,GAAG,WAAW,GAAG,YAAY,GAAG,UAAU,CAAC;AAE9D;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,aAAa,EAAE,MAAM,GAAG,IAAI,GAC3B;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,cAAc,CAAA;CAAE,CAKtD"}
@@ -2,22 +2,44 @@
2
2
  * `rift update` — friend-readable in-place upgrade for the npm-installed CLI.
3
3
  *
4
4
  * Steps (in order, each one printed):
5
- * 1. `npm install -g @getrift/rift@beta` pulls the latest beta tag.
6
- * Falls back to `sudo npm install -g …` exactly like scripts/install.sh
7
- * does, so friends who installed via the one-liner without nvm don't
8
- * hit a permission wall.
9
- * 2. `launchctl kickstart -k gui/$UID/com.getrift.daemon` restarts the
5
+ * 1. Resolve the target version with FRESH registry metadata
6
+ * (`npm view --prefer-online @getrift/rift@beta version`), then
7
+ * `npm install -g --prefer-online @getrift/rift@<that exact version>`.
8
+ * Pinning the exact version (not the `@beta` tag) plus `--prefer-online`
9
+ * removes the two ways an install can be a silent no-op: a stale local
10
+ * cache resolving the tag to the already-installed version, and the
11
+ * verify step later reading that same stale cache so a no-op "matches"
12
+ * itself. Falls back to `sudo npm install -g …` exactly like
13
+ * scripts/install.sh, so friends who installed via the one-liner without
14
+ * nvm don't hit a permission wall. When we can resolve where the `rift`
15
+ * on the friend's PATH lives, we install into THAT prefix (`--prefix`)
16
+ * so the copy their terminal runs is the copy that gets upgraded.
17
+ * 2. VERIFY: run the `rift` on PATH and confirm its version now equals the
18
+ * freshly-resolved expected version. An exit-0 npm install is NOT proof
19
+ * of an upgrade — npm can install into a different prefix than the binary
20
+ * on PATH. And if we could not reach the registry to learn the expected
21
+ * version at all, we FAIL as "could not verify" rather than passing on
22
+ * "installed something". We refuse to report success until the active
23
+ * version provably equals a freshly-resolved expected version. This is
24
+ * the load-bearing fix for the beta.18→beta.19 silent no-op that shipped
25
+ * a CLI too old to read its own (valid) config.
26
+ * 3. `launchctl kickstart -k gui/$UID/com.getrift.daemon` — restarts the
10
27
  * daemon so it picks up the new code on disk.
11
- * 3. Poll `/health` until 200 (or timeout) — proves the new build can
28
+ * 4. Poll `/health` until 200 (or timeout) — proves the new build can
12
29
  * actually start.
13
- * 4. Refresh the SwiftBar menu plugin — keeps the 10-second menu surface
30
+ * 5. Refresh the SwiftBar menu plugin — keeps the 10-second menu surface
14
31
  * on the same packaged scripts as the just-installed CLI.
15
32
  *
16
33
  * Failure contract:
17
34
  * - npm install failure (step 1): the previous install is left in place.
18
35
  * `npm install -g` with the same dist-tag is atomic enough here — npm
19
36
  * replaces `bin/rift` only after a successful tarball install.
20
- * - Kickstart or /health failure (steps 2–3): the new package is already
37
+ * - Verification failure (step 2): npm reported success but the `rift` on
38
+ * PATH is still the old version. The transcript names both versions and
39
+ * all the paths, leads with a plain-English headline ("Rift updated one
40
+ * copy, but your terminal still points at another copy."), and prints the
41
+ * exact command to install into the right prefix.
42
+ * - Kickstart or /health failure (steps 3–4): the new package is already
21
43
  * installed on disk; only daemon recovery is needed. The transcript
22
44
  * says so explicitly and points at the manual recovery action.
23
45
  * In every branch the output is a friend-readable error pointing at the
@@ -31,16 +53,23 @@
31
53
  * loop (see src/observability/version-check.ts); this command does
32
54
  * not write to that snapshot.
33
55
  */
34
- import { spawn } from "node:child_process";
56
+ import { spawn, execFile } from "node:child_process";
57
+ import path from "node:path";
35
58
  import { Command } from "commander";
36
59
  import { kickstartDaemon, waitForHealth, } from "../../onboarding/daemon-control.js";
37
60
  import { installMenuBar } from "./menubar.js";
38
61
  import { printJson, printText } from "../output.js";
62
+ const RIFT_PACKAGE_NAME = "@getrift/rift";
39
63
  const RIFT_PACKAGE_SPEC = "@getrift/rift@beta";
64
+ const RIFT_BETA_TAG = "@getrift/rift@beta";
40
65
  const DAEMON_BASE_URL = "http://127.0.0.1:3577";
41
66
  const HEALTH_TIMEOUT_MS = 30_000;
42
67
  const defaultRunner = {
43
68
  runNpmInstall: defaultNpmInstall,
69
+ resolveActiveCli: defaultResolveActiveCli,
70
+ getActiveCliVersion: defaultGetActiveCliVersion,
71
+ getExpectedVersion: defaultGetExpectedVersion,
72
+ getNpmGlobalPrefix: defaultGetNpmGlobalPrefix,
44
73
  kickstart: kickstartDaemon,
45
74
  waitForHealth,
46
75
  installMenuBar,
@@ -71,26 +100,67 @@ export async function runUpdate(runner) {
71
100
  const say = (line) => {
72
101
  transcript.push(line);
73
102
  };
74
- // --- Step 1: npm install ---
75
- say(`==> Installing ${RIFT_PACKAGE_SPEC} via npm`);
76
- let npmCode = await runner.runNpmInstall(RIFT_PACKAGE_SPEC, false);
103
+ // --- Step 1a: resolve the target version with FRESH registry metadata ---
104
+ // Resolve the expected version BEFORE installing, and force a registry
105
+ // round-trip (`npm view --prefer-online`). This is load-bearing: if both
106
+ // `npm install @beta` and the verification's `npm view @beta` read the same
107
+ // stale local cache, the tag can resolve to the version already installed —
108
+ // a no-op that then "verifies" against itself (beta.18 == beta.18) and the
109
+ // command lies. Pinning to the freshly-resolved EXACT version below removes
110
+ // the tag indirection from the install entirely.
111
+ const active = await runner.resolveActiveCli();
112
+ const installPrefix = active.prefix;
113
+ const expected = await runner.getExpectedVersion();
114
+ // --- Step 1b: npm install ---
115
+ // Install the exact pinned version when we know it (so a stale-cached tag
116
+ // can't redirect us), falling back to the @beta tag only when the registry
117
+ // probe failed. Install into the prefix that owns the `rift` on PATH so the
118
+ // copy the friend's shell runs is the copy that gets upgraded; when we can't
119
+ // resolve it, fall back to npm's choice and let verify (Step 2) catch a split.
120
+ const installSpec = expected ? `${RIFT_PACKAGE_NAME}@${expected}` : RIFT_PACKAGE_SPEC;
121
+ say(`==> Installing ${installSpec} via npm` +
122
+ (installPrefix ? ` (into ${installPrefix})` : ""));
123
+ let npmCode = await runner.runNpmInstall(installSpec, false, installPrefix);
77
124
  if (npmCode !== 0) {
78
125
  // npm exits non-zero on a permission denied error; mirror install.sh
79
126
  // and retry under sudo so a non-nvm user on a system Node doesn't get
80
127
  // stuck. The sudo prompt itself surfaces inline in the friend's
81
128
  // terminal — we don't try to suppress it.
82
129
  say(" npm install failed without sudo — retrying with sudo");
83
- npmCode = await runner.runNpmInstall(RIFT_PACKAGE_SPEC, true);
130
+ npmCode = await runner.runNpmInstall(installSpec, true, installPrefix);
84
131
  }
85
132
  if (npmCode !== 0) {
86
133
  say("");
87
134
  say("Update failed at step 1 (npm install).");
88
135
  say("Your existing Rift install is unchanged.");
89
- say(`Try manually: npm install -g ${RIFT_PACKAGE_SPEC}`);
136
+ say(`Try manually: npm install -g --prefer-online ${RIFT_PACKAGE_SPEC}`);
90
137
  return { ok: false, step: "npm", transcript };
91
138
  }
92
139
  say(" npm install completed.");
93
- // --- Step 2: kickstart daemon ---
140
+ // --- Step 2: verify the active CLI actually upgraded ---
141
+ // An exit-0 npm install is NOT proof. npm can install into a different
142
+ // prefix than the binary on PATH, or (when we fell back to the tag) resolve
143
+ // `@beta` to the version already installed. In both cases the friend's shell
144
+ // still runs the old build. Refuse to claim success until the `rift` on PATH
145
+ // reports the expected version — and if we never resolved the expected
146
+ // version, say so honestly rather than passing on "installed something".
147
+ say("==> Verifying the rift on your PATH is up to date");
148
+ const activeVersion = await runner.getActiveCliVersion();
149
+ const verdict = evaluateUpgrade(expected, activeVersion);
150
+ if (!verdict.ok) {
151
+ const npmPrefix = await runner.getNpmGlobalPrefix();
152
+ appendVerifyDiagnosis(say, {
153
+ expected,
154
+ activeVersion,
155
+ active,
156
+ installPrefix,
157
+ npmPrefix,
158
+ reason: verdict.reason,
159
+ });
160
+ return { ok: false, step: "verify", transcript };
161
+ }
162
+ say(` Active rift is ${activeVersion} (matches the published @beta).`);
163
+ // --- Step 3: kickstart daemon ---
94
164
  say("==> Restarting the Rift daemon");
95
165
  const kick = await runner.kickstart();
96
166
  if (kick.status !== "ok") {
@@ -102,7 +172,7 @@ export async function runUpdate(runner) {
102
172
  return { ok: false, step: "kickstart", transcript };
103
173
  }
104
174
  say(" Daemon kickstarted.");
105
- // --- Step 3: wait for /health ---
175
+ // --- Step 4: wait for /health ---
106
176
  say("==> Waiting for the daemon to answer /health");
107
177
  const health = await runner.waitForHealth({
108
178
  baseUrl: DAEMON_BASE_URL,
@@ -116,7 +186,7 @@ export async function runUpdate(runner) {
116
186
  return { ok: false, step: "health", transcript };
117
187
  }
118
188
  say(` Daemon healthy (uptime ${health.uptimeSeconds}s).`);
119
- // --- Step 4: refresh menu bar plugin ---
189
+ // --- Step 5: refresh menu bar plugin ---
120
190
  say("==> Refreshing the Rift menu bar");
121
191
  try {
122
192
  const menu = runner.installMenuBar();
@@ -135,15 +205,174 @@ export async function runUpdate(runner) {
135
205
  say("Rift updated. Run `rift status` to confirm the new version.");
136
206
  return { ok: true, transcript };
137
207
  }
138
- function defaultNpmInstall(spec, useSudo) {
208
+ /**
209
+ * Decide whether the active CLI actually upgraded. The contract is strict and
210
+ * biased toward honesty — "could not confirm" is a FAILURE, never a pass:
211
+ * - no active version at all → the binary is broken (`no_binary`).
212
+ * - no expected version → we couldn't reach the registry to learn the latest
213
+ * beta, so we cannot claim the update landed (`unverified`). This is the
214
+ * deliberate fix for "couldn't verify" silently becoming "updated".
215
+ * - active != expected → still the old (or wrong) build (`mismatch`).
216
+ * Only an active version that equals a freshly-resolved expected version is OK.
217
+ */
218
+ export function evaluateUpgrade(expected, activeVersion) {
219
+ if (!activeVersion)
220
+ return { ok: false, reason: "no_binary" };
221
+ if (!expected)
222
+ return { ok: false, reason: "unverified" };
223
+ if (activeVersion !== expected)
224
+ return { ok: false, reason: "mismatch" };
225
+ return { ok: true };
226
+ }
227
+ /**
228
+ * Friend-readable verification failure. Leads with a plain-English headline,
229
+ * then prints versions and paths so the detail is actionable. The branch is
230
+ * chosen from the classified `reason`, and — crucially — only calls it a
231
+ * prefix split when the install was NOT targeted at the active CLI's prefix.
232
+ * Since we install with `--prefix <active.prefix>` whenever we can resolve it,
233
+ * a failure there is a stale-cache / no-op, NOT a split; telling the friend to
234
+ * re-run the same targeted command would be misleading.
235
+ */
236
+ function appendVerifyDiagnosis(say, ctx) {
237
+ const { expected, activeVersion, active, installPrefix, npmPrefix, reason } = ctx;
238
+ // The prefix npm actually wrote to: the one we targeted, else npm's default.
239
+ const actualInstallPrefix = installPrefix ?? npmPrefix;
240
+ // A genuine split is only possible when we did NOT target the active prefix
241
+ // (installPrefix === null) AND the binary on PATH lives outside where npm
242
+ // installed. When we targeted active.prefix, npm wrote exactly there.
243
+ const prefixSplit = reason === "mismatch" &&
244
+ installPrefix === null &&
245
+ active.binPath !== null &&
246
+ npmPrefix !== null &&
247
+ !binaryLivesUnderPrefix(active.binPath, npmPrefix);
248
+ say("");
249
+ if (reason === "no_binary") {
250
+ say("Rift installed, but `rift --version` would not run afterward.");
251
+ }
252
+ else if (reason === "unverified") {
253
+ say("Rift installed something, but I could not confirm it is the latest.");
254
+ }
255
+ else if (prefixSplit) {
256
+ say("Rift updated one copy, but your terminal still points at another copy.");
257
+ }
258
+ else {
259
+ say("Rift installed, but the rift in your PATH is still the old version.");
260
+ }
261
+ // Detail block — keep the headline understandable, put specifics below it.
262
+ say("");
263
+ if (expected)
264
+ say(` Expected (published @beta): ${expected}`);
265
+ else
266
+ say(" Expected (published @beta): unknown — npm registry probe failed");
267
+ say(` Active (your shell's rift): ${activeVersion ?? "unknown"}`);
268
+ if (active.binPath)
269
+ say(` Active rift path: ${active.binPath}`);
270
+ if (actualInstallPrefix) {
271
+ say(` Installed into prefix: ${actualInstallPrefix}`);
272
+ }
273
+ if (prefixSplit && npmPrefix) {
274
+ say(` npm global prefix: ${npmPrefix}`);
275
+ }
276
+ // Recovery.
277
+ say("");
278
+ if (reason === "unverified") {
279
+ say("This usually means npm couldn't reach the registry. Check your");
280
+ say("connection and re-run `rift update`. To verify by hand:");
281
+ say(` npm view ${RIFT_BETA_TAG} version # the target`);
282
+ say(" rift --version # what your shell runs");
283
+ }
284
+ else if (prefixSplit) {
285
+ const targetPrefix = active.prefix ?? deriveBinPrefix(active.binPath);
286
+ say("Fix: install into the copy your terminal actually runs:");
287
+ if (targetPrefix) {
288
+ say(` npm install -g --prefix ${targetPrefix} --prefer-online ${RIFT_BETA_TAG}`);
289
+ }
290
+ else {
291
+ say(` npm install -g --prefer-online ${RIFT_BETA_TAG}`);
292
+ }
293
+ }
294
+ else {
295
+ // no_binary or same-prefix no-op: most often a stale npm metadata cache.
296
+ say("Your npm metadata cache may be stale (the install was a no-op).");
297
+ say(`Fix: npm install -g --prefer-online ${RIFT_BETA_TAG}`);
298
+ say(" (if it repeats: npm cache clean --force, then re-run rift update)");
299
+ }
300
+ }
301
+ /** True when `binPath` sits inside `<prefix>/bin` (i.e. npm's `-g` bin dir). */
302
+ function binaryLivesUnderPrefix(binPath, prefix) {
303
+ const binDir = path.join(prefix, "bin") + path.sep;
304
+ return (binPath + path.sep).startsWith(binDir);
305
+ }
306
+ /** prefix that owns a `<prefix>/bin/rift` binary, or null if not that shape. */
307
+ function deriveBinPrefix(binPath) {
308
+ if (!binPath)
309
+ return null;
310
+ const binDir = path.dirname(binPath);
311
+ return path.basename(binDir) === "bin" ? path.dirname(binDir) : null;
312
+ }
313
+ function defaultNpmInstall(spec, useSudo, prefix) {
139
314
  return new Promise((resolve) => {
315
+ const prefixArgs = prefix ? ["--prefix", prefix] : [];
316
+ // `--prefer-online` forces npm to revalidate registry metadata instead of
317
+ // trusting a possibly-stale local cache — defense in depth on top of the
318
+ // pinned exact version, so even the tag-fallback path installs fresh.
319
+ const baseArgs = ["install", "-g", "--prefer-online", ...prefixArgs, spec];
140
320
  const cmd = useSudo ? "sudo" : "npm";
141
- const args = useSudo
142
- ? ["npm", "install", "-g", spec]
143
- : ["install", "-g", spec];
321
+ const args = useSudo ? ["npm", ...baseArgs] : baseArgs;
144
322
  const child = spawn(cmd, args, { stdio: "inherit" });
145
323
  child.on("error", () => resolve(1));
146
324
  child.on("close", (code) => resolve(code ?? 1));
147
325
  });
148
326
  }
327
+ /** Run a command, capture trimmed stdout, return null on any failure. */
328
+ function capture(cmd, args) {
329
+ return new Promise((resolve) => {
330
+ execFile(cmd, args, { timeout: 20_000, encoding: "utf8" }, (err, stdout) => {
331
+ if (err) {
332
+ resolve(null);
333
+ return;
334
+ }
335
+ const out = stdout.trim();
336
+ resolve(out.length > 0 ? out : null);
337
+ });
338
+ });
339
+ }
340
+ /**
341
+ * Resolve the `rift` the friend's shell runs and the prefix that owns it.
342
+ * Uses `command -v rift` (PATH lookup) rather than this process's own path —
343
+ * the running update is the OLD build, and we want the binary a fresh shell
344
+ * would launch. Prefix is the parent of the binary's `bin/` dir, which is
345
+ * exactly what `npm install -g --prefix` expects.
346
+ */
347
+ async function defaultResolveActiveCli() {
348
+ const binPath = await capture("/bin/sh", ["-c", "command -v rift"]);
349
+ if (!binPath)
350
+ return { binPath: null, prefix: null };
351
+ // /opt/homebrew/bin/rift → bin dir /opt/homebrew/bin → prefix /opt/homebrew
352
+ const binDir = path.dirname(binPath);
353
+ const prefix = path.basename(binDir) === "bin" ? path.dirname(binDir) : null;
354
+ return { binPath, prefix };
355
+ }
356
+ /** Version reported by the `rift` on PATH (`rift --version`). */
357
+ async function defaultGetActiveCliVersion() {
358
+ const out = await capture("/bin/sh", ["-c", "rift --version"]);
359
+ if (!out)
360
+ return null;
361
+ // commander prints a bare version line; tolerate any extra decoration.
362
+ const match = out.match(/\d+\.\d+\.\d+[^\s]*/);
363
+ return match ? match[0] : out;
364
+ }
365
+ /**
366
+ * Expected version from the published `@beta` dist-tag, with FRESH metadata.
367
+ * `--prefer-online` is load-bearing: without it this probe can read the same
368
+ * stale cache the install did, so a no-op install would "verify" against an
369
+ * equally-stale expected version and the command would lie.
370
+ */
371
+ function defaultGetExpectedVersion() {
372
+ return capture("npm", ["view", "--prefer-online", RIFT_BETA_TAG, "version"]);
373
+ }
374
+ /** npm's own global prefix (`npm prefix -g`). */
375
+ function defaultGetNpmGlobalPrefix() {
376
+ return capture("npm", ["prefix", "-g"]);
377
+ }
149
378
  //# sourceMappingURL=update.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../../src/cli/commands/update.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../../src/cli/commands/update.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { type KeychainOps } from "../auth/keychain.js";
2
- export type CliErrorCode = "connection_refused" | "unauthorized" | "not_found" | "invalid" | "conflict" | "rate_limited" | "validation" | "server_error" | "unknown";
2
+ export type CliErrorCode = "connection_refused" | "unauthorized" | "not_found" | "invalid" | "config_too_new" | "conflict" | "rate_limited" | "validation" | "server_error" | "unknown";
3
3
  export declare class CliError extends Error {
4
4
  readonly code: CliErrorCode;
5
5
  readonly statusCode?: number | undefined;
@@ -55,6 +55,30 @@ export declare function resolveConfigPath(globalOpts: {
55
55
  export declare function requireExistingConfigPath(globalOpts: {
56
56
  config?: string;
57
57
  }): string;
58
+ /**
59
+ * Status-only lenient base-URL resolver. `rift status` is a diagnostic and
60
+ * must stay useful even when the config carries a top-level key this (older)
61
+ * CLI doesn't recognize yet — e.g. a newer beta wrote `codex_cli` and strict
62
+ * Zod parsing rejects the whole file. It reads ONLY `server.port` leniently
63
+ * so status can still probe the daemon and tell the friend to update.
64
+ *
65
+ * SECURITY: the host is hard-pinned to `127.0.0.1` — never read from the
66
+ * config. `rift status` reads the auth token and sends it to this URL, so if
67
+ * lenient mode honoured an arbitrary `server.host`, a malformed config could
68
+ * redirect Rift's secret token to a non-loopback address. The strict schema
69
+ * already constrains host to the `127.0.0.1` literal, so no valid config ever
70
+ * carries another host — there is nothing legitimate to read, and reading it
71
+ * would only open an exfiltration path. We pin the daemon address and vary
72
+ * only the port (the one field a real config legitimately changes).
73
+ *
74
+ * NEVER use this for daemon startup or any write path — strict validation
75
+ * (`resolveBaseUrl` / `requireExistingConfigPath`) stays the only gate there.
76
+ * This is a read-only, loopback-only diagnostic fallback, nothing more.
77
+ *
78
+ * Returns null when the file is missing/unreadable or not valid JSON — those
79
+ * are real errors the caller should surface, not "the config is just newer".
80
+ */
81
+ export declare function resolveBaseUrlLenient(configPath: string): string | null;
58
82
  /**
59
83
  * No-auth probe of a daemon's /health endpoint at an explicit base URL.
60
84
  * `/health` is unauthenticated by design, so this needs neither a token nor
@@ -1 +1 @@
1
- {"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../../src/cli/http-client.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,KAAK,WAAW,EACjB,MAAM,qBAAqB,CAAC;AAG7B,MAAM,MAAM,YAAY,GACpB,oBAAoB,GACpB,cAAc,GACd,WAAW,GACX,SAAS,GACT,UAAU,GACV,cAAc,GACd,YAAY,GACZ,cAAc,GACd,SAAS,CAAC;AAEd,qBAAa,QAAS,SAAQ,KAAK;aAGf,IAAI,EAAE,YAAY;aAClB,UAAU,CAAC,EAAE,MAAM;aACnB,IAAI,CAAC,EAAE,OAAO;gBAH9B,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,YAAY,EAClB,UAAU,CAAC,EAAE,MAAM,YAAA,EACnB,IAAI,CAAC,EAAE,OAAO,YAAA;CAKjC;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB;AAED,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,CACF,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GAC7C,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC9C,aAAa,CACX,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,QAAQ,EACd,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,GAC7C,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IAC9C,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAC/D;AA6ED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,cAAc,GAAG,UAAU,CAqGjE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAezE;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE;IACpD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,MAAM,CAqBT;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAChE,EAAE,EAAE,OAAO,CAAC;IACZ,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC,CAuBD;AAED;;;;;;GAMG;AACH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC;IACxD,EAAE,EAAE,OAAO,CAAC;IACZ,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B,CAAC,CAED;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAqBzD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,SAAS,CAC7B,QAAQ,GAAE,WAAyB,GAClC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAqBxB"}
1
+ {"version":3,"file":"http-client.d.ts","sourceRoot":"","sources":["../../../src/cli/http-client.ts"],"names":[],"mappings":"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"}