@lsctech/polaris 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 (316) hide show
  1. package/README.md +87 -0
  2. package/dist/__mocks__/tool-server-linear.js +34 -0
  3. package/dist/cli/adopt-approve.js +60 -0
  4. package/dist/cli/adopt-cognition.js +199 -0
  5. package/dist/cli/adopt-instructions.js +143 -0
  6. package/dist/cli/adopt-rules.js +169 -0
  7. package/dist/cli/adopt-scan.js +25 -0
  8. package/dist/cli/adopt-smartdocs.js +192 -0
  9. package/dist/cli/adoption-inventory.js +350 -0
  10. package/dist/cli/adoption-plan.js +222 -0
  11. package/dist/cli/args.js +28 -0
  12. package/dist/cli/args.test.js +30 -0
  13. package/dist/cli/branding.js +41 -0
  14. package/dist/cli/graph.js +358 -0
  15. package/dist/cli/index.js +127 -0
  16. package/dist/cli/index.test.js +162 -0
  17. package/dist/cli/init-detect.js +61 -0
  18. package/dist/cli/init.js +492 -0
  19. package/dist/cli/init.test.js +259 -0
  20. package/dist/cli/librarian.js +32 -0
  21. package/dist/cli/medic.js +96 -0
  22. package/dist/cli/startup.test.js +23 -0
  23. package/dist/cli/tracker.js +130 -0
  24. package/dist/cli/tracker.test.js +126 -0
  25. package/dist/cli/version.js +10 -0
  26. package/dist/cli/version.test.js +11 -0
  27. package/dist/cli/worker.js +287 -0
  28. package/dist/cluster-state/fixtures/test-clusters.json +19 -0
  29. package/dist/cluster-state/store.js +302 -0
  30. package/dist/cluster-state/store.test.js +145 -0
  31. package/dist/cluster-state/types.js +2 -0
  32. package/dist/cognition/archive.js +158 -0
  33. package/dist/cognition/closeout-librarian-types.js +161 -0
  34. package/dist/cognition/cognition.test.js +623 -0
  35. package/dist/cognition/index.js +41 -0
  36. package/dist/cognition/librarian-dispatch.js +391 -0
  37. package/dist/cognition/librarian-dispatch.test.js +247 -0
  38. package/dist/cognition/librarian-packet.js +313 -0
  39. package/dist/cognition/librarian-types.js +57 -0
  40. package/dist/cognition/route-cognition-delta.js +350 -0
  41. package/dist/cognition/summary-delta.js +279 -0
  42. package/dist/cognition/validate.js +162 -0
  43. package/dist/config/defaults.js +98 -0
  44. package/dist/config/doctor.js +273 -0
  45. package/dist/config/index.js +14 -0
  46. package/dist/config/loader.js +58 -0
  47. package/dist/config/provider-detect.js +60 -0
  48. package/dist/config/provider-detect.test.js +119 -0
  49. package/dist/config/schema.js +2 -0
  50. package/dist/config/show.js +44 -0
  51. package/dist/config/show.test.js +42 -0
  52. package/dist/config/validator.js +675 -0
  53. package/dist/config/validator.test.js +77 -0
  54. package/dist/docs/canon-check.js +334 -0
  55. package/dist/docs/canon-check.test.js +207 -0
  56. package/dist/docs/doctrine.js +133 -0
  57. package/dist/docs/doctrine.test.js +139 -0
  58. package/dist/docs/index.js +168 -0
  59. package/dist/docs/index.test.js +83 -0
  60. package/dist/docs/ingest.js +295 -0
  61. package/dist/docs/ingest.test.js +71 -0
  62. package/dist/docs/migrate.js +165 -0
  63. package/dist/docs/migrate.test.js +136 -0
  64. package/dist/docs/seed-instructions.js +147 -0
  65. package/dist/docs/seed-instructions.test.js +137 -0
  66. package/dist/docs/validate-instructions.js +267 -0
  67. package/dist/docs/validate-instructions.test.js +238 -0
  68. package/dist/finalize/artifact-policy.js +214 -0
  69. package/dist/finalize/artifact-policy.test.js +84 -0
  70. package/dist/finalize/delivery-integrity.js +141 -0
  71. package/dist/finalize/finalize.test.js +210 -0
  72. package/dist/finalize/github.js +41 -0
  73. package/dist/finalize/index.js +474 -0
  74. package/dist/finalize/linear.js +213 -0
  75. package/dist/finalize/run-report.js +47 -0
  76. package/dist/finalize/steps/01-map-update.js +11 -0
  77. package/dist/finalize/steps/02-map-validate.js +11 -0
  78. package/dist/finalize/steps/03-schema-validate.js +11 -0
  79. package/dist/finalize/steps/04-run-checks.js +118 -0
  80. package/dist/finalize/steps/05-generate-report.js +14 -0
  81. package/dist/finalize/steps/06-commit.js +39 -0
  82. package/dist/finalize/steps/07-push.js +10 -0
  83. package/dist/finalize/steps/08-create-pr.js +9 -0
  84. package/dist/finalize/steps/09-update-state.js +9 -0
  85. package/dist/finalize/steps/10-append-jsonl.js +23 -0
  86. package/dist/finalize/steps/11-update-linear.js +22 -0
  87. package/dist/finalize/steps/12-archive.js +21 -0
  88. package/dist/graph/adapter/c/adapter.js +45 -0
  89. package/dist/graph/adapter/c/extract.js +135 -0
  90. package/dist/graph/adapter/c/index.js +10 -0
  91. package/dist/graph/adapter/c/runtime.js +67 -0
  92. package/dist/graph/adapter/cpp/adapter.js +45 -0
  93. package/dist/graph/adapter/cpp/extract.js +159 -0
  94. package/dist/graph/adapter/cpp/index.js +10 -0
  95. package/dist/graph/adapter/cpp/runtime.js +61 -0
  96. package/dist/graph/adapter/csharp/adapter.js +45 -0
  97. package/dist/graph/adapter/csharp/extract.js +127 -0
  98. package/dist/graph/adapter/csharp/index.js +10 -0
  99. package/dist/graph/adapter/csharp/runtime.js +61 -0
  100. package/dist/graph/adapter/dart/adapter.js +56 -0
  101. package/dist/graph/adapter/dart/extract.js +130 -0
  102. package/dist/graph/adapter/dart/index.js +10 -0
  103. package/dist/graph/adapter/dart/runtime.js +61 -0
  104. package/dist/graph/adapter/go/adapter.js +45 -0
  105. package/dist/graph/adapter/go/extract.js +112 -0
  106. package/dist/graph/adapter/go/index.js +10 -0
  107. package/dist/graph/adapter/go/runtime.js +58 -0
  108. package/dist/graph/adapter/kotlin-java/extract-common.js +83 -0
  109. package/dist/graph/adapter/kotlin-java/index.js +15 -0
  110. package/dist/graph/adapter/kotlin-java/java-adapter.js +45 -0
  111. package/dist/graph/adapter/kotlin-java/java-extract.js +42 -0
  112. package/dist/graph/adapter/kotlin-java/kotlin-adapter.js +48 -0
  113. package/dist/graph/adapter/kotlin-java/kotlin-extract.js +58 -0
  114. package/dist/graph/adapter/kotlin-java/runtime.js +75 -0
  115. package/dist/graph/adapter/python/adapter.js +45 -0
  116. package/dist/graph/adapter/python/extract.js +121 -0
  117. package/dist/graph/adapter/python/index.js +10 -0
  118. package/dist/graph/adapter/python/runtime.js +70 -0
  119. package/dist/graph/adapter/registry.js +82 -0
  120. package/dist/graph/adapter/rust/adapter.js +45 -0
  121. package/dist/graph/adapter/rust/extract.js +110 -0
  122. package/dist/graph/adapter/rust/index.js +10 -0
  123. package/dist/graph/adapter/rust/runtime.js +74 -0
  124. package/dist/graph/adapter/shell/adapter.js +34 -0
  125. package/dist/graph/adapter/shell/extract.js +98 -0
  126. package/dist/graph/adapter/shell/index.js +8 -0
  127. package/dist/graph/adapter/svelte/adapter.js +91 -0
  128. package/dist/graph/adapter/svelte/extract.js +41 -0
  129. package/dist/graph/adapter/svelte/index.js +8 -0
  130. package/dist/graph/adapter/swift/adapter.js +45 -0
  131. package/dist/graph/adapter/swift/extract.js +120 -0
  132. package/dist/graph/adapter/swift/index.js +10 -0
  133. package/dist/graph/adapter/swift/runtime.js +70 -0
  134. package/dist/graph/adapter/types.js +2 -0
  135. package/dist/graph/adapter/typescript-javascript/adapter.js +72 -0
  136. package/dist/graph/adapter/typescript-javascript/extract.js +115 -0
  137. package/dist/graph/adapter/typescript-javascript/index.js +10 -0
  138. package/dist/graph/adapter/typescript-javascript/runtime.js +97 -0
  139. package/dist/graph/capability/index.js +105 -0
  140. package/dist/graph/governance.js +104 -0
  141. package/dist/graph/parser/extract.js +5 -0
  142. package/dist/graph/parser/loader.js +2 -0
  143. package/dist/graph/parser/pipeline.js +194 -0
  144. package/dist/graph/query/index.js +277 -0
  145. package/dist/graph/query/types.js +5 -0
  146. package/dist/graph/resolver/build-edges.js +211 -0
  147. package/dist/graph/resolver/index.js +23 -0
  148. package/dist/graph/resolver/resolve-imports.js +168 -0
  149. package/dist/graph/store/adapter.js +132 -0
  150. package/dist/graph/store/queries.js +124 -0
  151. package/dist/graph/store/types.js +4 -0
  152. package/dist/ignore/defaults.js +41 -0
  153. package/dist/ignore/parser.js +39 -0
  154. package/dist/lint/map-reference-validator.js +72 -0
  155. package/dist/loop/abort.js +188 -0
  156. package/dist/loop/abort.test.js +151 -0
  157. package/dist/loop/adapters/__tests__/terminal-cli.test.js +92 -0
  158. package/dist/loop/adapters/agent-subtask.js +137 -0
  159. package/dist/loop/adapters/agent-subtask.test.js +151 -0
  160. package/dist/loop/adapters/cli-subtask-bridge.js +108 -0
  161. package/dist/loop/adapters/index.js +9 -0
  162. package/dist/loop/adapters/registry.js +17 -0
  163. package/dist/loop/adapters/terminal-cli.js +403 -0
  164. package/dist/loop/adapters/types.js +2 -0
  165. package/dist/loop/adapters/worker-instructions.js +85 -0
  166. package/dist/loop/body-parser.js +226 -0
  167. package/dist/loop/bootstrap-packet.js +97 -0
  168. package/dist/loop/bootstrap-packet.test.js +171 -0
  169. package/dist/loop/branch-governance.js +54 -0
  170. package/dist/loop/budget.js +63 -0
  171. package/dist/loop/budget.test.js +163 -0
  172. package/dist/loop/checkpoint.js +325 -0
  173. package/dist/loop/compact-return.js +59 -0
  174. package/dist/loop/continue.js +645 -0
  175. package/dist/loop/continue.test.js +337 -0
  176. package/dist/loop/dispatch-boundary.js +335 -0
  177. package/dist/loop/dispatch-state.js +223 -0
  178. package/dist/loop/dispatch-state.test.js +186 -0
  179. package/dist/loop/dispatch.js +1236 -0
  180. package/dist/loop/dispatch.test.js +499 -0
  181. package/dist/loop/ephemeral-smoke.test.js +160 -0
  182. package/dist/loop/evidence-backfill.js +216 -0
  183. package/dist/loop/execution-adapter.js +141 -0
  184. package/dist/loop/execution-adapter.test.js +66 -0
  185. package/dist/loop/finalize-evidence.js +169 -0
  186. package/dist/loop/git-custody.js +250 -0
  187. package/dist/loop/impl-packet-input.js +38 -0
  188. package/dist/loop/index.js +270 -0
  189. package/dist/loop/ledger.js +49 -0
  190. package/dist/loop/ledger.test.js +127 -0
  191. package/dist/loop/lifecycle-dispatch.js +348 -0
  192. package/dist/loop/lifecycle-dispatch.test.js +318 -0
  193. package/dist/loop/lifecycle.js +93 -0
  194. package/dist/loop/lifecycle.test.js +150 -0
  195. package/dist/loop/orphan-recovery.js +276 -0
  196. package/dist/loop/orphan-recovery.test.js +236 -0
  197. package/dist/loop/parent.js +1566 -0
  198. package/dist/loop/parent.test.js +738 -0
  199. package/dist/loop/provider-sealed-packet.test.js +164 -0
  200. package/dist/loop/resume.js +295 -0
  201. package/dist/loop/resume.test.js +172 -0
  202. package/dist/loop/run-bootstrap.js +234 -0
  203. package/dist/loop/run-preflight.js +203 -0
  204. package/dist/loop/status.js +665 -0
  205. package/dist/loop/status.test.js +235 -0
  206. package/dist/loop/wait.js +86 -0
  207. package/dist/loop/worker-packet.js +406 -0
  208. package/dist/loop/worker-packet.test.js +243 -0
  209. package/dist/loop/worker-prompt.js +260 -0
  210. package/dist/loop/worker-prompt.test.js +247 -0
  211. package/dist/loop/worker.js +498 -0
  212. package/dist/loop/worker.test.js +372 -0
  213. package/dist/map/atlas.js +77 -0
  214. package/dist/map/backfill.js +171 -0
  215. package/dist/map/backfill.test.js +120 -0
  216. package/dist/map/index.js +255 -0
  217. package/dist/map/inference.js +73 -0
  218. package/dist/map/inference.test.js +35 -0
  219. package/dist/map/query.js +157 -0
  220. package/dist/map/query.test.js +174 -0
  221. package/dist/map/update.js +355 -0
  222. package/dist/map/update.test.js +67 -0
  223. package/dist/map/validate.js +153 -0
  224. package/dist/map/validate.test.js +90 -0
  225. package/dist/map/welfare.js +86 -0
  226. package/dist/mcp/lib/invoke.js +35 -0
  227. package/dist/mcp/lib/redact.js +24 -0
  228. package/dist/mcp/lib/redact.test.js +112 -0
  229. package/dist/mcp/lib/root.js +41 -0
  230. package/dist/mcp/lib/root.test.js +114 -0
  231. package/dist/mcp/server.js +15 -0
  232. package/dist/mcp/tools/claim-child.js +119 -0
  233. package/dist/mcp/tools/claim-child.test.js +69 -0
  234. package/dist/mcp/tools/current-state.js +73 -0
  235. package/dist/mcp/tools/current-state.test.js +114 -0
  236. package/dist/mcp/tools/dispatch-result.js +186 -0
  237. package/dist/mcp/tools/dispatch-result.test.js +109 -0
  238. package/dist/mcp/tools/index.js +222 -0
  239. package/dist/mcp/tools/index.test.js +172 -0
  240. package/dist/mcp/tools/linear.js +74 -0
  241. package/dist/mcp/tools/loop-continue.js +159 -0
  242. package/dist/mcp/tools/loop-continue.test.js +186 -0
  243. package/dist/mcp/tools/loop-dry-run.js +15 -0
  244. package/dist/mcp/tools/status.js +65 -0
  245. package/dist/medic/chart-id.js +75 -0
  246. package/dist/medic/chart-schema.js +139 -0
  247. package/dist/runs/index.js +119 -0
  248. package/dist/runs/index.test.js +184 -0
  249. package/dist/runs/ledger-tail.js +15 -0
  250. package/dist/runs/list.js +29 -0
  251. package/dist/runs/reconcile.js +74 -0
  252. package/dist/runs/show.js +10 -0
  253. package/dist/runtime/audit/logger.js +15 -0
  254. package/dist/runtime/audit/reader.js +42 -0
  255. package/dist/runtime/checkpoint.js +89 -0
  256. package/dist/runtime/continuation/confirmed.js +225 -0
  257. package/dist/runtime/continuation/confirmed.test.js +421 -0
  258. package/dist/runtime/continuation/dry-run.js +74 -0
  259. package/dist/runtime/execution-window.js +106 -0
  260. package/dist/runtime/scheduling/child-selector.js +16 -0
  261. package/dist/runtime/state.js +43 -0
  262. package/dist/runtime/status.js +46 -0
  263. package/dist/runtime/verification/envelope.js +80 -0
  264. package/dist/runtime/verification/fingerprint.js +26 -0
  265. package/dist/skill-packet/cli.test.js +105 -0
  266. package/dist/skill-packet/generator.js +225 -0
  267. package/dist/skill-packet/generator.test.js +159 -0
  268. package/dist/skill-packet/index.js +49 -0
  269. package/dist/skill-packet/types.js +2 -0
  270. package/dist/smartdocs-engine/audit.js +194 -0
  271. package/dist/smartdocs-engine/audit.test.js +122 -0
  272. package/dist/smartdocs-engine/canon-check.js +340 -0
  273. package/dist/smartdocs-engine/canon-check.test.js +234 -0
  274. package/dist/smartdocs-engine/doctrine.js +633 -0
  275. package/dist/smartdocs-engine/doctrine.test.js +374 -0
  276. package/dist/smartdocs-engine/index.js +456 -0
  277. package/dist/smartdocs-engine/index.test.js +82 -0
  278. package/dist/smartdocs-engine/ingest.js +495 -0
  279. package/dist/smartdocs-engine/ingest.test.js +163 -0
  280. package/dist/smartdocs-engine/migrate.js +217 -0
  281. package/dist/smartdocs-engine/migrate.test.js +200 -0
  282. package/dist/smartdocs-engine/seed-instructions.js +335 -0
  283. package/dist/smartdocs-engine/seed-instructions.test.js +275 -0
  284. package/dist/smartdocs-engine/smartdoc-ignore.js +258 -0
  285. package/dist/smartdocs-engine/smartdoc-ignore.test.js +146 -0
  286. package/dist/smartdocs-engine/validate-instructions.js +366 -0
  287. package/dist/smartdocs-engine/validate-instructions.test.js +283 -0
  288. package/dist/tracker/adapters/github/index.js +305 -0
  289. package/dist/tracker/adapters/jira/index.js +293 -0
  290. package/dist/tracker/adapters/linear/http-errors.test.js +51 -0
  291. package/dist/tracker/adapters/linear/index.js +621 -0
  292. package/dist/tracker/adapters/linear/index.test.js +238 -0
  293. package/dist/tracker/adapters/linear.js +50 -0
  294. package/dist/tracker/adapters/local/index.js +10 -0
  295. package/dist/tracker/adapters/local-file/index.js +159 -0
  296. package/dist/tracker/adapters/mcp-bridge.js +158 -0
  297. package/dist/tracker/adapters/mcp-bridge.test.js +12 -0
  298. package/dist/tracker/adapters/spec/index.js +146 -0
  299. package/dist/tracker/capabilities.js +2 -0
  300. package/dist/tracker/index.js +49 -0
  301. package/dist/tracker/lifecycle-policy.js +139 -0
  302. package/dist/tracker/lifecycle-transition.js +164 -0
  303. package/dist/tracker/local-graph.js +98 -0
  304. package/dist/tracker/migration.js +56 -0
  305. package/dist/tracker/schema.js +86 -0
  306. package/dist/tracker/sync/index.js +404 -0
  307. package/dist/tracker/sync/queue-store.js +95 -0
  308. package/dist/tracker/sync/queue-store.test.js +104 -0
  309. package/dist/tracker/types.js +11 -0
  310. package/dist/types/linear.js +3 -0
  311. package/dist/types/result-packet.js +12 -0
  312. package/dist/types/runtime-state.js +2 -0
  313. package/dist/types/work-contract.js +2 -0
  314. package/dist/utils/monotonic-timestamp.js +13 -0
  315. package/dist/utils/monotonic-timestamp.test.js +19 -0
  316. package/package.json +64 -0
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.JavaAdapter = void 0;
4
+ exports.createJavaAdapter = createJavaAdapter;
5
+ const node_path_1 = require("node:path");
6
+ const java_extract_js_1 = require("./java-extract.js");
7
+ const runtime_js_1 = require("./runtime.js");
8
+ const DEFAULT_EXTENSIONS = [".java"];
9
+ class JavaAdapter {
10
+ loadRuntime;
11
+ languageId = "java";
12
+ fileExtensions = DEFAULT_EXTENSIONS;
13
+ confidence = "high";
14
+ limitations = [
15
+ "Extracts declaration-level symbols only (classes/interfaces, methods, imports).",
16
+ "Does not resolve overloads, inherited methods, or semantic type relationships.",
17
+ ];
18
+ constructor(loadRuntime) {
19
+ this.loadRuntime = loadRuntime;
20
+ }
21
+ async extractSymbols(filePath, source) {
22
+ const language = detectLanguage(filePath);
23
+ if (!language) {
24
+ throw new Error(`Unsupported Java file extension: ${(0, node_path_1.extname)(filePath)}`);
25
+ }
26
+ const runtime = await this.loadRuntime();
27
+ const tree = runtime.parse(source, language);
28
+ return (0, java_extract_js_1.extractJavaSymbolsFromTree)(tree);
29
+ }
30
+ resolveImportSpecifier(specifier, _context) {
31
+ const trimmed = specifier.trim();
32
+ if (trimmed.length === 0) {
33
+ return null;
34
+ }
35
+ return trimmed;
36
+ }
37
+ }
38
+ exports.JavaAdapter = JavaAdapter;
39
+ function createJavaAdapter(options = {}) {
40
+ return new JavaAdapter(options.loadRuntime ?? runtime_js_1.loadTreeSitterRuntime);
41
+ }
42
+ function detectLanguage(filePath) {
43
+ const extension = (0, node_path_1.extname)(filePath).toLowerCase();
44
+ return extension === ".java" ? "java" : null;
45
+ }
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractJavaSymbolsFromTree = extractJavaSymbolsFromTree;
4
+ const extract_common_js_1 = require("./extract-common.js");
5
+ function extractJavaSymbolsFromTree(tree) {
6
+ const symbols = [];
7
+ (0, extract_common_js_1.walkNodes)(tree.rootNode, (node) => {
8
+ const symbol = toExtractedSymbol(node);
9
+ if (symbol) {
10
+ symbols.push(symbol);
11
+ }
12
+ });
13
+ return {
14
+ language: "java",
15
+ symbols: (0, extract_common_js_1.dedupeAndSortSymbols)(symbols),
16
+ };
17
+ }
18
+ function toExtractedSymbol(node) {
19
+ if (node.type === "import_declaration") {
20
+ return (0, extract_common_js_1.createSymbol)(node, "import", extractImportName(node), null, false);
21
+ }
22
+ if (node.type === "class_declaration" || node.type === "interface_declaration") {
23
+ return (0, extract_common_js_1.createSymbol)(node, "class", extractTypeName(node), null, isPublic(node.text));
24
+ }
25
+ if (node.type === "method_declaration") {
26
+ return (0, extract_common_js_1.createSymbol)(node, "method", extractMethodName(node), (0, extract_common_js_1.sanitizeSignature)(node.text), isPublic(node.text));
27
+ }
28
+ return null;
29
+ }
30
+ function extractTypeName(node) {
31
+ return (0, extract_common_js_1.extractDeclaredName)(node, IDENTIFIER_NODE_TYPES, /\b(?:class|interface)\s+([A-Za-z_][A-Za-z0-9_]*)/);
32
+ }
33
+ function extractMethodName(node) {
34
+ return (0, extract_common_js_1.extractDeclaredName)(node, IDENTIFIER_NODE_TYPES, /\b([A-Za-z_][A-Za-z0-9_]*)\s*\(/);
35
+ }
36
+ function extractImportName(node) {
37
+ return node.text.match(/^\s*import\s+(?:static\s+)?([A-Za-z_][A-Za-z0-9_.$]*(?:\.\*)?)\s*;/m)?.[1] ?? null;
38
+ }
39
+ function isPublic(text) {
40
+ return /\bpublic\b/.test(text);
41
+ }
42
+ const IDENTIFIER_NODE_TYPES = new Set(["identifier", "type_identifier"]);
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KotlinAdapter = void 0;
4
+ exports.createKotlinAdapter = createKotlinAdapter;
5
+ const node_path_1 = require("node:path");
6
+ const kotlin_extract_js_1 = require("./kotlin-extract.js");
7
+ const runtime_js_1 = require("./runtime.js");
8
+ const DEFAULT_EXTENSIONS = [".kt", ".kts"];
9
+ class KotlinAdapter {
10
+ loadRuntime;
11
+ languageId = "kotlin";
12
+ fileExtensions = DEFAULT_EXTENSIONS;
13
+ confidence = "medium";
14
+ limitations = [
15
+ "Extracts declaration-level symbols only (classes/objects, functions/methods, imports).",
16
+ "Uses tree-sitter-kotlin@0.3.x; newer language constructs may parse incompletely until grammar updates.",
17
+ ];
18
+ constructor(loadRuntime) {
19
+ this.loadRuntime = loadRuntime;
20
+ }
21
+ async extractSymbols(filePath, source) {
22
+ const language = detectLanguage(filePath);
23
+ if (!language) {
24
+ throw new Error(`Unsupported Kotlin file extension: ${(0, node_path_1.extname)(filePath)}`);
25
+ }
26
+ const runtime = await this.loadRuntime();
27
+ const tree = runtime.parse(source, language);
28
+ return (0, kotlin_extract_js_1.extractKotlinSymbolsFromTree)(tree);
29
+ }
30
+ resolveImportSpecifier(specifier, _context) {
31
+ const trimmed = specifier.trim();
32
+ if (trimmed.length === 0) {
33
+ return null;
34
+ }
35
+ return trimmed;
36
+ }
37
+ }
38
+ exports.KotlinAdapter = KotlinAdapter;
39
+ function createKotlinAdapter(options = {}) {
40
+ return new KotlinAdapter(options.loadRuntime ?? runtime_js_1.loadTreeSitterRuntime);
41
+ }
42
+ function detectLanguage(filePath) {
43
+ const extension = (0, node_path_1.extname)(filePath).toLowerCase();
44
+ if (extension === ".kt" || extension === ".kts") {
45
+ return "kotlin";
46
+ }
47
+ return null;
48
+ }
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractKotlinSymbolsFromTree = extractKotlinSymbolsFromTree;
4
+ const extract_common_js_1 = require("./extract-common.js");
5
+ function extractKotlinSymbolsFromTree(tree) {
6
+ const symbols = [];
7
+ (0, extract_common_js_1.walkNodes)(tree.rootNode, (node) => {
8
+ const symbol = toExtractedSymbol(node);
9
+ if (symbol) {
10
+ symbols.push(symbol);
11
+ }
12
+ });
13
+ return {
14
+ language: "kotlin",
15
+ symbols: (0, extract_common_js_1.dedupeAndSortSymbols)(symbols),
16
+ };
17
+ }
18
+ function toExtractedSymbol(node) {
19
+ if (node.type === "import_header") {
20
+ return (0, extract_common_js_1.createSymbol)(node, "import", extractImportName(node), null, false);
21
+ }
22
+ if (node.type === "class_declaration" || node.type === "object_declaration") {
23
+ return (0, extract_common_js_1.createSymbol)(node, "class", extractTypeName(node), null, isExported(node.text));
24
+ }
25
+ if (node.type === "function_declaration") {
26
+ const kind = (0, extract_common_js_1.isMethodContext)(node, METHOD_CONTAINER_NODE_TYPES) ? "method" : "function";
27
+ return (0, extract_common_js_1.createSymbol)(node, kind, extractFunctionName(node), (0, extract_common_js_1.sanitizeSignature)(node.text), isExported(node.text));
28
+ }
29
+ return null;
30
+ }
31
+ function extractTypeName(node) {
32
+ return (0, extract_common_js_1.extractDeclaredName)(node, IDENTIFIER_NODE_TYPES, /\b(?:class|object)\s+([A-Za-z_][A-Za-z0-9_]*)/);
33
+ }
34
+ function extractFunctionName(node) {
35
+ return (0, extract_common_js_1.extractDeclaredName)(node, IDENTIFIER_NODE_TYPES, /\bfun\s+([A-Za-z_][A-Za-z0-9_]*)\s*\(/);
36
+ }
37
+ function extractImportName(node) {
38
+ return node.text.match(/^\s*import\s+([A-Za-z_][A-Za-z0-9_.*]*)\b/m)?.[1] ?? null;
39
+ }
40
+ function isExported(text) {
41
+ const headerText = getNodeHeader(text);
42
+ return !/\b(?:private|internal|protected)\b/.test(headerText);
43
+ }
44
+ function getNodeHeader(text) {
45
+ const openBrace = text.indexOf("{");
46
+ if (openBrace !== -1) {
47
+ return text.substring(0, openBrace);
48
+ }
49
+ return text;
50
+ }
51
+ const IDENTIFIER_NODE_TYPES = new Set(["identifier", "simple_identifier", "type_identifier"]);
52
+ const METHOD_CONTAINER_NODE_TYPES = new Set([
53
+ "class_declaration",
54
+ "object_declaration",
55
+ "class_body",
56
+ "class_member_declarations",
57
+ "companion_object",
58
+ ]);
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadTreeSitterRuntime = loadTreeSitterRuntime;
4
+ let cachedRuntime = null;
5
+ async function loadTreeSitterRuntime() {
6
+ if (cachedRuntime) {
7
+ return cachedRuntime;
8
+ }
9
+ const loaded = await loadTreeSitterModules();
10
+ const parserByLanguage = new Map();
11
+ cachedRuntime = {
12
+ parse(source, language) {
13
+ const parser = getOrCreateParser(language, loaded, parserByLanguage);
14
+ return parser.parse(source);
15
+ },
16
+ };
17
+ return cachedRuntime;
18
+ }
19
+ function getOrCreateParser(language, loaded, parserByLanguage) {
20
+ const existing = parserByLanguage.get(language);
21
+ if (existing) {
22
+ return existing;
23
+ }
24
+ const parser = new loaded.parserConstructor();
25
+ parser.setLanguage(loaded.languages[language]);
26
+ parserByLanguage.set(language, parser);
27
+ return parser;
28
+ }
29
+ async function loadTreeSitterModules() {
30
+ const dynamicImport = createDynamicImporter();
31
+ const [treeSitterModule, javaModule, kotlinModule] = await Promise.all([
32
+ dynamicImport("tree-sitter"),
33
+ dynamicImport("tree-sitter-java"),
34
+ dynamicImport("tree-sitter-kotlin"),
35
+ ]);
36
+ return {
37
+ parserConstructor: resolveParserConstructor(treeSitterModule),
38
+ languages: {
39
+ java: resolveGrammar(javaModule, "tree-sitter-java"),
40
+ kotlin: resolveGrammar(kotlinModule, "tree-sitter-kotlin"),
41
+ },
42
+ };
43
+ }
44
+ function createDynamicImporter() {
45
+ const importer = new Function("specifier", "return import(specifier);");
46
+ return (specifier) => importer(specifier);
47
+ }
48
+ function resolveParserConstructor(moduleValue) {
49
+ if (typeof moduleValue === "function") {
50
+ return moduleValue;
51
+ }
52
+ if (moduleValue && typeof moduleValue === "object") {
53
+ const directDefault = moduleValue.default;
54
+ if (typeof directDefault === "function") {
55
+ return directDefault;
56
+ }
57
+ const namedParser = moduleValue.Parser;
58
+ if (typeof namedParser === "function") {
59
+ return namedParser;
60
+ }
61
+ }
62
+ throw new Error("Unable to resolve tree-sitter parser constructor.");
63
+ }
64
+ function resolveGrammar(moduleValue, packageName) {
65
+ if (moduleValue && typeof moduleValue === "object") {
66
+ const directDefault = moduleValue.default;
67
+ if (directDefault) {
68
+ return directDefault;
69
+ }
70
+ }
71
+ if (moduleValue) {
72
+ return moduleValue;
73
+ }
74
+ throw new Error(`Unable to resolve ${packageName} grammar.`);
75
+ }
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PythonAdapter = void 0;
4
+ exports.createPythonAdapter = createPythonAdapter;
5
+ const node_path_1 = require("node:path");
6
+ const extract_js_1 = require("./extract.js");
7
+ const runtime_js_1 = require("./runtime.js");
8
+ const DEFAULT_EXTENSIONS = [".py", ".pyi"];
9
+ class PythonAdapter {
10
+ loadRuntime;
11
+ languageId = "python";
12
+ fileExtensions = DEFAULT_EXTENSIONS;
13
+ confidence = "high";
14
+ limitations = [
15
+ "Extracts declaration-level symbols only (classes, functions, methods, imports).",
16
+ "Does not perform runtime import resolution or call/reference extraction.",
17
+ ];
18
+ constructor(loadRuntime) {
19
+ this.loadRuntime = loadRuntime;
20
+ }
21
+ async extractSymbols(filePath, source) {
22
+ const language = detectLanguage(filePath);
23
+ if (!language) {
24
+ throw new Error(`Unsupported Python file extension: ${(0, node_path_1.extname)(filePath)}`);
25
+ }
26
+ const runtime = await this.loadRuntime();
27
+ const tree = runtime.parse(source, language);
28
+ return (0, extract_js_1.extractPythonSymbolsFromTree)(tree);
29
+ }
30
+ resolveImportSpecifier(specifier, _context) {
31
+ const trimmed = specifier.trim();
32
+ if (trimmed.length === 0) {
33
+ return null;
34
+ }
35
+ return trimmed;
36
+ }
37
+ }
38
+ exports.PythonAdapter = PythonAdapter;
39
+ function createPythonAdapter(options = {}) {
40
+ return new PythonAdapter(options.loadRuntime ?? runtime_js_1.loadTreeSitterRuntime);
41
+ }
42
+ function detectLanguage(filePath) {
43
+ const extension = (0, node_path_1.extname)(filePath).toLowerCase();
44
+ return extension === ".py" || extension === ".pyi" ? "python" : null;
45
+ }
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.extractPythonSymbolsFromTree = extractPythonSymbolsFromTree;
4
+ function extractPythonSymbolsFromTree(tree) {
5
+ const symbols = [];
6
+ walkNode(tree.rootNode, symbols, 0, 0);
7
+ const deduped = dedupeSymbols(symbols);
8
+ deduped.sort(compareExtractedSymbols);
9
+ return {
10
+ language: "python",
11
+ symbols: deduped,
12
+ };
13
+ }
14
+ function walkNode(node, output, classDepth, functionDepth) {
15
+ const current = toExtractedSymbols(node, classDepth, functionDepth);
16
+ if (current.length > 0) {
17
+ output.push(...current);
18
+ }
19
+ const nextClassDepth = node.type === "class_definition" ? classDepth + 1 : classDepth;
20
+ const nextFunctionDepth = node.type === "function_definition" ? functionDepth + 1 : functionDepth;
21
+ for (const child of node.namedChildren ?? []) {
22
+ walkNode(child, output, nextClassDepth, nextFunctionDepth);
23
+ }
24
+ }
25
+ function toExtractedSymbols(node, classDepth, functionDepth) {
26
+ if (node.type === "class_definition") {
27
+ const name = extractClassName(node);
28
+ const symbol = buildSymbol(node, "class", name, null);
29
+ return symbol ? [symbol] : [];
30
+ }
31
+ if (node.type === "function_definition") {
32
+ const name = extractFunctionName(node);
33
+ const kind = (classDepth > 0 && functionDepth === 0) ? "method" : "function";
34
+ const signature = sanitizeSignature(node.text);
35
+ const symbol = buildSymbol(node, kind, name, signature);
36
+ return symbol ? [symbol] : [];
37
+ }
38
+ if (node.type === "import_statement") {
39
+ return extractImportNames(node).flatMap((name) => {
40
+ const symbol = buildSymbol(node, "import", name, null);
41
+ return symbol ? [symbol] : [];
42
+ });
43
+ }
44
+ if (node.type === "import_from_statement") {
45
+ const symbol = buildSymbol(node, "import", extractFromImportName(node), null);
46
+ return symbol ? [symbol] : [];
47
+ }
48
+ return [];
49
+ }
50
+ function buildSymbol(node, kind, name, signature) {
51
+ if (!name) {
52
+ return null;
53
+ }
54
+ return {
55
+ kind,
56
+ name,
57
+ signature,
58
+ exported: !name.startsWith("_"),
59
+ startLine: node.startPosition.row + 1,
60
+ startColumn: node.startPosition.column,
61
+ endLine: node.endPosition.row + 1,
62
+ endColumn: node.endPosition.column,
63
+ };
64
+ }
65
+ function extractClassName(node) {
66
+ const byField = node.childForFieldName?.("name");
67
+ if (byField?.text?.trim()) {
68
+ return byField.text.trim();
69
+ }
70
+ const byText = node.text.match(/\bclass\s+([A-Za-z_][A-Za-z0-9_]*)/);
71
+ return byText?.[1] ?? null;
72
+ }
73
+ function extractFunctionName(node) {
74
+ const byField = node.childForFieldName?.("name");
75
+ if (byField?.text?.trim()) {
76
+ return byField.text.trim();
77
+ }
78
+ const byText = node.text.match(/\bdef\s+([A-Za-z_][A-Za-z0-9_]*)\s*\(/);
79
+ return byText?.[1] ?? null;
80
+ }
81
+ function extractImportNames(node) {
82
+ const byText = node.text.match(/^\s*import\s+(.+)$/m)?.[1];
83
+ if (!byText) {
84
+ return [];
85
+ }
86
+ return byText
87
+ .split(",")
88
+ .map((part) => part.trim().replace(/\s+as\s+[A-Za-z_][A-Za-z0-9_]*$/, ""))
89
+ .filter((part) => part.length > 0);
90
+ }
91
+ function extractFromImportName(node) {
92
+ const byText = node.text.match(/^\s*from\s+([.\w]+)\s+import\b/m);
93
+ return byText?.[1] ?? null;
94
+ }
95
+ function sanitizeSignature(signature) {
96
+ const compact = signature.replace(/\s+/g, " ").trim();
97
+ return compact.length === 0 ? null : compact;
98
+ }
99
+ function dedupeSymbols(symbols) {
100
+ const byFingerprint = new Map();
101
+ for (const symbol of symbols) {
102
+ const fingerprint = [
103
+ symbol.kind,
104
+ symbol.name,
105
+ symbol.startLine,
106
+ symbol.startColumn,
107
+ symbol.endLine,
108
+ symbol.endColumn,
109
+ ].join(":");
110
+ byFingerprint.set(fingerprint, symbol);
111
+ }
112
+ return Array.from(byFingerprint.values());
113
+ }
114
+ function compareExtractedSymbols(left, right) {
115
+ return (left.startLine - right.startLine ||
116
+ left.startColumn - right.startColumn ||
117
+ left.endLine - right.endLine ||
118
+ left.endColumn - right.endColumn ||
119
+ left.kind.localeCompare(right.kind) ||
120
+ left.name.localeCompare(right.name));
121
+ }
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadTreeSitterRuntime = exports.extractPythonSymbolsFromTree = exports.createPythonAdapter = exports.PythonAdapter = void 0;
4
+ var adapter_js_1 = require("./adapter.js");
5
+ Object.defineProperty(exports, "PythonAdapter", { enumerable: true, get: function () { return adapter_js_1.PythonAdapter; } });
6
+ Object.defineProperty(exports, "createPythonAdapter", { enumerable: true, get: function () { return adapter_js_1.createPythonAdapter; } });
7
+ var extract_js_1 = require("./extract.js");
8
+ Object.defineProperty(exports, "extractPythonSymbolsFromTree", { enumerable: true, get: function () { return extract_js_1.extractPythonSymbolsFromTree; } });
9
+ var runtime_js_1 = require("./runtime.js");
10
+ Object.defineProperty(exports, "loadTreeSitterRuntime", { enumerable: true, get: function () { return runtime_js_1.loadTreeSitterRuntime; } });
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.loadTreeSitterRuntime = loadTreeSitterRuntime;
4
+ let cachedRuntime = null;
5
+ let runtimeInitPromise = null;
6
+ async function loadTreeSitterRuntime() {
7
+ if (cachedRuntime) {
8
+ return cachedRuntime;
9
+ }
10
+ if (runtimeInitPromise) {
11
+ return await runtimeInitPromise;
12
+ }
13
+ runtimeInitPromise = (async () => {
14
+ const loaded = await loadTreeSitterModules();
15
+ const parser = new loaded.parserConstructor();
16
+ parser.setLanguage(loaded.language);
17
+ const runtime = {
18
+ parse(source) {
19
+ return parser.parse(source);
20
+ },
21
+ };
22
+ cachedRuntime = runtime;
23
+ runtimeInitPromise = null;
24
+ return runtime;
25
+ })();
26
+ return await runtimeInitPromise;
27
+ }
28
+ async function loadTreeSitterModules() {
29
+ const dynamicImport = createDynamicImporter();
30
+ const [treeSitterModule, pythonModule] = await Promise.all([
31
+ dynamicImport("tree-sitter"),
32
+ dynamicImport("tree-sitter-python"),
33
+ ]);
34
+ return {
35
+ parserConstructor: resolveParserConstructor(treeSitterModule),
36
+ language: resolveGrammar(pythonModule, "tree-sitter-python"),
37
+ };
38
+ }
39
+ function createDynamicImporter() {
40
+ const importer = new Function("specifier", "return import(specifier);");
41
+ return (specifier) => importer(specifier);
42
+ }
43
+ function resolveParserConstructor(moduleValue) {
44
+ if (typeof moduleValue === "function") {
45
+ return moduleValue;
46
+ }
47
+ if (moduleValue && typeof moduleValue === "object") {
48
+ const directDefault = moduleValue.default;
49
+ if (typeof directDefault === "function") {
50
+ return directDefault;
51
+ }
52
+ const namedParser = moduleValue.Parser;
53
+ if (typeof namedParser === "function") {
54
+ return namedParser;
55
+ }
56
+ }
57
+ throw new Error("Unable to resolve tree-sitter parser constructor.");
58
+ }
59
+ function resolveGrammar(moduleValue, packageName) {
60
+ if (moduleValue && typeof moduleValue === "object") {
61
+ const directDefault = moduleValue.default;
62
+ if (directDefault) {
63
+ return directDefault;
64
+ }
65
+ }
66
+ if (moduleValue) {
67
+ return moduleValue;
68
+ }
69
+ throw new Error(`Unable to resolve ${packageName} grammar.`);
70
+ }
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GraphAdapterRegistry = void 0;
4
+ exports.getDefaultAdapterRegistry = getDefaultAdapterRegistry;
5
+ const index_js_1 = require("./c/index.js");
6
+ const index_js_2 = require("./cpp/index.js");
7
+ const index_js_3 = require("./csharp/index.js");
8
+ const index_js_4 = require("./dart/index.js");
9
+ const index_js_5 = require("./go/index.js");
10
+ const index_js_6 = require("./kotlin-java/index.js");
11
+ const index_js_7 = require("./python/index.js");
12
+ const index_js_8 = require("./rust/index.js");
13
+ const index_js_9 = require("./shell/index.js");
14
+ const index_js_10 = require("./svelte/index.js");
15
+ const index_js_11 = require("./swift/index.js");
16
+ const index_js_12 = require("./typescript-javascript/index.js");
17
+ class GraphAdapterRegistry {
18
+ adaptersByLanguage = new Map();
19
+ adaptersByExtension = new Map();
20
+ register(adapter) {
21
+ if (this.adaptersByLanguage.has(adapter.languageId)) {
22
+ throw new Error(`Language adapter already registered: ${adapter.languageId}`);
23
+ }
24
+ // Validate all extensions first before mutating state
25
+ const normalizedExtensions = [];
26
+ for (const extension of adapter.fileExtensions) {
27
+ const normalized = normalizeExtension(extension);
28
+ const existing = this.adaptersByExtension.get(normalized);
29
+ if (existing) {
30
+ throw new Error(`File extension ${normalized} is already handled by adapter ${existing.languageId}`);
31
+ }
32
+ normalizedExtensions.push(normalized);
33
+ }
34
+ // Only mutate state after validation completes
35
+ this.adaptersByLanguage.set(adapter.languageId, adapter);
36
+ for (const normalized of normalizedExtensions) {
37
+ this.adaptersByExtension.set(normalized, adapter);
38
+ }
39
+ }
40
+ getForExtension(extension) {
41
+ if (!extension || extension.trim().length === 0) {
42
+ return null;
43
+ }
44
+ return this.adaptersByExtension.get(normalizeExtension(extension)) ?? null;
45
+ }
46
+ getSupportedExtensions() {
47
+ return Array.from(this.adaptersByExtension.keys()).sort((left, right) => left.localeCompare(right));
48
+ }
49
+ getAll() {
50
+ return Array.from(this.adaptersByLanguage.values());
51
+ }
52
+ }
53
+ exports.GraphAdapterRegistry = GraphAdapterRegistry;
54
+ let defaultRegistry = null;
55
+ function getDefaultAdapterRegistry() {
56
+ if (defaultRegistry) {
57
+ return defaultRegistry;
58
+ }
59
+ const registry = new GraphAdapterRegistry();
60
+ registry.register((0, index_js_12.createTypeScriptJavaScriptAdapter)());
61
+ registry.register((0, index_js_1.createCAdapter)());
62
+ registry.register((0, index_js_2.createCppAdapter)());
63
+ registry.register((0, index_js_3.createCSharpAdapter)());
64
+ registry.register((0, index_js_4.createDartAdapter)());
65
+ registry.register((0, index_js_5.createGoAdapter)());
66
+ registry.register((0, index_js_6.createJavaAdapter)());
67
+ registry.register((0, index_js_6.createKotlinAdapter)());
68
+ registry.register((0, index_js_7.createPythonAdapter)());
69
+ registry.register((0, index_js_8.createRustAdapter)());
70
+ registry.register((0, index_js_9.createShellAdapter)());
71
+ registry.register((0, index_js_10.createSvelteAdapter)());
72
+ registry.register((0, index_js_11.createSwiftAdapter)());
73
+ defaultRegistry = registry;
74
+ return defaultRegistry;
75
+ }
76
+ function normalizeExtension(extension) {
77
+ const trimmed = extension.trim().toLowerCase();
78
+ if (trimmed.length === 0) {
79
+ throw new Error("Adapter extension cannot be empty.");
80
+ }
81
+ return trimmed.startsWith(".") ? trimmed : `.${trimmed}`;
82
+ }
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RustAdapter = void 0;
4
+ exports.createRustAdapter = createRustAdapter;
5
+ const node_path_1 = require("node:path");
6
+ const extract_js_1 = require("./extract.js");
7
+ const runtime_js_1 = require("./runtime.js");
8
+ const DEFAULT_EXTENSIONS = [".rs"];
9
+ class RustAdapter {
10
+ loadRuntime;
11
+ languageId = "rust";
12
+ fileExtensions = DEFAULT_EXTENSIONS;
13
+ confidence = "high";
14
+ limitations = [
15
+ "Extracts declaration-level symbols only (types, functions, impl methods, use declarations).",
16
+ "Does not model lifetimes/generics as separate symbols or resolve call/reference edges.",
17
+ ];
18
+ constructor(loadRuntime) {
19
+ this.loadRuntime = loadRuntime;
20
+ }
21
+ async extractSymbols(filePath, source) {
22
+ const language = detectLanguage(filePath);
23
+ if (!language) {
24
+ throw new Error(`Unsupported Rust file extension: ${(0, node_path_1.extname)(filePath)}`);
25
+ }
26
+ const runtime = await this.loadRuntime();
27
+ const tree = runtime.parse(source, language);
28
+ return (0, extract_js_1.extractRustSymbolsFromTree)(tree);
29
+ }
30
+ resolveImportSpecifier(specifier, _context) {
31
+ const trimmed = specifier.trim();
32
+ if (trimmed.length === 0) {
33
+ return null;
34
+ }
35
+ return trimmed;
36
+ }
37
+ }
38
+ exports.RustAdapter = RustAdapter;
39
+ function createRustAdapter(options = {}) {
40
+ return new RustAdapter(options.loadRuntime ?? runtime_js_1.loadTreeSitterRuntime);
41
+ }
42
+ function detectLanguage(filePath) {
43
+ const extension = (0, node_path_1.extname)(filePath).toLowerCase();
44
+ return extension === ".rs" ? "rust" : null;
45
+ }