@bugsbunnycodes1998/cartographer-core 0.1.0

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 (220) hide show
  1. package/dist/__tests__/pipeline.test.d.ts +2 -0
  2. package/dist/__tests__/pipeline.test.d.ts.map +1 -0
  3. package/dist/__tests__/pipeline.test.js +58 -0
  4. package/dist/__tests__/pipeline.test.js.map +1 -0
  5. package/dist/analysis/call-graph.d.ts +13 -0
  6. package/dist/analysis/call-graph.d.ts.map +1 -0
  7. package/dist/analysis/call-graph.js +133 -0
  8. package/dist/analysis/call-graph.js.map +1 -0
  9. package/dist/analysis/dependency-graph.d.ts +8 -0
  10. package/dist/analysis/dependency-graph.d.ts.map +1 -0
  11. package/dist/analysis/dependency-graph.js +101 -0
  12. package/dist/analysis/dependency-graph.js.map +1 -0
  13. package/dist/analysis/git/archaeology.d.ts +20 -0
  14. package/dist/analysis/git/archaeology.d.ts.map +1 -0
  15. package/dist/analysis/git/archaeology.js +61 -0
  16. package/dist/analysis/git/archaeology.js.map +1 -0
  17. package/dist/analysis/git/bus-factor.d.ts +17 -0
  18. package/dist/analysis/git/bus-factor.d.ts.map +1 -0
  19. package/dist/analysis/git/bus-factor.js +90 -0
  20. package/dist/analysis/git/bus-factor.js.map +1 -0
  21. package/dist/analysis/git/churn.d.ts +26 -0
  22. package/dist/analysis/git/churn.d.ts.map +1 -0
  23. package/dist/analysis/git/churn.js +127 -0
  24. package/dist/analysis/git/churn.js.map +1 -0
  25. package/dist/analysis/git/contributors.d.ts +14 -0
  26. package/dist/analysis/git/contributors.d.ts.map +1 -0
  27. package/dist/analysis/git/contributors.js +60 -0
  28. package/dist/analysis/git/contributors.js.map +1 -0
  29. package/dist/analysis/git/evolution.d.ts +10 -0
  30. package/dist/analysis/git/evolution.d.ts.map +1 -0
  31. package/dist/analysis/git/evolution.js +127 -0
  32. package/dist/analysis/git/evolution.js.map +1 -0
  33. package/dist/analysis/git/index.d.ts +6 -0
  34. package/dist/analysis/git/index.d.ts.map +1 -0
  35. package/dist/analysis/git/index.js +6 -0
  36. package/dist/analysis/git/index.js.map +1 -0
  37. package/dist/analysis/go-visitor.d.ts +4 -0
  38. package/dist/analysis/go-visitor.d.ts.map +1 -0
  39. package/dist/analysis/go-visitor.js +295 -0
  40. package/dist/analysis/go-visitor.js.map +1 -0
  41. package/dist/analysis/health/indicators.d.ts +25 -0
  42. package/dist/analysis/health/indicators.d.ts.map +1 -0
  43. package/dist/analysis/health/indicators.js +53 -0
  44. package/dist/analysis/health/indicators.js.map +1 -0
  45. package/dist/analysis/health/scorer.d.ts +26 -0
  46. package/dist/analysis/health/scorer.d.ts.map +1 -0
  47. package/dist/analysis/health/scorer.js +97 -0
  48. package/dist/analysis/health/scorer.js.map +1 -0
  49. package/dist/analysis/health/test-coverage.d.ts +19 -0
  50. package/dist/analysis/health/test-coverage.d.ts.map +1 -0
  51. package/dist/analysis/health/test-coverage.js +67 -0
  52. package/dist/analysis/health/test-coverage.js.map +1 -0
  53. package/dist/analysis/import-resolver.d.ts +10 -0
  54. package/dist/analysis/import-resolver.d.ts.map +1 -0
  55. package/dist/analysis/import-resolver.js +353 -0
  56. package/dist/analysis/import-resolver.js.map +1 -0
  57. package/dist/analysis/index.d.ts +22 -0
  58. package/dist/analysis/index.d.ts.map +1 -0
  59. package/dist/analysis/index.js +24 -0
  60. package/dist/analysis/index.js.map +1 -0
  61. package/dist/analysis/java-visitor.d.ts +4 -0
  62. package/dist/analysis/java-visitor.d.ts.map +1 -0
  63. package/dist/analysis/java-visitor.js +257 -0
  64. package/dist/analysis/java-visitor.js.map +1 -0
  65. package/dist/analysis/metrics.d.ts +19 -0
  66. package/dist/analysis/metrics.d.ts.map +1 -0
  67. package/dist/analysis/metrics.js +70 -0
  68. package/dist/analysis/metrics.js.map +1 -0
  69. package/dist/analysis/module-detector.d.ts +3 -0
  70. package/dist/analysis/module-detector.d.ts.map +1 -0
  71. package/dist/analysis/module-detector.js +257 -0
  72. package/dist/analysis/module-detector.js.map +1 -0
  73. package/dist/analysis/parser.d.ts +13 -0
  74. package/dist/analysis/parser.d.ts.map +1 -0
  75. package/dist/analysis/parser.js +92 -0
  76. package/dist/analysis/parser.js.map +1 -0
  77. package/dist/analysis/python-visitor.d.ts +4 -0
  78. package/dist/analysis/python-visitor.d.ts.map +1 -0
  79. package/dist/analysis/python-visitor.js +306 -0
  80. package/dist/analysis/python-visitor.js.map +1 -0
  81. package/dist/analysis/rust-visitor.d.ts +4 -0
  82. package/dist/analysis/rust-visitor.d.ts.map +1 -0
  83. package/dist/analysis/rust-visitor.js +318 -0
  84. package/dist/analysis/rust-visitor.js.map +1 -0
  85. package/dist/analysis/semantic/cache.d.ts +16 -0
  86. package/dist/analysis/semantic/cache.d.ts.map +1 -0
  87. package/dist/analysis/semantic/cache.js +26 -0
  88. package/dist/analysis/semantic/cache.js.map +1 -0
  89. package/dist/analysis/semantic/openai-client.d.ts +21 -0
  90. package/dist/analysis/semantic/openai-client.d.ts.map +1 -0
  91. package/dist/analysis/semantic/openai-client.js +73 -0
  92. package/dist/analysis/semantic/openai-client.js.map +1 -0
  93. package/dist/analysis/semantic/prompts.d.ts +32 -0
  94. package/dist/analysis/semantic/prompts.d.ts.map +1 -0
  95. package/dist/analysis/semantic/prompts.js +134 -0
  96. package/dist/analysis/semantic/prompts.js.map +1 -0
  97. package/dist/analysis/semantic/summarizer.d.ts +36 -0
  98. package/dist/analysis/semantic/summarizer.d.ts.map +1 -0
  99. package/dist/analysis/semantic/summarizer.js +229 -0
  100. package/dist/analysis/semantic/summarizer.js.map +1 -0
  101. package/dist/analysis/ts-js-visitor.d.ts +4 -0
  102. package/dist/analysis/ts-js-visitor.d.ts.map +1 -0
  103. package/dist/analysis/ts-js-visitor.js +390 -0
  104. package/dist/analysis/ts-js-visitor.js.map +1 -0
  105. package/dist/analysis/visitor-registry.d.ts +5 -0
  106. package/dist/analysis/visitor-registry.d.ts.map +1 -0
  107. package/dist/analysis/visitor-registry.js +17 -0
  108. package/dist/analysis/visitor-registry.js.map +1 -0
  109. package/dist/analysis/visitor-utils.d.ts +38 -0
  110. package/dist/analysis/visitor-utils.d.ts.map +1 -0
  111. package/dist/analysis/visitor-utils.js +110 -0
  112. package/dist/analysis/visitor-utils.js.map +1 -0
  113. package/dist/errors.d.ts +20 -0
  114. package/dist/errors.d.ts.map +1 -0
  115. package/dist/errors.js +39 -0
  116. package/dist/errors.js.map +1 -0
  117. package/dist/expeditions/custom.d.ts +11 -0
  118. package/dist/expeditions/custom.d.ts.map +1 -0
  119. package/dist/expeditions/custom.js +61 -0
  120. package/dist/expeditions/custom.js.map +1 -0
  121. package/dist/expeditions/danger-zones.d.ts +9 -0
  122. package/dist/expeditions/danger-zones.d.ts.map +1 -0
  123. package/dist/expeditions/danger-zones.js +42 -0
  124. package/dist/expeditions/danger-zones.js.map +1 -0
  125. package/dist/expeditions/generator.d.ts +21 -0
  126. package/dist/expeditions/generator.d.ts.map +1 -0
  127. package/dist/expeditions/generator.js +78 -0
  128. package/dist/expeditions/generator.js.map +1 -0
  129. package/dist/expeditions/grand-tour.d.ts +10 -0
  130. package/dist/expeditions/grand-tour.d.ts.map +1 -0
  131. package/dist/expeditions/grand-tour.js +96 -0
  132. package/dist/expeditions/grand-tour.js.map +1 -0
  133. package/dist/expeditions/request-flow.d.ts +11 -0
  134. package/dist/expeditions/request-flow.d.ts.map +1 -0
  135. package/dist/expeditions/request-flow.js +138 -0
  136. package/dist/expeditions/request-flow.js.map +1 -0
  137. package/dist/grammars/tree-sitter-go.wasm +0 -0
  138. package/dist/grammars/tree-sitter-java.wasm +0 -0
  139. package/dist/grammars/tree-sitter-javascript.wasm +0 -0
  140. package/dist/grammars/tree-sitter-python.wasm +0 -0
  141. package/dist/grammars/tree-sitter-rust.wasm +0 -0
  142. package/dist/grammars/tree-sitter-tsx.wasm +0 -0
  143. package/dist/grammars/tree-sitter-typescript.wasm +0 -0
  144. package/dist/graph/builder.d.ts +23 -0
  145. package/dist/graph/builder.d.ts.map +1 -0
  146. package/dist/graph/builder.js +131 -0
  147. package/dist/graph/builder.js.map +1 -0
  148. package/dist/graph/exporter.d.ts +5 -0
  149. package/dist/graph/exporter.d.ts.map +1 -0
  150. package/dist/graph/exporter.js +20 -0
  151. package/dist/graph/exporter.js.map +1 -0
  152. package/dist/graph/layout.d.ts +3 -0
  153. package/dist/graph/layout.d.ts.map +1 -0
  154. package/dist/graph/layout.js +257 -0
  155. package/dist/graph/layout.js.map +1 -0
  156. package/dist/graph/store.d.ts +13 -0
  157. package/dist/graph/store.d.ts.map +1 -0
  158. package/dist/graph/store.js +145 -0
  159. package/dist/graph/store.js.map +1 -0
  160. package/dist/index.d.ts +17 -0
  161. package/dist/index.d.ts.map +1 -0
  162. package/dist/index.js +12 -0
  163. package/dist/index.js.map +1 -0
  164. package/dist/ingestion/cloner.d.ts +18 -0
  165. package/dist/ingestion/cloner.d.ts.map +1 -0
  166. package/dist/ingestion/cloner.js +62 -0
  167. package/dist/ingestion/cloner.js.map +1 -0
  168. package/dist/ingestion/file-tree.d.ts +3 -0
  169. package/dist/ingestion/file-tree.d.ts.map +1 -0
  170. package/dist/ingestion/file-tree.js +85 -0
  171. package/dist/ingestion/file-tree.js.map +1 -0
  172. package/dist/ingestion/index.d.ts +5 -0
  173. package/dist/ingestion/index.d.ts.map +1 -0
  174. package/dist/ingestion/index.js +5 -0
  175. package/dist/ingestion/index.js.map +1 -0
  176. package/dist/ingestion/language-detector.d.ts +8 -0
  177. package/dist/ingestion/language-detector.d.ts.map +1 -0
  178. package/dist/ingestion/language-detector.js +37 -0
  179. package/dist/ingestion/language-detector.js.map +1 -0
  180. package/dist/ingestion/path-resolver.d.ts +7 -0
  181. package/dist/ingestion/path-resolver.d.ts.map +1 -0
  182. package/dist/ingestion/path-resolver.js +30 -0
  183. package/dist/ingestion/path-resolver.js.map +1 -0
  184. package/dist/logger.d.ts +3 -0
  185. package/dist/logger.d.ts.map +1 -0
  186. package/dist/logger.js +11 -0
  187. package/dist/logger.js.map +1 -0
  188. package/dist/pipeline.d.ts +3 -0
  189. package/dist/pipeline.d.ts.map +1 -0
  190. package/dist/pipeline.js +223 -0
  191. package/dist/pipeline.js.map +1 -0
  192. package/dist/types/analysis.d.ts +51 -0
  193. package/dist/types/analysis.d.ts.map +1 -0
  194. package/dist/types/analysis.js +2 -0
  195. package/dist/types/analysis.js.map +1 -0
  196. package/dist/types/config.d.ts +19 -0
  197. package/dist/types/config.d.ts.map +1 -0
  198. package/dist/types/config.js +2 -0
  199. package/dist/types/config.js.map +1 -0
  200. package/dist/types/edges.d.ts +8 -0
  201. package/dist/types/edges.d.ts.map +1 -0
  202. package/dist/types/edges.js +2 -0
  203. package/dist/types/edges.js.map +1 -0
  204. package/dist/types/expeditions.d.ts +19 -0
  205. package/dist/types/expeditions.d.ts.map +1 -0
  206. package/dist/types/expeditions.js +2 -0
  207. package/dist/types/expeditions.js.map +1 -0
  208. package/dist/types/graph.d.ts +29 -0
  209. package/dist/types/graph.d.ts.map +1 -0
  210. package/dist/types/graph.js +2 -0
  211. package/dist/types/graph.js.map +1 -0
  212. package/dist/types/index.d.ts +7 -0
  213. package/dist/types/index.d.ts.map +1 -0
  214. package/dist/types/index.js +2 -0
  215. package/dist/types/index.js.map +1 -0
  216. package/dist/types/nodes.d.ts +35 -0
  217. package/dist/types/nodes.d.ts.map +1 -0
  218. package/dist/types/nodes.js +2 -0
  219. package/dist/types/nodes.js.map +1 -0
  220. package/package.json +36 -0
