onadit 0.0.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1085) hide show
  1. package/README.dev.md +124 -0
  2. package/README.md +194 -2
  3. package/dist/src/auth/keychain.d.ts +42 -0
  4. package/dist/src/auth/keychain.d.ts.map +1 -0
  5. package/dist/src/auth/keychain.js +177 -0
  6. package/dist/src/auth/keychain.js.map +1 -0
  7. package/dist/src/auth/middleware.d.ts +21 -0
  8. package/dist/src/auth/middleware.d.ts.map +1 -0
  9. package/dist/src/auth/middleware.js +93 -0
  10. package/dist/src/auth/middleware.js.map +1 -0
  11. package/dist/src/auth/rate-limit.d.ts +16 -0
  12. package/dist/src/auth/rate-limit.d.ts.map +1 -0
  13. package/dist/src/auth/rate-limit.js +38 -0
  14. package/dist/src/auth/rate-limit.js.map +1 -0
  15. package/dist/src/auth/rotation.d.ts +67 -0
  16. package/dist/src/auth/rotation.d.ts.map +1 -0
  17. package/dist/src/auth/rotation.js +190 -0
  18. package/dist/src/auth/rotation.js.map +1 -0
  19. package/dist/src/backfill/project-context-batch-constructor.d.ts +127 -0
  20. package/dist/src/backfill/project-context-batch-constructor.d.ts.map +1 -0
  21. package/dist/src/backfill/project-context-batch-constructor.js +210 -0
  22. package/dist/src/backfill/project-context-batch-constructor.js.map +1 -0
  23. package/dist/src/capture/assistant-text-lookup.d.ts +31 -0
  24. package/dist/src/capture/assistant-text-lookup.d.ts.map +1 -0
  25. package/dist/src/capture/assistant-text-lookup.js +222 -0
  26. package/dist/src/capture/assistant-text-lookup.js.map +1 -0
  27. package/dist/src/capture/auto-capture.d.ts +322 -0
  28. package/dist/src/capture/auto-capture.d.ts.map +1 -0
  29. package/dist/src/capture/auto-capture.js +1167 -0
  30. package/dist/src/capture/auto-capture.js.map +1 -0
  31. package/dist/src/capture/auto-repair.d.ts +125 -0
  32. package/dist/src/capture/auto-repair.d.ts.map +1 -0
  33. package/dist/src/capture/auto-repair.js +280 -0
  34. package/dist/src/capture/auto-repair.js.map +1 -0
  35. package/dist/src/capture/batch-budget.d.ts +90 -0
  36. package/dist/src/capture/batch-budget.d.ts.map +1 -0
  37. package/dist/src/capture/batch-budget.js +148 -0
  38. package/dist/src/capture/batch-budget.js.map +1 -0
  39. package/dist/src/capture/claude-cli-triage-provider.d.ts +28 -0
  40. package/dist/src/capture/claude-cli-triage-provider.d.ts.map +1 -0
  41. package/dist/src/capture/claude-cli-triage-provider.js +101 -0
  42. package/dist/src/capture/claude-cli-triage-provider.js.map +1 -0
  43. package/dist/src/capture/codex-cli-triage-provider.d.ts +17 -0
  44. package/dist/src/capture/codex-cli-triage-provider.d.ts.map +1 -0
  45. package/dist/src/capture/codex-cli-triage-provider.js +91 -0
  46. package/dist/src/capture/codex-cli-triage-provider.js.map +1 -0
  47. package/dist/src/capture/cursor-capture.d.ts +89 -0
  48. package/dist/src/capture/cursor-capture.d.ts.map +1 -0
  49. package/dist/src/capture/cursor-capture.js +121 -0
  50. package/dist/src/capture/cursor-capture.js.map +1 -0
  51. package/dist/src/capture/observability.d.ts +131 -0
  52. package/dist/src/capture/observability.d.ts.map +1 -0
  53. package/dist/src/capture/observability.js +181 -0
  54. package/dist/src/capture/observability.js.map +1 -0
  55. package/dist/src/capture/openai-triage-provider.d.ts +92 -0
  56. package/dist/src/capture/openai-triage-provider.d.ts.map +1 -0
  57. package/dist/src/capture/openai-triage-provider.js +267 -0
  58. package/dist/src/capture/openai-triage-provider.js.map +1 -0
  59. package/dist/src/capture/recover-quarantine.d.ts +273 -0
  60. package/dist/src/capture/recover-quarantine.d.ts.map +1 -0
  61. package/dist/src/capture/recover-quarantine.js +581 -0
  62. package/dist/src/capture/recover-quarantine.js.map +1 -0
  63. package/dist/src/capture/review-queue-index.d.ts +51 -0
  64. package/dist/src/capture/review-queue-index.d.ts.map +1 -0
  65. package/dist/src/capture/review-queue-index.js +204 -0
  66. package/dist/src/capture/review-queue-index.js.map +1 -0
  67. package/dist/src/capture/review-queue.d.ts +47 -0
  68. package/dist/src/capture/review-queue.d.ts.map +1 -0
  69. package/dist/src/capture/review-queue.js +116 -0
  70. package/dist/src/capture/review-queue.js.map +1 -0
  71. package/dist/src/capture/sources.d.ts +53 -0
  72. package/dist/src/capture/sources.d.ts.map +1 -0
  73. package/dist/src/capture/sources.js +55 -0
  74. package/dist/src/capture/sources.js.map +1 -0
  75. package/dist/src/capture/stored-statements.d.ts +9 -0
  76. package/dist/src/capture/stored-statements.d.ts.map +1 -0
  77. package/dist/src/capture/stored-statements.js +63 -0
  78. package/dist/src/capture/stored-statements.js.map +1 -0
  79. package/dist/src/capture/triage-classification.d.ts +92 -0
  80. package/dist/src/capture/triage-classification.d.ts.map +1 -0
  81. package/dist/src/capture/triage-classification.js +94 -0
  82. package/dist/src/capture/triage-classification.js.map +1 -0
  83. package/dist/src/capture/triage-lane.d.ts +39 -0
  84. package/dist/src/capture/triage-lane.d.ts.map +1 -0
  85. package/dist/src/capture/triage-lane.js +217 -0
  86. package/dist/src/capture/triage-lane.js.map +1 -0
  87. package/dist/src/capture/triage-provider-factory.d.ts +36 -0
  88. package/dist/src/capture/triage-provider-factory.d.ts.map +1 -0
  89. package/dist/src/capture/triage-provider-factory.js +55 -0
  90. package/dist/src/capture/triage-provider-factory.js.map +1 -0
  91. package/dist/src/capture/triage-provider.d.ts +82 -0
  92. package/dist/src/capture/triage-provider.d.ts.map +1 -0
  93. package/dist/src/capture/triage-provider.js +126 -0
  94. package/dist/src/capture/triage-provider.js.map +1 -0
  95. package/dist/src/capture/triage.d.ts +30 -0
  96. package/dist/src/capture/triage.d.ts.map +1 -0
  97. package/dist/src/capture/triage.js +50 -0
  98. package/dist/src/capture/triage.js.map +1 -0
  99. package/dist/src/capture/user-statements-recheck.d.ts +22 -0
  100. package/dist/src/capture/user-statements-recheck.d.ts.map +1 -0
  101. package/dist/src/capture/user-statements-recheck.js +181 -0
  102. package/dist/src/capture/user-statements-recheck.js.map +1 -0
  103. package/dist/src/capture/user-statements.d.ts +84 -0
  104. package/dist/src/capture/user-statements.d.ts.map +1 -0
  105. package/dist/src/capture/user-statements.js +617 -0
  106. package/dist/src/capture/user-statements.js.map +1 -0
  107. package/dist/src/cli/agent-homes.d.ts +15 -0
  108. package/dist/src/cli/agent-homes.d.ts.map +1 -0
  109. package/dist/src/cli/agent-homes.js +45 -0
  110. package/dist/src/cli/agent-homes.js.map +1 -0
  111. package/dist/src/cli/commands/backfill.d.ts +3 -0
  112. package/dist/src/cli/commands/backfill.d.ts.map +1 -0
  113. package/dist/src/cli/commands/backfill.js +1379 -0
  114. package/dist/src/cli/commands/backfill.js.map +1 -0
  115. package/dist/src/cli/commands/brief.d.ts +12 -0
  116. package/dist/src/cli/commands/brief.d.ts.map +1 -0
  117. package/dist/src/cli/commands/brief.js +131 -0
  118. package/dist/src/cli/commands/brief.js.map +1 -0
  119. package/dist/src/cli/commands/bulk-ingest.d.ts +3 -0
  120. package/dist/src/cli/commands/bulk-ingest.d.ts.map +1 -0
  121. package/dist/src/cli/commands/bulk-ingest.js +126 -0
  122. package/dist/src/cli/commands/bulk-ingest.js.map +1 -0
  123. package/dist/src/cli/commands/capture-recover.d.ts +40 -0
  124. package/dist/src/cli/commands/capture-recover.d.ts.map +1 -0
  125. package/dist/src/cli/commands/capture-recover.js +194 -0
  126. package/dist/src/cli/commands/capture-recover.js.map +1 -0
  127. package/dist/src/cli/commands/capture.d.ts +12 -0
  128. package/dist/src/cli/commands/capture.d.ts.map +1 -0
  129. package/dist/src/cli/commands/capture.js +304 -0
  130. package/dist/src/cli/commands/capture.js.map +1 -0
  131. package/dist/src/cli/commands/chunk-backfill.d.ts +13 -0
  132. package/dist/src/cli/commands/chunk-backfill.d.ts.map +1 -0
  133. package/dist/src/cli/commands/chunk-backfill.js +157 -0
  134. package/dist/src/cli/commands/chunk-backfill.js.map +1 -0
  135. package/dist/src/cli/commands/compact.d.ts +3 -0
  136. package/dist/src/cli/commands/compact.d.ts.map +1 -0
  137. package/dist/src/cli/commands/compact.js +70 -0
  138. package/dist/src/cli/commands/compact.js.map +1 -0
  139. package/dist/src/cli/commands/cursor-probe.d.ts +20 -0
  140. package/dist/src/cli/commands/cursor-probe.d.ts.map +1 -0
  141. package/dist/src/cli/commands/cursor-probe.js +162 -0
  142. package/dist/src/cli/commands/cursor-probe.js.map +1 -0
  143. package/dist/src/cli/commands/doctor.d.ts +6 -0
  144. package/dist/src/cli/commands/doctor.d.ts.map +1 -0
  145. package/dist/src/cli/commands/doctor.js +259 -0
  146. package/dist/src/cli/commands/doctor.js.map +1 -0
  147. package/dist/src/cli/commands/feedback.d.ts +34 -0
  148. package/dist/src/cli/commands/feedback.d.ts.map +1 -0
  149. package/dist/src/cli/commands/feedback.js +214 -0
  150. package/dist/src/cli/commands/feedback.js.map +1 -0
  151. package/dist/src/cli/commands/hooks-install.d.ts +66 -0
  152. package/dist/src/cli/commands/hooks-install.d.ts.map +1 -0
  153. package/dist/src/cli/commands/hooks-install.js +228 -0
  154. package/dist/src/cli/commands/hooks-install.js.map +1 -0
  155. package/dist/src/cli/commands/import.d.ts +19 -0
  156. package/dist/src/cli/commands/import.d.ts.map +1 -0
  157. package/dist/src/cli/commands/import.js +258 -0
  158. package/dist/src/cli/commands/import.js.map +1 -0
  159. package/dist/src/cli/commands/ingest.d.ts +3 -0
  160. package/dist/src/cli/commands/ingest.d.ts.map +1 -0
  161. package/dist/src/cli/commands/ingest.js +80 -0
  162. package/dist/src/cli/commands/ingest.js.map +1 -0
  163. package/dist/src/cli/commands/mcp-install.d.ts +65 -0
  164. package/dist/src/cli/commands/mcp-install.d.ts.map +1 -0
  165. package/dist/src/cli/commands/mcp-install.js +306 -0
  166. package/dist/src/cli/commands/mcp-install.js.map +1 -0
  167. package/dist/src/cli/commands/menubar.d.ts +127 -0
  168. package/dist/src/cli/commands/menubar.d.ts.map +1 -0
  169. package/dist/src/cli/commands/menubar.js +585 -0
  170. package/dist/src/cli/commands/menubar.js.map +1 -0
  171. package/dist/src/cli/commands/onboard-first-run.d.ts +5 -0
  172. package/dist/src/cli/commands/onboard-first-run.d.ts.map +1 -0
  173. package/dist/src/cli/commands/onboard-first-run.js +156 -0
  174. package/dist/src/cli/commands/onboard-first-run.js.map +1 -0
  175. package/dist/src/cli/commands/onboard.d.ts +336 -0
  176. package/dist/src/cli/commands/onboard.d.ts.map +1 -0
  177. package/dist/src/cli/commands/onboard.js +1873 -0
  178. package/dist/src/cli/commands/onboard.js.map +1 -0
  179. package/dist/src/cli/commands/rebuild.d.ts +12 -0
  180. package/dist/src/cli/commands/rebuild.d.ts.map +1 -0
  181. package/dist/src/cli/commands/rebuild.js +167 -0
  182. package/dist/src/cli/commands/rebuild.js.map +1 -0
  183. package/dist/src/cli/commands/reconcile.d.ts +3 -0
  184. package/dist/src/cli/commands/reconcile.d.ts.map +1 -0
  185. package/dist/src/cli/commands/reconcile.js +68 -0
  186. package/dist/src/cli/commands/reconcile.js.map +1 -0
  187. package/dist/src/cli/commands/reindex.d.ts +3 -0
  188. package/dist/src/cli/commands/reindex.d.ts.map +1 -0
  189. package/dist/src/cli/commands/reindex.js +66 -0
  190. package/dist/src/cli/commands/reindex.js.map +1 -0
  191. package/dist/src/cli/commands/review.d.ts +13 -0
  192. package/dist/src/cli/commands/review.d.ts.map +1 -0
  193. package/dist/src/cli/commands/review.js +401 -0
  194. package/dist/src/cli/commands/review.js.map +1 -0
  195. package/dist/src/cli/commands/save.d.ts +3 -0
  196. package/dist/src/cli/commands/save.d.ts.map +1 -0
  197. package/dist/src/cli/commands/save.js +111 -0
  198. package/dist/src/cli/commands/save.js.map +1 -0
  199. package/dist/src/cli/commands/search.d.ts +37 -0
  200. package/dist/src/cli/commands/search.d.ts.map +1 -0
  201. package/dist/src/cli/commands/search.js +118 -0
  202. package/dist/src/cli/commands/search.js.map +1 -0
  203. package/dist/src/cli/commands/setup.d.ts +30 -0
  204. package/dist/src/cli/commands/setup.d.ts.map +1 -0
  205. package/dist/src/cli/commands/setup.js +122 -0
  206. package/dist/src/cli/commands/setup.js.map +1 -0
  207. package/dist/src/cli/commands/stats.d.ts +3 -0
  208. package/dist/src/cli/commands/stats.d.ts.map +1 -0
  209. package/dist/src/cli/commands/stats.js +42 -0
  210. package/dist/src/cli/commands/stats.js.map +1 -0
  211. package/dist/src/cli/commands/status.d.ts +17 -0
  212. package/dist/src/cli/commands/status.d.ts.map +1 -0
  213. package/dist/src/cli/commands/status.js +206 -0
  214. package/dist/src/cli/commands/status.js.map +1 -0
  215. package/dist/src/cli/commands/token-issue.d.ts +3 -0
  216. package/dist/src/cli/commands/token-issue.d.ts.map +1 -0
  217. package/dist/src/cli/commands/token-issue.js +33 -0
  218. package/dist/src/cli/commands/token-issue.js.map +1 -0
  219. package/dist/src/cli/commands/triage.d.ts +3 -0
  220. package/dist/src/cli/commands/triage.d.ts.map +1 -0
  221. package/dist/src/cli/commands/triage.js +127 -0
  222. package/dist/src/cli/commands/triage.js.map +1 -0
  223. package/dist/src/cli/commands/uninstall.d.ts +85 -0
  224. package/dist/src/cli/commands/uninstall.d.ts.map +1 -0
  225. package/dist/src/cli/commands/uninstall.js +512 -0
  226. package/dist/src/cli/commands/uninstall.js.map +1 -0
  227. package/dist/src/cli/commands/update.d.ts +105 -0
  228. package/dist/src/cli/commands/update.d.ts.map +1 -0
  229. package/dist/src/cli/commands/update.js +559 -0
  230. package/dist/src/cli/commands/update.js.map +1 -0
  231. package/dist/src/cli/default-config-path.d.ts +15 -0
  232. package/dist/src/cli/default-config-path.d.ts.map +1 -0
  233. package/dist/src/cli/default-config-path.js +28 -0
  234. package/dist/src/cli/default-config-path.js.map +1 -0
  235. package/dist/src/cli/feedback/feedback-config.d.ts +67 -0
  236. package/dist/src/cli/feedback/feedback-config.d.ts.map +1 -0
  237. package/dist/src/cli/feedback/feedback-config.js +169 -0
  238. package/dist/src/cli/feedback/feedback-config.js.map +1 -0
  239. package/dist/src/cli/feedback/feedback-history.d.ts +11 -0
  240. package/dist/src/cli/feedback/feedback-history.d.ts.map +1 -0
  241. package/dist/src/cli/feedback/feedback-history.js +145 -0
  242. package/dist/src/cli/feedback/feedback-history.js.map +1 -0
  243. package/dist/src/cli/feedback/feedback-payload.d.ts +74 -0
  244. package/dist/src/cli/feedback/feedback-payload.d.ts.map +1 -0
  245. package/dist/src/cli/feedback/feedback-payload.js +10 -0
  246. package/dist/src/cli/feedback/feedback-payload.js.map +1 -0
  247. package/dist/src/cli/feedback/feedback-relay.d.ts +15 -0
  248. package/dist/src/cli/feedback/feedback-relay.d.ts.map +1 -0
  249. package/dist/src/cli/feedback/feedback-relay.js +47 -0
  250. package/dist/src/cli/feedback/feedback-relay.js.map +1 -0
  251. package/dist/src/cli/feedback/feedback-status.d.ts +11 -0
  252. package/dist/src/cli/feedback/feedback-status.d.ts.map +1 -0
  253. package/dist/src/cli/feedback/feedback-status.js +122 -0
  254. package/dist/src/cli/feedback/feedback-status.js.map +1 -0
  255. package/dist/src/cli/feedback/invite.d.ts +17 -0
  256. package/dist/src/cli/feedback/invite.d.ts.map +1 -0
  257. package/dist/src/cli/feedback/invite.js +73 -0
  258. package/dist/src/cli/feedback/invite.js.map +1 -0
  259. package/dist/src/cli/feedback/relay-secret-store.d.ts +32 -0
  260. package/dist/src/cli/feedback/relay-secret-store.d.ts.map +1 -0
  261. package/dist/src/cli/feedback/relay-secret-store.js +137 -0
  262. package/dist/src/cli/feedback/relay-secret-store.js.map +1 -0
  263. package/dist/src/cli/hooks-writers/claude-code-policy-script.d.ts +35 -0
  264. package/dist/src/cli/hooks-writers/claude-code-policy-script.d.ts.map +1 -0
  265. package/dist/src/cli/hooks-writers/claude-code-policy-script.js +122 -0
  266. package/dist/src/cli/hooks-writers/claude-code-policy-script.js.map +1 -0
  267. package/dist/src/cli/hooks-writers/claude-code.d.ts +63 -0
  268. package/dist/src/cli/hooks-writers/claude-code.d.ts.map +1 -0
  269. package/dist/src/cli/hooks-writers/claude-code.js +289 -0
  270. package/dist/src/cli/hooks-writers/claude-code.js.map +1 -0
  271. package/dist/src/cli/hooks-writers/codex.d.ts +16 -0
  272. package/dist/src/cli/hooks-writers/codex.d.ts.map +1 -0
  273. package/dist/src/cli/hooks-writers/codex.js +17 -0
  274. package/dist/src/cli/hooks-writers/codex.js.map +1 -0
  275. package/dist/src/cli/hooks-writers/errors.d.ts +16 -0
  276. package/dist/src/cli/hooks-writers/errors.d.ts.map +1 -0
  277. package/dist/src/cli/hooks-writers/errors.js +24 -0
  278. package/dist/src/cli/hooks-writers/errors.js.map +1 -0
  279. package/dist/src/cli/hooks-writers/index.d.ts +23 -0
  280. package/dist/src/cli/hooks-writers/index.d.ts.map +1 -0
  281. package/dist/src/cli/hooks-writers/index.js +34 -0
  282. package/dist/src/cli/hooks-writers/index.js.map +1 -0
  283. package/dist/src/cli/hooks-writers/state.d.ts +43 -0
  284. package/dist/src/cli/hooks-writers/state.d.ts.map +1 -0
  285. package/dist/src/cli/hooks-writers/state.js +225 -0
  286. package/dist/src/cli/hooks-writers/state.js.map +1 -0
  287. package/dist/src/cli/hooks-writers/types.d.ts +28 -0
  288. package/dist/src/cli/hooks-writers/types.d.ts.map +1 -0
  289. package/dist/src/cli/hooks-writers/types.js +8 -0
  290. package/dist/src/cli/hooks-writers/types.js.map +1 -0
  291. package/dist/src/cli/http-client.d.ts +128 -0
  292. package/dist/src/cli/http-client.d.ts.map +1 -0
  293. package/dist/src/cli/http-client.js +401 -0
  294. package/dist/src/cli/http-client.js.map +1 -0
  295. package/dist/src/cli/index.d.ts +4 -0
  296. package/dist/src/cli/index.d.ts.map +1 -0
  297. package/dist/src/cli/index.js +99 -0
  298. package/dist/src/cli/index.js.map +1 -0
  299. package/dist/src/cli/job-poller.d.ts +13 -0
  300. package/dist/src/cli/job-poller.d.ts.map +1 -0
  301. package/dist/src/cli/job-poller.js +29 -0
  302. package/dist/src/cli/job-poller.js.map +1 -0
  303. package/dist/src/cli/mcp-config-writers/codex-toml.d.ts +20 -0
  304. package/dist/src/cli/mcp-config-writers/codex-toml.d.ts.map +1 -0
  305. package/dist/src/cli/mcp-config-writers/codex-toml.js +918 -0
  306. package/dist/src/cli/mcp-config-writers/codex-toml.js.map +1 -0
  307. package/dist/src/cli/mcp-config-writers/earlier-name-restrictions.d.ts +11 -0
  308. package/dist/src/cli/mcp-config-writers/earlier-name-restrictions.d.ts.map +1 -0
  309. package/dist/src/cli/mcp-config-writers/earlier-name-restrictions.js +152 -0
  310. package/dist/src/cli/mcp-config-writers/earlier-name-restrictions.js.map +1 -0
  311. package/dist/src/cli/mcp-config-writers/errors.d.ts +17 -0
  312. package/dist/src/cli/mcp-config-writers/errors.d.ts.map +1 -0
  313. package/dist/src/cli/mcp-config-writers/errors.js +13 -0
  314. package/dist/src/cli/mcp-config-writers/errors.js.map +1 -0
  315. package/dist/src/cli/mcp-config-writers/index.d.ts +28 -0
  316. package/dist/src/cli/mcp-config-writers/index.d.ts.map +1 -0
  317. package/dist/src/cli/mcp-config-writers/index.js +70 -0
  318. package/dist/src/cli/mcp-config-writers/index.js.map +1 -0
  319. package/dist/src/cli/mcp-config-writers/json-config.d.ts +20 -0
  320. package/dist/src/cli/mcp-config-writers/json-config.d.ts.map +1 -0
  321. package/dist/src/cli/mcp-config-writers/json-config.js +301 -0
  322. package/dist/src/cli/mcp-config-writers/json-config.js.map +1 -0
  323. package/dist/src/cli/mcp-config-writers/left-in-folder.d.ts +18 -0
  324. package/dist/src/cli/mcp-config-writers/left-in-folder.d.ts.map +1 -0
  325. package/dist/src/cli/mcp-config-writers/left-in-folder.js +140 -0
  326. package/dist/src/cli/mcp-config-writers/left-in-folder.js.map +1 -0
  327. package/dist/src/cli/mcp-config-writers/redact.d.ts +28 -0
  328. package/dist/src/cli/mcp-config-writers/redact.d.ts.map +1 -0
  329. package/dist/src/cli/mcp-config-writers/redact.js +48 -0
  330. package/dist/src/cli/mcp-config-writers/redact.js.map +1 -0
  331. package/dist/src/cli/mcp-config-writers/types.d.ts +46 -0
  332. package/dist/src/cli/mcp-config-writers/types.d.ts.map +1 -0
  333. package/dist/src/cli/mcp-config-writers/types.js +5 -0
  334. package/dist/src/cli/mcp-config-writers/types.js.map +1 -0
  335. package/dist/src/cli/output.d.ts +8 -0
  336. package/dist/src/cli/output.d.ts.map +1 -0
  337. package/dist/src/cli/output.js +34 -0
  338. package/dist/src/cli/output.js.map +1 -0
  339. package/dist/src/cli/postinstall-menubar.d.ts +38 -0
  340. package/dist/src/cli/postinstall-menubar.d.ts.map +1 -0
  341. package/dist/src/cli/postinstall-menubar.js +139 -0
  342. package/dist/src/cli/postinstall-menubar.js.map +1 -0
  343. package/dist/src/cli/status/friend-header.d.ts +61 -0
  344. package/dist/src/cli/status/friend-header.d.ts.map +1 -0
  345. package/dist/src/cli/status/friend-header.js +727 -0
  346. package/dist/src/cli/status/friend-header.js.map +1 -0
  347. package/dist/src/cli/status/local-signals.d.ts +89 -0
  348. package/dist/src/cli/status/local-signals.d.ts.map +1 -0
  349. package/dist/src/cli/status/local-signals.js +194 -0
  350. package/dist/src/cli/status/local-signals.js.map +1 -0
  351. package/dist/src/cli/token.d.ts +37 -0
  352. package/dist/src/cli/token.d.ts.map +1 -0
  353. package/dist/src/cli/token.js +105 -0
  354. package/dist/src/cli/token.js.map +1 -0
  355. package/dist/src/cli/ui.d.ts +47 -0
  356. package/dist/src/cli/ui.d.ts.map +1 -0
  357. package/dist/src/cli/ui.js +166 -0
  358. package/dist/src/cli/ui.js.map +1 -0
  359. package/dist/src/cli/uninstall/mcp-uninstall.d.ts +33 -0
  360. package/dist/src/cli/uninstall/mcp-uninstall.d.ts.map +1 -0
  361. package/dist/src/cli/uninstall/mcp-uninstall.js +116 -0
  362. package/dist/src/cli/uninstall/mcp-uninstall.js.map +1 -0
  363. package/dist/src/config/loader.d.ts +9 -0
  364. package/dist/src/config/loader.d.ts.map +1 -0
  365. package/dist/src/config/loader.js +73 -0
  366. package/dist/src/config/loader.js.map +1 -0
  367. package/dist/src/config/schema.d.ts +956 -0
  368. package/dist/src/config/schema.d.ts.map +1 -0
  369. package/dist/src/config/schema.js +339 -0
  370. package/dist/src/config/schema.js.map +1 -0
  371. package/dist/src/diagnostics/claude-preflight.d.ts +35 -0
  372. package/dist/src/diagnostics/claude-preflight.d.ts.map +1 -0
  373. package/dist/src/diagnostics/claude-preflight.js +90 -0
  374. package/dist/src/diagnostics/claude-preflight.js.map +1 -0
  375. package/dist/src/diagnostics/codex-preflight.d.ts +43 -0
  376. package/dist/src/diagnostics/codex-preflight.d.ts.map +1 -0
  377. package/dist/src/diagnostics/codex-preflight.js +128 -0
  378. package/dist/src/diagnostics/codex-preflight.js.map +1 -0
  379. package/dist/src/diagnostics/doctor.d.ts +125 -0
  380. package/dist/src/diagnostics/doctor.d.ts.map +1 -0
  381. package/dist/src/diagnostics/doctor.js +450 -0
  382. package/dist/src/diagnostics/doctor.js.map +1 -0
  383. package/dist/src/diagnostics/install-layout.d.ts +40 -0
  384. package/dist/src/diagnostics/install-layout.d.ts.map +1 -0
  385. package/dist/src/diagnostics/install-layout.js +55 -0
  386. package/dist/src/diagnostics/install-layout.js.map +1 -0
  387. package/dist/src/diagnostics/memory-coverage.d.ts +54 -0
  388. package/dist/src/diagnostics/memory-coverage.d.ts.map +1 -0
  389. package/dist/src/diagnostics/memory-coverage.js +272 -0
  390. package/dist/src/diagnostics/memory-coverage.js.map +1 -0
  391. package/dist/src/diagnostics/notify.d.ts +107 -0
  392. package/dist/src/diagnostics/notify.d.ts.map +1 -0
  393. package/dist/src/diagnostics/notify.js +217 -0
  394. package/dist/src/diagnostics/notify.js.map +1 -0
  395. package/dist/src/diagnostics/repair-prompt.d.ts +49 -0
  396. package/dist/src/diagnostics/repair-prompt.d.ts.map +1 -0
  397. package/dist/src/diagnostics/repair-prompt.js +223 -0
  398. package/dist/src/diagnostics/repair-prompt.js.map +1 -0
  399. package/dist/src/ingestion/bulk-ingest.d.ts +11 -0
  400. package/dist/src/ingestion/bulk-ingest.d.ts.map +1 -0
  401. package/dist/src/ingestion/bulk-ingest.js +11 -0
  402. package/dist/src/ingestion/bulk-ingest.js.map +1 -0
  403. package/dist/src/ingestion/chunk-meta.d.ts +85 -0
  404. package/dist/src/ingestion/chunk-meta.d.ts.map +1 -0
  405. package/dist/src/ingestion/chunk-meta.js +167 -0
  406. package/dist/src/ingestion/chunk-meta.js.map +1 -0
  407. package/dist/src/ingestion/chunk-text.d.ts +39 -0
  408. package/dist/src/ingestion/chunk-text.d.ts.map +1 -0
  409. package/dist/src/ingestion/chunk-text.js +114 -0
  410. package/dist/src/ingestion/chunk-text.js.map +1 -0
  411. package/dist/src/ingestion/cursor/cursor-store.d.ts +177 -0
  412. package/dist/src/ingestion/cursor/cursor-store.d.ts.map +1 -0
  413. package/dist/src/ingestion/cursor/cursor-store.js +242 -0
  414. package/dist/src/ingestion/cursor/cursor-store.js.map +1 -0
  415. package/dist/src/ingestion/cursor/enrich-roots.d.ts +16 -0
  416. package/dist/src/ingestion/cursor/enrich-roots.d.ts.map +1 -0
  417. package/dist/src/ingestion/cursor/enrich-roots.js +22 -0
  418. package/dist/src/ingestion/cursor/enrich-roots.js.map +1 -0
  419. package/dist/src/ingestion/cursor/vscdb-reader.d.ts +32 -0
  420. package/dist/src/ingestion/cursor/vscdb-reader.d.ts.map +1 -0
  421. package/dist/src/ingestion/cursor/vscdb-reader.js +113 -0
  422. package/dist/src/ingestion/cursor/vscdb-reader.js.map +1 -0
  423. package/dist/src/ingestion/cursor/workspace-root.d.ts +96 -0
  424. package/dist/src/ingestion/cursor/workspace-root.d.ts.map +1 -0
  425. package/dist/src/ingestion/cursor/workspace-root.js +187 -0
  426. package/dist/src/ingestion/cursor/workspace-root.js.map +1 -0
  427. package/dist/src/ingestion/extractor.d.ts +16 -0
  428. package/dist/src/ingestion/extractor.d.ts.map +1 -0
  429. package/dist/src/ingestion/extractor.js +85 -0
  430. package/dist/src/ingestion/extractor.js.map +1 -0
  431. package/dist/src/ingestion/extractors/docx.d.ts +3 -0
  432. package/dist/src/ingestion/extractors/docx.d.ts.map +1 -0
  433. package/dist/src/ingestion/extractors/docx.js +20 -0
  434. package/dist/src/ingestion/extractors/docx.js.map +1 -0
  435. package/dist/src/ingestion/extractors/pdf.d.ts +3 -0
  436. package/dist/src/ingestion/extractors/pdf.d.ts.map +1 -0
  437. package/dist/src/ingestion/extractors/pdf.js +32 -0
  438. package/dist/src/ingestion/extractors/pdf.js.map +1 -0
  439. package/dist/src/ingestion/historical-campaign.d.ts +340 -0
  440. package/dist/src/ingestion/historical-campaign.d.ts.map +1 -0
  441. package/dist/src/ingestion/historical-campaign.js +1010 -0
  442. package/dist/src/ingestion/historical-campaign.js.map +1 -0
  443. package/dist/src/ingestion/ignored-paths.d.ts +20 -0
  444. package/dist/src/ingestion/ignored-paths.d.ts.map +1 -0
  445. package/dist/src/ingestion/ignored-paths.js +45 -0
  446. package/dist/src/ingestion/ignored-paths.js.map +1 -0
  447. package/dist/src/ingestion/inbox-core/conversation-fingerprint.d.ts +2 -0
  448. package/dist/src/ingestion/inbox-core/conversation-fingerprint.d.ts.map +1 -0
  449. package/dist/src/ingestion/inbox-core/conversation-fingerprint.js +27 -0
  450. package/dist/src/ingestion/inbox-core/conversation-fingerprint.js.map +1 -0
  451. package/dist/src/ingestion/inbox-core/conversation-key.d.ts +2 -0
  452. package/dist/src/ingestion/inbox-core/conversation-key.d.ts.map +1 -0
  453. package/dist/src/ingestion/inbox-core/conversation-key.js +31 -0
  454. package/dist/src/ingestion/inbox-core/conversation-key.js.map +1 -0
  455. package/dist/src/ingestion/inbox-core/extensions.d.ts +3 -0
  456. package/dist/src/ingestion/inbox-core/extensions.d.ts.map +1 -0
  457. package/dist/src/ingestion/inbox-core/extensions.js +16 -0
  458. package/dist/src/ingestion/inbox-core/extensions.js.map +1 -0
  459. package/dist/src/ingestion/inbox-core/idempotency.d.ts +2 -0
  460. package/dist/src/ingestion/inbox-core/idempotency.d.ts.map +1 -0
  461. package/dist/src/ingestion/inbox-core/idempotency.js +22 -0
  462. package/dist/src/ingestion/inbox-core/idempotency.js.map +1 -0
  463. package/dist/src/ingestion/inbox-core/index.d.ts +20 -0
  464. package/dist/src/ingestion/inbox-core/index.d.ts.map +1 -0
  465. package/dist/src/ingestion/inbox-core/index.js +20 -0
  466. package/dist/src/ingestion/inbox-core/index.js.map +1 -0
  467. package/dist/src/ingestion/inbox-core/source-detection.d.ts +2 -0
  468. package/dist/src/ingestion/inbox-core/source-detection.d.ts.map +1 -0
  469. package/dist/src/ingestion/inbox-core/source-detection.js +23 -0
  470. package/dist/src/ingestion/inbox-core/source-detection.js.map +1 -0
  471. package/dist/src/ingestion/inbox-core/source-sniffer.d.ts +11 -0
  472. package/dist/src/ingestion/inbox-core/source-sniffer.d.ts.map +1 -0
  473. package/dist/src/ingestion/inbox-core/source-sniffer.js +69 -0
  474. package/dist/src/ingestion/inbox-core/source-sniffer.js.map +1 -0
  475. package/dist/src/ingestion/inbox-core/zip-sniffer.d.ts +70 -0
  476. package/dist/src/ingestion/inbox-core/zip-sniffer.d.ts.map +1 -0
  477. package/dist/src/ingestion/inbox-core/zip-sniffer.js +161 -0
  478. package/dist/src/ingestion/inbox-core/zip-sniffer.js.map +1 -0
  479. package/dist/src/ingestion/inbox-watcher.d.ts +12 -0
  480. package/dist/src/ingestion/inbox-watcher.d.ts.map +1 -0
  481. package/dist/src/ingestion/inbox-watcher.js +83 -0
  482. package/dist/src/ingestion/inbox-watcher.js.map +1 -0
  483. package/dist/src/ingestion/indexer.d.ts +39 -0
  484. package/dist/src/ingestion/indexer.d.ts.map +1 -0
  485. package/dist/src/ingestion/indexer.js +111 -0
  486. package/dist/src/ingestion/indexer.js.map +1 -0
  487. package/dist/src/ingestion/metadata-extraction.d.ts +56 -0
  488. package/dist/src/ingestion/metadata-extraction.d.ts.map +1 -0
  489. package/dist/src/ingestion/metadata-extraction.js +151 -0
  490. package/dist/src/ingestion/metadata-extraction.js.map +1 -0
  491. package/dist/src/ingestion/parsers/chatgpt-web.d.ts +29 -0
  492. package/dist/src/ingestion/parsers/chatgpt-web.d.ts.map +1 -0
  493. package/dist/src/ingestion/parsers/chatgpt-web.js +100 -0
  494. package/dist/src/ingestion/parsers/chatgpt-web.js.map +1 -0
  495. package/dist/src/ingestion/parsers/claude-code-jsonl.d.ts +26 -0
  496. package/dist/src/ingestion/parsers/claude-code-jsonl.d.ts.map +1 -0
  497. package/dist/src/ingestion/parsers/claude-code-jsonl.js +125 -0
  498. package/dist/src/ingestion/parsers/claude-code-jsonl.js.map +1 -0
  499. package/dist/src/ingestion/parsers/claude-desktop-sessions.d.ts +17 -0
  500. package/dist/src/ingestion/parsers/claude-desktop-sessions.d.ts.map +1 -0
  501. package/dist/src/ingestion/parsers/claude-desktop-sessions.js +112 -0
  502. package/dist/src/ingestion/parsers/claude-desktop-sessions.js.map +1 -0
  503. package/dist/src/ingestion/parsers/claude-web.d.ts +24 -0
  504. package/dist/src/ingestion/parsers/claude-web.d.ts.map +1 -0
  505. package/dist/src/ingestion/parsers/claude-web.js +75 -0
  506. package/dist/src/ingestion/parsers/claude-web.js.map +1 -0
  507. package/dist/src/ingestion/parsers/codex-jsonl.d.ts +18 -0
  508. package/dist/src/ingestion/parsers/codex-jsonl.d.ts.map +1 -0
  509. package/dist/src/ingestion/parsers/codex-jsonl.js +150 -0
  510. package/dist/src/ingestion/parsers/codex-jsonl.js.map +1 -0
  511. package/dist/src/ingestion/parsers/gemini-web.d.ts +16 -0
  512. package/dist/src/ingestion/parsers/gemini-web.d.ts.map +1 -0
  513. package/dist/src/ingestion/parsers/gemini-web.js +170 -0
  514. package/dist/src/ingestion/parsers/gemini-web.js.map +1 -0
  515. package/dist/src/ingestion/parsers/grok-cli.d.ts +19 -0
  516. package/dist/src/ingestion/parsers/grok-cli.d.ts.map +1 -0
  517. package/dist/src/ingestion/parsers/grok-cli.js +126 -0
  518. package/dist/src/ingestion/parsers/grok-cli.js.map +1 -0
  519. package/dist/src/ingestion/parsers/grok-web.d.ts +40 -0
  520. package/dist/src/ingestion/parsers/grok-web.d.ts.map +1 -0
  521. package/dist/src/ingestion/parsers/grok-web.js +67 -0
  522. package/dist/src/ingestion/parsers/grok-web.js.map +1 -0
  523. package/dist/src/ingestion/parsers/turns.d.ts +36 -0
  524. package/dist/src/ingestion/parsers/turns.d.ts.map +1 -0
  525. package/dist/src/ingestion/parsers/turns.js +25 -0
  526. package/dist/src/ingestion/parsers/turns.js.map +1 -0
  527. package/dist/src/ingestion/parsers/types.d.ts +47 -0
  528. package/dist/src/ingestion/parsers/types.d.ts.map +1 -0
  529. package/dist/src/ingestion/parsers/types.js +26 -0
  530. package/dist/src/ingestion/parsers/types.js.map +1 -0
  531. package/dist/src/ingestion/report-cards.d.ts +75 -0
  532. package/dist/src/ingestion/report-cards.d.ts.map +1 -0
  533. package/dist/src/ingestion/report-cards.js +224 -0
  534. package/dist/src/ingestion/report-cards.js.map +1 -0
  535. package/dist/src/ingestion/scanner.d.ts +48 -0
  536. package/dist/src/ingestion/scanner.d.ts.map +1 -0
  537. package/dist/src/ingestion/scanner.js +131 -0
  538. package/dist/src/ingestion/scanner.js.map +1 -0
  539. package/dist/src/ingestion/skip-quarantine.d.ts +10 -0
  540. package/dist/src/ingestion/skip-quarantine.d.ts.map +1 -0
  541. package/dist/src/ingestion/skip-quarantine.js +35 -0
  542. package/dist/src/ingestion/skip-quarantine.js.map +1 -0
  543. package/dist/src/ingestion/staging.d.ts +109 -0
  544. package/dist/src/ingestion/staging.d.ts.map +1 -0
  545. package/dist/src/ingestion/staging.js +411 -0
  546. package/dist/src/ingestion/staging.js.map +1 -0
  547. package/dist/src/ingestion/watcher.d.ts +65 -0
  548. package/dist/src/ingestion/watcher.d.ts.map +1 -0
  549. package/dist/src/ingestion/watcher.js +182 -0
  550. package/dist/src/ingestion/watcher.js.map +1 -0
  551. package/dist/src/jobs/codex-override-handler.d.ts +3 -0
  552. package/dist/src/jobs/codex-override-handler.d.ts.map +1 -0
  553. package/dist/src/jobs/codex-override-handler.js +16 -0
  554. package/dist/src/jobs/codex-override-handler.js.map +1 -0
  555. package/dist/src/jobs/handlers/compact.d.ts +30 -0
  556. package/dist/src/jobs/handlers/compact.d.ts.map +1 -0
  557. package/dist/src/jobs/handlers/compact.js +360 -0
  558. package/dist/src/jobs/handlers/compact.js.map +1 -0
  559. package/dist/src/jobs/handlers/dedupe-conversations.d.ts +134 -0
  560. package/dist/src/jobs/handlers/dedupe-conversations.d.ts.map +1 -0
  561. package/dist/src/jobs/handlers/dedupe-conversations.js +371 -0
  562. package/dist/src/jobs/handlers/dedupe-conversations.js.map +1 -0
  563. package/dist/src/jobs/handlers/ingest.d.ts +13 -0
  564. package/dist/src/jobs/handlers/ingest.d.ts.map +1 -0
  565. package/dist/src/jobs/handlers/ingest.js +557 -0
  566. package/dist/src/jobs/handlers/ingest.js.map +1 -0
  567. package/dist/src/jobs/handlers/optimize.d.ts +11 -0
  568. package/dist/src/jobs/handlers/optimize.d.ts.map +1 -0
  569. package/dist/src/jobs/handlers/optimize.js +12 -0
  570. package/dist/src/jobs/handlers/optimize.js.map +1 -0
  571. package/dist/src/jobs/handlers/reconcile.d.ts +57 -0
  572. package/dist/src/jobs/handlers/reconcile.d.ts.map +1 -0
  573. package/dist/src/jobs/handlers/reconcile.js +685 -0
  574. package/dist/src/jobs/handlers/reconcile.js.map +1 -0
  575. package/dist/src/jobs/handlers/reindex.d.ts +38 -0
  576. package/dist/src/jobs/handlers/reindex.d.ts.map +1 -0
  577. package/dist/src/jobs/handlers/reindex.js +63 -0
  578. package/dist/src/jobs/handlers/reindex.js.map +1 -0
  579. package/dist/src/jobs/handlers/save.d.ts +10 -0
  580. package/dist/src/jobs/handlers/save.d.ts.map +1 -0
  581. package/dist/src/jobs/handlers/save.js +316 -0
  582. package/dist/src/jobs/handlers/save.js.map +1 -0
  583. package/dist/src/jobs/handlers/triage.d.ts +47 -0
  584. package/dist/src/jobs/handlers/triage.d.ts.map +1 -0
  585. package/dist/src/jobs/handlers/triage.js +95 -0
  586. package/dist/src/jobs/handlers/triage.js.map +1 -0
  587. package/dist/src/jobs/maintenance-scheduler.d.ts +30 -0
  588. package/dist/src/jobs/maintenance-scheduler.d.ts.map +1 -0
  589. package/dist/src/jobs/maintenance-scheduler.js +41 -0
  590. package/dist/src/jobs/maintenance-scheduler.js.map +1 -0
  591. package/dist/src/jobs/queue.d.ts +157 -0
  592. package/dist/src/jobs/queue.d.ts.map +1 -0
  593. package/dist/src/jobs/queue.js +759 -0
  594. package/dist/src/jobs/queue.js.map +1 -0
  595. package/dist/src/jobs/types.d.ts +53 -0
  596. package/dist/src/jobs/types.d.ts.map +1 -0
  597. package/dist/src/jobs/types.js +33 -0
  598. package/dist/src/jobs/types.js.map +1 -0
  599. package/dist/src/jobs/worker-entry.d.ts +10 -0
  600. package/dist/src/jobs/worker-entry.d.ts.map +1 -0
  601. package/dist/src/jobs/worker-entry.js +252 -0
  602. package/dist/src/jobs/worker-entry.js.map +1 -0
  603. package/dist/src/jobs/worker-process.d.ts +67 -0
  604. package/dist/src/jobs/worker-process.d.ts.map +1 -0
  605. package/dist/src/jobs/worker-process.js +227 -0
  606. package/dist/src/jobs/worker-process.js.map +1 -0
  607. package/dist/src/jobs/worker.d.ts +11 -0
  608. package/dist/src/jobs/worker.d.ts.map +1 -0
  609. package/dist/src/jobs/worker.js +14 -0
  610. package/dist/src/jobs/worker.js.map +1 -0
  611. package/dist/src/main.d.ts +2 -0
  612. package/dist/src/main.d.ts.map +1 -0
  613. package/dist/src/main.js +683 -0
  614. package/dist/src/main.js.map +1 -0
  615. package/dist/src/mcp/capture-diagnostics.d.ts +51 -0
  616. package/dist/src/mcp/capture-diagnostics.d.ts.map +1 -0
  617. package/dist/src/mcp/capture-diagnostics.js +127 -0
  618. package/dist/src/mcp/capture-diagnostics.js.map +1 -0
  619. package/dist/src/mcp/errors.d.ts +8 -0
  620. package/dist/src/mcp/errors.d.ts.map +1 -0
  621. package/dist/src/mcp/errors.js +69 -0
  622. package/dist/src/mcp/errors.js.map +1 -0
  623. package/dist/src/mcp/memory-diagnostics.d.ts +6 -0
  624. package/dist/src/mcp/memory-diagnostics.d.ts.map +1 -0
  625. package/dist/src/mcp/memory-diagnostics.js +51 -0
  626. package/dist/src/mcp/memory-diagnostics.js.map +1 -0
  627. package/dist/src/mcp/names.d.ts +48 -0
  628. package/dist/src/mcp/names.d.ts.map +1 -0
  629. package/dist/src/mcp/names.js +77 -0
  630. package/dist/src/mcp/names.js.map +1 -0
  631. package/dist/src/mcp/server.d.ts +19 -0
  632. package/dist/src/mcp/server.d.ts.map +1 -0
  633. package/dist/src/mcp/server.js +184 -0
  634. package/dist/src/mcp/server.js.map +1 -0
  635. package/dist/src/mcp/stdio.d.ts +2 -0
  636. package/dist/src/mcp/stdio.d.ts.map +1 -0
  637. package/dist/src/mcp/stdio.js +8 -0
  638. package/dist/src/mcp/stdio.js.map +1 -0
  639. package/dist/src/mcp/tools/context-pack.d.ts +35 -0
  640. package/dist/src/mcp/tools/context-pack.d.ts.map +1 -0
  641. package/dist/src/mcp/tools/context-pack.js +279 -0
  642. package/dist/src/mcp/tools/context-pack.js.map +1 -0
  643. package/dist/src/mcp/tools/conversations-search.d.ts +38 -0
  644. package/dist/src/mcp/tools/conversations-search.d.ts.map +1 -0
  645. package/dist/src/mcp/tools/conversations-search.js +79 -0
  646. package/dist/src/mcp/tools/conversations-search.js.map +1 -0
  647. package/dist/src/mcp/tools/evidence-feedback.d.ts +60 -0
  648. package/dist/src/mcp/tools/evidence-feedback.d.ts.map +1 -0
  649. package/dist/src/mcp/tools/evidence-feedback.js +62 -0
  650. package/dist/src/mcp/tools/evidence-feedback.js.map +1 -0
  651. package/dist/src/mcp/tools/log-outcome.d.ts +72 -0
  652. package/dist/src/mcp/tools/log-outcome.d.ts.map +1 -0
  653. package/dist/src/mcp/tools/log-outcome.js +59 -0
  654. package/dist/src/mcp/tools/log-outcome.js.map +1 -0
  655. package/dist/src/mcp/tools/open-evidence.d.ts +37 -0
  656. package/dist/src/mcp/tools/open-evidence.d.ts.map +1 -0
  657. package/dist/src/mcp/tools/open-evidence.js +72 -0
  658. package/dist/src/mcp/tools/open-evidence.js.map +1 -0
  659. package/dist/src/mcp/tools/save.d.ts +37 -0
  660. package/dist/src/mcp/tools/save.d.ts.map +1 -0
  661. package/dist/src/mcp/tools/save.js +65 -0
  662. package/dist/src/mcp/tools/save.js.map +1 -0
  663. package/dist/src/mcp/tools/search.d.ts +37 -0
  664. package/dist/src/mcp/tools/search.d.ts.map +1 -0
  665. package/dist/src/mcp/tools/search.js +95 -0
  666. package/dist/src/mcp/tools/search.js.map +1 -0
  667. package/dist/src/mcp/tools/status.d.ts +31 -0
  668. package/dist/src/mcp/tools/status.d.ts.map +1 -0
  669. package/dist/src/mcp/tools/status.js +63 -0
  670. package/dist/src/mcp/tools/status.js.map +1 -0
  671. package/dist/src/observability/coverage.d.ts +100 -0
  672. package/dist/src/observability/coverage.d.ts.map +1 -0
  673. package/dist/src/observability/coverage.js +178 -0
  674. package/dist/src/observability/coverage.js.map +1 -0
  675. package/dist/src/observability/embedding-events.d.ts +52 -0
  676. package/dist/src/observability/embedding-events.d.ts.map +1 -0
  677. package/dist/src/observability/embedding-events.js +149 -0
  678. package/dist/src/observability/embedding-events.js.map +1 -0
  679. package/dist/src/observability/index-events.d.ts +70 -0
  680. package/dist/src/observability/index-events.d.ts.map +1 -0
  681. package/dist/src/observability/index-events.js +148 -0
  682. package/dist/src/observability/index-events.js.map +1 -0
  683. package/dist/src/observability/onboarding-metric.d.ts +131 -0
  684. package/dist/src/observability/onboarding-metric.d.ts.map +1 -0
  685. package/dist/src/observability/onboarding-metric.js +352 -0
  686. package/dist/src/observability/onboarding-metric.js.map +1 -0
  687. package/dist/src/observability/retrieval-feedback.d.ts +82 -0
  688. package/dist/src/observability/retrieval-feedback.d.ts.map +1 -0
  689. package/dist/src/observability/retrieval-feedback.js +231 -0
  690. package/dist/src/observability/retrieval-feedback.js.map +1 -0
  691. package/dist/src/observability/rift-context.d.ts +53 -0
  692. package/dist/src/observability/rift-context.d.ts.map +1 -0
  693. package/dist/src/observability/rift-context.js +141 -0
  694. package/dist/src/observability/rift-context.js.map +1 -0
  695. package/dist/src/observability/staleness.d.ts +43 -0
  696. package/dist/src/observability/staleness.d.ts.map +1 -0
  697. package/dist/src/observability/staleness.js +74 -0
  698. package/dist/src/observability/staleness.js.map +1 -0
  699. package/dist/src/observability/tool-usage-stats.d.ts +139 -0
  700. package/dist/src/observability/tool-usage-stats.d.ts.map +1 -0
  701. package/dist/src/observability/tool-usage-stats.js +245 -0
  702. package/dist/src/observability/tool-usage-stats.js.map +1 -0
  703. package/dist/src/observability/tool-usage.d.ts +231 -0
  704. package/dist/src/observability/tool-usage.d.ts.map +1 -0
  705. package/dist/src/observability/tool-usage.js +489 -0
  706. package/dist/src/observability/tool-usage.js.map +1 -0
  707. package/dist/src/observability/version-check.d.ts +75 -0
  708. package/dist/src/observability/version-check.d.ts.map +1 -0
  709. package/dist/src/observability/version-check.js +198 -0
  710. package/dist/src/observability/version-check.js.map +1 -0
  711. package/dist/src/onboarding/capture-switch.d.ts +20 -0
  712. package/dist/src/onboarding/capture-switch.d.ts.map +1 -0
  713. package/dist/src/onboarding/capture-switch.js +52 -0
  714. package/dist/src/onboarding/capture-switch.js.map +1 -0
  715. package/dist/src/onboarding/daemon-control.d.ts +33 -0
  716. package/dist/src/onboarding/daemon-control.d.ts.map +1 -0
  717. package/dist/src/onboarding/daemon-control.js +92 -0
  718. package/dist/src/onboarding/daemon-control.js.map +1 -0
  719. package/dist/src/onboarding/env-file.d.ts +18 -0
  720. package/dist/src/onboarding/env-file.d.ts.map +1 -0
  721. package/dist/src/onboarding/env-file.js +89 -0
  722. package/dist/src/onboarding/env-file.js.map +1 -0
  723. package/dist/src/onboarding/search-by-meaning.d.ts +35 -0
  724. package/dist/src/onboarding/search-by-meaning.d.ts.map +1 -0
  725. package/dist/src/onboarding/search-by-meaning.js +163 -0
  726. package/dist/src/onboarding/search-by-meaning.js.map +1 -0
  727. package/dist/src/onboarding/setup-page.d.ts +7 -0
  728. package/dist/src/onboarding/setup-page.d.ts.map +1 -0
  729. package/dist/src/onboarding/setup-page.js +823 -0
  730. package/dist/src/onboarding/setup-page.js.map +1 -0
  731. package/dist/src/onboarding/setup-session.d.ts +22 -0
  732. package/dist/src/onboarding/setup-session.d.ts.map +1 -0
  733. package/dist/src/onboarding/setup-session.js +80 -0
  734. package/dist/src/onboarding/setup-session.js.map +1 -0
  735. package/dist/src/onboarding/setup-state.d.ts +117 -0
  736. package/dist/src/onboarding/setup-state.d.ts.map +1 -0
  737. package/dist/src/onboarding/setup-state.js +267 -0
  738. package/dist/src/onboarding/setup-state.js.map +1 -0
  739. package/dist/src/onboarding/voyage-validate.d.ts +22 -0
  740. package/dist/src/onboarding/voyage-validate.d.ts.map +1 -0
  741. package/dist/src/onboarding/voyage-validate.js +96 -0
  742. package/dist/src/onboarding/voyage-validate.js.map +1 -0
  743. package/dist/src/providers/anthropic-digest.d.ts +23 -0
  744. package/dist/src/providers/anthropic-digest.d.ts.map +1 -0
  745. package/dist/src/providers/anthropic-digest.js +91 -0
  746. package/dist/src/providers/anthropic-digest.js.map +1 -0
  747. package/dist/src/providers/basic-metadata-extraction.d.ts +60 -0
  748. package/dist/src/providers/basic-metadata-extraction.d.ts.map +1 -0
  749. package/dist/src/providers/basic-metadata-extraction.js +114 -0
  750. package/dist/src/providers/basic-metadata-extraction.js.map +1 -0
  751. package/dist/src/providers/claude-cli-metadata-extraction.d.ts +47 -0
  752. package/dist/src/providers/claude-cli-metadata-extraction.d.ts.map +1 -0
  753. package/dist/src/providers/claude-cli-metadata-extraction.js +130 -0
  754. package/dist/src/providers/claude-cli-metadata-extraction.js.map +1 -0
  755. package/dist/src/providers/claude-cli-runner.d.ts +92 -0
  756. package/dist/src/providers/claude-cli-runner.d.ts.map +1 -0
  757. package/dist/src/providers/claude-cli-runner.js +598 -0
  758. package/dist/src/providers/claude-cli-runner.js.map +1 -0
  759. package/dist/src/providers/claude-input-limit.d.ts +32 -0
  760. package/dist/src/providers/claude-input-limit.d.ts.map +1 -0
  761. package/dist/src/providers/claude-input-limit.js +32 -0
  762. package/dist/src/providers/claude-input-limit.js.map +1 -0
  763. package/dist/src/providers/codex-cli-digest.d.ts +12 -0
  764. package/dist/src/providers/codex-cli-digest.d.ts.map +1 -0
  765. package/dist/src/providers/codex-cli-digest.js +70 -0
  766. package/dist/src/providers/codex-cli-digest.js.map +1 -0
  767. package/dist/src/providers/codex-cli-metadata-extraction.d.ts +15 -0
  768. package/dist/src/providers/codex-cli-metadata-extraction.d.ts.map +1 -0
  769. package/dist/src/providers/codex-cli-metadata-extraction.js +78 -0
  770. package/dist/src/providers/codex-cli-metadata-extraction.js.map +1 -0
  771. package/dist/src/providers/codex-cli-model.d.ts +110 -0
  772. package/dist/src/providers/codex-cli-model.d.ts.map +1 -0
  773. package/dist/src/providers/codex-cli-model.js +338 -0
  774. package/dist/src/providers/codex-cli-model.js.map +1 -0
  775. package/dist/src/providers/codex-cli-runner.d.ts +70 -0
  776. package/dist/src/providers/codex-cli-runner.d.ts.map +1 -0
  777. package/dist/src/providers/codex-cli-runner.js +745 -0
  778. package/dist/src/providers/codex-cli-runner.js.map +1 -0
  779. package/dist/src/providers/codex-input-limit.d.ts +43 -0
  780. package/dist/src/providers/codex-input-limit.d.ts.map +1 -0
  781. package/dist/src/providers/codex-input-limit.js +70 -0
  782. package/dist/src/providers/codex-input-limit.js.map +1 -0
  783. package/dist/src/providers/conversation-generation.d.ts +21 -0
  784. package/dist/src/providers/conversation-generation.d.ts.map +1 -0
  785. package/dist/src/providers/conversation-generation.js +132 -0
  786. package/dist/src/providers/conversation-generation.js.map +1 -0
  787. package/dist/src/providers/ollama-embed.d.ts +23 -0
  788. package/dist/src/providers/ollama-embed.d.ts.map +1 -0
  789. package/dist/src/providers/ollama-embed.js +137 -0
  790. package/dist/src/providers/ollama-embed.js.map +1 -0
  791. package/dist/src/providers/ollama.d.ts +42 -0
  792. package/dist/src/providers/ollama.d.ts.map +1 -0
  793. package/dist/src/providers/ollama.js +169 -0
  794. package/dist/src/providers/ollama.js.map +1 -0
  795. package/dist/src/providers/openai-metadata-extraction.d.ts +120 -0
  796. package/dist/src/providers/openai-metadata-extraction.d.ts.map +1 -0
  797. package/dist/src/providers/openai-metadata-extraction.js +225 -0
  798. package/dist/src/providers/openai-metadata-extraction.js.map +1 -0
  799. package/dist/src/providers/operator-overrides.d.ts +24 -0
  800. package/dist/src/providers/operator-overrides.d.ts.map +1 -0
  801. package/dist/src/providers/operator-overrides.js +84 -0
  802. package/dist/src/providers/operator-overrides.js.map +1 -0
  803. package/dist/src/providers/placeholder-embed.d.ts +56 -0
  804. package/dist/src/providers/placeholder-embed.d.ts.map +1 -0
  805. package/dist/src/providers/placeholder-embed.js +64 -0
  806. package/dist/src/providers/placeholder-embed.js.map +1 -0
  807. package/dist/src/providers/shared-request.d.ts +22 -0
  808. package/dist/src/providers/shared-request.d.ts.map +1 -0
  809. package/dist/src/providers/shared-request.js +63 -0
  810. package/dist/src/providers/shared-request.js.map +1 -0
  811. package/dist/src/providers/stub.d.ts +19 -0
  812. package/dist/src/providers/stub.d.ts.map +1 -0
  813. package/dist/src/providers/stub.js +74 -0
  814. package/dist/src/providers/stub.js.map +1 -0
  815. package/dist/src/providers/types.d.ts +100 -0
  816. package/dist/src/providers/types.d.ts.map +1 -0
  817. package/dist/src/providers/types.js +63 -0
  818. package/dist/src/providers/types.js.map +1 -0
  819. package/dist/src/providers/voyage.d.ts +55 -0
  820. package/dist/src/providers/voyage.d.ts.map +1 -0
  821. package/dist/src/providers/voyage.js +179 -0
  822. package/dist/src/providers/voyage.js.map +1 -0
  823. package/dist/src/retrieval/brief.d.ts +26 -0
  824. package/dist/src/retrieval/brief.d.ts.map +1 -0
  825. package/dist/src/retrieval/brief.js +268 -0
  826. package/dist/src/retrieval/brief.js.map +1 -0
  827. package/dist/src/retrieval/canonical-files.d.ts +79 -0
  828. package/dist/src/retrieval/canonical-files.d.ts.map +1 -0
  829. package/dist/src/retrieval/canonical-files.js +432 -0
  830. package/dist/src/retrieval/canonical-files.js.map +1 -0
  831. package/dist/src/retrieval/compact.d.ts +306 -0
  832. package/dist/src/retrieval/compact.d.ts.map +1 -0
  833. package/dist/src/retrieval/compact.js +810 -0
  834. package/dist/src/retrieval/compact.js.map +1 -0
  835. package/dist/src/retrieval/context-pack.d.ts +344 -0
  836. package/dist/src/retrieval/context-pack.d.ts.map +1 -0
  837. package/dist/src/retrieval/context-pack.js +1483 -0
  838. package/dist/src/retrieval/context-pack.js.map +1 -0
  839. package/dist/src/retrieval/conversation-dedup.d.ts +54 -0
  840. package/dist/src/retrieval/conversation-dedup.d.ts.map +1 -0
  841. package/dist/src/retrieval/conversation-dedup.js +162 -0
  842. package/dist/src/retrieval/conversation-dedup.js.map +1 -0
  843. package/dist/src/retrieval/current-truth.d.ts +360 -0
  844. package/dist/src/retrieval/current-truth.d.ts.map +1 -0
  845. package/dist/src/retrieval/current-truth.js +766 -0
  846. package/dist/src/retrieval/current-truth.js.map +1 -0
  847. package/dist/src/retrieval/cwd.d.ts +25 -0
  848. package/dist/src/retrieval/cwd.d.ts.map +1 -0
  849. package/dist/src/retrieval/cwd.js +48 -0
  850. package/dist/src/retrieval/cwd.js.map +1 -0
  851. package/dist/src/retrieval/degraded.d.ts +20 -0
  852. package/dist/src/retrieval/degraded.d.ts.map +1 -0
  853. package/dist/src/retrieval/degraded.js +43 -0
  854. package/dist/src/retrieval/degraded.js.map +1 -0
  855. package/dist/src/retrieval/evidence-key.d.ts +48 -0
  856. package/dist/src/retrieval/evidence-key.d.ts.map +1 -0
  857. package/dist/src/retrieval/evidence-key.js +131 -0
  858. package/dist/src/retrieval/evidence-key.js.map +1 -0
  859. package/dist/src/retrieval/feedback-ranking.d.ts +49 -0
  860. package/dist/src/retrieval/feedback-ranking.d.ts.map +1 -0
  861. package/dist/src/retrieval/feedback-ranking.js +138 -0
  862. package/dist/src/retrieval/feedback-ranking.js.map +1 -0
  863. package/dist/src/retrieval/git-state.d.ts +62 -0
  864. package/dist/src/retrieval/git-state.d.ts.map +1 -0
  865. package/dist/src/retrieval/git-state.js +192 -0
  866. package/dist/src/retrieval/git-state.js.map +1 -0
  867. package/dist/src/retrieval/group-by-parent.d.ts +38 -0
  868. package/dist/src/retrieval/group-by-parent.d.ts.map +1 -0
  869. package/dist/src/retrieval/group-by-parent.js +40 -0
  870. package/dist/src/retrieval/group-by-parent.js.map +1 -0
  871. package/dist/src/retrieval/hybrid.d.ts +75 -0
  872. package/dist/src/retrieval/hybrid.d.ts.map +1 -0
  873. package/dist/src/retrieval/hybrid.js +151 -0
  874. package/dist/src/retrieval/hybrid.js.map +1 -0
  875. package/dist/src/retrieval/lexical.d.ts +33 -0
  876. package/dist/src/retrieval/lexical.d.ts.map +1 -0
  877. package/dist/src/retrieval/lexical.js +379 -0
  878. package/dist/src/retrieval/lexical.js.map +1 -0
  879. package/dist/src/retrieval/locator-boost.d.ts +37 -0
  880. package/dist/src/retrieval/locator-boost.d.ts.map +1 -0
  881. package/dist/src/retrieval/locator-boost.js +129 -0
  882. package/dist/src/retrieval/locator-boost.js.map +1 -0
  883. package/dist/src/retrieval/passages.d.ts +24 -0
  884. package/dist/src/retrieval/passages.d.ts.map +1 -0
  885. package/dist/src/retrieval/passages.js +160 -0
  886. package/dist/src/retrieval/passages.js.map +1 -0
  887. package/dist/src/retrieval/post-filter.d.ts +32 -0
  888. package/dist/src/retrieval/post-filter.d.ts.map +1 -0
  889. package/dist/src/retrieval/post-filter.js +57 -0
  890. package/dist/src/retrieval/post-filter.js.map +1 -0
  891. package/dist/src/retrieval/project-index.d.ts +71 -0
  892. package/dist/src/retrieval/project-index.d.ts.map +1 -0
  893. package/dist/src/retrieval/project-index.js +348 -0
  894. package/dist/src/retrieval/project-index.js.map +1 -0
  895. package/dist/src/retrieval/recall-hint.d.ts +22 -0
  896. package/dist/src/retrieval/recall-hint.d.ts.map +1 -0
  897. package/dist/src/retrieval/recall-hint.js +33 -0
  898. package/dist/src/retrieval/recall-hint.js.map +1 -0
  899. package/dist/src/retrieval/receipt.d.ts +57 -0
  900. package/dist/src/retrieval/receipt.d.ts.map +1 -0
  901. package/dist/src/retrieval/receipt.js +122 -0
  902. package/dist/src/retrieval/receipt.js.map +1 -0
  903. package/dist/src/retrieval/report-demotion.d.ts +46 -0
  904. package/dist/src/retrieval/report-demotion.d.ts.map +1 -0
  905. package/dist/src/retrieval/report-demotion.js +169 -0
  906. package/dist/src/retrieval/report-demotion.js.map +1 -0
  907. package/dist/src/retrieval/reranker.d.ts +119 -0
  908. package/dist/src/retrieval/reranker.d.ts.map +1 -0
  909. package/dist/src/retrieval/reranker.js +220 -0
  910. package/dist/src/retrieval/reranker.js.map +1 -0
  911. package/dist/src/retrieval/stitch-chunks.d.ts +76 -0
  912. package/dist/src/retrieval/stitch-chunks.d.ts.map +1 -0
  913. package/dist/src/retrieval/stitch-chunks.js +113 -0
  914. package/dist/src/retrieval/stitch-chunks.js.map +1 -0
  915. package/dist/src/retrieval/vector.d.ts +71 -0
  916. package/dist/src/retrieval/vector.d.ts.map +1 -0
  917. package/dist/src/retrieval/vector.js +147 -0
  918. package/dist/src/retrieval/vector.js.map +1 -0
  919. package/dist/src/runtime/legacy-migration.d.ts +27 -0
  920. package/dist/src/runtime/legacy-migration.d.ts.map +1 -0
  921. package/dist/src/runtime/legacy-migration.js +140 -0
  922. package/dist/src/runtime/legacy-migration.js.map +1 -0
  923. package/dist/src/runtime/legacy-name-guard.d.ts +35 -0
  924. package/dist/src/runtime/legacy-name-guard.d.ts.map +1 -0
  925. package/dist/src/runtime/legacy-name-guard.js +58 -0
  926. package/dist/src/runtime/legacy-name-guard.js.map +1 -0
  927. package/dist/src/runtime/rift-env.d.ts +14 -0
  928. package/dist/src/runtime/rift-env.d.ts.map +1 -0
  929. package/dist/src/runtime/rift-env.js +79 -0
  930. package/dist/src/runtime/rift-env.js.map +1 -0
  931. package/dist/src/runtime/voyage-key-source.d.ts +46 -0
  932. package/dist/src/runtime/voyage-key-source.d.ts.map +1 -0
  933. package/dist/src/runtime/voyage-key-source.js +97 -0
  934. package/dist/src/runtime/voyage-key-source.js.map +1 -0
  935. package/dist/src/runtime/watcher-startup.d.ts +2 -0
  936. package/dist/src/runtime/watcher-startup.d.ts.map +1 -0
  937. package/dist/src/runtime/watcher-startup.js +4 -0
  938. package/dist/src/runtime/watcher-startup.js.map +1 -0
  939. package/dist/src/security/archive.d.ts +23 -0
  940. package/dist/src/security/archive.d.ts.map +1 -0
  941. package/dist/src/security/archive.js +163 -0
  942. package/dist/src/security/archive.js.map +1 -0
  943. package/dist/src/security/paths.d.ts +21 -0
  944. package/dist/src/security/paths.d.ts.map +1 -0
  945. package/dist/src/security/paths.js +67 -0
  946. package/dist/src/security/paths.js.map +1 -0
  947. package/dist/src/server/app.d.ts +29 -0
  948. package/dist/src/server/app.d.ts.map +1 -0
  949. package/dist/src/server/app.js +356 -0
  950. package/dist/src/server/app.js.map +1 -0
  951. package/dist/src/server/build-info.d.ts +8 -0
  952. package/dist/src/server/build-info.d.ts.map +1 -0
  953. package/dist/src/server/build-info.js +61 -0
  954. package/dist/src/server/build-info.js.map +1 -0
  955. package/dist/src/server/lifecycle.d.ts +30 -0
  956. package/dist/src/server/lifecycle.d.ts.map +1 -0
  957. package/dist/src/server/lifecycle.js +59 -0
  958. package/dist/src/server/lifecycle.js.map +1 -0
  959. package/dist/src/server/middleware/multipart.d.ts +51 -0
  960. package/dist/src/server/middleware/multipart.d.ts.map +1 -0
  961. package/dist/src/server/middleware/multipart.js +86 -0
  962. package/dist/src/server/middleware/multipart.js.map +1 -0
  963. package/dist/src/server/routes/compact.d.ts +37 -0
  964. package/dist/src/server/routes/compact.d.ts.map +1 -0
  965. package/dist/src/server/routes/compact.js +80 -0
  966. package/dist/src/server/routes/compact.js.map +1 -0
  967. package/dist/src/server/routes/context.d.ts +12 -0
  968. package/dist/src/server/routes/context.d.ts.map +1 -0
  969. package/dist/src/server/routes/context.js +73 -0
  970. package/dist/src/server/routes/context.js.map +1 -0
  971. package/dist/src/server/routes/conversations-search.d.ts +4 -0
  972. package/dist/src/server/routes/conversations-search.d.ts.map +1 -0
  973. package/dist/src/server/routes/conversations-search.js +287 -0
  974. package/dist/src/server/routes/conversations-search.js.map +1 -0
  975. package/dist/src/server/routes/enqueue.d.ts +11 -0
  976. package/dist/src/server/routes/enqueue.d.ts.map +1 -0
  977. package/dist/src/server/routes/enqueue.js +17 -0
  978. package/dist/src/server/routes/enqueue.js.map +1 -0
  979. package/dist/src/server/routes/friend-status.d.ts +481 -0
  980. package/dist/src/server/routes/friend-status.d.ts.map +1 -0
  981. package/dist/src/server/routes/friend-status.js +675 -0
  982. package/dist/src/server/routes/friend-status.js.map +1 -0
  983. package/dist/src/server/routes/ingest.d.ts +15 -0
  984. package/dist/src/server/routes/ingest.d.ts.map +1 -0
  985. package/dist/src/server/routes/ingest.js +142 -0
  986. package/dist/src/server/routes/ingest.js.map +1 -0
  987. package/dist/src/server/routes/jobs.d.ts +10 -0
  988. package/dist/src/server/routes/jobs.d.ts.map +1 -0
  989. package/dist/src/server/routes/jobs.js +29 -0
  990. package/dist/src/server/routes/jobs.js.map +1 -0
  991. package/dist/src/server/routes/mcp-usage.d.ts +17 -0
  992. package/dist/src/server/routes/mcp-usage.d.ts.map +1 -0
  993. package/dist/src/server/routes/mcp-usage.js +17 -0
  994. package/dist/src/server/routes/mcp-usage.js.map +1 -0
  995. package/dist/src/server/routes/reconcile.d.ts +4 -0
  996. package/dist/src/server/routes/reconcile.d.ts.map +1 -0
  997. package/dist/src/server/routes/reconcile.js +62 -0
  998. package/dist/src/server/routes/reconcile.js.map +1 -0
  999. package/dist/src/server/routes/reindex.d.ts +4 -0
  1000. package/dist/src/server/routes/reindex.d.ts.map +1 -0
  1001. package/dist/src/server/routes/reindex.js +77 -0
  1002. package/dist/src/server/routes/reindex.js.map +1 -0
  1003. package/dist/src/server/routes/retrieval-feedback.d.ts +3 -0
  1004. package/dist/src/server/routes/retrieval-feedback.d.ts.map +1 -0
  1005. package/dist/src/server/routes/retrieval-feedback.js +290 -0
  1006. package/dist/src/server/routes/retrieval-feedback.js.map +1 -0
  1007. package/dist/src/server/routes/save.d.ts +52 -0
  1008. package/dist/src/server/routes/save.d.ts.map +1 -0
  1009. package/dist/src/server/routes/save.js +127 -0
  1010. package/dist/src/server/routes/save.js.map +1 -0
  1011. package/dist/src/server/routes/search.d.ts +5 -0
  1012. package/dist/src/server/routes/search.d.ts.map +1 -0
  1013. package/dist/src/server/routes/search.js +689 -0
  1014. package/dist/src/server/routes/search.js.map +1 -0
  1015. package/dist/src/server/routes/setup.d.ts +46 -0
  1016. package/dist/src/server/routes/setup.d.ts.map +1 -0
  1017. package/dist/src/server/routes/setup.js +322 -0
  1018. package/dist/src/server/routes/setup.js.map +1 -0
  1019. package/dist/src/server/routes/stats.d.ts +10 -0
  1020. package/dist/src/server/routes/stats.d.ts.map +1 -0
  1021. package/dist/src/server/routes/stats.js +15 -0
  1022. package/dist/src/server/routes/stats.js.map +1 -0
  1023. package/dist/src/server/routes/status.d.ts +20 -0
  1024. package/dist/src/server/routes/status.d.ts.map +1 -0
  1025. package/dist/src/server/routes/status.js +31 -0
  1026. package/dist/src/server/routes/status.js.map +1 -0
  1027. package/dist/src/server/routes/triage.d.ts +4 -0
  1028. package/dist/src/server/routes/triage.d.ts.map +1 -0
  1029. package/dist/src/server/routes/triage.js +97 -0
  1030. package/dist/src/server/routes/triage.js.map +1 -0
  1031. package/dist/src/server/save-quality.d.ts +21 -0
  1032. package/dist/src/server/save-quality.d.ts.map +1 -0
  1033. package/dist/src/server/save-quality.js +51 -0
  1034. package/dist/src/server/save-quality.js.map +1 -0
  1035. package/dist/src/server/serving-marker.d.ts +85 -0
  1036. package/dist/src/server/serving-marker.d.ts.map +1 -0
  1037. package/dist/src/server/serving-marker.js +226 -0
  1038. package/dist/src/server/serving-marker.js.map +1 -0
  1039. package/dist/src/storage/atomic.d.ts +8 -0
  1040. package/dist/src/storage/atomic.d.ts.map +1 -0
  1041. package/dist/src/storage/atomic.js +22 -0
  1042. package/dist/src/storage/atomic.js.map +1 -0
  1043. package/dist/src/storage/chunk-backfill.d.ts +39 -0
  1044. package/dist/src/storage/chunk-backfill.d.ts.map +1 -0
  1045. package/dist/src/storage/chunk-backfill.js +295 -0
  1046. package/dist/src/storage/chunk-backfill.js.map +1 -0
  1047. package/dist/src/storage/db.d.ts +15 -0
  1048. package/dist/src/storage/db.d.ts.map +1 -0
  1049. package/dist/src/storage/db.js +47 -0
  1050. package/dist/src/storage/db.js.map +1 -0
  1051. package/dist/src/storage/filter.d.ts +42 -0
  1052. package/dist/src/storage/filter.d.ts.map +1 -0
  1053. package/dist/src/storage/filter.js +70 -0
  1054. package/dist/src/storage/filter.js.map +1 -0
  1055. package/dist/src/storage/fts.d.ts +47 -0
  1056. package/dist/src/storage/fts.d.ts.map +1 -0
  1057. package/dist/src/storage/fts.js +86 -0
  1058. package/dist/src/storage/fts.js.map +1 -0
  1059. package/dist/src/storage/integrity.d.ts +11 -0
  1060. package/dist/src/storage/integrity.d.ts.map +1 -0
  1061. package/dist/src/storage/integrity.js +66 -0
  1062. package/dist/src/storage/integrity.js.map +1 -0
  1063. package/dist/src/storage/maintenance.d.ts +27 -0
  1064. package/dist/src/storage/maintenance.d.ts.map +1 -0
  1065. package/dist/src/storage/maintenance.js +66 -0
  1066. package/dist/src/storage/maintenance.js.map +1 -0
  1067. package/dist/src/storage/rebuild.d.ts +71 -0
  1068. package/dist/src/storage/rebuild.d.ts.map +1 -0
  1069. package/dist/src/storage/rebuild.js +605 -0
  1070. package/dist/src/storage/rebuild.js.map +1 -0
  1071. package/dist/src/storage/report-card-backfill.d.ts +20 -0
  1072. package/dist/src/storage/report-card-backfill.d.ts.map +1 -0
  1073. package/dist/src/storage/report-card-backfill.js +114 -0
  1074. package/dist/src/storage/report-card-backfill.js.map +1 -0
  1075. package/dist/src/storage/shadow-swap.d.ts +20 -0
  1076. package/dist/src/storage/shadow-swap.d.ts.map +1 -0
  1077. package/dist/src/storage/shadow-swap.js +163 -0
  1078. package/dist/src/storage/shadow-swap.js.map +1 -0
  1079. package/dist/src/storage/tables.d.ts +147 -0
  1080. package/dist/src/storage/tables.d.ts.map +1 -0
  1081. package/dist/src/storage/tables.js +290 -0
  1082. package/dist/src/storage/tables.js.map +1 -0
  1083. package/operator/swiftbar/render-menu.py +475 -0
  1084. package/operator/swiftbar/rift.10s.sh +201 -0
  1085. package/package.json +57 -3
