@getrift/rift 0.1.0-beta.1 → 0.1.0-beta.10

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 (178) hide show
  1. package/README.md +154 -0
  2. package/dist/src/auth/keychain.d.ts +9 -0
  3. package/dist/src/auth/keychain.d.ts.map +1 -1
  4. package/dist/src/auth/keychain.js +37 -0
  5. package/dist/src/auth/keychain.js.map +1 -1
  6. package/dist/src/capture/recover-quarantine.d.ts +221 -0
  7. package/dist/src/capture/recover-quarantine.d.ts.map +1 -0
  8. package/dist/src/capture/recover-quarantine.js +453 -0
  9. package/dist/src/capture/recover-quarantine.js.map +1 -0
  10. package/dist/src/cli/commands/backfill.d.ts.map +1 -1
  11. package/dist/src/cli/commands/backfill.js +5 -2
  12. package/dist/src/cli/commands/backfill.js.map +1 -1
  13. package/dist/src/cli/commands/capture-recover.d.ts +12 -0
  14. package/dist/src/cli/commands/capture-recover.d.ts.map +1 -0
  15. package/dist/src/cli/commands/capture-recover.js +120 -0
  16. package/dist/src/cli/commands/capture-recover.js.map +1 -0
  17. package/dist/src/cli/commands/capture.d.ts.map +1 -1
  18. package/dist/src/cli/commands/capture.js +10 -4
  19. package/dist/src/cli/commands/capture.js.map +1 -1
  20. package/dist/src/cli/commands/feedback.d.ts.map +1 -1
  21. package/dist/src/cli/commands/feedback.js +6 -2
  22. package/dist/src/cli/commands/feedback.js.map +1 -1
  23. package/dist/src/cli/commands/mcp-install.js +5 -2
  24. package/dist/src/cli/commands/mcp-install.js.map +1 -1
  25. package/dist/src/cli/commands/onboard.d.ts +24 -0
  26. package/dist/src/cli/commands/onboard.d.ts.map +1 -1
  27. package/dist/src/cli/commands/onboard.js +119 -21
  28. package/dist/src/cli/commands/onboard.js.map +1 -1
  29. package/dist/src/cli/commands/rebuild.d.ts.map +1 -1
  30. package/dist/src/cli/commands/rebuild.js +6 -3
  31. package/dist/src/cli/commands/rebuild.js.map +1 -1
  32. package/dist/src/cli/commands/review.d.ts.map +1 -1
  33. package/dist/src/cli/commands/review.js +22 -7
  34. package/dist/src/cli/commands/review.js.map +1 -1
  35. package/dist/src/cli/commands/status.d.ts.map +1 -1
  36. package/dist/src/cli/commands/status.js +48 -2
  37. package/dist/src/cli/commands/status.js.map +1 -1
  38. package/dist/src/cli/commands/token-issue.d.ts.map +1 -1
  39. package/dist/src/cli/commands/token-issue.js +9 -1
  40. package/dist/src/cli/commands/token-issue.js.map +1 -1
  41. package/dist/src/cli/commands/triage.d.ts.map +1 -1
  42. package/dist/src/cli/commands/triage.js +7 -5
  43. package/dist/src/cli/commands/triage.js.map +1 -1
  44. package/dist/src/cli/commands/update.d.ts +26 -0
  45. package/dist/src/cli/commands/update.d.ts.map +1 -0
  46. package/dist/src/cli/commands/update.js +130 -0
  47. package/dist/src/cli/commands/update.js.map +1 -0
  48. package/dist/src/cli/default-config-path.d.ts +15 -0
  49. package/dist/src/cli/default-config-path.d.ts.map +1 -0
  50. package/dist/src/cli/default-config-path.js +27 -0
  51. package/dist/src/cli/default-config-path.js.map +1 -0
  52. package/dist/src/cli/http-client.d.ts +56 -1
  53. package/dist/src/cli/http-client.d.ts.map +1 -1
  54. package/dist/src/cli/http-client.js +140 -4
  55. package/dist/src/cli/http-client.js.map +1 -1
  56. package/dist/src/cli/index.d.ts.map +1 -1
  57. package/dist/src/cli/index.js +25 -6
  58. package/dist/src/cli/index.js.map +1 -1
  59. package/dist/src/cli/status/friend-header.d.ts.map +1 -1
  60. package/dist/src/cli/status/friend-header.js +117 -7
  61. package/dist/src/cli/status/friend-header.js.map +1 -1
  62. package/dist/src/ingestion/inbox-core/conversation-key.d.ts +2 -0
  63. package/dist/src/ingestion/inbox-core/conversation-key.d.ts.map +1 -0
  64. package/dist/src/ingestion/inbox-core/conversation-key.js +31 -0
  65. package/dist/src/ingestion/inbox-core/conversation-key.js.map +1 -0
  66. package/dist/src/ingestion/inbox-core/extensions.d.ts +3 -0
  67. package/dist/src/ingestion/inbox-core/extensions.d.ts.map +1 -0
  68. package/dist/src/ingestion/inbox-core/extensions.js +16 -0
  69. package/dist/src/ingestion/inbox-core/extensions.js.map +1 -0
  70. package/dist/src/ingestion/inbox-core/idempotency.d.ts +2 -0
  71. package/dist/src/ingestion/inbox-core/idempotency.d.ts.map +1 -0
  72. package/dist/src/ingestion/inbox-core/idempotency.js +22 -0
  73. package/dist/src/ingestion/inbox-core/idempotency.js.map +1 -0
  74. package/dist/src/ingestion/inbox-core/index.d.ts +19 -0
  75. package/dist/src/ingestion/inbox-core/index.d.ts.map +1 -0
  76. package/dist/src/ingestion/inbox-core/index.js +19 -0
  77. package/dist/src/ingestion/inbox-core/index.js.map +1 -0
  78. package/dist/src/ingestion/inbox-core/source-detection.d.ts +2 -0
  79. package/dist/src/ingestion/inbox-core/source-detection.d.ts.map +1 -0
  80. package/dist/src/ingestion/inbox-core/source-detection.js +23 -0
  81. package/dist/src/ingestion/inbox-core/source-detection.js.map +1 -0
  82. package/dist/src/ingestion/inbox-core/source-sniffer.d.ts +11 -0
  83. package/dist/src/ingestion/inbox-core/source-sniffer.d.ts.map +1 -0
  84. package/dist/src/ingestion/inbox-core/source-sniffer.js +69 -0
  85. package/dist/src/ingestion/inbox-core/source-sniffer.js.map +1 -0
  86. package/dist/src/ingestion/inbox-core/zip-sniffer.d.ts +70 -0
  87. package/dist/src/ingestion/inbox-core/zip-sniffer.d.ts.map +1 -0
  88. package/dist/src/ingestion/inbox-core/zip-sniffer.js +161 -0
  89. package/dist/src/ingestion/inbox-core/zip-sniffer.js.map +1 -0
  90. package/dist/src/ingestion/inbox-watcher.d.ts.map +1 -1
  91. package/dist/src/ingestion/inbox-watcher.js +34 -50
  92. package/dist/src/ingestion/inbox-watcher.js.map +1 -1
  93. package/dist/src/ingestion/indexer.d.ts +7 -0
  94. package/dist/src/ingestion/indexer.d.ts.map +1 -1
  95. package/dist/src/ingestion/indexer.js +36 -2
  96. package/dist/src/ingestion/indexer.js.map +1 -1
  97. package/dist/src/ingestion/metadata-extraction.d.ts +8 -5
  98. package/dist/src/ingestion/metadata-extraction.d.ts.map +1 -1
  99. package/dist/src/ingestion/metadata-extraction.js +24 -5
  100. package/dist/src/ingestion/metadata-extraction.js.map +1 -1
  101. package/dist/src/ingestion/skip-quarantine.d.ts +10 -0
  102. package/dist/src/ingestion/skip-quarantine.d.ts.map +1 -0
  103. package/dist/src/ingestion/skip-quarantine.js +35 -0
  104. package/dist/src/ingestion/skip-quarantine.js.map +1 -0
  105. package/dist/src/jobs/handlers/compact.d.ts.map +1 -1
  106. package/dist/src/jobs/handlers/compact.js +25 -4
  107. package/dist/src/jobs/handlers/compact.js.map +1 -1
  108. package/dist/src/jobs/handlers/ingest.d.ts.map +1 -1
  109. package/dist/src/jobs/handlers/ingest.js +49 -24
  110. package/dist/src/jobs/handlers/ingest.js.map +1 -1
  111. package/dist/src/jobs/handlers/reconcile.d.ts.map +1 -1
  112. package/dist/src/jobs/handlers/reconcile.js +30 -8
  113. package/dist/src/jobs/handlers/reconcile.js.map +1 -1
  114. package/dist/src/jobs/handlers/reindex.d.ts.map +1 -1
  115. package/dist/src/jobs/handlers/reindex.js +12 -2
  116. package/dist/src/jobs/handlers/reindex.js.map +1 -1
  117. package/dist/src/jobs/handlers/save.d.ts.map +1 -1
  118. package/dist/src/jobs/handlers/save.js +9 -2
  119. package/dist/src/jobs/handlers/save.js.map +1 -1
  120. package/dist/src/jobs/queue.d.ts +11 -0
  121. package/dist/src/jobs/queue.d.ts.map +1 -1
  122. package/dist/src/jobs/queue.js +18 -0
  123. package/dist/src/jobs/queue.js.map +1 -1
  124. package/dist/src/jobs/worker-entry.d.ts.map +1 -1
  125. package/dist/src/jobs/worker-entry.js +2 -0
  126. package/dist/src/jobs/worker-entry.js.map +1 -1
  127. package/dist/src/main.js +36 -4
  128. package/dist/src/main.js.map +1 -1
  129. package/dist/src/observability/embedding-events.d.ts +52 -0
  130. package/dist/src/observability/embedding-events.d.ts.map +1 -0
  131. package/dist/src/observability/embedding-events.js +149 -0
  132. package/dist/src/observability/embedding-events.js.map +1 -0
  133. package/dist/src/observability/index-events.d.ts +70 -0
  134. package/dist/src/observability/index-events.d.ts.map +1 -0
  135. package/dist/src/observability/index-events.js +148 -0
  136. package/dist/src/observability/index-events.js.map +1 -0
  137. package/dist/src/observability/tool-usage-stats.d.ts +7 -0
  138. package/dist/src/observability/tool-usage-stats.d.ts.map +1 -1
  139. package/dist/src/observability/tool-usage-stats.js +41 -5
  140. package/dist/src/observability/tool-usage-stats.js.map +1 -1
  141. package/dist/src/observability/tool-usage.d.ts +7 -7
  142. package/dist/src/observability/tool-usage.d.ts.map +1 -1
  143. package/dist/src/observability/tool-usage.js +78 -39
  144. package/dist/src/observability/tool-usage.js.map +1 -1
  145. package/dist/src/observability/version-check.d.ts +70 -0
  146. package/dist/src/observability/version-check.d.ts.map +1 -0
  147. package/dist/src/observability/version-check.js +197 -0
  148. package/dist/src/observability/version-check.js.map +1 -0
  149. package/dist/src/providers/ollama-embed.d.ts +2 -1
  150. package/dist/src/providers/ollama-embed.d.ts.map +1 -1
  151. package/dist/src/providers/ollama-embed.js +1 -0
  152. package/dist/src/providers/ollama-embed.js.map +1 -1
  153. package/dist/src/providers/openai-metadata-extraction.d.ts +3 -3
  154. package/dist/src/providers/openai-metadata-extraction.d.ts.map +1 -1
  155. package/dist/src/providers/openai-metadata-extraction.js +18 -3
  156. package/dist/src/providers/openai-metadata-extraction.js.map +1 -1
  157. package/dist/src/providers/stub.d.ts +2 -0
  158. package/dist/src/providers/stub.d.ts.map +1 -1
  159. package/dist/src/providers/stub.js +2 -0
  160. package/dist/src/providers/stub.js.map +1 -1
  161. package/dist/src/providers/types.d.ts +11 -0
  162. package/dist/src/providers/types.d.ts.map +1 -1
  163. package/dist/src/providers/voyage.d.ts +2 -1
  164. package/dist/src/providers/voyage.d.ts.map +1 -1
  165. package/dist/src/providers/voyage.js +1 -0
  166. package/dist/src/providers/voyage.js.map +1 -1
  167. package/dist/src/server/app.d.ts.map +1 -1
  168. package/dist/src/server/app.js +67 -1
  169. package/dist/src/server/app.js.map +1 -1
  170. package/dist/src/server/routes/friend-status.d.ts +202 -3
  171. package/dist/src/server/routes/friend-status.d.ts.map +1 -1
  172. package/dist/src/server/routes/friend-status.js +290 -7
  173. package/dist/src/server/routes/friend-status.js.map +1 -1
  174. package/dist/src/storage/rebuild.d.ts +14 -1
  175. package/dist/src/storage/rebuild.d.ts.map +1 -1
  176. package/dist/src/storage/rebuild.js +160 -34
  177. package/dist/src/storage/rebuild.js.map +1 -1
  178. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"app.js","sourceRoot":"","sources":["../../../src/server/app.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../../src/server/app.ts"],"names":[],"mappings":"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"}
