xtctx 0.3.2 → 0.11.3

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 (308) hide show
  1. package/CHANGELOG.md +317 -122
  2. package/LICENSE +21 -21
  3. package/README.md +154 -121
  4. package/dist/src/cli/disconnect.d.ts +8 -0
  5. package/dist/src/cli/disconnect.d.ts.map +1 -0
  6. package/dist/src/cli/disconnect.js +42 -0
  7. package/dist/src/cli/disconnect.js.map +1 -0
  8. package/dist/src/cli/hook.d.ts +7 -0
  9. package/dist/src/cli/hook.d.ts.map +1 -0
  10. package/dist/src/cli/hook.js +32 -0
  11. package/dist/src/cli/hook.js.map +1 -0
  12. package/dist/src/cli/index.d.ts.map +1 -1
  13. package/dist/src/cli/index.js +86 -33
  14. package/dist/src/cli/index.js.map +1 -1
  15. package/dist/src/cli/setup.d.ts +8 -0
  16. package/dist/src/cli/setup.d.ts.map +1 -0
  17. package/dist/src/cli/setup.js +76 -0
  18. package/dist/src/cli/setup.js.map +1 -0
  19. package/dist/src/cli/status.d.ts +7 -0
  20. package/dist/src/cli/status.d.ts.map +1 -0
  21. package/dist/src/cli/status.js +133 -0
  22. package/dist/src/cli/status.js.map +1 -0
  23. package/dist/src/config/disconnect.d.ts +34 -0
  24. package/dist/src/config/disconnect.d.ts.map +1 -0
  25. package/dist/src/config/disconnect.js +386 -0
  26. package/dist/src/config/disconnect.js.map +1 -0
  27. package/dist/src/config/managed-block.d.ts +29 -0
  28. package/dist/src/config/managed-block.d.ts.map +1 -0
  29. package/dist/src/config/managed-block.js +67 -0
  30. package/dist/src/config/managed-block.js.map +1 -0
  31. package/dist/src/config/mcp-config.d.ts +93 -0
  32. package/dist/src/config/mcp-config.d.ts.map +1 -0
  33. package/dist/src/config/mcp-config.js +556 -0
  34. package/dist/src/config/mcp-config.js.map +1 -0
  35. package/dist/src/config/setup.d.ts +39 -0
  36. package/dist/src/config/setup.d.ts.map +1 -0
  37. package/dist/src/config/setup.js +379 -0
  38. package/dist/src/config/setup.js.map +1 -0
  39. package/dist/src/config/skills.d.ts +73 -0
  40. package/dist/src/config/skills.d.ts.map +1 -0
  41. package/dist/src/config/skills.js +427 -0
  42. package/dist/src/config/skills.js.map +1 -0
  43. package/dist/src/handoff/embeddings.d.ts +26 -0
  44. package/dist/src/handoff/embeddings.d.ts.map +1 -0
  45. package/dist/src/handoff/embeddings.js +132 -0
  46. package/dist/src/handoff/embeddings.js.map +1 -0
  47. package/dist/src/handoff/sqlite-index.d.ts +52 -0
  48. package/dist/src/handoff/sqlite-index.d.ts.map +1 -0
  49. package/dist/src/handoff/sqlite-index.js +905 -0
  50. package/dist/src/handoff/sqlite-index.js.map +1 -0
  51. package/dist/src/handoff/types.d.ts +63 -0
  52. package/dist/src/handoff/types.d.ts.map +1 -0
  53. package/dist/src/handoff/types.js +2 -0
  54. package/dist/src/handoff/types.js.map +1 -0
  55. package/dist/src/handoff/vector.d.ts +4 -0
  56. package/dist/src/handoff/vector.d.ts.map +1 -0
  57. package/dist/src/handoff/vector.js +31 -0
  58. package/dist/src/handoff/vector.js.map +1 -0
  59. package/dist/src/mcp/server.d.ts +3 -20
  60. package/dist/src/mcp/server.d.ts.map +1 -1
  61. package/dist/src/mcp/server.js +90 -205
  62. package/dist/src/mcp/server.js.map +1 -1
  63. package/dist/src/mcp/tools/continuity.d.ts +21 -0
  64. package/dist/src/mcp/tools/continuity.d.ts.map +1 -0
  65. package/dist/src/mcp/tools/continuity.js +55 -0
  66. package/dist/src/mcp/tools/continuity.js.map +1 -0
  67. package/dist/src/mcp/tools/manifest.d.ts +40 -0
  68. package/dist/src/mcp/tools/manifest.d.ts.map +1 -0
  69. package/dist/src/mcp/tools/manifest.js +105 -0
  70. package/dist/src/mcp/tools/manifest.js.map +1 -0
  71. package/dist/src/mcp/tools/sessions.d.ts +18 -31
  72. package/dist/src/mcp/tools/sessions.d.ts.map +1 -1
  73. package/dist/src/mcp/tools/sessions.js +109 -16
  74. package/dist/src/mcp/tools/sessions.js.map +1 -1
  75. package/dist/src/runtime/services.d.ts +11 -38
  76. package/dist/src/runtime/services.d.ts.map +1 -1
  77. package/dist/src/runtime/services.js +61 -200
  78. package/dist/src/runtime/services.js.map +1 -1
  79. package/dist/src/scrapers/antigravity.d.ts +52 -0
  80. package/dist/src/scrapers/antigravity.d.ts.map +1 -0
  81. package/dist/src/scrapers/antigravity.js +869 -0
  82. package/dist/src/scrapers/antigravity.js.map +1 -0
  83. package/dist/src/scrapers/base.d.ts +53 -1
  84. package/dist/src/scrapers/base.d.ts.map +1 -1
  85. package/dist/src/scrapers/base.js +93 -4
  86. package/dist/src/scrapers/base.js.map +1 -1
  87. package/dist/src/scrapers/claude-code.d.ts +37 -6
  88. package/dist/src/scrapers/claude-code.d.ts.map +1 -1
  89. package/dist/src/scrapers/claude-code.js +214 -40
  90. package/dist/src/scrapers/claude-code.js.map +1 -1
  91. package/dist/src/scrapers/codex.d.ts +36 -6
  92. package/dist/src/scrapers/codex.d.ts.map +1 -1
  93. package/dist/src/scrapers/codex.js +283 -60
  94. package/dist/src/scrapers/codex.js.map +1 -1
  95. package/dist/src/scrapers/copilot-cli.d.ts +34 -0
  96. package/dist/src/scrapers/copilot-cli.d.ts.map +1 -0
  97. package/dist/src/scrapers/copilot-cli.js +342 -0
  98. package/dist/src/scrapers/copilot-cli.js.map +1 -0
  99. package/dist/src/scrapers/copilot.d.ts +41 -8
  100. package/dist/src/scrapers/copilot.d.ts.map +1 -1
  101. package/dist/src/scrapers/copilot.js +256 -118
  102. package/dist/src/scrapers/copilot.js.map +1 -1
  103. package/dist/src/scrapers/cursor.d.ts +24 -9
  104. package/dist/src/scrapers/cursor.d.ts.map +1 -1
  105. package/dist/src/scrapers/cursor.js +259 -152
  106. package/dist/src/scrapers/cursor.js.map +1 -1
  107. package/dist/src/scrapers/index.d.ts +23 -0
  108. package/dist/src/scrapers/index.d.ts.map +1 -0
  109. package/dist/src/scrapers/index.js +22 -0
  110. package/dist/src/scrapers/index.js.map +1 -0
  111. package/dist/src/scrapers/opencode.d.ts +37 -0
  112. package/dist/src/scrapers/opencode.d.ts.map +1 -0
  113. package/dist/src/scrapers/opencode.js +277 -0
  114. package/dist/src/scrapers/opencode.js.map +1 -0
  115. package/dist/src/scrapers/registry.d.ts +1 -0
  116. package/dist/src/scrapers/registry.d.ts.map +1 -1
  117. package/dist/src/scrapers/registry.js +3 -0
  118. package/dist/src/scrapers/registry.js.map +1 -1
  119. package/dist/src/tools/sources.d.ts +28 -0
  120. package/dist/src/tools/sources.d.ts.map +1 -0
  121. package/dist/src/tools/sources.js +149 -0
  122. package/dist/src/tools/sources.js.map +1 -0
  123. package/dist/src/types/config.d.ts +24 -37
  124. package/dist/src/types/config.d.ts.map +1 -1
  125. package/dist/src/types/index.d.ts +0 -2
  126. package/dist/src/types/index.d.ts.map +1 -1
  127. package/dist/src/types/index.js +0 -2
  128. package/dist/src/types/index.js.map +1 -1
  129. package/dist/src/types/scraper.d.ts +34 -5
  130. package/dist/src/types/scraper.d.ts.map +1 -1
  131. package/dist/src/utils/atomic-file.d.ts +8 -0
  132. package/dist/src/utils/atomic-file.d.ts.map +1 -0
  133. package/dist/src/utils/atomic-file.js +15 -0
  134. package/dist/src/utils/atomic-file.js.map +1 -0
  135. package/dist/src/utils/errors.d.ts +7 -0
  136. package/dist/src/utils/errors.d.ts.map +1 -0
  137. package/dist/src/utils/errors.js +16 -0
  138. package/dist/src/utils/errors.js.map +1 -0
  139. package/dist/src/utils/package-info.d.ts +11 -0
  140. package/dist/src/utils/package-info.d.ts.map +1 -0
  141. package/dist/src/utils/package-info.js +30 -0
  142. package/dist/src/utils/package-info.js.map +1 -0
  143. package/dist/src/utils/project-scope.d.ts +19 -0
  144. package/dist/src/utils/project-scope.d.ts.map +1 -0
  145. package/dist/src/utils/project-scope.js +61 -0
  146. package/dist/src/utils/project-scope.js.map +1 -0
  147. package/package.json +70 -66
  148. package/dist/src/api/routes/config.d.ts +0 -4
  149. package/dist/src/api/routes/config.d.ts.map +0 -1
  150. package/dist/src/api/routes/config.js +0 -61
  151. package/dist/src/api/routes/config.js.map +0 -1
  152. package/dist/src/api/routes/knowledge.d.ts +0 -4
  153. package/dist/src/api/routes/knowledge.d.ts.map +0 -1
  154. package/dist/src/api/routes/knowledge.js +0 -40
  155. package/dist/src/api/routes/knowledge.js.map +0 -1
  156. package/dist/src/api/routes/search.d.ts +0 -7
  157. package/dist/src/api/routes/search.d.ts.map +0 -1
  158. package/dist/src/api/routes/search.js +0 -108
  159. package/dist/src/api/routes/search.js.map +0 -1
  160. package/dist/src/api/routes/sources.d.ts +0 -12
  161. package/dist/src/api/routes/sources.d.ts.map +0 -1
  162. package/dist/src/api/routes/sources.js +0 -70
  163. package/dist/src/api/routes/sources.js.map +0 -1
  164. package/dist/src/api/server.d.ts +0 -26
  165. package/dist/src/api/server.d.ts.map +0 -1
  166. package/dist/src/api/server.js +0 -312
  167. package/dist/src/api/server.js.map +0 -1
  168. package/dist/src/cli/ingest.d.ts +0 -6
  169. package/dist/src/cli/ingest.d.ts.map +0 -1
  170. package/dist/src/cli/ingest.js +0 -11
  171. package/dist/src/cli/ingest.js.map +0 -1
  172. package/dist/src/cli/init.d.ts +0 -6
  173. package/dist/src/cli/init.d.ts.map +0 -1
  174. package/dist/src/cli/init.js +0 -105
  175. package/dist/src/cli/init.js.map +0 -1
  176. package/dist/src/cli/serve.d.ts +0 -7
  177. package/dist/src/cli/serve.d.ts.map +0 -1
  178. package/dist/src/cli/serve.js +0 -100
  179. package/dist/src/cli/serve.js.map +0 -1
  180. package/dist/src/cli/sync.d.ts +0 -5
  181. package/dist/src/cli/sync.d.ts.map +0 -1
  182. package/dist/src/cli/sync.js +0 -13
  183. package/dist/src/cli/sync.js.map +0 -1
  184. package/dist/src/compaction/pipeline.d.ts +0 -19
  185. package/dist/src/compaction/pipeline.d.ts.map +0 -1
  186. package/dist/src/compaction/pipeline.js +0 -37
  187. package/dist/src/compaction/pipeline.js.map +0 -1
  188. package/dist/src/compaction/providers/cli.d.ts +0 -13
  189. package/dist/src/compaction/providers/cli.d.ts.map +0 -1
  190. package/dist/src/compaction/providers/cli.js +0 -60
  191. package/dist/src/compaction/providers/cli.js.map +0 -1
  192. package/dist/src/compaction/rule-based.d.ts +0 -8
  193. package/dist/src/compaction/rule-based.d.ts.map +0 -1
  194. package/dist/src/compaction/rule-based.js +0 -120
  195. package/dist/src/compaction/rule-based.js.map +0 -1
  196. package/dist/src/config/loader.d.ts +0 -12
  197. package/dist/src/config/loader.d.ts.map +0 -1
  198. package/dist/src/config/loader.js +0 -76
  199. package/dist/src/config/loader.js.map +0 -1
  200. package/dist/src/config/mappings/claude-code.d.ts +0 -3
  201. package/dist/src/config/mappings/claude-code.d.ts.map +0 -1
  202. package/dist/src/config/mappings/claude-code.js +0 -31
  203. package/dist/src/config/mappings/claude-code.js.map +0 -1
  204. package/dist/src/config/mappings/codex.d.ts +0 -3
  205. package/dist/src/config/mappings/codex.d.ts.map +0 -1
  206. package/dist/src/config/mappings/codex.js +0 -31
  207. package/dist/src/config/mappings/codex.js.map +0 -1
  208. package/dist/src/config/mappings/copilot.d.ts +0 -3
  209. package/dist/src/config/mappings/copilot.d.ts.map +0 -1
  210. package/dist/src/config/mappings/copilot.js +0 -33
  211. package/dist/src/config/mappings/copilot.js.map +0 -1
  212. package/dist/src/config/mappings/cursor.d.ts +0 -3
  213. package/dist/src/config/mappings/cursor.d.ts.map +0 -1
  214. package/dist/src/config/mappings/cursor.js +0 -29
  215. package/dist/src/config/mappings/cursor.js.map +0 -1
  216. package/dist/src/config/sync.d.ts +0 -13
  217. package/dist/src/config/sync.d.ts.map +0 -1
  218. package/dist/src/config/sync.js +0 -96
  219. package/dist/src/config/sync.js.map +0 -1
  220. package/dist/src/ingestion/coordinator.d.ts +0 -37
  221. package/dist/src/ingestion/coordinator.d.ts.map +0 -1
  222. package/dist/src/ingestion/coordinator.js +0 -127
  223. package/dist/src/ingestion/coordinator.js.map +0 -1
  224. package/dist/src/ingestion/daemon.d.ts +0 -17
  225. package/dist/src/ingestion/daemon.d.ts.map +0 -1
  226. package/dist/src/ingestion/daemon.js +0 -35
  227. package/dist/src/ingestion/daemon.js.map +0 -1
  228. package/dist/src/ingestion/watcher.d.ts +0 -19
  229. package/dist/src/ingestion/watcher.d.ts.map +0 -1
  230. package/dist/src/ingestion/watcher.js +0 -70
  231. package/dist/src/ingestion/watcher.js.map +0 -1
  232. package/dist/src/knowledge/autotag.d.ts +0 -3
  233. package/dist/src/knowledge/autotag.d.ts.map +0 -1
  234. package/dist/src/knowledge/autotag.js +0 -24
  235. package/dist/src/knowledge/autotag.js.map +0 -1
  236. package/dist/src/knowledge/dedup.d.ts +0 -7
  237. package/dist/src/knowledge/dedup.d.ts.map +0 -1
  238. package/dist/src/knowledge/dedup.js +0 -15
  239. package/dist/src/knowledge/dedup.js.map +0 -1
  240. package/dist/src/knowledge/repository.d.ts +0 -12
  241. package/dist/src/knowledge/repository.d.ts.map +0 -1
  242. package/dist/src/knowledge/repository.js +0 -74
  243. package/dist/src/knowledge/repository.js.map +0 -1
  244. package/dist/src/mcp/tools/config.d.ts +0 -36
  245. package/dist/src/mcp/tools/config.d.ts.map +0 -1
  246. package/dist/src/mcp/tools/config.js +0 -54
  247. package/dist/src/mcp/tools/config.js.map +0 -1
  248. package/dist/src/mcp/tools/knowledge.d.ts +0 -17
  249. package/dist/src/mcp/tools/knowledge.d.ts.map +0 -1
  250. package/dist/src/mcp/tools/knowledge.js +0 -46
  251. package/dist/src/mcp/tools/knowledge.js.map +0 -1
  252. package/dist/src/mcp/tools/search.d.ts +0 -22
  253. package/dist/src/mcp/tools/search.d.ts.map +0 -1
  254. package/dist/src/mcp/tools/search.js +0 -30
  255. package/dist/src/mcp/tools/search.js.map +0 -1
  256. package/dist/src/mcp/tools/write.d.ts +0 -38
  257. package/dist/src/mcp/tools/write.d.ts.map +0 -1
  258. package/dist/src/mcp/tools/write.js +0 -97
  259. package/dist/src/mcp/tools/write.js.map +0 -1
  260. package/dist/src/runtime/ingestion.d.ts +0 -17
  261. package/dist/src/runtime/ingestion.d.ts.map +0 -1
  262. package/dist/src/runtime/ingestion.js +0 -106
  263. package/dist/src/runtime/ingestion.js.map +0 -1
  264. package/dist/src/scrapers/gemini.d.ts +0 -17
  265. package/dist/src/scrapers/gemini.d.ts.map +0 -1
  266. package/dist/src/scrapers/gemini.js +0 -245
  267. package/dist/src/scrapers/gemini.js.map +0 -1
  268. package/dist/src/store/embeddings.d.ts +0 -9
  269. package/dist/src/store/embeddings.d.ts.map +0 -1
  270. package/dist/src/store/embeddings.js +0 -28
  271. package/dist/src/store/embeddings.js.map +0 -1
  272. package/dist/src/store/lance.d.ts +0 -25
  273. package/dist/src/store/lance.d.ts.map +0 -1
  274. package/dist/src/store/lance.js +0 -74
  275. package/dist/src/store/lance.js.map +0 -1
  276. package/dist/src/store/search.d.ts +0 -18
  277. package/dist/src/store/search.d.ts.map +0 -1
  278. package/dist/src/store/search.js +0 -55
  279. package/dist/src/store/search.js.map +0 -1
  280. package/dist/src/types/compaction.d.ts +0 -29
  281. package/dist/src/types/compaction.d.ts.map +0 -1
  282. package/dist/src/types/compaction.js +0 -2
  283. package/dist/src/types/compaction.js.map +0 -1
  284. package/dist/src/types/context.d.ts +0 -33
  285. package/dist/src/types/context.d.ts.map +0 -1
  286. package/dist/src/types/context.js +0 -18
  287. package/dist/src/types/context.js.map +0 -1
  288. package/dist/src/utils/retry.d.ts +0 -11
  289. package/dist/src/utils/retry.d.ts.map +0 -1
  290. package/dist/src/utils/retry.js +0 -46
  291. package/dist/src/utils/retry.js.map +0 -1
  292. package/dist/src/utils/shutdown.d.ts +0 -25
  293. package/dist/src/utils/shutdown.d.ts.map +0 -1
  294. package/dist/src/utils/shutdown.js +0 -56
  295. package/dist/src/utils/shutdown.js.map +0 -1
  296. package/dist/web/apple-touch-icon.png +0 -0
  297. package/dist/web/assets/index-Nuadr5ox.css +0 -1
  298. package/dist/web/assets/index-aA0u8eXA.js +0 -3504
  299. package/dist/web/assets/primeicons-C6QP2o4f.woff2 +0 -0
  300. package/dist/web/assets/primeicons-DMOk5skT.eot +0 -0
  301. package/dist/web/assets/primeicons-Dr5RGzOO.svg +0 -345
  302. package/dist/web/assets/primeicons-MpK4pl85.ttf +0 -0
  303. package/dist/web/assets/primeicons-WjwUDZjB.woff +0 -0
  304. package/dist/web/favicon.ico +0 -0
  305. package/dist/web/favicon.svg +0 -21
  306. package/dist/web/index.html +0 -21
  307. package/dist/web/site.webmanifest +0 -19
  308. package/dist/web/vite.svg +0 -1
