@opencodereview/core 1.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (453) hide show
  1. package/dist/ai/anthropic-provider.d.ts +41 -0
  2. package/dist/ai/anthropic-provider.d.ts.map +1 -0
  3. package/dist/ai/anthropic-provider.js +139 -0
  4. package/dist/ai/anthropic-provider.js.map +1 -0
  5. package/dist/ai/index.d.ts +39 -0
  6. package/dist/ai/index.d.ts.map +1 -0
  7. package/dist/ai/index.js +41 -0
  8. package/dist/ai/index.js.map +1 -0
  9. package/dist/ai/ollama-provider.d.ts +46 -0
  10. package/dist/ai/ollama-provider.d.ts.map +1 -0
  11. package/dist/ai/ollama-provider.js +149 -0
  12. package/dist/ai/ollama-provider.js.map +1 -0
  13. package/dist/ai/openai-provider.d.ts +44 -0
  14. package/dist/ai/openai-provider.d.ts.map +1 -0
  15. package/dist/ai/openai-provider.js +137 -0
  16. package/dist/ai/openai-provider.js.map +1 -0
  17. package/dist/ai/orchestrator.d.ts +60 -0
  18. package/dist/ai/orchestrator.d.ts.map +1 -0
  19. package/dist/ai/orchestrator.js +188 -0
  20. package/dist/ai/orchestrator.js.map +1 -0
  21. package/dist/ai/prompts.d.ts +27 -0
  22. package/dist/ai/prompts.d.ts.map +1 -0
  23. package/dist/ai/prompts.js +112 -0
  24. package/dist/ai/prompts.js.map +1 -0
  25. package/dist/ai/types.d.ts +75 -0
  26. package/dist/ai/types.d.ts.map +1 -0
  27. package/dist/ai/types.js +10 -0
  28. package/dist/ai/types.js.map +1 -0
  29. package/dist/ai/v4/embedding/index.d.ts +10 -0
  30. package/dist/ai/v4/embedding/index.d.ts.map +1 -0
  31. package/dist/ai/v4/embedding/index.js +10 -0
  32. package/dist/ai/v4/embedding/index.js.map +1 -0
  33. package/dist/ai/v4/embedding/local.d.ts +68 -0
  34. package/dist/ai/v4/embedding/local.d.ts.map +1 -0
  35. package/dist/ai/v4/embedding/local.js +167 -0
  36. package/dist/ai/v4/embedding/local.js.map +1 -0
  37. package/dist/ai/v4/embedding/ollama.d.ts +58 -0
  38. package/dist/ai/v4/embedding/ollama.d.ts.map +1 -0
  39. package/dist/ai/v4/embedding/ollama.js +101 -0
  40. package/dist/ai/v4/embedding/ollama.js.map +1 -0
  41. package/dist/ai/v4/embedding/openai.d.ts +36 -0
  42. package/dist/ai/v4/embedding/openai.d.ts.map +1 -0
  43. package/dist/ai/v4/embedding/openai.js +76 -0
  44. package/dist/ai/v4/embedding/openai.js.map +1 -0
  45. package/dist/ai/v4/embedding/similarity.d.ts +36 -0
  46. package/dist/ai/v4/embedding/similarity.d.ts.map +1 -0
  47. package/dist/ai/v4/embedding/similarity.js +60 -0
  48. package/dist/ai/v4/embedding/similarity.js.map +1 -0
  49. package/dist/ai/v4/index.d.ts +51 -0
  50. package/dist/ai/v4/index.d.ts.map +1 -0
  51. package/dist/ai/v4/index.js +54 -0
  52. package/dist/ai/v4/index.js.map +1 -0
  53. package/dist/ai/v4/llm/anthropic.d.ts +38 -0
  54. package/dist/ai/v4/llm/anthropic.d.ts.map +1 -0
  55. package/dist/ai/v4/llm/anthropic.js +86 -0
  56. package/dist/ai/v4/llm/anthropic.js.map +1 -0
  57. package/dist/ai/v4/llm/index.d.ts +9 -0
  58. package/dist/ai/v4/llm/index.d.ts.map +1 -0
  59. package/dist/ai/v4/llm/index.js +9 -0
  60. package/dist/ai/v4/llm/index.js.map +1 -0
  61. package/dist/ai/v4/llm/ollama.d.ts +39 -0
  62. package/dist/ai/v4/llm/ollama.d.ts.map +1 -0
  63. package/dist/ai/v4/llm/ollama.js +95 -0
  64. package/dist/ai/v4/llm/ollama.js.map +1 -0
  65. package/dist/ai/v4/llm/openai.d.ts +38 -0
  66. package/dist/ai/v4/llm/openai.d.ts.map +1 -0
  67. package/dist/ai/v4/llm/openai.js +88 -0
  68. package/dist/ai/v4/llm/openai.js.map +1 -0
  69. package/dist/ai/v4/patterns/defect-patterns.d.ts +57 -0
  70. package/dist/ai/v4/patterns/defect-patterns.d.ts.map +1 -0
  71. package/dist/ai/v4/patterns/defect-patterns.js +331 -0
  72. package/dist/ai/v4/patterns/defect-patterns.js.map +1 -0
  73. package/dist/ai/v4/patterns/index.d.ts +8 -0
  74. package/dist/ai/v4/patterns/index.d.ts.map +1 -0
  75. package/dist/ai/v4/patterns/index.js +7 -0
  76. package/dist/ai/v4/patterns/index.js.map +1 -0
  77. package/dist/ai/v4/pipeline.d.ts +74 -0
  78. package/dist/ai/v4/pipeline.d.ts.map +1 -0
  79. package/dist/ai/v4/pipeline.js +381 -0
  80. package/dist/ai/v4/pipeline.js.map +1 -0
  81. package/dist/ai/v4/sla.d.ts +62 -0
  82. package/dist/ai/v4/sla.d.ts.map +1 -0
  83. package/dist/ai/v4/sla.js +136 -0
  84. package/dist/ai/v4/sla.js.map +1 -0
  85. package/dist/ai/v4/types.d.ts +117 -0
  86. package/dist/ai/v4/types.d.ts.map +1 -0
  87. package/dist/ai/v4/types.js +16 -0
  88. package/dist/ai/v4/types.js.map +1 -0
  89. package/dist/ai-healer/prompt-builder.d.ts +33 -0
  90. package/dist/ai-healer/prompt-builder.d.ts.map +1 -0
  91. package/dist/ai-healer/prompt-builder.js +89 -0
  92. package/dist/ai-healer/prompt-builder.js.map +1 -0
  93. package/dist/config/defaults.d.ts +14 -0
  94. package/dist/config/defaults.d.ts.map +1 -0
  95. package/dist/config/defaults.js +57 -0
  96. package/dist/config/defaults.js.map +1 -0
  97. package/dist/config/index.d.ts +8 -0
  98. package/dist/config/index.d.ts.map +1 -0
  99. package/dist/config/index.js +6 -0
  100. package/dist/config/index.js.map +1 -0
  101. package/dist/config/loader.d.ts +33 -0
  102. package/dist/config/loader.d.ts.map +1 -0
  103. package/dist/config/loader.js +245 -0
  104. package/dist/config/loader.js.map +1 -0
  105. package/dist/config/types.d.ts +58 -0
  106. package/dist/config/types.d.ts.map +1 -0
  107. package/dist/config/types.js +7 -0
  108. package/dist/config/types.js.map +1 -0
  109. package/dist/config/v4-config.d.ts +77 -0
  110. package/dist/config/v4-config.d.ts.map +1 -0
  111. package/dist/config/v4-config.js +336 -0
  112. package/dist/config/v4-config.js.map +1 -0
  113. package/dist/detectors/ai-detector.d.ts +38 -0
  114. package/dist/detectors/ai-detector.d.ts.map +1 -0
  115. package/dist/detectors/ai-detector.js +62 -0
  116. package/dist/detectors/ai-detector.js.map +1 -0
  117. package/dist/detectors/context-break.d.ts +57 -0
  118. package/dist/detectors/context-break.d.ts.map +1 -0
  119. package/dist/detectors/context-break.js +199 -0
  120. package/dist/detectors/context-break.js.map +1 -0
  121. package/dist/detectors/deep-hallucination.d.ts +42 -0
  122. package/dist/detectors/deep-hallucination.d.ts.map +1 -0
  123. package/dist/detectors/deep-hallucination.js +297 -0
  124. package/dist/detectors/deep-hallucination.js.map +1 -0
  125. package/dist/detectors/duplication.d.ts +61 -0
  126. package/dist/detectors/duplication.d.ts.map +1 -0
  127. package/dist/detectors/duplication.js +204 -0
  128. package/dist/detectors/duplication.js.map +1 -0
  129. package/dist/detectors/hallucination.d.ts +80 -0
  130. package/dist/detectors/hallucination.d.ts.map +1 -0
  131. package/dist/detectors/hallucination.js +350 -0
  132. package/dist/detectors/hallucination.js.map +1 -0
  133. package/dist/detectors/index.d.ts +35 -0
  134. package/dist/detectors/index.d.ts.map +1 -0
  135. package/dist/detectors/index.js +33 -0
  136. package/dist/detectors/index.js.map +1 -0
  137. package/dist/detectors/logic-gap.d.ts +58 -0
  138. package/dist/detectors/logic-gap.d.ts.map +1 -0
  139. package/dist/detectors/logic-gap.js +284 -0
  140. package/dist/detectors/logic-gap.js.map +1 -0
  141. package/dist/detectors/over-engineering.d.ts +44 -0
  142. package/dist/detectors/over-engineering.d.ts.map +1 -0
  143. package/dist/detectors/over-engineering.js +257 -0
  144. package/dist/detectors/over-engineering.js.map +1 -0
  145. package/dist/detectors/security-pattern.d.ts +43 -0
  146. package/dist/detectors/security-pattern.d.ts.map +1 -0
  147. package/dist/detectors/security-pattern.js +235 -0
  148. package/dist/detectors/security-pattern.js.map +1 -0
  149. package/dist/detectors/stale-api.d.ts +44 -0
  150. package/dist/detectors/stale-api.d.ts.map +1 -0
  151. package/dist/detectors/stale-api.js +160 -0
  152. package/dist/detectors/stale-api.js.map +1 -0
  153. package/dist/detectors/type-safety.d.ts +41 -0
  154. package/dist/detectors/type-safety.d.ts.map +1 -0
  155. package/dist/detectors/type-safety.js +306 -0
  156. package/dist/detectors/type-safety.js.map +1 -0
  157. package/dist/detectors/v4/context-coherence.d.ts +67 -0
  158. package/dist/detectors/v4/context-coherence.d.ts.map +1 -0
  159. package/dist/detectors/v4/context-coherence.js +319 -0
  160. package/dist/detectors/v4/context-coherence.js.map +1 -0
  161. package/dist/detectors/v4/hallucinated-import.d.ts +52 -0
  162. package/dist/detectors/v4/hallucinated-import.d.ts.map +1 -0
  163. package/dist/detectors/v4/hallucinated-import.js +206 -0
  164. package/dist/detectors/v4/hallucinated-import.js.map +1 -0
  165. package/dist/detectors/v4/index.d.ts +28 -0
  166. package/dist/detectors/v4/index.d.ts.map +1 -0
  167. package/dist/detectors/v4/index.js +40 -0
  168. package/dist/detectors/v4/index.js.map +1 -0
  169. package/dist/detectors/v4/over-engineering.d.ts +69 -0
  170. package/dist/detectors/v4/over-engineering.d.ts.map +1 -0
  171. package/dist/detectors/v4/over-engineering.js +234 -0
  172. package/dist/detectors/v4/over-engineering.js.map +1 -0
  173. package/dist/detectors/v4/security-pattern.d.ts +46 -0
  174. package/dist/detectors/v4/security-pattern.d.ts.map +1 -0
  175. package/dist/detectors/v4/security-pattern.js +233 -0
  176. package/dist/detectors/v4/security-pattern.js.map +1 -0
  177. package/dist/detectors/v4/stale-api.d.ts +59 -0
  178. package/dist/detectors/v4/stale-api.d.ts.map +1 -0
  179. package/dist/detectors/v4/stale-api.js +470 -0
  180. package/dist/detectors/v4/stale-api.js.map +1 -0
  181. package/dist/detectors/v4/types.d.ts +74 -0
  182. package/dist/detectors/v4/types.d.ts.map +1 -0
  183. package/dist/detectors/v4/types.js +10 -0
  184. package/dist/detectors/v4/types.js.map +1 -0
  185. package/dist/diff/filter.d.ts +35 -0
  186. package/dist/diff/filter.d.ts.map +1 -0
  187. package/dist/diff/filter.js +65 -0
  188. package/dist/diff/filter.js.map +1 -0
  189. package/dist/diff/index.d.ts +9 -0
  190. package/dist/diff/index.d.ts.map +1 -0
  191. package/dist/diff/index.js +8 -0
  192. package/dist/diff/index.js.map +1 -0
  193. package/dist/diff/parser.d.ts +61 -0
  194. package/dist/diff/parser.d.ts.map +1 -0
  195. package/dist/diff/parser.js +203 -0
  196. package/dist/diff/parser.js.map +1 -0
  197. package/dist/i18n/en.d.ts +18 -0
  198. package/dist/i18n/en.d.ts.map +1 -0
  199. package/dist/i18n/en.js +83 -0
  200. package/dist/i18n/en.js.map +1 -0
  201. package/dist/i18n/index.d.ts +13 -0
  202. package/dist/i18n/index.d.ts.map +1 -0
  203. package/dist/i18n/index.js +14 -0
  204. package/dist/i18n/index.js.map +1 -0
  205. package/dist/i18n/provider.d.ts +54 -0
  206. package/dist/i18n/provider.d.ts.map +1 -0
  207. package/dist/i18n/provider.js +88 -0
  208. package/dist/i18n/provider.js.map +1 -0
  209. package/dist/i18n/types.d.ts +37 -0
  210. package/dist/i18n/types.d.ts.map +1 -0
  211. package/dist/i18n/types.js +10 -0
  212. package/dist/i18n/types.js.map +1 -0
  213. package/dist/i18n/zh.d.ts +14 -0
  214. package/dist/i18n/zh.d.ts.map +1 -0
  215. package/dist/i18n/zh.js +83 -0
  216. package/dist/i18n/zh.js.map +1 -0
  217. package/dist/index.d.ts +113 -0
  218. package/dist/index.d.ts.map +1 -0
  219. package/dist/index.js +106 -0
  220. package/dist/index.js.map +1 -0
  221. package/dist/ir/index.d.ts +10 -0
  222. package/dist/ir/index.d.ts.map +1 -0
  223. package/dist/ir/index.js +9 -0
  224. package/dist/ir/index.js.map +1 -0
  225. package/dist/ir/types.d.ts +126 -0
  226. package/dist/ir/types.d.ts.map +1 -0
  227. package/dist/ir/types.js +33 -0
  228. package/dist/ir/types.js.map +1 -0
  229. package/dist/languages/go/index.d.ts +7 -0
  230. package/dist/languages/go/index.d.ts.map +1 -0
  231. package/dist/languages/go/index.js +7 -0
  232. package/dist/languages/go/index.js.map +1 -0
  233. package/dist/languages/go/parser.d.ts +89 -0
  234. package/dist/languages/go/parser.d.ts.map +1 -0
  235. package/dist/languages/go/parser.js +509 -0
  236. package/dist/languages/go/parser.js.map +1 -0
  237. package/dist/languages/index.d.ts +13 -0
  238. package/dist/languages/index.d.ts.map +1 -0
  239. package/dist/languages/index.js +14 -0
  240. package/dist/languages/index.js.map +1 -0
  241. package/dist/languages/java/index.d.ts +7 -0
  242. package/dist/languages/java/index.d.ts.map +1 -0
  243. package/dist/languages/java/index.js +7 -0
  244. package/dist/languages/java/index.js.map +1 -0
  245. package/dist/languages/java/parser.d.ts +82 -0
  246. package/dist/languages/java/parser.d.ts.map +1 -0
  247. package/dist/languages/java/parser.js +492 -0
  248. package/dist/languages/java/parser.js.map +1 -0
  249. package/dist/languages/kotlin/index.d.ts +7 -0
  250. package/dist/languages/kotlin/index.d.ts.map +1 -0
  251. package/dist/languages/kotlin/index.js +7 -0
  252. package/dist/languages/kotlin/index.js.map +1 -0
  253. package/dist/languages/kotlin/parser.d.ts +84 -0
  254. package/dist/languages/kotlin/parser.d.ts.map +1 -0
  255. package/dist/languages/kotlin/parser.js +507 -0
  256. package/dist/languages/kotlin/parser.js.map +1 -0
  257. package/dist/languages/python/index.d.ts +7 -0
  258. package/dist/languages/python/index.d.ts.map +1 -0
  259. package/dist/languages/python/index.js +7 -0
  260. package/dist/languages/python/index.js.map +1 -0
  261. package/dist/languages/python/parser.d.ts +91 -0
  262. package/dist/languages/python/parser.d.ts.map +1 -0
  263. package/dist/languages/python/parser.js +375 -0
  264. package/dist/languages/python/parser.js.map +1 -0
  265. package/dist/languages/registry.d.ts +81 -0
  266. package/dist/languages/registry.d.ts.map +1 -0
  267. package/dist/languages/registry.js +150 -0
  268. package/dist/languages/registry.js.map +1 -0
  269. package/dist/languages/types.d.ts +137 -0
  270. package/dist/languages/types.d.ts.map +1 -0
  271. package/dist/languages/types.js +10 -0
  272. package/dist/languages/types.js.map +1 -0
  273. package/dist/languages/typescript/index.d.ts +7 -0
  274. package/dist/languages/typescript/index.d.ts.map +1 -0
  275. package/dist/languages/typescript/index.js +7 -0
  276. package/dist/languages/typescript/index.js.map +1 -0
  277. package/dist/languages/typescript/parser.d.ts +51 -0
  278. package/dist/languages/typescript/parser.d.ts.map +1 -0
  279. package/dist/languages/typescript/parser.js +286 -0
  280. package/dist/languages/typescript/parser.js.map +1 -0
  281. package/dist/license/generator.d.ts +43 -0
  282. package/dist/license/generator.d.ts.map +1 -0
  283. package/dist/license/generator.js +72 -0
  284. package/dist/license/generator.js.map +1 -0
  285. package/dist/license/index.d.ts +11 -0
  286. package/dist/license/index.d.ts.map +1 -0
  287. package/dist/license/index.js +12 -0
  288. package/dist/license/index.js.map +1 -0
  289. package/dist/license/types.d.ts +85 -0
  290. package/dist/license/types.d.ts.map +1 -0
  291. package/dist/license/types.js +10 -0
  292. package/dist/license/types.js.map +1 -0
  293. package/dist/license/validator.d.ts +77 -0
  294. package/dist/license/validator.d.ts.map +1 -0
  295. package/dist/license/validator.js +275 -0
  296. package/dist/license/validator.js.map +1 -0
  297. package/dist/parser/extractor.d.ts +31 -0
  298. package/dist/parser/extractor.d.ts.map +1 -0
  299. package/dist/parser/extractor.js +10 -0
  300. package/dist/parser/extractor.js.map +1 -0
  301. package/dist/parser/extractors/go.d.ts +21 -0
  302. package/dist/parser/extractors/go.d.ts.map +1 -0
  303. package/dist/parser/extractors/go.js +569 -0
  304. package/dist/parser/extractors/go.js.map +1 -0
  305. package/dist/parser/extractors/index.d.ts +13 -0
  306. package/dist/parser/extractors/index.d.ts.map +1 -0
  307. package/dist/parser/extractors/index.js +13 -0
  308. package/dist/parser/extractors/index.js.map +1 -0
  309. package/dist/parser/extractors/java.d.ts +24 -0
  310. package/dist/parser/extractors/java.d.ts.map +1 -0
  311. package/dist/parser/extractors/java.js +611 -0
  312. package/dist/parser/extractors/java.js.map +1 -0
  313. package/dist/parser/extractors/kotlin.d.ts +25 -0
  314. package/dist/parser/extractors/kotlin.d.ts.map +1 -0
  315. package/dist/parser/extractors/kotlin.js +665 -0
  316. package/dist/parser/extractors/kotlin.js.map +1 -0
  317. package/dist/parser/extractors/python.d.ts +21 -0
  318. package/dist/parser/extractors/python.d.ts.map +1 -0
  319. package/dist/parser/extractors/python.js +514 -0
  320. package/dist/parser/extractors/python.js.map +1 -0
  321. package/dist/parser/extractors/typescript.d.ts +23 -0
  322. package/dist/parser/extractors/typescript.d.ts.map +1 -0
  323. package/dist/parser/extractors/typescript.js +664 -0
  324. package/dist/parser/extractors/typescript.js.map +1 -0
  325. package/dist/parser/index.d.ts +15 -0
  326. package/dist/parser/index.d.ts.map +1 -0
  327. package/dist/parser/index.js +14 -0
  328. package/dist/parser/index.js.map +1 -0
  329. package/dist/parser/manager.d.ts +50 -0
  330. package/dist/parser/manager.d.ts.map +1 -0
  331. package/dist/parser/manager.js +159 -0
  332. package/dist/parser/manager.js.map +1 -0
  333. package/dist/registry/builtins/go-builtins.d.ts +13 -0
  334. package/dist/registry/builtins/go-builtins.d.ts.map +1 -0
  335. package/dist/registry/builtins/go-builtins.js +63 -0
  336. package/dist/registry/builtins/go-builtins.js.map +1 -0
  337. package/dist/registry/builtins/java-builtins.d.ts +10 -0
  338. package/dist/registry/builtins/java-builtins.d.ts.map +1 -0
  339. package/dist/registry/builtins/java-builtins.js +59 -0
  340. package/dist/registry/builtins/java-builtins.js.map +1 -0
  341. package/dist/registry/builtins/kotlin-builtins.d.ts +10 -0
  342. package/dist/registry/builtins/kotlin-builtins.d.ts.map +1 -0
  343. package/dist/registry/builtins/kotlin-builtins.js +38 -0
  344. package/dist/registry/builtins/kotlin-builtins.js.map +1 -0
  345. package/dist/registry/builtins/node-builtins.d.ts +10 -0
  346. package/dist/registry/builtins/node-builtins.d.ts.map +1 -0
  347. package/dist/registry/builtins/node-builtins.js +36 -0
  348. package/dist/registry/builtins/node-builtins.js.map +1 -0
  349. package/dist/registry/builtins/python-builtins.d.ts +10 -0
  350. package/dist/registry/builtins/python-builtins.d.ts.map +1 -0
  351. package/dist/registry/builtins/python-builtins.js +43 -0
  352. package/dist/registry/builtins/python-builtins.js.map +1 -0
  353. package/dist/registry/cache.d.ts +53 -0
  354. package/dist/registry/cache.d.ts.map +1 -0
  355. package/dist/registry/cache.js +147 -0
  356. package/dist/registry/cache.js.map +1 -0
  357. package/dist/registry/go-registry.d.ts +52 -0
  358. package/dist/registry/go-registry.d.ts.map +1 -0
  359. package/dist/registry/go-registry.js +148 -0
  360. package/dist/registry/go-registry.js.map +1 -0
  361. package/dist/registry/index.d.ts +18 -0
  362. package/dist/registry/index.d.ts.map +1 -0
  363. package/dist/registry/index.js +21 -0
  364. package/dist/registry/index.js.map +1 -0
  365. package/dist/registry/maven-registry.d.ts +57 -0
  366. package/dist/registry/maven-registry.d.ts.map +1 -0
  367. package/dist/registry/maven-registry.js +155 -0
  368. package/dist/registry/maven-registry.js.map +1 -0
  369. package/dist/registry/npm-registry.d.ts +40 -0
  370. package/dist/registry/npm-registry.d.ts.map +1 -0
  371. package/dist/registry/npm-registry.js +155 -0
  372. package/dist/registry/npm-registry.js.map +1 -0
  373. package/dist/registry/pypi-registry.d.ts +49 -0
  374. package/dist/registry/pypi-registry.d.ts.map +1 -0
  375. package/dist/registry/pypi-registry.js +175 -0
  376. package/dist/registry/pypi-registry.js.map +1 -0
  377. package/dist/registry/registry-manager.d.ts +45 -0
  378. package/dist/registry/registry-manager.d.ts.map +1 -0
  379. package/dist/registry/registry-manager.js +107 -0
  380. package/dist/registry/registry-manager.js.map +1 -0
  381. package/dist/registry/types.d.ts +83 -0
  382. package/dist/registry/types.d.ts.map +1 -0
  383. package/dist/registry/types.js +12 -0
  384. package/dist/registry/types.js.map +1 -0
  385. package/dist/reporter/html-reporter.d.ts +20 -0
  386. package/dist/reporter/html-reporter.d.ts.map +1 -0
  387. package/dist/reporter/html-reporter.js +612 -0
  388. package/dist/reporter/html-reporter.js.map +1 -0
  389. package/dist/reporter/index.d.ts +28 -0
  390. package/dist/reporter/index.d.ts.map +1 -0
  391. package/dist/reporter/index.js +48 -0
  392. package/dist/reporter/index.js.map +1 -0
  393. package/dist/reporter/markdown-reporter.d.ts +16 -0
  394. package/dist/reporter/markdown-reporter.d.ts.map +1 -0
  395. package/dist/reporter/markdown-reporter.js +182 -0
  396. package/dist/reporter/markdown-reporter.js.map +1 -0
  397. package/dist/reporter/sarif-reporter.d.ts +67 -0
  398. package/dist/reporter/sarif-reporter.d.ts.map +1 -0
  399. package/dist/reporter/sarif-reporter.js +73 -0
  400. package/dist/reporter/sarif-reporter.js.map +1 -0
  401. package/dist/reporter/terminal-reporter.d.ts +14 -0
  402. package/dist/reporter/terminal-reporter.d.ts.map +1 -0
  403. package/dist/reporter/terminal-reporter.js +126 -0
  404. package/dist/reporter/terminal-reporter.js.map +1 -0
  405. package/dist/reporter/types.d.ts +43 -0
  406. package/dist/reporter/types.d.ts.map +1 -0
  407. package/dist/reporter/types.js +10 -0
  408. package/dist/reporter/types.js.map +1 -0
  409. package/dist/reporter/v4-html.d.ts +24 -0
  410. package/dist/reporter/v4-html.d.ts.map +1 -0
  411. package/dist/reporter/v4-html.js +359 -0
  412. package/dist/reporter/v4-html.js.map +1 -0
  413. package/dist/reporter/v4-terminal.d.ts +55 -0
  414. package/dist/reporter/v4-terminal.d.ts.map +1 -0
  415. package/dist/reporter/v4-terminal.js +199 -0
  416. package/dist/reporter/v4-terminal.js.map +1 -0
  417. package/dist/scanner/index.d.ts +9 -0
  418. package/dist/scanner/index.d.ts.map +1 -0
  419. package/dist/scanner/index.js +9 -0
  420. package/dist/scanner/index.js.map +1 -0
  421. package/dist/scanner/v4-scanner.d.ts +162 -0
  422. package/dist/scanner/v4-scanner.d.ts.map +1 -0
  423. package/dist/scanner/v4-scanner.js +327 -0
  424. package/dist/scanner/v4-scanner.js.map +1 -0
  425. package/dist/scorer/report.d.ts +52 -0
  426. package/dist/scorer/report.d.ts.map +1 -0
  427. package/dist/scorer/report.js +347 -0
  428. package/dist/scorer/report.js.map +1 -0
  429. package/dist/scorer/scoring-engine.d.ts +170 -0
  430. package/dist/scorer/scoring-engine.d.ts.map +1 -0
  431. package/dist/scorer/scoring-engine.js +308 -0
  432. package/dist/scorer/scoring-engine.js.map +1 -0
  433. package/dist/scorer/v4-adapter.d.ts +87 -0
  434. package/dist/scorer/v4-adapter.d.ts.map +1 -0
  435. package/dist/scorer/v4-adapter.js +145 -0
  436. package/dist/scorer/v4-adapter.js.map +1 -0
  437. package/dist/sla/index.d.ts +7 -0
  438. package/dist/sla/index.d.ts.map +1 -0
  439. package/dist/sla/index.js +6 -0
  440. package/dist/sla/index.js.map +1 -0
  441. package/dist/sla/tracker.d.ts +70 -0
  442. package/dist/sla/tracker.d.ts.map +1 -0
  443. package/dist/sla/tracker.js +151 -0
  444. package/dist/sla/tracker.js.map +1 -0
  445. package/dist/sla/types.d.ts +67 -0
  446. package/dist/sla/types.d.ts.map +1 -0
  447. package/dist/sla/types.js +42 -0
  448. package/dist/sla/types.js.map +1 -0
  449. package/dist/types.d.ts +172 -0
  450. package/dist/types.d.ts.map +1 -0
  451. package/dist/types.js +69 -0
  452. package/dist/types.js.map +1 -0
  453. package/package.json +97 -0
