@mcp-abap-adt/hana-vector-rag 11.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.
Files changed (38) hide show
  1. package/README.md +26 -0
  2. package/dist/__tests__/connection.test.d.ts +2 -0
  3. package/dist/__tests__/connection.test.d.ts.map +1 -0
  4. package/dist/__tests__/connection.test.js +35 -0
  5. package/dist/__tests__/connection.test.js.map +1 -0
  6. package/dist/__tests__/hana-vector-rag-provider.test.d.ts +2 -0
  7. package/dist/__tests__/hana-vector-rag-provider.test.d.ts.map +1 -0
  8. package/dist/__tests__/hana-vector-rag-provider.test.js +127 -0
  9. package/dist/__tests__/hana-vector-rag-provider.test.js.map +1 -0
  10. package/dist/__tests__/hana-vector-rag.test.d.ts +2 -0
  11. package/dist/__tests__/hana-vector-rag.test.d.ts.map +1 -0
  12. package/dist/__tests__/hana-vector-rag.test.js +108 -0
  13. package/dist/__tests__/hana-vector-rag.test.js.map +1 -0
  14. package/dist/__tests__/schema.test.d.ts +2 -0
  15. package/dist/__tests__/schema.test.d.ts.map +1 -0
  16. package/dist/__tests__/schema.test.js +30 -0
  17. package/dist/__tests__/schema.test.js.map +1 -0
  18. package/dist/connection.d.ts +24 -0
  19. package/dist/connection.d.ts.map +1 -0
  20. package/dist/connection.js +30 -0
  21. package/dist/connection.js.map +1 -0
  22. package/dist/hana-vector-rag-provider.d.ts +49 -0
  23. package/dist/hana-vector-rag-provider.d.ts.map +1 -0
  24. package/dist/hana-vector-rag-provider.js +89 -0
  25. package/dist/hana-vector-rag-provider.js.map +1 -0
  26. package/dist/hana-vector-rag.d.ts +39 -0
  27. package/dist/hana-vector-rag.d.ts.map +1 -0
  28. package/dist/hana-vector-rag.js +192 -0
  29. package/dist/hana-vector-rag.js.map +1 -0
  30. package/dist/index.d.ts +5 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +3 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/schema.d.ts +5 -0
  35. package/dist/schema.d.ts.map +1 -0
  36. package/dist/schema.js +25 -0
  37. package/dist/schema.js.map +1 -0
  38. package/package.json +37 -0
