@getrift/rift 0.0.0 → 0.1.0-beta.1

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 (651) hide show
  1. package/README.dev.md +110 -0
  2. package/dist/src/auth/keychain.d.ts +25 -0
  3. package/dist/src/auth/keychain.d.ts.map +1 -0
  4. package/dist/src/auth/keychain.js +113 -0
  5. package/dist/src/auth/keychain.js.map +1 -0
  6. package/dist/src/auth/middleware.d.ts +20 -0
  7. package/dist/src/auth/middleware.d.ts.map +1 -0
  8. package/dist/src/auth/middleware.js +49 -0
  9. package/dist/src/auth/middleware.js.map +1 -0
  10. package/dist/src/auth/rate-limit.d.ts +16 -0
  11. package/dist/src/auth/rate-limit.d.ts.map +1 -0
  12. package/dist/src/auth/rate-limit.js +38 -0
  13. package/dist/src/auth/rate-limit.js.map +1 -0
  14. package/dist/src/auth/rotation.d.ts +67 -0
  15. package/dist/src/auth/rotation.d.ts.map +1 -0
  16. package/dist/src/auth/rotation.js +190 -0
  17. package/dist/src/auth/rotation.js.map +1 -0
  18. package/dist/src/backfill/project-context-batch-constructor.d.ts +127 -0
  19. package/dist/src/backfill/project-context-batch-constructor.d.ts.map +1 -0
  20. package/dist/src/backfill/project-context-batch-constructor.js +210 -0
  21. package/dist/src/backfill/project-context-batch-constructor.js.map +1 -0
  22. package/dist/src/capture/auto-capture.d.ts +162 -0
  23. package/dist/src/capture/auto-capture.d.ts.map +1 -0
  24. package/dist/src/capture/auto-capture.js +601 -0
  25. package/dist/src/capture/auto-capture.js.map +1 -0
  26. package/dist/src/capture/batch-budget.d.ts +90 -0
  27. package/dist/src/capture/batch-budget.d.ts.map +1 -0
  28. package/dist/src/capture/batch-budget.js +148 -0
  29. package/dist/src/capture/batch-budget.js.map +1 -0
  30. package/dist/src/capture/codex-cli-triage-provider.d.ts +17 -0
  31. package/dist/src/capture/codex-cli-triage-provider.d.ts.map +1 -0
  32. package/dist/src/capture/codex-cli-triage-provider.js +109 -0
  33. package/dist/src/capture/codex-cli-triage-provider.js.map +1 -0
  34. package/dist/src/capture/observability.d.ts +42 -0
  35. package/dist/src/capture/observability.d.ts.map +1 -0
  36. package/dist/src/capture/observability.js +87 -0
  37. package/dist/src/capture/observability.js.map +1 -0
  38. package/dist/src/capture/openai-triage-provider.d.ts +92 -0
  39. package/dist/src/capture/openai-triage-provider.d.ts.map +1 -0
  40. package/dist/src/capture/openai-triage-provider.js +267 -0
  41. package/dist/src/capture/openai-triage-provider.js.map +1 -0
  42. package/dist/src/capture/review-queue-index.d.ts +51 -0
  43. package/dist/src/capture/review-queue-index.d.ts.map +1 -0
  44. package/dist/src/capture/review-queue-index.js +204 -0
  45. package/dist/src/capture/review-queue-index.js.map +1 -0
  46. package/dist/src/capture/review-queue.d.ts +43 -0
  47. package/dist/src/capture/review-queue.d.ts.map +1 -0
  48. package/dist/src/capture/review-queue.js +116 -0
  49. package/dist/src/capture/review-queue.js.map +1 -0
  50. package/dist/src/capture/sources.d.ts +7 -0
  51. package/dist/src/capture/sources.d.ts.map +1 -0
  52. package/dist/src/capture/sources.js +3 -0
  53. package/dist/src/capture/sources.js.map +1 -0
  54. package/dist/src/capture/triage-lane.d.ts +39 -0
  55. package/dist/src/capture/triage-lane.d.ts.map +1 -0
  56. package/dist/src/capture/triage-lane.js +217 -0
  57. package/dist/src/capture/triage-lane.js.map +1 -0
  58. package/dist/src/capture/triage-provider.d.ts +75 -0
  59. package/dist/src/capture/triage-provider.d.ts.map +1 -0
  60. package/dist/src/capture/triage-provider.js +120 -0
  61. package/dist/src/capture/triage-provider.js.map +1 -0
  62. package/dist/src/capture/triage.d.ts +30 -0
  63. package/dist/src/capture/triage.d.ts.map +1 -0
  64. package/dist/src/capture/triage.js +48 -0
  65. package/dist/src/capture/triage.js.map +1 -0
  66. package/dist/src/cli/commands/backfill.d.ts +3 -0
  67. package/dist/src/cli/commands/backfill.d.ts.map +1 -0
  68. package/dist/src/cli/commands/backfill.js +1376 -0
  69. package/dist/src/cli/commands/backfill.js.map +1 -0
  70. package/dist/src/cli/commands/bulk-ingest.d.ts +3 -0
  71. package/dist/src/cli/commands/bulk-ingest.d.ts.map +1 -0
  72. package/dist/src/cli/commands/bulk-ingest.js +126 -0
  73. package/dist/src/cli/commands/bulk-ingest.js.map +1 -0
  74. package/dist/src/cli/commands/capture.d.ts +12 -0
  75. package/dist/src/cli/commands/capture.d.ts.map +1 -0
  76. package/dist/src/cli/commands/capture.js +123 -0
  77. package/dist/src/cli/commands/capture.js.map +1 -0
  78. package/dist/src/cli/commands/compact.d.ts +3 -0
  79. package/dist/src/cli/commands/compact.d.ts.map +1 -0
  80. package/dist/src/cli/commands/compact.js +70 -0
  81. package/dist/src/cli/commands/compact.js.map +1 -0
  82. package/dist/src/cli/commands/feedback.d.ts +22 -0
  83. package/dist/src/cli/commands/feedback.d.ts.map +1 -0
  84. package/dist/src/cli/commands/feedback.js +125 -0
  85. package/dist/src/cli/commands/feedback.js.map +1 -0
  86. package/dist/src/cli/commands/hooks-install.d.ts +19 -0
  87. package/dist/src/cli/commands/hooks-install.d.ts.map +1 -0
  88. package/dist/src/cli/commands/hooks-install.js +103 -0
  89. package/dist/src/cli/commands/hooks-install.js.map +1 -0
  90. package/dist/src/cli/commands/import.d.ts +19 -0
  91. package/dist/src/cli/commands/import.d.ts.map +1 -0
  92. package/dist/src/cli/commands/import.js +258 -0
  93. package/dist/src/cli/commands/import.js.map +1 -0
  94. package/dist/src/cli/commands/ingest.d.ts +3 -0
  95. package/dist/src/cli/commands/ingest.d.ts.map +1 -0
  96. package/dist/src/cli/commands/ingest.js +80 -0
  97. package/dist/src/cli/commands/ingest.js.map +1 -0
  98. package/dist/src/cli/commands/mcp-install.d.ts +25 -0
  99. package/dist/src/cli/commands/mcp-install.d.ts.map +1 -0
  100. package/dist/src/cli/commands/mcp-install.js +134 -0
  101. package/dist/src/cli/commands/mcp-install.js.map +1 -0
  102. package/dist/src/cli/commands/onboard.d.ts +98 -0
  103. package/dist/src/cli/commands/onboard.d.ts.map +1 -0
  104. package/dist/src/cli/commands/onboard.js +823 -0
  105. package/dist/src/cli/commands/onboard.js.map +1 -0
  106. package/dist/src/cli/commands/rebuild.d.ts +12 -0
  107. package/dist/src/cli/commands/rebuild.d.ts.map +1 -0
  108. package/dist/src/cli/commands/rebuild.js +164 -0
  109. package/dist/src/cli/commands/rebuild.js.map +1 -0
  110. package/dist/src/cli/commands/reconcile.d.ts +3 -0
  111. package/dist/src/cli/commands/reconcile.d.ts.map +1 -0
  112. package/dist/src/cli/commands/reconcile.js +56 -0
  113. package/dist/src/cli/commands/reconcile.js.map +1 -0
  114. package/dist/src/cli/commands/reindex.d.ts +3 -0
  115. package/dist/src/cli/commands/reindex.d.ts.map +1 -0
  116. package/dist/src/cli/commands/reindex.js +66 -0
  117. package/dist/src/cli/commands/reindex.js.map +1 -0
  118. package/dist/src/cli/commands/review.d.ts +13 -0
  119. package/dist/src/cli/commands/review.d.ts.map +1 -0
  120. package/dist/src/cli/commands/review.js +383 -0
  121. package/dist/src/cli/commands/review.js.map +1 -0
  122. package/dist/src/cli/commands/save.d.ts +3 -0
  123. package/dist/src/cli/commands/save.d.ts.map +1 -0
  124. package/dist/src/cli/commands/save.js +111 -0
  125. package/dist/src/cli/commands/save.js.map +1 -0
  126. package/dist/src/cli/commands/search.d.ts +35 -0
  127. package/dist/src/cli/commands/search.d.ts.map +1 -0
  128. package/dist/src/cli/commands/search.js +88 -0
  129. package/dist/src/cli/commands/search.js.map +1 -0
  130. package/dist/src/cli/commands/stats.d.ts +3 -0
  131. package/dist/src/cli/commands/stats.d.ts.map +1 -0
  132. package/dist/src/cli/commands/stats.js +42 -0
  133. package/dist/src/cli/commands/stats.js.map +1 -0
  134. package/dist/src/cli/commands/status.d.ts +15 -0
  135. package/dist/src/cli/commands/status.d.ts.map +1 -0
  136. package/dist/src/cli/commands/status.js +89 -0
  137. package/dist/src/cli/commands/status.js.map +1 -0
  138. package/dist/src/cli/commands/token-issue.d.ts +3 -0
  139. package/dist/src/cli/commands/token-issue.d.ts.map +1 -0
  140. package/dist/src/cli/commands/token-issue.js +25 -0
  141. package/dist/src/cli/commands/token-issue.js.map +1 -0
  142. package/dist/src/cli/commands/triage.d.ts +3 -0
  143. package/dist/src/cli/commands/triage.d.ts.map +1 -0
  144. package/dist/src/cli/commands/triage.js +125 -0
  145. package/dist/src/cli/commands/triage.js.map +1 -0
  146. package/dist/src/cli/commands/uninstall.d.ts +3 -0
  147. package/dist/src/cli/commands/uninstall.d.ts.map +1 -0
  148. package/dist/src/cli/commands/uninstall.js +238 -0
  149. package/dist/src/cli/commands/uninstall.js.map +1 -0
  150. package/dist/src/cli/feedback/feedback-config.d.ts +21 -0
  151. package/dist/src/cli/feedback/feedback-config.d.ts.map +1 -0
  152. package/dist/src/cli/feedback/feedback-config.js +43 -0
  153. package/dist/src/cli/feedback/feedback-config.js.map +1 -0
  154. package/dist/src/cli/feedback/feedback-history.d.ts +4 -0
  155. package/dist/src/cli/feedback/feedback-history.d.ts.map +1 -0
  156. package/dist/src/cli/feedback/feedback-history.js +115 -0
  157. package/dist/src/cli/feedback/feedback-history.js.map +1 -0
  158. package/dist/src/cli/feedback/feedback-payload.d.ts +53 -0
  159. package/dist/src/cli/feedback/feedback-payload.d.ts.map +1 -0
  160. package/dist/src/cli/feedback/feedback-payload.js +10 -0
  161. package/dist/src/cli/feedback/feedback-payload.js.map +1 -0
  162. package/dist/src/cli/feedback/feedback-relay.d.ts +15 -0
  163. package/dist/src/cli/feedback/feedback-relay.d.ts.map +1 -0
  164. package/dist/src/cli/feedback/feedback-relay.js +47 -0
  165. package/dist/src/cli/feedback/feedback-relay.js.map +1 -0
  166. package/dist/src/cli/feedback/feedback-status.d.ts +11 -0
  167. package/dist/src/cli/feedback/feedback-status.d.ts.map +1 -0
  168. package/dist/src/cli/feedback/feedback-status.js +122 -0
  169. package/dist/src/cli/feedback/feedback-status.js.map +1 -0
  170. package/dist/src/cli/hooks-writers/claude-code-policy-script.d.ts +25 -0
  171. package/dist/src/cli/hooks-writers/claude-code-policy-script.d.ts.map +1 -0
  172. package/dist/src/cli/hooks-writers/claude-code-policy-script.js +85 -0
  173. package/dist/src/cli/hooks-writers/claude-code-policy-script.js.map +1 -0
  174. package/dist/src/cli/hooks-writers/claude-code.d.ts +12 -0
  175. package/dist/src/cli/hooks-writers/claude-code.d.ts.map +1 -0
  176. package/dist/src/cli/hooks-writers/claude-code.js +228 -0
  177. package/dist/src/cli/hooks-writers/claude-code.js.map +1 -0
  178. package/dist/src/cli/hooks-writers/errors.d.ts +16 -0
  179. package/dist/src/cli/hooks-writers/errors.d.ts.map +1 -0
  180. package/dist/src/cli/hooks-writers/errors.js +24 -0
  181. package/dist/src/cli/hooks-writers/errors.js.map +1 -0
  182. package/dist/src/cli/hooks-writers/index.d.ts +13 -0
  183. package/dist/src/cli/hooks-writers/index.d.ts.map +1 -0
  184. package/dist/src/cli/hooks-writers/index.js +26 -0
  185. package/dist/src/cli/hooks-writers/index.js.map +1 -0
  186. package/dist/src/cli/hooks-writers/types.d.ts +27 -0
  187. package/dist/src/cli/hooks-writers/types.d.ts.map +1 -0
  188. package/dist/src/cli/hooks-writers/types.js +9 -0
  189. package/dist/src/cli/hooks-writers/types.js.map +1 -0
  190. package/dist/src/cli/http-client.d.ts +36 -0
  191. package/dist/src/cli/http-client.d.ts.map +1 -0
  192. package/dist/src/cli/http-client.js +153 -0
  193. package/dist/src/cli/http-client.js.map +1 -0
  194. package/dist/src/cli/index.d.ts +4 -0
  195. package/dist/src/cli/index.d.ts.map +1 -0
  196. package/dist/src/cli/index.js +68 -0
  197. package/dist/src/cli/index.js.map +1 -0
  198. package/dist/src/cli/job-poller.d.ts +13 -0
  199. package/dist/src/cli/job-poller.d.ts.map +1 -0
  200. package/dist/src/cli/job-poller.js +29 -0
  201. package/dist/src/cli/job-poller.js.map +1 -0
  202. package/dist/src/cli/mcp-config-writers/codex-toml.d.ts +10 -0
  203. package/dist/src/cli/mcp-config-writers/codex-toml.d.ts.map +1 -0
  204. package/dist/src/cli/mcp-config-writers/codex-toml.js +410 -0
  205. package/dist/src/cli/mcp-config-writers/codex-toml.js.map +1 -0
  206. package/dist/src/cli/mcp-config-writers/errors.d.ts +17 -0
  207. package/dist/src/cli/mcp-config-writers/errors.d.ts.map +1 -0
  208. package/dist/src/cli/mcp-config-writers/errors.js +13 -0
  209. package/dist/src/cli/mcp-config-writers/errors.js.map +1 -0
  210. package/dist/src/cli/mcp-config-writers/index.d.ts +18 -0
  211. package/dist/src/cli/mcp-config-writers/index.d.ts.map +1 -0
  212. package/dist/src/cli/mcp-config-writers/index.js +49 -0
  213. package/dist/src/cli/mcp-config-writers/index.js.map +1 -0
  214. package/dist/src/cli/mcp-config-writers/json-config.d.ts +12 -0
  215. package/dist/src/cli/mcp-config-writers/json-config.d.ts.map +1 -0
  216. package/dist/src/cli/mcp-config-writers/json-config.js +177 -0
  217. package/dist/src/cli/mcp-config-writers/json-config.js.map +1 -0
  218. package/dist/src/cli/mcp-config-writers/redact.d.ts +28 -0
  219. package/dist/src/cli/mcp-config-writers/redact.d.ts.map +1 -0
  220. package/dist/src/cli/mcp-config-writers/redact.js +48 -0
  221. package/dist/src/cli/mcp-config-writers/redact.js.map +1 -0
  222. package/dist/src/cli/mcp-config-writers/types.d.ts +32 -0
  223. package/dist/src/cli/mcp-config-writers/types.d.ts.map +1 -0
  224. package/dist/src/cli/mcp-config-writers/types.js +5 -0
  225. package/dist/src/cli/mcp-config-writers/types.js.map +1 -0
  226. package/dist/src/cli/output.d.ts +8 -0
  227. package/dist/src/cli/output.d.ts.map +1 -0
  228. package/dist/src/cli/output.js +34 -0
  229. package/dist/src/cli/output.js.map +1 -0
  230. package/dist/src/cli/status/friend-header.d.ts +33 -0
  231. package/dist/src/cli/status/friend-header.d.ts.map +1 -0
  232. package/dist/src/cli/status/friend-header.js +108 -0
  233. package/dist/src/cli/status/friend-header.js.map +1 -0
  234. package/dist/src/cli/status/local-signals.d.ts +14 -0
  235. package/dist/src/cli/status/local-signals.d.ts.map +1 -0
  236. package/dist/src/cli/status/local-signals.js +73 -0
  237. package/dist/src/cli/status/local-signals.js.map +1 -0
  238. package/dist/src/cli/token.d.ts +37 -0
  239. package/dist/src/cli/token.d.ts.map +1 -0
  240. package/dist/src/cli/token.js +105 -0
  241. package/dist/src/cli/token.js.map +1 -0
  242. package/dist/src/cli/uninstall/mcp-uninstall.d.ts +33 -0
  243. package/dist/src/cli/uninstall/mcp-uninstall.d.ts.map +1 -0
  244. package/dist/src/cli/uninstall/mcp-uninstall.js +181 -0
  245. package/dist/src/cli/uninstall/mcp-uninstall.js.map +1 -0
  246. package/dist/src/config/loader.d.ts +9 -0
  247. package/dist/src/config/loader.d.ts.map +1 -0
  248. package/dist/src/config/loader.js +73 -0
  249. package/dist/src/config/loader.js.map +1 -0
  250. package/dist/src/config/schema.d.ts +635 -0
  251. package/dist/src/config/schema.d.ts.map +1 -0
  252. package/dist/src/config/schema.js +208 -0
  253. package/dist/src/config/schema.js.map +1 -0
  254. package/dist/src/ingestion/bulk-ingest.d.ts +11 -0
  255. package/dist/src/ingestion/bulk-ingest.d.ts.map +1 -0
  256. package/dist/src/ingestion/bulk-ingest.js +11 -0
  257. package/dist/src/ingestion/bulk-ingest.js.map +1 -0
  258. package/dist/src/ingestion/extractor.d.ts +16 -0
  259. package/dist/src/ingestion/extractor.d.ts.map +1 -0
  260. package/dist/src/ingestion/extractor.js +85 -0
  261. package/dist/src/ingestion/extractor.js.map +1 -0
  262. package/dist/src/ingestion/extractors/docx.d.ts +3 -0
  263. package/dist/src/ingestion/extractors/docx.d.ts.map +1 -0
  264. package/dist/src/ingestion/extractors/docx.js +20 -0
  265. package/dist/src/ingestion/extractors/docx.js.map +1 -0
  266. package/dist/src/ingestion/extractors/pdf.d.ts +3 -0
  267. package/dist/src/ingestion/extractors/pdf.d.ts.map +1 -0
  268. package/dist/src/ingestion/extractors/pdf.js +32 -0
  269. package/dist/src/ingestion/extractors/pdf.js.map +1 -0
  270. package/dist/src/ingestion/historical-campaign.d.ts +340 -0
  271. package/dist/src/ingestion/historical-campaign.d.ts.map +1 -0
  272. package/dist/src/ingestion/historical-campaign.js +1010 -0
  273. package/dist/src/ingestion/historical-campaign.js.map +1 -0
  274. package/dist/src/ingestion/ignored-paths.d.ts +20 -0
  275. package/dist/src/ingestion/ignored-paths.d.ts.map +1 -0
  276. package/dist/src/ingestion/ignored-paths.js +45 -0
  277. package/dist/src/ingestion/ignored-paths.js.map +1 -0
  278. package/dist/src/ingestion/inbox-watcher.d.ts +12 -0
  279. package/dist/src/ingestion/inbox-watcher.d.ts.map +1 -0
  280. package/dist/src/ingestion/inbox-watcher.js +99 -0
  281. package/dist/src/ingestion/inbox-watcher.js.map +1 -0
  282. package/dist/src/ingestion/indexer.d.ts +32 -0
  283. package/dist/src/ingestion/indexer.d.ts.map +1 -0
  284. package/dist/src/ingestion/indexer.js +68 -0
  285. package/dist/src/ingestion/indexer.js.map +1 -0
  286. package/dist/src/ingestion/metadata-extraction.d.ts +53 -0
  287. package/dist/src/ingestion/metadata-extraction.d.ts.map +1 -0
  288. package/dist/src/ingestion/metadata-extraction.js +132 -0
  289. package/dist/src/ingestion/metadata-extraction.js.map +1 -0
  290. package/dist/src/ingestion/parsers/chatgpt-web.d.ts +29 -0
  291. package/dist/src/ingestion/parsers/chatgpt-web.d.ts.map +1 -0
  292. package/dist/src/ingestion/parsers/chatgpt-web.js +100 -0
  293. package/dist/src/ingestion/parsers/chatgpt-web.js.map +1 -0
  294. package/dist/src/ingestion/parsers/claude-code-jsonl.d.ts +16 -0
  295. package/dist/src/ingestion/parsers/claude-code-jsonl.d.ts.map +1 -0
  296. package/dist/src/ingestion/parsers/claude-code-jsonl.js +123 -0
  297. package/dist/src/ingestion/parsers/claude-code-jsonl.js.map +1 -0
  298. package/dist/src/ingestion/parsers/claude-web.d.ts +24 -0
  299. package/dist/src/ingestion/parsers/claude-web.d.ts.map +1 -0
  300. package/dist/src/ingestion/parsers/claude-web.js +78 -0
  301. package/dist/src/ingestion/parsers/claude-web.js.map +1 -0
  302. package/dist/src/ingestion/parsers/codex-jsonl.d.ts +18 -0
  303. package/dist/src/ingestion/parsers/codex-jsonl.d.ts.map +1 -0
  304. package/dist/src/ingestion/parsers/codex-jsonl.js +125 -0
  305. package/dist/src/ingestion/parsers/codex-jsonl.js.map +1 -0
  306. package/dist/src/ingestion/parsers/gemini-web.d.ts +16 -0
  307. package/dist/src/ingestion/parsers/gemini-web.d.ts.map +1 -0
  308. package/dist/src/ingestion/parsers/gemini-web.js +170 -0
  309. package/dist/src/ingestion/parsers/gemini-web.js.map +1 -0
  310. package/dist/src/ingestion/parsers/grok-web.d.ts +40 -0
  311. package/dist/src/ingestion/parsers/grok-web.d.ts.map +1 -0
  312. package/dist/src/ingestion/parsers/grok-web.js +67 -0
  313. package/dist/src/ingestion/parsers/grok-web.js.map +1 -0
  314. package/dist/src/ingestion/parsers/types.d.ts +34 -0
  315. package/dist/src/ingestion/parsers/types.d.ts.map +1 -0
  316. package/dist/src/ingestion/parsers/types.js +26 -0
  317. package/dist/src/ingestion/parsers/types.js.map +1 -0
  318. package/dist/src/ingestion/scanner.d.ts +48 -0
  319. package/dist/src/ingestion/scanner.d.ts.map +1 -0
  320. package/dist/src/ingestion/scanner.js +131 -0
  321. package/dist/src/ingestion/scanner.js.map +1 -0
  322. package/dist/src/ingestion/staging.d.ts +109 -0
  323. package/dist/src/ingestion/staging.d.ts.map +1 -0
  324. package/dist/src/ingestion/staging.js +411 -0
  325. package/dist/src/ingestion/staging.js.map +1 -0
  326. package/dist/src/ingestion/watcher.d.ts +65 -0
  327. package/dist/src/ingestion/watcher.d.ts.map +1 -0
  328. package/dist/src/ingestion/watcher.js +182 -0
  329. package/dist/src/ingestion/watcher.js.map +1 -0
  330. package/dist/src/jobs/codex-override-handler.d.ts +3 -0
  331. package/dist/src/jobs/codex-override-handler.d.ts.map +1 -0
  332. package/dist/src/jobs/codex-override-handler.js +16 -0
  333. package/dist/src/jobs/codex-override-handler.js.map +1 -0
  334. package/dist/src/jobs/handlers/compact.d.ts +30 -0
  335. package/dist/src/jobs/handlers/compact.d.ts.map +1 -0
  336. package/dist/src/jobs/handlers/compact.js +329 -0
  337. package/dist/src/jobs/handlers/compact.js.map +1 -0
  338. package/dist/src/jobs/handlers/ingest.d.ts +13 -0
  339. package/dist/src/jobs/handlers/ingest.d.ts.map +1 -0
  340. package/dist/src/jobs/handlers/ingest.js +255 -0
  341. package/dist/src/jobs/handlers/ingest.js.map +1 -0
  342. package/dist/src/jobs/handlers/reconcile.d.ts +29 -0
  343. package/dist/src/jobs/handlers/reconcile.d.ts.map +1 -0
  344. package/dist/src/jobs/handlers/reconcile.js +476 -0
  345. package/dist/src/jobs/handlers/reconcile.js.map +1 -0
  346. package/dist/src/jobs/handlers/reindex.d.ts +38 -0
  347. package/dist/src/jobs/handlers/reindex.d.ts.map +1 -0
  348. package/dist/src/jobs/handlers/reindex.js +52 -0
  349. package/dist/src/jobs/handlers/reindex.js.map +1 -0
  350. package/dist/src/jobs/handlers/save.d.ts +10 -0
  351. package/dist/src/jobs/handlers/save.d.ts.map +1 -0
  352. package/dist/src/jobs/handlers/save.js +206 -0
  353. package/dist/src/jobs/handlers/save.js.map +1 -0
  354. package/dist/src/jobs/handlers/triage.d.ts +47 -0
  355. package/dist/src/jobs/handlers/triage.d.ts.map +1 -0
  356. package/dist/src/jobs/handlers/triage.js +95 -0
  357. package/dist/src/jobs/handlers/triage.js.map +1 -0
  358. package/dist/src/jobs/queue.d.ts +107 -0
  359. package/dist/src/jobs/queue.d.ts.map +1 -0
  360. package/dist/src/jobs/queue.js +319 -0
  361. package/dist/src/jobs/queue.js.map +1 -0
  362. package/dist/src/jobs/types.d.ts +39 -0
  363. package/dist/src/jobs/types.d.ts.map +1 -0
  364. package/dist/src/jobs/types.js +29 -0
  365. package/dist/src/jobs/types.js.map +1 -0
  366. package/dist/src/jobs/worker-entry.d.ts +10 -0
  367. package/dist/src/jobs/worker-entry.d.ts.map +1 -0
  368. package/dist/src/jobs/worker-entry.js +210 -0
  369. package/dist/src/jobs/worker-entry.js.map +1 -0
  370. package/dist/src/jobs/worker-process.d.ts +50 -0
  371. package/dist/src/jobs/worker-process.d.ts.map +1 -0
  372. package/dist/src/jobs/worker-process.js +186 -0
  373. package/dist/src/jobs/worker-process.js.map +1 -0
  374. package/dist/src/jobs/worker.d.ts +11 -0
  375. package/dist/src/jobs/worker.d.ts.map +1 -0
  376. package/dist/src/jobs/worker.js +14 -0
  377. package/dist/src/jobs/worker.js.map +1 -0
  378. package/dist/src/main.d.ts +2 -0
  379. package/dist/src/main.d.ts.map +1 -0
  380. package/dist/src/main.js +425 -0
  381. package/dist/src/main.js.map +1 -0
  382. package/dist/src/mcp/errors.d.ts +8 -0
  383. package/dist/src/mcp/errors.d.ts.map +1 -0
  384. package/dist/src/mcp/errors.js +50 -0
  385. package/dist/src/mcp/errors.js.map +1 -0
  386. package/dist/src/mcp/server.d.ts +10 -0
  387. package/dist/src/mcp/server.d.ts.map +1 -0
  388. package/dist/src/mcp/server.js +94 -0
  389. package/dist/src/mcp/server.js.map +1 -0
  390. package/dist/src/mcp/tools/context-pack.d.ts +35 -0
  391. package/dist/src/mcp/tools/context-pack.d.ts.map +1 -0
  392. package/dist/src/mcp/tools/context-pack.js +97 -0
  393. package/dist/src/mcp/tools/context-pack.js.map +1 -0
  394. package/dist/src/mcp/tools/conversations-search.d.ts +38 -0
  395. package/dist/src/mcp/tools/conversations-search.d.ts.map +1 -0
  396. package/dist/src/mcp/tools/conversations-search.js +73 -0
  397. package/dist/src/mcp/tools/conversations-search.js.map +1 -0
  398. package/dist/src/mcp/tools/save.d.ts +32 -0
  399. package/dist/src/mcp/tools/save.d.ts.map +1 -0
  400. package/dist/src/mcp/tools/save.js +60 -0
  401. package/dist/src/mcp/tools/save.js.map +1 -0
  402. package/dist/src/mcp/tools/search.d.ts +33 -0
  403. package/dist/src/mcp/tools/search.d.ts.map +1 -0
  404. package/dist/src/mcp/tools/search.js +58 -0
  405. package/dist/src/mcp/tools/search.js.map +1 -0
  406. package/dist/src/mcp/tools/status.d.ts +17 -0
  407. package/dist/src/mcp/tools/status.d.ts.map +1 -0
  408. package/dist/src/mcp/tools/status.js +12 -0
  409. package/dist/src/mcp/tools/status.js.map +1 -0
  410. package/dist/src/observability/coverage.d.ts +100 -0
  411. package/dist/src/observability/coverage.d.ts.map +1 -0
  412. package/dist/src/observability/coverage.js +180 -0
  413. package/dist/src/observability/coverage.js.map +1 -0
  414. package/dist/src/observability/rift-context.d.ts +47 -0
  415. package/dist/src/observability/rift-context.d.ts.map +1 -0
  416. package/dist/src/observability/rift-context.js +118 -0
  417. package/dist/src/observability/rift-context.js.map +1 -0
  418. package/dist/src/observability/staleness.d.ts +43 -0
  419. package/dist/src/observability/staleness.d.ts.map +1 -0
  420. package/dist/src/observability/staleness.js +74 -0
  421. package/dist/src/observability/staleness.js.map +1 -0
  422. package/dist/src/observability/tool-usage-stats.d.ts +23 -0
  423. package/dist/src/observability/tool-usage-stats.d.ts.map +1 -0
  424. package/dist/src/observability/tool-usage-stats.js +83 -0
  425. package/dist/src/observability/tool-usage-stats.js.map +1 -0
  426. package/dist/src/observability/tool-usage.d.ts +68 -0
  427. package/dist/src/observability/tool-usage.d.ts.map +1 -0
  428. package/dist/src/observability/tool-usage.js +207 -0
  429. package/dist/src/observability/tool-usage.js.map +1 -0
  430. package/dist/src/onboarding/daemon-control.d.ts +33 -0
  431. package/dist/src/onboarding/daemon-control.d.ts.map +1 -0
  432. package/dist/src/onboarding/daemon-control.js +92 -0
  433. package/dist/src/onboarding/daemon-control.js.map +1 -0
  434. package/dist/src/onboarding/env-file.d.ts +18 -0
  435. package/dist/src/onboarding/env-file.d.ts.map +1 -0
  436. package/dist/src/onboarding/env-file.js +89 -0
  437. package/dist/src/onboarding/env-file.js.map +1 -0
  438. package/dist/src/onboarding/voyage-validate.d.ts +16 -0
  439. package/dist/src/onboarding/voyage-validate.d.ts.map +1 -0
  440. package/dist/src/onboarding/voyage-validate.js +85 -0
  441. package/dist/src/onboarding/voyage-validate.js.map +1 -0
  442. package/dist/src/providers/anthropic-digest.d.ts +23 -0
  443. package/dist/src/providers/anthropic-digest.d.ts.map +1 -0
  444. package/dist/src/providers/anthropic-digest.js +91 -0
  445. package/dist/src/providers/anthropic-digest.js.map +1 -0
  446. package/dist/src/providers/codex-cli-digest.d.ts +12 -0
  447. package/dist/src/providers/codex-cli-digest.d.ts.map +1 -0
  448. package/dist/src/providers/codex-cli-digest.js +70 -0
  449. package/dist/src/providers/codex-cli-digest.js.map +1 -0
  450. package/dist/src/providers/codex-cli-metadata-extraction.d.ts +14 -0
  451. package/dist/src/providers/codex-cli-metadata-extraction.d.ts.map +1 -0
  452. package/dist/src/providers/codex-cli-metadata-extraction.js +101 -0
  453. package/dist/src/providers/codex-cli-metadata-extraction.js.map +1 -0
  454. package/dist/src/providers/codex-cli-runner.d.ts +14 -0
  455. package/dist/src/providers/codex-cli-runner.d.ts.map +1 -0
  456. package/dist/src/providers/codex-cli-runner.js +272 -0
  457. package/dist/src/providers/codex-cli-runner.js.map +1 -0
  458. package/dist/src/providers/conversation-generation.d.ts +10 -0
  459. package/dist/src/providers/conversation-generation.d.ts.map +1 -0
  460. package/dist/src/providers/conversation-generation.js +54 -0
  461. package/dist/src/providers/conversation-generation.js.map +1 -0
  462. package/dist/src/providers/ollama-embed.d.ts +22 -0
  463. package/dist/src/providers/ollama-embed.d.ts.map +1 -0
  464. package/dist/src/providers/ollama-embed.js +133 -0
  465. package/dist/src/providers/ollama-embed.js.map +1 -0
  466. package/dist/src/providers/ollama.d.ts +42 -0
  467. package/dist/src/providers/ollama.d.ts.map +1 -0
  468. package/dist/src/providers/ollama.js +169 -0
  469. package/dist/src/providers/ollama.js.map +1 -0
  470. package/dist/src/providers/openai-metadata-extraction.d.ts +73 -0
  471. package/dist/src/providers/openai-metadata-extraction.d.ts.map +1 -0
  472. package/dist/src/providers/openai-metadata-extraction.js +161 -0
  473. package/dist/src/providers/openai-metadata-extraction.js.map +1 -0
  474. package/dist/src/providers/operator-overrides.d.ts +24 -0
  475. package/dist/src/providers/operator-overrides.d.ts.map +1 -0
  476. package/dist/src/providers/operator-overrides.js +84 -0
  477. package/dist/src/providers/operator-overrides.js.map +1 -0
  478. package/dist/src/providers/stub.d.ts +17 -0
  479. package/dist/src/providers/stub.d.ts.map +1 -0
  480. package/dist/src/providers/stub.js +72 -0
  481. package/dist/src/providers/stub.js.map +1 -0
  482. package/dist/src/providers/types.d.ts +82 -0
  483. package/dist/src/providers/types.d.ts.map +1 -0
  484. package/dist/src/providers/types.js +52 -0
  485. package/dist/src/providers/types.js.map +1 -0
  486. package/dist/src/providers/voyage.d.ts +23 -0
  487. package/dist/src/providers/voyage.d.ts.map +1 -0
  488. package/dist/src/providers/voyage.js +135 -0
  489. package/dist/src/providers/voyage.js.map +1 -0
  490. package/dist/src/retrieval/compact.d.ts +89 -0
  491. package/dist/src/retrieval/compact.d.ts.map +1 -0
  492. package/dist/src/retrieval/compact.js +348 -0
  493. package/dist/src/retrieval/compact.js.map +1 -0
  494. package/dist/src/retrieval/context-pack.d.ts +123 -0
  495. package/dist/src/retrieval/context-pack.d.ts.map +1 -0
  496. package/dist/src/retrieval/context-pack.js +553 -0
  497. package/dist/src/retrieval/context-pack.js.map +1 -0
  498. package/dist/src/retrieval/cwd.d.ts +25 -0
  499. package/dist/src/retrieval/cwd.d.ts.map +1 -0
  500. package/dist/src/retrieval/cwd.js +48 -0
  501. package/dist/src/retrieval/cwd.js.map +1 -0
  502. package/dist/src/retrieval/degraded.d.ts +20 -0
  503. package/dist/src/retrieval/degraded.d.ts.map +1 -0
  504. package/dist/src/retrieval/degraded.js +43 -0
  505. package/dist/src/retrieval/degraded.js.map +1 -0
  506. package/dist/src/retrieval/hybrid.d.ts +38 -0
  507. package/dist/src/retrieval/hybrid.d.ts.map +1 -0
  508. package/dist/src/retrieval/hybrid.js +82 -0
  509. package/dist/src/retrieval/hybrid.js.map +1 -0
  510. package/dist/src/retrieval/lexical.d.ts +28 -0
  511. package/dist/src/retrieval/lexical.d.ts.map +1 -0
  512. package/dist/src/retrieval/lexical.js +301 -0
  513. package/dist/src/retrieval/lexical.js.map +1 -0
  514. package/dist/src/retrieval/post-filter.d.ts +32 -0
  515. package/dist/src/retrieval/post-filter.d.ts.map +1 -0
  516. package/dist/src/retrieval/post-filter.js +57 -0
  517. package/dist/src/retrieval/post-filter.js.map +1 -0
  518. package/dist/src/retrieval/reranker.d.ts +72 -0
  519. package/dist/src/retrieval/reranker.d.ts.map +1 -0
  520. package/dist/src/retrieval/reranker.js +129 -0
  521. package/dist/src/retrieval/reranker.js.map +1 -0
  522. package/dist/src/retrieval/vector.d.ts +47 -0
  523. package/dist/src/retrieval/vector.d.ts.map +1 -0
  524. package/dist/src/retrieval/vector.js +112 -0
  525. package/dist/src/retrieval/vector.js.map +1 -0
  526. package/dist/src/runtime/legacy-migration.d.ts +27 -0
  527. package/dist/src/runtime/legacy-migration.d.ts.map +1 -0
  528. package/dist/src/runtime/legacy-migration.js +140 -0
  529. package/dist/src/runtime/legacy-migration.js.map +1 -0
  530. package/dist/src/runtime/legacy-name-guard.d.ts +35 -0
  531. package/dist/src/runtime/legacy-name-guard.d.ts.map +1 -0
  532. package/dist/src/runtime/legacy-name-guard.js +58 -0
  533. package/dist/src/runtime/legacy-name-guard.js.map +1 -0
  534. package/dist/src/runtime/rift-env.d.ts +14 -0
  535. package/dist/src/runtime/rift-env.d.ts.map +1 -0
  536. package/dist/src/runtime/rift-env.js +79 -0
  537. package/dist/src/runtime/rift-env.js.map +1 -0
  538. package/dist/src/runtime/watcher-startup.d.ts +2 -0
  539. package/dist/src/runtime/watcher-startup.d.ts.map +1 -0
  540. package/dist/src/runtime/watcher-startup.js +4 -0
  541. package/dist/src/runtime/watcher-startup.js.map +1 -0
  542. package/dist/src/security/archive.d.ts +23 -0
  543. package/dist/src/security/archive.d.ts.map +1 -0
  544. package/dist/src/security/archive.js +163 -0
  545. package/dist/src/security/archive.js.map +1 -0
  546. package/dist/src/security/paths.d.ts +21 -0
  547. package/dist/src/security/paths.d.ts.map +1 -0
  548. package/dist/src/security/paths.js +67 -0
  549. package/dist/src/security/paths.js.map +1 -0
  550. package/dist/src/server/app.d.ts +29 -0
  551. package/dist/src/server/app.d.ts.map +1 -0
  552. package/dist/src/server/app.js +226 -0
  553. package/dist/src/server/app.js.map +1 -0
  554. package/dist/src/server/build-info.d.ts +8 -0
  555. package/dist/src/server/build-info.d.ts.map +1 -0
  556. package/dist/src/server/build-info.js +61 -0
  557. package/dist/src/server/build-info.js.map +1 -0
  558. package/dist/src/server/lifecycle.d.ts +30 -0
  559. package/dist/src/server/lifecycle.d.ts.map +1 -0
  560. package/dist/src/server/lifecycle.js +59 -0
  561. package/dist/src/server/lifecycle.js.map +1 -0
  562. package/dist/src/server/middleware/multipart.d.ts +51 -0
  563. package/dist/src/server/middleware/multipart.d.ts.map +1 -0
  564. package/dist/src/server/middleware/multipart.js +86 -0
  565. package/dist/src/server/middleware/multipart.js.map +1 -0
  566. package/dist/src/server/routes/compact.d.ts +37 -0
  567. package/dist/src/server/routes/compact.d.ts.map +1 -0
  568. package/dist/src/server/routes/compact.js +77 -0
  569. package/dist/src/server/routes/compact.js.map +1 -0
  570. package/dist/src/server/routes/context.d.ts +5 -0
  571. package/dist/src/server/routes/context.d.ts.map +1 -0
  572. package/dist/src/server/routes/context.js +50 -0
  573. package/dist/src/server/routes/context.js.map +1 -0
  574. package/dist/src/server/routes/conversations-search.d.ts +4 -0
  575. package/dist/src/server/routes/conversations-search.d.ts.map +1 -0
  576. package/dist/src/server/routes/conversations-search.js +243 -0
  577. package/dist/src/server/routes/conversations-search.js.map +1 -0
  578. package/dist/src/server/routes/friend-status.d.ts +72 -0
  579. package/dist/src/server/routes/friend-status.d.ts.map +1 -0
  580. package/dist/src/server/routes/friend-status.js +71 -0
  581. package/dist/src/server/routes/friend-status.js.map +1 -0
  582. package/dist/src/server/routes/ingest.d.ts +15 -0
  583. package/dist/src/server/routes/ingest.d.ts.map +1 -0
  584. package/dist/src/server/routes/ingest.js +139 -0
  585. package/dist/src/server/routes/ingest.js.map +1 -0
  586. package/dist/src/server/routes/jobs.d.ts +10 -0
  587. package/dist/src/server/routes/jobs.d.ts.map +1 -0
  588. package/dist/src/server/routes/jobs.js +29 -0
  589. package/dist/src/server/routes/jobs.js.map +1 -0
  590. package/dist/src/server/routes/mcp-usage.d.ts +13 -0
  591. package/dist/src/server/routes/mcp-usage.d.ts.map +1 -0
  592. package/dist/src/server/routes/mcp-usage.js +17 -0
  593. package/dist/src/server/routes/mcp-usage.js.map +1 -0
  594. package/dist/src/server/routes/reconcile.d.ts +4 -0
  595. package/dist/src/server/routes/reconcile.d.ts.map +1 -0
  596. package/dist/src/server/routes/reconcile.js +43 -0
  597. package/dist/src/server/routes/reconcile.js.map +1 -0
  598. package/dist/src/server/routes/reindex.d.ts +4 -0
  599. package/dist/src/server/routes/reindex.d.ts.map +1 -0
  600. package/dist/src/server/routes/reindex.js +74 -0
  601. package/dist/src/server/routes/reindex.js.map +1 -0
  602. package/dist/src/server/routes/save.d.ts +40 -0
  603. package/dist/src/server/routes/save.d.ts.map +1 -0
  604. package/dist/src/server/routes/save.js +112 -0
  605. package/dist/src/server/routes/save.js.map +1 -0
  606. package/dist/src/server/routes/search.d.ts +5 -0
  607. package/dist/src/server/routes/search.d.ts.map +1 -0
  608. package/dist/src/server/routes/search.js +400 -0
  609. package/dist/src/server/routes/search.js.map +1 -0
  610. package/dist/src/server/routes/stats.d.ts +10 -0
  611. package/dist/src/server/routes/stats.d.ts.map +1 -0
  612. package/dist/src/server/routes/stats.js +15 -0
  613. package/dist/src/server/routes/stats.js.map +1 -0
  614. package/dist/src/server/routes/status.d.ts +20 -0
  615. package/dist/src/server/routes/status.d.ts.map +1 -0
  616. package/dist/src/server/routes/status.js +31 -0
  617. package/dist/src/server/routes/status.js.map +1 -0
  618. package/dist/src/server/routes/triage.d.ts +4 -0
  619. package/dist/src/server/routes/triage.d.ts.map +1 -0
  620. package/dist/src/server/routes/triage.js +94 -0
  621. package/dist/src/server/routes/triage.js.map +1 -0
  622. package/dist/src/server/save-quality.d.ts +21 -0
  623. package/dist/src/server/save-quality.d.ts.map +1 -0
  624. package/dist/src/server/save-quality.js +51 -0
  625. package/dist/src/server/save-quality.js.map +1 -0
  626. package/dist/src/storage/atomic.d.ts +8 -0
  627. package/dist/src/storage/atomic.d.ts.map +1 -0
  628. package/dist/src/storage/atomic.js +22 -0
  629. package/dist/src/storage/atomic.js.map +1 -0
  630. package/dist/src/storage/db.d.ts +15 -0
  631. package/dist/src/storage/db.d.ts.map +1 -0
  632. package/dist/src/storage/db.js +43 -0
  633. package/dist/src/storage/db.js.map +1 -0
  634. package/dist/src/storage/integrity.d.ts +11 -0
  635. package/dist/src/storage/integrity.d.ts.map +1 -0
  636. package/dist/src/storage/integrity.js +66 -0
  637. package/dist/src/storage/integrity.js.map +1 -0
  638. package/dist/src/storage/rebuild.d.ts +37 -0
  639. package/dist/src/storage/rebuild.d.ts.map +1 -0
  640. package/dist/src/storage/rebuild.js +353 -0
  641. package/dist/src/storage/rebuild.js.map +1 -0
  642. package/dist/src/storage/shadow-swap.d.ts +20 -0
  643. package/dist/src/storage/shadow-swap.d.ts.map +1 -0
  644. package/dist/src/storage/shadow-swap.js +163 -0
  645. package/dist/src/storage/shadow-swap.js.map +1 -0
  646. package/dist/src/storage/tables.d.ts +77 -0
  647. package/dist/src/storage/tables.d.ts.map +1 -0
  648. package/dist/src/storage/tables.js +196 -0
  649. package/dist/src/storage/tables.js.map +1 -0
  650. package/package.json +45 -14
  651. package/index.js +0 -3
