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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (386) hide show
  1. package/README.md +35 -9
  2. package/dist/src/auth/keychain.d.ts +9 -0
  3. package/dist/src/auth/keychain.d.ts.map +1 -1
  4. package/dist/src/auth/keychain.js +37 -0
  5. package/dist/src/auth/keychain.js.map +1 -1
  6. package/dist/src/capture/auto-capture.d.ts +7 -0
  7. package/dist/src/capture/auto-capture.d.ts.map +1 -1
  8. package/dist/src/capture/auto-capture.js +82 -15
  9. package/dist/src/capture/auto-capture.js.map +1 -1
  10. package/dist/src/capture/auto-repair.d.ts +110 -0
  11. package/dist/src/capture/auto-repair.d.ts.map +1 -0
  12. package/dist/src/capture/auto-repair.js +269 -0
  13. package/dist/src/capture/auto-repair.js.map +1 -0
  14. package/dist/src/capture/codex-cli-triage-provider.d.ts.map +1 -1
  15. package/dist/src/capture/codex-cli-triage-provider.js +4 -3
  16. package/dist/src/capture/codex-cli-triage-provider.js.map +1 -1
  17. package/dist/src/capture/observability.d.ts +42 -0
  18. package/dist/src/capture/observability.d.ts.map +1 -1
  19. package/dist/src/capture/observability.js +45 -4
  20. package/dist/src/capture/observability.js.map +1 -1
  21. package/dist/src/capture/recover-quarantine.d.ts +260 -0
  22. package/dist/src/capture/recover-quarantine.d.ts.map +1 -0
  23. package/dist/src/capture/recover-quarantine.js +522 -0
  24. package/dist/src/capture/recover-quarantine.js.map +1 -0
  25. package/dist/src/cli/commands/backfill.d.ts.map +1 -1
  26. package/dist/src/cli/commands/backfill.js +5 -2
  27. package/dist/src/cli/commands/backfill.js.map +1 -1
  28. package/dist/src/cli/commands/capture-recover.d.ts +40 -0
  29. package/dist/src/cli/commands/capture-recover.d.ts.map +1 -0
  30. package/dist/src/cli/commands/capture-recover.js +184 -0
  31. package/dist/src/cli/commands/capture-recover.js.map +1 -0
  32. package/dist/src/cli/commands/capture.d.ts.map +1 -1
  33. package/dist/src/cli/commands/capture.js +96 -5
  34. package/dist/src/cli/commands/capture.js.map +1 -1
  35. package/dist/src/cli/commands/doctor.d.ts +6 -0
  36. package/dist/src/cli/commands/doctor.d.ts.map +1 -0
  37. package/dist/src/cli/commands/doctor.js +242 -0
  38. package/dist/src/cli/commands/doctor.js.map +1 -0
  39. package/dist/src/cli/commands/feedback.d.ts +12 -0
  40. package/dist/src/cli/commands/feedback.d.ts.map +1 -1
  41. package/dist/src/cli/commands/feedback.js +93 -4
  42. package/dist/src/cli/commands/feedback.js.map +1 -1
  43. package/dist/src/cli/commands/mcp-install.js +5 -2
  44. package/dist/src/cli/commands/mcp-install.js.map +1 -1
  45. package/dist/src/cli/commands/menubar.d.ts +30 -0
  46. package/dist/src/cli/commands/menubar.d.ts.map +1 -0
  47. package/dist/src/cli/commands/menubar.js +180 -0
  48. package/dist/src/cli/commands/menubar.js.map +1 -0
  49. package/dist/src/cli/commands/onboard.d.ts +129 -0
  50. package/dist/src/cli/commands/onboard.d.ts.map +1 -1
  51. package/dist/src/cli/commands/onboard.js +752 -171
  52. package/dist/src/cli/commands/onboard.js.map +1 -1
  53. package/dist/src/cli/commands/rebuild.d.ts.map +1 -1
  54. package/dist/src/cli/commands/rebuild.js +6 -3
  55. package/dist/src/cli/commands/rebuild.js.map +1 -1
  56. package/dist/src/cli/commands/reconcile.d.ts.map +1 -1
  57. package/dist/src/cli/commands/reconcile.js +12 -0
  58. package/dist/src/cli/commands/reconcile.js.map +1 -1
  59. package/dist/src/cli/commands/review.d.ts.map +1 -1
  60. package/dist/src/cli/commands/review.js +22 -7
  61. package/dist/src/cli/commands/review.js.map +1 -1
  62. package/dist/src/cli/commands/search.d.ts +2 -0
  63. package/dist/src/cli/commands/search.d.ts.map +1 -1
  64. package/dist/src/cli/commands/search.js +34 -4
  65. package/dist/src/cli/commands/search.js.map +1 -1
  66. package/dist/src/cli/commands/status.d.ts +9 -7
  67. package/dist/src/cli/commands/status.d.ts.map +1 -1
  68. package/dist/src/cli/commands/status.js +113 -12
  69. package/dist/src/cli/commands/status.js.map +1 -1
  70. package/dist/src/cli/commands/token-issue.d.ts.map +1 -1
  71. package/dist/src/cli/commands/token-issue.js +9 -1
  72. package/dist/src/cli/commands/token-issue.js.map +1 -1
  73. package/dist/src/cli/commands/triage.d.ts.map +1 -1
  74. package/dist/src/cli/commands/triage.js +7 -5
  75. package/dist/src/cli/commands/triage.js.map +1 -1
  76. package/dist/src/cli/commands/update.d.ts +80 -0
  77. package/dist/src/cli/commands/update.d.ts.map +1 -0
  78. package/dist/src/cli/commands/update.js +378 -0
  79. package/dist/src/cli/commands/update.js.map +1 -0
  80. package/dist/src/cli/default-config-path.d.ts +15 -0
  81. package/dist/src/cli/default-config-path.d.ts.map +1 -0
  82. package/dist/src/cli/default-config-path.js +27 -0
  83. package/dist/src/cli/default-config-path.js.map +1 -0
  84. package/dist/src/cli/feedback/feedback-config.d.ts +46 -0
  85. package/dist/src/cli/feedback/feedback-config.d.ts.map +1 -1
  86. package/dist/src/cli/feedback/feedback-config.js +130 -4
  87. package/dist/src/cli/feedback/feedback-config.js.map +1 -1
  88. package/dist/src/cli/feedback/feedback-history.d.ts +7 -0
  89. package/dist/src/cli/feedback/feedback-history.d.ts.map +1 -1
  90. package/dist/src/cli/feedback/feedback-history.js +39 -9
  91. package/dist/src/cli/feedback/feedback-history.js.map +1 -1
  92. package/dist/src/cli/feedback/feedback-payload.d.ts +22 -1
  93. package/dist/src/cli/feedback/feedback-payload.d.ts.map +1 -1
  94. package/dist/src/cli/feedback/feedback-payload.js.map +1 -1
  95. package/dist/src/cli/feedback/feedback-relay.d.ts +2 -2
  96. package/dist/src/cli/feedback/feedback-relay.d.ts.map +1 -1
  97. package/dist/src/cli/feedback/feedback-relay.js.map +1 -1
  98. package/dist/src/cli/feedback/invite.d.ts +17 -0
  99. package/dist/src/cli/feedback/invite.d.ts.map +1 -0
  100. package/dist/src/cli/feedback/invite.js +67 -0
  101. package/dist/src/cli/feedback/invite.js.map +1 -0
  102. package/dist/src/cli/feedback/relay-secret-store.d.ts +32 -0
  103. package/dist/src/cli/feedback/relay-secret-store.d.ts.map +1 -0
  104. package/dist/src/cli/feedback/relay-secret-store.js +137 -0
  105. package/dist/src/cli/feedback/relay-secret-store.js.map +1 -0
  106. package/dist/src/cli/http-client.d.ts +93 -1
  107. package/dist/src/cli/http-client.d.ts.map +1 -1
  108. package/dist/src/cli/http-client.js +254 -6
  109. package/dist/src/cli/http-client.js.map +1 -1
  110. package/dist/src/cli/index.d.ts.map +1 -1
  111. package/dist/src/cli/index.js +29 -6
  112. package/dist/src/cli/index.js.map +1 -1
  113. package/dist/src/cli/postinstall-menubar.d.ts +22 -0
  114. package/dist/src/cli/postinstall-menubar.d.ts.map +1 -0
  115. package/dist/src/cli/postinstall-menubar.js +39 -0
  116. package/dist/src/cli/postinstall-menubar.js.map +1 -0
  117. package/dist/src/cli/status/friend-header.d.ts +8 -1
  118. package/dist/src/cli/status/friend-header.d.ts.map +1 -1
  119. package/dist/src/cli/status/friend-header.js +334 -26
  120. package/dist/src/cli/status/friend-header.js.map +1 -1
  121. package/dist/src/cli/ui.d.ts +47 -0
  122. package/dist/src/cli/ui.d.ts.map +1 -0
  123. package/dist/src/cli/ui.js +166 -0
  124. package/dist/src/cli/ui.js.map +1 -0
  125. package/dist/src/config/schema.d.ts +79 -0
  126. package/dist/src/config/schema.d.ts.map +1 -1
  127. package/dist/src/config/schema.js +44 -0
  128. package/dist/src/config/schema.js.map +1 -1
  129. package/dist/src/diagnostics/codex-preflight.d.ts +33 -0
  130. package/dist/src/diagnostics/codex-preflight.d.ts.map +1 -0
  131. package/dist/src/diagnostics/codex-preflight.js +75 -0
  132. package/dist/src/diagnostics/codex-preflight.js.map +1 -0
  133. package/dist/src/diagnostics/doctor.d.ts +106 -0
  134. package/dist/src/diagnostics/doctor.d.ts.map +1 -0
  135. package/dist/src/diagnostics/doctor.js +334 -0
  136. package/dist/src/diagnostics/doctor.js.map +1 -0
  137. package/dist/src/diagnostics/notify.d.ts +90 -0
  138. package/dist/src/diagnostics/notify.d.ts.map +1 -0
  139. package/dist/src/diagnostics/notify.js +177 -0
  140. package/dist/src/diagnostics/notify.js.map +1 -0
  141. package/dist/src/diagnostics/repair-prompt.d.ts +49 -0
  142. package/dist/src/diagnostics/repair-prompt.d.ts.map +1 -0
  143. package/dist/src/diagnostics/repair-prompt.js +223 -0
  144. package/dist/src/diagnostics/repair-prompt.js.map +1 -0
  145. package/dist/src/ingestion/inbox-core/conversation-fingerprint.d.ts +2 -0
  146. package/dist/src/ingestion/inbox-core/conversation-fingerprint.d.ts.map +1 -0
  147. package/dist/src/ingestion/inbox-core/conversation-fingerprint.js +27 -0
  148. package/dist/src/ingestion/inbox-core/conversation-fingerprint.js.map +1 -0
  149. package/dist/src/ingestion/inbox-core/conversation-key.d.ts +2 -0
  150. package/dist/src/ingestion/inbox-core/conversation-key.d.ts.map +1 -0
  151. package/dist/src/ingestion/inbox-core/conversation-key.js +31 -0
  152. package/dist/src/ingestion/inbox-core/conversation-key.js.map +1 -0
  153. package/dist/src/ingestion/inbox-core/extensions.d.ts +3 -0
  154. package/dist/src/ingestion/inbox-core/extensions.d.ts.map +1 -0
  155. package/dist/src/ingestion/inbox-core/extensions.js +16 -0
  156. package/dist/src/ingestion/inbox-core/extensions.js.map +1 -0
  157. package/dist/src/ingestion/inbox-core/idempotency.d.ts +2 -0
  158. package/dist/src/ingestion/inbox-core/idempotency.d.ts.map +1 -0
  159. package/dist/src/ingestion/inbox-core/idempotency.js +22 -0
  160. package/dist/src/ingestion/inbox-core/idempotency.js.map +1 -0
  161. package/dist/src/ingestion/inbox-core/index.d.ts +20 -0
  162. package/dist/src/ingestion/inbox-core/index.d.ts.map +1 -0
  163. package/dist/src/ingestion/inbox-core/index.js +20 -0
  164. package/dist/src/ingestion/inbox-core/index.js.map +1 -0
  165. package/dist/src/ingestion/inbox-core/source-detection.d.ts +2 -0
  166. package/dist/src/ingestion/inbox-core/source-detection.d.ts.map +1 -0
  167. package/dist/src/ingestion/inbox-core/source-detection.js +23 -0
  168. package/dist/src/ingestion/inbox-core/source-detection.js.map +1 -0
  169. package/dist/src/ingestion/inbox-core/source-sniffer.d.ts +11 -0
  170. package/dist/src/ingestion/inbox-core/source-sniffer.d.ts.map +1 -0
  171. package/dist/src/ingestion/inbox-core/source-sniffer.js +69 -0
  172. package/dist/src/ingestion/inbox-core/source-sniffer.js.map +1 -0
  173. package/dist/src/ingestion/inbox-core/zip-sniffer.d.ts +70 -0
  174. package/dist/src/ingestion/inbox-core/zip-sniffer.d.ts.map +1 -0
  175. package/dist/src/ingestion/inbox-core/zip-sniffer.js +161 -0
  176. package/dist/src/ingestion/inbox-core/zip-sniffer.js.map +1 -0
  177. package/dist/src/ingestion/inbox-watcher.d.ts.map +1 -1
  178. package/dist/src/ingestion/inbox-watcher.js +34 -50
  179. package/dist/src/ingestion/inbox-watcher.js.map +1 -1
  180. package/dist/src/ingestion/indexer.d.ts +7 -0
  181. package/dist/src/ingestion/indexer.d.ts.map +1 -1
  182. package/dist/src/ingestion/indexer.js +36 -2
  183. package/dist/src/ingestion/indexer.js.map +1 -1
  184. package/dist/src/ingestion/metadata-extraction.d.ts +8 -5
  185. package/dist/src/ingestion/metadata-extraction.d.ts.map +1 -1
  186. package/dist/src/ingestion/metadata-extraction.js +24 -5
  187. package/dist/src/ingestion/metadata-extraction.js.map +1 -1
  188. package/dist/src/ingestion/skip-quarantine.d.ts +10 -0
  189. package/dist/src/ingestion/skip-quarantine.d.ts.map +1 -0
  190. package/dist/src/ingestion/skip-quarantine.js +35 -0
  191. package/dist/src/ingestion/skip-quarantine.js.map +1 -0
  192. package/dist/src/jobs/handlers/compact.d.ts.map +1 -1
  193. package/dist/src/jobs/handlers/compact.js +30 -4
  194. package/dist/src/jobs/handlers/compact.js.map +1 -1
  195. package/dist/src/jobs/handlers/dedupe-conversations.d.ts +134 -0
  196. package/dist/src/jobs/handlers/dedupe-conversations.d.ts.map +1 -0
  197. package/dist/src/jobs/handlers/dedupe-conversations.js +371 -0
  198. package/dist/src/jobs/handlers/dedupe-conversations.js.map +1 -0
  199. package/dist/src/jobs/handlers/ingest.d.ts.map +1 -1
  200. package/dist/src/jobs/handlers/ingest.js +295 -41
  201. package/dist/src/jobs/handlers/ingest.js.map +1 -1
  202. package/dist/src/jobs/handlers/reconcile.d.ts +28 -0
  203. package/dist/src/jobs/handlers/reconcile.d.ts.map +1 -1
  204. package/dist/src/jobs/handlers/reconcile.js +145 -19
  205. package/dist/src/jobs/handlers/reconcile.js.map +1 -1
  206. package/dist/src/jobs/handlers/reindex.d.ts.map +1 -1
  207. package/dist/src/jobs/handlers/reindex.js +13 -2
  208. package/dist/src/jobs/handlers/reindex.js.map +1 -1
  209. package/dist/src/jobs/handlers/save.d.ts.map +1 -1
  210. package/dist/src/jobs/handlers/save.js +57 -3
  211. package/dist/src/jobs/handlers/save.js.map +1 -1
  212. package/dist/src/jobs/queue.d.ts +51 -1
  213. package/dist/src/jobs/queue.d.ts.map +1 -1
  214. package/dist/src/jobs/queue.js +466 -26
  215. package/dist/src/jobs/queue.js.map +1 -1
  216. package/dist/src/jobs/worker-entry.d.ts.map +1 -1
  217. package/dist/src/jobs/worker-entry.js +35 -7
  218. package/dist/src/jobs/worker-entry.js.map +1 -1
  219. package/dist/src/jobs/worker-process.d.ts +11 -0
  220. package/dist/src/jobs/worker-process.d.ts.map +1 -1
  221. package/dist/src/jobs/worker-process.js +37 -4
  222. package/dist/src/jobs/worker-process.js.map +1 -1
  223. package/dist/src/main.js +199 -46
  224. package/dist/src/main.js.map +1 -1
  225. package/dist/src/mcp/errors.d.ts.map +1 -1
  226. package/dist/src/mcp/errors.js +20 -1
  227. package/dist/src/mcp/errors.js.map +1 -1
  228. package/dist/src/mcp/server.d.ts.map +1 -1
  229. package/dist/src/mcp/server.js +43 -3
  230. package/dist/src/mcp/server.js.map +1 -1
  231. package/dist/src/mcp/tools/context-pack.d.ts.map +1 -1
  232. package/dist/src/mcp/tools/context-pack.js +164 -23
  233. package/dist/src/mcp/tools/context-pack.js.map +1 -1
  234. package/dist/src/mcp/tools/search.d.ts +6 -2
  235. package/dist/src/mcp/tools/search.d.ts.map +1 -1
  236. package/dist/src/mcp/tools/search.js +35 -4
  237. package/dist/src/mcp/tools/search.js.map +1 -1
  238. package/dist/src/observability/embedding-events.d.ts +52 -0
  239. package/dist/src/observability/embedding-events.d.ts.map +1 -0
  240. package/dist/src/observability/embedding-events.js +149 -0
  241. package/dist/src/observability/embedding-events.js.map +1 -0
  242. package/dist/src/observability/index-events.d.ts +70 -0
  243. package/dist/src/observability/index-events.d.ts.map +1 -0
  244. package/dist/src/observability/index-events.js +148 -0
  245. package/dist/src/observability/index-events.js.map +1 -0
  246. package/dist/src/observability/onboarding-metric.d.ts +131 -0
  247. package/dist/src/observability/onboarding-metric.d.ts.map +1 -0
  248. package/dist/src/observability/onboarding-metric.js +351 -0
  249. package/dist/src/observability/onboarding-metric.js.map +1 -0
  250. package/dist/src/observability/tool-usage-stats.d.ts +77 -4
  251. package/dist/src/observability/tool-usage-stats.d.ts.map +1 -1
  252. package/dist/src/observability/tool-usage-stats.js +112 -32
  253. package/dist/src/observability/tool-usage-stats.js.map +1 -1
  254. package/dist/src/observability/tool-usage.d.ts +100 -7
  255. package/dist/src/observability/tool-usage.d.ts.map +1 -1
  256. package/dist/src/observability/tool-usage.js +196 -33
  257. package/dist/src/observability/tool-usage.js.map +1 -1
  258. package/dist/src/observability/version-check.d.ts +71 -0
  259. package/dist/src/observability/version-check.d.ts.map +1 -0
  260. package/dist/src/observability/version-check.js +198 -0
  261. package/dist/src/observability/version-check.js.map +1 -0
  262. package/dist/src/providers/basic-metadata-extraction.d.ts +60 -0
  263. package/dist/src/providers/basic-metadata-extraction.d.ts.map +1 -0
  264. package/dist/src/providers/basic-metadata-extraction.js +114 -0
  265. package/dist/src/providers/basic-metadata-extraction.js.map +1 -0
  266. package/dist/src/providers/codex-cli-metadata-extraction.d.ts +1 -0
  267. package/dist/src/providers/codex-cli-metadata-extraction.d.ts.map +1 -1
  268. package/dist/src/providers/codex-cli-metadata-extraction.js +6 -2
  269. package/dist/src/providers/codex-cli-metadata-extraction.js.map +1 -1
  270. package/dist/src/providers/codex-cli-model.d.ts +61 -0
  271. package/dist/src/providers/codex-cli-model.d.ts.map +1 -0
  272. package/dist/src/providers/codex-cli-model.js +194 -0
  273. package/dist/src/providers/codex-cli-model.js.map +1 -0
  274. package/dist/src/providers/codex-cli-runner.d.ts +39 -0
  275. package/dist/src/providers/codex-cli-runner.d.ts.map +1 -1
  276. package/dist/src/providers/codex-cli-runner.js +234 -48
  277. package/dist/src/providers/codex-cli-runner.js.map +1 -1
  278. package/dist/src/providers/conversation-generation.d.ts.map +1 -1
  279. package/dist/src/providers/conversation-generation.js +43 -6
  280. package/dist/src/providers/conversation-generation.js.map +1 -1
  281. package/dist/src/providers/ollama-embed.d.ts +2 -1
  282. package/dist/src/providers/ollama-embed.d.ts.map +1 -1
  283. package/dist/src/providers/ollama-embed.js +1 -0
  284. package/dist/src/providers/ollama-embed.js.map +1 -1
  285. package/dist/src/providers/openai-metadata-extraction.d.ts +3 -3
  286. package/dist/src/providers/openai-metadata-extraction.d.ts.map +1 -1
  287. package/dist/src/providers/openai-metadata-extraction.js +18 -3
  288. package/dist/src/providers/openai-metadata-extraction.js.map +1 -1
  289. package/dist/src/providers/placeholder-embed.d.ts +56 -0
  290. package/dist/src/providers/placeholder-embed.d.ts.map +1 -0
  291. package/dist/src/providers/placeholder-embed.js +64 -0
  292. package/dist/src/providers/placeholder-embed.js.map +1 -0
  293. package/dist/src/providers/stub.d.ts +2 -0
  294. package/dist/src/providers/stub.d.ts.map +1 -1
  295. package/dist/src/providers/stub.js +2 -0
  296. package/dist/src/providers/stub.js.map +1 -1
  297. package/dist/src/providers/types.d.ts +11 -0
  298. package/dist/src/providers/types.d.ts.map +1 -1
  299. package/dist/src/providers/voyage.d.ts +2 -1
  300. package/dist/src/providers/voyage.d.ts.map +1 -1
  301. package/dist/src/providers/voyage.js +1 -0
  302. package/dist/src/providers/voyage.js.map +1 -1
  303. package/dist/src/retrieval/compact.d.ts +116 -2
  304. package/dist/src/retrieval/compact.d.ts.map +1 -1
  305. package/dist/src/retrieval/compact.js +158 -5
  306. package/dist/src/retrieval/compact.js.map +1 -1
  307. package/dist/src/retrieval/context-pack.d.ts +114 -0
  308. package/dist/src/retrieval/context-pack.d.ts.map +1 -1
  309. package/dist/src/retrieval/context-pack.js +292 -8
  310. package/dist/src/retrieval/context-pack.js.map +1 -1
  311. package/dist/src/retrieval/current-truth.d.ts +360 -0
  312. package/dist/src/retrieval/current-truth.d.ts.map +1 -0
  313. package/dist/src/retrieval/current-truth.js +766 -0
  314. package/dist/src/retrieval/current-truth.js.map +1 -0
  315. package/dist/src/retrieval/git-state.d.ts +53 -0
  316. package/dist/src/retrieval/git-state.d.ts.map +1 -0
  317. package/dist/src/retrieval/git-state.js +174 -0
  318. package/dist/src/retrieval/git-state.js.map +1 -0
  319. package/dist/src/retrieval/lexical.d.ts.map +1 -1
  320. package/dist/src/retrieval/lexical.js +19 -3
  321. package/dist/src/retrieval/lexical.js.map +1 -1
  322. package/dist/src/retrieval/locator-boost.d.ts +37 -0
  323. package/dist/src/retrieval/locator-boost.d.ts.map +1 -0
  324. package/dist/src/retrieval/locator-boost.js +129 -0
  325. package/dist/src/retrieval/locator-boost.js.map +1 -0
  326. package/dist/src/retrieval/report-demotion.d.ts +46 -0
  327. package/dist/src/retrieval/report-demotion.d.ts.map +1 -0
  328. package/dist/src/retrieval/report-demotion.js +169 -0
  329. package/dist/src/retrieval/report-demotion.js.map +1 -0
  330. package/dist/src/retrieval/vector.d.ts.map +1 -1
  331. package/dist/src/retrieval/vector.js +11 -2
  332. package/dist/src/retrieval/vector.js.map +1 -1
  333. package/dist/src/server/app.d.ts.map +1 -1
  334. package/dist/src/server/app.js +92 -11
  335. package/dist/src/server/app.js.map +1 -1
  336. package/dist/src/server/routes/compact.d.ts.map +1 -1
  337. package/dist/src/server/routes/compact.js +4 -1
  338. package/dist/src/server/routes/compact.js.map +1 -1
  339. package/dist/src/server/routes/context.d.ts +1 -1
  340. package/dist/src/server/routes/context.d.ts.map +1 -1
  341. package/dist/src/server/routes/context.js +2 -1
  342. package/dist/src/server/routes/context.js.map +1 -1
  343. package/dist/src/server/routes/conversations-search.d.ts.map +1 -1
  344. package/dist/src/server/routes/conversations-search.js +28 -3
  345. package/dist/src/server/routes/conversations-search.js.map +1 -1
  346. package/dist/src/server/routes/enqueue.d.ts +11 -0
  347. package/dist/src/server/routes/enqueue.d.ts.map +1 -0
  348. package/dist/src/server/routes/enqueue.js +17 -0
  349. package/dist/src/server/routes/enqueue.js.map +1 -0
  350. package/dist/src/server/routes/friend-status.d.ts +339 -3
  351. package/dist/src/server/routes/friend-status.d.ts.map +1 -1
  352. package/dist/src/server/routes/friend-status.js +447 -13
  353. package/dist/src/server/routes/friend-status.js.map +1 -1
  354. package/dist/src/server/routes/ingest.d.ts.map +1 -1
  355. package/dist/src/server/routes/ingest.js +5 -2
  356. package/dist/src/server/routes/ingest.js.map +1 -1
  357. package/dist/src/server/routes/mcp-usage.d.ts +5 -4
  358. package/dist/src/server/routes/mcp-usage.d.ts.map +1 -1
  359. package/dist/src/server/routes/mcp-usage.js.map +1 -1
  360. package/dist/src/server/routes/reconcile.d.ts.map +1 -1
  361. package/dist/src/server/routes/reconcile.js +20 -1
  362. package/dist/src/server/routes/reconcile.js.map +1 -1
  363. package/dist/src/server/routes/reindex.d.ts.map +1 -1
  364. package/dist/src/server/routes/reindex.js +4 -1
  365. package/dist/src/server/routes/reindex.js.map +1 -1
  366. package/dist/src/server/routes/save.d.ts.map +1 -1
  367. package/dist/src/server/routes/save.js +4 -1
  368. package/dist/src/server/routes/save.js.map +1 -1
  369. package/dist/src/server/routes/search.d.ts +1 -1
  370. package/dist/src/server/routes/search.d.ts.map +1 -1
  371. package/dist/src/server/routes/search.js +253 -29
  372. package/dist/src/server/routes/search.js.map +1 -1
  373. package/dist/src/server/routes/triage.d.ts.map +1 -1
  374. package/dist/src/server/routes/triage.js +4 -1
  375. package/dist/src/server/routes/triage.js.map +1 -1
  376. package/dist/src/storage/rebuild.d.ts +35 -1
  377. package/dist/src/storage/rebuild.d.ts.map +1 -1
  378. package/dist/src/storage/rebuild.js +288 -64
  379. package/dist/src/storage/rebuild.js.map +1 -1
  380. package/dist/src/storage/tables.d.ts +29 -0
  381. package/dist/src/storage/tables.d.ts.map +1 -1
  382. package/dist/src/storage/tables.js +32 -1
  383. package/dist/src/storage/tables.js.map +1 -1
  384. package/operator/swiftbar/render-menu.py +524 -0
  385. package/operator/swiftbar/rift.10s.sh +176 -0
  386. package/package.json +9 -3
