@getrift/rift 0.1.0-beta.2 → 0.1.0-beta.21

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 (390) hide show
  1. package/README.md +35 -9
  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/auto-capture.d.ts +7 -0
  7. package/dist/src/capture/auto-capture.d.ts.map +1 -1
  8. package/dist/src/capture/auto-capture.js +82 -15
  9. package/dist/src/capture/auto-capture.js.map +1 -1
  10. package/dist/src/capture/auto-repair.d.ts +110 -0
  11. package/dist/src/capture/auto-repair.d.ts.map +1 -0
  12. package/dist/src/capture/auto-repair.js +269 -0
  13. package/dist/src/capture/auto-repair.js.map +1 -0
  14. package/dist/src/capture/codex-cli-triage-provider.d.ts.map +1 -1
  15. package/dist/src/capture/codex-cli-triage-provider.js +4 -3
  16. package/dist/src/capture/codex-cli-triage-provider.js.map +1 -1
  17. package/dist/src/capture/observability.d.ts +42 -0
  18. package/dist/src/capture/observability.d.ts.map +1 -1
  19. package/dist/src/capture/observability.js +45 -4
  20. package/dist/src/capture/observability.js.map +1 -1
  21. package/dist/src/capture/recover-quarantine.d.ts +260 -0
  22. package/dist/src/capture/recover-quarantine.d.ts.map +1 -0
  23. package/dist/src/capture/recover-quarantine.js +522 -0
  24. package/dist/src/capture/recover-quarantine.js.map +1 -0
  25. package/dist/src/cli/commands/backfill.d.ts.map +1 -1
  26. package/dist/src/cli/commands/backfill.js +5 -2
  27. package/dist/src/cli/commands/backfill.js.map +1 -1
  28. package/dist/src/cli/commands/capture-recover.d.ts +40 -0
  29. package/dist/src/cli/commands/capture-recover.d.ts.map +1 -0
  30. package/dist/src/cli/commands/capture-recover.js +184 -0
  31. package/dist/src/cli/commands/capture-recover.js.map +1 -0
  32. package/dist/src/cli/commands/capture.d.ts.map +1 -1
  33. package/dist/src/cli/commands/capture.js +96 -5
  34. package/dist/src/cli/commands/capture.js.map +1 -1
  35. package/dist/src/cli/commands/doctor.d.ts +6 -0
  36. package/dist/src/cli/commands/doctor.d.ts.map +1 -0
  37. package/dist/src/cli/commands/doctor.js +242 -0
  38. package/dist/src/cli/commands/doctor.js.map +1 -0
  39. package/dist/src/cli/commands/feedback.d.ts +12 -0
  40. package/dist/src/cli/commands/feedback.d.ts.map +1 -1
  41. package/dist/src/cli/commands/feedback.js +93 -4
  42. package/dist/src/cli/commands/feedback.js.map +1 -1
  43. package/dist/src/cli/commands/mcp-install.js +5 -2
  44. package/dist/src/cli/commands/mcp-install.js.map +1 -1
  45. package/dist/src/cli/commands/menubar.d.ts +80 -0
  46. package/dist/src/cli/commands/menubar.d.ts.map +1 -0
  47. package/dist/src/cli/commands/menubar.js +388 -0
  48. package/dist/src/cli/commands/menubar.js.map +1 -0
  49. package/dist/src/cli/commands/onboard.d.ts +143 -5
  50. package/dist/src/cli/commands/onboard.d.ts.map +1 -1
  51. package/dist/src/cli/commands/onboard.js +844 -188
  52. package/dist/src/cli/commands/onboard.js.map +1 -1
  53. package/dist/src/cli/commands/rebuild.d.ts.map +1 -1
  54. package/dist/src/cli/commands/rebuild.js +6 -3
  55. package/dist/src/cli/commands/rebuild.js.map +1 -1
  56. package/dist/src/cli/commands/reconcile.d.ts.map +1 -1
  57. package/dist/src/cli/commands/reconcile.js +12 -0
  58. package/dist/src/cli/commands/reconcile.js.map +1 -1
  59. package/dist/src/cli/commands/review.d.ts.map +1 -1
  60. package/dist/src/cli/commands/review.js +22 -7
  61. package/dist/src/cli/commands/review.js.map +1 -1
  62. package/dist/src/cli/commands/search.d.ts +2 -0
  63. package/dist/src/cli/commands/search.d.ts.map +1 -1
  64. package/dist/src/cli/commands/search.js +34 -4
  65. package/dist/src/cli/commands/search.js.map +1 -1
  66. package/dist/src/cli/commands/status.d.ts +9 -7
  67. package/dist/src/cli/commands/status.d.ts.map +1 -1
  68. package/dist/src/cli/commands/status.js +117 -12
  69. package/dist/src/cli/commands/status.js.map +1 -1
  70. package/dist/src/cli/commands/token-issue.d.ts.map +1 -1
  71. package/dist/src/cli/commands/token-issue.js +9 -1
  72. package/dist/src/cli/commands/token-issue.js.map +1 -1
  73. package/dist/src/cli/commands/triage.d.ts.map +1 -1
  74. package/dist/src/cli/commands/triage.js +7 -5
  75. package/dist/src/cli/commands/triage.js.map +1 -1
  76. package/dist/src/cli/commands/update.d.ts +80 -0
  77. package/dist/src/cli/commands/update.d.ts.map +1 -0
  78. package/dist/src/cli/commands/update.js +390 -0
  79. package/dist/src/cli/commands/update.js.map +1 -0
  80. package/dist/src/cli/default-config-path.d.ts +15 -0
  81. package/dist/src/cli/default-config-path.d.ts.map +1 -0
  82. package/dist/src/cli/default-config-path.js +27 -0
  83. package/dist/src/cli/default-config-path.js.map +1 -0
  84. package/dist/src/cli/feedback/feedback-config.d.ts +46 -0
  85. package/dist/src/cli/feedback/feedback-config.d.ts.map +1 -1
  86. package/dist/src/cli/feedback/feedback-config.js +130 -4
  87. package/dist/src/cli/feedback/feedback-config.js.map +1 -1
  88. package/dist/src/cli/feedback/feedback-history.d.ts +7 -0
  89. package/dist/src/cli/feedback/feedback-history.d.ts.map +1 -1
  90. package/dist/src/cli/feedback/feedback-history.js +39 -9
  91. package/dist/src/cli/feedback/feedback-history.js.map +1 -1
  92. package/dist/src/cli/feedback/feedback-payload.d.ts +22 -1
  93. package/dist/src/cli/feedback/feedback-payload.d.ts.map +1 -1
  94. package/dist/src/cli/feedback/feedback-payload.js.map +1 -1
  95. package/dist/src/cli/feedback/feedback-relay.d.ts +2 -2
  96. package/dist/src/cli/feedback/feedback-relay.d.ts.map +1 -1
  97. package/dist/src/cli/feedback/feedback-relay.js.map +1 -1
  98. package/dist/src/cli/feedback/invite.d.ts +17 -0
  99. package/dist/src/cli/feedback/invite.d.ts.map +1 -0
  100. package/dist/src/cli/feedback/invite.js +67 -0
  101. package/dist/src/cli/feedback/invite.js.map +1 -0
  102. package/dist/src/cli/feedback/relay-secret-store.d.ts +32 -0
  103. package/dist/src/cli/feedback/relay-secret-store.d.ts.map +1 -0
  104. package/dist/src/cli/feedback/relay-secret-store.js +137 -0
  105. package/dist/src/cli/feedback/relay-secret-store.js.map +1 -0
  106. package/dist/src/cli/http-client.d.ts +93 -1
  107. package/dist/src/cli/http-client.d.ts.map +1 -1
  108. package/dist/src/cli/http-client.js +254 -6
  109. package/dist/src/cli/http-client.js.map +1 -1
  110. package/dist/src/cli/index.d.ts.map +1 -1
  111. package/dist/src/cli/index.js +29 -6
  112. package/dist/src/cli/index.js.map +1 -1
  113. package/dist/src/cli/postinstall-menubar.d.ts +22 -0
  114. package/dist/src/cli/postinstall-menubar.d.ts.map +1 -0
  115. package/dist/src/cli/postinstall-menubar.js +53 -0
  116. package/dist/src/cli/postinstall-menubar.js.map +1 -0
  117. package/dist/src/cli/status/friend-header.d.ts +16 -1
  118. package/dist/src/cli/status/friend-header.d.ts.map +1 -1
  119. package/dist/src/cli/status/friend-header.js +354 -26
  120. package/dist/src/cli/status/friend-header.js.map +1 -1
  121. package/dist/src/cli/status/local-signals.d.ts +18 -0
  122. package/dist/src/cli/status/local-signals.d.ts.map +1 -1
  123. package/dist/src/cli/status/local-signals.js +29 -0
  124. package/dist/src/cli/status/local-signals.js.map +1 -1
  125. package/dist/src/cli/ui.d.ts +47 -0
  126. package/dist/src/cli/ui.d.ts.map +1 -0
  127. package/dist/src/cli/ui.js +166 -0
  128. package/dist/src/cli/ui.js.map +1 -0
  129. package/dist/src/config/schema.d.ts +79 -0
  130. package/dist/src/config/schema.d.ts.map +1 -1
  131. package/dist/src/config/schema.js +44 -0
  132. package/dist/src/config/schema.js.map +1 -1
  133. package/dist/src/diagnostics/codex-preflight.d.ts +33 -0
  134. package/dist/src/diagnostics/codex-preflight.d.ts.map +1 -0
  135. package/dist/src/diagnostics/codex-preflight.js +75 -0
  136. package/dist/src/diagnostics/codex-preflight.js.map +1 -0
  137. package/dist/src/diagnostics/doctor.d.ts +114 -0
  138. package/dist/src/diagnostics/doctor.d.ts.map +1 -0
  139. package/dist/src/diagnostics/doctor.js +352 -0
  140. package/dist/src/diagnostics/doctor.js.map +1 -0
  141. package/dist/src/diagnostics/notify.d.ts +90 -0
  142. package/dist/src/diagnostics/notify.d.ts.map +1 -0
  143. package/dist/src/diagnostics/notify.js +177 -0
  144. package/dist/src/diagnostics/notify.js.map +1 -0
  145. package/dist/src/diagnostics/repair-prompt.d.ts +49 -0
  146. package/dist/src/diagnostics/repair-prompt.d.ts.map +1 -0
  147. package/dist/src/diagnostics/repair-prompt.js +223 -0
  148. package/dist/src/diagnostics/repair-prompt.js.map +1 -0
  149. package/dist/src/ingestion/inbox-core/conversation-fingerprint.d.ts +2 -0
  150. package/dist/src/ingestion/inbox-core/conversation-fingerprint.d.ts.map +1 -0
  151. package/dist/src/ingestion/inbox-core/conversation-fingerprint.js +27 -0
  152. package/dist/src/ingestion/inbox-core/conversation-fingerprint.js.map +1 -0
  153. package/dist/src/ingestion/inbox-core/conversation-key.d.ts +2 -0
  154. package/dist/src/ingestion/inbox-core/conversation-key.d.ts.map +1 -0
  155. package/dist/src/ingestion/inbox-core/conversation-key.js +31 -0
  156. package/dist/src/ingestion/inbox-core/conversation-key.js.map +1 -0
  157. package/dist/src/ingestion/inbox-core/extensions.d.ts +3 -0
  158. package/dist/src/ingestion/inbox-core/extensions.d.ts.map +1 -0
  159. package/dist/src/ingestion/inbox-core/extensions.js +16 -0
  160. package/dist/src/ingestion/inbox-core/extensions.js.map +1 -0
  161. package/dist/src/ingestion/inbox-core/idempotency.d.ts +2 -0
  162. package/dist/src/ingestion/inbox-core/idempotency.d.ts.map +1 -0
  163. package/dist/src/ingestion/inbox-core/idempotency.js +22 -0
  164. package/dist/src/ingestion/inbox-core/idempotency.js.map +1 -0
  165. package/dist/src/ingestion/inbox-core/index.d.ts +20 -0
  166. package/dist/src/ingestion/inbox-core/index.d.ts.map +1 -0
  167. package/dist/src/ingestion/inbox-core/index.js +20 -0
  168. package/dist/src/ingestion/inbox-core/index.js.map +1 -0
  169. package/dist/src/ingestion/inbox-core/source-detection.d.ts +2 -0
  170. package/dist/src/ingestion/inbox-core/source-detection.d.ts.map +1 -0
  171. package/dist/src/ingestion/inbox-core/source-detection.js +23 -0
  172. package/dist/src/ingestion/inbox-core/source-detection.js.map +1 -0
  173. package/dist/src/ingestion/inbox-core/source-sniffer.d.ts +11 -0
  174. package/dist/src/ingestion/inbox-core/source-sniffer.d.ts.map +1 -0
  175. package/dist/src/ingestion/inbox-core/source-sniffer.js +69 -0
  176. package/dist/src/ingestion/inbox-core/source-sniffer.js.map +1 -0
  177. package/dist/src/ingestion/inbox-core/zip-sniffer.d.ts +70 -0
  178. package/dist/src/ingestion/inbox-core/zip-sniffer.d.ts.map +1 -0
  179. package/dist/src/ingestion/inbox-core/zip-sniffer.js +161 -0
  180. package/dist/src/ingestion/inbox-core/zip-sniffer.js.map +1 -0
  181. package/dist/src/ingestion/inbox-watcher.d.ts.map +1 -1
  182. package/dist/src/ingestion/inbox-watcher.js +34 -50
  183. package/dist/src/ingestion/inbox-watcher.js.map +1 -1
  184. package/dist/src/ingestion/indexer.d.ts +7 -0
  185. package/dist/src/ingestion/indexer.d.ts.map +1 -1
  186. package/dist/src/ingestion/indexer.js +36 -2
  187. package/dist/src/ingestion/indexer.js.map +1 -1
  188. package/dist/src/ingestion/metadata-extraction.d.ts +8 -5
  189. package/dist/src/ingestion/metadata-extraction.d.ts.map +1 -1
  190. package/dist/src/ingestion/metadata-extraction.js +24 -5
  191. package/dist/src/ingestion/metadata-extraction.js.map +1 -1
  192. package/dist/src/ingestion/skip-quarantine.d.ts +10 -0
  193. package/dist/src/ingestion/skip-quarantine.d.ts.map +1 -0
  194. package/dist/src/ingestion/skip-quarantine.js +35 -0
  195. package/dist/src/ingestion/skip-quarantine.js.map +1 -0
  196. package/dist/src/jobs/handlers/compact.d.ts.map +1 -1
  197. package/dist/src/jobs/handlers/compact.js +30 -4
  198. package/dist/src/jobs/handlers/compact.js.map +1 -1
  199. package/dist/src/jobs/handlers/dedupe-conversations.d.ts +134 -0
  200. package/dist/src/jobs/handlers/dedupe-conversations.d.ts.map +1 -0
  201. package/dist/src/jobs/handlers/dedupe-conversations.js +371 -0
  202. package/dist/src/jobs/handlers/dedupe-conversations.js.map +1 -0
  203. package/dist/src/jobs/handlers/ingest.d.ts.map +1 -1
  204. package/dist/src/jobs/handlers/ingest.js +295 -41
  205. package/dist/src/jobs/handlers/ingest.js.map +1 -1
  206. package/dist/src/jobs/handlers/reconcile.d.ts +28 -0
  207. package/dist/src/jobs/handlers/reconcile.d.ts.map +1 -1
  208. package/dist/src/jobs/handlers/reconcile.js +145 -19
  209. package/dist/src/jobs/handlers/reconcile.js.map +1 -1
  210. package/dist/src/jobs/handlers/reindex.d.ts.map +1 -1
  211. package/dist/src/jobs/handlers/reindex.js +13 -2
  212. package/dist/src/jobs/handlers/reindex.js.map +1 -1
  213. package/dist/src/jobs/handlers/save.d.ts.map +1 -1
  214. package/dist/src/jobs/handlers/save.js +57 -3
  215. package/dist/src/jobs/handlers/save.js.map +1 -1
  216. package/dist/src/jobs/queue.d.ts +51 -1
  217. package/dist/src/jobs/queue.d.ts.map +1 -1
  218. package/dist/src/jobs/queue.js +466 -26
  219. package/dist/src/jobs/queue.js.map +1 -1
  220. package/dist/src/jobs/worker-entry.d.ts.map +1 -1
  221. package/dist/src/jobs/worker-entry.js +35 -7
  222. package/dist/src/jobs/worker-entry.js.map +1 -1
  223. package/dist/src/jobs/worker-process.d.ts +11 -0
  224. package/dist/src/jobs/worker-process.d.ts.map +1 -1
  225. package/dist/src/jobs/worker-process.js +37 -4
  226. package/dist/src/jobs/worker-process.js.map +1 -1
  227. package/dist/src/main.js +199 -46
  228. package/dist/src/main.js.map +1 -1
  229. package/dist/src/mcp/errors.d.ts.map +1 -1
  230. package/dist/src/mcp/errors.js +20 -1
  231. package/dist/src/mcp/errors.js.map +1 -1
  232. package/dist/src/mcp/server.d.ts.map +1 -1
  233. package/dist/src/mcp/server.js +43 -3
  234. package/dist/src/mcp/server.js.map +1 -1
  235. package/dist/src/mcp/tools/context-pack.d.ts.map +1 -1
  236. package/dist/src/mcp/tools/context-pack.js +164 -23
  237. package/dist/src/mcp/tools/context-pack.js.map +1 -1
  238. package/dist/src/mcp/tools/search.d.ts +6 -2
  239. package/dist/src/mcp/tools/search.d.ts.map +1 -1
  240. package/dist/src/mcp/tools/search.js +35 -4
  241. package/dist/src/mcp/tools/search.js.map +1 -1
  242. package/dist/src/observability/embedding-events.d.ts +52 -0
  243. package/dist/src/observability/embedding-events.d.ts.map +1 -0
  244. package/dist/src/observability/embedding-events.js +149 -0
  245. package/dist/src/observability/embedding-events.js.map +1 -0
  246. package/dist/src/observability/index-events.d.ts +70 -0
  247. package/dist/src/observability/index-events.d.ts.map +1 -0
  248. package/dist/src/observability/index-events.js +148 -0
  249. package/dist/src/observability/index-events.js.map +1 -0
  250. package/dist/src/observability/onboarding-metric.d.ts +131 -0
  251. package/dist/src/observability/onboarding-metric.d.ts.map +1 -0
  252. package/dist/src/observability/onboarding-metric.js +351 -0
  253. package/dist/src/observability/onboarding-metric.js.map +1 -0
  254. package/dist/src/observability/tool-usage-stats.d.ts +77 -4
  255. package/dist/src/observability/tool-usage-stats.d.ts.map +1 -1
  256. package/dist/src/observability/tool-usage-stats.js +112 -32
  257. package/dist/src/observability/tool-usage-stats.js.map +1 -1
  258. package/dist/src/observability/tool-usage.d.ts +100 -7
  259. package/dist/src/observability/tool-usage.d.ts.map +1 -1
  260. package/dist/src/observability/tool-usage.js +196 -33
  261. package/dist/src/observability/tool-usage.js.map +1 -1
  262. package/dist/src/observability/version-check.d.ts +71 -0
  263. package/dist/src/observability/version-check.d.ts.map +1 -0
  264. package/dist/src/observability/version-check.js +198 -0
  265. package/dist/src/observability/version-check.js.map +1 -0
  266. package/dist/src/providers/basic-metadata-extraction.d.ts +60 -0
  267. package/dist/src/providers/basic-metadata-extraction.d.ts.map +1 -0
  268. package/dist/src/providers/basic-metadata-extraction.js +114 -0
  269. package/dist/src/providers/basic-metadata-extraction.js.map +1 -0
  270. package/dist/src/providers/codex-cli-metadata-extraction.d.ts +1 -0
  271. package/dist/src/providers/codex-cli-metadata-extraction.d.ts.map +1 -1
  272. package/dist/src/providers/codex-cli-metadata-extraction.js +6 -2
  273. package/dist/src/providers/codex-cli-metadata-extraction.js.map +1 -1
  274. package/dist/src/providers/codex-cli-model.d.ts +61 -0
  275. package/dist/src/providers/codex-cli-model.d.ts.map +1 -0
  276. package/dist/src/providers/codex-cli-model.js +194 -0
  277. package/dist/src/providers/codex-cli-model.js.map +1 -0
  278. package/dist/src/providers/codex-cli-runner.d.ts +39 -0
  279. package/dist/src/providers/codex-cli-runner.d.ts.map +1 -1
  280. package/dist/src/providers/codex-cli-runner.js +234 -48
  281. package/dist/src/providers/codex-cli-runner.js.map +1 -1
  282. package/dist/src/providers/conversation-generation.d.ts.map +1 -1
  283. package/dist/src/providers/conversation-generation.js +43 -6
  284. package/dist/src/providers/conversation-generation.js.map +1 -1
  285. package/dist/src/providers/ollama-embed.d.ts +2 -1
  286. package/dist/src/providers/ollama-embed.d.ts.map +1 -1
  287. package/dist/src/providers/ollama-embed.js +1 -0
  288. package/dist/src/providers/ollama-embed.js.map +1 -1
  289. package/dist/src/providers/openai-metadata-extraction.d.ts +3 -3
  290. package/dist/src/providers/openai-metadata-extraction.d.ts.map +1 -1
  291. package/dist/src/providers/openai-metadata-extraction.js +18 -3
  292. package/dist/src/providers/openai-metadata-extraction.js.map +1 -1
  293. package/dist/src/providers/placeholder-embed.d.ts +56 -0
  294. package/dist/src/providers/placeholder-embed.d.ts.map +1 -0
  295. package/dist/src/providers/placeholder-embed.js +64 -0
  296. package/dist/src/providers/placeholder-embed.js.map +1 -0
  297. package/dist/src/providers/stub.d.ts +2 -0
  298. package/dist/src/providers/stub.d.ts.map +1 -1
  299. package/dist/src/providers/stub.js +2 -0
  300. package/dist/src/providers/stub.js.map +1 -1
  301. package/dist/src/providers/types.d.ts +11 -0
  302. package/dist/src/providers/types.d.ts.map +1 -1
  303. package/dist/src/providers/voyage.d.ts +2 -1
  304. package/dist/src/providers/voyage.d.ts.map +1 -1
  305. package/dist/src/providers/voyage.js +1 -0
  306. package/dist/src/providers/voyage.js.map +1 -1
  307. package/dist/src/retrieval/compact.d.ts +116 -2
  308. package/dist/src/retrieval/compact.d.ts.map +1 -1
  309. package/dist/src/retrieval/compact.js +158 -5
  310. package/dist/src/retrieval/compact.js.map +1 -1
  311. package/dist/src/retrieval/context-pack.d.ts +114 -0
  312. package/dist/src/retrieval/context-pack.d.ts.map +1 -1
  313. package/dist/src/retrieval/context-pack.js +292 -8
  314. package/dist/src/retrieval/context-pack.js.map +1 -1
  315. package/dist/src/retrieval/current-truth.d.ts +360 -0
  316. package/dist/src/retrieval/current-truth.d.ts.map +1 -0
  317. package/dist/src/retrieval/current-truth.js +766 -0
  318. package/dist/src/retrieval/current-truth.js.map +1 -0
  319. package/dist/src/retrieval/git-state.d.ts +53 -0
  320. package/dist/src/retrieval/git-state.d.ts.map +1 -0
  321. package/dist/src/retrieval/git-state.js +174 -0
  322. package/dist/src/retrieval/git-state.js.map +1 -0
  323. package/dist/src/retrieval/lexical.d.ts.map +1 -1
  324. package/dist/src/retrieval/lexical.js +19 -3
  325. package/dist/src/retrieval/lexical.js.map +1 -1
  326. package/dist/src/retrieval/locator-boost.d.ts +37 -0
  327. package/dist/src/retrieval/locator-boost.d.ts.map +1 -0
  328. package/dist/src/retrieval/locator-boost.js +129 -0
  329. package/dist/src/retrieval/locator-boost.js.map +1 -0
  330. package/dist/src/retrieval/report-demotion.d.ts +46 -0
  331. package/dist/src/retrieval/report-demotion.d.ts.map +1 -0
  332. package/dist/src/retrieval/report-demotion.js +169 -0
  333. package/dist/src/retrieval/report-demotion.js.map +1 -0
  334. package/dist/src/retrieval/vector.d.ts.map +1 -1
  335. package/dist/src/retrieval/vector.js +11 -2
  336. package/dist/src/retrieval/vector.js.map +1 -1
  337. package/dist/src/server/app.d.ts.map +1 -1
  338. package/dist/src/server/app.js +92 -11
  339. package/dist/src/server/app.js.map +1 -1
  340. package/dist/src/server/routes/compact.d.ts.map +1 -1
  341. package/dist/src/server/routes/compact.js +4 -1
  342. package/dist/src/server/routes/compact.js.map +1 -1
  343. package/dist/src/server/routes/context.d.ts +1 -1
  344. package/dist/src/server/routes/context.d.ts.map +1 -1
  345. package/dist/src/server/routes/context.js +2 -1
  346. package/dist/src/server/routes/context.js.map +1 -1
  347. package/dist/src/server/routes/conversations-search.d.ts.map +1 -1
  348. package/dist/src/server/routes/conversations-search.js +28 -3
  349. package/dist/src/server/routes/conversations-search.js.map +1 -1
  350. package/dist/src/server/routes/enqueue.d.ts +11 -0
  351. package/dist/src/server/routes/enqueue.d.ts.map +1 -0
  352. package/dist/src/server/routes/enqueue.js +17 -0
  353. package/dist/src/server/routes/enqueue.js.map +1 -0
  354. package/dist/src/server/routes/friend-status.d.ts +339 -3
  355. package/dist/src/server/routes/friend-status.d.ts.map +1 -1
  356. package/dist/src/server/routes/friend-status.js +447 -13
  357. package/dist/src/server/routes/friend-status.js.map +1 -1
  358. package/dist/src/server/routes/ingest.d.ts.map +1 -1
  359. package/dist/src/server/routes/ingest.js +5 -2
  360. package/dist/src/server/routes/ingest.js.map +1 -1
  361. package/dist/src/server/routes/mcp-usage.d.ts +5 -4
  362. package/dist/src/server/routes/mcp-usage.d.ts.map +1 -1
  363. package/dist/src/server/routes/mcp-usage.js.map +1 -1
  364. package/dist/src/server/routes/reconcile.d.ts.map +1 -1
  365. package/dist/src/server/routes/reconcile.js +20 -1
  366. package/dist/src/server/routes/reconcile.js.map +1 -1
  367. package/dist/src/server/routes/reindex.d.ts.map +1 -1
  368. package/dist/src/server/routes/reindex.js +4 -1
  369. package/dist/src/server/routes/reindex.js.map +1 -1
  370. package/dist/src/server/routes/save.d.ts.map +1 -1
  371. package/dist/src/server/routes/save.js +4 -1
  372. package/dist/src/server/routes/save.js.map +1 -1
  373. package/dist/src/server/routes/search.d.ts +1 -1
  374. package/dist/src/server/routes/search.d.ts.map +1 -1
  375. package/dist/src/server/routes/search.js +253 -29
  376. package/dist/src/server/routes/search.js.map +1 -1
  377. package/dist/src/server/routes/triage.d.ts.map +1 -1
  378. package/dist/src/server/routes/triage.js +4 -1
  379. package/dist/src/server/routes/triage.js.map +1 -1
  380. package/dist/src/storage/rebuild.d.ts +35 -1
  381. package/dist/src/storage/rebuild.d.ts.map +1 -1
  382. package/dist/src/storage/rebuild.js +288 -64
  383. package/dist/src/storage/rebuild.js.map +1 -1
  384. package/dist/src/storage/tables.d.ts +29 -0
  385. package/dist/src/storage/tables.d.ts.map +1 -1
  386. package/dist/src/storage/tables.js +32 -1
  387. package/dist/src/storage/tables.js.map +1 -1
  388. package/operator/swiftbar/render-menu.py +524 -0
  389. package/operator/swiftbar/rift.10s.sh +176 -0
  390. package/package.json +9 -3
