@creeperhost/modlens-mcp 1.6.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 (382) hide show
  1. package/README.md +938 -0
  2. package/dist/access-flags.d.ts +58 -0
  3. package/dist/access-flags.d.ts.map +1 -0
  4. package/dist/access-flags.js +79 -0
  5. package/dist/access-flags.js.map +1 -0
  6. package/dist/access-flags.test.d.ts +2 -0
  7. package/dist/access-flags.test.d.ts.map +1 -0
  8. package/dist/access-flags.test.js +189 -0
  9. package/dist/access-flags.test.js.map +1 -0
  10. package/dist/batch-ingest.d.ts +2 -0
  11. package/dist/batch-ingest.d.ts.map +1 -0
  12. package/dist/batch-ingest.js +54 -0
  13. package/dist/batch-ingest.js.map +1 -0
  14. package/dist/batch-resolve-mixins.d.ts +2 -0
  15. package/dist/batch-resolve-mixins.d.ts.map +1 -0
  16. package/dist/batch-resolve-mixins.js +36 -0
  17. package/dist/batch-resolve-mixins.js.map +1 -0
  18. package/dist/cache.d.ts +16 -0
  19. package/dist/cache.d.ts.map +1 -0
  20. package/dist/cache.js +36 -0
  21. package/dist/cache.js.map +1 -0
  22. package/dist/cli.d.ts +2 -0
  23. package/dist/cli.d.ts.map +1 -0
  24. package/dist/cli.js +1318 -0
  25. package/dist/cli.js.map +1 -0
  26. package/dist/curseforge.d.ts +53 -0
  27. package/dist/curseforge.d.ts.map +1 -0
  28. package/dist/curseforge.js +104 -0
  29. package/dist/curseforge.js.map +1 -0
  30. package/dist/db-backend.d.ts +17 -0
  31. package/dist/db-backend.d.ts.map +1 -0
  32. package/dist/db-backend.js +40 -0
  33. package/dist/db-backend.js.map +1 -0
  34. package/dist/db.d.ts +11 -0
  35. package/dist/db.d.ts.map +1 -0
  36. package/dist/db.js +55 -0
  37. package/dist/db.js.map +1 -0
  38. package/dist/embed-queue.d.ts +12 -0
  39. package/dist/embed-queue.d.ts.map +1 -0
  40. package/dist/embed-queue.js +103 -0
  41. package/dist/embed-queue.js.map +1 -0
  42. package/dist/embeddings.d.ts +21 -0
  43. package/dist/embeddings.d.ts.map +1 -0
  44. package/dist/embeddings.js +55 -0
  45. package/dist/embeddings.js.map +1 -0
  46. package/dist/env-path.d.ts +19 -0
  47. package/dist/env-path.d.ts.map +1 -0
  48. package/dist/env-path.js +40 -0
  49. package/dist/env-path.js.map +1 -0
  50. package/dist/fetch-utils.d.ts +24 -0
  51. package/dist/fetch-utils.d.ts.map +1 -0
  52. package/dist/fetch-utils.js +73 -0
  53. package/dist/fetch-utils.js.map +1 -0
  54. package/dist/fetch-utils.test.d.ts +2 -0
  55. package/dist/fetch-utils.test.d.ts.map +1 -0
  56. package/dist/fetch-utils.test.js +133 -0
  57. package/dist/fetch-utils.test.js.map +1 -0
  58. package/dist/generated/sqlite/browser.d.ts +55 -0
  59. package/dist/generated/sqlite/browser.d.ts.map +1 -0
  60. package/dist/generated/sqlite/browser.js +18 -0
  61. package/dist/generated/sqlite/browser.js.map +1 -0
  62. package/dist/generated/sqlite/client.d.ts +72 -0
  63. package/dist/generated/sqlite/client.d.ts.map +1 -0
  64. package/dist/generated/sqlite/client.js +33 -0
  65. package/dist/generated/sqlite/client.js.map +1 -0
  66. package/dist/generated/sqlite/commonInputTypes.d.ts +387 -0
  67. package/dist/generated/sqlite/commonInputTypes.d.ts.map +1 -0
  68. package/dist/generated/sqlite/commonInputTypes.js +11 -0
  69. package/dist/generated/sqlite/commonInputTypes.js.map +1 -0
  70. package/dist/generated/sqlite/enums.d.ts +2 -0
  71. package/dist/generated/sqlite/enums.d.ts.map +1 -0
  72. package/dist/generated/sqlite/enums.js +11 -0
  73. package/dist/generated/sqlite/enums.js.map +1 -0
  74. package/dist/generated/sqlite/internal/class.d.ts +226 -0
  75. package/dist/generated/sqlite/internal/class.d.ts.map +1 -0
  76. package/dist/generated/sqlite/internal/class.js +84 -0
  77. package/dist/generated/sqlite/internal/class.js.map +1 -0
  78. package/dist/generated/sqlite/internal/prismaNamespace.d.ts +1344 -0
  79. package/dist/generated/sqlite/internal/prismaNamespace.d.ts.map +1 -0
  80. package/dist/generated/sqlite/internal/prismaNamespace.js +220 -0
  81. package/dist/generated/sqlite/internal/prismaNamespace.js.map +1 -0
  82. package/dist/generated/sqlite/internal/prismaNamespaceBrowser.d.ts +204 -0
  83. package/dist/generated/sqlite/internal/prismaNamespaceBrowser.d.ts.map +1 -0
  84. package/dist/generated/sqlite/internal/prismaNamespaceBrowser.js +191 -0
  85. package/dist/generated/sqlite/internal/prismaNamespaceBrowser.js.map +1 -0
  86. package/dist/generated/sqlite/models/DocEntry.d.ts +1223 -0
  87. package/dist/generated/sqlite/models/DocEntry.d.ts.map +1 -0
  88. package/dist/generated/sqlite/models/DocEntry.js +2 -0
  89. package/dist/generated/sqlite/models/DocEntry.js.map +1 -0
  90. package/dist/generated/sqlite/models/McSourceFile.d.ts +1289 -0
  91. package/dist/generated/sqlite/models/McSourceFile.d.ts.map +1 -0
  92. package/dist/generated/sqlite/models/McSourceFile.js +2 -0
  93. package/dist/generated/sqlite/models/McSourceFile.js.map +1 -0
  94. package/dist/generated/sqlite/models/McVersion.d.ts +1315 -0
  95. package/dist/generated/sqlite/models/McVersion.d.ts.map +1 -0
  96. package/dist/generated/sqlite/models/McVersion.js +2 -0
  97. package/dist/generated/sqlite/models/McVersion.js.map +1 -0
  98. package/dist/generated/sqlite/models/McVersionDiff.d.ts +1061 -0
  99. package/dist/generated/sqlite/models/McVersionDiff.d.ts.map +1 -0
  100. package/dist/generated/sqlite/models/McVersionDiff.js +2 -0
  101. package/dist/generated/sqlite/models/McVersionDiff.js.map +1 -0
  102. package/dist/generated/sqlite/models/Mod.d.ts +2396 -0
  103. package/dist/generated/sqlite/models/Mod.d.ts.map +1 -0
  104. package/dist/generated/sqlite/models/Mod.js +2 -0
  105. package/dist/generated/sqlite/models/Mod.js.map +1 -0
  106. package/dist/generated/sqlite/models/ModClass.d.ts +1254 -0
  107. package/dist/generated/sqlite/models/ModClass.d.ts.map +1 -0
  108. package/dist/generated/sqlite/models/ModClass.js +2 -0
  109. package/dist/generated/sqlite/models/ModClass.js.map +1 -0
  110. package/dist/generated/sqlite/models/ModSourceFile.d.ts +1283 -0
  111. package/dist/generated/sqlite/models/ModSourceFile.d.ts.map +1 -0
  112. package/dist/generated/sqlite/models/ModSourceFile.js +2 -0
  113. package/dist/generated/sqlite/models/ModSourceFile.js.map +1 -0
  114. package/dist/generated/sqlite/models/ModTag.d.ts +1278 -0
  115. package/dist/generated/sqlite/models/ModTag.d.ts.map +1 -0
  116. package/dist/generated/sqlite/models/ModTag.js +2 -0
  117. package/dist/generated/sqlite/models/ModTag.js.map +1 -0
  118. package/dist/generated/sqlite/models/ModVersionDiff.d.ts +1073 -0
  119. package/dist/generated/sqlite/models/ModVersionDiff.d.ts.map +1 -0
  120. package/dist/generated/sqlite/models/ModVersionDiff.js +2 -0
  121. package/dist/generated/sqlite/models/ModVersionDiff.js.map +1 -0
  122. package/dist/generated/sqlite/models/Primer.d.ts +1319 -0
  123. package/dist/generated/sqlite/models/Primer.d.ts.map +1 -0
  124. package/dist/generated/sqlite/models/Primer.js +2 -0
  125. package/dist/generated/sqlite/models/Primer.js.map +1 -0
  126. package/dist/generated/sqlite/models.d.ts +12 -0
  127. package/dist/generated/sqlite/models.d.ts.map +1 -0
  128. package/dist/generated/sqlite/models.js +2 -0
  129. package/dist/generated/sqlite/models.js.map +1 -0
  130. package/dist/jar.d.ts +7 -0
  131. package/dist/jar.d.ts.map +1 -0
  132. package/dist/jar.js +52 -0
  133. package/dist/jar.js.map +1 -0
  134. package/dist/java-tools.d.ts +46 -0
  135. package/dist/java-tools.d.ts.map +1 -0
  136. package/dist/java-tools.js +263 -0
  137. package/dist/java-tools.js.map +1 -0
  138. package/dist/launcher.d.ts +3 -0
  139. package/dist/launcher.d.ts.map +1 -0
  140. package/dist/launcher.js +105 -0
  141. package/dist/launcher.js.map +1 -0
  142. package/dist/mappings.d.ts +95 -0
  143. package/dist/mappings.d.ts.map +1 -0
  144. package/dist/mappings.js +1094 -0
  145. package/dist/mappings.js.map +1 -0
  146. package/dist/mappings.test.d.ts +2 -0
  147. package/dist/mappings.test.d.ts.map +1 -0
  148. package/dist/mappings.test.js +161 -0
  149. package/dist/mappings.test.js.map +1 -0
  150. package/dist/minecraft.d.ts +21 -0
  151. package/dist/minecraft.d.ts.map +1 -0
  152. package/dist/minecraft.js +70 -0
  153. package/dist/minecraft.js.map +1 -0
  154. package/dist/modpacks-ch.d.ts +224 -0
  155. package/dist/modpacks-ch.d.ts.map +1 -0
  156. package/dist/modpacks-ch.js +146 -0
  157. package/dist/modpacks-ch.js.map +1 -0
  158. package/dist/modrinth.d.ts +67 -0
  159. package/dist/modrinth.d.ts.map +1 -0
  160. package/dist/modrinth.js +88 -0
  161. package/dist/modrinth.js.map +1 -0
  162. package/dist/platform-adapter.d.ts +23 -0
  163. package/dist/platform-adapter.d.ts.map +1 -0
  164. package/dist/platform-adapter.js +2 -0
  165. package/dist/platform-adapter.js.map +1 -0
  166. package/dist/platform.d.ts +47 -0
  167. package/dist/platform.d.ts.map +1 -0
  168. package/dist/platform.js +175 -0
  169. package/dist/platform.js.map +1 -0
  170. package/dist/processor.d.ts +51 -0
  171. package/dist/processor.d.ts.map +1 -0
  172. package/dist/processor.js +655 -0
  173. package/dist/processor.js.map +1 -0
  174. package/dist/processor.test.d.ts +2 -0
  175. package/dist/processor.test.d.ts.map +1 -0
  176. package/dist/processor.test.js +629 -0
  177. package/dist/processor.test.js.map +1 -0
  178. package/dist/repositories/embeddings-sqlite.d.ts +38 -0
  179. package/dist/repositories/embeddings-sqlite.d.ts.map +1 -0
  180. package/dist/repositories/embeddings-sqlite.js +208 -0
  181. package/dist/repositories/embeddings-sqlite.js.map +1 -0
  182. package/dist/repositories/embeddings.d.ts +40 -0
  183. package/dist/repositories/embeddings.d.ts.map +1 -0
  184. package/dist/repositories/embeddings.js +136 -0
  185. package/dist/repositories/embeddings.js.map +1 -0
  186. package/dist/repositories/index.d.ts +2 -0
  187. package/dist/repositories/index.d.ts.map +1 -0
  188. package/dist/repositories/index.js +15 -0
  189. package/dist/repositories/index.js.map +1 -0
  190. package/dist/repositories/mcVersion.d.ts +16 -0
  191. package/dist/repositories/mcVersion.d.ts.map +1 -0
  192. package/dist/repositories/mcVersion.js +52 -0
  193. package/dist/repositories/mcVersion.js.map +1 -0
  194. package/dist/repositories/mod.d.ts +241 -0
  195. package/dist/repositories/mod.d.ts.map +1 -0
  196. package/dist/repositories/mod.js +342 -0
  197. package/dist/repositories/mod.js.map +1 -0
  198. package/dist/repositories/packs.d.ts +44 -0
  199. package/dist/repositories/packs.d.ts.map +1 -0
  200. package/dist/repositories/packs.js +138 -0
  201. package/dist/repositories/packs.js.map +1 -0
  202. package/dist/search-adapter.d.ts +34 -0
  203. package/dist/search-adapter.d.ts.map +1 -0
  204. package/dist/search-adapter.js +195 -0
  205. package/dist/search-adapter.js.map +1 -0
  206. package/dist/search.d.ts +6 -0
  207. package/dist/search.d.ts.map +1 -0
  208. package/dist/search.js +54 -0
  209. package/dist/search.js.map +1 -0
  210. package/dist/search.test.d.ts +2 -0
  211. package/dist/search.test.d.ts.map +1 -0
  212. package/dist/search.test.js +71 -0
  213. package/dist/search.test.js.map +1 -0
  214. package/dist/security.d.ts +98 -0
  215. package/dist/security.d.ts.map +1 -0
  216. package/dist/security.js +446 -0
  217. package/dist/security.js.map +1 -0
  218. package/dist/security.test.d.ts +2 -0
  219. package/dist/security.test.d.ts.map +1 -0
  220. package/dist/security.test.js +687 -0
  221. package/dist/security.test.js.map +1 -0
  222. package/dist/server.d.ts +2 -0
  223. package/dist/server.d.ts.map +1 -0
  224. package/dist/server.js +1465 -0
  225. package/dist/server.js.map +1 -0
  226. package/dist/setup.d.ts +2 -0
  227. package/dist/setup.d.ts.map +1 -0
  228. package/dist/setup.js +1113 -0
  229. package/dist/setup.js.map +1 -0
  230. package/dist/tools/bytecode.d.ts +129 -0
  231. package/dist/tools/bytecode.d.ts.map +1 -0
  232. package/dist/tools/bytecode.js +679 -0
  233. package/dist/tools/bytecode.js.map +1 -0
  234. package/dist/tools/catalog.d.ts +54 -0
  235. package/dist/tools/catalog.d.ts.map +1 -0
  236. package/dist/tools/catalog.js +249 -0
  237. package/dist/tools/catalog.js.map +1 -0
  238. package/dist/tools/compat-check.d.ts +23 -0
  239. package/dist/tools/compat-check.d.ts.map +1 -0
  240. package/dist/tools/compat-check.js +250 -0
  241. package/dist/tools/compat-check.js.map +1 -0
  242. package/dist/tools/compat-check.test.d.ts +2 -0
  243. package/dist/tools/compat-check.test.d.ts.map +1 -0
  244. package/dist/tools/compat-check.test.js +179 -0
  245. package/dist/tools/compat-check.test.js.map +1 -0
  246. package/dist/tools/diagnostics.d.ts +10 -0
  247. package/dist/tools/diagnostics.d.ts.map +1 -0
  248. package/dist/tools/diagnostics.js +133 -0
  249. package/dist/tools/diagnostics.js.map +1 -0
  250. package/dist/tools/diagnostics.test.d.ts +2 -0
  251. package/dist/tools/diagnostics.test.d.ts.map +1 -0
  252. package/dist/tools/diagnostics.test.js +168 -0
  253. package/dist/tools/diagnostics.test.js.map +1 -0
  254. package/dist/tools/docs.d.ts +19 -0
  255. package/dist/tools/docs.d.ts.map +1 -0
  256. package/dist/tools/docs.js +230 -0
  257. package/dist/tools/docs.js.map +1 -0
  258. package/dist/tools/embed-registry.d.ts +125 -0
  259. package/dist/tools/embed-registry.d.ts.map +1 -0
  260. package/dist/tools/embed-registry.js +560 -0
  261. package/dist/tools/embed-registry.js.map +1 -0
  262. package/dist/tools/gradle.d.ts +16 -0
  263. package/dist/tools/gradle.d.ts.map +1 -0
  264. package/dist/tools/gradle.js +182 -0
  265. package/dist/tools/gradle.js.map +1 -0
  266. package/dist/tools/graphify.d.ts +144 -0
  267. package/dist/tools/graphify.d.ts.map +1 -0
  268. package/dist/tools/graphify.js +798 -0
  269. package/dist/tools/graphify.js.map +1 -0
  270. package/dist/tools/graphify.test.d.ts +2 -0
  271. package/dist/tools/graphify.test.d.ts.map +1 -0
  272. package/dist/tools/graphify.test.js +39 -0
  273. package/dist/tools/graphify.test.js.map +1 -0
  274. package/dist/tools/ingest.d.ts +85 -0
  275. package/dist/tools/ingest.d.ts.map +1 -0
  276. package/dist/tools/ingest.js +477 -0
  277. package/dist/tools/ingest.js.map +1 -0
  278. package/dist/tools/ingest.test.d.ts +2 -0
  279. package/dist/tools/ingest.test.d.ts.map +1 -0
  280. package/dist/tools/ingest.test.js +340 -0
  281. package/dist/tools/ingest.test.js.map +1 -0
  282. package/dist/tools/kubejs.d.ts +37 -0
  283. package/dist/tools/kubejs.d.ts.map +1 -0
  284. package/dist/tools/kubejs.js +245 -0
  285. package/dist/tools/kubejs.js.map +1 -0
  286. package/dist/tools/mappings.d.ts +17 -0
  287. package/dist/tools/mappings.d.ts.map +1 -0
  288. package/dist/tools/mappings.js +85 -0
  289. package/dist/tools/mappings.js.map +1 -0
  290. package/dist/tools/mc-fts.d.ts +101 -0
  291. package/dist/tools/mc-fts.d.ts.map +1 -0
  292. package/dist/tools/mc-fts.js +279 -0
  293. package/dist/tools/mc-fts.js.map +1 -0
  294. package/dist/tools/mcmeta.d.ts +41 -0
  295. package/dist/tools/mcmeta.d.ts.map +1 -0
  296. package/dist/tools/mcmeta.js +365 -0
  297. package/dist/tools/mcmeta.js.map +1 -0
  298. package/dist/tools/mixin-scan.d.ts +113 -0
  299. package/dist/tools/mixin-scan.d.ts.map +1 -0
  300. package/dist/tools/mixin-scan.js +433 -0
  301. package/dist/tools/mixin-scan.js.map +1 -0
  302. package/dist/tools/mod-data.d.ts +83 -0
  303. package/dist/tools/mod-data.d.ts.map +1 -0
  304. package/dist/tools/mod-data.js +630 -0
  305. package/dist/tools/mod-data.js.map +1 -0
  306. package/dist/tools/mod-tags.d.ts +59 -0
  307. package/dist/tools/mod-tags.d.ts.map +1 -0
  308. package/dist/tools/mod-tags.js +279 -0
  309. package/dist/tools/mod-tags.js.map +1 -0
  310. package/dist/tools/mod-tags.test.d.ts +2 -0
  311. package/dist/tools/mod-tags.test.d.ts.map +1 -0
  312. package/dist/tools/mod-tags.test.js +75 -0
  313. package/dist/tools/mod-tags.test.js.map +1 -0
  314. package/dist/tools/modpacks-ch.d.ts +257 -0
  315. package/dist/tools/modpacks-ch.d.ts.map +1 -0
  316. package/dist/tools/modpacks-ch.js +516 -0
  317. package/dist/tools/modpacks-ch.js.map +1 -0
  318. package/dist/tools/packtools.d.ts +113 -0
  319. package/dist/tools/packtools.d.ts.map +1 -0
  320. package/dist/tools/packtools.js +809 -0
  321. package/dist/tools/packtools.js.map +1 -0
  322. package/dist/tools/packtools.test.d.ts +2 -0
  323. package/dist/tools/packtools.test.d.ts.map +1 -0
  324. package/dist/tools/packtools.test.js +99 -0
  325. package/dist/tools/packtools.test.js.map +1 -0
  326. package/dist/tools/platform.d.ts +68 -0
  327. package/dist/tools/platform.d.ts.map +1 -0
  328. package/dist/tools/platform.js +452 -0
  329. package/dist/tools/platform.js.map +1 -0
  330. package/dist/tools/primers.d.ts +36 -0
  331. package/dist/tools/primers.d.ts.map +1 -0
  332. package/dist/tools/primers.js +451 -0
  333. package/dist/tools/primers.js.map +1 -0
  334. package/dist/tools/reports.d.ts +19 -0
  335. package/dist/tools/reports.d.ts.map +1 -0
  336. package/dist/tools/reports.js +573 -0
  337. package/dist/tools/reports.js.map +1 -0
  338. package/dist/tools/source.d.ts +10 -0
  339. package/dist/tools/source.d.ts.map +1 -0
  340. package/dist/tools/source.js +101 -0
  341. package/dist/tools/source.js.map +1 -0
  342. package/dist/tools/vanilla-data.d.ts +127 -0
  343. package/dist/tools/vanilla-data.d.ts.map +1 -0
  344. package/dist/tools/vanilla-data.js +824 -0
  345. package/dist/tools/vanilla-data.js.map +1 -0
  346. package/dist/tools/vanilla.d.ts +171 -0
  347. package/dist/tools/vanilla.d.ts.map +1 -0
  348. package/dist/tools/vanilla.js +612 -0
  349. package/dist/tools/vanilla.js.map +1 -0
  350. package/dist/tools/version-diff.d.ts +113 -0
  351. package/dist/tools/version-diff.d.ts.map +1 -0
  352. package/dist/tools/version-diff.js +519 -0
  353. package/dist/tools/version-diff.js.map +1 -0
  354. package/dist/tools/version-diff.test.d.ts +2 -0
  355. package/dist/tools/version-diff.test.d.ts.map +1 -0
  356. package/dist/tools/version-diff.test.js +102 -0
  357. package/dist/tools/version-diff.test.js.map +1 -0
  358. package/dist/validate.d.ts +19 -0
  359. package/dist/validate.d.ts.map +1 -0
  360. package/dist/validate.js +54 -0
  361. package/dist/validate.js.map +1 -0
  362. package/dist/validate.test.d.ts +2 -0
  363. package/dist/validate.test.d.ts.map +1 -0
  364. package/dist/validate.test.js +73 -0
  365. package/dist/validate.test.js.map +1 -0
  366. package/package.json +62 -0
  367. package/prisma/backends/schema.sqlite.prisma +215 -0
  368. package/prisma/backends/template.db +0 -0
  369. package/prisma/schema.prisma +303 -0
  370. package/scripts/backup.mjs +151 -0
  371. package/scripts/build-template-db.mjs +38 -0
  372. package/scripts/check-atm10.mjs +27 -0
  373. package/scripts/check-sync.mjs +13 -0
  374. package/scripts/create-fts-index.mjs +50 -0
  375. package/scripts/enable-pgvector.mjs +90 -0
  376. package/scripts/enable-sqlite-vec.mjs +158 -0
  377. package/scripts/migrate-backend.mjs +188 -0
  378. package/scripts/migrate-embed-provenance.mjs +80 -0
  379. package/scripts/migrate-metadata-source.mjs +62 -0
  380. package/scripts/migrate-mod-source-files.mjs +67 -0
  381. package/scripts/post-update.mjs +77 -0
  382. package/scripts/verify-atm10.mjs +63 -0
