@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,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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"in-memory-store.test.d.ts","sourceRoot":"","sources":["../../../src/skills/plugin-host/in-memory-store.test.ts"],"names":[],"mappings":""}
|