@mcp-abap-adt/llm-agent-server-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 (107) hide show
  1. package/dist/factories/controller-factory.d.ts +18 -4
  2. package/dist/factories/controller-factory.d.ts.map +1 -1
  3. package/dist/factories/controller-factory.js +50 -10
  4. package/dist/factories/controller-factory.js.map +1 -1
  5. package/dist/generated/version.d.ts +1 -1
  6. package/dist/generated/version.js +1 -1
  7. package/dist/index.d.ts +1 -0
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +1 -0
  10. package/dist/index.js.map +1 -1
  11. package/dist/pipelines/controller.d.ts.map +1 -1
  12. package/dist/pipelines/controller.js +41 -0
  13. package/dist/pipelines/controller.js.map +1 -1
  14. package/dist/pipelines/dag.d.ts.map +1 -1
  15. package/dist/pipelines/dag.js +2 -1
  16. package/dist/pipelines/dag.js.map +1 -1
  17. package/dist/pipelines/flat.d.ts.map +1 -1
  18. package/dist/pipelines/flat.js +2 -1
  19. package/dist/pipelines/flat.js.map +1 -1
  20. package/dist/pipelines/linear.d.ts.map +1 -1
  21. package/dist/pipelines/linear.js +2 -1
  22. package/dist/pipelines/linear.js.map +1 -1
  23. package/dist/pipelines/register-skill-sources.d.ts +21 -0
  24. package/dist/pipelines/register-skill-sources.d.ts.map +1 -0
  25. package/dist/pipelines/register-skill-sources.js +57 -0
  26. package/dist/pipelines/register-skill-sources.js.map +1 -0
  27. package/dist/pipelines/server-context.d.ts +37 -1
  28. package/dist/pipelines/server-context.d.ts.map +1 -1
  29. package/dist/pipelines/server-context.js.map +1 -1
  30. package/dist/smart-agent/config.d.ts.map +1 -1
  31. package/dist/smart-agent/config.js +4 -0
  32. package/dist/smart-agent/config.js.map +1 -1
  33. package/dist/smart-agent/controller/artifacts.d.ts +116 -0
  34. package/dist/smart-agent/controller/artifacts.d.ts.map +1 -0
  35. package/dist/smart-agent/controller/artifacts.js +192 -0
  36. package/dist/smart-agent/controller/artifacts.js.map +1 -0
  37. package/dist/smart-agent/controller/board.d.ts +73 -0
  38. package/dist/smart-agent/controller/board.d.ts.map +1 -0
  39. package/dist/smart-agent/controller/board.js +233 -0
  40. package/dist/smart-agent/controller/board.js.map +1 -0
  41. package/dist/smart-agent/controller/controller-coordinator-handler.d.ts +67 -7
  42. package/dist/smart-agent/controller/controller-coordinator-handler.d.ts.map +1 -1
  43. package/dist/smart-agent/controller/controller-coordinator-handler.js +923 -61
  44. package/dist/smart-agent/controller/controller-coordinator-handler.js.map +1 -1
  45. package/dist/smart-agent/controller/finalizer.d.ts +48 -0
  46. package/dist/smart-agent/controller/finalizer.d.ts.map +1 -0
  47. package/dist/smart-agent/controller/finalizer.js +126 -0
  48. package/dist/smart-agent/controller/finalizer.js.map +1 -0
  49. package/dist/smart-agent/controller/memorizer.d.ts +2 -2
  50. package/dist/smart-agent/controller/memorizer.d.ts.map +1 -1
  51. package/dist/smart-agent/controller/memorizer.js +2 -2
  52. package/dist/smart-agent/controller/memorizer.js.map +1 -1
  53. package/dist/smart-agent/controller/outcome.d.ts +28 -0
  54. package/dist/smart-agent/controller/outcome.d.ts.map +1 -0
  55. package/dist/smart-agent/controller/outcome.js +30 -0
  56. package/dist/smart-agent/controller/outcome.js.map +1 -0
  57. package/dist/smart-agent/controller/planner.d.ts +28 -5
  58. package/dist/smart-agent/controller/planner.d.ts.map +1 -1
  59. package/dist/smart-agent/controller/planner.js +111 -29
  60. package/dist/smart-agent/controller/planner.js.map +1 -1
  61. package/dist/smart-agent/controller/reviewer.d.ts +48 -0
  62. package/dist/smart-agent/controller/reviewer.d.ts.map +1 -0
  63. package/dist/smart-agent/controller/reviewer.js +116 -0
  64. package/dist/smart-agent/controller/reviewer.js.map +1 -0
  65. package/dist/smart-agent/controller/run-scope.d.ts +50 -0
  66. package/dist/smart-agent/controller/run-scope.d.ts.map +1 -0
  67. package/dist/smart-agent/controller/run-scope.js +99 -0
  68. package/dist/smart-agent/controller/run-scope.js.map +1 -0
  69. package/dist/smart-agent/controller/session-bundle.d.ts +5 -0
  70. package/dist/smart-agent/controller/session-bundle.d.ts.map +1 -1
  71. package/dist/smart-agent/controller/session-bundle.js +27 -0
  72. package/dist/smart-agent/controller/session-bundle.js.map +1 -1
  73. package/dist/smart-agent/controller/types.d.ts +117 -7
  74. package/dist/smart-agent/controller/types.d.ts.map +1 -1
  75. package/dist/smart-agent/controller/types.js +30 -1
  76. package/dist/smart-agent/controller/types.js.map +1 -1
  77. package/dist/smart-agent/embedder-knowledge-index.d.ts +28 -0
  78. package/dist/smart-agent/embedder-knowledge-index.d.ts.map +1 -0
  79. package/dist/smart-agent/embedder-knowledge-index.js +71 -0
  80. package/dist/smart-agent/embedder-knowledge-index.js.map +1 -0
  81. package/dist/smart-agent/jsonl-knowledge-backend.d.ts +26 -10
  82. package/dist/smart-agent/jsonl-knowledge-backend.d.ts.map +1 -1
  83. package/dist/smart-agent/jsonl-knowledge-backend.js +81 -9
  84. package/dist/smart-agent/jsonl-knowledge-backend.js.map +1 -1
  85. package/dist/smart-agent/pg-pool.d.ts +58 -0
  86. package/dist/smart-agent/pg-pool.d.ts.map +1 -0
  87. package/dist/smart-agent/pg-pool.js +149 -0
  88. package/dist/smart-agent/pg-pool.js.map +1 -0
  89. package/dist/smart-agent/skill-plugins-config.d.ts +97 -0
  90. package/dist/smart-agent/skill-plugins-config.d.ts.map +1 -0
  91. package/dist/smart-agent/skill-plugins-config.js +318 -0
  92. package/dist/smart-agent/skill-plugins-config.js.map +1 -0
  93. package/dist/smart-agent/skill-plugins-config.test.d.ts +2 -0
  94. package/dist/smart-agent/skill-plugins-config.test.d.ts.map +1 -0
  95. package/dist/smart-agent/skill-plugins-config.test.js.map +1 -0
  96. package/dist/smart-agent/skill-plugins-host-factory.d.ts +98 -0
  97. package/dist/smart-agent/skill-plugins-host-factory.d.ts.map +1 -0
  98. package/dist/smart-agent/skill-plugins-host-factory.js +284 -0
  99. package/dist/smart-agent/skill-plugins-host-factory.js.map +1 -0
  100. package/dist/smart-agent/skill-plugins-host-factory.test.d.ts +2 -0
  101. package/dist/smart-agent/skill-plugins-host-factory.test.d.ts.map +1 -0
  102. package/dist/smart-agent/skill-plugins-host-factory.test.js.map +1 -0
  103. package/dist/smart-agent/smart-server.d.ts +25 -0
  104. package/dist/smart-agent/smart-server.d.ts.map +1 -1
  105. package/dist/smart-agent/smart-server.js +139 -6
  106. package/dist/smart-agent/smart-server.js.map +1 -1
  107. package/package.json +9 -7
