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,40 +1,70 @@
1
- import { readFile, readdir, stat } from "node:fs/promises";
2
- import { basename, join } from "node:path";
3
- import { estimateTokens, ScraperStateManager } from "./base.js";
4
- const ROLE_MAP = {
5
- user: "user",
6
- human: "user",
7
- assistant: "assistant",
8
- system: "system",
9
- tool: "tool",
1
+ import { readFile, stat } from "node:fs/promises";
2
+ import { dirname, join } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { glob } from "glob";
5
+ import { AbstractScraper, estimateTokens, toDate } from "./base.js";
6
+ import { pathMatchesProject } from "../utils/project-scope.js";
7
+ /** VS Code stores Copilot Chat history in workspaceStorage SQLite files. */
8
+ const SESSIONS_KEY = "interactive.sessions";
9
+ const SCRAPER_NAME = "copilot";
10
+ /**
11
+ * Shapes that the Copilot scraper tolerates silently without logging.
12
+ * Each entry documents the shape being accepted and why it is not drift.
13
+ * Anything not listed here that falls outside the happy path MUST warn
14
+ * (or throw, for required-schema violations).
15
+ */
16
+ export const ACCEPTED_DEGRADATIONS = {
17
+ /** Workspace has no state.vscdb yet — pristine VS Code install. */
18
+ missingStateVscdb: "workspace directory has no state.vscdb yet",
19
+ /** workspaceStorage root missing — VS Code not installed. */
20
+ missingWorkspaceStorage: "workspaceStorage directory does not exist",
21
+ /** better-sqlite3 native module absent — Copilot ingestion is opt-in. */
22
+ missingSqliteBinding: "better-sqlite3 native module unavailable",
23
+ /** State.vscdb has no interactive.sessions row — workspace never used Copilot chat. */
24
+ noInteractiveSessionsKey: "workspaceStorage has no chat history",
25
+ /** ItemTable shape varies across VS Code versions; tolerate open/query failure. */
26
+ unreadableItemTable: "ItemTable row is unreadable or unexpected shape",
27
+ /** A canceled request is intentionally skipped — not drift. */
28
+ canceledRequest: "request was canceled by the user",
29
+ /** Some sessions legitimately have no user-text (agent-only runs); skip silently. */
30
+ emptyUserText: "request has no user-visible text parts",
31
+ /** Empty assistant response (thinking timeout etc.) — not drift. */
32
+ emptyAssistantText: "request has no assistant response text",
33
+ /** Extra/unknown fields alongside known ones are forward-compatible. */
34
+ unknownFieldsAlongside: "unknown sibling field added by a newer VS Code version",
10
35
  };
11
- export class CopilotScraper {
12
- copilotHistoryPath;
36
+ function warnDrift(sourcePath, surprise, recordsAffected) {
37
+ console.warn(`[${SCRAPER_NAME}] schema-drift surprise at ${sourcePath}: ${surprise} ` +
38
+ `(records affected: ${recordsAffected})`);
39
+ }
40
+ export class CopilotScraper extends AbstractScraper {
41
+ workspaceStoragePath;
42
+ projectRoot;
13
43
  tool = "copilot";
14
- stateManager;
15
- constructor(copilotHistoryPath, stateDir) {
16
- this.copilotHistoryPath = copilotHistoryPath;
17
- this.stateManager = new ScraperStateManager(stateDir);
44
+ constructor(
45
+ /** Path to %APPDATA%/Code/User/workspaceStorage (or a test stand-in). */
46
+ workspaceStoragePath, stateDir, projectRoot) {
47
+ super(stateDir);
48
+ this.workspaceStoragePath = workspaceStoragePath;
49
+ this.projectRoot = projectRoot;
18
50
  }
19
51
  async detect() {
20
52
  try {
21
- const target = await stat(this.copilotHistoryPath);
22
- return target.isFile() || target.isDirectory();
53
+ const target = await stat(this.workspaceStoragePath);
54
+ return target.isDirectory();
23
55
  }
24
56
  catch {
25
57
  return false;
26
58
  }
27
59
  }
28
60
  getStorePaths() {
29
- return [this.copilotHistoryPath];
61
+ return [this.workspaceStoragePath];
30
62
  }
31
63
  async *scrape(since) {
32
- const state = await this.getLastScrapedPosition();
33
- const cutoff = since ?? state.lastTimestamp;
34
- yield* this.readAllMessages(cutoff);
64
+ yield* this.readAllMessages(since);
35
65
  }
36
66
  async *fullSync() {
37
- yield* this.readAllMessages(new Date(0));
67
+ yield* this.readAllMessages();
38
68
  }
39
69
  parseRaw(raw) {
40
70
  const value = raw;
@@ -54,110 +84,232 @@ export class CopilotScraper {
54
84
  },
55
85
  };
56
86
  }
57
- async getLastScrapedPosition() {
58
- return this.stateManager.load(this.tool);
59
- }
60
- async saveScrapedPosition(state) {
61
- await this.stateManager.save(this.tool, state);
62
- }
63
87
  async *readAllMessages(since) {
64
- const files = await this.resolveJsonFiles();
65
- const messageIndexBySession = new Map();
66
- for (const filePath of files) {
67
- const fileSessionId = inferSessionId(filePath);
68
- let parsed;
88
+ const dbPaths = await this.resolveDbPaths();
89
+ let Database;
90
+ try {
91
+ // Dynamic import so the module remains optional at startup.
92
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
93
+ Database = (await import("better-sqlite3")).default;
94
+ }
95
+ catch {
96
+ // ACCEPTED_DEGRADATIONS.missingSqliteBinding — opt-in peer dep.
97
+ return;
98
+ }
99
+ if (!Database)
100
+ return;
101
+ for (const dbPath of dbPaths) {
102
+ let db;
69
103
  try {
70
- parsed = JSON.parse(await readFile(filePath, "utf-8"));
104
+ db = new Database(dbPath, { readonly: true, fileMustExist: true });
71
105
  }
72
106
  catch {
107
+ // ACCEPTED_DEGRADATIONS.missingStateVscdb — workspace never wrote a db yet.
108
+ continue;
109
+ }
110
+ try {
111
+ yield* this.readFromDb(db, dbPath, since);
112
+ }
113
+ finally {
114
+ db.close();
115
+ }
116
+ }
117
+ }
118
+ *readFromDb(db, dbPath, since) {
119
+ let rawValue;
120
+ try {
121
+ const row = db
122
+ .prepare("SELECT value FROM ItemTable WHERE key = ?")
123
+ .get(SESSIONS_KEY);
124
+ rawValue = row?.value ?? null;
125
+ }
126
+ catch (err) {
127
+ // Required table missing / shape changed — this is a real surprise.
128
+ warnDrift(dbPath, `ItemTable query failed: ${err.message}`, 0);
129
+ return;
130
+ }
131
+ if (!rawValue) {
132
+ // ACCEPTED_DEGRADATIONS.noInteractiveSessionsKey
133
+ return;
134
+ }
135
+ let sessionsMap;
136
+ try {
137
+ sessionsMap = JSON.parse(rawValue);
138
+ }
139
+ catch (err) {
140
+ warnDrift(dbPath, `interactive.sessions value is not valid JSON: ${err.message}`, 0);
141
+ return;
142
+ }
143
+ if (!isRecord(sessionsMap)) {
144
+ warnDrift(dbPath, `expected interactive.sessions to be an object, got ${describeType(sessionsMap)}`, 0);
145
+ return;
146
+ }
147
+ const sinceMs = since ? since.getTime() : 0;
148
+ for (const [sessionKey, rawSession] of Object.entries(sessionsMap)) {
149
+ if (!isRecord(rawSession)) {
150
+ warnDrift(`${dbPath}#${sessionKey}`, `session entry is not an object (got ${describeType(rawSession)})`, 0);
73
151
  continue;
74
152
  }
75
- const messages = extractMessages(parsed, fileSessionId);
76
- for (const message of messages) {
77
- const timestamp = toDate(message.timestamp);
78
- if (timestamp <= since) {
153
+ const session = rawSession;
154
+ const sessionId = session.sessionId ?? "unknown";
155
+ if (session.sessionId === undefined) {
156
+ warnDrift(`${dbPath}#${sessionKey}`, "session missing 'sessionId' field — using fallback 'unknown'", 0);
157
+ }
158
+ if (session.creationDate === null || (session.creationDate !== undefined &&
159
+ typeof session.creationDate !== "number" &&
160
+ typeof session.creationDate !== "string")) {
161
+ warnDrift(`${dbPath}#${sessionId}`, `expected 'creationDate' to be a number, got ${describeType(session.creationDate)}`, 0);
162
+ }
163
+ // Copilot only stamps a session-level creationDate — individual turns
164
+ // inherit it. Using creationDate for the scrape cursor drops whole
165
+ // sessions that existed before the cursor but gained NEW turns after
166
+ // it, causing permanent turn loss (P1 from review). Fix: emit every
167
+ // turn every cycle and rely on chunk-ID-based upsert dedupe upstream
168
+ // (the ID basis now includes messageIndex so duplicates collapse
169
+ // safely). Note: sinceMs is still referenced below so that a future
170
+ // per-turn timestamp upgrade only needs a narrow edit.
171
+ void sinceMs;
172
+ const creationDate = toDate(session.creationDate);
173
+ if (session.requests !== undefined && !Array.isArray(session.requests)) {
174
+ // Schema drift: 'requests' was renamed or retyped. This is the
175
+ // highest-risk mutation because it silently empties whole sessions.
176
+ warnDrift(`${dbPath}#${sessionId}`, `expected 'requests' to be an array, got ${describeType(session.requests)}`, 0);
177
+ continue;
178
+ }
179
+ if (!("requests" in rawSession)) {
180
+ // 'requests' is missing entirely. If any other non-whitelisted key
181
+ // looks like a request array, it's almost certainly a rename — warn.
182
+ // A truly empty pre-v1 session would have no array-shaped sibling.
183
+ const suspiciousRename = Object.entries(rawSession).find(([k, v]) => k !== "sessionId" && k !== "creationDate" && Array.isArray(v));
184
+ if (suspiciousRename) {
185
+ warnDrift(`${dbPath}#${sessionId}`, `session has no 'requests' key; suspected rename to '${suspiciousRename[0]}'`, 0);
186
+ }
187
+ continue;
188
+ }
189
+ const requests = Array.isArray(session.requests) ? session.requests : [];
190
+ let messageIndex = 0;
191
+ for (const req of requests) {
192
+ if (!isRecord(req)) {
193
+ warnDrift(`${dbPath}#${sessionId}`, `request entry is not an object (got ${describeType(req)})`, 0);
194
+ continue;
195
+ }
196
+ if (req.isCanceled) {
197
+ // ACCEPTED_DEGRADATIONS.canceledRequest
79
198
  continue;
80
199
  }
81
- const sessionId = message.sessionId || fileSessionId;
82
- const nextIndex = messageIndexBySession.get(sessionId) ?? 0;
83
- messageIndexBySession.set(sessionId, nextIndex + 1);
84
- yield this.parseRaw({
85
- ...message,
86
- timestamp,
87
- sessionId,
88
- messageIndex: nextIndex,
89
- });
200
+ const userText = extractUserText(req);
201
+ if (userText) {
202
+ yield this.parseRaw({
203
+ sessionId,
204
+ role: "user",
205
+ content: userText,
206
+ timestamp: creationDate,
207
+ model: req.model,
208
+ completionType: req.agentId ? "agent" : "chat",
209
+ messageIndex: messageIndex++,
210
+ });
211
+ }
212
+ const assistantText = extractAssistantText(req);
213
+ if (assistantText) {
214
+ yield this.parseRaw({
215
+ sessionId,
216
+ role: "assistant",
217
+ content: assistantText,
218
+ timestamp: creationDate,
219
+ model: req.model,
220
+ completionType: req.agentId ? "agent" : "chat",
221
+ messageIndex: messageIndex++,
222
+ });
223
+ }
90
224
  }
91
225
  }
92
226
  }
93
- async resolveJsonFiles() {
227
+ /**
228
+ * Discovers VS Code workspaceStorage SQLite databases.
229
+ * Pattern: &lt;workspaceStoragePath&gt;/[hash]/state.vscdb
230
+ */
231
+ async resolveDbPaths() {
94
232
  try {
95
- const target = await stat(this.copilotHistoryPath);
96
- if (target.isFile()) {
97
- return this.copilotHistoryPath.endsWith(".json") ? [this.copilotHistoryPath] : [];
233
+ const target = await stat(this.workspaceStoragePath);
234
+ if (!target.isDirectory()) {
235
+ // The root must be a directory — a non-directory here is drift.
236
+ warnDrift(this.workspaceStoragePath, "expected workspaceStorage to be a directory", 0);
237
+ return [];
238
+ }
239
+ const paths = await glob("*/state.vscdb", {
240
+ cwd: this.workspaceStoragePath,
241
+ absolute: true,
242
+ nodir: true,
243
+ });
244
+ if (!this.projectRoot) {
245
+ return paths;
246
+ }
247
+ const filtered = [];
248
+ for (const path of paths) {
249
+ if (await workspaceMatchesProject(path, this.projectRoot)) {
250
+ filtered.push(path);
251
+ }
98
252
  }
99
- const files = await readdir(this.copilotHistoryPath);
100
- return files
101
- .filter((file) => file.endsWith(".json"))
102
- .map((file) => join(this.copilotHistoryPath, file));
253
+ return filtered;
103
254
  }
104
255
  catch {
256
+ // ACCEPTED_DEGRADATIONS.missingWorkspaceStorage
105
257
  return [];
106
258
  }
107
259
  }
108
260
  }
109
- function extractMessages(input, fallbackSessionId) {
110
- if (Array.isArray(input)) {
111
- return input
112
- .filter((entry) => isRecord(entry))
113
- .map((entry) => mapMessage(entry, fallbackSessionId));
114
- }
115
- if (!isRecord(input)) {
116
- return [];
117
- }
118
- if (Array.isArray(input.messages)) {
119
- const sessionId = toStringValue(input.sessionId ?? input.session_id) ?? fallbackSessionId;
120
- return input.messages
121
- .filter((entry) => isRecord(entry))
122
- .map((entry) => mapMessage(entry, sessionId));
123
- }
124
- if (Array.isArray(input.conversations)) {
125
- const rows = [];
126
- for (const conversation of input.conversations) {
127
- if (!isRecord(conversation) || !Array.isArray(conversation.messages)) {
128
- continue;
129
- }
130
- const sessionId = toStringValue(conversation.sessionId ?? conversation.session_id ?? conversation.id) ??
131
- fallbackSessionId;
132
- for (const message of conversation.messages) {
133
- if (isRecord(message)) {
134
- rows.push(mapMessage(message, sessionId));
135
- }
136
- }
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;
137
268
  }
138
- return rows;
269
+ const folderPath = folder.startsWith("file:") ? fileURLToPath(folder) : folder;
270
+ return pathMatchesProject(folderPath, projectRoot);
271
+ }
272
+ catch {
273
+ return false;
139
274
  }
140
- return [];
141
275
  }
142
- function mapMessage(message, sessionId) {
143
- return {
144
- sessionId,
145
- role: toStringValue(message.role) ?? toStringValue(message.author),
146
- content: toStringValue(message.content) ?? toStringValue(message.text),
147
- timestamp: (message.timestamp ?? message.created_at ?? message.createdAt),
148
- model: toStringValue(message.model),
149
- completionType: toStringValue(message.completionType ?? message.completion_type),
150
- };
276
+ /** Concatenates all text parts from a user message. */
277
+ function extractUserText(req) {
278
+ const parts = req.message?.parts;
279
+ if (!Array.isArray(parts)) {
280
+ return undefined;
281
+ }
282
+ const text = parts
283
+ .map((p) => p.text ?? "")
284
+ .join("\n")
285
+ .trim();
286
+ return text.length > 0 ? text : undefined;
287
+ }
288
+ /** Concatenates all value segments from an assistant response. */
289
+ function extractAssistantText(req) {
290
+ const response = req.response;
291
+ if (!Array.isArray(response)) {
292
+ return undefined;
293
+ }
294
+ const text = response
295
+ .map((r) => r.value ?? "")
296
+ .join("")
297
+ .trim();
298
+ return text.length > 0 ? text : undefined;
151
299
  }
152
300
  function normalizeRole(value) {
301
+ const ROLE_MAP = {
302
+ user: "user",
303
+ human: "user",
304
+ assistant: "assistant",
305
+ system: "system",
306
+ tool: "tool",
307
+ };
153
308
  if (!value) {
154
309
  return "system";
155
310
  }
156
311
  return ROLE_MAP[value.toLowerCase()] ?? "system";
157
312
  }
158
- function inferSessionId(filePath) {
159
- return basename(filePath).replace(".json", "") || "unknown";
160
- }
161
313
  function toMessageIndex(value) {
162
314
  const parsed = Number(value);
163
315
  if (Number.isFinite(parsed) && parsed >= 0) {
@@ -171,28 +323,14 @@ function toStringValue(value) {
171
323
  }
172
324
  return value;
173
325
  }
174
- function toDate(value) {
175
- if (value instanceof Date) {
176
- return value;
177
- }
178
- if (typeof value === "number" && Number.isFinite(value)) {
179
- const millis = value > 10_000_000_000 ? value : value * 1000;
180
- return new Date(millis);
181
- }
182
- if (typeof value === "string") {
183
- const numeric = Number(value);
184
- if (Number.isFinite(numeric) && value.trim() !== "") {
185
- const millis = numeric > 10_000_000_000 ? numeric : numeric * 1000;
186
- return new Date(millis);
187
- }
188
- const parsed = new Date(value);
189
- if (!Number.isNaN(parsed.getTime())) {
190
- return parsed;
191
- }
192
- }
193
- return new Date(0);
194
- }
195
326
  function isRecord(value) {
196
327
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
197
328
  }
329
+ function describeType(value) {
330
+ if (value === null)
331
+ return "null";
332
+ if (Array.isArray(value))
333
+ return "array";
334
+ return typeof value;
335
+ }
198
336
  //# sourceMappingURL=copilot.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"copilot.js","sourceRoot":"","sources":["../../../src/scrapers/copilot.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"copilot.js","sourceRoot":"","sources":["../../../src/scrapers/copilot.ts"],"names":[],"mappings":"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"}
@@ -1,18 +1,33 @@
1
- import type { ConversationScraper, CursorChunk, ScraperState } from "../types/scraper.js";
2
- export declare class CursorScraper implements ConversationScraper<CursorChunk> {
1
+ import type { CursorChunk } from "../types/scraper.js";
2
+ import { AbstractScraper } from "./base.js";
3
+ /**
4
+ * Shapes the cursor scraper tolerates silently without logging. All other
5
+ * shape surprises warn; missing required tables throw.
6
+ */
7
+ export declare const ACCEPTED_DEGRADATIONS: {
8
+ /** Store path missing — Cursor not installed on this machine. */
9
+ missingStorePath: string;
10
+ /** Workspace has no composerData yet — empty workspace. */
11
+ emptyWorkspace: string;
12
+ /** A composer whose bubble row is missing — bubble pruned by Cursor. */
13
+ prunedBubble: string;
14
+ /** Empty bubble text (tool-call only, etc.). */
15
+ emptyBubbleText: string;
16
+ /** Forward-compat unknown keys alongside known composer fields. */
17
+ unknownFieldsAlongside: string;
18
+ };
19
+ export declare class CursorScraper extends AbstractScraper<CursorChunk> {
3
20
  private readonly cursorStorePath;
21
+ private readonly projectRoot?;
4
22
  readonly tool = "cursor";
5
- private readonly stateManager;
6
- constructor(cursorStorePath: string, stateDir: string);
23
+ constructor(cursorStorePath: string, stateDir: string, projectRoot?: string | undefined);
7
24
  detect(): Promise<boolean>;
8
25
  getStorePaths(): string[];
9
26
  scrape(since?: Date): AsyncIterable<CursorChunk>;
10
27
  fullSync(): AsyncIterable<CursorChunk>;
11
- parseRaw(raw: unknown): CursorChunk;
12
- getLastScrapedPosition(): Promise<ScraperState>;
13
- saveScrapedPosition(state: ScraperState): Promise<void>;
14
28
  private readAllMessages;
15
- private queryRows;
16
- private resolveDatabasePaths;
29
+ private readWorkspaceComposers;
30
+ private readComposerMessages;
31
+ private resolveWorkspaceDatabasePaths;
17
32
  }
18
33
  //# sourceMappingURL=cursor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../../src/scrapers/cursor.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AA6D1F,qBAAa,aAAc,YAAW,mBAAmB,CAAC,WAAW,CAAC;IAKlE,OAAO,CAAC,QAAQ,CAAC,eAAe;IAJlC,QAAQ,CAAC,IAAI,YAAY;IACzB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;gBAGhC,eAAe,EAAE,MAAM,EACxC,QAAQ,EAAE,MAAM;IAKZ,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAKhC,aAAa,IAAI,MAAM,EAAE;IAIlB,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,GAAG,aAAa,CAAC,WAAW,CAAC;IAMhD,QAAQ,IAAI,aAAa,CAAC,WAAW,CAAC;IAI7C,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,WAAW;IAyB7B,sBAAsB,IAAI,OAAO,CAAC,YAAY,CAAC;IAI/C,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;YAI9C,eAAe;IAoC9B,OAAO,CAAC,SAAS;YAaH,oBAAoB;CA2BnC"}
1
+ {"version":3,"file":"cursor.d.ts","sourceRoot":"","sources":["../../../src/scrapers/cursor.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,eAAe,EAA0B,MAAM,WAAW,CAAC;AASpE;;;GAGG;AACH,eAAO,MAAM,qBAAqB;IAChC,iEAAiE;;IAEjE,2DAA2D;;IAE3D,wEAAwE;;IAExE,gDAAgD;;IAEhD,mEAAmE;;CAEpE,CAAC;AAsCF,qBAAa,aAAc,SAAQ,eAAe,CAAC,WAAW,CAAC;IAI3D,OAAO,CAAC,QAAQ,CAAC,eAAe;IAEhC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAL/B,QAAQ,CAAC,IAAI,YAAY;gBAGN,eAAe,EAAE,MAAM,EACxC,QAAQ,EAAE,MAAM,EACC,WAAW,CAAC,EAAE,MAAM,YAAA;IAKjC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAKhC,aAAa,IAAI,MAAM,EAAE;IAIlB,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,GAAG,aAAa,CAAC,WAAW,CAAC;IAMhD,QAAQ,IAAI,aAAa,CAAC,WAAW,CAAC;YAI9B,eAAe;IA2C9B,OAAO,CAAC,sBAAsB;IAyD9B,OAAO,CAAE,oBAAoB;YA+If,6BAA6B;CA+B5C"}