@mcp-abap-adt/llm-agent-server-libs 20.0.0 → 20.4.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 (166) hide show
  1. package/dist/builders/controller-skill-pipeline-builder.d.ts +57 -0
  2. package/dist/builders/controller-skill-pipeline-builder.d.ts.map +1 -0
  3. package/dist/builders/controller-skill-pipeline-builder.js +175 -0
  4. package/dist/builders/controller-skill-pipeline-builder.js.map +1 -0
  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 +19 -3
  13. package/dist/pipelines/controller.js.map +1 -1
  14. package/dist/pipelines/coordinator-resolvers.d.ts +68 -0
  15. package/dist/pipelines/coordinator-resolvers.d.ts.map +1 -0
  16. package/dist/pipelines/coordinator-resolvers.js +97 -0
  17. package/dist/pipelines/coordinator-resolvers.js.map +1 -0
  18. package/dist/pipelines/parsers.d.ts +1 -1
  19. package/dist/pipelines/parsers.d.ts.map +1 -1
  20. package/dist/pipelines/parsers.js +5 -4
  21. package/dist/pipelines/parsers.js.map +1 -1
  22. package/dist/pipelines/register-skill-sources.d.ts.map +1 -1
  23. package/dist/pipelines/register-skill-sources.js +5 -0
  24. package/dist/pipelines/register-skill-sources.js.map +1 -1
  25. package/dist/smart-agent/build-stepper-root.d.ts +3 -2
  26. package/dist/smart-agent/build-stepper-root.d.ts.map +1 -1
  27. package/dist/smart-agent/build-stepper-root.js +2 -1
  28. package/dist/smart-agent/build-stepper-root.js.map +1 -1
  29. package/dist/smart-agent/config-reload-watcher.d.ts +30 -0
  30. package/dist/smart-agent/config-reload-watcher.d.ts.map +1 -0
  31. package/dist/smart-agent/config-reload-watcher.js +101 -0
  32. package/dist/smart-agent/config-reload-watcher.js.map +1 -0
  33. package/dist/smart-agent/config-validator.d.ts +21 -0
  34. package/dist/smart-agent/config-validator.d.ts.map +1 -0
  35. package/dist/smart-agent/config-validator.js +196 -0
  36. package/dist/smart-agent/config-validator.js.map +1 -0
  37. package/dist/smart-agent/config.d.ts +16 -254
  38. package/dist/smart-agent/config.d.ts.map +1 -1
  39. package/dist/smart-agent/config.js +17 -904
  40. package/dist/smart-agent/config.js.map +1 -1
  41. package/dist/smart-agent/controller/board.d.ts +6 -3
  42. package/dist/smart-agent/controller/board.d.ts.map +1 -1
  43. package/dist/smart-agent/controller/board.js +21 -0
  44. package/dist/smart-agent/controller/board.js.map +1 -1
  45. package/dist/smart-agent/controller/controller-coordinator-handler.d.ts +6 -48
  46. package/dist/smart-agent/controller/controller-coordinator-handler.d.ts.map +1 -1
  47. package/dist/smart-agent/controller/controller-coordinator-handler.js +68 -357
  48. package/dist/smart-agent/controller/controller-coordinator-handler.js.map +1 -1
  49. package/dist/smart-agent/controller/finalizer.d.ts +5 -0
  50. package/dist/smart-agent/controller/finalizer.d.ts.map +1 -1
  51. package/dist/smart-agent/controller/finalizer.js +12 -5
  52. package/dist/smart-agent/controller/finalizer.js.map +1 -1
  53. package/dist/smart-agent/controller/parser.d.ts +11 -0
  54. package/dist/smart-agent/controller/parser.d.ts.map +1 -0
  55. package/dist/smart-agent/controller/parser.js +77 -0
  56. package/dist/smart-agent/controller/parser.js.map +1 -0
  57. package/dist/smart-agent/controller/planner.js +1 -1
  58. package/dist/smart-agent/controller/planner.js.map +1 -1
  59. package/dist/smart-agent/controller/recall.d.ts +48 -0
  60. package/dist/smart-agent/controller/recall.d.ts.map +1 -0
  61. package/dist/smart-agent/controller/recall.js +196 -0
  62. package/dist/smart-agent/controller/recall.js.map +1 -0
  63. package/dist/smart-agent/controller/reviewer.d.ts.map +1 -1
  64. package/dist/smart-agent/controller/reviewer.js +1 -1
  65. package/dist/smart-agent/controller/reviewer.js.map +1 -1
  66. package/dist/smart-agent/controller/usage-logging.d.ts +16 -0
  67. package/dist/smart-agent/controller/usage-logging.d.ts.map +1 -0
  68. package/dist/smart-agent/controller/usage-logging.js +39 -0
  69. package/dist/smart-agent/controller/usage-logging.js.map +1 -0
  70. package/dist/smart-agent/http/adapter-route-handler.d.ts +13 -0
  71. package/dist/smart-agent/http/adapter-route-handler.d.ts.map +1 -0
  72. package/dist/smart-agent/http/adapter-route-handler.js +76 -0
  73. package/dist/smart-agent/http/adapter-route-handler.js.map +1 -0
  74. package/dist/smart-agent/http/chat-route-handler.d.ts +15 -0
  75. package/dist/smart-agent/http/chat-route-handler.d.ts.map +1 -0
  76. package/dist/smart-agent/http/chat-route-handler.js +327 -0
  77. package/dist/smart-agent/http/chat-route-handler.js.map +1 -0
  78. package/dist/smart-agent/http/config-route-handler.d.ts +21 -0
  79. package/dist/smart-agent/http/config-route-handler.d.ts.map +1 -0
  80. package/dist/smart-agent/http/config-route-handler.js +149 -0
  81. package/dist/smart-agent/http/config-route-handler.js.map +1 -0
  82. package/dist/smart-agent/http/health-route-handler.d.ts +12 -0
  83. package/dist/smart-agent/http/health-route-handler.d.ts.map +1 -0
  84. package/dist/smart-agent/http/health-route-handler.js +19 -0
  85. package/dist/smart-agent/http/health-route-handler.js.map +1 -0
  86. package/dist/smart-agent/http/models-route-handler.d.ts +17 -0
  87. package/dist/smart-agent/http/models-route-handler.d.ts.map +1 -0
  88. package/dist/smart-agent/http/models-route-handler.js +65 -0
  89. package/dist/smart-agent/http/models-route-handler.js.map +1 -0
  90. package/dist/smart-agent/http/response-helpers.d.ts +31 -0
  91. package/dist/smart-agent/http/response-helpers.d.ts.map +1 -0
  92. package/dist/smart-agent/http/response-helpers.js +59 -0
  93. package/dist/smart-agent/http/response-helpers.js.map +1 -0
  94. package/dist/smart-agent/http/route-table.d.ts +44 -0
  95. package/dist/smart-agent/http/route-table.d.ts.map +1 -0
  96. package/dist/smart-agent/http/route-table.js +35 -0
  97. package/dist/smart-agent/http/route-table.js.map +1 -0
  98. package/dist/smart-agent/http/session-cookie.d.ts +10 -0
  99. package/dist/smart-agent/http/session-cookie.d.ts.map +1 -0
  100. package/dist/smart-agent/http/session-cookie.js +16 -0
  101. package/dist/smart-agent/http/session-cookie.js.map +1 -0
  102. package/dist/smart-agent/http/sessions-route-handler.d.ts +8 -0
  103. package/dist/smart-agent/http/sessions-route-handler.d.ts.map +1 -0
  104. package/dist/smart-agent/http/sessions-route-handler.js +54 -0
  105. package/dist/smart-agent/http/sessions-route-handler.js.map +1 -0
  106. package/dist/smart-agent/http/usage-route-handler.d.ts +12 -0
  107. package/dist/smart-agent/http/usage-route-handler.d.ts.map +1 -0
  108. package/dist/smart-agent/http/usage-route-handler.js +28 -0
  109. package/dist/smart-agent/http/usage-route-handler.js.map +1 -0
  110. package/dist/smart-agent/knowledge/make-knowledge-backend.d.ts +13 -0
  111. package/dist/smart-agent/knowledge/make-knowledge-backend.d.ts.map +1 -0
  112. package/dist/smart-agent/knowledge/make-knowledge-backend.js +18 -0
  113. package/dist/smart-agent/knowledge/make-knowledge-backend.js.map +1 -0
  114. package/dist/smart-agent/llm/role-llm-resolver.d.ts +30 -0
  115. package/dist/smart-agent/llm/role-llm-resolver.d.ts.map +1 -0
  116. package/dist/smart-agent/llm/role-llm-resolver.js +44 -0
  117. package/dist/smart-agent/llm/role-llm-resolver.js.map +1 -0
  118. package/dist/smart-agent/llm-config-map.d.ts +38 -0
  119. package/dist/smart-agent/llm-config-map.d.ts.map +1 -0
  120. package/dist/smart-agent/llm-config-map.js +75 -0
  121. package/dist/smart-agent/llm-config-map.js.map +1 -0
  122. package/dist/smart-agent/mcp-readiness-monitor.d.ts +38 -0
  123. package/dist/smart-agent/mcp-readiness-monitor.d.ts.map +1 -0
  124. package/dist/smart-agent/mcp-readiness-monitor.js +81 -0
  125. package/dist/smart-agent/mcp-readiness-monitor.js.map +1 -0
  126. package/dist/smart-agent/mcp-readiness-registry.d.ts +37 -0
  127. package/dist/smart-agent/mcp-readiness-registry.d.ts.map +1 -0
  128. package/dist/smart-agent/mcp-readiness-registry.js +55 -0
  129. package/dist/smart-agent/mcp-readiness-registry.js.map +1 -0
  130. package/dist/smart-agent/resolve-config-sections.d.ts +15 -0
  131. package/dist/smart-agent/resolve-config-sections.d.ts.map +1 -0
  132. package/dist/smart-agent/resolve-config-sections.js +212 -0
  133. package/dist/smart-agent/resolve-config-sections.js.map +1 -0
  134. package/dist/smart-agent/session-lifecycle/index.d.ts +117 -0
  135. package/dist/smart-agent/session-lifecycle/index.d.ts.map +1 -0
  136. package/dist/smart-agent/session-lifecycle/index.js +152 -0
  137. package/dist/smart-agent/session-lifecycle/index.js.map +1 -0
  138. package/dist/smart-agent/skill-plugins-config.d.ts +9 -1
  139. package/dist/smart-agent/skill-plugins-config.d.ts.map +1 -1
  140. package/dist/smart-agent/skill-plugins-config.js +27 -1
  141. package/dist/smart-agent/skill-plugins-config.js.map +1 -1
  142. package/dist/smart-agent/skill-plugins-host-factory.d.ts +14 -2
  143. package/dist/smart-agent/skill-plugins-host-factory.d.ts.map +1 -1
  144. package/dist/smart-agent/skill-plugins-host-factory.js +16 -4
  145. package/dist/smart-agent/skill-plugins-host-factory.js.map +1 -1
  146. package/dist/smart-agent/smart-server.d.ts +151 -222
  147. package/dist/smart-agent/smart-server.d.ts.map +1 -1
  148. package/dist/smart-agent/smart-server.js +527 -1384
  149. package/dist/smart-agent/smart-server.js.map +1 -1
  150. package/dist/smart-agent/stepper-config.d.ts +138 -0
  151. package/dist/smart-agent/stepper-config.d.ts.map +1 -0
  152. package/dist/smart-agent/stepper-config.js +216 -0
  153. package/dist/smart-agent/stepper-config.js.map +1 -0
  154. package/dist/smart-agent/tools-rag-handle.d.ts +10 -0
  155. package/dist/smart-agent/tools-rag-handle.d.ts.map +1 -0
  156. package/dist/smart-agent/tools-rag-handle.js +76 -0
  157. package/dist/smart-agent/tools-rag-handle.js.map +1 -0
  158. package/dist/smart-agent/workers/worker-registry.d.ts +159 -0
  159. package/dist/smart-agent/workers/worker-registry.d.ts.map +1 -0
  160. package/dist/smart-agent/workers/worker-registry.js +203 -0
  161. package/dist/smart-agent/workers/worker-registry.js.map +1 -0
  162. package/dist/smart-agent/yaml-loader.d.ts +7 -0
  163. package/dist/smart-agent/yaml-loader.d.ts.map +1 -0
  164. package/dist/smart-agent/yaml-loader.js +146 -0
  165. package/dist/smart-agent/yaml-loader.js.map +1 -0
  166. package/package.json +7 -7
