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

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 (280) hide show
  1. package/README.md +7 -3
  2. package/dist/src/capture/auto-capture.d.ts +105 -4
  3. package/dist/src/capture/auto-capture.d.ts.map +1 -1
  4. package/dist/src/capture/auto-capture.js +313 -34
  5. package/dist/src/capture/auto-capture.js.map +1 -1
  6. package/dist/src/capture/claude-cli-triage-provider.d.ts +28 -0
  7. package/dist/src/capture/claude-cli-triage-provider.d.ts.map +1 -0
  8. package/dist/src/capture/claude-cli-triage-provider.js +88 -0
  9. package/dist/src/capture/claude-cli-triage-provider.js.map +1 -0
  10. package/dist/src/capture/codex-cli-triage-provider.d.ts.map +1 -1
  11. package/dist/src/capture/codex-cli-triage-provider.js +1 -33
  12. package/dist/src/capture/codex-cli-triage-provider.js.map +1 -1
  13. package/dist/src/capture/cursor-capture.d.ts +89 -0
  14. package/dist/src/capture/cursor-capture.d.ts.map +1 -0
  15. package/dist/src/capture/cursor-capture.js +121 -0
  16. package/dist/src/capture/cursor-capture.js.map +1 -0
  17. package/dist/src/capture/observability.d.ts +30 -0
  18. package/dist/src/capture/observability.d.ts.map +1 -1
  19. package/dist/src/capture/observability.js +29 -0
  20. package/dist/src/capture/observability.js.map +1 -1
  21. package/dist/src/capture/sources.d.ts +41 -3
  22. package/dist/src/capture/sources.d.ts.map +1 -1
  23. package/dist/src/capture/sources.js +43 -1
  24. package/dist/src/capture/sources.js.map +1 -1
  25. package/dist/src/capture/triage-classification.d.ts +69 -0
  26. package/dist/src/capture/triage-classification.d.ts.map +1 -0
  27. package/dist/src/capture/triage-classification.js +62 -0
  28. package/dist/src/capture/triage-classification.js.map +1 -0
  29. package/dist/src/capture/triage-provider-factory.d.ts +36 -0
  30. package/dist/src/capture/triage-provider-factory.d.ts.map +1 -0
  31. package/dist/src/capture/triage-provider-factory.js +55 -0
  32. package/dist/src/capture/triage-provider-factory.js.map +1 -0
  33. package/dist/src/capture/triage.d.ts +1 -1
  34. package/dist/src/capture/triage.d.ts.map +1 -1
  35. package/dist/src/capture/triage.js +8 -6
  36. package/dist/src/capture/triage.js.map +1 -1
  37. package/dist/src/cli/commands/capture.d.ts.map +1 -1
  38. package/dist/src/cli/commands/capture.js +72 -17
  39. package/dist/src/cli/commands/capture.js.map +1 -1
  40. package/dist/src/cli/commands/chunk-backfill.d.ts +13 -0
  41. package/dist/src/cli/commands/chunk-backfill.d.ts.map +1 -0
  42. package/dist/src/cli/commands/chunk-backfill.js +157 -0
  43. package/dist/src/cli/commands/chunk-backfill.js.map +1 -0
  44. package/dist/src/cli/commands/cursor-probe.d.ts +20 -0
  45. package/dist/src/cli/commands/cursor-probe.d.ts.map +1 -0
  46. package/dist/src/cli/commands/cursor-probe.js +162 -0
  47. package/dist/src/cli/commands/cursor-probe.js.map +1 -0
  48. package/dist/src/cli/commands/menubar.d.ts +50 -0
  49. package/dist/src/cli/commands/menubar.d.ts.map +1 -1
  50. package/dist/src/cli/commands/menubar.js +224 -16
  51. package/dist/src/cli/commands/menubar.js.map +1 -1
  52. package/dist/src/cli/commands/onboard.d.ts +36 -7
  53. package/dist/src/cli/commands/onboard.d.ts.map +1 -1
  54. package/dist/src/cli/commands/onboard.js +256 -53
  55. package/dist/src/cli/commands/onboard.js.map +1 -1
  56. package/dist/src/cli/commands/status.d.ts.map +1 -1
  57. package/dist/src/cli/commands/status.js +16 -0
  58. package/dist/src/cli/commands/status.js.map +1 -1
  59. package/dist/src/cli/commands/update.d.ts +34 -1
  60. package/dist/src/cli/commands/update.d.ts.map +1 -1
  61. package/dist/src/cli/commands/update.js +179 -2
  62. package/dist/src/cli/commands/update.js.map +1 -1
  63. package/dist/src/cli/index.d.ts.map +1 -1
  64. package/dist/src/cli/index.js +4 -0
  65. package/dist/src/cli/index.js.map +1 -1
  66. package/dist/src/cli/postinstall-menubar.d.ts.map +1 -1
  67. package/dist/src/cli/postinstall-menubar.js +14 -0
  68. package/dist/src/cli/postinstall-menubar.js.map +1 -1
  69. package/dist/src/cli/status/friend-header.d.ts +18 -0
  70. package/dist/src/cli/status/friend-header.d.ts.map +1 -1
  71. package/dist/src/cli/status/friend-header.js +137 -0
  72. package/dist/src/cli/status/friend-header.js.map +1 -1
  73. package/dist/src/cli/status/local-signals.d.ts +41 -0
  74. package/dist/src/cli/status/local-signals.d.ts.map +1 -1
  75. package/dist/src/cli/status/local-signals.js +48 -0
  76. package/dist/src/cli/status/local-signals.js.map +1 -1
  77. package/dist/src/config/schema.d.ts +220 -14
  78. package/dist/src/config/schema.d.ts.map +1 -1
  79. package/dist/src/config/schema.js +82 -7
  80. package/dist/src/config/schema.js.map +1 -1
  81. package/dist/src/diagnostics/claude-preflight.d.ts +34 -0
  82. package/dist/src/diagnostics/claude-preflight.d.ts.map +1 -0
  83. package/dist/src/diagnostics/claude-preflight.js +89 -0
  84. package/dist/src/diagnostics/claude-preflight.js.map +1 -0
  85. package/dist/src/diagnostics/codex-preflight.d.ts +1 -1
  86. package/dist/src/diagnostics/codex-preflight.d.ts.map +1 -1
  87. package/dist/src/diagnostics/codex-preflight.js +14 -0
  88. package/dist/src/diagnostics/codex-preflight.js.map +1 -1
  89. package/dist/src/diagnostics/doctor.d.ts +9 -1
  90. package/dist/src/diagnostics/doctor.d.ts.map +1 -1
  91. package/dist/src/diagnostics/doctor.js +57 -2
  92. package/dist/src/diagnostics/doctor.js.map +1 -1
  93. package/dist/src/ingestion/chunk-meta.d.ts +85 -0
  94. package/dist/src/ingestion/chunk-meta.d.ts.map +1 -0
  95. package/dist/src/ingestion/chunk-meta.js +167 -0
  96. package/dist/src/ingestion/chunk-meta.js.map +1 -0
  97. package/dist/src/ingestion/chunk-text.d.ts +39 -0
  98. package/dist/src/ingestion/chunk-text.d.ts.map +1 -0
  99. package/dist/src/ingestion/chunk-text.js +114 -0
  100. package/dist/src/ingestion/chunk-text.js.map +1 -0
  101. package/dist/src/ingestion/cursor/cursor-store.d.ts +177 -0
  102. package/dist/src/ingestion/cursor/cursor-store.d.ts.map +1 -0
  103. package/dist/src/ingestion/cursor/cursor-store.js +243 -0
  104. package/dist/src/ingestion/cursor/cursor-store.js.map +1 -0
  105. package/dist/src/ingestion/cursor/enrich-roots.d.ts +16 -0
  106. package/dist/src/ingestion/cursor/enrich-roots.d.ts.map +1 -0
  107. package/dist/src/ingestion/cursor/enrich-roots.js +22 -0
  108. package/dist/src/ingestion/cursor/enrich-roots.js.map +1 -0
  109. package/dist/src/ingestion/cursor/vscdb-reader.d.ts +32 -0
  110. package/dist/src/ingestion/cursor/vscdb-reader.d.ts.map +1 -0
  111. package/dist/src/ingestion/cursor/vscdb-reader.js +113 -0
  112. package/dist/src/ingestion/cursor/vscdb-reader.js.map +1 -0
  113. package/dist/src/ingestion/cursor/workspace-root.d.ts +96 -0
  114. package/dist/src/ingestion/cursor/workspace-root.d.ts.map +1 -0
  115. package/dist/src/ingestion/cursor/workspace-root.js +187 -0
  116. package/dist/src/ingestion/cursor/workspace-root.js.map +1 -0
  117. package/dist/src/ingestion/indexer.d.ts.map +1 -1
  118. package/dist/src/ingestion/indexer.js +41 -32
  119. package/dist/src/ingestion/indexer.js.map +1 -1
  120. package/dist/src/jobs/handlers/compact.d.ts.map +1 -1
  121. package/dist/src/jobs/handlers/compact.js +9 -4
  122. package/dist/src/jobs/handlers/compact.js.map +1 -1
  123. package/dist/src/jobs/handlers/ingest.d.ts.map +1 -1
  124. package/dist/src/jobs/handlers/ingest.js +60 -30
  125. package/dist/src/jobs/handlers/ingest.js.map +1 -1
  126. package/dist/src/jobs/handlers/reconcile.d.ts.map +1 -1
  127. package/dist/src/jobs/handlers/reconcile.js +128 -45
  128. package/dist/src/jobs/handlers/reconcile.js.map +1 -1
  129. package/dist/src/jobs/handlers/save.d.ts.map +1 -1
  130. package/dist/src/jobs/handlers/save.js +122 -72
  131. package/dist/src/jobs/handlers/save.js.map +1 -1
  132. package/dist/src/jobs/types.d.ts +1 -1
  133. package/dist/src/main.js +26 -15
  134. package/dist/src/main.js.map +1 -1
  135. package/dist/src/mcp/server.d.ts.map +1 -1
  136. package/dist/src/mcp/server.js +10 -3
  137. package/dist/src/mcp/server.js.map +1 -1
  138. package/dist/src/mcp/tools/context-pack.d.ts.map +1 -1
  139. package/dist/src/mcp/tools/context-pack.js +7 -1
  140. package/dist/src/mcp/tools/context-pack.js.map +1 -1
  141. package/dist/src/mcp/tools/conversations-search.d.ts +1 -1
  142. package/dist/src/mcp/tools/conversations-search.d.ts.map +1 -1
  143. package/dist/src/mcp/tools/conversations-search.js +7 -1
  144. package/dist/src/mcp/tools/conversations-search.js.map +1 -1
  145. package/dist/src/mcp/tools/evidence-feedback.d.ts +60 -0
  146. package/dist/src/mcp/tools/evidence-feedback.d.ts.map +1 -0
  147. package/dist/src/mcp/tools/evidence-feedback.js +62 -0
  148. package/dist/src/mcp/tools/evidence-feedback.js.map +1 -0
  149. package/dist/src/mcp/tools/log-outcome.d.ts +72 -0
  150. package/dist/src/mcp/tools/log-outcome.d.ts.map +1 -0
  151. package/dist/src/mcp/tools/log-outcome.js +59 -0
  152. package/dist/src/mcp/tools/log-outcome.js.map +1 -0
  153. package/dist/src/mcp/tools/open-evidence.d.ts +37 -0
  154. package/dist/src/mcp/tools/open-evidence.d.ts.map +1 -0
  155. package/dist/src/mcp/tools/open-evidence.js +72 -0
  156. package/dist/src/mcp/tools/open-evidence.js.map +1 -0
  157. package/dist/src/mcp/tools/save.d.ts +7 -2
  158. package/dist/src/mcp/tools/save.d.ts.map +1 -1
  159. package/dist/src/mcp/tools/save.js +7 -2
  160. package/dist/src/mcp/tools/save.js.map +1 -1
  161. package/dist/src/mcp/tools/search.d.ts.map +1 -1
  162. package/dist/src/mcp/tools/search.js +7 -1
  163. package/dist/src/mcp/tools/search.js.map +1 -1
  164. package/dist/src/observability/retrieval-feedback.d.ts +82 -0
  165. package/dist/src/observability/retrieval-feedback.d.ts.map +1 -0
  166. package/dist/src/observability/retrieval-feedback.js +231 -0
  167. package/dist/src/observability/retrieval-feedback.js.map +1 -0
  168. package/dist/src/observability/rift-context.d.ts.map +1 -1
  169. package/dist/src/observability/rift-context.js +3 -0
  170. package/dist/src/observability/rift-context.js.map +1 -1
  171. package/dist/src/observability/tool-usage-stats.d.ts +13 -0
  172. package/dist/src/observability/tool-usage-stats.d.ts.map +1 -1
  173. package/dist/src/observability/tool-usage-stats.js +15 -0
  174. package/dist/src/observability/tool-usage-stats.js.map +1 -1
  175. package/dist/src/observability/tool-usage.d.ts +56 -0
  176. package/dist/src/observability/tool-usage.d.ts.map +1 -1
  177. package/dist/src/observability/tool-usage.js +86 -0
  178. package/dist/src/observability/tool-usage.js.map +1 -1
  179. package/dist/src/providers/claude-cli-metadata-extraction.d.ts +47 -0
  180. package/dist/src/providers/claude-cli-metadata-extraction.d.ts.map +1 -0
  181. package/dist/src/providers/claude-cli-metadata-extraction.js +120 -0
  182. package/dist/src/providers/claude-cli-metadata-extraction.js.map +1 -0
  183. package/dist/src/providers/claude-cli-runner.d.ts +92 -0
  184. package/dist/src/providers/claude-cli-runner.d.ts.map +1 -0
  185. package/dist/src/providers/claude-cli-runner.js +598 -0
  186. package/dist/src/providers/claude-cli-runner.js.map +1 -0
  187. package/dist/src/providers/codex-cli-metadata-extraction.d.ts.map +1 -1
  188. package/dist/src/providers/codex-cli-metadata-extraction.js +1 -40
  189. package/dist/src/providers/codex-cli-metadata-extraction.js.map +1 -1
  190. package/dist/src/providers/codex-cli-runner.d.ts +7 -0
  191. package/dist/src/providers/codex-cli-runner.d.ts.map +1 -1
  192. package/dist/src/providers/codex-cli-runner.js +131 -5
  193. package/dist/src/providers/codex-cli-runner.js.map +1 -1
  194. package/dist/src/providers/conversation-generation.d.ts +10 -0
  195. package/dist/src/providers/conversation-generation.d.ts.map +1 -1
  196. package/dist/src/providers/conversation-generation.js +54 -13
  197. package/dist/src/providers/conversation-generation.js.map +1 -1
  198. package/dist/src/providers/openai-metadata-extraction.d.ts +48 -1
  199. package/dist/src/providers/openai-metadata-extraction.d.ts.map +1 -1
  200. package/dist/src/providers/openai-metadata-extraction.js +51 -2
  201. package/dist/src/providers/openai-metadata-extraction.js.map +1 -1
  202. package/dist/src/providers/types.d.ts +1 -1
  203. package/dist/src/providers/types.d.ts.map +1 -1
  204. package/dist/src/providers/types.js +4 -0
  205. package/dist/src/providers/types.js.map +1 -1
  206. package/dist/src/retrieval/compact.d.ts +81 -0
  207. package/dist/src/retrieval/compact.d.ts.map +1 -1
  208. package/dist/src/retrieval/compact.js +248 -8
  209. package/dist/src/retrieval/compact.js.map +1 -1
  210. package/dist/src/retrieval/context-pack.d.ts.map +1 -1
  211. package/dist/src/retrieval/context-pack.js +28 -14
  212. package/dist/src/retrieval/context-pack.js.map +1 -1
  213. package/dist/src/retrieval/evidence-key.d.ts +48 -0
  214. package/dist/src/retrieval/evidence-key.d.ts.map +1 -0
  215. package/dist/src/retrieval/evidence-key.js +131 -0
  216. package/dist/src/retrieval/evidence-key.js.map +1 -0
  217. package/dist/src/retrieval/group-by-parent.d.ts +38 -0
  218. package/dist/src/retrieval/group-by-parent.d.ts.map +1 -0
  219. package/dist/src/retrieval/group-by-parent.js +40 -0
  220. package/dist/src/retrieval/group-by-parent.js.map +1 -0
  221. package/dist/src/retrieval/lexical.d.ts.map +1 -1
  222. package/dist/src/retrieval/lexical.js +1 -3
  223. package/dist/src/retrieval/lexical.js.map +1 -1
  224. package/dist/src/retrieval/receipt.d.ts +57 -0
  225. package/dist/src/retrieval/receipt.d.ts.map +1 -0
  226. package/dist/src/retrieval/receipt.js +119 -0
  227. package/dist/src/retrieval/receipt.js.map +1 -0
  228. package/dist/src/retrieval/reranker.d.ts +12 -2
  229. package/dist/src/retrieval/reranker.d.ts.map +1 -1
  230. package/dist/src/retrieval/reranker.js +11 -4
  231. package/dist/src/retrieval/reranker.js.map +1 -1
  232. package/dist/src/retrieval/stitch-chunks.d.ts +73 -0
  233. package/dist/src/retrieval/stitch-chunks.d.ts.map +1 -0
  234. package/dist/src/retrieval/stitch-chunks.js +106 -0
  235. package/dist/src/retrieval/stitch-chunks.js.map +1 -0
  236. package/dist/src/server/app.d.ts.map +1 -1
  237. package/dist/src/server/app.js +17 -1
  238. package/dist/src/server/app.js.map +1 -1
  239. package/dist/src/server/routes/conversations-search.d.ts.map +1 -1
  240. package/dist/src/server/routes/conversations-search.js +12 -3
  241. package/dist/src/server/routes/conversations-search.js.map +1 -1
  242. package/dist/src/server/routes/friend-status.d.ts +44 -5
  243. package/dist/src/server/routes/friend-status.d.ts.map +1 -1
  244. package/dist/src/server/routes/friend-status.js +74 -6
  245. package/dist/src/server/routes/friend-status.js.map +1 -1
  246. package/dist/src/server/routes/mcp-usage.d.ts +9 -6
  247. package/dist/src/server/routes/mcp-usage.d.ts.map +1 -1
  248. package/dist/src/server/routes/mcp-usage.js.map +1 -1
  249. package/dist/src/server/routes/retrieval-feedback.d.ts +3 -0
  250. package/dist/src/server/routes/retrieval-feedback.d.ts.map +1 -0
  251. package/dist/src/server/routes/retrieval-feedback.js +290 -0
  252. package/dist/src/server/routes/retrieval-feedback.js.map +1 -0
  253. package/dist/src/server/routes/save.d.ts +3 -3
  254. package/dist/src/server/routes/save.d.ts.map +1 -1
  255. package/dist/src/server/routes/save.js +6 -2
  256. package/dist/src/server/routes/save.js.map +1 -1
  257. package/dist/src/server/routes/search.d.ts.map +1 -1
  258. package/dist/src/server/routes/search.js +19 -7
  259. package/dist/src/server/routes/search.js.map +1 -1
  260. package/dist/src/server/serving-marker.d.ts +85 -0
  261. package/dist/src/server/serving-marker.d.ts.map +1 -0
  262. package/dist/src/server/serving-marker.js +226 -0
  263. package/dist/src/server/serving-marker.js.map +1 -0
  264. package/dist/src/storage/chunk-backfill.d.ts +39 -0
  265. package/dist/src/storage/chunk-backfill.d.ts.map +1 -0
  266. package/dist/src/storage/chunk-backfill.js +295 -0
  267. package/dist/src/storage/chunk-backfill.js.map +1 -0
  268. package/dist/src/storage/filter.d.ts +42 -0
  269. package/dist/src/storage/filter.d.ts.map +1 -0
  270. package/dist/src/storage/filter.js +70 -0
  271. package/dist/src/storage/filter.js.map +1 -0
  272. package/dist/src/storage/rebuild.d.ts.map +1 -1
  273. package/dist/src/storage/rebuild.js +44 -27
  274. package/dist/src/storage/rebuild.js.map +1 -1
  275. package/dist/src/storage/tables.d.ts +41 -0
  276. package/dist/src/storage/tables.d.ts.map +1 -1
  277. package/dist/src/storage/tables.js +64 -1
  278. package/dist/src/storage/tables.js.map +1 -1
  279. package/operator/swiftbar/render-menu.py +57 -15
  280. package/package.json +5 -3
