circle-ir-ai 1.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 (420) hide show
  1. package/CHANGELOG.md +105 -0
  2. package/LICENSE +15 -0
  3. package/README.md +336 -0
  4. package/dist/action-queue/aggregator.d.ts +40 -0
  5. package/dist/action-queue/aggregator.d.ts.map +1 -0
  6. package/dist/action-queue/aggregator.js +375 -0
  7. package/dist/action-queue/aggregator.js.map +1 -0
  8. package/dist/action-queue/index.d.ts +14 -0
  9. package/dist/action-queue/index.d.ts.map +1 -0
  10. package/dist/action-queue/index.js +17 -0
  11. package/dist/action-queue/index.js.map +1 -0
  12. package/dist/action-queue/queue.d.ts +74 -0
  13. package/dist/action-queue/queue.d.ts.map +1 -0
  14. package/dist/action-queue/queue.js +433 -0
  15. package/dist/action-queue/queue.js.map +1 -0
  16. package/dist/action-queue/types.d.ts +162 -0
  17. package/dist/action-queue/types.d.ts.map +1 -0
  18. package/dist/action-queue/types.js +44 -0
  19. package/dist/action-queue/types.js.map +1 -0
  20. package/dist/agents/enrichment-agent.d.ts +16 -0
  21. package/dist/agents/enrichment-agent.d.ts.map +1 -0
  22. package/dist/agents/enrichment-agent.js +102 -0
  23. package/dist/agents/enrichment-agent.js.map +1 -0
  24. package/dist/agents/index.d.ts +12 -0
  25. package/dist/agents/index.d.ts.map +1 -0
  26. package/dist/agents/index.js +15 -0
  27. package/dist/agents/index.js.map +1 -0
  28. package/dist/agents/mastra/agents.d.ts +373 -0
  29. package/dist/agents/mastra/agents.d.ts.map +1 -0
  30. package/dist/agents/mastra/agents.js +347 -0
  31. package/dist/agents/mastra/agents.js.map +1 -0
  32. package/dist/agents/mastra/index.d.ts +12 -0
  33. package/dist/agents/mastra/index.d.ts.map +1 -0
  34. package/dist/agents/mastra/index.js +17 -0
  35. package/dist/agents/mastra/index.js.map +1 -0
  36. package/dist/agents/mastra/instance.d.ts +383 -0
  37. package/dist/agents/mastra/instance.d.ts.map +1 -0
  38. package/dist/agents/mastra/instance.js +37 -0
  39. package/dist/agents/mastra/instance.js.map +1 -0
  40. package/dist/agents/mastra/steps.d.ts +300 -0
  41. package/dist/agents/mastra/steps.d.ts.map +1 -0
  42. package/dist/agents/mastra/steps.js +468 -0
  43. package/dist/agents/mastra/steps.js.map +1 -0
  44. package/dist/agents/mastra/swarm.d.ts +106 -0
  45. package/dist/agents/mastra/swarm.d.ts.map +1 -0
  46. package/dist/agents/mastra/swarm.js +501 -0
  47. package/dist/agents/mastra/swarm.js.map +1 -0
  48. package/dist/agents/mastra/workflow.d.ts +81 -0
  49. package/dist/agents/mastra/workflow.d.ts.map +1 -0
  50. package/dist/agents/mastra/workflow.js +460 -0
  51. package/dist/agents/mastra/workflow.js.map +1 -0
  52. package/dist/agents/multi/agents/security.d.ts +29 -0
  53. package/dist/agents/multi/agents/security.d.ts.map +1 -0
  54. package/dist/agents/multi/agents/security.js +830 -0
  55. package/dist/agents/multi/agents/security.js.map +1 -0
  56. package/dist/agents/multi/extractor.d.ts +21 -0
  57. package/dist/agents/multi/extractor.d.ts.map +1 -0
  58. package/dist/agents/multi/extractor.js +483 -0
  59. package/dist/agents/multi/extractor.js.map +1 -0
  60. package/dist/agents/multi/index.d.ts +32 -0
  61. package/dist/agents/multi/index.d.ts.map +1 -0
  62. package/dist/agents/multi/index.js +34 -0
  63. package/dist/agents/multi/index.js.map +1 -0
  64. package/dist/agents/multi/runner.d.ts +79 -0
  65. package/dist/agents/multi/runner.d.ts.map +1 -0
  66. package/dist/agents/multi/runner.js +323 -0
  67. package/dist/agents/multi/runner.js.map +1 -0
  68. package/dist/agents/security-agent.d.ts +16 -0
  69. package/dist/agents/security-agent.d.ts.map +1 -0
  70. package/dist/agents/security-agent.js +299 -0
  71. package/dist/agents/security-agent.js.map +1 -0
  72. package/dist/agents/types.d.ts +373 -0
  73. package/dist/agents/types.d.ts.map +1 -0
  74. package/dist/agents/types.js +14 -0
  75. package/dist/agents/types.js.map +1 -0
  76. package/dist/agents/verification-agent.d.ts +23 -0
  77. package/dist/agents/verification-agent.d.ts.map +1 -0
  78. package/dist/agents/verification-agent.js +217 -0
  79. package/dist/agents/verification-agent.js.map +1 -0
  80. package/dist/agents/workflow.d.ts +30 -0
  81. package/dist/agents/workflow.d.ts.map +1 -0
  82. package/dist/agents/workflow.js +79 -0
  83. package/dist/agents/workflow.js.map +1 -0
  84. package/dist/analysis/enriched.d.ts +16 -0
  85. package/dist/analysis/enriched.d.ts.map +1 -0
  86. package/dist/analysis/enriched.js +297 -0
  87. package/dist/analysis/enriched.js.map +1 -0
  88. package/dist/analysis/llm-correlated-predicates.d.ts +80 -0
  89. package/dist/analysis/llm-correlated-predicates.d.ts.map +1 -0
  90. package/dist/analysis/llm-correlated-predicates.js +255 -0
  91. package/dist/analysis/llm-correlated-predicates.js.map +1 -0
  92. package/dist/analysis/llm-cross-file-taint.d.ts +86 -0
  93. package/dist/analysis/llm-cross-file-taint.d.ts.map +1 -0
  94. package/dist/analysis/llm-cross-file-taint.js +264 -0
  95. package/dist/analysis/llm-cross-file-taint.js.map +1 -0
  96. package/dist/analysis/pattern-discovery.d.ts +79 -0
  97. package/dist/analysis/pattern-discovery.d.ts.map +1 -0
  98. package/dist/analysis/pattern-discovery.js +447 -0
  99. package/dist/analysis/pattern-discovery.js.map +1 -0
  100. package/dist/cache/file-cache.d.ts +89 -0
  101. package/dist/cache/file-cache.d.ts.map +1 -0
  102. package/dist/cache/file-cache.js +208 -0
  103. package/dist/cache/file-cache.js.map +1 -0
  104. package/dist/cache/index.d.ts +6 -0
  105. package/dist/cache/index.d.ts.map +1 -0
  106. package/dist/cache/index.js +5 -0
  107. package/dist/cache/index.js.map +1 -0
  108. package/dist/cli/args.d.ts +52 -0
  109. package/dist/cli/args.d.ts.map +1 -0
  110. package/dist/cli/args.js +422 -0
  111. package/dist/cli/args.js.map +1 -0
  112. package/dist/cli/colors.d.ts +31 -0
  113. package/dist/cli/colors.d.ts.map +1 -0
  114. package/dist/cli/colors.js +80 -0
  115. package/dist/cli/colors.js.map +1 -0
  116. package/dist/cli/commands/analyze-skill.d.ts +33 -0
  117. package/dist/cli/commands/analyze-skill.d.ts.map +1 -0
  118. package/dist/cli/commands/analyze-skill.js +217 -0
  119. package/dist/cli/commands/analyze-skill.js.map +1 -0
  120. package/dist/cli/commands/analyze.d.ts +18 -0
  121. package/dist/cli/commands/analyze.d.ts.map +1 -0
  122. package/dist/cli/commands/analyze.js +30 -0
  123. package/dist/cli/commands/analyze.js.map +1 -0
  124. package/dist/cli/commands/benchmark-runner.d.ts +42 -0
  125. package/dist/cli/commands/benchmark-runner.d.ts.map +1 -0
  126. package/dist/cli/commands/benchmark-runner.js +18 -0
  127. package/dist/cli/commands/benchmark-runner.js.map +1 -0
  128. package/dist/cli/commands/benchmark.d.ts +11 -0
  129. package/dist/cli/commands/benchmark.d.ts.map +1 -0
  130. package/dist/cli/commands/benchmark.js +90 -0
  131. package/dist/cli/commands/benchmark.js.map +1 -0
  132. package/dist/cli/commands/dead-code.d.ts +11 -0
  133. package/dist/cli/commands/dead-code.d.ts.map +1 -0
  134. package/dist/cli/commands/dead-code.js +65 -0
  135. package/dist/cli/commands/dead-code.js.map +1 -0
  136. package/dist/cli/commands/generate-spec.d.ts +11 -0
  137. package/dist/cli/commands/generate-spec.d.ts.map +1 -0
  138. package/dist/cli/commands/generate-spec.js +67 -0
  139. package/dist/cli/commands/generate-spec.js.map +1 -0
  140. package/dist/cli/commands/health.d.ts +11 -0
  141. package/dist/cli/commands/health.d.ts.map +1 -0
  142. package/dist/cli/commands/health.js +67 -0
  143. package/dist/cli/commands/health.js.map +1 -0
  144. package/dist/cli/commands/project.d.ts +21 -0
  145. package/dist/cli/commands/project.d.ts.map +1 -0
  146. package/dist/cli/commands/project.js +92 -0
  147. package/dist/cli/commands/project.js.map +1 -0
  148. package/dist/cli/commands/scan.d.ts +11 -0
  149. package/dist/cli/commands/scan.d.ts.map +1 -0
  150. package/dist/cli/commands/scan.js +68 -0
  151. package/dist/cli/commands/scan.js.map +1 -0
  152. package/dist/cli/commands/secrets.d.ts +11 -0
  153. package/dist/cli/commands/secrets.d.ts.map +1 -0
  154. package/dist/cli/commands/secrets.js +71 -0
  155. package/dist/cli/commands/secrets.js.map +1 -0
  156. package/dist/cli/commands/swarm.d.ts +20 -0
  157. package/dist/cli/commands/swarm.d.ts.map +1 -0
  158. package/dist/cli/commands/swarm.js +174 -0
  159. package/dist/cli/commands/swarm.js.map +1 -0
  160. package/dist/cli/config.d.ts +103 -0
  161. package/dist/cli/config.d.ts.map +1 -0
  162. package/dist/cli/config.js +307 -0
  163. package/dist/cli/config.js.map +1 -0
  164. package/dist/cli/discovery.d.ts +31 -0
  165. package/dist/cli/discovery.d.ts.map +1 -0
  166. package/dist/cli/discovery.js +212 -0
  167. package/dist/cli/discovery.js.map +1 -0
  168. package/dist/cli/formatters/index.d.ts +15 -0
  169. package/dist/cli/formatters/index.d.ts.map +1 -0
  170. package/dist/cli/formatters/index.js +51 -0
  171. package/dist/cli/formatters/index.js.map +1 -0
  172. package/dist/cli/formatters/json.d.ts +11 -0
  173. package/dist/cli/formatters/json.d.ts.map +1 -0
  174. package/dist/cli/formatters/json.js +12 -0
  175. package/dist/cli/formatters/json.js.map +1 -0
  176. package/dist/cli/formatters/project-json.d.ts +11 -0
  177. package/dist/cli/formatters/project-json.d.ts.map +1 -0
  178. package/dist/cli/formatters/project-json.js +12 -0
  179. package/dist/cli/formatters/project-json.js.map +1 -0
  180. package/dist/cli/formatters/project-sarif.d.ts +11 -0
  181. package/dist/cli/formatters/project-sarif.d.ts.map +1 -0
  182. package/dist/cli/formatters/project-sarif.js +127 -0
  183. package/dist/cli/formatters/project-sarif.js.map +1 -0
  184. package/dist/cli/formatters/project-summary.d.ts +11 -0
  185. package/dist/cli/formatters/project-summary.d.ts.map +1 -0
  186. package/dist/cli/formatters/project-summary.js +202 -0
  187. package/dist/cli/formatters/project-summary.js.map +1 -0
  188. package/dist/cli/formatters/sarif-shared.d.ts +101 -0
  189. package/dist/cli/formatters/sarif-shared.d.ts.map +1 -0
  190. package/dist/cli/formatters/sarif-shared.js +57 -0
  191. package/dist/cli/formatters/sarif-shared.js.map +1 -0
  192. package/dist/cli/formatters/sarif.d.ts +12 -0
  193. package/dist/cli/formatters/sarif.d.ts.map +1 -0
  194. package/dist/cli/formatters/sarif.js +92 -0
  195. package/dist/cli/formatters/sarif.js.map +1 -0
  196. package/dist/cli/formatters/summary.d.ts +11 -0
  197. package/dist/cli/formatters/summary.d.ts.map +1 -0
  198. package/dist/cli/formatters/summary.js +240 -0
  199. package/dist/cli/formatters/summary.js.map +1 -0
  200. package/dist/cli/formatters/two-phase-summary.d.ts +11 -0
  201. package/dist/cli/formatters/two-phase-summary.d.ts.map +1 -0
  202. package/dist/cli/formatters/two-phase-summary.js +188 -0
  203. package/dist/cli/formatters/two-phase-summary.js.map +1 -0
  204. package/dist/cli/index.d.ts +15 -0
  205. package/dist/cli/index.d.ts.map +1 -0
  206. package/dist/cli/index.js +555 -0
  207. package/dist/cli/index.js.map +1 -0
  208. package/dist/components/clustering.d.ts +60 -0
  209. package/dist/components/clustering.d.ts.map +1 -0
  210. package/dist/components/clustering.js +129 -0
  211. package/dist/components/clustering.js.map +1 -0
  212. package/dist/components/enrichment.d.ts +45 -0
  213. package/dist/components/enrichment.d.ts.map +1 -0
  214. package/dist/components/enrichment.js +193 -0
  215. package/dist/components/enrichment.js.map +1 -0
  216. package/dist/components/index.d.ts +29 -0
  217. package/dist/components/index.d.ts.map +1 -0
  218. package/dist/components/index.js +56 -0
  219. package/dist/components/index.js.map +1 -0
  220. package/dist/dead-code/detector.d.ts +200 -0
  221. package/dist/dead-code/detector.d.ts.map +1 -0
  222. package/dist/dead-code/detector.js +1003 -0
  223. package/dist/dead-code/detector.js.map +1 -0
  224. package/dist/dead-code/index.d.ts +7 -0
  225. package/dist/dead-code/index.d.ts.map +1 -0
  226. package/dist/dead-code/index.js +7 -0
  227. package/dist/dead-code/index.js.map +1 -0
  228. package/dist/extractors/index.d.ts +15 -0
  229. package/dist/extractors/index.d.ts.map +1 -0
  230. package/dist/extractors/index.js +14 -0
  231. package/dist/extractors/index.js.map +1 -0
  232. package/dist/extractors/natural-language.d.ts +46 -0
  233. package/dist/extractors/natural-language.d.ts.map +1 -0
  234. package/dist/extractors/natural-language.js +228 -0
  235. package/dist/extractors/natural-language.js.map +1 -0
  236. package/dist/extractors/tree-sitter.d.ts +33 -0
  237. package/dist/extractors/tree-sitter.d.ts.map +1 -0
  238. package/dist/extractors/tree-sitter.js +69 -0
  239. package/dist/extractors/tree-sitter.js.map +1 -0
  240. package/dist/extractors/types.d.ts +62 -0
  241. package/dist/extractors/types.d.ts.map +1 -0
  242. package/dist/extractors/types.js +54 -0
  243. package/dist/extractors/types.js.map +1 -0
  244. package/dist/health-score/calculator.d.ts +123 -0
  245. package/dist/health-score/calculator.d.ts.map +1 -0
  246. package/dist/health-score/calculator.js +444 -0
  247. package/dist/health-score/calculator.js.map +1 -0
  248. package/dist/health-score/index.d.ts +12 -0
  249. package/dist/health-score/index.d.ts.map +1 -0
  250. package/dist/health-score/index.js +14 -0
  251. package/dist/health-score/index.js.map +1 -0
  252. package/dist/health-score/metrics.d.ts +142 -0
  253. package/dist/health-score/metrics.d.ts.map +1 -0
  254. package/dist/health-score/metrics.js +332 -0
  255. package/dist/health-score/metrics.js.map +1 -0
  256. package/dist/index.d.ts +26 -0
  257. package/dist/index.d.ts.map +1 -0
  258. package/dist/index.js +43 -0
  259. package/dist/index.js.map +1 -0
  260. package/dist/llm/ax-client.d.ts +477 -0
  261. package/dist/llm/ax-client.d.ts.map +1 -0
  262. package/dist/llm/ax-client.js +1641 -0
  263. package/dist/llm/ax-client.js.map +1 -0
  264. package/dist/llm/config.d.ts +58 -0
  265. package/dist/llm/config.d.ts.map +1 -0
  266. package/dist/llm/config.js +97 -0
  267. package/dist/llm/config.js.map +1 -0
  268. package/dist/llm/discovery.d.ts +123 -0
  269. package/dist/llm/discovery.d.ts.map +1 -0
  270. package/dist/llm/discovery.js +505 -0
  271. package/dist/llm/discovery.js.map +1 -0
  272. package/dist/llm/enrichment.d.ts +108 -0
  273. package/dist/llm/enrichment.d.ts.map +1 -0
  274. package/dist/llm/enrichment.js +312 -0
  275. package/dist/llm/enrichment.js.map +1 -0
  276. package/dist/llm/index.d.ts +13 -0
  277. package/dist/llm/index.d.ts.map +1 -0
  278. package/dist/llm/index.js +22 -0
  279. package/dist/llm/index.js.map +1 -0
  280. package/dist/llm/language-context.d.ts +64 -0
  281. package/dist/llm/language-context.d.ts.map +1 -0
  282. package/dist/llm/language-context.js +492 -0
  283. package/dist/llm/language-context.js.map +1 -0
  284. package/dist/llm/pattern-verification.d.ts +39 -0
  285. package/dist/llm/pattern-verification.d.ts.map +1 -0
  286. package/dist/llm/pattern-verification.js +127 -0
  287. package/dist/llm/pattern-verification.js.map +1 -0
  288. package/dist/llm/prompt-security.d.ts +120 -0
  289. package/dist/llm/prompt-security.d.ts.map +1 -0
  290. package/dist/llm/prompt-security.js +301 -0
  291. package/dist/llm/prompt-security.js.map +1 -0
  292. package/dist/llm/prompts/index.d.ts +31 -0
  293. package/dist/llm/prompts/index.d.ts.map +1 -0
  294. package/dist/llm/prompts/index.js +92 -0
  295. package/dist/llm/prompts/index.js.map +1 -0
  296. package/dist/llm/prompts/rust.d.ts +30 -0
  297. package/dist/llm/prompts/rust.d.ts.map +1 -0
  298. package/dist/llm/prompts/rust.js +121 -0
  299. package/dist/llm/prompts/rust.js.map +1 -0
  300. package/dist/llm/schemas.d.ts +892 -0
  301. package/dist/llm/schemas.d.ts.map +1 -0
  302. package/dist/llm/schemas.js +258 -0
  303. package/dist/llm/schemas.js.map +1 -0
  304. package/dist/llm/verification.d.ts +127 -0
  305. package/dist/llm/verification.d.ts.map +1 -0
  306. package/dist/llm/verification.js +394 -0
  307. package/dist/llm/verification.js.map +1 -0
  308. package/dist/project/analyzer.d.ts +30 -0
  309. package/dist/project/analyzer.d.ts.map +1 -0
  310. package/dist/project/analyzer.js +358 -0
  311. package/dist/project/analyzer.js.map +1 -0
  312. package/dist/project/call-graph.d.ts +22 -0
  313. package/dist/project/call-graph.d.ts.map +1 -0
  314. package/dist/project/call-graph.js +246 -0
  315. package/dist/project/call-graph.js.map +1 -0
  316. package/dist/project/index.d.ts +18 -0
  317. package/dist/project/index.d.ts.map +1 -0
  318. package/dist/project/index.js +20 -0
  319. package/dist/project/index.js.map +1 -0
  320. package/dist/project/taint-paths.d.ts +22 -0
  321. package/dist/project/taint-paths.d.ts.map +1 -0
  322. package/dist/project/taint-paths.js +265 -0
  323. package/dist/project/taint-paths.js.map +1 -0
  324. package/dist/project/two-phase-analyzer.d.ts +143 -0
  325. package/dist/project/two-phase-analyzer.d.ts.map +1 -0
  326. package/dist/project/two-phase-analyzer.js +646 -0
  327. package/dist/project/two-phase-analyzer.js.map +1 -0
  328. package/dist/project/type-hierarchy.d.ts +28 -0
  329. package/dist/project/type-hierarchy.d.ts.map +1 -0
  330. package/dist/project/type-hierarchy.js +218 -0
  331. package/dist/project/type-hierarchy.js.map +1 -0
  332. package/dist/secret-scan/index.d.ts +12 -0
  333. package/dist/secret-scan/index.d.ts.map +1 -0
  334. package/dist/secret-scan/index.js +14 -0
  335. package/dist/secret-scan/index.js.map +1 -0
  336. package/dist/secret-scan/patterns.d.ts +38 -0
  337. package/dist/secret-scan/patterns.d.ts.map +1 -0
  338. package/dist/secret-scan/patterns.js +473 -0
  339. package/dist/secret-scan/patterns.js.map +1 -0
  340. package/dist/secret-scan/scanner.d.ts +162 -0
  341. package/dist/secret-scan/scanner.d.ts.map +1 -0
  342. package/dist/secret-scan/scanner.js +511 -0
  343. package/dist/secret-scan/scanner.js.map +1 -0
  344. package/dist/security-scan/index.d.ts +12 -0
  345. package/dist/security-scan/index.d.ts.map +1 -0
  346. package/dist/security-scan/index.js +15 -0
  347. package/dist/security-scan/index.js.map +1 -0
  348. package/dist/security-scan/owasp-mapping.d.ts +29 -0
  349. package/dist/security-scan/owasp-mapping.d.ts.map +1 -0
  350. package/dist/security-scan/owasp-mapping.js +246 -0
  351. package/dist/security-scan/owasp-mapping.js.map +1 -0
  352. package/dist/security-scan/scanner.d.ts +204 -0
  353. package/dist/security-scan/scanner.d.ts.map +1 -0
  354. package/dist/security-scan/scanner.js +693 -0
  355. package/dist/security-scan/scanner.js.map +1 -0
  356. package/dist/security-scan/trend-tracker.d.ts +150 -0
  357. package/dist/security-scan/trend-tracker.d.ts.map +1 -0
  358. package/dist/security-scan/trend-tracker.js +299 -0
  359. package/dist/security-scan/trend-tracker.js.map +1 -0
  360. package/dist/skills/bundle-loader.d.ts +26 -0
  361. package/dist/skills/bundle-loader.d.ts.map +1 -0
  362. package/dist/skills/bundle-loader.js +284 -0
  363. package/dist/skills/bundle-loader.js.map +1 -0
  364. package/dist/skills/capability-mismatch.d.ts +21 -0
  365. package/dist/skills/capability-mismatch.d.ts.map +1 -0
  366. package/dist/skills/capability-mismatch.js +188 -0
  367. package/dist/skills/capability-mismatch.js.map +1 -0
  368. package/dist/skills/index.d.ts +10 -0
  369. package/dist/skills/index.d.ts.map +1 -0
  370. package/dist/skills/index.js +9 -0
  371. package/dist/skills/index.js.map +1 -0
  372. package/dist/skills/skill-analyzer.d.ts +16 -0
  373. package/dist/skills/skill-analyzer.d.ts.map +1 -0
  374. package/dist/skills/skill-analyzer.js +361 -0
  375. package/dist/skills/skill-analyzer.js.map +1 -0
  376. package/dist/skills/types.d.ts +195 -0
  377. package/dist/skills/types.d.ts.map +1 -0
  378. package/dist/skills/types.js +7 -0
  379. package/dist/skills/types.js.map +1 -0
  380. package/dist/specifica/conflict-resolver.d.ts +23 -0
  381. package/dist/specifica/conflict-resolver.d.ts.map +1 -0
  382. package/dist/specifica/conflict-resolver.js +129 -0
  383. package/dist/specifica/conflict-resolver.js.map +1 -0
  384. package/dist/specifica/evidence-aggregator.d.ts +33 -0
  385. package/dist/specifica/evidence-aggregator.d.ts.map +1 -0
  386. package/dist/specifica/evidence-aggregator.js +236 -0
  387. package/dist/specifica/evidence-aggregator.js.map +1 -0
  388. package/dist/specifica/evidence-extractor.d.ts +13 -0
  389. package/dist/specifica/evidence-extractor.d.ts.map +1 -0
  390. package/dist/specifica/evidence-extractor.js +431 -0
  391. package/dist/specifica/evidence-extractor.js.map +1 -0
  392. package/dist/specifica/feature-clustering.d.ts +19 -0
  393. package/dist/specifica/feature-clustering.d.ts.map +1 -0
  394. package/dist/specifica/feature-clustering.js +231 -0
  395. package/dist/specifica/feature-clustering.js.map +1 -0
  396. package/dist/specifica/generator.d.ts +16 -0
  397. package/dist/specifica/generator.d.ts.map +1 -0
  398. package/dist/specifica/generator.js +277 -0
  399. package/dist/specifica/generator.js.map +1 -0
  400. package/dist/specifica/index.d.ts +15 -0
  401. package/dist/specifica/index.d.ts.map +1 -0
  402. package/dist/specifica/index.js +18 -0
  403. package/dist/specifica/index.js.map +1 -0
  404. package/dist/specifica/prompts.d.ts +21 -0
  405. package/dist/specifica/prompts.d.ts.map +1 -0
  406. package/dist/specifica/prompts.js +196 -0
  407. package/dist/specifica/prompts.js.map +1 -0
  408. package/dist/specifica/spec-generator.d.ts +22 -0
  409. package/dist/specifica/spec-generator.d.ts.map +1 -0
  410. package/dist/specifica/spec-generator.js +229 -0
  411. package/dist/specifica/spec-generator.js.map +1 -0
  412. package/dist/specifica/types.d.ts +213 -0
  413. package/dist/specifica/types.d.ts.map +1 -0
  414. package/dist/specifica/types.js +7 -0
  415. package/dist/specifica/types.js.map +1 -0
  416. package/dist/utils/logger.d.ts +17 -0
  417. package/dist/utils/logger.d.ts.map +1 -0
  418. package/dist/utils/logger.js +51 -0
  419. package/dist/utils/logger.js.map +1 -0
  420. package/package.json +99 -0