@@ -0,0 +1,177 @@
1
+ /**
2
+ * Native failure notifications for daemon-observed problems.
3
+ *
4
+ * A running daemon can see capture failures, expired Codex login, an
5
+ * invalid/failing Voyage key, and index-write failures. When one of
6
+ * those crosses into a failing state, the friend should get one calm
7
+ * macOS notification that points at the repair surface — not a wall of
8
+ * logs, and not a notification on every poll.
9
+ *
10
+ * What this module does NOT cover: a fully dead daemon cannot notify
11
+ * about itself. That needs a separate watchdog and is explicitly Slice D
12
+ * (see docs/feedback/2026-05-20-friend-onboarding-status-surface.md).
13
+ *
14
+ * Rate-limiting rules (from the status-surface plan):
15
+ * - Notify on state transition, not every poll.
16
+ * - Do not repeat the same unresolved issue more than once per day.
17
+ * - Notify again after the issue resolves and later recurs.
18
+ *
19
+ * The planning logic (`planNotifications`) is pure and fully tested; the
20
+ * IO (reading/writing dedup state, sending via osascript) is thin and
21
+ * best-effort so a notification failure can never break capture.
22
+ */
23
+ import { execFile } from "node:child_process";
24
+ import fs from "node:fs";
25
+ import path from "node:path";
26
+ /** Re-notify cadence for an issue that stays unresolved. */
27
+ export const RENOTIFY_INTERVAL_MS = 24 * 60 * 60 * 1000;
28
+ /** Cause identity for an issue: explicit fingerprint, else its kind. */
29
+ function issueFingerprint(issue) {
30
+ return issue.fingerprint ?? issue.kind;
31
+ }
32
+ /**
33
+ * Build the friend-facing notification for an issue. Pure. The title is
34
+ * intentionally constant ("Rift needs attention") so the friend learns
35
+ * to recognise it; the subtitle and body carry the specifics.
36
+ */
37
+ export function buildNotificationPayload(issue) {
38
+ return {
39
+ title: "Rift needs attention",
40
+ subtitle: issue.title,
41
+ message: issue.nextAction,
42
+ };
43
+ }
44
+ /**
45
+ * Decide which notifications to send this tick and what state to persist.
46
+ * Pure: no IO, no clock except the injected `now`.
47
+ *
48
+ * Only `daemonObservable` issues are eligible — the daemon must not
49
+ * notify about things it cannot itself observe (e.g. a dead daemon, or
50
+ * user-side rejected imports).
51
+ */
52
+ export function planNotifications(input) {
53
+ const { issues, state, now } = input;
54
+ const eligible = issues.filter((i) => i.daemonObservable);
55
+ const eligibleKinds = new Set(eligible.map((i) => i.kind));
56
+ const nextActive = {};
57
+ const notifications = [];
58
+ for (const issue of eligible) {
59
+ const prior = state.active[issue.kind];
60
+ const fingerprint = issueFingerprint(issue);
61
+ const notify = () => {
62
+ notifications.push(buildNotificationPayload(issue));
63
+ nextActive[issue.kind] = {
64
+ last_notified_at: new Date(now).toISOString(),
65
+ fingerprint,
66
+ };
67
+ };
68
+ if (!prior) {
69
+ // New transition into failure → notify.
70
+ notify();
71
+ continue;
72
+ }
73
+ // The cause changed under the same subsystem (e.g. a Voyage network
74
+ // blip became a provider rejection). The action and risk differ, so
75
+ // treat it as a fresh failure rather than a still-unresolved repeat.
76
+ if ((prior.fingerprint ?? issue.kind) !== fingerprint) {
77
+ notify();
78
+ continue;
79
+ }
80
+ const priorMs = Date.parse(prior.last_notified_at);
81
+ const stale = Number.isNaN(priorMs) || now - priorMs >= RENOTIFY_INTERVAL_MS;
82
+ if (stale) {
83
+ // Still failing, same cause, a day later → re-notify once.
84
+ notify();
85
+ }
86
+ else {
87
+ // Already notified within the window → stay quiet, keep record.
88
+ nextActive[issue.kind] = prior;
89
+ }
90
+ }
91
+ // Anything previously active but no longer present has resolved; it is
92
+ // simply absent from `nextActive`, so a later recurrence notifies fresh.
93
+ void eligibleKinds;
94
+ return { notifications, nextState: { active: nextActive } };
95
+ }
96
+ /** Absolute path to the dedup-state file under the data dir. */
97
+ export function notifyStatePath(dataDir) {
98
+ return path.join(dataDir, "observability", "notifications.json");
99
+ }
100
+ /** Read dedup state; returns empty state on any read/parse failure. */
101
+ export function readNotifyState(dataDir) {
102
+ try {
103
+ const raw = fs.readFileSync(notifyStatePath(dataDir), "utf8");
104
+ const parsed = JSON.parse(raw);
105
+ if (parsed && typeof parsed === "object" && parsed.active) {
106
+ return { active: parsed.active };
107
+ }
108
+ }
109
+ catch {
110
+ // fall through
111
+ }
112
+ return { active: {} };
113
+ }
114
+ /** Persist dedup state best-effort; swallows IO errors. */
115
+ export function writeNotifyState(dataDir, state) {
116
+ try {
117
+ const file = notifyStatePath(dataDir);
118
+ fs.mkdirSync(path.dirname(file), { recursive: true });
119
+ fs.writeFileSync(file, JSON.stringify(state, null, 2) + "\n", "utf8");
120
+ }
121
+ catch {
122
+ // best-effort: a failed write just means we may re-notify next tick.
123
+ }
124
+ }
125
+ /**
126
+ * Send a single notification via macOS `osascript`. Best-effort and
127
+ * fire-and-forget — any failure (non-macOS, osascript missing, user has
128
+ * notifications disabled) is swallowed so capture is never affected.
129
+ *
130
+ * Strings are passed as argv to `execFile` (not interpolated into a
131
+ * shell), and AppleScript string literals are escaped, so notification
132
+ * text cannot inject shell or AppleScript.
133
+ */
134
+ export function sendNotification(payload, opts = {}) {
135
+ const platform = opts.platform ?? process.platform;
136
+ if (platform !== "darwin")
137
+ return;
138
+ const script = `display notification ${asAppleScriptString(payload.message)} ` +
139
+ `with title ${asAppleScriptString(payload.title)} ` +
140
+ `subtitle ${asAppleScriptString(payload.subtitle)}`;
141
+ try {
142
+ execFile("osascript", ["-e", script], () => {
143
+ // ignore stdout/stderr/exit — best-effort.
144
+ });
145
+ }
146
+ catch {
147
+ // ignore spawn errors entirely.
148
+ }
149
+ }
150
+ /** Escape a string into an AppleScript double-quoted literal. */
151
+ export function asAppleScriptString(value) {
152
+ return `"${value.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
153
+ }
154
+ /**
155
+ * End-to-end daemon helper: given the diagnosed issues, send any due
156
+ * notifications and persist updated dedup state. Best-effort throughout
157
+ * — wired into the capture loop, so it must never throw.
158
+ */
159
+ export function notifyDaemonFailures(dataDir, issues, opts = {}) {
160
+ try {
161
+ const now = opts.now ?? Date.now();
162
+ const state = readNotifyState(dataDir);
163
+ const { notifications, nextState } = planNotifications({
164
+ issues,
165
+ state,
166
+ now,
167
+ });
168
+ for (const payload of notifications) {
169
+ sendNotification(payload, opts.platform ? { platform: opts.platform } : {});
170
+ }
171
+ writeNotifyState(dataDir, nextState);
172
+ }
173
+ catch {
174
+ // best-effort: never let notification logic break the daemon.
175
+ }
176
+ }
177
+ //# sourceMappingURL=notify.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notify.js","sourceRoot":"","sources":["../../../src/diagnostics/notify.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * Redacted repair-prompt generator for `rift doctor --copy-prompt`.
3
+ *
4
+ * The output is designed to be pasted straight into Claude or Codex and
5
+ * be safe to do so. It carries enough state to debug Rift but never
6
+ * leaks a secret, and it forbids destructive repair so an over-eager
7
+ * assistant cannot wipe the user's memory.
8
+ *
9
+ * Redaction contract (see the friend-onboarding status-surface plan):
10
+ * - Never include full Voyage keys, auth tokens, bearer tokens, or raw
11
+ * private conversation content.
12
+ * - Voyage keys appear only as a last-4 fingerprint, and only when one
13
+ * is known locally.
14
+ * - Local paths are allowed only when they help repair (data + log
15
+ * locations), because they are not secrets and the assistant needs
16
+ * them to inspect the right folder.
17
+ *
18
+ * Safety contract:
19
+ * - Tell the assistant to inspect before changing anything.
20
+ * - Prefer commands that inspect/repair over commands that reset.
21
+ * - Explicitly forbid destructive resets and
22
+ * `rift uninstall --purge-data`.
23
+ *
24
+ * This module is pure (no IO). Centralizing prompt generation here —
25
+ * rather than in the SwiftBar script or the CLI command — keeps
26
+ * redaction, status interpretation, and future issue classes in one
27
+ * place (Slice C's menu bar will call this same generator).
28
+ */
29
+ import type { FriendStatusPayload } from "../server/routes/friend-status.js";
30
+ import type { DoctorLocalSignals, DoctorReport } from "./doctor.js";
31
+ export type RepairTarget = "claude" | "codex";
32
+ export interface RepairPromptInput {
33
+ report: DoctorReport;
34
+ status: FriendStatusPayload | null;
35
+ localSignals: DoctorLocalSignals;
36
+ }
37
+ /**
38
+ * Commands the assistant must never run from this prompt. Kept as data
39
+ * so the test suite can assert every one is named in the rendered
40
+ * "Constraints" block.
41
+ */
42
+ export declare const FORBIDDEN_COMMANDS: readonly string[];
43
+ /**
44
+ * Build the repair prompt. `target` only changes which assistant the
45
+ * prompt addresses; the state and safety rules are identical so neither
46
+ * tool can be talked into something the other forbids.
47
+ */
48
+ export declare function buildRepairPrompt(input: RepairPromptInput, target: RepairTarget): string;
49
+ //# sourceMappingURL=repair-prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repair-prompt.d.ts","sourceRoot":"","sources":["../../../src/diagnostics/repair-prompt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEpE,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,OAAO,CAAC;AAE9C,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,YAAY,CAAC;IACrB,MAAM,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACnC,YAAY,EAAE,kBAAkB,CAAC;CAClC;AAED;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,EAAE,SAAS,MAAM,EAI/C,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,YAAY,GACnB,MAAM,CAsER"}
@@ -0,0 +1,223 @@
1
+ /**
2
+ * Commands the assistant must never run from this prompt. Kept as data
3
+ * so the test suite can assert every one is named in the rendered
4
+ * "Constraints" block.
5
+ */
6
+ export const FORBIDDEN_COMMANDS = [
7
+ "rift uninstall --purge-data",
8
+ "rift rebuild --reset",
9
+ "rm -rf",
10
+ ];
11
+ /**
12
+ * Build the repair prompt. `target` only changes which assistant the
13
+ * prompt addresses; the state and safety rules are identical so neither
14
+ * tool can be talked into something the other forbids.
15
+ */
16
+ export function buildRepairPrompt(input, target) {
17
+ const { report, status, localSignals } = input;
18
+ const assistant = target === "claude" ? "Claude" : "Codex";
19
+ // Open with the right severity. "Rift is not healthy" is correct only
20
+ // when something is actually broken; a warning-only state (e.g. large
21
+ // sessions parked, an available update) must not tell the user their
22
+ // Rift is broken — that copy erodes trust on a working install.
23
+ const hasBroken = report.issues.some((i) => i.severity === "broken");
24
+ const onlyParked = !hasBroken &&
25
+ report.issues.some((i) => i.kind === "capture_quarantined" || i.kind === "capture_repairing");
26
+ const opener = hasBroken
27
+ ? `Rift is not healthy on this Mac. Please help me fix it, ${assistant}.`
28
+ : onlyParked
29
+ ? `Rift is working, but some large Codex sessions are not searchable yet. ` +
30
+ `Please help me recover them, ${assistant}.`
31
+ : `Rift is working, but a few things could use attention. ` +
32
+ `Please help me sort them out, ${assistant}.`;
33
+ const lines = [];
34
+ lines.push(opener);
35
+ lines.push("");
36
+ // --- Symptoms: the diagnosed issues, plain-language, no secrets. ---
37
+ lines.push("Symptoms:");
38
+ if (report.issues.length === 0) {
39
+ lines.push("- rift doctor found no specific broken signal, but I think something " +
40
+ "is off. Please investigate.");
41
+ }
42
+ else {
43
+ for (const issue of report.issues) {
44
+ lines.push(`- ${issue.title}. ${issue.detail}`);
45
+ }
46
+ }
47
+ lines.push("");
48
+ // --- State: redacted, debug-useful facts. ---
49
+ lines.push("Current state:");
50
+ for (const line of renderStateLines(report, status, localSignals)) {
51
+ lines.push(`- ${line}`);
52
+ }
53
+ lines.push("");
54
+ // --- Inspect-first checklist, ordered by the primary issue. ---
55
+ lines.push("Start by inspecting, in this order:");
56
+ let step = 1;
57
+ lines.push(`${step++}. \`rift status\` — confirm the current state for yourself.`);
58
+ lines.push(`${step++}. \`rift doctor\` — read the plain-language diagnosis.`);
59
+ for (const cmd of inspectionCommandsFor(report)) {
60
+ lines.push(`${step++}. ${cmd}`);
61
+ }
62
+ lines.push(`${step++}. Rift logs only if the above is not enough.`);
63
+ lines.push("");
64
+ // --- Hard constraints. ---
65
+ lines.push("Constraints:");
66
+ lines.push("- Explain the failure to me in plain English BEFORE changing anything.");
67
+ lines.push("- Inspect first; prefer commands that inspect and repair over commands that reset.");
68
+ lines.push("- Do not print or echo secrets (Voyage key, tokens).");
69
+ lines.push("- Do not delete or reset my Rift data.");
70
+ for (const forbidden of FORBIDDEN_COMMANDS) {
71
+ lines.push(`- Do not run \`${forbidden}\`.`);
72
+ }
73
+ lines.push("- If a fix is risky or irreversible, stop and ask me first.");
74
+ return lines.join("\n");
75
+ }
76
+ /**
77
+ * Render the redacted "Current state" facts. Every value here is either
78
+ * non-sensitive (versions, ports, booleans, ages) or already reduced to
79
+ * a safe fingerprint (Voyage last-4). Raw keys, tokens, and conversation
80
+ * content never reach this function.
81
+ */
82
+ function renderStateLines(report, status, localSignals) {
83
+ const out = [];
84
+ if (!status) {
85
+ // The reason /status/friend could not be read drives the state copy:
86
+ // "not responding" is only true for a genuinely down daemon, not for
87
+ // an auth/config failure where the daemon may be perfectly alive.
88
+ switch (report.primary?.kind) {
89
+ case "config_missing":
90
+ out.push("Rift config: missing (could not resolve the daemon URL).");
91
+ out.push("This Mac looks like onboarding never completed.");
92
+ break;
93
+ case "daemon_auth_failed":
94
+ out.push("Rift daemon: reachable, but this command could not authenticate " +
95
+ "to it (missing or rejected token). The daemon itself may be fine.");
96
+ break;
97
+ default:
98
+ out.push("Rift daemon: not responding (could not reach /status/friend).");
99
+ break;
100
+ }
101
+ out.push("Expected daemon label: com.getrift.daemon (managed by launchd on port 3577).");
102
+ out.push(voyageFingerprintLine(localSignals));
103
+ out.push(mcpLine(localSignals));
104
+ return out;
105
+ }
106
+ out.push(`Rift version: ${status.build.version} (node ${status.build.node}).`);
107
+ out.push(`Daemon: running on port ${status.daemon.port}, up ${formatSeconds(status.daemon.uptime_seconds)}.`);
108
+ // data_dir is a local path, not a secret, and the assistant needs it
109
+ // to inspect the right data root (a stale Application Support copy is
110
+ // a real false-alarm source).
111
+ out.push(`Data directory: ${status.daemon.data_dir}`);
112
+ out.push(`Voyage key present in daemon env: ${status.daemon.voyage_key_present ? "yes" : "no"}.`);
113
+ out.push(voyageFingerprintLine(localSignals));
114
+ if (status.voyage.last_embed_at) {
115
+ out.push(`Last successful embed: ${status.voyage.last_embed_at}.`);
116
+ }
117
+ if (status.voyage.last_error_at) {
118
+ out.push(`Last Voyage error: ${status.voyage.last_error_at} (${status.voyage.last_error_reason ?? "unknown"}).`);
119
+ }
120
+ if (status.index.last_update_at) {
121
+ out.push(`Last index write: ${status.index.last_update_at}.`);
122
+ }
123
+ if (status.index.last_error_at) {
124
+ out.push(`Last index error: ${status.index.last_error_at} (${status.index.last_error_reason ?? "unknown"}).`);
125
+ }
126
+ out.push(`Codex CLI auth: ${codexAuthLabel(status.codex.last_preflight_ok)}${status.codex.last_preflight_at
127
+ ? ` (last checked ${status.codex.last_preflight_at})`
128
+ : ""}.`);
129
+ if (status.capture.last_run_at) {
130
+ out.push(`Last capture run: ${status.capture.last_run_at} — ${status.capture.last_saved} saved, ` +
131
+ `${status.capture.last_review} for review, ${status.capture.last_errors} errors.`);
132
+ }
133
+ else {
134
+ out.push("Last capture run: none yet.");
135
+ }
136
+ out.push(mcpLine(localSignals));
137
+ return out;
138
+ }
139
+ function voyageFingerprintLine(localSignals) {
140
+ return localSignals.voyageLast4
141
+ ? `Voyage key fingerprint (last 4 only): …${localSignals.voyageLast4}.`
142
+ : "Voyage key fingerprint: not found locally.";
143
+ }
144
+ function mcpLine(localSignals) {
145
+ if (localSignals.mcpClients.length === 0) {
146
+ return "MCP clients: none detected.";
147
+ }
148
+ const parts = localSignals.mcpClients.map((c) => `${c.client}=${c.installed ? "connected" : "not connected"}`);
149
+ return `MCP clients: ${parts.join(", ")}.`;
150
+ }
151
+ function codexAuthLabel(ok) {
152
+ if (ok === null)
153
+ return "unknown (not checked yet)";
154
+ return ok ? "looks authenticated" : "appears expired";
155
+ }
156
+ /**
157
+ * Issue-specific inspection commands, deduped and ordered by the issues
158
+ * present. Inspection/repair only — nothing here resets state.
159
+ */
160
+ function inspectionCommandsFor(report) {
161
+ const cmds = [];
162
+ const seen = new Set();
163
+ const add = (cmd) => {
164
+ if (!seen.has(cmd)) {
165
+ seen.add(cmd);
166
+ cmds.push(cmd);
167
+ }
168
+ };
169
+ for (const issue of report.issues) {
170
+ switch (issue.kind) {
171
+ case "daemon_unreachable":
172
+ add("`launchctl print gui/$UID/com.getrift.daemon` — check the daemon is loaded and not crash-looping.");
173
+ break;
174
+ case "daemon_auth_failed":
175
+ add("`rift token issue` — re-issue an access token (the existing one is missing or rejected); do not restart the daemon for this.");
176
+ break;
177
+ case "config_missing":
178
+ add("`rift onboard` — finish setup; there is no config for this command to read yet.");
179
+ break;
180
+ case "codex_auth_expired":
181
+ add("`codex login` — re-authenticate the codex CLI, then `rift capture`.");
182
+ break;
183
+ case "codex_preflight_failed":
184
+ add("Codex capture probe failed (NOT an auth problem — do not re-run `codex login`). If it mentions a rejected model, set `codex_cli.model` in the Rift config to a supported model; otherwise it is usually a transient backend/timeout — re-run `rift capture`.");
185
+ break;
186
+ case "voyage_key_missing":
187
+ case "voyage_embed_errors":
188
+ add("`rift onboard --reconfigure-voyage` — re-check the Voyage key (it will not be printed).");
189
+ break;
190
+ case "index_write_errors":
191
+ add("`rift reindex` — only after confirming the cause; this rebuilds the index, it does not delete data.");
192
+ break;
193
+ case "capture_failed":
194
+ add("`rift capture` — re-run capture and read the per-session output.");
195
+ break;
196
+ case "capture_quarantined":
197
+ case "capture_repairing":
198
+ // Rift self-repairs these in the background, but a user who is
199
+ // explicitly assembling a repair prompt wants the manual escape hatch
200
+ // named — it is idempotent and non-destructive, so it is safe to run
201
+ // even while a background pass is in flight.
202
+ add("`rift doctor repair capture-large-sessions` — summarize and save the oversized sessions Rift had to skip; it reads them in safe chunks and does not delete or modify the originals.");
203
+ break;
204
+ default:
205
+ break;
206
+ }
207
+ }
208
+ return cmds;
209
+ }
210
+ function formatSeconds(seconds) {
211
+ if (seconds < 60)
212
+ return `${seconds}s`;
213
+ const minutes = Math.floor(seconds / 60);
214
+ if (minutes < 60)
215
+ return `${minutes}m`;
216
+ const hours = Math.floor(minutes / 60);
217
+ const remMin = minutes % 60;
218
+ if (hours < 24)
219
+ return remMin > 0 ? `${hours}h ${remMin}m` : `${hours}h`;
220
+ const days = Math.floor(hours / 24);
221
+ return `${days}d`;
222
+ }
223
+ //# sourceMappingURL=repair-prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repair-prompt.js","sourceRoot":"","sources":["../../../src/diagnostics/repair-prompt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function conversationContentFingerprint(content: string): string;
2
+ //# sourceMappingURL=conversation-fingerprint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-fingerprint.d.ts","sourceRoot":"","sources":["../../../../src/ingestion/inbox-core/conversation-fingerprint.ts"],"names":[],"mappings":"AAwBA,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEtE"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Canonical content fingerprint for a parsed conversation.
3
+ *
4
+ * Pure: takes the parser-emitted role-prefixed conversation text and
5
+ * returns a stable hex sha256. No filesystem, no clock, no random input.
6
+ *
7
+ * Why content-only:
8
+ * The fingerprint must change iff the conversation's substance changes.
9
+ * Title / createdAt are stable across re-exports of the same provider
10
+ * conversation, so they are not part of the input. Including them would
11
+ * produce false "grew" signals on metadata-only refreshes.
12
+ *
13
+ * Why role-prefixed text:
14
+ * Every parser already normalises its source format into the same
15
+ * `content` shape (`User: ...\n\nAssistant: ...`). That makes the
16
+ * fingerprint source-agnostic — two parsers producing identical
17
+ * content for the same conversation hash to the same value.
18
+ *
19
+ * Used by the ingest handler's refresh-on-grow logic: if a re-imported
20
+ * conversation has the same content as the version we already stored,
21
+ * skip it; if it has new messages appended, refresh the row.
22
+ */
23
+ import crypto from "node:crypto";
24
+ export function conversationContentFingerprint(content) {
25
+ return crypto.createHash("sha256").update(content, "utf8").digest("hex");
26
+ }
27
+ //# sourceMappingURL=conversation-fingerprint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-fingerprint.js","sourceRoot":"","sources":["../../../../src/ingestion/inbox-core/conversation-fingerprint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,MAAM,UAAU,8BAA8B,CAAC,OAAe;IAC5D,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC3E,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function stableConversationRowId(source: string, conversationId: string): string;
2
+ //# sourceMappingURL=conversation-key.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-key.d.ts","sourceRoot":"","sources":["../../../../src/ingestion/inbox-core/conversation-key.ts"],"names":[],"mappings":"AAwBA,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,EACd,cAAc,EAAE,MAAM,GACrB,MAAM,CAMR"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Stable row id for an indexed conversation.
3
+ *
4
+ * Pure: takes the source provider name and the provider's own
5
+ * conversation id, returns a deterministic row id. No filesystem,
6
+ * no clock, no random input.
7
+ *
8
+ * The key is `sha256("${source}:${conversationId}").slice(0, 32)` so:
9
+ * - re-imports of the same conversation (e.g. monthly full-export
10
+ * from ChatGPT/Claude/Grok/Gemini that re-includes everything
11
+ * the user has) collapse to the same row id and short-circuit
12
+ * on the existing "skip if already indexed" replay guard;
13
+ * - the same conversation id from two providers (Grok and Gemini
14
+ * both expose plain UUID-shaped ids) cannot collide because
15
+ * `source` is part of the hash input.
16
+ *
17
+ * Note: this dedupe is skip-if-exists. A conversation that has
18
+ * grown new messages between two exports keeps its older
19
+ * snapshot until a future refresh-on-grow slice lands. The
20
+ * duplicate-rows correctness gap is what this helper closes;
21
+ * stale-content is tracked separately.
22
+ */
23
+ import crypto from "node:crypto";
24
+ export function stableConversationRowId(source, conversationId) {
25
+ return crypto
26
+ .createHash("sha256")
27
+ .update(`${source}:${conversationId}`)
28
+ .digest("hex")
29
+ .slice(0, 32);
30
+ }
31
+ //# sourceMappingURL=conversation-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-key.js","sourceRoot":"","sources":["../../../../src/ingestion/inbox-core/conversation-key.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,MAAM,UAAU,uBAAuB,CACrC,MAAc,EACd,cAAsB;IAEtB,OAAO,MAAM;SACV,UAAU,CAAC,QAAQ,CAAC;SACpB,MAAM,CAAC,GAAG,MAAM,IAAI,cAAc,EAAE,CAAC;SACrC,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare const SUPPORTED_INBOX_EXTENSIONS: ReadonlySet<string>;
2
+ export declare function isSupportedInboxExtension(filePath: string): boolean;
3
+ //# sourceMappingURL=extensions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extensions.d.ts","sourceRoot":"","sources":["../../../../src/ingestion/inbox-core/extensions.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,0BAA0B,EAAE,WAAW,CAAC,MAAM,CAGzD,CAAC;AAEH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEnE"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Inbox file extension policy.
3
+ *
4
+ * Web conversation exports are always JSON or an archive of JSON.
5
+ * Markdown / images / arbitrary text are rejected at the watcher
6
+ * boundary so they never reach the parser layer.
7
+ */
8
+ import path from "node:path";
9
+ export const SUPPORTED_INBOX_EXTENSIONS = new Set([
10
+ ".json",
11
+ ".zip",
12
+ ]);
13
+ export function isSupportedInboxExtension(filePath) {
14
+ return SUPPORTED_INBOX_EXTENSIONS.has(path.extname(filePath).toLowerCase());
15
+ }
16
+ //# sourceMappingURL=extensions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extensions.js","sourceRoot":"","sources":["../../../../src/ingestion/inbox-core/extensions.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,0BAA0B,GAAwB,IAAI,GAAG,CAAC;IACrE,OAAO;IACP,MAAM;CACP,CAAC,CAAC;AAEH,MAAM,UAAU,yBAAyB,CAAC,QAAgB;IACxD,OAAO,0BAA0B,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function inboxIdempotencyKey(filePath: string, mtimeMs: number): string;
2
+ //# sourceMappingURL=idempotency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idempotency.d.ts","sourceRoot":"","sources":["../../../../src/ingestion/inbox-core/idempotency.ts"],"names":[],"mappings":"AAcA,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAO7E"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Stable idempotency key for a file dropped into an inbox folder.
3
+ *
4
+ * Pure: takes path + mtime as input, does no filesystem access. The
5
+ * caller (Rift adapter or a future standalone shell) is responsible
6
+ * for stat'ing the file.
7
+ *
8
+ * The key combines path and mtimeMs so re-dropping the same filename
9
+ * with new content gets a fresh key, while a watcher restart on
10
+ * unchanged files produces the same key and short-circuits as a
11
+ * duplicate at the queue layer.
12
+ */
13
+ import crypto from "node:crypto";
14
+ export function inboxIdempotencyKey(filePath, mtimeMs) {
15
+ const hash = crypto
16
+ .createHash("sha256")
17
+ .update(`${filePath}:${mtimeMs}`)
18
+ .digest("hex")
19
+ .slice(0, 16);
20
+ return `inbox:${hash}`;
21
+ }
22
+ //# sourceMappingURL=idempotency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idempotency.js","sourceRoot":"","sources":["../../../../src/ingestion/inbox-core/idempotency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,MAAM,UAAU,mBAAmB,CAAC,QAAgB,EAAE,OAAe;IACnE,MAAM,IAAI,GAAG,MAAM;SAChB,UAAU,CAAC,QAAQ,CAAC;SACpB,MAAM,CAAC,GAAG,QAAQ,IAAI,OAAO,EAAE,CAAC;SAChC,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChB,OAAO,SAAS,IAAI,EAAE,CAAC;AACzB,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * inbox-core — pure file-detection primitives for an inbox watcher.
3
+ *
4
+ * Carved as a seam so the same logic can power both Rift's
5
+ * inbox-watcher.ts (which hands off to the job queue + ingest route)
6
+ * and a future standalone "AI Chat Backup Inbox" shell (which hands
7
+ * off to a local archive folder, with optional Rift indexing).
8
+ *
9
+ * Invariant: this module has zero Rift internals — no Fastify, no
10
+ * LanceDB, no Voyage, no JobQueue, no config loader, no parser
11
+ * registry. Only `node:` stdlib. The adapter wires it up.
12
+ */
13
+ export { inboxIdempotencyKey } from "./idempotency.js";
14
+ export { stableConversationRowId } from "./conversation-key.js";
15
+ export { conversationContentFingerprint } from "./conversation-fingerprint.js";
16
+ export { detectSourceFromSubdir } from "./source-detection.js";
17
+ export { SUPPORTED_INBOX_EXTENSIONS, isSupportedInboxExtension, } from "./extensions.js";
18
+ export { sniffInboxSource, type SniffedProvider } from "./source-sniffer.js";
19
+ export { readZipCentralDirectoryFilenames, sniffProviderFromZipEntries, sniffZipBuffer, } from "./zip-sniffer.js";
20
+ //# sourceMappingURL=index.d.ts.map