@@ -1,64 +1,51 @@
1
- import { stat } from "node:fs/promises";
2
- import { basename } from "node:path";
3
- import Database from "better-sqlite3";
1
+ import { readFile, stat } from "node:fs/promises";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
4
  import { glob } from "glob";
5
- import { estimateTokens, ScraperStateManager } from "./base.js";
6
- const ROLE_MAP = {
7
- user: "user",
8
- human: "user",
9
- assistant: "assistant",
10
- ai: "assistant",
11
- system: "system",
12
- tool: "tool",
5
+ import { AbstractScraper, estimateTokens, toDate } from "./base.js";
6
+ import { pathMatchesProject } from "../utils/project-scope.js";
7
+ // Bubble type constants from Cursor's internal format.
8
+ const BUBBLE_TYPE_USER = 1;
9
+ const BUBBLE_TYPE_ASSISTANT = 2;
10
+ const SCRAPER_NAME = "cursor";
11
+ /**
12
+ * Shapes the cursor scraper tolerates silently without logging. All other
13
+ * shape surprises warn; missing required tables throw.
14
+ */
15
+ export const ACCEPTED_DEGRADATIONS = {
16
+ /** Store path missing — Cursor not installed on this machine. */
17
+ missingStorePath: "cursor workspaceStorage path absent",
18
+ /** Workspace has no composerData yet — empty workspace. */
19
+ emptyWorkspace: "workspace has no composer.composerData row",
20
+ /** A composer whose bubble row is missing — bubble pruned by Cursor. */
21
+ prunedBubble: "bubble referenced by composer but missing from globalStorage",
22
+ /** Empty bubble text (tool-call only, etc.). */
23
+ emptyBubbleText: "bubble has no user-visible text",
24
+ /** Forward-compat unknown keys alongside known composer fields. */
25
+ unknownFieldsAlongside: "extra keys alongside known composer schema",
13
26
  };
14
- const QUERY_CANDIDATES = [
15
- `
16
- SELECT
17
- id AS rowId,
18
- session_id AS sessionId,
19
- role,
20
- content,
21
- created_at AS timestamp,
22
- model,
23
- composer_mode AS composerMode
24
- FROM messages
25
- ORDER BY created_at ASC
26
- `,
27
- `
28
- SELECT
29
- id AS rowId,
30
- conversation_id AS sessionId,
31
- author AS role,
32
- text AS content,
33
- timestamp,
34
- model,
35
- mode AS composerMode
36
- FROM chat_messages
37
- ORDER BY timestamp ASC
38
- `,
39
- `
40
- SELECT
41
- id AS rowId,
42
- sessionId,
43
- role,
44
- content,
45
- timestamp,
46
- model,
47
- composerMode
48
- FROM cursor_messages
49
- ORDER BY timestamp ASC
50
- `,
51
- ];
52
- export class CursorScraper {
27
+ function warnDrift(sourcePath, surprise, recordsAffected) {
28
+ console.warn(`[${SCRAPER_NAME}] schema-drift surprise at ${sourcePath}: ${surprise} ` +
29
+ `(records affected: ${recordsAffected})`);
30
+ }
31
+ function describeType(value) {
32
+ if (value === null)
33
+ return "null";
34
+ if (Array.isArray(value))
35
+ return "array";
36
+ return typeof value;
37
+ }
38
+ export class CursorScraper extends AbstractScraper {
53
39
  cursorStorePath;
40
+ projectRoot;
54
41
  tool = "cursor";
55
- stateManager;
56
- constructor(cursorStorePath, stateDir) {
42
+ constructor(cursorStorePath, stateDir, projectRoot) {
43
+ super(stateDir);
57
44
  this.cursorStorePath = cursorStorePath;
58
- this.stateManager = new ScraperStateManager(stateDir);
45
+ this.projectRoot = projectRoot;
59
46
  }
60
47
  async detect() {
61
- const paths = await this.resolveDatabasePaths();
48
+ const paths = await this.resolveWorkspaceDatabasePaths();
62
49
  return paths.length > 0;
63
50
  }
64
51
  getStorePaths() {
@@ -72,80 +59,176 @@ export class CursorScraper {
72
59
  async *fullSync() {
73
60
  yield* this.readAllMessages(new Date(0));
74
61
  }
75
- parseRaw(raw) {
76
- const value = raw;
77
- const timestamp = coerceDate(value.timestamp);
78
- const sessionId = toNonEmptyString(value.sessionId) ?? "unknown";
79
- const content = toNonEmptyString(value.content) ?? "";
80
- const role = normalizeRole(toNonEmptyString(value.role));
81
- const model = toNonEmptyString(value.model) ?? "unknown";
82
- const composerMode = normalizeComposerMode(toNonEmptyString(value.composerMode));
83
- return {
84
- tool: "cursor",
85
- sessionId,
86
- timestamp,
87
- role,
88
- content,
89
- metadata: {
90
- messageIndex: toMessageIndex(value.messageIndex),
91
- tokenEstimate: estimateTokens(content),
92
- referencedFiles: [],
93
- model,
94
- composerMode,
95
- },
96
- };
97
- }
98
- async getLastScrapedPosition() {
99
- return this.stateManager.load(this.tool);
100
- }
101
- async saveScrapedPosition(state) {
102
- await this.stateManager.save(this.tool, state);
103
- }
104
62
  async *readAllMessages(since) {
105
- const dbPaths = await this.resolveDatabasePaths();
106
- for (const dbPath of dbPaths) {
107
- let db = null;
63
+ // Dynamic import keeps better-sqlite3 an optional runtime dependency,
64
+ // matching the copilot and opencode scrapers.
65
+ let DatabaseCtor;
66
+ try {
67
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
68
+ DatabaseCtor = (await import("better-sqlite3")).default;
69
+ }
70
+ catch {
71
+ // Native module unavailable — treat the source as absent.
72
+ return;
73
+ }
74
+ const workspacePaths = await this.resolveWorkspaceDatabasePaths();
75
+ for (const wsPath of workspacePaths) {
76
+ const composerRefs = this.readWorkspaceComposers(DatabaseCtor, wsPath);
77
+ if (composerRefs.length === 0) {
78
+ continue;
79
+ }
80
+ const globalPath = deriveGlobalStoragePath(wsPath);
81
+ if (!globalPath) {
82
+ continue;
83
+ }
84
+ let globalDb = null;
108
85
  try {
109
- db = new Database(dbPath, { readonly: true, fileMustExist: true });
110
- const rows = this.queryRows(db);
111
- const messageIndexBySession = new Map();
112
- for (const row of rows) {
113
- const timestamp = coerceDate(row.timestamp);
114
- if (timestamp <= since) {
115
- continue;
116
- }
117
- const sessionId = row.sessionId ?? inferSessionId(dbPath);
118
- const nextIndex = messageIndexBySession.get(sessionId) ?? 0;
119
- messageIndexBySession.set(sessionId, nextIndex + 1);
120
- yield this.parseRaw({
121
- ...row,
122
- sessionId,
123
- timestamp,
124
- messageIndex: nextIndex,
125
- });
126
- }
86
+ globalDb = new DatabaseCtor(globalPath, { readonly: true, fileMustExist: true });
87
+ yield* this.readComposerMessages(globalDb, composerRefs, since, wsPath);
127
88
  }
128
- catch {
129
- // Skip malformed or unsupported databases.
89
+ catch (err) {
90
+ // Global storage unreadable treat as schema drift and warn.
91
+ // The cursorDiskKV table is required; if it's gone, something changed.
92
+ warnDrift(globalPath, `globalStorage unreadable: ${err.message}`, composerRefs.length);
130
93
  }
131
94
  finally {
132
- db?.close();
95
+ globalDb?.close();
133
96
  }
134
97
  }
135
98
  }
136
- queryRows(db) {
137
- for (const sql of QUERY_CANDIDATES) {
99
+ readWorkspaceComposers(DatabaseCtor, wsDbPath) {
100
+ let db = null;
101
+ try {
102
+ db = new DatabaseCtor(wsDbPath, { readonly: true, fileMustExist: true });
103
+ }
104
+ catch {
105
+ // File missing / unopenable — treat as absent workspace, not drift.
106
+ return [];
107
+ }
108
+ try {
109
+ const row = db
110
+ .prepare("SELECT value FROM ItemTable WHERE key = 'composer.composerData'")
111
+ .get();
112
+ if (!row) {
113
+ // ACCEPTED_DEGRADATIONS.emptyWorkspace
114
+ return [];
115
+ }
116
+ let data;
138
117
  try {
139
- const rows = db.prepare(sql).all();
140
- return rows;
118
+ data = JSON.parse(row.value);
119
+ }
120
+ catch (err) {
121
+ warnDrift(wsDbPath, `composer.composerData value is not valid JSON: ${err.message}`, 0);
122
+ return [];
141
123
  }
142
- catch {
143
- // Continue to next candidate query.
124
+ if (data.allComposers !== undefined && !Array.isArray(data.allComposers)) {
125
+ warnDrift(wsDbPath, `expected 'allComposers' to be an array, got ${describeType(data.allComposers)}`, 0);
126
+ return [];
144
127
  }
128
+ return data.allComposers ?? [];
129
+ }
130
+ catch (err) {
131
+ // The ItemTable is a required workspace-storage contract — the db
132
+ // opened but a query against it failed, meaning Cursor's internal
133
+ // format changed. Warn loudly, but do not abort the remaining
134
+ // workspaces over one broken database.
135
+ warnDrift(wsDbPath, `ItemTable unreadable: ${err.message}`, 0);
136
+ return [];
137
+ }
138
+ finally {
139
+ db?.close();
145
140
  }
146
- return [];
147
141
  }
148
- async resolveDatabasePaths() {
142
+ *readComposerMessages(globalDb, composerRefs, since, wsPathForWarn) {
143
+ const getComposer = globalDb.prepare("SELECT value FROM cursorDiskKV WHERE key = ?");
144
+ const getBubble = globalDb.prepare("SELECT value FROM cursorDiskKV WHERE key = ?");
145
+ for (const ref of composerRefs) {
146
+ const composerRow = getComposer.get(`composerData:${ref.composerId}`);
147
+ if (!composerRow) {
148
+ warnDrift(`${wsPathForWarn}#composerData:${ref.composerId}`, "workspace references a composer that is missing from globalStorage", 0);
149
+ continue;
150
+ }
151
+ let composer;
152
+ try {
153
+ composer = JSON.parse(composerRow.value);
154
+ }
155
+ catch (err) {
156
+ warnDrift(`${wsPathForWarn}#composerData:${ref.composerId}`, `composer JSON not parseable: ${err.message}`, 0);
157
+ continue;
158
+ }
159
+ // Strict-mode schema check: 'fullConversationHeadersOnly' is the
160
+ // required list of turns. If it's missing or renamed, emitting zero
161
+ // chunks would be silent data loss. Warn so drift is observable.
162
+ if (composer.fullConversationHeadersOnly === undefined) {
163
+ const suspiciousRename = Object.entries(composer).find(([, v]) => Array.isArray(v) &&
164
+ v.length > 0 &&
165
+ isRecord(v[0]) &&
166
+ "bubbleId" in v[0]);
167
+ warnDrift(`${wsPathForWarn}#composerData:${ref.composerId}`, suspiciousRename
168
+ ? `'fullConversationHeadersOnly' missing; suspected rename to '${suspiciousRename[0]}'`
169
+ : "'fullConversationHeadersOnly' missing — composer has no turn list", 0);
170
+ continue;
171
+ }
172
+ if (!Array.isArray(composer.fullConversationHeadersOnly)) {
173
+ warnDrift(`${wsPathForWarn}#composerData:${ref.composerId}`, `expected 'fullConversationHeadersOnly' to be an array, got ` +
174
+ describeType(composer.fullConversationHeadersOnly), 0);
175
+ continue;
176
+ }
177
+ if (composer.modelConfig !== undefined && composer.modelConfig !== null &&
178
+ !isRecord(composer.modelConfig)) {
179
+ warnDrift(`${wsPathForWarn}#composerData:${ref.composerId}`, `expected 'modelConfig' to be object or absent, got ${describeType(composer.modelConfig)}`, 0);
180
+ }
181
+ else if (composer.modelConfig === null) {
182
+ warnDrift(`${wsPathForWarn}#composerData:${ref.composerId}`, "'modelConfig' is null — falling back to composerId as model label", 0);
183
+ }
184
+ const headers = composer.fullConversationHeadersOnly ?? [];
185
+ if (headers.length === 0)
186
+ continue;
187
+ const model = composer.modelConfig?.modelName ?? ref.composerId;
188
+ const composerMode = normalizeComposerMode(composer.unifiedMode ?? ref.unifiedMode);
189
+ const sessionId = ref.composerId;
190
+ let messageIndex = 0;
191
+ for (const header of headers) {
192
+ const bubbleRow = getBubble.get(`bubbleId:${ref.composerId}:${header.bubbleId}`);
193
+ if (!bubbleRow)
194
+ continue;
195
+ let bubble;
196
+ try {
197
+ bubble = JSON.parse(bubbleRow.value);
198
+ }
199
+ catch {
200
+ continue;
201
+ }
202
+ const timestamp = toDate(bubble.createdAt);
203
+ if (since.getTime() > 0 && timestamp <= since) {
204
+ messageIndex++;
205
+ continue;
206
+ }
207
+ const content = toNonEmptyString(bubble.text) ?? "";
208
+ if (!content) {
209
+ messageIndex++;
210
+ continue;
211
+ }
212
+ const role = normalizeRole(bubble.type);
213
+ yield {
214
+ tool: "cursor",
215
+ sessionId,
216
+ timestamp,
217
+ role,
218
+ content,
219
+ metadata: {
220
+ messageIndex,
221
+ tokenEstimate: estimateTokens(content),
222
+ referencedFiles: [],
223
+ model: bubble.modelInfo?.modelName ?? model,
224
+ composerMode,
225
+ },
226
+ };
227
+ messageIndex++;
228
+ }
229
+ }
230
+ }
231
+ async resolveWorkspaceDatabasePaths() {
149
232
  try {
150
233
  const target = await stat(this.cursorStorePath);
151
234
  if (target.isFile()) {
@@ -158,27 +241,79 @@ export class CursorScraper {
158
241
  catch {
159
242
  return [];
160
243
  }
161
- const patterns = ["**/*.sqlite", "**/*.sqlite3", "**/*.db", "**/*.vscdb"];
162
- const resolved = await Promise.all(patterns.map((pattern) => glob(pattern, {
244
+ const paths = await glob("**/state.vscdb", {
163
245
  cwd: this.cursorStorePath,
164
246
  absolute: true,
165
247
  nodir: true,
166
- })));
167
- return [...new Set(resolved.flat())];
248
+ });
249
+ if (!this.projectRoot) {
250
+ return paths;
251
+ }
252
+ const filtered = [];
253
+ for (const path of paths) {
254
+ if (await workspaceMatchesProject(path, this.projectRoot)) {
255
+ filtered.push(path);
256
+ }
257
+ }
258
+ return filtered;
168
259
  }
169
260
  }
261
+ async function workspaceMatchesProject(workspaceDbPath, projectRoot) {
262
+ try {
263
+ const raw = await readFile(join(dirname(workspaceDbPath), "workspace.json"), "utf-8");
264
+ const parsed = JSON.parse(raw);
265
+ const folder = typeof parsed.folder === "string" ? parsed.folder : undefined;
266
+ if (!folder) {
267
+ return false;
268
+ }
269
+ const folderPath = folder.startsWith("file:") ? fileURLToPath(folder) : folder;
270
+ return pathMatchesProject(folderPath, projectRoot);
271
+ }
272
+ catch {
273
+ return false;
274
+ }
275
+ }
276
+ /**
277
+ * Derive the Cursor global storage path from a workspace database path.
278
+ *
279
+ * Workspace path structure:
280
+ * .../Cursor/User/workspaceStorage/<hash>/state.vscdb
281
+ * Global storage:
282
+ * .../Cursor/User/globalStorage/state.vscdb
283
+ */
284
+ function deriveGlobalStoragePath(workspaceDbPath) {
285
+ const normalized = workspaceDbPath.replace(/\\/g, "/");
286
+ const wsIdx = normalized.indexOf("/workspaceStorage/");
287
+ if (wsIdx === -1)
288
+ return null;
289
+ const userDir = normalized.slice(0, wsIdx);
290
+ return join(userDir, "globalStorage", "state.vscdb");
291
+ }
170
292
  function normalizeRole(value) {
171
- if (!value) {
293
+ // Numeric type from bubble data: 1 = user, 2 = assistant.
294
+ if (typeof value === "number") {
295
+ if (value === BUBBLE_TYPE_USER)
296
+ return "user";
297
+ if (value === BUBBLE_TYPE_ASSISTANT)
298
+ return "assistant";
172
299
  return "system";
173
300
  }
174
- return ROLE_MAP[value.toLowerCase()] ?? "system";
301
+ // String role from legacy format.
302
+ const map = {
303
+ user: "user",
304
+ human: "user",
305
+ assistant: "assistant",
306
+ ai: "assistant",
307
+ system: "system",
308
+ tool: "tool",
309
+ };
310
+ return map[(value ?? "").toLowerCase()] ?? "system";
175
311
  }
176
312
  function normalizeComposerMode(value) {
177
313
  return value === "agent" ? "agent" : "normal";
178
314
  }
179
- function inferSessionId(path) {
180
- const file = basename(path);
181
- return file.replace(/\.[^.]+$/, "") || "unknown";
315
+ function isRecord(value) {
316
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
182
317
  }
183
318
  function toNonEmptyString(value) {
184
319
  if (typeof value !== "string") {
@@ -187,32 +322,4 @@ function toNonEmptyString(value) {
187
322
  const trimmed = value.trim();
188
323
  return trimmed.length > 0 ? trimmed : undefined;
189
324
  }
190
- function toMessageIndex(value) {
191
- const index = Number(value);
192
- if (Number.isFinite(index) && index >= 0) {
193
- return Math.floor(index);
194
- }
195
- return 0;
196
- }
197
- function coerceDate(value) {
198
- if (value instanceof Date) {
199
- return value;
200
- }
201
- if (typeof value === "number" && Number.isFinite(value)) {
202
- const millis = value > 10_000_000_000 ? value : value * 1000;
203
- return new Date(millis);
204
- }
205
- if (typeof value === "string" && value.length > 0) {
206
- const numeric = Number(value);
207
- if (Number.isFinite(numeric) && value.trim() !== "") {
208
- const millis = numeric > 10_000_000_000 ? numeric : numeric * 1000;
209
- return new Date(millis);
210
- }
211
- const parsed = new Date(value);
212
- if (!Number.isNaN(parsed.getTime())) {
213
- return parsed;
214
- }
215
- }
216
- return new Date(0);
217
- }
218
325
  //# sourceMappingURL=cursor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../../src/scrapers/cursor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cursor.js","sourceRoot":"","sources":["../../../src/scrapers/cursor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Public API for building xtctx-compatible scrapers.
3
+ *
4
+ * External scraper packages should import from "xtctx/scrapers":
5
+ *
6
+ * ```ts
7
+ * import { AbstractScraper, estimateTokens } from "xtctx/scrapers";
8
+ * import type { ConversationChunk, ScraperState } from "xtctx/scrapers";
9
+ * ```
10
+ *
11
+ * See `AbstractScraper` for the full authoring guide.
12
+ */
13
+ export type { ChunkMetadata, ConversationChunk, ConversationScraper, ScraperState, } from "../types/scraper.js";
14
+ export { AbstractScraper, ScraperStateManager, estimateTokens, toDate } from "./base.js";
15
+ export { ScraperRegistry } from "./registry.js";
16
+ export { AntigravityScraper } from "./antigravity.js";
17
+ export { ClaudeCodeScraper } from "./claude-code.js";
18
+ export { CodexCliScraper } from "./codex.js";
19
+ export { CopilotScraper } from "./copilot.js";
20
+ export { CopilotCliScraper } from "./copilot-cli.js";
21
+ export { CursorScraper } from "./cursor.js";
22
+ export { OpenCodeScraper } from "./opencode.js";
23
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scrapers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,YAAY,EACV,aAAa,EACb,iBAAiB,EACjB,mBAAmB,EACnB,YAAY,GACb,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACzF,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Public API for building xtctx-compatible scrapers.
3
+ *
4
+ * External scraper packages should import from "xtctx/scrapers":
5
+ *
6
+ * ```ts
7
+ * import { AbstractScraper, estimateTokens } from "xtctx/scrapers";
8
+ * import type { ConversationChunk, ScraperState } from "xtctx/scrapers";
9
+ * ```
10
+ *
11
+ * See `AbstractScraper` for the full authoring guide.
12
+ */
13
+ export { AbstractScraper, ScraperStateManager, estimateTokens, toDate } from "./base.js";
14
+ export { ScraperRegistry } from "./registry.js";
15
+ export { AntigravityScraper } from "./antigravity.js";
16
+ export { ClaudeCodeScraper } from "./claude-code.js";
17
+ export { CodexCliScraper } from "./codex.js";
18
+ export { CopilotScraper } from "./copilot.js";
19
+ export { CopilotCliScraper } from "./copilot-cli.js";
20
+ export { CursorScraper } from "./cursor.js";
21
+ export { OpenCodeScraper } from "./opencode.js";
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scrapers/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AACzF,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,37 @@
1
+ import type { OpenCodeChunk } from "../types/scraper.js";
2
+ import { AbstractScraper } from "./base.js";
3
+ /**
4
+ * Mutation shapes the opencode scraper tolerates silently. Anything outside
5
+ * this whitelist that drops records must warn (or throw for required tables).
6
+ */
7
+ export declare const ACCEPTED_DEGRADATIONS: {
8
+ /** opencode.db missing — opencode CLI not installed on this machine. */
9
+ missingDatabase: string;
10
+ /** better-sqlite3 native module unavailable — opt-in peer dep. */
11
+ missingSqliteBinding: string;
12
+ /** Sessions table empty — pristine opencode install. */
13
+ emptySessions: string;
14
+ /** A part with no extractable text (file, snapshot, step events). */
15
+ nonTextPart: string;
16
+ /** Reasoning parts on assistant messages — internal model thoughts; skipped by default. */
17
+ reasoningPart: string;
18
+ /** Forward-compat unknown keys alongside known fields. */
19
+ unknownFieldsAlongside: string;
20
+ /** A message data row that fails to parse as JSON — skip with warn. */
21
+ malformedMessageData: string;
22
+ /** A part data row that fails to parse as JSON — skip with warn. */
23
+ malformedPartData: string;
24
+ };
25
+ export declare class OpenCodeScraper extends AbstractScraper<OpenCodeChunk> {
26
+ private readonly opencodeDbPath;
27
+ private readonly projectRoot?;
28
+ readonly tool = "opencode";
29
+ constructor(opencodeDbPath: string, stateDir: string, projectRoot?: string | undefined);
30
+ detect(): Promise<boolean>;
31
+ getStorePaths(): string[];
32
+ scrape(since?: Date): AsyncIterable<OpenCodeChunk>;
33
+ fullSync(): AsyncIterable<OpenCodeChunk>;
34
+ private readAllSessions;
35
+ private readFromDb;
36
+ }
37
+ //# sourceMappingURL=opencode.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../../src/scrapers/opencode.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,OAAO,EAAE,eAAe,EAA0B,MAAM,WAAW,CAAC;AAIpE;;;GAGG;AACH,eAAO,MAAM,qBAAqB;IAChC,wEAAwE;;IAExE,kEAAkE;;IAElE,wDAAwD;;IAExD,qEAAqE;;IAErE,2FAA2F;;IAE3F,0DAA0D;;IAE1D,uEAAuE;;IAEvE,oEAAoE;;CAErE,CAAC;AA4CF,qBAAa,eAAgB,SAAQ,eAAe,CAAC,aAAa,CAAC;IAI/D,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAL/B,QAAQ,CAAC,IAAI,cAAc;gBAGR,cAAc,EAAE,MAAM,EACvC,QAAQ,EAAE,MAAM,EACC,WAAW,CAAC,EAAE,MAAM,YAAA;IAKjC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAShC,aAAa,IAAI,MAAM,EAAE;IAIlB,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,GAAG,aAAa,CAAC,aAAa,CAAC;IAMlD,QAAQ,IAAI,aAAa,CAAC,aAAa,CAAC;YAIhC,eAAe;IA6C9B,OAAO,CAAE,UAAU;CAoNpB"}