@@ -0,0 +1,358 @@
1
+ /**
2
+ * Project-Level Analyzer
3
+ *
4
+ * Analyzes multiple files as a project, building:
5
+ * - Type hierarchy (class inheritance, interface implementations)
6
+ * - Cross-file call graph
7
+ * - Multi-file taint paths
8
+ */
9
+ import { analyze, initAnalyzer, isAnalyzerInitialized, createWithJdkTypes, SymbolTable, CrossFileResolver, } from 'circle-ir';
10
+ import { buildTypeHierarchy } from './type-hierarchy.js';
11
+ import { buildCrossFileCalls } from './call-graph.js';
12
+ import { findTaintPaths } from './taint-paths.js';
13
+ import { analyzeProjectTaint, } from '../analysis/llm-cross-file-taint.js';
14
+ // Simple logger
15
+ const logger = {
16
+ info: (msg, data) => {
17
+ if (process.env.DEBUG)
18
+ console.log(`[INFO] ${msg}`, data || '');
19
+ },
20
+ warn: (msg, data) => {
21
+ console.warn(`[WARN] ${msg}`, data || '');
22
+ },
23
+ error: (msg, data) => {
24
+ console.error(`[ERROR] ${msg}`, data || '');
25
+ },
26
+ };
27
+ // Helper to calculate severity
28
+ function calculateSeverity(input) {
29
+ const criticalSinks = ['sql_injection', 'command_injection', 'code_injection', 'deserialization'];
30
+ const highSinks = ['xss', 'path_traversal', 'xxe', 'ssrf', 'ldap_injection'];
31
+ if (criticalSinks.some(s => input.sinkType.includes(s))) {
32
+ return input.pathExists ? 'critical' : 'high';
33
+ }
34
+ if (highSinks.some(s => input.sinkType.includes(s))) {
35
+ return input.pathExists ? 'high' : 'medium';
36
+ }
37
+ return input.pathExists ? 'medium' : 'low';
38
+ }
39
+ // Helper to get remediation advice
40
+ function getRemediation(sinkType) {
41
+ const remediations = {
42
+ sql_injection: 'Use parameterized queries or prepared statements',
43
+ command_injection: 'Avoid shell execution; use array-based APIs with validated input',
44
+ xss: 'Encode output using context-appropriate encoding (HTML, JavaScript, URL)',
45
+ path_traversal: 'Validate and canonicalize paths; use allowlists',
46
+ xxe: 'Disable external entity processing in XML parsers',
47
+ ssrf: 'Validate URLs against allowlist; block internal network access',
48
+ deserialization: 'Avoid deserializing untrusted data; use allowlists',
49
+ ldap_injection: 'Use parameterized LDAP queries; escape special characters',
50
+ };
51
+ for (const [key, value] of Object.entries(remediations)) {
52
+ if (sinkType.includes(key))
53
+ return value;
54
+ }
55
+ return 'Validate and sanitize all user input before use';
56
+ }
57
+ /**
58
+ * Analyze a project consisting of multiple files.
59
+ */
60
+ export async function analyzeProject(files, options = {}) {
61
+ // Ensure analyzer is initialized
62
+ if (!isAnalyzerInitialized()) {
63
+ await initAnalyzer();
64
+ }
65
+ const startTime = Date.now();
66
+ // Initialize cross-file resolution infrastructure
67
+ const typeResolver = createWithJdkTypes();
68
+ const symbolTable = new SymbolTable();
69
+ const crossFileResolver = new CrossFileResolver(symbolTable, typeResolver);
70
+ // Analyze each file individually
71
+ const fileAnalyses = [];
72
+ let totalLoc = 0;
73
+ for (const file of files) {
74
+ const language = detectLanguage(file.path);
75
+ const analysis = await analyze(file.content, file.path, language);
76
+ fileAnalyses.push({
77
+ file: file.path,
78
+ analysis,
79
+ });
80
+ totalLoc += analysis.meta.loc;
81
+ // Register with cross-file resolver for enhanced resolution
82
+ crossFileResolver.addFile(file.path, analysis);
83
+ }
84
+ // Build type hierarchy from all files (uses legacy approach + resolver)
85
+ const typeHierarchy = buildTypeHierarchy(fileAnalyses);
86
+ // Merge type hierarchy from resolver (has JDK types pre-populated)
87
+ for (const type of typeResolver.getAllTypes()) {
88
+ if (type.kind === 'class' || type.kind === 'enum') {
89
+ if (!typeHierarchy.classes[type.fqn]) {
90
+ typeHierarchy.classes[type.fqn] = {
91
+ file: type.file,
92
+ extends: type.extends || null,
93
+ implements: type.implements,
94
+ subclasses: typeResolver.getDirectSubtypes(type.fqn),
95
+ };
96
+ }
97
+ }
98
+ else if (type.kind === 'interface') {
99
+ if (!typeHierarchy.interfaces[type.fqn]) {
100
+ typeHierarchy.interfaces[type.fqn] = {
101
+ file: type.file,
102
+ extends: type.extendsInterfaces,
103
+ implementations: typeResolver.getDirectImplementations(type.fqn),
104
+ };
105
+ }
106
+ }
107
+ }
108
+ // Build cross-file call graph (enhanced with resolver)
109
+ const crossFileCalls = buildCrossFileCalls(fileAnalyses, typeHierarchy);
110
+ // Find taint paths across files
111
+ let taintPaths = findTaintPaths(fileAnalyses, crossFileCalls);
112
+ // Apply LLM-based cross-file taint analysis if enabled
113
+ let llmCrossFileTaintResult;
114
+ if (options.enableLLMCrossFileTaint) {
115
+ try {
116
+ // Build file map for LLM analysis
117
+ const fileMap = new Map();
118
+ for (let i = 0; i < files.length; i++) {
119
+ fileMap.set(files[i].path, {
120
+ code: files[i].content,
121
+ ir: fileAnalyses[i].analysis,
122
+ });
123
+ }
124
+ llmCrossFileTaintResult = await analyzeProjectTaint(fileMap);
125
+ logger.info('LLM cross-file taint analysis applied', {
126
+ flowsFound: llmCrossFileTaintResult.flows.length,
127
+ filePairsAnalyzed: llmCrossFileTaintResult.reasoning,
128
+ });
129
+ // Enhance taint paths with LLM-discovered flows
130
+ for (const flow of llmCrossFileTaintResult.flows) {
131
+ // Check if this flow already exists in taintPaths
132
+ const exists = taintPaths.some(p => p.source.file === flow.sourceFile &&
133
+ p.sink.file === flow.targetFile &&
134
+ Math.abs(p.source.line - flow.sourceLine) < 5);
135
+ if (!exists && flow.confidence > 0.7) {
136
+ // Add as a new taint path
137
+ taintPaths.push({
138
+ id: `llm-cross-${flow.sourceFile}-${flow.sourceLine}-${flow.targetFile}`,
139
+ source: {
140
+ file: flow.sourceFile,
141
+ line: flow.sourceLine,
142
+ type: 'cross_file_import',
143
+ code: `imported ${flow.sourceSymbol}`,
144
+ },
145
+ sink: {
146
+ file: flow.targetFile,
147
+ line: flow.targetLine || 0,
148
+ type: 'cross_file_sink',
149
+ cwe: 'CWE-unknown',
150
+ code: `uses ${flow.targetSymbol}`,
151
+ },
152
+ hops: [{
153
+ file: flow.targetFile,
154
+ method: 'unknown',
155
+ line: flow.targetLine || 0,
156
+ code: `${flow.targetSymbol} from ${flow.sourceFile}`,
157
+ variable: flow.targetSymbol,
158
+ }],
159
+ path_exists: true,
160
+ sanitizers_in_path: [],
161
+ confidence: flow.confidence,
162
+ });
163
+ }
164
+ }
165
+ }
166
+ catch (error) {
167
+ logger.warn('LLM cross-file taint analysis failed', {
168
+ error: error instanceof Error ? error.message : String(error),
169
+ });
170
+ }
171
+ }
172
+ // Aggregate findings from all files and cross-file analysis
173
+ const findings = aggregateFindings(fileAnalyses, taintPaths);
174
+ // Build project metadata
175
+ const meta = {
176
+ name: options.name ?? extractProjectName(files),
177
+ root: options.root ?? extractRoot(files),
178
+ language: options.language ?? detectPrimaryLanguage(files),
179
+ framework: options.framework,
180
+ framework_version: options.frameworkVersion,
181
+ build_tool: options.buildTool,
182
+ total_files: files.length,
183
+ total_loc: totalLoc,
184
+ analyzed_at: new Date().toISOString(),
185
+ };
186
+ return {
187
+ meta,
188
+ files: fileAnalyses,
189
+ type_hierarchy: typeHierarchy,
190
+ cross_file_calls: crossFileCalls,
191
+ taint_paths: taintPaths,
192
+ findings,
193
+ };
194
+ }
195
+ /**
196
+ * Detect language from file extension.
197
+ */
198
+ function detectLanguage(filePath) {
199
+ if (filePath.endsWith('.java')) {
200
+ return 'java';
201
+ }
202
+ if (filePath.endsWith('.c') || filePath.endsWith('.h')) {
203
+ return 'c';
204
+ }
205
+ if (filePath.endsWith('.cpp') || filePath.endsWith('.cc') ||
206
+ filePath.endsWith('.cxx') || filePath.endsWith('.hpp')) {
207
+ return 'cpp';
208
+ }
209
+ if (filePath.endsWith('.js') || filePath.endsWith('.jsx') ||
210
+ filePath.endsWith('.mjs') || filePath.endsWith('.cjs')) {
211
+ return 'javascript';
212
+ }
213
+ if (filePath.endsWith('.ts') || filePath.endsWith('.tsx') ||
214
+ filePath.endsWith('.mts') || filePath.endsWith('.cts')) {
215
+ return 'typescript';
216
+ }
217
+ if (filePath.endsWith('.py')) {
218
+ return 'python';
219
+ }
220
+ return 'java'; // Default
221
+ }
222
+ /**
223
+ * Detect primary language of the project.
224
+ */
225
+ function detectPrimaryLanguage(files) {
226
+ const counts = { java: 0, c: 0, cpp: 0, javascript: 0, typescript: 0, python: 0, rust: 0 };
227
+ for (const file of files) {
228
+ const lang = detectLanguage(file.path);
229
+ counts[lang]++;
230
+ }
231
+ let maxLang = 'java';
232
+ let maxCount = 0;
233
+ for (const [lang, count] of Object.entries(counts)) {
234
+ if (count > maxCount) {
235
+ maxCount = count;
236
+ maxLang = lang;
237
+ }
238
+ }
239
+ return maxLang;
240
+ }
241
+ /**
242
+ * Extract project name from file paths.
243
+ */
244
+ function extractProjectName(files) {
245
+ if (files.length === 0) {
246
+ return 'unknown';
247
+ }
248
+ // Try to find common parent directory
249
+ const paths = files.map(f => f.path.split('/'));
250
+ if (paths.length === 0 || paths[0].length === 0) {
251
+ return 'unknown';
252
+ }
253
+ // Find common prefix
254
+ let commonPrefix = [];
255
+ for (let i = 0; i < paths[0].length; i++) {
256
+ const segment = paths[0][i];
257
+ if (paths.every(p => p[i] === segment)) {
258
+ commonPrefix.push(segment);
259
+ }
260
+ else {
261
+ break;
262
+ }
263
+ }
264
+ // Return last segment of common prefix
265
+ if (commonPrefix.length > 0) {
266
+ return commonPrefix[commonPrefix.length - 1];
267
+ }
268
+ return 'unknown';
269
+ }
270
+ /**
271
+ * Extract root directory from file paths.
272
+ */
273
+ function extractRoot(files) {
274
+ if (files.length === 0) {
275
+ return '/';
276
+ }
277
+ const paths = files.map(f => f.path.split('/'));
278
+ if (paths.length === 0) {
279
+ return '/';
280
+ }
281
+ // Find common prefix
282
+ const commonPrefix = [];
283
+ for (let i = 0; i < paths[0].length - 1; i++) { // -1 to exclude filename
284
+ const segment = paths[0][i];
285
+ if (paths.every(p => p[i] === segment)) {
286
+ commonPrefix.push(segment);
287
+ }
288
+ else {
289
+ break;
290
+ }
291
+ }
292
+ return commonPrefix.join('/') || '/';
293
+ }
294
+ /**
295
+ * Aggregate findings from file analyses and cross-file taint paths.
296
+ */
297
+ function aggregateFindings(fileAnalyses, taintPaths) {
298
+ const findings = [];
299
+ const seenIds = new Set();
300
+ // Collect findings from individual files
301
+ // (Currently findings are generated per-file, but we may want to dedupe)
302
+ // Generate findings from cross-file taint paths
303
+ for (const path of taintPaths) {
304
+ if (path.path_exists && path.sanitizers_in_path.length === 0) {
305
+ const id = `cross-file-${path.source.file}:${path.source.line}-${path.sink.file}:${path.sink.line}`;
306
+ if (!seenIds.has(id)) {
307
+ seenIds.add(id);
308
+ findings.push({
309
+ id,
310
+ type: path.sink.type,
311
+ cwe: path.sink.cwe,
312
+ severity: calculateSeverity({
313
+ sourceType: path.source.type,
314
+ sinkType: path.sink.type,
315
+ pathExists: path.path_exists,
316
+ confidence: path.confidence,
317
+ }),
318
+ confidence: path.confidence,
319
+ source: {
320
+ file: path.source.file,
321
+ line: path.source.line,
322
+ code: path.source.code,
323
+ },
324
+ sink: {
325
+ file: path.sink.file,
326
+ line: path.sink.line,
327
+ code: path.sink.code,
328
+ },
329
+ path: path.hops,
330
+ exploitable: path.path_exists && path.confidence > 0.7,
331
+ explanation: generateExplanation(path),
332
+ remediation: getRemediation(path.sink.type),
333
+ verification: {
334
+ graph_path_exists: path.path_exists,
335
+ llm_verified: false,
336
+ llm_confidence: 0,
337
+ },
338
+ });
339
+ }
340
+ }
341
+ }
342
+ // Sort by severity
343
+ const severityOrder = { critical: 0, high: 1, medium: 2, low: 3 };
344
+ findings.sort((a, b) => severityOrder[a.severity] - severityOrder[b.severity]);
345
+ return findings;
346
+ }
347
+ /**
348
+ * Generate explanation for a taint path.
349
+ */
350
+ function generateExplanation(path) {
351
+ const sourceDesc = `User-controlled data from ${path.source.type} at ${path.source.file}:${path.source.line}`;
352
+ const sinkDesc = `reaches a ${path.sink.type} sink at ${path.sink.file}:${path.sink.line}`;
353
+ const hopDesc = path.hops.length > 0
354
+ ? ` through ${path.hops.length} intermediate step(s)`
355
+ : ' directly';
356
+ return `${sourceDesc}${hopDesc} and ${sinkDesc}. ${path.sink.cwe}`;
357
+ }
358
+ //# sourceMappingURL=analyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../src/project/analyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Cross-File Call Graph Builder
3
+ *
4
+ * Links method calls across files by matching:
5
+ * - Imports to exported symbols
6
+ * - Field types to their class definitions
7
+ * - Method calls to their target implementations
8
+ */
9
+ import type { FileAnalysis, TypeHierarchy, CrossFileCall } from 'circle-ir';
10
+ /**
11
+ * Build cross-file call graph from analyzed files.
12
+ */
13
+ export declare function buildCrossFileCalls(files: FileAnalysis[], typeHierarchy: TypeHierarchy): CrossFileCall[];
14
+ /**
15
+ * Find all callers of a method across the project.
16
+ */
17
+ export declare function findCallers(targetFile: string, targetMethod: string, crossFileCalls: CrossFileCall[]): CrossFileCall[];
18
+ /**
19
+ * Find all callees from a method across the project.
20
+ */
21
+ export declare function findCallees(sourceFile: string, sourceMethod: string, crossFileCalls: CrossFileCall[]): CrossFileCall[];
22
+ //# sourceMappingURL=call-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call-graph.d.ts","sourceRoot":"","sources":["../../src/project/call-graph.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,YAAY,EACZ,aAAa,EACb,aAAa,EAOd,MAAM,WAAW,CAAC;AAcnB;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,YAAY,EAAE,EACrB,aAAa,EAAE,aAAa,GAC3B,aAAa,EAAE,CAkDjB;AA6OD;;GAEG;AACH,wBAAgB,WAAW,CACzB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,aAAa,EAAE,GAC9B,aAAa,EAAE,CAKjB;AAED;;GAEG;AACH,wBAAgB,WAAW,CACzB,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,aAAa,EAAE,GAC9B,aAAa,EAAE,CAKjB"}
@@ -0,0 +1,246 @@
1
+ /**
2
+ * Cross-File Call Graph Builder
3
+ *
4
+ * Links method calls across files by matching:
5
+ * - Imports to exported symbols
6
+ * - Field types to their class definitions
7
+ * - Method calls to their target implementations
8
+ */
9
+ import { findAllImplementations } from './type-hierarchy.js';
10
+ /**
11
+ * Build cross-file call graph from analyzed files.
12
+ */
13
+ export function buildCrossFileCalls(files, typeHierarchy) {
14
+ const crossFileCalls = [];
15
+ const symbolTable = buildSymbolTable(files);
16
+ let callId = 0;
17
+ for (const fileAnalysis of files) {
18
+ const file = fileAnalysis.file;
19
+ const analysis = fileAnalysis.analysis;
20
+ // Get imports for this file to resolve external types
21
+ const imports = analysis.imports;
22
+ const importedTypes = buildImportMap(imports);
23
+ // Get fields and their types for this file
24
+ const fieldTypes = buildFieldTypeMap(analysis.types);
25
+ // Analyze each call
26
+ for (const call of analysis.calls) {
27
+ const targetInfo = resolveCallTarget(call, file, fieldTypes, importedTypes, symbolTable, typeHierarchy);
28
+ if (targetInfo && targetInfo.file !== file) {
29
+ // This is a cross-file call
30
+ crossFileCalls.push({
31
+ id: `call-${++callId}`,
32
+ from: {
33
+ file,
34
+ method: call.in_method ?? 'unknown',
35
+ line: call.location.line,
36
+ },
37
+ to: {
38
+ file: targetInfo.file,
39
+ method: targetInfo.method,
40
+ line: targetInfo.line,
41
+ },
42
+ args_mapping: buildArgMapping(call, targetInfo.params),
43
+ resolved: true,
44
+ });
45
+ }
46
+ }
47
+ }
48
+ return crossFileCalls;
49
+ }
50
+ /**
51
+ * Build a symbol table for fast lookups.
52
+ */
53
+ function buildSymbolTable(files) {
54
+ const typeToFile = new Map();
55
+ const fileExports = new Map();
56
+ const fileImports = new Map();
57
+ const typeMethods = new Map();
58
+ for (const fileAnalysis of files) {
59
+ const file = fileAnalysis.file;
60
+ const analysis = fileAnalysis.analysis;
61
+ // Store exports
62
+ fileExports.set(file, analysis.exports);
63
+ // Store imports
64
+ fileImports.set(file, analysis.imports);
65
+ // Store types and their methods
66
+ for (const type of analysis.types) {
67
+ const qualifiedName = type.package
68
+ ? `${type.package}.${type.name}`
69
+ : type.name;
70
+ typeToFile.set(qualifiedName, file);
71
+ typeToFile.set(type.name, file); // Also store simple name
72
+ typeMethods.set(qualifiedName, type.methods);
73
+ typeMethods.set(type.name, type.methods);
74
+ }
75
+ }
76
+ return { typeToFile, fileExports, fileImports, typeMethods };
77
+ }
78
+ /**
79
+ * Build a map of import names to their packages.
80
+ */
81
+ function buildImportMap(imports) {
82
+ const importMap = new Map();
83
+ for (const imp of imports) {
84
+ if (!imp.is_wildcard) {
85
+ importMap.set(imp.imported_name, imp.from_package ?? '');
86
+ }
87
+ }
88
+ return importMap;
89
+ }
90
+ /**
91
+ * Build a map of field names to their types.
92
+ */
93
+ function buildFieldTypeMap(types) {
94
+ const fieldTypes = new Map();
95
+ for (const type of types) {
96
+ for (const field of type.fields) {
97
+ if (field.type) {
98
+ fieldTypes.set(field.name, field.type);
99
+ }
100
+ }
101
+ }
102
+ return fieldTypes;
103
+ }
104
+ /**
105
+ * Resolve a call to its target method.
106
+ */
107
+ function resolveCallTarget(call, currentFile, fieldTypes, importedTypes, symbolTable, typeHierarchy) {
108
+ // If no receiver, it's a local call or static import
109
+ if (!call.receiver) {
110
+ return null; // Local calls within the same file
111
+ }
112
+ // Try to determine the type of the receiver
113
+ const receiverType = inferReceiverType(call.receiver, fieldTypes, importedTypes);
114
+ if (!receiverType) {
115
+ return null;
116
+ }
117
+ // Find the file containing this type
118
+ const targetFile = symbolTable.typeToFile.get(receiverType);
119
+ if (!targetFile) {
120
+ return null; // External type (not in project)
121
+ }
122
+ // Find the method in the target type
123
+ const methods = symbolTable.typeMethods.get(receiverType);
124
+ if (!methods) {
125
+ return null;
126
+ }
127
+ const targetMethod = methods.find(m => m.name === call.method_name);
128
+ if (!targetMethod) {
129
+ // Try interface implementations
130
+ const ifaceInfo = typeHierarchy.interfaces[receiverType];
131
+ if (ifaceInfo) {
132
+ // Find implementations and their methods
133
+ const implementations = findAllImplementations(receiverType, typeHierarchy);
134
+ for (const impl of implementations) {
135
+ const implMethods = symbolTable.typeMethods.get(impl);
136
+ const implFile = symbolTable.typeToFile.get(impl);
137
+ if (implMethods && implFile) {
138
+ const implMethod = implMethods.find(m => m.name === call.method_name);
139
+ if (implMethod) {
140
+ return {
141
+ file: implFile,
142
+ method: call.method_name, // Use simple method name for path finding compatibility
143
+ line: implMethod.start_line,
144
+ params: implMethod.parameters,
145
+ };
146
+ }
147
+ }
148
+ }
149
+ }
150
+ return null;
151
+ }
152
+ return {
153
+ file: targetFile,
154
+ method: call.method_name, // Use simple method name for path finding compatibility
155
+ line: targetMethod.start_line,
156
+ params: targetMethod.parameters,
157
+ };
158
+ }
159
+ /**
160
+ * Infer the type of a receiver expression.
161
+ */
162
+ function inferReceiverType(receiver, fieldTypes, importedTypes) {
163
+ // Check if receiver is a known field
164
+ const fieldType = fieldTypes.get(receiver);
165
+ if (fieldType) {
166
+ // Remove generics
167
+ return fieldType.split('<')[0].trim();
168
+ }
169
+ // Check if receiver looks like a class name (static call)
170
+ if (receiver[0] === receiver[0].toUpperCase()) {
171
+ // Could be a static call like ClassName.method()
172
+ // Check if it's an imported type
173
+ const pkg = importedTypes.get(receiver);
174
+ if (pkg) {
175
+ return pkg ? `${pkg}.${receiver}` : receiver;
176
+ }
177
+ return receiver;
178
+ }
179
+ // Common naming conventions
180
+ const commonMappings = {
181
+ userService: ['UserService'],
182
+ orderService: ['OrderService'],
183
+ userRepository: ['UserRepository'],
184
+ orderRepository: ['OrderRepository'],
185
+ entityManager: ['EntityManager'],
186
+ jdbcTemplate: ['JdbcTemplate'],
187
+ };
188
+ const possibleTypes = commonMappings[receiver];
189
+ if (possibleTypes && possibleTypes.length > 0) {
190
+ return possibleTypes[0];
191
+ }
192
+ // Try to infer from suffix patterns
193
+ if (receiver.endsWith('Service')) {
194
+ return receiver.charAt(0).toUpperCase() + receiver.slice(1);
195
+ }
196
+ if (receiver.endsWith('Repository')) {
197
+ return receiver.charAt(0).toUpperCase() + receiver.slice(1);
198
+ }
199
+ if (receiver.endsWith('Controller')) {
200
+ return receiver.charAt(0).toUpperCase() + receiver.slice(1);
201
+ }
202
+ return null;
203
+ }
204
+ /**
205
+ * Build argument mapping between caller and callee.
206
+ */
207
+ function buildArgMapping(call, calleeParams) {
208
+ const mappings = [];
209
+ for (let i = 0; i < call.arguments.length && i < calleeParams.length; i++) {
210
+ mappings.push({
211
+ caller_arg: i,
212
+ callee_param: i,
213
+ // Assume taint propagates for non-primitive types
214
+ taint_propagates: !isPrimitiveType(calleeParams[i].type),
215
+ });
216
+ }
217
+ return mappings;
218
+ }
219
+ /**
220
+ * Check if a type is a primitive type.
221
+ */
222
+ function isPrimitiveType(type) {
223
+ if (!type) {
224
+ return false;
225
+ }
226
+ const primitives = [
227
+ 'int', 'long', 'short', 'byte', 'float', 'double', 'boolean', 'char',
228
+ 'Integer', 'Long', 'Short', 'Byte', 'Float', 'Double', 'Boolean', 'Character',
229
+ ];
230
+ return primitives.includes(type);
231
+ }
232
+ /**
233
+ * Find all callers of a method across the project.
234
+ */
235
+ export function findCallers(targetFile, targetMethod, crossFileCalls) {
236
+ return crossFileCalls.filter(call => call.to.file === targetFile &&
237
+ call.to.method.includes(targetMethod));
238
+ }
239
+ /**
240
+ * Find all callees from a method across the project.
241
+ */
242
+ export function findCallees(sourceFile, sourceMethod, crossFileCalls) {
243
+ return crossFileCalls.filter(call => call.from.file === sourceFile &&
244
+ call.from.method === sourceMethod);
245
+ }
246
+ //# sourceMappingURL=call-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"call-graph.js","sourceRoot":"","sources":["../../src/project/call-graph.ts"],"names":[],"mappings":"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"}