package/README.md ADDED
@@ -0,0 +1,26 @@
1
+ # @mcp-abap-adt/hana-vector-rag
2
+
3
+ SAP HANA Cloud Vector Engine backend for [@mcp-abap-adt/llm-agent](https://www.npmjs.com/package/@mcp-abap-adt/llm-agent).
4
+
5
+ Provides:
6
+ - `HanaVectorRag` — `IRag` implementation backed by `REAL_VECTOR(dim)` columns.
7
+ - `HanaVectorRagProvider` — `IRagProvider` for session/user/global collections.
8
+
9
+ ## Install
10
+
11
+ ```bash
12
+ npm install @mcp-abap-adt/hana-vector-rag @sap/hana-client
13
+ ```
14
+
15
+ ## Minimal config
16
+
17
+ ```yaml
18
+ rag:
19
+ type: hana-vector
20
+ connectionString: hdbsql://user:pass@host:443
21
+ collectionName: llm_agent_docs
22
+ dimension: 1536
23
+ autoCreateSchema: true
24
+ ```
25
+
26
+ See the monorepo root README for full configuration surface.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=connection.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/connection.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,35 @@
1
+ import assert from 'node:assert/strict';
2
+ import { describe, it } from 'node:test';
3
+ import { resolveHanaConnectArgs } from '../connection.js';
4
+ describe('resolveHanaConnectArgs', () => {
5
+ it('accepts explicit fields', () => {
6
+ const args = resolveHanaConnectArgs({
7
+ host: 'h.example.com',
8
+ port: 443,
9
+ user: 'U1',
10
+ password: 'pw',
11
+ collectionName: 't',
12
+ });
13
+ assert.equal(args.serverNode, 'h.example.com:443');
14
+ assert.equal(args.uid, 'U1');
15
+ assert.equal(args.pwd, 'pw');
16
+ assert.equal(args.encrypt, 'true');
17
+ });
18
+ it('parses hdbsql URL', () => {
19
+ const args = resolveHanaConnectArgs({
20
+ connectionString: 'hdbsql://u:p@host.example:443',
21
+ collectionName: 't',
22
+ });
23
+ assert.equal(args.serverNode, 'host.example:443');
24
+ assert.equal(args.uid, 'u');
25
+ assert.equal(args.pwd, 'p');
26
+ });
27
+ it('rejects missing host', () => {
28
+ assert.throws(() => resolveHanaConnectArgs({
29
+ user: 'u',
30
+ password: 'p',
31
+ collectionName: 't',
32
+ }), /host/i);
33
+ });
34
+ });
35
+ //# sourceMappingURL=connection.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.test.js","sourceRoot":"","sources":["../../src/__tests__/connection.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAC;AAE1D,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;IACtC,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,IAAI,GAAG,sBAAsB,CAAC;YAClC,IAAI,EAAE,eAAe;YACrB,IAAI,EAAE,GAAG;YACT,IAAI,EAAE,IAAI;YACV,QAAQ,EAAE,IAAI;YACd,cAAc,EAAE,GAAG;SACpB,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,mBAAmB,CAAC,CAAC;QACnD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QAC7B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mBAAmB,EAAE,GAAG,EAAE;QAC3B,MAAM,IAAI,GAAG,sBAAsB,CAAC;YAClC,gBAAgB,EAAE,+BAA+B;YACjD,cAAc,EAAE,GAAG;SACpB,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;QAClD,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC5B,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAC9B,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CACH,sBAAsB,CAAC;YACrB,IAAI,EAAE,GAAG;YACT,QAAQ,EAAE,GAAG;YACb,cAAc,EAAE,GAAG;SACpB,CAAC,EACJ,OAAO,CACR,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=hana-vector-rag-provider.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hana-vector-rag-provider.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/hana-vector-rag-provider.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,127 @@
1
+ import assert from 'node:assert/strict';
2
+ import { describe, it } from 'node:test';
3
+ import { HanaVectorRagProvider } from '../hana-vector-rag-provider.js';
4
+ function makeEmbedder() {
5
+ return {
6
+ async embed() {
7
+ return { vector: [0, 0, 0] };
8
+ },
9
+ };
10
+ }
11
+ function makeFakeClient(rows = []) {
12
+ const calls = [];
13
+ return {
14
+ calls,
15
+ async exec(sql, params = []) {
16
+ calls.push({ sql, params });
17
+ return { rowCount: 1 };
18
+ },
19
+ async query(sql, params = []) {
20
+ calls.push({ sql, params });
21
+ return rows;
22
+ },
23
+ async close() { },
24
+ };
25
+ }
26
+ describe('HanaVectorRagProvider', () => {
27
+ it('createCollection returns rag + editor, runs schema bootstrap when autoCreateSchema=true', async () => {
28
+ const client = makeFakeClient();
29
+ const provider = new HanaVectorRagProvider({
30
+ name: 'hana',
31
+ embedder: makeEmbedder(),
32
+ connection: {
33
+ collectionName: '__ignored',
34
+ host: 'h',
35
+ user: 'u',
36
+ password: 'p',
37
+ },
38
+ defaultDimension: 3,
39
+ autoCreateSchema: true,
40
+ clientFactory: () => client,
41
+ });
42
+ const r = await provider.createCollection('docs', {
43
+ scope: 'session',
44
+ sessionId: 's1',
45
+ });
46
+ assert.equal(r.ok, true);
47
+ if (!r.ok)
48
+ throw new Error('unreachable');
49
+ assert.ok(client.calls.some((c) => c.sql.includes('CREATE TABLE') && c.sql.includes('"docs"')));
50
+ });
51
+ it('createCollection skips DDL when autoCreateSchema=false', async () => {
52
+ const client = makeFakeClient();
53
+ const provider = new HanaVectorRagProvider({
54
+ name: 'hana',
55
+ embedder: makeEmbedder(),
56
+ connection: {
57
+ collectionName: '__ignored',
58
+ host: 'h',
59
+ user: 'u',
60
+ password: 'p',
61
+ },
62
+ defaultDimension: 3,
63
+ autoCreateSchema: false,
64
+ clientFactory: () => client,
65
+ });
66
+ const r = await provider.createCollection('docs', { scope: 'global' });
67
+ assert.equal(r.ok, true);
68
+ assert.ok(!client.calls.some((c) => c.sql.includes('CREATE TABLE')));
69
+ });
70
+ it('deleteCollection emits DROP TABLE', async () => {
71
+ const client = makeFakeClient();
72
+ const provider = new HanaVectorRagProvider({
73
+ name: 'hana',
74
+ embedder: makeEmbedder(),
75
+ connection: {
76
+ collectionName: '__ignored',
77
+ host: 'h',
78
+ user: 'u',
79
+ password: 'p',
80
+ },
81
+ clientFactory: () => client,
82
+ });
83
+ const r = await provider.deleteCollection('docs');
84
+ assert.equal(r.ok, true);
85
+ assert.ok(client.calls.some((c) => c.sql.startsWith('DROP TABLE')));
86
+ });
87
+ it('listCollections queries SYS.TABLES and returns names', async () => {
88
+ const client = makeFakeClient([
89
+ { TABLE_NAME: 'docs' },
90
+ { TABLE_NAME: 'other' },
91
+ ]);
92
+ const provider = new HanaVectorRagProvider({
93
+ name: 'hana',
94
+ embedder: makeEmbedder(),
95
+ connection: {
96
+ collectionName: '__ignored',
97
+ host: 'h',
98
+ user: 'u',
99
+ password: 'p',
100
+ },
101
+ clientFactory: () => client,
102
+ });
103
+ const r = await provider.listCollections();
104
+ assert.equal(r.ok, true);
105
+ if (!r.ok)
106
+ throw new Error('unreachable');
107
+ assert.deepEqual(r.value, ['docs', 'other']);
108
+ });
109
+ it('rejects unsupported scope', async () => {
110
+ const client = makeFakeClient();
111
+ const provider = new HanaVectorRagProvider({
112
+ name: 'hana',
113
+ embedder: makeEmbedder(),
114
+ connection: {
115
+ collectionName: '__ignored',
116
+ host: 'h',
117
+ user: 'u',
118
+ password: 'p',
119
+ },
120
+ clientFactory: () => client,
121
+ supportedScopes: ['global'],
122
+ });
123
+ const r = await provider.createCollection('docs', { scope: 'session' });
124
+ assert.equal(r.ok, false);
125
+ });
126
+ });
127
+ //# sourceMappingURL=hana-vector-rag-provider.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hana-vector-rag-provider.test.js","sourceRoot":"","sources":["../../src/__tests__/hana-vector-rag-provider.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=hana-vector-rag.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hana-vector-rag.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/hana-vector-rag.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,108 @@
1
+ import assert from 'node:assert/strict';
2
+ import { describe, it } from 'node:test';
3
+ import { HanaVectorRag } from '../hana-vector-rag.js';
4
+ function makeEmbedder(dim = 3) {
5
+ return {
6
+ async embed(text) {
7
+ let h = 0;
8
+ for (const ch of text)
9
+ h = (h * 31 + ch.charCodeAt(0)) | 0;
10
+ return {
11
+ vector: Array.from({ length: dim }, (_, i) => ((h >> i) & 0xff) / 255),
12
+ };
13
+ },
14
+ };
15
+ }
16
+ function makeFakeClient(rows = []) {
17
+ const calls = [];
18
+ return {
19
+ calls,
20
+ async exec(sql, params = []) {
21
+ calls.push({ sql, params });
22
+ return { rowCount: 1 };
23
+ },
24
+ async query(sql, params = []) {
25
+ calls.push({ sql, params });
26
+ return rows;
27
+ },
28
+ async close() {
29
+ /* noop */
30
+ },
31
+ };
32
+ }
33
+ describe('HanaVectorRag', () => {
34
+ it('ensureSchema runs CREATE TABLE only once', async () => {
35
+ const client = makeFakeClient();
36
+ const rag = new HanaVectorRag({ collectionName: 'docs', dimension: 3, embedder: makeEmbedder(3) }, client);
37
+ await rag.ensureSchema();
38
+ await rag.ensureSchema();
39
+ const creates = client.calls.filter((c) => c.sql.includes('CREATE TABLE'));
40
+ assert.equal(creates.length, 1);
41
+ });
42
+ it('query returns results mapped from rows', async () => {
43
+ const rows = [
44
+ { id: 'a', text: 'hello', metadata: '{"namespace":"n"}', score: 0.9 },
45
+ ];
46
+ const client = makeFakeClient(rows);
47
+ const rag = new HanaVectorRag({ collectionName: 'docs', dimension: 3, embedder: makeEmbedder(3) }, client);
48
+ const res = await rag.query({ text: 'test query', toVector: async () => [0.1, 0.2, 0.3] }, 5);
49
+ assert.equal(res.ok, true);
50
+ if (!res.ok)
51
+ throw new Error('unreachable');
52
+ assert.equal(res.value.length, 1);
53
+ assert.equal(res.value[0].text, 'hello');
54
+ assert.equal(res.value[0].metadata?.namespace, 'n');
55
+ });
56
+ it('upsertRaw issues UPSERT with vector literal', async () => {
57
+ const client = makeFakeClient();
58
+ const rag = new HanaVectorRag({ collectionName: 'docs', dimension: 3, embedder: makeEmbedder(3) }, client);
59
+ const r = await rag.writer().upsertRaw('id1', 'text', { namespace: 'n' });
60
+ assert.equal(r.ok, true);
61
+ const upsert = client.calls.find((c) => c.sql.startsWith('UPSERT'));
62
+ assert.ok(upsert, 'UPSERT should have been issued');
63
+ });
64
+ it('deleteByIdRaw issues DELETE', async () => {
65
+ const client = makeFakeClient();
66
+ const rag = new HanaVectorRag({ collectionName: 'docs', dimension: 3, embedder: makeEmbedder(3) }, client);
67
+ const r = await rag.writer().deleteByIdRaw('id1');
68
+ assert.equal(r.ok, true);
69
+ assert.ok(client.calls.some((c) => c.sql.includes('DELETE FROM')));
70
+ });
71
+ it('deleteByIdRaw reports false when no row matched', async () => {
72
+ const calls = [];
73
+ const client = {
74
+ async exec(sql, params = []) {
75
+ calls.push({ sql, params });
76
+ return { rowCount: 0 };
77
+ },
78
+ async query() {
79
+ return [];
80
+ },
81
+ async close() { },
82
+ };
83
+ const rag = new HanaVectorRag({ collectionName: 'docs', dimension: 3, embedder: makeEmbedder(3) }, client);
84
+ const r = await rag.writer().deleteByIdRaw('missing');
85
+ assert.equal(r.ok, true);
86
+ if (!r.ok)
87
+ throw new Error('unreachable');
88
+ assert.equal(r.value, false);
89
+ });
90
+ it('clearAll issues TRUNCATE', async () => {
91
+ const client = makeFakeClient();
92
+ const rag = new HanaVectorRag({ collectionName: 'docs', dimension: 3, embedder: makeEmbedder(3) }, client);
93
+ const r = await rag.writer().clearAll();
94
+ assert.equal(r.ok, true);
95
+ assert.ok(client.calls.some((c) => c.sql.startsWith('TRUNCATE')));
96
+ });
97
+ it('healthCheck runs SELECT 1 FROM DUMMY', async () => {
98
+ const client = makeFakeClient([{ '1': 1 }]);
99
+ const rag = new HanaVectorRag({ collectionName: 'docs', dimension: 3, embedder: makeEmbedder(3) }, client);
100
+ const r = await rag.healthCheck();
101
+ assert.equal(r.ok, true);
102
+ assert.ok(client.calls.some((c) => c.sql.includes('FROM DUMMY')));
103
+ });
104
+ it('rejects invalid collection name at construction', () => {
105
+ assert.throws(() => new HanaVectorRag({ collectionName: "bad'; DROP", embedder: makeEmbedder() }, makeFakeClient()), (err) => err.code === 'INVALID_COLLECTION_NAME');
106
+ });
107
+ });
108
+ //# sourceMappingURL=hana-vector-rag.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hana-vector-rag.test.js","sourceRoot":"","sources":["../../src/__tests__/hana-vector-rag.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=schema.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/schema.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,30 @@
1
+ import assert from 'node:assert/strict';
2
+ import { describe, it } from 'node:test';
3
+ import { assertCollectionName, createTableSql, dropTableSql, quoteIdent, } from '../schema.js';
4
+ describe('hana schema', () => {
5
+ it('accepts a safe collection name', () => {
6
+ assertCollectionName('llm_agent_docs_2');
7
+ });
8
+ it('rejects collection name starting with digit', () => {
9
+ assert.throws(() => assertCollectionName('1bad'), (err) => err.code === 'INVALID_COLLECTION_NAME');
10
+ });
11
+ it('rejects collection name with special chars', () => {
12
+ assert.throws(() => assertCollectionName("x'); DROP"), (err) => err.code === 'INVALID_COLLECTION_NAME');
13
+ });
14
+ it('rejects names longer than 63 chars', () => {
15
+ assert.throws(() => assertCollectionName('a'.repeat(64)), (err) => err.code === 'INVALID_COLLECTION_NAME');
16
+ });
17
+ it('quotes HANA identifiers', () => {
18
+ assert.equal(quoteIdent('llm_docs'), '"llm_docs"');
19
+ });
20
+ it('emits CREATE TABLE DDL with REAL_VECTOR and NCLOB', () => {
21
+ const sql = createTableSql('llm_docs', 1536);
22
+ assert.match(sql, /CREATE TABLE IF NOT EXISTS "llm_docs"/);
23
+ assert.match(sql, /REAL_VECTOR\(1536\)/);
24
+ assert.match(sql, /metadata NCLOB/);
25
+ });
26
+ it('emits DROP TABLE DDL with IF EXISTS', () => {
27
+ assert.equal(dropTableSql('llm_docs'), 'DROP TABLE IF EXISTS "llm_docs"');
28
+ });
29
+ });
30
+ //# sourceMappingURL=schema.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.test.js","sourceRoot":"","sources":["../../src/__tests__/schema.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EACL,oBAAoB,EACpB,cAAc,EACd,YAAY,EACZ,UAAU,GACX,MAAM,cAAc,CAAC;AAEtB,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,oBAAoB,CAAC,kBAAkB,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAClC,CAAC,GAA8B,EAAE,EAAE,CACjC,GAAG,CAAC,IAAI,KAAK,yBAAyB,CACzC,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACpD,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,oBAAoB,CAAC,WAAW,CAAC,EACvC,CAAC,GAA8B,EAAE,EAAE,CACjC,GAAG,CAAC,IAAI,KAAK,yBAAyB,CACzC,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,MAAM,CAAC,MAAM,CACX,GAAG,EAAE,CAAC,oBAAoB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAC1C,CAAC,GAA8B,EAAE,EAAE,CACjC,GAAG,CAAC,IAAI,KAAK,yBAAyB,CACzC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,YAAY,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,GAAG,GAAG,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QAC7C,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,uCAAuC,CAAC,CAAC;QAC3D,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,qBAAqB,CAAC,CAAC;QACzC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,KAAK,CAAC,YAAY,CAAC,UAAU,CAAC,EAAE,iCAAiC,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,24 @@
1
+ export interface HanaVectorRagConfig {
2
+ connectionString?: string;
3
+ host?: string;
4
+ port?: number;
5
+ user?: string;
6
+ password?: string;
7
+ schema?: string;
8
+ collectionName: string;
9
+ dimension?: number;
10
+ autoCreateSchema?: boolean;
11
+ poolMax?: number;
12
+ connectTimeout?: number;
13
+ }
14
+ export interface HanaConnectArgs {
15
+ serverNode: string;
16
+ uid: string;
17
+ pwd: string;
18
+ encrypt: 'true' | 'false';
19
+ sslValidateCertificate?: 'true' | 'false';
20
+ currentSchema?: string;
21
+ communicationTimeout?: number;
22
+ }
23
+ export declare function resolveHanaConnectArgs(cfg: HanaVectorRagConfig): HanaConnectArgs;
24
+ //# sourceMappingURL=connection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,mBAAmB;IAClC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,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,eAAe;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1B,sBAAsB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC1C,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,mBAAmB,GACvB,eAAe,CA6BjB"}
@@ -0,0 +1,30 @@
1
+ export function resolveHanaConnectArgs(cfg) {
2
+ let host = cfg.host;
3
+ let port = cfg.port;
4
+ let user = cfg.user;
5
+ let password = cfg.password;
6
+ if (cfg.connectionString) {
7
+ const normalized = cfg.connectionString.replace(/^hdbsql:\/\//, 'https://');
8
+ const u = new URL(normalized);
9
+ host ??= u.hostname;
10
+ port ??= u.port ? Number(u.port) : 443;
11
+ user ??= decodeURIComponent(u.username);
12
+ password ??= decodeURIComponent(u.password);
13
+ }
14
+ if (!host)
15
+ throw new Error('HANA host is required (host or connectionString)');
16
+ if (!user)
17
+ throw new Error('HANA user is required');
18
+ if (!password)
19
+ throw new Error('HANA password is required');
20
+ return {
21
+ serverNode: `${host}:${port ?? 443}`,
22
+ uid: user,
23
+ pwd: password,
24
+ encrypt: 'true',
25
+ sslValidateCertificate: 'true',
26
+ currentSchema: cfg.schema,
27
+ communicationTimeout: cfg.connectTimeout ?? 30_000,
28
+ };
29
+ }
30
+ //# sourceMappingURL=connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connection.js","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AAwBA,MAAM,UAAU,sBAAsB,CACpC,GAAwB;IAExB,IAAI,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;IACpB,IAAI,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;IACpB,IAAI,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;IACpB,IAAI,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;IAE5B,IAAI,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC;QAC5E,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;QAC9B,IAAI,KAAK,CAAC,CAAC,QAAQ,CAAC;QACpB,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACvC,IAAI,KAAK,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACxC,QAAQ,KAAK,kBAAkB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,CAAC,IAAI;QACP,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;IACpD,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAE5D,OAAO;QACL,UAAU,EAAE,GAAG,IAAI,IAAI,IAAI,IAAI,GAAG,EAAE;QACpC,GAAG,EAAE,IAAI;QACT,GAAG,EAAE,QAAQ;QACb,OAAO,EAAE,MAAM;QACf,sBAAsB,EAAE,MAAM;QAC9B,aAAa,EAAE,GAAG,CAAC,MAAM;QACzB,oBAAoB,EAAE,GAAG,CAAC,cAAc,IAAI,MAAM;KACnD,CAAC;AACJ,CAAC"}
@@ -0,0 +1,49 @@
1
+ import type { IEmbedder, IIdStrategy, IRag, IRagEditor, RagCollectionScope, Result } from '@mcp-abap-adt/llm-agent';
2
+ import { AbstractRagProvider, RagError } from '@mcp-abap-adt/llm-agent';
3
+ import type { HanaVectorRagConfig } from './connection.js';
4
+ import { type HanaClient } from './hana-vector-rag.js';
5
+ export interface HanaVectorRagProviderConfig {
6
+ name: string;
7
+ embedder: IEmbedder;
8
+ connection: HanaVectorRagConfig | string;
9
+ defaultDimension?: number;
10
+ autoCreateSchema?: boolean;
11
+ editable?: boolean;
12
+ supportedScopes?: readonly RagCollectionScope[];
13
+ idStrategyFactory?: (opts: {
14
+ scope: RagCollectionScope;
15
+ sessionId?: string;
16
+ userId?: string;
17
+ }) => IIdStrategy;
18
+ /**
19
+ * Optional factory for driver clients used by deleteCollection / listCollections
20
+ * and (in tests) by createCollection. When omitted, deleteCollection and
21
+ * listCollections throw because schema-level operations require a shared client
22
+ * outside the per-collection HanaVectorRag lifecycle.
23
+ */
24
+ clientFactory?: () => HanaClient;
25
+ }
26
+ export declare class HanaVectorRagProvider extends AbstractRagProvider {
27
+ readonly name: string;
28
+ readonly kind = "vector";
29
+ readonly editable: boolean;
30
+ readonly supportedScopes: readonly RagCollectionScope[];
31
+ private readonly embedder;
32
+ private readonly connection;
33
+ private readonly defaultDimension;
34
+ private readonly autoCreateSchema;
35
+ private readonly clientFactory?;
36
+ constructor(cfg: HanaVectorRagProviderConfig);
37
+ createCollection(name: string, opts: {
38
+ scope: RagCollectionScope;
39
+ sessionId?: string;
40
+ userId?: string;
41
+ }): Promise<Result<{
42
+ rag: IRag;
43
+ editor: IRagEditor;
44
+ }, RagError>>;
45
+ deleteCollection(name: string): Promise<Result<void, RagError>>;
46
+ listCollections(): Promise<Result<string[], RagError>>;
47
+ private requireClient;
48
+ }
49
+ //# sourceMappingURL=hana-vector-rag-provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hana-vector-rag-provider.d.ts","sourceRoot":"","sources":["../src/hana-vector-rag-provider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,WAAW,EACX,IAAI,EACJ,UAAU,EACV,kBAAkB,EAClB,MAAM,EACP,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,KAAK,UAAU,EAAiB,MAAM,sBAAsB,CAAC;AAGtE,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,SAAS,CAAC;IACpB,UAAU,EAAE,mBAAmB,GAAG,MAAM,CAAC;IACzC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAChD,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE;QACzB,KAAK,EAAE,kBAAkB,CAAC;QAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,KAAK,WAAW,CAAC;IAClB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,UAAU,CAAC;CAClC;AAWD,qBAAa,qBAAsB,SAAQ,mBAAmB;IAC5D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,YAAY;IACzB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,eAAe,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAExD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAY;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAsB;IACjD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAU;IAC3C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAmB;gBAEtC,GAAG,EAAE,2BAA2B;IAatC,gBAAgB,CACpB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE;QAAE,KAAK,EAAE,kBAAkB,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GACvE,OAAO,CAAC,MAAM,CAAC;QAAE,GAAG,EAAE,IAAI,CAAC;QAAC,MAAM,EAAE,UAAU,CAAA;KAAE,EAAE,QAAQ,CAAC,CAAC;IAyBzD,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAa/D,eAAe,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,QAAQ,CAAC,CAAC;IAe5D,OAAO,CAAC,aAAa;CAQtB"}
@@ -0,0 +1,89 @@
1
+ import { AbstractRagProvider, RagError } from '@mcp-abap-adt/llm-agent';
2
+ import { HanaVectorRag } from './hana-vector-rag.js';
3
+ import { dropTableSql } from './schema.js';
4
+ function normalizeConnection(c) {
5
+ if (typeof c === 'string') {
6
+ return { connectionString: c, collectionName: '__unused' };
7
+ }
8
+ return c;
9
+ }
10
+ export class HanaVectorRagProvider extends AbstractRagProvider {
11
+ name;
12
+ kind = 'vector';
13
+ editable;
14
+ supportedScopes;
15
+ embedder;
16
+ connection;
17
+ defaultDimension;
18
+ autoCreateSchema;
19
+ clientFactory;
20
+ constructor(cfg) {
21
+ super();
22
+ this.name = cfg.name;
23
+ this.embedder = cfg.embedder;
24
+ this.connection = normalizeConnection(cfg.connection);
25
+ this.defaultDimension = cfg.defaultDimension ?? 1536;
26
+ this.autoCreateSchema = cfg.autoCreateSchema ?? true;
27
+ this.editable = cfg.editable ?? true;
28
+ this.supportedScopes = cfg.supportedScopes ?? ['session', 'user', 'global'];
29
+ this.clientFactory = cfg.clientFactory;
30
+ if (cfg.idStrategyFactory)
31
+ this.idStrategyFactory = cfg.idStrategyFactory;
32
+ }
33
+ async createCollection(name, opts) {
34
+ const scopeCheck = this.checkScope(opts.scope);
35
+ if (!scopeCheck.ok)
36
+ return scopeCheck;
37
+ try {
38
+ const rag = new HanaVectorRag({
39
+ ...this.connection,
40
+ collectionName: name,
41
+ dimension: this.connection.dimension ?? this.defaultDimension,
42
+ autoCreateSchema: this.autoCreateSchema,
43
+ embedder: this.embedder,
44
+ }, this.clientFactory?.());
45
+ if (this.autoCreateSchema)
46
+ await rag.ensureSchema();
47
+ const editor = this.buildEditor(rag, this.pickIdStrategy(opts));
48
+ return { ok: true, value: { rag, editor } };
49
+ }
50
+ catch (err) {
51
+ return {
52
+ ok: false,
53
+ error: new RagError(String(err), 'RAG_CREATE_ERROR'),
54
+ };
55
+ }
56
+ }
57
+ async deleteCollection(name) {
58
+ try {
59
+ const client = this.requireClient();
60
+ await client.exec(dropTableSql(name));
61
+ return { ok: true, value: undefined };
62
+ }
63
+ catch (err) {
64
+ return {
65
+ ok: false,
66
+ error: new RagError(String(err), 'RAG_DELETE_ERROR'),
67
+ };
68
+ }
69
+ }
70
+ async listCollections() {
71
+ try {
72
+ const client = this.requireClient();
73
+ const rows = await client.query(this.connection.schema
74
+ ? 'SELECT TABLE_NAME FROM SYS.TABLES WHERE SCHEMA_NAME = ?'
75
+ : 'SELECT TABLE_NAME FROM SYS.TABLES WHERE SCHEMA_NAME = CURRENT_SCHEMA', this.connection.schema ? [this.connection.schema] : []);
76
+ return { ok: true, value: rows.map((r) => String(r.TABLE_NAME)) };
77
+ }
78
+ catch (err) {
79
+ return { ok: false, error: new RagError(String(err), 'RAG_LIST_ERROR') };
80
+ }
81
+ }
82
+ requireClient() {
83
+ if (!this.clientFactory) {
84
+ throw new Error('HanaVectorRagProvider deleteCollection/listCollections require clientFactory; provide one to enable schema-level operations');
85
+ }
86
+ return this.clientFactory();
87
+ }
88
+ }
89
+ //# sourceMappingURL=hana-vector-rag-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hana-vector-rag-provider.js","sourceRoot":"","sources":["../src/hana-vector-rag-provider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import type { CallOptions, IEmbedder, IQueryEmbedding, IRag, IRagBackendWriter, RagMetadata, RagResult, Result } from '@mcp-abap-adt/llm-agent';
2
+ import { RagError } from '@mcp-abap-adt/llm-agent';
3
+ import type { HanaVectorRagConfig } from './connection.js';
4
+ export type { HanaVectorRagConfig };
5
+ export interface HanaClient {
6
+ exec(sql: string, params?: readonly unknown[]): Promise<{
7
+ rowCount: number;
8
+ }>;
9
+ query(sql: string, params?: readonly unknown[]): Promise<Array<Record<string, unknown>>>;
10
+ close(): Promise<void>;
11
+ }
12
+ export declare class HanaVectorRag implements IRag {
13
+ private readonly collectionName;
14
+ private readonly dimension;
15
+ private readonly embedder;
16
+ private readonly autoCreateSchema;
17
+ private readonly clientPromise;
18
+ private schemaReady;
19
+ private schemaPromise?;
20
+ constructor(config: HanaVectorRagConfig & {
21
+ embedder: IEmbedder;
22
+ }, injectedClient?: HanaClient);
23
+ private createDriverClient;
24
+ /**
25
+ * Idempotent schema bootstrap. Called by both direct makeRag() consumers
26
+ * (when autoCreateSchema is true) and HanaVectorRagProvider.createCollection().
27
+ */
28
+ ensureSchema(): Promise<void>;
29
+ private maybeEnsureSchema;
30
+ private vectorLiteral;
31
+ query(embedding: IQueryEmbedding, k: number, options?: CallOptions): Promise<Result<RagResult[], RagError>>;
32
+ getById(id: string, options?: CallOptions): Promise<Result<RagResult | null, RagError>>;
33
+ healthCheck(): Promise<Result<void, RagError>>;
34
+ upsert(text: string, metadata: RagMetadata, options?: CallOptions): Promise<Result<void, RagError>>;
35
+ upsertPrecomputed(text: string, vector: number[], metadata: RagMetadata): Promise<Result<void, RagError>>;
36
+ private upsertKnown;
37
+ writer(): IRagBackendWriter;
38
+ }
39
+ //# sourceMappingURL=hana-vector-rag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hana-vector-rag.d.ts","sourceRoot":"","sources":["../src/hana-vector-rag.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACT,eAAe,EACf,IAAI,EACJ,iBAAiB,EACjB,WAAW,EACX,SAAS,EACT,MAAM,EACP,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAA0B,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAI3D,YAAY,EAAE,mBAAmB,EAAE,CAAC;AAEpC,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,GAAG,OAAO,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAC9E,KAAK,CACH,GAAG,EAAE,MAAM,EACX,MAAM,CAAC,EAAE,SAAS,OAAO,EAAE,GAC1B,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,qBAAa,aAAc,YAAW,IAAI;IACxC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAY;IACrC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAU;IAC3C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAsB;IACpD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,aAAa,CAAC,CAAgB;gBAGpC,MAAM,EAAE,mBAAmB,GAAG;QAAE,QAAQ,EAAE,SAAS,CAAA;KAAE,EACrD,cAAc,CAAC,EAAE,UAAU;YAgBf,kBAAkB;IAkDhC;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;YAUrB,iBAAiB;IAI/B,OAAO,CAAC,aAAa;IAIf,KAAK,CACT,SAAS,EAAE,eAAe,EAC1B,CAAC,EAAE,MAAM,EACT,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,QAAQ,CAAC,CAAC;IA0BnC,OAAO,CACX,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,EAAE,QAAQ,CAAC,CAAC;IAuBxC,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAa9C,MAAM,CACV,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,WAAW,EACrB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAW5B,iBAAiB,CACrB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EAAE,EAChB,QAAQ,EAAE,WAAW,GACpB,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;YAIpB,WAAW;IAmBzB,MAAM,IAAI,iBAAiB;CAsC5B"}
@@ -0,0 +1,192 @@
1
+ import { FallbackQueryEmbedding, RagError } from '@mcp-abap-adt/llm-agent';
2
+ import { resolveHanaConnectArgs } from './connection.js';
3
+ import { assertCollectionName, createTableSql, quoteIdent } from './schema.js';
4
+ export class HanaVectorRag {
5
+ collectionName;
6
+ dimension;
7
+ embedder;
8
+ autoCreateSchema;
9
+ clientPromise;
10
+ schemaReady = false;
11
+ schemaPromise;
12
+ constructor(config, injectedClient) {
13
+ assertCollectionName(config.collectionName);
14
+ this.collectionName = config.collectionName;
15
+ this.dimension = config.dimension ?? 1536;
16
+ this.embedder = config.embedder;
17
+ this.autoCreateSchema = config.autoCreateSchema ?? true;
18
+ // Attach a no-op catch so the eager import never becomes an unhandledRejection.
19
+ // The rejection is re-thrown when clientPromise is actually awaited.
20
+ const driverPromise = injectedClient
21
+ ? Promise.resolve(injectedClient)
22
+ : this.createDriverClient(config);
23
+ driverPromise.catch(() => { });
24
+ this.clientPromise = driverPromise;
25
+ }
26
+ async createDriverClient(cfg) {
27
+ const args = resolveHanaConnectArgs(cfg);
28
+ const mod = (await import('@sap/hana-client'));
29
+ const conn = mod.createConnection();
30
+ await new Promise((resolve, reject) => conn.connect(args, (err) => (err ? reject(err) : resolve())));
31
+ return {
32
+ exec: (sql, params = []) => new Promise((resolve, reject) => conn.exec(sql, params, (err, result) => err
33
+ ? reject(err)
34
+ : resolve({
35
+ rowCount: typeof result === 'number'
36
+ ? result
37
+ : Array.isArray(result)
38
+ ? result.length
39
+ : 0,
40
+ }))),
41
+ query: (sql, params = []) => new Promise((resolve, reject) => conn.exec(sql, params, (err, rows) => err
42
+ ? reject(err)
43
+ : resolve(rows ?? []))),
44
+ close: () => new Promise((resolve, reject) => conn.disconnect((err) => (err ? reject(err) : resolve()))),
45
+ };
46
+ }
47
+ /**
48
+ * Idempotent schema bootstrap. Called by both direct makeRag() consumers
49
+ * (when autoCreateSchema is true) and HanaVectorRagProvider.createCollection().
50
+ */
51
+ async ensureSchema() {
52
+ if (this.schemaReady)
53
+ return;
54
+ this.schemaPromise ??= (async () => {
55
+ const client = await this.clientPromise;
56
+ await client.exec(createTableSql(this.collectionName, this.dimension));
57
+ this.schemaReady = true;
58
+ })();
59
+ await this.schemaPromise;
60
+ }
61
+ async maybeEnsureSchema() {
62
+ if (this.autoCreateSchema)
63
+ await this.ensureSchema();
64
+ }
65
+ vectorLiteral(vec) {
66
+ return `TO_REAL_VECTOR('[${vec.join(',')}]')`;
67
+ }
68
+ async query(embedding, k, options) {
69
+ if (options?.signal?.aborted)
70
+ return { ok: false, error: new RagError('Aborted', 'ABORTED') };
71
+ try {
72
+ await this.maybeEnsureSchema();
73
+ const safe = new FallbackQueryEmbedding(embedding, this.embedder);
74
+ const vector = await safe.toVector();
75
+ const client = await this.clientPromise;
76
+ const table = quoteIdent(this.collectionName);
77
+ const sql = `SELECT id, text, metadata, COSINE_SIMILARITY(vector, ${this.vectorLiteral(vector)}) AS score FROM ${table} ORDER BY score DESC LIMIT ${Math.max(1, k)}`;
78
+ const rows = await client.query(sql);
79
+ const results = rows.map((row) => {
80
+ const metaRaw = row.metadata;
81
+ const metadata = metaRaw ? JSON.parse(metaRaw) : {};
82
+ return {
83
+ text: String(row.text ?? ''),
84
+ metadata,
85
+ score: Number(row.score ?? 0),
86
+ };
87
+ });
88
+ return { ok: true, value: results };
89
+ }
90
+ catch (err) {
91
+ return { ok: false, error: new RagError(String(err), 'QUERY_ERROR') };
92
+ }
93
+ }
94
+ async getById(id, options) {
95
+ if (options?.signal?.aborted)
96
+ return { ok: false, error: new RagError('Aborted', 'ABORTED') };
97
+ try {
98
+ await this.maybeEnsureSchema();
99
+ const client = await this.clientPromise;
100
+ const rows = await client.query(`SELECT id, text, metadata FROM ${quoteIdent(this.collectionName)} WHERE id = ?`, [id]);
101
+ const row = rows[0];
102
+ if (!row)
103
+ return { ok: true, value: null };
104
+ const metaRaw = row.metadata;
105
+ const metadata = metaRaw ? JSON.parse(metaRaw) : {};
106
+ return {
107
+ ok: true,
108
+ value: { text: String(row.text ?? ''), metadata, score: 1 },
109
+ };
110
+ }
111
+ catch (err) {
112
+ return { ok: false, error: new RagError(String(err), 'QUERY_ERROR') };
113
+ }
114
+ }
115
+ async healthCheck() {
116
+ try {
117
+ const client = await this.clientPromise;
118
+ await client.query('SELECT 1 FROM DUMMY');
119
+ return { ok: true, value: undefined };
120
+ }
121
+ catch (err) {
122
+ return {
123
+ ok: false,
124
+ error: new RagError(String(err), 'HEALTH_CHECK_ERROR'),
125
+ };
126
+ }
127
+ }
128
+ async upsert(text, metadata, options) {
129
+ if (options?.signal?.aborted)
130
+ return { ok: false, error: new RagError('Aborted', 'ABORTED') };
131
+ try {
132
+ const { vector } = await this.embedder.embed(text, options);
133
+ return this.upsertKnown(text, vector, metadata);
134
+ }
135
+ catch (err) {
136
+ return { ok: false, error: new RagError(String(err), 'UPSERT_ERROR') };
137
+ }
138
+ }
139
+ async upsertPrecomputed(text, vector, metadata) {
140
+ return this.upsertKnown(text, vector, metadata);
141
+ }
142
+ async upsertKnown(text, vector, metadata) {
143
+ try {
144
+ await this.maybeEnsureSchema();
145
+ const client = await this.clientPromise;
146
+ const id = metadata?.id ?? crypto.randomUUID();
147
+ const { id: _omit, ...rest } = metadata ?? {};
148
+ const metaJson = JSON.stringify(rest);
149
+ const sql = `UPSERT ${quoteIdent(this.collectionName)} (id, text, vector, metadata) VALUES (?, ?, ${this.vectorLiteral(vector)}, ?) WITH PRIMARY KEY`;
150
+ await client.exec(sql, [id, text, metaJson]);
151
+ return { ok: true, value: undefined };
152
+ }
153
+ catch (err) {
154
+ return { ok: false, error: new RagError(String(err), 'UPSERT_ERROR') };
155
+ }
156
+ }
157
+ writer() {
158
+ return {
159
+ upsertRaw: async (id, text, metadata, options) => {
160
+ const r = await this.upsert(text, { ...metadata, id }, options);
161
+ return r.ok ? { ok: true, value: undefined } : r;
162
+ },
163
+ deleteByIdRaw: async (id) => {
164
+ try {
165
+ await this.maybeEnsureSchema();
166
+ const client = await this.clientPromise;
167
+ const r = await client.exec(`DELETE FROM ${quoteIdent(this.collectionName)} WHERE id = ?`, [id]);
168
+ return { ok: true, value: r.rowCount > 0 };
169
+ }
170
+ catch (err) {
171
+ return {
172
+ ok: false,
173
+ error: new RagError(String(err), 'DELETE_ERROR'),
174
+ };
175
+ }
176
+ },
177
+ clearAll: async () => {
178
+ try {
179
+ await this.maybeEnsureSchema();
180
+ const client = await this.clientPromise;
181
+ await client.exec(`TRUNCATE TABLE ${quoteIdent(this.collectionName)}`);
182
+ return { ok: true, value: undefined };
183
+ }
184
+ catch (err) {
185
+ return { ok: false, error: new RagError(String(err), 'CLEAR_ERROR') };
186
+ }
187
+ },
188
+ upsertPrecomputedRaw: async (id, text, vector, metadata) => this.upsertPrecomputed(text, vector, { ...metadata, id }),
189
+ };
190
+ }
191
+ }
192
+ //# sourceMappingURL=hana-vector-rag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hana-vector-rag.js","sourceRoot":"","sources":["../src/hana-vector-rag.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export type { HanaVectorRagConfig } from './hana-vector-rag.js';
2
+ export { HanaVectorRag } from './hana-vector-rag.js';
3
+ export type { HanaVectorRagProviderConfig } from './hana-vector-rag-provider.js';
4
+ export { HanaVectorRagProvider } from './hana-vector-rag-provider.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,YAAY,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export { HanaVectorRag } from './hana-vector-rag.js';
2
+ export { HanaVectorRagProvider } from './hana-vector-rag-provider.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare function assertCollectionName(name: string): void;
2
+ export declare function quoteIdent(ident: string): string;
3
+ export declare function createTableSql(collection: string, dimension: number): string;
4
+ export declare function dropTableSql(collection: string): string;
5
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAIA,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAOvD;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAGhD;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAS5E;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEvD"}
package/dist/schema.js ADDED
@@ -0,0 +1,25 @@
1
+ import { RagError } from '@mcp-abap-adt/llm-agent';
2
+ const COLLECTION_NAME_RE = /^[a-zA-Z_][a-zA-Z0-9_]{0,62}$/;
3
+ export function assertCollectionName(name) {
4
+ if (!COLLECTION_NAME_RE.test(name)) {
5
+ throw new RagError(`Invalid collection name: ${name}`, 'INVALID_COLLECTION_NAME');
6
+ }
7
+ }
8
+ export function quoteIdent(ident) {
9
+ assertCollectionName(ident);
10
+ return `"${ident}"`;
11
+ }
12
+ export function createTableSql(collection, dimension) {
13
+ const table = quoteIdent(collection);
14
+ return `CREATE TABLE IF NOT EXISTS ${table} (
15
+ id NVARCHAR(255) PRIMARY KEY,
16
+ text NCLOB,
17
+ vector REAL_VECTOR(${dimension}),
18
+ metadata NCLOB,
19
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
20
+ )`;
21
+ }
22
+ export function dropTableSql(collection) {
23
+ return `DROP TABLE IF EXISTS ${quoteIdent(collection)}`;
24
+ }
25
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAEnD,MAAM,kBAAkB,GAAG,+BAA+B,CAAC;AAE3D,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,QAAQ,CAChB,4BAA4B,IAAI,EAAE,EAClC,yBAAyB,CAC1B,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAa;IACtC,oBAAoB,CAAC,KAAK,CAAC,CAAC;IAC5B,OAAO,IAAI,KAAK,GAAG,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,UAAkB,EAAE,SAAiB;IAClE,MAAM,KAAK,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;IACrC,OAAO,8BAA8B,KAAK;;;yBAGnB,SAAS;;;IAG9B,CAAC;AACL,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,UAAkB;IAC7C,OAAO,wBAAwB,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;AAC1D,CAAC"}
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "@mcp-abap-adt/hana-vector-rag",
3
+ "version": "11.0.0",
4
+ "description": "HanaVectorRag vector store (SAP HANA Cloud Vector Engine) and HanaVectorRagProvider for @mcp-abap-adt/llm-agent.",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js",
12
+ "default": "./dist/index.js"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "README.md",
18
+ "LICENSE"
19
+ ],
20
+ "scripts": {
21
+ "build": "tsc -p tsconfig.json",
22
+ "clean": "tsc -p tsconfig.json --clean",
23
+ "test": "node --import tsx/esm --test --test-reporter=spec 'src/**/*.test.ts'"
24
+ },
25
+ "dependencies": {
26
+ "@mcp-abap-adt/llm-agent": "*",
27
+ "@sap/hana-client": "^2.24.26"
28
+ },
29
+ "license": "MIT",
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "git+https://github.com/fr0ster/llm-agent.git"
33
+ },
34
+ "publishConfig": {
35
+ "access": "public"
36
+ }
37
+ }