@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,452 @@
|
|
|
1
|
+
import { lookupBySha512, getProject as getMrProject, getLatestVersion as getMrLatest, searchProjects as searchModrinth } from "../modrinth.js";
|
|
2
|
+
import { lookupByFingerprint, getLatestFile as getCfLatest, searchMods as searchCurseforge } from "../curseforge.js";
|
|
3
|
+
import { createWriteStream } from "fs";
|
|
4
|
+
import { pipeline } from "stream/promises";
|
|
5
|
+
import { ensureDir } from "../cache.js";
|
|
6
|
+
import { findModById, updateMod, listModsForSync, getModMetadata } from "../repositories/mod.js";
|
|
7
|
+
import { fileSha512, verifyFileHash, HashMismatchError, validatePath } from "../security.js";
|
|
8
|
+
import { buildModGraph, ensureGraphify } from "./graphify.js";
|
|
9
|
+
import { resolveAuto } from "./ingest.js";
|
|
10
|
+
export async function syncModrinth(dbId) {
|
|
11
|
+
const mod = await findModById(dbId);
|
|
12
|
+
if (!mod)
|
|
13
|
+
throw new Error(`Mod #${dbId} not found`);
|
|
14
|
+
if (!mod.sha512)
|
|
15
|
+
throw new Error("Mod has no SHA-512 hash — re-ingest to compute it");
|
|
16
|
+
const version = await lookupBySha512(mod.sha512);
|
|
17
|
+
if (!version)
|
|
18
|
+
return { matched: false };
|
|
19
|
+
const project = await getMrProject(version.project_id);
|
|
20
|
+
await updateMod(dbId, {
|
|
21
|
+
modrinthId: version.project_id,
|
|
22
|
+
metadata: {
|
|
23
|
+
...mod.metadata,
|
|
24
|
+
modrinthSlug: project?.slug,
|
|
25
|
+
sourceUrl: mod.metadata.sourceUrl ?? project?.source_url,
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
return { matched: true, projectId: version.project_id, slug: project?.slug, sourceUrl: project?.source_url };
|
|
29
|
+
}
|
|
30
|
+
export async function syncCurseforge(dbId) {
|
|
31
|
+
const mod = await findModById(dbId);
|
|
32
|
+
if (!mod)
|
|
33
|
+
throw new Error(`Mod #${dbId} not found`);
|
|
34
|
+
if (!mod.murmur2)
|
|
35
|
+
throw new Error("Mod has no Murmur2 hash — re-ingest to compute it");
|
|
36
|
+
const project = await lookupByFingerprint(parseInt(mod.murmur2));
|
|
37
|
+
if (!project)
|
|
38
|
+
return { matched: false };
|
|
39
|
+
await updateMod(dbId, {
|
|
40
|
+
curseforgeId: project.id,
|
|
41
|
+
metadata: {
|
|
42
|
+
...mod.metadata,
|
|
43
|
+
cfSlug: project.slug,
|
|
44
|
+
sourceUrl: mod.metadata.sourceUrl ?? project.links.sourceUrl,
|
|
45
|
+
},
|
|
46
|
+
});
|
|
47
|
+
return { matched: true, projectId: project.id, slug: project.slug, sourceUrl: project.links.sourceUrl };
|
|
48
|
+
}
|
|
49
|
+
export async function checkUpdates(dbId) {
|
|
50
|
+
const mod = await findModById(dbId);
|
|
51
|
+
if (!mod)
|
|
52
|
+
throw new Error(`Mod #${dbId} not found`);
|
|
53
|
+
const results = {};
|
|
54
|
+
if (mod.modrinthId) {
|
|
55
|
+
try {
|
|
56
|
+
const latest = await getMrLatest(mod.modrinthId, mod.mcVersion || undefined);
|
|
57
|
+
if (latest) {
|
|
58
|
+
results.modrinth = {
|
|
59
|
+
latestVersion: latest.version_number,
|
|
60
|
+
currentVersion: mod.version,
|
|
61
|
+
isLatest: latest.version_number === mod.version,
|
|
62
|
+
releaseDate: latest.date_published,
|
|
63
|
+
downloadUrl: latest.files.find((f) => f.primary)?.url,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
results.modrinth = { error: "lookup failed" };
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
if (mod.curseforgeId) {
|
|
72
|
+
try {
|
|
73
|
+
const latest = await getCfLatest(mod.curseforgeId, mod.mcVersion || undefined);
|
|
74
|
+
if (latest) {
|
|
75
|
+
results.curseforge = {
|
|
76
|
+
latestFile: latest.displayName,
|
|
77
|
+
releaseDate: latest.fileDate,
|
|
78
|
+
gameVersions: latest.gameVersions,
|
|
79
|
+
downloadUrl: latest.downloadUrl,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
results.curseforge = { error: "lookup failed" };
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (!results.modrinth && !results.curseforge) {
|
|
88
|
+
return { checked: false, reason: "Mod not linked to Modrinth or CurseForge. Run sync_modrinth or sync_curseforge first." };
|
|
89
|
+
}
|
|
90
|
+
return { checked: true, currentVersion: mod.version, ...results };
|
|
91
|
+
}
|
|
92
|
+
export async function downloadSource(dbId, opts) {
|
|
93
|
+
const mod = await findModById(dbId);
|
|
94
|
+
if (!mod)
|
|
95
|
+
throw new Error(`Mod #${dbId} not found`);
|
|
96
|
+
const meta = mod.metadata;
|
|
97
|
+
const sourceUrl = meta.sourceUrl;
|
|
98
|
+
if (!sourceUrl)
|
|
99
|
+
throw new Error("No source URL found. Run sync_modrinth or sync_curseforge first.");
|
|
100
|
+
// ── URL validation ─────────────────────────────────────────────────────
|
|
101
|
+
let parsed;
|
|
102
|
+
try {
|
|
103
|
+
parsed = new URL(sourceUrl);
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
throw new Error(`Invalid source URL: ${sourceUrl}`);
|
|
107
|
+
}
|
|
108
|
+
if (parsed.protocol !== "https:")
|
|
109
|
+
throw new Error(`Source URL must use HTTPS: ${sourceUrl}`);
|
|
110
|
+
const ALLOWED_HOSTS = ["github.com", "gitlab.com", "bitbucket.org", "codeberg.org"];
|
|
111
|
+
if (!ALLOWED_HOSTS.some(h => parsed.hostname === h || parsed.hostname.endsWith(`.${h}`))) {
|
|
112
|
+
throw new Error(`Source URL hostname not allowed: ${parsed.hostname} (expected: ${ALLOWED_HOSTS.join(", ")})`);
|
|
113
|
+
}
|
|
114
|
+
// ── Path sanitization ──────────────────────────────────────────────────
|
|
115
|
+
const safeModId = mod.modId.replace(/[^a-zA-Z0-9._-]/g, "_");
|
|
116
|
+
const safeVersion = mod.version.replace(/[^a-zA-Z0-9._-]/g, "_");
|
|
117
|
+
const cacheRoot = `${process.env.HOME ?? process.env.USERPROFILE}/.modlens-cache/sources`;
|
|
118
|
+
const outDir = `${cacheRoot}/${safeModId}/${safeVersion}`;
|
|
119
|
+
const tmpZip = outDir + ".tmp.zip";
|
|
120
|
+
const zipPath = outDir + ".zip";
|
|
121
|
+
validatePath(outDir, cacheRoot);
|
|
122
|
+
await ensureDir(tmpZip);
|
|
123
|
+
// ── Build archive URL per host ─────────────────────────────────────────
|
|
124
|
+
const repoPath = parsed.pathname.replace(/\/?$/, ""); // e.g. /owner/repo
|
|
125
|
+
const repoName = repoPath.split("/").pop();
|
|
126
|
+
function archiveUrls(branch) {
|
|
127
|
+
const host = parsed.hostname;
|
|
128
|
+
if (host === "github.com") {
|
|
129
|
+
return [`https://codeload.github.com${repoPath}/zip/refs/heads/${branch}`];
|
|
130
|
+
}
|
|
131
|
+
if (host === "gitlab.com" || host.endsWith(".gitlab.com")) {
|
|
132
|
+
return [`https://${host}${repoPath}/-/archive/${branch}/${repoName}-${branch}.zip`];
|
|
133
|
+
}
|
|
134
|
+
if (host === "codeberg.org") {
|
|
135
|
+
return [`https://codeberg.org${repoPath}/archive/${branch}.zip`];
|
|
136
|
+
}
|
|
137
|
+
if (host === "bitbucket.org") {
|
|
138
|
+
return [`https://bitbucket.org${repoPath}/get/${branch}.zip`];
|
|
139
|
+
}
|
|
140
|
+
return [];
|
|
141
|
+
}
|
|
142
|
+
// Try main then master for each host
|
|
143
|
+
const candidates = [...archiveUrls("main"), ...archiveUrls("master")];
|
|
144
|
+
if (candidates.length === 0)
|
|
145
|
+
throw new Error(`No archive URL strategy for host: ${parsed.hostname}`);
|
|
146
|
+
try {
|
|
147
|
+
let downloaded = false;
|
|
148
|
+
for (const url of candidates) {
|
|
149
|
+
const res = await fetch(url);
|
|
150
|
+
if (res.ok) {
|
|
151
|
+
const writer = createWriteStream(tmpZip);
|
|
152
|
+
await pipeline(res.body, writer);
|
|
153
|
+
downloaded = true;
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
if (!downloaded)
|
|
158
|
+
throw new Error(`Failed to download source from ${sourceUrl} (tried main + master branches)`);
|
|
159
|
+
}
|
|
160
|
+
catch (e) {
|
|
161
|
+
// Clean up partial temp file on any download failure
|
|
162
|
+
await import("fs/promises").then(f => f.unlink(tmpZip).catch(() => { }));
|
|
163
|
+
throw e;
|
|
164
|
+
}
|
|
165
|
+
// Atomic rename: temp → final zip
|
|
166
|
+
const { rename, unlink } = await import("fs/promises");
|
|
167
|
+
await rename(tmpZip, zipPath);
|
|
168
|
+
const AdmZip = (await import("adm-zip")).default;
|
|
169
|
+
const zip = new AdmZip(zipPath);
|
|
170
|
+
// ── Integrity check ────────────────────────────────────────────────────
|
|
171
|
+
const metaObj = mod.metadata;
|
|
172
|
+
const expectedSha512 = metaObj.modrinthFileSha512;
|
|
173
|
+
if (expectedSha512) {
|
|
174
|
+
try {
|
|
175
|
+
await verifyFileHash(zipPath, expectedSha512);
|
|
176
|
+
}
|
|
177
|
+
catch (e) {
|
|
178
|
+
if (e instanceof HashMismatchError) {
|
|
179
|
+
await unlink(zipPath).catch(() => { });
|
|
180
|
+
throw new Error(`Source ZIP integrity check FAILED for mod #${dbId}: ${e.message}`);
|
|
181
|
+
}
|
|
182
|
+
throw e;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
const actualSha = await fileSha512(zipPath);
|
|
187
|
+
await updateMod(dbId, {
|
|
188
|
+
metadata: { ...mod.metadata, sourceZipSha256: actualSha },
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
try {
|
|
192
|
+
zip.extractAllTo(outDir, true);
|
|
193
|
+
}
|
|
194
|
+
catch (e) {
|
|
195
|
+
// Clean up partial extraction + zip on failure
|
|
196
|
+
const { rm } = await import("fs/promises");
|
|
197
|
+
await rm(outDir, { recursive: true, force: true }).catch(() => { });
|
|
198
|
+
await unlink(zipPath).catch(() => { });
|
|
199
|
+
throw new Error(`Failed to extract source ZIP for mod #${dbId}: ${e instanceof Error ? e.message : String(e)}`);
|
|
200
|
+
}
|
|
201
|
+
await updateMod(dbId, { sourcePath: outDir });
|
|
202
|
+
// Fire-and-forget: auto-build knowledge graph from downloaded source
|
|
203
|
+
if (resolveAuto(opts?.autoGraph, "MODLENS_AUTO_GRAPH")) {
|
|
204
|
+
ensureGraphify().then(() => {
|
|
205
|
+
buildModGraph(dbId).catch(() => { });
|
|
206
|
+
}).catch(() => { });
|
|
207
|
+
}
|
|
208
|
+
return outDir;
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Batch sync Modrinth + CurseForge metadata for all mods that haven't been
|
|
212
|
+
* looked up yet, then optionally download actual GitHub source ZIPs.
|
|
213
|
+
*
|
|
214
|
+
* Phases (all optional via flags):
|
|
215
|
+
* syncModrinth — SHA-512 lookup on Modrinth (default true)
|
|
216
|
+
* syncCurseforge — Murmur2 lookup on CurseForge (default true)
|
|
217
|
+
* downloadSources — download GitHub source ZIPs for matched mods (default false)
|
|
218
|
+
*/
|
|
219
|
+
export async function batchSyncSources(opts = {}) {
|
|
220
|
+
const { syncModrinth: doMR = true, syncCurseforge: doCF = true, downloadSources: doGH = false, modIdFilter, limit = 500, } = opts;
|
|
221
|
+
const mods = await listModsForSync({ modIdFilter, limit });
|
|
222
|
+
const total = mods.length;
|
|
223
|
+
process.stderr.write(`[batch_sync] Starting batch sync for ${total} mods\n`);
|
|
224
|
+
let mrMatched = 0, mrSkipped = 0, mrFailed = 0;
|
|
225
|
+
let cfMatched = 0, cfSkipped = 0, cfFailed = 0;
|
|
226
|
+
let ghDownloaded = 0, ghFailed = 0;
|
|
227
|
+
const results = [];
|
|
228
|
+
for (let i = 0; i < mods.length; i++) {
|
|
229
|
+
const mod = mods[i];
|
|
230
|
+
if ((i + 1) % 10 === 0 || i === 0) {
|
|
231
|
+
process.stderr.write(`[batch_sync] Processing ${i + 1}/${total}: ${mod.modId}\n`);
|
|
232
|
+
}
|
|
233
|
+
const row = { modId: mod.modId, version: mod.version };
|
|
234
|
+
// ── Modrinth ──────────────────────────────────────────────────────────
|
|
235
|
+
if (doMR && !mod.modrinthId && mod.sha512) {
|
|
236
|
+
try {
|
|
237
|
+
const r = await syncModrinth(mod.id);
|
|
238
|
+
if (r.matched) {
|
|
239
|
+
mrMatched++;
|
|
240
|
+
row.modrinth = `matched: ${r.slug}`;
|
|
241
|
+
}
|
|
242
|
+
else {
|
|
243
|
+
mrSkipped++;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
catch (e) {
|
|
247
|
+
mrFailed++;
|
|
248
|
+
row.error = `MR: ${(e instanceof Error ? e.message : String(e)).slice(0, 80)}`;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
else if (doMR && mod.modrinthId) {
|
|
252
|
+
mrSkipped++;
|
|
253
|
+
}
|
|
254
|
+
// ── CurseForge ────────────────────────────────────────────────────────
|
|
255
|
+
if (doCF && !mod.curseforgeId && mod.murmur2) {
|
|
256
|
+
try {
|
|
257
|
+
const r = await syncCurseforge(mod.id);
|
|
258
|
+
if (r.matched) {
|
|
259
|
+
cfMatched++;
|
|
260
|
+
row.curseforge = `matched: ${r.slug}`;
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
cfSkipped++;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
catch (e) {
|
|
267
|
+
cfFailed++;
|
|
268
|
+
row.error = (row.error ? row.error + " | " : "") +
|
|
269
|
+
`CF: ${(e instanceof Error ? e.message : String(e)).slice(0, 80)}`;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
else if (doCF && mod.curseforgeId) {
|
|
273
|
+
cfSkipped++;
|
|
274
|
+
}
|
|
275
|
+
// ── GitHub source download ─────────────────────────────────────────────
|
|
276
|
+
if (doGH && !mod.sourcePath) {
|
|
277
|
+
// Re-read metadata after potential sync above
|
|
278
|
+
const fresh = await getModMetadata(mod.id);
|
|
279
|
+
const sourceUrl = fresh?.metadata?.sourceUrl;
|
|
280
|
+
if (sourceUrl) {
|
|
281
|
+
try {
|
|
282
|
+
const outDir = await downloadSource(mod.id);
|
|
283
|
+
ghDownloaded++;
|
|
284
|
+
row.source = `downloaded: ${outDir}`;
|
|
285
|
+
}
|
|
286
|
+
catch (e) {
|
|
287
|
+
ghFailed++;
|
|
288
|
+
row.error = (row.error ? row.error + " | " : "") +
|
|
289
|
+
`GH: ${(e instanceof Error ? e.message : String(e)).slice(0, 80)}`;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
if (row.modrinth || row.curseforge || row.source || row.error) {
|
|
294
|
+
results.push(row);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
process.stderr.write(`[batch_sync] Done: MR ${mrMatched} matched/${mrFailed} failed, CF ${cfMatched} matched/${cfFailed} failed, GH ${ghDownloaded} downloaded/${ghFailed} failed\n`);
|
|
298
|
+
return {
|
|
299
|
+
total: mods.length,
|
|
300
|
+
modrinth: doMR ? { matched: mrMatched, skipped: mrSkipped, failed: mrFailed } : "skipped",
|
|
301
|
+
curseforge: doCF ? { matched: cfMatched, skipped: cfSkipped, failed: cfFailed } : "skipped",
|
|
302
|
+
github: doGH ? { downloaded: ghDownloaded, failed: ghFailed } : "skipped",
|
|
303
|
+
results,
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
// ── Batch update check ─────────────────────────────────────────────────────────
|
|
307
|
+
/**
|
|
308
|
+
* Check all linked mods for newer versions on Modrinth and CurseForge.
|
|
309
|
+
* Returns a list of mods that have updates available.
|
|
310
|
+
*/
|
|
311
|
+
export async function batchCheckUpdates(opts = {}) {
|
|
312
|
+
const mods = await listModsForSync({ modIdFilter: opts.modIdFilter, limit: opts.limit ?? 500 });
|
|
313
|
+
const updates = [];
|
|
314
|
+
let checked = 0, skipped = 0, failed = 0;
|
|
315
|
+
const BATCH = 5; // throttle to avoid hammering APIs
|
|
316
|
+
for (let i = 0; i < mods.length; i += BATCH) {
|
|
317
|
+
const batch = mods.slice(i, i + BATCH);
|
|
318
|
+
const results = await Promise.all(batch.map(async (mod) => {
|
|
319
|
+
const row = { modId: mod.modId, version: mod.version, dbId: mod.id };
|
|
320
|
+
if (!mod.modrinthId && !mod.curseforgeId) {
|
|
321
|
+
skipped++;
|
|
322
|
+
return null;
|
|
323
|
+
}
|
|
324
|
+
checked++;
|
|
325
|
+
// Modrinth check
|
|
326
|
+
if (mod.modrinthId) {
|
|
327
|
+
try {
|
|
328
|
+
const latest = await getMrLatest(mod.modrinthId, opts.mcVersion);
|
|
329
|
+
if (latest && latest.version_number !== mod.version) {
|
|
330
|
+
row.modrinth = {
|
|
331
|
+
latestVersion: latest.version_number,
|
|
332
|
+
isNewer: true,
|
|
333
|
+
url: latest.files.find(f => f.primary)?.url,
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
catch {
|
|
338
|
+
failed++;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
// CurseForge check
|
|
342
|
+
if (mod.curseforgeId) {
|
|
343
|
+
try {
|
|
344
|
+
const latest = await getCfLatest(mod.curseforgeId, opts.mcVersion);
|
|
345
|
+
if (latest) {
|
|
346
|
+
row.curseforge = {
|
|
347
|
+
latestFile: latest.displayName,
|
|
348
|
+
url: latest.downloadUrl ?? undefined,
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
catch {
|
|
353
|
+
failed++;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
return (row.modrinth || row.curseforge) ? row : null;
|
|
357
|
+
}));
|
|
358
|
+
for (const r of results) {
|
|
359
|
+
if (r)
|
|
360
|
+
updates.push(r);
|
|
361
|
+
}
|
|
362
|
+
if ((i + BATCH) % 50 === 0) {
|
|
363
|
+
process.stderr.write(`[batch_check_updates] Checked ${Math.min(i + BATCH, mods.length)}/${mods.length}\n`);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
return {
|
|
367
|
+
totalMods: mods.length,
|
|
368
|
+
checked,
|
|
369
|
+
skipped,
|
|
370
|
+
failed,
|
|
371
|
+
updatesAvailable: updates.length,
|
|
372
|
+
note: skipped > 0
|
|
373
|
+
? `${skipped} mods skipped (not linked to Modrinth or CurseForge). Run batch_sync first.`
|
|
374
|
+
: undefined,
|
|
375
|
+
updates,
|
|
376
|
+
};
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Search both Modrinth and CurseForge for mods by name, returning a unified
|
|
380
|
+
* deduplicated result set ordered by download count.
|
|
381
|
+
*/
|
|
382
|
+
export async function searchPlatforms(query, opts = {}) {
|
|
383
|
+
const limit = opts.limit ?? 20;
|
|
384
|
+
// Search both platforms in parallel
|
|
385
|
+
const [mrResults, cfResults] = await Promise.all([
|
|
386
|
+
searchModrinth(query, { loader: opts.loader, mcVersion: opts.mcVersion, limit }).catch(() => null),
|
|
387
|
+
searchCurseforge(query, { loader: opts.loader, mcVersion: opts.mcVersion, limit }).catch(() => null),
|
|
388
|
+
]);
|
|
389
|
+
const hits = [];
|
|
390
|
+
// Normalize Modrinth results
|
|
391
|
+
if (mrResults?.hits) {
|
|
392
|
+
for (const h of mrResults.hits) {
|
|
393
|
+
hits.push({
|
|
394
|
+
name: h.title,
|
|
395
|
+
slug: h.slug,
|
|
396
|
+
description: (h.description ?? "").slice(0, 200),
|
|
397
|
+
platform: "modrinth",
|
|
398
|
+
projectId: h.project_id,
|
|
399
|
+
downloads: h.downloads ?? 0,
|
|
400
|
+
categories: h.categories,
|
|
401
|
+
mcVersions: h.versions,
|
|
402
|
+
url: `https://modrinth.com/mod/${h.slug}`,
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
// Normalize CurseForge results
|
|
407
|
+
if (cfResults) {
|
|
408
|
+
for (const h of cfResults) {
|
|
409
|
+
hits.push({
|
|
410
|
+
name: h.name,
|
|
411
|
+
slug: h.slug,
|
|
412
|
+
description: (h.summary ?? "").slice(0, 200),
|
|
413
|
+
platform: "curseforge",
|
|
414
|
+
projectId: h.id,
|
|
415
|
+
downloads: h.downloadCount ?? 0,
|
|
416
|
+
url: `https://www.curseforge.com/minecraft/mc-mods/${h.slug}`,
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
// Deduplicate: if same slug appears on both platforms, merge into one entry
|
|
421
|
+
const seen = new Map();
|
|
422
|
+
const deduped = [];
|
|
423
|
+
for (const hit of hits) {
|
|
424
|
+
const key = hit.slug.toLowerCase().replace(/[^a-z0-9]/g, "");
|
|
425
|
+
const existing = seen.get(key);
|
|
426
|
+
if (existing) {
|
|
427
|
+
// Keep the one with more downloads, note both platforms
|
|
428
|
+
if (hit.downloads > existing.downloads) {
|
|
429
|
+
const idx = deduped.indexOf(existing);
|
|
430
|
+
if (idx >= 0)
|
|
431
|
+
deduped[idx] = { ...hit, description: hit.description || existing.description };
|
|
432
|
+
seen.set(key, hit);
|
|
433
|
+
}
|
|
434
|
+
continue;
|
|
435
|
+
}
|
|
436
|
+
seen.set(key, hit);
|
|
437
|
+
deduped.push(hit);
|
|
438
|
+
}
|
|
439
|
+
// Sort by downloads descending
|
|
440
|
+
deduped.sort((a, b) => b.downloads - a.downloads);
|
|
441
|
+
return {
|
|
442
|
+
query,
|
|
443
|
+
loader: opts.loader ?? "(any)",
|
|
444
|
+
mcVersion: opts.mcVersion ?? "(any)",
|
|
445
|
+
totalResults: deduped.length,
|
|
446
|
+
modrinthResults: mrResults?.hits?.length ?? 0,
|
|
447
|
+
curseforgeResults: cfResults?.length ?? 0,
|
|
448
|
+
note: "Results merged from Modrinth and CurseForge, deduplicated by slug, sorted by downloads. CurseForge requires CURSEFORGE_API_KEY env var.",
|
|
449
|
+
results: deduped.slice(0, limit),
|
|
450
|
+
};
|
|
451
|
+
}
|
|
452
|
+
//# sourceMappingURL=platform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/tools/platform.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
declare const DEFAULT_PRIMER_HOSTS: string[];
|
|
2
|
+
/** Exported for use in setup wizard. */
|
|
3
|
+
export { DEFAULT_PRIMER_HOSTS };
|
|
4
|
+
/** Ingest one or more primers into the database. */
|
|
5
|
+
export declare function ingestPrimer(entries: {
|
|
6
|
+
fromVersion: string;
|
|
7
|
+
toVersion: string;
|
|
8
|
+
modloader?: string;
|
|
9
|
+
title: string;
|
|
10
|
+
summary?: string;
|
|
11
|
+
url: string;
|
|
12
|
+
content?: string;
|
|
13
|
+
tags?: string[];
|
|
14
|
+
source?: string;
|
|
15
|
+
fetchContent?: boolean;
|
|
16
|
+
}[]): Promise<object>;
|
|
17
|
+
/** Get a single primer by ID. */
|
|
18
|
+
export declare function getPrimer(id: number): Promise<object>;
|
|
19
|
+
/**
|
|
20
|
+
* Get primers for a version range.
|
|
21
|
+
* Returns all primers where the primer's version range overlaps with [fromVersion, toVersion].
|
|
22
|
+
* If both data versions are resolvable, uses numeric comparison.
|
|
23
|
+
* Otherwise falls back to exact string match on fromVersion/toVersion.
|
|
24
|
+
*/
|
|
25
|
+
export declare function getPrimersByVersionRange(fromVersion: string, toVersion: string, modloader?: string): Promise<object>;
|
|
26
|
+
/** Search primers using full-text search on title, summary, and content. */
|
|
27
|
+
export declare function searchPrimers(query: string, modloader?: string, fromVersion?: string, toVersion?: string, limit?: number): Promise<object>;
|
|
28
|
+
/** List all primers with optional filters. */
|
|
29
|
+
export declare function listPrimers(modloader?: string, limit?: number): Promise<object>;
|
|
30
|
+
/** Delete a primer by ID. */
|
|
31
|
+
export declare function deletePrimer(id: number): Promise<object>;
|
|
32
|
+
/** Populate the primers table with known NeoForge/Forge/Fabric migration guides. */
|
|
33
|
+
export declare function seedDefaultPrimers(): Promise<object>;
|
|
34
|
+
export declare function semanticSearchPrimers(query: string, limit?: number): Promise<object>;
|
|
35
|
+
export declare function backfillPrimerEmbeddings(): Promise<object>;
|
|
36
|
+
//# sourceMappingURL=primers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"primers.d.ts","sourceRoot":"","sources":["../../src/tools/primers.ts"],"names":[],"mappings":"AAoBA,QAAA,MAAM,oBAAoB,UAazB,CAAC;AA6BF,wCAAwC;AACxC,OAAO,EAAE,oBAAoB,EAAE,CAAC;AA+ChC,oDAAoD;AACpD,wBAAsB,YAAY,CAAC,OAAO,EAAE;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;CAC1B,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA6DpB;AAED,iCAAiC;AACjC,wBAAsB,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAK3D;AAED;;;;;GAKG;AACH,wBAAsB,wBAAwB,CAC1C,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,CAAC,CAqDjB;AAED,4EAA4E;AAC5E,wBAAsB,aAAa,CAC/B,KAAK,EAAE,MAAM,EACb,SAAS,CAAC,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,MAAM,EAClB,KAAK,SAAK,GACX,OAAO,CAAC,MAAM,CAAC,CA6CjB;AAED,8CAA8C;AAC9C,wBAAsB,WAAW,CAC7B,SAAS,CAAC,EAAE,MAAM,EAClB,KAAK,SAAK,GACX,OAAO,CAAC,MAAM,CAAC,CAiBjB;AAED,6BAA6B;AAC7B,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAG9D;AAsGD,oFAAoF;AACpF,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAE1D;AAkBD,wBAAsB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,MAAM,CAAC,CAYtF;AAID,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,MAAM,CAAC,CAiBhE"}
|