@mcp-abap-adt/llm-agent-libs 19.1.2 → 20.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 (89) hide show
  1. package/dist/index.d.ts +2 -1
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +2 -1
  4. package/dist/index.js.map +1 -1
  5. package/dist/rag/knowledge-rag.d.ts +28 -8
  6. package/dist/rag/knowledge-rag.d.ts.map +1 -1
  7. package/dist/rag/knowledge-rag.js +42 -8
  8. package/dist/rag/knowledge-rag.js.map +1 -1
  9. package/dist/skills/plugin-host/chunker.d.ts +17 -0
  10. package/dist/skills/plugin-host/chunker.d.ts.map +1 -0
  11. package/dist/skills/plugin-host/chunker.js +72 -0
  12. package/dist/skills/plugin-host/chunker.js.map +1 -0
  13. package/dist/skills/plugin-host/chunker.test.d.ts +2 -0
  14. package/dist/skills/plugin-host/chunker.test.d.ts.map +1 -0
  15. package/dist/skills/plugin-host/chunker.test.js +31 -0
  16. package/dist/skills/plugin-host/chunker.test.js.map +1 -0
  17. package/dist/skills/plugin-host/compatible-skills-rag.d.ts +14 -0
  18. package/dist/skills/plugin-host/compatible-skills-rag.d.ts.map +1 -0
  19. package/dist/skills/plugin-host/compatible-skills-rag.js +83 -0
  20. package/dist/skills/plugin-host/compatible-skills-rag.js.map +1 -0
  21. package/dist/skills/plugin-host/compatible-skills-rag.test.d.ts +2 -0
  22. package/dist/skills/plugin-host/compatible-skills-rag.test.d.ts.map +1 -0
  23. package/dist/skills/plugin-host/compatible-skills-rag.test.js +174 -0
  24. package/dist/skills/plugin-host/compatible-skills-rag.test.js.map +1 -0
  25. package/dist/skills/plugin-host/http-marketplace-source.d.ts +46 -0
  26. package/dist/skills/plugin-host/http-marketplace-source.d.ts.map +1 -0
  27. package/dist/skills/plugin-host/http-marketplace-source.js +67 -0
  28. package/dist/skills/plugin-host/http-marketplace-source.js.map +1 -0
  29. package/dist/skills/plugin-host/http-marketplace-source.test.d.ts +2 -0
  30. package/dist/skills/plugin-host/http-marketplace-source.test.d.ts.map +1 -0
  31. package/dist/skills/plugin-host/http-marketplace-source.test.js +71 -0
  32. package/dist/skills/plugin-host/http-marketplace-source.test.js.map +1 -0
  33. package/dist/skills/plugin-host/in-memory-store.d.ts +15 -0
  34. package/dist/skills/plugin-host/in-memory-store.d.ts.map +1 -0
  35. package/dist/skills/plugin-host/in-memory-store.js +151 -0
  36. package/dist/skills/plugin-host/in-memory-store.js.map +1 -0
  37. package/dist/skills/plugin-host/in-memory-store.test.d.ts +2 -0
  38. package/dist/skills/plugin-host/in-memory-store.test.d.ts.map +1 -0
  39. package/dist/skills/plugin-host/in-memory-store.test.js +100 -0
  40. package/dist/skills/plugin-host/in-memory-store.test.js.map +1 -0
  41. package/dist/skills/plugin-host/index.d.ts +10 -0
  42. package/dist/skills/plugin-host/index.d.ts.map +1 -0
  43. package/dist/skills/plugin-host/index.js +12 -0
  44. package/dist/skills/plugin-host/index.js.map +1 -0
  45. package/dist/skills/plugin-host/marketplace-adapter.d.ts +23 -0
  46. package/dist/skills/plugin-host/marketplace-adapter.d.ts.map +1 -0
  47. package/dist/skills/plugin-host/marketplace-adapter.js +32 -0
  48. package/dist/skills/plugin-host/marketplace-adapter.js.map +1 -0
  49. package/dist/skills/plugin-host/marketplace-adapter.test.d.ts +2 -0
  50. package/dist/skills/plugin-host/marketplace-adapter.test.d.ts.map +1 -0
  51. package/dist/skills/plugin-host/marketplace-adapter.test.js +46 -0
  52. package/dist/skills/plugin-host/marketplace-adapter.test.js.map +1 -0
  53. package/dist/skills/plugin-host/qdrant-store.d.ts +85 -0
  54. package/dist/skills/plugin-host/qdrant-store.d.ts.map +1 -0
  55. package/dist/skills/plugin-host/qdrant-store.js +542 -0
  56. package/dist/skills/plugin-host/qdrant-store.js.map +1 -0
  57. package/dist/skills/plugin-host/qdrant-store.test.d.ts +2 -0
  58. package/dist/skills/plugin-host/qdrant-store.test.d.ts.map +1 -0
  59. package/dist/skills/plugin-host/qdrant-store.test.js +396 -0
  60. package/dist/skills/plugin-host/qdrant-store.test.js.map +1 -0
  61. package/dist/skills/plugin-host/skill-plugin-host.d.ts +41 -0
  62. package/dist/skills/plugin-host/skill-plugin-host.d.ts.map +1 -0
  63. package/dist/skills/plugin-host/skill-plugin-host.ingest.test.d.ts +2 -0
  64. package/dist/skills/plugin-host/skill-plugin-host.ingest.test.d.ts.map +1 -0
  65. package/dist/skills/plugin-host/skill-plugin-host.ingest.test.js +520 -0
  66. package/dist/skills/plugin-host/skill-plugin-host.ingest.test.js.map +1 -0
  67. package/dist/skills/plugin-host/skill-plugin-host.js +367 -0
  68. package/dist/skills/plugin-host/skill-plugin-host.js.map +1 -0
  69. package/dist/skills/plugin-host/skill-plugin-host.recall-and-reload.test.d.ts +2 -0
  70. package/dist/skills/plugin-host/skill-plugin-host.recall-and-reload.test.d.ts.map +1 -0
  71. package/dist/skills/plugin-host/skill-plugin-host.recall-and-reload.test.js +328 -0
  72. package/dist/skills/plugin-host/skill-plugin-host.recall-and-reload.test.js.map +1 -0
  73. package/dist/skills/plugin-host/skills-rag-source.d.ts +17 -0
  74. package/dist/skills/plugin-host/skills-rag-source.d.ts.map +1 -0
  75. package/dist/skills/plugin-host/skills-rag-source.js +52 -0
  76. package/dist/skills/plugin-host/skills-rag-source.js.map +1 -0
  77. package/dist/skills/plugin-host/skills-rag-source.test.d.ts +2 -0
  78. package/dist/skills/plugin-host/skills-rag-source.test.d.ts.map +1 -0
  79. package/dist/skills/plugin-host/skills-rag-source.test.js +69 -0
  80. package/dist/skills/plugin-host/skills-rag-source.test.js.map +1 -0
  81. package/dist/skills/plugin-host/source-strategies.d.ts +20 -0
  82. package/dist/skills/plugin-host/source-strategies.d.ts.map +1 -0
  83. package/dist/skills/plugin-host/source-strategies.js +37 -0
  84. package/dist/skills/plugin-host/source-strategies.js.map +1 -0
  85. package/dist/skills/plugin-host/source-strategies.test.d.ts +2 -0
  86. package/dist/skills/plugin-host/source-strategies.test.d.ts.map +1 -0
  87. package/dist/skills/plugin-host/source-strategies.test.js +52 -0
  88. package/dist/skills/plugin-host/source-strategies.test.js.map +1 -0
  89. package/package.json +14 -14