@@ -0,0 +1,140 @@
1
+ /**
2
+ * Hidden legacy migration. Runs once-per-boot, idempotent on re-run.
3
+ *
4
+ * Carries pre-rename state forward without ever surfacing the legacy
5
+ * names to a friend. Three steps live here (the ones safe to run on
6
+ * every daemon boot):
7
+ *
8
+ * 1. Env file: ~/.life-brain.env → ~/.rift.env (mode 0600)
9
+ * 2. Token file: ~/.life-brain/token → ~/.rift/token (mode 0600)
10
+ * 3. Capability map: data/life-context.md → data/rift-context.md
11
+ *
12
+ * Plist takeover (Slice 2 / install.sh) and MCP-client config takeover
13
+ * (Slice 5 / `rift mcp install`) are NOT run from the daemon — they
14
+ * belong to their own slices because they require root-relative paths
15
+ * and client-config awareness that the daemon process does not have.
16
+ *
17
+ * Output contract:
18
+ * - **Friend-visible stderr:** Rift-only wording. Single line per
19
+ * migrated artifact (`Found a legacy env file — migrated to
20
+ * ~/.rift.env.`). Never names the legacy path. Backups referenced
21
+ * by opaque ID only (`Backup ID: rift-migration-<iso>-<n>`).
22
+ * - **Operator-only JSONL:** every migration step appends one row to
23
+ * `data/observability/legacy-migration.jsonl` with the actual legacy
24
+ * path, the new path, and the opaque backup ID. This artifact is
25
+ * not surfaced through any CLI/HTTP/MCP path; it exists for Clem to
26
+ * inspect operator-side if a friend pings for recovery.
27
+ *
28
+ * Idempotency:
29
+ * - Each step's precondition is "the new file does not yet exist".
30
+ * - On second run, all three steps no-op and emit no JSONL rows.
31
+ */
32
+ import fs from "node:fs";
33
+ import os from "node:os";
34
+ import path from "node:path";
35
+ const RIFT_ENV_BASENAME = ".rift.env";
36
+ const LEGACY_ENV_BASENAME = ".life-brain.env";
37
+ const RIFT_TOKEN_DIR = ".rift";
38
+ const LEGACY_TOKEN_DIR = ".life-brain";
39
+ const TOKEN_FILE = "token";
40
+ const RIFT_CONTEXT_BASENAME = "rift-context.md";
41
+ const LEGACY_CONTEXT_BASENAME = "life-context.md";
42
+ const JSONL_RELATIVE = path.join("observability", "legacy-migration.jsonl");
43
+ export async function runLegacyMigration(opts) {
44
+ const homeDir = opts.homeDir ?? os.homedir();
45
+ const now = (opts.now ?? (() => new Date()))();
46
+ const stderr = opts.stderr ?? process.stderr;
47
+ const ts = now.toISOString();
48
+ // ISO timestamp with colons replaced for filesystem-safety inside backup IDs.
49
+ const tsToken = ts.replace(/[:.]/g, "-");
50
+ let backupCounter = 0;
51
+ const steps = [];
52
+ const jsonlPath = path.join(opts.dataDir, JSONL_RELATIVE);
53
+ function appendJsonl(row) {
54
+ fs.mkdirSync(path.dirname(jsonlPath), { recursive: true });
55
+ fs.appendFileSync(jsonlPath, JSON.stringify(row) + "\n", {
56
+ encoding: "utf-8",
57
+ mode: 0o600,
58
+ });
59
+ }
60
+ // --- 1. Env file ---
61
+ {
62
+ const newPath = path.join(homeDir, RIFT_ENV_BASENAME);
63
+ const legacyPath = path.join(homeDir, LEGACY_ENV_BASENAME);
64
+ if (!fs.existsSync(newPath) && fs.existsSync(legacyPath)) {
65
+ backupCounter += 1;
66
+ const backupId = `rift-migration-${tsToken}-${backupCounter}`;
67
+ copyFileSecure(legacyPath, newPath, 0o600);
68
+ stderr.write(`Found a legacy env file — migrated to ~/${RIFT_ENV_BASENAME}. (Backup ID: ${backupId}.)\n`);
69
+ appendJsonl({
70
+ ts,
71
+ kind: "env_file",
72
+ legacy_path: legacyPath,
73
+ new_path: newPath,
74
+ backup_id: backupId,
75
+ });
76
+ steps.push({ kind: "env_file", migrated: true, backupId });
77
+ }
78
+ else {
79
+ steps.push({ kind: "env_file", migrated: false });
80
+ }
81
+ }
82
+ // --- 2. Token file ---
83
+ {
84
+ const newPath = path.join(homeDir, RIFT_TOKEN_DIR, TOKEN_FILE);
85
+ const legacyPath = path.join(homeDir, LEGACY_TOKEN_DIR, TOKEN_FILE);
86
+ if (!fs.existsSync(newPath) && fs.existsSync(legacyPath)) {
87
+ backupCounter += 1;
88
+ const backupId = `rift-migration-${tsToken}-${backupCounter}`;
89
+ copyFileSecure(legacyPath, newPath, 0o600);
90
+ stderr.write(`Found a legacy token file — migrated to ~/${RIFT_TOKEN_DIR}/${TOKEN_FILE}. (Backup ID: ${backupId}.)\n`);
91
+ appendJsonl({
92
+ ts,
93
+ kind: "token_file",
94
+ legacy_path: legacyPath,
95
+ new_path: newPath,
96
+ backup_id: backupId,
97
+ });
98
+ steps.push({ kind: "token_file", migrated: true, backupId });
99
+ }
100
+ else {
101
+ steps.push({ kind: "token_file", migrated: false });
102
+ }
103
+ }
104
+ // --- 3. Capability map ---
105
+ {
106
+ const newPath = path.join(opts.dataDir, RIFT_CONTEXT_BASENAME);
107
+ const legacyPath = path.join(opts.dataDir, LEGACY_CONTEXT_BASENAME);
108
+ if (!fs.existsSync(newPath) && fs.existsSync(legacyPath)) {
109
+ backupCounter += 1;
110
+ const backupId = `rift-migration-${tsToken}-${backupCounter}`;
111
+ // Rename in place — we do not keep the legacy basename around.
112
+ fs.renameSync(legacyPath, newPath);
113
+ stderr.write(`Migrated legacy capability map to data/${RIFT_CONTEXT_BASENAME}. (Backup ID: ${backupId}.)\n`);
114
+ appendJsonl({
115
+ ts,
116
+ kind: "capability_map",
117
+ legacy_path: legacyPath,
118
+ new_path: newPath,
119
+ backup_id: backupId,
120
+ });
121
+ steps.push({ kind: "capability_map", migrated: true, backupId });
122
+ }
123
+ else {
124
+ steps.push({ kind: "capability_map", migrated: false });
125
+ }
126
+ }
127
+ const migratedCount = steps.filter((s) => s.migrated).length;
128
+ return { steps, migratedCount };
129
+ }
130
+ function copyFileSecure(src, dst, mode) {
131
+ const dir = path.dirname(dst);
132
+ fs.mkdirSync(dir, { recursive: true });
133
+ const tmp = `${dst}.tmp.${process.pid}`;
134
+ const data = fs.readFileSync(src);
135
+ fs.writeFileSync(tmp, data, { mode });
136
+ // chmod again — writeFileSync mode is masked by umask on some systems.
137
+ fs.chmodSync(tmp, mode);
138
+ fs.renameSync(tmp, dst);
139
+ }
140
+ //# sourceMappingURL=legacy-migration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-migration.js","sourceRoot":"","sources":["../../../src/runtime/legacy-migration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Defensive validators for operator-supplied display strings that flow into
3
+ * friend-visible surfaces. The forbidden-name gate (`pnpm check:rename`)
4
+ * holds the static codebase free of legacy product names; this module
5
+ * enforces the same contract at runtime against config values that may have
6
+ * been hand-edited, copy-pasted, or shipped from an older version.
7
+ *
8
+ * Allowlisted at file level — every reference here exists *only* to defend
9
+ * against legacy strings landing in the friend's terminal.
10
+ */
11
+ /**
12
+ * Validator for `voyage.project_label` — the only operator-supplied string
13
+ * embedded in /status/friend. Anything that violates the contract is dropped
14
+ * to `null` rather than echoed back: the friend never sees a label
15
+ * containing a path, a key-like token, or a forbidden legacy name.
16
+ *
17
+ * Rules:
18
+ * - must be a non-empty trimmed string, at most 32 chars
19
+ * - charset is `[A-Za-z0-9_-]` only (blocks `/`, `~`, spaces, dots, quotes)
20
+ * - rejects any forbidden-name substring (life-brain / lifebrain /
21
+ * second-brain / `life_*`)
22
+ * - rejects known secret prefixes (Voyage `pa-`, OpenAI `sk-`, Stripe
23
+ * `pk-`/`rk-`, GitHub `ghp_`/`gho_`/`ghs_`/`ghu_`/`ghr_`, Slack `xox?-`,
24
+ * bearer-/token- shaped tokens) — matched at the start regardless of
25
+ * casing or hyphen-vs-underscore
26
+ * - rejects a label whose longest alphanumeric chunk (between `-`/`_`
27
+ * separators) is ≥20 chars; catches segmented keys like
28
+ * `pa-AbCd…22chars…` after the prefix gate, and uninterrupted opaque
29
+ * runs in one shot
30
+ *
31
+ * Plan §Slice 0 expects shapes like `rift-beta-<handle>`; this sanitizer
32
+ * permits exactly that and rejects everything else.
33
+ */
34
+ export declare function sanitizeProjectLabel(raw: unknown): string | null;
35
+ //# sourceMappingURL=legacy-name-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-name-guard.d.ts","sourceRoot":"","sources":["../../../src/runtime/legacy-name-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAWhE"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Defensive validators for operator-supplied display strings that flow into
3
+ * friend-visible surfaces. The forbidden-name gate (`pnpm check:rename`)
4
+ * holds the static codebase free of legacy product names; this module
5
+ * enforces the same contract at runtime against config values that may have
6
+ * been hand-edited, copy-pasted, or shipped from an older version.
7
+ *
8
+ * Allowlisted at file level — every reference here exists *only* to defend
9
+ * against legacy strings landing in the friend's terminal.
10
+ */
11
+ /**
12
+ * Validator for `voyage.project_label` — the only operator-supplied string
13
+ * embedded in /status/friend. Anything that violates the contract is dropped
14
+ * to `null` rather than echoed back: the friend never sees a label
15
+ * containing a path, a key-like token, or a forbidden legacy name.
16
+ *
17
+ * Rules:
18
+ * - must be a non-empty trimmed string, at most 32 chars
19
+ * - charset is `[A-Za-z0-9_-]` only (blocks `/`, `~`, spaces, dots, quotes)
20
+ * - rejects any forbidden-name substring (life-brain / lifebrain /
21
+ * second-brain / `life_*`)
22
+ * - rejects known secret prefixes (Voyage `pa-`, OpenAI `sk-`, Stripe
23
+ * `pk-`/`rk-`, GitHub `ghp_`/`gho_`/`ghs_`/`ghu_`/`ghr_`, Slack `xox?-`,
24
+ * bearer-/token- shaped tokens) — matched at the start regardless of
25
+ * casing or hyphen-vs-underscore
26
+ * - rejects a label whose longest alphanumeric chunk (between `-`/`_`
27
+ * separators) is ≥20 chars; catches segmented keys like
28
+ * `pa-AbCd…22chars…` after the prefix gate, and uninterrupted opaque
29
+ * runs in one shot
30
+ *
31
+ * Plan §Slice 0 expects shapes like `rift-beta-<handle>`; this sanitizer
32
+ * permits exactly that and rejects everything else.
33
+ */
34
+ export function sanitizeProjectLabel(raw) {
35
+ if (typeof raw !== "string")
36
+ return null;
37
+ const trimmed = raw.trim();
38
+ if (trimmed.length === 0 || trimmed.length > 32)
39
+ return null;
40
+ if (!/^[A-Za-z0-9_-]+$/.test(trimmed))
41
+ return null;
42
+ if (LEGACY_NAME_RE.test(trimmed))
43
+ return null;
44
+ if (SECRET_PREFIX_RE.test(trimmed))
45
+ return null;
46
+ for (const chunk of trimmed.split(/[-_]/)) {
47
+ if (chunk.length >= 20)
48
+ return null;
49
+ }
50
+ return trimmed;
51
+ }
52
+ const LEGACY_NAME_RE = /life-brain|lifebrain|second-brain|\blife_[a-z0-9_]+\b/i;
53
+ // Anchored at start; matches both `pa-` and `pa_` shapes case-insensitively.
54
+ // Covers Voyage (`pa-`/`pat-`), OpenAI (`sk-`), Stripe (`pk-`/`rk-`), GitHub
55
+ // (`ghp_`/`gho_`/`ghs_`/`ghu_`/`ghr_`), Slack (`xoxb-`/`xoxp-`/`xoxa-`/`xoxs-`),
56
+ // and generic bearer/token-prefixed pastes.
57
+ const SECRET_PREFIX_RE = /^(pat?|sk|pk|rk|gh[posur]|xox[abps]|bearer|token)[-_]/i;
58
+ //# sourceMappingURL=legacy-name-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-name-guard.js","sourceRoot":"","sources":["../../../src/runtime/legacy-name-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAY;IAC/C,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzC,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,EAAE;QAAE,OAAO,IAAI,CAAC;IAC7D,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACnD,IAAI,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAC9C,IAAI,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IAChD,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1C,IAAI,KAAK,CAAC,MAAM,IAAI,EAAE;YAAE,OAAO,IAAI,CAAC;IACtC,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,cAAc,GAAG,wDAAwD,CAAC;AAEhF,6EAA6E;AAC7E,6EAA6E;AAC7E,iFAAiF;AACjF,4CAA4C;AAC5C,MAAM,gBAAgB,GACpB,wDAAwD,CAAC"}
@@ -0,0 +1,14 @@
1
+ export interface LoadRiftEnvOptions {
2
+ env?: NodeJS.ProcessEnv;
3
+ filePath?: string;
4
+ overrideExisting?: boolean;
5
+ allowedKeys?: readonly string[];
6
+ }
7
+ export interface LoadRiftEnvResult {
8
+ filePath: string;
9
+ loadedKeys: string[];
10
+ existed: boolean;
11
+ }
12
+ export declare function defaultRiftEnvPath(homeDir?: string): string;
13
+ export declare function loadRiftEnv(opts?: LoadRiftEnvOptions): LoadRiftEnvResult;
14
+ //# sourceMappingURL=rift-env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rift-env.d.ts","sourceRoot":"","sources":["../../../src/runtime/rift-env.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,kBAAkB;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,kBAAkB,CAAC,OAAO,SAAe,GAAG,MAAM,CAEjE;AASD,wBAAgB,WAAW,CACzB,IAAI,GAAE,kBAAuB,GAC5B,iBAAiB,CAuBnB"}
@@ -0,0 +1,79 @@
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ const DEFAULT_KEYS = [
5
+ "VOYAGE_API_KEY",
6
+ "ANTHROPIC_API_KEY",
7
+ "HUBSPOT_ACCESS_TOKEN",
8
+ ];
9
+ export function defaultRiftEnvPath(homeDir = os.homedir()) {
10
+ return path.join(homeDir, ".rift.env");
11
+ }
12
+ // Legacy fallback path. Read silently when ~/.rift.env is absent so a
13
+ // machine carrying state from before the rename keeps working until
14
+ // Slice 1.5 migrates the file. Not for friend use; not documented.
15
+ function legacyEnvPath(homeDir = os.homedir()) {
16
+ return path.join(homeDir, ".life-brain.env");
17
+ }
18
+ export function loadRiftEnv(opts = {}) {
19
+ const env = opts.env ?? process.env;
20
+ const filePath = opts.filePath ?? resolveDefaultPath();
21
+ const overrideExisting = opts.overrideExisting ?? true;
22
+ const allowedKeys = new Set(opts.allowedKeys ?? DEFAULT_KEYS);
23
+ if (!fs.existsSync(filePath)) {
24
+ return { filePath, loadedKeys: [], existed: false };
25
+ }
26
+ const loadedKeys = [];
27
+ const raw = fs.readFileSync(filePath, "utf8");
28
+ for (const entry of parseEnvFile(raw)) {
29
+ if (!allowedKeys.has(entry.key))
30
+ continue;
31
+ const current = env[entry.key];
32
+ if (!overrideExisting && typeof current === "string" && current.length > 0) {
33
+ continue;
34
+ }
35
+ env[entry.key] = entry.value;
36
+ loadedKeys.push(entry.key);
37
+ }
38
+ return { filePath, loadedKeys, existed: true };
39
+ }
40
+ function resolveDefaultPath() {
41
+ const rift = defaultRiftEnvPath();
42
+ if (fs.existsSync(rift))
43
+ return rift;
44
+ const legacy = legacyEnvPath();
45
+ if (fs.existsSync(legacy))
46
+ return legacy;
47
+ return rift;
48
+ }
49
+ function parseEnvFile(raw) {
50
+ const entries = [];
51
+ for (const line of raw.split(/\r?\n/)) {
52
+ const trimmed = line.trim();
53
+ if (!trimmed || trimmed.startsWith("#"))
54
+ continue;
55
+ const withoutExport = trimmed.startsWith("export ")
56
+ ? trimmed.slice("export ".length).trim()
57
+ : trimmed;
58
+ const separator = withoutExport.indexOf("=");
59
+ if (separator <= 0)
60
+ continue;
61
+ const key = withoutExport.slice(0, separator).trim();
62
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key))
63
+ continue;
64
+ const value = stripWrappingQuotes(withoutExport.slice(separator + 1).trim());
65
+ entries.push({ key, value });
66
+ }
67
+ return entries;
68
+ }
69
+ function stripWrappingQuotes(value) {
70
+ if (value.length < 2)
71
+ return value;
72
+ const first = value[0];
73
+ const last = value[value.length - 1];
74
+ if ((first === "\"" || first === "'") && first === last) {
75
+ return value.slice(1, -1);
76
+ }
77
+ return value;
78
+ }
79
+ //# sourceMappingURL=rift-env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rift-env.js","sourceRoot":"","sources":["../../../src/runtime/rift-env.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function watcherStartupDisabled(env?: NodeJS.ProcessEnv): boolean;
2
+ //# sourceMappingURL=watcher-startup.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher-startup.d.ts","sourceRoot":"","sources":["../../../src/runtime/watcher-startup.ts"],"names":[],"mappings":"AAAA,wBAAgB,sBAAsB,CACpC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAET"}
@@ -0,0 +1,4 @@
1
+ export function watcherStartupDisabled(env = process.env) {
2
+ return env["RIFT_DISABLE_WATCHERS"] === "1";
3
+ }
4
+ //# sourceMappingURL=watcher-startup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher-startup.js","sourceRoot":"","sources":["../../../src/runtime/watcher-startup.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,sBAAsB,CACpC,MAAyB,OAAO,CAAC,GAAG;IAEpC,OAAO,GAAG,CAAC,uBAAuB,CAAC,KAAK,GAAG,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,23 @@
1
+ export interface ExtractedFile {
2
+ /** Relative path within the archive (or filename for single files). */
3
+ path: string;
4
+ /** File contents. */
5
+ data: Buffer;
6
+ }
7
+ export interface ExtractionResult {
8
+ files: ExtractedFile[];
9
+ }
10
+ export declare class ArchiveSecurityError extends Error {
11
+ readonly code: "PATH_TRAVERSAL" | "SYMLINK" | "TOO_MANY_FILES" | "TOO_LARGE" | "UNSUPPORTED_FORMAT";
12
+ constructor(message: string, code: "PATH_TRAVERSAL" | "SYMLINK" | "TOO_MANY_FILES" | "TOO_LARGE" | "UNSUPPORTED_FORMAT");
13
+ }
14
+ /**
15
+ * Extract an uploaded archive or single file with full security checks.
16
+ *
17
+ * @param buffer - Raw uploaded file content
18
+ * @param originalName - Original filename (used for format detection)
19
+ * @returns Extracted files
20
+ * @throws ArchiveSecurityError on any security violation
21
+ */
22
+ export declare function extractArchive(buffer: Buffer, originalName: string): ExtractionResult;
23
+ //# sourceMappingURL=archive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.d.ts","sourceRoot":"","sources":["../../../src/security/archive.ts"],"names":[],"mappings":"AAwBA,MAAM,WAAW,aAAa;IAC5B,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,qBAAqB;IACrB,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB;AAED,qBAAa,oBAAqB,SAAQ,KAAK;aAG3B,IAAI,EAChB,gBAAgB,GAChB,SAAS,GACT,gBAAgB,GAChB,WAAW,GACX,oBAAoB;gBANxB,OAAO,EAAE,MAAM,EACC,IAAI,EAChB,gBAAgB,GAChB,SAAS,GACT,gBAAgB,GAChB,WAAW,GACX,oBAAoB;CAK3B;AAwJD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,MAAM,GACnB,gBAAgB,CAkBlB"}
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Archive extraction with security protections — Slice 12.
3
+ *
4
+ * Supports:
5
+ * - zip archives (multiple entries)
6
+ * - single JSON files (passthrough)
7
+ *
8
+ * Blocks:
9
+ * - Zip-slip via path traversal (../ in entry names)
10
+ * - Symlink entries in zip archives
11
+ * - Archive bombs (>10,000 files or >1 GB uncompressed)
12
+ * - Markdown and other non-JSON/zip formats — there is no parser
13
+ * for raw markdown for any web conversation source, so accepting
14
+ * it would either silently no-op (parser skips non-JSON) or fail
15
+ * deep in the pipeline. Rejecting at this boundary makes the
16
+ * contract honest.
17
+ */
18
+ import path from "node:path";
19
+ import AdmZip from "adm-zip";
20
+ // --- Limits (PRD Section 3.4) ---
21
+ const MAX_FILES = 10_000;
22
+ const MAX_UNCOMPRESSED_BYTES = 1_073_741_824; // 1 GB
23
+ export class ArchiveSecurityError extends Error {
24
+ code;
25
+ constructor(message, code) {
26
+ super(message);
27
+ this.code = code;
28
+ this.name = "ArchiveSecurityError";
29
+ }
30
+ }
31
+ /**
32
+ * Detect format from buffer magic bytes and original filename.
33
+ *
34
+ * Markdown (.md/.markdown) is explicitly rejected: no web-conversation
35
+ * parser handles raw markdown, so accepting it here would only enable
36
+ * silent no-op ingests downstream.
37
+ */
38
+ function detectFormat(buffer, originalName) {
39
+ // ZIP magic: PK\x03\x04
40
+ if (buffer.length >= 4 &&
41
+ buffer[0] === 0x50 &&
42
+ buffer[1] === 0x4b &&
43
+ buffer[2] === 0x03 &&
44
+ buffer[3] === 0x04) {
45
+ return "zip";
46
+ }
47
+ const lower = originalName.toLowerCase();
48
+ if (lower.endsWith(".md") || lower.endsWith(".markdown")) {
49
+ throw new ArchiveSecurityError(`Unsupported file format: ${originalName} (markdown is not a supported ingest format)`, "UNSUPPORTED_FORMAT");
50
+ }
51
+ if (lower.endsWith(".json"))
52
+ return "json";
53
+ // Try content sniffing: if it starts with { or [, treat as JSON
54
+ const trimmed = buffer.toString("utf8", 0, Math.min(buffer.length, 64)).trimStart();
55
+ if (trimmed.startsWith("{") || trimmed.startsWith("["))
56
+ return "json";
57
+ throw new ArchiveSecurityError(`Unsupported file format: ${originalName}`, "UNSUPPORTED_FORMAT");
58
+ }
59
+ /**
60
+ * Validate that a zip entry name is safe (no path traversal).
61
+ */
62
+ function validateEntryPath(entryName) {
63
+ // Normalize to forward slashes for consistency
64
+ const normalized = entryName.replace(/\\/g, "/");
65
+ // Reject absolute paths
66
+ if (path.isAbsolute(normalized) || normalized.startsWith("/")) {
67
+ throw new ArchiveSecurityError(`Zip-slip: absolute path in archive entry: ${entryName}`, "PATH_TRAVERSAL");
68
+ }
69
+ // Reject any path component that is ".."
70
+ const segments = normalized.split("/");
71
+ for (const seg of segments) {
72
+ if (seg === "..") {
73
+ throw new ArchiveSecurityError(`Zip-slip: path traversal in archive entry: ${entryName}`, "PATH_TRAVERSAL");
74
+ }
75
+ }
76
+ // Double-check: resolved path must not escape a hypothetical root
77
+ const resolved = path.resolve("/safe-root", normalized);
78
+ if (!resolved.startsWith("/safe-root/") && resolved !== "/safe-root") {
79
+ throw new ArchiveSecurityError(`Zip-slip: path escapes extraction root: ${entryName}`, "PATH_TRAVERSAL");
80
+ }
81
+ }
82
+ /**
83
+ * Extract a zip buffer with security checks.
84
+ */
85
+ function extractZip(buffer) {
86
+ const zip = new AdmZip(buffer);
87
+ const entries = zip.getEntries();
88
+ // --- Archive bomb: file count ---
89
+ const fileEntries = entries.filter((e) => !e.isDirectory);
90
+ if (fileEntries.length > MAX_FILES) {
91
+ throw new ArchiveSecurityError(`Archive bomb: ${fileEntries.length} files exceeds limit of ${MAX_FILES}`, "TOO_MANY_FILES");
92
+ }
93
+ // --- Pre-scan all entries for security violations ---
94
+ let totalUncompressed = 0;
95
+ for (const entry of entries) {
96
+ // Reject symlinks (external attributes bit 0120000 in Unix)
97
+ // AdmZip stores the Unix file attributes in the upper 16 bits of attr
98
+ const unixAttr = (entry.header.attr >>> 16) & 0xffff;
99
+ const isSymlink = (unixAttr & 0o170000) === 0o120000;
100
+ if (isSymlink) {
101
+ throw new ArchiveSecurityError(`Symlink in archive: ${entry.entryName}`, "SYMLINK");
102
+ }
103
+ // Validate path (zip-slip)
104
+ validateEntryPath(entry.entryName);
105
+ // Accumulate uncompressed size
106
+ if (!entry.isDirectory) {
107
+ totalUncompressed += entry.header.size;
108
+ if (totalUncompressed > MAX_UNCOMPRESSED_BYTES) {
109
+ throw new ArchiveSecurityError(`Archive bomb: uncompressed size exceeds ${MAX_UNCOMPRESSED_BYTES} bytes (1 GB)`, "TOO_LARGE");
110
+ }
111
+ }
112
+ }
113
+ // --- Extract files ---
114
+ const files = [];
115
+ for (const entry of fileEntries) {
116
+ files.push({
117
+ path: entry.entryName.replace(/\\/g, "/"),
118
+ data: entry.getData(),
119
+ });
120
+ }
121
+ return { files };
122
+ }
123
+ /**
124
+ * Sanitize a single-file upload name.
125
+ *
126
+ * Applies the same path-traversal checks used for zip entries, then
127
+ * strips to the basename so the returned path is always a plain
128
+ * filename with no directory component.
129
+ */
130
+ function sanitizeSingleFileName(originalName) {
131
+ // Run the zip-entry validator — it rejects ../, absolute paths, etc.
132
+ validateEntryPath(originalName);
133
+ // Even if validation passes (e.g. "subdir/file.json"), strip to basename
134
+ // so the caller cannot influence the storage directory.
135
+ const normalized = originalName.replace(/\\/g, "/");
136
+ const base = normalized.split("/").pop() ?? originalName;
137
+ return base;
138
+ }
139
+ /**
140
+ * Extract an uploaded archive or single file with full security checks.
141
+ *
142
+ * @param buffer - Raw uploaded file content
143
+ * @param originalName - Original filename (used for format detection)
144
+ * @returns Extracted files
145
+ * @throws ArchiveSecurityError on any security violation
146
+ */
147
+ export function extractArchive(buffer, originalName) {
148
+ const format = detectFormat(buffer, originalName);
149
+ if (format === "zip") {
150
+ return extractZip(buffer);
151
+ }
152
+ // Single JSON passthrough — sanitize the name
153
+ const safeName = sanitizeSingleFileName(originalName);
154
+ return {
155
+ files: [
156
+ {
157
+ path: safeName,
158
+ data: buffer,
159
+ },
160
+ ],
161
+ };
162
+ }
163
+ //# sourceMappingURL=archive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive.js","sourceRoot":"","sources":["../../../src/security/archive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Validate and canonicalize a file path against allowed source roots.
3
+ *
4
+ * 1. Resolves the path to absolute.
5
+ * 2. Resolves symlinks via realpath.
6
+ * 3. Confirms the canonical path falls under at least one allowed root.
7
+ *
8
+ * @returns The canonical (symlink-resolved) absolute path.
9
+ * @throws If the path is outside all allowed roots, unresolvable, or inaccessible.
10
+ */
11
+ export declare function validatePath(filePath: string, allowedRoots: readonly string[]): string;
12
+ /**
13
+ * Validate a path for an unlink event (file already deleted).
14
+ *
15
+ * Since the file no longer exists, we cannot resolve symlinks.
16
+ * We fall back to path.resolve() and prefix-check only.
17
+ * This is safe because: the path was validated on add/change,
18
+ * and unlink only removes existing rows — it cannot insert data.
19
+ */
20
+ export declare function validateUnlinkPath(filePath: string, allowedRoots: readonly string[]): string;
21
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../../src/security/paths.ts"],"names":[],"mappings":"AAUA;;;;;;;;;GASG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CA4BtF;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,CAe5F"}