@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.
- package/README.md +938 -0
- package/dist/access-flags.d.ts +58 -0
- package/dist/access-flags.d.ts.map +1 -0
- package/dist/access-flags.js +79 -0
- package/dist/access-flags.js.map +1 -0
- package/dist/access-flags.test.d.ts +2 -0
- package/dist/access-flags.test.d.ts.map +1 -0
- package/dist/access-flags.test.js +189 -0
- package/dist/access-flags.test.js.map +1 -0
- package/dist/batch-ingest.d.ts +2 -0
- package/dist/batch-ingest.d.ts.map +1 -0
- package/dist/batch-ingest.js +54 -0
- package/dist/batch-ingest.js.map +1 -0
- package/dist/batch-resolve-mixins.d.ts +2 -0
- package/dist/batch-resolve-mixins.d.ts.map +1 -0
- package/dist/batch-resolve-mixins.js +36 -0
- package/dist/batch-resolve-mixins.js.map +1 -0
- package/dist/cache.d.ts +16 -0
- package/dist/cache.d.ts.map +1 -0
- package/dist/cache.js +36 -0
- package/dist/cache.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +1318 -0
- package/dist/cli.js.map +1 -0
- package/dist/curseforge.d.ts +53 -0
- package/dist/curseforge.d.ts.map +1 -0
- package/dist/curseforge.js +104 -0
- package/dist/curseforge.js.map +1 -0
- package/dist/db-backend.d.ts +17 -0
- package/dist/db-backend.d.ts.map +1 -0
- package/dist/db-backend.js +40 -0
- package/dist/db-backend.js.map +1 -0
- package/dist/db.d.ts +11 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +55 -0
- package/dist/db.js.map +1 -0
- package/dist/embed-queue.d.ts +12 -0
- package/dist/embed-queue.d.ts.map +1 -0
- package/dist/embed-queue.js +103 -0
- package/dist/embed-queue.js.map +1 -0
- package/dist/embeddings.d.ts +21 -0
- package/dist/embeddings.d.ts.map +1 -0
- package/dist/embeddings.js +55 -0
- package/dist/embeddings.js.map +1 -0
- package/dist/env-path.d.ts +19 -0
- package/dist/env-path.d.ts.map +1 -0
- package/dist/env-path.js +40 -0
- package/dist/env-path.js.map +1 -0
- package/dist/fetch-utils.d.ts +24 -0
- package/dist/fetch-utils.d.ts.map +1 -0
- package/dist/fetch-utils.js +73 -0
- package/dist/fetch-utils.js.map +1 -0
- package/dist/fetch-utils.test.d.ts +2 -0
- package/dist/fetch-utils.test.d.ts.map +1 -0
- package/dist/fetch-utils.test.js +133 -0
- package/dist/fetch-utils.test.js.map +1 -0
- package/dist/generated/sqlite/browser.d.ts +55 -0
- package/dist/generated/sqlite/browser.d.ts.map +1 -0
- package/dist/generated/sqlite/browser.js +18 -0
- package/dist/generated/sqlite/browser.js.map +1 -0
- package/dist/generated/sqlite/client.d.ts +72 -0
- package/dist/generated/sqlite/client.d.ts.map +1 -0
- package/dist/generated/sqlite/client.js +33 -0
- package/dist/generated/sqlite/client.js.map +1 -0
- package/dist/generated/sqlite/commonInputTypes.d.ts +387 -0
- package/dist/generated/sqlite/commonInputTypes.d.ts.map +1 -0
- package/dist/generated/sqlite/commonInputTypes.js +11 -0
- package/dist/generated/sqlite/commonInputTypes.js.map +1 -0
- package/dist/generated/sqlite/enums.d.ts +2 -0
- package/dist/generated/sqlite/enums.d.ts.map +1 -0
- package/dist/generated/sqlite/enums.js +11 -0
- package/dist/generated/sqlite/enums.js.map +1 -0
- package/dist/generated/sqlite/internal/class.d.ts +226 -0
- package/dist/generated/sqlite/internal/class.d.ts.map +1 -0
- package/dist/generated/sqlite/internal/class.js +84 -0
- package/dist/generated/sqlite/internal/class.js.map +1 -0
- package/dist/generated/sqlite/internal/prismaNamespace.d.ts +1344 -0
- package/dist/generated/sqlite/internal/prismaNamespace.d.ts.map +1 -0
- package/dist/generated/sqlite/internal/prismaNamespace.js +220 -0
- package/dist/generated/sqlite/internal/prismaNamespace.js.map +1 -0
- package/dist/generated/sqlite/internal/prismaNamespaceBrowser.d.ts +204 -0
- package/dist/generated/sqlite/internal/prismaNamespaceBrowser.d.ts.map +1 -0
- package/dist/generated/sqlite/internal/prismaNamespaceBrowser.js +191 -0
- package/dist/generated/sqlite/internal/prismaNamespaceBrowser.js.map +1 -0
- package/dist/generated/sqlite/models/DocEntry.d.ts +1223 -0
- package/dist/generated/sqlite/models/DocEntry.d.ts.map +1 -0
- package/dist/generated/sqlite/models/DocEntry.js +2 -0
- package/dist/generated/sqlite/models/DocEntry.js.map +1 -0
- package/dist/generated/sqlite/models/McSourceFile.d.ts +1289 -0
- package/dist/generated/sqlite/models/McSourceFile.d.ts.map +1 -0
- package/dist/generated/sqlite/models/McSourceFile.js +2 -0
- package/dist/generated/sqlite/models/McSourceFile.js.map +1 -0
- package/dist/generated/sqlite/models/McVersion.d.ts +1315 -0
- package/dist/generated/sqlite/models/McVersion.d.ts.map +1 -0
- package/dist/generated/sqlite/models/McVersion.js +2 -0
- package/dist/generated/sqlite/models/McVersion.js.map +1 -0
- package/dist/generated/sqlite/models/McVersionDiff.d.ts +1061 -0
- package/dist/generated/sqlite/models/McVersionDiff.d.ts.map +1 -0
- package/dist/generated/sqlite/models/McVersionDiff.js +2 -0
- package/dist/generated/sqlite/models/McVersionDiff.js.map +1 -0
- package/dist/generated/sqlite/models/Mod.d.ts +2396 -0
- package/dist/generated/sqlite/models/Mod.d.ts.map +1 -0
- package/dist/generated/sqlite/models/Mod.js +2 -0
- package/dist/generated/sqlite/models/Mod.js.map +1 -0
- package/dist/generated/sqlite/models/ModClass.d.ts +1254 -0
- package/dist/generated/sqlite/models/ModClass.d.ts.map +1 -0
- package/dist/generated/sqlite/models/ModClass.js +2 -0
- package/dist/generated/sqlite/models/ModClass.js.map +1 -0
- package/dist/generated/sqlite/models/ModSourceFile.d.ts +1283 -0
- package/dist/generated/sqlite/models/ModSourceFile.d.ts.map +1 -0
- package/dist/generated/sqlite/models/ModSourceFile.js +2 -0
- package/dist/generated/sqlite/models/ModSourceFile.js.map +1 -0
- package/dist/generated/sqlite/models/ModTag.d.ts +1278 -0
- package/dist/generated/sqlite/models/ModTag.d.ts.map +1 -0
- package/dist/generated/sqlite/models/ModTag.js +2 -0
- package/dist/generated/sqlite/models/ModTag.js.map +1 -0
- package/dist/generated/sqlite/models/ModVersionDiff.d.ts +1073 -0
- package/dist/generated/sqlite/models/ModVersionDiff.d.ts.map +1 -0
- package/dist/generated/sqlite/models/ModVersionDiff.js +2 -0
- package/dist/generated/sqlite/models/ModVersionDiff.js.map +1 -0
- package/dist/generated/sqlite/models/Primer.d.ts +1319 -0
- package/dist/generated/sqlite/models/Primer.d.ts.map +1 -0
- package/dist/generated/sqlite/models/Primer.js +2 -0
- package/dist/generated/sqlite/models/Primer.js.map +1 -0
- package/dist/generated/sqlite/models.d.ts +12 -0
- package/dist/generated/sqlite/models.d.ts.map +1 -0
- package/dist/generated/sqlite/models.js +2 -0
- package/dist/generated/sqlite/models.js.map +1 -0
- package/dist/jar.d.ts +7 -0
- package/dist/jar.d.ts.map +1 -0
- package/dist/jar.js +52 -0
- package/dist/jar.js.map +1 -0
- package/dist/java-tools.d.ts +46 -0
- package/dist/java-tools.d.ts.map +1 -0
- package/dist/java-tools.js +263 -0
- package/dist/java-tools.js.map +1 -0
- package/dist/launcher.d.ts +3 -0
- package/dist/launcher.d.ts.map +1 -0
- package/dist/launcher.js +105 -0
- package/dist/launcher.js.map +1 -0
- package/dist/mappings.d.ts +95 -0
- package/dist/mappings.d.ts.map +1 -0
- package/dist/mappings.js +1094 -0
- package/dist/mappings.js.map +1 -0
- package/dist/mappings.test.d.ts +2 -0
- package/dist/mappings.test.d.ts.map +1 -0
- package/dist/mappings.test.js +161 -0
- package/dist/mappings.test.js.map +1 -0
- package/dist/minecraft.d.ts +21 -0
- package/dist/minecraft.d.ts.map +1 -0
- package/dist/minecraft.js +70 -0
- package/dist/minecraft.js.map +1 -0
- package/dist/modpacks-ch.d.ts +224 -0
- package/dist/modpacks-ch.d.ts.map +1 -0
- package/dist/modpacks-ch.js +146 -0
- package/dist/modpacks-ch.js.map +1 -0
- package/dist/modrinth.d.ts +67 -0
- package/dist/modrinth.d.ts.map +1 -0
- package/dist/modrinth.js +88 -0
- package/dist/modrinth.js.map +1 -0
- package/dist/platform-adapter.d.ts +23 -0
- package/dist/platform-adapter.d.ts.map +1 -0
- package/dist/platform-adapter.js +2 -0
- package/dist/platform-adapter.js.map +1 -0
- package/dist/platform.d.ts +47 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +175 -0
- package/dist/platform.js.map +1 -0
- package/dist/processor.d.ts +51 -0
- package/dist/processor.d.ts.map +1 -0
- package/dist/processor.js +655 -0
- package/dist/processor.js.map +1 -0
- package/dist/processor.test.d.ts +2 -0
- package/dist/processor.test.d.ts.map +1 -0
- package/dist/processor.test.js +629 -0
- package/dist/processor.test.js.map +1 -0
- package/dist/repositories/embeddings-sqlite.d.ts +38 -0
- package/dist/repositories/embeddings-sqlite.d.ts.map +1 -0
- package/dist/repositories/embeddings-sqlite.js +208 -0
- package/dist/repositories/embeddings-sqlite.js.map +1 -0
- package/dist/repositories/embeddings.d.ts +40 -0
- package/dist/repositories/embeddings.d.ts.map +1 -0
- package/dist/repositories/embeddings.js +136 -0
- package/dist/repositories/embeddings.js.map +1 -0
- package/dist/repositories/index.d.ts +2 -0
- package/dist/repositories/index.d.ts.map +1 -0
- package/dist/repositories/index.js +15 -0
- package/dist/repositories/index.js.map +1 -0
- package/dist/repositories/mcVersion.d.ts +16 -0
- package/dist/repositories/mcVersion.d.ts.map +1 -0
- package/dist/repositories/mcVersion.js +52 -0
- package/dist/repositories/mcVersion.js.map +1 -0
- package/dist/repositories/mod.d.ts +241 -0
- package/dist/repositories/mod.d.ts.map +1 -0
- package/dist/repositories/mod.js +342 -0
- package/dist/repositories/mod.js.map +1 -0
- package/dist/repositories/packs.d.ts +44 -0
- package/dist/repositories/packs.d.ts.map +1 -0
- package/dist/repositories/packs.js +138 -0
- package/dist/repositories/packs.js.map +1 -0
- package/dist/search-adapter.d.ts +34 -0
- package/dist/search-adapter.d.ts.map +1 -0
- package/dist/search-adapter.js +195 -0
- package/dist/search-adapter.js.map +1 -0
- package/dist/search.d.ts +6 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +54 -0
- package/dist/search.js.map +1 -0
- package/dist/search.test.d.ts +2 -0
- package/dist/search.test.d.ts.map +1 -0
- package/dist/search.test.js +71 -0
- package/dist/search.test.js.map +1 -0
- package/dist/security.d.ts +98 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +446 -0
- package/dist/security.js.map +1 -0
- package/dist/security.test.d.ts +2 -0
- package/dist/security.test.d.ts.map +1 -0
- package/dist/security.test.js +687 -0
- package/dist/security.test.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +1465 -0
- package/dist/server.js.map +1 -0
- package/dist/setup.d.ts +2 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +1113 -0
- package/dist/setup.js.map +1 -0
- package/dist/tools/bytecode.d.ts +129 -0
- package/dist/tools/bytecode.d.ts.map +1 -0
- package/dist/tools/bytecode.js +679 -0
- package/dist/tools/bytecode.js.map +1 -0
- package/dist/tools/catalog.d.ts +54 -0
- package/dist/tools/catalog.d.ts.map +1 -0
- package/dist/tools/catalog.js +249 -0
- package/dist/tools/catalog.js.map +1 -0
- package/dist/tools/compat-check.d.ts +23 -0
- package/dist/tools/compat-check.d.ts.map +1 -0
- package/dist/tools/compat-check.js +250 -0
- package/dist/tools/compat-check.js.map +1 -0
- package/dist/tools/compat-check.test.d.ts +2 -0
- package/dist/tools/compat-check.test.d.ts.map +1 -0
- package/dist/tools/compat-check.test.js +179 -0
- package/dist/tools/compat-check.test.js.map +1 -0
- package/dist/tools/diagnostics.d.ts +10 -0
- package/dist/tools/diagnostics.d.ts.map +1 -0
- package/dist/tools/diagnostics.js +133 -0
- package/dist/tools/diagnostics.js.map +1 -0
- package/dist/tools/diagnostics.test.d.ts +2 -0
- package/dist/tools/diagnostics.test.d.ts.map +1 -0
- package/dist/tools/diagnostics.test.js +168 -0
- package/dist/tools/diagnostics.test.js.map +1 -0
- package/dist/tools/docs.d.ts +19 -0
- package/dist/tools/docs.d.ts.map +1 -0
- package/dist/tools/docs.js +230 -0
- package/dist/tools/docs.js.map +1 -0
- package/dist/tools/embed-registry.d.ts +125 -0
- package/dist/tools/embed-registry.d.ts.map +1 -0
- package/dist/tools/embed-registry.js +560 -0
- package/dist/tools/embed-registry.js.map +1 -0
- package/dist/tools/gradle.d.ts +16 -0
- package/dist/tools/gradle.d.ts.map +1 -0
- package/dist/tools/gradle.js +182 -0
- package/dist/tools/gradle.js.map +1 -0
- package/dist/tools/graphify.d.ts +144 -0
- package/dist/tools/graphify.d.ts.map +1 -0
- package/dist/tools/graphify.js +798 -0
- package/dist/tools/graphify.js.map +1 -0
- package/dist/tools/graphify.test.d.ts +2 -0
- package/dist/tools/graphify.test.d.ts.map +1 -0
- package/dist/tools/graphify.test.js +39 -0
- package/dist/tools/graphify.test.js.map +1 -0
- package/dist/tools/ingest.d.ts +85 -0
- package/dist/tools/ingest.d.ts.map +1 -0
- package/dist/tools/ingest.js +477 -0
- package/dist/tools/ingest.js.map +1 -0
- package/dist/tools/ingest.test.d.ts +2 -0
- package/dist/tools/ingest.test.d.ts.map +1 -0
- package/dist/tools/ingest.test.js +340 -0
- package/dist/tools/ingest.test.js.map +1 -0
- package/dist/tools/kubejs.d.ts +37 -0
- package/dist/tools/kubejs.d.ts.map +1 -0
- package/dist/tools/kubejs.js +245 -0
- package/dist/tools/kubejs.js.map +1 -0
- package/dist/tools/mappings.d.ts +17 -0
- package/dist/tools/mappings.d.ts.map +1 -0
- package/dist/tools/mappings.js +85 -0
- package/dist/tools/mappings.js.map +1 -0
- package/dist/tools/mc-fts.d.ts +101 -0
- package/dist/tools/mc-fts.d.ts.map +1 -0
- package/dist/tools/mc-fts.js +279 -0
- package/dist/tools/mc-fts.js.map +1 -0
- package/dist/tools/mcmeta.d.ts +41 -0
- package/dist/tools/mcmeta.d.ts.map +1 -0
- package/dist/tools/mcmeta.js +365 -0
- package/dist/tools/mcmeta.js.map +1 -0
- package/dist/tools/mixin-scan.d.ts +113 -0
- package/dist/tools/mixin-scan.d.ts.map +1 -0
- package/dist/tools/mixin-scan.js +433 -0
- package/dist/tools/mixin-scan.js.map +1 -0
- package/dist/tools/mod-data.d.ts +83 -0
- package/dist/tools/mod-data.d.ts.map +1 -0
- package/dist/tools/mod-data.js +630 -0
- package/dist/tools/mod-data.js.map +1 -0
- package/dist/tools/mod-tags.d.ts +59 -0
- package/dist/tools/mod-tags.d.ts.map +1 -0
- package/dist/tools/mod-tags.js +279 -0
- package/dist/tools/mod-tags.js.map +1 -0
- package/dist/tools/mod-tags.test.d.ts +2 -0
- package/dist/tools/mod-tags.test.d.ts.map +1 -0
- package/dist/tools/mod-tags.test.js +75 -0
- package/dist/tools/mod-tags.test.js.map +1 -0
- package/dist/tools/modpacks-ch.d.ts +257 -0
- package/dist/tools/modpacks-ch.d.ts.map +1 -0
- package/dist/tools/modpacks-ch.js +516 -0
- package/dist/tools/modpacks-ch.js.map +1 -0
- package/dist/tools/packtools.d.ts +113 -0
- package/dist/tools/packtools.d.ts.map +1 -0
- package/dist/tools/packtools.js +809 -0
- package/dist/tools/packtools.js.map +1 -0
- package/dist/tools/packtools.test.d.ts +2 -0
- package/dist/tools/packtools.test.d.ts.map +1 -0
- package/dist/tools/packtools.test.js +99 -0
- package/dist/tools/packtools.test.js.map +1 -0
- package/dist/tools/platform.d.ts +68 -0
- package/dist/tools/platform.d.ts.map +1 -0
- package/dist/tools/platform.js +452 -0
- package/dist/tools/platform.js.map +1 -0
- package/dist/tools/primers.d.ts +36 -0
- package/dist/tools/primers.d.ts.map +1 -0
- package/dist/tools/primers.js +451 -0
- package/dist/tools/primers.js.map +1 -0
- package/dist/tools/reports.d.ts +19 -0
- package/dist/tools/reports.d.ts.map +1 -0
- package/dist/tools/reports.js +573 -0
- package/dist/tools/reports.js.map +1 -0
- package/dist/tools/source.d.ts +10 -0
- package/dist/tools/source.d.ts.map +1 -0
- package/dist/tools/source.js +101 -0
- package/dist/tools/source.js.map +1 -0
- package/dist/tools/vanilla-data.d.ts +127 -0
- package/dist/tools/vanilla-data.d.ts.map +1 -0
- package/dist/tools/vanilla-data.js +824 -0
- package/dist/tools/vanilla-data.js.map +1 -0
- package/dist/tools/vanilla.d.ts +171 -0
- package/dist/tools/vanilla.d.ts.map +1 -0
- package/dist/tools/vanilla.js +612 -0
- package/dist/tools/vanilla.js.map +1 -0
- package/dist/tools/version-diff.d.ts +113 -0
- package/dist/tools/version-diff.d.ts.map +1 -0
- package/dist/tools/version-diff.js +519 -0
- package/dist/tools/version-diff.js.map +1 -0
- package/dist/tools/version-diff.test.d.ts +2 -0
- package/dist/tools/version-diff.test.d.ts.map +1 -0
- package/dist/tools/version-diff.test.js +102 -0
- package/dist/tools/version-diff.test.js.map +1 -0
- package/dist/validate.d.ts +19 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +54 -0
- package/dist/validate.js.map +1 -0
- package/dist/validate.test.d.ts +2 -0
- package/dist/validate.test.d.ts.map +1 -0
- package/dist/validate.test.js +73 -0
- package/dist/validate.test.js.map +1 -0
- package/package.json +62 -0
- package/prisma/backends/schema.sqlite.prisma +215 -0
- package/prisma/backends/template.db +0 -0
- package/prisma/schema.prisma +303 -0
- package/scripts/backup.mjs +151 -0
- package/scripts/build-template-db.mjs +38 -0
- package/scripts/check-atm10.mjs +27 -0
- package/scripts/check-sync.mjs +13 -0
- package/scripts/create-fts-index.mjs +50 -0
- package/scripts/enable-pgvector.mjs +90 -0
- package/scripts/enable-sqlite-vec.mjs +158 -0
- package/scripts/migrate-backend.mjs +188 -0
- package/scripts/migrate-embed-provenance.mjs +80 -0
- package/scripts/migrate-metadata-source.mjs +62 -0
- package/scripts/migrate-mod-source-files.mjs +67 -0
- package/scripts/post-update.mjs +77 -0
- 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"}
|