xtctx 0.3.2

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 (217) hide show
  1. package/CHANGELOG.md +122 -0
  2. package/LICENSE +21 -0
  3. package/README.md +149 -0
  4. package/dist/src/api/routes/config.d.ts +4 -0
  5. package/dist/src/api/routes/config.d.ts.map +1 -0
  6. package/dist/src/api/routes/config.js +61 -0
  7. package/dist/src/api/routes/config.js.map +1 -0
  8. package/dist/src/api/routes/knowledge.d.ts +4 -0
  9. package/dist/src/api/routes/knowledge.d.ts.map +1 -0
  10. package/dist/src/api/routes/knowledge.js +40 -0
  11. package/dist/src/api/routes/knowledge.js.map +1 -0
  12. package/dist/src/api/routes/search.d.ts +7 -0
  13. package/dist/src/api/routes/search.d.ts.map +1 -0
  14. package/dist/src/api/routes/search.js +108 -0
  15. package/dist/src/api/routes/search.js.map +1 -0
  16. package/dist/src/api/routes/sources.d.ts +12 -0
  17. package/dist/src/api/routes/sources.d.ts.map +1 -0
  18. package/dist/src/api/routes/sources.js +70 -0
  19. package/dist/src/api/routes/sources.js.map +1 -0
  20. package/dist/src/api/server.d.ts +26 -0
  21. package/dist/src/api/server.d.ts.map +1 -0
  22. package/dist/src/api/server.js +312 -0
  23. package/dist/src/api/server.js.map +1 -0
  24. package/dist/src/cli/index.d.ts +3 -0
  25. package/dist/src/cli/index.d.ts.map +1 -0
  26. package/dist/src/cli/index.js +58 -0
  27. package/dist/src/cli/index.js.map +1 -0
  28. package/dist/src/cli/ingest.d.ts +6 -0
  29. package/dist/src/cli/ingest.d.ts.map +1 -0
  30. package/dist/src/cli/ingest.js +11 -0
  31. package/dist/src/cli/ingest.js.map +1 -0
  32. package/dist/src/cli/init.d.ts +6 -0
  33. package/dist/src/cli/init.d.ts.map +1 -0
  34. package/dist/src/cli/init.js +105 -0
  35. package/dist/src/cli/init.js.map +1 -0
  36. package/dist/src/cli/serve.d.ts +7 -0
  37. package/dist/src/cli/serve.d.ts.map +1 -0
  38. package/dist/src/cli/serve.js +100 -0
  39. package/dist/src/cli/serve.js.map +1 -0
  40. package/dist/src/cli/sync.d.ts +5 -0
  41. package/dist/src/cli/sync.d.ts.map +1 -0
  42. package/dist/src/cli/sync.js +13 -0
  43. package/dist/src/cli/sync.js.map +1 -0
  44. package/dist/src/compaction/pipeline.d.ts +19 -0
  45. package/dist/src/compaction/pipeline.d.ts.map +1 -0
  46. package/dist/src/compaction/pipeline.js +37 -0
  47. package/dist/src/compaction/pipeline.js.map +1 -0
  48. package/dist/src/compaction/providers/cli.d.ts +13 -0
  49. package/dist/src/compaction/providers/cli.d.ts.map +1 -0
  50. package/dist/src/compaction/providers/cli.js +60 -0
  51. package/dist/src/compaction/providers/cli.js.map +1 -0
  52. package/dist/src/compaction/rule-based.d.ts +8 -0
  53. package/dist/src/compaction/rule-based.d.ts.map +1 -0
  54. package/dist/src/compaction/rule-based.js +120 -0
  55. package/dist/src/compaction/rule-based.js.map +1 -0
  56. package/dist/src/config/loader.d.ts +12 -0
  57. package/dist/src/config/loader.d.ts.map +1 -0
  58. package/dist/src/config/loader.js +76 -0
  59. package/dist/src/config/loader.js.map +1 -0
  60. package/dist/src/config/mappings/claude-code.d.ts +3 -0
  61. package/dist/src/config/mappings/claude-code.d.ts.map +1 -0
  62. package/dist/src/config/mappings/claude-code.js +31 -0
  63. package/dist/src/config/mappings/claude-code.js.map +1 -0
  64. package/dist/src/config/mappings/codex.d.ts +3 -0
  65. package/dist/src/config/mappings/codex.d.ts.map +1 -0
  66. package/dist/src/config/mappings/codex.js +31 -0
  67. package/dist/src/config/mappings/codex.js.map +1 -0
  68. package/dist/src/config/mappings/copilot.d.ts +3 -0
  69. package/dist/src/config/mappings/copilot.d.ts.map +1 -0
  70. package/dist/src/config/mappings/copilot.js +33 -0
  71. package/dist/src/config/mappings/copilot.js.map +1 -0
  72. package/dist/src/config/mappings/cursor.d.ts +3 -0
  73. package/dist/src/config/mappings/cursor.d.ts.map +1 -0
  74. package/dist/src/config/mappings/cursor.js +29 -0
  75. package/dist/src/config/mappings/cursor.js.map +1 -0
  76. package/dist/src/config/sync.d.ts +13 -0
  77. package/dist/src/config/sync.d.ts.map +1 -0
  78. package/dist/src/config/sync.js +96 -0
  79. package/dist/src/config/sync.js.map +1 -0
  80. package/dist/src/ingestion/coordinator.d.ts +37 -0
  81. package/dist/src/ingestion/coordinator.d.ts.map +1 -0
  82. package/dist/src/ingestion/coordinator.js +127 -0
  83. package/dist/src/ingestion/coordinator.js.map +1 -0
  84. package/dist/src/ingestion/daemon.d.ts +17 -0
  85. package/dist/src/ingestion/daemon.d.ts.map +1 -0
  86. package/dist/src/ingestion/daemon.js +35 -0
  87. package/dist/src/ingestion/daemon.js.map +1 -0
  88. package/dist/src/ingestion/watcher.d.ts +19 -0
  89. package/dist/src/ingestion/watcher.d.ts.map +1 -0
  90. package/dist/src/ingestion/watcher.js +70 -0
  91. package/dist/src/ingestion/watcher.js.map +1 -0
  92. package/dist/src/knowledge/autotag.d.ts +3 -0
  93. package/dist/src/knowledge/autotag.d.ts.map +1 -0
  94. package/dist/src/knowledge/autotag.js +24 -0
  95. package/dist/src/knowledge/autotag.js.map +1 -0
  96. package/dist/src/knowledge/dedup.d.ts +7 -0
  97. package/dist/src/knowledge/dedup.d.ts.map +1 -0
  98. package/dist/src/knowledge/dedup.js +15 -0
  99. package/dist/src/knowledge/dedup.js.map +1 -0
  100. package/dist/src/knowledge/repository.d.ts +12 -0
  101. package/dist/src/knowledge/repository.d.ts.map +1 -0
  102. package/dist/src/knowledge/repository.js +74 -0
  103. package/dist/src/knowledge/repository.js.map +1 -0
  104. package/dist/src/mcp/server.d.ts +31 -0
  105. package/dist/src/mcp/server.d.ts.map +1 -0
  106. package/dist/src/mcp/server.js +323 -0
  107. package/dist/src/mcp/server.js.map +1 -0
  108. package/dist/src/mcp/tools/config.d.ts +36 -0
  109. package/dist/src/mcp/tools/config.d.ts.map +1 -0
  110. package/dist/src/mcp/tools/config.js +54 -0
  111. package/dist/src/mcp/tools/config.js.map +1 -0
  112. package/dist/src/mcp/tools/knowledge.d.ts +17 -0
  113. package/dist/src/mcp/tools/knowledge.d.ts.map +1 -0
  114. package/dist/src/mcp/tools/knowledge.js +46 -0
  115. package/dist/src/mcp/tools/knowledge.js.map +1 -0
  116. package/dist/src/mcp/tools/search.d.ts +22 -0
  117. package/dist/src/mcp/tools/search.d.ts.map +1 -0
  118. package/dist/src/mcp/tools/search.js +30 -0
  119. package/dist/src/mcp/tools/search.js.map +1 -0
  120. package/dist/src/mcp/tools/sessions.d.ts +38 -0
  121. package/dist/src/mcp/tools/sessions.d.ts.map +1 -0
  122. package/dist/src/mcp/tools/sessions.js +55 -0
  123. package/dist/src/mcp/tools/sessions.js.map +1 -0
  124. package/dist/src/mcp/tools/write.d.ts +38 -0
  125. package/dist/src/mcp/tools/write.d.ts.map +1 -0
  126. package/dist/src/mcp/tools/write.js +97 -0
  127. package/dist/src/mcp/tools/write.js.map +1 -0
  128. package/dist/src/runtime/ingestion.d.ts +17 -0
  129. package/dist/src/runtime/ingestion.d.ts.map +1 -0
  130. package/dist/src/runtime/ingestion.js +106 -0
  131. package/dist/src/runtime/ingestion.js.map +1 -0
  132. package/dist/src/runtime/services.d.ts +46 -0
  133. package/dist/src/runtime/services.d.ts.map +1 -0
  134. package/dist/src/runtime/services.js +227 -0
  135. package/dist/src/runtime/services.js.map +1 -0
  136. package/dist/src/scrapers/base.d.ts +10 -0
  137. package/dist/src/scrapers/base.d.ts.map +1 -0
  138. package/dist/src/scrapers/base.js +34 -0
  139. package/dist/src/scrapers/base.js.map +1 -0
  140. package/dist/src/scrapers/claude-code.d.ts +16 -0
  141. package/dist/src/scrapers/claude-code.d.ts.map +1 -0
  142. package/dist/src/scrapers/claude-code.js +120 -0
  143. package/dist/src/scrapers/claude-code.js.map +1 -0
  144. package/dist/src/scrapers/codex.d.ts +17 -0
  145. package/dist/src/scrapers/codex.d.ts.map +1 -0
  146. package/dist/src/scrapers/codex.js +179 -0
  147. package/dist/src/scrapers/codex.js.map +1 -0
  148. package/dist/src/scrapers/copilot.d.ts +17 -0
  149. package/dist/src/scrapers/copilot.d.ts.map +1 -0
  150. package/dist/src/scrapers/copilot.js +198 -0
  151. package/dist/src/scrapers/copilot.js.map +1 -0
  152. package/dist/src/scrapers/cursor.d.ts +18 -0
  153. package/dist/src/scrapers/cursor.d.ts.map +1 -0
  154. package/dist/src/scrapers/cursor.js +218 -0
  155. package/dist/src/scrapers/cursor.js.map +1 -0
  156. package/dist/src/scrapers/gemini.d.ts +17 -0
  157. package/dist/src/scrapers/gemini.d.ts.map +1 -0
  158. package/dist/src/scrapers/gemini.js +245 -0
  159. package/dist/src/scrapers/gemini.js.map +1 -0
  160. package/dist/src/scrapers/registry.d.ts +9 -0
  161. package/dist/src/scrapers/registry.d.ts.map +1 -0
  162. package/dist/src/scrapers/registry.js +22 -0
  163. package/dist/src/scrapers/registry.js.map +1 -0
  164. package/dist/src/store/embeddings.d.ts +9 -0
  165. package/dist/src/store/embeddings.d.ts.map +1 -0
  166. package/dist/src/store/embeddings.js +28 -0
  167. package/dist/src/store/embeddings.js.map +1 -0
  168. package/dist/src/store/lance.d.ts +25 -0
  169. package/dist/src/store/lance.d.ts.map +1 -0
  170. package/dist/src/store/lance.js +74 -0
  171. package/dist/src/store/lance.js.map +1 -0
  172. package/dist/src/store/search.d.ts +18 -0
  173. package/dist/src/store/search.d.ts.map +1 -0
  174. package/dist/src/store/search.js +55 -0
  175. package/dist/src/store/search.js.map +1 -0
  176. package/dist/src/types/compaction.d.ts +29 -0
  177. package/dist/src/types/compaction.d.ts.map +1 -0
  178. package/dist/src/types/compaction.js +2 -0
  179. package/dist/src/types/compaction.js.map +1 -0
  180. package/dist/src/types/config.d.ts +45 -0
  181. package/dist/src/types/config.d.ts.map +1 -0
  182. package/dist/src/types/config.js +2 -0
  183. package/dist/src/types/config.js.map +1 -0
  184. package/dist/src/types/context.d.ts +33 -0
  185. package/dist/src/types/context.d.ts.map +1 -0
  186. package/dist/src/types/context.js +18 -0
  187. package/dist/src/types/context.js.map +1 -0
  188. package/dist/src/types/index.d.ts +5 -0
  189. package/dist/src/types/index.d.ts.map +1 -0
  190. package/dist/src/types/index.js +5 -0
  191. package/dist/src/types/index.js.map +1 -0
  192. package/dist/src/types/scraper.d.ts +70 -0
  193. package/dist/src/types/scraper.d.ts.map +1 -0
  194. package/dist/src/types/scraper.js +2 -0
  195. package/dist/src/types/scraper.js.map +1 -0
  196. package/dist/src/utils/retry.d.ts +11 -0
  197. package/dist/src/utils/retry.d.ts.map +1 -0
  198. package/dist/src/utils/retry.js +46 -0
  199. package/dist/src/utils/retry.js.map +1 -0
  200. package/dist/src/utils/shutdown.d.ts +25 -0
  201. package/dist/src/utils/shutdown.d.ts.map +1 -0
  202. package/dist/src/utils/shutdown.js +56 -0
  203. package/dist/src/utils/shutdown.js.map +1 -0
  204. package/dist/web/apple-touch-icon.png +0 -0
  205. package/dist/web/assets/index-Nuadr5ox.css +1 -0
  206. package/dist/web/assets/index-aA0u8eXA.js +3504 -0
  207. package/dist/web/assets/primeicons-C6QP2o4f.woff2 +0 -0
  208. package/dist/web/assets/primeicons-DMOk5skT.eot +0 -0
  209. package/dist/web/assets/primeicons-Dr5RGzOO.svg +345 -0
  210. package/dist/web/assets/primeicons-MpK4pl85.ttf +0 -0
  211. package/dist/web/assets/primeicons-WjwUDZjB.woff +0 -0
  212. package/dist/web/favicon.ico +0 -0
  213. package/dist/web/favicon.svg +21 -0
  214. package/dist/web/index.html +21 -0
  215. package/dist/web/site.webmanifest +19 -0
  216. package/dist/web/vite.svg +1 -0
  217. package/package.json +69 -0
