@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,174 @@
1
+ import assert from 'node:assert/strict';
2
+ import { test } from 'node:test';
3
+ import { SkillsIncompatibleError } from '@mcp-abap-adt/llm-agent';
4
+ import { makeCompatibleSkillsRag } from './compatible-skills-rag.js';
5
+ const MANIFEST = {
6
+ embeddingSpaceId: 'sp',
7
+ dimension: 3,
8
+ retrievalSchemaVersion: 1,
9
+ };
10
+ function stubBackend(opts) {
11
+ let queryCalls = 0;
12
+ const released = [];
13
+ return {
14
+ backend: {
15
+ activeSnapshot: opts.snapshot,
16
+ release(rev) {
17
+ released.push(rev);
18
+ },
19
+ async queryRevision() {
20
+ queryCalls++;
21
+ return (opts.hits ?? []);
22
+ },
23
+ },
24
+ queryCalls: () => queryCalls,
25
+ released: () => released,
26
+ };
27
+ }
28
+ test('lease: release(revision) is called in the finally on every non-null path', async () => {
29
+ // compatible path
30
+ const ok = stubBackend({
31
+ snapshot: async () => ({ revision: 'g0', manifest: MANIFEST }),
32
+ hits: [],
33
+ });
34
+ const ragOk = makeCompatibleSkillsRag({
35
+ backend: ok.backend,
36
+ embedder: { embed: async () => ({ vector: [1, 0, 0] }) },
37
+ embeddingSpaceId: 'sp',
38
+ retrievalSchemaVersion: 1,
39
+ dimension: 3,
40
+ });
41
+ await ragOk.query('q', { k: 1 });
42
+ assert.deepEqual(ok.released(), ['g0']);
43
+ // incompatible path (no query, still releases)
44
+ const bad = stubBackend({
45
+ snapshot: async () => ({
46
+ revision: 'g1',
47
+ manifest: { ...MANIFEST, embeddingSpaceId: 'X' },
48
+ }),
49
+ });
50
+ const ragBad = makeCompatibleSkillsRag({
51
+ backend: bad.backend,
52
+ embedder: { embed: async () => ({ vector: [1, 0, 0] }) },
53
+ embeddingSpaceId: 'sp',
54
+ retrievalSchemaVersion: 1,
55
+ dimension: 3,
56
+ });
57
+ await ragBad.query('q', { k: 1 });
58
+ assert.deepEqual(bad.released(), ['g1']);
59
+ });
60
+ test('recallTimeoutMs: a query that outlives the deadline aborts → empty (no crash)', async () => {
61
+ const backend = {
62
+ activeSnapshot: async () => ({ revision: 'g0', manifest: MANIFEST }),
63
+ release() { },
64
+ async queryRevision(_r, _v, _k, options) {
65
+ // simulate a slow backend that respects the abort signal
66
+ return await new Promise((resolve, reject) => {
67
+ const t = setTimeout(() => resolve([]), 1000);
68
+ options?.signal?.addEventListener('abort', () => {
69
+ clearTimeout(t);
70
+ reject(Object.assign(new Error('aborted'), { name: 'AbortError' }));
71
+ });
72
+ });
73
+ },
74
+ };
75
+ const rag = makeCompatibleSkillsRag({
76
+ backend: backend,
77
+ embedder: { embed: async () => ({ vector: [1, 0, 0] }) },
78
+ embeddingSpaceId: 'sp',
79
+ retrievalSchemaVersion: 1,
80
+ dimension: 3,
81
+ recallTimeoutMs: 20,
82
+ });
83
+ const hits = await rag.query('q', { k: 1 }); // resolves to [] when the 20ms deadline fires
84
+ assert.deepEqual(hits, []);
85
+ });
86
+ test('compatible revision: embeds once, calls queryRevision', async () => {
87
+ let embeds = 0;
88
+ const sb = stubBackend({
89
+ snapshot: async () => ({ revision: 'g0', manifest: MANIFEST }),
90
+ hits: [{ record: { content: 'x' }, score: 0.9 }],
91
+ });
92
+ const rag = makeCompatibleSkillsRag({
93
+ backend: sb.backend,
94
+ embedder: {
95
+ embed: async () => {
96
+ embeds++;
97
+ return { vector: [1, 0, 0] };
98
+ },
99
+ },
100
+ embeddingSpaceId: 'sp',
101
+ retrievalSchemaVersion: 1,
102
+ dimension: 3,
103
+ });
104
+ const hits = await rag.query('q', { k: 1, threshold: 0 });
105
+ assert.equal(hits.length, 1);
106
+ assert.equal(embeds, 1);
107
+ assert.equal(sb.queryCalls(), 1);
108
+ });
109
+ test('incompatible revision: query() degrades to empty (ZERO embeds), but activeManifest() THROWS', async () => {
110
+ let embeds = 0;
111
+ const sb = stubBackend({
112
+ snapshot: async () => ({
113
+ revision: 'g0',
114
+ manifest: { ...MANIFEST, embeddingSpaceId: 'OTHER' },
115
+ }),
116
+ });
117
+ const rag = makeCompatibleSkillsRag({
118
+ backend: sb.backend,
119
+ embedder: {
120
+ embed: async () => {
121
+ embeds++;
122
+ return { vector: [1, 0, 0] };
123
+ },
124
+ },
125
+ embeddingSpaceId: 'sp',
126
+ retrievalSchemaVersion: 1,
127
+ dimension: 3,
128
+ });
129
+ // RUNTIME query() degrades to []
130
+ const hits = await rag.query('q', { k: 1 });
131
+ assert.equal(hits.length, 0);
132
+ assert.equal(embeds, 0); // embed skipped on incompatible
133
+ // EAGER activeManifest() THROWS (so recall-only load()/healthCheck can fail-fast)
134
+ await assert.rejects(() => rag.activeManifest(), (e) => e instanceof SkillsIncompatibleError);
135
+ });
136
+ test('null snapshot: ZERO embeds, empty', async () => {
137
+ let embeds = 0;
138
+ const sb = stubBackend({ snapshot: async () => null });
139
+ const rag = makeCompatibleSkillsRag({
140
+ backend: sb.backend,
141
+ embedder: {
142
+ embed: async () => {
143
+ embeds++;
144
+ return { vector: [1, 0, 0] };
145
+ },
146
+ },
147
+ embeddingSpaceId: 'sp',
148
+ retrievalSchemaVersion: 1,
149
+ dimension: 3,
150
+ });
151
+ assert.equal((await rag.query('q', { k: 1 })).length, 0);
152
+ assert.equal(embeds, 0);
153
+ });
154
+ test('lazy dimension probe: no embed at construction; first activeManifest probes once', async () => {
155
+ let embeds = 0;
156
+ const sb = stubBackend({
157
+ snapshot: async () => ({ revision: 'g0', manifest: MANIFEST }),
158
+ });
159
+ const rag = makeCompatibleSkillsRag({
160
+ backend: sb.backend,
161
+ embedder: {
162
+ embed: async () => {
163
+ embeds++;
164
+ return { vector: [1, 0, 0] };
165
+ },
166
+ },
167
+ embeddingSpaceId: 'sp',
168
+ retrievalSchemaVersion: 1, // dimension undeclared
169
+ });
170
+ assert.equal(embeds, 0); // construction did not embed
171
+ await rag.activeManifest();
172
+ assert.equal(embeds, 1); // one probe
173
+ });
174
+ //# sourceMappingURL=compatible-skills-rag.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compatible-skills-rag.test.js","sourceRoot":"","sources":["../../../src/skills/plugin-host/compatible-skills-rag.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ import type { ISkillSource } from '@mcp-abap-adt/llm-agent';
2
+ /** Mockable transport over the marketplace registry: a manifest listing plus per-skill
3
+ * SKILL.md fetch. The unit tests inject a fake; {@link makeHttpTransport} is the live
4
+ * global-`fetch` implementation (exercised end-to-end, not in unit tests). */
5
+ export interface IMarketplaceTransport {
6
+ /** List every plugin the registry offers, with its version and skill names. */
7
+ listPlugins(): Promise<Array<{
8
+ plugin: string;
9
+ version: string;
10
+ skills: string[];
11
+ }>>;
12
+ /** Fetch the raw SKILL.md text for one skill of one plugin. */
13
+ fetchSkillMd(plugin: string, skill: string): Promise<string>;
14
+ }
15
+ export interface HttpMarketplaceSourceOptions {
16
+ /** Stable sourceId stamped onto every record/collection. */
17
+ source: string;
18
+ /** Plugins to enable; non-empty required. `['*']` = every offered plugin. */
19
+ enabled: readonly string[];
20
+ transport: IMarketplaceTransport;
21
+ chunk: {
22
+ maxChars: number;
23
+ };
24
+ /** plugin → its group + description; default one-group-per-plugin. */
25
+ placement?: (plugin: string) => {
26
+ group: string;
27
+ description: string;
28
+ };
29
+ }
30
+ /** Build an {@link ISkillSource} backed by a marketplace {@link IMarketplaceTransport}.
31
+ * `acquire()` resolves the enabled plugin set against the registry manifest, fetches each
32
+ * SKILL.md, and delegates placement/chunking to {@link buildIngestResult}. FS/network-free
33
+ * given a mock transport. */
34
+ export declare function makeHttpMarketplaceSource(opts: HttpMarketplaceSourceOptions): ISkillSource;
35
+ export interface HttpTransportOptions {
36
+ /** Base URL of the marketplace registry (no trailing slash required). */
37
+ registry: string;
38
+ /** Optional bearer token sent as `Authorization: Bearer <apiKey>`. */
39
+ apiKey?: string;
40
+ }
41
+ /** Live {@link IMarketplaceTransport} over global `fetch`. NOT unit-tested (no real network
42
+ * in tests); exercised live against a registry. Endpoints:
43
+ * `GET {registry}/plugins` → `[{ plugin, version, skills }]`;
44
+ * `GET {registry}/plugins/{plugin}/skills/{skill}` → raw SKILL.md text. */
45
+ export declare function makeHttpTransport(opts: HttpTransportOptions): IMarketplaceTransport;
46
+ //# sourceMappingURL=http-marketplace-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-marketplace-source.d.ts","sourceRoot":"","sources":["../../../src/skills/plugin-host/http-marketplace-source.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,YAAY,EAEb,MAAM,yBAAyB,CAAC;AAGjC;;+EAE+E;AAC/E,MAAM,WAAW,qBAAqB;IACpC,+EAA+E;IAC/E,WAAW,IAAI,OAAO,CACpB,KAAK,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAC7D,CAAC;IACF,+DAA+D;IAC/D,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CAC9D;AAED,MAAM,WAAW,4BAA4B;IAC3C,4DAA4D;IAC5D,MAAM,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,SAAS,EAAE,qBAAqB,CAAC;IACjC,KAAK,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5B,sEAAsE;IACtE,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;CACxE;AAOD;;;8BAG8B;AAC9B,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,4BAA4B,GACjC,YAAY,CAoCd;AAED,MAAM,WAAW,oBAAoB;IACnC,yEAAyE;IACzE,QAAQ,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;4EAG4E;AAC5E,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,oBAAoB,GACzB,qBAAqB,CA6BvB"}
@@ -0,0 +1,67 @@
1
+ import { buildIngestResult } from './marketplace-adapter.js';
2
+ const defaultPlacement = (plugin) => ({
3
+ group: plugin,
4
+ description: plugin,
5
+ });
6
+ /** Build an {@link ISkillSource} backed by a marketplace {@link IMarketplaceTransport}.
7
+ * `acquire()` resolves the enabled plugin set against the registry manifest, fetches each
8
+ * SKILL.md, and delegates placement/chunking to {@link buildIngestResult}. FS/network-free
9
+ * given a mock transport. */
10
+ export function makeHttpMarketplaceSource(opts) {
11
+ if (opts.enabled.length === 0) {
12
+ throw new Error('makeHttpMarketplaceSource: `enabled` must be non-empty');
13
+ }
14
+ const placement = opts.placement ?? defaultPlacement;
15
+ const wantAll = opts.enabled.includes('*');
16
+ const enabledSet = new Set(opts.enabled);
17
+ return {
18
+ async acquire(_options) {
19
+ const offered = await opts.transport.listPlugins();
20
+ const selected = wantAll
21
+ ? offered
22
+ : offered.filter((p) => enabledSet.has(p.plugin));
23
+ const plugins = await Promise.all(selected.map(async (p) => ({
24
+ plugin: p.plugin,
25
+ version: p.version,
26
+ skills: await Promise.all(p.skills.map(async (skill) => ({
27
+ skill,
28
+ skillMd: await opts.transport.fetchSkillMd(p.plugin, skill),
29
+ }))),
30
+ })));
31
+ return buildIngestResult({
32
+ source: opts.source,
33
+ plugins,
34
+ chunk: opts.chunk,
35
+ placement,
36
+ });
37
+ },
38
+ };
39
+ }
40
+ /** Live {@link IMarketplaceTransport} over global `fetch`. NOT unit-tested (no real network
41
+ * in tests); exercised live against a registry. Endpoints:
42
+ * `GET {registry}/plugins` → `[{ plugin, version, skills }]`;
43
+ * `GET {registry}/plugins/{plugin}/skills/{skill}` → raw SKILL.md text. */
44
+ export function makeHttpTransport(opts) {
45
+ const base = opts.registry.replace(/\/+$/, '');
46
+ const headers = opts.apiKey
47
+ ? { authorization: `Bearer ${opts.apiKey}` }
48
+ : {};
49
+ return {
50
+ async listPlugins() {
51
+ const res = await fetch(`${base}/plugins`, { headers });
52
+ if (!res.ok) {
53
+ throw new Error(`listPlugins ${res.status} ${res.statusText}`);
54
+ }
55
+ return (await res.json());
56
+ },
57
+ async fetchSkillMd(plugin, skill) {
58
+ const url = `${base}/plugins/${encodeURIComponent(plugin)}/skills/${encodeURIComponent(skill)}`;
59
+ const res = await fetch(url, { headers });
60
+ if (!res.ok) {
61
+ throw new Error(`fetchSkillMd(${plugin}/${skill}) ${res.status} ${res.statusText}`);
62
+ }
63
+ return await res.text();
64
+ },
65
+ };
66
+ }
67
+ //# sourceMappingURL=http-marketplace-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-marketplace-source.js","sourceRoot":"","sources":["../../../src/skills/plugin-host/http-marketplace-source.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=http-marketplace-source.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-marketplace-source.test.d.ts","sourceRoot":"","sources":["../../../src/skills/plugin-host/http-marketplace-source.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,71 @@
1
+ import assert from 'node:assert/strict';
2
+ import { test } from 'node:test';
3
+ import { makeHttpMarketplaceSource } from './http-marketplace-source.js';
4
+ const SKILL_MD = `---\nname: s\ndescription: d\n---\n## H\nbody`;
5
+ test('fetches manifest + SKILL.md via injected transport, builds ingest result, zero FS', async () => {
6
+ const src = makeHttpMarketplaceSource({
7
+ source: 'vendor',
8
+ enabled: ['p1'],
9
+ transport: {
10
+ async listPlugins() {
11
+ return [{ plugin: 'p1', version: '1', skills: ['s'] }];
12
+ },
13
+ async fetchSkillMd(plugin, skill) {
14
+ assert.equal(plugin, 'p1');
15
+ assert.equal(skill, 's');
16
+ return SKILL_MD;
17
+ },
18
+ },
19
+ chunk: { maxChars: 1000 },
20
+ });
21
+ const res = await src.acquire();
22
+ assert.deepEqual(res.collections.map((c) => c.group), ['p1']);
23
+ assert.ok(res.records.length >= 1);
24
+ });
25
+ test('enabled "*" loads every offered plugin; empty enabled is a caller error', async () => {
26
+ const transport = {
27
+ async listPlugins() {
28
+ return [
29
+ { plugin: 'a', version: '1', skills: ['s'] },
30
+ { plugin: 'b', version: '1', skills: ['s'] },
31
+ ];
32
+ },
33
+ async fetchSkillMd() {
34
+ return SKILL_MD;
35
+ },
36
+ };
37
+ const all = makeHttpMarketplaceSource({
38
+ source: 'v',
39
+ enabled: ['*'],
40
+ transport,
41
+ chunk: { maxChars: 1000 },
42
+ });
43
+ assert.equal((await all.acquire()).collections.length, 2);
44
+ assert.throws(() => makeHttpMarketplaceSource({
45
+ source: 'v',
46
+ enabled: [],
47
+ transport,
48
+ chunk: { maxChars: 1000 },
49
+ }), /enabled/);
50
+ });
51
+ test('only the enabled subset of offered plugins is acquired', async () => {
52
+ const src = makeHttpMarketplaceSource({
53
+ source: 'v',
54
+ enabled: ['b'],
55
+ transport: {
56
+ async listPlugins() {
57
+ return [
58
+ { plugin: 'a', version: '1', skills: ['s'] },
59
+ { plugin: 'b', version: '1', skills: ['s'] },
60
+ ];
61
+ },
62
+ async fetchSkillMd() {
63
+ return SKILL_MD;
64
+ },
65
+ },
66
+ chunk: { maxChars: 1000 },
67
+ });
68
+ const res = await src.acquire();
69
+ assert.deepEqual(res.collections.map((c) => c.group), ['b']);
70
+ });
71
+ //# sourceMappingURL=http-marketplace-source.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-marketplace-source.test.js","sourceRoot":"","sources":["../../../src/skills/plugin-host/http-marketplace-source.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { CallOptions, ISkillsStoreProvider, SkillRecord } from '@mcp-abap-adt/llm-agent';
2
+ interface Row {
3
+ record: SkillRecord;
4
+ vector: number[];
5
+ }
6
+ type Embed = (text: string, options?: CallOptions) => Promise<number[]>;
7
+ export interface IInMemoryStoreProvider extends ISkillsStoreProvider {
8
+ /** TEST SEAM: write pre-vectorised rows into a generation without an embedder. */
9
+ _seed(generation: string, rows: Row[]): Promise<void>;
10
+ }
11
+ export declare function makeInMemoryStoreProvider(opts?: {
12
+ embed?: Embed;
13
+ }): IInMemoryStoreProvider;
14
+ export {};
15
+ //# sourceMappingURL=in-memory-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-store.d.ts","sourceRoot":"","sources":["../../../src/skills/plugin-host/in-memory-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,WAAW,EAKX,oBAAoB,EAEpB,WAAW,EACZ,MAAM,yBAAyB,CAAC;AAGjC,UAAU,GAAG;IACX,MAAM,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AACD,KAAK,KAAK,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;AAExE,MAAM,WAAW,sBAAuB,SAAQ,oBAAoB;IAClE,kFAAkF;IAClF,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvD;AAcD,wBAAgB,yBAAyB,CACvC,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,KAAK,CAAA;CAAO,GAC3B,sBAAsB,CAsJxB"}
@@ -0,0 +1,151 @@
1
+ import { CatalogCasError } from '@mcp-abap-adt/llm-agent'; // value (class), not a type
2
+ function cosine(a, b) {
3
+ let dot = 0;
4
+ let na = 0;
5
+ let nb = 0;
6
+ for (let i = 0; i < a.length; i++) {
7
+ dot += a[i] * b[i];
8
+ na += a[i] * a[i];
9
+ nb += b[i] * b[i];
10
+ }
11
+ return na && nb ? dot / (Math.sqrt(na) * Math.sqrt(nb)) : 0;
12
+ }
13
+ export function makeInMemoryStoreProvider(opts = {}) {
14
+ // generations: generationId -> rows
15
+ const gens = new Map();
16
+ // EXACT retention (P1.1): a refcount lease per generation + deferred physical delete.
17
+ const leases = new Map(); // generation -> active reader count
18
+ const pendingDelete = new Set(); // generations asked to delete while leased
19
+ // catalog
20
+ let catalogRevision = 'c0';
21
+ let entries = [];
22
+ let genSeq = 0;
23
+ const embed = opts.embed ??
24
+ (async () => {
25
+ throw new Error('no embedder configured');
26
+ });
27
+ const liveGenerationOf = (group) => entries.find((e) => e.collection.group === group && !e.tombstone)
28
+ ?.generation;
29
+ const isActive = (gen) => entries.some((e) => e.generation === gen && !e.tombstone);
30
+ // delete now IF safe (not active, not leased); else mark pending.
31
+ function reclaim(gen) {
32
+ if (isActive(gen))
33
+ return; // never delete a served generation
34
+ if ((leases.get(gen) ?? 0) > 0) {
35
+ pendingDelete.add(gen);
36
+ return;
37
+ } // a reader holds it
38
+ gens.delete(gen);
39
+ pendingDelete.delete(gen);
40
+ }
41
+ function backendFor(group) {
42
+ return {
43
+ async activeSnapshot() {
44
+ const e = entries.find((x) => x.collection.group === group && !x.tombstone);
45
+ if (!e)
46
+ return null;
47
+ leases.set(e.generation, (leases.get(e.generation) ?? 0) + 1); // PIN (lease)
48
+ return { revision: e.generation, manifest: e.manifest };
49
+ },
50
+ release(revision) {
51
+ const n = (leases.get(revision) ?? 0) - 1;
52
+ if (n <= 0) {
53
+ leases.delete(revision);
54
+ if (pendingDelete.has(revision))
55
+ reclaim(revision); // delete now that no reader holds it
56
+ }
57
+ else {
58
+ leases.set(revision, n);
59
+ }
60
+ },
61
+ async queryRevision(revision, vector, k) {
62
+ const rows = gens.get(revision); // captured synchronously; lease guaranteed it survives
63
+ if (!rows)
64
+ throw new Error(`unknown generation: ${revision}`);
65
+ return rows
66
+ .map((r) => ({ record: r.record, score: cosine(vector, r.vector) }))
67
+ .sort((a, b) => b.score - a.score)
68
+ .slice(0, k);
69
+ },
70
+ };
71
+ }
72
+ function storeFor(group) {
73
+ const backend = backendFor(group);
74
+ return {
75
+ ...backend,
76
+ async beginGeneration() {
77
+ const generation = `${group}#g${genSeq++}`;
78
+ gens.set(generation, []);
79
+ return { generation };
80
+ },
81
+ async upsert(generation, records, options) {
82
+ const rows = gens.get(generation) ?? [];
83
+ for (const record of records) {
84
+ rows.push({
85
+ record,
86
+ vector: await embed(record.retrievalText, options),
87
+ });
88
+ }
89
+ gens.set(generation, rows);
90
+ },
91
+ async carryForward(generation, sourceIds) {
92
+ const live = liveGenerationOf(group);
93
+ if (!live)
94
+ return;
95
+ const src = new Set(sourceIds);
96
+ const carried = (gens.get(live) ?? []).filter((r) => src.has(r.record.sourceId));
97
+ gens.set(generation, [...(gens.get(generation) ?? []), ...carried]);
98
+ },
99
+ async discardGeneration(generation) {
100
+ reclaim(generation); // no-op if active; deferred if leased
101
+ },
102
+ };
103
+ }
104
+ return {
105
+ forGroup: storeFor,
106
+ async _seed(generation, rows) {
107
+ gens.set(generation, [...(gens.get(generation) ?? []), ...rows]);
108
+ },
109
+ async readCatalog() {
110
+ return { catalogRevision, entries: entries.filter((e) => !e.tombstone) };
111
+ },
112
+ async publishCatalog(expectedCatalogRevision, next) {
113
+ if (expectedCatalogRevision !== catalogRevision) {
114
+ throw new CatalogCasError(`stale catalog revision: expected ${expectedCatalogRevision}, active ${catalogRevision}`);
115
+ }
116
+ const nextGens = new Set(next.filter((e) => !e.tombstone).map((e) => e.generation));
117
+ const retired = entries
118
+ .filter((e) => !nextGens.has(e.generation))
119
+ .map((e) => ({
120
+ generation: e.generation,
121
+ group: e.collection.group,
122
+ retiredAt: 0,
123
+ })); // in-memory: lease, retiredAt unused
124
+ entries = [...next];
125
+ catalogRevision = `c${Number(catalogRevision.slice(1)) + 1}`; // STORE generates revision
126
+ return {
127
+ catalogRevision,
128
+ entries: entries.filter((e) => !e.tombstone),
129
+ retired,
130
+ };
131
+ },
132
+ async dropCollection(group) {
133
+ // reclaim generations not named by an ACTIVE entry of this group (lease-respecting)
134
+ const activeGen = liveGenerationOf(group);
135
+ for (const gen of [...gens.keys()]) {
136
+ if (gen.startsWith(`${group}#`) && gen !== activeGen)
137
+ reclaim(gen);
138
+ }
139
+ // remove tombstoned entries of this group from the catalog records
140
+ entries = entries.filter((e) => !(e.collection.group === group && e.tombstone));
141
+ },
142
+ asBackendProvider() {
143
+ // read-only view: only readCatalog + forGroup→backend (no write/reconcile API)
144
+ return {
145
+ readCatalog: this.readCatalog,
146
+ forGroup: (g) => backendFor(g),
147
+ };
148
+ },
149
+ };
150
+ }
151
+ //# sourceMappingURL=in-memory-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-store.js","sourceRoot":"","sources":["../../../src/skills/plugin-host/in-memory-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=in-memory-store.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-store.test.d.ts","sourceRoot":"","sources":["../../../src/skills/plugin-host/in-memory-store.test.ts"],"names":[],"mappings":""}