@@ -0,0 +1,318 @@
1
+ import { countLOC, truncateBody, findDescendantByType, extractCallSitesGeneric, computeComplexityGeneric } from "./visitor-utils.js";
2
+ // --- Complexity ---
3
+ const RUST_COMPLEXITY_TYPES = new Set([
4
+ "if_expression",
5
+ "match_expression",
6
+ "for_expression",
7
+ "while_expression",
8
+ "loop_expression",
9
+ ]);
10
+ function computeComplexity(node) {
11
+ return computeComplexityGeneric(node, RUST_COMPLEXITY_TYPES, (n) => {
12
+ // Count match arms (each arm is a branch)
13
+ if (n.type === "match_arm") {
14
+ return 1;
15
+ }
16
+ // Count logical && and || in binary expressions
17
+ if (n.type === "binary_expression") {
18
+ const op = n.children.find((c) => c.type === "&&" || c.type === "||");
19
+ if (op)
20
+ return 1;
21
+ }
22
+ return 0;
23
+ });
24
+ }
25
+ // --- Call sites ---
26
+ function extractCallSites(node) {
27
+ return extractCallSitesGeneric(node, "call_expression", (callNode) => {
28
+ const fnNode = callNode.childForFieldName("function") ?? callNode.children[0];
29
+ if (!fnNode)
30
+ return null;
31
+ if (fnNode.type === "identifier") {
32
+ return fnNode.text;
33
+ }
34
+ if (fnNode.type === "field_expression") {
35
+ // obj.method() -> extract "method"
36
+ const field = fnNode.childForFieldName("field");
37
+ if (field)
38
+ return field.text;
39
+ }
40
+ if (fnNode.type === "scoped_identifier") {
41
+ // Foo::bar() -> extract "bar"
42
+ const name = fnNode.childForFieldName("name");
43
+ if (name)
44
+ return name.text;
45
+ }
46
+ return null;
47
+ });
48
+ }
49
+ // --- Imports (use declarations) ---
50
+ function extractImports(root) {
51
+ const imports = [];
52
+ function walk(node) {
53
+ if (node.type === "use_declaration") {
54
+ // use std::collections::HashMap;
55
+ // use crate::foo::bar;
56
+ // use crate::foo::{Bar, Baz};
57
+ const argNode = node.children.find((c) => c.type === "scoped_identifier" ||
58
+ c.type === "use_wildcard" ||
59
+ c.type === "use_list" ||
60
+ c.type === "scoped_use_list" ||
61
+ c.type === "identifier");
62
+ if (argNode) {
63
+ const source = extractUseSource(argNode);
64
+ const names = extractUseNames(argNode);
65
+ imports.push({
66
+ source,
67
+ resolvedPath: null,
68
+ names,
69
+ isTypeOnly: false,
70
+ });
71
+ }
72
+ }
73
+ // Only visit top-level and mod-level items, not function bodies
74
+ if (node.type !== "function_item" && node.type !== "closure_expression") {
75
+ for (const child of node.children) {
76
+ walk(child);
77
+ }
78
+ }
79
+ }
80
+ walk(root);
81
+ return imports;
82
+ }
83
+ function extractUseSource(node) {
84
+ // Walk the scoped_identifier path to build the source string
85
+ if (node.type === "scoped_identifier") {
86
+ const path = node.childForFieldName("path");
87
+ const name = node.childForFieldName("name");
88
+ if (path && name) {
89
+ return `${extractUseSource(path)}::${name.text}`;
90
+ }
91
+ return node.text;
92
+ }
93
+ if (node.type === "scoped_use_list") {
94
+ const path = node.childForFieldName("path");
95
+ return path ? extractUseSource(path) : node.text;
96
+ }
97
+ if (node.type === "use_wildcard") {
98
+ const path = node.children.find((c) => c.type === "scoped_identifier" || c.type === "identifier");
99
+ return path ? extractUseSource(path) : "*";
100
+ }
101
+ return node.text;
102
+ }
103
+ function extractUseNames(node) {
104
+ if (node.type === "scoped_identifier") {
105
+ const name = node.childForFieldName("name");
106
+ return name ? [name.text] : [node.text];
107
+ }
108
+ if (node.type === "scoped_use_list") {
109
+ const list = node.children.find((c) => c.type === "use_list");
110
+ if (list) {
111
+ return list.children
112
+ .filter((c) => c.type === "identifier" || c.type === "scoped_identifier" || c.type === "use_as_clause")
113
+ .map((c) => {
114
+ if (c.type === "use_as_clause") {
115
+ const alias = c.childForFieldName("alias");
116
+ return alias?.text ?? c.text;
117
+ }
118
+ if (c.type === "scoped_identifier") {
119
+ const name = c.childForFieldName("name");
120
+ return name?.text ?? c.text;
121
+ }
122
+ return c.text;
123
+ });
124
+ }
125
+ }
126
+ if (node.type === "use_wildcard") {
127
+ return ["*"];
128
+ }
129
+ if (node.type === "identifier") {
130
+ return [node.text];
131
+ }
132
+ return [node.text];
133
+ }
134
+ // --- Exports ---
135
+ // In Rust, `pub` items are exported
136
+ function extractExports(root) {
137
+ const exports = [];
138
+ for (const child of root.children) {
139
+ if (child.type === "function_item" && hasPubVisibility(child)) {
140
+ const nameNode = child.childForFieldName("name");
141
+ if (nameNode) {
142
+ exports.push({
143
+ name: nameNode.text,
144
+ kind: "function",
145
+ isTypeOnly: false,
146
+ });
147
+ }
148
+ }
149
+ else if (child.type === "struct_item" && hasPubVisibility(child)) {
150
+ const nameNode = child.childForFieldName("name");
151
+ if (nameNode) {
152
+ exports.push({
153
+ name: nameNode.text,
154
+ kind: "class",
155
+ isTypeOnly: false,
156
+ });
157
+ }
158
+ }
159
+ else if (child.type === "enum_item" && hasPubVisibility(child)) {
160
+ const nameNode = child.childForFieldName("name");
161
+ if (nameNode) {
162
+ exports.push({
163
+ name: nameNode.text,
164
+ kind: "class",
165
+ isTypeOnly: false,
166
+ });
167
+ }
168
+ }
169
+ else if (child.type === "type_item" && hasPubVisibility(child)) {
170
+ const nameNode = child.childForFieldName("name");
171
+ if (nameNode) {
172
+ exports.push({
173
+ name: nameNode.text,
174
+ kind: "type",
175
+ isTypeOnly: true,
176
+ });
177
+ }
178
+ }
179
+ else if (child.type === "trait_item" && hasPubVisibility(child)) {
180
+ const nameNode = child.childForFieldName("name");
181
+ if (nameNode) {
182
+ exports.push({
183
+ name: nameNode.text,
184
+ kind: "interface",
185
+ isTypeOnly: true,
186
+ });
187
+ }
188
+ }
189
+ else if ((child.type === "const_item" || child.type === "static_item") && hasPubVisibility(child)) {
190
+ const nameNode = child.childForFieldName("name");
191
+ if (nameNode) {
192
+ exports.push({
193
+ name: nameNode.text,
194
+ kind: "variable",
195
+ isTypeOnly: false,
196
+ });
197
+ }
198
+ }
199
+ else if (child.type === "impl_item") {
200
+ // Extract pub methods from impl blocks
201
+ const body = child.childForFieldName("body");
202
+ if (body) {
203
+ for (const item of body.children) {
204
+ if (item.type === "function_item" && hasPubVisibility(item)) {
205
+ const nameNode = item.childForFieldName("name");
206
+ if (nameNode) {
207
+ exports.push({
208
+ name: nameNode.text,
209
+ kind: "function",
210
+ isTypeOnly: false,
211
+ });
212
+ }
213
+ }
214
+ }
215
+ }
216
+ }
217
+ }
218
+ return exports;
219
+ }
220
+ function hasPubVisibility(node) {
221
+ return node.children.some((c) => c.type === "visibility_modifier" && c.text.startsWith("pub"));
222
+ }
223
+ // --- Functions ---
224
+ function extractFunctions(root, content) {
225
+ const functions = [];
226
+ function walk(node, isTopLevel) {
227
+ if (node.type === "function_item") {
228
+ const nameNode = node.childForFieldName("name");
229
+ if (nameNode) {
230
+ const params = extractRustParams(node);
231
+ const returnType = extractRustReturnType(node);
232
+ const bodyNode = node.childForFieldName("body") ?? node;
233
+ const isExported = hasPubVisibility(node);
234
+ const isAsync = node.children.some((c) => c.text === "async");
235
+ functions.push({
236
+ name: nameNode.text,
237
+ startLine: node.startPosition.row + 1,
238
+ endLine: node.endPosition.row + 1,
239
+ params,
240
+ returnType,
241
+ isExported,
242
+ isAsync,
243
+ body: truncateBody(node.text, 200),
244
+ complexity: computeComplexity(bodyNode),
245
+ calls: extractCallSites(bodyNode),
246
+ });
247
+ return; // Don't recurse into nested functions
248
+ }
249
+ }
250
+ // Recurse into impl blocks to find methods
251
+ if (node.type === "impl_item") {
252
+ const body = node.childForFieldName("body");
253
+ if (body) {
254
+ for (const child of body.children) {
255
+ walk(child, false);
256
+ }
257
+ }
258
+ return;
259
+ }
260
+ // Recurse into mod blocks
261
+ if (node.type === "mod_item") {
262
+ const body = node.childForFieldName("body");
263
+ if (body) {
264
+ for (const child of body.children) {
265
+ walk(child, false);
266
+ }
267
+ }
268
+ return;
269
+ }
270
+ for (const child of node.children) {
271
+ walk(child, isTopLevel && node === root);
272
+ }
273
+ }
274
+ for (const child of root.children) {
275
+ walk(child, true);
276
+ }
277
+ return functions;
278
+ }
279
+ function extractRustParams(funcNode) {
280
+ const params = funcNode.childForFieldName("parameters");
281
+ if (!params)
282
+ return [];
283
+ return params.children
284
+ .filter((c) => c.type === "parameter" || c.type === "self_parameter")
285
+ .map((c) => {
286
+ if (c.type === "self_parameter")
287
+ return "self";
288
+ const pattern = c.childForFieldName("pattern");
289
+ return pattern?.text ?? c.text;
290
+ })
291
+ .filter((p) => p !== "self" && p !== "&self" && p !== "&mut self");
292
+ }
293
+ function extractRustReturnType(funcNode) {
294
+ const returnType = funcNode.childForFieldName("return_type");
295
+ if (!returnType)
296
+ return null;
297
+ const text = returnType.text;
298
+ // Remove leading "-> "
299
+ return text.startsWith("->") ? text.slice(2).trim() : text.trim();
300
+ }
301
+ // --- Main visitor ---
302
+ export function visitFile(content, tree, filePath) {
303
+ const root = tree.rootNode;
304
+ const imports = extractImports(root);
305
+ const exports = extractExports(root);
306
+ const loc = countLOC(content, tree);
307
+ const functions = extractFunctions(root, content);
308
+ return {
309
+ filePath,
310
+ language: "rust",
311
+ content,
312
+ loc,
313
+ imports,
314
+ exports,
315
+ functions,
316
+ };
317
+ }
318
+ //# sourceMappingURL=rust-visitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rust-visitor.js","sourceRoot":"","sources":["../../src/analysis/rust-visitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type Database from "better-sqlite3";
2
+ /**
3
+ * Create a content-addressed cache key by SHA-256 hashing the concatenated parts.
4
+ */
5
+ export declare function createCacheKey(...parts: string[]): string;
6
+ /**
7
+ * Retrieve a cached LLM result from the database.
8
+ * Returns the stored JSON result string, or null if not found.
9
+ */
10
+ export declare function getCachedResult(db: Database.Database, contentHash: string, promptType: string): string | null;
11
+ /**
12
+ * Store an LLM result in the cache, keyed by content hash and prompt type.
13
+ * Uses INSERT OR REPLACE so repeated calls for the same key update the entry.
14
+ */
15
+ export declare function setCachedResult(db: Database.Database, contentHash: string, model: string, promptType: string, result: string, tokensUsed: number): void;
16
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../src/analysis/semantic/cache.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAC;AAE3C;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAEzD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,MAAM,GAAG,IAAI,CAMf;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,EAAE,EAAE,QAAQ,CAAC,QAAQ,EACrB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,GACjB,IAAI,CAKN"}
@@ -0,0 +1,26 @@
1
+ import { createHash } from "node:crypto";
2
+ /**
3
+ * Create a content-addressed cache key by SHA-256 hashing the concatenated parts.
4
+ */
5
+ export function createCacheKey(...parts) {
6
+ return createHash("sha256").update(parts.join("|")).digest("hex");
7
+ }
8
+ /**
9
+ * Retrieve a cached LLM result from the database.
10
+ * Returns the stored JSON result string, or null if not found.
11
+ */
12
+ export function getCachedResult(db, contentHash, promptType) {
13
+ const row = db
14
+ .prepare("SELECT result FROM llm_cache WHERE content_hash = ? AND prompt_type = ?")
15
+ .get(contentHash, promptType);
16
+ return row?.result ?? null;
17
+ }
18
+ /**
19
+ * Store an LLM result in the cache, keyed by content hash and prompt type.
20
+ * Uses INSERT OR REPLACE so repeated calls for the same key update the entry.
21
+ */
22
+ export function setCachedResult(db, contentHash, model, promptType, result, tokensUsed) {
23
+ db.prepare(`INSERT OR REPLACE INTO llm_cache (content_hash, model, prompt_type, result, tokens_used)
24
+ VALUES (?, ?, ?, ?, ?)`).run(contentHash, model, promptType, result, tokensUsed);
25
+ }
26
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../src/analysis/semantic/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,GAAG,KAAe;IAC/C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACpE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,EAAqB,EACrB,WAAmB,EACnB,UAAkB;IAElB,MAAM,GAAG,GAAG,EAAE;SACX,OAAO,CAAC,yEAAyE,CAAC;SAClF,GAAG,CAAC,WAAW,EAAE,UAAU,CAAmC,CAAC;IAElE,OAAO,GAAG,EAAE,MAAM,IAAI,IAAI,CAAC;AAC7B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,EAAqB,EACrB,WAAmB,EACnB,KAAa,EACb,UAAkB,EAClB,MAAc,EACd,UAAkB;IAElB,EAAE,CAAC,OAAO,CACR;4BACwB,CACzB,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,21 @@
1
+ export interface LlmOptions {
2
+ apiKey: string;
3
+ maxConcurrency?: number;
4
+ maxRetries?: number;
5
+ timeoutMs?: number;
6
+ }
7
+ export declare class OpenAIClient {
8
+ private client;
9
+ private limiter;
10
+ private maxRetries;
11
+ private timeoutMs;
12
+ constructor(options: LlmOptions);
13
+ completeJSON<T>(messages: Array<{
14
+ role: "system" | "user";
15
+ content: string;
16
+ }>, model: string): Promise<{
17
+ result: T;
18
+ tokensUsed: number;
19
+ }>;
20
+ }
21
+ //# sourceMappingURL=openai-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-client.d.ts","sourceRoot":"","sources":["../../../src/analysis/semantic/openai-client.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAA4B;IAC3C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,SAAS,CAAS;gBAEd,OAAO,EAAE,UAAU;IAUzB,YAAY,CAAC,CAAC,EAClB,QAAQ,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,EAC7D,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC;QAAE,MAAM,EAAE,CAAC,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CAsE9C"}
@@ -0,0 +1,73 @@
1
+ import OpenAI from "openai";
2
+ import pLimit from "p-limit";
3
+ import { LlmError } from "../../errors.js";
4
+ import { logger } from "../../logger.js";
5
+ export class OpenAIClient {
6
+ client;
7
+ limiter;
8
+ maxRetries;
9
+ timeoutMs;
10
+ constructor(options) {
11
+ this.client = new OpenAI({
12
+ apiKey: options.apiKey,
13
+ timeout: options.timeoutMs ?? 30_000,
14
+ });
15
+ this.limiter = pLimit(options.maxConcurrency ?? 10);
16
+ this.maxRetries = options.maxRetries ?? 3;
17
+ this.timeoutMs = options.timeoutMs ?? 30_000;
18
+ }
19
+ async completeJSON(messages, model) {
20
+ return this.limiter(async () => {
21
+ let lastError;
22
+ for (let attempt = 0; attempt <= this.maxRetries; attempt++) {
23
+ try {
24
+ const response = await this.client.chat.completions.create({
25
+ model,
26
+ messages,
27
+ response_format: { type: "json_object" },
28
+ temperature: 0.2,
29
+ });
30
+ const content = response.choices[0]?.message?.content;
31
+ if (!content) {
32
+ throw new LlmError("Empty response from OpenAI", "LLM_EMPTY_RESPONSE");
33
+ }
34
+ const tokensUsed = (response.usage?.prompt_tokens ?? 0) + (response.usage?.completion_tokens ?? 0);
35
+ try {
36
+ const parsed = JSON.parse(content);
37
+ return { result: parsed, tokensUsed };
38
+ }
39
+ catch {
40
+ // JSON parse failure: retry once more, then throw
41
+ if (attempt < this.maxRetries) {
42
+ logger.warn(`JSON parse failed on attempt ${attempt + 1}, retrying...`);
43
+ continue;
44
+ }
45
+ throw new LlmError(`Failed to parse JSON response from OpenAI: ${content.slice(0, 200)}`, "LLM_JSON_PARSE_ERROR");
46
+ }
47
+ }
48
+ catch (err) {
49
+ lastError = err;
50
+ // Don't retry our own LlmError unless it's a parse error handled above
51
+ if (err instanceof LlmError) {
52
+ throw err;
53
+ }
54
+ const status = err.status;
55
+ const isRetryable = status === 429 || (status !== undefined && status >= 500);
56
+ if (isRetryable && attempt < this.maxRetries) {
57
+ const backoffMs = Math.pow(2, attempt + 1) * 1000; // 2s, 4s, 8s
58
+ logger.warn(`OpenAI request failed (status ${status}), retrying in ${backoffMs}ms (attempt ${attempt + 1}/${this.maxRetries})`);
59
+ await sleep(backoffMs);
60
+ continue;
61
+ }
62
+ throw new LlmError(`OpenAI request failed after ${attempt + 1} attempts: ${String(err)}`, "LLM_REQUEST_FAILED", { cause: err instanceof Error ? err : undefined });
63
+ }
64
+ }
65
+ // Should not reach here, but just in case
66
+ throw new LlmError(`OpenAI request failed after all retries: ${String(lastError)}`, "LLM_REQUEST_FAILED");
67
+ });
68
+ }
69
+ }
70
+ function sleep(ms) {
71
+ return new Promise((resolve) => setTimeout(resolve, ms));
72
+ }
73
+ //# sourceMappingURL=openai-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-client.js","sourceRoot":"","sources":["../../../src/analysis/semantic/openai-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Prompt template functions for hierarchical LLM summarization.
3
+ *
4
+ * Each function returns a { system, user } pair suitable for passing to
5
+ * OpenAIClient.completeJSON(). All prompts request JSON output with a strict schema.
6
+ */
7
+ export declare function fileSummaryPrompt(filePath: string, content: string, functionSummaries: string[], imports: string[], exports: string[]): {
8
+ system: string;
9
+ user: string;
10
+ };
11
+ export declare function moduleSummaryPrompt(moduleName: string, fileSummaries: Array<{
12
+ path: string;
13
+ role: string;
14
+ }>, dependencies: string[]): {
15
+ system: string;
16
+ user: string;
17
+ };
18
+ export declare function expeditionPrompt(question: string, callGraphSummary: string, moduleSummaries: string[]): {
19
+ system: string;
20
+ user: string;
21
+ };
22
+ export declare function systemSummaryPrompt(moduleSummaries: Array<{
23
+ name: string;
24
+ purpose: string;
25
+ }>, dependencyGraph: Array<{
26
+ from: string;
27
+ to: string;
28
+ }>): {
29
+ system: string;
30
+ user: string;
31
+ };
32
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../../src/analysis/semantic/prompts.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAeH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,iBAAiB,EAAE,MAAM,EAAE,EAC3B,OAAO,EAAE,MAAM,EAAE,EACjB,OAAO,EAAE,MAAM,EAAE,GAChB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAsClC;AAED,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EACpD,YAAY,EAAE,MAAM,EAAE,GACrB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CA4BlC;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,gBAAgB,EAAE,MAAM,EACxB,eAAe,EAAE,MAAM,EAAE,GACxB;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAyClC;AAED,wBAAgB,mBAAmB,CACjC,eAAe,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,EACzD,eAAe,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,CAAC,GACnD;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CA4BlC"}