@absolutejs/rag-postgres 0.0.5 → 0.0.6
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/dist/createPostgresRAGStore.d.ts +3 -0
- package/dist/index.d.ts +16 -113
- package/dist/index.js +869 -535
- package/dist/index.js.map +5 -4
- package/dist/types.d.ts +14 -0
- package/package.json +5 -8
package/dist/index.js.map
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../src/index.ts"],
|
|
3
|
+
"sources": ["../src/index.ts", "../src/createPostgresRAGStore.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type {\n\tRAGBackendCapabilities,\n\tRAGCollection,\n\tRAGQueryInput,\n\tRAGQueryResult,\n\tRAGUpsertInput,\n\tRAGVectorStore,\n\tRAGVectorStoreStatus\n} from '@absolutejs/rag';\nimport {\n\tcreateRAGCollection,\n\tcreateRAGVector,\n\tnormalizeVector\n} from '@absolutejs/rag';\n\nexport const ABSOLUTE_POSTGRESQL_RAG_PACKAGE_NAME = '@absolutejs/rag-postgres';\n\nexport const POSTGRESQL_RAG_IMPLEMENTATIONS = ['pgvector'] as const;\nexport const PGVECTOR_DISTANCE_METRICS = [\n\t'cosine',\n\t'l2',\n\t'inner_product'\n] as const;\nexport const PGVECTOR_INDEX_TYPES = ['none', 'hnsw', 'ivfflat'] as const;\n\nexport type PostgreSQLRAGVectorImplementation = 'pgvector';\nexport type PgvectorDistanceMetric = 'cosine' | 'l2' | 'inner_product';\nexport type PgvectorIndexType = 'none' | 'hnsw' | 'ivfflat';\n\nexport type PostgreSQLRAGClient = {\n\tquery: <TRow = Record<string, unknown>>(\n\t\tsql: string,\n\t\tparams?: unknown[]\n\t) => Promise<{\n\t\trows: TRow[];\n\t\trowCount?: number;\n\t}>;\n\ttransaction?: <T>(\n\t\trun: (client: PostgreSQLRAGClient) => Promise<T>\n\t) => Promise<T>;\n\tclose?: () => Promise<void>;\n};\n\nexport type PostgreSQLRAGClientFactory = () =>\n\t| Promise<PostgreSQLRAGClient>\n\t| PostgreSQLRAGClient;\n\nexport type PostgreSQLRAGSchemaConfig = {\n\tschemaName?: string;\n\tchunkTableName?: string;\n\tmigrationTableName?: string;\n};\n\nexport type PgvectorHNSWConfig = {\n\ttype: 'hnsw';\n\tm?: number;\n\tefConstruction?: number;\n\tefSearch?: number;\n\titerativeScan?: 'off' | 'strict_order' | 'relaxed_order';\n};\n\nexport type PgvectorIVFFlatConfig = {\n\ttype: 'ivfflat';\n\tlists?: number;\n\tprobes?: number;\n\tmaxProbes?: number;\n\titerativeScan?: 'off' | 'strict_order' | 'relaxed_order';\n};\n\nexport type PgvectorNoIndexConfig = {\n\ttype: 'none';\n};\n\nexport type PgvectorIndexConfig =\n\t| PgvectorNoIndexConfig\n\t| PgvectorHNSWConfig\n\t| PgvectorIVFFlatConfig;\n\nexport type PgvectorConfig = {\n\tprovider: 'pgvector';\n\tdimensions: number;\n\tdistanceMetric?: PgvectorDistanceMetric;\n\textensionName?: 'vector' | string;\n\tautoCreateExtension?: boolean;\n\tautoCreateSchema?: boolean;\n\tautoCreateTables?: boolean;\n\tautoCreateIndex?: boolean;\n\tindex?: PgvectorIndexConfig;\n};\n\nexport type PostgreSQLDriverOptions = {\n\tmax?: number;\n\tprepare?: boolean;\n\tidle_timeout?: number;\n\tconnect_timeout?: number;\n\tmax_lifetime?: number;\n\tssl?: boolean | 'require' | 'allow' | 'prefer' | 'verify-full';\n};\n\nexport type PostgreSQLRAGOptions = {\n\tconnectionString?: string;\n\tclient?: PostgreSQLRAGClient;\n\tclientFactory?: PostgreSQLRAGClientFactory;\n\tdriver?: PostgreSQLDriverOptions;\n\tschema?: PostgreSQLRAGSchemaConfig;\n\tvector: PgvectorConfig;\n\tembedding?: RAGVectorStore['embed'];\n};\n\nexport type PostgreSQLSchemaPlan = {\n\timplementation: PostgreSQLRAGVectorImplementation;\n\textensionSql: string[];\n\tschemaSql: string[];\n\ttableSql: string[];\n\tindexSql: string[];\n\tquerySessionSql: string[];\n\tmigrationTableQualifiedName: string;\n};\n\nexport type PostgreSQLMigrationStage = 'extension' | 'table' | 'index';\n\nexport type PostgreSQLMigrationEntry = {\n\tname: string;\n\tstage: PostgreSQLMigrationStage;\n\tsql: string;\n};\n\nexport type PostgreSQLMigrationPlan = {\n\timplementation: PostgreSQLRAGVectorImplementation;\n\tschemaName: string;\n\tmigrationTableName: string;\n\tmigrationTableQualifiedName: string;\n\tbootstrapSql: string[];\n\tmigrations: PostgreSQLMigrationEntry[];\n\tschemaPlan: PostgreSQLSchemaPlan;\n};\n\nexport type PostgreSQLApplyMigrationsOptions = {\n\tclient?: PostgreSQLRAGClient;\n\tdryRun?: boolean;\n};\n\nexport type PostgreSQLApplyMigrationsResult = {\n\tmigrationPlan: PostgreSQLMigrationPlan;\n\tappliedNames: string[];\n\tskippedNames: string[];\n\tpendingNames: string[];\n\tappliedCount: number;\n\tpendingCount: number;\n\tdryRun: boolean;\n};\n\nexport type PostgreSQLRAG = {\n\tstore: RAGVectorStore;\n\tcollection: RAGCollection;\n\tgetStatus: () => RAGVectorStoreStatus | undefined;\n\tgetCapabilities: () => RAGBackendCapabilities | undefined;\n\tgetSchemaPlan: () => PostgreSQLSchemaPlan;\n\tgetMigrationPlan: () => PostgreSQLMigrationPlan;\n\tapplyMigrations: (\n\t\toptions?: PostgreSQLApplyMigrationsOptions\n\t) => Promise<PostgreSQLApplyMigrationsResult>;\n};\n\ntype ResolvedSchemaConfig = {\n\tschemaName: string;\n\tchunkTableName: string;\n\tmigrationTableName: string;\n};\n\ntype ResolvedPgvectorConfig = PgvectorConfig & {\n\tdimensions: number;\n\tdistanceMetric: PgvectorDistanceMetric;\n\textensionName: string;\n\tindex: PgvectorIndexConfig;\n};\n\ntype PgvectorDiagnostics = {\n\tfallbackReason: string | undefined;\n\tlastInitError: string | undefined;\n\tlastQueryError: string | undefined;\n\tlastUpsertError: string | undefined;\n\tlastMigrationError: string | undefined;\n};\n\nconst DEFAULT_SCHEMA_NAME = 'absolute_rag';\nconst DEFAULT_CHUNK_TABLE_NAME = 'chunks';\nconst DEFAULT_MIGRATION_TABLE_NAME = 'migrations';\nconst DEFAULT_DIMENSIONS = 1536;\n\nconst IDENTIFIER_RE = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\nconst assertIdentifier = (value: unknown, label: string): void => {\n\tif (typeof value !== 'string' || !IDENTIFIER_RE.test(value)) {\n\t\tthrow new Error(\n\t\t\t`${ABSOLUTE_POSTGRESQL_RAG_PACKAGE_NAME}: invalid ${label} \"${String(\n\t\t\t\tvalue\n\t\t\t)}\"`\n\t\t);\n\t}\n};\n\nconst quoteIdentifier = (value: string): string => {\n\tassertIdentifier(value, 'identifier');\n\n\treturn `\"${value}\"`;\n};\n\nconst qualifiedTable = (schemaName: string, tableName: string): string =>\n\t`${quoteIdentifier(schemaName)}.${quoteIdentifier(tableName)}`;\n\nconst escapeLiteral = (value: string): string => value.replace(/'/g, \"''\");\n\nconst vectorLiteral = (vector: unknown): string => {\n\tif (!Array.isArray(vector) || vector.length === 0) {\n\t\tthrow new Error(\n\t\t\t`${ABSOLUTE_POSTGRESQL_RAG_PACKAGE_NAME}: vector values must be a non-empty array`\n\t\t);\n\t}\n\n\treturn `[${vector\n\t\t.map((value) => {\n\t\t\tif (typeof value !== 'number' || !Number.isFinite(value)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`${ABSOLUTE_POSTGRESQL_RAG_PACKAGE_NAME}: vector values must be finite numbers`\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn String(value);\n\t\t})\n\t\t.join(',')}]`;\n};\n\nconst makePlaceholder = (\n\tparams: unknown[],\n\tvalue: unknown,\n\tcast = ''\n): string => {\n\tparams.push(value);\n\tconst suffix = cast ? `::${cast}` : '';\n\n\treturn `$${params.length}${suffix}`;\n};\n\nconst normalizeMetric = (\n\tmetric: PgvectorDistanceMetric | undefined\n): PgvectorDistanceMetric => {\n\tif (metric === 'l2' || metric === 'inner_product') {\n\t\treturn metric;\n\t}\n\n\treturn 'cosine';\n};\n\nconst normalizeIndex = (\n\tindex: PgvectorIndexConfig | undefined\n): PgvectorIndexConfig => {\n\tif (!index || index.type === undefined) {\n\t\treturn { type: 'none' };\n\t}\n\n\tif (\n\t\tindex.type === 'hnsw' ||\n\t\tindex.type === 'ivfflat' ||\n\t\tindex.type === 'none'\n\t) {\n\t\treturn index;\n\t}\n\n\tthrow new Error(\n\t\t`${ABSOLUTE_POSTGRESQL_RAG_PACKAGE_NAME}: unsupported pgvector index type \"${String(\n\t\t\t(index as { type: unknown }).type\n\t\t)}\"`\n\t);\n};\n\nconst resolveSchemaConfig = (\n\toptions: Partial<PostgreSQLRAGOptions>\n): ResolvedSchemaConfig => {\n\tconst schemaName = options.schema?.schemaName ?? DEFAULT_SCHEMA_NAME;\n\tconst chunkTableName =\n\t\toptions.schema?.chunkTableName ?? DEFAULT_CHUNK_TABLE_NAME;\n\tconst migrationTableName =\n\t\toptions.schema?.migrationTableName ?? DEFAULT_MIGRATION_TABLE_NAME;\n\n\tassertIdentifier(schemaName, 'schema name');\n\tassertIdentifier(chunkTableName, 'chunk table name');\n\tassertIdentifier(migrationTableName, 'migration table name');\n\n\treturn {\n\t\tschemaName,\n\t\tchunkTableName,\n\t\tmigrationTableName\n\t};\n};\n\nconst resolveVectorConfig = (\n\toptions: Partial<PostgreSQLRAGOptions>\n): ResolvedPgvectorConfig => {\n\tconst vector = options?.vector;\n\n\tif (!vector || vector.provider !== 'pgvector') {\n\t\tthrow new Error(\n\t\t\t`${ABSOLUTE_POSTGRESQL_RAG_PACKAGE_NAME}: PostgreSQL RAG currently requires vector.provider = \"pgvector\"`\n\t\t);\n\t}\n\n\tconst dimensions = vector.dimensions ?? DEFAULT_DIMENSIONS;\n\tif (!Number.isInteger(dimensions) || dimensions <= 0) {\n\t\tthrow new Error(\n\t\t\t`${ABSOLUTE_POSTGRESQL_RAG_PACKAGE_NAME}: dimensions must be a positive integer`\n\t\t);\n\t}\n\n\tconst distanceMetric = normalizeMetric(vector.distanceMetric);\n\tconst index = normalizeIndex(vector.index);\n\n\treturn {\n\t\t...vector,\n\t\tdimensions,\n\t\tdistanceMetric,\n\t\textensionName: vector.extensionName ?? 'vector',\n\t\tindex\n\t};\n};\n\nconst operatorForMetric = (distanceMetric: PgvectorDistanceMetric): string => {\n\tswitch (distanceMetric) {\n\t\tcase 'l2':\n\t\t\treturn '<->';\n\t\tcase 'inner_product':\n\t\t\treturn '<#>';\n\t\tcase 'cosine':\n\t\tdefault:\n\t\t\treturn '<=>';\n\t}\n};\n\nconst operatorClassForMetric = (\n\tdistanceMetric: PgvectorDistanceMetric\n): string => {\n\tswitch (distanceMetric) {\n\t\tcase 'l2':\n\t\t\treturn 'vector_l2_ops';\n\t\tcase 'inner_product':\n\t\t\treturn 'vector_ip_ops';\n\t\tcase 'cosine':\n\t\tdefault:\n\t\t\treturn 'vector_cosine_ops';\n\t}\n};\n\nconst scoreFromDistance = (\n\tdistance: unknown,\n\tdistanceMetric: PgvectorDistanceMetric\n): number => {\n\tif (typeof distance !== 'number' || !Number.isFinite(distance)) {\n\t\treturn 0;\n\t}\n\n\tswitch (distanceMetric) {\n\t\tcase 'inner_product':\n\t\t\treturn -distance;\n\t\tcase 'l2':\n\t\t\treturn 1 / (1 + Math.abs(distance));\n\t\tcase 'cosine':\n\t\tdefault:\n\t\t\treturn 1 - distance;\n\t}\n};\n\nconst createIndexSql = ({\n\tschemaName,\n\tchunkTableName,\n\tdistanceMetric,\n\tindex\n}: {\n\tschemaName: string;\n\tchunkTableName: string;\n\tdistanceMetric: PgvectorDistanceMetric;\n\tindex: PgvectorIndexConfig;\n}): string[] => {\n\tif (!index || index.type === 'none') {\n\t\treturn [];\n\t}\n\n\tconst qualifiedChunkTable = qualifiedTable(schemaName, chunkTableName);\n\tconst opClass = operatorClassForMetric(distanceMetric);\n\tconst indexName = `${chunkTableName}_embedding_${index.type}_${distanceMetric}_idx`;\n\tconst withParts: string[] = [];\n\n\tif (index.type === 'hnsw') {\n\t\tif (Number.isInteger(index.m) && (index.m ?? 0) > 0) {\n\t\t\twithParts.push(`m = ${index.m}`);\n\t\t}\n\t\tif (\n\t\t\tNumber.isInteger(index.efConstruction) &&\n\t\t\t(index.efConstruction ?? 0) > 0\n\t\t) {\n\t\t\twithParts.push(`ef_construction = ${index.efConstruction}`);\n\t\t}\n\t}\n\n\tif (\n\t\tindex.type === 'ivfflat' &&\n\t\tNumber.isInteger(index.lists) &&\n\t\t(index.lists ?? 0) > 0\n\t) {\n\t\twithParts.push(`lists = ${index.lists}`);\n\t}\n\n\tconst withClause =\n\t\twithParts.length > 0 ? ` WITH (${withParts.join(', ')})` : '';\n\n\treturn [\n\t\t`CREATE INDEX IF NOT EXISTS ${quoteIdentifier(\n\t\t\tindexName\n\t\t)} ON ${qualifiedChunkTable} USING ${index.type} (embedding ${opClass})${withClause}`\n\t];\n};\n\nconst createQuerySessionSql = ({\n\tindex\n}: {\n\tindex: PgvectorIndexConfig;\n}): string[] => {\n\tif (!index || index.type === 'none') {\n\t\treturn [];\n\t}\n\n\tconst sql: string[] = [];\n\n\tif (index.type === 'hnsw') {\n\t\tif (Number.isInteger(index.efSearch) && (index.efSearch ?? 0) > 0) {\n\t\t\tsql.push(`SET LOCAL hnsw.ef_search = ${index.efSearch}`);\n\t\t}\n\t\tif (index.iterativeScan && index.iterativeScan !== 'off') {\n\t\t\tsql.push(\n\t\t\t\t`SET LOCAL hnsw.iterative_scan = '${escapeLiteral(\n\t\t\t\t\tindex.iterativeScan\n\t\t\t\t)}'`\n\t\t\t);\n\t\t}\n\t}\n\n\tif (index.type === 'ivfflat') {\n\t\tif (Number.isInteger(index.probes) && (index.probes ?? 0) > 0) {\n\t\t\tsql.push(`SET LOCAL ivfflat.probes = ${index.probes}`);\n\t\t}\n\t\tif (Number.isInteger(index.maxProbes) && (index.maxProbes ?? 0) > 0) {\n\t\t\tsql.push(`SET LOCAL ivfflat.max_probes = ${index.maxProbes}`);\n\t\t}\n\t\tif (index.iterativeScan && index.iterativeScan !== 'off') {\n\t\t\tsql.push(\n\t\t\t\t`SET LOCAL ivfflat.iterative_scan = '${escapeLiteral(\n\t\t\t\t\tindex.iterativeScan\n\t\t\t\t)}'`\n\t\t\t);\n\t\t}\n\t}\n\n\treturn sql;\n};\n\nconst stageOrder: PostgreSQLMigrationStage[] = [\n\t'extension',\n\t'schema' as PostgreSQLMigrationStage,\n\t'table',\n\t'index'\n];\n\nconst buildMigrationName = (\n\tstage: PostgreSQLMigrationStage,\n\tstageIndex: number,\n\tsql: string\n): string => {\n\tconst normalized =\n\t\tsql\n\t\t\t.toLowerCase()\n\t\t\t.replace(/[^a-z0-9]+/g, '_')\n\t\t\t.replace(/^_+|_+$/g, '')\n\t\t\t.slice(0, 48) || 'statement';\n\tconst globalOrder = String(stageOrder.indexOf(stage) + 1).padStart(2, '0');\n\tconst localOrder = String(stageIndex + 1).padStart(3, '0');\n\n\treturn `${globalOrder}_${stage}_${localOrder}_${normalized}`;\n};\n\nconst createMigrationTableSql = (\n\tschemaName: string,\n\tmigrationTableName: string\n): string =>\n\t`CREATE TABLE IF NOT EXISTS ${qualifiedTable(\n\t\tschemaName,\n\t\tmigrationTableName\n\t)} (name TEXT PRIMARY KEY, applied_at TIMESTAMPTZ NOT NULL DEFAULT NOW())`;\n\nconst filterTrackedTableSql = (\n\ttableSql: string[],\n\tschemaName: string,\n\tmigrationTableName: string\n): string[] => {\n\tconst migrationTableTarget = qualifiedTable(schemaName, migrationTableName);\n\n\treturn tableSql.filter((sql) => !sql.includes(migrationTableTarget));\n};\n\nexport const createPostgresSchemaPlan = (\n\toptions: PostgreSQLRAGOptions\n): PostgreSQLSchemaPlan => {\n\tconst schema = resolveSchemaConfig(options ?? {});\n\tconst vector = resolveVectorConfig(options ?? {});\n\tconst qualifiedChunkTable = qualifiedTable(\n\t\tschema.schemaName,\n\t\tschema.chunkTableName\n\t);\n\tconst qualifiedMigrationTable = qualifiedTable(\n\t\tschema.schemaName,\n\t\tschema.migrationTableName\n\t);\n\n\tconst extensionSql =\n\t\tvector.autoCreateExtension === false\n\t\t\t? []\n\t\t\t: [\n\t\t\t\t\t`CREATE EXTENSION IF NOT EXISTS ${quoteIdentifier(\n\t\t\t\t\t\tvector.extensionName\n\t\t\t\t\t)}`\n\t\t\t\t];\n\n\tconst schemaSql =\n\t\tvector.autoCreateSchema === false\n\t\t\t? []\n\t\t\t: [\n\t\t\t\t\t`CREATE SCHEMA IF NOT EXISTS ${quoteIdentifier(\n\t\t\t\t\t\tschema.schemaName\n\t\t\t\t\t)}`\n\t\t\t\t];\n\n\tconst tableSql =\n\t\tvector.autoCreateTables === false\n\t\t\t? []\n\t\t\t: [\n\t\t\t\t\t`CREATE TABLE IF NOT EXISTS ${qualifiedChunkTable} (id BIGSERIAL PRIMARY KEY, chunk_id TEXT NOT NULL UNIQUE, text TEXT NOT NULL, title TEXT, source TEXT, metadata JSONB NOT NULL DEFAULT '{}'::jsonb, embedding VECTOR(${vector.dimensions}) NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW())`,\n\t\t\t\t\t`CREATE INDEX IF NOT EXISTS ${quoteIdentifier(\n\t\t\t\t\t\t`${schema.chunkTableName}_chunk_id_idx`\n\t\t\t\t\t)} ON ${qualifiedChunkTable} (chunk_id)`,\n\t\t\t\t\t`CREATE INDEX IF NOT EXISTS ${quoteIdentifier(\n\t\t\t\t\t\t`${schema.chunkTableName}_source_idx`\n\t\t\t\t\t)} ON ${qualifiedChunkTable} (source)`,\n\t\t\t\t\t`CREATE INDEX IF NOT EXISTS ${quoteIdentifier(\n\t\t\t\t\t\t`${schema.chunkTableName}_metadata_idx`\n\t\t\t\t\t)} ON ${qualifiedChunkTable} USING GIN (metadata)`,\n\t\t\t\t\tcreateMigrationTableSql(\n\t\t\t\t\t\tschema.schemaName,\n\t\t\t\t\t\tschema.migrationTableName\n\t\t\t\t\t)\n\t\t\t\t];\n\n\tconst indexSql =\n\t\tvector.autoCreateIndex === false\n\t\t\t? []\n\t\t\t: createIndexSql({\n\t\t\t\t\tschemaName: schema.schemaName,\n\t\t\t\t\tchunkTableName: schema.chunkTableName,\n\t\t\t\t\tdistanceMetric: vector.distanceMetric,\n\t\t\t\t\tindex: vector.index\n\t\t\t\t});\n\n\treturn {\n\t\timplementation: 'pgvector',\n\t\textensionSql,\n\t\tschemaSql,\n\t\ttableSql,\n\t\tindexSql,\n\t\tquerySessionSql: createQuerySessionSql({ index: vector.index }),\n\t\tmigrationTableQualifiedName: qualifiedMigrationTable\n\t};\n};\n\nexport const createPostgresMigrationPlan = (\n\toptions: PostgreSQLRAGOptions\n): PostgreSQLMigrationPlan => {\n\tconst schema = resolveSchemaConfig(options ?? {});\n\tconst schemaPlan = createPostgresSchemaPlan(options ?? ({} as PostgreSQLRAGOptions));\n\tconst bootstrapSql: string[] = [];\n\n\tif (schemaPlan.schemaSql.length > 0) {\n\t\tbootstrapSql.push(...schemaPlan.schemaSql);\n\t}\n\n\tconst migrationTableSql = createMigrationTableSql(\n\t\tschema.schemaName,\n\t\tschema.migrationTableName\n\t);\n\tif (!bootstrapSql.includes(migrationTableSql)) {\n\t\tbootstrapSql.push(migrationTableSql);\n\t}\n\n\tconst migrations: PostgreSQLMigrationEntry[] = [\n\t\t...schemaPlan.extensionSql.map((sql, index) => ({\n\t\t\tstage: 'extension' as PostgreSQLMigrationStage,\n\t\t\tsql,\n\t\t\tstageIndex: index\n\t\t})),\n\t\t...filterTrackedTableSql(\n\t\t\tschemaPlan.tableSql,\n\t\t\tschema.schemaName,\n\t\t\tschema.migrationTableName\n\t\t).map((sql, index) => ({\n\t\t\tstage: 'table' as PostgreSQLMigrationStage,\n\t\t\tsql,\n\t\t\tstageIndex: index\n\t\t})),\n\t\t...schemaPlan.indexSql.map((sql, index) => ({\n\t\t\tstage: 'index' as PostgreSQLMigrationStage,\n\t\t\tsql,\n\t\t\tstageIndex: index\n\t\t}))\n\t].map((entry) => ({\n\t\tname: buildMigrationName(entry.stage, entry.stageIndex, entry.sql),\n\t\tstage: entry.stage,\n\t\tsql: entry.sql\n\t}));\n\n\treturn {\n\t\timplementation: schemaPlan.implementation,\n\t\tschemaName: schema.schemaName,\n\t\tmigrationTableName: schema.migrationTableName,\n\t\tmigrationTableQualifiedName: qualifiedTable(\n\t\t\tschema.schemaName,\n\t\t\tschema.migrationTableName\n\t\t),\n\t\tbootstrapSql,\n\t\tmigrations,\n\t\tschemaPlan\n\t};\n};\n\ntype RawPostgresClient = {\n\tunsafe: (\n\t\tqueryText: string,\n\t\tparams?: unknown[]\n\t) => Promise<unknown[] & { count?: number }>;\n\tbegin: <T>(run: (transactionSql: RawPostgresClient) => Promise<T>) => Promise<T>;\n\tend?: (options?: { timeout?: number }) => Promise<void>;\n};\n\nconst createWrappedPostgresClient = (\n\tsql: RawPostgresClient,\n\trootSql: RawPostgresClient = sql\n): PostgreSQLRAGClient => ({\n\tquery: async <TRow = Record<string, unknown>>(\n\t\tqueryText: string,\n\t\tparams: unknown[] = []\n\t) => {\n\t\tconst rows = await sql.unsafe(queryText, params);\n\n\t\treturn {\n\t\t\trows: rows as TRow[],\n\t\t\trowCount: typeof rows.count === 'number' ? rows.count : rows.length\n\t\t};\n\t},\n\ttransaction: async <T>(run: (client: PostgreSQLRAGClient) => Promise<T>) =>\n\t\trootSql.begin(async (transactionSql) =>\n\t\t\trun(createWrappedPostgresClient(transactionSql, transactionSql))\n\t\t),\n\tclose: async () => {\n\t\tif (typeof rootSql.end === 'function') {\n\t\t\tawait rootSql.end({ timeout: 5 });\n\t\t}\n\t}\n});\n\nconst createDefaultPostgresClientFactory = (\n\toptions: PostgreSQLRAGOptions\n): (() => Promise<PostgreSQLRAGClient>) | undefined => {\n\tconst connectionString =\n\t\ttypeof options.connectionString === 'string'\n\t\t\t? options.connectionString.trim()\n\t\t\t: '';\n\n\tif (connectionString.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tlet clientPromise: Promise<PostgreSQLRAGClient> | undefined;\n\n\treturn async () => {\n\t\tif (!clientPromise) {\n\t\t\tclientPromise = (async () => {\n\t\t\t\tconst postgresModule = await import('postgres');\n\t\t\t\tconst postgres = postgresModule.default;\n\t\t\t\tconst sql = postgres(connectionString, {\n\t\t\t\t\tonnotice: () => {},\n\t\t\t\t\t...(options.driver ?? {})\n\t\t\t\t}) as unknown as RawPostgresClient;\n\n\t\t\t\treturn createWrappedPostgresClient(sql, sql);\n\t\t\t})();\n\t\t}\n\n\t\treturn clientPromise;\n\t};\n};\n\nconst resolveClientFactory = (\n\toptions: PostgreSQLRAGOptions\n): (() => Promise<PostgreSQLRAGClient>) => {\n\tif (typeof options.clientFactory === 'function') {\n\t\tconst { clientFactory } = options;\n\n\t\treturn async () => clientFactory();\n\t}\n\n\tif (options.client) {\n\t\tconst { client } = options;\n\n\t\treturn async () => client;\n\t}\n\n\tconst defaultFactory = createDefaultPostgresClientFactory(options);\n\tif (defaultFactory) {\n\t\treturn defaultFactory;\n\t}\n\n\treturn async () => {\n\t\tthrow new Error(\n\t\t\t`${ABSOLUTE_POSTGRESQL_RAG_PACKAGE_NAME}: createPostgresRAG requires connectionString, client, or clientFactory.`\n\t\t);\n\t};\n};\n\nconst buildMetadataFilter = (\n\tfilter: Record<string, unknown> | undefined\n): Record<string, unknown> | undefined => {\n\tif (!filter) {\n\t\treturn undefined;\n\t}\n\n\tconst metadataEntries = Object.entries(filter).filter(\n\t\t([key]) => key !== 'chunkId' && key !== 'title' && key !== 'source'\n\t);\n\n\tif (metadataEntries.length === 0) {\n\t\treturn undefined;\n\t}\n\n\treturn Object.fromEntries(metadataEntries);\n};\n\nconst parseMetadataValue = (\n\tvalue: unknown\n): Record<string, unknown> | undefined => {\n\tif (value === null || value === undefined) {\n\t\treturn undefined;\n\t}\n\n\tif (typeof value === 'string') {\n\t\ttry {\n\t\t\tconst parsed = JSON.parse(value);\n\t\t\tif (parsed && typeof parsed === 'object') {\n\t\t\t\treturn parsed as Record<string, unknown>;\n\t\t\t}\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t}\n\n\tif (typeof value === 'object') {\n\t\treturn value as Record<string, unknown>;\n\t}\n\n\treturn undefined;\n};\n\nconst createPgvectorStoreStatus = ({\n\tvector,\n\tschema,\n\tdiagnostics,\n\tinitialized\n}: {\n\tvector: ResolvedPgvectorConfig;\n\tschema: ResolvedSchemaConfig;\n\tdiagnostics: PgvectorDiagnostics;\n\tinitialized: boolean;\n}): RAGVectorStoreStatus =>\n\t({\n\t\tbackend: 'postgres',\n\t\tvectorMode: 'native_pgvector',\n\t\tdimensions: vector.dimensions,\n\t\tnative: {\n\t\t\trequested: true,\n\t\t\tavailable: initialized && !diagnostics.lastInitError,\n\t\t\tactive: initialized && !diagnostics.lastInitError,\n\t\t\tmode: 'pgvector',\n\t\t\textensionName: vector.extensionName,\n\t\t\tschemaName: schema.schemaName,\n\t\t\ttableName: schema.chunkTableName,\n\t\t\tdistanceMetric: vector.distanceMetric,\n\t\t\tindexType: vector.index.type,\n\t\t\tfallbackReason: diagnostics.fallbackReason,\n\t\t\tlastInitError: diagnostics.lastInitError,\n\t\t\tlastQueryError: diagnostics.lastQueryError,\n\t\t\tlastUpsertError: diagnostics.lastUpsertError,\n\t\t\tlastMigrationError: diagnostics.lastMigrationError\n\t\t}\n\t}) as unknown as RAGVectorStoreStatus;\n\nconst getAppliedMigrationNames = async (\n\tclient: PostgreSQLRAGClient,\n\tmigrationPlan: PostgreSQLMigrationPlan\n): Promise<Set<string>> => {\n\tconst result = await client.query<{ name: unknown }>(\n\t\t`SELECT name FROM ${migrationPlan.migrationTableQualifiedName} ORDER BY name ASC`\n\t);\n\n\treturn new Set(result.rows.map((row) => String(row.name)));\n};\n\nconst insertAppliedMigration = async (\n\tclient: PostgreSQLRAGClient,\n\tmigrationPlan: PostgreSQLMigrationPlan,\n\tname: string\n): Promise<void> => {\n\tawait client.query(\n\t\t`INSERT INTO ${migrationPlan.migrationTableQualifiedName} (name) VALUES ($1) ON CONFLICT (name) DO NOTHING`,\n\t\t[name]\n\t);\n};\n\nconst executeMigrationSequence = async (\n\tclient: PostgreSQLRAGClient,\n\tmigrationPlan: PostgreSQLMigrationPlan,\n\tmigrations: PostgreSQLMigrationEntry[]\n): Promise<string[]> => {\n\tconst appliedNames: string[] = [];\n\n\tfor (const migration of migrations) {\n\t\tawait client.query(migration.sql);\n\t\tawait insertAppliedMigration(client, migrationPlan, migration.name);\n\t\tappliedNames.push(migration.name);\n\t}\n\n\treturn appliedNames;\n};\n\nexport const applyPostgresMigrations = async (\n\toptions: PostgreSQLRAGOptions,\n\tapplyOptions: PostgreSQLApplyMigrationsOptions = {}\n): Promise<PostgreSQLApplyMigrationsResult> => {\n\tconst migrationPlan = createPostgresMigrationPlan(\n\t\toptions ?? ({} as PostgreSQLRAGOptions)\n\t);\n\tconst injectedClient = applyOptions.client;\n\tconst getClient = injectedClient\n\t\t? async () => injectedClient\n\t\t: resolveClientFactory(options ?? ({} as PostgreSQLRAGOptions));\n\tconst client = await getClient();\n\n\tfor (const sql of migrationPlan.bootstrapSql) {\n\t\tawait client.query(sql);\n\t}\n\n\tconst alreadyApplied = await getAppliedMigrationNames(client, migrationPlan);\n\tconst pendingMigrations = migrationPlan.migrations.filter(\n\t\t(migration) => !alreadyApplied.has(migration.name)\n\t);\n\tconst skippedNames = migrationPlan.migrations\n\t\t.filter((migration) => alreadyApplied.has(migration.name))\n\t\t.map((migration) => migration.name);\n\n\tif (applyOptions.dryRun === true) {\n\t\treturn {\n\t\t\tmigrationPlan,\n\t\t\tappliedNames: [],\n\t\t\tskippedNames,\n\t\t\tpendingNames: pendingMigrations.map((migration) => migration.name),\n\t\t\tappliedCount: 0,\n\t\t\tpendingCount: pendingMigrations.length,\n\t\t\tdryRun: true\n\t\t};\n\t}\n\n\tconst run = async (\n\t\tactiveClient: PostgreSQLRAGClient\n\t): Promise<PostgreSQLApplyMigrationsResult> => {\n\t\tconst names = await executeMigrationSequence(\n\t\t\tactiveClient,\n\t\t\tmigrationPlan,\n\t\t\tpendingMigrations\n\t\t);\n\n\t\treturn {\n\t\t\tmigrationPlan,\n\t\t\tappliedNames: names,\n\t\t\tskippedNames,\n\t\t\tpendingNames: pendingMigrations.map((migration) => migration.name),\n\t\t\tappliedCount: names.length,\n\t\t\tpendingCount: pendingMigrations.length,\n\t\t\tdryRun: false\n\t\t};\n\t};\n\n\tif (\n\t\ttypeof client.transaction === 'function' &&\n\t\tpendingMigrations.length > 0\n\t) {\n\t\treturn client.transaction(async (transactionClient) =>\n\t\t\trun(transactionClient)\n\t\t);\n\t}\n\n\treturn run(client);\n};\n\nexport const applyPostgresSchemaPlan: typeof applyPostgresMigrations =\n\tapplyPostgresMigrations;\n\nexport const createPgvectorStore = (\n\toptions: PostgreSQLRAGOptions\n): RAGVectorStore => {\n\tconst vector = resolveVectorConfig(options ?? {});\n\tconst schema = resolveSchemaConfig(options ?? {});\n\tconst plan = createPostgresSchemaPlan(options ?? ({} as PostgreSQLRAGOptions));\n\tconst getClient = resolveClientFactory(options ?? ({} as PostgreSQLRAGOptions));\n\tconst diagnostics: PgvectorDiagnostics = {\n\t\tfallbackReason: undefined,\n\t\tlastInitError: undefined,\n\t\tlastQueryError: undefined,\n\t\tlastUpsertError: undefined,\n\t\tlastMigrationError: undefined\n\t};\n\tlet initialized = false;\n\tlet initPromise: Promise<void> | undefined;\n\n\tconst ensureInitialized = async (): Promise<void> => {\n\t\tif (initialized) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!initPromise) {\n\t\t\tinitPromise = (async () => {\n\t\t\t\ttry {\n\t\t\t\t\tconst client = await getClient();\n\t\t\t\t\tawait applyPostgresMigrations(options ?? {}, { client });\n\t\t\t\t\tinitialized = true;\n\t\t\t\t\tdiagnostics.lastInitError = undefined;\n\t\t\t\t\tdiagnostics.lastMigrationError = undefined;\n\t\t\t\t\tdiagnostics.fallbackReason = undefined;\n\t\t\t\t} catch (error) {\n\t\t\t\t\tinitialized = false;\n\t\t\t\t\tconst message =\n\t\t\t\t\t\terror instanceof Error ? error.message : String(error);\n\t\t\t\t\tdiagnostics.lastInitError = message;\n\t\t\t\t\tdiagnostics.lastMigrationError = message;\n\t\t\t\t\tdiagnostics.fallbackReason = message;\n\t\t\t\t\tthrow error;\n\t\t\t\t}\n\t\t\t})();\n\t\t}\n\n\t\treturn initPromise;\n\t};\n\n\tconst embed: RAGVectorStore['embed'] = async (input) => {\n\t\tif (typeof options.embedding === 'function') {\n\t\t\tconst result = await options.embedding(input);\n\n\t\t\treturn normalizeVector(result);\n\t\t}\n\n\t\treturn normalizeVector([\n\t\t\t...createRAGVector(input.text, vector.dimensions)\n\t\t]);\n\t};\n\n\tconst query = async (input: RAGQueryInput): Promise<RAGQueryResult[]> => {\n\t\tawait ensureInitialized();\n\t\tconst client = await getClient();\n\t\tconst params: unknown[] = [];\n\t\tconst qualifiedChunkTable = qualifiedTable(\n\t\t\tschema.schemaName,\n\t\t\tschema.chunkTableName\n\t\t);\n\t\tconst operator = operatorForMetric(vector.distanceMetric);\n\t\tconst vectorPlaceholder = makePlaceholder(\n\t\t\tparams,\n\t\t\tvectorLiteral(normalizeVector(input.queryVector)),\n\t\t\t'vector'\n\t\t);\n\t\tconst limitPlaceholder = makePlaceholder(params, input.topK);\n\t\tconst whereParts: string[] = [];\n\t\tconst filter = input.filter as Record<string, unknown> | undefined;\n\n\t\tif (filter?.chunkId !== undefined) {\n\t\t\twhereParts.push(\n\t\t\t\t`chunk_id = ${makePlaceholder(params, filter.chunkId)}`\n\t\t\t);\n\t\t}\n\t\tif (filter?.title !== undefined) {\n\t\t\twhereParts.push(`title = ${makePlaceholder(params, filter.title)}`);\n\t\t}\n\t\tif (filter?.source !== undefined) {\n\t\t\twhereParts.push(\n\t\t\t\t`source = ${makePlaceholder(params, filter.source)}`\n\t\t\t);\n\t\t}\n\n\t\tconst metadataFilter = buildMetadataFilter(filter);\n\t\tif (metadataFilter) {\n\t\t\twhereParts.push(\n\t\t\t\t`metadata @> ${makePlaceholder(\n\t\t\t\t\tparams,\n\t\t\t\t\tJSON.stringify(metadataFilter),\n\t\t\t\t\t'jsonb'\n\t\t\t\t)}`\n\t\t\t);\n\t\t}\n\n\t\tconst whereSql =\n\t\t\twhereParts.length > 0 ? `WHERE ${whereParts.join(' AND ')}` : '';\n\t\tconst sessionSql = plan.querySessionSql;\n\t\tconst selectSql = `SELECT chunk_id, text, title, source, metadata, embedding ${operator} ${vectorPlaceholder} AS distance FROM ${qualifiedChunkTable} ${whereSql} ORDER BY distance ASC LIMIT ${limitPlaceholder}`;\n\n\t\ttry {\n\t\t\tfor (const sql of sessionSql) {\n\t\t\t\tawait client.query(sql);\n\t\t\t}\n\n\t\t\tconst result = await client.query<{\n\t\t\t\tchunk_id: string;\n\t\t\t\ttext: string;\n\t\t\t\ttitle: string | null;\n\t\t\t\tsource: string | null;\n\t\t\t\tmetadata: unknown;\n\t\t\t\tdistance: unknown;\n\t\t\t}>(selectSql, params);\n\n\t\t\treturn result.rows.map((row) => ({\n\t\t\t\tchunkId: row.chunk_id,\n\t\t\t\tchunkText: row.text,\n\t\t\t\ttitle: row.title ?? undefined,\n\t\t\t\tsource: row.source ?? undefined,\n\t\t\t\tmetadata: parseMetadataValue(row.metadata),\n\t\t\t\tscore: scoreFromDistance(\n\t\t\t\t\tNumber(row.distance),\n\t\t\t\t\tvector.distanceMetric\n\t\t\t\t)\n\t\t\t}));\n\t\t} catch (error) {\n\t\t\tdiagnostics.lastQueryError =\n\t\t\t\terror instanceof Error ? error.message : String(error);\n\t\t\tthrow error;\n\t\t}\n\t};\n\n\tconst upsert = async (input: RAGUpsertInput): Promise<void> => {\n\t\tawait ensureInitialized();\n\t\tconst client = await getClient();\n\t\tconst qualifiedChunkTable = qualifiedTable(\n\t\t\tschema.schemaName,\n\t\t\tschema.chunkTableName\n\t\t);\n\t\tconst sql = `INSERT INTO ${qualifiedChunkTable} (chunk_id, text, title, source, metadata, embedding, updated_at) VALUES ($1, $2, $3, $4, $5::jsonb, $6::vector, NOW()) ON CONFLICT (chunk_id) DO UPDATE SET text = EXCLUDED.text, title = EXCLUDED.title, source = EXCLUDED.source, metadata = EXCLUDED.metadata, embedding = EXCLUDED.embedding, updated_at = NOW()`;\n\n\t\ttry {\n\t\t\tfor (const chunk of input.chunks) {\n\t\t\t\tconst vectorValue =\n\t\t\t\t\tArray.isArray(chunk.embedding) && chunk.embedding.length > 0\n\t\t\t\t\t\t? normalizeVector(chunk.embedding)\n\t\t\t\t\t\t: await embed({ text: chunk.text });\n\t\t\t\tawait client.query(sql, [\n\t\t\t\t\tchunk.chunkId,\n\t\t\t\t\tchunk.text,\n\t\t\t\t\tchunk.title ?? null,\n\t\t\t\t\tchunk.source ?? null,\n\t\t\t\t\tJSON.stringify(chunk.metadata ?? {}),\n\t\t\t\t\tvectorLiteral(vectorValue)\n\t\t\t\t]);\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tdiagnostics.lastUpsertError =\n\t\t\t\terror instanceof Error ? error.message : String(error);\n\t\t\tthrow error;\n\t\t}\n\t};\n\n\tconst clear = async (): Promise<void> => {\n\t\tawait ensureInitialized();\n\t\tconst client = await getClient();\n\t\tconst qualifiedChunkTable = qualifiedTable(\n\t\t\tschema.schemaName,\n\t\t\tschema.chunkTableName\n\t\t);\n\t\tawait client.query(`DELETE FROM ${qualifiedChunkTable}`);\n\t};\n\n\treturn {\n\t\tembed,\n\t\tquery,\n\t\tupsert,\n\t\tclear,\n\t\tgetCapabilities: () => ({\n\t\t\tbackend: 'postgres',\n\t\t\tpersistence: 'external',\n\t\t\tnativeVectorSearch: true,\n\t\t\tserverSideFiltering: true,\n\t\t\tstreamingIngestStatus: false\n\t\t}),\n\t\tgetStatus: () =>\n\t\t\tcreatePgvectorStoreStatus({\n\t\t\t\tvector,\n\t\t\t\tschema,\n\t\t\t\tdiagnostics,\n\t\t\t\tinitialized\n\t\t\t})\n\t} as RAGVectorStore;\n};\n\nexport const createPostgresRAGCollection = (\n\toptions: PostgreSQLRAGOptions\n): RAGCollection =>\n\tcreateRAGCollection({\n\t\tstore: createPgvectorStore(options)\n\t});\n\nexport const createPostgresRAG = (\n\toptions: PostgreSQLRAGOptions\n): PostgreSQLRAG => {\n\tconst store = createPgvectorStore(options);\n\tconst collection = createRAGCollection({ store });\n\tconst schemaPlan = createPostgresSchemaPlan(options);\n\tconst migrationPlan = createPostgresMigrationPlan(options);\n\n\treturn {\n\t\tstore,\n\t\tcollection,\n\t\tgetStatus: () => store.getStatus?.(),\n\t\tgetCapabilities: () => store.getCapabilities?.(),\n\t\tgetSchemaPlan: () => schemaPlan,\n\t\tgetMigrationPlan: () => migrationPlan,\n\t\tapplyMigrations: (applyOptions) =>\n\t\t\tapplyPostgresMigrations(options, applyOptions)\n\t};\n};\n\nexport const createPostgreSQLRAG: typeof createPostgresRAG = createPostgresRAG;\n"
|
|
5
|
+
"import type {\n\tRAGBackendCapabilities,\n\tRAGCollection,\n\tRAGVectorStore,\n\tRAGVectorStoreStatus\n} from '@absolutejs/rag/adapter-kit';\nimport { createRAGCollection, ragPlugin } from '@absolutejs/rag/adapter-kit';\nimport { createPostgresRAGStore } from './createPostgresRAGStore';\nimport type { PostgresRAGStoreOptions } from './types';\n\nexport const ABSOLUTE_POSTGRESQL_RAG_PACKAGE_NAME = '@absolutejs/rag-postgres';\n\nexport type PostgresRAGCollectionOptions = {\n\tstore?: RAGVectorStore;\n\tstoreOptions?: PostgresRAGStoreOptions;\n};\n\nexport type PostgresRAGOptions = {\n\tstore?: RAGVectorStore;\n\tcollection?: RAGCollection;\n\tstoreOptions?: PostgresRAGStoreOptions;\n};\n\nexport type PostgresRAG = {\n\tstore: RAGVectorStore;\n\tcollection: RAGCollection;\n\tgetStatus: () => RAGVectorStoreStatus | undefined;\n\tgetCapabilities: () => RAGBackendCapabilities | undefined;\n};\n\nexport const createPostgresRAGCollection = (\n\toptions: PostgresRAGCollectionOptions = {}\n): RAGCollection => {\n\tconst store =\n\t\toptions.store ?? createPostgresRAGStore(options.storeOptions ?? {});\n\n\treturn createRAGCollection({ store });\n};\n\nexport const createPostgresRAG = (\n\toptions: PostgresRAGOptions = {}\n): PostgresRAG => {\n\tconst store =\n\t\toptions.store ?? createPostgresRAGStore(options.storeOptions ?? {});\n\tconst collection = options.collection ?? createRAGCollection({ store });\n\n\treturn {\n\t\tstore,\n\t\tcollection,\n\t\tgetStatus: () => collection.getStatus?.() ?? store.getStatus?.(),\n\t\tgetCapabilities: () =>\n\t\t\tcollection.getCapabilities?.() ?? store.getCapabilities?.()\n\t};\n};\n\nexport const createPostgreSQLRAG: typeof createPostgresRAG = createPostgresRAG;\n\nexport { createPostgresRAGStore, createRAGCollection, ragPlugin };\n\nexport type {\n\tPostgresRAGStoreOptions,\n\tRAGBackendCapabilities,\n\tRAGCollection,\n\tRAGVectorStore,\n\tRAGVectorStoreStatus\n};\n",
|
|
6
|
+
"import type {\n\tRAGBackendCapabilities,\n\tRAGLexicalQueryInput,\n\tRAGPostgresNativeDiagnostics,\n\tRAGQueryInput,\n\tRAGUpsertInput,\n\tRAGVectorCountInput,\n\tRAGVectorDeleteInput,\n\tRAGVectorStore,\n\tRAGVectorStoreStatus\n} from \"@absolutejs/rag/adapter-kit\";\nimport {\n\tcreateRAGVector,\n\tmatchesMetadataFilterRecord,\n\tnormalizeVector,\n\tplanNativeCandidateSearchBackfillK,\n\tplanNativeCandidateSearchK,\n\tRAG_NATIVE_QUERY_CANDIDATE_LIMIT,\n\tRAG_VECTOR_DIMENSIONS_DEFAULT,\n\trankRAGLexicalMatches,\n\tresolveAdaptiveNativeCandidateLimit,\n\tsummarizeSQLiteCandidateCoverage\n} from \"@absolutejs/rag/adapter-kit\";\nimport type { PostgresRAGStoreOptions } from \"./types\";\n\nconst DEFAULT_DIMENSIONS = RAG_VECTOR_DIMENSIONS_DEFAULT;\nconst DEFAULT_TABLE_NAME = \"rag_chunks\";\nconst DEFAULT_SCHEMA_NAME = \"public\";\nconst DEFAULT_QUERY_MULTIPLIER = 4;\nconst MAX_QUERY_MULTIPLIER = 16;\nconst DEFAULT_POSTGRES_INDEX_TYPE = \"hnsw\";\nconst DEFAULT_POSTGRES_IVFFLAT_LISTS = 100;\nconst DEFAULT_POSTGRES_HNSW_M = 16;\nconst DEFAULT_POSTGRES_HNSW_EF_CONSTRUCTION = 64;\nconst IDENTIFIER_RE = /^[a-zA-Z_][a-zA-Z0-9_]*$/;\nconst FILTER_PATH_SEGMENT_RE = /^[a-zA-Z0-9_]+$/;\n\ntype BunSQLClient = InstanceType<typeof Bun.SQL>;\ntype PostgresDistanceMetric = \"cosine\" | \"l2\" | \"inner_product\";\ntype PostgresIndexType = \"none\" | \"hnsw\" | \"ivfflat\";\n\ntype InternalChunk = {\n chunkId: string;\n text: string;\n title?: string;\n source?: string;\n metadata?: Record<string, unknown>;\n vector: number[];\n};\n\ntype PostgresStoredRow = {\n chunk_id: string;\n text: string;\n title: string | null;\n source: string | null;\n metadata: unknown;\n embedding?: string | null;\n distance?: number | null;\n};\n\ntype PostgresHealthRow = {\n estimated_row_count?: unknown;\n table_bytes?: unknown;\n index_bytes?: unknown;\n total_bytes?: unknown;\n index_present?: unknown;\n};\n\nconst isObjectFilterRecord = (\n value: unknown,\n): value is Record<string, unknown> =>\n Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n\nconst isNestedFilterArray = (\n value: unknown,\n): value is Record<string, unknown>[] =>\n Array.isArray(value) && value.every((entry) => isObjectFilterRecord(entry));\n\nconst isOperatorFilterRecord = (\n value: unknown,\n): value is Record<string, unknown> =>\n isObjectFilterRecord(value) &&\n Object.keys(value).some((key) => key.startsWith(\"$\"));\n\nconst countFilterClauses = (filter?: Record<string, unknown>) => {\n if (!filter) {\n return 0;\n }\n\n let count = 0;\n for (const [key, value] of Object.entries(filter)) {\n if (key === \"$and\" || key === \"$or\") {\n if (isNestedFilterArray(value)) {\n count += value.reduce(\n (total, entry) => total + countFilterClauses(entry),\n 0,\n );\n }\n continue;\n }\n\n if (key === \"$not\") {\n if (isObjectFilterRecord(value)) {\n count += countFilterClauses(value);\n }\n continue;\n }\n\n count += 1;\n }\n\n return count;\n};\n\nconst toPostgresJsonPath = (key: string) => {\n const segments = key.split(\".\").filter(Boolean);\n if (\n segments.length === 0 ||\n !segments.every((segment) => FILTER_PATH_SEGMENT_RE.test(segment))\n ) {\n return null;\n }\n\n return segments;\n};\n\nconst toPostgresFilterBinding = (value: unknown) => {\n if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\" ||\n value === null\n ) {\n return value;\n }\n\n return undefined;\n};\n\nconst buildPostgresJsonbScalarEquality = (input: {\n comparison?: \"=\" | \"<>\";\n valueSql: string;\n}) => {\n const comparison = input.comparison ?? \"=\";\n return comparison === \"=\"\n ? `jsonb_typeof(${input.valueSql}) = 'null'`\n : `coalesce(jsonb_typeof(${input.valueSql}), 'missing') <> 'null'`;\n};\n\nconst buildPostgresMetadataScalarEquality = (input: {\n actualSql: string;\n bind: (value: unknown) => string;\n comparison?: \"=\" | \"<>\";\n value: string | number | boolean | null;\n valueSql: string;\n}) =>\n input.value === null\n ? buildPostgresJsonbScalarEquality({\n comparison: input.comparison,\n valueSql: input.valueSql,\n })\n : `${input.actualSql} ${input.comparison ?? \"=\"} ${input.bind(String(input.value))}`;\n\nconst buildPostgresFilterPlan = (\n filter: Record<string, unknown> | undefined,\n startIndex = 0,\n): { clause: string; params: unknown[] } | null => {\n if (!filter) {\n return { clause: \"\", params: [] };\n }\n\n const params: unknown[] = [];\n const bind = (value: unknown) => {\n params.push(value);\n return `$${params.length + startIndex}`;\n };\n const build = (entry: Record<string, unknown>): string | null => {\n const clauses: string[] = [];\n\n for (const [key, value] of Object.entries(entry)) {\n if (key === \"$and\" || key === \"$or\") {\n if (!isNestedFilterArray(value) || value.length === 0) {\n return null;\n }\n\n const nested = value.map((item) => build(item));\n if (nested.some((item) => item === null)) {\n return null;\n }\n\n clauses.push(\n `(${nested\n .filter((item): item is string => Boolean(item))\n .join(key === \"$and\" ? \" AND \" : \" OR \")})`,\n );\n continue;\n }\n\n if (key === \"$not\") {\n if (!isObjectFilterRecord(value)) {\n return null;\n }\n\n const nested = build(value);\n if (!nested) {\n return null;\n }\n\n clauses.push(`NOT (${nested})`);\n continue;\n }\n\n const isScalarField =\n key === \"chunkId\" || key === \"source\" || key === \"title\";\n const jsonPath = isScalarField ? null : toPostgresJsonPath(key);\n if (!isScalarField && !jsonPath) {\n return null;\n }\n let actualSql: string;\n let metadataPathSegments: string[] = [];\n let metadataValueSql: string | undefined;\n if (isScalarField) {\n actualSql = key === \"chunkId\" ? \"chunk_id\" : key;\n } else {\n metadataPathSegments = jsonPath ?? [];\n actualSql = `jsonb_extract_path_text(metadata, ${metadataPathSegments\n .map((segment) => `'${segment}'`)\n .join(\", \")})`;\n metadataValueSql = `metadata #> '{${metadataPathSegments.join(\",\")}}'`;\n }\n\n if (!isOperatorFilterRecord(value)) {\n const binding = toPostgresFilterBinding(value);\n if (binding === undefined) {\n return null;\n }\n\n clauses.push(\n isScalarField\n ? `${actualSql} = ${bind(String(binding))}`\n : buildPostgresMetadataScalarEquality({\n actualSql,\n bind,\n value: binding,\n valueSql: metadataValueSql!,\n }),\n );\n continue;\n }\n\n const operatorClauses = Object.entries(value).map(\n ([operator, expected]) => {\n switch (operator) {\n case \"$exists\":\n return isScalarField\n ? expected\n ? `${actualSql} IS NOT NULL`\n : `${actualSql} IS NULL`\n : expected\n ? `${metadataValueSql} IS NOT NULL`\n : `${metadataValueSql} IS NULL`;\n case \"$in\": {\n if (!Array.isArray(expected) || expected.length === 0) {\n return null;\n }\n\n const bindings = expected\n .map((entry) => toPostgresFilterBinding(entry))\n .filter(\n (entry): entry is string | number | boolean =>\n entry !== undefined,\n );\n if (bindings.length !== expected.length) {\n return null;\n }\n\n return isScalarField\n ? `${actualSql} IN (${bindings\n .map((entry) => bind(String(entry)))\n .join(\", \")})`\n : `(${bindings\n .map((entry) =>\n buildPostgresMetadataScalarEquality({\n actualSql,\n bind,\n value: entry,\n valueSql: metadataValueSql!,\n }),\n )\n .join(\" OR \")})`;\n }\n case \"$ne\": {\n const binding = toPostgresFilterBinding(expected);\n return binding === undefined\n ? null\n : isScalarField\n ? `${actualSql} <> ${bind(String(binding))}`\n : buildPostgresMetadataScalarEquality({\n actualSql,\n bind,\n comparison: \"<>\",\n value: binding,\n valueSql: metadataValueSql!,\n });\n }\n case \"$gt\":\n case \"$gte\":\n case \"$lt\":\n case \"$lte\": {\n if (typeof expected !== \"number\" || !Number.isFinite(expected)) {\n return null;\n }\n const comparison =\n operator === \"$gt\"\n ? \">\"\n : operator === \"$gte\"\n ? \">=\"\n : operator === \"$lt\"\n ? \"<\"\n : \"<=\";\n return `((${actualSql}) ~ '^-?[0-9]+(\\\\.[0-9]+)?$' AND (${actualSql})::double precision ${comparison} ${bind(expected)})`;\n }\n case \"$contains\":\n if (isScalarField) {\n return null;\n }\n if (toPostgresFilterBinding(expected) === undefined) {\n return null;\n }\n return `(${metadataValueSql} IS NOT NULL AND ${metadataValueSql} ? ${bind(String(expected))})`;\n case \"$containsAny\":\n case \"$containsAll\": {\n if (isScalarField || !Array.isArray(expected)) {\n return null;\n }\n const values = expected\n .map((entry) => toPostgresFilterBinding(entry))\n .filter(\n (entry): entry is string | number | boolean =>\n entry !== undefined,\n );\n if (values.length === 0 || values.length !== expected.length) {\n return null;\n }\n const sqlArray = `ARRAY[${values.map((value) => bind(String(value))).join(\", \")}]::text[]`;\n return `(${metadataValueSql} IS NOT NULL AND ${metadataValueSql} ${operator === \"$containsAny\" ? \"?|\" : \"?&\"} ${sqlArray})`;\n }\n default:\n return null;\n }\n },\n );\n\n if (operatorClauses.some((clause) => clause === null)) {\n return null;\n }\n\n clauses.push(\n operatorClauses\n .filter((clause): clause is string => Boolean(clause))\n .map((clause) => `(${clause})`)\n .join(\" AND \"),\n );\n }\n\n return clauses.length > 0\n ? clauses.map((clause) => `(${clause})`).join(\" AND \")\n : \"\";\n };\n\n const clause = build(filter);\n return clause === null || clause.trim().length === 0\n ? null\n : { clause, params };\n};\n\nconst buildPostgresPushdownFilter = (\n filter: Record<string, unknown> | undefined,\n): Record<string, unknown> | undefined => {\n if (!filter) {\n return undefined;\n }\n\n const hasPushdownFilterPlan = (entry: Record<string, unknown>) => {\n const plan = buildPostgresFilterPlan(entry);\n return (\n plan !== null && Boolean(plan.clause) && plan.clause.trim().length > 0\n );\n };\n const hasPushdownFilterPlanEntry = (entry: unknown) => {\n if (!isObjectFilterRecord(entry)) {\n return false;\n }\n\n return hasPushdownFilterPlan(entry);\n };\n\n const nextEntries: Array<[string, unknown]> = [];\n\n for (const [key, value] of Object.entries(filter)) {\n if (key === \"$and\" || key === \"$or\") {\n if (!isNestedFilterArray(value)) {\n continue;\n }\n\n const nested = value\n .map((entry) => buildPostgresPushdownFilter(entry))\n .filter((entry): entry is Record<string, unknown> =>\n hasPushdownFilterPlanEntry(entry),\n );\n\n if (nested.length > 0) {\n nextEntries.push([key, nested]);\n }\n continue;\n }\n\n if (key === \"$not\") {\n if (!isObjectFilterRecord(value)) {\n continue;\n }\n\n const nested = buildPostgresPushdownFilter(value);\n if (hasPushdownFilterPlanEntry(nested)) {\n nextEntries.push([key, nested]);\n }\n continue;\n }\n\n if (\n Array.isArray(value) ||\n (isOperatorFilterRecord(value) &&\n Object.keys(value).some(\n (operator) =>\n !(\n operator === \"$exists\" ||\n operator === \"$in\" ||\n operator === \"$contains\" ||\n operator === \"$containsAny\" ||\n operator === \"$containsAll\" ||\n operator === \"$ne\" ||\n operator === \"$gt\" ||\n operator === \"$gte\" ||\n operator === \"$lt\" ||\n operator === \"$lte\"\n ),\n ))\n ) {\n continue;\n }\n\n const isScalarColumnKey = [\"chunkId\", \"source\", \"title\"].includes(key);\n const jsonPath = isScalarColumnKey ? null : toPostgresJsonPath(key);\n if (!isScalarColumnKey && !jsonPath) {\n continue;\n }\n\n if (!hasPushdownFilterPlan({ [key]: value })) {\n continue;\n }\n\n nextEntries.push([key, value]);\n }\n\n return nextEntries.length > 0 ? Object.fromEntries(nextEntries) : undefined;\n};\n\nconst resolvePostgresPushdownMode = (input: {\n filter?: Record<string, unknown>;\n pushdownFilter?: Record<string, unknown>;\n}): {\n jsRemainderClauseCount: number;\n jsRemainderRatio?: number;\n pushdownClauseCount: number;\n pushdownCoverageRatio?: number;\n pushdownMode: \"none\" | \"partial\" | \"full\";\n totalFilterClauseCount: number;\n} => {\n const totalFilterClauseCount = countFilterClauses(input.filter);\n const pushdownClauseCount = countFilterClauses(input.pushdownFilter);\n const jsRemainderClauseCount = Math.max(\n 0,\n totalFilterClauseCount - pushdownClauseCount,\n );\n const pushdownMode =\n pushdownClauseCount === 0\n ? \"none\"\n : pushdownClauseCount >= totalFilterClauseCount\n ? \"full\"\n : \"partial\";\n\n return {\n jsRemainderClauseCount,\n jsRemainderRatio:\n totalFilterClauseCount > 0\n ? jsRemainderClauseCount / totalFilterClauseCount\n : undefined,\n pushdownClauseCount,\n pushdownCoverageRatio:\n totalFilterClauseCount > 0\n ? pushdownClauseCount / totalFilterClauseCount\n : undefined,\n pushdownMode,\n totalFilterClauseCount,\n };\n};\n\nconst assertSupportedIdentifier = (name: string) => {\n if (!IDENTIFIER_RE.test(name)) {\n throw new Error(\n `Invalid identifier \"${name}\". Only alphanumeric and underscore names are allowed.`,\n );\n }\n};\n\nconst normalizePostgresIndexType = (\n value: PostgresIndexType | undefined,\n): PostgresIndexType => {\n if (value === undefined) {\n return DEFAULT_POSTGRES_INDEX_TYPE;\n }\n\n if (value === \"none\" || value === \"hnsw\" || value === \"ivfflat\") {\n return value;\n }\n\n throw new Error(\n `Invalid postgres index type \"${String(value)}\". Expected \"none\", \"hnsw\", or \"ivfflat\".`,\n );\n};\n\nconst normalizePositiveInteger = (\n value: number | undefined,\n fallback: number,\n) => {\n if (value === undefined || !Number.isFinite(value)) {\n return fallback;\n }\n\n return Math.max(1, Math.floor(value));\n};\n\nconst getPostgresIndexOperatorClass = (metric: PostgresDistanceMetric) =>\n metric === \"cosine\"\n ? \"vector_cosine_ops\"\n : metric === \"inner_product\"\n ? \"vector_ip_ops\"\n : \"vector_l2_ops\";\n\nconst getPostgresIndexName = (\n qualifiedTableName: string,\n indexType: PostgresIndexType,\n) =>\n indexType === \"none\"\n ? undefined\n : `${qualifiedTableName.replace(\".\", \"_\")}_embedding_${indexType}_idx`;\n\nconst buildPostgresIndexSql = (input: {\n distanceMetric: PostgresDistanceMetric;\n hnswEfConstruction: number;\n hnswM: number;\n ifNotExists?: boolean;\n indexLists: number;\n indexType: PostgresIndexType;\n qualifiedTableName: string;\n}) => {\n if (input.indexType === \"none\") {\n return undefined;\n }\n\n const opclass = getPostgresIndexOperatorClass(input.distanceMetric);\n const indexName = getPostgresIndexName(\n input.qualifiedTableName,\n input.indexType,\n );\n const optionsSql =\n input.indexType === \"hnsw\"\n ? ` with (m = ${input.hnswM}, ef_construction = ${input.hnswEfConstruction})`\n : ` with (lists = ${input.indexLists})`;\n const createPrefix =\n input.ifNotExists === false ? \"create index\" : \"create index if not exists\";\n\n return `${createPrefix} ${indexName} on ${input.qualifiedTableName} using ${input.indexType} (embedding ${opclass})${optionsSql}`;\n};\n\nconst normalizeQueryMultiplier = (value: number | undefined) => {\n if (value === undefined || !Number.isFinite(value)) {\n return DEFAULT_QUERY_MULTIPLIER;\n }\n\n return Math.min(MAX_QUERY_MULTIPLIER, Math.max(1, Math.floor(value)));\n};\n\nconst normalizeMaxBackfills = (value: number | undefined) => {\n if (value === undefined || !Number.isFinite(value)) {\n return undefined;\n }\n\n return Math.max(0, Math.floor(value));\n};\n\nconst normalizeMinResults = (value: number | undefined, topK: number) => {\n if (value === undefined || !Number.isFinite(value)) {\n return topK;\n }\n\n return Math.min(topK, Math.max(1, Math.floor(value)));\n};\n\nconst resolveFillTarget = (input: {\n topK: number;\n minResults: number;\n fillPolicy?: \"strict_topk\" | \"satisfy_min_results\";\n}) => {\n const fillPolicy = input.fillPolicy ?? \"satisfy_min_results\";\n\n return {\n fillPolicy,\n targetResults: fillPolicy === \"strict_topk\" ? input.topK : input.minResults,\n };\n};\n\nconst toQualifiedTableName = (schemaName: string, tableName: string) =>\n `${schemaName}.${tableName}`;\n\nconst toVectorLiteral = (vector: number[]) => `[${vector.join(\",\")}]`;\n\nconst parseMetadata = (value: unknown) => {\n if (typeof value === \"string\") {\n try {\n const parsed = JSON.parse(value);\n if (parsed && typeof parsed === \"object\" && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n } catch {\n return undefined;\n }\n }\n\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n\n return value as Record<string, unknown>;\n};\n\nconst parseVectorText = (value?: string | null) => {\n if (!value) {\n return [];\n }\n\n const normalized = value.trim();\n const wrapped = normalized.startsWith(\"[\")\n ? normalized\n : `[${normalized.replace(/[()]/g, \"\")}]`;\n\n try {\n const parsed = JSON.parse(wrapped);\n return Array.isArray(parsed)\n ? parsed.filter(\n (entry): entry is number =>\n typeof entry === \"number\" && Number.isFinite(entry),\n )\n : [];\n } catch {\n return [];\n }\n};\n\nconst parseCountValue = (value: unknown) => {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n\n if (typeof value === \"bigint\") {\n return Number(value);\n }\n\n if (typeof value === \"string\") {\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : 0;\n }\n\n return 0;\n};\n\nconst parseBooleanValue = (value: unknown) => {\n if (typeof value === \"boolean\") {\n return value;\n }\n\n if (typeof value === \"number\") {\n return value !== 0;\n }\n\n if (typeof value === \"bigint\") {\n return value !== 0n;\n }\n\n if (typeof value === \"string\") {\n const normalized = value.trim().toLowerCase();\n return normalized === \"true\" || normalized === \"t\" || normalized === \"1\";\n }\n\n return false;\n};\n\nconst refreshPostgresRuntimeDiagnostics = async (\n db: BunSQLClient,\n nativeDiagnostics: RAGPostgresNativeDiagnostics,\n input: {\n indexName?: string;\n qualifiedTableName: string;\n schemaName: string;\n tableName: string;\n },\n) => {\n try {\n const rows = (await db.unsafe(\n `select\n\t\t\t\tc.reltuples::bigint as estimated_row_count,\n\t\t\t\tpg_relation_size($1::regclass) as table_bytes,\n\t\t\t\tpg_indexes_size($1::regclass) as index_bytes,\n\t\t\t\tpg_total_relation_size($1::regclass) as total_bytes,\n\t\t\t\texists(\n\t\t\t\t\tselect 1\n\t\t\t\t\tfrom pg_indexes\n\t\t\t\t\twhere schemaname = $2\n\t\t\t\t\t and tablename = $3\n\t\t\t\t\t and indexname = $4\n\t\t\t\t) as index_present\n\t\t\tfrom pg_class c\n\t\t\tjoin pg_namespace n on n.oid = c.relnamespace\n\t\t\twhere n.nspname = $2\n\t\t\t and c.relname = $3\n\t\t\tlimit 1`,\n [\n input.qualifiedTableName,\n input.schemaName,\n input.tableName,\n input.indexName ?? \"\",\n ],\n )) as PostgresHealthRow[];\n const row = rows[0];\n nativeDiagnostics.indexName = input.indexName;\n nativeDiagnostics.indexPresent = input.indexName\n ? parseBooleanValue(row?.index_present)\n : undefined;\n nativeDiagnostics.estimatedRowCount = parseCountValue(\n row?.estimated_row_count,\n );\n nativeDiagnostics.tableBytes = parseCountValue(row?.table_bytes);\n nativeDiagnostics.indexBytes = parseCountValue(row?.index_bytes);\n nativeDiagnostics.totalBytes = parseCountValue(row?.total_bytes);\n nativeDiagnostics.lastHealthCheckAt = Date.now();\n nativeDiagnostics.lastHealthError = undefined;\n } catch (error) {\n nativeDiagnostics.lastHealthCheckAt = Date.now();\n nativeDiagnostics.lastHealthError =\n error instanceof Error ? error.message : String(error);\n }\n};\n\nconst analyzePostgresTable = async (\n db: BunSQLClient,\n nativeDiagnostics: RAGPostgresNativeDiagnostics,\n input: {\n indexName?: string;\n qualifiedTableName: string;\n schemaName: string;\n tableName: string;\n },\n) => {\n try {\n await db.unsafe(`analyze ${input.qualifiedTableName}`);\n nativeDiagnostics.lastAnalyzeAt = Date.now();\n nativeDiagnostics.lastAnalyzeError = undefined;\n await refreshPostgresRuntimeDiagnostics(db, nativeDiagnostics, input);\n } catch (error) {\n nativeDiagnostics.lastAnalyzeAt = Date.now();\n nativeDiagnostics.lastAnalyzeError =\n error instanceof Error ? error.message : String(error);\n throw error;\n }\n};\n\nconst rebuildPostgresNativeIndex = async (\n db: BunSQLClient,\n nativeDiagnostics: RAGPostgresNativeDiagnostics,\n input: {\n distanceMetric: PostgresDistanceMetric;\n hnswEfConstruction: number;\n hnswM: number;\n indexLists: number;\n indexName?: string;\n indexType: PostgresIndexType;\n qualifiedTableName: string;\n schemaName: string;\n tableName: string;\n },\n) => {\n if (!input.indexName || input.indexType === \"none\") {\n throw new Error(\"Postgres native index rebuild is not configured\");\n }\n\n try {\n await db.unsafe(`drop index if exists ${input.indexName}`);\n await db.unsafe(\n buildPostgresIndexSql({\n distanceMetric: input.distanceMetric,\n hnswEfConstruction: input.hnswEfConstruction,\n hnswM: input.hnswM,\n ifNotExists: false,\n indexLists: input.indexLists,\n indexType: input.indexType,\n qualifiedTableName: input.qualifiedTableName,\n })!,\n );\n nativeDiagnostics.lastReindexAt = Date.now();\n nativeDiagnostics.lastReindexError = undefined;\n await analyzePostgresTable(db, nativeDiagnostics, input);\n } catch (error) {\n nativeDiagnostics.lastReindexAt = Date.now();\n nativeDiagnostics.lastReindexError =\n error instanceof Error ? error.message : String(error);\n throw error;\n }\n};\n\nconst getPostgresChunkIdsByChunkIds = async (\n db: BunSQLClient,\n qualifiedTableName: string,\n chunkIds: string[],\n) => {\n const normalized = [...new Set(chunkIds)].filter(\n (chunkId): chunkId is string => chunkId.length > 0,\n );\n if (normalized.length === 0) {\n return [] as string[];\n }\n\n const placeholders = normalized.map((_, index) => `$${index + 1}`).join(\", \");\n const rows = (await db.unsafe(\n `select chunk_id from ${qualifiedTableName} where chunk_id in (${placeholders})`,\n normalized,\n )) as Array<{ chunk_id?: string }>;\n\n return rows\n .map((row) => row.chunk_id)\n .filter((chunkId): chunkId is string => typeof chunkId === \"string\");\n};\n\nconst getPostgresCandidateChunkIdsByFilter = async (\n db: BunSQLClient,\n qualifiedTableName: string,\n filter?: Record<string, unknown>,\n) => {\n if (!filter || Object.keys(filter).length === 0) {\n return [] as string[];\n }\n\n const pushdownFilter = buildPostgresPushdownFilter(filter);\n const filterPlan = buildPostgresFilterPlan(pushdownFilter);\n const rowsSql = filterPlan?.clause\n ? `select chunk_id, text, title, source, metadata from ${qualifiedTableName} where ${filterPlan.clause}`\n : `select chunk_id, text, title, source, metadata from ${qualifiedTableName}`;\n const rows = (await db.unsafe(\n rowsSql,\n filterPlan?.clause ? (filterPlan.params ?? []) : [],\n )) as PostgresStoredRow[];\n\n const chunks = rows\n .map((row) => mapRowToChunk(row))\n .filter((chunk) => matchesFilter(chunk, filter));\n\n return chunks.map((chunk) => chunk.chunkId);\n};\n\nconst getPostgresCandidateChunkIds = async (\n db: BunSQLClient,\n qualifiedTableName: string,\n input: {\n filter?: Record<string, unknown>;\n chunkIds?: string[];\n },\n) => {\n const chunkIdSet = new Set<string>();\n if (input.filter && Object.keys(input.filter).length > 0) {\n for (const chunkId of await getPostgresCandidateChunkIdsByFilter(\n db,\n qualifiedTableName,\n input.filter,\n )) {\n chunkIdSet.add(chunkId);\n }\n }\n\n if (input.chunkIds && input.chunkIds.length > 0) {\n for (const chunkId of await getPostgresChunkIdsByChunkIds(\n db,\n qualifiedTableName,\n input.chunkIds,\n )) {\n chunkIdSet.add(chunkId);\n }\n }\n\n return [...chunkIdSet];\n};\n\nconst normalizeDistance = (\n distance: number,\n metric: PostgresDistanceMetric,\n) => {\n if (!Number.isFinite(distance)) {\n return 0;\n }\n\n if (metric === \"cosine\") {\n return Math.min(1, Math.max(0, 1 - distance));\n }\n\n if (metric === \"inner_product\") {\n return Math.max(0, -distance);\n }\n\n return Math.max(0, 1 / (1 + Math.abs(distance)));\n};\n\nconst getDistanceOperator = (metric: PostgresDistanceMetric) =>\n metric === \"cosine\" ? \"<=>\" : metric === \"inner_product\" ? \"<#>\" : \"<->\";\n\nconst createPostgresStatus = (\n dimensions: number,\n nativeDiagnostics: RAGPostgresNativeDiagnostics,\n): RAGVectorStoreStatus => ({\n backend: \"postgres\",\n dimensions,\n native: nativeDiagnostics,\n vectorMode: \"native_pgvector\",\n});\n\nconst createPostgresCapabilities = (): RAGBackendCapabilities => ({\n backend: \"postgres\",\n nativeVectorSearch: true,\n persistence: \"external\",\n serverSideFiltering: true,\n streamingIngestStatus: false,\n});\n\nconst updatePostgresLastQueryPlan = (input: {\n nativeDiagnostics: RAGPostgresNativeDiagnostics;\n filter?: Record<string, unknown>;\n pushdownFilter?: Record<string, unknown>;\n topK: number;\n plannerProfileUsed?: \"latency\" | \"balanced\" | \"recall\";\n queryMultiplierUsed?: number;\n candidateLimitUsed?: number;\n maxBackfillsUsed?: number;\n minResultsUsed?: number;\n fillPolicyUsed?: \"strict_topk\" | \"satisfy_min_results\";\n filteredCandidateCount?: number;\n initialSearchK?: number;\n finalSearchK?: number;\n backfillCount?: number;\n backfillLimitReached?: boolean;\n minResultsSatisfied?: boolean;\n returnedCount?: number;\n underfilledTopK?: boolean;\n candidateBudgetExhausted?: boolean;\n}) => {\n const pushdown = resolvePostgresPushdownMode({\n filter: input.filter,\n pushdownFilter: input.pushdownFilter,\n });\n\n input.nativeDiagnostics.lastQueryPlan = {\n backfillCount: input.backfillCount,\n candidateBudgetExhausted: input.candidateBudgetExhausted,\n candidateCoverage: summarizeSQLiteCandidateCoverage({\n filteredCandidateCount: input.filteredCandidateCount,\n returnedCount: input.returnedCount,\n topK: input.topK,\n }),\n filteredCandidateCount: input.filteredCandidateCount,\n finalSearchK: input.finalSearchK,\n initialSearchK: input.initialSearchK,\n searchExpansionRatio:\n typeof input.initialSearchK === \"number\" &&\n typeof input.finalSearchK === \"number\" &&\n input.initialSearchK > 0\n ? input.finalSearchK / input.initialSearchK\n : undefined,\n candidateLimitUsed: input.candidateLimitUsed,\n maxBackfillsUsed: input.maxBackfillsUsed,\n minResultsUsed: input.minResultsUsed,\n fillPolicyUsed: input.fillPolicyUsed,\n plannerProfileUsed: input.plannerProfileUsed,\n jsRemainderClauseCount: pushdown.jsRemainderClauseCount,\n queryMultiplierUsed: input.queryMultiplierUsed,\n jsRemainderRatio: pushdown.jsRemainderRatio,\n pushdownApplied: pushdown.pushdownClauseCount > 0,\n pushdownClauseCount: pushdown.pushdownClauseCount,\n pushdownCoverageRatio: pushdown.pushdownCoverageRatio,\n pushdownMode: pushdown.pushdownMode,\n queryMode: \"native_pgvector\",\n candidateYieldRatio:\n typeof input.returnedCount === \"number\" &&\n typeof input.finalSearchK === \"number\" &&\n input.finalSearchK > 0\n ? input.returnedCount / input.finalSearchK\n : undefined,\n returnedCount: input.returnedCount,\n backfillLimitReached: input.backfillLimitReached,\n minResultsSatisfied: input.minResultsSatisfied,\n topKFillRatio:\n typeof input.returnedCount === \"number\" && input.topK > 0\n ? input.returnedCount / input.topK\n : undefined,\n totalFilterClauseCount: pushdown.totalFilterClauseCount,\n underfilledTopK: input.underfilledTopK,\n };\n};\n\nconst matchesFilter = (\n record: InternalChunk,\n filter?: Record<string, unknown>,\n) =>\n matchesMetadataFilterRecord(\n {\n chunkId: record.chunkId,\n metadata: record.metadata,\n source: record.source,\n title: record.title,\n ...(record.metadata ?? {}),\n },\n filter,\n );\n\nconst mapRowToChunk = (row: PostgresStoredRow): InternalChunk => ({\n chunkId: row.chunk_id,\n metadata: parseMetadata(row.metadata),\n source: row.source ?? undefined,\n text: row.text,\n title: row.title ?? undefined,\n vector: parseVectorText(row.embedding),\n});\n\nconst ensurePostgresSchema = async (\n db: BunSQLClient,\n input: {\n dimensions: number;\n distanceMetric: PostgresDistanceMetric;\n hnswEfConstruction: number;\n hnswM: number;\n indexLists: number;\n indexType: PostgresIndexType;\n qualifiedTableName: string;\n },\n) => {\n await db.unsafe(\"create extension if not exists vector\");\n const [schemaName] = input.qualifiedTableName.split(\".\");\n if (schemaName) {\n await db.unsafe(`create schema if not exists ${schemaName}`);\n }\n await db.unsafe(`\n\t\tcreate table if not exists ${input.qualifiedTableName} (\n\t\t\tchunk_id text primary key,\n\t\t\ttext text not null,\n\t\t\ttitle text,\n\t\t\tsource text,\n\t\t\tmetadata jsonb,\n\t\t\tembedding vector(${input.dimensions}) not null\n\t\t)\n\t`);\n const indexSql = buildPostgresIndexSql(input);\n if (indexSql) {\n await db.unsafe(indexSql);\n }\n};\n\nexport const createPostgresRAGStore = (\n options: PostgresRAGStoreOptions = {},\n): RAGVectorStore => {\n const dimensions = options.dimensions ?? DEFAULT_DIMENSIONS;\n const distanceMetric = options.distanceMetric ?? \"cosine\";\n const queryMultiplier = normalizeQueryMultiplier(options.queryMultiplier);\n const indexType = normalizePostgresIndexType(options.indexType);\n const indexLists = normalizePositiveInteger(\n options.indexLists,\n DEFAULT_POSTGRES_IVFFLAT_LISTS,\n );\n const hnswM = normalizePositiveInteger(\n options.hnswM,\n DEFAULT_POSTGRES_HNSW_M,\n );\n const hnswEfConstruction = normalizePositiveInteger(\n options.hnswEfConstruction,\n DEFAULT_POSTGRES_HNSW_EF_CONSTRUCTION,\n );\n const tableName = options.tableName ?? DEFAULT_TABLE_NAME;\n const schemaName = options.schemaName ?? DEFAULT_SCHEMA_NAME;\n assertSupportedIdentifier(tableName);\n assertSupportedIdentifier(schemaName);\n const qualifiedTableName = toQualifiedTableName(schemaName, tableName);\n const indexName = getPostgresIndexName(qualifiedTableName, indexType);\n const db =\n options.sql ??\n new Bun.SQL(\n options.connectionString ??\n process.env.RAG_POSTGRES_URL ??\n process.env.DATABASE_URL ??\n \"postgres://postgres:postgres@localhost:55433/absolute_rag_demo\",\n );\n\n const nativeDiagnostics: RAGPostgresNativeDiagnostics = {\n active: true,\n available: true,\n distanceMetric,\n extensionName: \"vector\",\n indexName,\n indexType,\n mode: \"pgvector\",\n requested: true,\n schemaName,\n tableName,\n };\n const capabilities = createPostgresCapabilities();\n const distanceOperator = getDistanceOperator(distanceMetric);\n let initialized: Promise<void> | undefined;\n\n const init = () => {\n initialized ??= ensurePostgresSchema(db, {\n dimensions,\n distanceMetric,\n hnswEfConstruction,\n hnswM,\n indexLists,\n indexType,\n qualifiedTableName,\n })\n .then(() =>\n refreshPostgresRuntimeDiagnostics(db, nativeDiagnostics, {\n indexName,\n qualifiedTableName,\n schemaName,\n tableName,\n }),\n )\n .catch((error) => {\n nativeDiagnostics.active = false;\n nativeDiagnostics.available = false;\n nativeDiagnostics.lastInitError =\n error instanceof Error ? error.message : String(error);\n nativeDiagnostics.lastMigrationError =\n error instanceof Error ? error.message : String(error);\n nativeDiagnostics.fallbackReason = nativeDiagnostics.lastInitError;\n throw error;\n });\n return initialized;\n };\n\n const embed = async (input: {\n text: string;\n model?: string;\n signal?: AbortSignal;\n }) => {\n void input.model;\n void input.signal;\n\n if (options.mockEmbedding) {\n return options.mockEmbedding(input.text);\n }\n\n return normalizeVector(createRAGVector(input.text, dimensions));\n };\n\n const query = async (input: RAGQueryInput) => {\n await init();\n const queryVector = normalizeVector(input.queryVector);\n const queryMultiplier = normalizeQueryMultiplier(\n input.queryMultiplier ?? options.queryMultiplier,\n );\n const maxBackfills = normalizeMaxBackfills(input.maxBackfills);\n const minResults = normalizeMinResults(input.minResults, input.topK);\n const fillTarget = resolveFillTarget({\n fillPolicy: input.fillPolicy,\n minResults,\n topK: input.topK,\n });\n const queryVectorLiteral = toVectorLiteral(queryVector);\n const pushdownFilter = buildPostgresPushdownFilter(input.filter);\n const queryFilterPlan = buildPostgresFilterPlan(pushdownFilter);\n const effectivePushdownFilter = queryFilterPlan\n ? pushdownFilter\n : undefined;\n const countFilterPlan = queryFilterPlan;\n const countSql = countFilterPlan?.clause\n ? `select count(*)::int as count from ${qualifiedTableName} where ${countFilterPlan.clause}`\n : `select count(*)::int as count from ${qualifiedTableName}`;\n const totalRowsResult = await db.unsafe(\n countSql,\n countFilterPlan?.params ?? [],\n );\n nativeDiagnostics.lastFilterDebug = {\n countParams: countFilterPlan?.params ?? [],\n countResultRaw: totalRowsResult?.[0],\n countSql,\n filter: input.filter,\n pushdownFilter: effectivePushdownFilter,\n };\n const totalRows = parseCountValue(totalRowsResult?.[0]?.count);\n const candidateLimit = resolveAdaptiveNativeCandidateLimit({\n defaultCandidateLimit: RAG_NATIVE_QUERY_CANDIDATE_LIMIT,\n explicitCandidateLimit: input.candidateLimit,\n filteredCandidateCount: totalRows,\n plannerProfile: input.plannerProfile,\n queryMultiplier,\n topK: input.topK,\n });\n const hasPushdownFilter = Boolean(effectivePushdownFilter);\n const plannedFilteredCandidateCount =\n hasPushdownFilter && totalRows === 0 ? undefined : totalRows;\n const initialSearchK = planNativeCandidateSearchK({\n candidateLimit,\n filteredCandidateCount: plannedFilteredCandidateCount,\n queryMultiplier,\n topK: input.topK,\n });\n\n if (initialSearchK === 0) {\n return [];\n }\n\n let currentSearchK = initialSearchK;\n let backfillCount = 0;\n let candidateBudgetExhausted = false;\n let backfillLimitReached = false;\n let effectiveFilteredCandidateCount = plannedFilteredCandidateCount;\n let mapped: Array<{\n chunkId: string;\n chunkText: string;\n embedding: number[];\n metadata?: Record<string, unknown>;\n score: number;\n source?: string;\n title?: string;\n }> = [];\n\n for (;;) {\n const rowsSql = queryFilterPlan?.clause\n ? `select chunk_id, text, title, source, metadata, embedding::text as embedding, embedding ${distanceOperator} '${queryVectorLiteral}'::vector as distance from ${qualifiedTableName} where ${queryFilterPlan.clause} order by embedding ${distanceOperator} '${queryVectorLiteral}'::vector limit $${\n queryFilterPlan.params.length + 1\n }`\n : `select chunk_id, text, title, source, metadata, embedding::text as embedding, embedding ${distanceOperator} '${queryVectorLiteral}'::vector as distance from ${qualifiedTableName} order by embedding ${distanceOperator} '${queryVectorLiteral}'::vector limit $1`;\n const rows = (await db.unsafe(\n rowsSql,\n queryFilterPlan?.clause\n ? [...(queryFilterPlan.params ?? []), currentSearchK]\n : [currentSearchK],\n )) as PostgresStoredRow[];\n nativeDiagnostics.lastFilterDebug = {\n ...nativeDiagnostics.lastFilterDebug,\n queryParams: queryFilterPlan?.clause\n ? [...(queryFilterPlan.params ?? []), currentSearchK]\n : [currentSearchK],\n queryRowCount: rows.length,\n querySql: rowsSql,\n };\n if (\n hasPushdownFilter &&\n effectiveFilteredCandidateCount === undefined &&\n rows.length <= currentSearchK\n ) {\n effectiveFilteredCandidateCount = rows.length;\n }\n\n mapped = rows\n .map((row) => {\n const chunk = mapRowToChunk(row);\n return {\n chunk,\n score: normalizeDistance(Number(row.distance ?? 0), distanceMetric),\n };\n })\n .filter(({ chunk }) => matchesFilter(chunk, input.filter))\n .map((entry) => ({\n chunkId: entry.chunk.chunkId,\n chunkText: entry.chunk.text,\n embedding: entry.chunk.vector,\n metadata: entry.chunk.metadata,\n score: entry.score,\n source: entry.chunk.source,\n title: entry.chunk.title,\n }))\n .sort((left, right) => right.score - left.score);\n\n if (mapped.length >= fillTarget.targetResults) {\n break;\n }\n\n const nextSearchK = planNativeCandidateSearchBackfillK({\n backfillCount,\n candidateLimit,\n currentSearchK,\n filteredCandidateCount: effectiveFilteredCandidateCount,\n maxBackfills,\n });\n\n if (nextSearchK <= currentSearchK) {\n backfillLimitReached =\n typeof maxBackfills === \"number\" &&\n backfillCount >= maxBackfills &&\n mapped.length < fillTarget.targetResults;\n candidateBudgetExhausted = mapped.length < fillTarget.targetResults;\n break;\n }\n\n currentSearchK = nextSearchK;\n backfillCount += 1;\n }\n\n nativeDiagnostics.lastQueryError = undefined;\n const returned = mapped.slice(0, input.topK);\n updatePostgresLastQueryPlan({\n backfillCount,\n backfillLimitReached,\n candidateBudgetExhausted,\n candidateLimitUsed: candidateLimit,\n maxBackfillsUsed: maxBackfills,\n minResultsUsed: minResults,\n fillPolicyUsed: fillTarget.fillPolicy,\n plannerProfileUsed: input.plannerProfile,\n filter: input.filter,\n pushdownFilter: effectivePushdownFilter,\n queryMultiplierUsed: queryMultiplier,\n filteredCandidateCount: effectiveFilteredCandidateCount,\n finalSearchK: currentSearchK,\n initialSearchK,\n nativeDiagnostics,\n minResultsSatisfied: returned.length >= minResults,\n returnedCount: returned.length,\n topK: input.topK,\n underfilledTopK: returned.length < input.topK,\n });\n\n return returned;\n };\n\n const queryLexical = async (input: RAGLexicalQueryInput) => {\n await init();\n const pushdownFilter = buildPostgresPushdownFilter(input.filter);\n const lexicalFilterPlan = buildPostgresFilterPlan(pushdownFilter);\n const rowsSql = lexicalFilterPlan?.clause\n ? `select chunk_id, text, title, source, metadata from ${qualifiedTableName} where ${lexicalFilterPlan.clause}`\n : `select chunk_id, text, title, source, metadata from ${qualifiedTableName}`;\n const rows = (await db.unsafe(\n rowsSql,\n lexicalFilterPlan?.params ?? [],\n )) as PostgresStoredRow[];\n const chunks = rows\n .map((row) => mapRowToChunk(row))\n .filter((chunk) => matchesFilter(chunk, input.filter));\n const ranked = rankRAGLexicalMatches(input.query, chunks);\n\n return ranked.slice(0, input.topK).map(({ result, score }) => ({\n chunkId: result.chunkId,\n chunkText: result.text,\n metadata: result.metadata,\n score,\n source: result.source,\n title: result.title,\n }));\n };\n\n const upsert = async (input: RAGUpsertInput) => {\n await init();\n const chunks =\n input.chunks.length > 0\n ? await Promise.all(\n input.chunks.map(async (chunk) => ({\n chunkId: chunk.chunkId,\n metadata: chunk.metadata,\n source: chunk.source,\n text: chunk.text,\n title: chunk.title,\n vector: chunk.embedding\n ? normalizeVector(chunk.embedding)\n : normalizeVector(await embed({ text: chunk.text })),\n })),\n )\n : [];\n\n for (const chunk of chunks) {\n await db.unsafe(\n `insert into ${qualifiedTableName} (chunk_id, text, title, source, metadata, embedding)\n\t\t\t\t values ($1, $2, $3, $4, $5::jsonb, $6::vector)\n\t\t\t\t on conflict (chunk_id) do update set\n\t\t\t\t text = excluded.text,\n\t\t\t\t title = excluded.title,\n\t\t\t\t source = excluded.source,\n\t\t\t\t metadata = excluded.metadata,\n\t\t\t\t embedding = excluded.embedding`,\n [\n chunk.chunkId,\n chunk.text,\n chunk.title ?? null,\n chunk.source ?? null,\n chunk.metadata ?? null,\n toVectorLiteral(chunk.vector),\n ],\n );\n }\n await refreshPostgresRuntimeDiagnostics(db, nativeDiagnostics, {\n indexName,\n qualifiedTableName,\n schemaName,\n tableName,\n });\n };\n\n const count = async (input: RAGVectorCountInput = {}) => {\n await init();\n const filter = input.filter;\n const chunkIds = input.chunkIds;\n const hasFilter = Boolean(filter && Object.keys(filter).length > 0);\n const hasChunkIds = Boolean(chunkIds && chunkIds.length > 0);\n\n if (!hasFilter && !hasChunkIds) {\n const countResult = (await db.unsafe(\n `select count(*)::int as count from ${qualifiedTableName}`,\n )) as Array<{ count?: unknown }>;\n return parseCountValue(countResult[0]?.count);\n }\n\n return (\n await getPostgresCandidateChunkIds(db, qualifiedTableName, {\n filter,\n chunkIds,\n })\n ).length;\n };\n\n const remove = async (input: RAGVectorDeleteInput = {}) => {\n await init();\n const filter = input.filter;\n const chunkIds = input.chunkIds;\n const hasFilter = Boolean(filter && Object.keys(filter).length > 0);\n const hasChunkIds = Boolean(chunkIds && chunkIds.length > 0);\n\n if (!hasFilter && !hasChunkIds) {\n return 0;\n }\n\n const ids = await getPostgresCandidateChunkIds(db, qualifiedTableName, {\n filter,\n chunkIds,\n });\n if (ids.length === 0) {\n return 0;\n }\n\n const placeholders = ids.map((_, index) => `$${index + 1}`).join(\", \");\n await db.unsafe(\n `delete from ${qualifiedTableName} where chunk_id in (${placeholders})`,\n ids,\n );\n await refreshPostgresRuntimeDiagnostics(db, nativeDiagnostics, {\n indexName,\n qualifiedTableName,\n schemaName,\n tableName,\n });\n\n return ids.length;\n };\n\n const clear = async () => {\n await init();\n await db.unsafe(`truncate table ${qualifiedTableName}`);\n await refreshPostgresRuntimeDiagnostics(db, nativeDiagnostics, {\n indexName,\n qualifiedTableName,\n schemaName,\n tableName,\n });\n };\n\n const analyze = async () => {\n await init();\n await analyzePostgresTable(db, nativeDiagnostics, {\n indexName,\n qualifiedTableName,\n schemaName,\n tableName,\n });\n };\n\n const rebuildNativeIndex = async () => {\n await init();\n await rebuildPostgresNativeIndex(db, nativeDiagnostics, {\n distanceMetric,\n hnswEfConstruction,\n hnswM,\n indexLists,\n indexName,\n indexType,\n qualifiedTableName,\n schemaName,\n tableName,\n });\n };\n\n const close = async () => {\n await db.close?.();\n };\n\n return {\n analyze,\n clear,\n close,\n embed,\n getCapabilities: () => capabilities,\n getStatus: () => createPostgresStatus(dimensions, nativeDiagnostics),\n query,\n queryLexical,\n rebuildNativeIndex: indexName ? rebuildNativeIndex : undefined,\n count,\n delete: remove,\n upsert,\n };\n};\n"
|
|
6
7
|
],
|
|
7
|
-
"mappings": "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",
|
|
8
|
-
"debugId": "
|
|
8
|
+
"mappings": "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",
|
|
9
|
+
"debugId": "705798FA59AD060364756E2164756E21",
|
|
9
10
|
"names": []
|
|
10
11
|
}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export type PostgresRAGStoreOptions = {
|
|
2
|
+
connectionString?: string;
|
|
3
|
+
sql?: InstanceType<typeof Bun.SQL>;
|
|
4
|
+
dimensions?: number;
|
|
5
|
+
mockEmbedding?: (text: string) => Promise<number[]>;
|
|
6
|
+
tableName?: string;
|
|
7
|
+
schemaName?: string;
|
|
8
|
+
distanceMetric?: "cosine" | "l2" | "inner_product";
|
|
9
|
+
queryMultiplier?: number;
|
|
10
|
+
indexType?: "none" | "hnsw" | "ivfflat";
|
|
11
|
+
indexLists?: number;
|
|
12
|
+
hnswM?: number;
|
|
13
|
+
hnswEfConstruction?: number;
|
|
14
|
+
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@absolutejs/rag-postgres",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.6",
|
|
4
4
|
"description": "PostgreSQL (pgvector) vector-store adapter for @absolutejs/rag",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -24,21 +24,18 @@
|
|
|
24
24
|
"vector"
|
|
25
25
|
],
|
|
26
26
|
"scripts": {
|
|
27
|
-
"build": "rm -rf dist && bun build src/index.ts --outdir dist --sourcemap --target=bun --external @absolutejs/rag --external
|
|
27
|
+
"build": "rm -rf dist && bun build src/index.ts --outdir dist --sourcemap --target=bun --external @absolutejs/rag --external @absolutejs/rag/adapter-kit --external @absolutejs/ai && tsc --project tsconfig.build.json",
|
|
28
28
|
"test": "bun test",
|
|
29
29
|
"typecheck": "tsc --noEmit",
|
|
30
30
|
"format": "prettier --write \"./**/*.{ts,json,md}\"",
|
|
31
31
|
"release": "bun run format && bun run build && bun publish"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@absolutejs/rag": "^0.0.
|
|
35
|
-
},
|
|
36
|
-
"peerDependencies": {
|
|
37
|
-
"postgres": ">= 3.4.0"
|
|
34
|
+
"@absolutejs/rag": "^0.0.20"
|
|
38
35
|
},
|
|
39
36
|
"devDependencies": {
|
|
40
|
-
"@
|
|
41
|
-
"
|
|
37
|
+
"@absolutejs/ai": "^0.0.9",
|
|
38
|
+
"@types/bun": "1.3.9",
|
|
42
39
|
"prettier": "3.5.3",
|
|
43
40
|
"typescript": "5.8.3"
|
|
44
41
|
},
|