@getrift/rift 0.1.0-beta.12 → 0.1.0-beta.14

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 (89) hide show
  1. package/README.md +35 -9
  2. package/dist/src/cli/commands/doctor.d.ts +6 -0
  3. package/dist/src/cli/commands/doctor.d.ts.map +1 -0
  4. package/dist/src/cli/commands/doctor.js +183 -0
  5. package/dist/src/cli/commands/doctor.js.map +1 -0
  6. package/dist/src/cli/commands/menubar.d.ts +30 -0
  7. package/dist/src/cli/commands/menubar.d.ts.map +1 -0
  8. package/dist/src/cli/commands/menubar.js +180 -0
  9. package/dist/src/cli/commands/menubar.js.map +1 -0
  10. package/dist/src/cli/commands/onboard.d.ts +38 -0
  11. package/dist/src/cli/commands/onboard.d.ts.map +1 -1
  12. package/dist/src/cli/commands/onboard.js +203 -121
  13. package/dist/src/cli/commands/onboard.js.map +1 -1
  14. package/dist/src/cli/commands/status.d.ts +9 -7
  15. package/dist/src/cli/commands/status.d.ts.map +1 -1
  16. package/dist/src/cli/commands/status.js +29 -10
  17. package/dist/src/cli/commands/status.js.map +1 -1
  18. package/dist/src/cli/commands/update.d.ts +3 -0
  19. package/dist/src/cli/commands/update.d.ts.map +1 -1
  20. package/dist/src/cli/commands/update.js +19 -0
  21. package/dist/src/cli/commands/update.js.map +1 -1
  22. package/dist/src/cli/index.d.ts.map +1 -1
  23. package/dist/src/cli/index.js +4 -0
  24. package/dist/src/cli/index.js.map +1 -1
  25. package/dist/src/cli/postinstall-menubar.d.ts +22 -0
  26. package/dist/src/cli/postinstall-menubar.d.ts.map +1 -0
  27. package/dist/src/cli/postinstall-menubar.js +39 -0
  28. package/dist/src/cli/postinstall-menubar.js.map +1 -0
  29. package/dist/src/cli/status/friend-header.d.ts +8 -1
  30. package/dist/src/cli/status/friend-header.d.ts.map +1 -1
  31. package/dist/src/cli/status/friend-header.js +93 -12
  32. package/dist/src/cli/status/friend-header.js.map +1 -1
  33. package/dist/src/cli/ui.d.ts +47 -0
  34. package/dist/src/cli/ui.d.ts.map +1 -0
  35. package/dist/src/cli/ui.js +166 -0
  36. package/dist/src/cli/ui.js.map +1 -0
  37. package/dist/src/diagnostics/doctor.d.ts +106 -0
  38. package/dist/src/diagnostics/doctor.d.ts.map +1 -0
  39. package/dist/src/diagnostics/doctor.js +251 -0
  40. package/dist/src/diagnostics/doctor.js.map +1 -0
  41. package/dist/src/diagnostics/notify.d.ts +90 -0
  42. package/dist/src/diagnostics/notify.d.ts.map +1 -0
  43. package/dist/src/diagnostics/notify.js +177 -0
  44. package/dist/src/diagnostics/notify.js.map +1 -0
  45. package/dist/src/diagnostics/repair-prompt.d.ts +49 -0
  46. package/dist/src/diagnostics/repair-prompt.d.ts.map +1 -0
  47. package/dist/src/diagnostics/repair-prompt.js +198 -0
  48. package/dist/src/diagnostics/repair-prompt.js.map +1 -0
  49. package/dist/src/jobs/handlers/dedupe-conversations.d.ts +25 -2
  50. package/dist/src/jobs/handlers/dedupe-conversations.d.ts.map +1 -1
  51. package/dist/src/jobs/handlers/dedupe-conversations.js +48 -9
  52. package/dist/src/jobs/handlers/dedupe-conversations.js.map +1 -1
  53. package/dist/src/jobs/handlers/ingest.d.ts.map +1 -1
  54. package/dist/src/jobs/handlers/ingest.js +8 -2
  55. package/dist/src/jobs/handlers/ingest.js.map +1 -1
  56. package/dist/src/main.js +43 -4
  57. package/dist/src/main.js.map +1 -1
  58. package/dist/src/mcp/server.d.ts.map +1 -1
  59. package/dist/src/mcp/server.js +43 -3
  60. package/dist/src/mcp/server.js.map +1 -1
  61. package/dist/src/mcp/tools/context-pack.js +163 -25
  62. package/dist/src/mcp/tools/context-pack.js.map +1 -1
  63. package/dist/src/observability/onboarding-metric.d.ts +115 -0
  64. package/dist/src/observability/onboarding-metric.d.ts.map +1 -0
  65. package/dist/src/observability/onboarding-metric.js +344 -0
  66. package/dist/src/observability/onboarding-metric.js.map +1 -0
  67. package/dist/src/observability/version-check.d.ts +1 -0
  68. package/dist/src/observability/version-check.d.ts.map +1 -1
  69. package/dist/src/observability/version-check.js +2 -1
  70. package/dist/src/observability/version-check.js.map +1 -1
  71. package/dist/src/retrieval/context-pack.d.ts +37 -0
  72. package/dist/src/retrieval/context-pack.d.ts.map +1 -1
  73. package/dist/src/retrieval/context-pack.js +165 -1
  74. package/dist/src/retrieval/context-pack.js.map +1 -1
  75. package/dist/src/retrieval/current-truth.d.ts +326 -0
  76. package/dist/src/retrieval/current-truth.d.ts.map +1 -0
  77. package/dist/src/retrieval/current-truth.js +747 -0
  78. package/dist/src/retrieval/current-truth.js.map +1 -0
  79. package/dist/src/retrieval/git-state.d.ts +53 -0
  80. package/dist/src/retrieval/git-state.d.ts.map +1 -0
  81. package/dist/src/retrieval/git-state.js +174 -0
  82. package/dist/src/retrieval/git-state.js.map +1 -0
  83. package/dist/src/server/routes/friend-status.d.ts +63 -0
  84. package/dist/src/server/routes/friend-status.d.ts.map +1 -1
  85. package/dist/src/server/routes/friend-status.js +97 -0
  86. package/dist/src/server/routes/friend-status.js.map +1 -1
  87. package/operator/swiftbar/render-menu.py +444 -0
  88. package/operator/swiftbar/rift.10s.sh +147 -0
  89. package/package.json +4 -1