@@ -0,0 +1,319 @@
1
+ /**
2
+ * ContextCoherenceDetector — V4 detector for AI context window issues.
3
+ *
4
+ * Detects logic inconsistencies that arise from AI context window limitations.
5
+ * When AI models generate long code, they lose track of what they've already
6
+ * defined, used, or imported — leading to coherence issues.
7
+ *
8
+ * V4 improvements over V3:
9
+ * - Operates on CodeUnit IR (definitions, references, imports) instead of regex
10
+ * - Cross-unit analysis for referenced-but-undefined symbols
11
+ * - Structural analysis using definitions/references instead of source text
12
+ * - Dramatically reduced false positives
13
+ *
14
+ * @since 0.4.0
15
+ */
16
+ // ─── Detector ──────────────────────────────────────────────────────
17
+ export class ContextCoherenceDetector {
18
+ id = 'context-coherence';
19
+ name = 'Context Coherence Detector';
20
+ category = 'context-coherence';
21
+ supportedLanguages = [];
22
+ async detect(units, context) {
23
+ const results = [];
24
+ // Analysis 1: Unused non-exported definitions
25
+ this.detectUnusedDefinitions(units, results);
26
+ // Analysis 2: Inconsistent import patterns within same file
27
+ this.detectInconsistentImports(units, results);
28
+ // Analysis 3: Duplicate function names in same scope
29
+ this.detectDuplicateFunctionNames(units, results);
30
+ // Analysis 4: Referenced but undefined symbols (cross-unit)
31
+ this.detectUndefinedReferences(units, results);
32
+ return results;
33
+ }
34
+ /**
35
+ * Analysis 1: Detect functions/classes/types defined but never used and not exported.
36
+ *
37
+ * AI models sometimes define helper functions that are never called,
38
+ * or define types/interfaces that are never used — a sign of context loss.
39
+ */
40
+ detectUnusedDefinitions(units, results) {
41
+ // Build a set of all referenced symbol names across all units
42
+ const allReferencedNames = new Set();
43
+ const allCalledNames = new Set();
44
+ for (const unit of units) {
45
+ for (const ref of unit.references) {
46
+ allReferencedNames.add(ref.name);
47
+ }
48
+ for (const call of unit.calls) {
49
+ allCalledNames.add(call.method);
50
+ if (call.callee) {
51
+ allCalledNames.add(call.callee);
52
+ }
53
+ }
54
+ // Also count imports as usage context
55
+ for (const imp of unit.imports) {
56
+ for (const sym of imp.symbols) {
57
+ allReferencedNames.add(sym);
58
+ }
59
+ }
60
+ }
61
+ // Check each definition
62
+ for (const unit of units) {
63
+ for (const def of unit.definitions) {
64
+ // Skip exported definitions — they're intended for external use
65
+ if (def.exported)
66
+ continue;
67
+ // Only flag functions, classes, types, interfaces
68
+ if (!['function', 'class', 'type', 'interface'].includes(def.kind))
69
+ continue;
70
+ // Check if the symbol is referenced anywhere
71
+ const isReferenced = allReferencedNames.has(def.name) || allCalledNames.has(def.name);
72
+ if (!isReferenced) {
73
+ results.push({
74
+ detectorId: this.id,
75
+ severity: 'info',
76
+ category: this.category,
77
+ messageKey: 'context-coherence.unused-definition',
78
+ message: `${this.capitalizeKind(def.kind)} "${def.name}" is defined but never used and not exported. This may indicate a context window issue.`,
79
+ file: unit.file,
80
+ line: def.line + 1, // 0-based to 1-based
81
+ confidence: 0.6,
82
+ metadata: {
83
+ symbolName: def.name,
84
+ symbolKind: def.kind,
85
+ analysisType: 'unused-definition',
86
+ },
87
+ });
88
+ }
89
+ }
90
+ }
91
+ }
92
+ /**
93
+ * Analysis 2: Detect inconsistent import patterns within the same file.
94
+ *
95
+ * When AI loses context mid-generation, it may import the same functionality
96
+ * from different modules in different parts of the file. For example:
97
+ * - import { readFile } from 'fs' AND import { readFile } from 'fs/promises'
98
+ * - import lodash AND import underscore (same purpose)
99
+ */
100
+ detectInconsistentImports(units, results) {
101
+ for (const unit of units) {
102
+ if (unit.kind !== 'file')
103
+ continue;
104
+ if (unit.imports.length < 2)
105
+ continue;
106
+ // Check for duplicate symbol imports from different modules
107
+ const symbolToModules = new Map();
108
+ for (const imp of unit.imports) {
109
+ for (const sym of imp.symbols) {
110
+ if (!symbolToModules.has(sym)) {
111
+ symbolToModules.set(sym, []);
112
+ }
113
+ symbolToModules.get(sym).push({ module: imp.module, line: imp.line });
114
+ }
115
+ }
116
+ for (const [symbol, sources] of symbolToModules.entries()) {
117
+ // Get unique modules importing the same symbol
118
+ const uniqueModules = [...new Set(sources.map(s => s.module))];
119
+ if (uniqueModules.length > 1) {
120
+ results.push({
121
+ detectorId: this.id,
122
+ severity: 'warning',
123
+ category: this.category,
124
+ messageKey: 'context-coherence.inconsistent-import',
125
+ message: `Symbol "${symbol}" is imported from multiple modules: ${uniqueModules.map(m => `"${m}"`).join(', ')}. This may indicate a context window inconsistency.`,
126
+ file: unit.file,
127
+ line: sources[1].line + 1, // Report on the second occurrence
128
+ confidence: 0.75,
129
+ metadata: {
130
+ symbol,
131
+ modules: uniqueModules,
132
+ analysisType: 'inconsistent-import',
133
+ },
134
+ });
135
+ }
136
+ }
137
+ }
138
+ }
139
+ /**
140
+ * Analysis 3: Detect duplicate function names in the same scope.
141
+ *
142
+ * AI may re-define the same function name multiple times in a file
143
+ * when it loses track of what it has already generated.
144
+ */
145
+ detectDuplicateFunctionNames(units, results) {
146
+ // Group units by parent (same scope) and file
147
+ const scopeMap = new Map();
148
+ for (const unit of units) {
149
+ // Group functions/methods by their parent scope
150
+ if (unit.kind === 'function' || unit.kind === 'method') {
151
+ const scopeKey = `${unit.file}:${unit.parentId || 'file'}`;
152
+ if (!scopeMap.has(scopeKey)) {
153
+ scopeMap.set(scopeKey, []);
154
+ }
155
+ scopeMap.get(scopeKey).push(unit);
156
+ }
157
+ }
158
+ for (const [, scopeUnits] of scopeMap) {
159
+ const nameToUnits = this.groupByFunctionName(scopeUnits);
160
+ this.reportDuplicates(nameToUnits, results);
161
+ }
162
+ }
163
+ /** Group code units by their function/method definition names. */
164
+ groupByFunctionName(scopeUnits) {
165
+ const nameToUnits = new Map();
166
+ for (const unit of scopeUnits) {
167
+ for (const def of unit.definitions) {
168
+ if (def.kind !== 'function' && def.kind !== 'method')
169
+ continue;
170
+ if (!nameToUnits.has(def.name))
171
+ nameToUnits.set(def.name, []);
172
+ nameToUnits.get(def.name).push(unit);
173
+ }
174
+ }
175
+ return nameToUnits;
176
+ }
177
+ /** Report duplicate function definitions within the same scope. */
178
+ reportDuplicates(nameToUnits, results) {
179
+ for (const [name, duplicateUnits] of nameToUnits) {
180
+ if (duplicateUnits.length <= 1)
181
+ continue;
182
+ for (let i = 1; i < duplicateUnits.length; i++) {
183
+ const unit = duplicateUnits[i];
184
+ results.push({
185
+ detectorId: this.id,
186
+ severity: 'warning',
187
+ category: this.category,
188
+ messageKey: 'context-coherence.duplicate-function',
189
+ message: `Function "${name}" is defined ${duplicateUnits.length} times in the same scope. This likely indicates an AI context window issue.`,
190
+ file: unit.file,
191
+ line: unit.location.startLine + 1,
192
+ confidence: 0.85,
193
+ metadata: {
194
+ functionName: name,
195
+ occurrences: duplicateUnits.length,
196
+ analysisType: 'duplicate-function',
197
+ },
198
+ });
199
+ }
200
+ }
201
+ }
202
+ /**
203
+ * Analysis 4: Detect referenced but undefined symbols across units within a file.
204
+ *
205
+ * If a symbol is referenced but never defined (and not imported),
206
+ * the AI may have "forgotten" to include the definition.
207
+ */
208
+ detectUndefinedReferences(units, results) {
209
+ // Group units by file
210
+ const fileUnits = new Map();
211
+ for (const unit of units) {
212
+ if (!fileUnits.has(unit.file)) {
213
+ fileUnits.set(unit.file, []);
214
+ }
215
+ fileUnits.get(unit.file).push(unit);
216
+ }
217
+ for (const [file, fileUnitList] of fileUnits) {
218
+ // Collect all definitions and imports in this file
219
+ const definedNames = new Set();
220
+ const importedNames = new Set();
221
+ for (const unit of fileUnitList) {
222
+ for (const def of unit.definitions) {
223
+ definedNames.add(def.name);
224
+ }
225
+ for (const imp of unit.imports) {
226
+ for (const sym of imp.symbols) {
227
+ importedNames.add(sym);
228
+ }
229
+ // Whole module imports
230
+ if (imp.symbols.length === 0) {
231
+ // The module name itself is available
232
+ const parts = imp.module.split(/[./]/);
233
+ importedNames.add(parts[parts.length - 1]);
234
+ }
235
+ }
236
+ }
237
+ // Check for unresolved references
238
+ for (const unit of fileUnitList) {
239
+ for (const ref of unit.references) {
240
+ if (ref.resolved)
241
+ continue; // Already resolved by the parser
242
+ if (definedNames.has(ref.name))
243
+ continue;
244
+ if (importedNames.has(ref.name))
245
+ continue;
246
+ // Common globals that should not be flagged
247
+ if (this.isWellKnownGlobal(ref.name, unit.language))
248
+ continue;
249
+ results.push({
250
+ detectorId: this.id,
251
+ severity: 'warning',
252
+ category: this.category,
253
+ messageKey: 'context-coherence.undefined-reference',
254
+ message: `Symbol "${ref.name}" is referenced but never defined or imported in file "${file}". The AI may have lost context.`,
255
+ file,
256
+ line: ref.line + 1, // 0-based to 1-based
257
+ confidence: 0.7,
258
+ metadata: {
259
+ symbolName: ref.name,
260
+ analysisType: 'undefined-reference',
261
+ },
262
+ });
263
+ }
264
+ }
265
+ }
266
+ }
267
+ /**
268
+ * Check if a name is a well-known global (e.g., console, window, process).
269
+ */
270
+ isWellKnownGlobal(name, language) {
271
+ const globals = {
272
+ typescript: new Set([
273
+ 'console', 'window', 'document', 'process', 'global', 'globalThis',
274
+ 'setTimeout', 'setInterval', 'clearTimeout', 'clearInterval',
275
+ 'Promise', 'Map', 'Set', 'Array', 'Object', 'String', 'Number',
276
+ 'Boolean', 'Error', 'JSON', 'Math', 'Date', 'RegExp', 'Symbol',
277
+ 'undefined', 'null', 'NaN', 'Infinity', 'Buffer', 'require',
278
+ 'module', 'exports', '__dirname', '__filename',
279
+ ]),
280
+ javascript: new Set([
281
+ 'console', 'window', 'document', 'process', 'global', 'globalThis',
282
+ 'setTimeout', 'setInterval', 'clearTimeout', 'clearInterval',
283
+ 'Promise', 'Map', 'Set', 'Array', 'Object', 'String', 'Number',
284
+ 'Boolean', 'Error', 'JSON', 'Math', 'Date', 'RegExp', 'Symbol',
285
+ 'undefined', 'null', 'NaN', 'Infinity', 'Buffer', 'require',
286
+ 'module', 'exports', '__dirname', '__filename',
287
+ ]),
288
+ python: new Set([
289
+ 'print', 'len', 'range', 'type', 'str', 'int', 'float', 'list',
290
+ 'dict', 'set', 'tuple', 'bool', 'None', 'True', 'False',
291
+ 'isinstance', 'issubclass', 'super', 'self', 'cls',
292
+ 'Exception', 'ValueError', 'TypeError', 'KeyError',
293
+ ]),
294
+ java: new Set([
295
+ 'System', 'String', 'Integer', 'Long', 'Double', 'Float',
296
+ 'Object', 'Class', 'Exception', 'RuntimeException',
297
+ 'this', 'super', 'null', 'true', 'false',
298
+ ]),
299
+ go: new Set([
300
+ 'fmt', 'error', 'nil', 'true', 'false', 'make', 'len', 'cap',
301
+ 'append', 'copy', 'delete', 'new', 'panic', 'recover', 'close',
302
+ 'string', 'int', 'int64', 'float64', 'bool', 'byte', 'rune',
303
+ ]),
304
+ kotlin: new Set([
305
+ 'println', 'print', 'this', 'super', 'null', 'true', 'false',
306
+ 'String', 'Int', 'Long', 'Double', 'Float', 'Boolean',
307
+ 'Any', 'Unit', 'Nothing', 'it', 'listOf', 'mapOf', 'setOf',
308
+ ]),
309
+ };
310
+ return globals[language]?.has(name) ?? false;
311
+ }
312
+ /**
313
+ * Capitalize a symbol kind for display.
314
+ */
315
+ capitalizeKind(kind) {
316
+ return kind.charAt(0).toUpperCase() + kind.slice(1);
317
+ }
318
+ }
319
+ //# sourceMappingURL=context-coherence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-coherence.js","sourceRoot":"","sources":["../../../src/detectors/v4/context-coherence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * HallucinatedImportDetector — V4 detector for hallucinated imports.
3
+ *
4
+ * Detects imports of packages/modules that don't exist in the package registry.
5
+ * This is THE core differentiator of Open Code Review: AI code generators
6
+ * frequently hallucinate package names that look plausible but don't exist.
7
+ *
8
+ * V4 improvements over V3:
9
+ * - Uses dynamic registry verification (npm, PyPI, Maven, Go proxy) instead of hardcoded whitelists
10
+ * - Operates on CodeUnit IR instead of raw source
11
+ * - Language-aware built-in module filtering
12
+ * - Batch verification to minimize HTTP calls
13
+ *
14
+ * @since 0.4.0
15
+ */
16
+ import type { CodeUnit, SupportedLanguage } from '../../ir/types.js';
17
+ import type { V4Detector, DetectorResult, DetectorCategory, DetectorContext } from './types.js';
18
+ /** Tracks an import occurrence for hallucination detection. */
19
+ export interface ImportOccurrence {
20
+ file: string;
21
+ line: number;
22
+ raw: string;
23
+ }
24
+ export declare class HallucinatedImportDetector implements V4Detector {
25
+ readonly id = "hallucinated-import";
26
+ readonly name = "Hallucinated Import Detector";
27
+ readonly category: DetectorCategory;
28
+ readonly supportedLanguages: SupportedLanguage[];
29
+ detect(units: CodeUnit[], context: DetectorContext): Promise<DetectorResult[]>;
30
+ /**
31
+ * Group imports from all CodeUnits by language and package name.
32
+ * Returns Map<language, Map<packageName, occurrences[]>>.
33
+ */
34
+ private groupImportsByLanguage;
35
+ /**
36
+ * Extract the top-level package name from an import path.
37
+ * - npm: "lodash/fp" → "lodash", "@scope/name/sub" → "@scope/name"
38
+ * - python: "flask.blueprints" → "flask"
39
+ * - java: "com.google.gson.Gson" → "com.google.gson"
40
+ * - go: "github.com/gin-gonic/gin/binding" → "github.com/gin-gonic/gin"
41
+ */
42
+ private extractPackageName;
43
+ /**
44
+ * Check if an import is a language built-in module.
45
+ */
46
+ private isBuiltin;
47
+ /**
48
+ * Get a human-readable registry name for a language.
49
+ */
50
+ private getRegistryName;
51
+ }
52
+ //# sourceMappingURL=hallucinated-import.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hallucinated-import.d.ts","sourceRoot":"","sources":["../../../src/detectors/v4/hallucinated-import.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,iBAAiB,EAAc,MAAM,mBAAmB,CAAC;AACjF,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAoBhG,+DAA+D;AAC/D,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAID,qBAAa,0BAA2B,YAAW,UAAU;IAC3D,QAAQ,CAAC,EAAE,yBAAyB;IACpC,QAAQ,CAAC,IAAI,kCAAkC;IAC/C,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAqB;IACxD,QAAQ,CAAC,kBAAkB,EAAE,iBAAiB,EAAE,CAAM;IAEhD,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IA+DpF;;;OAGG;IACH,OAAO,CAAC,sBAAsB;IAkC9B;;;;;;OAMG;IACH,OAAO,CAAC,kBAAkB;IAyC1B;;OAEG;IACH,OAAO,CAAC,SAAS;IA0BjB;;OAEG;IACH,OAAO,CAAC,eAAe;CAgBxB"}
@@ -0,0 +1,206 @@
1
+ /**
2
+ * HallucinatedImportDetector — V4 detector for hallucinated imports.
3
+ *
4
+ * Detects imports of packages/modules that don't exist in the package registry.
5
+ * This is THE core differentiator of Open Code Review: AI code generators
6
+ * frequently hallucinate package names that look plausible but don't exist.
7
+ *
8
+ * V4 improvements over V3:
9
+ * - Uses dynamic registry verification (npm, PyPI, Maven, Go proxy) instead of hardcoded whitelists
10
+ * - Operates on CodeUnit IR instead of raw source
11
+ * - Language-aware built-in module filtering
12
+ * - Batch verification to minimize HTTP calls
13
+ *
14
+ * @since 0.4.0
15
+ */
16
+ import { NODE_BUILTINS } from '../../registry/builtins/node-builtins.js';
17
+ import { PYTHON_BUILTINS } from '../../registry/builtins/python-builtins.js';
18
+ import { JAVA_BUILTINS } from '../../registry/builtins/java-builtins.js';
19
+ import { GO_BUILTINS } from '../../registry/builtins/go-builtins.js';
20
+ import { KOTLIN_BUILTINS } from '../../registry/builtins/kotlin-builtins.js';
21
+ // ─── Built-in module sets by language ──────────────────────────────
22
+ const BUILTIN_SETS = {
23
+ typescript: NODE_BUILTINS,
24
+ javascript: NODE_BUILTINS,
25
+ python: PYTHON_BUILTINS,
26
+ java: JAVA_BUILTINS,
27
+ go: GO_BUILTINS,
28
+ kotlin: KOTLIN_BUILTINS,
29
+ };
30
+ // ─── Detector ──────────────────────────────────────────────────────
31
+ export class HallucinatedImportDetector {
32
+ id = 'hallucinated-import';
33
+ name = 'Hallucinated Import Detector';
34
+ category = 'ai-faithfulness';
35
+ supportedLanguages = []; // All languages
36
+ async detect(units, context) {
37
+ // If no registry manager is provided (offline mode), skip detection
38
+ if (!context.registryManager) {
39
+ return [];
40
+ }
41
+ const results = [];
42
+ // Group imports by language, deduplicating by package name
43
+ const importsByLanguage = this.groupImportsByLanguage(units);
44
+ for (const [language, packageMap] of importsByLanguage.entries()) {
45
+ const builtins = BUILTIN_SETS[language];
46
+ if (!builtins)
47
+ continue;
48
+ // Collect non-relative, non-builtin package names
49
+ const packagesToVerify = [];
50
+ for (const [packageName] of packageMap) {
51
+ if (!this.isBuiltin(packageName, language, builtins)) {
52
+ packagesToVerify.push(packageName);
53
+ }
54
+ }
55
+ if (packagesToVerify.length === 0)
56
+ continue;
57
+ // Batch verify against registry
58
+ const verifyResults = await context.registryManager.verifyBatch(language, packagesToVerify);
59
+ // Generate results for packages that don't exist
60
+ for (const [packageName, verifyResult] of verifyResults.entries()) {
61
+ if (!verifyResult.exists) {
62
+ const occurrences = packageMap.get(packageName);
63
+ if (!occurrences)
64
+ continue;
65
+ // Create a result for each occurrence
66
+ for (const occurrence of occurrences) {
67
+ results.push({
68
+ detectorId: this.id,
69
+ severity: 'error',
70
+ category: this.category,
71
+ messageKey: 'hallucinated-import.package-not-found',
72
+ message: `Import "${packageName}" does not exist in the ${this.getRegistryName(language)} registry. This may be a hallucinated package name.`,
73
+ file: occurrence.file,
74
+ line: occurrence.line + 1, // Convert 0-based to 1-based
75
+ confidence: 0.9,
76
+ metadata: {
77
+ packageName,
78
+ language,
79
+ registry: this.getRegistryName(language),
80
+ raw: occurrence.raw,
81
+ },
82
+ });
83
+ }
84
+ }
85
+ }
86
+ }
87
+ return results;
88
+ }
89
+ /**
90
+ * Group imports from all CodeUnits by language and package name.
91
+ * Returns Map<language, Map<packageName, occurrences[]>>.
92
+ */
93
+ groupImportsByLanguage(units) {
94
+ const result = new Map();
95
+ for (const unit of units) {
96
+ // Only process file-level units (imports are at file level)
97
+ if (unit.kind !== 'file')
98
+ continue;
99
+ for (const imp of unit.imports) {
100
+ // Skip relative imports
101
+ if (imp.isRelative)
102
+ continue;
103
+ const packageName = this.extractPackageName(imp.module, unit.language);
104
+ if (!result.has(unit.language)) {
105
+ result.set(unit.language, new Map());
106
+ }
107
+ const langMap = result.get(unit.language);
108
+ if (!langMap.has(packageName)) {
109
+ langMap.set(packageName, []);
110
+ }
111
+ langMap.get(packageName).push({
112
+ file: unit.file,
113
+ line: imp.line,
114
+ raw: imp.raw,
115
+ });
116
+ }
117
+ }
118
+ return result;
119
+ }
120
+ /**
121
+ * Extract the top-level package name from an import path.
122
+ * - npm: "lodash/fp" → "lodash", "@scope/name/sub" → "@scope/name"
123
+ * - python: "flask.blueprints" → "flask"
124
+ * - java: "com.google.gson.Gson" → "com.google.gson"
125
+ * - go: "github.com/gin-gonic/gin/binding" → "github.com/gin-gonic/gin"
126
+ */
127
+ extractPackageName(module, language) {
128
+ switch (language) {
129
+ case 'typescript':
130
+ case 'javascript': {
131
+ // Scoped packages: @scope/name
132
+ if (module.startsWith('@')) {
133
+ const parts = module.split('/');
134
+ return parts.length >= 2 ? `${parts[0]}/${parts[1]}` : module;
135
+ }
136
+ // Regular packages: name/subpath → name
137
+ return module.split('/')[0];
138
+ }
139
+ case 'python': {
140
+ // Python: package.submodule → package
141
+ return module.split('.')[0];
142
+ }
143
+ case 'java':
144
+ case 'kotlin': {
145
+ // Java/Kotlin: use the full module path as-is for registry lookup
146
+ // The registry adapter handles groupId:artifactId mapping
147
+ return module;
148
+ }
149
+ case 'go': {
150
+ // Go: github.com/user/repo/subpkg → github.com/user/repo
151
+ const parts = module.split('/');
152
+ if (parts.length >= 3 && module.includes('.')) {
153
+ // Looks like a URL-based import: take first 3 segments
154
+ return parts.slice(0, 3).join('/');
155
+ }
156
+ // Standard library or short path
157
+ return parts[0];
158
+ }
159
+ default:
160
+ return module;
161
+ }
162
+ }
163
+ /**
164
+ * Check if an import is a language built-in module.
165
+ */
166
+ isBuiltin(packageName, language, builtins) {
167
+ // Direct match
168
+ if (builtins.has(packageName))
169
+ return true;
170
+ // For Java/Kotlin, check prefix match (e.g., "java.util.List" matches "java.util")
171
+ if (language === 'java' || language === 'kotlin') {
172
+ for (const builtin of builtins) {
173
+ if (packageName.startsWith(builtin + '.') || packageName === builtin) {
174
+ return true;
175
+ }
176
+ }
177
+ }
178
+ // For Go, check prefix match (e.g., "net/http" matches "net")
179
+ if (language === 'go') {
180
+ const topLevel = packageName.split('/')[0];
181
+ if (builtins.has(topLevel))
182
+ return true;
183
+ }
184
+ return false;
185
+ }
186
+ /**
187
+ * Get a human-readable registry name for a language.
188
+ */
189
+ getRegistryName(language) {
190
+ switch (language) {
191
+ case 'typescript':
192
+ case 'javascript':
193
+ return 'npm';
194
+ case 'python':
195
+ return 'PyPI';
196
+ case 'java':
197
+ case 'kotlin':
198
+ return 'Maven Central';
199
+ case 'go':
200
+ return 'Go module proxy';
201
+ default:
202
+ return 'package';
203
+ }
204
+ }
205
+ }
206
+ //# sourceMappingURL=hallucinated-import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hallucinated-import.js","sourceRoot":"","sources":["../../../src/detectors/v4/hallucinated-import.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,OAAO,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,wCAAwC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,4CAA4C,CAAC;AAE7E,sEAAsE;AAEtE,MAAM,YAAY,GAAgC;IAChD,UAAU,EAAE,aAAa;IACzB,UAAU,EAAE,aAAa;IACzB,MAAM,EAAE,eAAe;IACvB,IAAI,EAAE,aAAa;IACnB,EAAE,EAAE,WAAW;IACf,MAAM,EAAE,eAAe;CACxB,CAAC;AAWF,sEAAsE;AAEtE,MAAM,OAAO,0BAA0B;IAC5B,EAAE,GAAG,qBAAqB,CAAC;IAC3B,IAAI,GAAG,8BAA8B,CAAC;IACtC,QAAQ,GAAqB,iBAAiB,CAAC;IAC/C,kBAAkB,GAAwB,EAAE,CAAC,CAAC,gBAAgB;IAEvE,KAAK,CAAC,MAAM,CAAC,KAAiB,EAAE,OAAwB;QACtD,oEAAoE;QACpE,IAAI,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC;YAC7B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,OAAO,GAAqB,EAAE,CAAC;QAErC,2DAA2D;QAC3D,MAAM,iBAAiB,GAAG,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,CAAC;QAE7D,KAAK,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,IAAI,iBAAiB,CAAC,OAAO,EAAE,EAAE,CAAC;YACjE,MAAM,QAAQ,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;YACxC,IAAI,CAAC,QAAQ;gBAAE,SAAS;YAExB,kDAAkD;YAClD,MAAM,gBAAgB,GAAa,EAAE,CAAC;YACtC,KAAK,MAAM,CAAC,WAAW,CAAC,IAAI,UAAU,EAAE,CAAC;gBACvC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;oBACrD,gBAAgB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;YAED,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC;gBAAE,SAAS;YAE5C,gCAAgC;YAChC,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,WAAW,CAC7D,QAAQ,EACR,gBAAgB,CACjB,CAAC;YAEF,iDAAiD;YACjD,KAAK,MAAM,CAAC,WAAW,EAAE,YAAY,CAAC,IAAI,aAAa,CAAC,OAAO,EAAE,EAAE,CAAC;gBAClE,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC;oBACzB,MAAM,WAAW,GAAG,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;oBAChD,IAAI,CAAC,WAAW;wBAAE,SAAS;oBAE3B,sCAAsC;oBACtC,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;wBACrC,OAAO,CAAC,IAAI,CAAC;4BACX,UAAU,EAAE,IAAI,CAAC,EAAE;4BACnB,QAAQ,EAAE,OAAO;4BACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;4BACvB,UAAU,EAAE,uCAAuC;4BACnD,OAAO,EAAE,WAAW,WAAW,2BAA2B,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,qDAAqD;4BAC7I,IAAI,EAAE,UAAU,CAAC,IAAI;4BACrB,IAAI,EAAE,UAAU,CAAC,IAAI,GAAG,CAAC,EAAE,6BAA6B;4BACxD,UAAU,EAAE,GAAG;4BACf,QAAQ,EAAE;gCACR,WAAW;gCACX,QAAQ;gCACR,QAAQ,EAAE,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC;gCACxC,GAAG,EAAE,UAAU,CAAC,GAAG;6BACpB;yBACF,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;OAGG;IACK,sBAAsB,CAC5B,KAAiB;QAEjB,MAAM,MAAM,GAAG,IAAI,GAAG,EAA2C,CAAC;QAElE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,4DAA4D;YAC5D,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;gBAAE,SAAS;YAEnC,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC/B,wBAAwB;gBACxB,IAAI,GAAG,CAAC,UAAU;oBAAE,SAAS;gBAE7B,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAEvE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC/B,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;gBACvC,CAAC;gBACD,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAE,CAAC;gBAE3C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;oBAC9B,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;gBAC/B,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,WAAW,CAAE,CAAC,IAAI,CAAC;oBAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,IAAI,EAAE,GAAG,CAAC,IAAI;oBACd,GAAG,EAAE,GAAG,CAAC,GAAG;iBACb,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;;;OAMG;IACK,kBAAkB,CAAC,MAAc,EAAE,QAA2B;QACpE,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,YAAY,CAAC;YAClB,KAAK,YAAY,CAAC,CAAC,CAAC;gBAClB,+BAA+B;gBAC/B,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBAChC,OAAO,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;gBAChE,CAAC;gBACD,wCAAwC;gBACxC,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9B,CAAC;YAED,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,sCAAsC;gBACtC,OAAO,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9B,CAAC;YAED,KAAK,MAAM,CAAC;YACZ,KAAK,QAAQ,CAAC,CAAC,CAAC;gBACd,kEAAkE;gBAClE,0DAA0D;gBAC1D,OAAO,MAAM,CAAC;YAChB,CAAC;YAED,KAAK,IAAI,CAAC,CAAC,CAAC;gBACV,yDAAyD;gBACzD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAChC,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC9C,uDAAuD;oBACvD,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACrC,CAAC;gBACD,iCAAiC;gBACjC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED;gBACE,OAAO,MAAM,CAAC;QAClB,CAAC;IACH,CAAC;IAED;;OAEG;IACK,SAAS,CACf,WAAmB,EACnB,QAAgB,EAChB,QAAqB;QAErB,eAAe;QACf,IAAI,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC;YAAE,OAAO,IAAI,CAAC;QAE3C,mFAAmF;QACnF,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACjD,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,IAAI,WAAW,CAAC,UAAU,CAAC,OAAO,GAAG,GAAG,CAAC,IAAI,WAAW,KAAK,OAAO,EAAE,CAAC;oBACrE,OAAO,IAAI,CAAC;gBACd,CAAC;YACH,CAAC;QACH,CAAC;QAED,8DAA8D;QAC9D,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,IAAI,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;gBAAE,OAAO,IAAI,CAAC;QAC1C,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,QAAgB;QACtC,QAAQ,QAAQ,EAAE,CAAC;YACjB,KAAK,YAAY,CAAC;YAClB,KAAK,YAAY;gBACf,OAAO,KAAK,CAAC;YACf,KAAK,QAAQ;gBACX,OAAO,MAAM,CAAC;YAChB,KAAK,MAAM,CAAC;YACZ,KAAK,QAAQ;gBACX,OAAO,eAAe,CAAC;YACzB,KAAK,IAAI;gBACP,OAAO,iBAAiB,CAAC;YAC3B;gBACE,OAAO,SAAS,CAAC;QACrB,CAAC;IACH,CAAC;CACF"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * V4 Detector Module — AI-unique detectors operating on CodeUnit IR.
3
+ *
4
+ * V4 keeps only detectors that target AI-specific code quality issues:
5
+ * - HallucinatedImportDetector: Detects imports of non-existent packages
6
+ * - StaleAPIDetector: Detects deprecated/outdated API usage
7
+ * - ContextCoherenceDetector: Detects AI context window inconsistencies
8
+ * - OverEngineeringDetector: Detects over-engineered code patterns
9
+ * - SecurityPatternDetector: Detects security anti-patterns common in AI code
10
+ *
11
+ * Traditional lint concerns (duplication, type safety) are excluded.
12
+ *
13
+ * @since 0.4.0
14
+ */
15
+ export type { V4Detector, DetectorResult as V4DetectorResult, DetectorCategory, DetectorContext, } from './types.js';
16
+ export { HallucinatedImportDetector } from './hallucinated-import.js';
17
+ export { StaleAPIDetector } from './stale-api.js';
18
+ export { ContextCoherenceDetector } from './context-coherence.js';
19
+ export { OverEngineeringDetector } from './over-engineering.js';
20
+ export { SecurityPatternDetector } from './security-pattern.js';
21
+ import type { V4Detector } from './types.js';
22
+ /**
23
+ * Create all V4 detectors with default configuration.
24
+ *
25
+ * @returns Array of all V4 detector instances
26
+ */
27
+ export declare function createV4Detectors(): V4Detector[];
28
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/detectors/v4/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,YAAY,EACV,UAAU,EACV,cAAc,IAAI,gBAAgB,EAClC,gBAAgB,EAChB,eAAe,GAChB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAIhE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAO7C;;;;GAIG;AACH,wBAAgB,iBAAiB,IAAI,UAAU,EAAE,CAQhD"}