@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,560 @@
1
+ /**
2
+ * Distributable embedding bundles — export, import, and download pre-computed
3
+ * embeddings so users don't need Ollama to get semantic search.
4
+ */
5
+ import { createHash } from "crypto";
6
+ import { createGzip, createGunzip } from "zlib";
7
+ import { pipeline } from "stream/promises";
8
+ import { createWriteStream } from "fs";
9
+ import { readFile, writeFile, mkdir } from "fs/promises";
10
+ import { join } from "path";
11
+ import { Readable } from "stream";
12
+ import { paths } from "../cache.js";
13
+ import { getDb } from "../db.js";
14
+ import { findModById, findModByModIdLike } from "../repositories/mod.js";
15
+ import { upsertModSourceEmbedding, findModSourceIdsByClassNames, upsertSourceEmbedding, findSourceIdsByClassNames, getEmbedSources, countEmbedsBySource, } from "../repositories/embeddings.js";
16
+ import { findMcVersionByVersionId } from "../repositories/mcVersion.js";
17
+ import { validateDbId } from "../validate.js";
18
+ import { validateEmbeddingBundle, validateEmbedRegistryIndex } from "../security.js";
19
+ function normalizeBundleTarget(bundle) {
20
+ const targetType = bundle.targetType ?? "mod";
21
+ if (targetType === "mod") {
22
+ return {
23
+ targetType,
24
+ targetId: bundle.targetId ?? bundle.modId ?? "",
25
+ targetVersion: bundle.targetVersion ?? bundle.modVersion ?? "",
26
+ loader: bundle.loader,
27
+ mcVersion: bundle.mcVersion,
28
+ };
29
+ }
30
+ return {
31
+ targetType,
32
+ targetId: bundle.targetId,
33
+ targetVersion: bundle.targetVersion,
34
+ loader: bundle.loader,
35
+ mcVersion: bundle.mcVersion,
36
+ };
37
+ }
38
+ // ── Export ─────────────────────────────────────────────────────────────────────
39
+ /**
40
+ * Export a mod's embeddings to a portable bundle file.
41
+ */
42
+ export async function exportModEmbeddings(dbId, outputDir) {
43
+ validateDbId(dbId);
44
+ const mod = await findModById(dbId);
45
+ if (!mod)
46
+ throw new Error(`Mod #${dbId} not found`);
47
+ const model = process.env.OLLAMA_EMBED_MODEL ?? "nomic-embed-text";
48
+ const dims = parseInt(process.env.OLLAMA_EMBED_DIM ?? "768", 10);
49
+ const chunkSize = parseInt(process.env.OLLAMA_EMBED_CHUNK ?? "1500", 10);
50
+ // Query all embedded source files
51
+ const db = await getDb();
52
+ const rows = await db.$queryRawUnsafe(`SELECT class_name, embedding::text AS embedding FROM mod_source_files
53
+ WHERE mod_id = $1 AND embedding IS NOT NULL`, dbId);
54
+ if (rows.length === 0) {
55
+ throw new Error(`No embeddings found for mod #${dbId} (${mod.modId}). Run index_semantic first.`);
56
+ }
57
+ const entries = rows.map(r => ({
58
+ className: r.class_name,
59
+ embedding: JSON.parse(r.embedding),
60
+ }));
61
+ const bundle = {
62
+ version: 1,
63
+ model,
64
+ dimensions: dims,
65
+ chunkSize,
66
+ targetType: "mod",
67
+ targetId: mod.modId,
68
+ targetVersion: mod.version,
69
+ loader: mod.loader,
70
+ mcVersion: mod.mcVersion,
71
+ modId: mod.modId,
72
+ modVersion: mod.version,
73
+ generatedAt: new Date().toISOString(),
74
+ entries,
75
+ };
76
+ // Write gzipped bundle
77
+ const modelDir = join(outputDir, model);
78
+ await mkdir(modelDir, { recursive: true });
79
+ const filename = `${mod.modId}-${mod.version}.emb.json.gz`;
80
+ const outPath = join(modelDir, filename);
81
+ const json = JSON.stringify(bundle);
82
+ const gzip = createGzip();
83
+ const ws = createWriteStream(outPath);
84
+ await pipeline(Readable.from(json), gzip, ws);
85
+ // Compute SHA-256 of the gzipped file
86
+ const fileData = await readFile(outPath);
87
+ const sha256 = createHash("sha256").update(fileData).digest("hex");
88
+ const sizeBytes = fileData.length;
89
+ return { path: outPath, entryCount: entries.length, sizeBytes, sha256 };
90
+ }
91
+ export async function exportVanillaEmbeddings(mcVersion, outputDir) {
92
+ const versionRow = await findMcVersionByVersionId(mcVersion);
93
+ if (!versionRow)
94
+ throw new Error(`MC version ${mcVersion} not found. Run mc_source index first.`);
95
+ const model = process.env.OLLAMA_EMBED_MODEL ?? "nomic-embed-text";
96
+ const dims = parseInt(process.env.OLLAMA_EMBED_DIM ?? "768", 10);
97
+ const chunkSize = parseInt(process.env.OLLAMA_EMBED_CHUNK ?? "1500", 10);
98
+ const db = await getDb();
99
+ const rows = await db.$queryRawUnsafe(`SELECT class_name, embedding::text AS embedding FROM mc_source_files
100
+ WHERE mc_version_id = $1 AND embedding IS NOT NULL`, versionRow.id);
101
+ if (rows.length === 0) {
102
+ throw new Error(`No vanilla embeddings found for MC ${mcVersion}. Run mc_source index_semantic first.`);
103
+ }
104
+ const entries = rows.map(r => ({
105
+ className: r.class_name,
106
+ embedding: JSON.parse(r.embedding),
107
+ }));
108
+ const bundle = {
109
+ version: 1,
110
+ model,
111
+ dimensions: dims,
112
+ chunkSize,
113
+ targetType: "vanilla",
114
+ targetId: "minecraft",
115
+ targetVersion: mcVersion,
116
+ loader: "vanilla",
117
+ mcVersion,
118
+ generatedAt: new Date().toISOString(),
119
+ entries,
120
+ };
121
+ const modelDir = join(outputDir, model);
122
+ await mkdir(modelDir, { recursive: true });
123
+ const filename = `vanilla-${mcVersion}.emb.json.gz`;
124
+ const outPath = join(modelDir, filename);
125
+ const json = JSON.stringify(bundle);
126
+ await pipeline(Readable.from(json), createGzip(), createWriteStream(outPath));
127
+ const fileData = await readFile(outPath);
128
+ const sha256 = createHash("sha256").update(fileData).digest("hex");
129
+ const sizeBytes = fileData.length;
130
+ return { path: outPath, entryCount: entries.length, sizeBytes, sha256 };
131
+ }
132
+ export async function exportEmbeddings(targetType, outputDir, opts = {}) {
133
+ if (targetType === "mod") {
134
+ if (!opts.dbId)
135
+ throw new Error("embed_export targetType=mod requires dbId");
136
+ return exportModEmbeddings(opts.dbId, outputDir);
137
+ }
138
+ if (targetType === "vanilla") {
139
+ if (!opts.mcVersion)
140
+ throw new Error("embed_export targetType=vanilla requires mcVersion");
141
+ return exportVanillaEmbeddings(opts.mcVersion, outputDir);
142
+ }
143
+ // modloader — stored as a Mod row (modId="neoforge"/"fabric"), so resolve and reuse mod export
144
+ if (opts.dbId)
145
+ return exportModEmbeddings(opts.dbId, outputDir);
146
+ const loaderId = opts.targetId ?? opts.mcVersion ?? "neoforge";
147
+ const loaderMod = await findModByModIdLike(loaderId);
148
+ if (!loaderMod)
149
+ throw new Error(`No ingested modloader found matching "${loaderId}". Ingest the modloader JAR first.`);
150
+ return exportModEmbeddings(loaderMod.id, outputDir);
151
+ }
152
+ /**
153
+ * Export all mods with embeddings and generate an index.json manifest.
154
+ */
155
+ export async function exportAllEmbeddings(outputDir) {
156
+ const db = await getDb();
157
+ const model = process.env.OLLAMA_EMBED_MODEL ?? "nomic-embed-text";
158
+ // Find all mods with at least one embedded source file
159
+ const mods = await db.$queryRawUnsafe(`SELECT mod_id, COUNT(*)::text AS count FROM mod_source_files
160
+ WHERE embedding IS NOT NULL GROUP BY mod_id`);
161
+ let exported = 0;
162
+ let skipped = 0;
163
+ const entries = [];
164
+ for (const row of mods) {
165
+ try {
166
+ const result = await exportModEmbeddings(row.mod_id, outputDir);
167
+ const mod = await findModById(row.mod_id);
168
+ if (!mod)
169
+ continue;
170
+ entries.push({
171
+ targetType: "mod",
172
+ targetId: mod.modId,
173
+ targetVersion: mod.version,
174
+ loader: mod.loader,
175
+ mcVersion: mod.mcVersion,
176
+ model,
177
+ dimensions: parseInt(process.env.OLLAMA_EMBED_DIM ?? "768", 10),
178
+ entryCount: result.entryCount,
179
+ sizeBytes: result.sizeBytes,
180
+ sha256: result.sha256,
181
+ url: `${model}/${mod.modId}-${mod.version}.emb.json.gz`,
182
+ });
183
+ exported++;
184
+ }
185
+ catch {
186
+ skipped++;
187
+ }
188
+ }
189
+ // Write index.json
190
+ const registry = {
191
+ version: 1,
192
+ models: [model],
193
+ bundles: entries,
194
+ };
195
+ const indexPath = join(outputDir, "index.json");
196
+ await writeFile(indexPath, JSON.stringify(registry, null, 2));
197
+ return { exported, skipped, indexPath };
198
+ }
199
+ // ── Import ────────────────────────────────────────────────────────────────────
200
+ /**
201
+ * Import embeddings from a local bundle file into the database.
202
+ * By default, protects user-generated ("local") embeddings from being overwritten.
203
+ * Pass force=true to overwrite all embeddings regardless of source.
204
+ */
205
+ export async function importEmbeddingsBundle(bundlePath, opts = {}) {
206
+ // Read and decompress
207
+ const compressed = await readFile(bundlePath);
208
+ // Decompression bomb protection: reject >200MB compressed
209
+ if (compressed.length > 200_000_000) {
210
+ throw new Error("Compressed bundle too large (>200MB)");
211
+ }
212
+ // Decompress with size limit
213
+ const chunks = [];
214
+ let totalSize = 0;
215
+ const MAX_DECOMPRESSED = 500_000_000; // 500MB
216
+ const gunzip = createGunzip();
217
+ const input = Readable.from(compressed);
218
+ for await (const chunk of input.pipe(gunzip)) {
219
+ totalSize += chunk.length;
220
+ if (totalSize > MAX_DECOMPRESSED) {
221
+ throw new Error("Decompressed bundle exceeds 500MB — possible decompression bomb");
222
+ }
223
+ chunks.push(chunk);
224
+ }
225
+ const json = Buffer.concat(chunks).toString("utf8");
226
+ const bundle = JSON.parse(json);
227
+ // Security validation
228
+ const validation = validateEmbeddingBundle(bundle);
229
+ if (!validation.valid) {
230
+ throw new Error(`Bundle validation failed: ${validation.reason}`);
231
+ }
232
+ // Model mismatch check
233
+ const localModel = process.env.OLLAMA_EMBED_MODEL ?? "nomic-embed-text";
234
+ const localDims = parseInt(process.env.OLLAMA_EMBED_DIM ?? "768", 10);
235
+ if (bundle.model !== localModel || bundle.dimensions !== localDims) {
236
+ return {
237
+ status: "model_mismatch",
238
+ imported: 0,
239
+ skipped: bundle.entries.length,
240
+ skippedLocal: 0,
241
+ total: bundle.entries.length,
242
+ bundleModel: `${bundle.model} (${bundle.dimensions}d)`,
243
+ localModel: `${localModel} (${localDims}d)`,
244
+ };
245
+ }
246
+ const target = normalizeBundleTarget(bundle);
247
+ const classNames = bundle.entries.map(e => e.className);
248
+ const bundleDate = bundle.generatedAt ? new Date(bundle.generatedAt) : null;
249
+ const forceAll = opts.force ?? false;
250
+ let idMap;
251
+ let sourceTable = "mod_source_files";
252
+ if (target.targetType === "mod") {
253
+ const db = await getDb();
254
+ const mod = await db.$queryRawUnsafe(`SELECT id FROM mods WHERE mod_id = $1 AND version = $2 LIMIT 1`, target.targetId, target.targetVersion);
255
+ if (!mod.length) {
256
+ return { status: "mod_not_found", imported: 0, skipped: bundle.entries.length, skippedLocal: 0, total: bundle.entries.length };
257
+ }
258
+ idMap = await findModSourceIdsByClassNames(classNames, mod[0].id, false);
259
+ }
260
+ else if (target.targetType === "vanilla") {
261
+ sourceTable = "mc_source_files";
262
+ const versionRow = await findMcVersionByVersionId(target.targetVersion);
263
+ if (!versionRow) {
264
+ return { status: "mc_version_not_found", imported: 0, skipped: bundle.entries.length, skippedLocal: 0, total: bundle.entries.length };
265
+ }
266
+ idMap = await findSourceIdsByClassNames(classNames, versionRow.id, false);
267
+ }
268
+ else {
269
+ // modloader — stored in mod_source_files, same as mods
270
+ const db = await getDb();
271
+ const loaderMod = await db.$queryRawUnsafe(`SELECT id FROM mods WHERE mod_id = $1 LIMIT 1`, target.targetId);
272
+ if (!loaderMod.length) {
273
+ // Try fuzzy match (e.g., "neoforge" matches modId containing "neoforge")
274
+ const fuzzy = await findModByModIdLike(target.targetId);
275
+ if (!fuzzy) {
276
+ return { status: "modloader_not_found", imported: 0, skipped: bundle.entries.length, skippedLocal: 0, total: bundle.entries.length };
277
+ }
278
+ idMap = await findModSourceIdsByClassNames(classNames, fuzzy.id, false);
279
+ }
280
+ else {
281
+ idMap = await findModSourceIdsByClassNames(classNames, loaderMod[0].id, false);
282
+ }
283
+ }
284
+ // Build provenance map for existing embeddings so we can protect local ones
285
+ const allIds = [...idMap.values()];
286
+ let existingSources = new Map();
287
+ if (!forceAll && allIds.length > 0) {
288
+ try {
289
+ existingSources = await getEmbedSources(sourceTable, allIds);
290
+ }
291
+ catch { /* columns may not exist yet — treat all as overwritable */ }
292
+ }
293
+ let imported = 0;
294
+ let skipped = 0;
295
+ let skippedLocal = 0;
296
+ for (const entry of bundle.entries) {
297
+ const sourceFileId = idMap.get(entry.className);
298
+ if (!sourceFileId) {
299
+ skipped++;
300
+ continue;
301
+ }
302
+ // Protection: don't overwrite user-generated local embeddings unless force=true
303
+ if (!forceAll) {
304
+ const existing = existingSources.get(sourceFileId);
305
+ if (existing) {
306
+ if (existing.source === "local") {
307
+ skippedLocal++;
308
+ continue;
309
+ }
310
+ // Freshness: skip if existing registry embedding is newer than the bundle
311
+ if (existing.source === "registry" && existing.updatedAt && bundleDate && existing.updatedAt >= bundleDate) {
312
+ skipped++;
313
+ continue;
314
+ }
315
+ }
316
+ }
317
+ if (target.targetType === "mod" || target.targetType === "modloader") {
318
+ await upsertModSourceEmbedding(sourceFileId, entry.embedding, "registry");
319
+ }
320
+ else if (target.targetType === "vanilla") {
321
+ await upsertSourceEmbedding(sourceFileId, entry.embedding, "registry");
322
+ }
323
+ imported++;
324
+ }
325
+ return { status: "ok", imported, skipped, skippedLocal, total: bundle.entries.length };
326
+ }
327
+ export async function importModEmbeddings(bundlePath, opts = {}) {
328
+ return importEmbeddingsBundle(bundlePath, opts);
329
+ }
330
+ // ── Download from registry ────────────────────────────────────────────────────
331
+ const EMBED_REGISTRY_URL = process.env.MODLENS_EMBED_REGISTRY_URL ??
332
+ "https://raw.githubusercontent.com/Mattabase/modlens-embeddings/main/index.json";
333
+ let cachedEmbedRegistry = null;
334
+ const REGISTRY_CACHE_TTL = 60 * 60 * 1000; // 1 hour
335
+ async function fetchEmbedRegistry() {
336
+ if (cachedEmbedRegistry && Date.now() - cachedEmbedRegistry.fetchedAt < REGISTRY_CACHE_TTL) {
337
+ return cachedEmbedRegistry.data;
338
+ }
339
+ const res = await fetch(EMBED_REGISTRY_URL, { signal: AbortSignal.timeout(10_000) });
340
+ if (res.status === 404) {
341
+ const empty = { version: 1, models: [], bundles: [] };
342
+ cachedEmbedRegistry = { data: empty, fetchedAt: Date.now() };
343
+ return empty;
344
+ }
345
+ if (!res.ok)
346
+ throw new Error(`Failed to fetch embedding registry: ${res.status}`);
347
+ const data = await res.json();
348
+ const indexCheck = validateEmbedRegistryIndex(data);
349
+ if (!indexCheck.valid) {
350
+ throw new Error(`Invalid embedding registry: ${indexCheck.reason}`);
351
+ }
352
+ cachedEmbedRegistry = { data, fetchedAt: Date.now() };
353
+ return data;
354
+ }
355
+ /**
356
+ * Download and import pre-computed embeddings for a specific target.
357
+ */
358
+ export async function downloadEmbeddings(target) {
359
+ const localModel = target.model ?? process.env.OLLAMA_EMBED_MODEL ?? "nomic-embed-text";
360
+ let resolvedTargetId = target.targetId;
361
+ let resolvedTargetVersion = target.targetVersion;
362
+ if ((target.targetType === "mod" || target.targetType === "modloader") && (!resolvedTargetId || !resolvedTargetVersion) && target.dbId != null) {
363
+ const mod = await findModById(target.dbId);
364
+ if (!mod)
365
+ return { status: "mod_not_found", source: `Mod #${target.dbId} not found` };
366
+ resolvedTargetId = resolvedTargetId ?? mod.modId;
367
+ resolvedTargetVersion = resolvedTargetVersion ?? mod.version;
368
+ }
369
+ else if (target.targetType === "modloader" && !target.dbId && resolvedTargetId) {
370
+ // Resolve modloader name to mod row
371
+ const loaderMod = await findModByModIdLike(resolvedTargetId);
372
+ if (!loaderMod)
373
+ return { status: "modloader_not_found", source: `No ingested modloader "${resolvedTargetId}". Ingest the modloader JAR first.` };
374
+ resolvedTargetId = loaderMod.modId;
375
+ resolvedTargetVersion = resolvedTargetVersion ?? loaderMod.version;
376
+ }
377
+ if (!resolvedTargetId || !resolvedTargetVersion) {
378
+ return { status: "invalid_target", source: "targetId and targetVersion are required" };
379
+ }
380
+ let registry;
381
+ try {
382
+ registry = await fetchEmbedRegistry();
383
+ }
384
+ catch (e) {
385
+ return { status: "registry_unavailable", source: e.message };
386
+ }
387
+ // Find matching bundle for user's model
388
+ const matchingBundles = registry.bundles.filter((b) => {
389
+ const bundleType = b.targetType ?? "mod";
390
+ return bundleType === target.targetType
391
+ && b.targetId === resolvedTargetId
392
+ && b.targetVersion === resolvedTargetVersion;
393
+ });
394
+ const entry = matchingBundles.find((b) => b.model === localModel);
395
+ if (!entry) {
396
+ const otherModels = [...new Set(matchingBundles.map((b) => b.model))];
397
+ return {
398
+ status: "not_found",
399
+ availableModels: otherModels.length ? otherModels : undefined,
400
+ };
401
+ }
402
+ // Resolve URL
403
+ let bundleUrl = entry.url;
404
+ if (!bundleUrl.startsWith("http")) {
405
+ const base = EMBED_REGISTRY_URL.substring(0, EMBED_REGISTRY_URL.lastIndexOf("/") + 1);
406
+ bundleUrl = base + bundleUrl;
407
+ }
408
+ if (!bundleUrl.startsWith("https://")) {
409
+ throw new Error("Bundle URL must use HTTPS");
410
+ }
411
+ // Download
412
+ const res = await fetch(bundleUrl, { signal: AbortSignal.timeout(60_000) });
413
+ if (!res.ok)
414
+ throw new Error(`Failed to download bundle: ${res.status}`);
415
+ const contentLength = parseInt(res.headers.get("content-length") ?? "0");
416
+ if (contentLength > 200_000_000)
417
+ throw new Error("Bundle too large (>200MB)");
418
+ const data = Buffer.from(await res.arrayBuffer());
419
+ // Verify SHA-256
420
+ const hash = createHash("sha256").update(data).digest("hex");
421
+ if (hash !== entry.sha256) {
422
+ throw new Error(`SHA-256 mismatch: expected ${entry.sha256}, got ${hash}`);
423
+ }
424
+ // Save to cache and import
425
+ const bundleDir = paths.embedBundles;
426
+ await mkdir(bundleDir, { recursive: true });
427
+ const safeId = resolvedTargetId.replace(/[^a-zA-Z0-9._-]/g, "_");
428
+ const safeVer = resolvedTargetVersion.replace(/[^a-zA-Z0-9._-]/g, "_");
429
+ const localPath = join(bundleDir, `${target.targetType}-${safeId}-${safeVer}.emb.json.gz`);
430
+ await writeFile(localPath, data);
431
+ const result = await importEmbeddingsBundle(localPath, { force: target.force });
432
+ return {
433
+ status: result.status,
434
+ imported: result.imported,
435
+ skipped: result.skipped,
436
+ skippedLocal: result.skippedLocal,
437
+ };
438
+ }
439
+ /**
440
+ * Download embeddings for all ingested mods that don't have them yet.
441
+ */
442
+ export async function downloadPackEmbeddings() {
443
+ const db = await getDb();
444
+ // Get all mods
445
+ const allMods = await db.$queryRawUnsafe(`SELECT id, mod_id, version FROM mods ORDER BY mod_id`);
446
+ // Check which have embeddings
447
+ const embedded = await db.$queryRawUnsafe(`SELECT DISTINCT mod_id FROM mod_source_files WHERE embedding IS NOT NULL`);
448
+ const embeddedSet = new Set(embedded.map(r => r.mod_id));
449
+ let downloaded = 0;
450
+ let alreadyEmbedded = 0;
451
+ let notAvailable = 0;
452
+ const total = allMods.length;
453
+ process.stderr.write(`[embed_download_all] Starting embedding download for ${total} mods (${embeddedSet.size} already embedded)\n`);
454
+ for (let i = 0; i < allMods.length; i++) {
455
+ const mod = allMods[i];
456
+ if (embeddedSet.has(mod.id)) {
457
+ alreadyEmbedded++;
458
+ continue;
459
+ }
460
+ if ((i + 1) % 10 === 0 || i === 0) {
461
+ process.stderr.write(`[embed_download_all] Processing ${i + 1}/${total}: ${mod.mod_id} (downloaded: ${downloaded}, skipped: ${notAvailable})\n`);
462
+ }
463
+ try {
464
+ const result = await downloadEmbeddings({
465
+ targetType: "mod",
466
+ targetId: mod.mod_id,
467
+ targetVersion: mod.version,
468
+ });
469
+ if (result.status === "ok" && (result.imported ?? 0) > 0) {
470
+ downloaded++;
471
+ }
472
+ else {
473
+ notAvailable++;
474
+ }
475
+ }
476
+ catch {
477
+ notAvailable++;
478
+ }
479
+ }
480
+ process.stderr.write(`[embed_download_all] Done: ${downloaded} downloaded, ${alreadyEmbedded} already embedded, ${notAvailable} not available\n`);
481
+ return { downloaded, alreadyEmbedded, notAvailable };
482
+ }
483
+ /**
484
+ * Get embedding status for a mod.
485
+ */
486
+ export async function getEmbedStatus(target) {
487
+ const db = await getDb();
488
+ let stats;
489
+ let sourceTable = "mod_source_files";
490
+ let scopeColumn = "mod_id";
491
+ let scopeId;
492
+ if (target.targetType === "mod") {
493
+ if (target.dbId == null)
494
+ throw new Error("embed_status targetType=mod requires dbId");
495
+ validateDbId(target.dbId);
496
+ const mod = await findModById(target.dbId);
497
+ if (!mod)
498
+ throw new Error(`Mod #${target.dbId} not found`);
499
+ scopeId = target.dbId;
500
+ stats = await db.$queryRawUnsafe(`SELECT COUNT(*)::text AS total,
501
+ COUNT(CASE WHEN embedding IS NOT NULL THEN 1 END)::text AS embedded
502
+ FROM mod_source_files WHERE mod_id = $1`, target.dbId);
503
+ }
504
+ else if (target.targetType === "vanilla") {
505
+ if (!target.mcVersion)
506
+ throw new Error("embed_status targetType=vanilla requires mcVersion");
507
+ const versionRow = await findMcVersionByVersionId(target.mcVersion);
508
+ if (!versionRow)
509
+ throw new Error(`MC version ${target.mcVersion} not found`);
510
+ sourceTable = "mc_source_files";
511
+ scopeColumn = "mc_version_id";
512
+ scopeId = versionRow.id;
513
+ stats = await db.$queryRawUnsafe(`SELECT COUNT(*)::text AS total,
514
+ COUNT(CASE WHEN embedding IS NOT NULL THEN 1 END)::text AS embedded
515
+ FROM mc_source_files WHERE mc_version_id = $1`, versionRow.id);
516
+ }
517
+ else {
518
+ // modloader — stored as a Mod row in mod_source_files
519
+ let modDbId = target.dbId;
520
+ if (modDbId == null) {
521
+ const loaderName = target.mcVersion ?? "neoforge";
522
+ const loaderMod = await findModByModIdLike(loaderName);
523
+ if (!loaderMod)
524
+ throw new Error(`No ingested modloader "${loaderName}". Ingest the modloader JAR first.`);
525
+ modDbId = loaderMod.id;
526
+ }
527
+ validateDbId(modDbId);
528
+ const mod = await findModById(modDbId);
529
+ if (!mod)
530
+ throw new Error(`Mod #${modDbId} not found`);
531
+ scopeId = modDbId;
532
+ stats = await db.$queryRawUnsafe(`SELECT COUNT(*)::text AS total,
533
+ COUNT(CASE WHEN embedding IS NOT NULL THEN 1 END)::text AS embedded
534
+ FROM mod_source_files WHERE mod_id = $1`, modDbId);
535
+ }
536
+ const total = parseInt(stats[0].total, 10);
537
+ const embedded = parseInt(stats[0].embedded, 10);
538
+ const model = process.env.OLLAMA_EMBED_MODEL ?? "nomic-embed-text";
539
+ const coverage = total > 0 ? `${Math.round((embedded / total) * 100)}%` : "0%";
540
+ // Source provenance breakdown
541
+ let sources = { local: 0, registry: 0, community: 0, unknown: 0 };
542
+ try {
543
+ sources = await countEmbedsBySource(sourceTable, scopeColumn, scopeId);
544
+ }
545
+ catch { /* columns may not exist pre-migration */ }
546
+ return { totalFiles: total, embeddedCount: embedded, model, coverage, sources };
547
+ }
548
+ /**
549
+ * Submit locally-generated embeddings for inclusion in the public registry.
550
+ * NOT YET IMPLEMENTED — returns a stub response with groundwork details.
551
+ */
552
+ export async function submitEmbeddings(_submission) {
553
+ return {
554
+ status: "not_implemented",
555
+ message: "Community embedding submission is planned but not yet available. "
556
+ + "For now, export your embeddings with embed_export and share the bundle file manually. "
557
+ + "Future versions will support direct submission to the public registry.",
558
+ };
559
+ }
560
+ //# sourceMappingURL=embed-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embed-registry.js","sourceRoot":"","sources":["../../src/tools/embed-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Get gradle build file contents for a specific mod.
3
+ * Searches the mod's sourcePath and decompPath directories.
4
+ */
5
+ export declare function getModGradleFiles(modIdOrDbId: string | number): Promise<object>;
6
+ /**
7
+ * Search gradle files across all ingested mods for a pattern.
8
+ * Returns matching lines with context.
9
+ */
10
+ export declare function searchGradleFiles(query: string, modIdFilter?: string, limit?: number): Promise<object>;
11
+ /**
12
+ * Compare gradle dependencies across all mods — find who uses the same library,
13
+ * who uses different versions, who has jarJar/embed vs. compileOnly, etc.
14
+ */
15
+ export declare function compareGradleDeps(groupFilter?: string, modIdFilter?: string): Promise<object>;
16
+ //# sourceMappingURL=gradle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gradle.d.ts","sourceRoot":"","sources":["../../src/tools/gradle.ts"],"names":[],"mappings":"AAiEA;;;GAGG;AACH,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA4BrF;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACnC,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,MAAM,EACpB,KAAK,SAAK,GACX,OAAO,CAAC,MAAM,CAAC,CAkCjB;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACnC,WAAW,CAAC,EAAE,MAAM,EACpB,WAAW,CAAC,EAAE,MAAM,GACrB,OAAO,CAAC,MAAM,CAAC,CAwCjB"}