@@ -11,7 +11,10 @@ import { Command } from "commander";
11
11
  import { createHttpClient, readToken, resolveBaseUrl, probeDaemonHealth, CliError, requireExistingConfigPath, } from "../http-client.js";
12
12
  import { pollJob } from "../job-poller.js";
13
13
  import { isJobFailure } from "../output.js";
14
- import { runAutoCapture, resolveCodexCaptureDeps, } from "../../capture/auto-capture.js";
14
+ import { runAutoCapture, resolveCodexCaptureDeps, resolveCursorCaptureDeps, } from "../../capture/auto-capture.js";
15
+ import { CURSOR_CAPTURE_SOURCE } from "../../capture/sources.js";
16
+ import { resolveTriageProviderName, setConfiguredTriageProviderName, triageWorkerLabel, } from "../../capture/triage-provider-factory.js";
17
+ import { cursorCaptureEnabled, cursorCapturePersistEnabled, } from "../../capture/cursor-capture.js";
15
18
  import { appendAutoCaptureRunRecord, buildAutoCaptureRunRecord, } from "../../capture/observability.js";
16
19
  import { makeCaptureRecoverCommand } from "./capture-recover.js";
17
20
  export function makeCaptureCommand() {
@@ -20,7 +23,8 @@ export function makeCaptureCommand() {
20
23
  .option("--dry-run", "Triage only — don't save, review, or update state")
21
24
  .option("--claude-dir <path>", "Claude config directory", undefined)
22
25
  .option("--codex-dir <path>", "Codex config directory", undefined)
23
- .option("--source <source>", "Filter auto-capture to one source (claude_code|codex_cli)", undefined)
26
+ .option("--cursor-dir <path>", "Cursor application-support directory", undefined)
27
+ .option("--source <source>", "Filter auto-capture to one source (claude_code|codex_cli|cursor_composer)", undefined)
24
28
  .action(async (opts, cmd) => {
25
29
  const globalOpts = cmd.optsWithGlobals();
26
30
  try {
@@ -41,6 +45,13 @@ export function makeCaptureCommand() {
41
45
  const configPath = requireExistingConfigPath(globalOpts);
42
46
  const config = loadConfig(configPath);
43
47
  const dataDir = config.data_paths.data_dir;
48
+ // Route this one-shot run's triage (preflight + per-session) through
49
+ // the configured worker, matching what the scheduled daemon would use.
50
+ const triageProviderName = resolveTriageProviderName(config);
51
+ setConfiguredTriageProviderName(triageProviderName);
52
+ // Worker name for honest egress copy — content is sent to whichever
53
+ // AI worker is configured (Codex CLI or Claude Code), not always Codex.
54
+ const triageWorker = triageWorkerLabel(triageProviderName);
44
55
  // Voyage prerequisite gate — runs BEFORE the Codex model pin, the
45
56
  // preflight probe, and any per-session triage. Capture is the
46
57
  // off-device path: it reads parsed conversation content and sends it
@@ -63,15 +74,15 @@ export function makeCaptureCommand() {
63
74
  if (!health.up) {
64
75
  process.stderr.write("Error: capture saves through the Rift daemon, but it is unreachable.\n" +
65
76
  " • Check it: rift doctor\n" +
66
- " • Triage only: rift capture --dry-run (no save, content still goes to Codex)\n");
77
+ ` • Triage only: rift capture --dry-run (no save, content still goes to ${triageWorker})\n`);
67
78
  process.exitCode = 1;
68
79
  return;
69
80
  }
70
81
  if (!health.voyageKeyPresent) {
71
- process.stderr.write("Error: capture sends your parsed conversation content to Codex for triage, " +
82
+ process.stderr.write(`Error: capture sends your parsed conversation content to ${triageWorker} for triage, ` +
72
83
  "and the daemon has no Voyage key loaded to save searchable results.\n" +
73
84
  " • Add a key: rift onboard --reconfigure-voyage\n" +
74
- " • Triage only: rift capture --dry-run (no save, content still goes to Codex)\n");
85
+ ` • Triage only: rift capture --dry-run (no save, content still goes to ${triageWorker})\n`);
75
86
  process.exitCode = 1;
76
87
  return;
77
88
  }
@@ -83,26 +94,61 @@ export function makeCaptureCommand() {
83
94
  configureCodexModel({ model: config.codex_cli?.model, dataDir });
84
95
  const source = opts.source === undefined
85
96
  ? undefined
86
- : opts.source === "claude_code" || opts.source === "codex_cli"
97
+ : opts.source === "claude_code" ||
98
+ opts.source === "codex_cli" ||
99
+ opts.source === "cursor_composer"
87
100
  ? opts.source
88
101
  : (() => {
89
- throw new CliError("Invalid --source. Use claude_code or codex_cli.", "validation");
102
+ throw new CliError("Invalid --source. Use claude_code, codex_cli, or cursor_composer.", "validation");
90
103
  })();
104
+ // Native Cursor capture has two enablement paths: the config opt-in
105
+ // (cursor_composer in capture.sources — authorizes discovery + persist
106
+ // with no env flags) or the two env flags (the ad-hoc/dogfood path).
107
+ // Surface the exact state so the operator is never surprised by a run
108
+ // that found nothing or saved nothing. When config already schedules
109
+ // Cursor, neither env note applies.
110
+ const cursorScheduled = config.capture.sources.includes(CURSOR_CAPTURE_SOURCE);
111
+ if (source === "cursor_composer" &&
112
+ !cursorScheduled &&
113
+ !cursorCaptureEnabled()) {
114
+ // Not in config, env off: the Cursor store is never even read.
115
+ process.stderr.write("Note: native Cursor capture is off. Add cursor_composer to " +
116
+ "capture.sources to schedule it, or set RIFT_CURSOR_CAPTURE=1 for a " +
117
+ "one-off (saving then also requires CURSOR_CAPTURE_PERSIST=1).\n");
118
+ }
119
+ else if (source === "cursor_composer" &&
120
+ !cursorScheduled &&
121
+ !opts.dryRun &&
122
+ !cursorCapturePersistEnabled()) {
123
+ // Env discovery on, persistence off, not scheduled: triaged but
124
+ // deferred, never saved. Say so before the run so "0 saved" reads as
125
+ // expected, not broken.
126
+ process.stderr.write("Note: Cursor persistence is off — sessions will be triaged and DEFERRED, " +
127
+ "not saved. Set CURSOR_CAPTURE_PERSIST=1, or add cursor_composer to " +
128
+ "capture.sources to persist.\n");
129
+ }
91
130
  // Be explicit that even a dry-run sends content off-device: it skips
92
- // save/review/state but still triages each session via Codex. The
93
- // non-dry-run egress is already covered by the Voyage gate above; this
94
- // makes the dry-run transmission visible before it happens, not after.
131
+ // save/review/state but still triages each session via the configured
132
+ // AI worker. The non-dry-run egress is already covered by the Voyage
133
+ // gate above; this makes the dry-run transmission visible before it
134
+ // happens, not after.
95
135
  if (opts.dryRun && !globalOpts.json) {
96
- process.stderr.write("Dry-run: triaging via Codex (conversation content is sent to Codex); nothing will be saved.\n");
136
+ const worker = triageWorkerLabel(resolveTriageProviderName(config));
137
+ process.stderr.write(`Dry-run: triaging via ${worker} (conversation content is sent to ${worker}); nothing will be saved.\n`);
97
138
  }
98
139
  const startedAt = new Date();
99
140
  const report = await runAutoCapture({
100
141
  dataDir,
101
142
  claudeDir: opts.claudeDir,
102
143
  codexDir: opts.codexDir,
144
+ cursorDir: opts.cursorDir,
103
145
  dryRun: opts.dryRun ?? false,
104
146
  ...(source ? { sources: [source] } : {}),
147
+ // Config membership is the Cursor opt-in: a manual run honors it too,
148
+ // so `rift capture` is consistent with the scheduled daemon.
149
+ cursorConfigEnabled: cursorScheduled,
105
150
  ...resolveCodexCaptureDeps(config),
151
+ ...resolveCursorCaptureDeps(config),
106
152
  saveFn: async (saveOpts) => {
107
153
  if (!client) {
108
154
  throw new Error("No HTTP client (dry-run mode)");
@@ -164,15 +210,21 @@ export function makeCaptureCommand() {
164
210
  ` Saved: ${report.saved}\n` +
165
211
  ` Review: ${report.review}\n` +
166
212
  ` Discarded: ${report.discarded}\n` +
213
+ (report.deferred > 0
214
+ ? ` Deferred: ${report.deferred} (triaged but persistence gated off)\n`
215
+ : "") +
216
+ (report.bootstrapped > 0
217
+ ? ` Bootstrapped:${report.bootstrapped} (existing sessions watermarked, not imported)\n`
218
+ : "") +
167
219
  ` Quarantined: ${report.quarantined}\n` +
168
220
  ` Errors: ${report.errors}\n`);
169
- // A preflight (Codex health-probe) failure is NOT a per-session
170
- // error, so `Errors: 0` above can read green while triage was
171
- // actually degraded or skipped. Surface it explicitly — otherwise a
172
- // hard auth/path failure looks like a clean run. (Mirrored in the
221
+ // A preflight (triage-worker health-probe) failure is NOT a
222
+ // per-session error, so `Errors: 0` above can read green while triage
223
+ // was actually degraded or skipped. Surface it explicitly — otherwise
224
+ // a hard auth/path failure looks like a clean run. (Mirrored in the
173
225
  // exit code below.)
174
226
  if (!report.preflight_ok) {
175
- process.stderr.write(`\n ⚠ Codex preflight FAILED — triage was degraded or skipped.\n` +
227
+ process.stderr.write(`\n ⚠ ${triageWorker} preflight FAILED — triage was degraded or skipped.\n` +
176
228
  (report.preflight_error
177
229
  ? ` ${report.preflight_error}\n`
178
230
  : ""));
@@ -185,7 +237,10 @@ export function makeCaptureCommand() {
185
237
  : r.decision === "review"
186
238
  ? "?"
187
239
  : "-";
188
- process.stdout.write(` [${icon}] ${r.decision.padEnd(7)} (${r.model}, ${(r.confidence * 100).toFixed(0)}%) ${r.title.slice(0, 60)}\n`);
240
+ const rootTag = r.projectRootStatus
241
+ ? ` [root: ${r.projectRootStatus}]`
242
+ : "";
243
+ process.stdout.write(` [${icon}] ${r.decision.padEnd(7)} (${r.model}, ${(r.confidence * 100).toFixed(0)}%) ${r.title.slice(0, 60)}${rootTag}\n`);
189
244
  }
190
245
  }
191
246
  if (report.error_details.length > 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"capture.js","sourceRoot":"","sources":["../../../../src/cli/commands/capture.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"capture.js","sourceRoot":"","sources":["../../../../src/cli/commands/capture.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EACL,gBAAgB,EAChB,SAAS,EACT,cAAc,EACd,iBAAiB,EACjB,QAAQ,EACR,yBAAyB,GAC1B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EACL,yBAAyB,EACzB,+BAA+B,EAC/B,iBAAiB,GAClB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EACL,oBAAoB,EACpB,2BAA2B,GAC5B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,GAC1B,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAEjE,MAAM,UAAU,kBAAkB;IAChC,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,SAAS,CAAC;SAC/B,WAAW,CACV,4DAA4D,CAC7D;SACA,MAAM,CAAC,WAAW,EAAE,mDAAmD,CAAC;SACxE,MAAM,CAAC,qBAAqB,EAAE,yBAAyB,EAAE,SAAS,CAAC;SACnE,MAAM,CAAC,oBAAoB,EAAE,wBAAwB,EAAE,SAAS,CAAC;SACjE,MAAM,CAAC,qBAAqB,EAAE,sCAAsC,EAAE,SAAS,CAAC;SAChF,MAAM,CACL,mBAAmB,EACnB,2EAA2E,EAC3E,SAAS,CACV;SACA,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE;QAC1B,MAAM,UAAU,GAAG,GAAG,CAAC,eAAe,EAGrC,CAAC;QAEF,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;YAClD,MAAM,KAAK,GAAG,MAAM,SAAS,EAAE,CAAC;YAEhC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,+CAA+C,CAChD,CAAC;gBACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,KAAK;gBAClB,CAAC,CAAC,gBAAgB,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;gBACtC,CAAC,CAAC,IAAI,CAAC;YAET,8DAA8D;YAC9D,0DAA0D;YAC1D,kDAAkD;YAClD,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;YAC9D,MAAM,UAAU,GAAG,yBAAyB,CAAC,UAAU,CAAC,CAAC;YACzD,MAAM,MAAM,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;YACtC,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC;YAE3C,qEAAqE;YACrE,uEAAuE;YACvE,MAAM,kBAAkB,GAAG,yBAAyB,CAAC,MAAM,CAAC,CAAC;YAC7D,+BAA+B,CAAC,kBAAkB,CAAC,CAAC;YACpD,oEAAoE;YACpE,wEAAwE;YACxE,MAAM,YAAY,GAAG,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;YAE3D,kEAAkE;YAClE,8DAA8D;YAC9D,qEAAqE;YACrE,iEAAiE;YACjE,EAAE;YACF,qEAAqE;YACrE,wEAAwE;YACxE,+DAA+D;YAC/D,uEAAuE;YACvE,qEAAqE;YACrE,wEAAwE;YACxE,oEAAoE;YACpE,oEAAoE;YACpE,qEAAqE;YACrE,kEAAkE;YAClE,sEAAsE;YACtE,iEAAiE;YACjE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,CAAC;gBAChD,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;oBACf,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,wEAAwE;wBACtE,iCAAiC;wBACjC,4EAA4E,YAAY,KAAK,CAChG,CAAC;oBACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;oBACrB,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC;oBAC7B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,4DAA4D,YAAY,eAAe;wBACrF,uEAAuE;wBACvE,uDAAuD;wBACvD,4EAA4E,YAAY,KAAK,CAChG,CAAC;oBACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;oBACrB,OAAO;gBACT,CAAC;YACH,CAAC;YAED,qEAAqE;YACrE,wEAAwE;YACxE,wEAAwE;YACxE,MAAM,EAAE,mBAAmB,EAAE,GAAG,MAAM,MAAM,CAC1C,oCAAoC,CACrC,CAAC;YACF,mBAAmB,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;YAEjE,MAAM,MAAM,GACV,IAAI,CAAC,MAAM,KAAK,SAAS;gBACvB,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,aAAa;oBAC3B,IAAI,CAAC,MAAM,KAAK,WAAW;oBAC3B,IAAI,CAAC,MAAM,KAAK,iBAAiB;oBACnC,CAAC,CAAC,IAAI,CAAC,MAAM;oBACb,CAAC,CAAC,CAAC,GAAG,EAAE;wBACJ,MAAM,IAAI,QAAQ,CAChB,mEAAmE,EACnE,YAAY,CACb,CAAC;oBACJ,CAAC,CAAC,EAAE,CAAC;YAEb,oEAAoE;YACpE,uEAAuE;YACvE,qEAAqE;YACrE,sEAAsE;YACtE,qEAAqE;YACrE,oCAAoC;YACpC,MAAM,eAAe,GACnB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC;YACzD,IACE,MAAM,KAAK,iBAAiB;gBAC5B,CAAC,eAAe;gBAChB,CAAC,oBAAoB,EAAE,EACvB,CAAC;gBACD,+DAA+D;gBAC/D,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,6DAA6D;oBAC3D,qEAAqE;oBACrE,iEAAiE,CACpE,CAAC;YACJ,CAAC;iBAAM,IACL,MAAM,KAAK,iBAAiB;gBAC5B,CAAC,eAAe;gBAChB,CAAC,IAAI,CAAC,MAAM;gBACZ,CAAC,2BAA2B,EAAE,EAC9B,CAAC;gBACD,gEAAgE;gBAChE,qEAAqE;gBACrE,wBAAwB;gBACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,2EAA2E;oBACzE,qEAAqE;oBACrE,+BAA+B,CAClC,CAAC;YACJ,CAAC;YAED,qEAAqE;YACrE,sEAAsE;YACtE,qEAAqE;YACrE,oEAAoE;YACpE,sBAAsB;YACtB,IAAI,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;gBACpC,MAAM,MAAM,GAAG,iBAAiB,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC,CAAC;gBACpE,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,yBAAyB,MAAM,qCAAqC,MAAM,6BAA6B,CACxG,CAAC;YACJ,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,IAAI,EAAE,CAAC;YAC7B,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC;gBAClC,OAAO;gBACP,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,KAAK;gBAC5B,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxC,sEAAsE;gBACtE,6DAA6D;gBAC7D,mBAAmB,EAAE,eAAe;gBACpC,GAAG,uBAAuB,CAAC,MAAM,CAAC;gBAClC,GAAG,wBAAwB,CAAC,MAAM,CAAC;gBACnC,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;oBACzB,IAAI,CAAC,MAAM,EAAE,CAAC;wBACZ,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;oBACnD,CAAC;oBAED,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE;wBAC1C,MAAM,EAAE,QAAQ,CAAC,MAAM;wBACvB,OAAO,EAAE,QAAQ,CAAC,OAAO;wBACzB,OAAO,EAAE,QAAQ,CAAC,OAAO;wBACzB,MAAM,EAAE,QAAQ,CAAC,MAAM;wBACvB,MAAM,EAAE,QAAQ,CAAC,MAAM;wBACvB,eAAe,EAAE,QAAQ,CAAC,eAAe;wBACzC,GAAG,CAAC,QAAQ,CAAC,uBAAuB;4BAClC,CAAC,CAAC,EAAE,uBAAuB,EAAE,QAAQ,CAAC,uBAAuB,EAAE;4BAC/D,CAAC,CAAC,EAAE,CAAC;qBACR,CAAC,CAAC;oBAEH,MAAM,IAAI,GAAG,IAA+C,CAAC;oBAC7D,IAAI,IAAI,CAAC,SAAS;wBAAE,OAAO;oBAE3B,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC;wBAC3B,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;wBAC5B,KAAK,EAAE,IAAI,CAAC,MAAM;qBACnB,CAAC,CAAC;oBAEH,IAAI,YAAY,CAAC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;wBAC9C,MAAM,IAAI,KAAK,CACb,oBAAoB,MAAM,CAAC,GAAG,CAAC,KAAK,IAAI,SAAS,EAAE,CACpD,CAAC;oBACJ,CAAC;gBACH,CAAC;aACF,CAAC,CAAC;YAEH,8DAA8D;YAC9D,oEAAoE;YACpE,kEAAkE;YAClE,+DAA+D;YAC/D,gEAAgE;YAChE,6DAA6D;YAC7D,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACjB,IAAI,CAAC;oBACH,MAAM,cAAc,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;oBAClE,MAAM,0BAA0B,CAC9B,OAAO,EACP,yBAAyB,CAAC;wBACxB,SAAS,EAAE,SAAS,CAAC,WAAW,EAAE;wBAClC,cAAc;wBACd,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE;wBAC5C,MAAM;wBACN,OAAO,EAAE,QAAQ;qBAClB,CAAC,CACH,CAAC;gBACJ,CAAC;gBAAC,OAAO,gBAAgB,EAAE,CAAC;oBAC1B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,qCACE,gBAAgB,YAAY,KAAK;wBAC/B,CAAC,CAAC,gBAAgB,CAAC,OAAO;wBAC1B,CAAC,CAAC,MAAM,CAAC,gBAAgB,CAC7B,IAAI,CACL,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,gBAAgB;YAChB,IAAI,UAAU,CAAC,IAAI,EAAE,CAAC;gBACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;YAC/D,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,4BAA4B;oBAC1B,kBAAkB,MAAM,CAAC,gBAAgB,IAAI;oBAC7C,kBAAkB,MAAM,CAAC,iBAAiB,IAAI;oBAC9C,kBAAkB,MAAM,CAAC,KAAK,IAAI;oBAClC,kBAAkB,MAAM,CAAC,MAAM,IAAI;oBACnC,kBAAkB,MAAM,CAAC,SAAS,IAAI;oBACtC,CAAC,MAAM,CAAC,QAAQ,GAAG,CAAC;wBAClB,CAAC,CAAC,kBAAkB,MAAM,CAAC,QAAQ,wCAAwC;wBAC3E,CAAC,CAAC,EAAE,CAAC;oBACP,CAAC,MAAM,CAAC,YAAY,GAAG,CAAC;wBACtB,CAAC,CAAC,kBAAkB,MAAM,CAAC,YAAY,kDAAkD;wBACzF,CAAC,CAAC,EAAE,CAAC;oBACP,kBAAkB,MAAM,CAAC,WAAW,IAAI;oBACxC,kBAAkB,MAAM,CAAC,MAAM,IAAI,CACtC,CAAC;gBAEF,4DAA4D;gBAC5D,sEAAsE;gBACtE,sEAAsE;gBACtE,oEAAoE;gBACpE,oBAAoB;gBACpB,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;oBACzB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,SAAS,YAAY,uDAAuD;wBAC1E,CAAC,MAAM,CAAC,eAAe;4BACrB,CAAC,CAAC,OAAO,MAAM,CAAC,eAAe,IAAI;4BACnC,CAAC,CAAC,EAAE,CAAC,CACV,CAAC;gBACJ,CAAC;gBAED,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC9B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;oBACrC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;wBAC/B,MAAM,IAAI,GACR,CAAC,CAAC,QAAQ,KAAK,MAAM;4BACnB,CAAC,CAAC,GAAG;4BACL,CAAC,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ;gCACvB,CAAC,CAAC,GAAG;gCACL,CAAC,CAAC,GAAG,CAAC;wBACZ,MAAM,OAAO,GAAG,CAAC,CAAC,iBAAiB;4BACjC,CAAC,CAAC,WAAW,CAAC,CAAC,iBAAiB,GAAG;4BACnC,CAAC,CAAC,EAAE,CAAC;wBACP,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,MAAM,IAAI,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,IAAI,CAC5H,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAED,IAAI,MAAM,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;oBACpC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,aAAa,EAAE,CAAC;wBACrC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,KAAK,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,KAAK,IAAI,CAChD,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAED,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;oBAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;gBAC1D,CAAC;YACH,CAAC;YAED,mEAAmE;YACnE,wEAAwE;YACxE,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY;gBAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACtE,CAAC;QAAC,OAAO,GAAY,EAAE,CAAC;YACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,UAAU,GAAG,YAAY,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CACvG,CAAC;YACF,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,GAAG,CAAC,UAAU,CAAC,yBAAyB,EAAE,CAAC,CAAC;IAC5C,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { Command } from "commander";
2
+ /**
3
+ * Owner-only, offline historical conversation chunk backfill.
4
+ *
5
+ * Re-chunks conversations that were indexed before `RIFT_CHUNKING` was on, from
6
+ * their raw artifacts, into chunk sets — so the owner can dogfood retrieval over a
7
+ * fully-chunked corpus and gather OFF-vs-ON eval evidence before any product
8
+ * default flip. Deliberately crude: explicit, offline (daemon must be stopped, so
9
+ * there is a single LanceDB writer), `--dry-run`-able, throttleable, and Ctrl-C
10
+ * safe. NOT the productized resumable beta-user migration.
11
+ */
12
+ export declare function makeChunkBackfillCommand(): Command;
13
+ //# sourceMappingURL=chunk-backfill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-backfill.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/chunk-backfill.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBpC;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,IAAI,OAAO,CAoJlD"}
@@ -0,0 +1,157 @@
1
+ import path from "node:path";
2
+ import { Command } from "commander";
3
+ import { CliError, requireExistingConfigPath, resolveBaseUrl, } from "../http-client.js";
4
+ import { printError, printJson, printText } from "../output.js";
5
+ import { loadConfig } from "../../config/loader.js";
6
+ import { VoyageEmbeddingProvider } from "../../providers/voyage.js";
7
+ import { PlaceholderEmbeddingProvider } from "../../providers/placeholder-embed.js";
8
+ import { initTables, openTablesReadOnly } from "../../storage/tables.js";
9
+ import { backfillConversationChunks, } from "../../storage/chunk-backfill.js";
10
+ import { assertChunkBackfillWriteCompatible } from "../../server/serving-marker.js";
11
+ import { probeDaemon } from "./rebuild.js";
12
+ /**
13
+ * Owner-only, offline historical conversation chunk backfill.
14
+ *
15
+ * Re-chunks conversations that were indexed before `RIFT_CHUNKING` was on, from
16
+ * their raw artifacts, into chunk sets — so the owner can dogfood retrieval over a
17
+ * fully-chunked corpus and gather OFF-vs-ON eval evidence before any product
18
+ * default flip. Deliberately crude: explicit, offline (daemon must be stopped, so
19
+ * there is a single LanceDB writer), `--dry-run`-able, throttleable, and Ctrl-C
20
+ * safe. NOT the productized resumable beta-user migration.
21
+ */
22
+ export function makeChunkBackfillCommand() {
23
+ return new Command("chunk-backfill")
24
+ .description("Owner-only: re-chunk historical conversations from raw (offline; daemon must be stopped)")
25
+ .option("--dry-run", "Report what would change without embedding or writing", false)
26
+ .option("--limit <n>", "Stop after re-chunking this many conversations", (v) => parseInt(v, 10))
27
+ .option("--throttle-ms <ms>", "Sleep between conversations (ms)", (v) => parseInt(v, 10))
28
+ .option("--allow-uncertified-copy", "Override the serving-build compatibility guard for a DISPOSABLE COPY of a data dir (never the live serving dir)", false)
29
+ .action(async (opts, cmd) => {
30
+ const globalOpts = cmd.optsWithGlobals();
31
+ try {
32
+ // 1. Daemon MUST be stopped — offline single-writer, same precondition
33
+ // as `rift rebuild --offline`.
34
+ const baseUrl = resolveBaseUrl(globalOpts.config);
35
+ const probe = await probeDaemon(baseUrl);
36
+ if (probe.state !== "stopped") {
37
+ printError(probe.reason ||
38
+ "Daemon must be stopped before chunk-backfill (run: rift stop).");
39
+ process.exitCode = 1;
40
+ return;
41
+ }
42
+ // 2. Config + embedding key. Dry-run reports blast radius without
43
+ // embedding or writing, so it must NOT require a key — only the real
44
+ // run, which embeds via the cloud provider, does. Parse dryRun first
45
+ // and skip both the key check and provider construction for it.
46
+ const dryRun = opts.dryRun === true;
47
+ const configPath = requireExistingConfigPath(globalOpts);
48
+ const config = loadConfig(configPath);
49
+ const dataDir = config.data_paths.data_dir;
50
+ let embedding;
51
+ if (dryRun) {
52
+ // Never embeds (the dry-run path returns before any embed call), so a
53
+ // placeholder satisfies the option type without needing a real key.
54
+ embedding = new PlaceholderEmbeddingProvider();
55
+ }
56
+ else {
57
+ // 2a. Compatibility guard (WRITE mode only). A chunk-column write must
58
+ // never land on a dir whose serving install cannot serve chunk
59
+ // rows. The daemon is stopped here, so we cannot probe /version;
60
+ // instead we read the capability marker the serving daemon stamps
61
+ // on boot. Absent/incompatible/STALE → refuse (a pre-chunk daemon
62
+ // never writes the marker; a stale one only proves an OLD chunk-aware
63
+ // boot, not the current install). This keeps the write guard truthful,
64
+ // so (re)boot the chunk-aware daemon right before backfilling.
65
+ //
66
+ // Escape hatch: --allow-uncertified-copy lets the owner override
67
+ // the guard for a DISPOSABLE COPY (e.g. running OFF-vs-ON eval on a
68
+ // copied corpus) without first booting a chunk-aware daemon on it.
69
+ // The live beta.21 dir has no marker, so it stays blocked by
70
+ // default; only an explicit flag + loud warning proceeds, and the
71
+ // owner asserts this is a copy, not the serving dir.
72
+ const verdict = assertChunkBackfillWriteCompatible(dataDir);
73
+ if (!verdict.ok) {
74
+ if (opts.allowUncertifiedCopy === true) {
75
+ process.stderr.write(`WARNING: ${verdict.reason}\n` +
76
+ `Proceeding anyway because --allow-uncertified-copy was set. ` +
77
+ `This MUST be a disposable COPY of a data dir — NEVER your live ` +
78
+ `serving dir. A chunk-column write against a dir served by a ` +
79
+ `pre-chunk daemon will break that daemon's writes.\n`);
80
+ }
81
+ else {
82
+ printError(verdict.reason);
83
+ process.exitCode = 1;
84
+ return;
85
+ }
86
+ }
87
+ const voyageApiKey = process.env.VOYAGE_API_KEY;
88
+ if (!voyageApiKey) {
89
+ printError("VOYAGE_API_KEY environment variable required for chunk-backfill");
90
+ process.exitCode = 1;
91
+ return;
92
+ }
93
+ embedding = new VoyageEmbeddingProvider({
94
+ apiKey: voyageApiKey,
95
+ model: config.embedding.model,
96
+ cachePath: path.join(config.data_paths.data_dir, "embeddings"),
97
+ });
98
+ }
99
+ // Open storage. Dry-run uses a READ-ONLY open that never creates or
100
+ // migrates tables, so a recon run cannot mutate the live schema (the P1
101
+ // this command previously caused). Write mode initializes/migrates as
102
+ // needed — gated by the compatibility guard above.
103
+ if (dryRun) {
104
+ await openTablesReadOnly(dataDir, {
105
+ require: ["conversations_hot", "conversations_cold"],
106
+ });
107
+ }
108
+ else {
109
+ await initTables(dataDir);
110
+ }
111
+ // 3. Ctrl-C → cooperative abort: the in-flight conversation's atomic
112
+ // write finishes, then the run stops cleanly (no half-written set).
113
+ const controller = new AbortController();
114
+ const onSigint = () => {
115
+ process.stderr.write("\nCtrl-C received — finishing the current conversation, then stopping...\n");
116
+ controller.abort();
117
+ };
118
+ process.once("SIGINT", onSigint);
119
+ if (dryRun)
120
+ process.stderr.write("Dry run — no embeddings or writes.\n");
121
+ let summary;
122
+ try {
123
+ summary = await backfillConversationChunks({
124
+ embedding,
125
+ dataDir,
126
+ dryRun,
127
+ ...(typeof opts.limit === "number" && !Number.isNaN(opts.limit)
128
+ ? { limit: opts.limit }
129
+ : {}),
130
+ ...(typeof opts.throttleMs === "number" && !Number.isNaN(opts.throttleMs)
131
+ ? { throttleMs: opts.throttleMs }
132
+ : {}),
133
+ signal: controller.signal,
134
+ log: (msg) => process.stderr.write(`${msg}\n`),
135
+ });
136
+ }
137
+ finally {
138
+ process.removeListener("SIGINT", onSigint);
139
+ }
140
+ if (globalOpts.json) {
141
+ printJson(summary);
142
+ }
143
+ else {
144
+ const verb = dryRun ? "would re-chunk" : "re-chunked";
145
+ printText(`Chunk backfill ${summary.aborted ? "aborted" : "complete"}: ` +
146
+ `${verb} ${summary.rechunked}, already chunked ${summary.alreadyChunked}, ` +
147
+ `single-row ${summary.singleChunk}, orphaned ${summary.orphaned}, ` +
148
+ `errored ${summary.errored} (scanned ${summary.scanned}).`);
149
+ }
150
+ }
151
+ catch (err) {
152
+ printError(err instanceof CliError ? err.message : err instanceof Error ? err.message : String(err));
153
+ process.exitCode = 1;
154
+ }
155
+ });
156
+ }
157
+ //# sourceMappingURL=chunk-backfill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-backfill.js","sourceRoot":"","sources":["../../../../src/cli/commands/chunk-backfill.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * `rift cursor-probe` — read-only discovery probe for native Cursor sessions.
3
+ *
4
+ * DISCOVERY SLICE ONLY. This command answers "what would Cursor auto-capture
5
+ * see?" without capturing anything. It:
6
+ * - reads Cursor's state.vscdb READ-ONLY (immutable, SELECT-only),
7
+ * - never contacts the daemon, never writes LanceDB, never touches capture
8
+ * state, never bumps versions,
9
+ * - by default surfaces metadata only (ids, modes, models, timestamps,
10
+ * turn counts) — NOT message text.
11
+ *
12
+ * It is intentionally NOT wired into `rift capture` / scheduled capture. That
13
+ * wiring is a separate, gated slice (see docs/cursor-capture-discovery.md).
14
+ *
15
+ * Usage:
16
+ * rift cursor-probe [--dir <Cursor app dir>] [--json] [--show-provenance]
17
+ */
18
+ import { Command } from "commander";
19
+ export declare function makeCursorProbeCommand(): Command;
20
+ //# sourceMappingURL=cursor-probe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor-probe.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/cursor-probe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwDpC,wBAAgB,sBAAsB,IAAI,OAAO,CAoIhD"}
@@ -0,0 +1,162 @@
1
+ /**
2
+ * `rift cursor-probe` — read-only discovery probe for native Cursor sessions.
3
+ *
4
+ * DISCOVERY SLICE ONLY. This command answers "what would Cursor auto-capture
5
+ * see?" without capturing anything. It:
6
+ * - reads Cursor's state.vscdb READ-ONLY (immutable, SELECT-only),
7
+ * - never contacts the daemon, never writes LanceDB, never touches capture
8
+ * state, never bumps versions,
9
+ * - by default surfaces metadata only (ids, modes, models, timestamps,
10
+ * turn counts) — NOT message text.
11
+ *
12
+ * It is intentionally NOT wired into `rift capture` / scheduled capture. That
13
+ * wiring is a separate, gated slice (see docs/cursor-capture-discovery.md).
14
+ *
15
+ * Usage:
16
+ * rift cursor-probe [--dir <Cursor app dir>] [--json] [--show-provenance]
17
+ */
18
+ import { Command } from "commander";
19
+ import { printError, printJson, printText } from "../output.js";
20
+ import { discoverCursorComposerSessions, proposeCursorProvenance, } from "../../ingestion/cursor/cursor-store.js";
21
+ import { CursorReaderError, defaultCursorDir, globalStatePath, readCursorGlobalState, } from "../../ingestion/cursor/vscdb-reader.js";
22
+ import { enrichCursorProjectRoots } from "../../ingestion/cursor/enrich-roots.js";
23
+ function summarize(candidates) {
24
+ const byBackend = {};
25
+ const byMode = {};
26
+ const byRootStatus = {};
27
+ let drafts = 0;
28
+ let empty = 0;
29
+ for (const c of candidates) {
30
+ byBackend[c.backend] = (byBackend[c.backend] ?? 0) + 1;
31
+ const mode = c.mode ?? "unknown";
32
+ byMode[mode] = (byMode[mode] ?? 0) + 1;
33
+ byRootStatus[c.projectRootStatus] = (byRootStatus[c.projectRootStatus] ?? 0) + 1;
34
+ if (c.isDraft)
35
+ drafts += 1;
36
+ if (c.turnCount === 0)
37
+ empty += 1;
38
+ }
39
+ return {
40
+ total: candidates.length,
41
+ captureable: candidates.filter((c) => !c.isDraft && c.turnCount > 0).length,
42
+ project_attributable: candidates.filter((c) => c.projectRoot !== null).length,
43
+ drafts,
44
+ empty,
45
+ by_backend: byBackend,
46
+ by_mode: byMode,
47
+ by_root_status: byRootStatus,
48
+ };
49
+ }
50
+ function pad(value, width) {
51
+ return value.length >= width ? value : value + " ".repeat(width - value.length);
52
+ }
53
+ /**
54
+ * A Cursor session title is user-authored and frequently a mini-summary of the
55
+ * private conversation — NOT harmless metadata. So it is redacted by default and
56
+ * only shown with an explicit `--show-titles` opt-in for local inspection.
57
+ */
58
+ function displayTitle(name, showTitles) {
59
+ if (name === null)
60
+ return "(untitled)";
61
+ return showTitles ? name : "(title hidden — use --show-titles)";
62
+ }
63
+ export function makeCursorProbeCommand() {
64
+ return new Command("cursor-probe")
65
+ .description("Read-only discovery of native Cursor composer/chat sessions (no capture)")
66
+ .option("--dir <path>", "Cursor application-support dir", undefined)
67
+ .option("--show-provenance", "Include the proposed per-session provenance row model", false)
68
+ .option("--show-titles", "Reveal session titles (user-authored; may summarize private content)", false)
69
+ .action(async (opts, cmd) => {
70
+ const globalOpts = cmd.optsWithGlobals();
71
+ try {
72
+ const cursorDir = opts.dir ?? defaultCursorDir();
73
+ const { dbPath, rows } = readCursorGlobalState({ cursorDir: opts.dir });
74
+ const candidates = enrichCursorProjectRoots(discoverCursorComposerSessions(rows), cursorDir);
75
+ const summary = summarize(candidates);
76
+ if (globalOpts.json) {
77
+ // Redact the user-authored title by default; keep a boolean so the
78
+ // report still conveys whether a session was named.
79
+ const redact = (c) => {
80
+ const { name, ...rest } = c;
81
+ return opts.showTitles
82
+ ? { ...rest, name, has_title: name !== null }
83
+ : { ...rest, name: null, has_title: name !== null };
84
+ };
85
+ printJson({
86
+ db_path: dbPath,
87
+ read_only: true,
88
+ titles_redacted: !opts.showTitles,
89
+ summary,
90
+ sessions: opts.showProvenance
91
+ ? candidates.map((c) => ({
92
+ ...redact(c),
93
+ proposed_provenance: proposeCursorProvenance(c),
94
+ }))
95
+ : candidates.map(redact),
96
+ });
97
+ return;
98
+ }
99
+ if (candidates.length === 0) {
100
+ printText(`No native Cursor sessions found in:\n ${dbPath}\n` +
101
+ "(Cursor stores Claude Code / Codex CLI sessions elsewhere — " +
102
+ "those are captured via ~/.claude and ~/.codex.)");
103
+ return;
104
+ }
105
+ const lines = [];
106
+ lines.push(`Cursor store (read-only): ${dbPath}`);
107
+ lines.push(`Sessions: ${summary.total} ` +
108
+ `captureable: ${summary.captureable} ` +
109
+ `drafts: ${summary.drafts} empty: ${summary.empty}`);
110
+ lines.push(`By backend: ${Object.entries(summary.by_backend)
111
+ .map(([k, v]) => `${k}=${v}`)
112
+ .join(" ")}`);
113
+ lines.push(`By mode: ${Object.entries(summary.by_mode)
114
+ .map(([k, v]) => `${k}=${v}`)
115
+ .join(" ")}`);
116
+ lines.push(`Project roots: attributable=${summary.project_attributable} ` +
117
+ Object.entries(summary.by_root_status)
118
+ .map(([k, v]) => `${k}=${v}`)
119
+ .join(" "));
120
+ if (!opts.showTitles) {
121
+ lines.push("(titles redacted — pass --show-titles to reveal)");
122
+ }
123
+ lines.push("");
124
+ lines.push(`${pad("updated", 25)} ${pad("mode", 6)} ${pad("backend", 13)} ` +
125
+ `${pad("turns", 5)} ${pad("model", 14)} ${pad("project root", 34)} title`);
126
+ for (const c of candidates) {
127
+ const flag = c.isDraft ? " (draft)" : "";
128
+ const root = c.projectRoot ?? `— (${c.projectRootStatus})`;
129
+ lines.push(`${pad(c.updatedAt ?? c.createdAt ?? "—", 25)} ` +
130
+ `${pad(c.mode ?? "—", 6)} ${pad(c.backend, 13)} ` +
131
+ `${pad(String(c.turnCount), 5)} ${pad(c.modelName ?? "—", 14)} ` +
132
+ `${pad(root, 34)} ${displayTitle(c.name, opts.showTitles)}${flag}`);
133
+ }
134
+ if (opts.showProvenance && candidates[0]) {
135
+ lines.push("");
136
+ lines.push("Proposed provenance row (example, first session):");
137
+ lines.push(JSON.stringify(proposeCursorProvenance(candidates[0]), null, 2));
138
+ }
139
+ printText(lines.join("\n"));
140
+ }
141
+ catch (err) {
142
+ if (err instanceof CursorReaderError) {
143
+ if (err.code === "db_missing") {
144
+ printError(`${err.message}\nIs Cursor installed for this user? ` +
145
+ `Expected: ${globalStatePath(opts.dir ?? "<Cursor dir>")}`);
146
+ }
147
+ else if (err.code === "sqlite_missing") {
148
+ printError(`${err.message}\nOn macOS sqlite3 ships at /usr/bin/sqlite3; ` +
149
+ "check your PATH.");
150
+ }
151
+ else {
152
+ printError(err.message);
153
+ }
154
+ }
155
+ else {
156
+ printError(err instanceof Error ? err.message : String(err));
157
+ }
158
+ process.exitCode = 1;
159
+ }
160
+ });
161
+ }
162
+ //# sourceMappingURL=cursor-probe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cursor-probe.js","sourceRoot":"","sources":["../../../../src/cli/commands/cursor-probe.ts"],"names":[],"mappings":"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"}