@@ -0,0 +1,75 @@
1
+ /**
2
+ * Detect whether an object is a flat SmartServerLlmConfig shape.
3
+ * Flat shape is identified by the presence of ANY of the known flat-shape
4
+ * fields: `provider`, `apiKey`, `model`, or `url`. This covers keyless
5
+ * providers (Ollama, SAP AI Core) that omit `apiKey` — using `apiKey`-only
6
+ * detection silently misclassified those configs as a "map" shape.
7
+ */
8
+ function isFlatLlmConfig(input) {
9
+ const flat = input;
10
+ return (typeof flat.provider === 'string' ||
11
+ typeof flat.apiKey === 'string' ||
12
+ typeof flat.model === 'string' ||
13
+ typeof flat.url === 'string');
14
+ }
15
+ /**
16
+ * Normalize the optional top-level `llm:` block.
17
+ * - undefined → undefined (pipeline-only configs stay valid)
18
+ * - flat shape (has `provider` | `apiKey` | `model` | `url`) → { main: flat } (backward compat)
19
+ * - map shape → must include `main`; returned as NormalizedLlmMap
20
+ */
21
+ export function normalizeLlmConfig(input) {
22
+ if (input === undefined)
23
+ return undefined;
24
+ if (isFlatLlmConfig(input)) {
25
+ return { main: input };
26
+ }
27
+ const map = input;
28
+ if (!map.main) {
29
+ throw new Error("llm: map must include a 'main' key (default LLM for unspecified roles)");
30
+ }
31
+ return map;
32
+ }
33
+ /**
34
+ * Strict lookup: returns map[name] if explicitly present, else undefined.
35
+ * Does NOT fall through to map.main. Use when the caller needs to
36
+ * detect explicit-presence (e.g. to decide between an alias and the
37
+ * named map entry).
38
+ */
39
+ export function resolveLlmConfigStrict(map, name) {
40
+ if (!map || !name)
41
+ return undefined;
42
+ return map[name];
43
+ }
44
+ /**
45
+ * Resolve a per-role LLM config by name from a normalized map.
46
+ * Lookup chain: map[name] → map.main → pipelineFallback.
47
+ * When map is undefined, falls back to pipelineFallback (so pipeline-only
48
+ * configs keep working with no top-level llm: block).
49
+ *
50
+ * The caller decides whether `undefined` is an error.
51
+ */
52
+ export function resolveLlmConfig(map, name, pipelineFallback) {
53
+ if (!map)
54
+ return pipelineFallback;
55
+ if (!name || name === 'main')
56
+ return map.main;
57
+ return map[name] ?? map.main;
58
+ }
59
+ /**
60
+ * Read the reviewer block's LLM-name selector, accepting both the
61
+ * preferred `reviewerLlm` field and the deprecated `plannerLlm` alias.
62
+ * When the alias is used, calls `warn(message)`.
63
+ */
64
+ export function resolveReviewerLlmName(block, warn) {
65
+ if (!block)
66
+ return undefined;
67
+ if (typeof block.reviewerLlm === 'string')
68
+ return block.reviewerLlm;
69
+ if (typeof block.plannerLlm === 'string') {
70
+ warn("coordinator.reviewer.plannerLlm is deprecated; rename to 'reviewerLlm'");
71
+ return block.plannerLlm;
72
+ }
73
+ return undefined;
74
+ }
75
+ //# sourceMappingURL=llm-config-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-config-map.js","sourceRoot":"","sources":["../../src/smart-agent/llm-config-map.ts"],"names":[],"mappings":"AAKA;;;;;;GAMG;AACH,SAAS,eAAe,CAAC,KAA0C;IACjE,MAAM,IAAI,GAAG,KAAsC,CAAC;IACpD,OAAO,CACL,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ;QACjC,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ;QAC/B,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ;QAC9B,OAAO,IAAI,CAAC,GAAG,KAAK,QAAQ,CAC7B,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAChC,KAA2C;IAE3C,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAC1C,IAAI,eAAe,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO,EAAE,IAAI,EAAE,KAA6B,EAAsB,CAAC;IACrE,CAAC;IACD,MAAM,GAAG,GAAG,KAAqB,CAAC;IAClC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CACb,wEAAwE,CACzE,CAAC;IACJ,CAAC;IACD,OAAO,GAAuB,CAAC;AACjC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CACpC,GAAiC,EACjC,IAAwB;IAExB,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IACpC,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC;AACnB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAC9B,GAAiC,EACjC,IAAa,EACb,gBAAuC;IAEvC,IAAI,CAAC,GAAG;QAAE,OAAO,gBAAgB,CAAC;IAClC,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,MAAM;QAAE,OAAO,GAAG,CAAC,IAAI,CAAC;IAC9C,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC;AAC/B,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAAgE,EAChE,IAA2B;IAE3B,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAC;IAC7B,IAAI,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC,WAAW,CAAC;IACpE,IAAI,OAAO,KAAK,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;QACzC,IAAI,CACF,wEAAwE,CACzE,CAAC;QACF,OAAO,KAAK,CAAC,UAAU,CAAC;IAC1B,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,38 @@
1
+ import type { IMcpClient } from '@mcp-abap-adt/llm-agent';
2
+ import type { McpReadinessRegistry } from './mcp-readiness-registry.js';
3
+ export interface McpReadinessMonitorDeps {
4
+ /** Lazily (re)connect a slot's opaque config to a live client. Throws if still
5
+ * down. */
6
+ connect: (config: unknown) => Promise<IMcpClient>;
7
+ /** Called after a GLOBAL slot transitions DOWN→UP, so the server can refresh the
8
+ * vectorized tool catalog (toolsRag) over the now-live clients. */
9
+ onGlobalRecovered?: () => Promise<void>;
10
+ /** Called after a WORKER slot transitions DOWN→UP, so the server can invalidate
11
+ * the worker cache (next session rebuild injects the recovered client). */
12
+ onWorkerRecovered?: (id: string) => void;
13
+ cooldownMs?: number;
14
+ intervalMs?: number;
15
+ }
16
+ /**
17
+ * Periodic readiness probe over the SmartServer-owned MCP target registry. Drives
18
+ * the `_ready` signal: probes live clients via `healthCheck()` (→ `ping()`, a LIVE
19
+ * round-trip — never the cached `listTools()`), and lazily (re)connects DOWN targets
20
+ * on a cooldown. `tick()` is one pass; the timer just calls it on an interval so
21
+ * tests are deterministic.
22
+ */
23
+ export declare class McpReadinessMonitor {
24
+ private readonly registry;
25
+ private readonly deps;
26
+ private timer?;
27
+ private readonly cooldownMs;
28
+ private readonly intervalMs;
29
+ constructor(registry: McpReadinessRegistry, deps: McpReadinessMonitorDeps);
30
+ isReady(): boolean;
31
+ /** One monitoring pass. The timer calls this; tests call it directly (passing an
32
+ * explicit `now` for deterministic cooldown). */
33
+ tick(now?: number): Promise<void>;
34
+ private _fireRecovered;
35
+ start(): void;
36
+ stop(): void;
37
+ }
38
+ //# sourceMappingURL=mcp-readiness-monitor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-readiness-monitor.d.ts","sourceRoot":"","sources":["../../src/smart-agent/mcp-readiness-monitor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAExE,MAAM,WAAW,uBAAuB;IACtC;gBACY;IACZ,OAAO,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IAClD;wEACoE;IACpE,iBAAiB,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC;gFAC4E;IAC5E,iBAAiB,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;GAMG;AACH,qBAAa,mBAAmB;IAM5B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI;IANvB,OAAO,CAAC,KAAK,CAAC,CAAiC;IAC/C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAGjB,QAAQ,EAAE,oBAAoB,EAC9B,IAAI,EAAE,uBAAuB;IAMhD,OAAO,IAAI,OAAO;IAIlB;sDACkD;IAC5C,IAAI,CAAC,GAAG,SAAa,GAAG,OAAO,CAAC,IAAI,CAAC;YAsC7B,cAAc;IAQ5B,KAAK,IAAI,IAAI;IAMb,IAAI,IAAI,IAAI;CAIb"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Periodic readiness probe over the SmartServer-owned MCP target registry. Drives
3
+ * the `_ready` signal: probes live clients via `healthCheck()` (→ `ping()`, a LIVE
4
+ * round-trip — never the cached `listTools()`), and lazily (re)connects DOWN targets
5
+ * on a cooldown. `tick()` is one pass; the timer just calls it on an interval so
6
+ * tests are deterministic.
7
+ */
8
+ export class McpReadinessMonitor {
9
+ registry;
10
+ deps;
11
+ timer;
12
+ cooldownMs;
13
+ intervalMs;
14
+ constructor(registry, deps) {
15
+ this.registry = registry;
16
+ this.deps = deps;
17
+ this.cooldownMs = deps.cooldownMs ?? 30000;
18
+ this.intervalMs = deps.intervalMs ?? 10000;
19
+ }
20
+ isReady() {
21
+ return this.registry.allHealthy();
22
+ }
23
+ /** One monitoring pass. The timer calls this; tests call it directly (passing an
24
+ * explicit `now` for deterministic cooldown). */
25
+ async tick(now = Date.now()) {
26
+ for (const slot of this.registry.list()) {
27
+ const wasDown = !slot.healthy;
28
+ if (slot.client) {
29
+ // healthCheck is OPTIONAL on IMcpClient. A client WITHOUT it is ASSUMED
30
+ // healthy (per the interface contract) — never marked down on a missing
31
+ // probe, else a DI/plugin client without a probe wedges readiness down
32
+ // forever with no config to reconnect.
33
+ if (typeof slot.client.healthCheck !== 'function') {
34
+ this.registry.markHealthy(slot.id, slot.client);
35
+ continue;
36
+ }
37
+ const hc = await slot.client.healthCheck();
38
+ if (hc?.ok) {
39
+ this.registry.markHealthy(slot.id, slot.client);
40
+ if (wasDown)
41
+ await this._fireRecovered(slot.id, slot.scope);
42
+ continue;
43
+ }
44
+ this.registry.markDown(slot.id);
45
+ // fall through to a reconnect attempt
46
+ }
47
+ if (!slot.healthy &&
48
+ slot.config !== undefined &&
49
+ now - slot.lastAttempt >= this.cooldownMs) {
50
+ slot.lastAttempt = now;
51
+ try {
52
+ const client = await this.deps.connect(slot.config);
53
+ this.registry.markHealthy(slot.id, client);
54
+ if (wasDown)
55
+ await this._fireRecovered(slot.id, slot.scope);
56
+ }
57
+ catch {
58
+ this.registry.markDown(slot.id);
59
+ }
60
+ }
61
+ }
62
+ }
63
+ async _fireRecovered(id, scope) {
64
+ if (scope === 'global')
65
+ await this.deps.onGlobalRecovered?.();
66
+ else
67
+ this.deps.onWorkerRecovered?.(id);
68
+ }
69
+ start() {
70
+ if (this.timer)
71
+ return;
72
+ this.timer = setInterval(() => void this.tick(), this.intervalMs);
73
+ this.timer.unref?.();
74
+ }
75
+ stop() {
76
+ if (this.timer)
77
+ clearInterval(this.timer);
78
+ this.timer = undefined;
79
+ }
80
+ }
81
+ //# sourceMappingURL=mcp-readiness-monitor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-readiness-monitor.js","sourceRoot":"","sources":["../../src/smart-agent/mcp-readiness-monitor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { IMcpClient } from '@mcp-abap-adt/llm-agent';
2
+ export type ReadinessScope = 'global' | 'worker';
3
+ export interface ReadinessSlot {
4
+ id: string;
5
+ scope: ReadinessScope;
6
+ /** Opaque MCP target config (the monitor's `connect` knows how to use it).
7
+ * Absent for DI-only live clients that have no reconnect config. */
8
+ config?: unknown;
9
+ client?: IMcpClient;
10
+ healthy: boolean;
11
+ lastAttempt: number;
12
+ }
13
+ /**
14
+ * Registry of configured MCP targets driving SmartServer readiness. A target with
15
+ * no healthy client ⇒ NOT ready. Built from CONFIG (not from successful connects),
16
+ * so a down-at-boot target is a DOWN slot, not a missing one — which is what makes
17
+ * "cold-MCP startup → NOT_READY (no throw), recover later" implementable.
18
+ */
19
+ export declare class McpReadinessRegistry {
20
+ private readonly slots;
21
+ /** Register a configured target whose client may not be connected yet.
22
+ * Idempotent on `id` (the worker setup runs on both the primary build and the
23
+ * per-session rebuild — re-`addTarget` with the same id must keep ONE slot). */
24
+ addTarget(id: string, config: unknown, scope: ReadinessScope): void;
25
+ /** Register an already-live DI client (no lazy connect needed). */
26
+ addLiveClient(id: string, client: IMcpClient, scope: ReadinessScope): void;
27
+ markHealthy(id: string, client: IMcpClient): void;
28
+ markDown(id: string): void;
29
+ allHealthy(): boolean;
30
+ list(): ReadinessSlot[];
31
+ /** Live execution clients for GLOBAL targets — the source of truth `callMcp`
32
+ * reads so a monitor-recovered client is used without a restart. Worker targets
33
+ * are excluded: worker clients drive readiness + worker INJECTION (the worker
34
+ * hoist), not the top-level callMcp. */
35
+ liveClients(): IMcpClient[];
36
+ }
37
+ //# sourceMappingURL=mcp-readiness-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-readiness-registry.d.ts","sourceRoot":"","sources":["../../src/smart-agent/mcp-readiness-registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAE1D,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEjD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,cAAc,CAAC;IACtB;yEACqE;IACrE,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;;;GAKG;AACH,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAoC;IAE1D;;qFAEiF;IACjF,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,cAAc,GAAG,IAAI;IAKnE,mEAAmE;IACnE,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,cAAc,GAAG,IAAI;IAI1E,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAQjD,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAK1B,UAAU,IAAI,OAAO;IAKrB,IAAI,IAAI,aAAa,EAAE;IAIvB;;;6CAGyC;IACzC,WAAW,IAAI,UAAU,EAAE;CAO5B"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Registry of configured MCP targets driving SmartServer readiness. A target with
3
+ * no healthy client ⇒ NOT ready. Built from CONFIG (not from successful connects),
4
+ * so a down-at-boot target is a DOWN slot, not a missing one — which is what makes
5
+ * "cold-MCP startup → NOT_READY (no throw), recover later" implementable.
6
+ */
7
+ export class McpReadinessRegistry {
8
+ slots = new Map();
9
+ /** Register a configured target whose client may not be connected yet.
10
+ * Idempotent on `id` (the worker setup runs on both the primary build and the
11
+ * per-session rebuild — re-`addTarget` with the same id must keep ONE slot). */
12
+ addTarget(id, config, scope) {
13
+ if (this.slots.has(id))
14
+ return;
15
+ this.slots.set(id, { id, scope, config, healthy: false, lastAttempt: 0 });
16
+ }
17
+ /** Register an already-live DI client (no lazy connect needed). */
18
+ addLiveClient(id, client, scope) {
19
+ this.slots.set(id, { id, scope, client, healthy: true, lastAttempt: 0 });
20
+ }
21
+ markHealthy(id, client) {
22
+ const s = this.slots.get(id);
23
+ if (s) {
24
+ s.client = client;
25
+ s.healthy = true;
26
+ }
27
+ }
28
+ markDown(id) {
29
+ const s = this.slots.get(id);
30
+ if (s)
31
+ s.healthy = false;
32
+ }
33
+ allHealthy() {
34
+ for (const s of this.slots.values())
35
+ if (!s.healthy)
36
+ return false;
37
+ return true;
38
+ }
39
+ list() {
40
+ return [...this.slots.values()];
41
+ }
42
+ /** Live execution clients for GLOBAL targets — the source of truth `callMcp`
43
+ * reads so a monitor-recovered client is used without a restart. Worker targets
44
+ * are excluded: worker clients drive readiness + worker INJECTION (the worker
45
+ * hoist), not the top-level callMcp. */
46
+ liveClients() {
47
+ const out = [];
48
+ for (const s of this.slots.values()) {
49
+ if (s.scope === 'global' && s.healthy && s.client)
50
+ out.push(s.client);
51
+ }
52
+ return out;
53
+ }
54
+ }
55
+ //# sourceMappingURL=mcp-readiness-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-readiness-registry.js","sourceRoot":"","sources":["../../src/smart-agent/mcp-readiness-registry.ts"],"names":[],"mappings":"AAeA;;;;;GAKG;AACH,MAAM,OAAO,oBAAoB;IACd,KAAK,GAAG,IAAI,GAAG,EAAyB,CAAC;IAE1D;;qFAEiF;IACjF,SAAS,CAAC,EAAU,EAAE,MAAe,EAAE,KAAqB;QAC1D,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAAE,OAAO;QAC/B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,mEAAmE;IACnE,aAAa,CAAC,EAAU,EAAE,MAAkB,EAAE,KAAqB;QACjE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,WAAW,CAAC,EAAU,EAAE,MAAkB;QACxC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC,EAAE,CAAC;YACN,CAAC,CAAC,MAAM,GAAG,MAAM,CAAC;YAClB,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC;QACnB,CAAC;IACH,CAAC;IAED,QAAQ,CAAC,EAAU;QACjB,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC;YAAE,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC;IAC3B,CAAC;IAED,UAAU;QACR,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YAAE,IAAI,CAAC,CAAC,CAAC,OAAO;gBAAE,OAAO,KAAK,CAAC;QAClE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAClC,CAAC;IAED;;;6CAGyC;IACzC,WAAW;QACT,MAAM,GAAG,GAAiB,EAAE,CAAC;QAC7B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YACpC,IAAI,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM;gBAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACxE,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Per-section config builders extracted from resolveSmartServerConfig.
3
+ * Internal module — not re-exported by the package barrel.
4
+ */
5
+ import type { SmartServerAgentConfig, SmartServerConfig } from './smart-server.js';
6
+ import type { YamlConfig } from './yaml-loader.js';
7
+ export declare function resolveLlmSection(yaml: YamlConfig, apiKey: string): SmartServerConfig['llm'];
8
+ export declare function resolveRagSection(yaml: YamlConfig, args: Record<string, unknown>): SmartServerConfig['rag'];
9
+ export declare function resolveMcpSection(yaml: YamlConfig, args: Record<string, unknown>): SmartServerConfig['mcp'];
10
+ export declare function resolveAgentSection(yaml: YamlConfig, args: Record<string, unknown>): SmartServerAgentConfig;
11
+ export declare function resolvePromptsSection(yaml: YamlConfig): SmartServerConfig['prompts'];
12
+ export declare function resolvePipelineSelection(yaml: YamlConfig): {
13
+ pipeline?: SmartServerConfig['pipeline'];
14
+ };
15
+ //# sourceMappingURL=resolve-config-sections.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-config-sections.d.ts","sourceRoot":"","sources":["../../src/smart-agent/resolve-config-sections.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACV,sBAAsB,EACtB,iBAAiB,EAGlB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAGnD,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,MAAM,GACb,iBAAiB,CAAC,KAAK,CAAC,CAqB1B;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,iBAAiB,CAAC,KAAK,CAAC,CA+B1B;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,iBAAiB,CAAC,KAAK,CAAC,CAyC1B;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,sBAAsB,CAkIxB;AAED,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,UAAU,GACf,iBAAiB,CAAC,SAAS,CAAC,CA2B9B;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,UAAU,GAAG;IAC1D,QAAQ,CAAC,EAAE,iBAAiB,CAAC,UAAU,CAAC,CAAC;CAC1C,CAsBA"}
@@ -0,0 +1,212 @@
1
+ /**
2
+ * Per-section config builders extracted from resolveSmartServerConfig.
3
+ * Internal module — not re-exported by the package barrel.
4
+ */
5
+ import { get } from './yaml-loader.js';
6
+ export function resolveLlmSection(yaml, apiKey) {
7
+ return get(yaml, 'llm')
8
+ ? typeof get(yaml, 'llm', 'provider') === 'string'
9
+ ? {
10
+ provider: get(yaml, 'llm', 'provider'),
11
+ apiKey,
12
+ url: get(yaml, 'llm', 'url'),
13
+ model: get(yaml, 'llm', 'model'),
14
+ temperature: Number(get(yaml, 'llm', 'temperature') ?? 0.7),
15
+ classifierTemperature: Number(get(yaml, 'llm', 'classifierTemperature') ?? 0.1),
16
+ }
17
+ : get(yaml, 'llm')
18
+ : undefined;
19
+ }
20
+ export function resolveRagSection(yaml, args) {
21
+ return get(yaml, 'rag')
22
+ ? {
23
+ type: get(yaml, 'rag', 'type'),
24
+ embedder: get(yaml, 'rag', 'embedder') ?? undefined,
25
+ url: get(yaml, 'rag', 'url'),
26
+ model: get(yaml, 'rag', 'model'),
27
+ collectionName: args['rag-collection-name'] ??
28
+ get(yaml, 'rag', 'collectionName') ??
29
+ undefined,
30
+ dedupThreshold: Number(get(yaml, 'rag', 'dedupThreshold') ?? 0.92),
31
+ vectorWeight: Number(get(yaml, 'rag', 'vectorWeight') ?? 0.7),
32
+ keywordWeight: Number(get(yaml, 'rag', 'keywordWeight') ?? 0.3),
33
+ ...(get(yaml, 'rag', 'resourceGroup') !== undefined
34
+ ? { resourceGroup: String(get(yaml, 'rag', 'resourceGroup')) }
35
+ : {}),
36
+ ...(get(yaml, 'rag', 'scenario') !== undefined
37
+ ? {
38
+ scenario: String(get(yaml, 'rag', 'scenario')),
39
+ }
40
+ : {}),
41
+ }
42
+ : undefined;
43
+ }
44
+ export function resolveMcpSection(yaml, args) {
45
+ const rawMcp = yaml.mcp;
46
+ const mcpIsArray = Array.isArray(rawMcp);
47
+ const mcpUrl = get(yaml, 'mcp', 'url');
48
+ const mcpCommand = get(yaml, 'mcp', 'command');
49
+ const mcpTypeRaw = mcpIsArray
50
+ ? null // array form: type resolved per-entry inside connectMcpClientsFromConfig
51
+ : (get(yaml, 'mcp', 'type') ??
52
+ (mcpUrl ? 'http' : mcpCommand ? 'stdio' : null));
53
+ const mcpType = (mcpTypeRaw === 'none' ? null : mcpTypeRaw);
54
+ return mcpIsArray
55
+ ? rawMcp
56
+ : mcpType
57
+ ? {
58
+ type: mcpType,
59
+ url: mcpUrl || undefined,
60
+ command: mcpCommand || undefined,
61
+ args: args['mcp-args'] || get(yaml, 'mcp', 'args')
62
+ ? String(args['mcp-args'] || get(yaml, 'mcp', 'args')).split(' ')
63
+ : undefined,
64
+ headers: get(yaml, 'mcp', 'headers') ||
65
+ undefined,
66
+ ...(get(yaml, 'mcp', 'timeout') !== undefined
67
+ ? { timeout: Number(get(yaml, 'mcp', 'timeout')) }
68
+ : {}),
69
+ ...(get(yaml, 'mcp', 'toolTimeouts') !== undefined
70
+ ? {
71
+ toolTimeouts: get(yaml, 'mcp', 'toolTimeouts'),
72
+ }
73
+ : {}),
74
+ }
75
+ : undefined;
76
+ }
77
+ export function resolveAgentSection(yaml, args) {
78
+ return {
79
+ externalToolsValidationMode: (get(yaml, 'agent', 'externalToolsValidationMode') ?? 'permissive'),
80
+ maxIterations: Number(get(yaml, 'agent', 'maxIterations') ?? 10),
81
+ maxToolCalls: Number(get(yaml, 'agent', 'maxToolCalls') ?? 30),
82
+ toolUnavailableTtlMs: Number(get(yaml, 'agent', 'toolUnavailableTtlMs') ?? 600000),
83
+ ragQueryK: Number(get(yaml, 'agent', 'ragQueryK') ?? 10),
84
+ ...(get(yaml, 'agent', 'contextBudgetTokens') !== undefined
85
+ ? {
86
+ contextBudgetTokens: Number(get(yaml, 'agent', 'contextBudgetTokens')),
87
+ }
88
+ : {}),
89
+ ...(get(yaml, 'agent', 'semanticHistoryEnabled') !== undefined
90
+ ? {
91
+ semanticHistoryEnabled: Boolean(get(yaml, 'agent', 'semanticHistoryEnabled')),
92
+ }
93
+ : {}),
94
+ ...(get(yaml, 'agent', 'historyRecencyWindow') !== undefined
95
+ ? {
96
+ historyRecencyWindow: Number(get(yaml, 'agent', 'historyRecencyWindow')),
97
+ }
98
+ : {}),
99
+ ...(get(yaml, 'agent', 'historyTurnSummaryPrompt') !== undefined
100
+ ? {
101
+ historyTurnSummaryPrompt: String(get(yaml, 'agent', 'historyTurnSummaryPrompt')),
102
+ }
103
+ : {}),
104
+ showReasoning: Boolean(args['agent-show-reasoning'] ??
105
+ get(yaml, 'agent', 'showReasoning') ??
106
+ false),
107
+ historyAutoSummarizeLimit: Number(get(yaml, 'agent', 'historyAutoSummarizeLimit') ?? 10),
108
+ queryExpansionEnabled: Boolean(get(yaml, 'agent', 'queryExpansionEnabled') ?? false),
109
+ toolResultCacheTtlMs: Number(get(yaml, 'agent', 'toolResultCacheTtlMs') ?? 300000),
110
+ sessionTokenBudget: Number(get(yaml, 'agent', 'sessionTokenBudget') ?? 0),
111
+ ...(get(yaml, 'agent', 'classificationEnabled') !== undefined
112
+ ? {
113
+ classificationEnabled: Boolean(get(yaml, 'agent', 'classificationEnabled')),
114
+ }
115
+ : {}),
116
+ ...(get(yaml, 'agent', 'toolReselectPerIteration') !== undefined
117
+ ? {
118
+ toolReselectPerIteration: Boolean(get(yaml, 'agent', 'toolReselectPerIteration')),
119
+ }
120
+ : {}),
121
+ ...(get(yaml, 'agent', 'ragTranslateEnabled') !== undefined
122
+ ? {
123
+ ragTranslateEnabled: Boolean(get(yaml, 'agent', 'ragTranslateEnabled')),
124
+ }
125
+ : {}),
126
+ ...(get(yaml, 'agent', 'refreshToolsPerIteration') !== undefined
127
+ ? {
128
+ refreshToolsPerIteration: Boolean(get(yaml, 'agent', 'refreshToolsPerIteration')),
129
+ }
130
+ : {}),
131
+ ...(get(yaml, 'agent', 'streamMode') !== undefined
132
+ ? {
133
+ streamMode: String(get(yaml, 'agent', 'streamMode')),
134
+ }
135
+ : {}),
136
+ ...(get(yaml, 'agent', 'llmCallStrategy') !== undefined
137
+ ? {
138
+ llmCallStrategy: String(get(yaml, 'agent', 'llmCallStrategy')),
139
+ }
140
+ : {}),
141
+ ...(get(yaml, 'agent', 'heartbeatIntervalMs') !== undefined
142
+ ? {
143
+ heartbeatIntervalMs: Number(get(yaml, 'agent', 'heartbeatIntervalMs')),
144
+ }
145
+ : {}),
146
+ ...(get(yaml, 'agent', 'healthTimeoutMs') !== undefined
147
+ ? {
148
+ healthTimeoutMs: Number(get(yaml, 'agent', 'healthTimeoutMs')),
149
+ }
150
+ : {}),
151
+ ...(get(yaml, 'agent', 'retry') !== undefined
152
+ ? {
153
+ retry: get(yaml, 'agent', 'retry'),
154
+ }
155
+ : {}),
156
+ ...(get(yaml, 'agent', 'toolSelection') !== undefined
157
+ ? {
158
+ toolSelection: get(yaml, 'agent', 'toolSelection'),
159
+ }
160
+ : {}),
161
+ };
162
+ }
163
+ export function resolvePromptsSection(yaml) {
164
+ const promptSystem = get(yaml, 'prompts', 'system') ?? null;
165
+ const promptClassifier = get(yaml, 'prompts', 'classifier') ?? null;
166
+ const promptReasoning = get(yaml, 'prompts', 'reasoning') ?? null;
167
+ const promptRagTranslate = get(yaml, 'prompts', 'ragTranslate') ?? null;
168
+ const promptHistorySummary = get(yaml, 'prompts', 'historySummary') ?? null;
169
+ return promptSystem ||
170
+ promptClassifier ||
171
+ promptReasoning ||
172
+ promptRagTranslate ||
173
+ promptHistorySummary
174
+ ? {
175
+ ...(promptSystem ? { system: promptSystem } : {}),
176
+ ...(promptClassifier ? { classifier: promptClassifier } : {}),
177
+ ...(typeof promptReasoning === 'string'
178
+ ? { reasoning: promptReasoning }
179
+ : {}),
180
+ ...(typeof promptRagTranslate === 'string'
181
+ ? { ragTranslate: promptRagTranslate }
182
+ : {}),
183
+ ...(typeof promptHistorySummary === 'string'
184
+ ? { historySummary: promptHistorySummary }
185
+ : {}),
186
+ }
187
+ : undefined;
188
+ }
189
+ export function resolvePipelineSelection(yaml) {
190
+ // Pipeline selection: `pipeline: { name, config }`. `name` is required;
191
+ // `config` is the plugin's opaque dialect (validated by the plugin's
192
+ // parseConfig at build time). A bare string (`pipeline: stepper`) is
193
+ // accepted as shorthand for `{ name: <string> }`.
194
+ const raw = yaml.pipeline;
195
+ if (raw === undefined || raw === null)
196
+ return {};
197
+ if (typeof raw === 'string')
198
+ return { pipeline: { name: raw } };
199
+ const obj = raw;
200
+ if (typeof obj.name !== 'string') {
201
+ throw new Error("pipeline: requires a 'name' (one of: flat, linear, dag, stepper, controller, controller-weak, or a registered plugin)");
202
+ }
203
+ return {
204
+ pipeline: {
205
+ name: obj.name,
206
+ ...(obj.config && typeof obj.config === 'object'
207
+ ? { config: obj.config }
208
+ : {}),
209
+ },
210
+ };
211
+ }
212
+ //# sourceMappingURL=resolve-config-sections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-config-sections.js","sourceRoot":"","sources":["../../src/smart-agent/resolve-config-sections.ts"],"names":[],"mappings":"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"}