@@ -6,18 +6,30 @@
6
6
  * collects only the signals a friend-readable header needs:
7
7
  * - build + daemon: from getBuildInfo() + uptime + config.server.port +
8
8
  * env(VOYAGE_API_KEY) presence
9
- * - voyage: optional `project_label` from config + last successful save
10
- * timestamp from auto-capture-runs.jsonl as a proxy for "last embed"
9
+ * - voyage: optional `project_label` from config + real last successful
10
+ * embedding timestamp from `data/observability/embedding-events.jsonl`
11
+ * filtered to ingest pipelines (search-time embedding calls are
12
+ * intentionally excluded so a user search cannot mask an ingest
13
+ * outage), plus the most recent error in the last 24h with a short
14
+ * reason class
11
15
  * - codex: latest auto-capture-runs.jsonl row's preflight_ok + ts
12
16
  * - capture: latest auto-capture-runs.jsonl row's totals
13
17
  * - feedback: relay enabled flag from feedback-config.json
14
18
  *
15
- * Friend's username, paths, and key bytes never appear in the payload.
19
+ * Friend's username and key bytes never appear in the payload.
20
+ * `daemon.data_dir` is the one exception: operators need it to confirm
21
+ * which data root the daemon is actually reading (the launchd config in
22
+ * Application Support can redirect to a repo-local data dir, and
23
+ * inspecting the wrong one produces stale-state false alarms). The
24
+ * /status/friend route is auth-gated, so this only reaches callers who
25
+ * already have the daemon token.
16
26
  * MCP-client presence detection is intentionally CLI-side (the friend's
17
27
  * client config files are local, and the renderer needs to print client
18
28
  * names anyway).