@@ -0,0 +1,318 @@
1
+ /**
2
+ * Parse + validate the top-level `skillPlugins:` server config key into a
3
+ * normalized {@link SkillPluginsConfig}.
4
+ *
5
+ * This is the skill PLUGIN-HOST config — a NEW key, DISTINCT from the existing
6
+ * `skills:` ({@link SmartServerSkillsConfig}, the FS skill-MANAGER consumed by
7
+ * `resolveSkillManager`). The two are unrelated features and must not collide.
8
+ *
9
+ * The host materialises consumer-supplied domain skills into a grouped
10
+ * skills-RAG and the pipelines recall from it. This module only normalizes +
11
+ * fail-loud validates the deployment config; assembly lives in the host factory.
12
+ */
13
+ import { resolveSkillSourceStrategy } from '@mcp-abap-adt/llm-agent-libs';
14
+ function isObject(v) {
15
+ return v !== null && typeof v === 'object' && !Array.isArray(v);
16
+ }
17
+ function fail(msg) {
18
+ throw new Error(`skillPlugins: ${msg}`);
19
+ }
20
+ /**
21
+ * Strict SQL-identifier regex for `catalog.table` — a bare identifier or one
22
+ * optional `schema.table` dot. The table name is interpolated directly into SQL
23
+ * downstream (DDL + queries), so reject anything that is not a plain identifier.
24
+ */
25
+ const SQL_IDENTIFIER = /^[A-Za-z_][A-Za-z0-9_]*(\.[A-Za-z_][A-Za-z0-9_]*)?$/;
26
+ /**
27
+ * Parse a numeric knob as a positive INTEGER (finite, integer, `> 0`). A bad
28
+ * value fails loud naming the knob (NOT a silent NaN/default). The key being
29
+ * ABSENT is the caller's concern (defaults applied before this is called).
30
+ */
31
+ function posInt(raw, name) {
32
+ const n = Number(raw);
33
+ if (!Number.isInteger(n) || n <= 0) {
34
+ fail(`${name} must be a positive integer (got ${JSON.stringify(raw)})`);
35
+ }
36
+ return n;
37
+ }
38
+ function parseStore(raw) {
39
+ if (raw === undefined)
40
+ return { type: 'in-memory' };
41
+ if (!isObject(raw))
42
+ fail('store must be an object');
43
+ const type = raw.type;
44
+ if (type === 'in-memory')
45
+ return { type: 'in-memory' };
46
+ if (type === 'qdrant') {
47
+ if (typeof raw.url !== 'string' || raw.url.length === 0) {
48
+ fail('store.url is required for store.type qdrant');
49
+ }
50
+ return {
51
+ type: 'qdrant',
52
+ url: raw.url,
53
+ ...(typeof raw.apiKey === 'string' ? { apiKey: raw.apiKey } : {}),
54
+ ...(typeof raw.collection === 'string'
55
+ ? { collection: raw.collection }
56
+ : {}),
57
+ };
58
+ }
59
+ return fail(`store.type "${String(type)}" is invalid (one of: in-memory, qdrant)`);
60
+ }
61
+ function parseCatalog(raw) {
62
+ if (raw === undefined)
63
+ return { type: 'in-process' };
64
+ if (!isObject(raw))
65
+ fail('catalog must be an object');
66
+ const type = raw.type;
67
+ if (type === 'in-process' || type === undefined)
68
+ return { type: 'in-process' };
69
+ if (type === 'postgres') {
70
+ if (typeof raw.connectionString !== 'string' ||
71
+ raw.connectionString.length === 0) {
72
+ fail('catalog.connectionString is required for catalog.type postgres');
73
+ }
74
+ if (raw.table !== undefined) {
75
+ if (typeof raw.table !== 'string' || !SQL_IDENTIFIER.test(raw.table)) {
76
+ fail(`catalog.table '${String(raw.table)}' is not a valid SQL identifier (must match ${SQL_IDENTIFIER.source})`);
77
+ }
78
+ }
79
+ return {
80
+ type: 'postgres',
81
+ connectionString: raw.connectionString,
82
+ ...(typeof raw.table === 'string' ? { table: raw.table } : {}),
83
+ };
84
+ }
85
+ return fail(`catalog.type "${String(type)}" is invalid (one of: in-process, postgres)`);
86
+ }
87
+ function isFetchedSource(raw) {
88
+ // A `records` source carries `records`; anything else is a fetched source.
89
+ return !('records' in raw);
90
+ }
91
+ function parseSource(raw) {
92
+ if (!isObject(raw))
93
+ fail('each source must be an object');
94
+ const id = raw.id;
95
+ if (typeof id !== 'string' || id.length === 0) {
96
+ fail('each source requires a non-empty string id (the stable sourceId)');
97
+ }
98
+ if (!isFetchedSource(raw)) {
99
+ if (!Array.isArray(raw.records)) {
100
+ fail(`source '${id}': records must be an array`);
101
+ }
102
+ return { id, records: raw.records };
103
+ }
104
+ // Fetched source: enabled is REQUIRED and non-empty.
105
+ const enabled = raw.enabled;
106
+ if (!Array.isArray(enabled) ||
107
+ enabled.length === 0 ||
108
+ !enabled.every((e) => typeof e === 'string')) {
109
+ fail(`source '${id}': a fetched source requires a non-empty 'enabled' plugin list (use ["*"] for all)`);
110
+ }
111
+ const out = {
112
+ id,
113
+ enabled: enabled,
114
+ ...(typeof raw.registry === 'string' ? { registry: raw.registry } : {}),
115
+ };
116
+ if (raw.strategy !== undefined) {
117
+ if (typeof raw.strategy !== 'string') {
118
+ fail(`source '${id}': strategy must be a string`);
119
+ }
120
+ // Validate against the strategy registry (throws on unknown name).
121
+ try {
122
+ resolveSkillSourceStrategy(raw.strategy);
123
+ }
124
+ catch (e) {
125
+ fail(`source '${id}': ${e instanceof Error ? e.message : String(e)}`);
126
+ }
127
+ out.strategy = raw.strategy;
128
+ }
129
+ if (raw.strategyConfig !== undefined) {
130
+ if (!isObject(raw.strategyConfig)) {
131
+ fail(`source '${id}': strategyConfig must be an object`);
132
+ }
133
+ out.strategyConfig = raw.strategyConfig;
134
+ }
135
+ return out;
136
+ }
137
+ /**
138
+ * Parse + validate the raw `skillPlugins:` YAML/object into a normalized
139
+ * {@link SkillPluginsConfig}. Throws a fail-loud `Error` on any invalid config.
140
+ */
141
+ export function parseSkillPluginsConfig(raw) {
142
+ if (!isObject(raw))
143
+ fail('config must be an object');
144
+ // mode — only 'implicit' this phase.
145
+ const mode = raw.mode ?? 'implicit';
146
+ if (mode === 'explicit') {
147
+ fail('mode: explicit (planner group-selection) is not yet implemented');
148
+ }
149
+ if (mode !== 'implicit') {
150
+ fail(`mode "${String(mode)}" is invalid (only 'implicit' is supported)`);
151
+ }
152
+ const store = parseStore(raw.store);
153
+ const catalog = parseCatalog(raw.catalog);
154
+ const persistentStore = store.type === 'qdrant';
155
+ // A persistent store mandates embeddingSpaceId.
156
+ const embeddingSpaceId = typeof raw.embeddingSpaceId === 'string' ? raw.embeddingSpaceId : undefined;
157
+ if (persistentStore && !embeddingSpaceId) {
158
+ fail('embeddingSpaceId is required for a persistent store (it is published in the catalog so a recall-only instance can verify it)');
159
+ }
160
+ // A persistent store mandates a persistent (postgres) catalog.
161
+ if (persistentStore && catalog.type !== 'postgres') {
162
+ fail('a persistent store requires a persistent catalog (postgres); an in-process catalog would vanish on restart and is invisible to a separate recall-only process');
163
+ }
164
+ // Numeric knobs + defaults. A present-but-invalid value fails loud naming the
165
+ // knob (NEVER a silent NaN/default); an ABSENT key keeps today's default.
166
+ const k = raw.k !== undefined ? posInt(raw.k, 'k') : 4;
167
+ let threshold = 0.3;
168
+ if (raw.threshold !== undefined) {
169
+ const t = Number(raw.threshold);
170
+ if (!Number.isFinite(t) || t < 0 || t > 1) {
171
+ fail(`threshold must be a finite number in [0, 1] (got ${JSON.stringify(raw.threshold)})`);
172
+ }
173
+ threshold = t;
174
+ }
175
+ const maxInjectChars = raw.maxInjectChars !== undefined
176
+ ? posInt(raw.maxInjectChars, 'maxInjectChars')
177
+ : 4000;
178
+ const catalogCasMaxAttempts = raw.catalogCasMaxAttempts !== undefined
179
+ ? posInt(raw.catalogCasMaxAttempts, 'catalogCasMaxAttempts')
180
+ : 3;
181
+ const retiredGraceMs = raw.retiredGraceMs !== undefined
182
+ ? posInt(raw.retiredGraceMs, 'retiredGraceMs')
183
+ : 30000;
184
+ const orphanGraceMs = raw.orphanGraceMs !== undefined
185
+ ? posInt(raw.orphanGraceMs, 'orphanGraceMs')
186
+ : 3600000;
187
+ const chunkRaw = isObject(raw.chunk) ? raw.chunk : undefined;
188
+ const chunk = {
189
+ maxChars: chunkRaw && chunkRaw.maxChars !== undefined
190
+ ? posInt(chunkRaw.maxChars, 'chunk.maxChars')
191
+ : 1500,
192
+ };
193
+ if (retiredGraceMs < 1000) {
194
+ fail('retiredGraceMs must be >= 1000 (too small to bound recall)');
195
+ }
196
+ // recallTimeoutMs: explicit must be a positive integer < retiredGraceMs;
197
+ // default = floor(grace*0.8) for a persistent store (always strictly <
198
+ // grace), unused for in-memory.
199
+ let recallTimeoutMs;
200
+ if (raw.recallTimeoutMs !== undefined) {
201
+ recallTimeoutMs = posInt(raw.recallTimeoutMs, 'recallTimeoutMs');
202
+ if (recallTimeoutMs >= retiredGraceMs) {
203
+ fail(`recallTimeoutMs (${recallTimeoutMs}) must be < retiredGraceMs (${retiredGraceMs})`);
204
+ }
205
+ }
206
+ else if (persistentStore) {
207
+ recallTimeoutMs = Math.floor(retiredGraceMs * 0.8);
208
+ }
209
+ // loadOnStartup + sources/store mutual constraints.
210
+ //
211
+ // A PRESENT `sources` that is NOT an array (typo `sources: {...}` / `sources: 5`)
212
+ // must fail loud — otherwise it is mistaken for "no sources", which on a
213
+ // persistent store with the default loadOnStartup:true drives a DESTRUCTIVE
214
+ // empty ingest (tombstone every prior catalog entry + publish an empty catalog).
215
+ const rawSources = raw.sources;
216
+ if (rawSources !== undefined && !Array.isArray(rawSources)) {
217
+ fail(`sources must be an array when set (got ${JSON.stringify(rawSources)})`);
218
+ }
219
+ const hasSources = Array.isArray(rawSources) && rawSources.length > 0;
220
+ const loadOnStartupReq = raw.loadOnStartup !== undefined ? Boolean(raw.loadOnStartup) : undefined;
221
+ // Resolve loadOnStartup with the no-source safety rule. The contract
222
+ // (`sources` absent → recall-only) means the default true must NEVER turn a
223
+ // no-source config into an ingest: with nothing to ingest, ingest mode only
224
+ // wipes the live catalog. So no sources → recall-only; an EXPLICIT
225
+ // loadOnStartup:true with no sources is a mistake and fails loud.
226
+ let loadOnStartup;
227
+ if (hasSources) {
228
+ loadOnStartup = loadOnStartupReq ?? true;
229
+ if (loadOnStartup === false) {
230
+ fail('sources cannot be combined with loadOnStartup:false (recall-only has nothing to ingest)');
231
+ }
232
+ }
233
+ else {
234
+ if (loadOnStartupReq === true) {
235
+ fail('loadOnStartup:true requires sources to ingest — a no-source config is ' +
236
+ 'recall-only. Add sources or set loadOnStartup:false. (Ingesting with ' +
237
+ 'no sources would tombstone the active catalog and publish an empty one.)');
238
+ }
239
+ loadOnStartup = false;
240
+ }
241
+ if (!hasSources && !persistentStore) {
242
+ fail('recall-only (no sources) requires a persistent store (an in-memory store with nothing to ingest is always empty)');
243
+ }
244
+ // Parse sources + enforce globally-unique sourceIds.
245
+ let sources;
246
+ if (Array.isArray(rawSources)) {
247
+ sources = rawSources.map(parseSource);
248
+ const seen = new Set();
249
+ for (const s of sources) {
250
+ if (seen.has(s.id)) {
251
+ fail(`duplicate sourceId '${s.id}' across sources (ids must be unique)`);
252
+ }
253
+ seen.add(s.id);
254
+ }
255
+ }
256
+ const embedder = isObject(raw.embedder)
257
+ ? {
258
+ provider: String(raw.embedder.provider),
259
+ ...(raw.embedder.model !== undefined
260
+ ? { model: String(raw.embedder.model) }
261
+ : {}),
262
+ }
263
+ : undefined;
264
+ // serveCollections: ABSENT → serve all served groups (downstream default).
265
+ // But a PRESENT key with the wrong shape must FAIL LOUD, not silently fall
266
+ // back to "serve all" — a typo (`serveCollections: abap` instead of
267
+ // `['abap']`) or a non-string entry would otherwise fail-OPEN and register
268
+ // every (possibly conflicting) group. See register-skill-sources.ts, where
269
+ // `undefined` means "all".
270
+ let serveCollections;
271
+ if (raw.serveCollections !== undefined) {
272
+ if (!Array.isArray(raw.serveCollections) ||
273
+ !raw.serveCollections.every((c) => typeof c === 'string' && c.trim().length > 0)) {
274
+ fail('serveCollections must be an array of non-empty strings when set ' +
275
+ `(got ${JSON.stringify(raw.serveCollections)})`);
276
+ }
277
+ serveCollections = raw.serveCollections;
278
+ }
279
+ // controllerSkillGroup: ABSENT → the controller planner recalls no dedicated
280
+ // skill group. A PRESENT key with the wrong type (a typo `123` / `['abap']`)
281
+ // must FAIL LOUD, not silently drop to undefined — otherwise controller skill
282
+ // recall is silently disabled and the typo never reaches validateServedGroups
283
+ // (skill-plugins-host-factory.ts, which treats an unknown group as a startup
284
+ // config error).
285
+ let controllerSkillGroup;
286
+ if (raw.controllerSkillGroup !== undefined) {
287
+ if (typeof raw.controllerSkillGroup !== 'string' ||
288
+ raw.controllerSkillGroup.trim().length === 0) {
289
+ fail('controllerSkillGroup must be a non-empty string when set ' +
290
+ `(got ${JSON.stringify(raw.controllerSkillGroup)})`);
291
+ }
292
+ controllerSkillGroup = raw.controllerSkillGroup;
293
+ }
294
+ return {
295
+ mode: 'implicit',
296
+ store,
297
+ ...(embeddingSpaceId ? { embeddingSpaceId } : {}),
298
+ ...(embedder ? { embedder } : {}),
299
+ ...(raw.dimension !== undefined
300
+ ? { dimension: posInt(raw.dimension, 'dimension') }
301
+ : {}),
302
+ catalog,
303
+ k,
304
+ threshold,
305
+ maxInjectChars,
306
+ chunk,
307
+ strict: raw.strict !== undefined ? Boolean(raw.strict) : false,
308
+ catalogCasMaxAttempts,
309
+ retiredGraceMs,
310
+ orphanGraceMs,
311
+ ...(recallTimeoutMs !== undefined ? { recallTimeoutMs } : {}),
312
+ ...(controllerSkillGroup !== undefined ? { controllerSkillGroup } : {}),
313
+ ...(serveCollections ? { serveCollections } : {}),
314
+ loadOnStartup,
315
+ ...(sources ? { sources } : {}),
316
+ };
317
+ }
318
+ //# sourceMappingURL=skill-plugins-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-plugins-config.js","sourceRoot":"","sources":["../../src/smart-agent/skill-plugins-config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AA2E1E,SAAS,QAAQ,CAAC,CAAU;IAC1B,OAAO,CAAC,KAAK,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,IAAI,CAAC,GAAW;IACvB,MAAM,IAAI,KAAK,CAAC,iBAAiB,GAAG,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED;;;;GAIG;AACH,MAAM,cAAc,GAAG,qDAAqD,CAAC;AAE7E;;;;GAIG;AACH,SAAS,MAAM,CAAC,GAAY,EAAE,IAAY;IACxC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;IACtB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,IAAI,CAAC,GAAG,IAAI,oCAAoC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,SAAS,UAAU,CAAC,GAAY;IAC9B,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IACpD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;IACtB,IAAI,IAAI,KAAK,WAAW;QAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;IACvD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,IAAI,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxD,IAAI,CAAC,6CAA6C,CAAC,CAAC;QACtD,CAAC;QACD,OAAO;YACL,IAAI,EAAE,QAAQ;YACd,GAAG,EAAE,GAAG,CAAC,GAAG;YACZ,GAAG,CAAC,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACjE,GAAG,CAAC,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ;gBACpC,CAAC,CAAC,EAAE,UAAU,EAAE,GAAG,CAAC,UAAU,EAAE;gBAChC,CAAC,CAAC,EAAE,CAAC;SACR,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CACT,eAAe,MAAM,CAAC,IAAI,CAAC,0CAA0C,CACtE,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,GAAY;IAChC,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IACrD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,IAAI,CAAC,2BAA2B,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;IACtB,IAAI,IAAI,KAAK,YAAY,IAAI,IAAI,KAAK,SAAS;QAC7C,OAAO,EAAE,IAAI,EAAE,YAAY,EAAE,CAAC;IAChC,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,IACE,OAAO,GAAG,CAAC,gBAAgB,KAAK,QAAQ;YACxC,GAAG,CAAC,gBAAgB,CAAC,MAAM,KAAK,CAAC,EACjC,CAAC;YACD,IAAI,CAAC,gEAAgE,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,GAAG,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;YAC5B,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBACrE,IAAI,CACF,kBAAkB,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,+CAA+C,cAAc,CAAC,MAAM,GAAG,CAC3G,CAAC;YACJ,CAAC;QACH,CAAC;QACD,OAAO;YACL,IAAI,EAAE,UAAU;YAChB,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;YACtC,GAAG,CAAC,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC/D,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CACT,iBAAiB,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAC3E,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,GAA4B;IACnD,2EAA2E;IAC3E,OAAO,CAAC,CAAC,SAAS,IAAI,GAAG,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,WAAW,CAAC,GAAY;IAC/B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAC1D,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE,CAAC;IAClB,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9C,IAAI,CAAC,kEAAkE,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YAChC,IAAI,CAAC,WAAW,EAAE,6BAA6B,CAAC,CAAC;QACnD,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,GAAG,CAAC,OAA6B,EAAE,CAAC;IAC5D,CAAC;IACD,qDAAqD;IACrD,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;IAC5B,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;QACvB,OAAO,CAAC,MAAM,KAAK,CAAC;QACpB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,EAC5C,CAAC;QACD,IAAI,CACF,WAAW,EAAE,oFAAoF,CAClG,CAAC;IACJ,CAAC;IACD,MAAM,GAAG,GAA8B;QACrC,EAAE;QACF,OAAO,EAAE,OAA4B;QACrC,GAAG,CAAC,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACxE,CAAC;IACF,IAAI,GAAG,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC/B,IAAI,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACrC,IAAI,CAAC,WAAW,EAAE,8BAA8B,CAAC,CAAC;QACpD,CAAC;QACD,mEAAmE;QACnE,IAAI,CAAC;YACH,0BAA0B,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC3C,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACxE,CAAC;QACD,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;IAC9B,CAAC;IACD,IAAI,GAAG,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACrC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,WAAW,EAAE,qCAAqC,CAAC,CAAC;QAC3D,CAAC;QACD,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC,cAAc,CAAC;IAC1C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,GAAY;IAClD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,IAAI,CAAC,0BAA0B,CAAC,CAAC;IAErD,qCAAqC;IACrC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,IAAI,UAAU,CAAC;IACpC,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,IAAI,CAAC,iEAAiE,CAAC,CAAC;IAC1E,CAAC;IACD,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;QACxB,IAAI,CAAC,SAAS,MAAM,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAC1C,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC;IAEhD,gDAAgD;IAChD,MAAM,gBAAgB,GACpB,OAAO,GAAG,CAAC,gBAAgB,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,SAAS,CAAC;IAC9E,IAAI,eAAe,IAAI,CAAC,gBAAgB,EAAE,CAAC;QACzC,IAAI,CACF,8HAA8H,CAC/H,CAAC;IACJ,CAAC;IAED,+DAA+D;IAC/D,IAAI,eAAe,IAAI,OAAO,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QACnD,IAAI,CACF,+JAA+J,CAChK,CAAC;IACJ,CAAC;IAED,8EAA8E;IAC9E,0EAA0E;IAC1E,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,IAAI,SAAS,GAAG,GAAG,CAAC;IACpB,IAAI,GAAG,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1C,IAAI,CACF,oDAAoD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CACrF,CAAC;QACJ,CAAC;QACD,SAAS,GAAG,CAAC,CAAC;IAChB,CAAC;IACD,MAAM,cAAc,GAClB,GAAG,CAAC,cAAc,KAAK,SAAS;QAC9B,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,gBAAgB,CAAC;QAC9C,CAAC,CAAC,IAAI,CAAC;IACX,MAAM,qBAAqB,GACzB,GAAG,CAAC,qBAAqB,KAAK,SAAS;QACrC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,qBAAqB,EAAE,uBAAuB,CAAC;QAC5D,CAAC,CAAC,CAAC,CAAC;IACR,MAAM,cAAc,GAClB,GAAG,CAAC,cAAc,KAAK,SAAS;QAC9B,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,cAAc,EAAE,gBAAgB,CAAC;QAC9C,CAAC,CAAC,KAAK,CAAC;IACZ,MAAM,aAAa,GACjB,GAAG,CAAC,aAAa,KAAK,SAAS;QAC7B,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,EAAE,eAAe,CAAC;QAC5C,CAAC,CAAC,OAAO,CAAC;IACd,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7D,MAAM,KAAK,GAAG;QACZ,QAAQ,EACN,QAAQ,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS;YACzC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;YAC7C,CAAC,CAAC,IAAI;KACX,CAAC;IAEF,IAAI,cAAc,GAAG,IAAI,EAAE,CAAC;QAC1B,IAAI,CAAC,4DAA4D,CAAC,CAAC;IACrE,CAAC;IAED,yEAAyE;IACzE,uEAAuE;IACvE,gCAAgC;IAChC,IAAI,eAAmC,CAAC;IACxC,IAAI,GAAG,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;QACtC,eAAe,GAAG,MAAM,CAAC,GAAG,CAAC,eAAe,EAAE,iBAAiB,CAAC,CAAC;QACjE,IAAI,eAAe,IAAI,cAAc,EAAE,CAAC;YACtC,IAAI,CACF,oBAAoB,eAAe,+BAA+B,cAAc,GAAG,CACpF,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,IAAI,eAAe,EAAE,CAAC;QAC3B,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC;IACrD,CAAC;IAED,oDAAoD;IACpD,EAAE;IACF,kFAAkF;IAClF,yEAAyE;IACzE,4EAA4E;IAC5E,iFAAiF;IACjF,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC;IAC/B,IAAI,UAAU,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3D,IAAI,CACF,0CAA0C,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,CACxE,CAAC;IACJ,CAAC;IACD,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;IACtE,MAAM,gBAAgB,GACpB,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE3E,qEAAqE;IACrE,4EAA4E;IAC5E,4EAA4E;IAC5E,mEAAmE;IACnE,kEAAkE;IAClE,IAAI,aAAsB,CAAC;IAC3B,IAAI,UAAU,EAAE,CAAC;QACf,aAAa,GAAG,gBAAgB,IAAI,IAAI,CAAC;QACzC,IAAI,aAAa,KAAK,KAAK,EAAE,CAAC;YAC5B,IAAI,CACF,yFAAyF,CAC1F,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,gBAAgB,KAAK,IAAI,EAAE,CAAC;YAC9B,IAAI,CACF,wEAAwE;gBACtE,uEAAuE;gBACvE,0EAA0E,CAC7E,CAAC;QACJ,CAAC;QACD,aAAa,GAAG,KAAK,CAAC;IACxB,CAAC;IAED,IAAI,CAAC,UAAU,IAAI,CAAC,eAAe,EAAE,CAAC;QACpC,IAAI,CACF,kHAAkH,CACnH,CAAC;IACJ,CAAC;IAED,qDAAqD;IACrD,IAAI,OAAyC,CAAC;IAC9C,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QAC9B,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;YACxB,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;gBACnB,IAAI,CACF,uBAAuB,CAAC,CAAC,EAAE,uCAAuC,CACnE,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC;QACrC,CAAC,CAAC;YACE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACvC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,KAAK,SAAS;gBAClC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;gBACvC,CAAC,CAAC,EAAE,CAAC;SACR;QACH,CAAC,CAAC,SAAS,CAAC;IAEd,2EAA2E;IAC3E,2EAA2E;IAC3E,oEAAoE;IACpE,2EAA2E;IAC3E,2EAA2E;IAC3E,2BAA2B;IAC3B,IAAI,gBAA+C,CAAC;IACpD,IAAI,GAAG,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;QACvC,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC;YACpC,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,CACzB,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CACpD,EACD,CAAC;YACD,IAAI,CACF,kEAAkE;gBAChE,QAAQ,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAClD,CAAC;QACJ,CAAC;QACD,gBAAgB,GAAG,GAAG,CAAC,gBAAqC,CAAC;IAC/D,CAAC;IAED,6EAA6E;IAC7E,6EAA6E;IAC7E,8EAA8E;IAC9E,8EAA8E;IAC9E,6EAA6E;IAC7E,iBAAiB;IACjB,IAAI,oBAAwC,CAAC;IAC7C,IAAI,GAAG,CAAC,oBAAoB,KAAK,SAAS,EAAE,CAAC;QAC3C,IACE,OAAO,GAAG,CAAC,oBAAoB,KAAK,QAAQ;YAC5C,GAAG,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC,EAC5C,CAAC;YACD,IAAI,CACF,2DAA2D;gBACzD,QAAQ,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,oBAAoB,CAAC,GAAG,CACtD,CAAC;QACJ,CAAC;QACD,oBAAoB,GAAG,GAAG,CAAC,oBAAoB,CAAC;IAClD,CAAC;IAED,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,KAAK;QACL,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjC,GAAG,CAAC,GAAG,CAAC,SAAS,KAAK,SAAS;YAC7B,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE;YACnD,CAAC,CAAC,EAAE,CAAC;QACP,OAAO;QACP,CAAC;QACD,SAAS;QACT,cAAc;QACd,KAAK;QACL,MAAM,EAAE,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK;QAC9D,qBAAqB;QACrB,cAAc;QACd,aAAa;QACb,GAAG,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,GAAG,CAAC,oBAAoB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACvE,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACjD,aAAa;QACb,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=skill-plugins-config.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-plugins-config.test.d.ts","sourceRoot":"","sources":["../../src/smart-agent/skill-plugins-config.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-plugins-config.test.js","sourceRoot":"","sources":["../../src/smart-agent/skill-plugins-config.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Assemble a live {@link ISkillPluginHost} from a normalized
3
+ * {@link SkillPluginsConfig}.
4
+ *
5
+ * This is the WIRING layer for the skill plugin-host: it resolves the serving
6
+ * embedder, maps each config `source` to an {@link ISkillSource}, selects the
7
+ * catalog + store providers by config type, and returns either an INGEST host
8
+ * (materialises sources at `load()`) or a RECALL-ONLY host (serves an
9
+ * already-materialised catalog through a read-only backend).
10
+ *
11
+ * Dependencies are INJECTED so the factory is unit-testable with stubs:
12
+ * - `resolveEmbedder` — the embedder resolver (the server passes its own
13
+ * `resolveEmbedder` from `@mcp-abap-adt/llm-agent-rag`; tests pass a stub).
14
+ * - `makePgPool` — OPTIONAL pg `Pool` provider. The repo avoids a hard `pg`
15
+ * dependency, so a `postgres` catalog requires the caller to inject one;
16
+ * absent → a `postgres` catalog throws at build time.
17
+ * - `makeStoreProvider` / `makeCatalogStore` — OPTIONAL test seams to inject a
18
+ * mock Qdrant store / pg catalog without real I/O (the live path builds them
19
+ * from config). When provided they fully replace the config-driven build.
20
+ *
21
+ * Startup lifecycle (`await host.load()` + ctx exposure) is owned by SmartServer.
22
+ */
23
+ import type { IEmbedder, ISkillPluginHost, ISkillsStoreProvider } from '@mcp-abap-adt/llm-agent';
24
+ import { type ICatalogStore, type IPgPool } from '@mcp-abap-adt/llm-agent-libs';
25
+ import type { SkillPluginsConfig } from './skill-plugins-config.js';
26
+ /** Embedder-resolution input — the subset of config the resolver consumes. */
27
+ export interface SkillHostEmbedderConfig {
28
+ embedder?: string;
29
+ model?: string;
30
+ }
31
+ /** Injected dependencies (DI seams) for {@link buildSkillHostFromConfig}. */
32
+ export interface BuildSkillHostDeps {
33
+ /**
34
+ * Resolve the serving embedder from the config's `embedder` selection. The
35
+ * server passes a resolver backed by `@mcp-abap-adt/llm-agent-rag`; tests pass
36
+ * a stub returning a deterministic-vector embedder.
37
+ */
38
+ resolveEmbedder: (cfg: SkillHostEmbedderConfig) => IEmbedder;
39
+ /**
40
+ * OPTIONAL pg `Pool` provider for a `postgres` catalog. The repo keeps `pg`
41
+ * out of its hard dependency set, so this MUST be injected when a deployment
42
+ * configures `catalog.type: postgres`; absent → a config-time throw.
43
+ */
44
+ makePgPool?: (connectionString: string) => IPgPool;
45
+ /**
46
+ * OPTIONAL READ-ONLY pg `Pool` provider for a `postgres` catalog on the
47
+ * RECALL-ONLY path. Unlike `makePgPool` (which lazily runs `CREATE TABLE`),
48
+ * this pool NEVER runs DDL, so a recall-only process with READ-ONLY pg
49
+ * credentials does not crash at startup. REQUIRED for the recall-only branch
50
+ * (absent → fail-loud); the server injects it from `pg-pool.makePgReadPool`.
51
+ */
52
+ makePgReadPool?: (connectionString: string) => IPgPool;
53
+ /** OPTIONAL test seam — fully replaces the config-driven store provider build. */
54
+ makeStoreProvider?: (cfg: SkillPluginsConfig) => ISkillsStoreProvider;
55
+ /** OPTIONAL test seam — fully replaces the config-driven catalog store build. */
56
+ makeCatalogStore?: (cfg: SkillPluginsConfig) => ICatalogStore;
57
+ }
58
+ /**
59
+ * Assemble a live {@link ISkillPluginHost} from a normalized
60
+ * {@link SkillPluginsConfig}. INGEST when sources are present (default), else a
61
+ * RECALL-ONLY host over a read-only backend (requires a persistent store).
62
+ *
63
+ * The caller owns `host.load()` (SmartServer runs it once at startup).
64
+ */
65
+ export declare function buildSkillHostFromConfig(cfg: SkillPluginsConfig, deps: BuildSkillHostDeps): Promise<ISkillPluginHost>;
66
+ /**
67
+ * Fail-loud validation of the served-group subset AFTER `host.load()`, against
68
+ * the host's materialised `groups()`. A typo in `serveCollections` /
69
+ * `controllerSkillGroup` would otherwise SILENTLY disable skills (the filter in
70
+ * `registerSkillSources` drops unknown names) — the spec requires a STARTUP
71
+ * config error instead.
72
+ *
73
+ * Pure + side-effect-free so it is unit-testable without a full server: pass the
74
+ * loaded host and the normalized config.
75
+ */
76
+ export declare function validateServedGroups(host: ISkillPluginHost, cfg: SkillPluginsConfig): void;
77
+ /** Minimal handle on a created pg pool — only `end()` is needed for cleanup. */
78
+ export interface IClosablePool {
79
+ end(): Promise<void>;
80
+ }
81
+ /**
82
+ * Build → `await host.load()` → {@link validateServedGroups} as ONE fail-fast
83
+ * unit, ending any pg pools the build captured into `pools` if ANY step throws.
84
+ *
85
+ * The server registers a `closeFns` cleanup that ends these pools, but that
86
+ * registration happens much LATER in `start()` — if `load()` or validation
87
+ * throws, `start()` never returns a handle, so `close()` is never callable and
88
+ * the captured pools would leak open sockets (blocking process exit). Running
89
+ * the cleanup HERE on failure closes that gap; the normal-path pools are still
90
+ * ended by the later `closeFns` registration.
91
+ *
92
+ * `buildHost` is a thunk so the pool-capturing side effect (the server pushes
93
+ * each created pool into `pools` from its `makePgPool`/`makePgReadPool`) has
94
+ * already happened by the time we catch — i.e. we end exactly what was created.
95
+ * Side-effect-free of the server instance → unit-testable with a fake host.
96
+ */
97
+ export declare function initSkillHost(buildHost: () => Promise<ISkillPluginHost>, cfg: SkillPluginsConfig, pools: IClosablePool[]): Promise<ISkillPluginHost>;
98
+ //# sourceMappingURL=skill-plugins-host-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-plugins-host-factory.d.ts","sourceRoot":"","sources":["../../src/smart-agent/skill-plugins-host-factory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAEV,SAAS,EACT,gBAAgB,EAGhB,oBAAoB,EAIrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,KAAK,aAAa,EAClB,KAAK,OAAO,EAab,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EACV,kBAAkB,EAEnB,MAAM,2BAA2B,CAAC;AASnC,8EAA8E;AAC9E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,6EAA6E;AAC7E,MAAM,WAAW,kBAAkB;IACjC;;;;OAIG;IACH,eAAe,EAAE,CAAC,GAAG,EAAE,uBAAuB,KAAK,SAAS,CAAC;IAC7D;;;;OAIG;IACH,UAAU,CAAC,EAAE,CAAC,gBAAgB,EAAE,MAAM,KAAK,OAAO,CAAC;IACnD;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,CAAC,gBAAgB,EAAE,MAAM,KAAK,OAAO,CAAC;IACvD,kFAAkF;IAClF,iBAAiB,CAAC,EAAE,CAAC,GAAG,EAAE,kBAAkB,KAAK,oBAAoB,CAAC;IACtE,iFAAiF;IACjF,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,kBAAkB,KAAK,aAAa,CAAC;CAC/D;AA0GD;;;;;;GAMG;AACH,wBAAsB,wBAAwB,CAC5C,GAAG,EAAE,kBAAkB,EACvB,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,gBAAgB,CAAC,CAsG3B;AAED;;;;;;;;;GASG;AACH,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,gBAAgB,EACtB,GAAG,EAAE,kBAAkB,GACtB,IAAI,CA4BN;AAED,gFAAgF;AAChF,MAAM,WAAW,aAAa;IAC5B,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACtB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,EAC1C,GAAG,EAAE,kBAAkB,EACvB,KAAK,EAAE,aAAa,EAAE,GACrB,OAAO,CAAC,gBAAgB,CAAC,CAuB3B"}