@@ -0,0 +1,520 @@
1
+ import assert from 'node:assert/strict';
2
+ import { test } from 'node:test';
3
+ import { CatalogCasError } from '@mcp-abap-adt/llm-agent';
4
+ import { makeInMemoryStoreProvider } from './in-memory-store.js';
5
+ import { makeSkillPluginHost } from './skill-plugin-host.js';
6
+ // Deterministic 3-dim vector from text — lets the in-memory store embed with no real embedder.
7
+ function hash3(text) {
8
+ const v = [0, 0, 0];
9
+ for (let i = 0; i < text.length; i++) {
10
+ v[i % 3] += text.charCodeAt(i);
11
+ }
12
+ return v;
13
+ }
14
+ // In-memory store provider embed: text → vector (number[]).
15
+ const embed = async (text) => hash3(text);
16
+ // Host serving embedder: text → IEmbedResult.
17
+ const embedder = {
18
+ async embed(text) {
19
+ return { vector: hash3(text) };
20
+ },
21
+ };
22
+ function rec(id, sourceId, group, content) {
23
+ return {
24
+ id,
25
+ sourceId,
26
+ group,
27
+ name: id,
28
+ retrievalText: content,
29
+ content,
30
+ provenance: id,
31
+ };
32
+ }
33
+ function info(group, description = `desc-${group}`) {
34
+ return { group, description, collection: group };
35
+ }
36
+ /** A stub source that returns a fixed result or throws on acquire. */
37
+ function makeStubSource(result) {
38
+ return {
39
+ async acquire(_options) {
40
+ if (typeof result === 'function')
41
+ return result();
42
+ return result;
43
+ },
44
+ };
45
+ }
46
+ const HOST_BASE = {
47
+ embedder: embedder,
48
+ embeddingSpaceId: 'sp',
49
+ retrievalSchemaVersion: 1,
50
+ dimension: 3,
51
+ };
52
+ // 1 -------------------------------------------------------------------------
53
+ test('commits all desired collections in ONE publishCatalog', async () => {
54
+ const provider = makeInMemoryStoreProvider({ embed });
55
+ let publishCount = 0;
56
+ const origPublish = provider.publishCatalog.bind(provider);
57
+ provider.publishCatalog = async (rev, entries, options) => {
58
+ publishCount++;
59
+ return origPublish(rev, entries, options);
60
+ };
61
+ const host = makeSkillPluginHost({
62
+ ...HOST_BASE,
63
+ storeProvider: provider,
64
+ sources: [
65
+ {
66
+ id: 's1',
67
+ source: makeStubSource({
68
+ collections: [info('c1')],
69
+ records: [rec('c1:a', 's1', 'c1', 'alpha record')],
70
+ }),
71
+ },
72
+ {
73
+ id: 's2',
74
+ source: makeStubSource({
75
+ collections: [info('c2')],
76
+ records: [rec('c2:a', 's2', 'c2', 'beta record')],
77
+ }),
78
+ },
79
+ ],
80
+ });
81
+ const res = await host.load();
82
+ assert.equal(res.ok, true);
83
+ assert.deepEqual([...res.committed].sort(), ['c1', 'c2']);
84
+ assert.equal(publishCount, 1);
85
+ assert.deepEqual(host
86
+ .groups()
87
+ .map((g) => g.group)
88
+ .sort(), ['c1', 'c2']);
89
+ const hits = await host
90
+ .rag('c1')
91
+ .query('alpha record', { k: 5, threshold: 0 });
92
+ assert.ok(hits.some((h) => h.record.id === 'c1:a'));
93
+ });
94
+ // 2 -------------------------------------------------------------------------
95
+ test('multi-source merge: union records + ownership; conflicting descriptions throw', async () => {
96
+ // Same description → merged.
97
+ {
98
+ const provider = makeInMemoryStoreProvider({ embed });
99
+ const host = makeSkillPluginHost({
100
+ ...HOST_BASE,
101
+ storeProvider: provider,
102
+ sources: [
103
+ {
104
+ id: 's1',
105
+ source: makeStubSource({
106
+ collections: [info('c1', 'shared')],
107
+ records: [rec('c1:a', 's1', 'c1', 'aaa')],
108
+ }),
109
+ },
110
+ {
111
+ id: 's2',
112
+ source: makeStubSource({
113
+ collections: [info('c1', 'shared')],
114
+ records: [rec('c1:b', 's2', 'c1', 'bbb')],
115
+ }),
116
+ },
117
+ ],
118
+ });
119
+ const res = await host.load();
120
+ assert.equal(res.ok, true);
121
+ assert.deepEqual(res.committed, ['c1']);
122
+ const hits = await host.rag('c1').query('aaa', { k: 5, threshold: 0 });
123
+ assert.equal(hits.length, 2); // union of both sources' records
124
+ }
125
+ // Different descriptions → throw.
126
+ {
127
+ const provider = makeInMemoryStoreProvider({ embed });
128
+ const host = makeSkillPluginHost({
129
+ ...HOST_BASE,
130
+ storeProvider: provider,
131
+ sources: [
132
+ {
133
+ id: 's1',
134
+ source: makeStubSource({
135
+ collections: [info('c1', 'A')],
136
+ records: [rec('c1:a', 's1', 'c1', 'aaa')],
137
+ }),
138
+ },
139
+ {
140
+ id: 's2',
141
+ source: makeStubSource({
142
+ collections: [info('c1', 'B')],
143
+ records: [rec('c1:b', 's2', 'c1', 'bbb')],
144
+ }),
145
+ },
146
+ ],
147
+ });
148
+ await assert.rejects(() => host.load());
149
+ }
150
+ });
151
+ // 3 -------------------------------------------------------------------------
152
+ test('carry-forward publishes a NEW generation', async () => {
153
+ const provider = makeInMemoryStoreProvider({ embed });
154
+ // Load A: c1 fed by s1 + s2, both succeed.
155
+ const sourcesOk = [
156
+ {
157
+ id: 's1',
158
+ source: makeStubSource({
159
+ collections: [info('c1')],
160
+ records: [rec('c1:s1', 's1', 'c1', 's1 body')],
161
+ }),
162
+ },
163
+ {
164
+ id: 's2',
165
+ source: makeStubSource({
166
+ collections: [info('c1')],
167
+ records: [rec('c1:s2', 's2', 'c1', 's2 body')],
168
+ }),
169
+ },
170
+ ];
171
+ const hostA = makeSkillPluginHost({
172
+ ...HOST_BASE,
173
+ storeProvider: provider,
174
+ sources: sourcesOk,
175
+ });
176
+ await hostA.load();
177
+ const priorAfterA = await provider.readCatalog();
178
+ const priorGen = priorAfterA.entries.find((e) => e.collection.group === 'c1')?.generation;
179
+ // Load B: s2 throws → carry-forward of s2's records into a NEW generation.
180
+ const hostB = makeSkillPluginHost({
181
+ ...HOST_BASE,
182
+ storeProvider: provider,
183
+ strict: false,
184
+ sources: [
185
+ {
186
+ id: 's1',
187
+ source: makeStubSource({
188
+ collections: [info('c1')],
189
+ records: [rec('c1:s1', 's1', 'c1', 's1 body refreshed')],
190
+ }),
191
+ },
192
+ {
193
+ id: 's2',
194
+ source: makeStubSource(() => {
195
+ throw new Error('s2 down');
196
+ }),
197
+ },
198
+ ],
199
+ });
200
+ const res = await hostB.load();
201
+ assert.equal(res.ok, true);
202
+ const afterB = await provider.readCatalog();
203
+ const newGen = afterB.entries.find((e) => e.collection.group === 'c1')?.generation;
204
+ assert.notEqual(newGen, priorGen); // a NEW generation, not the prior pointer
205
+ // The new generation has s1 (refreshed) + s2 (carried forward).
206
+ const hits = await hostB.rag('c1').query('body', { k: 10, threshold: 0 });
207
+ const ids = hits.map((h) => h.record.id).sort();
208
+ assert.deepEqual(ids, ['c1:s1', 'c1:s2']);
209
+ });
210
+ // 4 -------------------------------------------------------------------------
211
+ test('first-load build failure with NO prior → omit + partial result', async () => {
212
+ // Provider where forGroup('c2').upsert always throws (no prior generation exists).
213
+ const provider = makeInMemoryStoreProvider({ embed });
214
+ const orig = provider.forGroup.bind(provider);
215
+ provider.forGroup = (group) => {
216
+ const store = orig(group);
217
+ if (group === 'c2') {
218
+ return {
219
+ ...store,
220
+ async upsert() {
221
+ throw new Error('c2 upsert fail');
222
+ },
223
+ };
224
+ }
225
+ return store;
226
+ };
227
+ const host = makeSkillPluginHost({
228
+ ...HOST_BASE,
229
+ storeProvider: provider,
230
+ sources: [
231
+ {
232
+ id: 's1',
233
+ source: makeStubSource({
234
+ collections: [info('c1')],
235
+ records: [rec('c1:a', 's1', 'c1', 'alpha')],
236
+ }),
237
+ },
238
+ {
239
+ id: 's2',
240
+ source: makeStubSource({
241
+ collections: [info('c2')],
242
+ records: [rec('c2:a', 's2', 'c2', 'beta')],
243
+ }),
244
+ },
245
+ ],
246
+ });
247
+ const res = await host.load();
248
+ assert.equal(res.ok, false);
249
+ assert.deepEqual(res.committed, ['c1']);
250
+ assert.equal(res.omitted.length, 1);
251
+ assert.equal(res.omitted[0].group, 'c2');
252
+ // c1 committed and serves; c2 serves nothing.
253
+ assert.deepEqual(host.groups().map((g) => g.group), ['c1']);
254
+ const c2hits = await host.rag('c2').query('beta', { k: 5, threshold: 0 });
255
+ assert.equal(c2hits.length, 0);
256
+ });
257
+ // 5 -------------------------------------------------------------------------
258
+ test('collection-set reconciliation: removed collection tombstoned now, reclaimed next load', async () => {
259
+ // servingMode:false so the reload guard does not block the set-change.
260
+ const provider = makeInMemoryStoreProvider({ embed });
261
+ let dropCalls = [];
262
+ const origDrop = provider.dropCollection.bind(provider);
263
+ provider.dropCollection = async (group, options) => {
264
+ dropCalls.push(group);
265
+ return origDrop(group, options);
266
+ };
267
+ const mkHost = (sources) => makeSkillPluginHost({
268
+ ...HOST_BASE,
269
+ storeProvider: provider,
270
+ servingMode: false,
271
+ sources,
272
+ });
273
+ // Load A: {c1, c2}
274
+ const hostA = mkHost([
275
+ {
276
+ id: 's1',
277
+ source: makeStubSource({
278
+ collections: [info('c1')],
279
+ records: [rec('c1:a', 's1', 'c1', 'alpha')],
280
+ }),
281
+ },
282
+ {
283
+ id: 's2',
284
+ source: makeStubSource({
285
+ collections: [info('c2')],
286
+ records: [rec('c2:a', 's2', 'c2', 'beta')],
287
+ }),
288
+ },
289
+ ]);
290
+ await hostA.load();
291
+ // Loads B and C run on the SAME host: deferred reclaim is per-host-instance state
292
+ // (load B schedules c2's drop; load C — the next load() on that host — reclaims it).
293
+ const hostBC = mkHost([
294
+ {
295
+ id: 's1',
296
+ source: makeStubSource({
297
+ collections: [info('c1')],
298
+ records: [rec('c1:a', 's1', 'c1', 'alpha')],
299
+ }),
300
+ },
301
+ ]);
302
+ // Load B: {c1} only.
303
+ const resB = await hostBC.load();
304
+ assert.deepEqual(resB.committed, ['c1']);
305
+ assert.deepEqual(resB.tombstoned, ['c2']);
306
+ // Immediately after B: groups()={c1}, rag('c2') empty.
307
+ assert.deepEqual(hostBC.groups().map((g) => g.group), ['c1']);
308
+ assert.equal((await hostBC.rag('c2').query('beta', { k: 5, threshold: 0 })).length, 0);
309
+ assert.equal(dropCalls.length, 0); // not physically dropped yet (deferred)
310
+ // Load C: reclaims c2 (dropCollection runs at the start).
311
+ dropCalls = [];
312
+ await hostBC.load();
313
+ assert.deepEqual(dropCalls, ['c2']);
314
+ });
315
+ // 6 -------------------------------------------------------------------------
316
+ test('partial-commit orphan cleanup (P1.4)', async () => {
317
+ // c2 has a PRIOR generation; its second build fails mid-way (upsert throws once) →
318
+ // commit keeps c2's prior pointer; the freshly-built gen is discarded in the finally.
319
+ const provider = makeInMemoryStoreProvider({ embed });
320
+ let c2UpsertCalls = 0;
321
+ const discarded = [];
322
+ const beganC2 = [];
323
+ const orig = provider.forGroup.bind(provider);
324
+ provider.forGroup = (group) => {
325
+ const store = orig(group);
326
+ if (group !== 'c2')
327
+ return store;
328
+ return {
329
+ ...store,
330
+ async beginGeneration() {
331
+ const g = await store.beginGeneration();
332
+ beganC2.push(g.generation);
333
+ return g;
334
+ },
335
+ async upsert(generation, records, options) {
336
+ c2UpsertCalls++;
337
+ if (c2UpsertCalls === 2)
338
+ throw new Error('c2 second upsert fail');
339
+ return store.upsert(generation, records, options);
340
+ },
341
+ async discardGeneration(generation) {
342
+ discarded.push(generation);
343
+ return store.discardGeneration(generation);
344
+ },
345
+ };
346
+ };
347
+ const mkSources = () => [
348
+ {
349
+ id: 's1',
350
+ source: makeStubSource({
351
+ collections: [info('c1')],
352
+ records: [rec('c1:a', 's1', 'c1', 'alpha')],
353
+ }),
354
+ },
355
+ {
356
+ id: 's2',
357
+ source: makeStubSource({
358
+ collections: [info('c2')],
359
+ records: [rec('c2:a', 's2', 'c2', 'beta')],
360
+ }),
361
+ },
362
+ ];
363
+ // Load A: both succeed → c2 has a prior generation.
364
+ const hostA = makeSkillPluginHost({
365
+ ...HOST_BASE,
366
+ storeProvider: provider,
367
+ sources: mkSources(),
368
+ });
369
+ await hostA.load();
370
+ const priorC2 = (await provider.readCatalog()).entries.find((e) => e.collection.group === 'c2')?.generation;
371
+ assert.ok(priorC2);
372
+ // Load B: c2's build fails mid (upsert throws) → falls back to prior pointer.
373
+ const hostB = makeSkillPluginHost({
374
+ ...HOST_BASE,
375
+ storeProvider: provider,
376
+ servingMode: false,
377
+ sources: mkSources(),
378
+ });
379
+ const resB = await hostB.load();
380
+ assert.equal(resB.ok, true); // committed===true (partial commit, c2 prior pointer kept)
381
+ // The freshly-built (failed-mid) c2 generation was discarded even though committed===true.
382
+ const builtMid = beganC2[beganC2.length - 1];
383
+ assert.ok(discarded.includes(builtMid));
384
+ // The committed catalog keeps c2's PRIOR pointer.
385
+ const after = await provider.readCatalog();
386
+ assert.equal(after.entries.find((e) => e.collection.group === 'c2')?.generation, priorC2);
387
+ });
388
+ // 7 -------------------------------------------------------------------------
389
+ test('lost CAS → discard built gens + retry from fresh snapshot, then commit', async () => {
390
+ const provider = makeInMemoryStoreProvider({ embed });
391
+ let publishCalls = 0;
392
+ const origPublish = provider.publishCatalog.bind(provider);
393
+ provider.publishCatalog = async (rev, entries, options) => {
394
+ publishCalls++;
395
+ if (publishCalls === 1)
396
+ throw new CatalogCasError('lost cas');
397
+ return origPublish(rev, entries, options);
398
+ };
399
+ let beginCalls = 0;
400
+ const origForGroup = provider.forGroup.bind(provider);
401
+ provider.forGroup = (group) => {
402
+ const store = origForGroup(group);
403
+ return {
404
+ ...store,
405
+ async beginGeneration() {
406
+ beginCalls++;
407
+ return store.beginGeneration();
408
+ },
409
+ };
410
+ };
411
+ const host = makeSkillPluginHost({
412
+ ...HOST_BASE,
413
+ storeProvider: provider,
414
+ sources: [
415
+ {
416
+ id: 's1',
417
+ source: makeStubSource({
418
+ collections: [info('c1')],
419
+ records: [rec('c1:a', 's1', 'c1', 'alpha')],
420
+ }),
421
+ },
422
+ ],
423
+ });
424
+ const res = await host.load();
425
+ assert.equal(res.ok, true);
426
+ assert.equal(publishCalls, 2); // first lost, second won
427
+ assert.equal(beginCalls, 2); // a FRESH generation per attempt (no reuse)
428
+ });
429
+ // 8 -------------------------------------------------------------------------
430
+ test('exhausted CAS → throw, no orphans', async () => {
431
+ const provider = makeInMemoryStoreProvider({ embed });
432
+ // Seed a pre-existing committed generation directly.
433
+ const seedGen = 'pre#g0';
434
+ await provider._seed(seedGen, [
435
+ { record: rec('pre:a', 'sp', 'pre', 'seed'), vector: hash3('seed') },
436
+ ]);
437
+ await provider.publishCatalog('c0', [
438
+ {
439
+ collection: info('pre'),
440
+ sources: ['sp'],
441
+ generation: seedGen,
442
+ manifest: {
443
+ embeddingSpaceId: 'sp',
444
+ dimension: 3,
445
+ retrievalSchemaVersion: 1,
446
+ },
447
+ },
448
+ ]);
449
+ const discarded = [];
450
+ const origForGroup = provider.forGroup.bind(provider);
451
+ provider.forGroup = (group) => {
452
+ const store = origForGroup(group);
453
+ return {
454
+ ...store,
455
+ async discardGeneration(generation) {
456
+ discarded.push(generation);
457
+ return store.discardGeneration(generation);
458
+ },
459
+ };
460
+ };
461
+ provider.publishCatalog = async () => {
462
+ throw new CatalogCasError('always lost');
463
+ };
464
+ const host = makeSkillPluginHost({
465
+ ...HOST_BASE,
466
+ storeProvider: provider,
467
+ servingMode: false,
468
+ catalogCasMaxAttempts: 3,
469
+ sources: [
470
+ {
471
+ id: 's1',
472
+ source: makeStubSource({
473
+ collections: [info('c1')],
474
+ records: [rec('c1:a', 's1', 'c1', 'alpha')],
475
+ }),
476
+ },
477
+ ],
478
+ });
479
+ await assert.rejects(() => host.load());
480
+ // The pre-existing committed generation survives; only built gens were discarded.
481
+ const cat = await provider.readCatalog();
482
+ assert.ok(cat.entries.some((e) => e.generation === seedGen));
483
+ assert.ok(discarded.length >= 3); // each attempt's built gen discarded
484
+ assert.ok(!discarded.includes(seedGen));
485
+ });
486
+ // 9 -------------------------------------------------------------------------
487
+ test('strict:true source failure → throw, nothing committed', async () => {
488
+ const provider = makeInMemoryStoreProvider({ embed });
489
+ let publishCalls = 0;
490
+ const origPublish = provider.publishCatalog.bind(provider);
491
+ provider.publishCatalog = async (rev, entries, options) => {
492
+ publishCalls++;
493
+ return origPublish(rev, entries, options);
494
+ };
495
+ const host = makeSkillPluginHost({
496
+ ...HOST_BASE,
497
+ storeProvider: provider,
498
+ strict: true,
499
+ sources: [
500
+ {
501
+ id: 's1',
502
+ source: makeStubSource({
503
+ collections: [info('c1')],
504
+ records: [rec('c1:a', 's1', 'c1', 'alpha')],
505
+ }),
506
+ },
507
+ {
508
+ id: 's2',
509
+ source: makeStubSource(() => {
510
+ throw new Error('s2 down');
511
+ }),
512
+ },
513
+ ],
514
+ });
515
+ await assert.rejects(() => host.load());
516
+ assert.equal(publishCalls, 0);
517
+ const cat = await provider.readCatalog();
518
+ assert.equal(cat.entries.length, 0);
519
+ });
520
+ //# sourceMappingURL=skill-plugin-host.ingest.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-plugin-host.ingest.test.js","sourceRoot":"","sources":["../../../src/skills/plugin-host/skill-plugin-host.ingest.test.ts"],"names":[],"mappings":"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"}