clast-ai 0.1.2 → 0.2.1

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 (294) hide show
  1. package/.claude-plugin/marketplace.json +14 -0
  2. package/.claude-plugin/plugin.json +11 -9
  3. package/README.md +468 -398
  4. package/bench/ab/onair-concept.json +22 -0
  5. package/bench/ab/onair-deadcode.json +7 -0
  6. package/bench/ab/onair-hard.json +32 -0
  7. package/bench/ab/onair-impact.json +17 -0
  8. package/bench/ab/onair-refactors.json +18 -0
  9. package/bench/ab/onair-survey.json +17 -0
  10. package/bench/ab/onair-tasks.json +20 -0
  11. package/bench/ab/onair.json +52 -0
  12. package/bench/ab/vscode-concept.json +22 -0
  13. package/bench/ab/vscode-hard.json +32 -0
  14. package/bench/ab/vscode-impact.json +17 -0
  15. package/bench/ab/vscode-refactors.json +18 -0
  16. package/bench/ab/vscode-tasks.json +20 -0
  17. package/bench/ab/vscode.json +52 -0
  18. package/bench/ab.mjs +213 -0
  19. package/bench/bench.mjs +98 -0
  20. package/bench/resolution.mjs +75 -0
  21. package/dist/cli.d.ts +2 -0
  22. package/dist/cli.js +266 -0
  23. package/dist/cli.js.map +1 -0
  24. package/dist/config/defaults.d.ts +12 -2
  25. package/dist/config/defaults.js +38 -31
  26. package/dist/config/defaults.js.map +1 -1
  27. package/dist/config/index.d.ts +1 -1
  28. package/dist/config/index.js +26 -14
  29. package/dist/config/index.js.map +1 -1
  30. package/dist/db/index.d.ts +73 -13
  31. package/dist/db/index.js +481 -39
  32. package/dist/db/index.js.map +1 -1
  33. package/dist/engine.d.ts +15 -0
  34. package/dist/engine.js +28 -0
  35. package/dist/engine.js.map +1 -0
  36. package/dist/indexer/imports.d.ts +6 -0
  37. package/dist/indexer/imports.js +254 -0
  38. package/dist/indexer/imports.js.map +1 -0
  39. package/dist/indexer/index.d.ts +63 -0
  40. package/dist/indexer/index.js +360 -0
  41. package/dist/indexer/index.js.map +1 -0
  42. package/dist/indexer/process.d.ts +22 -0
  43. package/dist/indexer/process.js +42 -0
  44. package/dist/indexer/process.js.map +1 -0
  45. package/dist/indexer/scan.d.ts +43 -0
  46. package/dist/indexer/scan.js +223 -0
  47. package/dist/indexer/scan.js.map +1 -0
  48. package/dist/indexer/worker.d.ts +1 -0
  49. package/dist/indexer/worker.js +23 -0
  50. package/dist/indexer/worker.js.map +1 -0
  51. package/dist/llm/comment-generator.d.ts +17 -19
  52. package/dist/llm/comment-generator.js +46 -80
  53. package/dist/llm/comment-generator.js.map +1 -1
  54. package/dist/llm/index.d.ts +0 -1
  55. package/dist/llm/index.js.map +1 -1
  56. package/dist/llm/prompts.d.ts +0 -1
  57. package/dist/llm/prompts.js +16 -16
  58. package/dist/migrate.d.ts +35 -0
  59. package/dist/migrate.js +194 -0
  60. package/dist/migrate.js.map +1 -0
  61. package/dist/parser/extractor.d.ts +21 -16
  62. package/dist/parser/extractor.js +700 -228
  63. package/dist/parser/extractor.js.map +1 -1
  64. package/dist/parser/index.d.ts +17 -21
  65. package/dist/parser/index.js +115 -171
  66. package/dist/parser/index.js.map +1 -1
  67. package/dist/parser/langs/c.d.ts +3 -0
  68. package/dist/parser/langs/c.js +879 -0
  69. package/dist/parser/langs/c.js.map +1 -0
  70. package/dist/parser/langs/csharp.d.ts +2 -0
  71. package/dist/parser/langs/csharp.js +548 -0
  72. package/dist/parser/langs/csharp.js.map +1 -0
  73. package/dist/parser/langs/dart.d.ts +2 -0
  74. package/dist/parser/langs/dart.js +893 -0
  75. package/dist/parser/langs/dart.js.map +1 -0
  76. package/dist/parser/langs/go.d.ts +2 -0
  77. package/dist/parser/langs/go.js +455 -0
  78. package/dist/parser/langs/go.js.map +1 -0
  79. package/dist/parser/langs/java.d.ts +2 -0
  80. package/dist/parser/langs/java.js +390 -0
  81. package/dist/parser/langs/java.js.map +1 -0
  82. package/dist/parser/langs/php.d.ts +2 -0
  83. package/dist/parser/langs/php.js +486 -0
  84. package/dist/parser/langs/php.js.map +1 -0
  85. package/dist/parser/langs/python.d.ts +2 -0
  86. package/dist/parser/langs/python.js +216 -0
  87. package/dist/parser/langs/python.js.map +1 -0
  88. package/dist/parser/langs/ruby.d.ts +2 -0
  89. package/dist/parser/langs/ruby.js +602 -0
  90. package/dist/parser/langs/ruby.js.map +1 -0
  91. package/dist/parser/langs/rust.d.ts +2 -0
  92. package/dist/parser/langs/rust.js +931 -0
  93. package/dist/parser/langs/rust.js.map +1 -0
  94. package/dist/parser/langs/swift.d.ts +2 -0
  95. package/dist/parser/langs/swift.js +616 -0
  96. package/dist/parser/langs/swift.js.map +1 -0
  97. package/dist/parser/langs/typescript.d.ts +4 -0
  98. package/dist/parser/langs/typescript.js +535 -0
  99. package/dist/parser/langs/typescript.js.map +1 -0
  100. package/dist/parser/registry.d.ts +16 -0
  101. package/dist/parser/registry.js +87 -0
  102. package/dist/parser/registry.js.map +1 -0
  103. package/dist/parser/returns.d.ts +9 -0
  104. package/dist/parser/returns.js +152 -0
  105. package/dist/parser/returns.js.map +1 -0
  106. package/dist/parser/spec.d.ts +165 -0
  107. package/dist/parser/spec.js +188 -0
  108. package/dist/parser/spec.js.map +1 -0
  109. package/dist/query/arity.d.ts +27 -0
  110. package/dist/query/arity.js +187 -0
  111. package/dist/query/arity.js.map +1 -0
  112. package/dist/query/callgraph.d.ts +113 -0
  113. package/dist/query/callgraph.js +332 -0
  114. package/dist/query/callgraph.js.map +1 -0
  115. package/dist/query/format.d.ts +36 -0
  116. package/dist/query/format.js +136 -0
  117. package/dist/query/format.js.map +1 -0
  118. package/dist/query/hierarchy.d.ts +44 -0
  119. package/dist/query/hierarchy.js +441 -0
  120. package/dist/query/hierarchy.js.map +1 -0
  121. package/dist/query/resolve.d.ts +265 -0
  122. package/dist/query/resolve.js +1957 -0
  123. package/dist/query/resolve.js.map +1 -0
  124. package/dist/query/search.d.ts +35 -0
  125. package/dist/query/search.js +379 -0
  126. package/dist/query/search.js.map +1 -0
  127. package/dist/query/words.d.ts +30 -0
  128. package/dist/query/words.js +201 -0
  129. package/dist/query/words.js.map +1 -0
  130. package/dist/server/index.d.ts +1 -3
  131. package/dist/server/index.js +313 -73
  132. package/dist/server/index.js.map +1 -1
  133. package/dist/tools/context.d.ts +35 -0
  134. package/dist/tools/context.js +79 -0
  135. package/dist/tools/context.js.map +1 -0
  136. package/dist/tools/explore.d.ts +51 -0
  137. package/dist/tools/explore.js +779 -0
  138. package/dist/tools/explore.js.map +1 -0
  139. package/dist/tools/impact.d.ts +21 -0
  140. package/dist/tools/impact.js +743 -0
  141. package/dist/tools/impact.js.map +1 -0
  142. package/dist/tools/search.d.ts +59 -0
  143. package/dist/tools/search.js +843 -0
  144. package/dist/tools/search.js.map +1 -0
  145. package/dist/tools/stats.d.ts +26 -0
  146. package/dist/tools/stats.js +604 -0
  147. package/dist/tools/stats.js.map +1 -0
  148. package/dist/types.d.ts +95 -40
  149. package/dist/types.js +9 -1
  150. package/dist/types.js.map +1 -1
  151. package/dist/version.d.ts +2 -0
  152. package/dist/version.js +3 -0
  153. package/dist/version.js.map +1 -0
  154. package/dist/watcher/index.d.ts +18 -16
  155. package/dist/watcher/index.js +94 -77
  156. package/dist/watcher/index.js.map +1 -1
  157. package/package.json +21 -24
  158. package/plugin/server.mjs +72 -0
  159. package/skills/audit/SKILL.md +37 -0
  160. package/skills/deadcode/SKILL.md +33 -0
  161. package/skills/explore/SKILL.md +54 -0
  162. package/skills/impact/SKILL.md +24 -0
  163. package/skills/status/SKILL.md +11 -0
  164. package/src/cli.ts +265 -0
  165. package/src/config/defaults.ts +50 -32
  166. package/src/config/index.ts +23 -14
  167. package/src/db/index.ts +540 -43
  168. package/src/engine.ts +30 -0
  169. package/src/indexer/imports.ts +241 -0
  170. package/src/indexer/index.ts +369 -0
  171. package/src/indexer/process.ts +63 -0
  172. package/src/indexer/scan.ts +226 -0
  173. package/src/indexer/worker.ts +24 -0
  174. package/src/llm/comment-generator.ts +52 -103
  175. package/src/llm/index.ts +80 -80
  176. package/src/llm/prompts.ts +95 -95
  177. package/src/migrate.ts +213 -0
  178. package/src/parser/extractor.ts +643 -256
  179. package/src/parser/index.ts +105 -205
  180. package/src/parser/langs/c.ts +860 -0
  181. package/src/parser/langs/csharp.ts +519 -0
  182. package/src/parser/langs/dart.ts +820 -0
  183. package/src/parser/langs/go.ts +437 -0
  184. package/src/parser/langs/java.ts +361 -0
  185. package/src/parser/langs/php.ts +450 -0
  186. package/src/parser/langs/python.ts +206 -0
  187. package/src/parser/langs/ruby.ts +554 -0
  188. package/src/parser/langs/rust.ts +904 -0
  189. package/src/parser/langs/swift.ts +590 -0
  190. package/src/parser/langs/typescript.ts +499 -0
  191. package/src/parser/registry.ts +88 -0
  192. package/src/parser/returns.ts +137 -0
  193. package/src/parser/spec.ts +309 -0
  194. package/src/query/arity.ts +173 -0
  195. package/src/query/callgraph.ts +473 -0
  196. package/src/query/format.ts +136 -0
  197. package/src/query/hierarchy.ts +447 -0
  198. package/src/query/resolve.ts +1972 -0
  199. package/src/query/search.ts +430 -0
  200. package/src/query/words.ts +183 -0
  201. package/src/server/index.ts +390 -79
  202. package/src/tools/context.ts +82 -0
  203. package/src/tools/explore.ts +860 -0
  204. package/src/tools/impact.ts +748 -0
  205. package/src/tools/search.ts +886 -0
  206. package/src/tools/stats.ts +633 -0
  207. package/src/types.ts +113 -45
  208. package/src/version.ts +2 -0
  209. package/src/watcher/index.ts +82 -88
  210. package/tsconfig.json +6 -3
  211. package/.mcp.json +0 -8
  212. package/commands/clast-status.md +0 -9
  213. package/dist/config/defaults.d.ts.map +0 -1
  214. package/dist/config/index.d.ts.map +0 -1
  215. package/dist/db/index.d.ts.map +0 -1
  216. package/dist/db/queries.d.ts +0 -44
  217. package/dist/db/queries.d.ts.map +0 -1
  218. package/dist/db/queries.js +0 -251
  219. package/dist/db/queries.js.map +0 -1
  220. package/dist/db/schema.d.ts +0 -3
  221. package/dist/db/schema.d.ts.map +0 -1
  222. package/dist/db/schema.js +0 -94
  223. package/dist/db/schema.js.map +0 -1
  224. package/dist/db/types.d.ts +0 -44
  225. package/dist/db/types.d.ts.map +0 -1
  226. package/dist/db/types.js +0 -2
  227. package/dist/db/types.js.map +0 -1
  228. package/dist/llm/comment-generator.d.ts.map +0 -1
  229. package/dist/llm/index.d.ts.map +0 -1
  230. package/dist/llm/prompts.d.ts.map +0 -1
  231. package/dist/parser/call-resolver.d.ts +0 -15
  232. package/dist/parser/call-resolver.d.ts.map +0 -1
  233. package/dist/parser/call-resolver.js +0 -16
  234. package/dist/parser/call-resolver.js.map +0 -1
  235. package/dist/parser/extractor.d.ts.map +0 -1
  236. package/dist/parser/index.d.ts.map +0 -1
  237. package/dist/parser/languages.d.ts +0 -11
  238. package/dist/parser/languages.d.ts.map +0 -1
  239. package/dist/parser/languages.js +0 -74
  240. package/dist/parser/languages.js.map +0 -1
  241. package/dist/server/index.d.ts.map +0 -1
  242. package/dist/server/register-tools.d.ts +0 -7
  243. package/dist/server/register-tools.d.ts.map +0 -1
  244. package/dist/server/register-tools.js +0 -17
  245. package/dist/server/register-tools.js.map +0 -1
  246. package/dist/server/tools/clast-call-graph.d.ts +0 -4
  247. package/dist/server/tools/clast-call-graph.d.ts.map +0 -1
  248. package/dist/server/tools/clast-call-graph.js +0 -70
  249. package/dist/server/tools/clast-call-graph.js.map +0 -1
  250. package/dist/server/tools/clast-comment.d.ts +0 -5
  251. package/dist/server/tools/clast-comment.d.ts.map +0 -1
  252. package/dist/server/tools/clast-comment.js +0 -64
  253. package/dist/server/tools/clast-comment.js.map +0 -1
  254. package/dist/server/tools/clast-file-summary.d.ts +0 -4
  255. package/dist/server/tools/clast-file-summary.d.ts.map +0 -1
  256. package/dist/server/tools/clast-file-summary.js +0 -42
  257. package/dist/server/tools/clast-file-summary.js.map +0 -1
  258. package/dist/server/tools/clast-get-context.d.ts +0 -4
  259. package/dist/server/tools/clast-get-context.d.ts.map +0 -1
  260. package/dist/server/tools/clast-get-context.js +0 -80
  261. package/dist/server/tools/clast-get-context.js.map +0 -1
  262. package/dist/server/tools/clast-reindex.d.ts +0 -5
  263. package/dist/server/tools/clast-reindex.d.ts.map +0 -1
  264. package/dist/server/tools/clast-reindex.js +0 -36
  265. package/dist/server/tools/clast-reindex.js.map +0 -1
  266. package/dist/server/tools/clast-search.d.ts +0 -4
  267. package/dist/server/tools/clast-search.d.ts.map +0 -1
  268. package/dist/server/tools/clast-search.js +0 -29
  269. package/dist/server/tools/clast-search.js.map +0 -1
  270. package/dist/server/tools/clast-status.d.ts +0 -5
  271. package/dist/server/tools/clast-status.d.ts.map +0 -1
  272. package/dist/server/tools/clast-status.js +0 -23
  273. package/dist/server/tools/clast-status.js.map +0 -1
  274. package/dist/types.d.ts.map +0 -1
  275. package/dist/watcher/gitignore.d.ts +0 -9
  276. package/dist/watcher/gitignore.d.ts.map +0 -1
  277. package/dist/watcher/gitignore.js +0 -38
  278. package/dist/watcher/gitignore.js.map +0 -1
  279. package/dist/watcher/index.d.ts.map +0 -1
  280. package/skills/clast-explore/SKILL.md +0 -41
  281. package/src/db/queries.ts +0 -332
  282. package/src/db/schema.ts +0 -106
  283. package/src/db/types.ts +0 -47
  284. package/src/parser/call-resolver.ts +0 -17
  285. package/src/parser/languages.ts +0 -86
  286. package/src/server/register-tools.ts +0 -30
  287. package/src/server/tools/clast-call-graph.ts +0 -82
  288. package/src/server/tools/clast-comment.ts +0 -76
  289. package/src/server/tools/clast-file-summary.ts +0 -59
  290. package/src/server/tools/clast-get-context.ts +0 -97
  291. package/src/server/tools/clast-reindex.ts +0 -52
  292. package/src/server/tools/clast-search.ts +0 -38
  293. package/src/server/tools/clast-status.ts +0 -37
  294. package/src/watcher/gitignore.ts +0 -42
