@getrift/rift 0.0.0 → 0.1.0-beta.0

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 (628) hide show
  1. package/README.dev.md +110 -0
  2. package/README.md +130 -0
  3. package/dist/src/auth/keychain.d.ts +25 -0
  4. package/dist/src/auth/keychain.d.ts.map +1 -0
  5. package/dist/src/auth/keychain.js +113 -0
  6. package/dist/src/auth/keychain.js.map +1 -0
  7. package/dist/src/auth/middleware.d.ts +20 -0
  8. package/dist/src/auth/middleware.d.ts.map +1 -0
  9. package/dist/src/auth/middleware.js +49 -0
  10. package/dist/src/auth/middleware.js.map +1 -0
  11. package/dist/src/auth/rate-limit.d.ts +16 -0
  12. package/dist/src/auth/rate-limit.d.ts.map +1 -0
  13. package/dist/src/auth/rate-limit.js +38 -0
  14. package/dist/src/auth/rate-limit.js.map +1 -0
  15. package/dist/src/auth/rotation.d.ts +67 -0
  16. package/dist/src/auth/rotation.d.ts.map +1 -0
  17. package/dist/src/auth/rotation.js +190 -0
  18. package/dist/src/auth/rotation.js.map +1 -0
  19. package/dist/src/backfill/project-context-batch-constructor.d.ts +127 -0
  20. package/dist/src/backfill/project-context-batch-constructor.d.ts.map +1 -0
  21. package/dist/src/backfill/project-context-batch-constructor.js +210 -0
  22. package/dist/src/backfill/project-context-batch-constructor.js.map +1 -0
  23. package/dist/src/capture/auto-capture.d.ts +162 -0
  24. package/dist/src/capture/auto-capture.d.ts.map +1 -0
  25. package/dist/src/capture/auto-capture.js +601 -0
  26. package/dist/src/capture/auto-capture.js.map +1 -0
  27. package/dist/src/capture/batch-budget.d.ts +90 -0
  28. package/dist/src/capture/batch-budget.d.ts.map +1 -0
  29. package/dist/src/capture/batch-budget.js +148 -0
  30. package/dist/src/capture/batch-budget.js.map +1 -0
  31. package/dist/src/capture/codex-cli-triage-provider.d.ts +17 -0
  32. package/dist/src/capture/codex-cli-triage-provider.d.ts.map +1 -0
  33. package/dist/src/capture/codex-cli-triage-provider.js +109 -0
  34. package/dist/src/capture/codex-cli-triage-provider.js.map +1 -0
  35. package/dist/src/capture/observability.d.ts +42 -0
  36. package/dist/src/capture/observability.d.ts.map +1 -0
  37. package/dist/src/capture/observability.js +87 -0
  38. package/dist/src/capture/observability.js.map +1 -0
  39. package/dist/src/capture/openai-triage-provider.d.ts +92 -0
  40. package/dist/src/capture/openai-triage-provider.d.ts.map +1 -0
  41. package/dist/src/capture/openai-triage-provider.js +267 -0
  42. package/dist/src/capture/openai-triage-provider.js.map +1 -0
  43. package/dist/src/capture/review-queue-index.d.ts +51 -0
  44. package/dist/src/capture/review-queue-index.d.ts.map +1 -0
  45. package/dist/src/capture/review-queue-index.js +204 -0
  46. package/dist/src/capture/review-queue-index.js.map +1 -0
  47. package/dist/src/capture/review-queue.d.ts +43 -0
  48. package/dist/src/capture/review-queue.d.ts.map +1 -0
  49. package/dist/src/capture/review-queue.js +116 -0
  50. package/dist/src/capture/review-queue.js.map +1 -0
  51. package/dist/src/capture/sources.d.ts +7 -0
  52. package/dist/src/capture/sources.d.ts.map +1 -0
  53. package/dist/src/capture/sources.js +3 -0
  54. package/dist/src/capture/sources.js.map +1 -0
  55. package/dist/src/capture/triage-lane.d.ts +39 -0
  56. package/dist/src/capture/triage-lane.d.ts.map +1 -0
  57. package/dist/src/capture/triage-lane.js +217 -0
  58. package/dist/src/capture/triage-lane.js.map +1 -0
  59. package/dist/src/capture/triage-provider.d.ts +75 -0
  60. package/dist/src/capture/triage-provider.d.ts.map +1 -0
  61. package/dist/src/capture/triage-provider.js +120 -0
  62. package/dist/src/capture/triage-provider.js.map +1 -0
  63. package/dist/src/capture/triage.d.ts +30 -0
  64. package/dist/src/capture/triage.d.ts.map +1 -0
  65. package/dist/src/capture/triage.js +48 -0
  66. package/dist/src/capture/triage.js.map +1 -0
  67. package/dist/src/cli/commands/backfill.d.ts +3 -0
  68. package/dist/src/cli/commands/backfill.d.ts.map +1 -0
  69. package/dist/src/cli/commands/backfill.js +1376 -0
  70. package/dist/src/cli/commands/backfill.js.map +1 -0
  71. package/dist/src/cli/commands/bulk-ingest.d.ts +3 -0
  72. package/dist/src/cli/commands/bulk-ingest.d.ts.map +1 -0
  73. package/dist/src/cli/commands/bulk-ingest.js +126 -0
  74. package/dist/src/cli/commands/bulk-ingest.js.map +1 -0
  75. package/dist/src/cli/commands/capture.d.ts +12 -0
  76. package/dist/src/cli/commands/capture.d.ts.map +1 -0
  77. package/dist/src/cli/commands/capture.js +123 -0
  78. package/dist/src/cli/commands/capture.js.map +1 -0
  79. package/dist/src/cli/commands/compact.d.ts +3 -0
  80. package/dist/src/cli/commands/compact.d.ts.map +1 -0
  81. package/dist/src/cli/commands/compact.js +70 -0
  82. package/dist/src/cli/commands/compact.js.map +1 -0
  83. package/dist/src/cli/commands/feedback.d.ts +22 -0
  84. package/dist/src/cli/commands/feedback.d.ts.map +1 -0
  85. package/dist/src/cli/commands/feedback.js +125 -0
  86. package/dist/src/cli/commands/feedback.js.map +1 -0
  87. package/dist/src/cli/commands/import.d.ts +19 -0
  88. package/dist/src/cli/commands/import.d.ts.map +1 -0
  89. package/dist/src/cli/commands/import.js +258 -0
  90. package/dist/src/cli/commands/import.js.map +1 -0
  91. package/dist/src/cli/commands/ingest.d.ts +3 -0
  92. package/dist/src/cli/commands/ingest.d.ts.map +1 -0
  93. package/dist/src/cli/commands/ingest.js +80 -0
  94. package/dist/src/cli/commands/ingest.js.map +1 -0
  95. package/dist/src/cli/commands/mcp-install.d.ts +25 -0
  96. package/dist/src/cli/commands/mcp-install.d.ts.map +1 -0
  97. package/dist/src/cli/commands/mcp-install.js +134 -0
  98. package/dist/src/cli/commands/mcp-install.js.map +1 -0
  99. package/dist/src/cli/commands/onboard.d.ts +98 -0
  100. package/dist/src/cli/commands/onboard.d.ts.map +1 -0
  101. package/dist/src/cli/commands/onboard.js +742 -0
  102. package/dist/src/cli/commands/onboard.js.map +1 -0
  103. package/dist/src/cli/commands/rebuild.d.ts +12 -0
  104. package/dist/src/cli/commands/rebuild.d.ts.map +1 -0
  105. package/dist/src/cli/commands/rebuild.js +164 -0
  106. package/dist/src/cli/commands/rebuild.js.map +1 -0
  107. package/dist/src/cli/commands/reconcile.d.ts +3 -0
  108. package/dist/src/cli/commands/reconcile.d.ts.map +1 -0
  109. package/dist/src/cli/commands/reconcile.js +56 -0
  110. package/dist/src/cli/commands/reconcile.js.map +1 -0
  111. package/dist/src/cli/commands/reindex.d.ts +3 -0
  112. package/dist/src/cli/commands/reindex.d.ts.map +1 -0
  113. package/dist/src/cli/commands/reindex.js +66 -0
  114. package/dist/src/cli/commands/reindex.js.map +1 -0
  115. package/dist/src/cli/commands/review.d.ts +13 -0
  116. package/dist/src/cli/commands/review.d.ts.map +1 -0
  117. package/dist/src/cli/commands/review.js +383 -0
  118. package/dist/src/cli/commands/review.js.map +1 -0
  119. package/dist/src/cli/commands/save.d.ts +3 -0
  120. package/dist/src/cli/commands/save.d.ts.map +1 -0
  121. package/dist/src/cli/commands/save.js +111 -0
  122. package/dist/src/cli/commands/save.js.map +1 -0
  123. package/dist/src/cli/commands/search.d.ts +35 -0
  124. package/dist/src/cli/commands/search.d.ts.map +1 -0
  125. package/dist/src/cli/commands/search.js +88 -0
  126. package/dist/src/cli/commands/search.js.map +1 -0
  127. package/dist/src/cli/commands/stats.d.ts +3 -0
  128. package/dist/src/cli/commands/stats.d.ts.map +1 -0
  129. package/dist/src/cli/commands/stats.js +42 -0
  130. package/dist/src/cli/commands/stats.js.map +1 -0
  131. package/dist/src/cli/commands/status.d.ts +15 -0
  132. package/dist/src/cli/commands/status.d.ts.map +1 -0
  133. package/dist/src/cli/commands/status.js +89 -0
  134. package/dist/src/cli/commands/status.js.map +1 -0
  135. package/dist/src/cli/commands/token-issue.d.ts +3 -0
  136. package/dist/src/cli/commands/token-issue.d.ts.map +1 -0
  137. package/dist/src/cli/commands/token-issue.js +25 -0
  138. package/dist/src/cli/commands/token-issue.js.map +1 -0
  139. package/dist/src/cli/commands/triage.d.ts +3 -0
  140. package/dist/src/cli/commands/triage.d.ts.map +1 -0
  141. package/dist/src/cli/commands/triage.js +125 -0
  142. package/dist/src/cli/commands/triage.js.map +1 -0
  143. package/dist/src/cli/commands/uninstall.d.ts +3 -0
  144. package/dist/src/cli/commands/uninstall.d.ts.map +1 -0
  145. package/dist/src/cli/commands/uninstall.js +238 -0
  146. package/dist/src/cli/commands/uninstall.js.map +1 -0
  147. package/dist/src/cli/feedback/feedback-config.d.ts +21 -0
  148. package/dist/src/cli/feedback/feedback-config.d.ts.map +1 -0
  149. package/dist/src/cli/feedback/feedback-config.js +43 -0
  150. package/dist/src/cli/feedback/feedback-config.js.map +1 -0
  151. package/dist/src/cli/feedback/feedback-history.d.ts +4 -0
  152. package/dist/src/cli/feedback/feedback-history.d.ts.map +1 -0
  153. package/dist/src/cli/feedback/feedback-history.js +115 -0
  154. package/dist/src/cli/feedback/feedback-history.js.map +1 -0
  155. package/dist/src/cli/feedback/feedback-payload.d.ts +53 -0
  156. package/dist/src/cli/feedback/feedback-payload.d.ts.map +1 -0
  157. package/dist/src/cli/feedback/feedback-payload.js +10 -0
  158. package/dist/src/cli/feedback/feedback-payload.js.map +1 -0
  159. package/dist/src/cli/feedback/feedback-relay.d.ts +15 -0
  160. package/dist/src/cli/feedback/feedback-relay.d.ts.map +1 -0
  161. package/dist/src/cli/feedback/feedback-relay.js +47 -0
  162. package/dist/src/cli/feedback/feedback-relay.js.map +1 -0
  163. package/dist/src/cli/feedback/feedback-status.d.ts +11 -0
  164. package/dist/src/cli/feedback/feedback-status.d.ts.map +1 -0
  165. package/dist/src/cli/feedback/feedback-status.js +122 -0
  166. package/dist/src/cli/feedback/feedback-status.js.map +1 -0
  167. package/dist/src/cli/http-client.d.ts +36 -0
  168. package/dist/src/cli/http-client.d.ts.map +1 -0
  169. package/dist/src/cli/http-client.js +153 -0
  170. package/dist/src/cli/http-client.js.map +1 -0
  171. package/dist/src/cli/index.d.ts +4 -0
  172. package/dist/src/cli/index.d.ts.map +1 -0
  173. package/dist/src/cli/index.js +66 -0
  174. package/dist/src/cli/index.js.map +1 -0
  175. package/dist/src/cli/job-poller.d.ts +13 -0
  176. package/dist/src/cli/job-poller.d.ts.map +1 -0
  177. package/dist/src/cli/job-poller.js +29 -0
  178. package/dist/src/cli/job-poller.js.map +1 -0
  179. package/dist/src/cli/mcp-config-writers/codex-toml.d.ts +10 -0
  180. package/dist/src/cli/mcp-config-writers/codex-toml.d.ts.map +1 -0
  181. package/dist/src/cli/mcp-config-writers/codex-toml.js +410 -0
  182. package/dist/src/cli/mcp-config-writers/codex-toml.js.map +1 -0
  183. package/dist/src/cli/mcp-config-writers/errors.d.ts +17 -0
  184. package/dist/src/cli/mcp-config-writers/errors.d.ts.map +1 -0
  185. package/dist/src/cli/mcp-config-writers/errors.js +13 -0
  186. package/dist/src/cli/mcp-config-writers/errors.js.map +1 -0
  187. package/dist/src/cli/mcp-config-writers/index.d.ts +18 -0
  188. package/dist/src/cli/mcp-config-writers/index.d.ts.map +1 -0
  189. package/dist/src/cli/mcp-config-writers/index.js +49 -0
  190. package/dist/src/cli/mcp-config-writers/index.js.map +1 -0
  191. package/dist/src/cli/mcp-config-writers/json-config.d.ts +12 -0
  192. package/dist/src/cli/mcp-config-writers/json-config.d.ts.map +1 -0
  193. package/dist/src/cli/mcp-config-writers/json-config.js +177 -0
  194. package/dist/src/cli/mcp-config-writers/json-config.js.map +1 -0
  195. package/dist/src/cli/mcp-config-writers/redact.d.ts +28 -0
  196. package/dist/src/cli/mcp-config-writers/redact.d.ts.map +1 -0
  197. package/dist/src/cli/mcp-config-writers/redact.js +48 -0
  198. package/dist/src/cli/mcp-config-writers/redact.js.map +1 -0
  199. package/dist/src/cli/mcp-config-writers/types.d.ts +32 -0
  200. package/dist/src/cli/mcp-config-writers/types.d.ts.map +1 -0
  201. package/dist/src/cli/mcp-config-writers/types.js +5 -0
  202. package/dist/src/cli/mcp-config-writers/types.js.map +1 -0
  203. package/dist/src/cli/output.d.ts +8 -0
  204. package/dist/src/cli/output.d.ts.map +1 -0
  205. package/dist/src/cli/output.js +34 -0
  206. package/dist/src/cli/output.js.map +1 -0
  207. package/dist/src/cli/status/friend-header.d.ts +33 -0
  208. package/dist/src/cli/status/friend-header.d.ts.map +1 -0
  209. package/dist/src/cli/status/friend-header.js +108 -0
  210. package/dist/src/cli/status/friend-header.js.map +1 -0
  211. package/dist/src/cli/status/local-signals.d.ts +14 -0
  212. package/dist/src/cli/status/local-signals.d.ts.map +1 -0
  213. package/dist/src/cli/status/local-signals.js +73 -0
  214. package/dist/src/cli/status/local-signals.js.map +1 -0
  215. package/dist/src/cli/token.d.ts +37 -0
  216. package/dist/src/cli/token.d.ts.map +1 -0
  217. package/dist/src/cli/token.js +105 -0
  218. package/dist/src/cli/token.js.map +1 -0
  219. package/dist/src/cli/uninstall/mcp-uninstall.d.ts +33 -0
  220. package/dist/src/cli/uninstall/mcp-uninstall.d.ts.map +1 -0
  221. package/dist/src/cli/uninstall/mcp-uninstall.js +181 -0
  222. package/dist/src/cli/uninstall/mcp-uninstall.js.map +1 -0
  223. package/dist/src/config/loader.d.ts +9 -0
  224. package/dist/src/config/loader.d.ts.map +1 -0
  225. package/dist/src/config/loader.js +73 -0
  226. package/dist/src/config/loader.js.map +1 -0
  227. package/dist/src/config/schema.d.ts +635 -0
  228. package/dist/src/config/schema.d.ts.map +1 -0
  229. package/dist/src/config/schema.js +208 -0
  230. package/dist/src/config/schema.js.map +1 -0
  231. package/dist/src/ingestion/bulk-ingest.d.ts +11 -0
  232. package/dist/src/ingestion/bulk-ingest.d.ts.map +1 -0
  233. package/dist/src/ingestion/bulk-ingest.js +11 -0
  234. package/dist/src/ingestion/bulk-ingest.js.map +1 -0
  235. package/dist/src/ingestion/extractor.d.ts +16 -0
  236. package/dist/src/ingestion/extractor.d.ts.map +1 -0
  237. package/dist/src/ingestion/extractor.js +85 -0
  238. package/dist/src/ingestion/extractor.js.map +1 -0
  239. package/dist/src/ingestion/extractors/docx.d.ts +3 -0
  240. package/dist/src/ingestion/extractors/docx.d.ts.map +1 -0
  241. package/dist/src/ingestion/extractors/docx.js +20 -0
  242. package/dist/src/ingestion/extractors/docx.js.map +1 -0
  243. package/dist/src/ingestion/extractors/pdf.d.ts +3 -0
  244. package/dist/src/ingestion/extractors/pdf.d.ts.map +1 -0
  245. package/dist/src/ingestion/extractors/pdf.js +32 -0
  246. package/dist/src/ingestion/extractors/pdf.js.map +1 -0
  247. package/dist/src/ingestion/historical-campaign.d.ts +340 -0
  248. package/dist/src/ingestion/historical-campaign.d.ts.map +1 -0
  249. package/dist/src/ingestion/historical-campaign.js +1010 -0
  250. package/dist/src/ingestion/historical-campaign.js.map +1 -0
  251. package/dist/src/ingestion/ignored-paths.d.ts +20 -0
  252. package/dist/src/ingestion/ignored-paths.d.ts.map +1 -0
  253. package/dist/src/ingestion/ignored-paths.js +45 -0
  254. package/dist/src/ingestion/ignored-paths.js.map +1 -0
  255. package/dist/src/ingestion/inbox-watcher.d.ts +12 -0
  256. package/dist/src/ingestion/inbox-watcher.d.ts.map +1 -0
  257. package/dist/src/ingestion/inbox-watcher.js +99 -0
  258. package/dist/src/ingestion/inbox-watcher.js.map +1 -0
  259. package/dist/src/ingestion/indexer.d.ts +32 -0
  260. package/dist/src/ingestion/indexer.d.ts.map +1 -0
  261. package/dist/src/ingestion/indexer.js +68 -0
  262. package/dist/src/ingestion/indexer.js.map +1 -0
  263. package/dist/src/ingestion/metadata-extraction.d.ts +53 -0
  264. package/dist/src/ingestion/metadata-extraction.d.ts.map +1 -0
  265. package/dist/src/ingestion/metadata-extraction.js +132 -0
  266. package/dist/src/ingestion/metadata-extraction.js.map +1 -0
  267. package/dist/src/ingestion/parsers/chatgpt-web.d.ts +29 -0
  268. package/dist/src/ingestion/parsers/chatgpt-web.d.ts.map +1 -0
  269. package/dist/src/ingestion/parsers/chatgpt-web.js +100 -0
  270. package/dist/src/ingestion/parsers/chatgpt-web.js.map +1 -0
  271. package/dist/src/ingestion/parsers/claude-code-jsonl.d.ts +16 -0
  272. package/dist/src/ingestion/parsers/claude-code-jsonl.d.ts.map +1 -0
  273. package/dist/src/ingestion/parsers/claude-code-jsonl.js +123 -0
  274. package/dist/src/ingestion/parsers/claude-code-jsonl.js.map +1 -0
  275. package/dist/src/ingestion/parsers/claude-web.d.ts +24 -0
  276. package/dist/src/ingestion/parsers/claude-web.d.ts.map +1 -0
  277. package/dist/src/ingestion/parsers/claude-web.js +78 -0
  278. package/dist/src/ingestion/parsers/claude-web.js.map +1 -0
  279. package/dist/src/ingestion/parsers/codex-jsonl.d.ts +18 -0
  280. package/dist/src/ingestion/parsers/codex-jsonl.d.ts.map +1 -0
  281. package/dist/src/ingestion/parsers/codex-jsonl.js +125 -0
  282. package/dist/src/ingestion/parsers/codex-jsonl.js.map +1 -0
  283. package/dist/src/ingestion/parsers/gemini-web.d.ts +16 -0
  284. package/dist/src/ingestion/parsers/gemini-web.d.ts.map +1 -0
  285. package/dist/src/ingestion/parsers/gemini-web.js +170 -0
  286. package/dist/src/ingestion/parsers/gemini-web.js.map +1 -0
  287. package/dist/src/ingestion/parsers/grok-web.d.ts +40 -0
  288. package/dist/src/ingestion/parsers/grok-web.d.ts.map +1 -0
  289. package/dist/src/ingestion/parsers/grok-web.js +67 -0
  290. package/dist/src/ingestion/parsers/grok-web.js.map +1 -0
  291. package/dist/src/ingestion/parsers/types.d.ts +34 -0
  292. package/dist/src/ingestion/parsers/types.d.ts.map +1 -0
  293. package/dist/src/ingestion/parsers/types.js +26 -0
  294. package/dist/src/ingestion/parsers/types.js.map +1 -0
  295. package/dist/src/ingestion/scanner.d.ts +48 -0
  296. package/dist/src/ingestion/scanner.d.ts.map +1 -0
  297. package/dist/src/ingestion/scanner.js +131 -0
  298. package/dist/src/ingestion/scanner.js.map +1 -0
  299. package/dist/src/ingestion/staging.d.ts +109 -0
  300. package/dist/src/ingestion/staging.d.ts.map +1 -0
  301. package/dist/src/ingestion/staging.js +411 -0
  302. package/dist/src/ingestion/staging.js.map +1 -0
  303. package/dist/src/ingestion/watcher.d.ts +65 -0
  304. package/dist/src/ingestion/watcher.d.ts.map +1 -0
  305. package/dist/src/ingestion/watcher.js +182 -0
  306. package/dist/src/ingestion/watcher.js.map +1 -0
  307. package/dist/src/jobs/codex-override-handler.d.ts +3 -0
  308. package/dist/src/jobs/codex-override-handler.d.ts.map +1 -0
  309. package/dist/src/jobs/codex-override-handler.js +16 -0
  310. package/dist/src/jobs/codex-override-handler.js.map +1 -0
  311. package/dist/src/jobs/handlers/compact.d.ts +30 -0
  312. package/dist/src/jobs/handlers/compact.d.ts.map +1 -0
  313. package/dist/src/jobs/handlers/compact.js +329 -0
  314. package/dist/src/jobs/handlers/compact.js.map +1 -0
  315. package/dist/src/jobs/handlers/ingest.d.ts +13 -0
  316. package/dist/src/jobs/handlers/ingest.d.ts.map +1 -0
  317. package/dist/src/jobs/handlers/ingest.js +255 -0
  318. package/dist/src/jobs/handlers/ingest.js.map +1 -0
  319. package/dist/src/jobs/handlers/reconcile.d.ts +29 -0
  320. package/dist/src/jobs/handlers/reconcile.d.ts.map +1 -0
  321. package/dist/src/jobs/handlers/reconcile.js +476 -0
  322. package/dist/src/jobs/handlers/reconcile.js.map +1 -0
  323. package/dist/src/jobs/handlers/reindex.d.ts +38 -0
  324. package/dist/src/jobs/handlers/reindex.d.ts.map +1 -0
  325. package/dist/src/jobs/handlers/reindex.js +52 -0
  326. package/dist/src/jobs/handlers/reindex.js.map +1 -0
  327. package/dist/src/jobs/handlers/save.d.ts +10 -0
  328. package/dist/src/jobs/handlers/save.d.ts.map +1 -0
  329. package/dist/src/jobs/handlers/save.js +206 -0
  330. package/dist/src/jobs/handlers/save.js.map +1 -0
  331. package/dist/src/jobs/handlers/triage.d.ts +47 -0
  332. package/dist/src/jobs/handlers/triage.d.ts.map +1 -0
  333. package/dist/src/jobs/handlers/triage.js +95 -0
  334. package/dist/src/jobs/handlers/triage.js.map +1 -0
  335. package/dist/src/jobs/queue.d.ts +107 -0
  336. package/dist/src/jobs/queue.d.ts.map +1 -0
  337. package/dist/src/jobs/queue.js +319 -0
  338. package/dist/src/jobs/queue.js.map +1 -0
  339. package/dist/src/jobs/types.d.ts +39 -0
  340. package/dist/src/jobs/types.d.ts.map +1 -0
  341. package/dist/src/jobs/types.js +29 -0
  342. package/dist/src/jobs/types.js.map +1 -0
  343. package/dist/src/jobs/worker-entry.d.ts +10 -0
  344. package/dist/src/jobs/worker-entry.d.ts.map +1 -0
  345. package/dist/src/jobs/worker-entry.js +210 -0
  346. package/dist/src/jobs/worker-entry.js.map +1 -0
  347. package/dist/src/jobs/worker-process.d.ts +50 -0
  348. package/dist/src/jobs/worker-process.d.ts.map +1 -0
  349. package/dist/src/jobs/worker-process.js +186 -0
  350. package/dist/src/jobs/worker-process.js.map +1 -0
  351. package/dist/src/jobs/worker.d.ts +11 -0
  352. package/dist/src/jobs/worker.d.ts.map +1 -0
  353. package/dist/src/jobs/worker.js +14 -0
  354. package/dist/src/jobs/worker.js.map +1 -0
  355. package/dist/src/main.d.ts +2 -0
  356. package/dist/src/main.d.ts.map +1 -0
  357. package/dist/src/main.js +425 -0
  358. package/dist/src/main.js.map +1 -0
  359. package/dist/src/mcp/errors.d.ts +8 -0
  360. package/dist/src/mcp/errors.d.ts.map +1 -0
  361. package/dist/src/mcp/errors.js +50 -0
  362. package/dist/src/mcp/errors.js.map +1 -0
  363. package/dist/src/mcp/server.d.ts +10 -0
  364. package/dist/src/mcp/server.d.ts.map +1 -0
  365. package/dist/src/mcp/server.js +94 -0
  366. package/dist/src/mcp/server.js.map +1 -0
  367. package/dist/src/mcp/tools/context-pack.d.ts +35 -0
  368. package/dist/src/mcp/tools/context-pack.d.ts.map +1 -0
  369. package/dist/src/mcp/tools/context-pack.js +97 -0
  370. package/dist/src/mcp/tools/context-pack.js.map +1 -0
  371. package/dist/src/mcp/tools/conversations-search.d.ts +38 -0
  372. package/dist/src/mcp/tools/conversations-search.d.ts.map +1 -0
  373. package/dist/src/mcp/tools/conversations-search.js +73 -0
  374. package/dist/src/mcp/tools/conversations-search.js.map +1 -0
  375. package/dist/src/mcp/tools/save.d.ts +32 -0
  376. package/dist/src/mcp/tools/save.d.ts.map +1 -0
  377. package/dist/src/mcp/tools/save.js +60 -0
  378. package/dist/src/mcp/tools/save.js.map +1 -0
  379. package/dist/src/mcp/tools/search.d.ts +33 -0
  380. package/dist/src/mcp/tools/search.d.ts.map +1 -0
  381. package/dist/src/mcp/tools/search.js +58 -0
  382. package/dist/src/mcp/tools/search.js.map +1 -0
  383. package/dist/src/mcp/tools/status.d.ts +17 -0
  384. package/dist/src/mcp/tools/status.d.ts.map +1 -0
  385. package/dist/src/mcp/tools/status.js +12 -0
  386. package/dist/src/mcp/tools/status.js.map +1 -0
  387. package/dist/src/observability/coverage.d.ts +100 -0
  388. package/dist/src/observability/coverage.d.ts.map +1 -0
  389. package/dist/src/observability/coverage.js +180 -0
  390. package/dist/src/observability/coverage.js.map +1 -0
  391. package/dist/src/observability/rift-context.d.ts +47 -0
  392. package/dist/src/observability/rift-context.d.ts.map +1 -0
  393. package/dist/src/observability/rift-context.js +118 -0
  394. package/dist/src/observability/rift-context.js.map +1 -0
  395. package/dist/src/observability/staleness.d.ts +43 -0
  396. package/dist/src/observability/staleness.d.ts.map +1 -0
  397. package/dist/src/observability/staleness.js +74 -0
  398. package/dist/src/observability/staleness.js.map +1 -0
  399. package/dist/src/observability/tool-usage-stats.d.ts +23 -0
  400. package/dist/src/observability/tool-usage-stats.d.ts.map +1 -0
  401. package/dist/src/observability/tool-usage-stats.js +83 -0
  402. package/dist/src/observability/tool-usage-stats.js.map +1 -0
  403. package/dist/src/observability/tool-usage.d.ts +68 -0
  404. package/dist/src/observability/tool-usage.d.ts.map +1 -0
  405. package/dist/src/observability/tool-usage.js +207 -0
  406. package/dist/src/observability/tool-usage.js.map +1 -0
  407. package/dist/src/onboarding/daemon-control.d.ts +33 -0
  408. package/dist/src/onboarding/daemon-control.d.ts.map +1 -0
  409. package/dist/src/onboarding/daemon-control.js +92 -0
  410. package/dist/src/onboarding/daemon-control.js.map +1 -0
  411. package/dist/src/onboarding/env-file.d.ts +18 -0
  412. package/dist/src/onboarding/env-file.d.ts.map +1 -0
  413. package/dist/src/onboarding/env-file.js +89 -0
  414. package/dist/src/onboarding/env-file.js.map +1 -0
  415. package/dist/src/onboarding/voyage-validate.d.ts +16 -0
  416. package/dist/src/onboarding/voyage-validate.d.ts.map +1 -0
  417. package/dist/src/onboarding/voyage-validate.js +85 -0
  418. package/dist/src/onboarding/voyage-validate.js.map +1 -0
  419. package/dist/src/providers/anthropic-digest.d.ts +23 -0
  420. package/dist/src/providers/anthropic-digest.d.ts.map +1 -0
  421. package/dist/src/providers/anthropic-digest.js +91 -0
  422. package/dist/src/providers/anthropic-digest.js.map +1 -0
  423. package/dist/src/providers/codex-cli-digest.d.ts +12 -0
  424. package/dist/src/providers/codex-cli-digest.d.ts.map +1 -0
  425. package/dist/src/providers/codex-cli-digest.js +70 -0
  426. package/dist/src/providers/codex-cli-digest.js.map +1 -0
  427. package/dist/src/providers/codex-cli-metadata-extraction.d.ts +14 -0
  428. package/dist/src/providers/codex-cli-metadata-extraction.d.ts.map +1 -0
  429. package/dist/src/providers/codex-cli-metadata-extraction.js +101 -0
  430. package/dist/src/providers/codex-cli-metadata-extraction.js.map +1 -0
  431. package/dist/src/providers/codex-cli-runner.d.ts +14 -0
  432. package/dist/src/providers/codex-cli-runner.d.ts.map +1 -0
  433. package/dist/src/providers/codex-cli-runner.js +272 -0
  434. package/dist/src/providers/codex-cli-runner.js.map +1 -0
  435. package/dist/src/providers/conversation-generation.d.ts +10 -0
  436. package/dist/src/providers/conversation-generation.d.ts.map +1 -0
  437. package/dist/src/providers/conversation-generation.js +54 -0
  438. package/dist/src/providers/conversation-generation.js.map +1 -0
  439. package/dist/src/providers/ollama-embed.d.ts +22 -0
  440. package/dist/src/providers/ollama-embed.d.ts.map +1 -0
  441. package/dist/src/providers/ollama-embed.js +133 -0
  442. package/dist/src/providers/ollama-embed.js.map +1 -0
  443. package/dist/src/providers/ollama.d.ts +42 -0
  444. package/dist/src/providers/ollama.d.ts.map +1 -0
  445. package/dist/src/providers/ollama.js +169 -0
  446. package/dist/src/providers/ollama.js.map +1 -0
  447. package/dist/src/providers/openai-metadata-extraction.d.ts +73 -0
  448. package/dist/src/providers/openai-metadata-extraction.d.ts.map +1 -0
  449. package/dist/src/providers/openai-metadata-extraction.js +161 -0
  450. package/dist/src/providers/openai-metadata-extraction.js.map +1 -0
  451. package/dist/src/providers/operator-overrides.d.ts +24 -0
  452. package/dist/src/providers/operator-overrides.d.ts.map +1 -0
  453. package/dist/src/providers/operator-overrides.js +84 -0
  454. package/dist/src/providers/operator-overrides.js.map +1 -0
  455. package/dist/src/providers/stub.d.ts +17 -0
  456. package/dist/src/providers/stub.d.ts.map +1 -0
  457. package/dist/src/providers/stub.js +72 -0
  458. package/dist/src/providers/stub.js.map +1 -0
  459. package/dist/src/providers/types.d.ts +82 -0
  460. package/dist/src/providers/types.d.ts.map +1 -0
  461. package/dist/src/providers/types.js +52 -0
  462. package/dist/src/providers/types.js.map +1 -0
  463. package/dist/src/providers/voyage.d.ts +23 -0
  464. package/dist/src/providers/voyage.d.ts.map +1 -0
  465. package/dist/src/providers/voyage.js +135 -0
  466. package/dist/src/providers/voyage.js.map +1 -0
  467. package/dist/src/retrieval/compact.d.ts +89 -0
  468. package/dist/src/retrieval/compact.d.ts.map +1 -0
  469. package/dist/src/retrieval/compact.js +348 -0
  470. package/dist/src/retrieval/compact.js.map +1 -0
  471. package/dist/src/retrieval/context-pack.d.ts +123 -0
  472. package/dist/src/retrieval/context-pack.d.ts.map +1 -0
  473. package/dist/src/retrieval/context-pack.js +553 -0
  474. package/dist/src/retrieval/context-pack.js.map +1 -0
  475. package/dist/src/retrieval/cwd.d.ts +25 -0
  476. package/dist/src/retrieval/cwd.d.ts.map +1 -0
  477. package/dist/src/retrieval/cwd.js +48 -0
  478. package/dist/src/retrieval/cwd.js.map +1 -0
  479. package/dist/src/retrieval/degraded.d.ts +20 -0
  480. package/dist/src/retrieval/degraded.d.ts.map +1 -0
  481. package/dist/src/retrieval/degraded.js +43 -0
  482. package/dist/src/retrieval/degraded.js.map +1 -0
  483. package/dist/src/retrieval/hybrid.d.ts +38 -0
  484. package/dist/src/retrieval/hybrid.d.ts.map +1 -0
  485. package/dist/src/retrieval/hybrid.js +82 -0
  486. package/dist/src/retrieval/hybrid.js.map +1 -0
  487. package/dist/src/retrieval/lexical.d.ts +28 -0
  488. package/dist/src/retrieval/lexical.d.ts.map +1 -0
  489. package/dist/src/retrieval/lexical.js +301 -0
  490. package/dist/src/retrieval/lexical.js.map +1 -0
  491. package/dist/src/retrieval/post-filter.d.ts +32 -0
  492. package/dist/src/retrieval/post-filter.d.ts.map +1 -0
  493. package/dist/src/retrieval/post-filter.js +57 -0
  494. package/dist/src/retrieval/post-filter.js.map +1 -0
  495. package/dist/src/retrieval/reranker.d.ts +72 -0
  496. package/dist/src/retrieval/reranker.d.ts.map +1 -0
  497. package/dist/src/retrieval/reranker.js +129 -0
  498. package/dist/src/retrieval/reranker.js.map +1 -0
  499. package/dist/src/retrieval/vector.d.ts +47 -0
  500. package/dist/src/retrieval/vector.d.ts.map +1 -0
  501. package/dist/src/retrieval/vector.js +112 -0
  502. package/dist/src/retrieval/vector.js.map +1 -0
  503. package/dist/src/runtime/legacy-migration.d.ts +27 -0
  504. package/dist/src/runtime/legacy-migration.d.ts.map +1 -0
  505. package/dist/src/runtime/legacy-migration.js +140 -0
  506. package/dist/src/runtime/legacy-migration.js.map +1 -0
  507. package/dist/src/runtime/legacy-name-guard.d.ts +35 -0
  508. package/dist/src/runtime/legacy-name-guard.d.ts.map +1 -0
  509. package/dist/src/runtime/legacy-name-guard.js +58 -0
  510. package/dist/src/runtime/legacy-name-guard.js.map +1 -0
  511. package/dist/src/runtime/rift-env.d.ts +14 -0
  512. package/dist/src/runtime/rift-env.d.ts.map +1 -0
  513. package/dist/src/runtime/rift-env.js +79 -0
  514. package/dist/src/runtime/rift-env.js.map +1 -0
  515. package/dist/src/runtime/watcher-startup.d.ts +2 -0
  516. package/dist/src/runtime/watcher-startup.d.ts.map +1 -0
  517. package/dist/src/runtime/watcher-startup.js +4 -0
  518. package/dist/src/runtime/watcher-startup.js.map +1 -0
  519. package/dist/src/security/archive.d.ts +23 -0
  520. package/dist/src/security/archive.d.ts.map +1 -0
  521. package/dist/src/security/archive.js +163 -0
  522. package/dist/src/security/archive.js.map +1 -0
  523. package/dist/src/security/paths.d.ts +21 -0
  524. package/dist/src/security/paths.d.ts.map +1 -0
  525. package/dist/src/security/paths.js +67 -0
  526. package/dist/src/security/paths.js.map +1 -0
  527. package/dist/src/server/app.d.ts +29 -0
  528. package/dist/src/server/app.d.ts.map +1 -0
  529. package/dist/src/server/app.js +226 -0
  530. package/dist/src/server/app.js.map +1 -0
  531. package/dist/src/server/build-info.d.ts +8 -0
  532. package/dist/src/server/build-info.d.ts.map +1 -0
  533. package/dist/src/server/build-info.js +61 -0
  534. package/dist/src/server/build-info.js.map +1 -0
  535. package/dist/src/server/lifecycle.d.ts +30 -0
  536. package/dist/src/server/lifecycle.d.ts.map +1 -0
  537. package/dist/src/server/lifecycle.js +59 -0
  538. package/dist/src/server/lifecycle.js.map +1 -0
  539. package/dist/src/server/middleware/multipart.d.ts +51 -0
  540. package/dist/src/server/middleware/multipart.d.ts.map +1 -0
  541. package/dist/src/server/middleware/multipart.js +86 -0
  542. package/dist/src/server/middleware/multipart.js.map +1 -0
  543. package/dist/src/server/routes/compact.d.ts +37 -0
  544. package/dist/src/server/routes/compact.d.ts.map +1 -0
  545. package/dist/src/server/routes/compact.js +77 -0
  546. package/dist/src/server/routes/compact.js.map +1 -0
  547. package/dist/src/server/routes/context.d.ts +5 -0
  548. package/dist/src/server/routes/context.d.ts.map +1 -0
  549. package/dist/src/server/routes/context.js +50 -0
  550. package/dist/src/server/routes/context.js.map +1 -0
  551. package/dist/src/server/routes/conversations-search.d.ts +4 -0
  552. package/dist/src/server/routes/conversations-search.d.ts.map +1 -0
  553. package/dist/src/server/routes/conversations-search.js +243 -0
  554. package/dist/src/server/routes/conversations-search.js.map +1 -0
  555. package/dist/src/server/routes/friend-status.d.ts +72 -0
  556. package/dist/src/server/routes/friend-status.d.ts.map +1 -0
  557. package/dist/src/server/routes/friend-status.js +71 -0
  558. package/dist/src/server/routes/friend-status.js.map +1 -0
  559. package/dist/src/server/routes/ingest.d.ts +15 -0
  560. package/dist/src/server/routes/ingest.d.ts.map +1 -0
  561. package/dist/src/server/routes/ingest.js +139 -0
  562. package/dist/src/server/routes/ingest.js.map +1 -0
  563. package/dist/src/server/routes/jobs.d.ts +10 -0
  564. package/dist/src/server/routes/jobs.d.ts.map +1 -0
  565. package/dist/src/server/routes/jobs.js +29 -0
  566. package/dist/src/server/routes/jobs.js.map +1 -0
  567. package/dist/src/server/routes/mcp-usage.d.ts +13 -0
  568. package/dist/src/server/routes/mcp-usage.d.ts.map +1 -0
  569. package/dist/src/server/routes/mcp-usage.js +17 -0
  570. package/dist/src/server/routes/mcp-usage.js.map +1 -0
  571. package/dist/src/server/routes/reconcile.d.ts +4 -0
  572. package/dist/src/server/routes/reconcile.d.ts.map +1 -0
  573. package/dist/src/server/routes/reconcile.js +43 -0
  574. package/dist/src/server/routes/reconcile.js.map +1 -0
  575. package/dist/src/server/routes/reindex.d.ts +4 -0
  576. package/dist/src/server/routes/reindex.d.ts.map +1 -0
  577. package/dist/src/server/routes/reindex.js +74 -0
  578. package/dist/src/server/routes/reindex.js.map +1 -0
  579. package/dist/src/server/routes/save.d.ts +40 -0
  580. package/dist/src/server/routes/save.d.ts.map +1 -0
  581. package/dist/src/server/routes/save.js +112 -0
  582. package/dist/src/server/routes/save.js.map +1 -0
  583. package/dist/src/server/routes/search.d.ts +5 -0
  584. package/dist/src/server/routes/search.d.ts.map +1 -0
  585. package/dist/src/server/routes/search.js +400 -0
  586. package/dist/src/server/routes/search.js.map +1 -0
  587. package/dist/src/server/routes/stats.d.ts +10 -0
  588. package/dist/src/server/routes/stats.d.ts.map +1 -0
  589. package/dist/src/server/routes/stats.js +15 -0
  590. package/dist/src/server/routes/stats.js.map +1 -0
  591. package/dist/src/server/routes/status.d.ts +20 -0
  592. package/dist/src/server/routes/status.d.ts.map +1 -0
  593. package/dist/src/server/routes/status.js +31 -0
  594. package/dist/src/server/routes/status.js.map +1 -0
  595. package/dist/src/server/routes/triage.d.ts +4 -0
  596. package/dist/src/server/routes/triage.d.ts.map +1 -0
  597. package/dist/src/server/routes/triage.js +94 -0
  598. package/dist/src/server/routes/triage.js.map +1 -0
  599. package/dist/src/server/save-quality.d.ts +21 -0
  600. package/dist/src/server/save-quality.d.ts.map +1 -0
  601. package/dist/src/server/save-quality.js +51 -0
  602. package/dist/src/server/save-quality.js.map +1 -0
  603. package/dist/src/storage/atomic.d.ts +8 -0
  604. package/dist/src/storage/atomic.d.ts.map +1 -0
  605. package/dist/src/storage/atomic.js +22 -0
  606. package/dist/src/storage/atomic.js.map +1 -0
  607. package/dist/src/storage/db.d.ts +15 -0
  608. package/dist/src/storage/db.d.ts.map +1 -0
  609. package/dist/src/storage/db.js +43 -0
  610. package/dist/src/storage/db.js.map +1 -0
  611. package/dist/src/storage/integrity.d.ts +11 -0
  612. package/dist/src/storage/integrity.d.ts.map +1 -0
  613. package/dist/src/storage/integrity.js +66 -0
  614. package/dist/src/storage/integrity.js.map +1 -0
  615. package/dist/src/storage/rebuild.d.ts +37 -0
  616. package/dist/src/storage/rebuild.d.ts.map +1 -0
  617. package/dist/src/storage/rebuild.js +353 -0
  618. package/dist/src/storage/rebuild.js.map +1 -0
  619. package/dist/src/storage/shadow-swap.d.ts +20 -0
  620. package/dist/src/storage/shadow-swap.d.ts.map +1 -0
  621. package/dist/src/storage/shadow-swap.js +163 -0
  622. package/dist/src/storage/shadow-swap.js.map +1 -0
  623. package/dist/src/storage/tables.d.ts +77 -0
  624. package/dist/src/storage/tables.d.ts.map +1 -0
  625. package/dist/src/storage/tables.js +196 -0
  626. package/dist/src/storage/tables.js.map +1 -0
  627. package/package.json +45 -14
  628. package/index.js +0 -3
