@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.
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,100 @@
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
+ const MANIFEST = {
6
+ embeddingSpaceId: 'sp',
7
+ dimension: 3,
8
+ retrievalSchemaVersion: 1,
9
+ };
10
+ const rec = (id, group, vec) => ({
11
+ record: {
12
+ id,
13
+ sourceId: 's',
14
+ group,
15
+ name: id,
16
+ retrievalText: id,
17
+ content: `c-${id}`,
18
+ provenance: id,
19
+ },
20
+ vector: vec,
21
+ });
22
+ test('build inactive → publishCatalog activates → query + activeSnapshot from catalog', async () => {
23
+ const p = makeInMemoryStoreProvider();
24
+ const store = p.forGroup('g1');
25
+ const { generation } = await store.beginGeneration();
26
+ // upsert is embedding-agnostic here: the in-memory store accepts pre-vectorised rows via a test seam
27
+ await p._seed(generation, [
28
+ rec('a', 'g1', [1, 0, 0]),
29
+ rec('b', 'g1', [0, 1, 0]),
30
+ ]);
31
+ // nothing serves yet
32
+ assert.equal(await store.activeSnapshot(), null);
33
+ const before = await p.readCatalog();
34
+ await p.publishCatalog(before.catalogRevision, [
35
+ {
36
+ collection: { group: 'g1', description: 'd', collection: 'g1' },
37
+ sources: ['s'],
38
+ generation,
39
+ manifest: MANIFEST,
40
+ },
41
+ ]);
42
+ const snap = await store.activeSnapshot();
43
+ assert.equal(snap?.revision, generation);
44
+ assert.deepEqual(snap?.manifest, MANIFEST);
45
+ const hits = await store.queryRevision(generation, [1, 0, 0], 1);
46
+ assert.equal(hits[0].record.id, 'a');
47
+ });
48
+ test('publishCatalog CAS rejects a stale expectedRevision with CatalogCasError', async () => {
49
+ const p = makeInMemoryStoreProvider();
50
+ const r0 = (await p.readCatalog()).catalogRevision;
51
+ await p.publishCatalog(r0, []); // bumps to r1
52
+ await assert.rejects(() => p.publishCatalog(r0, []), (e) => e instanceof CatalogCasError);
53
+ });
54
+ test('EXACT retention via lease: a generation pinned by activeSnapshot survives a concurrent reclaim until release', async () => {
55
+ const p = makeInMemoryStoreProvider();
56
+ const backend = p.forGroup('g1');
57
+ const g = await backend.beginGeneration();
58
+ await p._seed(g.generation, [rec('a', 'g1', [1, 0, 0])]);
59
+ await p.publishCatalog((await p.readCatalog()).catalogRevision, [
60
+ {
61
+ collection: { group: 'g1', description: 'd', collection: 'g1' },
62
+ sources: ['s'],
63
+ generation: g.generation,
64
+ manifest: MANIFEST,
65
+ },
66
+ ]);
67
+ // a reader resolves (PINS) the generation...
68
+ const snap = await backend.activeSnapshot();
69
+ // ...then the catalog rotates it out AND a reclaim is attempted (simulating a concurrent load)
70
+ await p.publishCatalog((await p.readCatalog()).catalogRevision, []); // retire g1
71
+ await p.forGroup('g1').discardGeneration(snap.revision); // reclaim attempt — DEFERRED (leased)
72
+ // the in-flight reader's query STILL succeeds (no read-under-delete):
73
+ assert.equal((await backend.queryRevision(snap.revision, [1, 0, 0], 1)).length, 1);
74
+ // release the lease → the deferred reclaim now runs
75
+ backend.release(snap.revision);
76
+ await assert.rejects(() => backend.queryRevision(snap.revision, [1, 0, 0], 1), /unknown generation/i);
77
+ });
78
+ test('an ACTIVE generation is retained; dropCollection only reclaims a NON-active one', async () => {
79
+ const p = makeInMemoryStoreProvider();
80
+ const g = await p.forGroup('g1').beginGeneration();
81
+ await p._seed(g.generation, [rec('a', 'g1', [1, 0, 0])]);
82
+ const r0 = (await p.readCatalog()).catalogRevision;
83
+ await p.publishCatalog(r0, [
84
+ {
85
+ collection: { group: 'g1', description: 'd', collection: 'g1' },
86
+ sources: ['s'],
87
+ generation: g.generation,
88
+ manifest: MANIFEST,
89
+ },
90
+ ]);
91
+ // dropCollection on an ACTIVE collection must NOT delete its served generation
92
+ await p.dropCollection('g1');
93
+ assert.equal((await p.forGroup('g1').queryRevision(g.generation, [1, 0, 0], 1)).length, 1);
94
+ // now retire g1 from the catalog (publish WITHOUT it) → the generation becomes non-active
95
+ const r1 = (await p.readCatalog()).catalogRevision;
96
+ await p.publishCatalog(r1, []);
97
+ await p.dropCollection('g1'); // reclaims the now-non-active generation
98
+ await assert.rejects(() => p.forGroup('g1').queryRevision(g.generation, [1, 0, 0], 1), /unknown generation|not found/i);
99
+ });
100
+ //# sourceMappingURL=in-memory-store.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-store.test.js","sourceRoot":"","sources":["../../../src/skills/plugin-host/in-memory-store.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export { chunkSkill, type SkillIdentity } from './chunker.js';
2
+ export { type CompatibleSkillsRagDeps, makeCompatibleSkillsRag, } from './compatible-skills-rag.js';
3
+ export { type HttpMarketplaceSourceOptions, type HttpTransportOptions, type IMarketplaceTransport, makeHttpMarketplaceSource, makeHttpTransport, } from './http-marketplace-source.js';
4
+ export { type IInMemoryStoreProvider, makeInMemoryStoreProvider, } from './in-memory-store.js';
5
+ export { buildIngestResult, type MarketplaceInput, } from './marketplace-adapter.js';
6
+ export { type ICatalogReader, type ICatalogStore, type IPgPool, type IQdrantClient, type IQdrantReader, makeInProcessCatalogStore, makePgCatalogReader, makePgCatalogStore, makeQdrantBackendProvider, makeQdrantClient, makeQdrantReader, makeQdrantStoreProvider, pointId, type QdrantPoint, type QdrantStoreProviderDeps, } from './qdrant-store.js';
7
+ export { type IngestHostDeps, makeSkillPluginHost, type RecallHostDeps, type SkillPluginHostDeps, } from './skill-plugin-host.js';
8
+ export { type SkillsRagSourceConfig, skillsRagSource, } from './skills-rag-source.js';
9
+ export { type FetchedSourceConfig, registerSkillSourceStrategy, resolveSkillSourceStrategy, type SkillSourceStrategy, } from './source-strategies.js';
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/skills/plugin-host/index.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EACL,KAAK,uBAAuB,EAC5B,uBAAuB,GACxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,KAAK,4BAA4B,EACjC,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,yBAAyB,EACzB,iBAAiB,GAClB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,KAAK,sBAAsB,EAC3B,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,iBAAiB,EACjB,KAAK,gBAAgB,GACtB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,OAAO,EACZ,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,yBAAyB,EACzB,mBAAmB,EACnB,kBAAkB,EAClB,yBAAyB,EACzB,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,EACvB,OAAO,EACP,KAAK,WAAW,EAChB,KAAK,uBAAuB,GAC7B,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,KAAK,cAAc,EACnB,mBAAmB,EACnB,KAAK,cAAc,EACnB,KAAK,mBAAmB,GACzB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,KAAK,qBAAqB,EAC1B,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,KAAK,mBAAmB,EACxB,2BAA2B,EAC3B,0BAA0B,EAC1B,KAAK,mBAAmB,GACzB,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,12 @@
1
+ // Skill plugin-host barrel — chunker, marketplace adapter, store, compat wrapper,
2
+ // host, RAG source, HTTP marketplace source, and the source-strategy registry.
3
+ export { chunkSkill } from './chunker.js';
4
+ export { makeCompatibleSkillsRag, } from './compatible-skills-rag.js';
5
+ export { makeHttpMarketplaceSource, makeHttpTransport, } from './http-marketplace-source.js';
6
+ export { makeInMemoryStoreProvider, } from './in-memory-store.js';
7
+ export { buildIngestResult, } from './marketplace-adapter.js';
8
+ export { makeInProcessCatalogStore, makePgCatalogReader, makePgCatalogStore, makeQdrantBackendProvider, makeQdrantClient, makeQdrantReader, makeQdrantStoreProvider, pointId, } from './qdrant-store.js';
9
+ export { makeSkillPluginHost, } from './skill-plugin-host.js';
10
+ export { skillsRagSource, } from './skills-rag-source.js';
11
+ export { registerSkillSourceStrategy, resolveSkillSourceStrategy, } from './source-strategies.js';
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/skills/plugin-host/index.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,+EAA+E;AAE/E,OAAO,EAAE,UAAU,EAAsB,MAAM,cAAc,CAAC;AAC9D,OAAO,EAEL,uBAAuB,GACxB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAIL,yBAAyB,EACzB,iBAAiB,GAClB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAEL,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EACL,iBAAiB,GAElB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAML,yBAAyB,EACzB,mBAAmB,EACnB,kBAAkB,EAClB,yBAAyB,EACzB,gBAAgB,EAChB,gBAAgB,EAChB,uBAAuB,EACvB,OAAO,GAGR,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAEL,mBAAmB,GAGpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEL,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAEL,2BAA2B,EAC3B,0BAA0B,GAE3B,MAAM,wBAAwB,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { SkillIngestResult } from '@mcp-abap-adt/llm-agent';
2
+ export interface MarketplaceInput {
3
+ source: string;
4
+ plugins: ReadonlyArray<{
5
+ plugin: string;
6
+ version: string;
7
+ skills: ReadonlyArray<{
8
+ skill: string;
9
+ skillMd: string;
10
+ }>;
11
+ }>;
12
+ chunk: {
13
+ maxChars: number;
14
+ };
15
+ /** Strategy placement: plugin → its group + description. */
16
+ placement: (plugin: string) => {
17
+ group: string;
18
+ description: string;
19
+ };
20
+ }
21
+ /** Pure, FS-free: parse SKILL.md strings, chunk, and place records into collections. */
22
+ export declare function buildIngestResult(input: MarketplaceInput): SkillIngestResult;
23
+ //# sourceMappingURL=marketplace-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketplace-adapter.d.ts","sourceRoot":"","sources":["../../../src/skills/plugin-host/marketplace-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,iBAAiB,EAElB,MAAM,yBAAyB,CAAC;AAIjC,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,aAAa,CAAC;QACrB,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,aAAa,CAAC;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC3D,CAAC,CAAC;IACH,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5B,4DAA4D;IAC5D,SAAS,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CACvE;AAED,wFAAwF;AACxF,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,gBAAgB,GAAG,iBAAiB,CAkC5E"}
@@ -0,0 +1,32 @@
1
+ import { parseFrontmatter } from '../../utils/parse-frontmatter.js';
2
+ import { chunkSkill } from './chunker.js';
3
+ /** Pure, FS-free: parse SKILL.md strings, chunk, and place records into collections. */
4
+ export function buildIngestResult(input) {
5
+ const records = [];
6
+ const collections = new Map();
7
+ for (const p of input.plugins) {
8
+ const place = input.placement(p.plugin);
9
+ if (!collections.has(place.group)) {
10
+ collections.set(place.group, {
11
+ group: place.group,
12
+ description: place.description,
13
+ collection: place.group,
14
+ });
15
+ }
16
+ for (const s of p.skills) {
17
+ const { meta, body } = parseFrontmatter(s.skillMd);
18
+ const description = String(meta.description ?? '');
19
+ records.push(...chunkSkill({
20
+ source: input.source,
21
+ plugin: p.plugin,
22
+ version: p.version,
23
+ skill: s.skill,
24
+ group: place.group,
25
+ description,
26
+ body,
27
+ }, input.chunk));
28
+ }
29
+ }
30
+ return { collections: [...collections.values()], records };
31
+ }
32
+ //# sourceMappingURL=marketplace-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketplace-adapter.js","sourceRoot":"","sources":["../../../src/skills/plugin-host/marketplace-adapter.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAc1C,wFAAwF;AACxF,MAAM,UAAU,iBAAiB,CAAC,KAAuB;IACvD,MAAM,OAAO,GAAkB,EAAE,CAAC;IAClC,MAAM,WAAW,GAAG,IAAI,GAAG,EAA0B,CAAC;IACtD,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;YAClC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE;gBAC3B,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,UAAU,EAAE,KAAK,CAAC,KAAK;aACxB,CAAC,CAAC;QACL,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC;YACzB,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,gBAAgB,CACrC,CAAC,CAAC,OAAO,CACV,CAAC;YACF,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;YACnD,OAAO,CAAC,IAAI,CACV,GAAG,UAAU,CACX;gBACE,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,MAAM,EAAE,CAAC,CAAC,MAAM;gBAChB,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,KAAK,EAAE,KAAK,CAAC,KAAK;gBAClB,WAAW;gBACX,IAAI;aACL,EACD,KAAK,CAAC,KAAK,CACZ,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,EAAE,WAAW,EAAE,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=marketplace-adapter.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketplace-adapter.test.d.ts","sourceRoot":"","sources":["../../../src/skills/plugin-host/marketplace-adapter.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,46 @@
1
+ import assert from 'node:assert/strict';
2
+ import { test } from 'node:test';
3
+ import { buildIngestResult } from './marketplace-adapter.js';
4
+ const SKILL_MD = `---\nname: do-thing\ndescription: How to do the thing\n---\n# Do Thing\n## Step\nrun it`;
5
+ test('manifest + SKILL.md → records placed one-group-per-plugin + catalog', () => {
6
+ const res = buildIngestResult({
7
+ source: 'vendor',
8
+ plugins: [
9
+ {
10
+ plugin: 'p1',
11
+ version: '1',
12
+ skills: [{ skill: 'do-thing', skillMd: SKILL_MD }],
13
+ },
14
+ ],
15
+ chunk: { maxChars: 1000 },
16
+ placement: (plugin) => ({ group: plugin, description: `plugin ${plugin}` }),
17
+ });
18
+ assert.deepEqual(res.collections.map((c) => c.group), ['p1']);
19
+ assert.equal(res.collections[0].description, 'plugin p1');
20
+ assert.ok(res.records.length >= 1);
21
+ assert.ok(res.records.every((r) => r.group === 'p1'));
22
+ const groups = new Set(res.collections.map((c) => c.group));
23
+ assert.ok(res.records.every((r) => groups.has(r.group)));
24
+ });
25
+ test('a strategy may bundle plugins into one group', () => {
26
+ const res = buildIngestResult({
27
+ source: 'vendor',
28
+ plugins: [
29
+ {
30
+ plugin: 'a',
31
+ version: '1',
32
+ skills: [{ skill: 's', skillMd: SKILL_MD }],
33
+ },
34
+ {
35
+ plugin: 'b',
36
+ version: '1',
37
+ skills: [{ skill: 's', skillMd: SKILL_MD }],
38
+ },
39
+ ],
40
+ chunk: { maxChars: 1000 },
41
+ placement: () => ({ group: 'bundle', description: 'bundle' }),
42
+ });
43
+ assert.deepEqual(res.collections.map((c) => c.group), ['bundle']);
44
+ assert.ok(res.records.every((r) => r.group === 'bundle'));
45
+ });
46
+ //# sourceMappingURL=marketplace-adapter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"marketplace-adapter.test.js","sourceRoot":"","sources":["../../../src/skills/plugin-host/marketplace-adapter.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,85 @@
1
+ import type { CallOptions, CatalogEntry, CatalogSnapshot, ISkillsRagBackendProvider, ISkillsStoreProvider } from '@mcp-abap-adt/llm-agent';
2
+ export interface QdrantPoint {
3
+ id: string;
4
+ vector: number[];
5
+ payload: Record<string, unknown>;
6
+ }
7
+ export interface IQdrantReader {
8
+ search(filter: object, vector: number[], k: number, options?: {
9
+ signal?: AbortSignal;
10
+ }): Promise<Array<{
11
+ payload: Record<string, unknown>;
12
+ score: number;
13
+ }>>;
14
+ scroll(filter: object, cursor?: string): Promise<{
15
+ points: QdrantPoint[];
16
+ next?: string;
17
+ }>;
18
+ }
19
+ export interface IQdrantClient extends IQdrantReader {
20
+ /**
21
+ * Upsert points. `opts.wait` (default false) maps to Qdrant `?wait=true`:
22
+ * the request returns only after the operation is APPLIED and the points are
23
+ * searchable. The general default omits it (throughput); the catalog-activation
24
+ * ingest path passes `wait: true` so a generation is never published active
25
+ * before its points are visible to recall (read-after-write at the activation
26
+ * boundary).
27
+ */
28
+ upsertPoints(points: QdrantPoint[], opts?: {
29
+ wait?: boolean;
30
+ }): Promise<void>;
31
+ deleteByFilter(filter: object): Promise<void>;
32
+ }
33
+ export interface ICatalogReader {
34
+ read(): Promise<CatalogSnapshot>;
35
+ }
36
+ export interface ICatalogStore extends ICatalogReader {
37
+ casPublish(expectedCatalogRevision: string, entries: readonly CatalogEntry[], now: number): Promise<CatalogSnapshot>;
38
+ pruneRetired(expectedCatalogRevision: string, generations: readonly string[]): Promise<CatalogSnapshot>;
39
+ }
40
+ type Embed = (text: string, options?: CallOptions) => Promise<number[]>;
41
+ type PointId = (generation: string, recordId: string) => string;
42
+ export declare const pointId: PointId;
43
+ export declare function makeInProcessCatalogStore(): ICatalogStore;
44
+ export interface IPgPool {
45
+ query(sql: string, params?: unknown[]): Promise<{
46
+ rows: unknown[];
47
+ rowCount: number;
48
+ }>;
49
+ }
50
+ export declare function makePgCatalogStore(deps: {
51
+ pool: IPgPool;
52
+ table?: string;
53
+ }): ICatalogStore;
54
+ export declare function makePgCatalogReader(deps: {
55
+ pool: IPgPool;
56
+ table?: string;
57
+ }): ICatalogReader;
58
+ interface QdrantRestOptions {
59
+ url: string;
60
+ apiKey?: string;
61
+ collection: string;
62
+ }
63
+ /** Read-only Qdrant reader (search + scroll). Used by recall-only with a read key. */
64
+ export declare function makeQdrantReader(opts: QdrantRestOptions): IQdrantReader;
65
+ /** Read/write Qdrant client (reader + upsert + delete). Used by the ingest path. */
66
+ export declare function makeQdrantClient(opts: QdrantRestOptions): IQdrantClient;
67
+ /** Read-only backend provider over reader interfaces (no write/reconcile API). */
68
+ export declare function makeQdrantBackendProvider(deps: {
69
+ reader: IQdrantReader;
70
+ catalogReader: ICatalogReader;
71
+ collection: string;
72
+ }): ISkillsRagBackendProvider;
73
+ export interface QdrantStoreProviderDeps {
74
+ client: IQdrantClient;
75
+ collection: string;
76
+ catalogStore: ICatalogStore;
77
+ embed: Embed;
78
+ pointId?: PointId;
79
+ now?: () => number;
80
+ retiredGraceMs: number;
81
+ orphanGraceMs: number;
82
+ }
83
+ export declare function makeQdrantStoreProvider(deps: QdrantStoreProviderDeps): ISkillsStoreProvider;
84
+ export {};
85
+ //# sourceMappingURL=qdrant-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qdrant-store.d.ts","sourceRoot":"","sources":["../../../src/skills/plugin-host/qdrant-store.ts"],"names":[],"mappings":"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"}