package/dist/db/index.js CHANGED
@@ -1,54 +1,496 @@
1
- import initSqlJs from 'sql.js';
2
- import { mkdirSync, readFileSync, writeFileSync, existsSync } from 'node:fs';
3
- import { dirname } from 'node:path';
4
- import { initializeSchema } from './schema.js';
5
- import { Queries } from './queries.js';
6
- export class ClastDatabase {
1
+ import { createRequire } from 'node:module';
2
+ import { existsSync, mkdirSync, rmSync, writeFileSync } from 'node:fs';
3
+ import { dirname, join } from 'node:path';
4
+ import { ftsWords, initials, splitIdentifier } from '../query/words.js';
5
+ /**
6
+ * Bump whenever the schema or the extraction output changes shape. The index
7
+ * is a cache: a version mismatch simply drops and rebuilds it.
8
+ */
9
+ export const SCHEMA_VERSION = 26;
10
+ /** Kinds that get a full-text row (concept search). Others are found by name. */
11
+ const FTS_KINDS = new Set(['function', 'method', 'class', 'interface', 'struct', 'trait', 'enum', 'type', 'namespace', 'macro']);
12
+ function loadSqlite() {
13
+ // node:sqlite prints an ExperimentalWarning on some Node versions; an MCP
14
+ // server should not spam stderr with it.
15
+ const original = process.emitWarning;
16
+ process.emitWarning = ((warning, ...rest) => {
17
+ const msg = typeof warning === 'string' ? warning : warning?.message;
18
+ if (msg && msg.includes('SQLite'))
19
+ return;
20
+ return original.call(process, warning, ...rest);
21
+ });
22
+ try {
23
+ const require = createRequire(import.meta.url);
24
+ return require('node:sqlite');
25
+ }
26
+ catch (err) {
27
+ throw new Error(`clast requires Node.js >= 22.13 (built-in node:sqlite). Current: ${process.version}. ${String(err)}`);
28
+ }
29
+ finally {
30
+ process.emitWarning = original;
31
+ }
32
+ }
33
+ function processAlive(pid) {
34
+ try {
35
+ process.kill(pid, 0);
36
+ return true;
37
+ }
38
+ catch (err) {
39
+ // EPERM: the process exists but belongs to someone else.
40
+ return err.code === 'EPERM';
41
+ }
42
+ }
43
+ const SCHEMA = `
44
+ CREATE TABLE meta (key TEXT PRIMARY KEY, value TEXT NOT NULL) WITHOUT ROWID;
45
+
46
+ CREATE TABLE files (
47
+ id INTEGER PRIMARY KEY,
48
+ path TEXT NOT NULL UNIQUE,
49
+ hash TEXT NOT NULL,
50
+ mtime REAL NOT NULL,
51
+ size INTEGER NOT NULL,
52
+ lang TEXT NOT NULL,
53
+ line_count INTEGER NOT NULL DEFAULT 0,
54
+ symbol_count INTEGER NOT NULL DEFAULT 0,
55
+ indexed_at INTEGER NOT NULL,
56
+ default_export TEXT
57
+ );
58
+
59
+ CREATE TABLE symbols (
60
+ id INTEGER PRIMARY KEY,
61
+ file_id INTEGER NOT NULL,
62
+ name TEXT NOT NULL,
63
+ name_lc TEXT NOT NULL,
64
+ abbr TEXT NOT NULL DEFAULT '',
65
+ qname TEXT NOT NULL,
66
+ kind TEXT NOT NULL,
67
+ signature TEXT NOT NULL DEFAULT '',
68
+ doc TEXT NOT NULL DEFAULT '',
69
+ start_line INTEGER NOT NULL,
70
+ end_line INTEGER NOT NULL,
71
+ start_col INTEGER NOT NULL DEFAULT 0,
72
+ doc_line INTEGER NOT NULL DEFAULT 0,
73
+ parent_id INTEGER,
74
+ exported INTEGER NOT NULL DEFAULT 0,
75
+ ret TEXT
76
+ );
77
+
78
+ CREATE VIRTUAL TABLE symbols_fts USING fts5(
79
+ words, sig, doc, path,
80
+ content='', contentless_delete=1,
81
+ tokenize='porter unicode61'
82
+ );
83
+
84
+ CREATE TABLE names (id INTEGER PRIMARY KEY, name TEXT NOT NULL UNIQUE);
85
+
86
+ CREATE TABLE occ (
87
+ name_id INTEGER NOT NULL,
88
+ file_id INTEGER NOT NULL,
89
+ lines TEXT NOT NULL,
90
+ PRIMARY KEY (name_id, file_id)
91
+ ) WITHOUT ROWID;
92
+
93
+ CREATE TABLE calls (
94
+ file_id INTEGER NOT NULL,
95
+ caller_id INTEGER,
96
+ name_id INTEGER NOT NULL,
97
+ line INTEGER NOT NULL,
98
+ receiver TEXT,
99
+ rtype TEXT,
100
+ count INTEGER NOT NULL DEFAULT 1,
101
+ via INTEGER,
102
+ argc INTEGER NOT NULL DEFAULT -1
103
+ );
104
+
105
+ CREATE TABLE imports (
106
+ file_id INTEGER NOT NULL,
107
+ source TEXT NOT NULL,
108
+ names TEXT NOT NULL DEFAULT '',
109
+ line INTEGER NOT NULL,
110
+ resolved_id INTEGER
111
+ );
112
+
113
+ CREATE TABLE heritage (
114
+ symbol_id INTEGER NOT NULL,
115
+ file_id INTEGER NOT NULL,
116
+ name TEXT NOT NULL,
117
+ kind TEXT NOT NULL,
118
+ qualifier TEXT,
119
+ arity INTEGER NOT NULL DEFAULT 0
120
+ );
121
+
122
+ CREATE TABLE field_types (
123
+ container TEXT NOT NULL,
124
+ field TEXT NOT NULL,
125
+ type TEXT NOT NULL,
126
+ file_id INTEGER NOT NULL
127
+ );
128
+
129
+ CREATE TABLE gen_docs (
130
+ path TEXT NOT NULL,
131
+ qname TEXT NOT NULL,
132
+ text TEXT NOT NULL,
133
+ created_at INTEGER NOT NULL,
134
+ PRIMARY KEY (path, qname)
135
+ ) WITHOUT ROWID;
136
+ `;
137
+ /** Secondary indexes. Kept separate so a cold bulk load can build them at the end. */
138
+ const INDEXES = `
139
+ CREATE INDEX IF NOT EXISTS idx_symbols_name ON symbols(name);
140
+ CREATE INDEX IF NOT EXISTS idx_symbols_name_lc ON symbols(name_lc);
141
+ CREATE INDEX IF NOT EXISTS idx_symbols_abbr ON symbols(abbr) WHERE abbr <> '';
142
+ CREATE INDEX IF NOT EXISTS idx_symbols_file ON symbols(file_id, start_line);
143
+ CREATE INDEX IF NOT EXISTS idx_symbols_parent ON symbols(parent_id) WHERE parent_id IS NOT NULL;
144
+ CREATE INDEX IF NOT EXISTS idx_occ_file ON occ(file_id);
145
+ CREATE INDEX IF NOT EXISTS idx_calls_name ON calls(name_id);
146
+ CREATE INDEX IF NOT EXISTS idx_calls_caller ON calls(caller_id);
147
+ CREATE INDEX IF NOT EXISTS idx_calls_file ON calls(file_id);
148
+ CREATE INDEX IF NOT EXISTS idx_imports_file ON imports(file_id, resolved_id);
149
+ CREATE INDEX IF NOT EXISTS idx_imports_resolved ON imports(resolved_id, file_id);
150
+ CREATE INDEX IF NOT EXISTS idx_heritage_name ON heritage(name);
151
+ CREATE INDEX IF NOT EXISTS idx_heritage_symbol ON heritage(symbol_id);
152
+ CREATE INDEX IF NOT EXISTS idx_heritage_file ON heritage(file_id);
153
+ CREATE INDEX IF NOT EXISTS idx_field_types ON field_types(container, field);
154
+ CREATE INDEX IF NOT EXISTS idx_field_types_file ON field_types(file_id);
155
+ `;
156
+ const INDEX_NAMES = ['idx_symbols_name', 'idx_symbols_name_lc', 'idx_symbols_abbr', 'idx_symbols_file', 'idx_symbols_parent', 'idx_occ_file', 'idx_calls_name', 'idx_calls_caller', 'idx_calls_file', 'idx_imports_file', 'idx_imports_resolved', 'idx_heritage_name', 'idx_heritage_symbol', 'idx_heritage_file', 'idx_field_types', 'idx_field_types_file'];
157
+ export const SYMBOL_COLUMNS = 's.id, s.file_id, s.name, s.name_lc, s.qname, s.kind, s.signature, s.doc, s.start_line, s.end_line, ' +
158
+ 's.start_col, s.doc_line, s.parent_id, s.exported, s.ret, f.path, f.lang';
159
+ export const SYMBOL_FROM = 'symbols s JOIN files f ON f.id = s.file_id';
160
+ export class ClastDb {
7
161
  db;
8
- dbPath;
9
- saveTimer = null;
10
- queries;
11
- constructor(db, dbPath) {
162
+ path;
163
+ stmts = new Map();
164
+ nameIds = new Map();
165
+ journalOff = false;
166
+ /** Incremented on every write; lets query caches invalidate cheaply. */
167
+ generation = 0;
168
+ constructor(db, path) {
12
169
  this.db = db;
13
- this.dbPath = dbPath;
14
- initializeSchema(this.db);
15
- this.queries = new Queries(this.db);
16
- // Auto-save every 10 seconds
17
- this.saveTimer = setInterval(() => this.save(), 10000);
18
- }
19
- static async open(dbPath) {
20
- mkdirSync(dirname(dbPath), { recursive: true });
21
- const SQL = await initSqlJs();
22
- let db;
23
- if (existsSync(dbPath)) {
24
- const buffer = readFileSync(dbPath);
25
- db = new SQL.Database(buffer);
170
+ this.path = path;
171
+ }
172
+ static open(dbPath) {
173
+ const sqlite = loadSqlite();
174
+ const memory = dbPath === ':memory:';
175
+ if (!memory) {
176
+ const dir = dirname(dbPath);
177
+ mkdirSync(dir, { recursive: true });
178
+ // Keep the cache directory out of version control without touching the
179
+ // user's .gitignore.
180
+ const ignoreFile = join(dir, '.gitignore');
181
+ if (!existsSync(ignoreFile)) {
182
+ try {
183
+ writeFileSync(ignoreFile, '*\n');
184
+ }
185
+ catch { /* read-only dir */ }
186
+ }
26
187
  }
27
- else {
28
- db = new SQL.Database();
188
+ let raw = new sqlite.DatabaseSync(dbPath);
189
+ let version = 0;
190
+ try {
191
+ const row = raw.prepare(`SELECT value FROM meta WHERE key = 'schema_version'`).get();
192
+ version = row ? Number(row.value) : 0;
193
+ }
194
+ catch {
195
+ version = 0;
196
+ }
197
+ // A bulk load that never finished (crash, kill) leaves an index that cannot be trusted.
198
+ let interrupted = false;
199
+ if (version === SCHEMA_VERSION) {
200
+ try {
201
+ const row = raw.prepare(`SELECT value FROM meta WHERE key = 'bulk_in_progress'`).get();
202
+ // The marker holds the pid of the loading process. If that process is still alive
203
+ // (another session indexing the same project) the index is merely busy, not broken.
204
+ const pid = row ? Number(row.value) : 0;
205
+ interrupted = pid > 0 && pid !== process.pid && !processAlive(pid);
206
+ if (pid === process.pid)
207
+ interrupted = true; // our own earlier load in this process failed
208
+ }
209
+ catch {
210
+ interrupted = true;
211
+ }
212
+ }
213
+ if (version !== SCHEMA_VERSION || interrupted) {
214
+ const hasTables = raw.prepare(`SELECT COUNT(*) AS n FROM sqlite_master`).get().n > 0;
215
+ if (hasTables && !memory) {
216
+ // Old or foreign schema, or an interrupted load: the index is a cache, start over.
217
+ raw.close();
218
+ try {
219
+ for (const suffix of ['', '-wal', '-shm'])
220
+ rmSync(dbPath + suffix, { force: true });
221
+ }
222
+ catch (err) {
223
+ throw new Error(`clast: cannot replace the outdated index at ${dbPath} (is another clast process using it?): ${String(err)}`);
224
+ }
225
+ raw = new sqlite.DatabaseSync(dbPath);
226
+ }
227
+ raw.exec('PRAGMA journal_mode = WAL');
228
+ raw.exec(SCHEMA);
229
+ raw
230
+ .prepare(`INSERT INTO meta (key, value) VALUES ('schema_version', ?)`)
231
+ .run(String(SCHEMA_VERSION));
232
+ }
233
+ raw.exec('PRAGMA journal_mode = WAL');
234
+ raw.exec('PRAGMA synchronous = NORMAL');
235
+ raw.exec('PRAGMA busy_timeout = 5000');
236
+ raw.exec('PRAGMA temp_store = MEMORY');
237
+ // Modest private cache; the memory map below serves hot pages straight from the OS file cache.
238
+ raw.exec('PRAGMA cache_size = -32768');
239
+ raw.exec(INDEXES);
240
+ raw.exec('PRAGMA mmap_size = 268435456');
241
+ return new ClastDb(raw, dbPath);
242
+ }
243
+ close() {
244
+ try {
245
+ this.db.exec('PRAGMA optimize');
29
246
  }
30
- return new ClastDatabase(db, dbPath);
247
+ catch { /* ignore */ }
248
+ this.stmts.clear();
249
+ this.db.close();
250
+ }
251
+ /**
252
+ * Bulk-load mode for large index runs: no fsync, no auto-checkpoint, and
253
+ * (for a cold index) secondary indexes are built once at the end. The index
254
+ * is a rebuildable cache, so durability is traded for speed here.
255
+ */
256
+ beginBulk(dropIndexes) {
257
+ // If the process dies mid-load the index is rebuilt from scratch on the next start.
258
+ this.setMeta('bulk_in_progress', String(process.pid));
259
+ this.db.exec('PRAGMA synchronous = OFF');
260
+ this.db.exec('PRAGMA wal_autocheckpoint = 0');
261
+ this.db.exec('PRAGMA cache_size = -262144');
262
+ if (dropIndexes) {
263
+ // Cold load of an empty index: no journal at all (nothing to roll back to).
264
+ this.stmts.clear();
265
+ try {
266
+ this.db.exec('PRAGMA wal_checkpoint(TRUNCATE)');
267
+ this.db.exec('PRAGMA journal_mode = OFF');
268
+ this.journalOff = true;
269
+ }
270
+ catch {
271
+ this.journalOff = false; // another connection holds the database: stay in WAL
272
+ }
273
+ for (const name of INDEX_NAMES)
274
+ this.db.exec(`DROP INDEX IF EXISTS ${name}`);
275
+ }
276
+ }
277
+ /** Drop all indexed data (generated docs are kept). Used by forced rebuilds. */
278
+ clearIndex() {
279
+ this.transaction(() => {
280
+ for (const table of ['symbols', 'occ', 'calls', 'imports', 'heritage', 'field_types', 'names', 'files']) {
281
+ this.db.exec(`DELETE FROM ${table}`);
282
+ }
283
+ this.db.exec(`INSERT INTO symbols_fts(symbols_fts) VALUES('delete-all')`);
284
+ });
285
+ this.nameIds.clear();
31
286
  }
32
- save() {
287
+ endBulk() {
288
+ this.stmts.clear();
289
+ if (this.journalOff) {
290
+ this.db.exec('PRAGMA journal_mode = WAL');
291
+ this.journalOff = false;
292
+ }
293
+ this.db.exec(INDEXES);
294
+ this.db.exec('PRAGMA wal_checkpoint(TRUNCATE)');
295
+ this.db.exec('PRAGMA wal_autocheckpoint = 1000');
296
+ this.db.exec('PRAGMA synchronous = NORMAL');
297
+ this.db.exec('PRAGMA cache_size = -32768');
33
298
  try {
34
- const data = this.db.export();
35
- writeFileSync(this.dbPath, Buffer.from(data));
299
+ this.db.exec('PRAGMA shrink_memory');
300
+ }
301
+ catch { /* optional */ }
302
+ // Sampled statistics are enough for the planner and far cheaper than a full ANALYZE.
303
+ this.db.exec('PRAGMA analysis_limit = 400');
304
+ this.db.exec('ANALYZE');
305
+ this.stmts.clear();
306
+ this.setMeta('bulk_in_progress', '0');
307
+ }
308
+ // --- generic helpers -----------------------------------------------------
309
+ stmt(sql) {
310
+ let s = this.stmts.get(sql);
311
+ if (!s) {
312
+ s = this.db.prepare(sql);
313
+ this.stmts.set(sql, s);
314
+ }
315
+ return s;
316
+ }
317
+ all(sql, ...params) {
318
+ return this.stmt(sql).all(...params);
319
+ }
320
+ get(sql, ...params) {
321
+ return this.stmt(sql).get(...params);
322
+ }
323
+ run(sql, ...params) {
324
+ const r = this.stmt(sql).run(...params);
325
+ return { changes: Number(r.changes), lastInsertRowid: Number(r.lastInsertRowid) };
326
+ }
327
+ transaction(fn) {
328
+ this.db.exec('BEGIN IMMEDIATE');
329
+ try {
330
+ const result = fn();
331
+ this.db.exec('COMMIT');
332
+ this.generation++;
333
+ return result;
36
334
  }
37
335
  catch (err) {
38
- console.error('[clast] Failed to save database:', err);
336
+ // Without a journal (cold bulk load) there is nothing to roll back to; the
337
+ // bulk_in_progress marker makes the next start rebuild the index.
338
+ try {
339
+ this.db.exec(this.journalOff ? 'COMMIT' : 'ROLLBACK');
340
+ }
341
+ catch { /* already closed */ }
342
+ throw err;
39
343
  }
40
344
  }
41
- close() {
42
- if (this.saveTimer) {
43
- clearInterval(this.saveTimer);
44
- this.saveTimer = null;
345
+ getMeta(key) {
346
+ return this.get(`SELECT value FROM meta WHERE key = ?`, key)?.value;
347
+ }
348
+ setMeta(key, value) {
349
+ this.run(`INSERT INTO meta (key, value) VALUES (?, ?) ON CONFLICT(key) DO UPDATE SET value = excluded.value`, key, value);
350
+ }
351
+ // --- names ---------------------------------------------------------------
352
+ nameId(name, create) {
353
+ const cached = this.nameIds.get(name);
354
+ if (cached !== undefined)
355
+ return cached;
356
+ let id = this.get(`SELECT id FROM names WHERE name = ?`, name)?.id;
357
+ if (id === undefined) {
358
+ if (!create)
359
+ return undefined;
360
+ id = this.run(`INSERT INTO names (name) VALUES (?)`, name).lastInsertRowid;
45
361
  }
46
- this.save();
47
- this.db.close();
362
+ if (this.nameIds.size > 400_000)
363
+ this.nameIds.clear();
364
+ this.nameIds.set(name, id);
365
+ return id;
366
+ }
367
+ // --- files ---------------------------------------------------------------
368
+ fileByPath(path) {
369
+ return this.get(`SELECT * FROM files WHERE path = ?`, path);
370
+ }
371
+ fileById(id) {
372
+ return this.get(`SELECT * FROM files WHERE id = ?`, id);
373
+ }
374
+ allFiles() {
375
+ return this.all(`SELECT * FROM files ORDER BY path`);
376
+ }
377
+ touchFile(id, mtime, size) {
378
+ this.run(`UPDATE files SET mtime = ?, size = ? WHERE id = ?`, mtime, size, id);
379
+ }
380
+ clearFileData(fileId) {
381
+ this.run(`DELETE FROM symbols_fts WHERE rowid IN (SELECT id FROM symbols WHERE file_id = ?)`, fileId);
382
+ this.run(`DELETE FROM symbols WHERE file_id = ?`, fileId);
383
+ this.run(`DELETE FROM occ WHERE file_id = ?`, fileId);
384
+ this.run(`DELETE FROM calls WHERE file_id = ?`, fileId);
385
+ this.run(`DELETE FROM imports WHERE file_id = ?`, fileId);
386
+ this.run(`DELETE FROM heritage WHERE file_id = ?`, fileId);
387
+ this.run(`DELETE FROM field_types WHERE file_id = ?`, fileId);
388
+ }
389
+ /** Remove a file and everything derived from it. Call inside a transaction. */
390
+ deleteFile(path) {
391
+ const row = this.fileByPath(path);
392
+ if (!row)
393
+ return false;
394
+ this.clearFileData(row.id);
395
+ this.run(`UPDATE imports SET resolved_id = NULL WHERE resolved_id = ?`, row.id);
396
+ this.run(`DELETE FROM files WHERE id = ?`, row.id);
397
+ return true;
398
+ }
399
+ /**
400
+ * Replace all indexed data for a file. Call inside a transaction.
401
+ * Returns the file id.
402
+ */
403
+ writeFile(meta, ex) {
404
+ const existing = this.fileByPath(meta.path);
405
+ let fileId;
406
+ const now = Date.now();
407
+ if (existing) {
408
+ fileId = existing.id;
409
+ this.clearFileData(fileId);
410
+ this.run(`UPDATE files SET hash = ?, mtime = ?, size = ?, lang = ?, line_count = ?, symbol_count = ?, indexed_at = ?, default_export = ? WHERE id = ?`, meta.hash, meta.mtime, meta.size, ex.lang, ex.lineCount, ex.symbols.length, now, ex.defaultExport, fileId);
411
+ }
412
+ else {
413
+ fileId = this.run(`INSERT INTO files (path, hash, mtime, size, lang, line_count, symbol_count, indexed_at, default_export) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`, meta.path, meta.hash, meta.mtime, meta.size, ex.lang, ex.lineCount, ex.symbols.length, now, ex.defaultExport).lastInsertRowid;
414
+ }
415
+ const insertSymbol = this.stmt(`INSERT INTO symbols (file_id, name, name_lc, abbr, qname, kind, signature, doc, start_line, end_line, start_col, doc_line, parent_id, exported, ret)
416
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`);
417
+ const insertFts = this.stmt(`INSERT INTO symbols_fts (rowid, words, sig, doc, path) VALUES (?, ?, ?, ?, ?)`);
418
+ const pathWords = splitIdentifier(meta.path).join(' ');
419
+ const ids = new Array(ex.symbols.length);
420
+ for (let i = 0; i < ex.symbols.length; i++) {
421
+ const s = ex.symbols[i];
422
+ const parentId = s.parent >= 0 ? ids[s.parent] ?? null : null;
423
+ const r = insertSymbol.run(fileId, s.name, s.name.toLowerCase(), initials(s.name), s.qname, s.kind, s.signature, s.doc, s.startLine, s.endLine, s.startCol, s.docLine, parentId, s.exported ? 1 : 0, s.ret);
424
+ const id = Number(r.lastInsertRowid);
425
+ ids[i] = id;
426
+ if (FTS_KINDS.has(s.kind)) {
427
+ insertFts.run(id, ftsWords(s.qname), ftsWords(s.signature), s.doc, pathWords);
428
+ }
429
+ }
430
+ const insertOcc = this.stmt(`INSERT OR REPLACE INTO occ (name_id, file_id, lines) VALUES (?, ?, ?)`);
431
+ for (const [name, lines] of ex.occ) {
432
+ insertOcc.run(this.nameId(name, true), fileId, lines);
433
+ }
434
+ const insertCall = this.stmt(`INSERT INTO calls (file_id, caller_id, name_id, line, receiver, rtype, count, argc) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`);
435
+ const callIds = new Array(ex.calls.length);
436
+ for (let i = 0; i < ex.calls.length; i++) {
437
+ const c = ex.calls[i];
438
+ const r = insertCall.run(fileId, c.caller >= 0 ? ids[c.caller] ?? null : null, this.nameId(c.name, true), c.line, c.receiver, c.rtype, c.count, c.argc ?? -1);
439
+ callIds[i] = Number(r.lastInsertRowid);
440
+ }
441
+ // Chain links point at other calls of the same file: set once all rows have ids.
442
+ const linkCall = this.stmt(`UPDATE calls SET via = ? WHERE rowid = ?`);
443
+ for (let i = 0; i < ex.calls.length; i++) {
444
+ const via = ex.calls[i].via;
445
+ if (via >= 0 && callIds[via] !== undefined)
446
+ linkCall.run(callIds[via], callIds[i]);
447
+ }
448
+ const insertImport = this.stmt(`INSERT INTO imports (file_id, source, names, line) VALUES (?, ?, ?, ?)`);
449
+ for (const im of ex.imports) {
450
+ insertImport.run(fileId, im.source, im.names.join(','), im.line);
451
+ }
452
+ const insertHeritage = this.stmt(`INSERT INTO heritage (symbol_id, file_id, name, kind, qualifier, arity) VALUES (?, ?, ?, ?, ?, ?)`);
453
+ for (const h of ex.heritage) {
454
+ const sid = ids[h.symbol];
455
+ if (sid !== undefined)
456
+ insertHeritage.run(sid, fileId, h.name, h.kind, h.qualifier, h.arity ?? 0);
457
+ }
458
+ const insertFieldType = this.stmt(`INSERT INTO field_types (container, field, type, file_id) VALUES (?, ?, ?, ?)`);
459
+ for (const [container, field, type] of ex.fieldTypes)
460
+ insertFieldType.run(container, field, type, fileId);
461
+ return fileId;
462
+ }
463
+ // --- symbols -------------------------------------------------------------
464
+ symbolById(id) {
465
+ return this.get(`SELECT ${SYMBOL_COLUMNS} FROM ${SYMBOL_FROM} WHERE s.id = ?`, id);
466
+ }
467
+ symbolsByName(name) {
468
+ return this.all(`SELECT ${SYMBOL_COLUMNS} FROM ${SYMBOL_FROM} WHERE s.name = ?`, name);
469
+ }
470
+ symbolsInFile(fileId) {
471
+ return this.all(`SELECT ${SYMBOL_COLUMNS} FROM ${SYMBOL_FROM} WHERE s.file_id = ? ORDER BY s.start_line, s.end_line DESC`, fileId);
472
+ }
473
+ /** Innermost symbol containing a line in a file. */
474
+ enclosingSymbol(fileId, line) {
475
+ return this.get(`SELECT ${SYMBOL_COLUMNS} FROM ${SYMBOL_FROM}
476
+ WHERE s.file_id = ? AND s.start_line <= ? AND s.end_line >= ?
477
+ ORDER BY s.start_line DESC, s.end_line ASC LIMIT 1`, fileId, line, line);
478
+ }
479
+ /** Number of files that mention a name (cheap popularity signal). */
480
+ refFileCount(name) {
481
+ const id = this.nameId(name, false);
482
+ if (id === undefined)
483
+ return 0;
484
+ return this.get(`SELECT COUNT(*) AS n FROM occ WHERE name_id = ?`, id)?.n ?? 0;
48
485
  }
49
- get raw() {
50
- return this.db;
486
+ stats() {
487
+ const row = this.get(`SELECT (SELECT COUNT(*) FROM files) AS files,
488
+ (SELECT COUNT(*) FROM symbols) AS symbols,
489
+ (SELECT COUNT(*) FROM calls) AS calls,
490
+ (SELECT COUNT(*) FROM names) AS names,
491
+ (SELECT COUNT(*) FROM imports) AS imports,
492
+ (SELECT MAX(indexed_at) FROM files) AS last`);
493
+ return { files: row.files, symbols: row.symbols, calls: row.calls, names: row.names, imports: row.imports, lastIndexed: row.last };
51
494
  }
52
495
  }
53
- export { Queries } from './queries.js';
54
496
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"AAAA,OAAO,SAA4B,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,MAAM,OAAO,aAAa;IAChB,EAAE,CAAW;IACb,MAAM,CAAS;IACf,SAAS,GAA0C,IAAI,CAAC;IACzD,OAAO,CAAU;IAExB,YAAoB,EAAY,EAAE,MAAc;QAC9C,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAEpC,6BAA6B;QAC7B,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC;IACzD,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAc;QAC9B,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAEhD,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;QAE9B,IAAI,EAAY,CAAC;QACjB,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YACpC,EAAE,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,EAAE,GAAG,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC1B,CAAC;QAED,OAAO,IAAI,aAAa,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC;IAED,IAAI;QACF,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;YAC9B,aAAa,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,kCAAkC,EAAE,GAAG,CAAC,CAAC;QACzD,CAAC;IACH,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC9B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;QACxB,CAAC;QACD,IAAI,CAAC,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;IAED,IAAI,GAAG;QACL,OAAO,IAAI,CAAC,EAAE,CAAC;IACjB,CAAC;CACF;AAED,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { type ClastConfig } from './config/index.js';
2
+ import { ClastDb } from './db/index.js';
3
+ import { Indexer } from './indexer/index.js';
4
+ /**
5
+ * One indexed project: configuration, database and indexer. Shared by the MCP
6
+ * server, the CLI and tests.
7
+ */
8
+ export declare class Clast {
9
+ readonly root: string;
10
+ readonly config: ClastConfig;
11
+ readonly db: ClastDb;
12
+ readonly indexer: Indexer;
13
+ constructor(root: string, config?: ClastConfig);
14
+ close(): void;
15
+ }
package/dist/engine.js ADDED
@@ -0,0 +1,28 @@
1
+ import { existsSync, statSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ import { loadConfig, resolveDbPath } from './config/index.js';
4
+ import { ClastDb } from './db/index.js';
5
+ import { Indexer } from './indexer/index.js';
6
+ /**
7
+ * One indexed project: configuration, database and indexer. Shared by the MCP
8
+ * server, the CLI and tests.
9
+ */
10
+ export class Clast {
11
+ root;
12
+ config;
13
+ db;
14
+ indexer;
15
+ constructor(root, config) {
16
+ this.root = resolve(root);
17
+ if (!existsSync(this.root) || !statSync(this.root).isDirectory()) {
18
+ throw new Error(`project root does not exist or is not a directory: ${this.root}`);
19
+ }
20
+ this.config = config ?? loadConfig(this.root);
21
+ this.db = ClastDb.open(resolveDbPath(this.root, this.config));
22
+ this.indexer = new Indexer(this.root, this.config, this.db);
23
+ }
24
+ close() {
25
+ this.db.close();
26
+ }
27
+ }
28
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAoB,MAAM,mBAAmB,CAAC;AAChF,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAE7C;;;GAGG;AACH,MAAM,OAAO,KAAK;IACP,IAAI,CAAS;IACb,MAAM,CAAc;IACpB,EAAE,CAAU;IACZ,OAAO,CAAU;IAE1B,YAAY,IAAY,EAAE,MAAoB;QAC5C,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC1B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;YACjE,MAAM,IAAI,KAAK,CAAC,sDAAsD,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACrF,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;QAC9D,IAAI,CAAC,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK;QACH,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC;IAClB,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ import type { ClastDb } from '../db/index.js';
2
+ /**
3
+ * Resolve import specifiers to indexed files. With `fileIds`, only imports of
4
+ * those files are (re)resolved; otherwise every import is.
5
+ */
6
+ export declare function resolveImports(db: ClastDb, fileIds?: number[], newPaths?: string[]): number;