@rkarim08/sia 1.0.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 (355) hide show
  1. package/.claude-plugin/marketplace.json +35 -0
  2. package/.claude-plugin/plugin.json +27 -0
  3. package/.mcp.json +13 -0
  4. package/CLAUDE.md +226 -0
  5. package/LICENSE +202 -0
  6. package/PLUGIN_README.md +253 -0
  7. package/README.md +1013 -0
  8. package/agents/sia-changelog-writer.md +89 -0
  9. package/agents/sia-code-reviewer.md +86 -0
  10. package/agents/sia-conflict-resolver.md +100 -0
  11. package/agents/sia-convention-enforcer.md +69 -0
  12. package/agents/sia-debug.md +106 -0
  13. package/agents/sia-decision-reviewer.md +101 -0
  14. package/agents/sia-dependency-tracker.md +80 -0
  15. package/agents/sia-explain.md +126 -0
  16. package/agents/sia-feature.md +116 -0
  17. package/agents/sia-knowledge-capture.md +117 -0
  18. package/agents/sia-lead-architecture-advisor.md +93 -0
  19. package/agents/sia-lead-team-health.md +107 -0
  20. package/agents/sia-migration.md +100 -0
  21. package/agents/sia-onboarding.md +115 -0
  22. package/agents/sia-orientation.md +99 -0
  23. package/agents/sia-pm-briefing.md +106 -0
  24. package/agents/sia-pm-risk-advisor.md +82 -0
  25. package/agents/sia-qa-analyst.md +116 -0
  26. package/agents/sia-qa-regression-map.md +94 -0
  27. package/agents/sia-refactor.md +115 -0
  28. package/agents/sia-regression.md +112 -0
  29. package/agents/sia-security-audit.md +125 -0
  30. package/agents/sia-test-advisor.md +91 -0
  31. package/hooks/hooks.json +98 -0
  32. package/migrations/bridge/001_initial.sql +34 -0
  33. package/migrations/episodic/001_initial.sql +35 -0
  34. package/migrations/meta/001_initial.sql +68 -0
  35. package/migrations/semantic/001_initial.sql +292 -0
  36. package/migrations/semantic/002_ontology.sql +89 -0
  37. package/migrations/semantic/003_freshness.sql +63 -0
  38. package/migrations/semantic/004_v5_unified_schema.sql +194 -0
  39. package/migrations/semantic/005_backfill_event_kinds.sql +8 -0
  40. package/migrations/semantic/006_tree_sitter.sql +6 -0
  41. package/migrations/semantic/007_branch_snapshots.sql +22 -0
  42. package/package.json +110 -0
  43. package/scripts/branch-switch.sh +13 -0
  44. package/scripts/build-wasm-grammars.sh +81 -0
  45. package/scripts/post-compact.sh +8 -0
  46. package/scripts/post-tool-use.sh +10 -0
  47. package/scripts/pre-compact.sh +8 -0
  48. package/scripts/session-end.sh +8 -0
  49. package/scripts/session-start.sh +8 -0
  50. package/scripts/start-mcp.ts +45 -0
  51. package/scripts/stop-hook.sh +8 -0
  52. package/scripts/user-prompt-submit.sh +8 -0
  53. package/scripts/viz-server.ts +152 -0
  54. package/skills/sia-brainstorm/SKILL.md +156 -0
  55. package/skills/sia-brainstorm/scripts/frame-template.html +214 -0
  56. package/skills/sia-brainstorm/scripts/helper.js +95 -0
  57. package/skills/sia-brainstorm/scripts/server.cjs +338 -0
  58. package/skills/sia-brainstorm/scripts/start-server.sh +153 -0
  59. package/skills/sia-brainstorm/scripts/stop-server.sh +55 -0
  60. package/skills/sia-brainstorm/spec-document-reviewer-prompt.md +49 -0
  61. package/skills/sia-brainstorm/visual-companion.md +286 -0
  62. package/skills/sia-capture/SKILL.md +64 -0
  63. package/skills/sia-compare/SKILL.md +33 -0
  64. package/skills/sia-conflicts/SKILL.md +38 -0
  65. package/skills/sia-debug-workflow/SKILL.md +120 -0
  66. package/skills/sia-debug-workflow/root-cause-tracing.md +70 -0
  67. package/skills/sia-debug-workflow/scripts/find-polluter.sh +64 -0
  68. package/skills/sia-debug-workflow/temporal-investigation.md +72 -0
  69. package/skills/sia-digest/SKILL.md +23 -0
  70. package/skills/sia-dispatch/SKILL.md +69 -0
  71. package/skills/sia-dispatch/agent-task-template.md +99 -0
  72. package/skills/sia-doctor/SKILL.md +39 -0
  73. package/skills/sia-execute/SKILL.md +70 -0
  74. package/skills/sia-execute-plan/SKILL.md +85 -0
  75. package/skills/sia-export-import/SKILL.md +49 -0
  76. package/skills/sia-export-knowledge/SKILL.md +46 -0
  77. package/skills/sia-finish/SKILL.md +100 -0
  78. package/skills/sia-finish/pr-summary-template.md +54 -0
  79. package/skills/sia-freshness/SKILL.md +38 -0
  80. package/skills/sia-history/SKILL.md +42 -0
  81. package/skills/sia-impact/SKILL.md +70 -0
  82. package/skills/sia-index/SKILL.md +54 -0
  83. package/skills/sia-install/SKILL.md +39 -0
  84. package/skills/sia-lead-compliance/SKILL.md +16 -0
  85. package/skills/sia-lead-drift-report/SKILL.md +16 -0
  86. package/skills/sia-lead-knowledge-map/SKILL.md +16 -0
  87. package/skills/sia-learn/SKILL.md +58 -0
  88. package/skills/sia-plan/SKILL.md +68 -0
  89. package/skills/sia-plan/plan-reviewer-prompt.md +63 -0
  90. package/skills/sia-playbooks/SKILL.md +29 -0
  91. package/skills/sia-playbooks/reference-feature.md +100 -0
  92. package/skills/sia-playbooks/reference-flagging.md +50 -0
  93. package/skills/sia-playbooks/reference-orientation.md +92 -0
  94. package/skills/sia-playbooks/reference-regression.md +115 -0
  95. package/skills/sia-playbooks/reference-review.md +64 -0
  96. package/skills/sia-playbooks/reference-tools.md +239 -0
  97. package/skills/sia-pm-decision-log/SKILL.md +28 -0
  98. package/skills/sia-pm-risk-dashboard/SKILL.md +24 -0
  99. package/skills/sia-pm-sprint-summary/SKILL.md +27 -0
  100. package/skills/sia-prune/SKILL.md +45 -0
  101. package/skills/sia-qa-coverage/SKILL.md +28 -0
  102. package/skills/sia-qa-flaky/SKILL.md +20 -0
  103. package/skills/sia-qa-report/SKILL.md +26 -0
  104. package/skills/sia-reindex/SKILL.md +30 -0
  105. package/skills/sia-review-respond/SKILL.md +88 -0
  106. package/skills/sia-review-respond/pushback-patterns.md +90 -0
  107. package/skills/sia-search/SKILL.md +47 -0
  108. package/skills/sia-setup/SKILL.md +82 -0
  109. package/skills/sia-setup/setup-checklist.md +97 -0
  110. package/skills/sia-stats/SKILL.md +36 -0
  111. package/skills/sia-status/SKILL.md +44 -0
  112. package/skills/sia-sync/SKILL.md +46 -0
  113. package/skills/sia-team/SKILL.md +64 -0
  114. package/skills/sia-test/SKILL.md +92 -0
  115. package/skills/sia-test/testing-anti-patterns.md +104 -0
  116. package/skills/sia-tour/SKILL.md +29 -0
  117. package/skills/sia-upgrade/SKILL.md +43 -0
  118. package/skills/sia-verify/SKILL.md +81 -0
  119. package/skills/sia-visualize/SKILL.md +28 -0
  120. package/skills/sia-visualize-live/SKILL.md +55 -0
  121. package/skills/sia-visualize-live/scripts/graph-template.html +389 -0
  122. package/skills/sia-visualize-live/scripts/start-visualizer.sh +161 -0
  123. package/skills/sia-visualize-live/scripts/stop-visualizer.sh +55 -0
  124. package/skills/sia-visualize-live/scripts/visualizer-server.cjs +264 -0
  125. package/skills/sia-workspace/SKILL.md +57 -0
  126. package/src/agent/claude-md-template-flagging.md +219 -0
  127. package/src/agent/claude-md-template.md +213 -0
  128. package/src/agent/modules/sia-feature.md +100 -0
  129. package/src/agent/modules/sia-flagging.md +50 -0
  130. package/src/agent/modules/sia-orientation.md +92 -0
  131. package/src/agent/modules/sia-regression.md +115 -0
  132. package/src/agent/modules/sia-review.md +64 -0
  133. package/src/agent/modules/sia-tools.md +239 -0
  134. package/src/ast/extractors/c-include.ts +189 -0
  135. package/src/ast/extractors/csharp-project.ts +260 -0
  136. package/src/ast/extractors/prisma-schema.ts +44 -0
  137. package/src/ast/extractors/project-manifest.ts +111 -0
  138. package/src/ast/extractors/sql-schema.ts +67 -0
  139. package/src/ast/extractors/tier-a.ts +423 -0
  140. package/src/ast/extractors/tier-b.ts +289 -0
  141. package/src/ast/extractors/tier-dispatch.ts +247 -0
  142. package/src/ast/index-worker.ts +108 -0
  143. package/src/ast/indexer.ts +484 -0
  144. package/src/ast/languages.ts +408 -0
  145. package/src/ast/pagerank-builder.ts +125 -0
  146. package/src/ast/path-utils.ts +137 -0
  147. package/src/ast/tree-sitter/backends/native.ts +57 -0
  148. package/src/ast/tree-sitter/backends/wasm.ts +39 -0
  149. package/src/ast/tree-sitter/call-walker.ts +44 -0
  150. package/src/ast/tree-sitter/edit-computer.ts +55 -0
  151. package/src/ast/tree-sitter/query-runner.ts +46 -0
  152. package/src/ast/tree-sitter/service.ts +174 -0
  153. package/src/ast/tree-sitter/tree-cache.ts +39 -0
  154. package/src/ast/tree-sitter/types.ts +79 -0
  155. package/src/ast/watcher.ts +322 -0
  156. package/src/capture/chunker.ts +169 -0
  157. package/src/capture/consolidate.ts +127 -0
  158. package/src/capture/edge-inferrer.ts +161 -0
  159. package/src/capture/embedder.ts +166 -0
  160. package/src/capture/embedding-cache.ts +73 -0
  161. package/src/capture/flag-processor.ts +64 -0
  162. package/src/capture/hook.ts +67 -0
  163. package/src/capture/pipeline.ts +450 -0
  164. package/src/capture/prompts/consolidate.ts +25 -0
  165. package/src/capture/prompts/edge-infer.ts +29 -0
  166. package/src/capture/prompts/extract-flagged.ts +36 -0
  167. package/src/capture/prompts/extract.ts +42 -0
  168. package/src/capture/tokenizer.ts +147 -0
  169. package/src/capture/track-a-ast.ts +93 -0
  170. package/src/capture/track-b-llm.ts +149 -0
  171. package/src/capture/types.ts +64 -0
  172. package/src/cli/commands/community.ts +137 -0
  173. package/src/cli/commands/compare.ts +123 -0
  174. package/src/cli/commands/conflicts.ts +41 -0
  175. package/src/cli/commands/digest.ts +197 -0
  176. package/src/cli/commands/disable-flagging.ts +34 -0
  177. package/src/cli/commands/doctor.ts +240 -0
  178. package/src/cli/commands/download-model.ts +161 -0
  179. package/src/cli/commands/enable-flagging.ts +34 -0
  180. package/src/cli/commands/export-knowledge.ts +208 -0
  181. package/src/cli/commands/export.ts +85 -0
  182. package/src/cli/commands/freshness.ts +164 -0
  183. package/src/cli/commands/graph.ts +51 -0
  184. package/src/cli/commands/history.ts +139 -0
  185. package/src/cli/commands/import.ts +335 -0
  186. package/src/cli/commands/install.ts +156 -0
  187. package/src/cli/commands/lead-report.ts +241 -0
  188. package/src/cli/commands/learn.ts +321 -0
  189. package/src/cli/commands/pm-report.ts +413 -0
  190. package/src/cli/commands/prune.ts +75 -0
  191. package/src/cli/commands/qa-report.ts +278 -0
  192. package/src/cli/commands/reindex.ts +104 -0
  193. package/src/cli/commands/rollback.ts +70 -0
  194. package/src/cli/commands/search.ts +103 -0
  195. package/src/cli/commands/server.ts +91 -0
  196. package/src/cli/commands/share.ts +33 -0
  197. package/src/cli/commands/stats.ts +79 -0
  198. package/src/cli/commands/status.ts +176 -0
  199. package/src/cli/commands/sync.ts +96 -0
  200. package/src/cli/commands/team.ts +118 -0
  201. package/src/cli/commands/tour.ts +157 -0
  202. package/src/cli/commands/visualize-live.ts +162 -0
  203. package/src/cli/commands/workspace.ts +117 -0
  204. package/src/cli/index.ts +424 -0
  205. package/src/cli/learn-progress.ts +87 -0
  206. package/src/community/detection-bridge.ts +344 -0
  207. package/src/community/leiden.ts +462 -0
  208. package/src/community/raptor.ts +210 -0
  209. package/src/community/scheduler.ts +74 -0
  210. package/src/community/summarize.ts +115 -0
  211. package/src/decay/archiver.ts +73 -0
  212. package/src/decay/bridge-orphan-cleanup.ts +212 -0
  213. package/src/decay/consolidation-sweep.ts +112 -0
  214. package/src/decay/decay.ts +116 -0
  215. package/src/decay/deep-validator.ts +62 -0
  216. package/src/decay/episodic-promoter.ts +132 -0
  217. package/src/decay/maintenance-scheduler.ts +326 -0
  218. package/src/decay/scheduler.ts +6 -0
  219. package/src/decay/session-sweeper.ts +79 -0
  220. package/src/decay/types.ts +17 -0
  221. package/src/freshness/confidence-decay.ts +122 -0
  222. package/src/freshness/cuckoo-filter.ts +176 -0
  223. package/src/freshness/deep-validation.ts +345 -0
  224. package/src/freshness/dirty-tracker.ts +237 -0
  225. package/src/freshness/file-watcher-layer.ts +119 -0
  226. package/src/freshness/firewall.ts +64 -0
  227. package/src/freshness/git-reconcile-layer.ts +161 -0
  228. package/src/freshness/inverted-index.ts +158 -0
  229. package/src/freshness/stale-read-layer.ts +222 -0
  230. package/src/graph/audit.ts +69 -0
  231. package/src/graph/bridge-db.ts +141 -0
  232. package/src/graph/communities.ts +195 -0
  233. package/src/graph/db-interface.ts +259 -0
  234. package/src/graph/edges.ts +163 -0
  235. package/src/graph/entities.ts +327 -0
  236. package/src/graph/episodic-db.ts +113 -0
  237. package/src/graph/flags.ts +31 -0
  238. package/src/graph/meta-db.ts +200 -0
  239. package/src/graph/semantic-db.ts +101 -0
  240. package/src/graph/session-resume.ts +56 -0
  241. package/src/graph/snapshots.ts +342 -0
  242. package/src/graph/staging.ts +151 -0
  243. package/src/graph/types.ts +128 -0
  244. package/src/hooks/adapters/claude-code.ts +21 -0
  245. package/src/hooks/adapters/cline.ts +43 -0
  246. package/src/hooks/adapters/cursor.ts +65 -0
  247. package/src/hooks/adapters/generic.ts +12 -0
  248. package/src/hooks/agent-detect.ts +34 -0
  249. package/src/hooks/claude-md-directives.ts +32 -0
  250. package/src/hooks/event-router.ts +182 -0
  251. package/src/hooks/extractors/pattern-detector.ts +111 -0
  252. package/src/hooks/handlers/post-compact.ts +30 -0
  253. package/src/hooks/handlers/post-tool-use.ts +403 -0
  254. package/src/hooks/handlers/pre-compact.ts +100 -0
  255. package/src/hooks/handlers/session-end.ts +47 -0
  256. package/src/hooks/handlers/session-start.ts +154 -0
  257. package/src/hooks/handlers/stop.ts +128 -0
  258. package/src/hooks/handlers/user-prompt-submit.ts +68 -0
  259. package/src/hooks/plugin-branch-switch.ts +68 -0
  260. package/src/hooks/plugin-common.ts +47 -0
  261. package/src/hooks/plugin-post-compact.ts +28 -0
  262. package/src/hooks/plugin-post-tool-use.ts +38 -0
  263. package/src/hooks/plugin-pre-compact.ts +37 -0
  264. package/src/hooks/plugin-session-end.ts +37 -0
  265. package/src/hooks/plugin-session-start.ts +75 -0
  266. package/src/hooks/plugin-stop.ts +61 -0
  267. package/src/hooks/plugin-user-prompt-submit.ts +47 -0
  268. package/src/hooks/types.ts +43 -0
  269. package/src/knowledge/discovery.ts +238 -0
  270. package/src/knowledge/external-refs.ts +98 -0
  271. package/src/knowledge/freshness.ts +221 -0
  272. package/src/knowledge/ingest.ts +330 -0
  273. package/src/knowledge/markdown-export.ts +229 -0
  274. package/src/knowledge/markdown-import.ts +359 -0
  275. package/src/knowledge/patterns.ts +74 -0
  276. package/src/knowledge/templates.ts +307 -0
  277. package/src/llm/ai-sdk-adapter.ts +46 -0
  278. package/src/llm/config.ts +88 -0
  279. package/src/llm/cost-tracker.ts +110 -0
  280. package/src/llm/prompts/extraction.ts +55 -0
  281. package/src/llm/prompts/summarization.ts +36 -0
  282. package/src/llm/prompts/validation.ts +37 -0
  283. package/src/llm/provider-registry.ts +68 -0
  284. package/src/llm/reliability.ts +179 -0
  285. package/src/llm/schemas.ts +52 -0
  286. package/src/mcp/freshness-annotator.ts +69 -0
  287. package/src/mcp/server.ts +949 -0
  288. package/src/mcp/tools/sia-ast-query.ts +225 -0
  289. package/src/mcp/tools/sia-at-time.ts +151 -0
  290. package/src/mcp/tools/sia-backlinks.ts +87 -0
  291. package/src/mcp/tools/sia-batch-execute.ts +169 -0
  292. package/src/mcp/tools/sia-by-file.ts +89 -0
  293. package/src/mcp/tools/sia-community.ts +113 -0
  294. package/src/mcp/tools/sia-doctor.ts +73 -0
  295. package/src/mcp/tools/sia-execute-file.ts +122 -0
  296. package/src/mcp/tools/sia-execute.ts +104 -0
  297. package/src/mcp/tools/sia-expand.ts +158 -0
  298. package/src/mcp/tools/sia-fetch-and-index.ts +241 -0
  299. package/src/mcp/tools/sia-flag.ts +65 -0
  300. package/src/mcp/tools/sia-index.ts +111 -0
  301. package/src/mcp/tools/sia-note.ts +134 -0
  302. package/src/mcp/tools/sia-search.ts +105 -0
  303. package/src/mcp/tools/sia-stats.ts +63 -0
  304. package/src/mcp/tools/sia-sync-status.ts +44 -0
  305. package/src/mcp/tools/sia-upgrade.ts +247 -0
  306. package/src/mcp/truncate.ts +231 -0
  307. package/src/native/bridge.ts +167 -0
  308. package/src/native/fallback-ast-diff.ts +144 -0
  309. package/src/native/fallback-graph.ts +325 -0
  310. package/src/ontology/constraints.ts +56 -0
  311. package/src/ontology/errors.ts +8 -0
  312. package/src/ontology/middleware.ts +266 -0
  313. package/src/retrieval/bm25-search.ts +151 -0
  314. package/src/retrieval/context-assembly.ts +76 -0
  315. package/src/retrieval/graph-traversal.ts +168 -0
  316. package/src/retrieval/pagerank.ts +40 -0
  317. package/src/retrieval/query-classifier.ts +106 -0
  318. package/src/retrieval/reranker.ts +156 -0
  319. package/src/retrieval/search.ts +236 -0
  320. package/src/retrieval/throttle.ts +102 -0
  321. package/src/retrieval/vector-search.ts +203 -0
  322. package/src/retrieval/workspace-search.ts +130 -0
  323. package/src/sandbox/context-mode.ts +285 -0
  324. package/src/sandbox/credential-pass.ts +55 -0
  325. package/src/sandbox/executor.ts +235 -0
  326. package/src/security/pattern-detector.ts +127 -0
  327. package/src/security/rule-of-two.ts +50 -0
  328. package/src/security/sanitize.ts +46 -0
  329. package/src/security/semantic-consistency.ts +93 -0
  330. package/src/security/staging-promoter.ts +154 -0
  331. package/src/shared/config.ts +302 -0
  332. package/src/shared/diagnostics.ts +210 -0
  333. package/src/shared/errors.ts +48 -0
  334. package/src/shared/git-utils.ts +143 -0
  335. package/src/shared/llm-client.ts +120 -0
  336. package/src/shared/logger.ts +99 -0
  337. package/src/shared/types.ts +79 -0
  338. package/src/sync/client.ts +43 -0
  339. package/src/sync/conflict.ts +106 -0
  340. package/src/sync/dedup.ts +183 -0
  341. package/src/sync/hlc.ts +117 -0
  342. package/src/sync/keychain.ts +144 -0
  343. package/src/sync/pull.ts +232 -0
  344. package/src/sync/push.ts +131 -0
  345. package/src/types/chokidar.d.ts +23 -0
  346. package/src/visualization/graph-renderer.ts +312 -0
  347. package/src/visualization/subgraph-extract.ts +208 -0
  348. package/src/visualization/views/community-clusters.ts +246 -0
  349. package/src/visualization/views/dependency-map.ts +189 -0
  350. package/src/visualization/views/graph-explorer.ts +364 -0
  351. package/src/visualization/views/timeline.ts +247 -0
  352. package/src/workspace/api-contracts.ts +226 -0
  353. package/src/workspace/cross-repo.ts +61 -0
  354. package/src/workspace/detector.ts +190 -0
  355. package/src/workspace/manifest.ts +141 -0
