@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.
- package/README.md +35 -9
- package/dist/src/cli/commands/doctor.d.ts +6 -0
- package/dist/src/cli/commands/doctor.d.ts.map +1 -0
- package/dist/src/cli/commands/doctor.js +183 -0
- package/dist/src/cli/commands/doctor.js.map +1 -0
- package/dist/src/cli/commands/menubar.d.ts +30 -0
- package/dist/src/cli/commands/menubar.d.ts.map +1 -0
- package/dist/src/cli/commands/menubar.js +180 -0
- package/dist/src/cli/commands/menubar.js.map +1 -0
- package/dist/src/cli/commands/onboard.d.ts +38 -0
- package/dist/src/cli/commands/onboard.d.ts.map +1 -1
- package/dist/src/cli/commands/onboard.js +203 -121
- package/dist/src/cli/commands/onboard.js.map +1 -1
- package/dist/src/cli/commands/status.d.ts +9 -7
- package/dist/src/cli/commands/status.d.ts.map +1 -1
- package/dist/src/cli/commands/status.js +29 -10
- package/dist/src/cli/commands/status.js.map +1 -1
- package/dist/src/cli/commands/update.d.ts +3 -0
- package/dist/src/cli/commands/update.d.ts.map +1 -1
- package/dist/src/cli/commands/update.js +19 -0
- package/dist/src/cli/commands/update.js.map +1 -1
- package/dist/src/cli/index.d.ts.map +1 -1
- package/dist/src/cli/index.js +4 -0
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/postinstall-menubar.d.ts +22 -0
- package/dist/src/cli/postinstall-menubar.d.ts.map +1 -0
- package/dist/src/cli/postinstall-menubar.js +39 -0
- package/dist/src/cli/postinstall-menubar.js.map +1 -0
- package/dist/src/cli/status/friend-header.d.ts +8 -1
- package/dist/src/cli/status/friend-header.d.ts.map +1 -1
- package/dist/src/cli/status/friend-header.js +93 -12
- package/dist/src/cli/status/friend-header.js.map +1 -1
- package/dist/src/cli/ui.d.ts +47 -0
- package/dist/src/cli/ui.d.ts.map +1 -0
- package/dist/src/cli/ui.js +166 -0
- package/dist/src/cli/ui.js.map +1 -0
- package/dist/src/diagnostics/doctor.d.ts +106 -0
- package/dist/src/diagnostics/doctor.d.ts.map +1 -0
- package/dist/src/diagnostics/doctor.js +251 -0
- package/dist/src/diagnostics/doctor.js.map +1 -0
- package/dist/src/diagnostics/notify.d.ts +90 -0
- package/dist/src/diagnostics/notify.d.ts.map +1 -0
- package/dist/src/diagnostics/notify.js +177 -0
- package/dist/src/diagnostics/notify.js.map +1 -0
- package/dist/src/diagnostics/repair-prompt.d.ts +49 -0
- package/dist/src/diagnostics/repair-prompt.d.ts.map +1 -0
- package/dist/src/diagnostics/repair-prompt.js +198 -0
- package/dist/src/diagnostics/repair-prompt.js.map +1 -0
- package/dist/src/jobs/handlers/dedupe-conversations.d.ts +25 -2
- package/dist/src/jobs/handlers/dedupe-conversations.d.ts.map +1 -1
- package/dist/src/jobs/handlers/dedupe-conversations.js +48 -9
- package/dist/src/jobs/handlers/dedupe-conversations.js.map +1 -1
- package/dist/src/jobs/handlers/ingest.d.ts.map +1 -1
- package/dist/src/jobs/handlers/ingest.js +8 -2
- package/dist/src/jobs/handlers/ingest.js.map +1 -1
- package/dist/src/main.js +43 -4
- package/dist/src/main.js.map +1 -1
- package/dist/src/mcp/server.d.ts.map +1 -1
- package/dist/src/mcp/server.js +43 -3
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/mcp/tools/context-pack.js +163 -25
- package/dist/src/mcp/tools/context-pack.js.map +1 -1
- package/dist/src/observability/onboarding-metric.d.ts +115 -0
- package/dist/src/observability/onboarding-metric.d.ts.map +1 -0
- package/dist/src/observability/onboarding-metric.js +344 -0
- package/dist/src/observability/onboarding-metric.js.map +1 -0
- package/dist/src/observability/version-check.d.ts +1 -0
- package/dist/src/observability/version-check.d.ts.map +1 -1
- package/dist/src/observability/version-check.js +2 -1
- package/dist/src/observability/version-check.js.map +1 -1
- package/dist/src/retrieval/context-pack.d.ts +37 -0
- package/dist/src/retrieval/context-pack.d.ts.map +1 -1
- package/dist/src/retrieval/context-pack.js +165 -1
- package/dist/src/retrieval/context-pack.js.map +1 -1
- package/dist/src/retrieval/current-truth.d.ts +326 -0
- package/dist/src/retrieval/current-truth.d.ts.map +1 -0
- package/dist/src/retrieval/current-truth.js +747 -0
- package/dist/src/retrieval/current-truth.js.map +1 -0
- package/dist/src/retrieval/git-state.d.ts +53 -0
- package/dist/src/retrieval/git-state.d.ts.map +1 -0
- package/dist/src/retrieval/git-state.js +174 -0
- package/dist/src/retrieval/git-state.js.map +1 -0
- package/dist/src/server/routes/friend-status.d.ts +63 -0
- package/dist/src/server/routes/friend-status.d.ts.map +1 -1
- package/dist/src/server/routes/friend-status.js +97 -0
- package/dist/src/server/routes/friend-status.js.map +1 -1
- package/operator/swiftbar/render-menu.py +444 -0
- package/operator/swiftbar/rift.10s.sh +147 -0
- 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:
|
|
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
|
|
160
|
+
return `Codex CLI: authed ✓ (last checked: ${formatAge(codex.last_preflight_at, now)})`;
|
|
111
161
|
}
|
|
112
|
-
return `Codex CLI: auth expired ✗ (last
|
|
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
|
-
|
|
157
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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"}
|