19
29
  */
20
30
  import type { FastifyInstance } from "fastify";
31
+ import type { JobQueue } from "../../jobs/queue.js";
32
+ import type { Job } from "../../jobs/types.js";
21
33
  import type { Config } from "../../config/schema.js";
22
34
  export interface FriendStatusBuild {
23
35
  name: string;
@@ -29,10 +41,35 @@ export interface FriendStatusDaemon {
29
41
  uptime_seconds: number;
30
42
  port: number;
31
43
  voyage_key_present: boolean;
44
+ /**
45
+ * Absolute path the daemon is actually using as its data root
46
+ * (config.data_paths.data_dir). Surfaced so operators inspecting state
47
+ * files hit the live folder instead of a stale Application Support
48
+ * copy left over from a previous install.
49
+ */
50
+ data_dir: string;
32
51
  }
33
52
  export interface FriendStatusVoyage {
34
53
  project_label: string | null;
54
+ /**
55
+ * Most recent successful embedding call on an ingest pipeline (watcher,
56
+ * scheduled_scan, reconcile, ingest_job, compact, backfill). Null when
57
+ * the lane file is empty. Search-time embedding calls are excluded by
58
+ * construction — they don't write to this lane.
59
+ */
35
60
  last_embed_at: string | null;
61
+ /**
62
+ * Most recent embedding error in the last 24h on any ingest pipeline,
63
+ * regardless of whether retries eventually succeeded. Null when no
64
+ * error in the window. Surfaces silent watcher failures that
65
+ * `last_embed_at` alone cannot.
66
+ */
67
+ last_error_at: string | null;
68
+ /**
69
+ * Compact reason class for `last_error_at` (e.g. "provider_400",
70
+ * "network", "unknown"). Null when `last_error_at` is null.
71
+ */
72
+ last_error_reason: string | null;
36
73
  }
37
74
  export interface FriendStatusCodex {
38
75
  last_preflight_at: string | null;
@@ -51,22 +88,184 @@ export interface FriendStatusCapture {
51
88
  * not an error.
52
89
  */
53
90
  last_quarantined: number;
91
+ /**
92
+ * When the daemon's hourly auto-capture loop will tick next, anchored
93
+ * to the daemon's startTime (the same anchor `setInterval` uses, so
94
+ * this matches reality rather than approximating from last_run_at).
95
+ * Null when `config.capture.enabled` is false.
96
+ */
97
+ next_run_at: string | null;
54
98
  }
55
99
  export interface FriendStatusFeedback {
56
100
  relay_enabled: boolean;
57
101
  }
102
+ export interface FriendStatusIndex {
103
+ /**
104
+ * Most recent successful LanceDB row write across any table/pipeline.
105
+ * Distinct from `voyage.last_embed_at`: an embed can succeed but the
106
+ * subsequent `table.add(...)` can still fail (schema mismatch, lock
107
+ * contention, IO). Null when the lane file is empty.
108
+ */
109
+ last_update_at: string | null;
110
+ /**
111
+ * Most recent index-write error in the last 24h. Surfaces "embedded
112
+ * but not indexed" outages that `voyage.*` alone cannot reveal. Null
113
+ * when no error in the window.
114
+ */
115
+ last_error_at: string | null;
116
+ /**
117
+ * Compact reason class for `last_error_at` (e.g. "schema_mismatch",
118
+ * "lock_conflict", "io", "unknown"). Null when `last_error_at` is null.
119
+ */
120
+ last_error_reason: string | null;
121
+ }
122
+ export interface FriendStatusInbox {
123
+ /**
124
+ * Most recent successfully-ingested inbox drop, or null when nothing
125
+ * has been imported yet. Derived from completed ingest jobs whose
126
+ * idempotency key starts with `inbox:` — that prefix is what the
127
+ * inbox-watcher mints for every file it picks up, so it's the
128
+ * authoritative scope for this lane.
129
+ */
130
+ last_import_at: string | null;
131
+ /**
132
+ * Most recent inbox ingest failure in the last 24h. Surfaces drops
133
+ * that the parser couldn't accept (malformed JSON, unsupported zip
134
+ * contents, secure-archive rejection) without requiring the user to
135
+ * dig through the queue. Null when no failure in the window.
136
+ */
137
+ last_error_at: string | null;
138
+ /**
139
+ * Compact reason for `last_error_at` (a short snippet of the job's
140
+ * error message). Null when `last_error_at` is null. Best-effort —
141
+ * the queue doesn't carry a structured error class today, so this
142
+ * is a stable substring rather than a strict enum.
143
+ */
144
+ last_error_reason: string | null;
145
+ /**
146
+ * Inbox jobs currently queued or running. Zero when the lane is
147
+ * idle. Combined with `last_import_at` this answers "is the inbox
148
+ * keeping up?" at a glance.
149
+ */
150
+ pending: number;
151
+ }
152
+ export interface FriendStatusUpdate {
153
+ /**
154
+ * True when the daemon's most recent npm registry probe found a
155
+ * `latest_beta` strictly newer than the installed version. False on
156
+ * a fresh install (no probe yet), on a probe failure, or when
157
+ * already up-to-date — the renderer treats all three the same: stay
158
+ * silent. The friend never sees the update-check machinery itself.
159
+ */
160
+ available: boolean;
161
+ /** Version this daemon is running, mirrored for renderer convenience. */
162
+ installed: string;
163
+ /** Latest beta on the npm registry; null on a failed/missing probe. */
164
+ latest_beta: string | null;
165
+ /** ISO timestamp of the most recent probe attempt, or null if never run. */
166
+ checked_at: string | null;
167
+ }
58
168
  export interface FriendStatusPayload {
59
169
  build: FriendStatusBuild;
60
170
  daemon: FriendStatusDaemon;
61
171
  voyage: FriendStatusVoyage;
172
+ index: FriendStatusIndex;
173
+ inbox: FriendStatusInbox;
62
174
  codex: FriendStatusCodex;
63
175
  capture: FriendStatusCapture;
64
176
  feedback: FriendStatusFeedback;
177
+ update: FriendStatusUpdate;
65
178
  }
66
179
  export interface FriendStatusDeps {
67
180
  config: Config;
68
181
  startTime: number;
182
+ /**
183
+ * Job queue used to project the inbox lane. Optional so the route
184
+ * still renders before the queue is wired up (e.g., partial-boot
185
+ * fastify instances and tests) — the inbox block degrades to
186
+ * "nothing dropped yet" when absent.
187
+ */
188
+ jobQueue?: JobQueue;
69
189
  }
70
190
  export declare function buildFriendStatusPayload(deps: FriendStatusDeps): FriendStatusPayload;
191
+ /**
192
+ * Project the version-check snapshot to the three fields the renderer
193
+ * needs. A missing snapshot, a failed probe, or an up-to-date install
194
+ * all return `available: false` — the renderer prints nothing in those
195
+ * cases, so an unreachable npm registry can never make Rift look broken.
196
+ *
197
+ * Exported for tests.
198
+ */
199
+ export declare function computeUpdateProjection(dataDir: string, installedVersion: string): FriendStatusUpdate;
200
+ /**
201
+ * Compute the next auto-capture tick.
202
+ *
203
+ * The daemon registers `setInterval(runCapture, intervalMs)` at startup
204
+ * (`src/main.ts`), so ticks land at `startTime + N * intervalMs` for
205
+ * N ≥ 1 (N = 0 is the eager startup call). We deliberately anchor to
206
+ * `startTime` rather than `last_run_at` because:
207
+ * - `setInterval` does, so this matches what will actually fire.
208
+ * - `last_run_at` lags by hundreds of ms (save-job wait), and could
209
+ * be stale from a prior daemon process for the first interval after
210
+ * a restart.
211
+ *
212
+ * Returns null when auto-capture is disabled in config.
213
+ *
214
+ * Exported for tests.
215
+ */
216
+ export declare function computeNextCaptureRunAt(opts: {
217
+ captureEnabled: boolean;
218
+ intervalSeconds: number;
219
+ startTime: number;
220
+ now: number;
221
+ }): string | null;
222
+ /**
223
+ * Reduce the embedding-events lane to the three voyage health fields the
224
+ * friend-status route needs.
225
+ *
226
+ * Exported for tests so we can verify the pipeline-filter and 24h-window
227
+ * logic without booting Fastify or stubbing the route layer.
228
+ */
229
+ export declare function computeVoyageHealth(dataDir: string, now: number): {
230
+ last_embed_at: string | null;
231
+ last_error_at: string | null;
232
+ last_error_reason: string | null;
233
+ };
234
+ /**
235
+ * Reduce the index-events lane to the three index health fields the
236
+ * friend-status route needs. Provider-agnostic and table-agnostic: an
237
+ * embed can succeed but the subsequent `table.add(...)` can fail, and
238
+ * `index.*` is what makes that visible. No 24h filter on `last_update_at`
239
+ * (a daemon that has not indexed in 7 days should still surface the
240
+ * stale timestamp); errors are filtered to the 24h window so old
241
+ * resolved incidents don't sit on the dashboard forever.
242
+ */
243
+ export declare function computeIndexHealth(dataDir: string, now: number): {
244
+ last_update_at: string | null;
245
+ last_error_at: string | null;
246
+ last_error_reason: string | null;
247
+ };
248
+ /**
249
+ * Reduce the inbox-keyed job set to the four fields the friend-status
250
+ * route needs. Pure over the queue's snapshot (no I/O), so tests can
251
+ * pass an in-memory `JobQueue` without booting Fastify.
252
+ *
253
+ * When the queue isn't wired up (deps.jobQueue undefined), this
254
+ * returns the empty / idle shape — the renderer treats it the same
255
+ * as "nothing dropped yet."
256
+ *
257
+ * Exported for tests.
258
+ */
259
+ export declare function computeInboxHealth(queue: JobQueue | undefined, now: number): FriendStatusInbox;
260
+ /**
261
+ * Best-effort short label for a failed inbox job's error. The queue
262
+ * stores the raw error message (`job.error`); we collapse it into a
263
+ * compact class keyword by substring match against the parser errors
264
+ * we know about, then fall back to a truncated form of the original
265
+ * message. Lower-cased for stability under capitalization drift.
266
+ *
267
+ * Exported for tests.
268
+ */
269
+ export declare function classifyJobError(job: Job): string;
71
270
  export declare function registerFriendStatusRoute(server: FastifyInstance, deps: FriendStatusDeps): void;
72
271
  //# sourceMappingURL=friend-status.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"friend-status.d.ts","sourceRoot":"","sources":["../../../../src/server/routes/friend-status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAQ/C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,iBAAiB;IAChC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,iBAAiB,EAAE,OAAO,GAAG,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,iBAAiB,CAAC;IACzB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,MAAM,EAAE,kBAAkB,CAAC;IAC3B,KAAK,EAAE,iBAAiB,CAAC;IACzB,OAAO,EAAE,mBAAmB,CAAC;IAC7B,QAAQ,EAAE,oBAAoB,CAAC;CAChC;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,gBAAgB,GACrB,mBAAmB,CA+DrB;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,gBAAgB,GACrB,IAAI,CAIN"}
1
+ {"version":3,"file":"friend-status.d.ts","sourceRoot":"","sources":["../../../../src/server/routes/friend-status.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,13 @@ import { getBuildInfo } from "../build-info.js";
2
2
  import { readAutoCaptureRunSummary, } from "../../capture/observability.js";
3
3
  import { loadFeedbackConfig } from "../../cli/feedback/feedback-config.js";
4
4
  import { sanitizeProjectLabel } from "../../runtime/legacy-name-guard.js";
5
+ import { readEmbeddingEvents, } from "../../observability/embedding-events.js";
6
+ import { readIndexEvents, } from "../../observability/index-events.js";
7
+ import { compareBetaVersions, readVersionCheck, } from "../../observability/version-check.js";
8
+ const VOYAGE_ERROR_LOOKBACK_MS = 24 * 60 * 60 * 1000;
9
+ const INDEX_ERROR_LOOKBACK_MS = 24 * 60 * 60 * 1000;
10
+ const INBOX_ERROR_LOOKBACK_MS = 24 * 60 * 60 * 1000;
11
+ const INBOX_IDEMPOTENCY_PREFIX = "inbox:";
5
12
  export function buildFriendStatusPayload(deps) {
6
13
  const build = getBuildInfo();
7
14
  const voyageKey = process.env["VOYAGE_API_KEY"];
@@ -24,12 +31,9 @@ export function buildFriendStatusPayload(deps) {
24
31
  captureTotals.quarantined += counts.quarantined ?? 0;
25
32
  }
26
33
  }
27
- let lastEmbedAt = null;
28
- for (const success of Object.values(summary.last_success_by_source)) {
29
- if (success && (!lastEmbedAt || success.timestamp > lastEmbedAt)) {
30
- lastEmbedAt = success.timestamp;
31
- }
32
- }
34
+ const voyageHealth = computeVoyageHealth(dataDir, Date.now());
35
+ const indexHealth = computeIndexHealth(dataDir, Date.now());
36
+ const inboxHealth = computeInboxHealth(deps.jobQueue, Date.now());
33
37
  let relayEnabled = false;
34
38
  try {
35
39
  relayEnabled = loadFeedbackConfig(dataDir).enabled === true;
@@ -43,11 +47,20 @@ export function buildFriendStatusPayload(deps) {
43
47
  uptime_seconds: Math.floor((Date.now() - deps.startTime) / 1000),
44
48
  port: deps.config.server.port,
45
49
  voyage_key_present: typeof voyageKey === "string" && voyageKey.length > 0,
50
+ data_dir: dataDir,
46
51
  },
47
52
  voyage: {
48
53
  project_label: sanitizeProjectLabel(deps.config.voyage?.project_label),
49
- last_embed_at: lastEmbedAt,
54
+ last_embed_at: voyageHealth.last_embed_at,
55
+ last_error_at: voyageHealth.last_error_at,
56
+ last_error_reason: voyageHealth.last_error_reason,
57
+ },
58
+ index: {
59
+ last_update_at: indexHealth.last_update_at,
60
+ last_error_at: indexHealth.last_error_at,
61
+ last_error_reason: indexHealth.last_error_reason,
50
62
  },
63
+ inbox: inboxHealth,
51
64
  codex: {
52
65
  last_preflight_at: last?.timestamp ?? null,
53
66
  last_preflight_ok: last ? last.preflight_ok : null,
@@ -59,10 +72,280 @@ export function buildFriendStatusPayload(deps) {
59
72
  last_review: captureTotals.review,
60
73
  last_errors: last?.errors.length ?? 0,
61
74
  last_quarantined: captureTotals.quarantined,
75
+ next_run_at: computeNextCaptureRunAt({
76
+ captureEnabled: deps.config.capture.enabled,
77
+ intervalSeconds: deps.config.capture.interval_seconds,
78
+ startTime: deps.startTime,
79
+ now: Date.now(),
80
+ }),
62
81
  },
63
82
  feedback: { relay_enabled: relayEnabled },
83
+ update: computeUpdateProjection(dataDir, build.version),
84
+ };
85
+ }
86
+ /**
87
+ * Project the version-check snapshot to the three fields the renderer
88
+ * needs. A missing snapshot, a failed probe, or an up-to-date install
89
+ * all return `available: false` — the renderer prints nothing in those
90
+ * cases, so an unreachable npm registry can never make Rift look broken.
91
+ *
92
+ * Exported for tests.
93
+ */
94
+ export function computeUpdateProjection(dataDir, installedVersion) {
95
+ const snapshot = readVersionCheck(dataDir);
96
+ if (!snapshot || snapshot.latest_beta === null) {
97
+ return {
98
+ available: false,
99
+ installed: installedVersion,
100
+ latest_beta: snapshot?.latest_beta ?? null,
101
+ checked_at: snapshot?.checked_at ?? null,
102
+ };
103
+ }
104
+ // Use the installedVersion from the live build, not the snapshot, so a
105
+ // post-update daemon restart immediately reports `available: false`
106
+ // even before the next probe writes a fresh snapshot.
107
+ const available = compareBetaVersions(installedVersion, snapshot.latest_beta) < 0;
108
+ return {
109
+ available,
110
+ installed: installedVersion,
111
+ latest_beta: snapshot.latest_beta,
112
+ checked_at: snapshot.checked_at,
113
+ };
114
+ }
115
+ /**
116
+ * Compute the next auto-capture tick.
117
+ *
118
+ * The daemon registers `setInterval(runCapture, intervalMs)` at startup
119
+ * (`src/main.ts`), so ticks land at `startTime + N * intervalMs` for
120
+ * N ≥ 1 (N = 0 is the eager startup call). We deliberately anchor to
121
+ * `startTime` rather than `last_run_at` because:
122
+ * - `setInterval` does, so this matches what will actually fire.
123
+ * - `last_run_at` lags by hundreds of ms (save-job wait), and could
124
+ * be stale from a prior daemon process for the first interval after
125
+ * a restart.
126
+ *
127
+ * Returns null when auto-capture is disabled in config.
128
+ *
129
+ * Exported for tests.
130
+ */
131
+ export function computeNextCaptureRunAt(opts) {
132
+ if (!opts.captureEnabled)
133
+ return null;
134
+ if (opts.intervalSeconds <= 0)
135
+ return null;
136
+ const intervalMs = opts.intervalSeconds * 1000;
137
+ const elapsed = Math.max(0, opts.now - opts.startTime);
138
+ const ticksElapsed = Math.floor(elapsed / intervalMs);
139
+ return new Date(opts.startTime + (ticksElapsed + 1) * intervalMs).toISOString();
140
+ }
141
+ /**
142
+ * Reduce the embedding-events lane to the three voyage health fields the
143
+ * friend-status route needs.
144
+ *
145
+ * Exported for tests so we can verify the pipeline-filter and 24h-window
146
+ * logic without booting Fastify or stubbing the route layer.
147
+ */
148
+ export function computeVoyageHealth(dataDir, now) {
149
+ let events;
150
+ try {
151
+ events = readEmbeddingEvents(dataDir);
152
+ }
153
+ catch {
154
+ events = [];
155
+ }
156
+ let lastSuccessTs = null;
157
+ let lastErrorTs = null;
158
+ let lastErrorReason = null;
159
+ const errorCutoff = now - VOYAGE_ERROR_LOOKBACK_MS;
160
+ for (const event of events) {
161
+ // The `voyage.*` projection must reflect Voyage health only. The lane
162
+ // itself is provider-agnostic so a future Ollama-only install reuses
163
+ // the same writer, but on a mixed cloud+local install an Ollama
164
+ // success would otherwise refresh `voyage.last_embed_at` and mask a
165
+ // Voyage outage. Filter at projection time, not write time.
166
+ if (event.provider !== "voyage")
167
+ continue;
168
+ if (event.outcome === "success") {
169
+ if (!lastSuccessTs || event.ts > lastSuccessTs) {
170
+ lastSuccessTs = event.ts;
171
+ }
172
+ continue;
173
+ }
174
+ // outcome === "error"
175
+ const eventTime = Date.parse(event.ts);
176
+ if (Number.isNaN(eventTime) || eventTime < errorCutoff)
177
+ continue;
178
+ if (!lastErrorTs || event.ts > lastErrorTs) {
179
+ lastErrorTs = event.ts;
180
+ lastErrorReason = event.error_class ?? "unknown";
181
+ }
182
+ }
183
+ return {
184
+ last_embed_at: lastSuccessTs,
185
+ last_error_at: lastErrorTs,
186
+ last_error_reason: lastErrorReason,
64
187
  };
65
188
  }
189
+ /**
190
+ * Reduce the index-events lane to the three index health fields the
191
+ * friend-status route needs. Provider-agnostic and table-agnostic: an
192
+ * embed can succeed but the subsequent `table.add(...)` can fail, and
193
+ * `index.*` is what makes that visible. No 24h filter on `last_update_at`
194
+ * (a daemon that has not indexed in 7 days should still surface the
195
+ * stale timestamp); errors are filtered to the 24h window so old
196
+ * resolved incidents don't sit on the dashboard forever.
197
+ */
198
+ export function computeIndexHealth(dataDir, now) {
199
+ let events;
200
+ try {
201
+ events = readIndexEvents(dataDir);
202
+ }
203
+ catch {
204
+ events = [];
205
+ }
206
+ let lastSuccessTs = null;
207
+ let lastErrorTs = null;
208
+ let lastErrorReason = null;
209
+ const errorCutoff = now - INDEX_ERROR_LOOKBACK_MS;
210
+ for (const event of events) {
211
+ if (event.outcome === "success") {
212
+ // Shadow-phase successes do NOT credit `last_update_at`: a row
213
+ // written to a shadow table is "prepared", not "searchable",
214
+ // until `commitAllSwaps` runs. If the swap rolls back, those
215
+ // rows stay invisible — so claiming a fresh index from them
216
+ // would lie. The post-commit "live" event is what credits the
217
+ // real update timestamp.
218
+ const phase = event.phase ?? "live";
219
+ if (phase !== "live")
220
+ continue;
221
+ if (!lastSuccessTs || event.ts > lastSuccessTs) {
222
+ lastSuccessTs = event.ts;
223
+ }
224
+ continue;
225
+ }
226
+ // Errors at any phase (including shadow) count toward
227
+ // `last_error_at` — a per-row LanceDB write failure during shadow
228
+ // population is a real failure regardless of the eventual swap.
229
+ const eventTime = Date.parse(event.ts);
230
+ if (Number.isNaN(eventTime) || eventTime < errorCutoff)
231
+ continue;
232
+ if (!lastErrorTs || event.ts > lastErrorTs) {
233
+ lastErrorTs = event.ts;
234
+ lastErrorReason = event.error_class ?? "unknown";
235
+ }
236
+ }
237
+ return {
238
+ last_update_at: lastSuccessTs,
239
+ last_error_at: lastErrorTs,
240
+ last_error_reason: lastErrorReason,
241
+ };
242
+ }
243
+ /**
244
+ * Reduce the inbox-keyed job set to the four fields the friend-status
245
+ * route needs. Pure over the queue's snapshot (no I/O), so tests can
246
+ * pass an in-memory `JobQueue` without booting Fastify.
247
+ *
248
+ * When the queue isn't wired up (deps.jobQueue undefined), this
249
+ * returns the empty / idle shape — the renderer treats it the same
250
+ * as "nothing dropped yet."
251
+ *
252
+ * Exported for tests.
253
+ */
254
+ export function computeInboxHealth(queue, now) {
255
+ if (!queue) {
256
+ return {
257
+ last_import_at: null,
258
+ last_error_at: null,
259
+ last_error_reason: null,
260
+ pending: 0,
261
+ };
262
+ }
263
+ const jobs = queue.listByIdempotencyPrefix(INBOX_IDEMPOTENCY_PREFIX);
264
+ let lastImportTs = null;
265
+ let lastErrorTs = null;
266
+ let lastErrorReason = null;
267
+ let pending = 0;
268
+ const errorCutoff = now - INBOX_ERROR_LOOKBACK_MS;
269
+ for (const job of jobs) {
270
+ // Skip superseded jobs — the queue chains a retry by setting
271
+ // `retried_by` on the failed/completed parent and creating a fresh
272
+ // job with the same idempotency key. Counting both would let a
273
+ // long-resolved failure keep the "Inbox import errors" hint live
274
+ // for 24h after the retry already succeeded; the leaf is the only
275
+ // entry that reflects current state. (Same invariant the queue
276
+ // itself enforces in `findByIdempotencyKey`.)
277
+ if (job.retried_by !== undefined)
278
+ continue;
279
+ if (job.status === "queued" || job.status === "running") {
280
+ pending++;
281
+ continue;
282
+ }
283
+ if (job.status === "completed") {
284
+ if (!lastImportTs || job.updated_at > lastImportTs) {
285
+ lastImportTs = job.updated_at;
286
+ }
287
+ continue;
288
+ }
289
+ if (job.status === "failed") {
290
+ const eventTime = Date.parse(job.updated_at);
291
+ if (Number.isNaN(eventTime) || eventTime < errorCutoff)
292
+ continue;
293
+ if (!lastErrorTs || job.updated_at > lastErrorTs) {
294
+ lastErrorTs = job.updated_at;
295
+ lastErrorReason = classifyJobError(job);
296
+ }
297
+ }
298
+ // cancelled / interrupted: ignore — neither a successful import
299
+ // nor a real error the user can act on. A retry will be either
300
+ // queued (counted as pending) or completed/failed (counted above).
301
+ }
302
+ return {
303
+ last_import_at: lastImportTs,
304
+ last_error_at: lastErrorTs,
305
+ last_error_reason: lastErrorReason,
306
+ pending,
307
+ };
308
+ }
309
+ /**
310
+ * Best-effort short label for a failed inbox job's error. The queue
311
+ * stores the raw error message (`job.error`); we collapse it into a
312
+ * compact class keyword by substring match against the parser errors
313
+ * we know about, then fall back to a truncated form of the original
314
+ * message. Lower-cased for stability under capitalization drift.
315
+ *
316
+ * Exported for tests.
317
+ */
318
+ export function classifyJobError(job) {
319
+ const raw = (job.error ?? "").trim();
320
+ if (!raw)
321
+ return "unknown";
322
+ const lower = raw.toLowerCase();
323
+ if (lower.includes("zip slip") || lower.includes("path traversal")) {
324
+ return "unsafe_archive";
325
+ }
326
+ if (lower.includes("too large") || lower.includes("max size")) {
327
+ return "size_limit";
328
+ }
329
+ if (lower.includes("unsupported source"))
330
+ return "unsupported_source";
331
+ if (lower.includes("no conversations"))
332
+ return "empty_export";
333
+ if (lower.includes("invalid json") || lower.includes("unexpected token")) {
334
+ return "invalid_json";
335
+ }
336
+ // ADM-ZIP throws strings like "ADM-ZIP: Invalid or unsupported zip
337
+ // format" when adm-zip can't open the archive at all (corrupt header,
338
+ // truncated CD). Distinct from `unsafe_archive` (security-blocked) —
339
+ // this is "the ZIP itself is broken before we can even look inside."
340
+ if (lower.includes("adm-zip") || lower.includes("invalid or unsupported zip")) {
341
+ return "invalid_archive";
342
+ }
343
+ if (lower.includes("parser"))
344
+ return "parser_error";
345
+ // Fallback: first ≤40 chars of the raw message, single-lined.
346
+ const snippet = raw.replace(/\s+/g, " ").slice(0, 40);
347
+ return snippet || "unknown";
348
+ }
66
349
  export function registerFriendStatusRoute(server, deps) {
67
350
  server.get("/status/friend", async (_request, reply) => {
68
351
  return reply.send(buildFriendStatusPayload(deps));