@mcp-abap-adt/pg-vector-rag 26.0.0 → 28.0.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 +27 -5
- package/dist/__tests__/catalog.test.d.ts +2 -0
- package/dist/__tests__/catalog.test.d.ts.map +1 -0
- package/dist/__tests__/catalog.test.js +250 -0
- package/dist/__tests__/catalog.test.js.map +1 -0
- package/dist/__tests__/connection.test.js +39 -11
- package/dist/__tests__/connection.test.js.map +1 -1
- package/dist/__tests__/credential.test.d.ts +2 -0
- package/dist/__tests__/credential.test.d.ts.map +1 -0
- package/dist/__tests__/credential.test.js +72 -0
- package/dist/__tests__/credential.test.js.map +1 -0
- package/dist/__tests__/fake-pg.d.ts +21 -0
- package/dist/__tests__/fake-pg.d.ts.map +1 -0
- package/dist/__tests__/fake-pg.js +100 -0
- package/dist/__tests__/fake-pg.js.map +1 -0
- package/dist/__tests__/pg-vector-rag-provider.test.js +10 -11
- package/dist/__tests__/pg-vector-rag-provider.test.js.map +1 -1
- package/dist/__tests__/pg-vector-rag.test.js +63 -0
- package/dist/__tests__/pg-vector-rag.test.js.map +1 -1
- package/dist/__tests__/rag-filter-conformance.test.d.ts +2 -0
- package/dist/__tests__/rag-filter-conformance.test.d.ts.map +1 -0
- package/dist/__tests__/rag-filter-conformance.test.js +17 -0
- package/dist/__tests__/rag-filter-conformance.test.js.map +1 -0
- package/dist/__tests__/storing-pg.d.ts +18 -0
- package/dist/__tests__/storing-pg.d.ts.map +1 -0
- package/dist/__tests__/storing-pg.js +77 -0
- package/dist/__tests__/storing-pg.js.map +1 -0
- package/dist/catalog.d.ts +19 -0
- package/dist/catalog.d.ts.map +1 -0
- package/dist/catalog.js +42 -0
- package/dist/catalog.js.map +1 -0
- package/dist/connection.d.ts +27 -5
- package/dist/connection.d.ts.map +1 -1
- package/dist/connection.js +28 -4
- package/dist/connection.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/pg-vector-rag-provider.d.ts +45 -14
- package/dist/pg-vector-rag-provider.d.ts.map +1 -1
- package/dist/pg-vector-rag-provider.js +205 -23
- package/dist/pg-vector-rag-provider.js.map +1 -1
- package/dist/pg-vector-rag.d.ts +2 -1
- package/dist/pg-vector-rag.d.ts.map +1 -1
- package/dist/pg-vector-rag.js +57 -18
- package/dist/pg-vector-rag.js.map +1 -1
- package/dist/schema.d.ts +3 -1
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +3 -2
- package/dist/schema.js.map +1 -1
- package/package.json +7 -3
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import assert from 'node:assert/strict';
|
|
2
2
|
import { describe, it } from 'node:test';
|
|
3
|
+
import { staticLogin } from '@mcp-abap-adt/llm-agent';
|
|
3
4
|
import { PgVectorRagProvider } from '../pg-vector-rag-provider.js';
|
|
4
5
|
function makeEmbedder() {
|
|
5
6
|
return {
|
|
@@ -28,8 +29,7 @@ describe('PgVectorRagProvider', () => {
|
|
|
28
29
|
connection: {
|
|
29
30
|
collectionName: '__ignored',
|
|
30
31
|
host: 'h',
|
|
31
|
-
|
|
32
|
-
password: 'p',
|
|
32
|
+
credential: staticLogin('u', 'p'),
|
|
33
33
|
database: 'd',
|
|
34
34
|
},
|
|
35
35
|
defaultDimension: 3,
|
|
@@ -48,8 +48,7 @@ describe('PgVectorRagProvider', () => {
|
|
|
48
48
|
connection: {
|
|
49
49
|
collectionName: '__ignored',
|
|
50
50
|
host: 'h',
|
|
51
|
-
|
|
52
|
-
password: 'p',
|
|
51
|
+
credential: staticLogin('u', 'p'),
|
|
53
52
|
database: 'd',
|
|
54
53
|
},
|
|
55
54
|
defaultDimension: 3,
|
|
@@ -68,8 +67,7 @@ describe('PgVectorRagProvider', () => {
|
|
|
68
67
|
connection: {
|
|
69
68
|
collectionName: '__ignored',
|
|
70
69
|
host: 'h',
|
|
71
|
-
|
|
72
|
-
password: 'p',
|
|
70
|
+
credential: staticLogin('u', 'p'),
|
|
73
71
|
database: 'd',
|
|
74
72
|
},
|
|
75
73
|
clientFactory: () => client,
|
|
@@ -89,8 +87,7 @@ describe('PgVectorRagProvider', () => {
|
|
|
89
87
|
connection: {
|
|
90
88
|
collectionName: '__ignored',
|
|
91
89
|
host: 'h',
|
|
92
|
-
|
|
93
|
-
password: 'p',
|
|
90
|
+
credential: staticLogin('u', 'p'),
|
|
94
91
|
database: 'd',
|
|
95
92
|
},
|
|
96
93
|
clientFactory: () => client,
|
|
@@ -109,14 +106,16 @@ describe('PgVectorRagProvider', () => {
|
|
|
109
106
|
connection: {
|
|
110
107
|
collectionName: '__ignored',
|
|
111
108
|
host: 'h',
|
|
112
|
-
|
|
113
|
-
password: 'p',
|
|
109
|
+
credential: staticLogin('u', 'p'),
|
|
114
110
|
database: 'd',
|
|
115
111
|
},
|
|
116
112
|
clientFactory: () => client,
|
|
117
113
|
supportedScopes: ['global'],
|
|
118
114
|
});
|
|
119
|
-
const r = await provider.createCollection('docs', {
|
|
115
|
+
const r = await provider.createCollection('docs', {
|
|
116
|
+
scope: 'session',
|
|
117
|
+
sessionId: 's1',
|
|
118
|
+
});
|
|
120
119
|
assert.equal(r.ok, false);
|
|
121
120
|
});
|
|
122
121
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pg-vector-rag-provider.test.js","sourceRoot":"","sources":["../../src/__tests__/pg-vector-rag-provider.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"pg-vector-rag-provider.test.js","sourceRoot":"","sources":["../../src/__tests__/pg-vector-rag-provider.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -47,6 +47,9 @@ describe('PgVectorRag', () => {
|
|
|
47
47
|
throw new Error('unreachable');
|
|
48
48
|
assert.equal(r.value[0].text, 'hello');
|
|
49
49
|
assert.equal(r.value[0].metadata?.namespace, 'n');
|
|
50
|
+
// The id lives in its own column; a reader (tool selection's
|
|
51
|
+
// toolNameFromRecord) finds it in metadata, as every other store returns it.
|
|
52
|
+
assert.equal(r.value[0].metadata?.id, 'a');
|
|
50
53
|
assert.ok(client.calls.some((c) => c.sql.includes('<=>')));
|
|
51
54
|
});
|
|
52
55
|
it('upsertRaw issues INSERT … ON CONFLICT', async () => {
|
|
@@ -83,4 +86,64 @@ describe('PgVectorRag', () => {
|
|
|
83
86
|
assert.throws(() => new PgVectorRag({ collectionName: "bad'; DROP", embedder: makeEmbedder() }, makeFakeClient()), (err) => err.code === 'INVALID_COLLECTION_NAME');
|
|
84
87
|
});
|
|
85
88
|
});
|
|
89
|
+
describe('PgVectorRag — session/user filter (security)', () => {
|
|
90
|
+
function makeRag() {
|
|
91
|
+
const client = makeFakeClient();
|
|
92
|
+
const rag = new PgVectorRag({ collectionName: 'docs', dimension: 3, embedder: makeEmbedder(3) }, client);
|
|
93
|
+
const lastSelect = () => {
|
|
94
|
+
const c = [...client.calls]
|
|
95
|
+
.reverse()
|
|
96
|
+
.find((x) => x.sql.startsWith('SELECT id, text, metadata, vector'));
|
|
97
|
+
if (!c)
|
|
98
|
+
throw new Error('no search SELECT issued');
|
|
99
|
+
return c;
|
|
100
|
+
};
|
|
101
|
+
return { rag, lastSelect };
|
|
102
|
+
}
|
|
103
|
+
const emb = { text: 'q', toVector: async () => [0.1, 0.2, 0.3] };
|
|
104
|
+
it('sessionId and userId become parameterised WHERE conditions before ORDER BY … LIMIT', async () => {
|
|
105
|
+
const { rag, lastSelect } = makeRag();
|
|
106
|
+
const r = await rag.query(emb, 4, {
|
|
107
|
+
ragFilter: { sessionId: 's1', userId: 'u1' },
|
|
108
|
+
});
|
|
109
|
+
assert.equal(r.ok, true);
|
|
110
|
+
const { sql, params } = lastSelect();
|
|
111
|
+
assert.match(sql, /WHERE metadata->>'sessionId' = \$1 AND metadata->>'userId' = \$2 AND COALESCE\(.*\) >= \$3 ORDER BY vector <=> .* LIMIT 4$/);
|
|
112
|
+
assert.deepEqual(params.slice(0, 2), ['s1', 'u1']);
|
|
113
|
+
});
|
|
114
|
+
it('userId alone is filtered on its own parameter', async () => {
|
|
115
|
+
const { rag, lastSelect } = makeRag();
|
|
116
|
+
await rag.query(emb, 2, { ragFilter: { userId: 'u1' } });
|
|
117
|
+
const { sql, params } = lastSelect();
|
|
118
|
+
assert.match(sql, /WHERE metadata->>'userId' = \$1 AND COALESCE/);
|
|
119
|
+
assert.ok(!sql.includes("'sessionId'"));
|
|
120
|
+
assert.equal(params[0], 'u1');
|
|
121
|
+
assert.equal(params.length, 2);
|
|
122
|
+
});
|
|
123
|
+
it('no filter at all still drops expired rows, and nothing else', async () => {
|
|
124
|
+
const { rag, lastSelect } = makeRag();
|
|
125
|
+
const before = Date.now() / 1000;
|
|
126
|
+
await rag.query(emb, 2);
|
|
127
|
+
const { sql, params } = lastSelect();
|
|
128
|
+
assert.match(sql, /WHERE COALESCE\(CASE WHEN jsonb_typeof\(metadata->'ttl'\) = 'number' THEN \(metadata->>'ttl'\)::float8 END, 'infinity'::float8\) >= \$1 ORDER BY/);
|
|
129
|
+
assert.equal(params.length, 1);
|
|
130
|
+
assert.ok(Number(params[0]) >= before - 1);
|
|
131
|
+
});
|
|
132
|
+
it('ragFilter.namespace is a parameterised condition before LIMIT', async () => {
|
|
133
|
+
const { rag, lastSelect } = makeRag();
|
|
134
|
+
await rag.query(emb, 3, { ragFilter: { namespace: "n' OR '1'='1" } });
|
|
135
|
+
const { sql, params } = lastSelect();
|
|
136
|
+
assert.match(sql, /WHERE metadata->>'namespace' = \$1 AND COALESCE\(.*\) >= \$2 ORDER BY vector <=> .* LIMIT 3$/);
|
|
137
|
+
assert.ok(!sql.includes("n' OR"));
|
|
138
|
+
assert.equal(params[0], "n' OR '1'='1");
|
|
139
|
+
});
|
|
140
|
+
it('a hostile filter value is never interpolated into the SQL', async () => {
|
|
141
|
+
const { rag, lastSelect } = makeRag();
|
|
142
|
+
const hostile = "s1' OR '1'='1";
|
|
143
|
+
await rag.query(emb, 2, { ragFilter: { sessionId: hostile } });
|
|
144
|
+
const { sql, params } = lastSelect();
|
|
145
|
+
assert.ok(!sql.includes(hostile));
|
|
146
|
+
assert.equal(params[0], hostile);
|
|
147
|
+
});
|
|
148
|
+
});
|
|
86
149
|
//# sourceMappingURL=pg-vector-rag.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pg-vector-rag.test.js","sourceRoot":"","sources":["../../src/__tests__/pg-vector-rag.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pg-vector-rag.test.js","sourceRoot":"","sources":["../../src/__tests__/pg-vector-rag.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rag-filter-conformance.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/rag-filter-conformance.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { describe, it } from 'node:test';
|
|
2
|
+
import { CONFORMANCE_EMBEDDING_DIM, conformanceEmbedder, ragFilterConformanceCases, } from '@mcp-abap-adt/llm-agent/testing/rag-filter-conformance';
|
|
3
|
+
import { PgVectorRag } from '../pg-vector-rag.js';
|
|
4
|
+
import { storingPg } from './storing-pg.js';
|
|
5
|
+
// The shared conformance kit over PgVectorRag, against a fake that evaluates
|
|
6
|
+
// the emitted WHERE with Postgres semantics. The same cases run live against
|
|
7
|
+
// pgvector in the release check.
|
|
8
|
+
describe('PgVectorRag — filter conformance (storing fake)', () => {
|
|
9
|
+
for (const c of ragFilterConformanceCases) {
|
|
10
|
+
it(c.name, () => c.run(async () => new PgVectorRag({
|
|
11
|
+
collectionName: 'docs',
|
|
12
|
+
dimension: CONFORMANCE_EMBEDDING_DIM,
|
|
13
|
+
embedder: conformanceEmbedder(),
|
|
14
|
+
}, storingPg())));
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
//# sourceMappingURL=rag-filter-conformance.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rag-filter-conformance.test.js","sourceRoot":"","sources":["../../src/__tests__/rag-filter-conformance.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EACL,yBAAyB,EACzB,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,wDAAwD,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,6EAA6E;AAC7E,6EAA6E;AAC7E,iCAAiC;AACjC,QAAQ,CAAC,iDAAiD,EAAE,GAAG,EAAE;IAC/D,KAAK,MAAM,CAAC,IAAI,yBAAyB,EAAE,CAAC;QAC1C,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,CACd,CAAC,CAAC,GAAG,CACH,KAAK,IAAI,EAAE,CACT,IAAI,WAAW,CACb;YACE,cAAc,EAAE,MAAM;YACtB,SAAS,EAAE,yBAAyB;YACpC,QAAQ,EAAE,mBAAmB,EAAE;SAChC,EACD,SAAS,EAAE,CACZ,CACJ,CACF,CAAC;IACJ,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { PgClient } from '../pg-vector-rag.js';
|
|
2
|
+
/**
|
|
3
|
+
* A pg client that stores the vector table's rows and answers PgVectorRag's
|
|
4
|
+
* search SELECT the way Postgres would: the WHERE conditions on the jsonb
|
|
5
|
+
* metadata are evaluated with SQL semantics (`->>` of a missing key is NULL,
|
|
6
|
+
* and NULL = $n is not true), rows are ordered by cosine distance and cut at
|
|
7
|
+
* LIMIT. It understands exactly the condition shapes PgVectorRag emits and
|
|
8
|
+
* throws on any other, so a store change that emits new SQL fails loudly here
|
|
9
|
+
* instead of being silently mis-evaluated.
|
|
10
|
+
*/
|
|
11
|
+
export type StoringPg = PgClient & {
|
|
12
|
+
searches: Array<{
|
|
13
|
+
sql: string;
|
|
14
|
+
params: readonly unknown[];
|
|
15
|
+
}>;
|
|
16
|
+
};
|
|
17
|
+
export declare function storingPg(): StoringPg;
|
|
18
|
+
//# sourceMappingURL=storing-pg.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storing-pg.d.ts","sourceRoot":"","sources":["../../src/__tests__/storing-pg.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;;;;;;;GAQG;AACH,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG;IACjC,QAAQ,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,SAAS,OAAO,EAAE,CAAA;KAAE,CAAC,CAAC;CAC9D,CAAC;AAgDF,wBAAgB,SAAS,IAAI,SAAS,CAwCrC"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
function parseVector(sql) {
|
|
2
|
+
const m = sql.match(/'\[([^\]]*)\]'::vector/);
|
|
3
|
+
if (!m)
|
|
4
|
+
throw new Error(`no vector literal in: ${sql}`);
|
|
5
|
+
return m[1].split(',').map(Number);
|
|
6
|
+
}
|
|
7
|
+
function cosineDistance(a, b) {
|
|
8
|
+
let dot = 0;
|
|
9
|
+
let na = 0;
|
|
10
|
+
let nb = 0;
|
|
11
|
+
for (let i = 0; i < a.length; i++) {
|
|
12
|
+
dot += a[i] * b[i];
|
|
13
|
+
na += a[i] ** 2;
|
|
14
|
+
nb += b[i] ** 2;
|
|
15
|
+
}
|
|
16
|
+
return 1 - dot / (Math.sqrt(na) * Math.sqrt(nb) || 1);
|
|
17
|
+
}
|
|
18
|
+
const EQ = /^metadata->>'([A-Za-z_]+)' = \$(\d+)$/;
|
|
19
|
+
const TTL = /^COALESCE\(CASE WHEN jsonb_typeof\(metadata->'ttl'\) = 'number' THEN \(metadata->>'ttl'\)::float8 END, 'infinity'::float8\) >= \$(\d+)$/;
|
|
20
|
+
function evaluate(cond, row, params) {
|
|
21
|
+
const eq = cond.match(EQ);
|
|
22
|
+
if (eq) {
|
|
23
|
+
const v = row.metadata[eq[1]];
|
|
24
|
+
// `->>` yields the text of a scalar; a missing key is NULL (not true).
|
|
25
|
+
if (v === undefined || v === null)
|
|
26
|
+
return false;
|
|
27
|
+
return String(v) === String(params[Number(eq[2]) - 1]);
|
|
28
|
+
}
|
|
29
|
+
const ttl = cond.match(TTL);
|
|
30
|
+
if (ttl) {
|
|
31
|
+
const v = row.metadata.ttl;
|
|
32
|
+
const t = typeof v === 'number' ? v : Number.POSITIVE_INFINITY;
|
|
33
|
+
return t >= Number(params[Number(ttl[1]) - 1]);
|
|
34
|
+
}
|
|
35
|
+
throw new Error(`storing-pg: unsupported condition: ${cond}`);
|
|
36
|
+
}
|
|
37
|
+
export function storingPg() {
|
|
38
|
+
const rows = new Map();
|
|
39
|
+
const searches = [];
|
|
40
|
+
return {
|
|
41
|
+
searches,
|
|
42
|
+
async query(sql, params = []) {
|
|
43
|
+
if (sql.startsWith('CREATE '))
|
|
44
|
+
return { rows: [], rowCount: 0 };
|
|
45
|
+
if (sql.startsWith('INSERT INTO')) {
|
|
46
|
+
const [id, text, meta] = params;
|
|
47
|
+
rows.set(id, {
|
|
48
|
+
id,
|
|
49
|
+
text,
|
|
50
|
+
vector: parseVector(sql),
|
|
51
|
+
metadata: JSON.parse(meta),
|
|
52
|
+
});
|
|
53
|
+
return { rows: [], rowCount: 1 };
|
|
54
|
+
}
|
|
55
|
+
const m = sql.match(/^SELECT id, text, metadata, vector <=> .*? AS score FROM "[^"]+"(?: WHERE (.*))? ORDER BY vector <=> .* LIMIT (\d+)$/);
|
|
56
|
+
if (m) {
|
|
57
|
+
searches.push({ sql, params });
|
|
58
|
+
const conditions = m[1] ? m[1].split(' AND ') : [];
|
|
59
|
+
const q = parseVector(sql);
|
|
60
|
+
const hits = [...rows.values()]
|
|
61
|
+
.filter((r) => conditions.every((c) => evaluate(c, r, params)))
|
|
62
|
+
.map((r) => ({
|
|
63
|
+
id: r.id,
|
|
64
|
+
text: r.text,
|
|
65
|
+
metadata: r.metadata,
|
|
66
|
+
score: cosineDistance(q, r.vector),
|
|
67
|
+
}))
|
|
68
|
+
.sort((a, b) => a.score - b.score)
|
|
69
|
+
.slice(0, Number(m[2]));
|
|
70
|
+
return { rows: hits, rowCount: hits.length };
|
|
71
|
+
}
|
|
72
|
+
throw new Error(`storing-pg: unsupported statement: ${sql.slice(0, 80)}`);
|
|
73
|
+
},
|
|
74
|
+
async end() { },
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=storing-pg.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storing-pg.js","sourceRoot":"","sources":["../../src/__tests__/storing-pg.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/** The table a PgVectorRagProvider keeps one record per collection in, by default. */
|
|
2
|
+
export declare const DEFAULT_CATALOG_TABLE = "rag_collection_catalog";
|
|
3
|
+
/**
|
|
4
|
+
* The catalog's DDL. No IF NOT EXISTS: the provider checks for the table,
|
|
5
|
+
* creates it, and re-checks on failure (spec §9.10). Exported so an operator
|
|
6
|
+
* running with `autoCreateSchema: false` can create it. Attributes are JSON
|
|
7
|
+
* text, so null and absent stay apart and nothing is normalized.
|
|
8
|
+
*/
|
|
9
|
+
export declare function createCatalogTableSql(table: string): string;
|
|
10
|
+
/** Resolves like the handles' own statements do: through the search_path. */
|
|
11
|
+
export declare function tableExistsSql(): string;
|
|
12
|
+
/** Fails with the backend's own error when the table is not there. */
|
|
13
|
+
export declare function probeTableSql(table: string): string;
|
|
14
|
+
export declare function recordExistsSql(table: string): string;
|
|
15
|
+
/** Create-if-absent: the primary key refuses a second record for one store. */
|
|
16
|
+
export declare function insertRecordSql(table: string): string;
|
|
17
|
+
export declare function selectRecordsSql(table: string): string;
|
|
18
|
+
export declare function deleteRecordSql(table: string): string;
|
|
19
|
+
//# sourceMappingURL=catalog.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAEA,sFAAsF;AACtF,eAAO,MAAM,qBAAqB,2BAA2B,CAAC;AAE9D;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAU3D;AAED,6EAA6E;AAC7E,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,sEAAsE;AACtE,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,+EAA+E;AAC/E,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAErD"}
|
package/dist/catalog.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { quoteIdent } from './schema.js';
|
|
2
|
+
/** The table a PgVectorRagProvider keeps one record per collection in, by default. */
|
|
3
|
+
export const DEFAULT_CATALOG_TABLE = 'rag_collection_catalog';
|
|
4
|
+
/**
|
|
5
|
+
* The catalog's DDL. No IF NOT EXISTS: the provider checks for the table,
|
|
6
|
+
* creates it, and re-checks on failure (spec §9.10). Exported so an operator
|
|
7
|
+
* running with `autoCreateSchema: false` can create it. Attributes are JSON
|
|
8
|
+
* text, so null and absent stay apart and nothing is normalized.
|
|
9
|
+
*/
|
|
10
|
+
export function createCatalogTableSql(table) {
|
|
11
|
+
return `CREATE TABLE ${quoteIdent(table)} (
|
|
12
|
+
store_name VARCHAR(63) PRIMARY KEY,
|
|
13
|
+
collection_name TEXT NOT NULL,
|
|
14
|
+
scope VARCHAR(16) NOT NULL,
|
|
15
|
+
user_id TEXT,
|
|
16
|
+
session_id TEXT,
|
|
17
|
+
attributes_json TEXT,
|
|
18
|
+
created_at TIMESTAMPTZ DEFAULT NOW()
|
|
19
|
+
)`;
|
|
20
|
+
}
|
|
21
|
+
/** Resolves like the handles' own statements do: through the search_path. */
|
|
22
|
+
export function tableExistsSql() {
|
|
23
|
+
return 'SELECT to_regclass($1) IS NOT NULL AS present';
|
|
24
|
+
}
|
|
25
|
+
/** Fails with the backend's own error when the table is not there. */
|
|
26
|
+
export function probeTableSql(table) {
|
|
27
|
+
return `SELECT COUNT(*) AS n FROM ${quoteIdent(table)} WHERE 1 = 0`;
|
|
28
|
+
}
|
|
29
|
+
export function recordExistsSql(table) {
|
|
30
|
+
return `SELECT 1 AS present FROM ${quoteIdent(table)} WHERE store_name = $1`;
|
|
31
|
+
}
|
|
32
|
+
/** Create-if-absent: the primary key refuses a second record for one store. */
|
|
33
|
+
export function insertRecordSql(table) {
|
|
34
|
+
return `INSERT INTO ${quoteIdent(table)} (store_name, collection_name, scope, user_id, session_id, attributes_json) VALUES ($1, $2, $3, $4, $5, $6)`;
|
|
35
|
+
}
|
|
36
|
+
export function selectRecordsSql(table) {
|
|
37
|
+
return `SELECT store_name AS "storeName", collection_name AS "name", scope AS "scope", user_id AS "userId", session_id AS "sessionId", attributes_json AS "attributesJson" FROM ${quoteIdent(table)} ORDER BY store_name`;
|
|
38
|
+
}
|
|
39
|
+
export function deleteRecordSql(table) {
|
|
40
|
+
return `DELETE FROM ${quoteIdent(table)} WHERE store_name = $1`;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,sFAAsF;AACtF,MAAM,CAAC,MAAM,qBAAqB,GAAG,wBAAwB,CAAC;AAE9D;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,OAAO,gBAAgB,UAAU,CAAC,KAAK,CAAC;;;;;;;;IAQtC,CAAC;AACL,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,cAAc;IAC5B,OAAO,+CAA+C,CAAC;AACzD,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,OAAO,6BAA6B,UAAU,CAAC,KAAK,CAAC,cAAc,CAAC;AACtE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,OAAO,4BAA4B,UAAU,CAAC,KAAK,CAAC,wBAAwB,CAAC;AAC/E,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,OAAO,eAAe,UAAU,CAAC,KAAK,CAAC,6GAA6G,CAAC;AACvJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa;IAC5C,OAAO,2KAA2K,UAAU,CAAC,KAAK,CAAC,sBAAsB,CAAC;AAC5N,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,OAAO,eAAe,UAAU,CAAC,KAAK,CAAC,wBAAwB,CAAC;AAClE,CAAC"}
|
package/dist/connection.d.ts
CHANGED
|
@@ -1,10 +1,22 @@
|
|
|
1
|
+
import type { ISecretLoginCredential } from '@mcp-abap-adt/interfaces-auth';
|
|
1
2
|
export interface PgVectorRagConfig {
|
|
3
|
+
/** The ADDRESS only. A string carrying credentials is refused below. */
|
|
2
4
|
connectionString?: string;
|
|
3
5
|
host?: string;
|
|
4
6
|
port?: number;
|
|
5
|
-
user?: string;
|
|
6
|
-
password?: string;
|
|
7
7
|
database?: string;
|
|
8
|
+
/**
|
|
9
|
+
* The password half is handed to `pg` as a function (see
|
|
10
|
+
* `resolvePgConnectArgs` below), not resolved to a string here — a
|
|
11
|
+
* `PgVectorRag`'s pool reuses one config object for every physical
|
|
12
|
+
* connection it opens over its lifetime, so a string resolved once would
|
|
13
|
+
* freeze a rotating credential for as long as the pool lives. `principal`
|
|
14
|
+
* (the identity) is read once: it does not rotate.
|
|
15
|
+
*
|
|
16
|
+
* Optional: a target that accepts trust/peer auth (or PGUSER/PGPASSWORD
|
|
17
|
+
* from the environment) works today without one.
|
|
18
|
+
*/
|
|
19
|
+
credential?: ISecretLoginCredential;
|
|
8
20
|
schema?: string;
|
|
9
21
|
collectionName: string;
|
|
10
22
|
dimension?: number;
|
|
@@ -13,14 +25,24 @@ export interface PgVectorRagConfig {
|
|
|
13
25
|
connectTimeout?: number;
|
|
14
26
|
}
|
|
15
27
|
export interface PgPoolConfig {
|
|
16
|
-
connectionString?: string;
|
|
17
28
|
host?: string;
|
|
18
29
|
port?: number;
|
|
19
30
|
user?: string;
|
|
20
|
-
|
|
31
|
+
/**
|
|
32
|
+
* A function, not a resolved string, when a `credential` was given: `pg`
|
|
33
|
+
* (both the published types, `@types/pg`'s
|
|
34
|
+
* `password?: string | (() => string | Promise<string>)`, and the
|
|
35
|
+
* installed runtime, which checks `typeof this.password === 'function'`
|
|
36
|
+
* per client in `lib/client.js`) calls this once per physical connection
|
|
37
|
+
* it opens — which is what makes a rotating credential actually rotate
|
|
38
|
+
* across the pool's lifetime, not just across pool *construction*.
|
|
39
|
+
*/
|
|
40
|
+
password?: string | (() => string | Promise<string>);
|
|
21
41
|
database?: string;
|
|
22
42
|
max: number;
|
|
23
43
|
connectionTimeoutMillis: number;
|
|
44
|
+
/** The rest of a connection string's settings (`ssl`, `options`, …), as pg parses them. */
|
|
45
|
+
[setting: string]: unknown;
|
|
24
46
|
}
|
|
25
|
-
export declare function resolvePgConnectArgs(cfg: PgVectorRagConfig): PgPoolConfig
|
|
47
|
+
export declare function resolvePgConnectArgs(cfg: PgVectorRagConfig): Promise<PgPoolConfig>;
|
|
26
48
|
//# sourceMappingURL=connection.d.ts.map
|
package/dist/connection.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAG5E,MAAM,WAAW,iBAAiB;IAChC,wEAAwE;IACxE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;;;;;;;OAUG;IACH,UAAU,CAAC,EAAE,sBAAsB,CAAC;IACpC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACrD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,uBAAuB,EAAE,MAAM,CAAC;IAChC,2FAA2F;IAC3F,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;CAC5B;AAED,wBAAsB,oBAAoB,CACxC,GAAG,EAAE,iBAAiB,GACrB,OAAO,CAAC,YAAY,CAAC,CA0DvB"}
|
package/dist/connection.js
CHANGED
|
@@ -1,9 +1,33 @@
|
|
|
1
|
-
|
|
1
|
+
import { parse as parseConnectionString } from 'pg-connection-string';
|
|
2
|
+
export async function resolvePgConnectArgs(cfg) {
|
|
2
3
|
const max = cfg.poolMax ?? 10;
|
|
3
4
|
const connectionTimeoutMillis = cfg.connectTimeout ?? 30_000;
|
|
5
|
+
if (cfg.connectionString && /\/\/[^/@]*:[^/@]*@/.test(cfg.connectionString)) {
|
|
6
|
+
throw new Error('connectionString must carry the address only; pass the identity and secret as ' +
|
|
7
|
+
'a credential — staticLogin(user, password)');
|
|
8
|
+
}
|
|
9
|
+
const credential = cfg.credential;
|
|
10
|
+
const user = credential?.principal;
|
|
11
|
+
// Handed to `pg` as the function itself, deliberately not awaited here —
|
|
12
|
+
// resolving it now would bake today's value into the pool's config object,
|
|
13
|
+
// which `pg` then reuses for every physical connection it opens for as
|
|
14
|
+
// long as the pool lives. Passing the function lets `pg` call it fresh
|
|
15
|
+
// per connection, so a rotating credential actually rotates.
|
|
16
|
+
const password = credential ? () => credential.secret() : undefined;
|
|
4
17
|
if (cfg.connectionString) {
|
|
18
|
+
// Parsed here, NOT handed to pg as `connectionString`: pg merges the parsed
|
|
19
|
+
// string OVER the config, and a URL without userinfo parses to user "" and
|
|
20
|
+
// password "" — which silently replaced the credential, so the pool
|
|
21
|
+
// connected as the OS user with no password. The same parser pg uses, so
|
|
22
|
+
// every setting the string carries (ssl, options, …) still applies.
|
|
23
|
+
const { user: _user, password: _password, port, host, database, ...settings } = parseConnectionString(cfg.connectionString);
|
|
5
24
|
return {
|
|
6
|
-
|
|
25
|
+
...settings,
|
|
26
|
+
host: host ?? undefined,
|
|
27
|
+
port: port ? Number(port) : undefined,
|
|
28
|
+
database: database ?? undefined,
|
|
29
|
+
user,
|
|
30
|
+
password,
|
|
7
31
|
max,
|
|
8
32
|
connectionTimeoutMillis,
|
|
9
33
|
};
|
|
@@ -14,8 +38,8 @@ export function resolvePgConnectArgs(cfg) {
|
|
|
14
38
|
return {
|
|
15
39
|
host: cfg.host,
|
|
16
40
|
port: cfg.port ?? 5432,
|
|
17
|
-
user
|
|
18
|
-
password
|
|
41
|
+
user,
|
|
42
|
+
password,
|
|
19
43
|
database: cfg.database,
|
|
20
44
|
max,
|
|
21
45
|
connectionTimeoutMillis,
|
package/dist/connection.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,IAAI,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAiDtE,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,GAAsB;IAEtB,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;IAC9B,MAAM,uBAAuB,GAAG,GAAG,CAAC,cAAc,IAAI,MAAM,CAAC;IAE7D,IAAI,GAAG,CAAC,gBAAgB,IAAI,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC5E,MAAM,IAAI,KAAK,CACb,gFAAgF;YAC9E,4CAA4C,CAC/C,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,GAAG,CAAC,UAAU,CAAC;IAClC,MAAM,IAAI,GAAG,UAAU,EAAE,SAAS,CAAC;IACnC,yEAAyE;IACzE,2EAA2E;IAC3E,uEAAuE;IACvE,uEAAuE;IACvE,6DAA6D;IAC7D,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAEpE,IAAI,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACzB,4EAA4E;QAC5E,2EAA2E;QAC3E,oEAAoE;QACpE,yEAAyE;QACzE,oEAAoE;QACpE,MAAM,EACJ,IAAI,EAAE,KAAK,EACX,QAAQ,EAAE,SAAS,EACnB,IAAI,EACJ,IAAI,EACJ,QAAQ,EACR,GAAG,QAAQ,EACZ,GAAG,qBAAqB,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAChD,OAAO;YACL,GAAG,QAAQ;YACX,IAAI,EAAE,IAAI,IAAI,SAAS;YACvB,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;YACrC,QAAQ,EAAE,QAAQ,IAAI,SAAS;YAC/B,IAAI;YACJ,QAAQ;YACR,GAAG;YACH,uBAAuB;SACxB,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IACD,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,IAAI,EAAE,GAAG,CAAC,IAAI,IAAI,IAAI;QACtB,IAAI;QACJ,QAAQ;QACR,QAAQ,EAAE,GAAG,CAAC,QAAQ;QACtB,GAAG;QACH,uBAAuB;KACxB,CAAC;AACJ,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
export { createCatalogTableSql, DEFAULT_CATALOG_TABLE } from './catalog.js';
|
|
1
2
|
export type { PgVectorRagConfig } from './pg-vector-rag.js';
|
|
2
|
-
export { PgVectorRag } from './pg-vector-rag.js';
|
|
3
|
+
export { createPgClient, PgVectorRag } from './pg-vector-rag.js';
|
|
3
4
|
export type { PgVectorRagProviderConfig } from './pg-vector-rag-provider.js';
|
|
4
5
|
export { PgVectorRagProvider } from './pg-vector-rag-provider.js';
|
|
5
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAC5E,YAAY,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjE,YAAY,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAC7E,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { createCatalogTableSql, DEFAULT_CATALOG_TABLE } from './catalog.js';
|
|
2
|
+
export { createPgClient, PgVectorRag } from './pg-vector-rag.js';
|
|
2
3
|
export { PgVectorRagProvider } from './pg-vector-rag-provider.js';
|
|
3
4
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AAE5E,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC"}
|