package/README.dev.md ADDED
@@ -0,0 +1,110 @@
1
+ # Rift (`rift`)
2
+
3
+ Local-first personal memory + reasoning infrastructure. Captures local CLI sessions, web conversation exports, and project documents; routes them through triage, metadata extraction, and embedding; persists into LanceDB; exposes retrieval through a small MCP surface so agents can pull *capability, not payload*.
4
+
5
+ Designed to feel like a built-in capability for whatever assistant is in front of it, not like a giant preloaded briefing.
6
+
7
+ ---
8
+
9
+ ## Architecture at a glance
10
+
11
+ ```
12
+ ┌─────────────────────────────────────────────────────────┐
13
+ │ Live capture (claude_code, codex_cli session JSONLs) │
14
+ │ Web exports (chatgpt_web, claude_web, gemini, grok) │
15
+ │ Project docs (filesystem watchers / scheduled scans) │
16
+ └────────────────────┬────────────────────────────────────┘
17
+
18
+ ┌────▼────┐
19
+ │ Triage │ ← Codex CLI (default)
20
+ │ loop │
21
+ └────┬────┘
22
+ │ save / review / discard
23
+
24
+ ┌────▼─────────────┐
25
+ │ Metadata extract │ ← Codex CLI (web/ingest path)
26
+ │ (POST /ingest) │
27
+ └────┬─────────────┘
28
+
29
+ ┌────▼──────────────────────────────────┐
30
+ │ Voyage AI embedding (voyage-3-lite) │
31
+ └────┬──────────────────────────────────┘
32
+
33
+ ┌────▼─────────────────────────────────┐
34
+ │ LanceDB │
35
+ │ conversations_hot / cold │
36
+ │ structured_docs │
37
+ │ digests ← Codex CLI digest job │
38
+ └────┬─────────────────────────────────┘
39
+
40
+ ┌────▼──────────────────────────┐
41
+ │ MCP server (life_*) │
42
+ │ HTTP daemon on 127.0.0.1:3577 │
43
+ └───────────────────────────────┘
44
+ ```
45
+
46
+ ## Models & runtimes in use
47
+
48
+ | Stage | Runtime | Model |
49
+ |---|---|---|
50
+ | Triage (decide save/review/discard) | local `codex` CLI | CLI default |
51
+ | Metadata extraction (web/ingest path) | local `codex` CLI | CLI default |
52
+ | Digest summarization (compact job) | local `codex` CLI | CLI default |
53
+ | Embeddings | Voyage AI (cloud) | `voyage-3-lite` |
54
+ | Local-LLM override (optional) | Ollama at `localhost:11434` | configurable (`metadata_model`, `digest_model`) |
55
+
56
+ **Cloud mode (default)** — set `local_generation.enabled: false` in `config.json`. All LLM calls go through the operator's already-authenticated `codex` CLI. No Anthropic / OpenAI API key required.
57
+
58
+ **Local-LLM override** — set `local_generation.enabled: true`. Metadata + digest go through the configured Ollama models. Triage still uses Codex CLI.
59
+
60
+ The two modes are mutually exclusive — exactly one runtime owns LLM calls at a time.
61
+
62
+ ## CLI vs API surface
63
+
64
+ **Local-only (no network)**:
65
+ - `codex` CLI subprocess (every triage / metadata / digest call).
66
+ - Filesystem watchers for project sources.
67
+ - LanceDB on disk under `data/lancedb/`.
68
+ - Daemon HTTP listens on `127.0.0.1:3577` (loopback only).
69
+ - MCP server speaks JSON-RPC over stdio.
70
+
71
+ **Network**:
72
+ - Voyage embedding API (`api.voyageai.com`) — only consumer.
73
+
74
+ **Provider classes preserved but not in the live default path** (kept for explicit batch/historical use): `OpenAITriageProvider`, `OpenAIMetadataExtractor`, `AnthropicDigestSummarizer`, `CliMetadataExtractor` (legacy Claude CLI subprocess).
75
+
76
+ ## Main commands
77
+
78
+ ```bash
79
+ # Live capture (Claude Code + Codex CLI session files)
80
+ rift capture # both sources
81
+ rift capture --source codex_cli # one source
82
+ rift capture --dry-run # preflight + triage, no saves
83
+
84
+ # Status + telemetry
85
+ rift status # daemon briefing + auto-capture summary
86
+ rift stats # table counts, source coverage
87
+
88
+ # Search
89
+ rift search "..."
90
+
91
+ # Daemon (managed by launchd)
92
+ launchctl kickstart -k gui/$UID/com.rift.daemon
93
+ launchctl print gui/$UID/com.rift.daemon
94
+ ```
95
+
96
+ The macOS menu bar (SwiftBar plugin at `operator/swiftbar/rift.10s.sh`) shows daemon health and the live MCP-usage telemetry block (today / this week / this month / all-time call counts + tokens-saved estimate) at the top of its dropdown.
97
+
98
+ ## Pointers
99
+
100
+ - [`TODO.md`](./TODO.md) — current/next/later tracker (updated end of every session).
101
+ - [`PROJECT_STATE.md`](./PROJECT_STATE.md) — what's currently in flight.
102
+ - [`CLAUDE.md`](./CLAUDE.md) — instructions for AI agents working in this repo.
103
+ - [`docs/`](./docs/) — design docs (current system, API/MCP spec, capture contract, intelligence direction, etc.).
104
+
105
+ ## Conventions
106
+
107
+ - TypeScript strict; `pnpm check` (or `npm run check`) before ship.
108
+ - Vitest. Pretest generates fixtures.
109
+ - Local-first, file-native storage under `data/`, `jobs/`, `reports/`.
110
+ - Auto-capture triage depends on a working, authenticated `codex` CLI. Preflight failures here mean CLI auth/install/runtime issues (`codex login`, CLI upgrade/reinstall, or launchd PATH), not a missing `rift.openai` Keychain secret — that path was retired.
package/README.md ADDED
@@ -0,0 +1,130 @@
1
+ # Rift
2
+
3
+ **Mémoire personnelle locale pour tes IA.** Rift capture en local tes sessions Claude Code et Codex CLI, les triage, les indexe, et expose une mémoire interrogeable via MCP — pour que Claude Desktop, Claude Code, Codex et Cursor retrouvent ce que tu leur as déjà dit.
4
+
5
+ Tout reste sur ta machine, sauf les *embeddings* (envoyés à Voyage AI sous une clé qui t'appartient).
6
+
7
+ ---
8
+
9
+ ## À lire avant d'installer
10
+
11
+ > **La capture démarre maintenant.**
12
+ > Au premier lancement, Rift pose un *watermark* sur tes sessions Claude Code et Codex CLI existantes : **elles ne sont pas réingérées rétroactivement**. Seules les sessions à partir de l'installation comptent.
13
+ >
14
+ > Si tu veux que tes conversations historiques (sessions Claude Code locales antérieures, exports `.zip` de claude.ai / chatgpt.com / gemini.google.com / grok.com) soient *aussi* indexées, c'est une **prestation séparée** — voir la section [Backfill historique (payant)](#backfill-historique-payant) plus bas.
15
+
16
+ ---
17
+
18
+ ## Prérequis
19
+
20
+ - macOS 12.3 ou plus récent.
21
+ - Node.js 20.19+ (vérifie avec `node --version`).
22
+ - npm (livré avec Node).
23
+ - [Codex CLI](https://github.com/openai/codex) installé et authentifié (`codex login`). Rift fait passer le triage et l'extraction de métadonnées par ton CLI Codex local — pas besoin de clé OpenAI séparée.
24
+ - Une clé Voyage AI (création gratuite sur [voyageai.com](https://www.voyageai.com/)). Sert *uniquement* aux embeddings ; chaque user a sa propre clé.
25
+
26
+ ## Installation (1 commande)
27
+
28
+ ```sh
29
+ curl -fsSL https://getrift.dev/install | bash
30
+ ```
31
+
32
+ Ce que fait le script :
33
+
34
+ - vérifie les prérequis (macOS, Node, codex CLI…),
35
+ - installe globalement le paquet npm `@getrift/rift@beta`,
36
+ - crée les dossiers de données (`~/Library/Application Support/Rift/`),
37
+ - pose un agent launchd (`com.getrift.daemon`) qui démarre Rift à la session,
38
+ - attend que `/health` réponde sur `127.0.0.1:3577`.
39
+
40
+ Si l'installation échoue, le script restaure ton état précédent et imprime un identifiant de backup pour le diagnostic.
41
+
42
+ ## Premier paramétrage
43
+
44
+ ```sh
45
+ rift onboard
46
+ ```
47
+
48
+ L'assistant va :
49
+
50
+ 1. te demander ta clé Voyage AI (collée depuis ton 1Password — elle ne s'affiche pas) ;
51
+ 2. valider la clé en faisant un embed test ;
52
+ 3. faire un *preflight* sur ton Codex CLI (vérifie qu'il est authentifié) ;
53
+ 4. lancer une première passe de capture (les sessions existantes sont watermarkées, pas ingérées) ;
54
+ 5. proposer de brancher Rift comme serveur MCP dans Claude Desktop / Claude Code / Codex / Cursor.
55
+
56
+ Tu peux importer un export ChatGPT ou Claude.ai pendant l'onboarding (optionnel — voir la section backfill).
57
+
58
+ ## Vérifier que ça tourne
59
+
60
+ ```sh
61
+ rift status
62
+ ```
63
+
64
+ Tu dois voir quelque chose comme :
65
+
66
+ ```
67
+ Rift v0.1.0-beta.0 · daemon: running (uptime 5m) · port 3577 ✓
68
+ Voyage: key valid (last 4 …xxxx, last embed 2m ago)
69
+ Codex CLI: authed ✓
70
+ Capture: last run 8m ago — 3 saved · 0 review · 0 failed
71
+ MCP: claude-desktop ✓ · codex ✓ · claude-code ✓ · cursor ✓
72
+ Feedback: relay off (local JSONL only)
73
+
74
+ Next: nothing broken. Try rift search "<topic>".
75
+ ```
76
+
77
+ ## Usage quotidien
78
+
79
+ - **Rien à faire.** Le daemon tourne en tâche de fond, ingère tes nouvelles sessions Claude Code / Codex CLI toutes les heures, et expose la mémoire via MCP.
80
+ - **Rechercher en CLI :** `rift search "comment on a structuré le pricing"`
81
+ - **Forcer une passe maintenant :** `rift capture`
82
+ - **Ouvrir une conversation MCP** (Claude Desktop, Cursor, etc.) — Rift apparaît dans la liste des outils. Tape *"recall what we decided about X"* et l'agent appellera `rift_search` / `rift_context_pack` automatiquement.
83
+
84
+ ## Vie privée
85
+
86
+ - **Local par défaut.** Tes sessions, métadonnées, et la base vectorielle (LanceDB) restent sur ta machine.
87
+ - **Voyage AI.** Seuls les *snippets* envoyés pour embedding partent vers Voyage. Ta clé t'appartient ; tu peux la révoquer côté Voyage à tout moment.
88
+ - **Aucune télémétrie de contenu.** Rift n'envoie rien chez moi, sauf si tu actives explicitement le *feedback relay* (`rift feedback --kind=...`) — et même là, c'est uniquement la note que tu écris, pas tes conversations.
89
+ - **Désinstallation propre :** `rift uninstall` enlève le daemon, les entrées MCP, et (avec `--purge-data`) les données.
90
+
91
+ Le contrat de vie privée détaillé arrive avec le paquet : `docs/feedback/PRIVACY.md`.
92
+
93
+ ## Backfill historique (payant)
94
+
95
+ Le watermark protège ton historique pré-installation : Rift ne va pas inonder ta mémoire avec deux ans de conversations dont la moitié sont du débogage jetable. Mais si tu veux *vraiment* que ton corpus passé soit indexé — sessions Claude Code locales antérieures, exports `.zip` claude.ai, chatgpt.com, gemini.google.com, grok.com — c'est faisable, mais ça représente plusieurs heures de tri et de QA pour calibrer les filtres à ton usage.
96
+
97
+ **Tarif : 500 € HT, prestation ponctuelle.**
98
+
99
+ Ce que ça inclut :
100
+
101
+ - import de tes exports web (`rift import <export.zip>`) avec audit du contenu,
102
+ - déwatermark ciblé des sessions Claude Code / Codex CLI valant le coup (filtré par date, projet, ou heuristique),
103
+ - tuning des règles de triage à ton usage réel pendant une semaine,
104
+ - une session de 60 min en visio pour valider ce qui est dans la mémoire vs ce qui a été écarté.
105
+
106
+ Pour déclencher : il me faut un bon de commande / facture HT signée par ton boss. Une fois validé, on cale 1h de kickoff.
107
+
108
+ ## En cas de pépin
109
+
110
+ - **Le daemon ne répond pas :**
111
+ ```sh
112
+ launchctl kickstart -k gui/$UID/com.getrift.daemon
113
+ ```
114
+ - **Codex CLI auth périmé :** `codex login`
115
+ - **Clé Voyage révoquée / changée :** `rift onboard --reconfigure-voyage`
116
+ - **MCP pas branché dans un client :** `rift mcp install --client=claude-desktop` (ou `codex`, `claude-code`, `cursor`)
117
+ - **Donner du feedback (utile) :** `rift feedback --kind=broke --with-status` — capture l'état du daemon et l'envoie en local (et en relay si tu l'as activé pendant l'onboard).
118
+
119
+ ## Désinstaller
120
+
121
+ ```sh
122
+ rift uninstall # enlève daemon + MCP
123
+ rift uninstall --purge-data # + supprime les données locales
124
+ ```
125
+
126
+ La clé Voyage reste dans `~/.rift.env` même après `--purge-data` — la commande affiche le `rm` exact pour la supprimer (ou tu peux la révoquer côté Voyage).
127
+
128
+ ## License
129
+
130
+ Beta privée. Pas de redistribution.
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Low-level Keychain operations.
3
+ *
4
+ * Abstracted as an interface so rotation.ts can be tested with an
5
+ * in-memory implementation that never touches the real Keychain.
6
+ */
7
+ export interface KeychainOps {
8
+ read(version: number): Promise<string | null>;
9
+ write(version: number, token: string): Promise<void>;
10
+ delete(version: number): Promise<void>;
11
+ findLatestVersion(): Promise<number>;
12
+ }
13
+ /**
14
+ * Production Keychain backend using the macOS `security` CLI.
15
+ *
16
+ * Token versioning: each version is stored as a separate generic-password
17
+ * entry. A metadata entry (`AUTH_TOKEN_CURRENT_VERSION`) tracks the
18
+ * latest version number so we avoid scanning the entire keychain.
19
+ *
20
+ * Error policy: only "item not found" (exit 44) is swallowed where
21
+ * appropriate. All other errors (locked keychain, permission denied,
22
+ * missing binary) propagate as thrown exceptions.
23
+ */
24
+ export declare const macKeychain: KeychainOps;
25
+ //# sourceMappingURL=keychain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keychain.d.ts","sourceRoot":"","sources":["../../../src/auth/keychain.ts"],"names":[],"mappings":"AAaA;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC9C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CACtC;AAgBD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,WAAW,EAAE,WA0EzB,CAAC"}
@@ -0,0 +1,113 @@
1
+ import { execFile } from "node:child_process";
2
+ import { promisify } from "node:util";
3
+ const execFileAsync = promisify(execFile);
4
+ const SERVICE = "com.getrift.daemon";
5
+ /**
6
+ * macOS `security` CLI exit code for errSecItemNotFound.
7
+ * This is the only error we treat as "success with empty result".
8
+ * All other non-zero exits are real failures that must propagate.
9
+ */
10
+ const ERR_SEC_ITEM_NOT_FOUND = 44;
11
+ function accountName(version) {
12
+ return `AUTH_TOKEN_v${version}`;
13
+ }
14
+ /**
15
+ * Returns true only for the specific "item not found" error from
16
+ * the macOS `security` CLI. All other errors are real failures.
17
+ */
18
+ function isItemNotFound(err) {
19
+ if (!(err instanceof Error))
20
+ return false;
21
+ const execErr = err;
22
+ return execErr.code === ERR_SEC_ITEM_NOT_FOUND;
23
+ }
24
+ /**
25
+ * Production Keychain backend using the macOS `security` CLI.
26
+ *
27
+ * Token versioning: each version is stored as a separate generic-password
28
+ * entry. A metadata entry (`AUTH_TOKEN_CURRENT_VERSION`) tracks the
29
+ * latest version number so we avoid scanning the entire keychain.
30
+ *
31
+ * Error policy: only "item not found" (exit 44) is swallowed where
32
+ * appropriate. All other errors (locked keychain, permission denied,
33
+ * missing binary) propagate as thrown exceptions.
34
+ */
35
+ export const macKeychain = {
36
+ async read(version) {
37
+ try {
38
+ const { stdout } = await execFileAsync("security", [
39
+ "find-generic-password",
40
+ "-a",
41
+ accountName(version),
42
+ "-s",
43
+ SERVICE,
44
+ "-w",
45
+ ]);
46
+ return stdout.trim() || null;
47
+ }
48
+ catch (err) {
49
+ if (isItemNotFound(err))
50
+ return null;
51
+ throw err;
52
+ }
53
+ },
54
+ async write(version, token) {
55
+ await execFileAsync("security", [
56
+ "add-generic-password",
57
+ "-a",
58
+ accountName(version),
59
+ "-s",
60
+ SERVICE,
61
+ "-w",
62
+ token,
63
+ "-U",
64
+ ]);
65
+ // Update version counter
66
+ await execFileAsync("security", [
67
+ "add-generic-password",
68
+ "-a",
69
+ "AUTH_TOKEN_CURRENT_VERSION",
70
+ "-s",
71
+ SERVICE,
72
+ "-w",
73
+ String(version),
74
+ "-U",
75
+ ]);
76
+ },
77
+ async delete(version) {
78
+ try {
79
+ await execFileAsync("security", [
80
+ "delete-generic-password",
81
+ "-a",
82
+ accountName(version),
83
+ "-s",
84
+ SERVICE,
85
+ ]);
86
+ }
87
+ catch (err) {
88
+ if (isItemNotFound(err))
89
+ return; // Already gone — fine.
90
+ throw err;
91
+ }
92
+ },
93
+ async findLatestVersion() {
94
+ try {
95
+ const { stdout } = await execFileAsync("security", [
96
+ "find-generic-password",
97
+ "-a",
98
+ "AUTH_TOKEN_CURRENT_VERSION",
99
+ "-s",
100
+ SERVICE,
101
+ "-w",
102
+ ]);
103
+ const version = Number(stdout.trim());
104
+ return Number.isNaN(version) ? 0 : version;
105
+ }
106
+ catch (err) {
107
+ if (isItemNotFound(err))
108
+ return 0; // No tokens issued yet.
109
+ throw err;
110
+ }
111
+ },
112
+ };
113
+ //# sourceMappingURL=keychain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keychain.js","sourceRoot":"","sources":["../../../src/auth/keychain.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAC1C,MAAM,OAAO,GAAG,oBAAoB,CAAC;AAErC;;;;GAIG;AACH,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAelC,SAAS,WAAW,CAAC,OAAe;IAClC,OAAO,eAAe,OAAO,EAAE,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,SAAS,cAAc,CAAC,GAAY;IAClC,IAAI,CAAC,CAAC,GAAG,YAAY,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1C,MAAM,OAAO,GAAG,GAAwB,CAAC;IACzC,OAAO,OAAO,CAAC,IAAI,KAAK,sBAAsB,CAAC;AACjD,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,WAAW,GAAgB;IACtC,KAAK,CAAC,IAAI,CAAC,OAAO;QAChB,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE;gBACjD,uBAAuB;gBACvB,IAAI;gBACJ,WAAW,CAAC,OAAO,CAAC;gBACpB,IAAI;gBACJ,OAAO;gBACP,IAAI;aACL,CAAC,CAAC;YACH,OAAO,MAAM,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;QAC/B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,cAAc,CAAC,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;YACrC,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK;QACxB,MAAM,aAAa,CAAC,UAAU,EAAE;YAC9B,sBAAsB;YACtB,IAAI;YACJ,WAAW,CAAC,OAAO,CAAC;YACpB,IAAI;YACJ,OAAO;YACP,IAAI;YACJ,KAAK;YACL,IAAI;SACL,CAAC,CAAC;QACH,yBAAyB;QACzB,MAAM,aAAa,CAAC,UAAU,EAAE;YAC9B,sBAAsB;YACtB,IAAI;YACJ,4BAA4B;YAC5B,IAAI;YACJ,OAAO;YACP,IAAI;YACJ,MAAM,CAAC,OAAO,CAAC;YACf,IAAI;SACL,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,OAAO;QAClB,IAAI,CAAC;YACH,MAAM,aAAa,CAAC,UAAU,EAAE;gBAC9B,yBAAyB;gBACzB,IAAI;gBACJ,WAAW,CAAC,OAAO,CAAC;gBACpB,IAAI;gBACJ,OAAO;aACR,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,cAAc,CAAC,GAAG,CAAC;gBAAE,OAAO,CAAC,uBAAuB;YACxD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,iBAAiB;QACrB,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,UAAU,EAAE;gBACjD,uBAAuB;gBACvB,IAAI;gBACJ,4BAA4B;gBAC5B,IAAI;gBACJ,OAAO;gBACP,IAAI;aACL,CAAC,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACtC,OAAO,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAC7C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,cAAc,CAAC,GAAG,CAAC;gBAAE,OAAO,CAAC,CAAC,CAAC,wBAAwB;YAC3D,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;CACF,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { FastifyInstance } from "fastify";
2
+ import type { Config } from "../config/schema.js";
3
+ import type { TokenManager } from "./rotation.js";
4
+ import type { RateLimiter } from "./rate-limit.js";
5
+ /**
6
+ * Register the bearer-token auth hook and per-token rate limiter.
7
+ *
8
+ * Auth is skipped for /health, /ready, /version, and /stats/mcp-usage
9
+ * (unauthenticated probes used by health/operator surfaces).
10
+ *
11
+ * Test-only bypass: when `NODE_ENV=test` AND `config.auth.test_token`
12
+ * is set AND the bearer matches it, the request is allowed without
13
+ * consulting the TokenManager. This is the ONLY way to bypass Keychain
14
+ * in tests — it is never active in production config.
15
+ *
16
+ * Rate limiting is skipped for `DELETE /auth/token` so a leaked token
17
+ * that has hit the rate-limit cap can still revoke itself.
18
+ */
19
+ export declare function registerAuth(server: FastifyInstance, config: Config, tokenManager: TokenManager | null, rateLimiter: RateLimiter): void;
20
+ //# sourceMappingURL=middleware.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../../src/auth/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAYnD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,YAAY,GAAG,IAAI,EACjC,WAAW,EAAE,WAAW,GACvB,IAAI,CA8BN"}
@@ -0,0 +1,49 @@
1
+ const EXEMPT_ROUTES = new Set([
2
+ "/health",
3
+ "/ready",
4
+ "/version",
5
+ // SwiftBar polls this on every tick. Response carries only call counts
6
+ // and tool names — no user content — so unauthenticated is safe and
7
+ // matches the /health, /version posture.
8
+ "/stats/mcp-usage",
9
+ ]);
10
+ /**
11
+ * Register the bearer-token auth hook and per-token rate limiter.
12
+ *
13
+ * Auth is skipped for /health, /ready, /version, and /stats/mcp-usage
14
+ * (unauthenticated probes used by health/operator surfaces).
15
+ *
16
+ * Test-only bypass: when `NODE_ENV=test` AND `config.auth.test_token`
17
+ * is set AND the bearer matches it, the request is allowed without
18
+ * consulting the TokenManager. This is the ONLY way to bypass Keychain
19
+ * in tests — it is never active in production config.
20
+ *
21
+ * Rate limiting is skipped for `DELETE /auth/token` so a leaked token
22
+ * that has hit the rate-limit cap can still revoke itself.
23
+ */
24
+ export function registerAuth(server, config, tokenManager, rateLimiter) {
25
+ server.addHook("onRequest", async (request, reply) => {
26
+ const path = request.url.split("?")[0];
27
+ if (EXEMPT_ROUTES.has(path))
28
+ return;
29
+ const authHeader = request.headers.authorization;
30
+ if (!authHeader || !authHeader.startsWith("Bearer ")) {
31
+ return reply.code(401).send({ error: "missing_token" });
32
+ }
33
+ const token = authHeader.slice(7);
34
+ // Test-only bypass — double-gated.
35
+ const isTestBypass = process.env.NODE_ENV === "test" &&
36
+ config.auth.test_token !== undefined &&
37
+ token === config.auth.test_token;
38
+ if (!isTestBypass && (tokenManager === null || !tokenManager.validate(token))) {
39
+ return reply.code(401).send({ error: "invalid_token" });
40
+ }
41
+ // Rate limit — but exempt DELETE /auth/token so a leaked token
42
+ // that has already hit the cap can still revoke itself.
43
+ const isRateLimitExempt = path === "/auth/token" && request.method === "DELETE";
44
+ if (!isRateLimitExempt && !rateLimiter.check(token)) {
45
+ return reply.code(429).send({ error: "rate_limit_exceeded" });
46
+ }
47
+ });
48
+ }
49
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../../src/auth/middleware.ts"],"names":[],"mappings":"AAKA,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IAC5B,SAAS;IACT,QAAQ;IACR,UAAU;IACV,uEAAuE;IACvE,oEAAoE;IACpE,yCAAyC;IACzC,kBAAkB;CACnB,CAAC,CAAC;AAEH;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,YAAY,CAC1B,MAAuB,EACvB,MAAc,EACd,YAAiC,EACjC,WAAwB;IAExB,MAAM,CAAC,OAAO,CAAC,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QACnD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACvC,IAAI,aAAa,CAAC,GAAG,CAAC,IAAK,CAAC;YAAE,OAAO;QAErC,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC;QACjD,IAAI,CAAC,UAAU,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YACrD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;QAC1D,CAAC;QAED,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAElC,mCAAmC;QACnC,MAAM,YAAY,GAChB,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,MAAM;YAC/B,MAAM,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS;YACpC,KAAK,KAAK,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;QAEnC,IAAI,CAAC,YAAY,IAAI,CAAC,YAAY,KAAK,IAAI,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAC9E,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;QAC1D,CAAC;QAED,+DAA+D;QAC/D,wDAAwD;QACxD,MAAM,iBAAiB,GACrB,IAAI,KAAK,aAAa,IAAI,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC;QACxD,IAAI,CAAC,iBAAiB,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YACpD,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,qBAAqB,EAAE,CAAC,CAAC;QAChE,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Per-token sliding-window rate limiter.
3
+ *
4
+ * Tracks request timestamps per token. On each call to `check()`,
5
+ * expired entries are pruned and the count is compared to the limit.
6
+ */
7
+ export declare class RateLimiter {
8
+ private windowMs;
9
+ private maxRequests;
10
+ private windows;
11
+ constructor(windowMs: number, maxRequests: number);
12
+ /** Returns `true` if the request is allowed, `false` if rate-limited. */
13
+ check(token: string): boolean;
14
+ reset(): void;
15
+ }
16
+ //# sourceMappingURL=rate-limit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.d.ts","sourceRoot":"","sources":["../../../src/auth/rate-limit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,qBAAa,WAAW;IAIpB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,WAAW;IAJrB,OAAO,CAAC,OAAO,CAA+B;gBAGpC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,MAAM;IAG7B,yEAAyE;IACzE,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAuB7B,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Per-token sliding-window rate limiter.
3
+ *
4
+ * Tracks request timestamps per token. On each call to `check()`,
5
+ * expired entries are pruned and the count is compared to the limit.
6
+ */
7
+ export class RateLimiter {
8
+ windowMs;
9
+ maxRequests;
10
+ windows = new Map();
11
+ constructor(windowMs, maxRequests) {
12
+ this.windowMs = windowMs;
13
+ this.maxRequests = maxRequests;
14
+ }
15
+ /** Returns `true` if the request is allowed, `false` if rate-limited. */
16
+ check(token) {
17
+ const now = Date.now();
18
+ const cutoff = now - this.windowMs;
19
+ let timestamps = this.windows.get(token);
20
+ if (!timestamps) {
21
+ timestamps = [];
22
+ this.windows.set(token, timestamps);
23
+ }
24
+ // Prune expired entries from the front.
25
+ while (timestamps.length > 0 && timestamps[0] < cutoff) {
26
+ timestamps.shift();
27
+ }
28
+ if (timestamps.length >= this.maxRequests) {
29
+ return false;
30
+ }
31
+ timestamps.push(now);
32
+ return true;
33
+ }
34
+ reset() {
35
+ this.windows.clear();
36
+ }
37
+ }
38
+ //# sourceMappingURL=rate-limit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../../src/auth/rate-limit.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,OAAO,WAAW;IAIZ;IACA;IAJF,OAAO,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE9C,YACU,QAAgB,EAChB,WAAmB;QADnB,aAAQ,GAAR,QAAQ,CAAQ;QAChB,gBAAW,GAAX,WAAW,CAAQ;IAC1B,CAAC;IAEJ,yEAAyE;IACzE,KAAK,CAAC,KAAa;QACjB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC;QAEnC,IAAI,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,UAAU,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACtC,CAAC;QAED,wCAAwC;QACxC,OAAO,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,UAAU,CAAC,CAAC,CAAE,GAAG,MAAM,EAAE,CAAC;YACxD,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YAC1C,OAAO,KAAK,CAAC;QACf,CAAC;QAED,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK;QACH,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC;CACF"}
@@ -0,0 +1,67 @@
1
+ import type { KeychainOps } from "./keychain.js";
2
+ /**
3
+ * In-memory token state machine backed by a KeychainOps provider.
4
+ *
5
+ * Invariants:
6
+ * - At most 2 tokens are valid at once: current + grace (previous).
7
+ * - Grace expires after `gracePeriodMs` (default 60 s).
8
+ * - `load()` restores only the current version — no grace for old
9
+ * tokens on daemon restart (PRD: timer does not survive restart).
10
+ * - `revokeAll()` immediately invalidates everything and deletes
11
+ * ALL Keychain entries (versions 1..current) so revoked tokens
12
+ * don't resurface on restart and old secrets don't accumulate.
13
+ * - `issue()` eagerly deletes any superseded grace version from
14
+ * Keychain before setting up new grace, so rapid rotation
15
+ * (v1→v2→v3 within one grace window) never leaves old secrets.
16
+ * The latest grace version is cleaned up when its timer fires.
17
+ */
18
+ export declare class TokenManager {
19
+ private keychain;
20
+ private gracePeriodMs;
21
+ private currentVersion;
22
+ private currentToken;
23
+ private graceToken;
24
+ private graceVersion;
25
+ private graceTimer;
26
+ constructor(keychain: KeychainOps, gracePeriodMs?: number);
27
+ /**
28
+ * Cold-load: restore the current token from keychain with no grace.
29
+ * Used at daemon startup — PRD: grace timer does not survive restart.
30
+ */
31
+ load(): Promise<void>;
32
+ /**
33
+ * Hot-reload: pick up a new token from keychain (e.g. after CLI
34
+ * issues a token and sends SIGHUP).
35
+ *
36
+ * When `noGrace` is false (default), the old token enters a 60 s
37
+ * grace window. When `noGrace` is true, the old token is immediately
38
+ * invalidated and its Keychain entry deleted — used by `token issue`
39
+ * to enforce single-active-credential semantics (PRD: "makes it the
40
+ * sole active token").
41
+ *
42
+ * If the version hasn't changed, just refreshes the current value.
43
+ */
44
+ reload(opts?: {
45
+ noGrace?: boolean;
46
+ }): Promise<void>;
47
+ /** Check if a token is currently valid (current or within grace). */
48
+ validate(token: string): boolean;
49
+ /** Issue a new token. Returns the new version number. */
50
+ issue(newToken: string): Promise<number>;
51
+ /**
52
+ * Immediately revoke all tokens. No grace period.
53
+ *
54
+ * Clears in-memory state first (immediate effect for the running
55
+ * daemon), then deletes ALL Keychain entries (versions 1..current)
56
+ * so revoked tokens cannot resurface on restart.
57
+ *
58
+ * Keychain delete errors propagate — the caller (route handler)
59
+ * should surface them so the operator knows cleanup may be incomplete.
60
+ */
61
+ revokeAll(): Promise<void>;
62
+ /** Clean up timers. Call on daemon shutdown. */
63
+ shutdown(): void;
64
+ private clearGraceTimer;
65
+ private clearGrace;
66
+ }
67
+ //# sourceMappingURL=rotation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rotation.d.ts","sourceRoot":"","sources":["../../../src/auth/rotation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAEjD;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,YAAY;IAQrB,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,aAAa;IARvB,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,YAAY,CAAK;IACzB,OAAO,CAAC,UAAU,CAA8C;gBAGtD,QAAQ,EAAE,WAAW,EACrB,aAAa,SAAS;IAGhC;;;OAGG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAS3B;;;;;;;;;;;OAWG;IACG,MAAM,CAAC,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAoEzD,qEAAqE;IACrE,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO;IAMhC,yDAAyD;IACnD,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA6C9C;;;;;;;;;OASG;IACG,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAWhC,gDAAgD;IAChD,QAAQ,IAAI,IAAI;IAIhB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,UAAU;CAKnB"}