@@ -0,0 +1,247 @@
1
+ // Module: tier-dispatch — Route file extraction by LanguageConfig.tier
2
+
3
+ import { existsSync } from "node:fs";
4
+ import { basename, join } from "node:path";
5
+ import type { ExtractionTier, SpecialHandling } from "@/ast/languages";
6
+ import { LANGUAGE_REGISTRY, resolveLanguageConfig } from "@/ast/languages";
7
+ import { TreeSitterService } from "@/ast/tree-sitter/service";
8
+ import type { CandidateFact } from "@/capture/types";
9
+ import { getConfig } from "@/shared/config";
10
+ import { extractPrismaSchema } from "./prisma-schema";
11
+ import { extractManifest } from "./project-manifest";
12
+ import { extractSqlSchema } from "./sql-schema";
13
+ import { extractTierA } from "./tier-a";
14
+ import { extractTierB } from "./tier-b";
15
+
16
+ /** Return surrounding lines around a match index for context snippets. */
17
+ function surroundingLines(content: string, matchIndex: number, contextLines = 3): string {
18
+ const lines = content.split("\n");
19
+ let charCount = 0;
20
+ let targetLine = 0;
21
+ for (let i = 0; i < lines.length; i++) {
22
+ charCount += lines[i].length + 1;
23
+ if (charCount > matchIndex) {
24
+ targetLine = i;
25
+ break;
26
+ }
27
+ }
28
+ const start = Math.max(0, targetLine - contextLines);
29
+ const end = Math.min(lines.length, targetLine + contextLines + 1);
30
+ return lines.slice(start, end).join("\n");
31
+ }
32
+
33
+ let _service: TreeSitterService | null = null;
34
+ function getTreeSitterService(): TreeSitterService {
35
+ if (!_service) {
36
+ const config = getConfig();
37
+ _service = new TreeSitterService(config.treeSitter!);
38
+ }
39
+ return _service;
40
+ }
41
+
42
+ /**
43
+ * Attempt tree-sitter extraction for a file. Returns CandidateFact[] on success,
44
+ * or null if parsing fails (triggers regex fallback).
45
+ */
46
+ async function tryTreeSitterExtraction(
47
+ content: string,
48
+ filePath: string,
49
+ langName: string,
50
+ ): Promise<CandidateFact[] | null> {
51
+ try {
52
+ const service = getTreeSitterService();
53
+ const tree = await service.parse(content, langName);
54
+ if (!tree) return null;
55
+
56
+ const langConfig = LANGUAGE_REGISTRY[langName];
57
+ if (!langConfig) return null;
58
+
59
+ const resolved = resolveLanguageConfig(langConfig);
60
+ const config = getConfig();
61
+ const queryDir = config.treeSitter?.queryDir;
62
+ if (!queryDir) return null;
63
+
64
+ const base = basename(filePath);
65
+ const facts: CandidateFact[] = [];
66
+ const seen = new Set<string>();
67
+
68
+ // Run symbols.scm query
69
+ const symbolsPath = join(queryDir, resolved.queryDir, "symbols.scm");
70
+ if (existsSync(symbolsPath)) {
71
+ const matches = service.query(tree, symbolsPath);
72
+ for (const match of matches) {
73
+ for (const cap of match.captures) {
74
+ const category = cap.name.startsWith("function")
75
+ ? "function"
76
+ : cap.name.startsWith("class") ||
77
+ cap.name.startsWith("type") ||
78
+ cap.name.startsWith("interface")
79
+ ? "class"
80
+ : cap.name;
81
+ const dedupeKey = `${category}:${cap.text}`;
82
+ if (seen.has(dedupeKey)) continue;
83
+ seen.add(dedupeKey);
84
+ facts.push({
85
+ type: "CodeEntity",
86
+ name: cap.text,
87
+ content: surroundingLines(content, cap.startIndex),
88
+ summary: `${category} ${cap.text} in ${base}`,
89
+ tags: [langName, category],
90
+ file_paths: [filePath],
91
+ trust_tier: 2,
92
+ confidence: 0.95,
93
+ extraction_method: "tree-sitter",
94
+ });
95
+ }
96
+ }
97
+ }
98
+
99
+ // Run imports.scm query — pair @imported_name and @source captures
100
+ const importsPath = join(queryDir, resolved.queryDir, "imports.scm");
101
+ if (existsSync(importsPath)) {
102
+ const matches = service.query(tree, importsPath);
103
+ for (const match of matches) {
104
+ const nameCapture = match.captures.find((c) => c.name === "imported_name");
105
+ const sourceCapture = match.captures.find((c) => c.name === "source");
106
+
107
+ if (nameCapture) {
108
+ const dedupeKey = `import:${nameCapture.text}`;
109
+ if (seen.has(dedupeKey)) continue;
110
+ seen.add(dedupeKey);
111
+ facts.push({
112
+ type: "CodeEntity",
113
+ name: nameCapture.text,
114
+ content: surroundingLines(content, nameCapture.startIndex),
115
+ summary: `import ${nameCapture.text} in ${base}`,
116
+ tags: [langName, "import"],
117
+ file_paths: [filePath],
118
+ trust_tier: 2,
119
+ confidence: 0.95,
120
+ extraction_method: "tree-sitter",
121
+ proposed_relationships: sourceCapture
122
+ ? [
123
+ {
124
+ target_name: sourceCapture.text.replace(/['"]/g, ""),
125
+ type: "imports",
126
+ weight: 0.9,
127
+ },
128
+ ]
129
+ : [],
130
+ });
131
+ } else if (sourceCapture) {
132
+ // require() calls only have @source
133
+ const dedupeKey = `import:${sourceCapture.text}`;
134
+ if (seen.has(dedupeKey)) continue;
135
+ seen.add(dedupeKey);
136
+ facts.push({
137
+ type: "CodeEntity",
138
+ name: sourceCapture.text.replace(/['"]/g, ""),
139
+ content: surroundingLines(content, sourceCapture.startIndex),
140
+ summary: `import ${sourceCapture.text} in ${base}`,
141
+ tags: [langName, "import"],
142
+ file_paths: [filePath],
143
+ trust_tier: 2,
144
+ confidence: 0.95,
145
+ extraction_method: "tree-sitter",
146
+ });
147
+ }
148
+ }
149
+ }
150
+
151
+ // Run calls.scm query
152
+ const callsPath = join(queryDir, resolved.queryDir, "calls.scm");
153
+ if (existsSync(callsPath)) {
154
+ const matches = service.query(tree, callsPath);
155
+ for (const match of matches) {
156
+ for (const cap of match.captures) {
157
+ const dedupeKey = `call:${cap.text}`;
158
+ if (seen.has(dedupeKey)) continue;
159
+ seen.add(dedupeKey);
160
+ facts.push({
161
+ type: "CodeEntity",
162
+ name: cap.text,
163
+ content: surroundingLines(content, cap.startIndex),
164
+ summary: `call ${cap.text} in ${base}`,
165
+ tags: [langName, "call"],
166
+ file_paths: [filePath],
167
+ trust_tier: 2,
168
+ confidence: 0.95,
169
+ extraction_method: "tree-sitter",
170
+ });
171
+ }
172
+ }
173
+ }
174
+
175
+ // If tree-sitter parsed but no query files found, return null to fall back
176
+ if (facts.length === 0) return null;
177
+
178
+ return facts;
179
+ } catch {
180
+ return null;
181
+ }
182
+ }
183
+
184
+ /**
185
+ * Dispatch extraction to the appropriate extractor based on the language tier
186
+ * and optional special-handling hint.
187
+ *
188
+ * - Tier A: full structural extraction via extractTierA (15 languages)
189
+ * - Tier B: structural extraction (no calls) via extractTierB (10 languages)
190
+ * - Tier C sql-schema: SQL CREATE TABLE / INDEX extraction
191
+ * - Tier C prisma-schema: Prisma model extraction
192
+ * - Tier D project-manifest: manifest dependency extraction
193
+ * - Default: empty array (unsupported tier/handling combination)
194
+ */
195
+ export function dispatchExtraction(
196
+ content: string,
197
+ filePath: string,
198
+ tier: ExtractionTier,
199
+ specialHandling?: SpecialHandling,
200
+ ): CandidateFact[] {
201
+ switch (tier) {
202
+ case "A":
203
+ return extractTierA(content, filePath);
204
+ case "B":
205
+ return extractTierB(content, filePath);
206
+
207
+ case "C":
208
+ if (specialHandling === "sql-schema") {
209
+ return extractSqlSchema(content, filePath);
210
+ }
211
+ if (specialHandling === "prisma-schema") {
212
+ return extractPrismaSchema(content, filePath);
213
+ }
214
+ return [];
215
+
216
+ case "D":
217
+ if (specialHandling === "project-manifest") {
218
+ return extractManifest(content, filePath);
219
+ }
220
+ return [];
221
+
222
+ default:
223
+ return [];
224
+ }
225
+ }
226
+
227
+ /**
228
+ * Async dispatch that attempts tree-sitter extraction first, falling back
229
+ * to regex-based dispatch if tree-sitter is unavailable or fails.
230
+ * Special-handling files (sql-schema, prisma-schema, project-manifest)
231
+ * pass through directly to the sync dispatcher.
232
+ */
233
+ export async function dispatchExtractionAsync(
234
+ content: string,
235
+ filePath: string,
236
+ tier: ExtractionTier,
237
+ langName: string,
238
+ specialHandling?: SpecialHandling,
239
+ ): Promise<CandidateFact[]> {
240
+ if (specialHandling) {
241
+ return dispatchExtraction(content, filePath, tier, specialHandling);
242
+ }
243
+ const tsFacts = await tryTreeSitterExtraction(content, filePath, langName);
244
+ if (tsFacts) return tsFacts;
245
+ const regexFacts = dispatchExtraction(content, filePath, tier, specialHandling);
246
+ return regexFacts.map((f) => ({ ...f, extraction_method: "regex-fallback" }));
247
+ }
@@ -0,0 +1,108 @@
1
+ // Module: index-worker — Worker thread entry point for parallel AST indexing.
2
+ //
3
+ // Each worker receives file paths from the main thread, reads the file,
4
+ // parses it with tree-sitter via dispatchExtractionAsync, and returns
5
+ // extracted facts. Includes per-file retry with exponential backoff.
6
+ //
7
+ // This module exports parseFileWithRetry for direct testing.
8
+ // When run as a worker thread, it listens on parentPort for messages.
9
+
10
+ import { readFileSync, statSync } from "node:fs";
11
+ import { dispatchExtractionAsync } from "@/ast/extractors/tier-dispatch";
12
+ import { getLanguageForFile } from "@/ast/languages";
13
+ import { detectPackagePath } from "@/ast/path-utils";
14
+ import type { CandidateFact } from "@/capture/types";
15
+
16
+ const MAX_RETRIES = 3;
17
+
18
+ export interface WorkerMessage {
19
+ absPath: string;
20
+ relPath: string;
21
+ }
22
+
23
+ export interface WorkerResult {
24
+ relPath: string;
25
+ mtimeMs: number;
26
+ packagePath: string | null;
27
+ facts: CandidateFact[];
28
+ error?: string;
29
+ }
30
+
31
+ /**
32
+ * Parse a single file with retry logic.
33
+ * Exported for direct testing — also used by the worker thread message handler.
34
+ */
35
+ export async function parseFileWithRetry(absPath: string, relPath: string): Promise<WorkerResult> {
36
+ const language = getLanguageForFile(absPath);
37
+ if (!language) {
38
+ return { relPath, mtimeMs: 0, packagePath: null, facts: [] };
39
+ }
40
+
41
+ let lastError: string | undefined;
42
+
43
+ for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
44
+ try {
45
+ const stat = statSync(absPath);
46
+ const content = readFileSync(absPath, "utf-8");
47
+ const facts = await dispatchExtractionAsync(
48
+ content,
49
+ relPath,
50
+ language.tier,
51
+ language.name,
52
+ language.specialHandling,
53
+ );
54
+ const packagePath = detectPackagePath(relPath);
55
+
56
+ return {
57
+ relPath,
58
+ mtimeMs: stat.mtimeMs,
59
+ packagePath,
60
+ // Convert to plain objects for structured clone across threads
61
+ facts: facts.map((f) => ({ ...f })),
62
+ };
63
+ } catch (err) {
64
+ lastError = err instanceof Error ? err.message : String(err);
65
+ if (attempt < MAX_RETRIES) {
66
+ // Exponential backoff: 50ms, 200ms, 800ms
67
+ await new Promise((r) => setTimeout(r, 50 * 4 ** (attempt - 1)));
68
+ }
69
+ }
70
+ }
71
+
72
+ return {
73
+ relPath,
74
+ mtimeMs: 0,
75
+ packagePath: null,
76
+ facts: [],
77
+ error: `Failed after ${MAX_RETRIES} attempts: ${lastError}`,
78
+ };
79
+ }
80
+
81
+ // --- Worker thread message handler ---
82
+ // Only activates when this module is loaded as a worker thread.
83
+
84
+ async function setupWorkerHandler() {
85
+ try {
86
+ const { parentPort } = await import("node:worker_threads");
87
+ if (parentPort) {
88
+ parentPort.on("message", async (msg: WorkerMessage) => {
89
+ const result = await parseFileWithRetry(msg.absPath, msg.relPath);
90
+ parentPort.postMessage(result);
91
+ });
92
+ }
93
+ } catch {
94
+ // Not running as a worker thread — ignore (module is being imported for testing)
95
+ }
96
+ }
97
+
98
+ // Worker thread auto-setup.
99
+ // Only activate when loaded as a worker — detected synchronously via require().
100
+ // This avoids top-level await which breaks in Node/Vitest ESM context.
101
+ try {
102
+ const wt = require("node:worker_threads") as typeof import("node:worker_threads");
103
+ if (!wt.isMainThread) {
104
+ setupWorkerHandler();
105
+ }
106
+ } catch {
107
+ // Not in a worker context (imported for testing) — ignore
108
+ }