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
@@ -0,0 +1,342 @@
1
+ import { createReadStream } from "node:fs";
2
+ import { readdir, stat } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import { createInterface } from "node:readline";
5
+ import { pathMatchesProject } from "../utils/project-scope.js";
6
+ import { AbstractScraper, estimateTokens, toDate } from "./base.js";
7
+ const SCRAPER_NAME = "copilot-cli";
8
+ /**
9
+ * Mutation shapes the copilot-cli scraper tolerates silently. Anything
10
+ * outside this whitelist that drops records must warn.
11
+ */
12
+ export const ACCEPTED_DEGRADATIONS = {
13
+ /** Sessions root missing — Copilot CLI not installed. */
14
+ missingSessionRoot: "~/.copilot/session-state directory absent",
15
+ /** Session directory has no events.jsonl file yet — fresh session. */
16
+ missingEventsJsonl: "session directory has no events.jsonl",
17
+ /** Blank line in events.jsonl. */
18
+ blankJsonlLine: "blank line in events.jsonl",
19
+ /** Event with no extractable role — many event types (status, tool_call,
20
+ * subagent meta, etc.) legitimately have no role. */
21
+ noRole: "event has no role — non-conversation event",
22
+ /** Event with no extractable text content. */
23
+ noContent: "event has role but no text content",
24
+ /** Forward-compat unknown keys alongside known fields. */
25
+ unknownFieldsAlongside: "extra keys alongside known event schema",
26
+ };
27
+ const ROLE_MAP = {
28
+ user: "user",
29
+ human: "user",
30
+ assistant: "assistant",
31
+ ai: "assistant",
32
+ system: "system",
33
+ tool: "tool",
34
+ };
35
+ /**
36
+ * Current Copilot CLI writes typed events ("user.message",
37
+ * "assistant.message", "system.message") whose payload lives under `data`.
38
+ * The event type itself carries the role.
39
+ */
40
+ const EVENT_TYPE_ROLE_MAP = {
41
+ "user.message": "user",
42
+ "assistant.message": "assistant",
43
+ "system.message": "system",
44
+ };
45
+ function warnDrift(sourcePath, surprise, recordsAffected) {
46
+ console.warn(`[${SCRAPER_NAME}] schema-drift surprise at ${sourcePath}: ${surprise} ` +
47
+ `(records affected: ${recordsAffected})`);
48
+ }
49
+ export class CopilotCliScraper extends AbstractScraper {
50
+ sessionStateDir;
51
+ projectRoot;
52
+ tool = "copilot-cli";
53
+ constructor(sessionStateDir, stateDir, projectRoot) {
54
+ super(stateDir);
55
+ this.sessionStateDir = sessionStateDir;
56
+ this.projectRoot = projectRoot;
57
+ }
58
+ async detect() {
59
+ try {
60
+ const target = await stat(this.sessionStateDir);
61
+ return target.isDirectory();
62
+ }
63
+ catch {
64
+ return false;
65
+ }
66
+ }
67
+ getStorePaths() {
68
+ return [this.sessionStateDir];
69
+ }
70
+ async *scrape(since) {
71
+ const state = await this.getLastScrapedPosition();
72
+ const cutoff = since ?? state.lastTimestamp;
73
+ yield* this.readAllSessions(cutoff);
74
+ }
75
+ async *fullSync() {
76
+ yield* this.readAllSessions(new Date(0));
77
+ }
78
+ async *readAllSessions(since) {
79
+ let sessionDirs;
80
+ try {
81
+ sessionDirs = await readdir(this.sessionStateDir);
82
+ }
83
+ catch {
84
+ // ACCEPTED_DEGRADATIONS.missingSessionRoot
85
+ return;
86
+ }
87
+ for (const sessionId of sessionDirs) {
88
+ const sessionDir = join(this.sessionStateDir, sessionId);
89
+ let dirStat;
90
+ try {
91
+ dirStat = await stat(sessionDir);
92
+ }
93
+ catch {
94
+ continue;
95
+ }
96
+ if (!dirStat.isDirectory())
97
+ continue;
98
+ const eventsPath = join(sessionDir, "events.jsonl");
99
+ try {
100
+ const eventsStat = await stat(eventsPath);
101
+ if (!eventsStat.isFile())
102
+ continue;
103
+ }
104
+ catch {
105
+ // ACCEPTED_DEGRADATIONS.missingEventsJsonl
106
+ continue;
107
+ }
108
+ try {
109
+ yield* this.readEventsFile(eventsPath, sessionId, since);
110
+ }
111
+ catch (err) {
112
+ // One unreadable session must not abort the remaining sessions.
113
+ warnDrift(eventsPath, `unreadable transcript file: ${err.message}`, 0);
114
+ }
115
+ }
116
+ }
117
+ async *readEventsFile(filePath, sessionId, since) {
118
+ const reader = createInterface({
119
+ input: createReadStream(filePath, { encoding: "utf8" }),
120
+ crlfDelay: Infinity,
121
+ });
122
+ let messageIndex = 0;
123
+ let lineNo = 0;
124
+ // null = no session.start context seen yet; only consulted when scoped.
125
+ let projectMatch = null;
126
+ for await (const line of reader) {
127
+ lineNo++;
128
+ if (!line.trim()) {
129
+ // ACCEPTED_DEGRADATIONS.blankJsonlLine
130
+ continue;
131
+ }
132
+ let event;
133
+ try {
134
+ event = JSON.parse(line);
135
+ }
136
+ catch (err) {
137
+ warnDrift(`${filePath}:${lineNo}`, `events.jsonl line is not valid JSON: ${err.message}`, 1);
138
+ continue;
139
+ }
140
+ if (!isRecord(event)) {
141
+ warnDrift(`${filePath}:${lineNo}`, `events.jsonl line is not an object (got ${describeType(event)})`, 1);
142
+ continue;
143
+ }
144
+ if (this.projectRoot && event.type === "session.start") {
145
+ projectMatch = sessionStartMatchesProject(event, this.projectRoot);
146
+ if (projectMatch === false) {
147
+ // Another project's session; nothing in this file belongs here.
148
+ return;
149
+ }
150
+ continue;
151
+ }
152
+ const role = extractRole(event);
153
+ const content = extractContent(event);
154
+ if (!role) {
155
+ // If the event looks like a conversation message (has extractable
156
+ // content AND a 'message' or 'role'-shaped sibling that we COULDN'T
157
+ // route), warn — likely a rename. Routine non-conversation events
158
+ // (status, tool_call, etc.) carry no content and are silent.
159
+ if (content) {
160
+ const looksLikeMessage = event.type === "message" ||
161
+ "role" in event ||
162
+ (isRecord(event.message) && "role" in event.message);
163
+ if (looksLikeMessage) {
164
+ warnDrift(`${filePath}:${lineNo}`, "event has content but no readable role — likely role-field rename", 1);
165
+ }
166
+ }
167
+ // ACCEPTED_DEGRADATIONS.noRole — non-conversation events are
168
+ // routine in events.jsonl. Skip silently.
169
+ continue;
170
+ }
171
+ if (!content) {
172
+ // Role is present but no content extractable. If a 'content' key
173
+ // exists in an unexpected shape (null, number, etc.), warn — silent
174
+ // skip would hide a content-field retype. A genuinely-missing content
175
+ // key on a role'd event is unusual but not necessarily drift.
176
+ if ("content" in event && typeof event.content !== "string" && !Array.isArray(event.content)) {
177
+ warnDrift(`${filePath}:${lineNo}`, `event has role but 'content' is unexpected type ${describeType(event.content)}`, 1);
178
+ }
179
+ // ACCEPTED_DEGRADATIONS.noContent
180
+ continue;
181
+ }
182
+ if (this.projectRoot && projectMatch === null) {
183
+ // Fail closed: without session.start context this session cannot be
184
+ // attributed to a project, so scoped indexing must not include it.
185
+ warnDrift(filePath, "session has no session.start context; cannot attribute to a project — skipped under project scoping", 1);
186
+ return;
187
+ }
188
+ const tsValue = event.timestamp ?? event.created_at ?? event.createdAt ?? event.time;
189
+ const timestamp = toDate(tsValue);
190
+ if (since.getTime() > 0 && timestamp <= since) {
191
+ messageIndex++;
192
+ continue;
193
+ }
194
+ const eventType = typeof event.type === "string" ? event.type : undefined;
195
+ yield {
196
+ tool: "copilot-cli",
197
+ sessionId,
198
+ timestamp,
199
+ role,
200
+ content,
201
+ metadata: {
202
+ messageIndex,
203
+ tokenEstimate: estimateTokens(content),
204
+ referencedFiles: [],
205
+ eventType,
206
+ },
207
+ };
208
+ messageIndex++;
209
+ }
210
+ }
211
+ }
212
+ function extractRole(event) {
213
+ // Try event.role first.
214
+ if (typeof event.role === "string") {
215
+ const mapped = ROLE_MAP[event.role.toLowerCase()];
216
+ if (mapped)
217
+ return mapped;
218
+ }
219
+ // Try event.message.role.
220
+ const message = event.message;
221
+ if (isRecord(message) && typeof message.role === "string") {
222
+ const mapped = ROLE_MAP[message.role.toLowerCase()];
223
+ if (mapped)
224
+ return mapped;
225
+ }
226
+ // Typed events: event.data.role, then the role implied by the event type.
227
+ const data = event.data;
228
+ if (isRecord(data) && typeof data.role === "string") {
229
+ const mapped = ROLE_MAP[data.role.toLowerCase()];
230
+ if (mapped)
231
+ return mapped;
232
+ }
233
+ if (typeof event.type === "string") {
234
+ const mapped = EVENT_TYPE_ROLE_MAP[event.type];
235
+ if (mapped)
236
+ return mapped;
237
+ }
238
+ return null;
239
+ }
240
+ function sessionStartMatchesProject(event, projectRoot) {
241
+ const data = event.data;
242
+ if (!isRecord(data))
243
+ return false;
244
+ const context = data.context;
245
+ if (!isRecord(context))
246
+ return false;
247
+ const candidates = [context.cwd, context.gitRoot].filter((value) => typeof value === "string" && value.length > 0);
248
+ return candidates.some((candidate) => pathMatchesProject(candidate, projectRoot));
249
+ }
250
+ function extractContent(event) {
251
+ // 1. event.content as string.
252
+ if (typeof event.content === "string") {
253
+ const trimmed = event.content.trim();
254
+ if (trimmed.length > 0)
255
+ return trimmed;
256
+ }
257
+ // 2. event.text as string.
258
+ if (typeof event.text === "string") {
259
+ const trimmed = event.text.trim();
260
+ if (trimmed.length > 0)
261
+ return trimmed;
262
+ }
263
+ // 3. event.message.content as string or array of {type, text}.
264
+ const message = event.message;
265
+ if (isRecord(message)) {
266
+ const inner = message.content;
267
+ if (typeof inner === "string") {
268
+ const trimmed = inner.trim();
269
+ if (trimmed.length > 0)
270
+ return trimmed;
271
+ }
272
+ if (Array.isArray(inner)) {
273
+ const texts = inner
274
+ .map((item) => {
275
+ if (typeof item === "string")
276
+ return item;
277
+ if (isRecord(item) && typeof item.text === "string")
278
+ return item.text;
279
+ return "";
280
+ })
281
+ .filter((t) => t.length > 0);
282
+ const joined = texts.join("\n").trim();
283
+ if (joined.length > 0)
284
+ return joined;
285
+ }
286
+ }
287
+ // 4. event.content as array of {type, text}.
288
+ if (Array.isArray(event.content)) {
289
+ const texts = event.content
290
+ .map((item) => {
291
+ if (typeof item === "string")
292
+ return item;
293
+ if (isRecord(item) && typeof item.text === "string")
294
+ return item.text;
295
+ return "";
296
+ })
297
+ .filter((t) => t.length > 0);
298
+ const joined = texts.join("\n").trim();
299
+ if (joined.length > 0)
300
+ return joined;
301
+ }
302
+ // 5. Typed events: event.data.content / event.data.text.
303
+ const data = event.data;
304
+ if (isRecord(data)) {
305
+ if (typeof data.content === "string") {
306
+ const trimmed = data.content.trim();
307
+ if (trimmed.length > 0)
308
+ return trimmed;
309
+ }
310
+ if (Array.isArray(data.content)) {
311
+ const texts = data.content
312
+ .map((item) => {
313
+ if (typeof item === "string")
314
+ return item;
315
+ if (isRecord(item) && typeof item.text === "string")
316
+ return item.text;
317
+ return "";
318
+ })
319
+ .filter((t) => t.length > 0);
320
+ const joined = texts.join("\n").trim();
321
+ if (joined.length > 0)
322
+ return joined;
323
+ }
324
+ if (typeof data.text === "string") {
325
+ const trimmed = data.text.trim();
326
+ if (trimmed.length > 0)
327
+ return trimmed;
328
+ }
329
+ }
330
+ return undefined;
331
+ }
332
+ function isRecord(value) {
333
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
334
+ }
335
+ function describeType(value) {
336
+ if (value === null)
337
+ return "null";
338
+ if (Array.isArray(value))
339
+ return "array";
340
+ return typeof value;
341
+ }
342
+ //# sourceMappingURL=copilot-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copilot-cli.js","sourceRoot":"","sources":["../../../src/scrapers/copilot-cli.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,50 @@
1
- import type { ConversationScraper, CopilotChunk, ScraperState } from "../types/scraper.js";
2
- export declare class CopilotScraper implements ConversationScraper<CopilotChunk> {
3
- private readonly copilotHistoryPath;
1
+ import type { CopilotChunk } from "../types/scraper.js";
2
+ import { AbstractScraper } from "./base.js";
3
+ /**
4
+ * Shapes that the Copilot scraper tolerates silently without logging.
5
+ * Each entry documents the shape being accepted and why it is not drift.
6
+ * Anything not listed here that falls outside the happy path MUST warn
7
+ * (or throw, for required-schema violations).
8
+ */
9
+ export declare const ACCEPTED_DEGRADATIONS: {
10
+ /** Workspace has no state.vscdb yet — pristine VS Code install. */
11
+ missingStateVscdb: string;
12
+ /** workspaceStorage root missing — VS Code not installed. */
13
+ missingWorkspaceStorage: string;
14
+ /** better-sqlite3 native module absent — Copilot ingestion is opt-in. */
15
+ missingSqliteBinding: string;
16
+ /** State.vscdb has no interactive.sessions row — workspace never used Copilot chat. */
17
+ noInteractiveSessionsKey: string;
18
+ /** ItemTable shape varies across VS Code versions; tolerate open/query failure. */
19
+ unreadableItemTable: string;
20
+ /** A canceled request is intentionally skipped — not drift. */
21
+ canceledRequest: string;
22
+ /** Some sessions legitimately have no user-text (agent-only runs); skip silently. */
23
+ emptyUserText: string;
24
+ /** Empty assistant response (thinking timeout etc.) — not drift. */
25
+ emptyAssistantText: string;
26
+ /** Extra/unknown fields alongside known ones are forward-compatible. */
27
+ unknownFieldsAlongside: string;
28
+ };
29
+ export declare class CopilotScraper extends AbstractScraper<CopilotChunk> {
30
+ /** Path to %APPDATA%/Code/User/workspaceStorage (or a test stand-in). */
31
+ private readonly workspaceStoragePath;
32
+ private readonly projectRoot?;
4
33
  readonly tool = "copilot";
5
- private readonly stateManager;
6
- constructor(copilotHistoryPath: string, stateDir: string);
34
+ constructor(
35
+ /** Path to %APPDATA%/Code/User/workspaceStorage (or a test stand-in). */
36
+ workspaceStoragePath: string, stateDir: string, projectRoot?: string | undefined);
7
37
  detect(): Promise<boolean>;
8
38
  getStorePaths(): string[];
9
39
  scrape(since?: Date): AsyncIterable<CopilotChunk>;
10
40
  fullSync(): AsyncIterable<CopilotChunk>;
11
41
  parseRaw(raw: unknown): CopilotChunk;
12
- getLastScrapedPosition(): Promise<ScraperState>;
13
- saveScrapedPosition(state: ScraperState): Promise<void>;
14
42
  private readAllMessages;
15
- private resolveJsonFiles;
43
+ private readFromDb;
44
+ /**
45
+ * Discovers VS Code workspaceStorage SQLite databases.
46
+ * Pattern: &lt;workspaceStoragePath&gt;/[hash]/state.vscdb
47
+ */
48
+ private resolveDbPaths;
16
49
  }
17
50
  //# sourceMappingURL=copilot.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"copilot.d.ts","sourceRoot":"","sources":["../../../src/scrapers/copilot.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAoB3F,qBAAa,cAAe,YAAW,mBAAmB,CAAC,YAAY,CAAC;IAKpE,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IAJrC,QAAQ,CAAC,IAAI,aAAa;IAC1B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;gBAGhC,kBAAkB,EAAE,MAAM,EAC3C,QAAQ,EAAE,MAAM;IAKZ,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IAShC,aAAa,IAAI,MAAM,EAAE;IAIlB,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,GAAG,aAAa,CAAC,YAAY,CAAC;IAMjD,QAAQ,IAAI,aAAa,CAAC,YAAY,CAAC;IAI9C,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,YAAY;IAoB9B,sBAAsB,IAAI,OAAO,CAAC,YAAY,CAAC;IAI/C,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;YAI9C,eAAe;YAmChB,gBAAgB;CAe/B"}
1
+ {"version":3,"file":"copilot.d.ts","sourceRoot":"","sources":["../../../src/scrapers/copilot.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,eAAe,EAA0B,MAAM,WAAW,CAAC;AAQpE;;;;;GAKG;AACH,eAAO,MAAM,qBAAqB;IAChC,mEAAmE;;IAEnE,6DAA6D;;IAE7D,yEAAyE;;IAEzE,uFAAuF;;IAEvF,mFAAmF;;IAEnF,+DAA+D;;IAE/D,qFAAqF;;IAErF,oEAAoE;;IAEpE,wEAAwE;;CAEzE,CAAC;AAyBF,qBAAa,cAAe,SAAQ,eAAe,CAAC,YAAY,CAAC;IAI7D,yEAAyE;IACzE,OAAO,CAAC,QAAQ,CAAC,oBAAoB;IAErC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAN/B,QAAQ,CAAC,IAAI,aAAa;;IAGxB,yEAAyE;IACxD,oBAAoB,EAAE,MAAM,EAC7C,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,YAAY,CAAC;IAIjD,QAAQ,IAAI,aAAa,CAAC,YAAY,CAAC;IAI9C,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,YAAY;YAoBrB,eAAe;IAmC9B,OAAO,CAAE,UAAU;IAoKnB;;;OAGG;YACW,cAAc;CAkC7B"}