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

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 (386) hide show
  1. package/README.md +35 -9
  2. package/dist/src/auth/keychain.d.ts +9 -0
  3. package/dist/src/auth/keychain.d.ts.map +1 -1
  4. package/dist/src/auth/keychain.js +37 -0
  5. package/dist/src/auth/keychain.js.map +1 -1
  6. package/dist/src/capture/auto-capture.d.ts +7 -0
  7. package/dist/src/capture/auto-capture.d.ts.map +1 -1
  8. package/dist/src/capture/auto-capture.js +82 -15
  9. package/dist/src/capture/auto-capture.js.map +1 -1
  10. package/dist/src/capture/auto-repair.d.ts +110 -0
  11. package/dist/src/capture/auto-repair.d.ts.map +1 -0
  12. package/dist/src/capture/auto-repair.js +269 -0
  13. package/dist/src/capture/auto-repair.js.map +1 -0
  14. package/dist/src/capture/codex-cli-triage-provider.d.ts.map +1 -1
  15. package/dist/src/capture/codex-cli-triage-provider.js +4 -3
  16. package/dist/src/capture/codex-cli-triage-provider.js.map +1 -1
  17. package/dist/src/capture/observability.d.ts +42 -0
  18. package/dist/src/capture/observability.d.ts.map +1 -1
  19. package/dist/src/capture/observability.js +45 -4
  20. package/dist/src/capture/observability.js.map +1 -1
  21. package/dist/src/capture/recover-quarantine.d.ts +260 -0
  22. package/dist/src/capture/recover-quarantine.d.ts.map +1 -0
  23. package/dist/src/capture/recover-quarantine.js +522 -0
  24. package/dist/src/capture/recover-quarantine.js.map +1 -0
  25. package/dist/src/cli/commands/backfill.d.ts.map +1 -1
  26. package/dist/src/cli/commands/backfill.js +5 -2
  27. package/dist/src/cli/commands/backfill.js.map +1 -1
  28. package/dist/src/cli/commands/capture-recover.d.ts +40 -0
  29. package/dist/src/cli/commands/capture-recover.d.ts.map +1 -0
  30. package/dist/src/cli/commands/capture-recover.js +184 -0
  31. package/dist/src/cli/commands/capture-recover.js.map +1 -0
  32. package/dist/src/cli/commands/capture.d.ts.map +1 -1
  33. package/dist/src/cli/commands/capture.js +96 -5
  34. package/dist/src/cli/commands/capture.js.map +1 -1
  35. package/dist/src/cli/commands/doctor.d.ts +6 -0
  36. package/dist/src/cli/commands/doctor.d.ts.map +1 -0
  37. package/dist/src/cli/commands/doctor.js +242 -0
  38. package/dist/src/cli/commands/doctor.js.map +1 -0
  39. package/dist/src/cli/commands/feedback.d.ts +12 -0
  40. package/dist/src/cli/commands/feedback.d.ts.map +1 -1
  41. package/dist/src/cli/commands/feedback.js +93 -4
  42. package/dist/src/cli/commands/feedback.js.map +1 -1
  43. package/dist/src/cli/commands/mcp-install.js +5 -2
  44. package/dist/src/cli/commands/mcp-install.js.map +1 -1
  45. package/dist/src/cli/commands/menubar.d.ts +30 -0
  46. package/dist/src/cli/commands/menubar.d.ts.map +1 -0
  47. package/dist/src/cli/commands/menubar.js +180 -0
  48. package/dist/src/cli/commands/menubar.js.map +1 -0
  49. package/dist/src/cli/commands/onboard.d.ts +129 -0
  50. package/dist/src/cli/commands/onboard.d.ts.map +1 -1
  51. package/dist/src/cli/commands/onboard.js +752 -171
  52. package/dist/src/cli/commands/onboard.js.map +1 -1
  53. package/dist/src/cli/commands/rebuild.d.ts.map +1 -1
  54. package/dist/src/cli/commands/rebuild.js +6 -3
  55. package/dist/src/cli/commands/rebuild.js.map +1 -1
  56. package/dist/src/cli/commands/reconcile.d.ts.map +1 -1
  57. package/dist/src/cli/commands/reconcile.js +12 -0
  58. package/dist/src/cli/commands/reconcile.js.map +1 -1
  59. package/dist/src/cli/commands/review.d.ts.map +1 -1
  60. package/dist/src/cli/commands/review.js +22 -7
  61. package/dist/src/cli/commands/review.js.map +1 -1
  62. package/dist/src/cli/commands/search.d.ts +2 -0
  63. package/dist/src/cli/commands/search.d.ts.map +1 -1
  64. package/dist/src/cli/commands/search.js +34 -4
  65. package/dist/src/cli/commands/search.js.map +1 -1
  66. package/dist/src/cli/commands/status.d.ts +9 -7
  67. package/dist/src/cli/commands/status.d.ts.map +1 -1
  68. package/dist/src/cli/commands/status.js +113 -12
  69. package/dist/src/cli/commands/status.js.map +1 -1
  70. package/dist/src/cli/commands/token-issue.d.ts.map +1 -1
  71. package/dist/src/cli/commands/token-issue.js +9 -1
  72. package/dist/src/cli/commands/token-issue.js.map +1 -1
  73. package/dist/src/cli/commands/triage.d.ts.map +1 -1
  74. package/dist/src/cli/commands/triage.js +7 -5
  75. package/dist/src/cli/commands/triage.js.map +1 -1
  76. package/dist/src/cli/commands/update.d.ts +80 -0
  77. package/dist/src/cli/commands/update.d.ts.map +1 -0
  78. package/dist/src/cli/commands/update.js +378 -0
  79. package/dist/src/cli/commands/update.js.map +1 -0
  80. package/dist/src/cli/default-config-path.d.ts +15 -0
  81. package/dist/src/cli/default-config-path.d.ts.map +1 -0
  82. package/dist/src/cli/default-config-path.js +27 -0
  83. package/dist/src/cli/default-config-path.js.map +1 -0
  84. package/dist/src/cli/feedback/feedback-config.d.ts +46 -0
  85. package/dist/src/cli/feedback/feedback-config.d.ts.map +1 -1
  86. package/dist/src/cli/feedback/feedback-config.js +130 -4
  87. package/dist/src/cli/feedback/feedback-config.js.map +1 -1
  88. package/dist/src/cli/feedback/feedback-history.d.ts +7 -0
  89. package/dist/src/cli/feedback/feedback-history.d.ts.map +1 -1
  90. package/dist/src/cli/feedback/feedback-history.js +39 -9
  91. package/dist/src/cli/feedback/feedback-history.js.map +1 -1
  92. package/dist/src/cli/feedback/feedback-payload.d.ts +22 -1
  93. package/dist/src/cli/feedback/feedback-payload.d.ts.map +1 -1
  94. package/dist/src/cli/feedback/feedback-payload.js.map +1 -1
  95. package/dist/src/cli/feedback/feedback-relay.d.ts +2 -2
  96. package/dist/src/cli/feedback/feedback-relay.d.ts.map +1 -1
  97. package/dist/src/cli/feedback/feedback-relay.js.map +1 -1
  98. package/dist/src/cli/feedback/invite.d.ts +17 -0
  99. package/dist/src/cli/feedback/invite.d.ts.map +1 -0
  100. package/dist/src/cli/feedback/invite.js +67 -0
  101. package/dist/src/cli/feedback/invite.js.map +1 -0
  102. package/dist/src/cli/feedback/relay-secret-store.d.ts +32 -0
  103. package/dist/src/cli/feedback/relay-secret-store.d.ts.map +1 -0
  104. package/dist/src/cli/feedback/relay-secret-store.js +137 -0
  105. package/dist/src/cli/feedback/relay-secret-store.js.map +1 -0
  106. package/dist/src/cli/http-client.d.ts +93 -1
  107. package/dist/src/cli/http-client.d.ts.map +1 -1
  108. package/dist/src/cli/http-client.js +254 -6
  109. package/dist/src/cli/http-client.js.map +1 -1
  110. package/dist/src/cli/index.d.ts.map +1 -1
  111. package/dist/src/cli/index.js +29 -6
  112. package/dist/src/cli/index.js.map +1 -1
  113. package/dist/src/cli/postinstall-menubar.d.ts +22 -0
  114. package/dist/src/cli/postinstall-menubar.d.ts.map +1 -0
  115. package/dist/src/cli/postinstall-menubar.js +39 -0
  116. package/dist/src/cli/postinstall-menubar.js.map +1 -0
  117. package/dist/src/cli/status/friend-header.d.ts +8 -1
  118. package/dist/src/cli/status/friend-header.d.ts.map +1 -1
  119. package/dist/src/cli/status/friend-header.js +334 -26
  120. package/dist/src/cli/status/friend-header.js.map +1 -1
  121. package/dist/src/cli/ui.d.ts +47 -0
  122. package/dist/src/cli/ui.d.ts.map +1 -0
  123. package/dist/src/cli/ui.js +166 -0
  124. package/dist/src/cli/ui.js.map +1 -0
  125. package/dist/src/config/schema.d.ts +79 -0
  126. package/dist/src/config/schema.d.ts.map +1 -1
  127. package/dist/src/config/schema.js +44 -0
  128. package/dist/src/config/schema.js.map +1 -1
  129. package/dist/src/diagnostics/codex-preflight.d.ts +33 -0
  130. package/dist/src/diagnostics/codex-preflight.d.ts.map +1 -0
  131. package/dist/src/diagnostics/codex-preflight.js +75 -0
  132. package/dist/src/diagnostics/codex-preflight.js.map +1 -0
  133. package/dist/src/diagnostics/doctor.d.ts +106 -0
  134. package/dist/src/diagnostics/doctor.d.ts.map +1 -0
  135. package/dist/src/diagnostics/doctor.js +334 -0
  136. package/dist/src/diagnostics/doctor.js.map +1 -0
  137. package/dist/src/diagnostics/notify.d.ts +90 -0
  138. package/dist/src/diagnostics/notify.d.ts.map +1 -0
  139. package/dist/src/diagnostics/notify.js +177 -0
  140. package/dist/src/diagnostics/notify.js.map +1 -0
  141. package/dist/src/diagnostics/repair-prompt.d.ts +49 -0
  142. package/dist/src/diagnostics/repair-prompt.d.ts.map +1 -0
  143. package/dist/src/diagnostics/repair-prompt.js +223 -0
  144. package/dist/src/diagnostics/repair-prompt.js.map +1 -0
  145. package/dist/src/ingestion/inbox-core/conversation-fingerprint.d.ts +2 -0
  146. package/dist/src/ingestion/inbox-core/conversation-fingerprint.d.ts.map +1 -0
  147. package/dist/src/ingestion/inbox-core/conversation-fingerprint.js +27 -0
  148. package/dist/src/ingestion/inbox-core/conversation-fingerprint.js.map +1 -0
  149. package/dist/src/ingestion/inbox-core/conversation-key.d.ts +2 -0
  150. package/dist/src/ingestion/inbox-core/conversation-key.d.ts.map +1 -0
  151. package/dist/src/ingestion/inbox-core/conversation-key.js +31 -0
  152. package/dist/src/ingestion/inbox-core/conversation-key.js.map +1 -0
  153. package/dist/src/ingestion/inbox-core/extensions.d.ts +3 -0
  154. package/dist/src/ingestion/inbox-core/extensions.d.ts.map +1 -0
  155. package/dist/src/ingestion/inbox-core/extensions.js +16 -0
  156. package/dist/src/ingestion/inbox-core/extensions.js.map +1 -0
  157. package/dist/src/ingestion/inbox-core/idempotency.d.ts +2 -0
  158. package/dist/src/ingestion/inbox-core/idempotency.d.ts.map +1 -0
  159. package/dist/src/ingestion/inbox-core/idempotency.js +22 -0
  160. package/dist/src/ingestion/inbox-core/idempotency.js.map +1 -0
  161. package/dist/src/ingestion/inbox-core/index.d.ts +20 -0
  162. package/dist/src/ingestion/inbox-core/index.d.ts.map +1 -0
  163. package/dist/src/ingestion/inbox-core/index.js +20 -0
  164. package/dist/src/ingestion/inbox-core/index.js.map +1 -0
  165. package/dist/src/ingestion/inbox-core/source-detection.d.ts +2 -0
  166. package/dist/src/ingestion/inbox-core/source-detection.d.ts.map +1 -0
  167. package/dist/src/ingestion/inbox-core/source-detection.js +23 -0
  168. package/dist/src/ingestion/inbox-core/source-detection.js.map +1 -0
  169. package/dist/src/ingestion/inbox-core/source-sniffer.d.ts +11 -0
  170. package/dist/src/ingestion/inbox-core/source-sniffer.d.ts.map +1 -0
  171. package/dist/src/ingestion/inbox-core/source-sniffer.js +69 -0
  172. package/dist/src/ingestion/inbox-core/source-sniffer.js.map +1 -0
  173. package/dist/src/ingestion/inbox-core/zip-sniffer.d.ts +70 -0
  174. package/dist/src/ingestion/inbox-core/zip-sniffer.d.ts.map +1 -0
  175. package/dist/src/ingestion/inbox-core/zip-sniffer.js +161 -0
  176. package/dist/src/ingestion/inbox-core/zip-sniffer.js.map +1 -0
  177. package/dist/src/ingestion/inbox-watcher.d.ts.map +1 -1
  178. package/dist/src/ingestion/inbox-watcher.js +34 -50
  179. package/dist/src/ingestion/inbox-watcher.js.map +1 -1
  180. package/dist/src/ingestion/indexer.d.ts +7 -0
  181. package/dist/src/ingestion/indexer.d.ts.map +1 -1
  182. package/dist/src/ingestion/indexer.js +36 -2
  183. package/dist/src/ingestion/indexer.js.map +1 -1
  184. package/dist/src/ingestion/metadata-extraction.d.ts +8 -5
  185. package/dist/src/ingestion/metadata-extraction.d.ts.map +1 -1
  186. package/dist/src/ingestion/metadata-extraction.js +24 -5
  187. package/dist/src/ingestion/metadata-extraction.js.map +1 -1
  188. package/dist/src/ingestion/skip-quarantine.d.ts +10 -0
  189. package/dist/src/ingestion/skip-quarantine.d.ts.map +1 -0
  190. package/dist/src/ingestion/skip-quarantine.js +35 -0
  191. package/dist/src/ingestion/skip-quarantine.js.map +1 -0
  192. package/dist/src/jobs/handlers/compact.d.ts.map +1 -1
  193. package/dist/src/jobs/handlers/compact.js +30 -4
  194. package/dist/src/jobs/handlers/compact.js.map +1 -1
  195. package/dist/src/jobs/handlers/dedupe-conversations.d.ts +134 -0
  196. package/dist/src/jobs/handlers/dedupe-conversations.d.ts.map +1 -0
  197. package/dist/src/jobs/handlers/dedupe-conversations.js +371 -0
  198. package/dist/src/jobs/handlers/dedupe-conversations.js.map +1 -0
  199. package/dist/src/jobs/handlers/ingest.d.ts.map +1 -1
  200. package/dist/src/jobs/handlers/ingest.js +295 -41
  201. package/dist/src/jobs/handlers/ingest.js.map +1 -1
  202. package/dist/src/jobs/handlers/reconcile.d.ts +28 -0
  203. package/dist/src/jobs/handlers/reconcile.d.ts.map +1 -1
  204. package/dist/src/jobs/handlers/reconcile.js +145 -19
  205. package/dist/src/jobs/handlers/reconcile.js.map +1 -1
  206. package/dist/src/jobs/handlers/reindex.d.ts.map +1 -1
  207. package/dist/src/jobs/handlers/reindex.js +13 -2
  208. package/dist/src/jobs/handlers/reindex.js.map +1 -1
  209. package/dist/src/jobs/handlers/save.d.ts.map +1 -1
  210. package/dist/src/jobs/handlers/save.js +57 -3
  211. package/dist/src/jobs/handlers/save.js.map +1 -1
  212. package/dist/src/jobs/queue.d.ts +51 -1
  213. package/dist/src/jobs/queue.d.ts.map +1 -1
  214. package/dist/src/jobs/queue.js +466 -26
  215. package/dist/src/jobs/queue.js.map +1 -1
  216. package/dist/src/jobs/worker-entry.d.ts.map +1 -1
  217. package/dist/src/jobs/worker-entry.js +35 -7
  218. package/dist/src/jobs/worker-entry.js.map +1 -1
  219. package/dist/src/jobs/worker-process.d.ts +11 -0
  220. package/dist/src/jobs/worker-process.d.ts.map +1 -1
  221. package/dist/src/jobs/worker-process.js +37 -4
  222. package/dist/src/jobs/worker-process.js.map +1 -1
  223. package/dist/src/main.js +199 -46
  224. package/dist/src/main.js.map +1 -1
  225. package/dist/src/mcp/errors.d.ts.map +1 -1
  226. package/dist/src/mcp/errors.js +20 -1
  227. package/dist/src/mcp/errors.js.map +1 -1
  228. package/dist/src/mcp/server.d.ts.map +1 -1
  229. package/dist/src/mcp/server.js +43 -3
  230. package/dist/src/mcp/server.js.map +1 -1
  231. package/dist/src/mcp/tools/context-pack.d.ts.map +1 -1
  232. package/dist/src/mcp/tools/context-pack.js +164 -23
  233. package/dist/src/mcp/tools/context-pack.js.map +1 -1
  234. package/dist/src/mcp/tools/search.d.ts +6 -2
  235. package/dist/src/mcp/tools/search.d.ts.map +1 -1
  236. package/dist/src/mcp/tools/search.js +35 -4
  237. package/dist/src/mcp/tools/search.js.map +1 -1
  238. package/dist/src/observability/embedding-events.d.ts +52 -0
  239. package/dist/src/observability/embedding-events.d.ts.map +1 -0
  240. package/dist/src/observability/embedding-events.js +149 -0
  241. package/dist/src/observability/embedding-events.js.map +1 -0
  242. package/dist/src/observability/index-events.d.ts +70 -0
  243. package/dist/src/observability/index-events.d.ts.map +1 -0
  244. package/dist/src/observability/index-events.js +148 -0
  245. package/dist/src/observability/index-events.js.map +1 -0
  246. package/dist/src/observability/onboarding-metric.d.ts +131 -0
  247. package/dist/src/observability/onboarding-metric.d.ts.map +1 -0
  248. package/dist/src/observability/onboarding-metric.js +351 -0
  249. package/dist/src/observability/onboarding-metric.js.map +1 -0
  250. package/dist/src/observability/tool-usage-stats.d.ts +77 -4
  251. package/dist/src/observability/tool-usage-stats.d.ts.map +1 -1
  252. package/dist/src/observability/tool-usage-stats.js +112 -32
  253. package/dist/src/observability/tool-usage-stats.js.map +1 -1
  254. package/dist/src/observability/tool-usage.d.ts +100 -7
  255. package/dist/src/observability/tool-usage.d.ts.map +1 -1
  256. package/dist/src/observability/tool-usage.js +196 -33
  257. package/dist/src/observability/tool-usage.js.map +1 -1
  258. package/dist/src/observability/version-check.d.ts +71 -0
  259. package/dist/src/observability/version-check.d.ts.map +1 -0
  260. package/dist/src/observability/version-check.js +198 -0
  261. package/dist/src/observability/version-check.js.map +1 -0
  262. package/dist/src/providers/basic-metadata-extraction.d.ts +60 -0
  263. package/dist/src/providers/basic-metadata-extraction.d.ts.map +1 -0
  264. package/dist/src/providers/basic-metadata-extraction.js +114 -0
  265. package/dist/src/providers/basic-metadata-extraction.js.map +1 -0
  266. package/dist/src/providers/codex-cli-metadata-extraction.d.ts +1 -0
  267. package/dist/src/providers/codex-cli-metadata-extraction.d.ts.map +1 -1
  268. package/dist/src/providers/codex-cli-metadata-extraction.js +6 -2
  269. package/dist/src/providers/codex-cli-metadata-extraction.js.map +1 -1
  270. package/dist/src/providers/codex-cli-model.d.ts +61 -0
  271. package/dist/src/providers/codex-cli-model.d.ts.map +1 -0
  272. package/dist/src/providers/codex-cli-model.js +194 -0
  273. package/dist/src/providers/codex-cli-model.js.map +1 -0
  274. package/dist/src/providers/codex-cli-runner.d.ts +39 -0
  275. package/dist/src/providers/codex-cli-runner.d.ts.map +1 -1
  276. package/dist/src/providers/codex-cli-runner.js +234 -48
  277. package/dist/src/providers/codex-cli-runner.js.map +1 -1
  278. package/dist/src/providers/conversation-generation.d.ts.map +1 -1
  279. package/dist/src/providers/conversation-generation.js +43 -6
  280. package/dist/src/providers/conversation-generation.js.map +1 -1
  281. package/dist/src/providers/ollama-embed.d.ts +2 -1
  282. package/dist/src/providers/ollama-embed.d.ts.map +1 -1
  283. package/dist/src/providers/ollama-embed.js +1 -0
  284. package/dist/src/providers/ollama-embed.js.map +1 -1
  285. package/dist/src/providers/openai-metadata-extraction.d.ts +3 -3
  286. package/dist/src/providers/openai-metadata-extraction.d.ts.map +1 -1
  287. package/dist/src/providers/openai-metadata-extraction.js +18 -3
  288. package/dist/src/providers/openai-metadata-extraction.js.map +1 -1
  289. package/dist/src/providers/placeholder-embed.d.ts +56 -0
  290. package/dist/src/providers/placeholder-embed.d.ts.map +1 -0
  291. package/dist/src/providers/placeholder-embed.js +64 -0
  292. package/dist/src/providers/placeholder-embed.js.map +1 -0
  293. package/dist/src/providers/stub.d.ts +2 -0
  294. package/dist/src/providers/stub.d.ts.map +1 -1
  295. package/dist/src/providers/stub.js +2 -0
  296. package/dist/src/providers/stub.js.map +1 -1
  297. package/dist/src/providers/types.d.ts +11 -0
  298. package/dist/src/providers/types.d.ts.map +1 -1
  299. package/dist/src/providers/voyage.d.ts +2 -1
  300. package/dist/src/providers/voyage.d.ts.map +1 -1
  301. package/dist/src/providers/voyage.js +1 -0
  302. package/dist/src/providers/voyage.js.map +1 -1
  303. package/dist/src/retrieval/compact.d.ts +116 -2
  304. package/dist/src/retrieval/compact.d.ts.map +1 -1
  305. package/dist/src/retrieval/compact.js +158 -5
  306. package/dist/src/retrieval/compact.js.map +1 -1
  307. package/dist/src/retrieval/context-pack.d.ts +114 -0
  308. package/dist/src/retrieval/context-pack.d.ts.map +1 -1
  309. package/dist/src/retrieval/context-pack.js +292 -8
  310. package/dist/src/retrieval/context-pack.js.map +1 -1
  311. package/dist/src/retrieval/current-truth.d.ts +360 -0
  312. package/dist/src/retrieval/current-truth.d.ts.map +1 -0
  313. package/dist/src/retrieval/current-truth.js +766 -0
  314. package/dist/src/retrieval/current-truth.js.map +1 -0
  315. package/dist/src/retrieval/git-state.d.ts +53 -0
  316. package/dist/src/retrieval/git-state.d.ts.map +1 -0
  317. package/dist/src/retrieval/git-state.js +174 -0
  318. package/dist/src/retrieval/git-state.js.map +1 -0
  319. package/dist/src/retrieval/lexical.d.ts.map +1 -1
  320. package/dist/src/retrieval/lexical.js +19 -3
  321. package/dist/src/retrieval/lexical.js.map +1 -1
  322. package/dist/src/retrieval/locator-boost.d.ts +37 -0
  323. package/dist/src/retrieval/locator-boost.d.ts.map +1 -0
  324. package/dist/src/retrieval/locator-boost.js +129 -0
  325. package/dist/src/retrieval/locator-boost.js.map +1 -0
  326. package/dist/src/retrieval/report-demotion.d.ts +46 -0
  327. package/dist/src/retrieval/report-demotion.d.ts.map +1 -0
  328. package/dist/src/retrieval/report-demotion.js +169 -0
  329. package/dist/src/retrieval/report-demotion.js.map +1 -0
  330. package/dist/src/retrieval/vector.d.ts.map +1 -1
  331. package/dist/src/retrieval/vector.js +11 -2
  332. package/dist/src/retrieval/vector.js.map +1 -1
  333. package/dist/src/server/app.d.ts.map +1 -1
  334. package/dist/src/server/app.js +92 -11
  335. package/dist/src/server/app.js.map +1 -1
  336. package/dist/src/server/routes/compact.d.ts.map +1 -1
  337. package/dist/src/server/routes/compact.js +4 -1
  338. package/dist/src/server/routes/compact.js.map +1 -1
  339. package/dist/src/server/routes/context.d.ts +1 -1
  340. package/dist/src/server/routes/context.d.ts.map +1 -1
  341. package/dist/src/server/routes/context.js +2 -1
  342. package/dist/src/server/routes/context.js.map +1 -1
  343. package/dist/src/server/routes/conversations-search.d.ts.map +1 -1
  344. package/dist/src/server/routes/conversations-search.js +28 -3
  345. package/dist/src/server/routes/conversations-search.js.map +1 -1
  346. package/dist/src/server/routes/enqueue.d.ts +11 -0
  347. package/dist/src/server/routes/enqueue.d.ts.map +1 -0
  348. package/dist/src/server/routes/enqueue.js +17 -0
  349. package/dist/src/server/routes/enqueue.js.map +1 -0
  350. package/dist/src/server/routes/friend-status.d.ts +339 -3
  351. package/dist/src/server/routes/friend-status.d.ts.map +1 -1
  352. package/dist/src/server/routes/friend-status.js +447 -13
  353. package/dist/src/server/routes/friend-status.js.map +1 -1
  354. package/dist/src/server/routes/ingest.d.ts.map +1 -1
  355. package/dist/src/server/routes/ingest.js +5 -2
  356. package/dist/src/server/routes/ingest.js.map +1 -1
  357. package/dist/src/server/routes/mcp-usage.d.ts +5 -4
  358. package/dist/src/server/routes/mcp-usage.d.ts.map +1 -1
  359. package/dist/src/server/routes/mcp-usage.js.map +1 -1
  360. package/dist/src/server/routes/reconcile.d.ts.map +1 -1
  361. package/dist/src/server/routes/reconcile.js +20 -1
  362. package/dist/src/server/routes/reconcile.js.map +1 -1
  363. package/dist/src/server/routes/reindex.d.ts.map +1 -1
  364. package/dist/src/server/routes/reindex.js +4 -1
  365. package/dist/src/server/routes/reindex.js.map +1 -1
  366. package/dist/src/server/routes/save.d.ts.map +1 -1
  367. package/dist/src/server/routes/save.js +4 -1
  368. package/dist/src/server/routes/save.js.map +1 -1
  369. package/dist/src/server/routes/search.d.ts +1 -1
  370. package/dist/src/server/routes/search.d.ts.map +1 -1
  371. package/dist/src/server/routes/search.js +253 -29
  372. package/dist/src/server/routes/search.js.map +1 -1
  373. package/dist/src/server/routes/triage.d.ts.map +1 -1
  374. package/dist/src/server/routes/triage.js +4 -1
  375. package/dist/src/server/routes/triage.js.map +1 -1
  376. package/dist/src/storage/rebuild.d.ts +35 -1
  377. package/dist/src/storage/rebuild.d.ts.map +1 -1
  378. package/dist/src/storage/rebuild.js +288 -64
  379. package/dist/src/storage/rebuild.js.map +1 -1
  380. package/dist/src/storage/tables.d.ts +29 -0
  381. package/dist/src/storage/tables.d.ts.map +1 -1
  382. package/dist/src/storage/tables.js +32 -1
  383. package/dist/src/storage/tables.js.map +1 -1
  384. package/operator/swiftbar/render-menu.py +524 -0
  385. package/operator/swiftbar/rift.10s.sh +176 -0
  386. package/package.json +9 -3
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Minimal ZIP central-directory reader for inbox source-sniffing.
3
+ *
4
+ * We do NOT extract or decompress. We only walk the central directory
5
+ * to learn the names of the entries inside the archive, so we can
6
+ * decide which provider an inbox-dropped ZIP belongs to.
7
+ *
8
+ * Why hand-rolled (no adm-zip): inbox-core must stay free of Rift
9
+ * internals AND of npm dependencies — only `node:` stdlib. The
10
+ * adapter (inbox-watcher) and a future standalone shell both compose
11
+ * this against their own filesystem.
12
+ *
13
+ * Scope: the regular (non-ZIP64) End-Of-Central-Directory record is
14
+ * enough for personal-use chat exports (Claude / ChatGPT / Gemini /
15
+ * Grok exports are all well under 4 GB and have far fewer than 65535
16
+ * entries). Archives that look like ZIP64, are truncated, or have a
17
+ * corrupt EOCD return null; the caller falls back to filename hints
18
+ * or the chatgpt_web default.
19
+ *
20
+ * ZIP layout we rely on:
21
+ * - End of Central Directory (EOCD): 22 bytes + optional comment,
22
+ * near the end of the file, signature 0x06054b50.
23
+ * - Central Directory file headers: signature 0x02014b50, 46 bytes
24
+ * fixed + variable filename / extra / comment fields.
25
+ */
26
+ import type { SniffedProvider } from "./source-sniffer.js";
27
+ /**
28
+ * Read entry filenames from a ZIP's central directory.
29
+ *
30
+ * Returns null when:
31
+ * - buf is too small to contain a ZIP,
32
+ * - the EOCD signature is not found in the trailing 64 KiB,
33
+ * - the central directory pointers are out of range (truncated /
34
+ * corrupted archive),
35
+ * - the archive declares ZIP64 marker values (we don't follow the
36
+ * ZIP64 locator — out of scope for inbox sniffing),
37
+ * - any individual CD header signature mismatches.
38
+ *
39
+ * The list is in central-directory order, which is the order zip
40
+ * tools usually preserve. Filenames are decoded as UTF-8; ZIP entries
41
+ * default to CP437 if bit 11 of the general purpose flag is not set,
42
+ * but modern tools (Claude, Google Takeout, ChatGPT) all write UTF-8
43
+ * filenames for the marker files we look at, so we don't branch.
44
+ */
45
+ export declare function readZipCentralDirectoryFilenames(buf: Buffer, options?: {
46
+ maxEntries?: number;
47
+ }): string[] | null;
48
+ /**
49
+ * Identify a non-ChatGPT provider from the entry list of a ZIP's
50
+ * central directory. ChatGPT-shaped zips intentionally return null so
51
+ * the adapter's default (`chatgpt_web`) handles them.
52
+ *
53
+ * Markers:
54
+ * - Any entry path starts with `Takeout/` → gemini_web.
55
+ * Google Takeout ZIPs use this exact top-level prefix.
56
+ * - A root-level `projects.json` together with `conversations.json`
57
+ * and NO `chat.html` / `shared_conversations.json` → claude_web.
58
+ * ChatGPT exports contain conversations.json too but ship chat.html
59
+ * and shared_conversations.json at root and have never shipped a
60
+ * projects.json; Claude exports always ship projects.json at root.
61
+ * - Grok ZIPs are caught upstream by filename hint
62
+ * (`prod-grok-backend*.zip`), so we don't look for them here.
63
+ */
64
+ export declare function sniffProviderFromZipEntries(entries: ReadonlyArray<string>): SniffedProvider | null;
65
+ /**
66
+ * Convenience wrapper: read the CD and classify in one call. Returns
67
+ * null on a non-ZIP buffer, a corrupted CD, or an unclassified shape.
68
+ */
69
+ export declare function sniffZipBuffer(buf: Buffer): SniffedProvider | null;
70
+ //# sourceMappingURL=zip-sniffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip-sniffer.d.ts","sourceRoot":"","sources":["../../../../src/ingestion/inbox-core/zip-sniffer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAiB3D;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,gCAAgC,CAC9C,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAChC,MAAM,EAAE,GAAG,IAAI,CAmEjB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,2BAA2B,CACzC,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAC7B,eAAe,GAAG,IAAI,CAuCxB;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI,CAIlE"}
@@ -0,0 +1,161 @@
1
+ const EOCD_SIGNATURE = 0x06054b50;
2
+ const CD_HEADER_SIGNATURE = 0x02014b50;
3
+ const EOCD_MIN_SIZE = 22;
4
+ const EOCD_MAX_COMMENT = 0xffff;
5
+ const EOCD_MAX_SCAN = EOCD_MIN_SIZE + EOCD_MAX_COMMENT;
6
+ const CD_HEADER_FIXED_SIZE = 46;
7
+ /**
8
+ * Cap how much of the central directory we read. Real chat exports
9
+ * are well under this; the cap guards against pathological archives
10
+ * (gzip-bomb-shaped CDs, untrusted inbox drops) without ever needing
11
+ * to extract data.
12
+ */
13
+ const DEFAULT_MAX_ENTRIES = 4096;
14
+ /**
15
+ * Read entry filenames from a ZIP's central directory.
16
+ *
17
+ * Returns null when:
18
+ * - buf is too small to contain a ZIP,
19
+ * - the EOCD signature is not found in the trailing 64 KiB,
20
+ * - the central directory pointers are out of range (truncated /
21
+ * corrupted archive),
22
+ * - the archive declares ZIP64 marker values (we don't follow the
23
+ * ZIP64 locator — out of scope for inbox sniffing),
24
+ * - any individual CD header signature mismatches.
25
+ *
26
+ * The list is in central-directory order, which is the order zip
27
+ * tools usually preserve. Filenames are decoded as UTF-8; ZIP entries
28
+ * default to CP437 if bit 11 of the general purpose flag is not set,
29
+ * but modern tools (Claude, Google Takeout, ChatGPT) all write UTF-8
30
+ * filenames for the marker files we look at, so we don't branch.
31
+ */
32
+ export function readZipCentralDirectoryFilenames(buf, options) {
33
+ if (!Buffer.isBuffer(buf) || buf.length < EOCD_MIN_SIZE)
34
+ return null;
35
+ const maxEntries = options?.maxEntries ?? DEFAULT_MAX_ENTRIES;
36
+ // --- Locate EOCD by scanning backwards from the end for the
37
+ // signature. The EOCD lives within the last 22 + 65535 bytes.
38
+ const scanStart = Math.max(0, buf.length - EOCD_MAX_SCAN);
39
+ let eocdOffset = -1;
40
+ for (let i = buf.length - EOCD_MIN_SIZE; i >= scanStart; i--) {
41
+ if (buf.readUInt32LE(i) === EOCD_SIGNATURE) {
42
+ eocdOffset = i;
43
+ break;
44
+ }
45
+ }
46
+ if (eocdOffset < 0)
47
+ return null;
48
+ // EOCD fields (little-endian):
49
+ // off 4: disk number (uint16)
50
+ // off 6: disk where CD starts (uint16)
51
+ // off 8: CD entries on this disk (uint16)
52
+ // off 10: total CD entries (uint16)
53
+ // off 12: CD size in bytes (uint32)
54
+ // off 16: CD offset from archive start (uint32)
55
+ // off 20: comment length (uint16)
56
+ const totalEntries = buf.readUInt16LE(eocdOffset + 10);
57
+ const cdSize = buf.readUInt32LE(eocdOffset + 12);
58
+ const cdOffset = buf.readUInt32LE(eocdOffset + 16);
59
+ // ZIP64 sentinel values — bail out rather than misread.
60
+ if (totalEntries === 0xffff || cdSize === 0xffffffff || cdOffset === 0xffffffff) {
61
+ return null;
62
+ }
63
+ if (cdOffset + cdSize > buf.length)
64
+ return null;
65
+ if (cdOffset >= buf.length)
66
+ return null;
67
+ if (totalEntries === 0)
68
+ return [];
69
+ // --- Walk CD entries.
70
+ const names = [];
71
+ let cursor = cdOffset;
72
+ const cdEnd = cdOffset + cdSize;
73
+ const cap = Math.min(totalEntries, maxEntries);
74
+ for (let i = 0; i < cap; i++) {
75
+ if (cursor + CD_HEADER_FIXED_SIZE > cdEnd)
76
+ return null;
77
+ if (buf.readUInt32LE(cursor) !== CD_HEADER_SIGNATURE)
78
+ return null;
79
+ // CD header field offsets relative to cursor:
80
+ // off 28: filename length (uint16)
81
+ // off 30: extra field length (uint16)
82
+ // off 32: file comment length (uint16)
83
+ const filenameLen = buf.readUInt16LE(cursor + 28);
84
+ const extraLen = buf.readUInt16LE(cursor + 30);
85
+ const commentLen = buf.readUInt16LE(cursor + 32);
86
+ const filenameStart = cursor + CD_HEADER_FIXED_SIZE;
87
+ const filenameEnd = filenameStart + filenameLen;
88
+ if (filenameEnd > cdEnd)
89
+ return null;
90
+ const filename = buf.toString("utf-8", filenameStart, filenameEnd);
91
+ names.push(filename);
92
+ cursor = filenameEnd + extraLen + commentLen;
93
+ }
94
+ return names;
95
+ }
96
+ /**
97
+ * Identify a non-ChatGPT provider from the entry list of a ZIP's
98
+ * central directory. ChatGPT-shaped zips intentionally return null so
99
+ * the adapter's default (`chatgpt_web`) handles them.
100
+ *
101
+ * Markers:
102
+ * - Any entry path starts with `Takeout/` → gemini_web.
103
+ * Google Takeout ZIPs use this exact top-level prefix.
104
+ * - A root-level `projects.json` together with `conversations.json`
105
+ * and NO `chat.html` / `shared_conversations.json` → claude_web.
106
+ * ChatGPT exports contain conversations.json too but ship chat.html
107
+ * and shared_conversations.json at root and have never shipped a
108
+ * projects.json; Claude exports always ship projects.json at root.
109
+ * - Grok ZIPs are caught upstream by filename hint
110
+ * (`prod-grok-backend*.zip`), so we don't look for them here.
111
+ */
112
+ export function sniffProviderFromZipEntries(entries) {
113
+ if (entries.length === 0)
114
+ return null;
115
+ let hasTakeoutPrefix = false;
116
+ let hasRootConversations = false;
117
+ let hasRootProjects = false;
118
+ let hasChatHtml = false;
119
+ let hasSharedConversations = false;
120
+ for (const raw of entries) {
121
+ const path = raw.replace(/^\.\//, "");
122
+ if (path.startsWith("Takeout/")) {
123
+ hasTakeoutPrefix = true;
124
+ // Keep scanning — a Takeout ZIP can legitimately co-ship root
125
+ // files, but the prefix is enough to commit to gemini_web.
126
+ // Short-circuit safe: nothing else will override.
127
+ break;
128
+ }
129
+ if (!path.includes("/")) {
130
+ const lower = path.toLowerCase();
131
+ if (lower === "conversations.json")
132
+ hasRootConversations = true;
133
+ else if (lower === "projects.json")
134
+ hasRootProjects = true;
135
+ else if (lower === "chat.html")
136
+ hasChatHtml = true;
137
+ else if (lower === "shared_conversations.json")
138
+ hasSharedConversations = true;
139
+ }
140
+ }
141
+ if (hasTakeoutPrefix)
142
+ return "gemini_web";
143
+ if (hasRootProjects &&
144
+ hasRootConversations &&
145
+ !hasChatHtml &&
146
+ !hasSharedConversations) {
147
+ return "claude_web";
148
+ }
149
+ return null;
150
+ }
151
+ /**
152
+ * Convenience wrapper: read the CD and classify in one call. Returns
153
+ * null on a non-ZIP buffer, a corrupted CD, or an unclassified shape.
154
+ */
155
+ export function sniffZipBuffer(buf) {
156
+ const entries = readZipCentralDirectoryFilenames(buf);
157
+ if (!entries)
158
+ return null;
159
+ return sniffProviderFromZipEntries(entries);
160
+ }
161
+ //# sourceMappingURL=zip-sniffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip-sniffer.js","sourceRoot":"","sources":["../../../../src/ingestion/inbox-core/zip-sniffer.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"inbox-watcher.d.ts","sourceRoot":"","sources":["../../../src/ingestion/inbox-watcher.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAWvC,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,QAAQ,CAAC;CACjB;AAyCD;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAsCrE"}
1
+ {"version":3,"file":"inbox-watcher.d.ts","sourceRoot":"","sources":["../../../src/ingestion/inbox-watcher.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAcvC,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,QAAQ,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CA2DrE"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * Inbox watcher — Slice 19.
2
+ * Inbox watcher — Slice 19, refactored to compose `inbox-core`.
3
3
  *
4
4
  * Watches data/inbox/ for dropped files and creates ingest jobs.
5
5
  * Reuses the existing secure ingest pipeline (archive security,
@@ -10,53 +10,18 @@
10
10
  * or defaults to "chatgpt_web" for files in inbox root.
11
11
  * - Raw files land in data/raw/conversations/inbox/ via rawSource override.
12
12
  * - Idempotency key prevents duplicate processing on restart.
13
+ *
14
+ * This file is the Rift adapter — it owns `fs`, the JobQueue handoff,
15
+ * and Rift's parser registry. The pure detection primitives live in
16
+ * `inbox-core/` so a future standalone shell can reuse them.
13
17
  */
14
- import crypto from "node:crypto";
15
18
  import fs from "node:fs";
16
19
  import path from "node:path";
17
20
  import { Watcher } from "./watcher.js";
18
21
  import { SUPPORTED_INGEST_SOURCES } from "./parsers/types.js";
19
- // Web conversation exports are JSON or archives of JSON. No parser for
20
- // raw markdown exists markdown dropped here would fail at the parser
21
- // stage, so reject it up front.
22
- const SUPPORTED_EXTENSIONS = new Set([".json", ".zip"]);
22
+ import { detectSourceFromSubdir, inboxIdempotencyKey, isSupportedInboxExtension, sniffInboxSource, } from "./inbox-core/index.js";
23
+ import { writeSkipQuarantine } from "./skip-quarantine.js";
23
24
  const DEFAULT_SOURCE = "chatgpt_web";
24
- /**
25
- * Detect the parser source from a file path relative to the inbox directory.
26
- * Files in subdirectories use the subdirectory name as source
27
- * (e.g., data/inbox/chatgpt_web/export.zip → chatgpt_web).
28
- * Files directly in inbox/ default to chatgpt_web.
29
- */
30
- function detectSource(filePath, inboxDir) {
31
- const relative = path.relative(inboxDir, filePath);
32
- const firstSegment = relative.split(path.sep)[0];
33
- if (firstSegment &&
34
- firstSegment !== path.basename(filePath) &&
35
- SUPPORTED_INGEST_SOURCES.includes(firstSegment)) {
36
- return firstSegment;
37
- }
38
- return DEFAULT_SOURCE;
39
- }
40
- /**
41
- * Generate a stable idempotency key for an inbox file.
42
- * Includes path + mtime so re-dropping the same filename with new
43
- * content gets a fresh key, while restart doesn't re-process.
44
- */
45
- function inboxIdempotencyKey(filePath) {
46
- let mtimeMs = 0;
47
- try {
48
- mtimeMs = fs.statSync(filePath).mtimeMs;
49
- }
50
- catch {
51
- // File may have been moved; use 0
52
- }
53
- const hash = crypto
54
- .createHash("sha256")
55
- .update(`${filePath}:${mtimeMs}`)
56
- .digest("hex")
57
- .slice(0, 16);
58
- return `inbox:${hash}`;
59
- }
60
25
  /**
61
26
  * Create an inbox watcher. Returns a Watcher instance that can be
62
27
  * started, paused, and stopped like any other watcher.
@@ -65,24 +30,43 @@ export function createInboxWatcher(opts) {
65
30
  const inboxDir = path.join(opts.dataDir, "inbox");
66
31
  fs.mkdirSync(inboxDir, { recursive: true });
67
32
  const handler = async (event) => {
68
- // Only process new files (not changes or deletions).
69
- if (event.type !== "add")
33
+ // Ignore deletions; otherwise process both `add` and `change` so a
34
+ // user who overwrites `export.zip` in place picks up the new
35
+ // content. The idempotency key includes mtime, so an unchanged
36
+ // `change` event collapses at the queue layer.
37
+ if (event.type === "unlink")
70
38
  return;
71
- // Check file extension.
72
- const ext = path.extname(event.path).toLowerCase();
73
- if (!SUPPORTED_EXTENSIONS.has(ext))
39
+ if (!isSupportedInboxExtension(event.path)) {
40
+ // Markdown / images / other types are not parseable as web
41
+ // exports. Record a friendly skip so the user can see why their
42
+ // drop didn't ingest, instead of it disappearing silently.
43
+ await writeSkipQuarantine(opts.dataDir, {
44
+ reason: "inbox_unsupported_extension",
45
+ source_path: event.path,
46
+ metadata: { extension: path.extname(event.path).toLowerCase() },
47
+ }).catch(() => {
48
+ // Quarantine write failure must not break the watcher loop.
49
+ });
74
50
  return;
75
- // Read file contents.
51
+ }
76
52
  let fileData;
53
+ let mtimeMs;
77
54
  try {
78
55
  fileData = fs.readFileSync(event.path);
56
+ mtimeMs = fs.statSync(event.path).mtimeMs;
79
57
  }
80
58
  catch {
81
59
  // File may have been removed between detection and read.
82
60
  return;
83
61
  }
84
- const source = detectSource(event.path, inboxDir);
85
- const idempotencyKey = inboxIdempotencyKey(event.path);
62
+ // Source resolution order:
63
+ // 1. Subdirectory hint (data/inbox/<provider>/file.json) — strongest.
64
+ // 2. Content/filename sniff — identifies non-ChatGPT providers.
65
+ // 3. DEFAULT_SOURCE — historical default for unidentified drops.
66
+ const source = detectSourceFromSubdir(event.path, inboxDir, SUPPORTED_INGEST_SOURCES) ??
67
+ sniffInboxSource(path.basename(event.path), fileData) ??
68
+ DEFAULT_SOURCE;
69
+ const idempotencyKey = inboxIdempotencyKey(event.path, mtimeMs);
86
70
  const payload = {
87
71
  source: source,
88
72
  filename: path.basename(event.path),
@@ -1 +1 @@
1
- {"version":3,"file":"inbox-watcher.js","sourceRoot":"","sources":["../../../src/ingestion/inbox-watcher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"inbox-watcher.js","sourceRoot":"","sources":["../../../src/ingestion/inbox-watcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,OAAO,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EACL,sBAAsB,EACtB,mBAAmB,EACnB,yBAAyB,EACzB,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE3D,MAAM,cAAc,GAAG,aAAa,CAAC;AAOrC;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAAyB;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAClD,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE5C,MAAM,OAAO,GAAG,KAAK,EAAE,KAAgB,EAAiB,EAAE;QACxD,mEAAmE;QACnE,6DAA6D;QAC7D,+DAA+D;QAC/D,+CAA+C;QAC/C,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO;QAEpC,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3C,2DAA2D;YAC3D,gEAAgE;YAChE,2DAA2D;YAC3D,MAAM,mBAAmB,CAAC,IAAI,CAAC,OAAO,EAAE;gBACtC,MAAM,EAAE,6BAA6B;gBACrC,WAAW,EAAE,KAAK,CAAC,IAAI;gBACvB,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE;aAChE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;gBACZ,4DAA4D;YAC9D,CAAC,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,IAAI,QAAgB,CAAC;QACrB,IAAI,OAAe,CAAC;QACpB,IAAI,CAAC;YACH,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACvC,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC;QAC5C,CAAC;QAAC,MAAM,CAAC;YACP,yDAAyD;YACzD,OAAO;QACT,CAAC;QAED,2BAA2B;QAC3B,wEAAwE;QACxE,kEAAkE;QAClE,mEAAmE;QACnE,MAAM,MAAM,GACV,sBAAsB,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,wBAAwB,CAAC;YACtE,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;YACrD,cAAc,CAAC;QACjB,MAAM,cAAc,GAAG,mBAAmB,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAEhE,MAAM,OAAO,GAAkB;YAC7B,MAAM,EAAE,MAAiC;YACzC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;YACnC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACrC,SAAS,EAAE,OAAO;SACnB,CAAC;QAEF,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE;YAChC,eAAe,EAAE,cAAc;YAC/B,OAAO;SACR,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO,IAAI,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;AAC1C,CAAC"}
@@ -10,6 +10,13 @@ export interface IndexerConfig {
10
10
  allowedRoots: readonly string[];
11
11
  /** Target table for document storage. Defaults to "structured_docs". */
12
12
  tableName?: "structured_docs" | "structured_docs_local";
13
+ /**
14
+ * Data directory root. Used to write skip-quarantine records when a file
15
+ * cannot be embedded (e.g. empty extracted content). Required so every
16
+ * production code path — watch, scheduled scan, reconcile — produces a
17
+ * visible explanation when a file is dropped, instead of silent stderr.
18
+ */
19
+ dataDir: string;
13
20
  }
14
21
  /**
15
22
  * Deterministic row ID from the canonical source path.
@@ -1 +1 @@
1
- {"version":3,"file":"indexer.d.ts","sourceRoot":"","sources":["../../../src/ingestion/indexer.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAMxF,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,wEAAwE;IACxE,SAAS,CAAC,EAAE,iBAAiB,GAAG,uBAAuB,CAAC;CACzD;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoB;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAE3B,SAAS,EAAE,iBAAiB,EAAE,MAAM,EAAE,aAAa;IAK/D;;;;OAIG;IACG,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;YAcpC,YAAY;YAwBZ,YAAY;CAK3B"}
1
+ {"version":3,"file":"indexer.d.ts","sourceRoot":"","sources":["../../../src/ingestion/indexer.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,iBAAiB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AASxF,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,UAAU,CAAC;IACvB,WAAW,EAAE,WAAW,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,wEAAwE;IACxE,SAAS,CAAC,EAAE,iBAAiB,GAAG,uBAAuB,CAAC;IACxD;;;;;OAKG;IACH,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAgB,MAAM,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED,qBAAa,OAAO;IAClB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoB;IAC9C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAE3B,SAAS,EAAE,iBAAiB,EAAE,MAAM,EAAE,aAAa;IAK/D;;;;OAIG;IACG,WAAW,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;YAcpC,YAAY;YAiEZ,YAAY;CAK3B"}
@@ -9,6 +9,9 @@ import crypto from "node:crypto";
9
9
  import { getTable } from "../storage/tables.js";
10
10
  import { extract, isSupported } from "./extractor.js";
11
11
  import { validatePath, validateUnlinkPath } from "../security/paths.js";
12
+ import { writeSkipQuarantine } from "./skip-quarantine.js";
13
+ import { recordEmbed } from "../observability/embedding-events.js";
14
+ import { recordIndexWrite } from "../observability/index-events.js";
12
15
  /**
13
16
  * Deterministic row ID from the canonical source path.
14
17
  * Same file always gets the same ID, enabling upsert via delete+add.
@@ -41,7 +44,28 @@ export class Indexer {
41
44
  }
42
45
  async handleUpsert(filePath) {
43
46
  const doc = await extract(filePath);
44
- const embeddingVec = await this.embedding.embed(doc.content);
47
+ // Empty/blank extracted content cannot be embedded — Voyage rejects empty
48
+ // strings with HTTP 400, and indexing an empty row produces nothing
49
+ // searchable anyway. Quarantine the skip so it's visible (not stderr-only)
50
+ // and remove any stale row from a prior good extraction of the same path.
51
+ if (isBlank(doc.content)) {
52
+ const id = fileId(filePath);
53
+ const table = getTable(this.config.tableName ?? "structured_docs");
54
+ await table.delete(`id = '${id}'`);
55
+ await writeSkipQuarantine(this.config.dataDir, {
56
+ reason: "empty_extracted_content",
57
+ source_path: filePath,
58
+ metadata: doc.metadata,
59
+ });
60
+ return;
61
+ }
62
+ const embeddingVec = await recordEmbed(this.config.dataDir, this.embedding, {
63
+ pipeline: this.config.sourceType === "filesystem_watched"
64
+ ? "watcher"
65
+ : "scheduled_scan",
66
+ operation: "document_embedding",
67
+ input_count: 1,
68
+ }, () => this.embedding.embed(doc.content));
45
69
  const id = fileId(filePath);
46
70
  const table = getTable(this.config.tableName ?? "structured_docs");
47
71
  // Upsert: delete existing row (if any), then add new one.
@@ -57,7 +81,14 @@ export class Indexer {
57
81
  indexed_at: new Date().toISOString(),
58
82
  metadata: JSON.stringify(doc.metadata),
59
83
  };
60
- await table.add([row]);
84
+ await recordIndexWrite(this.config.dataDir, {
85
+ table: this.config.tableName ?? "structured_docs",
86
+ pipeline: this.config.sourceType === "filesystem_watched"
87
+ ? "watcher"
88
+ : "scheduled_scan",
89
+ operation: "structured_doc_upsert",
90
+ row_count: 1,
91
+ }, () => table.add([row]));
61
92
  }
62
93
  async handleDelete(filePath) {
63
94
  const id = fileId(filePath);
@@ -65,4 +96,7 @@ export class Indexer {
65
96
  await table.delete(`id = '${id}'`);
66
97
  }
67
98
  }
99
+ function isBlank(s) {
100
+ return s.trim().length === 0;
101
+ }
68
102
  //# sourceMappingURL=indexer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"indexer.js","sourceRoot":"","sources":["../../../src/ingestion/indexer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,MAAM,MAAM,aAAa,CAAC;AAGjC,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAgBxE;;;GAGG;AACH,MAAM,UAAU,MAAM,CAAC,UAAkB;IACvC,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACnF,CAAC;AAED,MAAM,OAAO,OAAO;IACD,SAAS,CAAoB;IAC7B,MAAM,CAAgB;IAEvC,YAAY,SAA4B,EAAE,MAAqB;QAC7D,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,WAAW,CAAC,KAAgB;QAChC,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAC3E,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YACnC,OAAO;QACT,CAAC;QAED,MAAM,SAAS,GAAG,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QAErE,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;YAAE,OAAO;QAEpC,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,QAAgB;QACzC,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;QACpC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC7D,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,iBAAiB,CAAC,CAAC;QAEnE,0DAA0D;QAC1D,MAAM,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAEnC,MAAM,GAAG,GAAqB;YAC5B,EAAE;YACF,WAAW,EAAE,QAAQ;YACrB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,SAAS,EAAE,YAAY;YACvB,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;YACnC,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;YACrC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,UAAU;YACnC,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACpC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC;SACvC,CAAC;QAEF,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACzB,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,QAAgB;QACzC,MAAM,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5B,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,IAAI,iBAAiB,CAAC,CAAC;QACnE,MAAM,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACrC,CAAC;CACF"}
1
+ {"version":3,"file":"indexer.js","sourceRoot":"","sources":["../../../src/ingestion/indexer.ts"],"names":[],"mappings":"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"}
@@ -5,15 +5,18 @@
5
5
  * Calls the Anthropic Messages API with the fast_model to extract:
6
6
  * domain, intent, quality, topics, decisions, key_outputs
7
7
  *
8
- * Output is Zod-validated. Invalid LLM output throws so the caller
9
- * can quarantine the item.
8
+ * Output is Zod-validated. Structural invalidity (missing fields, wrong
9
+ * types, empty `topics`) throws so the caller can quarantine the item.
10
+ * Enum drift on `domain` / `intent` / `quality` is normalized to a safe
11
+ * default and logged to stderr via `normalizedEnum` — visible but
12
+ * non-fatal.
10
13
  */
11
14
  import { z } from "zod";
12
15
  import type { MetadataExtractor, ConversationMetadata, RetryConfig } from "../providers/types.js";
13
16
  export declare const ConversationMetadataSchema: z.ZodObject<{
14
- domain: z.ZodCatch<z.ZodEnum<["business", "tech", "personal", "travel", "health", "finance", "creative"]>>;
15
- intent: z.ZodCatch<z.ZodEnum<["research", "decision", "brainstorm", "build", "learn", "troubleshoot"]>>;
16
- quality: z.ZodCatch<z.ZodEnum<["high", "medium", "low"]>>;
17
+ domain: z.ZodEffects<z.ZodUnknown, "business" | "tech" | "personal" | "travel" | "health" | "finance" | "creative", unknown>;
18
+ intent: z.ZodEffects<z.ZodUnknown, "research" | "decision" | "brainstorm" | "build" | "learn" | "troubleshoot", unknown>;
19
+ quality: z.ZodEffects<z.ZodUnknown, "high" | "medium" | "low", unknown>;
17
20
  topics: z.ZodArray<z.ZodString, "many">;
18
21
  decisions: z.ZodArray<z.ZodString, "many">;
19
22
  key_outputs: z.ZodArray<z.ZodString, "many">;
@@ -1 +1 @@
1
- {"version":3,"file":"metadata-extraction.d.ts","sourceRoot":"","sources":["../../../src/ingestion/metadata-extraction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EACV,iBAAiB,EACjB,oBAAoB,EACpB,WAAW,EACZ,MAAM,uBAAuB,CAAC;AAU/B,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;EAOrC,CAAC;AAoCH,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;CAC9B;AAED,qBAAa,0BAA2B,YAAW,iBAAiB;IAClE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAEnB,IAAI,EAAE,yBAAyB;IAMrC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;YASpD,OAAO;CA2DtB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,CA0BlE"}
1
+ {"version":3,"file":"metadata-extraction.d.ts","sourceRoot":"","sources":["../../../src/ingestion/metadata-extraction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EACV,iBAAiB,EACjB,oBAAoB,EACpB,WAAW,EACZ,MAAM,uBAAuB,CAAC;AAiC/B,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;EAOrC,CAAC;AAoCH,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;CAC9B;AAED,qBAAa,0BAA2B,YAAW,iBAAiB;IAClE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAEnB,IAAI,EAAE,yBAAyB;IAMrC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;YASpD,OAAO;CA2DtB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,oBAAoB,CA0BlE"}
@@ -5,16 +5,35 @@
5
5
  * Calls the Anthropic Messages API with the fast_model to extract:
6
6
  * domain, intent, quality, topics, decisions, key_outputs
7
7
  *
8
- * Output is Zod-validated. Invalid LLM output throws so the caller
9
- * can quarantine the item.
8
+ * Output is Zod-validated. Structural invalidity (missing fields, wrong
9
+ * types, empty `topics`) throws so the caller can quarantine the item.
10
+ * Enum drift on `domain` / `intent` / `quality` is normalized to a safe
11
+ * default and logged to stderr via `normalizedEnum` — visible but
12
+ * non-fatal.
10
13
  */
11
14
  import { z } from "zod";
12
15
  import { DOMAINS, INTENTS, QUALITY_LEVELS, DEFAULT_RETRY_CONFIG, } from "../providers/types.js";
13
16
  // --- Zod schema for extraction output validation ---
17
+ /**
18
+ * Normalize an LLM-emitted enum value: accept it if it matches the allowed
19
+ * set, otherwise remap to `fallback` and warn on stderr. Keeps ingest
20
+ * tolerant (we don't fail the whole record on a stray value) but makes
21
+ * extraction drift observable instead of silent — which is what
22
+ * `.catch(default)` was masking.
23
+ */
24
+ function normalizedEnum(values, fallback, field) {
25
+ return z.unknown().transform((raw) => {
26
+ if (typeof raw === "string" && values.includes(raw)) {
27
+ return raw;
28
+ }
29
+ process.stderr.write(`metadata-extraction: ${field}=${JSON.stringify(raw)} not in [${values.join("|")}], remapped to "${fallback}"\n`);
30
+ return fallback;
31
+ });
32
+ }
14
33
  export const ConversationMetadataSchema = z.object({
15
- domain: z.enum(DOMAINS).catch("tech"),
16
- intent: z.enum(INTENTS).catch("research"),
17
- quality: z.enum(QUALITY_LEVELS).catch("medium"),
34
+ domain: normalizedEnum(DOMAINS, "tech", "domain"),
35
+ intent: normalizedEnum(INTENTS, "research", "intent"),
36
+ quality: normalizedEnum(QUALITY_LEVELS, "medium", "quality"),
18
37
  topics: z.array(z.string().min(1)).min(1),
19
38
  decisions: z.array(z.string()),
20
39
  key_outputs: z.array(z.string()),
@@ -1 +1 @@
1
- {"version":3,"file":"metadata-extraction.js","sourceRoot":"","sources":["../../../src/ingestion/metadata-extraction.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"metadata-extraction.js","sourceRoot":"","sources":["../../../src/ingestion/metadata-extraction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export type SkipReason = "empty_extracted_content" | "inbox_unsupported_extension";
2
+ export interface SkipQuarantineRecord {
3
+ kind: "indexer_skip";
4
+ reason: SkipReason;
5
+ source_path: string;
6
+ metadata?: Record<string, unknown>;
7
+ quarantined_at: string;
8
+ }
9
+ export declare function writeSkipQuarantine(dataDir: string, record: Omit<SkipQuarantineRecord, "kind" | "quarantined_at">): Promise<string>;
10
+ //# sourceMappingURL=skip-quarantine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skip-quarantine.d.ts","sourceRoot":"","sources":["../../../src/ingestion/skip-quarantine.ts"],"names":[],"mappings":"AAiBA,MAAM,MAAM,UAAU,GAClB,yBAAyB,GACzB,6BAA6B,CAAC;AAElC,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,cAAc,CAAC;IACrB,MAAM,EAAE,UAAU,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,IAAI,CAAC,oBAAoB,EAAE,MAAM,GAAG,gBAAgB,CAAC,GAC5D,OAAO,CAAC,MAAM,CAAC,CAwBjB"}