@mcp-abap-adt/llm-agent-libs 19.1.2 → 19.2.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/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/rag/knowledge-rag.d.ts +28 -8
- package/dist/rag/knowledge-rag.d.ts.map +1 -1
- package/dist/rag/knowledge-rag.js +42 -8
- package/dist/rag/knowledge-rag.js.map +1 -1
- package/dist/skills/plugin-host/chunker.d.ts +17 -0
- package/dist/skills/plugin-host/chunker.d.ts.map +1 -0
- package/dist/skills/plugin-host/chunker.js +72 -0
- package/dist/skills/plugin-host/chunker.js.map +1 -0
- package/dist/skills/plugin-host/chunker.test.d.ts +2 -0
- package/dist/skills/plugin-host/chunker.test.d.ts.map +1 -0
- package/dist/skills/plugin-host/chunker.test.js +31 -0
- package/dist/skills/plugin-host/chunker.test.js.map +1 -0
- package/dist/skills/plugin-host/compatible-skills-rag.d.ts +14 -0
- package/dist/skills/plugin-host/compatible-skills-rag.d.ts.map +1 -0
- package/dist/skills/plugin-host/compatible-skills-rag.js +83 -0
- package/dist/skills/plugin-host/compatible-skills-rag.js.map +1 -0
- package/dist/skills/plugin-host/compatible-skills-rag.test.d.ts +2 -0
- package/dist/skills/plugin-host/compatible-skills-rag.test.d.ts.map +1 -0
- package/dist/skills/plugin-host/compatible-skills-rag.test.js +174 -0
- package/dist/skills/plugin-host/compatible-skills-rag.test.js.map +1 -0
- package/dist/skills/plugin-host/http-marketplace-source.d.ts +46 -0
- package/dist/skills/plugin-host/http-marketplace-source.d.ts.map +1 -0
- package/dist/skills/plugin-host/http-marketplace-source.js +67 -0
- package/dist/skills/plugin-host/http-marketplace-source.js.map +1 -0
- package/dist/skills/plugin-host/http-marketplace-source.test.d.ts +2 -0
- package/dist/skills/plugin-host/http-marketplace-source.test.d.ts.map +1 -0
- package/dist/skills/plugin-host/http-marketplace-source.test.js +71 -0
- package/dist/skills/plugin-host/http-marketplace-source.test.js.map +1 -0
- package/dist/skills/plugin-host/in-memory-store.d.ts +15 -0
- package/dist/skills/plugin-host/in-memory-store.d.ts.map +1 -0
- package/dist/skills/plugin-host/in-memory-store.js +151 -0
- package/dist/skills/plugin-host/in-memory-store.js.map +1 -0
- package/dist/skills/plugin-host/in-memory-store.test.d.ts +2 -0
- package/dist/skills/plugin-host/in-memory-store.test.d.ts.map +1 -0
- package/dist/skills/plugin-host/in-memory-store.test.js +100 -0
- package/dist/skills/plugin-host/in-memory-store.test.js.map +1 -0
- package/dist/skills/plugin-host/index.d.ts +10 -0
- package/dist/skills/plugin-host/index.d.ts.map +1 -0
- package/dist/skills/plugin-host/index.js +12 -0
- package/dist/skills/plugin-host/index.js.map +1 -0
- package/dist/skills/plugin-host/marketplace-adapter.d.ts +23 -0
- package/dist/skills/plugin-host/marketplace-adapter.d.ts.map +1 -0
- package/dist/skills/plugin-host/marketplace-adapter.js +32 -0
- package/dist/skills/plugin-host/marketplace-adapter.js.map +1 -0
- package/dist/skills/plugin-host/marketplace-adapter.test.d.ts +2 -0
- package/dist/skills/plugin-host/marketplace-adapter.test.d.ts.map +1 -0
- package/dist/skills/plugin-host/marketplace-adapter.test.js +46 -0
- package/dist/skills/plugin-host/marketplace-adapter.test.js.map +1 -0
- package/dist/skills/plugin-host/qdrant-store.d.ts +85 -0
- package/dist/skills/plugin-host/qdrant-store.d.ts.map +1 -0
- package/dist/skills/plugin-host/qdrant-store.js +542 -0
- package/dist/skills/plugin-host/qdrant-store.js.map +1 -0
- package/dist/skills/plugin-host/qdrant-store.test.d.ts +2 -0
- package/dist/skills/plugin-host/qdrant-store.test.d.ts.map +1 -0
- package/dist/skills/plugin-host/qdrant-store.test.js +396 -0
- package/dist/skills/plugin-host/qdrant-store.test.js.map +1 -0
- package/dist/skills/plugin-host/skill-plugin-host.d.ts +41 -0
- package/dist/skills/plugin-host/skill-plugin-host.d.ts.map +1 -0
- package/dist/skills/plugin-host/skill-plugin-host.ingest.test.d.ts +2 -0
- package/dist/skills/plugin-host/skill-plugin-host.ingest.test.d.ts.map +1 -0
- package/dist/skills/plugin-host/skill-plugin-host.ingest.test.js +520 -0
- package/dist/skills/plugin-host/skill-plugin-host.ingest.test.js.map +1 -0
- package/dist/skills/plugin-host/skill-plugin-host.js +367 -0
- package/dist/skills/plugin-host/skill-plugin-host.js.map +1 -0
- package/dist/skills/plugin-host/skill-plugin-host.recall-and-reload.test.d.ts +2 -0
- package/dist/skills/plugin-host/skill-plugin-host.recall-and-reload.test.d.ts.map +1 -0
- package/dist/skills/plugin-host/skill-plugin-host.recall-and-reload.test.js +328 -0
- package/dist/skills/plugin-host/skill-plugin-host.recall-and-reload.test.js.map +1 -0
- package/dist/skills/plugin-host/skills-rag-source.d.ts +17 -0
- package/dist/skills/plugin-host/skills-rag-source.d.ts.map +1 -0
- package/dist/skills/plugin-host/skills-rag-source.js +52 -0
- package/dist/skills/plugin-host/skills-rag-source.js.map +1 -0
- package/dist/skills/plugin-host/skills-rag-source.test.d.ts +2 -0
- package/dist/skills/plugin-host/skills-rag-source.test.d.ts.map +1 -0
- package/dist/skills/plugin-host/skills-rag-source.test.js +69 -0
- package/dist/skills/plugin-host/skills-rag-source.test.js.map +1 -0
- package/dist/skills/plugin-host/source-strategies.d.ts +20 -0
- package/dist/skills/plugin-host/source-strategies.d.ts.map +1 -0
- package/dist/skills/plugin-host/source-strategies.js +37 -0
- package/dist/skills/plugin-host/source-strategies.js.map +1 -0
- package/dist/skills/plugin-host/source-strategies.test.d.ts +2 -0
- package/dist/skills/plugin-host/source-strategies.test.d.ts.map +1 -0
- package/dist/skills/plugin-host/source-strategies.test.js +52 -0
- package/dist/skills/plugin-host/source-strategies.test.js.map +1 -0
- package/package.json +14 -14
|
@@ -0,0 +1,542 @@
|
|
|
1
|
+
// Qdrant (vector-DB) store provider + a durable Postgres catalog store — the
|
|
2
|
+
// PERSISTENT, recall-only serving backend for the skill plugin-host.
|
|
3
|
+
//
|
|
4
|
+
// It implements the SAME contracts as the in-memory store (`ISkillsStoreProvider`
|
|
5
|
+
// write side, `ISkillsRagBackendProvider` read side from `@mcp-abap-adt/llm-agent`),
|
|
6
|
+
// but the catalog/fence lives in an external CAS-capable `ICatalogStore` and the
|
|
7
|
+
// vector points live in Qdrant, tagged by a generation label.
|
|
8
|
+
//
|
|
9
|
+
// Design (see docs/superpowers/plans/...skill-plugin-host-gnostification.md, Task A10):
|
|
10
|
+
// 1. Catalog in a durable CAS-capable `ICatalogStore`. Two impls:
|
|
11
|
+
// `makeInProcessCatalogStore()` (dev / in-process) and `makePgCatalogStore()`
|
|
12
|
+
// (production — one row, conditional `UPDATE ... WHERE revision=$expected`).
|
|
13
|
+
// 2. Point ids = deterministic UUIDv5 of `${generation}:${recordId}`.
|
|
14
|
+
// 3. carryForward via a paginated `scroll(filter)` client primitive.
|
|
15
|
+
// 4. Durable + crash-resumable retirement + AGE-PROTECTED orphan sweep.
|
|
16
|
+
// 5. Read-only reader interfaces (`IQdrantReader`, `ICatalogReader`) for the
|
|
17
|
+
// no-write-credentials recall-only serving process.
|
|
18
|
+
//
|
|
19
|
+
// NOTE on dependencies: `pointId` is a self-contained UUIDv5 implementation over
|
|
20
|
+
// `node:crypto`'s sha1 (the standard name-based UUID algorithm) — no `uuid`
|
|
21
|
+
// package is added. The pg backends are typed against a MINIMAL injected pool
|
|
22
|
+
// interface (`IPgPool`) so NO real `pg` dependency is required; the production
|
|
23
|
+
// caller passes a real `pg` `Pool` (structurally compatible) and tests pass a
|
|
24
|
+
// fake pool. The Qdrant/pg REST adapters (`makeQdrantClient` / `makeQdrantReader`)
|
|
25
|
+
// talk to Qdrant over global `fetch` and are LIVE-ONLY (no unit test; Phase C smoke).
|
|
26
|
+
import { createHash, randomUUID } from 'node:crypto';
|
|
27
|
+
import { CatalogCasError } from '@mcp-abap-adt/llm-agent'; // value (class), not a type
|
|
28
|
+
// ----------------------------------------------------------------------------
|
|
29
|
+
// pointId — deterministic UUIDv5 of `${generation}:${recordId}` (no `uuid` dep).
|
|
30
|
+
// ----------------------------------------------------------------------------
|
|
31
|
+
// Fixed namespace UUID for skill points (a stable, arbitrary v4 constant).
|
|
32
|
+
const SKILL_POINT_NAMESPACE = 'b9c3f6e2-5a1d-4e7b-9f3a-2c6d8e0a1b4f';
|
|
33
|
+
function uuidv5(name, namespace) {
|
|
34
|
+
// RFC 4122 §4.3 name-based UUID (version 5, SHA-1).
|
|
35
|
+
const nsBytes = Buffer.from(namespace.replace(/-/g, ''), 'hex');
|
|
36
|
+
const hash = createHash('sha1')
|
|
37
|
+
.update(nsBytes)
|
|
38
|
+
.update(Buffer.from(name, 'utf8'))
|
|
39
|
+
.digest();
|
|
40
|
+
const bytes = hash.subarray(0, 16);
|
|
41
|
+
// set version (5) and variant (RFC 4122) bits
|
|
42
|
+
bytes[6] = (bytes[6] & 0x0f) | 0x50;
|
|
43
|
+
bytes[8] = (bytes[8] & 0x3f) | 0x80;
|
|
44
|
+
const hex = bytes.toString('hex');
|
|
45
|
+
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20, 32)}`;
|
|
46
|
+
}
|
|
47
|
+
export const pointId = (generation, recordId) => uuidv5(`${generation}:${recordId}`, SKILL_POINT_NAMESPACE);
|
|
48
|
+
// ----------------------------------------------------------------------------
|
|
49
|
+
// Catalog snapshot revision generation helper.
|
|
50
|
+
// ----------------------------------------------------------------------------
|
|
51
|
+
// Compute the durable `retired[]` for a pointer swap: generations active BEFORE
|
|
52
|
+
// that are NOT active AFTER get a fresh `retiredAt` stamp; previously-retired
|
|
53
|
+
// generations are preserved (idempotent — keep the earliest stamp).
|
|
54
|
+
function computeRetired(prevEntries, prevRetired, nextEntries, now) {
|
|
55
|
+
const nextActive = new Set(nextEntries.filter((e) => !e.tombstone).map((e) => e.generation));
|
|
56
|
+
const retired = new Map();
|
|
57
|
+
// preserve already-retired generations (do not refresh their stamp)
|
|
58
|
+
for (const r of prevRetired)
|
|
59
|
+
retired.set(r.generation, r);
|
|
60
|
+
// newly-dropped active generations
|
|
61
|
+
for (const e of prevEntries) {
|
|
62
|
+
if (e.tombstone)
|
|
63
|
+
continue;
|
|
64
|
+
if (nextActive.has(e.generation))
|
|
65
|
+
continue;
|
|
66
|
+
if (retired.has(e.generation))
|
|
67
|
+
continue;
|
|
68
|
+
retired.set(e.generation, {
|
|
69
|
+
generation: e.generation,
|
|
70
|
+
group: e.collection.group,
|
|
71
|
+
retiredAt: now,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
return [...retired.values()];
|
|
75
|
+
}
|
|
76
|
+
// ----------------------------------------------------------------------------
|
|
77
|
+
// makeInProcessCatalogStore — monotonic-counter revision, in-memory durable-ish.
|
|
78
|
+
// ----------------------------------------------------------------------------
|
|
79
|
+
export function makeInProcessCatalogStore() {
|
|
80
|
+
let revision = 'c0';
|
|
81
|
+
let entries = [];
|
|
82
|
+
let retired = [];
|
|
83
|
+
const nextRevision = () => `c${Number(revision.slice(1)) + 1}`;
|
|
84
|
+
return {
|
|
85
|
+
async read() {
|
|
86
|
+
return {
|
|
87
|
+
catalogRevision: revision,
|
|
88
|
+
entries: entries.filter((e) => !e.tombstone),
|
|
89
|
+
retired,
|
|
90
|
+
};
|
|
91
|
+
},
|
|
92
|
+
async casPublish(expected, next, now) {
|
|
93
|
+
if (expected !== revision) {
|
|
94
|
+
throw new CatalogCasError(`stale catalog revision: expected ${expected}, active ${revision}`);
|
|
95
|
+
}
|
|
96
|
+
retired = computeRetired(entries, retired, next, now);
|
|
97
|
+
entries = [...next];
|
|
98
|
+
revision = nextRevision();
|
|
99
|
+
return {
|
|
100
|
+
catalogRevision: revision,
|
|
101
|
+
entries: entries.filter((e) => !e.tombstone),
|
|
102
|
+
retired,
|
|
103
|
+
};
|
|
104
|
+
},
|
|
105
|
+
async pruneRetired(expected, generations) {
|
|
106
|
+
if (expected !== revision) {
|
|
107
|
+
throw new CatalogCasError(`stale catalog revision: expected ${expected}, active ${revision}`);
|
|
108
|
+
}
|
|
109
|
+
const drop = new Set(generations);
|
|
110
|
+
retired = retired.filter((r) => !drop.has(r.generation));
|
|
111
|
+
revision = nextRevision();
|
|
112
|
+
return {
|
|
113
|
+
catalogRevision: revision,
|
|
114
|
+
entries: entries.filter((e) => !e.tombstone),
|
|
115
|
+
retired,
|
|
116
|
+
};
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
const PG_ROW_ID = 'skills_catalog';
|
|
121
|
+
/**
|
|
122
|
+
* Strict SQL-identifier guard for the catalog `table` — bare identifier or one
|
|
123
|
+
* optional `schema.table` dot. The table name is interpolated directly into SQL
|
|
124
|
+
* (`FROM ${table}`, `CREATE TABLE ... ${table}`, etc.), so the lib MUST NOT
|
|
125
|
+
* trust its caller (defence-in-depth with the config-layer validation).
|
|
126
|
+
*/
|
|
127
|
+
const SQL_IDENTIFIER = /^[A-Za-z_][A-Za-z0-9_]*(\.[A-Za-z_][A-Za-z0-9_]*)?$/;
|
|
128
|
+
function assertSafeTable(table) {
|
|
129
|
+
if (!SQL_IDENTIFIER.test(table)) {
|
|
130
|
+
throw new Error(`invalid catalog table identifier '${table}' (must match ${SQL_IDENTIFIER.source})`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// A fresh, collision-resistant revision token (the pg backend cannot use a simple
|
|
134
|
+
// process-local counter — it is shared across processes and survives restarts).
|
|
135
|
+
function freshRevisionToken() {
|
|
136
|
+
return createHash('sha1')
|
|
137
|
+
.update(`${Date.now()}:${Math.random()}:${process.pid}`)
|
|
138
|
+
.digest('hex')
|
|
139
|
+
.slice(0, 24);
|
|
140
|
+
}
|
|
141
|
+
function parseSnapshot(raw) {
|
|
142
|
+
if (typeof raw === 'string')
|
|
143
|
+
return JSON.parse(raw);
|
|
144
|
+
return raw;
|
|
145
|
+
}
|
|
146
|
+
async function pgRead(pool, table) {
|
|
147
|
+
const res = await pool.query(`SELECT revision, snapshot FROM ${table} WHERE id = $1`, [PG_ROW_ID]);
|
|
148
|
+
if (res.rowCount === 0 || res.rows.length === 0)
|
|
149
|
+
return null;
|
|
150
|
+
const row = res.rows[0];
|
|
151
|
+
return { revision: row.revision, snapshot: parseSnapshot(row.snapshot) };
|
|
152
|
+
}
|
|
153
|
+
export function makePgCatalogStore(deps) {
|
|
154
|
+
const { pool } = deps;
|
|
155
|
+
const table = deps.table ?? 'skills_catalog';
|
|
156
|
+
assertSafeTable(table);
|
|
157
|
+
async function ensureRow() {
|
|
158
|
+
const existing = await pgRead(pool, table);
|
|
159
|
+
if (existing)
|
|
160
|
+
return existing;
|
|
161
|
+
// seed the single row with an initial empty snapshot
|
|
162
|
+
const revision = freshRevisionToken();
|
|
163
|
+
const snapshot = {
|
|
164
|
+
catalogRevision: revision,
|
|
165
|
+
entries: [],
|
|
166
|
+
retired: [],
|
|
167
|
+
};
|
|
168
|
+
await pool.query(`INSERT INTO ${table} (id, revision, snapshot) VALUES ($1, $2, $3)
|
|
169
|
+
ON CONFLICT (id) DO NOTHING`, [PG_ROW_ID, revision, JSON.stringify(snapshot)]);
|
|
170
|
+
return (await pgRead(pool, table)) ?? { revision, snapshot };
|
|
171
|
+
}
|
|
172
|
+
async function casWrite(expected, snapshot) {
|
|
173
|
+
const res = await pool.query(`UPDATE ${table} SET revision = $1, snapshot = $2
|
|
174
|
+
WHERE id = '${PG_ROW_ID}' AND revision = $3`, [snapshot.catalogRevision, JSON.stringify(snapshot), expected]);
|
|
175
|
+
if (res.rowCount === 0) {
|
|
176
|
+
throw new CatalogCasError(`stale catalog revision: expected ${expected} (UPDATE matched 0 rows)`);
|
|
177
|
+
}
|
|
178
|
+
return snapshot;
|
|
179
|
+
}
|
|
180
|
+
return {
|
|
181
|
+
async read() {
|
|
182
|
+
const row = await ensureRow();
|
|
183
|
+
const snap = row.snapshot;
|
|
184
|
+
// keep the durable revision authoritative on read
|
|
185
|
+
return {
|
|
186
|
+
catalogRevision: row.revision,
|
|
187
|
+
entries: (snap.entries ?? []).filter((e) => !e.tombstone),
|
|
188
|
+
retired: snap.retired ?? [],
|
|
189
|
+
};
|
|
190
|
+
},
|
|
191
|
+
async casPublish(expected, next, now) {
|
|
192
|
+
const row = await ensureRow();
|
|
193
|
+
const retired = computeRetired(row.snapshot.entries ?? [], row.snapshot.retired ?? [], next, now);
|
|
194
|
+
const snapshot = {
|
|
195
|
+
catalogRevision: freshRevisionToken(),
|
|
196
|
+
entries: [...next],
|
|
197
|
+
retired,
|
|
198
|
+
};
|
|
199
|
+
await casWrite(expected, snapshot);
|
|
200
|
+
// return the served view (tombstones filtered like read())
|
|
201
|
+
return {
|
|
202
|
+
catalogRevision: snapshot.catalogRevision,
|
|
203
|
+
entries: snapshot.entries.filter((e) => !e.tombstone),
|
|
204
|
+
retired: snapshot.retired,
|
|
205
|
+
};
|
|
206
|
+
},
|
|
207
|
+
async pruneRetired(expected, generations) {
|
|
208
|
+
const row = await ensureRow();
|
|
209
|
+
const drop = new Set(generations);
|
|
210
|
+
const snapshot = {
|
|
211
|
+
catalogRevision: freshRevisionToken(),
|
|
212
|
+
entries: row.snapshot.entries ?? [],
|
|
213
|
+
retired: (row.snapshot.retired ?? []).filter((r) => !drop.has(r.generation)),
|
|
214
|
+
};
|
|
215
|
+
await casWrite(expected, snapshot);
|
|
216
|
+
return {
|
|
217
|
+
catalogRevision: snapshot.catalogRevision,
|
|
218
|
+
entries: snapshot.entries.filter((e) => !e.tombstone),
|
|
219
|
+
retired: snapshot.retired,
|
|
220
|
+
};
|
|
221
|
+
},
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
export function makePgCatalogReader(deps) {
|
|
225
|
+
const { pool } = deps;
|
|
226
|
+
const table = deps.table ?? 'skills_catalog';
|
|
227
|
+
assertSafeTable(table);
|
|
228
|
+
return {
|
|
229
|
+
async read() {
|
|
230
|
+
const row = await pgRead(pool, table);
|
|
231
|
+
if (!row)
|
|
232
|
+
return { catalogRevision: 'c0', entries: [], retired: [] };
|
|
233
|
+
return {
|
|
234
|
+
catalogRevision: row.revision,
|
|
235
|
+
entries: (row.snapshot.entries ?? []).filter((e) => !e.tombstone),
|
|
236
|
+
retired: row.snapshot.retired ?? [],
|
|
237
|
+
};
|
|
238
|
+
},
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
// Translate the flat filter object used internally into a Qdrant `must` filter.
|
|
242
|
+
function toQdrantFilter(filter) {
|
|
243
|
+
const must = [];
|
|
244
|
+
for (const [key, value] of Object.entries(filter)) {
|
|
245
|
+
if (Array.isArray(value)) {
|
|
246
|
+
must.push({ key, match: { any: value } });
|
|
247
|
+
}
|
|
248
|
+
else if (value !== undefined) {
|
|
249
|
+
must.push({ key, match: { value } });
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
return { must };
|
|
253
|
+
}
|
|
254
|
+
function qdrantHeaders(apiKey) {
|
|
255
|
+
const h = { 'content-type': 'application/json' };
|
|
256
|
+
if (apiKey)
|
|
257
|
+
h['api-key'] = apiKey;
|
|
258
|
+
return h;
|
|
259
|
+
}
|
|
260
|
+
function makeQdrantReaderImpl(opts) {
|
|
261
|
+
const base = `${opts.url.replace(/\/$/, '')}/collections/${opts.collection}`;
|
|
262
|
+
return {
|
|
263
|
+
async search(filter, vector, k, options) {
|
|
264
|
+
const res = await fetch(`${base}/points/search`, {
|
|
265
|
+
method: 'POST',
|
|
266
|
+
headers: qdrantHeaders(opts.apiKey),
|
|
267
|
+
body: JSON.stringify({
|
|
268
|
+
vector,
|
|
269
|
+
limit: k,
|
|
270
|
+
with_payload: true,
|
|
271
|
+
filter: toQdrantFilter(filter),
|
|
272
|
+
}),
|
|
273
|
+
signal: options?.signal,
|
|
274
|
+
});
|
|
275
|
+
if (!res.ok)
|
|
276
|
+
throw new Error(`qdrant search failed: ${res.status}`);
|
|
277
|
+
const json = (await res.json());
|
|
278
|
+
return json.result.map((r) => ({ payload: r.payload, score: r.score }));
|
|
279
|
+
},
|
|
280
|
+
async scroll(filter, cursor) {
|
|
281
|
+
const res = await fetch(`${base}/points/scroll`, {
|
|
282
|
+
method: 'POST',
|
|
283
|
+
headers: qdrantHeaders(opts.apiKey),
|
|
284
|
+
body: JSON.stringify({
|
|
285
|
+
limit: 256,
|
|
286
|
+
with_payload: true,
|
|
287
|
+
with_vector: true,
|
|
288
|
+
offset: cursor ?? undefined,
|
|
289
|
+
filter: toQdrantFilter(filter),
|
|
290
|
+
}),
|
|
291
|
+
});
|
|
292
|
+
if (!res.ok)
|
|
293
|
+
throw new Error(`qdrant scroll failed: ${res.status}`);
|
|
294
|
+
const json = (await res.json());
|
|
295
|
+
return {
|
|
296
|
+
points: json.result.points.map((p) => ({
|
|
297
|
+
id: p.id,
|
|
298
|
+
vector: p.vector,
|
|
299
|
+
payload: p.payload,
|
|
300
|
+
})),
|
|
301
|
+
next: json.result.next_page_offset ?? undefined,
|
|
302
|
+
};
|
|
303
|
+
},
|
|
304
|
+
};
|
|
305
|
+
}
|
|
306
|
+
/** Read-only Qdrant reader (search + scroll). Used by recall-only with a read key. */
|
|
307
|
+
export function makeQdrantReader(opts) {
|
|
308
|
+
return makeQdrantReaderImpl(opts);
|
|
309
|
+
}
|
|
310
|
+
/** Read/write Qdrant client (reader + upsert + delete). Used by the ingest path. */
|
|
311
|
+
export function makeQdrantClient(opts) {
|
|
312
|
+
const reader = makeQdrantReaderImpl(opts);
|
|
313
|
+
const base = `${opts.url.replace(/\/$/, '')}/collections/${opts.collection}`;
|
|
314
|
+
return {
|
|
315
|
+
...reader,
|
|
316
|
+
async upsertPoints(points, upsertOpts) {
|
|
317
|
+
const q = upsertOpts?.wait ? '?wait=true' : '';
|
|
318
|
+
const res = await fetch(`${base}/points${q}`, {
|
|
319
|
+
method: 'PUT',
|
|
320
|
+
headers: qdrantHeaders(opts.apiKey),
|
|
321
|
+
body: JSON.stringify({
|
|
322
|
+
points: points.map((p) => ({
|
|
323
|
+
id: p.id,
|
|
324
|
+
vector: p.vector,
|
|
325
|
+
payload: p.payload,
|
|
326
|
+
})),
|
|
327
|
+
}),
|
|
328
|
+
});
|
|
329
|
+
if (!res.ok)
|
|
330
|
+
throw new Error(`qdrant upsert failed: ${res.status}`);
|
|
331
|
+
},
|
|
332
|
+
async deleteByFilter(filter) {
|
|
333
|
+
const res = await fetch(`${base}/points/delete`, {
|
|
334
|
+
method: 'POST',
|
|
335
|
+
headers: qdrantHeaders(opts.apiKey),
|
|
336
|
+
body: JSON.stringify({
|
|
337
|
+
filter: toQdrantFilter(filter),
|
|
338
|
+
}),
|
|
339
|
+
});
|
|
340
|
+
if (!res.ok)
|
|
341
|
+
throw new Error(`qdrant delete failed: ${res.status}`);
|
|
342
|
+
},
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
// ----------------------------------------------------------------------------
|
|
346
|
+
// Read-side: map a Qdrant payload → SkillHit; resolve active generation.
|
|
347
|
+
// ----------------------------------------------------------------------------
|
|
348
|
+
function payloadToHit(payload, score) {
|
|
349
|
+
const record = {
|
|
350
|
+
id: String(payload.recordId ?? ''),
|
|
351
|
+
sourceId: String(payload.sourceId ?? ''),
|
|
352
|
+
group: String(payload.group ?? ''),
|
|
353
|
+
name: String(payload.name ?? ''),
|
|
354
|
+
retrievalText: '', // not needed at read time
|
|
355
|
+
content: String(payload.content ?? ''),
|
|
356
|
+
provenance: String(payload.provenance ?? ''),
|
|
357
|
+
};
|
|
358
|
+
return { record, score };
|
|
359
|
+
}
|
|
360
|
+
function activeFromCatalog(snap, group) {
|
|
361
|
+
const e = snap.entries.find((x) => x.collection.group === group && !x.tombstone);
|
|
362
|
+
return e ? { revision: e.generation, manifest: e.manifest } : null;
|
|
363
|
+
}
|
|
364
|
+
function readBackendFor(reader, catalogReader, group) {
|
|
365
|
+
return {
|
|
366
|
+
async activeSnapshot() {
|
|
367
|
+
return activeFromCatalog(await catalogReader.read(), group);
|
|
368
|
+
},
|
|
369
|
+
// Qdrant retention is best-effort time-grace (not a lease) — release is a no-op.
|
|
370
|
+
release() { },
|
|
371
|
+
async queryRevision(revision, vector, k, options) {
|
|
372
|
+
const results = await reader.search({ generation: revision }, vector, k, {
|
|
373
|
+
signal: options?.signal,
|
|
374
|
+
});
|
|
375
|
+
return results.map((r) => payloadToHit(r.payload, r.score));
|
|
376
|
+
},
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
/** Read-only backend provider over reader interfaces (no write/reconcile API). */
|
|
380
|
+
export function makeQdrantBackendProvider(deps) {
|
|
381
|
+
return {
|
|
382
|
+
async readCatalog() {
|
|
383
|
+
return deps.catalogReader.read();
|
|
384
|
+
},
|
|
385
|
+
forGroup(group) {
|
|
386
|
+
return readBackendFor(deps.reader, deps.catalogReader, group);
|
|
387
|
+
},
|
|
388
|
+
};
|
|
389
|
+
}
|
|
390
|
+
export function makeQdrantStoreProvider(deps) {
|
|
391
|
+
const { client, catalogStore, embed, retiredGraceMs, orphanGraceMs } = deps;
|
|
392
|
+
const pid = deps.pointId ?? pointId;
|
|
393
|
+
const now = deps.now ?? (() => Date.now());
|
|
394
|
+
async function scrollAll(filter) {
|
|
395
|
+
const out = [];
|
|
396
|
+
let cursor;
|
|
397
|
+
do {
|
|
398
|
+
const page = await client.scroll(filter, cursor);
|
|
399
|
+
out.push(...page.points);
|
|
400
|
+
cursor = page.next;
|
|
401
|
+
} while (cursor);
|
|
402
|
+
return out;
|
|
403
|
+
}
|
|
404
|
+
function storeFor(group) {
|
|
405
|
+
const readBackend = readBackendFor(client, catalogStore, group);
|
|
406
|
+
return {
|
|
407
|
+
activeSnapshot: readBackend.activeSnapshot,
|
|
408
|
+
release: readBackend.release,
|
|
409
|
+
queryRevision: readBackend.queryRevision,
|
|
410
|
+
async beginGeneration() {
|
|
411
|
+
// Globally-unique id (a process-local counter + ms timestamp can collide
|
|
412
|
+
// across processes — two loaders writing the same id then the CAS-loser's
|
|
413
|
+
// discardGeneration would delete the winner's points). Keep the `group#`
|
|
414
|
+
// prefix (orphan sweep / dropCollection group logic relies on it).
|
|
415
|
+
const generation = `${group}#${randomUUID()}`;
|
|
416
|
+
return { generation };
|
|
417
|
+
},
|
|
418
|
+
async upsert(generation, records, options) {
|
|
419
|
+
const createdAt = now();
|
|
420
|
+
const points = [];
|
|
421
|
+
for (const record of records) {
|
|
422
|
+
const vector = await embed(record.retrievalText, options);
|
|
423
|
+
points.push({
|
|
424
|
+
id: pid(generation, record.id),
|
|
425
|
+
vector,
|
|
426
|
+
payload: {
|
|
427
|
+
generation,
|
|
428
|
+
group: record.group,
|
|
429
|
+
recordId: record.id,
|
|
430
|
+
content: record.content,
|
|
431
|
+
name: record.name,
|
|
432
|
+
provenance: record.provenance,
|
|
433
|
+
sourceId: record.sourceId,
|
|
434
|
+
createdAt,
|
|
435
|
+
},
|
|
436
|
+
});
|
|
437
|
+
}
|
|
438
|
+
// wait=true: this generation is about to be published active by the
|
|
439
|
+
// host; its points MUST be searchable before activation (read-after-write).
|
|
440
|
+
if (points.length > 0)
|
|
441
|
+
await client.upsertPoints(points, { wait: true });
|
|
442
|
+
},
|
|
443
|
+
async carryForward(generation, sourceIds) {
|
|
444
|
+
const live = activeFromCatalog(await catalogStore.read(), group);
|
|
445
|
+
if (!live)
|
|
446
|
+
return;
|
|
447
|
+
if (sourceIds.length === 0)
|
|
448
|
+
return;
|
|
449
|
+
const createdAt = now();
|
|
450
|
+
const carried = await scrollAll({
|
|
451
|
+
generation: live.revision,
|
|
452
|
+
sourceId: [...sourceIds],
|
|
453
|
+
});
|
|
454
|
+
const points = carried.map((p) => {
|
|
455
|
+
const recordId = String(p.payload.recordId ?? '');
|
|
456
|
+
return {
|
|
457
|
+
id: pid(generation, recordId),
|
|
458
|
+
vector: p.vector,
|
|
459
|
+
payload: { ...p.payload, generation, createdAt },
|
|
460
|
+
};
|
|
461
|
+
});
|
|
462
|
+
// wait=true: carried-forward points join the same about-to-be-activated
|
|
463
|
+
// generation, so they too must be visible before publishCatalog.
|
|
464
|
+
if (points.length > 0)
|
|
465
|
+
await client.upsertPoints(points, { wait: true });
|
|
466
|
+
},
|
|
467
|
+
async discardGeneration(generation) {
|
|
468
|
+
// best-effort immediate cleanup of an inactive in-build generation's points;
|
|
469
|
+
// the age-protected sweep is the durable safety net for crashes.
|
|
470
|
+
// NEVER delete a served generation: if `generation` is named by an ACTIVE
|
|
471
|
+
// (non-tombstone) catalog entry, do nothing (mirror the in-memory store).
|
|
472
|
+
const snap = await catalogStore.read();
|
|
473
|
+
const isActive = snap.entries.some((e) => !e.tombstone && e.generation === generation);
|
|
474
|
+
if (isActive)
|
|
475
|
+
return;
|
|
476
|
+
await client.deleteByFilter({ generation });
|
|
477
|
+
},
|
|
478
|
+
};
|
|
479
|
+
}
|
|
480
|
+
const provider = {
|
|
481
|
+
forGroup: storeFor,
|
|
482
|
+
async readCatalog() {
|
|
483
|
+
return catalogStore.read();
|
|
484
|
+
},
|
|
485
|
+
async publishCatalog(expectedCatalogRevision, entries) {
|
|
486
|
+
return catalogStore.casPublish(expectedCatalogRevision, entries, now());
|
|
487
|
+
},
|
|
488
|
+
async dropCollection(group) {
|
|
489
|
+
// retire the group's active entry by republishing without it
|
|
490
|
+
const snap = await catalogStore.read();
|
|
491
|
+
const next = snap.entries.filter((e) => e.collection.group !== group);
|
|
492
|
+
if (next.length !== snap.entries.length) {
|
|
493
|
+
await catalogStore.casPublish(snap.catalogRevision, next, now());
|
|
494
|
+
}
|
|
495
|
+
},
|
|
496
|
+
async sweep(at) {
|
|
497
|
+
const tick = at ?? now();
|
|
498
|
+
// 1) Durable retired-reclaim: delete points of generations past their grace,
|
|
499
|
+
// then prune them from the durable retired[] (fenced).
|
|
500
|
+
let snap = await catalogStore.read();
|
|
501
|
+
const due = (snap.retired ?? []).filter((r) => r.retiredAt + retiredGraceMs <= tick);
|
|
502
|
+
if (due.length > 0) {
|
|
503
|
+
for (const r of due) {
|
|
504
|
+
await client.deleteByFilter({ generation: r.generation });
|
|
505
|
+
}
|
|
506
|
+
snap = await catalogStore.pruneRetired(snap.catalogRevision, due.map((r) => r.generation));
|
|
507
|
+
}
|
|
508
|
+
// 2) AGE-PROTECTED orphan reconcile: scroll all points, group by generation,
|
|
509
|
+
// delete generations that are NEITHER active NOR retired ONLY when their
|
|
510
|
+
// youngest point is older than orphanGraceMs (never a fresh in-build gen).
|
|
511
|
+
const active = new Set(snap.entries.filter((e) => !e.tombstone).map((e) => e.generation));
|
|
512
|
+
const retired = new Set((snap.retired ?? []).map((r) => r.generation));
|
|
513
|
+
// Track the YOUNGEST (max) createdAt per generation: a still-being-written
|
|
514
|
+
// generation has a RECENT youngest point and must be kept — using the oldest
|
|
515
|
+
// (min) point would delete a long in-progress build while it is still writing.
|
|
516
|
+
const maxCreatedAt = new Map();
|
|
517
|
+
for (const p of await scrollAll({})) {
|
|
518
|
+
const gen = String(p.payload.generation ?? '');
|
|
519
|
+
if (!gen || active.has(gen) || retired.has(gen))
|
|
520
|
+
continue;
|
|
521
|
+
const created = Number(p.payload.createdAt ?? 0);
|
|
522
|
+
const prev = maxCreatedAt.get(gen);
|
|
523
|
+
maxCreatedAt.set(gen, prev === undefined ? created : Math.max(prev, created));
|
|
524
|
+
}
|
|
525
|
+
for (const [gen, created] of maxCreatedAt) {
|
|
526
|
+
if (created + orphanGraceMs <= tick) {
|
|
527
|
+
await client.deleteByFilter({ generation: gen });
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
},
|
|
531
|
+
asBackendProvider() {
|
|
532
|
+
// in-process read view (already holds write creds — acceptable here)
|
|
533
|
+
return makeQdrantBackendProvider({
|
|
534
|
+
reader: client,
|
|
535
|
+
catalogReader: catalogStore,
|
|
536
|
+
collection: deps.collection,
|
|
537
|
+
});
|
|
538
|
+
},
|
|
539
|
+
};
|
|
540
|
+
return provider;
|
|
541
|
+
}
|
|
542
|
+
//# sourceMappingURL=qdrant-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qdrant-store.js","sourceRoot":"","sources":["../../../src/skills/plugin-host/qdrant-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qdrant-store.test.d.ts","sourceRoot":"","sources":["../../../src/skills/plugin-host/qdrant-store.test.ts"],"names":[],"mappings":""}
|