@@ -0,0 +1,522 @@
1
+ /**
2
+ * Oversized-quarantine recovery for Codex CLI sessions.
3
+ *
4
+ * Auto-capture quarantines Codex sessions larger than
5
+ * `capture.codex_cli.max_session_bytes` (see `auto-capture.ts`) because
6
+ * the triage subprocess exits 1 on very large stdin. The session jsonl
7
+ * is left untouched on disk and a small recovery record is written to
8
+ * `data/quarantine/codex_cli_<sessionId>_<fingerprint>.json`.
9
+ *
10
+ * This module reads those records, resolves the original session file,
11
+ * chunks the parsed transcript by message boundaries within a byte
12
+ * budget that fits comfortably below the triage threshold, summarizes
13
+ * each chunk via the Codex CLI JSON runner, and emits ONE recovered
14
+ * conversation artifact per original session through the existing
15
+ * `/save` path. A recovery-state file keyed by `<source>:<sessionId>`
16
+ * makes reruns idempotent — already-recovered sessions are skipped, not
17
+ * re-saved, even if multiple quarantine records exist for the same
18
+ * session at different growth points.
19
+ *
20
+ * Provenance is embedded in two places compatible with the current
21
+ * conversation schema:
22
+ * 1. The first topic of the recovered artifact is the literal string
23
+ * `recovered_oversized_quarantine`, plus a `source_session:<sid>`
24
+ * tag, so search results can be traced back without schema work.
25
+ * 2. The recovered content starts with a short machine-readable
26
+ * header noting the session id, original byte size, chunk count,
27
+ * and `recovered_at` timestamp.
28
+ */
29
+ import fs from "node:fs";
30
+ import path from "node:path";
31
+ import { z } from "zod";
32
+ import { atomicWrite } from "../storage/atomic.js";
33
+ import { parseCodexSession } from "../ingestion/parsers/codex-jsonl.js";
34
+ import { runCodexCliJson } from "../providers/codex-cli-runner.js";
35
+ const QUARANTINE_FILE_PREFIX = "codex_cli_";
36
+ const QUARANTINE_FILE_SUFFIX = ".json";
37
+ const RECOVERY_STATE_FILE = "quarantine-recovery-state.json";
38
+ /**
39
+ * Default byte budget per summarization chunk. Sits well below the
40
+ * 8 MB auto-capture threshold so the Codex CLI input never hits the
41
+ * same wall that caused the quarantine in the first place. 512 KB
42
+ * fits comfortably in stdin and leaves room for the prompt.
43
+ */
44
+ export const DEFAULT_RECOVERY_CHUNK_BYTES = 512 * 1024;
45
+ /** Minimum chunk size we allow — anything smaller risks turn-truncation. */
46
+ export const MIN_RECOVERY_CHUNK_BYTES = 16 * 1024;
47
+ export const PROVENANCE_TOPIC = "recovered_oversized_quarantine";
48
+ const QuarantineRecordSchema = z.object({
49
+ source: z.literal("codex_cli"),
50
+ session_id: z.string().min(1),
51
+ session_path: z.string().min(1),
52
+ size_bytes: z.number().int().nonnegative(),
53
+ threshold_bytes: z.number().int().nonnegative(),
54
+ fingerprint: z.string().min(1),
55
+ reason: z.string(),
56
+ quarantined_at: z.string(),
57
+ });
58
+ // The save/ingest *failure* path quarantines into the SAME `data/quarantine/`
59
+ // dir under the SAME `{source}_{timestamp}_{hash}.json` naming, so its records
60
+ // land in our glob. They are valid records of a different kind (a save/parse
61
+ // failure, shaped `{ payload | conversation_id, error, quarantined_at }`), not
62
+ // oversized-session recovery records — the discriminator is the `error` field,
63
+ // which oversized-session records never carry. We skip them SILENTLY (logging
64
+ // them as "malformed" every recovery pass spams the daemon log). Genuinely
65
+ // broken JSON / unknown shapes still log. A durable fix is to namespace the two
66
+ // quarantine kinds into separate dirs/prefixes so they can't collide — tracked
67
+ // as a follow-up; this is the low-risk loader-side guard.
68
+ const ForeignFailureQuarantineSchema = z.object({
69
+ error: z.string(),
70
+ quarantined_at: z.string(),
71
+ });
72
+ const RecoveredEntrySchema = z.object({
73
+ recovered_at: z.string(),
74
+ fingerprint: z.string(),
75
+ idempotency_key: z.string(),
76
+ chunks: z.number().int().nonnegative(),
77
+ session_path: z.string(),
78
+ size_bytes: z.number().int().nonnegative(),
79
+ });
80
+ const RecoveryStateSchema = z.object({
81
+ recovered: z.record(z.string(), RecoveredEntrySchema).default({}),
82
+ });
83
+ /** Stable dedupe key — one recovered artifact per Codex session, regardless of fingerprint. */
84
+ function recoveryKey(sessionId) {
85
+ return `codex_cli:${sessionId}`;
86
+ }
87
+ function quarantineDirOf(deps) {
88
+ return deps.quarantineDir ?? path.join(deps.dataDir, "quarantine");
89
+ }
90
+ /**
91
+ * Read all Codex-CLI quarantine records under the configured directory.
92
+ * Malformed JSON / schema mismatches are skipped silently with a stderr
93
+ * note so one corrupt record can never block the rest of the batch.
94
+ */
95
+ export function loadQuarantineRecords(deps) {
96
+ const dir = quarantineDirOf(deps);
97
+ if (!fs.existsSync(dir))
98
+ return [];
99
+ const out = [];
100
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
101
+ if (!entry.isFile())
102
+ continue;
103
+ if (!entry.name.startsWith(QUARANTINE_FILE_PREFIX))
104
+ continue;
105
+ if (!entry.name.endsWith(QUARANTINE_FILE_SUFFIX))
106
+ continue;
107
+ const fullPath = path.join(dir, entry.name);
108
+ let parsed;
109
+ try {
110
+ parsed = JSON.parse(fs.readFileSync(fullPath, "utf-8"));
111
+ }
112
+ catch (err) {
113
+ process.stderr.write(`recover-quarantine: skipping unreadable record ${entry.name}: ${err instanceof Error ? err.message : String(err)}\n`);
114
+ continue;
115
+ }
116
+ const result = QuarantineRecordSchema.safeParse(parsed);
117
+ if (!result.success) {
118
+ // A save/ingest failure record sharing this dir+naming is valid, just
119
+ // not ours — skip it without the per-pass "malformed" noise.
120
+ if (ForeignFailureQuarantineSchema.safeParse(parsed).success)
121
+ continue;
122
+ process.stderr.write(`recover-quarantine: skipping malformed record ${entry.name}\n`);
123
+ continue;
124
+ }
125
+ if (result.data.reason !== "oversized-session")
126
+ continue;
127
+ out.push({ ...result.data, record_path: fullPath });
128
+ }
129
+ return out;
130
+ }
131
+ /**
132
+ * Collapse multiple quarantine records that point at the same session
133
+ * (the same jsonl that hit the threshold at different sizes as it grew)
134
+ * down to one: the latest `quarantined_at`. The collapsed record still
135
+ * carries the recovery key, so reruns can mark every related record as
136
+ * already-recovered for that session.
137
+ */
138
+ export function groupBySession(records) {
139
+ const latest = new Map();
140
+ for (const record of records) {
141
+ const key = recoveryKey(record.session_id);
142
+ const prev = latest.get(key);
143
+ if (!prev || prev.quarantined_at < record.quarantined_at) {
144
+ latest.set(key, record);
145
+ }
146
+ }
147
+ return Array.from(latest.values()).sort((a, b) => a.session_id.localeCompare(b.session_id));
148
+ }
149
+ export function loadRecoveryState(deps) {
150
+ const statePath = path.join(deps.dataDir, RECOVERY_STATE_FILE);
151
+ if (!fs.existsSync(statePath))
152
+ return { recovered: {} };
153
+ let raw;
154
+ try {
155
+ raw = JSON.parse(fs.readFileSync(statePath, "utf-8"));
156
+ }
157
+ catch (err) {
158
+ process.stderr.write(`recover-quarantine: state parse failed (${err instanceof Error ? err.message : String(err)}); starting empty\n`);
159
+ return { recovered: {} };
160
+ }
161
+ const parsed = RecoveryStateSchema.safeParse(raw);
162
+ if (!parsed.success)
163
+ return { recovered: {} };
164
+ return parsed.data;
165
+ }
166
+ export async function saveRecoveryState(deps, state) {
167
+ const statePath = path.join(deps.dataDir, RECOVERY_STATE_FILE);
168
+ await atomicWrite(statePath, JSON.stringify(state, null, 2));
169
+ }
170
+ /**
171
+ * Count distinct oversized Codex sessions that are still parked — i.e. whose
172
+ * LATEST quarantine fingerprint has not yet been recovered. This is the
173
+ * honest "state of the world" the status surface should report, NOT the
174
+ * per-run `quarantined` count from the most recent capture run: that count
175
+ * flickers on/off as a stable oversized file dedups on one run and
176
+ * re-quarantines on the next, which teaches users to distrust the warning.
177
+ *
178
+ * Fingerprint-aware by design (mirrors the skip logic in
179
+ * `runRecoverQuarantine`): a session recovered at an earlier size is NOT
180
+ * counted as covered once the file grows to a new fingerprint, because the
181
+ * old recovery doesn't include the new turns. Counting by bare session id
182
+ * would under-report exactly those grown-since-recovery sessions.
183
+ *
184
+ * Sessions whose source jsonl no longer exists are excluded: recovery skips
185
+ * them as `missing_source` (it has nothing to read), so counting them would
186
+ * surface a "run recovery" advisory that can never clear — recovery cannot
187
+ * recover a file that's gone.
188
+ */
189
+ export function listParkedOversizedSessions(deps) {
190
+ const grouped = groupBySession(loadQuarantineRecords(deps));
191
+ if (grouped.length === 0)
192
+ return [];
193
+ const state = loadRecoveryState(deps);
194
+ const parked = [];
195
+ for (const record of grouped) {
196
+ const prior = state.recovered[recoveryKey(record.session_id)];
197
+ const covered = prior !== undefined && prior.fingerprint === record.fingerprint;
198
+ if (covered)
199
+ continue;
200
+ if (!fs.existsSync(record.session_path))
201
+ continue;
202
+ parked.push(record);
203
+ }
204
+ return parked;
205
+ }
206
+ export function countParkedOversizedSessions(deps) {
207
+ return listParkedOversizedSessions(deps).length;
208
+ }
209
+ /**
210
+ * Split parser-emitted Codex content into byte-budgeted chunks at turn
211
+ * boundaries. The parser format is `User: …\n\nAssistant: …\n\n…`, so
212
+ * we split on `\n\n` immediately preceding a `User:` or `Assistant:`
213
+ * marker. A single turn larger than `maxBytes` becomes its own chunk
214
+ * (oversized but preserved — better than dropping signal).
215
+ */
216
+ export function chunkByTurns(content, maxBytes) {
217
+ if (maxBytes < MIN_RECOVERY_CHUNK_BYTES) {
218
+ throw new Error(`chunkByTurns: maxBytes ${maxBytes} below floor ${MIN_RECOVERY_CHUNK_BYTES}`);
219
+ }
220
+ if (content.length === 0)
221
+ return [];
222
+ const turns = content
223
+ .split(/\n\n(?=(?:User|Assistant): )/)
224
+ .filter((s) => s.length > 0);
225
+ if (turns.length === 0)
226
+ return [];
227
+ const SEP = "\n\n";
228
+ const SEP_BYTES = Buffer.byteLength(SEP, "utf-8");
229
+ const chunks = [];
230
+ let buf = [];
231
+ let bufBytes = 0;
232
+ for (const turn of turns) {
233
+ const turnBytes = Buffer.byteLength(turn, "utf-8");
234
+ if (buf.length === 0) {
235
+ buf.push(turn);
236
+ bufBytes = turnBytes;
237
+ continue;
238
+ }
239
+ const added = SEP_BYTES + turnBytes;
240
+ if (bufBytes + added > maxBytes) {
241
+ chunks.push(buf.join(SEP));
242
+ buf = [turn];
243
+ bufBytes = turnBytes;
244
+ }
245
+ else {
246
+ buf.push(turn);
247
+ bufBytes += added;
248
+ }
249
+ }
250
+ if (buf.length > 0)
251
+ chunks.push(buf.join(SEP));
252
+ return chunks;
253
+ }
254
+ function clampChunkBytes(value) {
255
+ const raw = value ?? DEFAULT_RECOVERY_CHUNK_BYTES;
256
+ return raw < MIN_RECOVERY_CHUNK_BYTES ? MIN_RECOVERY_CHUNK_BYTES : raw;
257
+ }
258
+ function buildRecoveredContent(opts) {
259
+ const header = `# Recovered oversized Codex session\n` +
260
+ `session_id: ${opts.sessionId}\n` +
261
+ `session_path: ${opts.sessionPath}\n` +
262
+ `size_bytes: ${opts.sizeBytes}\n` +
263
+ `threshold_bytes: ${opts.thresholdBytes}\n` +
264
+ `chunks: ${opts.chunkSummaries.length}\n` +
265
+ `recovered_at: ${opts.recoveredAt}\n`;
266
+ const body = opts.chunkSummaries
267
+ .map((c, i) => {
268
+ const t = c.topics.length > 0 ? `\nTopics: ${c.topics.join(", ")}` : "";
269
+ return `## Chunk ${i + 1} of ${opts.chunkSummaries.length}\n${c.summary}${t}`;
270
+ })
271
+ .join("\n\n");
272
+ const content = `${header}\n${body}\n`;
273
+ const first = opts.chunkSummaries[0]?.summary ?? "(empty)";
274
+ const summary = opts.chunkSummaries.length === 1
275
+ ? first
276
+ : `Recovered ${opts.chunkSummaries.length}-chunk Codex session: ${first}`;
277
+ const topicSet = new Set();
278
+ topicSet.add(PROVENANCE_TOPIC);
279
+ topicSet.add(`source_session:${opts.sessionId}`);
280
+ for (const chunk of opts.chunkSummaries) {
281
+ for (const t of chunk.topics)
282
+ topicSet.add(t);
283
+ }
284
+ return { content, summary, topics: Array.from(topicSet) };
285
+ }
286
+ function buildIdempotencyKey(sessionId, fingerprint) {
287
+ return `auto-capture-recovery:codex_cli:${sessionId}:${fingerprint}`;
288
+ }
289
+ export async function runRecoverQuarantine(deps) {
290
+ const records = loadQuarantineRecords(deps);
291
+ const grouped = groupBySession(records);
292
+ const state = loadRecoveryState(deps);
293
+ const chunkBytes = clampChunkBytes(deps.chunkBytes);
294
+ const now = deps.now ?? (() => new Date());
295
+ const report = {
296
+ total_records: records.length,
297
+ total_sessions: grouped.length,
298
+ recovered: 0,
299
+ skipped: 0,
300
+ missing_source: 0,
301
+ failed: 0,
302
+ results: [],
303
+ };
304
+ for (const record of grouped) {
305
+ const key = recoveryKey(record.session_id);
306
+ // Caller-supplied gate (background auto-repair excludes budget-exhausted
307
+ // sessions). Skipped sessions are entirely invisible to the report so a
308
+ // gated-out session never inflates skipped/failed counts.
309
+ if (deps.skipSession?.(record))
310
+ continue;
311
+ // Skip only when the stored fingerprint matches the latest grouped
312
+ // fingerprint. A different fingerprint means the session has grown
313
+ // (or otherwise mutated) since the last recovery, so we re-recover
314
+ // — the new idempotency key (built from the new fingerprint) lets
315
+ // `/save` accept a fresh artifact rather than dedupe it away, and
316
+ // the recovery-state entry is overwritten below.
317
+ const prior = state.recovered[key];
318
+ if (prior && prior.fingerprint === record.fingerprint) {
319
+ report.skipped += 1;
320
+ report.results.push({
321
+ session_id: record.session_id,
322
+ fingerprint: record.fingerprint,
323
+ outcome: "skipped",
324
+ reason: "already_recovered",
325
+ });
326
+ continue;
327
+ }
328
+ if (!fs.existsSync(record.session_path)) {
329
+ report.missing_source += 1;
330
+ report.results.push({
331
+ session_id: record.session_id,
332
+ fingerprint: record.fingerprint,
333
+ outcome: "skipped",
334
+ reason: "missing_source",
335
+ });
336
+ continue;
337
+ }
338
+ let parsedContent;
339
+ try {
340
+ const raw = fs.readFileSync(record.session_path, "utf-8");
341
+ const parsed = parseCodexSession(record.session_id, raw);
342
+ if (!parsed || parsed.content.trim().length === 0) {
343
+ report.failed += 1;
344
+ report.results.push({
345
+ session_id: record.session_id,
346
+ fingerprint: record.fingerprint,
347
+ outcome: "failed",
348
+ reason: "empty_session",
349
+ error: "Codex session parsed to no turns",
350
+ });
351
+ continue;
352
+ }
353
+ parsedContent = parsed.content;
354
+ }
355
+ catch (err) {
356
+ report.failed += 1;
357
+ report.results.push({
358
+ session_id: record.session_id,
359
+ fingerprint: record.fingerprint,
360
+ outcome: "failed",
361
+ reason: "empty_session",
362
+ error: err instanceof Error ? err.message : String(err),
363
+ });
364
+ continue;
365
+ }
366
+ const chunks = chunkByTurns(parsedContent, chunkBytes);
367
+ if (chunks.length === 0) {
368
+ report.failed += 1;
369
+ report.results.push({
370
+ session_id: record.session_id,
371
+ fingerprint: record.fingerprint,
372
+ outcome: "failed",
373
+ reason: "empty_session",
374
+ error: "chunkByTurns returned no chunks",
375
+ });
376
+ continue;
377
+ }
378
+ const idempotencyKey = buildIdempotencyKey(record.session_id, record.fingerprint);
379
+ // Dry-run: report what a real run would do without invoking the
380
+ // Codex CLI summarizer (which is the expensive step), and without
381
+ // saving or persisting state.
382
+ if (deps.dryRun) {
383
+ report.recovered += 1;
384
+ report.results.push({
385
+ session_id: record.session_id,
386
+ fingerprint: record.fingerprint,
387
+ outcome: "recovered",
388
+ chunks: chunks.length,
389
+ idempotency_key: idempotencyKey,
390
+ });
391
+ continue;
392
+ }
393
+ const summaries = [];
394
+ let summarizeError;
395
+ for (let i = 0; i < chunks.length; i += 1) {
396
+ try {
397
+ const summary = await deps.summarizer.summarize({
398
+ chunk: chunks[i],
399
+ index: i,
400
+ total: chunks.length,
401
+ sessionId: record.session_id,
402
+ });
403
+ summaries.push(summary);
404
+ }
405
+ catch (err) {
406
+ summarizeError = err instanceof Error ? err.message : String(err);
407
+ break;
408
+ }
409
+ }
410
+ if (summarizeError) {
411
+ report.failed += 1;
412
+ report.results.push({
413
+ session_id: record.session_id,
414
+ fingerprint: record.fingerprint,
415
+ outcome: "failed",
416
+ reason: "summarize_failed",
417
+ error: summarizeError,
418
+ });
419
+ continue;
420
+ }
421
+ const recoveredAt = now().toISOString();
422
+ const built = buildRecoveredContent({
423
+ sessionId: record.session_id,
424
+ sessionPath: record.session_path,
425
+ sizeBytes: record.size_bytes,
426
+ thresholdBytes: record.threshold_bytes,
427
+ chunkSummaries: summaries,
428
+ recoveredAt,
429
+ });
430
+ try {
431
+ await deps.saveFn({
432
+ sessionId: record.session_id,
433
+ fingerprint: record.fingerprint,
434
+ sessionPath: record.session_path,
435
+ sizeBytes: record.size_bytes,
436
+ thresholdBytes: record.threshold_bytes,
437
+ chunks: summaries,
438
+ content: built.content,
439
+ summary: built.summary,
440
+ topics: built.topics,
441
+ idempotencyKey,
442
+ // A `prior` here always carries a *different* fingerprint (the
443
+ // same-fingerprint case skipped above), i.e. the session grew since
444
+ // its last recovery. Replace that older recovered memory so search
445
+ // doesn't return both the stale and the regrown version.
446
+ ...(prior && prior.fingerprint !== record.fingerprint
447
+ ? { replaceIdempotencyKey: prior.idempotency_key }
448
+ : {}),
449
+ });
450
+ }
451
+ catch (err) {
452
+ report.failed += 1;
453
+ report.results.push({
454
+ session_id: record.session_id,
455
+ fingerprint: record.fingerprint,
456
+ outcome: "failed",
457
+ reason: "save_failed",
458
+ error: err instanceof Error ? err.message : String(err),
459
+ });
460
+ continue;
461
+ }
462
+ state.recovered[key] = {
463
+ recovered_at: recoveredAt,
464
+ fingerprint: record.fingerprint,
465
+ idempotency_key: idempotencyKey,
466
+ chunks: summaries.length,
467
+ session_path: record.session_path,
468
+ size_bytes: record.size_bytes,
469
+ };
470
+ await saveRecoveryState(deps, state);
471
+ report.recovered += 1;
472
+ report.results.push({
473
+ session_id: record.session_id,
474
+ fingerprint: record.fingerprint,
475
+ outcome: "recovered",
476
+ chunks: summaries.length,
477
+ idempotency_key: idempotencyKey,
478
+ });
479
+ }
480
+ return report;
481
+ }
482
+ // --- Default Codex CLI summarizer ------------------------------------
483
+ const CHUNK_OUTPUT_SCHEMA = {
484
+ type: "object",
485
+ additionalProperties: false,
486
+ required: ["summary", "topics"],
487
+ properties: {
488
+ summary: { type: "string" },
489
+ topics: { type: "array", items: { type: "string" } },
490
+ },
491
+ };
492
+ const CHUNK_PROMPT_HEADER = "You are summarizing one chunk of a Codex CLI software-engineering session " +
493
+ "that was too large to capture in one pass. Return JSON with:\n" +
494
+ '- "summary": 3 to 6 sentences. Focus on decisions, code changes, ' +
495
+ "problems, and outcomes. Concrete over generic.\n" +
496
+ '- "topics": 3 to 8 short lowercase hyphenated topic tags.';
497
+ export class CodexCliChunkSummarizer {
498
+ options;
499
+ constructor(options = {}) {
500
+ this.options = options;
501
+ }
502
+ async summarize(opts) {
503
+ const prompt = `${CHUNK_PROMPT_HEADER}\n\n` +
504
+ `Session: ${opts.sessionId}\n` +
505
+ `Chunk ${opts.index + 1} of ${opts.total}.\n\n` +
506
+ opts.chunk;
507
+ const { output } = await runCodexCliJson({
508
+ prompt,
509
+ schema: CHUNK_OUTPUT_SCHEMA,
510
+ ...(this.options.cwd ? { cwd: this.options.cwd } : {}),
511
+ ...(this.options.timeoutMs ? { timeoutMs: this.options.timeoutMs } : {}),
512
+ });
513
+ if (typeof output.summary !== "string") {
514
+ throw new Error("Chunk summary missing string summary");
515
+ }
516
+ if (!Array.isArray(output.topics) || !output.topics.every((t) => typeof t === "string")) {
517
+ throw new Error("Chunk summary topics must be string[]");
518
+ }
519
+ return { summary: output.summary, topics: output.topics };
520
+ }
521
+ }
522
+ //# sourceMappingURL=recover-quarantine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recover-quarantine.js","sourceRoot":"","sources":["../../../src/capture/recover-quarantine.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"backfill.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/backfill.ts"],"names":[],"mappings":"AA0BA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8JpC,wBAAgB,mBAAmB,IAAI,OAAO,CA6/B7C"}
1
+ {"version":3,"file":"backfill.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/backfill.ts"],"names":[],"mappings":"AA0BA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA+JpC,wBAAgB,mBAAmB,IAAI,OAAO,CAggC7C"}
@@ -26,7 +26,7 @@ import path from "node:path";
26
26
  import crypto from "node:crypto";
27
27
  import { Command } from "commander";
28
28
  import { loadConfig } from "../../config/loader.js";
29
- import { createHttpClient, readToken, resolveBaseUrl, CliError, } from "../http-client.js";
29
+ import { createHttpClient, readToken, resolveBaseUrl, CliError, requireExistingConfigPath, } from "../http-client.js";
30
30
  import { pollJob } from "../job-poller.js";
31
31
  import { isJobFailure } from "../output.js";
32
32
  import { isSourceSupported, INGEST_SOURCES, SUPPORTED_INGEST_SOURCES, } from "../../ingestion/parsers/types.js";
@@ -113,7 +113,10 @@ export function makeBackfillCommand() {
113
113
  process.stderr.write("\n(dry-run — no changes made beyond manifest.json / preflight.json)\n");
114
114
  return;
115
115
  }
116
- const config = loadConfig(globalOpts.config);
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);
117
120
  const dataDir = config.data_paths.data_dir;
118
121
  const now = new Date();
119
122
  const nowIso = now.toISOString();