@@ -0,0 +1,612 @@
1
+ /**
2
+ * Vanilla Minecraft analysis tools.
3
+ * Covers: class search, decompile (single + bulk), bytecode, members,
4
+ * references, inheritance, version diff, source search, AW validation,
5
+ * and mixin validation.
6
+ */
7
+ import { readFile, writeFile, readdir } from "fs/promises";
8
+ import { join, relative } from "path";
9
+ import { getMcJarPath, mcPaths } from "../minecraft.js";
10
+ import { listClasses } from "../jar.js";
11
+ import { safeRegex } from "../security.js";
12
+ import { validateVersion, validateClassName } from "../validate.js";
13
+ import { isMcVersionIndexed, searchMcIndexed } from "./mc-fts.js";
14
+ import { searchClasses } from "../search.js";
15
+ import { inspectClass, getBytecode, indexJar, decompileClass, decompileJar, isDecompileDone } from "../java-tools.js";
16
+ import { exists, ensureDir } from "../cache.js";
17
+ import { formatClassMembers } from "../access-flags.js";
18
+ import { ensureMcVersion, updateMcVersion } from "../repositories/mcVersion.js";
19
+ import { findModByModIdLike } from "../repositories/mod.js";
20
+ import { searchSource } from "./source.js";
21
+ import { hasSrgMappings, remapMcJar, applyMcpNamesToSource, hasRetroMcpMappings, remapMcJarTiny } from "../mappings.js";
22
+ // ── Index cache (disk-backed per version, mirroring mcsrc's index-manager) ───
23
+ const indexMemCache = new Map();
24
+ async function getMcIndex(version) {
25
+ if (indexMemCache.has(version))
26
+ return indexMemCache.get(version);
27
+ const cachePath = mcPaths.index(version);
28
+ if (await exists(cachePath)) {
29
+ const data = JSON.parse(await readFile(cachePath, "utf8"));
30
+ indexMemCache.set(version, data);
31
+ return data;
32
+ }
33
+ const jarPath = await getMcJarPath(version);
34
+ const index = await indexJar(jarPath);
35
+ await ensureDir(cachePath);
36
+ await writeFile(cachePath, JSON.stringify(index), "utf8");
37
+ indexMemCache.set(version, index);
38
+ return index;
39
+ }
40
+ // ── McVersion DB helper ───────────────────────────────────────────────────────
41
+ async function ensureMcVersionRecord(version) {
42
+ return ensureMcVersion(version);
43
+ }
44
+ // ── Format helpers ────────────────────────────────────────────────────────────
45
+ // formatClassMembers is re-exported from access-flags.ts
46
+ // ── Similarity helper for validation suggestions ──────────────────────────────
47
+ function topSimilar(query, candidates, n = 5) {
48
+ const q = query.toLowerCase();
49
+ return candidates
50
+ .map((c) => {
51
+ const cl = c.toLowerCase();
52
+ if (cl === q)
53
+ return { c, score: 0 };
54
+ if (cl.startsWith(q))
55
+ return { c, score: 1 };
56
+ if (cl.includes(q))
57
+ return { c, score: 2 };
58
+ // count shared chars
59
+ let shared = 0;
60
+ for (const ch of q)
61
+ if (cl.includes(ch))
62
+ shared++;
63
+ return { c, score: 10 - shared };
64
+ })
65
+ .filter((x) => x.score < 10)
66
+ .sort((a, b) => a.score - b.score)
67
+ .slice(0, n)
68
+ .map((x) => x.c);
69
+ }
70
+ // ── Exported tool implementations ────────────────────────────────────────────
71
+ /** search_minecraft_class */
72
+ export async function searchMinecraftClass(version, query) {
73
+ const jarPath = await getMcJarPath(version);
74
+ const classes = listClasses(jarPath).map((c) => c.replace(/\.class$/, ""));
75
+ return searchClasses(classes, query);
76
+ }
77
+ /** get_minecraft_source — decompile a single class with optional line-range slicing. */
78
+ export async function getMinecraftSource(version, className, startLine, endLine, maxLines) {
79
+ validateVersion(version);
80
+ validateClassName(className);
81
+ const internal = className.replace(/\./g, "/");
82
+ const outDir = mcPaths.decompiled(version);
83
+ const cached = mcPaths.classFile(version, internal);
84
+ let source;
85
+ if (await exists(cached)) {
86
+ source = await readFile(cached, "utf8");
87
+ }
88
+ else {
89
+ const jarPath = await getMcJarPath(version);
90
+ source = await decompileClass(jarPath, internal, outDir);
91
+ }
92
+ if (startLine === undefined && endLine === undefined && maxLines === undefined) {
93
+ return source.slice(0, 120_000); // cap at 120 KB
94
+ }
95
+ const lines = source.split("\n");
96
+ const from = (startLine ?? 1) - 1;
97
+ const to = endLine ?? (from + (maxLines ?? 200));
98
+ return lines.slice(from, to).join("\n");
99
+ }
100
+ /** get_mc_class_bytecode */
101
+ export async function getMcClassBytecode(version, className) {
102
+ validateVersion(version);
103
+ validateClassName(className);
104
+ const jarPath = await getMcJarPath(version);
105
+ return getBytecode(jarPath, className.replace(/\./g, "/"));
106
+ }
107
+ /** get_mc_class_members */
108
+ export async function getMcClassMembers(version, className) {
109
+ validateVersion(version);
110
+ validateClassName(className);
111
+ const jarPath = await getMcJarPath(version);
112
+ const info = await inspectClass(jarPath, className.replace(/\./g, "/"));
113
+ return formatClassMembers(info);
114
+ }
115
+ /** find_mc_references */
116
+ export async function findMcReferences(version, target) {
117
+ const index = await getMcIndex(version);
118
+ const normalised = target.replace(/\./g, "/");
119
+ const keysToTry = [
120
+ `s:${normalised}`,
121
+ `m:${normalised}`,
122
+ `f:${normalised}`,
123
+ normalised,
124
+ ];
125
+ const allRefs = new Set();
126
+ for (const key of keysToTry) {
127
+ const refs = index.references[key];
128
+ if (refs)
129
+ refs.forEach((r) => allRefs.add(r));
130
+ }
131
+ return { target: normalised, count: allRefs.size, references: [...allRefs].sort() };
132
+ }
133
+ /** get_mc_inheritance */
134
+ export async function getMcInheritance(version, className) {
135
+ const index = await getMcIndex(version);
136
+ const internal = className.replace(/\./g, "/");
137
+ const info = index.classes[internal];
138
+ if (!info)
139
+ throw new Error(`Class not found in index: ${internal}`);
140
+ const classes = Object.values(index.classes);
141
+ const subclasses = classes.filter((c) => c.superName === internal).map((c) => c.name);
142
+ const implementors = classes.filter((c) => c.interfaces?.includes(internal)).map((c) => c.name);
143
+ return {
144
+ className: internal,
145
+ superClass: info.superName,
146
+ interfaces: info.interfaces ?? [],
147
+ subclasses,
148
+ implementors,
149
+ };
150
+ }
151
+ /** diff_minecraft_versions — added/removed classes between two versions. */
152
+ export async function diffMcVersions(versionA, versionB) {
153
+ const [jarA, jarB] = await Promise.all([getMcJarPath(versionA), getMcJarPath(versionB)]);
154
+ const setA = new Set(listClasses(jarA));
155
+ const setB = new Set(listClasses(jarB));
156
+ const added = [...setB].filter((c) => !setA.has(c)).sort();
157
+ const removed = [...setA].filter((c) => !setB.has(c)).sort();
158
+ const common = [...setA].filter((c) => setB.has(c)).length;
159
+ return { versionA, versionB, summary: { added: added.length, removed: removed.length, common }, added, removed };
160
+ }
161
+ /** decompile_minecraft_version — background Vineflower decompile of the entire JAR. */
162
+ export async function decompileMcVersion(version, force = false) {
163
+ const outDir = mcPaths.decompiled(version);
164
+ const jarPath = await getMcJarPath(version);
165
+ const dbId = await ensureMcVersionRecord(version);
166
+ if (!force) {
167
+ const status = await isDecompileDone(outDir);
168
+ if (status === "done") {
169
+ await updateMcVersion(dbId, { decompiled: true, decompPath: outDir });
170
+ return { status: "already_done", outDir };
171
+ }
172
+ if (status === "running")
173
+ return { status: "running", outDir };
174
+ }
175
+ // For legacy versions with SRG mappings, remap the JAR before decompiling
176
+ let decompileJarPath = jarPath;
177
+ let remapped = false;
178
+ let remapType = "none";
179
+ if (hasSrgMappings(version)) {
180
+ const mapped = await remapMcJar(jarPath, version);
181
+ if (mapped) {
182
+ decompileJarPath = mapped;
183
+ remapped = true;
184
+ remapType = "srg";
185
+ }
186
+ }
187
+ else if (hasRetroMcpMappings(version)) {
188
+ const mapped = await remapMcJarTiny(jarPath, version);
189
+ if (mapped) {
190
+ decompileJarPath = mapped;
191
+ remapped = true;
192
+ remapType = "retromcp";
193
+ }
194
+ }
195
+ await decompileJar(decompileJarPath, outDir);
196
+ await updateMcVersion(dbId, { decompPath: outDir, jarPath });
197
+ // For SRG versions, apply MCP human-readable names post-decompile
198
+ // (RetroMCP versions already have final names baked in via Tiny v2)
199
+ if (remapped && remapType === "srg") {
200
+ // Wait for decompile to finish before applying MCP names
201
+ // We schedule a background watcher that applies names when decompile completes
202
+ (async () => {
203
+ // Poll until done (max 30 min)
204
+ for (let i = 0; i < 360; i++) {
205
+ await new Promise(r => setTimeout(r, 5000));
206
+ const s = await isDecompileDone(outDir);
207
+ if (s === "done") {
208
+ const result = await applyMcpNamesToSource(outDir, version);
209
+ console.error(`[modlens] Applied MCP names to ${version}: ${result.replaced} replacements in ${result.files} files`);
210
+ return;
211
+ }
212
+ if (s === "error")
213
+ return;
214
+ }
215
+ })();
216
+ }
217
+ return { status: "started", outDir, remapped };
218
+ }
219
+ /** Poll decompile status; marks DB record when done. */
220
+ export async function decompileMcVersionStatus(version) {
221
+ const outDir = mcPaths.decompiled(version);
222
+ const status = await isDecompileDone(outDir);
223
+ if (status === "done") {
224
+ const dbId = await ensureMcVersionRecord(version);
225
+ await updateMcVersion(dbId, { decompiled: true, decompPath: outDir });
226
+ }
227
+ return { version, status, outDir };
228
+ }
229
+ /** search_minecraft_code — regex/text search over decompiled MC source files. */
230
+ export async function searchMcCode(version, query, searchType, isRegex, limit) {
231
+ validateVersion(version);
232
+ const outDir = mcPaths.decompiled(version);
233
+ const status = await isDecompileDone(outDir);
234
+ if (status !== "done") {
235
+ throw new Error(`MC ${version} has not been fully decompiled. ` +
236
+ `Run decompile_minecraft_version("${version}") first, then wait for it to finish.`);
237
+ }
238
+ // ── Fast path: use PostgreSQL FTS index when available ───────────────────
239
+ // FTS only supports plain-text queries. For regex or type-scoped searches
240
+ // (class/method/field), fall through to the filesystem walk.
241
+ if (!isRegex && (searchType === "content" || searchType === "all")) {
242
+ const indexed = await isMcVersionIndexed(version);
243
+ if (indexed) {
244
+ const ftsResults = await searchMcIndexed(query, version, limit);
245
+ return ftsResults.map((r) => ({
246
+ file: r.className + ".java",
247
+ line: 0, // FTS returns snippets, not line numbers
248
+ text: r.snippet,
249
+ }));
250
+ }
251
+ }
252
+ // Build effective regex based on searchType
253
+ let effectiveQuery = query;
254
+ if (!isRegex) {
255
+ // Escape for plain text, but we still use our own logic below
256
+ effectiveQuery = query.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
257
+ }
258
+ let pattern;
259
+ switch (searchType) {
260
+ case "class":
261
+ pattern = safeRegex(`(?:class|interface|enum|record)\\s+.*${effectiveQuery}`, "i");
262
+ break;
263
+ case "method":
264
+ pattern = safeRegex(`(?:public|protected|private|package-private|static|final|abstract|\\s)\\s+\\w[\\w<>\\[\\]]*\\s+${effectiveQuery}\\s*\\(`, "i");
265
+ break;
266
+ case "field":
267
+ pattern = safeRegex(`(?:public|protected|private|static|final|volatile|transient|\\s)\\s+\\w[\\w<>\\[\\]]*\\s+${effectiveQuery}\\s*[=;]`, "i");
268
+ break;
269
+ case "content":
270
+ case "all":
271
+ default:
272
+ pattern = safeRegex(effectiveQuery, "i");
273
+ }
274
+ const results = [];
275
+ await walkAndSearch(outDir, outDir, pattern, results, limit);
276
+ return results;
277
+ }
278
+ async function walkAndSearch(base, dir, pattern, results, limit) {
279
+ if (results.length >= limit)
280
+ return;
281
+ const entries = await readdir(dir, { withFileTypes: true }).catch(() => []);
282
+ for (const entry of entries) {
283
+ if (results.length >= limit)
284
+ break;
285
+ const full = join(dir, entry.name);
286
+ if (entry.isDirectory()) {
287
+ await walkAndSearch(base, full, pattern, results, limit);
288
+ }
289
+ else if (entry.name.endsWith(".java")) {
290
+ const content = await readFile(full, "utf8").catch(() => "");
291
+ const lines = content.split("\n");
292
+ for (let i = 0; i < lines.length && results.length < limit; i++) {
293
+ if (pattern.test(lines[i])) {
294
+ results.push({ file: relative(base, full), line: i + 1, text: lines[i].trim().slice(0, 200) });
295
+ }
296
+ }
297
+ }
298
+ }
299
+ }
300
+ function parseAwContent(content) {
301
+ const entries = [];
302
+ const lines = content.split("\n");
303
+ for (let i = 0; i < lines.length; i++) {
304
+ const raw = lines[i].trim();
305
+ if (!raw || raw.startsWith("#") || raw.startsWith("accessWidener"))
306
+ continue;
307
+ const parts = raw.split(/\s+/);
308
+ if (parts.length < 3)
309
+ continue;
310
+ const [access, kind, className] = parts;
311
+ if (kind === "class") {
312
+ entries.push({ line: i + 1, raw, kind: "class", access, className });
313
+ }
314
+ else if (kind === "method" && parts.length >= 5) {
315
+ // format: <access> method <class> <name> <descriptor>
316
+ entries.push({ line: i + 1, raw, kind: "method", access, className, memberName: parts[3], descriptor: parts[4] });
317
+ }
318
+ else if (kind === "field" && parts.length >= 5) {
319
+ entries.push({ line: i + 1, raw, kind: "field", access, className, memberName: parts[3], descriptor: parts[4] });
320
+ }
321
+ }
322
+ return entries;
323
+ }
324
+ export async function validateAccessWidener(content, mcVersion) {
325
+ const entries = parseAwContent(content);
326
+ const errors = [];
327
+ const valid = [];
328
+ // Group by class to minimise inspectClass calls
329
+ const byClass = new Map();
330
+ for (const e of entries) {
331
+ const list = byClass.get(e.className) ?? [];
332
+ list.push(e);
333
+ byClass.set(e.className, list);
334
+ }
335
+ const jarPath = await getMcJarPath(mcVersion);
336
+ for (const [className, classEntries] of byClass) {
337
+ let members = null;
338
+ try {
339
+ const info = await inspectClass(jarPath, className);
340
+ members = formatClassMembers(info);
341
+ }
342
+ catch {
343
+ for (const e of classEntries) {
344
+ const allClasses = listClasses(jarPath).map((c) => c.replace(/\.class$/, ""));
345
+ errors.push({
346
+ line: e.line,
347
+ raw: e.raw,
348
+ error: `Class not found: ${className}`,
349
+ suggestions: topSimilar(className.split("/").pop() ?? className, allClasses.map((c) => c.split("/").pop() ?? c)),
350
+ });
351
+ }
352
+ continue;
353
+ }
354
+ for (const e of classEntries) {
355
+ if (e.kind === "class") {
356
+ valid.push(e);
357
+ continue;
358
+ }
359
+ if (e.kind === "method") {
360
+ const methodNames = members.methods.map((m) => m.name);
361
+ const match = members.methods.find((m) => m.name === e.memberName && (!e.descriptor || m.descriptor === e.descriptor));
362
+ if (match) {
363
+ valid.push(e);
364
+ }
365
+ else {
366
+ errors.push({
367
+ line: e.line,
368
+ raw: e.raw,
369
+ error: `Method not found: ${e.memberName} ${e.descriptor ?? "(any descriptor)"} in ${className}`,
370
+ suggestions: topSimilar(e.memberName ?? "", methodNames),
371
+ });
372
+ }
373
+ }
374
+ else if (e.kind === "field") {
375
+ const fieldNames = members.fields.map((f) => f.name);
376
+ const match = members.fields.find((f) => f.name === e.memberName && (!e.descriptor || f.descriptor === e.descriptor));
377
+ if (match) {
378
+ valid.push(e);
379
+ }
380
+ else {
381
+ errors.push({
382
+ line: e.line,
383
+ raw: e.raw,
384
+ error: `Field not found: ${e.memberName} ${e.descriptor ?? "(any descriptor)"} in ${className}`,
385
+ suggestions: topSimilar(e.memberName ?? "", fieldNames),
386
+ });
387
+ }
388
+ }
389
+ }
390
+ }
391
+ return {
392
+ total: entries.length,
393
+ valid: valid.length,
394
+ errorCount: errors.length,
395
+ errors,
396
+ validEntries: valid.map((e) => e.raw),
397
+ };
398
+ }
399
+ function parseMixinAnnotations(source) {
400
+ // Build import map: "LivingEntity" → "net/minecraft/world/entity/LivingEntity"
401
+ const imports = new Map();
402
+ for (const m of source.matchAll(/^import\s+([\w.]+);/gm)) {
403
+ const parts = m[1].split(".");
404
+ imports.set(parts[parts.length - 1], m[1].replace(/\./g, "/"));
405
+ }
406
+ // Find @Mixin annotation
407
+ let targetClass = null;
408
+ let targetRaw = "";
409
+ // @Mixin(targets = "net/minecraft/X")
410
+ const targetsStr = source.match(/@Mixin\s*\(\s*targets\s*=\s*"([^"]+)"/);
411
+ if (targetsStr) {
412
+ targetClass = targetsStr[1].replace(/\./g, "/");
413
+ targetRaw = targetsStr[0];
414
+ }
415
+ // @Mixin(SomeClass.class) or @Mixin(value = SomeClass.class)
416
+ if (!targetClass) {
417
+ const valueMatch = source.match(/@Mixin\s*\(\s*(?:value\s*=\s*)?(\w+)\.class/);
418
+ if (valueMatch) {
419
+ const simpleName = valueMatch[1];
420
+ targetClass = imports.get(simpleName) ?? simpleName;
421
+ targetRaw = valueMatch[0];
422
+ }
423
+ }
424
+ // Extract @Inject / @Redirect / @ModifyArg method targets
425
+ const injections = [];
426
+ const injectAnnotations = [
427
+ { name: "@Inject", re: /@Inject\s*\([^)]*method\s*=\s*"([^"]+)"[^)]*(?:at\s*=\s*@At\s*\(\s*"([^"]+)"\s*\))?[^)]*\)/gs },
428
+ { name: "@Redirect", re: /@Redirect\s*\([^)]*method\s*=\s*"([^"]+)"[^)]*\)/gs },
429
+ { name: "@ModifyArg", re: /@ModifyArg\s*\([^)]*method\s*=\s*"([^"]+)"[^)]*\)/gs },
430
+ { name: "@ModifyConstant", re: /@ModifyConstant\s*\([^)]*method\s*=\s*"([^"]+)"[^)]*\)/gs },
431
+ ];
432
+ for (const { name, re } of injectAnnotations) {
433
+ for (const m of source.matchAll(re)) {
434
+ injections.push({ annotationType: name, method: m[1], at: m[2] });
435
+ }
436
+ }
437
+ // @Overwrite — the target method IS the method being declared
438
+ for (const m of source.matchAll(/@Overwrite[\s\S]*?(?:public|protected|private)\s+\w[\w<>\[\]]*\s+(\w+)\s*\(/gm)) {
439
+ injections.push({ annotationType: "@Overwrite", method: m[1] });
440
+ }
441
+ // @Shadow declarations
442
+ const shadows = [];
443
+ for (const m of source.matchAll(/@Shadow[^;{]*(?:private|protected|public)?\s+\w[\w<>\[\]]*\s+(\w+)/g)) {
444
+ shadows.push(m[1]);
445
+ }
446
+ return { targetClass, targetRaw, injections, shadows, imports };
447
+ }
448
+ export async function analyzeMixin(source, mcVersion) {
449
+ const { targetClass, targetRaw, injections, shadows } = parseMixinAnnotations(source);
450
+ if (!targetClass) {
451
+ return {
452
+ error: "Could not resolve @Mixin target class. Check that the class is imported and @Mixin(targets = \"...\") or @Mixin(SomeClass.class) is present.",
453
+ raw: targetRaw,
454
+ };
455
+ }
456
+ const jarPath = await getMcJarPath(mcVersion);
457
+ let members;
458
+ try {
459
+ const info = await inspectClass(jarPath, targetClass);
460
+ members = formatClassMembers(info);
461
+ }
462
+ catch {
463
+ const allClasses = listClasses(jarPath).map((c) => c.replace(/\.class$/, ""));
464
+ return {
465
+ targetClass,
466
+ error: `Target class not found in MC ${mcVersion}: ${targetClass}`,
467
+ suggestions: topSimilar(targetClass.split("/").pop() ?? targetClass, allClasses.map((c) => c.split("/").pop() ?? c)),
468
+ };
469
+ }
470
+ const methodNames = members.methods.map((m) => m.name);
471
+ const fieldNames = members.fields.map((f) => f.name);
472
+ const results = injections.map((inj) => {
473
+ // Parse method target: "hurt(Lnet/minecraft/X;F)Z" → name + descriptor
474
+ const colonIdx = inj.method.indexOf("(");
475
+ const methodName = colonIdx === -1 ? inj.method : inj.method.slice(0, colonIdx);
476
+ const descriptor = colonIdx === -1 ? null : inj.method.slice(colonIdx);
477
+ const exactMatch = members.methods.find((m) => m.name === methodName && (!descriptor || m.descriptor === descriptor));
478
+ const nameOnlyMatch = !exactMatch && members.methods.some((m) => m.name === methodName);
479
+ if (exactMatch) {
480
+ return { annotation: inj.annotationType, target: inj.method, status: "valid", mixinTarget: exactMatch.mixinTarget };
481
+ }
482
+ if (nameOnlyMatch && descriptor) {
483
+ const overloads = members.methods.filter((m) => m.name === methodName).map((m) => m.mixinTarget);
484
+ return { annotation: inj.annotationType, target: inj.method, status: "wrong_descriptor", error: `Method "${methodName}" exists but descriptor "${descriptor}" doesn't match.`, overloads };
485
+ }
486
+ return {
487
+ annotation: inj.annotationType,
488
+ target: inj.method,
489
+ status: "not_found",
490
+ error: `Method "${methodName}" not found in ${targetClass}`,
491
+ suggestions: topSimilar(methodName, methodNames),
492
+ };
493
+ });
494
+ const shadowResults = shadows.map((s) => {
495
+ const inMethods = members.methods.find((m) => m.name === s);
496
+ const inFields = members.fields.find((f) => f.name === s);
497
+ if (inMethods || inFields)
498
+ return { name: s, status: "valid" };
499
+ return {
500
+ name: s,
501
+ status: "not_found",
502
+ error: `Shadow target "${s}" not found as method or field in ${targetClass}`,
503
+ suggestions: topSimilar(s, [...methodNames, ...fieldNames]),
504
+ };
505
+ });
506
+ const errorCount = results.filter((r) => r.status !== "valid").length + shadowResults.filter((r) => r.status !== "valid").length;
507
+ return {
508
+ targetClass,
509
+ mcVersion,
510
+ summary: { injections: injections.length, shadows: shadows.length, errors: errorCount },
511
+ injectionResults: results,
512
+ shadowResults,
513
+ };
514
+ }
515
+ /**
516
+ * Search decompiled Minecraft (or NeoForge) source for Event subclasses.
517
+ * Returns class names + file paths for all classes that extend a known Event base.
518
+ *
519
+ * query: optional name filter, e.g. "Living", "Player", "Block"
520
+ * modloader: "neoforge" searches NeoForge-specific events (needs NeoForge ingested + decompiled)
521
+ * "minecraft" (default) searches vanilla source for event-like classes
522
+ */
523
+ export async function searchEvents(version, query, modloader = "minecraft") {
524
+ // ── NeoForge / Fabric: search the ingested loader mod's decompiled source ─
525
+ const isFabric = modloader === "fabric" || modloader === "fabric-api";
526
+ if (modloader === "neoforge" || isFabric) {
527
+ // Fabric API may be ingested under modId "fabric-api" or "fabric"; try both
528
+ const candidateIds = isFabric ? ["fabric-api", "fabric"] : ["neoforge"];
529
+ let mod = null;
530
+ for (const id of candidateIds) {
531
+ mod = await findModByModIdLike(id);
532
+ if (mod)
533
+ break;
534
+ }
535
+ if (!mod) {
536
+ throw new Error(`${modloader === "neoforge" ? "NeoForge" : "Fabric API"} has not been ingested. ` +
537
+ `Run mc_versions ingest_${modloader === "neoforge" ? "neoforge" : "fabric"} first.`);
538
+ }
539
+ // Pattern differs per loader:
540
+ // NeoForge: classes extending Event (class-based event bus)
541
+ // Fabric: static Event<T> field declarations (callback-based)
542
+ const searchPattern = modloader === "neoforge"
543
+ ? (query ? `class\\s+\\w*${query}\\w*\\s+extends\\s+[\\w.]*Event\\b` : `extends\\s+[\\w.]*Event\\b`)
544
+ : (query ? `Event<.*${query}` : `public\\s+static\\s+final\\s+Event<`);
545
+ const raw = await searchSource(searchPattern, mod.id, true, 200);
546
+ // Fabric API is a Jar-in-Jar bundle — decompiled source may be empty.
547
+ // Fall back to class name search when no source results are found.
548
+ let events;
549
+ if (raw.length === 0 && isFabric) {
550
+ const { listClasses: listJarClasses } = await import("../jar.js");
551
+ const allClasses = listJarClasses(mod.jarPath)
552
+ .map((c) => c.replace(/\.class$/, "").replace(/\//g, "."))
553
+ .filter((c) => !c.includes("$")); // hide inner classes
554
+ const q = query?.toLowerCase();
555
+ const matched = q
556
+ ? allClasses.filter((c) => c.toLowerCase().includes(q) && c.toLowerCase().includes("event"))
557
+ : allClasses.filter((c) => c.toLowerCase().includes("event"));
558
+ events = matched.map((c) => ({ className: c, file: c.replace(/\./g, "/") + ".class", line: 0 }));
559
+ }
560
+ else {
561
+ const seen = new Set();
562
+ events = [];
563
+ for (const r of raw) {
564
+ if (!seen.has(r.file)) {
565
+ seen.add(r.file);
566
+ const parts = r.file.replace(/\.java$/, "").split(/[\\/]/);
567
+ events.push({ className: parts.join("."), file: r.file, line: r.line });
568
+ }
569
+ }
570
+ }
571
+ const note = modloader === "neoforge"
572
+ ? "extends net.neoforged.bus.api.Event"
573
+ : "public static final Event<T> (Fabric callback pattern)";
574
+ return {
575
+ version,
576
+ modloader,
577
+ modDbId: mod.id,
578
+ modVersion: mod.version,
579
+ query: query ?? "(all events)",
580
+ count: events.length,
581
+ note,
582
+ events,
583
+ };
584
+ }
585
+ // ── Vanilla Minecraft: search decompiled MC source ────────────────────────
586
+ const outDir = mcPaths.decompiled(version);
587
+ const status = await isDecompileDone(outDir);
588
+ if (status !== "done") {
589
+ throw new Error(`MC ${version} source not decompiled. Run decompile_minecraft_version first.`);
590
+ }
591
+ const results = await searchMcCode(version, query
592
+ ? `class ${query}[\\w]* extends [\\w.]*Event`
593
+ : `extends [\\w.]*Event\\b`, "content", true, 200);
594
+ const seen = new Set();
595
+ const events = [];
596
+ for (const r of results) {
597
+ if (!seen.has(r.file)) {
598
+ seen.add(r.file);
599
+ const parts = r.file.replace(/\.java$/, "").split("/");
600
+ events.push({ className: parts.join("."), file: r.file, line: r.line });
601
+ }
602
+ }
603
+ return {
604
+ version,
605
+ modloader,
606
+ query: query ?? "(all events)",
607
+ count: events.length,
608
+ note: "extends net.minecraft.*Event",
609
+ events,
610
+ };
611
+ }
612
+ //# sourceMappingURL=vanilla.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vanilla.js","sourceRoot":"","sources":["../../src/tools/vanilla.ts"],"names":[],"mappings":"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"}