@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,38 @@
|
|
|
1
|
+
type VecRow = {
|
|
2
|
+
id: number;
|
|
3
|
+
similarity: number;
|
|
4
|
+
};
|
|
5
|
+
export declare function upsertDocEmbedding(id: number, vec: number[]): Promise<void>;
|
|
6
|
+
export declare function searchDocsByVector(vec: number[], limit?: number): Promise<VecRow[]>;
|
|
7
|
+
export declare function upsertPrimerEmbedding(id: number, vec: number[]): Promise<void>;
|
|
8
|
+
export declare function searchPrimersByVector(vec: number[], limit?: number): Promise<VecRow[]>;
|
|
9
|
+
export declare function upsertSourceEmbedding(id: number, vec: number[], source?: string): Promise<void>;
|
|
10
|
+
export declare function searchSourceByVector(vec: number[], mcVersionId: number, limit?: number, provenance?: string): Promise<Array<{
|
|
11
|
+
id: number;
|
|
12
|
+
class_name: string;
|
|
13
|
+
similarity: number;
|
|
14
|
+
embed_source: string | null;
|
|
15
|
+
}>>;
|
|
16
|
+
export declare function upsertModSourceEmbedding(id: number, vec: number[], source?: string): Promise<void>;
|
|
17
|
+
export declare function searchModSourceByVector(vec: number[], modId: number, limit?: number, provenance?: string): Promise<Array<{
|
|
18
|
+
id: number;
|
|
19
|
+
class_name: string;
|
|
20
|
+
similarity: number;
|
|
21
|
+
embed_source: string | null;
|
|
22
|
+
}>>;
|
|
23
|
+
export declare function findSourceIdsByClassNames(classNames: string[], mcVersionId: number, requireEmbedding?: boolean): Promise<Map<string, number>>;
|
|
24
|
+
export declare function findModSourceIdsByClassNames(classNames: string[], modId: number, requireEmbedding?: boolean): Promise<Map<string, number>>;
|
|
25
|
+
/** Get embed_source values for a set of source file IDs. */
|
|
26
|
+
export declare function getEmbedSources(table: "mod_source_files" | "mc_source_files", ids: number[]): Promise<Map<number, {
|
|
27
|
+
source: string | null;
|
|
28
|
+
updatedAt: Date | null;
|
|
29
|
+
}>>;
|
|
30
|
+
/** Count embeddings by source provenance. */
|
|
31
|
+
export declare function countEmbedsBySource(table: "mod_source_files" | "mc_source_files", scopeColumn: string, scopeId: number): Promise<{
|
|
32
|
+
local: number;
|
|
33
|
+
registry: number;
|
|
34
|
+
community: number;
|
|
35
|
+
unknown: number;
|
|
36
|
+
}>;
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=embeddings-sqlite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embeddings-sqlite.d.ts","sourceRoot":"","sources":["../../src/repositories/embeddings-sqlite.ts"],"names":[],"mappings":"AAQA,KAAK,MAAM,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AA8BjD,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CASjF;AAED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,KAAK,SAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAYpF;AAID,wBAAsB,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAOpF;AAED,wBAAsB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,KAAK,SAAI,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAYvF;AAID,wBAAsB,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,MAAM,GAAE,MAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAO9G;AAED,wBAAsB,oBAAoB,CACtC,GAAG,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,SAAK,EAAE,UAAU,CAAC,EAAE,MAAM,GACpE,OAAO,CAAC,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAAC,CAoBrG;AAID,wBAAsB,wBAAwB,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,MAAM,GAAE,MAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,CAOjH;AAED,wBAAsB,uBAAuB,CACzC,GAAG,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,EAAE,UAAU,CAAC,EAAE,MAAM,GAC9D,OAAO,CAAC,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAAC,CAoBrG;AAID,wBAAsB,yBAAyB,CAC3C,UAAU,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,gBAAgB,UAAO,GACnE,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAc9B;AAED,wBAAsB,4BAA4B,CAC9C,UAAU,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,UAAO,GAC7D,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAc9B;AAED,4DAA4D;AAC5D,wBAAsB,eAAe,CACjC,KAAK,EAAE,kBAAkB,GAAG,iBAAiB,EAAE,GAAG,EAAE,MAAM,EAAE,GAC7D,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,IAAI,GAAG,IAAI,CAAA;CAAE,CAAC,CAAC,CAgBzE;AAED,6CAA6C;AAC7C,wBAAsB,mBAAmB,CACrC,KAAK,EAAE,kBAAkB,GAAG,iBAAiB,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GACpF,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAiBlF"}
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
let _vecDb = null;
|
|
2
|
+
async function getVecDb() {
|
|
3
|
+
if (_vecDb)
|
|
4
|
+
return _vecDb;
|
|
5
|
+
const url = process.env.DATABASE_URL ?? "";
|
|
6
|
+
const path = url.replace(/^file:\/\//, "").replace(/^file:/, "");
|
|
7
|
+
const Database = (await import("better-sqlite3")).default;
|
|
8
|
+
const db = new Database(path);
|
|
9
|
+
try {
|
|
10
|
+
const { createRequire } = await import("module");
|
|
11
|
+
const require = createRequire(import.meta.url);
|
|
12
|
+
const sqliteVec = require("sqlite-vec");
|
|
13
|
+
sqliteVec.load(db);
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
// sqlite-vec not installed — vector search unavailable
|
|
17
|
+
}
|
|
18
|
+
_vecDb = db;
|
|
19
|
+
return db;
|
|
20
|
+
}
|
|
21
|
+
function float32Blob(vec) {
|
|
22
|
+
const buf = Buffer.allocUnsafe(vec.length * 4);
|
|
23
|
+
for (let i = 0; i < vec.length; i++)
|
|
24
|
+
buf.writeFloatLE(vec[i], i * 4);
|
|
25
|
+
return buf;
|
|
26
|
+
}
|
|
27
|
+
// ── doc_entries ───────────────────────────────────────────────────────────────
|
|
28
|
+
export async function upsertDocEmbedding(id, vec) {
|
|
29
|
+
const db = await getVecDb();
|
|
30
|
+
// Store blob in Prisma table
|
|
31
|
+
const prisma = await import("../db.js").then((m) => m.getDb());
|
|
32
|
+
await prisma.docEntry.update({ where: { id }, data: { embedding: float32Blob(vec) } });
|
|
33
|
+
// Upsert into vec0 table if available
|
|
34
|
+
try {
|
|
35
|
+
db.prepare(`INSERT OR REPLACE INTO vec_doc_entries(rowid, embedding) VALUES (?, ?)`).run(id, float32Blob(vec));
|
|
36
|
+
}
|
|
37
|
+
catch { /* vec0 unavailable */ }
|
|
38
|
+
}
|
|
39
|
+
export async function searchDocsByVector(vec, limit = 5) {
|
|
40
|
+
const db = await getVecDb();
|
|
41
|
+
try {
|
|
42
|
+
const rows = db.prepare(`SELECT rowid AS id, distance FROM vec_doc_entries
|
|
43
|
+
WHERE embedding MATCH ? AND k = ?
|
|
44
|
+
ORDER BY distance`).all(float32Blob(vec), limit);
|
|
45
|
+
return rows.map((r) => ({ id: r.id, similarity: 1 - r.distance }));
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
return [];
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
// ── primers ───────────────────────────────────────────────────────────────────
|
|
52
|
+
export async function upsertPrimerEmbedding(id, vec) {
|
|
53
|
+
const db = await getVecDb();
|
|
54
|
+
const prisma = await import("../db.js").then((m) => m.getDb());
|
|
55
|
+
await prisma.primer.update({ where: { id }, data: { embedding: float32Blob(vec) } });
|
|
56
|
+
try {
|
|
57
|
+
db.prepare(`INSERT OR REPLACE INTO vec_primers(rowid, embedding) VALUES (?, ?)`).run(id, float32Blob(vec));
|
|
58
|
+
}
|
|
59
|
+
catch { /* vec0 unavailable */ }
|
|
60
|
+
}
|
|
61
|
+
export async function searchPrimersByVector(vec, limit = 5) {
|
|
62
|
+
const db = await getVecDb();
|
|
63
|
+
try {
|
|
64
|
+
const rows = db.prepare(`SELECT rowid AS id, distance FROM vec_primers
|
|
65
|
+
WHERE embedding MATCH ? AND k = ?
|
|
66
|
+
ORDER BY distance`).all(float32Blob(vec), limit);
|
|
67
|
+
return rows.map((r) => ({ id: r.id, similarity: 1 - r.distance }));
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
// ── mc_source_files ───────────────────────────────────────────────────────────
|
|
74
|
+
export async function upsertSourceEmbedding(id, vec, source = "local") {
|
|
75
|
+
const db = await getVecDb();
|
|
76
|
+
const prisma = await import("../db.js").then((m) => m.getDb());
|
|
77
|
+
await prisma.mcSourceFile.update({ where: { id }, data: { embedding: float32Blob(vec), embedSource: source, embedUpdatedAt: new Date() } });
|
|
78
|
+
try {
|
|
79
|
+
db.prepare(`INSERT OR REPLACE INTO vec_mc_source(rowid, embedding) VALUES (?, ?)`).run(id, float32Blob(vec));
|
|
80
|
+
}
|
|
81
|
+
catch { /* vec0 unavailable */ }
|
|
82
|
+
}
|
|
83
|
+
export async function searchSourceByVector(vec, mcVersionId, limit = 10, provenance) {
|
|
84
|
+
const db = await getVecDb();
|
|
85
|
+
try {
|
|
86
|
+
const sql = provenance
|
|
87
|
+
? `SELECT v.rowid AS id, s.class_name, s.embed_source, v.distance FROM vec_mc_source v
|
|
88
|
+
JOIN mc_source_files s ON s.id = v.rowid
|
|
89
|
+
WHERE v.embedding MATCH ? AND v.k = ? AND s.mc_version_id = ? AND s.embed_source = ?
|
|
90
|
+
ORDER BY v.distance`
|
|
91
|
+
: `SELECT v.rowid AS id, s.class_name, s.embed_source, v.distance FROM vec_mc_source v
|
|
92
|
+
JOIN mc_source_files s ON s.id = v.rowid
|
|
93
|
+
WHERE v.embedding MATCH ? AND v.k = ? AND s.mc_version_id = ?
|
|
94
|
+
ORDER BY v.distance`;
|
|
95
|
+
const args = provenance
|
|
96
|
+
? [float32Blob(vec), limit, mcVersionId, provenance]
|
|
97
|
+
: [float32Blob(vec), limit, mcVersionId];
|
|
98
|
+
const rows = db.prepare(sql).all(...args);
|
|
99
|
+
return rows.map((r) => ({ id: r.id, class_name: r.class_name, embed_source: r.embed_source, similarity: 1 - r.distance }));
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
return [];
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// ── mod_source_files ──────────────────────────────────────────────────────────
|
|
106
|
+
export async function upsertModSourceEmbedding(id, vec, source = "local") {
|
|
107
|
+
const db = await getVecDb();
|
|
108
|
+
const prisma = await import("../db.js").then((m) => m.getDb());
|
|
109
|
+
await prisma.modSourceFile.update({ where: { id }, data: { embedding: float32Blob(vec), embedSource: source, embedUpdatedAt: new Date() } });
|
|
110
|
+
try {
|
|
111
|
+
db.prepare(`INSERT OR REPLACE INTO vec_mod_source(rowid, embedding) VALUES (?, ?)`).run(id, float32Blob(vec));
|
|
112
|
+
}
|
|
113
|
+
catch { /* vec0 unavailable */ }
|
|
114
|
+
}
|
|
115
|
+
export async function searchModSourceByVector(vec, modId, limit = 10, provenance) {
|
|
116
|
+
const db = await getVecDb();
|
|
117
|
+
try {
|
|
118
|
+
const sql = provenance
|
|
119
|
+
? `SELECT v.rowid AS id, s.class_name, s.embed_source, v.distance FROM vec_mod_source v
|
|
120
|
+
JOIN mod_source_files s ON s.id = v.rowid
|
|
121
|
+
WHERE v.embedding MATCH ? AND v.k = ? AND s.mod_id = ? AND s.embed_source = ?
|
|
122
|
+
ORDER BY v.distance`
|
|
123
|
+
: `SELECT v.rowid AS id, s.class_name, s.embed_source, v.distance FROM vec_mod_source v
|
|
124
|
+
JOIN mod_source_files s ON s.id = v.rowid
|
|
125
|
+
WHERE v.embedding MATCH ? AND v.k = ? AND s.mod_id = ?
|
|
126
|
+
ORDER BY v.distance`;
|
|
127
|
+
const args = provenance
|
|
128
|
+
? [float32Blob(vec), limit, modId, provenance]
|
|
129
|
+
: [float32Blob(vec), limit, modId];
|
|
130
|
+
const rows = db.prepare(sql).all(...args);
|
|
131
|
+
return rows.map((r) => ({ id: r.id, class_name: r.class_name, embed_source: r.embed_source, similarity: 1 - r.distance }));
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
return [];
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
// ── Class-name → ID lookups (for diff semantic enrichment) ───────────────────
|
|
138
|
+
export async function findSourceIdsByClassNames(classNames, mcVersionId, requireEmbedding = true) {
|
|
139
|
+
if (classNames.length === 0)
|
|
140
|
+
return new Map();
|
|
141
|
+
const db = await getVecDb();
|
|
142
|
+
const placeholders = classNames.map(() => "?").join(",");
|
|
143
|
+
const embFilter = requireEmbedding ? " AND embedding IS NOT NULL" : "";
|
|
144
|
+
try {
|
|
145
|
+
const rows = db.prepare(`SELECT id, class_name FROM mc_source_files
|
|
146
|
+
WHERE mc_version_id = ? AND class_name IN (${placeholders})${embFilter}`).all(mcVersionId, ...classNames);
|
|
147
|
+
return new Map(rows.map((r) => [r.class_name, r.id]));
|
|
148
|
+
}
|
|
149
|
+
catch {
|
|
150
|
+
return new Map();
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
export async function findModSourceIdsByClassNames(classNames, modId, requireEmbedding = true) {
|
|
154
|
+
if (classNames.length === 0)
|
|
155
|
+
return new Map();
|
|
156
|
+
const db = await getVecDb();
|
|
157
|
+
const placeholders = classNames.map(() => "?").join(",");
|
|
158
|
+
const embFilter = requireEmbedding ? " AND embedding IS NOT NULL" : "";
|
|
159
|
+
try {
|
|
160
|
+
const rows = db.prepare(`SELECT id, class_name FROM mod_source_files
|
|
161
|
+
WHERE mod_id = ? AND class_name IN (${placeholders})${embFilter}`).all(modId, ...classNames);
|
|
162
|
+
return new Map(rows.map((r) => [r.class_name, r.id]));
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
return new Map();
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
/** Get embed_source values for a set of source file IDs. */
|
|
169
|
+
export async function getEmbedSources(table, ids) {
|
|
170
|
+
if (ids.length === 0)
|
|
171
|
+
return new Map();
|
|
172
|
+
const db = await getVecDb();
|
|
173
|
+
const placeholders = ids.map(() => "?").join(",");
|
|
174
|
+
try {
|
|
175
|
+
const rows = db.prepare(`SELECT id, embed_source, embed_updated_at FROM ${table}
|
|
176
|
+
WHERE id IN (${placeholders}) AND embedding IS NOT NULL`).all(...ids);
|
|
177
|
+
return new Map(rows.map((r) => [r.id, {
|
|
178
|
+
source: r.embed_source,
|
|
179
|
+
updatedAt: r.embed_updated_at ? new Date(r.embed_updated_at) : null,
|
|
180
|
+
}]));
|
|
181
|
+
}
|
|
182
|
+
catch {
|
|
183
|
+
return new Map();
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/** Count embeddings by source provenance. */
|
|
187
|
+
export async function countEmbedsBySource(table, scopeColumn, scopeId) {
|
|
188
|
+
const db = await getVecDb();
|
|
189
|
+
const result = { local: 0, registry: 0, community: 0, unknown: 0 };
|
|
190
|
+
try {
|
|
191
|
+
const rows = db.prepare(`SELECT embed_source, COUNT(*) AS count FROM ${table}
|
|
192
|
+
WHERE ${scopeColumn} = ? AND embedding IS NOT NULL
|
|
193
|
+
GROUP BY embed_source`).all(scopeId);
|
|
194
|
+
for (const r of rows) {
|
|
195
|
+
if (r.embed_source === "local")
|
|
196
|
+
result.local += r.count;
|
|
197
|
+
else if (r.embed_source === "registry")
|
|
198
|
+
result.registry += r.count;
|
|
199
|
+
else if (r.embed_source === "community")
|
|
200
|
+
result.community += r.count;
|
|
201
|
+
else
|
|
202
|
+
result.unknown += r.count;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
catch { /* columns may not exist yet */ }
|
|
206
|
+
return result;
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=embeddings-sqlite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embeddings-sqlite.js","sourceRoot":"","sources":["../../src/repositories/embeddings-sqlite.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
type VecRow = {
|
|
2
|
+
id: number;
|
|
3
|
+
similarity: number;
|
|
4
|
+
};
|
|
5
|
+
export declare function upsertDocEmbedding(id: number, vec: number[]): Promise<void>;
|
|
6
|
+
export declare function searchDocsByVector(vec: number[], limit?: number): Promise<VecRow[]>;
|
|
7
|
+
export declare function upsertPrimerEmbedding(id: number, vec: number[]): Promise<void>;
|
|
8
|
+
export declare function searchPrimersByVector(vec: number[], limit?: number): Promise<VecRow[]>;
|
|
9
|
+
export declare function upsertSourceEmbedding(id: number, vec: number[], source?: string): Promise<void>;
|
|
10
|
+
export declare function searchSourceByVector(vec: number[], mcVersionId: number, limit?: number, provenance?: string): Promise<Array<{
|
|
11
|
+
id: number;
|
|
12
|
+
class_name: string;
|
|
13
|
+
similarity: number;
|
|
14
|
+
embed_source: string | null;
|
|
15
|
+
}>>;
|
|
16
|
+
/** Count rows with no embedding yet (for backfill progress). */
|
|
17
|
+
export declare function countUnembedded(table: "doc_entries" | "primers" | "mc_source_files", mcVersionId?: number): Promise<number>;
|
|
18
|
+
export declare function upsertModSourceEmbedding(id: number, vec: number[], source?: string): Promise<void>;
|
|
19
|
+
export declare function searchModSourceByVector(vec: number[], modId: number, limit?: number, provenance?: string): Promise<Array<{
|
|
20
|
+
id: number;
|
|
21
|
+
class_name: string;
|
|
22
|
+
similarity: number;
|
|
23
|
+
embed_source: string | null;
|
|
24
|
+
}>>;
|
|
25
|
+
export declare function findSourceIdsByClassNames(classNames: string[], mcVersionId: number, requireEmbedding?: boolean): Promise<Map<string, number>>;
|
|
26
|
+
export declare function findModSourceIdsByClassNames(classNames: string[], modId: number, requireEmbedding?: boolean): Promise<Map<string, number>>;
|
|
27
|
+
/** Get embed_source values for a set of source file IDs. */
|
|
28
|
+
export declare function getEmbedSources(table: "mod_source_files" | "mc_source_files", ids: number[]): Promise<Map<number, {
|
|
29
|
+
source: string | null;
|
|
30
|
+
updatedAt: Date | null;
|
|
31
|
+
}>>;
|
|
32
|
+
/** Count embeddings by source provenance. */
|
|
33
|
+
export declare function countEmbedsBySource(table: "mod_source_files" | "mc_source_files", scopeColumn: string, scopeId: number): Promise<{
|
|
34
|
+
local: number;
|
|
35
|
+
registry: number;
|
|
36
|
+
community: number;
|
|
37
|
+
unknown: number;
|
|
38
|
+
}>;
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=embeddings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../src/repositories/embeddings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Raw SQL helpers for pgvector operations.
|
|
3
|
+
* Prisma doesn't natively support vector types, so all reads/writes go through
|
|
4
|
+
* $queryRawUnsafe / $executeRawUnsafe.
|
|
5
|
+
*
|
|
6
|
+
* Requires: pgvector extension enabled + embedding vector(768) columns on each table.
|
|
7
|
+
* Run `npm run db:vector` once after docker-compose up to enable the extension.
|
|
8
|
+
*/
|
|
9
|
+
import { getDb } from "../db.js";
|
|
10
|
+
function vecLiteral(vec) {
|
|
11
|
+
return `[${vec.join(",")}]`;
|
|
12
|
+
}
|
|
13
|
+
// ── doc_entries ───────────────────────────────────────────────────────────────
|
|
14
|
+
export async function upsertDocEmbedding(id, vec) {
|
|
15
|
+
const db = await getDb();
|
|
16
|
+
await db.$executeRawUnsafe(`UPDATE doc_entries SET embedding = $1::vector WHERE id = $2`, vecLiteral(vec), id);
|
|
17
|
+
}
|
|
18
|
+
export async function searchDocsByVector(vec, limit = 5) {
|
|
19
|
+
const db = await getDb();
|
|
20
|
+
return db.$queryRawUnsafe(`SELECT id, (1 - (embedding <=> $1::vector))::float AS similarity
|
|
21
|
+
FROM doc_entries
|
|
22
|
+
WHERE embedding IS NOT NULL
|
|
23
|
+
ORDER BY embedding <=> $1::vector
|
|
24
|
+
LIMIT $2`, vecLiteral(vec), limit);
|
|
25
|
+
}
|
|
26
|
+
// ── primers ───────────────────────────────────────────────────────────────────
|
|
27
|
+
export async function upsertPrimerEmbedding(id, vec) {
|
|
28
|
+
const db = await getDb();
|
|
29
|
+
await db.$executeRawUnsafe(`UPDATE primers SET embedding = $1::vector WHERE id = $2`, vecLiteral(vec), id);
|
|
30
|
+
}
|
|
31
|
+
export async function searchPrimersByVector(vec, limit = 5) {
|
|
32
|
+
const db = await getDb();
|
|
33
|
+
return db.$queryRawUnsafe(`SELECT id, (1 - (embedding <=> $1::vector))::float AS similarity
|
|
34
|
+
FROM primers
|
|
35
|
+
WHERE embedding IS NOT NULL
|
|
36
|
+
ORDER BY embedding <=> $1::vector
|
|
37
|
+
LIMIT $2`, vecLiteral(vec), limit);
|
|
38
|
+
}
|
|
39
|
+
// ── mc_source_files ───────────────────────────────────────────────────────────
|
|
40
|
+
export async function upsertSourceEmbedding(id, vec, source = "local") {
|
|
41
|
+
const db = await getDb();
|
|
42
|
+
await db.$executeRawUnsafe(`UPDATE mc_source_files SET embedding = $1::vector, embed_source = $3, embed_updated_at = NOW() WHERE id = $2`, vecLiteral(vec), id, source);
|
|
43
|
+
}
|
|
44
|
+
export async function searchSourceByVector(vec, mcVersionId, limit = 10, provenance) {
|
|
45
|
+
const db = await getDb();
|
|
46
|
+
if (provenance) {
|
|
47
|
+
return db.$queryRawUnsafe(`SELECT id, class_name, embed_source, (1 - (embedding <=> $1::vector))::float AS similarity
|
|
48
|
+
FROM mc_source_files
|
|
49
|
+
WHERE mc_version_id = $3 AND embedding IS NOT NULL AND embed_source = $4
|
|
50
|
+
ORDER BY embedding <=> $1::vector
|
|
51
|
+
LIMIT $2`, vecLiteral(vec), limit, mcVersionId, provenance);
|
|
52
|
+
}
|
|
53
|
+
return db.$queryRawUnsafe(`SELECT id, class_name, embed_source, (1 - (embedding <=> $1::vector))::float AS similarity
|
|
54
|
+
FROM mc_source_files
|
|
55
|
+
WHERE mc_version_id = $3 AND embedding IS NOT NULL
|
|
56
|
+
ORDER BY embedding <=> $1::vector
|
|
57
|
+
LIMIT $2`, vecLiteral(vec), limit, mcVersionId);
|
|
58
|
+
}
|
|
59
|
+
/** Count rows with no embedding yet (for backfill progress). */
|
|
60
|
+
export async function countUnembedded(table, mcVersionId) {
|
|
61
|
+
const db = await getDb();
|
|
62
|
+
if (table === "mc_source_files" && mcVersionId !== undefined) {
|
|
63
|
+
const rows = await db.$queryRawUnsafe(`SELECT COUNT(*)::text AS count FROM mc_source_files WHERE mc_version_id = $1 AND embedding IS NULL`, mcVersionId);
|
|
64
|
+
return parseInt(rows[0].count, 10);
|
|
65
|
+
}
|
|
66
|
+
const rows = await db.$queryRawUnsafe(`SELECT COUNT(*)::text AS count FROM ${table} WHERE embedding IS NULL`);
|
|
67
|
+
return parseInt(rows[0].count, 10);
|
|
68
|
+
}
|
|
69
|
+
// ── mod_source_files ──────────────────────────────────────────────────────────
|
|
70
|
+
export async function upsertModSourceEmbedding(id, vec, source = "local") {
|
|
71
|
+
const db = await getDb();
|
|
72
|
+
await db.$executeRawUnsafe(`UPDATE mod_source_files SET embedding = $1::vector, embed_source = $3, embed_updated_at = NOW() WHERE id = $2`, vecLiteral(vec), id, source);
|
|
73
|
+
}
|
|
74
|
+
export async function searchModSourceByVector(vec, modId, limit = 10, provenance) {
|
|
75
|
+
const db = await getDb();
|
|
76
|
+
if (provenance) {
|
|
77
|
+
return db.$queryRawUnsafe(`SELECT id, class_name, embed_source, (1 - (embedding <=> $1::vector))::float AS similarity
|
|
78
|
+
FROM mod_source_files
|
|
79
|
+
WHERE mod_id = $3 AND embedding IS NOT NULL AND embed_source = $4
|
|
80
|
+
ORDER BY embedding <=> $1::vector
|
|
81
|
+
LIMIT $2`, vecLiteral(vec), limit, modId, provenance);
|
|
82
|
+
}
|
|
83
|
+
return db.$queryRawUnsafe(`SELECT id, class_name, embed_source, (1 - (embedding <=> $1::vector))::float AS similarity
|
|
84
|
+
FROM mod_source_files
|
|
85
|
+
WHERE mod_id = $3 AND embedding IS NOT NULL
|
|
86
|
+
ORDER BY embedding <=> $1::vector
|
|
87
|
+
LIMIT $2`, vecLiteral(vec), limit, modId);
|
|
88
|
+
}
|
|
89
|
+
// ── Class-name → ID lookups (for diff semantic enrichment) ───────────────────
|
|
90
|
+
export async function findSourceIdsByClassNames(classNames, mcVersionId, requireEmbedding = true) {
|
|
91
|
+
if (classNames.length === 0)
|
|
92
|
+
return new Map();
|
|
93
|
+
const db = await getDb();
|
|
94
|
+
const embFilter = requireEmbedding ? " AND embedding IS NOT NULL" : "";
|
|
95
|
+
const rows = await db.$queryRawUnsafe(`SELECT id, class_name FROM mc_source_files
|
|
96
|
+
WHERE mc_version_id = $1 AND class_name = ANY($2::text[])${embFilter}`, mcVersionId, classNames);
|
|
97
|
+
return new Map(rows.map((r) => [r.class_name, r.id]));
|
|
98
|
+
}
|
|
99
|
+
export async function findModSourceIdsByClassNames(classNames, modId, requireEmbedding = true) {
|
|
100
|
+
if (classNames.length === 0)
|
|
101
|
+
return new Map();
|
|
102
|
+
const db = await getDb();
|
|
103
|
+
const embFilter = requireEmbedding ? " AND embedding IS NOT NULL" : "";
|
|
104
|
+
const rows = await db.$queryRawUnsafe(`SELECT id, class_name FROM mod_source_files
|
|
105
|
+
WHERE mod_id = $1 AND class_name = ANY($2::text[])${embFilter}`, modId, classNames);
|
|
106
|
+
return new Map(rows.map((r) => [r.class_name, r.id]));
|
|
107
|
+
}
|
|
108
|
+
/** Get embed_source values for a set of source file IDs. */
|
|
109
|
+
export async function getEmbedSources(table, ids) {
|
|
110
|
+
if (ids.length === 0)
|
|
111
|
+
return new Map();
|
|
112
|
+
const db = await getDb();
|
|
113
|
+
const rows = await db.$queryRawUnsafe(`SELECT id, embed_source, embed_updated_at FROM ${table} WHERE id = ANY($1::int[]) AND embedding IS NOT NULL`, ids);
|
|
114
|
+
return new Map(rows.map((r) => [r.id, { source: r.embed_source, updatedAt: r.embed_updated_at }]));
|
|
115
|
+
}
|
|
116
|
+
/** Count embeddings by source provenance. */
|
|
117
|
+
export async function countEmbedsBySource(table, scopeColumn, scopeId) {
|
|
118
|
+
const db = await getDb();
|
|
119
|
+
const rows = await db.$queryRawUnsafe(`SELECT embed_source, COUNT(*)::text AS count FROM ${table}
|
|
120
|
+
WHERE ${scopeColumn} = $1 AND embedding IS NOT NULL
|
|
121
|
+
GROUP BY embed_source`, scopeId);
|
|
122
|
+
const result = { local: 0, registry: 0, community: 0, unknown: 0 };
|
|
123
|
+
for (const r of rows) {
|
|
124
|
+
const n = parseInt(r.count, 10);
|
|
125
|
+
if (r.embed_source === "local")
|
|
126
|
+
result.local += n;
|
|
127
|
+
else if (r.embed_source === "registry")
|
|
128
|
+
result.registry += n;
|
|
129
|
+
else if (r.embed_source === "community")
|
|
130
|
+
result.community += n;
|
|
131
|
+
else
|
|
132
|
+
result.unknown += n;
|
|
133
|
+
}
|
|
134
|
+
return result;
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=embeddings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../src/repositories/embeddings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/repositories/index.ts"],"names":[],"mappings":"AAQA,wBAAsB,iBAAiB,qDAMtC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
// src/repositories/index.ts
|
|
2
|
+
/**
|
|
3
|
+
* Factory for the embeddings repository.
|
|
4
|
+
* Returns the pgvector implementation for postgres/pglite,
|
|
5
|
+
* and (in P2) the sqlite-vec implementation for sqlite.
|
|
6
|
+
*/
|
|
7
|
+
import { detectBackend } from "../db-backend.js";
|
|
8
|
+
export async function getEmbeddingsRepo() {
|
|
9
|
+
const backend = detectBackend();
|
|
10
|
+
if (backend === "sqlite") {
|
|
11
|
+
return import("./embeddings-sqlite.js");
|
|
12
|
+
}
|
|
13
|
+
return import("./embeddings.js");
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/repositories/index.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B;;;;GAIG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACnC,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC;IAChC,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;QACvB,OAAO,MAAM,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IACD,OAAO,MAAM,CAAC,iBAAiB,CAAC,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { McVersion, Prisma } from "@prisma/client";
|
|
2
|
+
/**
|
|
3
|
+
* Find-or-create an McVersion record by versionId.
|
|
4
|
+
* Returns the numeric DB id. Consolidates the duplicate ensureMcVersionRecord
|
|
5
|
+
* pattern that was independently duplicated in vanilla.ts and mc-fts.ts.
|
|
6
|
+
*/
|
|
7
|
+
export declare function ensureMcVersion(version: string): Promise<number>;
|
|
8
|
+
export declare function findMcVersionByVersionId(versionId: string): Promise<McVersion | null>;
|
|
9
|
+
export declare function findMcVersionById(id: number): Promise<McVersion | null>;
|
|
10
|
+
export declare function updateMcVersion(id: number, data: Prisma.McVersionUpdateInput): Promise<McVersion>;
|
|
11
|
+
export declare function upsertMcSourceFile(mcVersionId: number, className: string, content: string): Promise<void>;
|
|
12
|
+
export declare function searchMcSourceFiles(mcVersionId: number, query: string, limit: number): Promise<Array<{
|
|
13
|
+
className: string;
|
|
14
|
+
snippet: string;
|
|
15
|
+
}>>;
|
|
16
|
+
//# sourceMappingURL=mcVersion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcVersion.d.ts","sourceRoot":"","sources":["../../src/repositories/mcVersion.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAKxD;;;;GAIG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CActE;AAED,wBAAsB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAG3F;AAED,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAG7E;AAED,wBAAsB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,oBAAoB,GAAG,OAAO,CAAC,SAAS,CAAC,CAGvG;AAID,wBAAsB,kBAAkB,CACpC,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,GAChB,OAAO,CAAC,IAAI,CAAC,CAOf;AAID,wBAAsB,mBAAmB,CACrC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACd,OAAO,CAAC,KAAK,CAAC;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAExD"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Repository layer for the McVersion and McSourceFile tables.
|
|
3
|
+
* All Prisma queries against these tables live here.
|
|
4
|
+
*/
|
|
5
|
+
import { getDb } from "../db.js";
|
|
6
|
+
import { fetchMcVersionList } from "../minecraft.js";
|
|
7
|
+
import { ftsSearchSource } from "../search-adapter.js";
|
|
8
|
+
// ── McVersion queries ─────────────────────────────────────────────────────────
|
|
9
|
+
/**
|
|
10
|
+
* Find-or-create an McVersion record by versionId.
|
|
11
|
+
* Returns the numeric DB id. Consolidates the duplicate ensureMcVersionRecord
|
|
12
|
+
* pattern that was independently duplicated in vanilla.ts and mc-fts.ts.
|
|
13
|
+
*/
|
|
14
|
+
export async function ensureMcVersion(version) {
|
|
15
|
+
const db = await getDb();
|
|
16
|
+
const existing = await db.mcVersion.findUnique({ where: { versionId: version } });
|
|
17
|
+
if (existing)
|
|
18
|
+
return existing.id;
|
|
19
|
+
const allVersions = await fetchMcVersionList(true);
|
|
20
|
+
const entry = allVersions.find((v) => v.id === version);
|
|
21
|
+
const releaseTime = entry ? new Date(entry.releaseTime) : new Date();
|
|
22
|
+
const type = entry?.type ?? "release";
|
|
23
|
+
const created = await db.mcVersion.create({
|
|
24
|
+
data: { versionId: version, type, releaseTime },
|
|
25
|
+
});
|
|
26
|
+
return created.id;
|
|
27
|
+
}
|
|
28
|
+
export async function findMcVersionByVersionId(versionId) {
|
|
29
|
+
const db = await getDb();
|
|
30
|
+
return db.mcVersion.findUnique({ where: { versionId } });
|
|
31
|
+
}
|
|
32
|
+
export async function findMcVersionById(id) {
|
|
33
|
+
const db = await getDb();
|
|
34
|
+
return db.mcVersion.findUnique({ where: { id } });
|
|
35
|
+
}
|
|
36
|
+
export async function updateMcVersion(id, data) {
|
|
37
|
+
const db = await getDb();
|
|
38
|
+
return db.mcVersion.update({ where: { id }, data });
|
|
39
|
+
}
|
|
40
|
+
// ── McSourceFile queries ──────────────────────────────────────────────────────
|
|
41
|
+
export async function upsertMcSourceFile(mcVersionId, className, content) {
|
|
42
|
+
const db = await getDb();
|
|
43
|
+
await db.mcSourceFile.upsert({
|
|
44
|
+
where: { mcVersionId_className: { mcVersionId, className } },
|
|
45
|
+
create: { mcVersionId, className, content },
|
|
46
|
+
update: { content },
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
export async function searchMcSourceFiles(mcVersionId, query, limit) {
|
|
50
|
+
return ftsSearchSource(mcVersionId, query, limit);
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=mcVersion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcVersion.js","sourceRoot":"","sources":["../../src/repositories/mcVersion.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAErD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAEvD,iFAAiF;AAEjF;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAe;IACjD,MAAM,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC;IACzB,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;IAClF,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC,EAAE,CAAC;IAEjC,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;IACxD,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;IACrE,MAAM,IAAI,GAAG,KAAK,EAAE,IAAI,IAAI,SAAS,CAAC;IAEtC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC;QACtC,IAAI,EAAE,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE;KAClD,CAAC,CAAC;IACH,OAAO,OAAO,CAAC,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,SAAiB;IAC5D,MAAM,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC;IACzB,OAAO,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EAAU;IAC9C,MAAM,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC;IACzB,OAAO,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,EAAU,EAAE,IAAiC;IAC/E,MAAM,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC;IACzB,OAAO,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,iFAAiF;AAEjF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACpC,WAAmB,EACnB,SAAiB,EACjB,OAAe;IAEf,MAAM,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC;IACzB,MAAM,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC;QACzB,KAAK,EAAE,EAAE,qBAAqB,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE;QAC5D,MAAM,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE;QAC3C,MAAM,EAAE,EAAE,OAAO,EAAE;KACtB,CAAC,CAAC;AACP,CAAC;AAID,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACrC,WAAmB,EACnB,KAAa,EACb,KAAa;IAEb,OAAO,eAAe,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AACtD,CAAC"}
|