@@ -0,0 +1,1379 @@
1
+ /**
2
+ * backfill CLI command — staged historical import.
3
+ *
4
+ * Imports web conversation exports from a dedicated staging area.
5
+ * The founder moves/copies exports into batch folders and runs:
6
+ *
7
+ * onadit backfill --batch data/imports/exports-batch-1 --source chatgpt_web
8
+ *
9
+ * Slice 4 introduces a preflight-first workflow. Every run:
10
+ * - refreshes `manifest.json` (catalog of batch files)
11
+ * - refreshes `preflight.json` (junk + duplicate classification)
12
+ *
13
+ * The default operator flow is:
14
+ * 1. onadit backfill --batch ... --source ... --dry-run (preflight only)
15
+ * 2. inspect manifest.json / preflight.json
16
+ * 3. onadit backfill --batch ... --source ... (ingest)
17
+ *
18
+ * Reuses the existing POST /ingest pipeline (archive security,
19
+ * parsers, extraction, quarantine). Emits a per-batch report.
20
+ *
21
+ * Batch rerun is idempotent — the ingest pipeline's idempotency_key
22
+ * prevents duplicate conversations.
23
+ */
24
+ import fs from "node:fs";
25
+ import path from "node:path";
26
+ import crypto from "node:crypto";
27
+ import { Command } from "commander";
28
+ import { loadConfig } from "../../config/loader.js";
29
+ import { createHttpClient, readToken, resolveBaseUrl, CliError, requireExistingConfigPath, } from "../http-client.js";
30
+ import { pollJob } from "../job-poller.js";
31
+ import { isJobFailure } from "../output.js";
32
+ import { isSourceSupported, INGEST_SOURCES, SUPPORTED_INGEST_SOURCES, } from "../../ingestion/parsers/types.js";
33
+ import { stageBatch, SOURCE_EXTENSIONS, } from "../../ingestion/staging.js";
34
+ import { extractArchive } from "../../security/archive.js";
35
+ import { parseChatGPTWeb } from "../../ingestion/parsers/chatgpt-web.js";
36
+ import { parseClaudeWeb } from "../../ingestion/parsers/claude-web.js";
37
+ import { parseGeminiWeb } from "../../ingestion/parsers/gemini-web.js";
38
+ import { parseGrokWeb } from "../../ingestion/parsers/grok-web.js";
39
+ import { addToReview, reviewQueueSize } from "../../capture/review-queue.js";
40
+ import { loadHistoricalCampaignState, writeHistoricalCampaignState, ensureHistoricalCampaignBatch, startHistoricalCampaignBatch, listTerminalHistoricalItemIds, listTerminalHistoricalFiles, isFileQuarantineCandidate, collectHistoricalBatchQuarantineReasons, markHistoricalFile, markHistoricalItem, finalizeHistoricalFiles, addHistoricalRunBudgetUsage, evaluateHistoricalBatch, getHistoricalCampaignBudgetWindow, recomputeHistoricalCampaignSummary, historicalCampaignReportPath, summarizeHistoricalBatchState, snapshotHistoricalCampaignReport, snapshotHistoricalNoOpReport, writeHistoricalCampaignReport, formatHistoricalCampaignSummary, reportHistoricalCampaignBlockers, } from "../../ingestion/historical-campaign.js";
41
+ import { HISTORICAL_BACKFILL_CAPABILITY_HEADER, INTERNAL_HISTORICAL_INGEST_CODEX_ROUTE, INTERNAL_HISTORICAL_TRIAGE_CODEX_ROUTE, effectiveTriageProviderName, isOperatorOverrideProvider, readHistoricalBackfillCapability, triageMeteringModeForProvider, triageMeteringModeForProviderName, } from "../../providers/operator-overrides.js";
42
+ const HISTORICAL_PARSERS = {
43
+ chatgpt_web: parseChatGPTWeb,
44
+ claude_web: parseClaudeWeb,
45
+ gemini_web: parseGeminiWeb,
46
+ grok_web: parseGrokWeb,
47
+ };
48
+ export function makeBackfillCommand() {
49
+ return new Command("backfill")
50
+ .description("Stage and import web conversation exports from a batch folder")
51
+ .requiredOption("--batch <path>", "Path to batch folder (e.g., data/imports/exports-batch-1)")
52
+ .requiredOption("--source <source>", "Source type (currently supported: chatgpt_web, claude_web, gemini_web, grok_web)")
53
+ .option("--dry-run", "Preflight only — refresh manifest/preflight and exit without ingesting")
54
+ .option("--force-unstaged", "Ingest files even if they are flagged as junk in preflight")
55
+ .option("--provider <provider>", "Backfill-only override for both triage and extraction (supported: codex-cli)")
56
+ .option("--triage-provider <provider>", "Backfill-only triage override (supported: codex-cli)")
57
+ .option("--extraction-provider <provider>", "Backfill-only extraction override (supported: codex-cli)")
58
+ .option("--limit <count>", "Cap this run to the first N unresolved files for smoke testing", parsePositiveInteger)
59
+ .action(async (opts, cmd) => {
60
+ const globalOpts = cmd.optsWithGlobals();
61
+ try {
62
+ // Validate source
63
+ const allSources = INGEST_SOURCES;
64
+ if (!allSources.includes(opts.source)) {
65
+ process.stderr.write(`Error: Unknown source "${opts.source}". ` +
66
+ `Known sources: ${INGEST_SOURCES.join(", ")}\n`);
67
+ process.exitCode = 1;
68
+ return;
69
+ }
70
+ if (!isSourceSupported(opts.source)) {
71
+ process.stderr.write(`Error: "${opts.source}" is not yet supported — no real export fixture exists to validate the parser against.\n` +
72
+ `To enable: add a real export sample to tests/fixtures/exports/${opts.source}/ and implement the parser.\n` +
73
+ `Currently supported: ${SUPPORTED_INGEST_SOURCES.join(", ")}\n`);
74
+ process.exitCode = 1;
75
+ return;
76
+ }
77
+ // Validate batch directory
78
+ const batchDir = path.resolve(opts.batch);
79
+ if (!fs.existsSync(batchDir) ||
80
+ !fs.statSync(batchDir).isDirectory()) {
81
+ process.stderr.write(`Error: Not a directory: ${batchDir}\n`);
82
+ process.exitCode = 1;
83
+ return;
84
+ }
85
+ const source = opts.source;
86
+ const providerOverride = resolveBackfillProviderOverride(opts.provider, "provider");
87
+ const triageProviderOverride = resolveBackfillProviderOverride(opts.triageProvider ?? providerOverride, "triage-provider");
88
+ const extractionProviderOverride = resolveBackfillProviderOverride(opts.extractionProvider ?? providerOverride, "extraction-provider");
89
+ const requestedTriageMeteringMode = triageMeteringModeForProvider(triageProviderOverride);
90
+ const explicitLimit = typeof opts.limit === "number" && Number.isFinite(opts.limit)
91
+ ? opts.limit
92
+ : undefined;
93
+ // --- Stage the batch: manifest + preflight, persisted to disk. ---
94
+ const { manifest, preflight } = stageBatch({ batchDir, source });
95
+ const batchName = manifest.batch_name;
96
+ writePreflightSummary({
97
+ batchDir,
98
+ manifest,
99
+ preflight,
100
+ stderr: process.stderr,
101
+ });
102
+ if (opts.dryRun) {
103
+ if (globalOpts.json) {
104
+ process.stdout.write(JSON.stringify({
105
+ mode: "preflight",
106
+ batch: batchName,
107
+ source,
108
+ manifest_path: path.join(batchDir, "manifest.json"),
109
+ preflight_path: path.join(batchDir, "preflight.json"),
110
+ preflight,
111
+ }, null, 2) + "\n");
112
+ }
113
+ process.stderr.write("\n(dry-run — no changes made beyond manifest.json / preflight.json)\n");
114
+ return;
115
+ }
116
+ // Per A-2.2: route through requireExistingConfigPath so missing
117
+ // config produces the canonical CliError, not a raw ENOENT.
118
+ const configPath = requireExistingConfigPath(globalOpts);
119
+ const config = loadConfig(configPath);
120
+ const dataDir = config.data_paths.data_dir;
121
+ const now = new Date();
122
+ const nowIso = now.toISOString();
123
+ const reportPath = historicalCampaignReportPath(batchDir);
124
+ const campaignState = loadHistoricalCampaignState(dataDir);
125
+ const campaignBatch = ensureHistoricalCampaignBatch(campaignState, batchName, source, nowIso);
126
+ const reviewBacklogBefore = reviewQueueSize(dataDir);
127
+ const terminalItemIds = listTerminalHistoricalItemIds(campaignBatch);
128
+ const terminalFilesBefore = listTerminalHistoricalFiles(campaignBatch);
129
+ const rerunnableFiles = preflight.files
130
+ .filter((file) => !terminalFilesBefore.has(file.name))
131
+ .sort((left, right) => left.name.localeCompare(right.name));
132
+ for (const file of rerunnableFiles) {
133
+ ensureHistoricalPendingFile(campaignBatch, file.name, nowIso);
134
+ }
135
+ if (rerunnableFiles.length === 0) {
136
+ const noOpNextAction = "Batch is already terminal. Prepare the next staged batch.";
137
+ const terminalReport = snapshotHistoricalNoOpReport({
138
+ state: campaignState,
139
+ batch: campaignBatch,
140
+ preflight,
141
+ now,
142
+ reviewBacklogNow: reviewBacklogBefore,
143
+ nextAction: noOpNextAction,
144
+ });
145
+ campaignBatch.next_action = noOpNextAction;
146
+ campaignBatch.report_path = reportPath;
147
+ campaignState.last_run_at = nowIso;
148
+ await writeHistoricalCampaignReport(reportPath, terminalReport);
149
+ await writeHistoricalCampaignState(dataDir, campaignState);
150
+ if (globalOpts.json) {
151
+ process.stdout.write(JSON.stringify(terminalReport, null, 2) + "\n");
152
+ }
153
+ else {
154
+ process.stdout.write(formatHistoricalCampaignSummary(terminalReport));
155
+ }
156
+ return;
157
+ }
158
+ const budgetWindow = getHistoricalCampaignBudgetWindow(campaignState, now);
159
+ const runFileCount = Math.min(rerunnableFiles.length, budgetWindow.remaining_daily_files, budgetWindow.remaining_weekly_files, explicitLimit ?? Number.POSITIVE_INFINITY);
160
+ const filesForRun = rerunnableFiles.slice(0, runFileCount);
161
+ const deferredFiles = rerunnableFiles.slice(runFileCount);
162
+ const limitedByOperator = explicitLimit !== undefined &&
163
+ runFileCount === explicitLimit &&
164
+ rerunnableFiles.length > explicitLimit;
165
+ const preflightQuarantined = filesForRun.filter(isFileQuarantineCandidate);
166
+ const preflightQuarantineReasons = collectHistoricalBatchQuarantineReasons({
167
+ preflight,
168
+ failedFilesRate: 0,
169
+ });
170
+ const ingestable = filesForRun.filter((file) => {
171
+ if (preflightQuarantined.some((entry) => entry.name === file.name))
172
+ return false;
173
+ if (!file.supported)
174
+ return false;
175
+ if (file.junk_markers.length === 0)
176
+ return true;
177
+ return Boolean(opts.forceUnstaged);
178
+ });
179
+ const skipped = filesForRun.filter((file) => !ingestable.includes(file) &&
180
+ !preflightQuarantined.some((entry) => entry.name === file.name));
181
+ const triageCandidates = ingestable
182
+ .flatMap((file) => buildHistoricalTriageItem(file, source))
183
+ .filter((item) => !terminalItemIds.has(item.id));
184
+ const triageCandidateById = new Map(triageCandidates.map((item) => [item.id, item]));
185
+ const cachedTriageById = new Map();
186
+ const requestedTriageProviderName = effectiveTriageProviderName(triageProviderOverride);
187
+ for (const candidate of triageCandidates) {
188
+ const existingItem = campaignBatch.items[candidate.id];
189
+ if (existingItem?.terminal || !existingItem?.triage)
190
+ continue;
191
+ if (existingItem.triage.provider !== requestedTriageProviderName) {
192
+ continue;
193
+ }
194
+ cachedTriageById.set(candidate.id, {
195
+ item_id: candidate.id,
196
+ file: candidate.file.name,
197
+ kind: candidate.kind,
198
+ ...(candidate.conversationId
199
+ ? { conversation_id: candidate.conversationId }
200
+ : {}),
201
+ ...(candidate.title ? { title: candidate.title } : {}),
202
+ ...(candidate.createdAt ? { created_at: candidate.createdAt } : {}),
203
+ conversation_count: candidate.conversationCount,
204
+ triage: existingItem.triage,
205
+ });
206
+ }
207
+ const triageCandidatesNeedingWork = triageCandidates.filter((candidate) => !cachedTriageById.has(candidate.id));
208
+ const blockers = reportHistoricalCampaignBlockers({
209
+ state: campaignState,
210
+ now,
211
+ reviewBacklogBefore,
212
+ meteringMode: requestedTriageMeteringMode,
213
+ triageBatchCostCapUsd: config.openai.max_cost_per_batch_usd,
214
+ triageCandidates: triageCandidatesNeedingWork.length,
215
+ });
216
+ if (runFileCount === 0 || blockers.length > 0) {
217
+ const nextAction = blockers.length > 0
218
+ ? blockers.join("; ")
219
+ : `Daily or weekly file budget is exhausted. Resume the remaining ${rerunnableFiles.length} file(s) in the next budget window.`;
220
+ const blockedStatus = blockers.some((reason) => reason.includes("triage spend") || reason.includes("review backlog"))
221
+ ? "failed"
222
+ : "running";
223
+ const previousBatchStatus = campaignBatch.status;
224
+ const preserveTerminalOutcome = previousBatchStatus === "failed" ||
225
+ previousBatchStatus === "quarantined";
226
+ const finalBlockedStatus = preserveTerminalOutcome ? previousBatchStatus : blockedStatus;
227
+ startHistoricalCampaignBatch(campaignBatch, {
228
+ totalFiles: preflight.total_files,
229
+ runFiles: 0,
230
+ triageCandidates: triageCandidates.length,
231
+ reviewBacklogBefore,
232
+ meteringMode: requestedTriageMeteringMode,
233
+ nowIso,
234
+ });
235
+ campaignBatch.last_run_at = nowIso;
236
+ campaignBatch.status = finalBlockedStatus;
237
+ campaignBatch.review_backlog_after = reviewBacklogBefore;
238
+ campaignBatch.next_action = nextAction;
239
+ campaignBatch.report_path = reportPath;
240
+ const blockedReport = snapshotHistoricalCampaignReport({
241
+ state: campaignState,
242
+ batch: campaignBatch,
243
+ preflight,
244
+ now,
245
+ runFileCount: 0,
246
+ reviewBacklogAfter: reviewBacklogBefore,
247
+ triageSpendUsd: 0,
248
+ processedFiles: [],
249
+ status: finalBlockedStatus,
250
+ nextAction,
251
+ results: [],
252
+ });
253
+ recomputeHistoricalCampaignSummary(campaignState);
254
+ campaignState.last_run_at = nowIso;
255
+ await writeHistoricalCampaignReport(reportPath, blockedReport);
256
+ await writeHistoricalCampaignState(dataDir, campaignState);
257
+ if (globalOpts.json) {
258
+ process.stdout.write(JSON.stringify(blockedReport, null, 2) + "\n");
259
+ }
260
+ else {
261
+ process.stdout.write(formatHistoricalCampaignSummary(blockedReport));
262
+ }
263
+ if (blockedStatus === "failed") {
264
+ process.exitCode = 1;
265
+ }
266
+ return;
267
+ }
268
+ startHistoricalCampaignBatch(campaignBatch, {
269
+ totalFiles: preflight.total_files,
270
+ runFiles: runFileCount,
271
+ triageCandidates: triageCandidates.length,
272
+ reviewBacklogBefore,
273
+ meteringMode: requestedTriageMeteringMode,
274
+ nowIso,
275
+ });
276
+ for (const file of filesForRun) {
277
+ markHistoricalFile(campaignBatch, file.name, {
278
+ terminal: false,
279
+ lastResult: "running",
280
+ nowIso,
281
+ });
282
+ }
283
+ const results = [];
284
+ let triageSpendUsd = 0;
285
+ let reviewBacklogAfter = reviewBacklogBefore;
286
+ const touchedFilesThisRun = new Set();
287
+ let stopReason = deferredFiles.length > 0
288
+ ? limitedByOperator
289
+ ? `Processed ${runFileCount} file(s) in this smoke run. Resume the remaining ${deferredFiles.length} file(s) when ready.`
290
+ : `Processed ${runFileCount} file(s) in this run. Resume the remaining ${deferredFiles.length} file(s) in the next daily or weekly budget window.`
291
+ : null;
292
+ let reviewBacklogStopped = false;
293
+ let budgetUsageCommitted = false;
294
+ await persistHistoricalCampaignCheckpoint({
295
+ dataDir,
296
+ state: campaignState,
297
+ batch: campaignBatch,
298
+ preflight,
299
+ now,
300
+ reportPath,
301
+ runFileCount,
302
+ reviewBacklogAfter,
303
+ triageSpendUsd,
304
+ processedFiles: filesForRun.map((file) => file.name),
305
+ results,
306
+ status: "running",
307
+ nextAction: stopReason ??
308
+ `Running historical batch ${batchName}. Resume only unresolved files if interrupted.`,
309
+ });
310
+ try {
311
+ for (const file of preflightQuarantined) {
312
+ touchedFilesThisRun.add(file.name);
313
+ markHistoricalFile(campaignBatch, file.name, {
314
+ terminal: true,
315
+ terminalStatus: "quarantined",
316
+ lastResult: "quarantined",
317
+ nowIso,
318
+ });
319
+ results.push({
320
+ file: file.name,
321
+ status: "quarantined",
322
+ error: file.junk_markers.join(",") ||
323
+ file.notes.join(",") ||
324
+ "quarantined_by_policy",
325
+ });
326
+ }
327
+ await persistHistoricalCampaignCheckpoint({
328
+ dataDir,
329
+ state: campaignState,
330
+ batch: campaignBatch,
331
+ preflight,
332
+ now,
333
+ reportPath,
334
+ runFileCount,
335
+ reviewBacklogAfter,
336
+ triageSpendUsd,
337
+ processedFiles: filesForRun.map((file) => file.name),
338
+ results,
339
+ status: "running",
340
+ nextAction: stopReason ??
341
+ `Running historical batch ${batchName}. Resume only unresolved files if interrupted.`,
342
+ });
343
+ if (preflightQuarantineReasons.length > 0) {
344
+ for (const file of filesForRun.filter((candidate) => !preflightQuarantined.some((entry) => entry.name === candidate.name))) {
345
+ touchedFilesThisRun.add(file.name);
346
+ markHistoricalFile(campaignBatch, file.name, {
347
+ terminal: true,
348
+ terminalStatus: "quarantined",
349
+ lastResult: "quarantined",
350
+ nowIso,
351
+ });
352
+ results.push({
353
+ file: file.name,
354
+ status: "quarantined",
355
+ error: `batch_quarantined:${preflightQuarantineReasons.join(";")}`,
356
+ });
357
+ }
358
+ finalizeHistoricalFiles(campaignBatch, nowIso);
359
+ addHistoricalRunBudgetUsage(campaignState, {
360
+ weekKey: budgetWindow.week_key,
361
+ dayKey: budgetWindow.day_key,
362
+ filesProcessed: touchedFilesThisRun.size,
363
+ triageSpendUsd,
364
+ });
365
+ budgetUsageCommitted = true;
366
+ const evaluation = evaluateHistoricalBatch({
367
+ state: campaignState,
368
+ batch: campaignBatch,
369
+ preflight,
370
+ now,
371
+ runFileCount,
372
+ reviewBacklogAfter,
373
+ triageSpendUsd,
374
+ reportPath,
375
+ processedFiles: filesForRun.map((file) => file.name),
376
+ results,
377
+ });
378
+ campaignBatch.report_path = reportPath;
379
+ campaignState.last_run_at = nowIso;
380
+ await writeHistoricalCampaignReport(reportPath, evaluation.report);
381
+ await writeHistoricalCampaignState(dataDir, campaignState);
382
+ if (globalOpts.json) {
383
+ process.stdout.write(JSON.stringify(evaluation.report, null, 2) + "\n");
384
+ }
385
+ else {
386
+ process.stdout.write(formatHistoricalCampaignSummary(evaluation.report));
387
+ }
388
+ process.exitCode = 1;
389
+ return;
390
+ }
391
+ for (const file of skipped) {
392
+ touchedFilesThisRun.add(file.name);
393
+ markHistoricalFile(campaignBatch, file.name, {
394
+ terminal: false,
395
+ lastResult: "skipped",
396
+ nowIso,
397
+ });
398
+ results.push({
399
+ file: file.name,
400
+ status: "skipped",
401
+ error: file.junk_markers.join(",") || "skipped_by_preflight",
402
+ });
403
+ }
404
+ await persistHistoricalCampaignCheckpoint({
405
+ dataDir,
406
+ state: campaignState,
407
+ batch: campaignBatch,
408
+ preflight,
409
+ now,
410
+ reportPath,
411
+ runFileCount,
412
+ reviewBacklogAfter,
413
+ triageSpendUsd,
414
+ processedFiles: filesForRun.map((file) => file.name),
415
+ results,
416
+ status: "running",
417
+ nextAction: stopReason ??
418
+ `Running historical batch ${batchName}. Resume only unresolved files if interrupted.`,
419
+ });
420
+ const triageById = new Map(cachedTriageById);
421
+ let client = null;
422
+ if (triageCandidates.length > 0) {
423
+ const baseUrl = resolveBaseUrl(globalOpts.config);
424
+ const token = await readToken();
425
+ if (!token) {
426
+ throw new Error("No auth token. Run: onadit token issue");
427
+ }
428
+ client = createHttpClient({ baseUrl, token });
429
+ }
430
+ if (triageCandidatesNeedingWork.length > 0) {
431
+ const triageOutput = await runHistoricalTriage({
432
+ batchDir,
433
+ client: client,
434
+ dataDir,
435
+ items: triageCandidatesNeedingWork,
436
+ ...(triageProviderOverride
437
+ ? { providerOverride: triageProviderOverride }
438
+ : {}),
439
+ });
440
+ triageSpendUsd = triageOutput.spent_usd ?? 0;
441
+ if (triageOutput.metering_mode) {
442
+ campaignBatch.metering_mode = triageOutput.metering_mode;
443
+ }
444
+ for (const item of triageOutput.items) {
445
+ triageById.set(item.item_id, item);
446
+ }
447
+ for (const candidate of triageCandidatesNeedingWork) {
448
+ const triageItem = triageById.get(candidate.id);
449
+ if (!triageItem?.triage)
450
+ continue;
451
+ touchedFilesThisRun.add(candidate.file.name);
452
+ markHistoricalItem(campaignBatch, {
453
+ itemId: candidate.id,
454
+ file: candidate.file.name,
455
+ ...(candidate.conversationId
456
+ ? { conversationId: candidate.conversationId }
457
+ : {}),
458
+ ...(candidate.title ? { title: candidate.title } : {}),
459
+ lastResult: "triaged",
460
+ terminal: false,
461
+ triage: triageItem.triage,
462
+ nowIso,
463
+ });
464
+ }
465
+ await persistHistoricalCampaignCheckpoint({
466
+ dataDir,
467
+ state: campaignState,
468
+ batch: campaignBatch,
469
+ preflight,
470
+ now,
471
+ reportPath,
472
+ runFileCount,
473
+ reviewBacklogAfter,
474
+ triageSpendUsd,
475
+ processedFiles: filesForRun.map((file) => file.name),
476
+ results,
477
+ status: "running",
478
+ nextAction: stopReason ??
479
+ `Running historical batch ${batchName}. Resume only unresolved files if interrupted.`,
480
+ });
481
+ }
482
+ const actualTriageProviderName = resolveHistoricalRunTriageProviderName(triageCandidates, triageById);
483
+ if (actualTriageProviderName) {
484
+ campaignBatch.metering_mode = triageMeteringModeForProviderName(actualTriageProviderName);
485
+ }
486
+ for (const candidate of triageCandidates) {
487
+ const label = formatHistoricalLabel(candidate);
488
+ const triageItem = triageById.get(candidate.id);
489
+ if (!triageItem) {
490
+ touchedFilesThisRun.add(candidate.file.name);
491
+ markHistoricalItem(campaignBatch, {
492
+ itemId: candidate.id,
493
+ file: candidate.file.name,
494
+ ...(candidate.conversationId
495
+ ? { conversationId: candidate.conversationId }
496
+ : {}),
497
+ ...(candidate.title ? { title: candidate.title } : {}),
498
+ lastResult: "error",
499
+ terminal: false,
500
+ nowIso,
501
+ });
502
+ results.push({
503
+ file: candidate.file.name,
504
+ ...(candidate.conversationId
505
+ ? { conversation_id: candidate.conversationId }
506
+ : {}),
507
+ ...(candidate.title ? { title: candidate.title } : {}),
508
+ status: "error",
509
+ error: "missing_triage_result",
510
+ });
511
+ process.stderr.write(` ${label}: missing triage result\n`);
512
+ continue;
513
+ }
514
+ if (triageItem.error) {
515
+ touchedFilesThisRun.add(candidate.file.name);
516
+ markHistoricalItem(campaignBatch, {
517
+ itemId: candidate.id,
518
+ file: candidate.file.name,
519
+ ...(candidate.conversationId
520
+ ? { conversationId: candidate.conversationId }
521
+ : {}),
522
+ ...(candidate.title ? { title: candidate.title } : {}),
523
+ lastResult: "error",
524
+ terminal: false,
525
+ nowIso,
526
+ });
527
+ results.push({
528
+ file: candidate.file.name,
529
+ ...(candidate.conversationId
530
+ ? { conversation_id: candidate.conversationId }
531
+ : {}),
532
+ ...(candidate.title ? { title: candidate.title } : {}),
533
+ status: "error",
534
+ error: triageItem.error,
535
+ });
536
+ process.stderr.write(` ${label}: triage error: ${triageItem.error}\n`);
537
+ continue;
538
+ }
539
+ if (!triageItem.triage) {
540
+ touchedFilesThisRun.add(candidate.file.name);
541
+ markHistoricalItem(campaignBatch, {
542
+ itemId: candidate.id,
543
+ file: candidate.file.name,
544
+ ...(candidate.conversationId
545
+ ? { conversationId: candidate.conversationId }
546
+ : {}),
547
+ ...(candidate.title ? { title: candidate.title } : {}),
548
+ lastResult: "error",
549
+ terminal: false,
550
+ nowIso,
551
+ });
552
+ results.push({
553
+ file: candidate.file.name,
554
+ ...(candidate.conversationId
555
+ ? { conversation_id: candidate.conversationId }
556
+ : {}),
557
+ ...(candidate.title ? { title: candidate.title } : {}),
558
+ status: "error",
559
+ error: "triage_result_missing",
560
+ });
561
+ process.stderr.write(` ${label}: triage result missing\n`);
562
+ continue;
563
+ }
564
+ const triage = triageItem.triage;
565
+ process.stderr.write(` ${label}: ${triage.lane} (score=${triage.score.toFixed(3)}, decision=${triage.decision})\n`);
566
+ if (triage.lane === "archive_only") {
567
+ touchedFilesThisRun.add(candidate.file.name);
568
+ markHistoricalItem(campaignBatch, {
569
+ itemId: candidate.id,
570
+ file: candidate.file.name,
571
+ ...(candidate.conversationId
572
+ ? { conversationId: candidate.conversationId }
573
+ : {}),
574
+ ...(candidate.title ? { title: candidate.title } : {}),
575
+ lastResult: "archive_only",
576
+ terminal: true,
577
+ terminalStatus: "archive_only",
578
+ triage,
579
+ nowIso,
580
+ });
581
+ results.push({
582
+ file: candidate.file.name,
583
+ ...(candidate.conversationId
584
+ ? { conversation_id: candidate.conversationId }
585
+ : {}),
586
+ ...(candidate.title ? { title: candidate.title } : {}),
587
+ status: "archive_only",
588
+ lane: triage.lane,
589
+ });
590
+ continue;
591
+ }
592
+ if (triage.lane === "review") {
593
+ touchedFilesThisRun.add(candidate.file.name);
594
+ await addToReview(dataDir, {
595
+ source,
596
+ conversationId: candidate.kind === "conversation" && candidate.conversationId
597
+ ? historicalConversationKey(source, candidate.conversationId)
598
+ : `backfill:${batchName}:${candidate.file.name}`,
599
+ summary: triage.summary ||
600
+ candidate.title ||
601
+ candidate.file.name,
602
+ content: triageCandidateById.get(candidate.id)?.reviewContent ??
603
+ candidate.file.name,
604
+ triage,
605
+ });
606
+ markHistoricalItem(campaignBatch, {
607
+ itemId: candidate.id,
608
+ file: candidate.file.name,
609
+ ...(candidate.conversationId
610
+ ? { conversationId: candidate.conversationId }
611
+ : {}),
612
+ ...(candidate.title ? { title: candidate.title } : {}),
613
+ lastResult: "review",
614
+ terminal: true,
615
+ terminalStatus: "review",
616
+ triage,
617
+ nowIso,
618
+ });
619
+ results.push({
620
+ file: candidate.file.name,
621
+ ...(candidate.conversationId
622
+ ? { conversation_id: candidate.conversationId }
623
+ : {}),
624
+ ...(candidate.title ? { title: candidate.title } : {}),
625
+ status: "review",
626
+ lane: triage.lane,
627
+ });
628
+ reviewBacklogAfter = reviewQueueSize(dataDir);
629
+ if (reviewBacklogAfter >
630
+ 400) {
631
+ stopReason =
632
+ "Stop historical import. Review backlog exceeds 400 open items.";
633
+ reviewBacklogStopped = true;
634
+ process.stderr.write(` ${label}: stopping batch because review backlog is now ${reviewBacklogAfter}\n`);
635
+ break;
636
+ }
637
+ continue;
638
+ }
639
+ const upload = candidate.upload;
640
+ if (!upload) {
641
+ touchedFilesThisRun.add(candidate.file.name);
642
+ const error = candidate.kind === "file_fallback"
643
+ ? "parser_zero_conversations"
644
+ : "missing_promoted_payload";
645
+ markHistoricalItem(campaignBatch, {
646
+ itemId: candidate.id,
647
+ file: candidate.file.name,
648
+ ...(candidate.conversationId
649
+ ? { conversationId: candidate.conversationId }
650
+ : {}),
651
+ ...(candidate.title ? { title: candidate.title } : {}),
652
+ lastResult: "error",
653
+ terminal: false,
654
+ triage,
655
+ nowIso,
656
+ });
657
+ results.push({
658
+ file: candidate.file.name,
659
+ ...(candidate.conversationId
660
+ ? { conversation_id: candidate.conversationId }
661
+ : {}),
662
+ ...(candidate.title ? { title: candidate.title } : {}),
663
+ status: "error",
664
+ lane: triage.lane,
665
+ error,
666
+ });
667
+ process.stderr.write(` Error: ${error} for ${label}\n`);
668
+ continue;
669
+ }
670
+ process.stderr.write(` Promoting ${label} into /ingest\n`);
671
+ try {
672
+ if (!client) {
673
+ throw new Error("Missing HTTP client for historical promotion");
674
+ }
675
+ const form = new FormData();
676
+ form.append("source", source);
677
+ // Fastify's multipart parser validates fields available at the
678
+ // moment it encounters the file part. Keep the historical
679
+ // idempotency key ahead of the file so larger uploads don't
680
+ // lose it and fail the internal override route validation.
681
+ form.append("idempotency_key", candidate.kind === "conversation" && candidate.conversationId
682
+ ? historicalConversationKey(source, candidate.conversationId)
683
+ : `backfill:${batchName}:${candidate.file.name}`);
684
+ form.append("file", new Blob([new Uint8Array(upload.fileData)]), upload.filename);
685
+ const { data } = await client.postMultipart(historicalIngestEndpointPath(extractionProviderOverride), form, historicalInternalRouteOptions(dataDir, extractionProviderOverride));
686
+ const resp = data;
687
+ if (resp.duplicate) {
688
+ touchedFilesThisRun.add(candidate.file.name);
689
+ markHistoricalItem(campaignBatch, {
690
+ itemId: candidate.id,
691
+ file: candidate.file.name,
692
+ ...(candidate.conversationId
693
+ ? { conversationId: candidate.conversationId }
694
+ : {}),
695
+ ...(candidate.title ? { title: candidate.title } : {}),
696
+ lastResult: "duplicate",
697
+ terminal: true,
698
+ terminalStatus: "promote_to_extract",
699
+ triage,
700
+ nowIso,
701
+ });
702
+ process.stderr.write(" Duplicate (already ingested)\n");
703
+ results.push({
704
+ file: candidate.file.name,
705
+ ...(candidate.conversationId
706
+ ? { conversation_id: candidate.conversationId }
707
+ : {}),
708
+ ...(candidate.title ? { title: candidate.title } : {}),
709
+ status: "duplicate",
710
+ lane: triage.lane,
711
+ });
712
+ continue;
713
+ }
714
+ const result = await pollJob({
715
+ get: client.get.bind(client),
716
+ jobId: resp.job_id,
717
+ });
718
+ if (isJobFailure(result.job, result.timedOut)) {
719
+ touchedFilesThisRun.add(candidate.file.name);
720
+ const error = result.job.error ??
721
+ (result.timedOut ? "timed out" : "unknown");
722
+ markHistoricalItem(campaignBatch, {
723
+ itemId: candidate.id,
724
+ file: candidate.file.name,
725
+ ...(candidate.conversationId
726
+ ? { conversationId: candidate.conversationId }
727
+ : {}),
728
+ ...(candidate.title ? { title: candidate.title } : {}),
729
+ lastResult: "failed",
730
+ terminal: false,
731
+ triage,
732
+ nowIso,
733
+ });
734
+ results.push({
735
+ file: candidate.file.name,
736
+ ...(candidate.conversationId
737
+ ? { conversation_id: candidate.conversationId }
738
+ : {}),
739
+ ...(candidate.title ? { title: candidate.title } : {}),
740
+ status: "failed",
741
+ lane: triage.lane,
742
+ error,
743
+ });
744
+ process.stderr.write(` Failed: ${error}\n`);
745
+ }
746
+ else {
747
+ touchedFilesThisRun.add(candidate.file.name);
748
+ markHistoricalItem(campaignBatch, {
749
+ itemId: candidate.id,
750
+ file: candidate.file.name,
751
+ ...(candidate.conversationId
752
+ ? { conversationId: candidate.conversationId }
753
+ : {}),
754
+ ...(candidate.title ? { title: candidate.title } : {}),
755
+ lastResult: "promote_to_extract",
756
+ terminal: true,
757
+ terminalStatus: "promote_to_extract",
758
+ triage,
759
+ nowIso,
760
+ });
761
+ results.push({
762
+ file: candidate.file.name,
763
+ ...(candidate.conversationId
764
+ ? { conversation_id: candidate.conversationId }
765
+ : {}),
766
+ ...(candidate.title ? { title: candidate.title } : {}),
767
+ status: "completed",
768
+ lane: triage.lane,
769
+ });
770
+ process.stderr.write(" Completed\n");
771
+ }
772
+ }
773
+ catch (err) {
774
+ touchedFilesThisRun.add(candidate.file.name);
775
+ const msg = err instanceof CliError
776
+ ? formatCliErrorForHistoricalBackfill(err)
777
+ : err instanceof Error
778
+ ? err.message
779
+ : String(err);
780
+ markHistoricalItem(campaignBatch, {
781
+ itemId: candidate.id,
782
+ file: candidate.file.name,
783
+ ...(candidate.conversationId
784
+ ? { conversationId: candidate.conversationId }
785
+ : {}),
786
+ ...(candidate.title ? { title: candidate.title } : {}),
787
+ lastResult: "error",
788
+ terminal: false,
789
+ triage,
790
+ nowIso,
791
+ });
792
+ results.push({
793
+ file: candidate.file.name,
794
+ ...(candidate.conversationId
795
+ ? { conversation_id: candidate.conversationId }
796
+ : {}),
797
+ ...(candidate.title ? { title: candidate.title } : {}),
798
+ status: "error",
799
+ lane: triage.lane,
800
+ error: msg,
801
+ });
802
+ process.stderr.write(` Error: ${msg}\n`);
803
+ }
804
+ }
805
+ finalizeHistoricalFiles(campaignBatch, nowIso);
806
+ reviewBacklogAfter = reviewQueueSize(dataDir);
807
+ addHistoricalRunBudgetUsage(campaignState, {
808
+ weekKey: budgetWindow.week_key,
809
+ dayKey: budgetWindow.day_key,
810
+ filesProcessed: touchedFilesThisRun.size,
811
+ triageSpendUsd,
812
+ });
813
+ budgetUsageCommitted = true;
814
+ const hasProcessingErrors = results.some((result) => result.status === "failed" || result.status === "error");
815
+ const operatorLimitedCompletion = limitedByOperator && !hasProcessingErrors;
816
+ const evaluation = evaluateHistoricalBatch({
817
+ state: campaignState,
818
+ batch: campaignBatch,
819
+ preflight,
820
+ now,
821
+ runFileCount,
822
+ reviewBacklogAfter,
823
+ triageSpendUsd,
824
+ reportPath,
825
+ processedFiles: filesForRun.map((file) => file.name),
826
+ results,
827
+ ...(!operatorLimitedCompletion &&
828
+ !reviewBacklogStopped &&
829
+ stopReason &&
830
+ !hasProcessingErrors
831
+ ? { incompleteStatus: "running" }
832
+ : {}),
833
+ });
834
+ const isResumableIncompleteStatus = evaluation.report.status === "running";
835
+ if (operatorLimitedCompletion &&
836
+ isResumableIncompleteStatus &&
837
+ evaluation.report.status === "running") {
838
+ evaluation.report.status = "completed_with_warnings";
839
+ evaluation.report.next_action = stopReason;
840
+ campaignBatch.status = "completed_with_warnings";
841
+ campaignBatch.next_action = stopReason;
842
+ recomputeHistoricalCampaignSummary(campaignState);
843
+ }
844
+ else if (reviewBacklogStopped &&
845
+ !hasProcessingErrors &&
846
+ isResumableIncompleteStatus &&
847
+ evaluation.report.status === "running") {
848
+ evaluation.report.status = "completed_with_warnings";
849
+ evaluation.report.next_action = stopReason;
850
+ campaignBatch.status = "completed_with_warnings";
851
+ campaignBatch.next_action = stopReason;
852
+ recomputeHistoricalCampaignSummary(campaignState);
853
+ }
854
+ else if (stopReason && !hasProcessingErrors && isResumableIncompleteStatus) {
855
+ evaluation.report.status = "running";
856
+ evaluation.report.next_action = stopReason;
857
+ campaignBatch.status = "running";
858
+ campaignBatch.next_action = stopReason;
859
+ recomputeHistoricalCampaignSummary(campaignState);
860
+ }
861
+ campaignBatch.report_path = reportPath;
862
+ campaignState.last_run_at = nowIso;
863
+ await writeHistoricalCampaignReport(reportPath, evaluation.report);
864
+ await writeHistoricalCampaignState(dataDir, campaignState);
865
+ if (globalOpts.json) {
866
+ process.stdout.write(JSON.stringify(evaluation.report, null, 2) + "\n");
867
+ }
868
+ else {
869
+ process.stdout.write(formatHistoricalCampaignSummary(evaluation.report));
870
+ }
871
+ if (campaignBatch.status === "failed" || campaignBatch.status === "quarantined") {
872
+ process.exitCode = 1;
873
+ }
874
+ }
875
+ catch (runErr) {
876
+ finalizeHistoricalFiles(campaignBatch, new Date().toISOString());
877
+ reviewBacklogAfter = reviewQueueSize(dataDir);
878
+ if (!budgetUsageCommitted && (triageSpendUsd > 0 || results.length > 0)) {
879
+ addHistoricalRunBudgetUsage(campaignState, {
880
+ weekKey: budgetWindow.week_key,
881
+ dayKey: budgetWindow.day_key,
882
+ filesProcessed: touchedFilesThisRun.size,
883
+ triageSpendUsd,
884
+ });
885
+ budgetUsageCommitted = true;
886
+ }
887
+ await persistHistoricalCampaignCheckpoint({
888
+ dataDir,
889
+ state: campaignState,
890
+ batch: campaignBatch,
891
+ preflight,
892
+ now,
893
+ reportPath,
894
+ runFileCount,
895
+ reviewBacklogAfter,
896
+ triageSpendUsd,
897
+ processedFiles: filesForRun.map((file) => file.name),
898
+ results,
899
+ status: "failed",
900
+ nextAction: "Batch failed mid-run. Resume only unresolved files after fixing the error.",
901
+ incompleteStatus: "failed",
902
+ });
903
+ throw runErr;
904
+ }
905
+ }
906
+ catch (err) {
907
+ process.stderr.write(`Error: ${err instanceof CliError ? err.message : err instanceof Error ? err.message : String(err)}\n`);
908
+ process.exitCode = 1;
909
+ }
910
+ });
911
+ }
912
+ function ensureHistoricalPendingFile(batch, fileName, nowIso) {
913
+ batch.files[fileName] ??= {
914
+ file: fileName,
915
+ terminal: false,
916
+ item_ids: [],
917
+ last_result: "pending",
918
+ attempts: 0,
919
+ updated_at: nowIso,
920
+ };
921
+ }
922
+ async function persistHistoricalCampaignCheckpoint(params) {
923
+ let report;
924
+ params.batch.report_path = params.reportPath;
925
+ params.batch.next_action = params.nextAction;
926
+ if (params.status === "running") {
927
+ params.batch.status = "running";
928
+ report = snapshotHistoricalCampaignReport({
929
+ state: params.state,
930
+ batch: params.batch,
931
+ preflight: params.preflight,
932
+ now: params.now,
933
+ runFileCount: params.runFileCount,
934
+ reviewBacklogAfter: params.reviewBacklogAfter,
935
+ triageSpendUsd: params.triageSpendUsd,
936
+ processedFiles: params.processedFiles,
937
+ status: "running",
938
+ nextAction: params.nextAction,
939
+ nextBatchSize: currentHistoricalBatchLevel(params.batch.total_files),
940
+ results: params.results,
941
+ });
942
+ params.batch.counts = summarizeHistoricalBatchState(params.batch, params.preflight).counts;
943
+ params.batch.review_backlog_after = params.reviewBacklogAfter;
944
+ }
945
+ else {
946
+ const evaluation = evaluateHistoricalBatch({
947
+ state: params.state,
948
+ batch: params.batch,
949
+ preflight: params.preflight,
950
+ now: params.now,
951
+ runFileCount: params.runFileCount,
952
+ reviewBacklogAfter: params.reviewBacklogAfter,
953
+ triageSpendUsd: params.triageSpendUsd,
954
+ reportPath: params.reportPath,
955
+ processedFiles: params.processedFiles,
956
+ results: params.results,
957
+ ...(params.incompleteStatus
958
+ ? { incompleteStatus: params.incompleteStatus }
959
+ : {}),
960
+ });
961
+ report = evaluation.report;
962
+ report.status = params.status;
963
+ report.next_action = params.nextAction;
964
+ report.results = params.results;
965
+ params.batch.status = params.status;
966
+ params.batch.next_action = params.nextAction;
967
+ }
968
+ recomputeHistoricalCampaignSummary(params.state);
969
+ params.state.last_run_at = params.now.toISOString();
970
+ await writeHistoricalCampaignReport(params.reportPath, report);
971
+ await writeHistoricalCampaignState(params.dataDir, params.state);
972
+ return report;
973
+ }
974
+ function currentHistoricalBatchLevel(totalFiles) {
975
+ if (totalFiles <= 100)
976
+ return 100;
977
+ if (totalFiles <= 250)
978
+ return 250;
979
+ return 500;
980
+ }
981
+ function buildHistoricalTriageItem(file, source) {
982
+ const fileBuffer = fs.readFileSync(file.path);
983
+ const extracted = extractArchive(fileBuffer, file.name);
984
+ const parser = HISTORICAL_PARSERS[source];
985
+ if (!parser) {
986
+ throw new Error(`No historical triage parser for source: ${source}`);
987
+ }
988
+ const parsed = parser(extracted.files);
989
+ if (parsed.length === 0) {
990
+ const fallback = fileBuffer.toString("utf-8").slice(0, 12_000);
991
+ return [{
992
+ id: file.name,
993
+ kind: "file_fallback",
994
+ source,
995
+ file,
996
+ triageContent: fallback || `File: ${file.name}`,
997
+ reviewContent: fallback || `File: ${file.name}`,
998
+ conversationCount: 0,
999
+ }];
1000
+ }
1001
+ const rawByConversationId = collectRawConversations(source, extracted.files);
1002
+ return parsed.map((conversation) => {
1003
+ const reviewContent = buildConversationReviewContent({
1004
+ source,
1005
+ fileName: file.name,
1006
+ conversationId: conversation.id,
1007
+ title: conversation.title,
1008
+ createdAt: conversation.createdAt,
1009
+ content: conversation.content,
1010
+ });
1011
+ return {
1012
+ id: historicalTriageItemId(file.name, conversation.id),
1013
+ kind: "conversation",
1014
+ source,
1015
+ file,
1016
+ conversationId: conversation.id,
1017
+ title: conversation.title,
1018
+ createdAt: conversation.createdAt,
1019
+ triageContent: reviewContent.slice(0, 12_000),
1020
+ reviewContent,
1021
+ conversationCount: 1,
1022
+ ...(rawByConversationId.has(conversation.id)
1023
+ ? {
1024
+ upload: buildSyntheticConversationUpload(source, conversation.id, rawByConversationId.get(conversation.id)),
1025
+ }
1026
+ : {}),
1027
+ };
1028
+ });
1029
+ }
1030
+ async function runHistoricalTriage(params) {
1031
+ const endpointPath = historicalTriageEndpointPath(params.providerOverride);
1032
+ const body = {
1033
+ items: params.items.map((item) => ({
1034
+ id: item.id,
1035
+ content: item.triageContent,
1036
+ source: item.source,
1037
+ })),
1038
+ idempotency_key: historicalTriageIdempotencyKey(params.batchDir, params.items, params.providerOverride),
1039
+ };
1040
+ const { data } = await params.client.post(endpointPath, body, historicalInternalRouteOptions(params.dataDir, params.providerOverride));
1041
+ const resp = data;
1042
+ const triageJob = await pollJob({
1043
+ get: params.client.get.bind(params.client),
1044
+ jobId: resp.job_id,
1045
+ });
1046
+ if (isJobFailure(triageJob.job, triageJob.timedOut)) {
1047
+ throw new Error(triageJob.job.error ??
1048
+ (triageJob.timedOut ? "triage timed out" : "triage failed"));
1049
+ }
1050
+ const resultsPath = path.join(params.dataDir, "triage-results", `${resp.job_id}.json`);
1051
+ if (!fs.existsSync(resultsPath)) {
1052
+ throw new Error(`Missing triage results file: ${resultsPath}`);
1053
+ }
1054
+ const output = JSON.parse(fs.readFileSync(resultsPath, "utf-8"));
1055
+ const artifact = {
1056
+ batch: path.basename(params.batchDir),
1057
+ source: params.items[0]?.source,
1058
+ generated_at: new Date().toISOString(),
1059
+ ...(output.metering_mode ? { metering_mode: output.metering_mode } : {}),
1060
+ ...(output.spend_note ? { spend_note: output.spend_note } : {}),
1061
+ ...(typeof output.spent_usd === "number"
1062
+ ? { spent_usd: output.spent_usd }
1063
+ : {}),
1064
+ items: params.items.map((item) => {
1065
+ const result = output.items.find((entry) => entry.id === item.id);
1066
+ return {
1067
+ item_id: item.id,
1068
+ file: item.file.name,
1069
+ kind: item.kind,
1070
+ ...(item.conversationId
1071
+ ? { conversation_id: item.conversationId }
1072
+ : {}),
1073
+ ...(item.title ? { title: item.title } : {}),
1074
+ ...(item.createdAt ? { created_at: item.createdAt } : {}),
1075
+ conversation_count: item.conversationCount,
1076
+ ...(result?.triage ? { triage: result.triage } : {}),
1077
+ ...(result?.error ? { error: result.error } : {}),
1078
+ };
1079
+ }),
1080
+ };
1081
+ fs.writeFileSync(path.join(params.batchDir, "triage.json"), JSON.stringify(artifact, null, 2) + "\n", "utf-8");
1082
+ return artifact;
1083
+ }
1084
+ function writePreflightSummary(params) {
1085
+ const { batchDir, manifest, preflight, stderr } = params;
1086
+ const allowed = SOURCE_EXTENSIONS[manifest.source].join(", ");
1087
+ stderr.write(`Preflight: ${manifest.batch_name}\n` +
1088
+ ` Path: ${batchDir}\n` +
1089
+ ` Source: ${manifest.source} (allowed extensions: ${allowed})\n` +
1090
+ ` Total files: ${preflight.total_files}\n` +
1091
+ ` Supported: ${preflight.supported_files}\n` +
1092
+ ` Unsupported: ${preflight.unsupported_files}\n` +
1093
+ ` Junk candidates: ${preflight.junk_candidates}\n` +
1094
+ ` Duplicate hashes: ${preflight.duplicate_candidates}\n` +
1095
+ ` Size (min/med/max/total bytes): ${preflight.size_distribution.min}/${preflight.size_distribution.median}/${preflight.size_distribution.max}/${preflight.size_distribution.total}\n` +
1096
+ ` Manifest: ${path.join(batchDir, "manifest.json")}\n` +
1097
+ ` Preflight: ${path.join(batchDir, "preflight.json")}\n`);
1098
+ const flagged = preflight.files.filter((f) => f.junk_markers.length > 0);
1099
+ if (flagged.length > 0) {
1100
+ stderr.write(`\nFlagged files:\n`);
1101
+ for (const f of flagged) {
1102
+ stderr.write(` - ${f.name}: ${f.junk_markers.join(", ")}\n`);
1103
+ }
1104
+ }
1105
+ }
1106
+ function historicalTriageItemId(fileName, conversationId) {
1107
+ return `${fileName}::${conversationId}`;
1108
+ }
1109
+ function historicalConversationKey(source, conversationId) {
1110
+ return `historical:${source}:${conversationId}`;
1111
+ }
1112
+ function formatHistoricalLabel(item) {
1113
+ if (item.kind === "conversation" && item.conversationId) {
1114
+ return `${item.file.name}#${item.conversationId}`;
1115
+ }
1116
+ return item.file.name;
1117
+ }
1118
+ function buildConversationReviewContent(params) {
1119
+ return [
1120
+ `Source: ${params.source}`,
1121
+ `File: ${params.fileName}`,
1122
+ `Conversation ID: ${params.conversationId}`,
1123
+ `Title: ${params.title}`,
1124
+ `Created: ${params.createdAt}`,
1125
+ "",
1126
+ params.content,
1127
+ ].join("\n");
1128
+ }
1129
+ function collectRawConversations(source, files) {
1130
+ switch (source) {
1131
+ case "chatgpt_web":
1132
+ return collectRawChatGptConversations(files);
1133
+ case "claude_web":
1134
+ return collectRawClaudeConversations(files);
1135
+ case "gemini_web":
1136
+ return collectRawGeminiConversations(files);
1137
+ case "grok_web":
1138
+ return collectRawGrokConversations(files);
1139
+ default:
1140
+ return new Map();
1141
+ }
1142
+ }
1143
+ function collectRawChatGptConversations(files) {
1144
+ const raw = new Map();
1145
+ for (const file of files) {
1146
+ if (!file.path.toLowerCase().endsWith(".json"))
1147
+ continue;
1148
+ let parsed;
1149
+ try {
1150
+ parsed = JSON.parse(file.data.toString("utf-8"));
1151
+ }
1152
+ catch {
1153
+ continue;
1154
+ }
1155
+ if (!Array.isArray(parsed))
1156
+ continue;
1157
+ for (const entry of parsed) {
1158
+ if (!entry || typeof entry !== "object")
1159
+ continue;
1160
+ const conversation = entry;
1161
+ const id = typeof conversation.conversation_id === "string"
1162
+ ? conversation.conversation_id
1163
+ : typeof conversation.id === "string"
1164
+ ? conversation.id
1165
+ : null;
1166
+ if (!id || raw.has(id))
1167
+ continue;
1168
+ raw.set(id, entry);
1169
+ }
1170
+ }
1171
+ return raw;
1172
+ }
1173
+ function collectRawClaudeConversations(files) {
1174
+ const raw = new Map();
1175
+ for (const file of files) {
1176
+ const lower = file.path.toLowerCase();
1177
+ if (!lower.endsWith(".json"))
1178
+ continue;
1179
+ const basename = lower.split("/").pop() ?? "";
1180
+ if (basename !== "conversations.json" &&
1181
+ !basename.startsWith("conversations")) {
1182
+ continue;
1183
+ }
1184
+ let parsed;
1185
+ try {
1186
+ parsed = JSON.parse(file.data.toString("utf-8"));
1187
+ }
1188
+ catch {
1189
+ continue;
1190
+ }
1191
+ if (!Array.isArray(parsed))
1192
+ continue;
1193
+ for (const entry of parsed) {
1194
+ if (!entry || typeof entry !== "object")
1195
+ continue;
1196
+ const conversation = entry;
1197
+ if (typeof conversation.uuid !== "string" || raw.has(conversation.uuid)) {
1198
+ continue;
1199
+ }
1200
+ raw.set(conversation.uuid, entry);
1201
+ }
1202
+ }
1203
+ return raw;
1204
+ }
1205
+ function collectRawGeminiConversations(files) {
1206
+ const raw = new Map();
1207
+ for (const file of files) {
1208
+ if (!file.path.toLowerCase().endsWith(".json"))
1209
+ continue;
1210
+ let parsed;
1211
+ try {
1212
+ parsed = JSON.parse(file.data.toString("utf-8"));
1213
+ }
1214
+ catch {
1215
+ continue;
1216
+ }
1217
+ if (!Array.isArray(parsed))
1218
+ continue;
1219
+ for (const entry of parsed) {
1220
+ if (!entry || typeof entry !== "object")
1221
+ continue;
1222
+ const conversation = entry;
1223
+ if (typeof conversation.conversation_id !== "string" ||
1224
+ conversation.source !== "gemini_web" ||
1225
+ conversation.operative_unit !== "gemini_activity_card" ||
1226
+ raw.has(conversation.conversation_id)) {
1227
+ continue;
1228
+ }
1229
+ raw.set(conversation.conversation_id, entry);
1230
+ }
1231
+ }
1232
+ return raw;
1233
+ }
1234
+ function collectRawGrokConversations(files) {
1235
+ const raw = new Map();
1236
+ for (const file of files) {
1237
+ if (!file.path.toLowerCase().endsWith(".json"))
1238
+ continue;
1239
+ let parsed;
1240
+ try {
1241
+ parsed = JSON.parse(file.data.toString("utf-8"));
1242
+ }
1243
+ catch {
1244
+ continue;
1245
+ }
1246
+ const conversations = parsed?.conversations;
1247
+ if (!Array.isArray(conversations))
1248
+ continue;
1249
+ for (const wrapper of conversations) {
1250
+ if (!wrapper || typeof wrapper !== "object")
1251
+ continue;
1252
+ const id = wrapper.conversation?.id;
1253
+ if (typeof id !== "string" || raw.has(id))
1254
+ continue;
1255
+ raw.set(id, wrapper);
1256
+ }
1257
+ }
1258
+ return raw;
1259
+ }
1260
+ function buildSyntheticConversationUpload(source, conversationId, rawConversation) {
1261
+ // Grok's parser expects the top-level export shape
1262
+ // `{ conversations: [...], projects, tasks, media_posts }`
1263
+ // rather than a bare array of conversations, so the synthetic
1264
+ // single-row upload has to preserve that wrapper.
1265
+ const payload = source === "grok_web"
1266
+ ? { conversations: [rawConversation], projects: [], tasks: [], media_posts: [] }
1267
+ : [rawConversation];
1268
+ return {
1269
+ filename: syntheticConversationFilename(source, conversationId),
1270
+ fileData: Buffer.from(JSON.stringify(payload, null, 2) + "\n", "utf-8"),
1271
+ };
1272
+ }
1273
+ function syntheticConversationFilename(source, conversationId) {
1274
+ const safeConversationId = conversationId.replace(/[^a-zA-Z0-9_-]/g, "_");
1275
+ if (source === "claude_web") {
1276
+ return `conversations-${safeConversationId}.json`;
1277
+ }
1278
+ return `conversation-${safeConversationId}.json`;
1279
+ }
1280
+ function historicalTriageIdempotencyKey(batchDir, items, providerOverride) {
1281
+ const digest = crypto
1282
+ .createHash("sha256")
1283
+ .update(JSON.stringify({
1284
+ batch_dir: path.resolve(batchDir),
1285
+ source: items[0]?.source,
1286
+ triage_provider: effectiveTriageProviderName(providerOverride),
1287
+ items: items
1288
+ .map((item) => ({
1289
+ id: item.id,
1290
+ file: item.file.name,
1291
+ file_path: item.file.path,
1292
+ content_hash: item.file.content_hash,
1293
+ conversation_id: item.conversationId,
1294
+ }))
1295
+ .sort((a, b) => a.id.localeCompare(b.id)),
1296
+ }))
1297
+ .digest("hex")
1298
+ .slice(0, 24);
1299
+ return `backfill-triage:${digest}`;
1300
+ }
1301
+ function resolveBackfillProviderOverride(value, flagName) {
1302
+ if (value === undefined)
1303
+ return undefined;
1304
+ if (!isOperatorOverrideProvider(value)) {
1305
+ throw new Error(`Unsupported ${flagName} "${String(value)}". Supported overrides: codex-cli`);
1306
+ }
1307
+ return value;
1308
+ }
1309
+ function historicalTriageEndpointPath(providerOverride) {
1310
+ return providerOverride === "codex-cli"
1311
+ ? INTERNAL_HISTORICAL_TRIAGE_CODEX_ROUTE
1312
+ : "/triage";
1313
+ }
1314
+ function historicalIngestEndpointPath(providerOverride) {
1315
+ return providerOverride === "codex-cli"
1316
+ ? INTERNAL_HISTORICAL_INGEST_CODEX_ROUTE
1317
+ : "/ingest";
1318
+ }
1319
+ function historicalInternalRouteOptions(dataDir, providerOverride) {
1320
+ if (providerOverride !== "codex-cli") {
1321
+ return undefined;
1322
+ }
1323
+ return {
1324
+ headers: {
1325
+ [HISTORICAL_BACKFILL_CAPABILITY_HEADER]: readRequiredHistoricalCapability(dataDir),
1326
+ },
1327
+ };
1328
+ }
1329
+ function readRequiredHistoricalCapability(dataDir) {
1330
+ const capability = readHistoricalBackfillCapability(dataDir);
1331
+ if (!capability) {
1332
+ throw new Error("Historical Codex override is not initialized on this machine. Start the daemon first so it can create the local backfill capability.");
1333
+ }
1334
+ return capability;
1335
+ }
1336
+ function resolveHistoricalRunTriageProviderName(candidates, triageById) {
1337
+ const providers = new Set(candidates
1338
+ .map((candidate) => triageById.get(candidate.id)?.triage?.provider)
1339
+ .filter((provider) => typeof provider === "string"));
1340
+ return providers.size === 1 ? [...providers][0] : undefined;
1341
+ }
1342
+ function formatCliErrorForHistoricalBackfill(err) {
1343
+ const bodyMessage = extractCliErrorBodyMessage(err.body);
1344
+ return bodyMessage ? `${err.message}: ${bodyMessage}` : err.message;
1345
+ }
1346
+ function extractCliErrorBodyMessage(body) {
1347
+ if (!body || typeof body !== "object")
1348
+ return undefined;
1349
+ const record = body;
1350
+ if (typeof record.message === "string" && record.message.trim()) {
1351
+ return record.message.trim();
1352
+ }
1353
+ if (Array.isArray(record.details)) {
1354
+ const detailMessages = record.details
1355
+ .map((detail) => {
1356
+ if (!detail || typeof detail !== "object")
1357
+ return null;
1358
+ const message = detail.message;
1359
+ return typeof message === "string" && message.trim()
1360
+ ? message.trim()
1361
+ : null;
1362
+ })
1363
+ .filter((message) => message !== null);
1364
+ if (detailMessages.length > 0) {
1365
+ return detailMessages.join("; ");
1366
+ }
1367
+ }
1368
+ return typeof record.error === "string" && record.error.trim()
1369
+ ? record.error.trim()
1370
+ : undefined;
1371
+ }
1372
+ function parsePositiveInteger(value) {
1373
+ const parsed = Number.parseInt(value, 10);
1374
+ if (!Number.isFinite(parsed) || parsed <= 0) {
1375
+ throw new Error(`Expected a positive integer, got "${value}"`);
1376
+ }
1377
+ return parsed;
1378
+ }
1379
+ //# sourceMappingURL=backfill.js.map