@@ -0,0 +1,227 @@
1
+ import { readdir, readFile } from "node:fs/promises";
2
+ import { extname, join, resolve } from "node:path";
3
+ import { parse as parseYaml } from "yaml";
4
+ import { KnowledgeRepository } from "../knowledge/repository.js";
5
+ export class EmptySessionService {
6
+ async listRecentSessions(_limit, _toolFilter) {
7
+ return [];
8
+ }
9
+ async getSessionDetail(_sessionRef, _offset, _limit) {
10
+ return [];
11
+ }
12
+ }
13
+ export class FileConfigStore {
14
+ configRoot;
15
+ constructor(configRoot) {
16
+ this.configRoot = configRoot;
17
+ }
18
+ async list(type) {
19
+ const types = type ? [type] : ["skill", "command", "agent"];
20
+ const all = [];
21
+ for (const configType of types) {
22
+ const dir = join(this.configRoot, `${configType}s`);
23
+ let files;
24
+ try {
25
+ files = await readdir(dir);
26
+ }
27
+ catch {
28
+ continue;
29
+ }
30
+ for (const file of files) {
31
+ const parsed = await this.parseFile(join(dir, file), configType);
32
+ if (parsed) {
33
+ all.push(parsed);
34
+ }
35
+ }
36
+ }
37
+ return all;
38
+ }
39
+ async get(type, name) {
40
+ const items = await this.list(type);
41
+ return items.find((item) => item.name === name) ?? null;
42
+ }
43
+ async toolPreferences(tool) {
44
+ const filePath = join(this.configRoot, "shared.yaml");
45
+ try {
46
+ const raw = await readFile(filePath, "utf-8");
47
+ const parsed = parseYaml(raw);
48
+ const prefs = parsed.toolPreferences;
49
+ if (prefs && typeof prefs === "object" && !Array.isArray(prefs)) {
50
+ const toolPrefs = prefs[tool];
51
+ if (toolPrefs && typeof toolPrefs === "object" && !Array.isArray(toolPrefs)) {
52
+ return toolPrefs;
53
+ }
54
+ }
55
+ }
56
+ catch {
57
+ // fall through
58
+ }
59
+ return {};
60
+ }
61
+ async parseFile(filePath, type) {
62
+ try {
63
+ const raw = await readFile(filePath, "utf-8");
64
+ const name = filePath
65
+ .split(/[\\/]/)
66
+ .pop()
67
+ ?.replace(/\.(json|ya?ml|md|txt)$/i, "");
68
+ if (!name) {
69
+ return null;
70
+ }
71
+ const extension = extname(filePath).toLowerCase();
72
+ if (extension === ".json") {
73
+ return { type, name, content: JSON.parse(raw) };
74
+ }
75
+ if (extension === ".yaml" || extension === ".yml") {
76
+ const parsed = parseYaml(raw);
77
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
78
+ return { type, name, content: parsed };
79
+ }
80
+ }
81
+ return { type, name, content: { text: raw } };
82
+ }
83
+ catch {
84
+ return null;
85
+ }
86
+ }
87
+ }
88
+ export async function createProjectServices(projectPath) {
89
+ const projectRoot = resolve(projectPath ?? process.cwd());
90
+ const xtctxDir = join(projectRoot, ".xtctx");
91
+ const storeDir = join(xtctxDir, ".store");
92
+ const knowledgeDir = join(xtctxDir, "knowledge");
93
+ const configRoot = join(xtctxDir, "tool-config");
94
+ const stateDir = join(xtctxDir, "state");
95
+ const config = await loadProjectConfig(xtctxDir);
96
+ const webPort = parseWebPort(config);
97
+ const apiSecurity = parseApiSecurityConfig(config);
98
+ const ingestion = parseIngestionConfig(config, projectRoot);
99
+ const knowledge = new KnowledgeRepository(knowledgeDir);
100
+ await knowledge.initialize();
101
+ return {
102
+ projectRoot,
103
+ xtctxDir,
104
+ storeDir,
105
+ knowledgeDir,
106
+ configRoot,
107
+ stateDir,
108
+ webPort,
109
+ apiSecurity,
110
+ ingestion,
111
+ knowledge,
112
+ sessions: new EmptySessionService(),
113
+ configs: new FileConfigStore(configRoot),
114
+ };
115
+ }
116
+ async function loadProjectConfig(xtctxDir) {
117
+ const configPath = join(xtctxDir, "config.yaml");
118
+ try {
119
+ const raw = await readFile(configPath, "utf-8");
120
+ const parsed = parseYaml(raw);
121
+ if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
122
+ return parsed;
123
+ }
124
+ }
125
+ catch {
126
+ // ignore
127
+ }
128
+ return {};
129
+ }
130
+ function parseWebPort(config) {
131
+ const web = config.web;
132
+ if (web && typeof web === "object" && !Array.isArray(web)) {
133
+ const port = Number(web.port);
134
+ if (Number.isFinite(port) && port > 0 && port < 65536) {
135
+ return port;
136
+ }
137
+ }
138
+ return 3232;
139
+ }
140
+ function parseApiSecurityConfig(config) {
141
+ const api = config.api;
142
+ if (!api || typeof api !== "object" || Array.isArray(api)) {
143
+ return {};
144
+ }
145
+ const security = api.security;
146
+ if (!security || typeof security !== "object" || Array.isArray(security)) {
147
+ return {};
148
+ }
149
+ const value = security;
150
+ const parsed = {};
151
+ if (typeof value.token === "string") {
152
+ const token = value.token.trim();
153
+ parsed.apiToken = token.length > 0 ? token : null;
154
+ }
155
+ else if (value.token === null) {
156
+ parsed.apiToken = null;
157
+ }
158
+ if (Array.isArray(value.allowedOrigins)) {
159
+ parsed.allowedOrigins = value.allowedOrigins.filter((item) => typeof item === "string" && item.length > 0);
160
+ }
161
+ if (typeof value.allowLocalhostOrigins === "boolean") {
162
+ parsed.allowLocalhostOrigins = value.allowLocalhostOrigins;
163
+ }
164
+ const rateLimitWindowMs = Number(value.rateLimitWindowMs);
165
+ if (Number.isFinite(rateLimitWindowMs) && rateLimitWindowMs > 0) {
166
+ parsed.rateLimitWindowMs = Math.floor(rateLimitWindowMs);
167
+ }
168
+ const rateLimitMax = Number(value.rateLimitMax);
169
+ if (Number.isFinite(rateLimitMax) && rateLimitMax > 0) {
170
+ parsed.rateLimitMax = Math.floor(rateLimitMax);
171
+ }
172
+ return parsed;
173
+ }
174
+ function parseIngestionConfig(config, projectRoot) {
175
+ const ingestion = config.ingestion;
176
+ const defaults = {
177
+ scrapers: [],
178
+ watchPaths: [projectRoot],
179
+ pollIntervalMs: 30_000,
180
+ excludePatterns: ["node_modules/**", "dist/**"],
181
+ };
182
+ if (!ingestion || typeof ingestion !== "object" || Array.isArray(ingestion)) {
183
+ return defaults;
184
+ }
185
+ const value = ingestion;
186
+ const watchPaths = Array.isArray(value.watchPaths)
187
+ ? value.watchPaths
188
+ .filter((item) => typeof item === "string" && item.length > 0)
189
+ .map((item) => resolve(projectRoot, item))
190
+ : defaults.watchPaths;
191
+ const pollIntervalMs = Number(value.pollIntervalMs);
192
+ const excludePatterns = Array.isArray(value.excludePatterns)
193
+ ? value.excludePatterns.filter((item) => typeof item === "string" && item.length > 0)
194
+ : defaults.excludePatterns;
195
+ const scrapers = Array.isArray(value.scrapers)
196
+ ? value.scrapers
197
+ .map((item) => {
198
+ if (!item || typeof item !== "object" || Array.isArray(item)) {
199
+ return null;
200
+ }
201
+ const scraper = item;
202
+ const tool = typeof scraper.tool === "string" ? scraper.tool : "";
203
+ if (!tool) {
204
+ return null;
205
+ }
206
+ const enabled = scraper.enabled !== false;
207
+ if (typeof scraper.customStorePath === "string") {
208
+ return {
209
+ tool,
210
+ enabled,
211
+ customStorePath: resolve(projectRoot, scraper.customStorePath),
212
+ };
213
+ }
214
+ return { tool, enabled };
215
+ })
216
+ .filter((item) => item !== null)
217
+ : defaults.scrapers;
218
+ return {
219
+ scrapers,
220
+ watchPaths: watchPaths.length > 0 ? watchPaths : defaults.watchPaths,
221
+ pollIntervalMs: Number.isFinite(pollIntervalMs) && pollIntervalMs > 0
222
+ ? Math.floor(pollIntervalMs)
223
+ : defaults.pollIntervalMs,
224
+ excludePatterns,
225
+ };
226
+ }
227
+ //# sourceMappingURL=services.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"services.js","sourceRoot":"","sources":["../../../src/runtime/services.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ScraperState } from "../types/scraper.js";
2
+ export declare class ScraperStateManager {
3
+ private readonly stateDir;
4
+ constructor(stateDir: string);
5
+ load(tool: string): Promise<ScraperState>;
6
+ save(tool: string, state: ScraperState): Promise<void>;
7
+ private statePath;
8
+ }
9
+ export declare function estimateTokens(text: string): number;
10
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/scrapers/base.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ,CAAC,QAAQ;gBAAR,QAAQ,EAAE,MAAM;IAEvC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAezC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAM5D,OAAO,CAAC,SAAS;CAGlB;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD"}
@@ -0,0 +1,34 @@
1
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import { dirname, join } from "node:path";
3
+ export class ScraperStateManager {
4
+ stateDir;
5
+ constructor(stateDir) {
6
+ this.stateDir = stateDir;
7
+ }
8
+ async load(tool) {
9
+ const path = this.statePath(tool);
10
+ try {
11
+ const raw = await readFile(path, "utf-8");
12
+ const data = JSON.parse(raw);
13
+ return {
14
+ ...data,
15
+ lastTimestamp: new Date(data.lastTimestamp),
16
+ };
17
+ }
18
+ catch {
19
+ return { lastTimestamp: new Date(0) };
20
+ }
21
+ }
22
+ async save(tool, state) {
23
+ const path = this.statePath(tool);
24
+ await mkdir(dirname(path), { recursive: true });
25
+ await writeFile(path, JSON.stringify(state, null, 2), "utf-8");
26
+ }
27
+ statePath(tool) {
28
+ return join(this.stateDir, `${tool}-state.json`);
29
+ }
30
+ }
31
+ export function estimateTokens(text) {
32
+ return Math.ceil(text.length / 4);
33
+ }
34
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/scrapers/base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAG1C,MAAM,OAAO,mBAAmB;IACD;IAA7B,YAA6B,QAAgB;QAAhB,aAAQ,GAAR,QAAQ,CAAQ;IAAG,CAAC;IAEjD,KAAK,CAAC,IAAI,CAAC,IAAY;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAElC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAiB,CAAC;YAC7C,OAAO;gBACL,GAAG,IAAI;gBACP,aAAa,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC;aAC5C,CAAC;QACJ,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,aAAa,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACxC,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,IAAY,EAAE,KAAmB;QAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,MAAM,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACjE,CAAC;IAEO,SAAS,CAAC,IAAY;QAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,aAAa,CAAC,CAAC;IACnD,CAAC;CACF;AAED,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { ClaudeCodeChunk, ConversationScraper, ScraperState } from "../types/scraper.js";
2
+ export declare class ClaudeCodeScraper implements ConversationScraper<ClaudeCodeChunk> {
3
+ private readonly claudeProjectsDir;
4
+ readonly tool = "claude-code";
5
+ private readonly stateManager;
6
+ constructor(claudeProjectsDir: string, stateDir: string);
7
+ detect(): Promise<boolean>;
8
+ getStorePaths(): string[];
9
+ scrape(since?: Date): AsyncIterable<ClaudeCodeChunk>;
10
+ fullSync(): AsyncIterable<ClaudeCodeChunk>;
11
+ parseRaw(raw: unknown): ClaudeCodeChunk;
12
+ getLastScrapedPosition(): Promise<ScraperState>;
13
+ saveScrapedPosition(state: ScraperState): Promise<void>;
14
+ private readAllSessions;
15
+ }
16
+ //# sourceMappingURL=claude-code.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../../src/scrapers/claude-code.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,eAAe,EACf,mBAAmB,EACnB,YAAY,EACb,MAAM,qBAAqB,CAAC;AAW7B,qBAAa,iBAAkB,YAAW,mBAAmB,CAAC,eAAe,CAAC;IAK1E,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAJpC,QAAQ,CAAC,IAAI,iBAAiB;IAC9B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;gBAGhC,iBAAiB,EAAE,MAAM,EAC1C,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,eAAe,CAAC;IAMpD,QAAQ,IAAI,aAAa,CAAC,eAAe,CAAC;IAIjD,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,eAAe;IAuBjC,sBAAsB,IAAI,OAAO,CAAC,YAAY,CAAC;IAI/C,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;YAI9C,eAAe;CAyD/B"}
@@ -0,0 +1,120 @@
1
+ import { stat, readdir } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { createReadStream } from "node:fs";
4
+ import { createInterface } from "node:readline";
5
+ import { estimateTokens, ScraperStateManager } from "./base.js";
6
+ const ROLE_MAP = {
7
+ human: "user",
8
+ assistant: "assistant",
9
+ system: "system",
10
+ tool_use: "tool",
11
+ tool_result: "tool",
12
+ };
13
+ export class ClaudeCodeScraper {
14
+ claudeProjectsDir;
15
+ tool = "claude-code";
16
+ stateManager;
17
+ constructor(claudeProjectsDir, stateDir) {
18
+ this.claudeProjectsDir = claudeProjectsDir;
19
+ this.stateManager = new ScraperStateManager(stateDir);
20
+ }
21
+ async detect() {
22
+ try {
23
+ const dirStat = await stat(this.claudeProjectsDir);
24
+ return dirStat.isDirectory();
25
+ }
26
+ catch {
27
+ return false;
28
+ }
29
+ }
30
+ getStorePaths() {
31
+ return [this.claudeProjectsDir];
32
+ }
33
+ async *scrape(since) {
34
+ const state = await this.getLastScrapedPosition();
35
+ const cutoff = since ?? state.lastTimestamp;
36
+ yield* this.readAllSessions(cutoff);
37
+ }
38
+ async *fullSync() {
39
+ yield* this.readAllSessions(new Date(0));
40
+ }
41
+ parseRaw(raw) {
42
+ const obj = raw;
43
+ const timestamp = new Date(obj.timestamp || Date.now());
44
+ const content = obj.content || "";
45
+ const type = obj.type || "unknown";
46
+ return {
47
+ tool: "claude-code",
48
+ sessionId: obj.sessionId || "unknown",
49
+ timestamp,
50
+ role: ROLE_MAP[type] || "system",
51
+ content,
52
+ metadata: {
53
+ messageIndex: obj.messageIndex || 0,
54
+ tokenEstimate: estimateTokens(content),
55
+ referencedFiles: [],
56
+ toolCalls: type === "tool_use" ? [obj.name || ""] : undefined,
57
+ costUsd: obj.costUsd,
58
+ sessionType: "interactive",
59
+ },
60
+ };
61
+ }
62
+ async getLastScrapedPosition() {
63
+ return this.stateManager.load(this.tool);
64
+ }
65
+ async saveScrapedPosition(state) {
66
+ await this.stateManager.save(this.tool, state);
67
+ }
68
+ async *readAllSessions(since) {
69
+ let projectDirs;
70
+ try {
71
+ projectDirs = await readdir(this.claudeProjectsDir);
72
+ }
73
+ catch {
74
+ return;
75
+ }
76
+ for (const projectHash of projectDirs) {
77
+ const projectDir = join(this.claudeProjectsDir, projectHash);
78
+ let files;
79
+ try {
80
+ files = await readdir(projectDir);
81
+ }
82
+ catch {
83
+ continue;
84
+ }
85
+ for (const file of files) {
86
+ if (!file.endsWith(".jsonl")) {
87
+ continue;
88
+ }
89
+ const sessionId = file.replace(".jsonl", "");
90
+ const filePath = join(projectDir, file);
91
+ const reader = createInterface({
92
+ input: createReadStream(filePath, { encoding: "utf8" }),
93
+ crlfDelay: Infinity,
94
+ });
95
+ let messageIndex = 0;
96
+ for await (const line of reader) {
97
+ if (!line.trim()) {
98
+ continue;
99
+ }
100
+ try {
101
+ const obj = JSON.parse(line);
102
+ const timestamp = new Date(obj.timestamp ?? 0);
103
+ if (timestamp <= since) {
104
+ messageIndex += 1;
105
+ continue;
106
+ }
107
+ obj.sessionId = sessionId;
108
+ obj.messageIndex = messageIndex;
109
+ messageIndex += 1;
110
+ yield this.parseRaw(obj);
111
+ }
112
+ catch {
113
+ // Skip malformed lines.
114
+ }
115
+ }
116
+ }
117
+ }
118
+ }
119
+ }
120
+ //# sourceMappingURL=claude-code.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/scrapers/claude-code.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { CodexChunk, ConversationScraper, ScraperState } from "../types/scraper.js";
2
+ export declare class CodexCliScraper implements ConversationScraper<CodexChunk> {
3
+ private readonly codexSessionsPath;
4
+ readonly tool = "codex";
5
+ private readonly stateManager;
6
+ constructor(codexSessionsPath: string, stateDir: string);
7
+ detect(): Promise<boolean>;
8
+ getStorePaths(): string[];
9
+ scrape(since?: Date): AsyncIterable<CodexChunk>;
10
+ fullSync(): AsyncIterable<CodexChunk>;
11
+ parseRaw(raw: unknown): CodexChunk;
12
+ getLastScrapedPosition(): Promise<ScraperState>;
13
+ saveScrapedPosition(state: ScraperState): Promise<void>;
14
+ private readAllSessions;
15
+ private resolveJsonlFiles;
16
+ }
17
+ //# sourceMappingURL=codex.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../src/scrapers/codex.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAazF,qBAAa,eAAgB,YAAW,mBAAmB,CAAC,UAAU,CAAC;IAKnE,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAJpC,QAAQ,CAAC,IAAI,WAAW;IACxB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAsB;gBAGhC,iBAAiB,EAAE,MAAM,EAC1C,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,UAAU,CAAC;IAM/C,QAAQ,IAAI,aAAa,CAAC,UAAU,CAAC;IAI5C,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU;IAqB5B,sBAAsB,IAAI,OAAO,CAAC,YAAY,CAAC;IAI/C,mBAAmB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;YAI9C,eAAe;YAuChB,iBAAiB;CAehC"}
@@ -0,0 +1,179 @@
1
+ import { createReadStream } from "node:fs";
2
+ import { readdir, stat } from "node:fs/promises";
3
+ import { basename, join } from "node:path";
4
+ import { createInterface } from "node:readline";
5
+ import { estimateTokens, ScraperStateManager } from "./base.js";
6
+ const ROLE_MAP = {
7
+ user: "user",
8
+ human: "user",
9
+ assistant: "assistant",
10
+ system: "system",
11
+ tool: "tool",
12
+ };
13
+ export class CodexCliScraper {
14
+ codexSessionsPath;
15
+ tool = "codex";
16
+ stateManager;
17
+ constructor(codexSessionsPath, stateDir) {
18
+ this.codexSessionsPath = codexSessionsPath;
19
+ this.stateManager = new ScraperStateManager(stateDir);
20
+ }
21
+ async detect() {
22
+ try {
23
+ const target = await stat(this.codexSessionsPath);
24
+ return target.isDirectory() || target.isFile();
25
+ }
26
+ catch {
27
+ return false;
28
+ }
29
+ }
30
+ getStorePaths() {
31
+ return [this.codexSessionsPath];
32
+ }
33
+ async *scrape(since) {
34
+ const state = await this.getLastScrapedPosition();
35
+ const cutoff = since ?? state.lastTimestamp;
36
+ yield* this.readAllSessions(cutoff);
37
+ }
38
+ async *fullSync() {
39
+ yield* this.readAllSessions(new Date(0));
40
+ }
41
+ parseRaw(raw) {
42
+ const value = raw;
43
+ const content = toStringValue(value.content) ?? "";
44
+ const role = normalizeRole(toStringValue(value.role) ?? toStringValue(value.type));
45
+ return {
46
+ tool: "codex",
47
+ sessionId: toStringValue(value.sessionId) ?? "unknown",
48
+ timestamp: toDate(value.timestamp),
49
+ role,
50
+ content,
51
+ metadata: {
52
+ messageIndex: toMessageIndex(value.messageIndex),
53
+ tokenEstimate: estimateTokens(content),
54
+ referencedFiles: [],
55
+ approvalMode: normalizeApprovalMode(toStringValue(value.approvalMode)),
56
+ sandboxed: toBoolean(value.sandboxed),
57
+ },
58
+ };
59
+ }
60
+ async getLastScrapedPosition() {
61
+ return this.stateManager.load(this.tool);
62
+ }
63
+ async saveScrapedPosition(state) {
64
+ await this.stateManager.save(this.tool, state);
65
+ }
66
+ async *readAllSessions(since) {
67
+ const files = await this.resolveJsonlFiles();
68
+ for (const filePath of files) {
69
+ const sessionId = inferSessionId(filePath);
70
+ const reader = createInterface({
71
+ input: createReadStream(filePath, { encoding: "utf8" }),
72
+ crlfDelay: Infinity,
73
+ });
74
+ let messageIndex = 0;
75
+ for await (const line of reader) {
76
+ if (!line.trim()) {
77
+ continue;
78
+ }
79
+ try {
80
+ const parsed = JSON.parse(line);
81
+ const timestamp = toDate(parsed.timestamp ?? parsed.created_at ?? parsed.createdAt);
82
+ if (timestamp <= since) {
83
+ messageIndex += 1;
84
+ continue;
85
+ }
86
+ yield this.parseRaw({
87
+ ...parsed,
88
+ sessionId: parsed.sessionId ?? parsed.session_id ?? sessionId,
89
+ messageIndex,
90
+ timestamp,
91
+ approvalMode: parsed.approvalMode ?? parsed.approval_mode,
92
+ });
93
+ messageIndex += 1;
94
+ }
95
+ catch {
96
+ // Skip malformed lines.
97
+ }
98
+ }
99
+ }
100
+ }
101
+ async resolveJsonlFiles() {
102
+ try {
103
+ const target = await stat(this.codexSessionsPath);
104
+ if (target.isFile()) {
105
+ return this.codexSessionsPath.endsWith(".jsonl") ? [this.codexSessionsPath] : [];
106
+ }
107
+ const files = await readdir(this.codexSessionsPath);
108
+ return files
109
+ .filter((file) => file.endsWith(".jsonl"))
110
+ .map((file) => join(this.codexSessionsPath, file));
111
+ }
112
+ catch {
113
+ return [];
114
+ }
115
+ }
116
+ }
117
+ function normalizeRole(value) {
118
+ if (!value) {
119
+ return "system";
120
+ }
121
+ return ROLE_MAP[value.toLowerCase()] ?? "system";
122
+ }
123
+ function normalizeApprovalMode(value) {
124
+ switch (value) {
125
+ case "auto-edit":
126
+ return "auto-edit";
127
+ case "full-auto":
128
+ return "full-auto";
129
+ default:
130
+ return "suggest";
131
+ }
132
+ }
133
+ function inferSessionId(filePath) {
134
+ return basename(filePath).replace(".jsonl", "") || "unknown";
135
+ }
136
+ function toStringValue(value) {
137
+ if (typeof value !== "string") {
138
+ return undefined;
139
+ }
140
+ return value;
141
+ }
142
+ function toMessageIndex(value) {
143
+ const parsed = Number(value);
144
+ if (Number.isFinite(parsed) && parsed >= 0) {
145
+ return Math.floor(parsed);
146
+ }
147
+ return 0;
148
+ }
149
+ function toBoolean(value) {
150
+ if (typeof value === "boolean") {
151
+ return value;
152
+ }
153
+ if (typeof value === "string") {
154
+ return value.toLowerCase() === "true";
155
+ }
156
+ return false;
157
+ }
158
+ function toDate(value) {
159
+ if (value instanceof Date) {
160
+ return value;
161
+ }
162
+ if (typeof value === "number" && Number.isFinite(value)) {
163
+ const millis = value > 10_000_000_000 ? value : value * 1000;
164
+ return new Date(millis);
165
+ }
166
+ if (typeof value === "string") {
167
+ const numeric = Number(value);
168
+ if (Number.isFinite(numeric) && value.trim() !== "") {
169
+ const millis = numeric > 10_000_000_000 ? numeric : numeric * 1000;
170
+ return new Date(millis);
171
+ }
172
+ const parsed = new Date(value);
173
+ if (!Number.isNaN(parsed.getTime())) {
174
+ return parsed;
175
+ }
176
+ }
177
+ return new Date(0);
178
+ }
179
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/scrapers/codex.ts"],"names":[],"mappings":"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"}