@@ -1,3 +1,4 @@
1
+ import { formatOnboardingDuration } from "../../observability/onboarding-metric.js";
1
2
  export function renderFriendHeader(input) {
2
3
  const { status } = input;
3
4
  const now = input.now ? input.now() : Date.now();
@@ -7,6 +8,12 @@ export function renderFriendHeader(input) {
7
8
  lines.push("Next: run: launchctl kickstart -k gui/$UID/com.getrift.daemon");
8
9
  return lines;
9
10
  }
11
+ // Derive when the current daemon process started so we can tell
12
+ // "happened during this uptime" from "historical error from a prior
13
+ // run." Without this, a 20h-old schema_mismatch keeps advertising
14
+ // "broken" in the Next: line for a full 24h after a perfectly
15
+ // healthy respawn.
16
+ const daemonStartMs = now - status.daemon.uptime_seconds * 1000;
10
17
  // 1. version + daemon
11
18
  lines.push(`Rift v${status.build.version} · daemon: running (uptime ${formatDuration(status.daemon.uptime_seconds)}) · port ${status.daemon.port} ${status.daemon.voyage_key_present ? "✓" : "✗"}`);
12
19
  // 2. voyage
@@ -37,10 +44,53 @@ export function renderFriendHeader(input) {
37
44
  const updateLine = renderUpdateLine(status.update);
38
45
  if (updateLine)
39
46
  lines.push(updateLine);
47
+ // 10. onboarding — `time_to_first_useful_recall`. Hidden state prints
48
+ // nothing so a fresh post-onboard install never shows a stale
49
+ // placeholder. Pending shows the in-flight wait; completed shows
50
+ // the captured duration + the MCP tool that closed it.
51
+ const onboardingLine = renderOnboardingLine(status.onboarding, now);
52
+ if (onboardingLine)
53
+ lines.push(onboardingLine);
40
54
  lines.push("");
41
- lines.push(`Next: ${decideNextLine({ status, mcpClients: input.mcpClients })}`);
55
+ lines.push(`Next: ${decideNextLine({ status, mcpClients: input.mcpClients, daemonStartMs })}`);
42
56
  return lines;
43
57
  }
58
+ /**
59
+ * True only when `iso` parses to a timestamp after the daemon's current
60
+ * start. Historical errors that predate the running process are not
61
+ * current and must not drive the Next: nudge — a friend with a healthy
62
+ * respawned daemon would otherwise see "broken, file feedback" for the
63
+ * full 24h window every error class keeps.
64
+ */
65
+ function isCurrentUptime(iso, daemonStartMs) {
66
+ if (!iso)
67
+ return false;
68
+ const ts = Date.parse(iso);
69
+ if (Number.isNaN(ts))
70
+ return false;
71
+ return ts >= daemonStartMs;
72
+ }
73
+ /**
74
+ * Translate internal error class names into copy a friend can act on.
75
+ * Falls back to the raw class so new/unknown values still surface
76
+ * (better an unfamiliar word than a missing one).
77
+ */
78
+ function humanizeErrorClass(reason) {
79
+ if (!reason)
80
+ return "unknown";
81
+ switch (reason) {
82
+ case "schema_mismatch":
83
+ return "index format changed by update";
84
+ case "lock_conflict":
85
+ return "index busy (concurrent write)";
86
+ case "provider_400":
87
+ return "embedding rejected by Voyage";
88
+ case "network":
89
+ return "network error";
90
+ default:
91
+ return reason;
92
+ }
93
+ }
44
94
  function renderUpdateLine(update) {
45
95
  if (!update.available)
46
96
  return null;
@@ -104,12 +154,12 @@ function renderInboxLine(inbox, now) {
104
154
  }
105
155
  function renderCodexLine(codex, now) {
106
156
  if (codex.last_preflight_at === null) {
107
- return "Codex CLI: no preflight yet — auto-capture has not run";
157
+ return "Codex CLI: not checked yet — auto-capture has not run";
108
158
  }
109
159
  if (codex.last_preflight_ok === true) {
110
- return `Codex CLI: authed ✓ (last preflight: ${formatAge(codex.last_preflight_at, now)})`;
160
+ return `Codex CLI: authed ✓ (last checked: ${formatAge(codex.last_preflight_at, now)})`;
111
161
  }
112
- return `Codex CLI: auth expired ✗ (last preflight: ${formatAge(codex.last_preflight_at, now)}) — run: codex login`;
162
+ return `Codex CLI: auth expired ✗ (last checked: ${formatAge(codex.last_preflight_at, now)}) — run: codex login`;
113
163
  }
114
164
  function renderCaptureLine(capture, now) {
115
165
  if (capture.last_run_at === null) {
@@ -146,18 +196,22 @@ function renderMcpLine(clients) {
146
196
  return `MCP: ${parts.join(" · ")}`;
147
197
  }
148
198
  function decideNextLine(input) {
149
- const { status, mcpClients } = input;
199
+ const { status, mcpClients, daemonStartMs } = input;
150
200
  if (!status.daemon.voyage_key_present) {
151
201
  return "Voyage key missing or revoked → run: rift onboard --reconfigure-voyage";
152
202
  }
153
203
  if (status.codex.last_preflight_ok === false) {
154
204
  return "Codex auth expired → run: codex login";
155
205
  }
156
- if (status.voyage.last_error_at) {
157
- return `Voyage embedding errors in last 24h (${status.voyage.last_error_reason ?? "unknown"}) run: rift feedback --kind=broke --with-status`;
206
+ // Recency gating: only errors stamped *after* the current daemon
207
+ // start can drive the Next: action. A 20h-old schema_mismatch from a
208
+ // prior process should not advertise "broken, file feedback" on a
209
+ // healthy respawn.
210
+ if (isCurrentUptime(status.voyage.last_error_at, daemonStartMs)) {
211
+ return `Voyage embedding errors since daemon start (${humanizeErrorClass(status.voyage.last_error_reason)}) → run: rift feedback --kind=broke --with-status`;
158
212
  }
159
- if (status.index.last_error_at) {
160
- return `Index write errors in last 24h (${status.index.last_error_reason ?? "unknown"}) → run: rift feedback --kind=broke --with-status`;
213
+ if (isCurrentUptime(status.index.last_error_at, daemonStartMs)) {
214
+ return `Index write errors since daemon start (${humanizeErrorClass(status.index.last_error_reason)}) → run: rift feedback --kind=broke --with-status`;
161
215
  }
162
216
  // Inbox import failures are usually the user's own drop being rejected
163
217
  // (malformed export, corrupted ZIP, unsupported source). The fix is on
@@ -167,10 +221,14 @@ function decideNextLine(input) {
167
221
  // a quarantine record, so the path would point at an empty folder.
168
222
  // Only the parser-level per-conversation failures land there, and
169
223
  // the user doesn't need to disambiguate before re-dropping.
170
- if (status.inbox && status.inbox.last_error_at) {
171
- return `Inbox import errors in last 24h (${status.inbox.last_error_reason ?? "unknown"}) → re-drop a fresh export under data/inbox/`;
224
+ if (status.inbox && isCurrentUptime(status.inbox.last_error_at, daemonStartMs)) {
225
+ return `Inbox import errors since daemon start (${humanizeErrorClass(status.inbox.last_error_reason)}) → re-drop a fresh export under data/inbox/`;
172
226
  }
173
- if (status.capture.last_errors > 0) {
227
+ // Capture errors only count when the failing run happened during the
228
+ // current daemon uptime — a prior process's failure shouldn't keep
229
+ // nudging the friend post-respawn.
230
+ if (status.capture.last_errors > 0 &&
231
+ isCurrentUptime(status.capture.last_run_at, daemonStartMs)) {
174
232
  return "Capture errors detected → run: rift feedback --kind=broke --with-status";
175
233
  }
176
234
  const missing = mcpClients.filter((c) => !c.installed).map((c) => c.client);
@@ -201,6 +259,29 @@ export function formatAge(iso, now) {
201
259
  return "unknown";
202
260
  return formatDuration(Math.max(0, Math.round((now - then) / 1000))) + " ago";
203
261
  }
262
+ /**
263
+ * Render the `time_to_first_useful_recall` line. Returns null when the
264
+ * state is `hidden` so the caller can drop the line entirely — a fresh
265
+ * post-onboard install should not advertise a metric it has not yet
266
+ * earned the right to display.
267
+ */
268
+ export function renderOnboardingLine(onboarding, now) {
269
+ if (!onboarding)
270
+ return null;
271
+ if (onboarding.state === "hidden")
272
+ return null;
273
+ if (onboarding.state === "pending") {
274
+ const since = onboarding.useful_state_reached_at
275
+ ? ` (waiting ${formatAge(onboarding.useful_state_reached_at, now)})`
276
+ : "";
277
+ return `First recall: pending — index ready, awaiting your first useful AI-client query${since}`;
278
+ }
279
+ const duration = onboarding.duration_seconds !== null
280
+ ? formatOnboardingDuration(onboarding.duration_seconds)
281
+ : "?";
282
+ const tool = onboarding.first_useful_recall_tool ?? "?";
283
+ return `First recall: ${duration} after first useful state · via ${tool}`;
284
+ }
204
285
  export function formatDuration(seconds) {
205
286
  if (seconds < 60)
206
287
  return `${seconds}s`;
@@ -1 +1 @@
1
- {"version":3,"file":"friend-header.js","sourceRoot":"","sources":["../../../../src/cli/status/friend-header.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"friend-header.js","sourceRoot":"","sources":["../../../../src/cli/status/friend-header.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ declare const colorEnabled: boolean;
2
+ declare const pc: import("picocolors/types.js").Colors;
3
+ export type StepStatus = "ok" | "warn" | "fail" | "info" | "skip";
4
+ /**
5
+ * Print the first-run banner. On a TTY this is the full ANSI-Shadow `RIFT`
6
+ * wordmark; off a TTY (pipe/CI) it collapses to a one-line `◆ RIFT` lockup so
7
+ * logs stay clean. The tagline and a rule follow in both modes.
8
+ */
9
+ export declare function banner(): void;
10
+ /** Print a resolved status row: ` ✓ Label detail`. The label is
11
+ * the bold human-readable headline; the detail tail is dimmed so the
12
+ * technical bits (paths, daemon/Voyage state, counts) stay secondary. */
13
+ export declare function step(status: StepStatus, label: string, detail?: string): void;
14
+ /** Print a dimmed, indented secondary line under a step. */
15
+ export declare function note(text: string): void;
16
+ /**
17
+ * Print indented, full-readability body text under a step. Unlike `note`,
18
+ * this is NOT dimmed — for trust-critical copy (e.g. the privacy contract)
19
+ * that must stay legible.
20
+ */
21
+ export declare function detail(text: string): void;
22
+ /** Print a plain (unstyled-content) line — escape hatch for raw output. */
23
+ export declare function line(text?: string): void;
24
+ /**
25
+ * A single-line spinner for an in-flight async step. On a TTY it animates
26
+ * in place and resolves to a status row; on a non-TTY it stays silent until
27
+ * resolved, then prints exactly one status row (stable for assertions).
28
+ */
29
+ export declare class Spinner {
30
+ private label;
31
+ private timer;
32
+ private frame;
33
+ constructor(label: string);
34
+ start(): this;
35
+ private render;
36
+ private clearLine;
37
+ succeed(label?: string, detail?: string): void;
38
+ warn(label?: string, detail?: string): void;
39
+ fail(label?: string, detail?: string): void;
40
+ }
41
+ /**
42
+ * Render a rounded box around the given lines. Width adapts to the widest
43
+ * line (ANSI-aware). Used for the final next-action card.
44
+ */
45
+ export declare function box(lines: string[]): void;
46
+ export { pc, colorEnabled };
47
+ //# sourceMappingURL=ui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.d.ts","sourceRoot":"","sources":["../../../src/cli/ui.ts"],"names":[],"mappings":"AA0BA,QAAA,MAAM,YAAY,SAA4D,CAAC;AAE/E,QAAA,MAAM,EAAE,sCAA6B,CAAC;AAgBtC,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;AAqBlE;;;;GAIG;AACH,wBAAgB,MAAM,IAAI,IAAI,CAS7B;AAED;;0EAE0E;AAC1E,wBAAgB,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,SAAK,GAAG,IAAI,CAIzE;AAED,4DAA4D;AAC5D,wBAAgB,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAIvC;AAED;;;;GAIG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAIzC;AAED,2EAA2E;AAC3E,wBAAgB,IAAI,CAAC,IAAI,SAAK,GAAG,IAAI,CAEpC;AAID;;;;GAIG;AACH,qBAAa,OAAO;IAIN,OAAO,CAAC,KAAK;IAHzB,OAAO,CAAC,KAAK,CAA6B;IAC1C,OAAO,CAAC,KAAK,CAAK;gBAEE,KAAK,EAAE,MAAM;IAEjC,KAAK,IAAI,IAAI;IAYb,OAAO,CAAC,MAAM;IAKd,OAAO,CAAC,SAAS;IAQjB,OAAO,CAAC,KAAK,SAAa,EAAE,MAAM,SAAK,GAAG,IAAI;IAK9C,IAAI,CAAC,KAAK,SAAa,EAAE,MAAM,SAAK,GAAG,IAAI;IAK3C,IAAI,CAAC,KAAK,SAAa,EAAE,MAAM,SAAK,GAAG,IAAI;CAI5C;AAED;;;GAGG;AACH,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAazC;AAED,OAAO,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC"}
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Terminal UI helpers for interactive CLI flows (currently `rift onboard`).
3
+ *
4
+ * Color contract:
5
+ * - Color is enabled ONLY when stdout is a TTY, unless explicitly forced.
6
+ * We compute this ourselves rather than trusting picocolors' default
7
+ * auto-detection, which enables color under `CI=true` even when stdout
8
+ * is piped — that would leak ANSI escape codes into logs, snapshot
9
+ * tests, and copy/pasted output. Overrides: `NO_COLOR` (any non-empty
10
+ * value) force-disables; `FORCE_COLOR` (any value other than 0/false)
11
+ * force-enables. Evaluated once at module load.
12
+ * - Animation (the spinner) only runs on a TTY regardless of color, so a
13
+ * non-TTY run prints exactly one resolved status row per step — a stable
14
+ * plain string for assertions.
15
+ * - Glyphs and box-drawing characters are Unicode, not ANSI escapes, so
16
+ * they are safe in non-TTY output and never introduce forbidden-name or
17
+ * secret substrings.
18
+ */
19
+ import { createColors } from "picocolors";
20
+ const env = process.env;
21
+ const noColor = typeof env["NO_COLOR"] === "string" && env["NO_COLOR"] !== "";
22
+ const forceColor = typeof env["FORCE_COLOR"] === "string" &&
23
+ env["FORCE_COLOR"] !== "0" &&
24
+ env["FORCE_COLOR"] !== "false";
25
+ const colorEnabled = !noColor && (forceColor || process.stdout.isTTY === true);
26
+ const pc = createColors(colorEnabled);
27
+ const isTty = () => process.stdout.isTTY === true;
28
+ const write = (s) => {
29
+ process.stdout.write(s);
30
+ };
31
+ /** Strip ANSI escape codes so width math is correct for box drawing. */
32
+ const stripAnsi = (s) => s.replace(/\x1b\[[0-9;]*m/g, "");
33
+ const visibleWidth = (s) => stripAnsi(s).length;
34
+ /** Label column width — wide enough for the longest onboarding step label
35
+ * ("Existing data" = 13). */
36
+ const LABEL_WIDTH = 14;
37
+ const GLYPH = {
38
+ ok: pc.green("✓"),
39
+ warn: pc.yellow("!"),
40
+ fail: pc.red("✗"),
41
+ info: pc.cyan("•"),
42
+ skip: pc.dim("–"),
43
+ };
44
+ /** ANSI-Shadow wordmark for the first-run banner. */
45
+ const WORDMARK = [
46
+ "██████╗ ██╗ ███████╗ ████████╗",
47
+ "██╔══██╗ ██║ ██╔════╝ ╚══██╔══╝",
48
+ "██████╔╝ ██║ █████╗ ██║",
49
+ "██╔══██╗ ██║ ██╔══╝ ██║",
50
+ "██║ ██║ ██║ ██║ ██║",
51
+ "╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝",
52
+ ];
53
+ const TAGLINE = "Local-first memory for AI tools";
54
+ /**
55
+ * Print the first-run banner. On a TTY this is the full ANSI-Shadow `RIFT`
56
+ * wordmark; off a TTY (pipe/CI) it collapses to a one-line `◆ RIFT` lockup so
57
+ * logs stay clean. The tagline and a rule follow in both modes.
58
+ */
59
+ export function banner() {
60
+ write("\n");
61
+ if (isTty()) {
62
+ for (const ln of WORDMARK)
63
+ write(` ${pc.cyan(ln)}\n`);
64
+ }
65
+ else {
66
+ write(` ${pc.cyan("◆")} ${pc.bold("RIFT")}\n`);
67
+ }
68
+ write(` ${pc.dim(TAGLINE)}\n`);
69
+ write(` ${pc.dim("─".repeat(TAGLINE.length))}\n`);
70
+ }
71
+ /** Print a resolved status row: ` ✓ Label detail`. The label is
72
+ * the bold human-readable headline; the detail tail is dimmed so the
73
+ * technical bits (paths, daemon/Voyage state, counts) stay secondary. */
74
+ export function step(status, label, detail = "") {
75
+ const padded = label.padEnd(LABEL_WIDTH);
76
+ const tail = detail ? ` ${pc.dim(detail)}` : "";
77
+ write(` ${GLYPH[status]} ${pc.bold(padded)}${tail}\n`);
78
+ }
79
+ /** Print a dimmed, indented secondary line under a step. */
80
+ export function note(text) {
81
+ for (const ln of text.split("\n")) {
82
+ write(` ${pc.dim(ln)}\n`);
83
+ }
84
+ }
85
+ /**
86
+ * Print indented, full-readability body text under a step. Unlike `note`,
87
+ * this is NOT dimmed — for trust-critical copy (e.g. the privacy contract)
88
+ * that must stay legible.
89
+ */
90
+ export function detail(text) {
91
+ for (const ln of text.split("\n")) {
92
+ write(` ${ln}\n`);
93
+ }
94
+ }
95
+ /** Print a plain (unstyled-content) line — escape hatch for raw output. */
96
+ export function line(text = "") {
97
+ write(text + "\n");
98
+ }
99
+ const SPINNER_FRAMES = ["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"];
100
+ /**
101
+ * A single-line spinner for an in-flight async step. On a TTY it animates
102
+ * in place and resolves to a status row; on a non-TTY it stays silent until
103
+ * resolved, then prints exactly one status row (stable for assertions).
104
+ */
105
+ export class Spinner {
106
+ label;
107
+ timer;
108
+ frame = 0;
109
+ constructor(label) {
110
+ this.label = label;
111
+ }
112
+ start() {
113
+ if (!isTty())
114
+ return this;
115
+ this.render();
116
+ this.timer = setInterval(() => {
117
+ this.frame = (this.frame + 1) % SPINNER_FRAMES.length;
118
+ this.render();
119
+ }, 80);
120
+ // Don't keep the event loop alive just for the spinner.
121
+ this.timer.unref?.();
122
+ return this;
123
+ }
124
+ render() {
125
+ const padded = this.label.padEnd(LABEL_WIDTH);
126
+ write(`\r ${pc.cyan(SPINNER_FRAMES[this.frame])} ${pc.bold(padded)}\x1b[K`);
127
+ }
128
+ clearLine() {
129
+ if (this.timer) {
130
+ clearInterval(this.timer);
131
+ this.timer = undefined;
132
+ }
133
+ if (isTty())
134
+ write("\r\x1b[K");
135
+ }
136
+ succeed(label = this.label, detail = "") {
137
+ this.clearLine();
138
+ step("ok", label, detail);
139
+ }
140
+ warn(label = this.label, detail = "") {
141
+ this.clearLine();
142
+ step("warn", label, detail);
143
+ }
144
+ fail(label = this.label, detail = "") {
145
+ this.clearLine();
146
+ step("fail", label, detail);
147
+ }
148
+ }
149
+ /**
150
+ * Render a rounded box around the given lines. Width adapts to the widest
151
+ * line (ANSI-aware). Used for the final next-action card.
152
+ */
153
+ export function box(lines) {
154
+ const inner = Math.max(...lines.map(visibleWidth), 0);
155
+ const pad = 2;
156
+ const w = inner + pad * 2;
157
+ write("\n");
158
+ write(` ${pc.dim("╭" + "─".repeat(w) + "╮")}\n`);
159
+ for (const l of lines) {
160
+ const gap = inner - visibleWidth(l);
161
+ write(` ${pc.dim("│")}${" ".repeat(pad)}${l}${" ".repeat(gap + pad)}${pc.dim("│")}\n`);
162
+ }
163
+ write(` ${pc.dim("╰" + "─".repeat(w) + "╯")}\n`);
164
+ }
165
+ export { pc, colorEnabled };
166
+ //# sourceMappingURL=ui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui.js","sourceRoot":"","sources":["../../../src/cli/ui.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Pure diagnosis layer shared by `rift doctor`, the repair-prompt
3
+ * generator, and the daemon's failure notifier.
4
+ *
5
+ * It consumes exactly what `rift status` already consumes — the
6
+ * `/status/friend` payload plus the friend's local signals (Voyage key
7
+ * last-4, MCP-client install presence) — and folds them into a small,
8
+ * severity-ordered list of issues. Each issue carries plain-language
9
+ * copy and one next action, so every surface (CLI, prompt, notification)
10
+ * tells the same story.
11
+ *
12
+ * Issue ordering follows `decideNextLine` in `friend-header.ts` so the
13
+ * two surfaces tell the same story, with one deliberate policy on top:
14
+ * `primary` (the "do this first" action) is always the highest-SEVERITY
15
+ * issue — a `broken` failure outranks any `warning`, regardless of
16
+ * positional order. This is why `rift doctor` can lead with a broken
17
+ * capture failure where `rift status`'s flat, positional Next: line
18
+ * might surface a warning-level inbox rejection first. The lists never
19
+ * contradict each other; `doctor` simply elevates "what is actually
20
+ * broken" to the lead, which is its whole job.
21
+ *
22
+ * This module is intentionally side-effect free: no IO, no clock except
23
+ * the injected `now`, no daemon access. Callers fetch the payload and
24
+ * pass it in.
25
+ */
26
+ import type { FriendStatusPayload } from "../server/routes/friend-status.js";
27
+ /** Stable identifiers for each diagnosable condition. */
28
+ export type DoctorIssueKind = "daemon_unreachable" | "daemon_auth_failed" | "config_missing" | "voyage_key_missing" | "codex_auth_expired" | "voyage_embed_errors" | "index_write_errors" | "inbox_import_errors" | "capture_failed" | "mcp_not_installed" | "capture_quarantined" | "update_available";
29
+ /**
30
+ * `broken` blocks Rift from doing its job (no capture, no search, no
31
+ * memory). `warning` is degraded-but-working or user-side (a rejected
32
+ * import, a missing optional client, an available update).
33
+ */
34
+ export type DoctorSeverity = "broken" | "warning";
35
+ export interface DoctorIssue {
36
+ kind: DoctorIssueKind;
37
+ severity: DoctorSeverity;
38
+ /** One-line plain-language headline a friend can read. */
39
+ title: string;
40
+ /** Plain-language explanation of what is wrong and why it matters. */
41
+ detail: string;
42
+ /** Exactly one next action — a command or a concrete step. */
43
+ nextAction: string;
44
+ /**
45
+ * Stable identity of the *cause*, not just the subsystem. For most
46
+ * issues this is the kind, but error-bearing issues fold in the error
47
+ * class (e.g. `voyage_embed_errors:provider_400`) so the notifier can
48
+ * tell "same subsystem, new cause" apart from a still-unresolved
49
+ * repeat. Optional so hand-built issues fall back to `kind`.
50
+ */
51
+ fingerprint?: string;
52
+ /**
53
+ * True when a *running* daemon can observe this failure and is
54
+ * therefore allowed to raise a native notification about it. A fully
55
+ * dead daemon cannot observe anything, so `daemon_unreachable` is
56
+ * false here — that case needs the Slice D watchdog, not this path.
57
+ */
58
+ daemonObservable: boolean;
59
+ }
60
+ /** Local-only signals the friend's machine answers without the daemon. */
61
+ export interface DoctorLocalSignals {
62
+ voyageLast4: string | null;
63
+ mcpClients: Array<{
64
+ client: string;
65
+ installed: boolean;
66
+ }>;
67
+ }
68
+ /**
69
+ * Why `/status/friend` could not be read. A null status is NOT always
70
+ * "the daemon is down" — the request can fail because there is no config,
71
+ * no token has been issued, or the daemon rejected our auth. Each needs a
72
+ * different next action, so the caller classifies the failure and the
73
+ * diagnosis turns it into the right issue. Defaults to `connection_refused`
74
+ * (the in-process daemon caller never passes null, so this only matters
75
+ * for the CLI).
76
+ */
77
+ export type DoctorUnreachableReason = "connection_refused" | "auth_failed" | "not_authenticated" | "config_missing" | "unknown";
78
+ export interface DoctorInput {
79
+ /** `/status/friend` payload, or null when it could not be read. */
80
+ status: FriendStatusPayload | null;
81
+ /**
82
+ * When `status` is null, why. Lets the diagnosis distinguish "daemon
83
+ * down" from "cannot authenticate to the daemon" from "no config yet".
84
+ */
85
+ unreachableReason?: DoctorUnreachableReason;
86
+ localSignals: DoctorLocalSignals;
87
+ /** Injected clock; defaults to Date.now() at the call site. */
88
+ now: number;
89
+ }
90
+ export interface DoctorReport {
91
+ /** True when no `broken` issue is present. Warnings do not flip this. */
92
+ healthy: boolean;
93
+ /**
94
+ * The single most important issue — the one whose `nextAction` a
95
+ * surface should lead with. Null only when there are no issues at all.
96
+ */
97
+ primary: DoctorIssue | null;
98
+ /** All detected issues, highest priority first. */
99
+ issues: DoctorIssue[];
100
+ }
101
+ /**
102
+ * Diagnose Rift health from the same inputs `rift status` uses. Pure:
103
+ * given identical inputs it always returns the same report.
104
+ */
105
+ export declare function diagnose(input: DoctorInput): DoctorReport;
106
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/diagnostics/doctor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAE7E,yDAAyD;AACzD,MAAM,MAAM,eAAe,GACvB,oBAAoB,GACpB,oBAAoB,GACpB,gBAAgB,GAChB,oBAAoB,GACpB,oBAAoB,GACpB,qBAAqB,GACrB,oBAAoB,GACpB,qBAAqB,GACrB,gBAAgB,GAChB,mBAAmB,GACnB,qBAAqB,GACrB,kBAAkB,CAAC;AAEvB;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,SAAS,CAAC;AAElD,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,eAAe,CAAC;IACtB,QAAQ,EAAE,cAAc,CAAC;IACzB,0DAA0D;IAC1D,KAAK,EAAE,MAAM,CAAC;IACd,sEAAsE;IACtE,MAAM,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,gBAAgB,EAAE,OAAO,CAAC;CAC3B;AAED,0EAA0E;AAC1E,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CAC3D;AAED;;;;;;;;GAQG;AACH,MAAM,MAAM,uBAAuB,GAC/B,oBAAoB,GACpB,aAAa,GACb,mBAAmB,GACnB,gBAAgB,GAChB,SAAS,CAAC;AAEd,MAAM,WAAW,WAAW;IAC1B,mEAAmE;IACnE,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACnC;;;OAGG;IACH,iBAAiB,CAAC,EAAE,uBAAuB,CAAC;IAC5C,YAAY,EAAE,kBAAkB,CAAC;IACjC,+DAA+D;IAC/D,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,YAAY;IAC3B,yEAAyE;IACzE,OAAO,EAAE,OAAO,CAAC;IACjB;;;OAGG;IACH,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IAC5B,mDAAmD;IACnD,MAAM,EAAE,WAAW,EAAE,CAAC;CACvB;AA8FD;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,YAAY,CAyLzD"}