@mcp-abap-adt/llm-agent-server-libs 20.0.0 → 20.5.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 (189) 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/factories/controller-factory.d.ts +18 -1
  6. package/dist/factories/controller-factory.d.ts.map +1 -1
  7. package/dist/factories/controller-factory.js +12 -1
  8. package/dist/factories/controller-factory.js.map +1 -1
  9. package/dist/generated/version.d.ts +1 -1
  10. package/dist/generated/version.js +1 -1
  11. package/dist/index.d.ts +1 -0
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +1 -0
  14. package/dist/index.js.map +1 -1
  15. package/dist/mcp/compose-auxiliary.d.ts +35 -0
  16. package/dist/mcp/compose-auxiliary.d.ts.map +1 -0
  17. package/dist/mcp/compose-auxiliary.js +64 -0
  18. package/dist/mcp/compose-auxiliary.js.map +1 -0
  19. package/dist/pipelines/controller.d.ts.map +1 -1
  20. package/dist/pipelines/controller.js +87 -5
  21. package/dist/pipelines/controller.js.map +1 -1
  22. package/dist/pipelines/coordinator-resolvers.d.ts +68 -0
  23. package/dist/pipelines/coordinator-resolvers.d.ts.map +1 -0
  24. package/dist/pipelines/coordinator-resolvers.js +97 -0
  25. package/dist/pipelines/coordinator-resolvers.js.map +1 -0
  26. package/dist/pipelines/parsers.d.ts +1 -1
  27. package/dist/pipelines/parsers.d.ts.map +1 -1
  28. package/dist/pipelines/parsers.js +5 -4
  29. package/dist/pipelines/parsers.js.map +1 -1
  30. package/dist/pipelines/register-skill-sources.d.ts.map +1 -1
  31. package/dist/pipelines/register-skill-sources.js +5 -0
  32. package/dist/pipelines/register-skill-sources.js.map +1 -1
  33. package/dist/smart-agent/build-stepper-root.d.ts +3 -2
  34. package/dist/smart-agent/build-stepper-root.d.ts.map +1 -1
  35. package/dist/smart-agent/build-stepper-root.js +2 -1
  36. package/dist/smart-agent/build-stepper-root.js.map +1 -1
  37. package/dist/smart-agent/config-reload-watcher.d.ts +30 -0
  38. package/dist/smart-agent/config-reload-watcher.d.ts.map +1 -0
  39. package/dist/smart-agent/config-reload-watcher.js +101 -0
  40. package/dist/smart-agent/config-reload-watcher.js.map +1 -0
  41. package/dist/smart-agent/config-validator.d.ts +21 -0
  42. package/dist/smart-agent/config-validator.d.ts.map +1 -0
  43. package/dist/smart-agent/config-validator.js +196 -0
  44. package/dist/smart-agent/config-validator.js.map +1 -0
  45. package/dist/smart-agent/config.d.ts +16 -254
  46. package/dist/smart-agent/config.d.ts.map +1 -1
  47. package/dist/smart-agent/config.js +17 -904
  48. package/dist/smart-agent/config.js.map +1 -1
  49. package/dist/smart-agent/controller/board.d.ts +6 -3
  50. package/dist/smart-agent/controller/board.d.ts.map +1 -1
  51. package/dist/smart-agent/controller/board.js +21 -0
  52. package/dist/smart-agent/controller/board.js.map +1 -1
  53. package/dist/smart-agent/controller/controller-coordinator-handler.d.ts +24 -50
  54. package/dist/smart-agent/controller/controller-coordinator-handler.d.ts.map +1 -1
  55. package/dist/smart-agent/controller/controller-coordinator-handler.js +542 -676
  56. package/dist/smart-agent/controller/controller-coordinator-handler.js.map +1 -1
  57. package/dist/smart-agent/controller/default-step-execution-control.d.ts +7 -0
  58. package/dist/smart-agent/controller/default-step-execution-control.d.ts.map +1 -0
  59. package/dist/smart-agent/controller/default-step-execution-control.js +36 -0
  60. package/dist/smart-agent/controller/default-step-execution-control.js.map +1 -0
  61. package/dist/smart-agent/controller/finalizer.d.ts +5 -0
  62. package/dist/smart-agent/controller/finalizer.d.ts.map +1 -1
  63. package/dist/smart-agent/controller/finalizer.js +12 -5
  64. package/dist/smart-agent/controller/finalizer.js.map +1 -1
  65. package/dist/smart-agent/controller/noop-run-execution-control.d.ts +6 -0
  66. package/dist/smart-agent/controller/noop-run-execution-control.d.ts.map +1 -0
  67. package/dist/smart-agent/controller/noop-run-execution-control.js +14 -0
  68. package/dist/smart-agent/controller/noop-run-execution-control.js.map +1 -0
  69. package/dist/smart-agent/controller/parser.d.ts +11 -0
  70. package/dist/smart-agent/controller/parser.d.ts.map +1 -0
  71. package/dist/smart-agent/controller/parser.js +77 -0
  72. package/dist/smart-agent/controller/parser.js.map +1 -0
  73. package/dist/smart-agent/controller/planner.js +1 -1
  74. package/dist/smart-agent/controller/planner.js.map +1 -1
  75. package/dist/smart-agent/controller/recall.d.ts +48 -0
  76. package/dist/smart-agent/controller/recall.d.ts.map +1 -0
  77. package/dist/smart-agent/controller/recall.js +196 -0
  78. package/dist/smart-agent/controller/recall.js.map +1 -0
  79. package/dist/smart-agent/controller/reviewer.d.ts.map +1 -1
  80. package/dist/smart-agent/controller/reviewer.js +1 -1
  81. package/dist/smart-agent/controller/reviewer.js.map +1 -1
  82. package/dist/smart-agent/controller/subagent-client.d.ts +2 -2
  83. package/dist/smart-agent/controller/subagent-client.d.ts.map +1 -1
  84. package/dist/smart-agent/controller/subagent-client.js +2 -2
  85. package/dist/smart-agent/controller/subagent-client.js.map +1 -1
  86. package/dist/smart-agent/controller/types.d.ts +16 -4
  87. package/dist/smart-agent/controller/types.d.ts.map +1 -1
  88. package/dist/smart-agent/controller/types.js.map +1 -1
  89. package/dist/smart-agent/controller/usage-logging.d.ts +16 -0
  90. package/dist/smart-agent/controller/usage-logging.d.ts.map +1 -0
  91. package/dist/smart-agent/controller/usage-logging.js +39 -0
  92. package/dist/smart-agent/controller/usage-logging.js.map +1 -0
  93. package/dist/smart-agent/http/adapter-route-handler.d.ts +13 -0
  94. package/dist/smart-agent/http/adapter-route-handler.d.ts.map +1 -0
  95. package/dist/smart-agent/http/adapter-route-handler.js +76 -0
  96. package/dist/smart-agent/http/adapter-route-handler.js.map +1 -0
  97. package/dist/smart-agent/http/chat-route-handler.d.ts +15 -0
  98. package/dist/smart-agent/http/chat-route-handler.d.ts.map +1 -0
  99. package/dist/smart-agent/http/chat-route-handler.js +327 -0
  100. package/dist/smart-agent/http/chat-route-handler.js.map +1 -0
  101. package/dist/smart-agent/http/config-route-handler.d.ts +21 -0
  102. package/dist/smart-agent/http/config-route-handler.d.ts.map +1 -0
  103. package/dist/smart-agent/http/config-route-handler.js +149 -0
  104. package/dist/smart-agent/http/config-route-handler.js.map +1 -0
  105. package/dist/smart-agent/http/health-route-handler.d.ts +12 -0
  106. package/dist/smart-agent/http/health-route-handler.d.ts.map +1 -0
  107. package/dist/smart-agent/http/health-route-handler.js +19 -0
  108. package/dist/smart-agent/http/health-route-handler.js.map +1 -0
  109. package/dist/smart-agent/http/models-route-handler.d.ts +17 -0
  110. package/dist/smart-agent/http/models-route-handler.d.ts.map +1 -0
  111. package/dist/smart-agent/http/models-route-handler.js +65 -0
  112. package/dist/smart-agent/http/models-route-handler.js.map +1 -0
  113. package/dist/smart-agent/http/response-helpers.d.ts +31 -0
  114. package/dist/smart-agent/http/response-helpers.d.ts.map +1 -0
  115. package/dist/smart-agent/http/response-helpers.js +59 -0
  116. package/dist/smart-agent/http/response-helpers.js.map +1 -0
  117. package/dist/smart-agent/http/route-table.d.ts +44 -0
  118. package/dist/smart-agent/http/route-table.d.ts.map +1 -0
  119. package/dist/smart-agent/http/route-table.js +35 -0
  120. package/dist/smart-agent/http/route-table.js.map +1 -0
  121. package/dist/smart-agent/http/session-cookie.d.ts +10 -0
  122. package/dist/smart-agent/http/session-cookie.d.ts.map +1 -0
  123. package/dist/smart-agent/http/session-cookie.js +16 -0
  124. package/dist/smart-agent/http/session-cookie.js.map +1 -0
  125. package/dist/smart-agent/http/sessions-route-handler.d.ts +8 -0
  126. package/dist/smart-agent/http/sessions-route-handler.d.ts.map +1 -0
  127. package/dist/smart-agent/http/sessions-route-handler.js +54 -0
  128. package/dist/smart-agent/http/sessions-route-handler.js.map +1 -0
  129. package/dist/smart-agent/http/usage-route-handler.d.ts +12 -0
  130. package/dist/smart-agent/http/usage-route-handler.d.ts.map +1 -0
  131. package/dist/smart-agent/http/usage-route-handler.js +28 -0
  132. package/dist/smart-agent/http/usage-route-handler.js.map +1 -0
  133. package/dist/smart-agent/knowledge/make-knowledge-backend.d.ts +13 -0
  134. package/dist/smart-agent/knowledge/make-knowledge-backend.d.ts.map +1 -0
  135. package/dist/smart-agent/knowledge/make-knowledge-backend.js +18 -0
  136. package/dist/smart-agent/knowledge/make-knowledge-backend.js.map +1 -0
  137. package/dist/smart-agent/llm/role-llm-resolver.d.ts +30 -0
  138. package/dist/smart-agent/llm/role-llm-resolver.d.ts.map +1 -0
  139. package/dist/smart-agent/llm/role-llm-resolver.js +44 -0
  140. package/dist/smart-agent/llm/role-llm-resolver.js.map +1 -0
  141. package/dist/smart-agent/llm-config-map.d.ts +38 -0
  142. package/dist/smart-agent/llm-config-map.d.ts.map +1 -0
  143. package/dist/smart-agent/llm-config-map.js +75 -0
  144. package/dist/smart-agent/llm-config-map.js.map +1 -0
  145. package/dist/smart-agent/mcp-readiness-monitor.d.ts +38 -0
  146. package/dist/smart-agent/mcp-readiness-monitor.d.ts.map +1 -0
  147. package/dist/smart-agent/mcp-readiness-monitor.js +81 -0
  148. package/dist/smart-agent/mcp-readiness-monitor.js.map +1 -0
  149. package/dist/smart-agent/mcp-readiness-registry.d.ts +37 -0
  150. package/dist/smart-agent/mcp-readiness-registry.d.ts.map +1 -0
  151. package/dist/smart-agent/mcp-readiness-registry.js +55 -0
  152. package/dist/smart-agent/mcp-readiness-registry.js.map +1 -0
  153. package/dist/smart-agent/resolve-config-sections.d.ts +15 -0
  154. package/dist/smart-agent/resolve-config-sections.d.ts.map +1 -0
  155. package/dist/smart-agent/resolve-config-sections.js +212 -0
  156. package/dist/smart-agent/resolve-config-sections.js.map +1 -0
  157. package/dist/smart-agent/session-lifecycle/index.d.ts +117 -0
  158. package/dist/smart-agent/session-lifecycle/index.d.ts.map +1 -0
  159. package/dist/smart-agent/session-lifecycle/index.js +152 -0
  160. package/dist/smart-agent/session-lifecycle/index.js.map +1 -0
  161. package/dist/smart-agent/skill-plugins-config.d.ts +9 -1
  162. package/dist/smart-agent/skill-plugins-config.d.ts.map +1 -1
  163. package/dist/smart-agent/skill-plugins-config.js +27 -1
  164. package/dist/smart-agent/skill-plugins-config.js.map +1 -1
  165. package/dist/smart-agent/skill-plugins-host-factory.d.ts +14 -2
  166. package/dist/smart-agent/skill-plugins-host-factory.d.ts.map +1 -1
  167. package/dist/smart-agent/skill-plugins-host-factory.js +16 -4
  168. package/dist/smart-agent/skill-plugins-host-factory.js.map +1 -1
  169. package/dist/smart-agent/smart-server.d.ts +169 -222
  170. package/dist/smart-agent/smart-server.d.ts.map +1 -1
  171. package/dist/smart-agent/smart-server.js +569 -1387
  172. package/dist/smart-agent/smart-server.js.map +1 -1
  173. package/dist/smart-agent/stepper-config.d.ts +138 -0
  174. package/dist/smart-agent/stepper-config.d.ts.map +1 -0
  175. package/dist/smart-agent/stepper-config.js +216 -0
  176. package/dist/smart-agent/stepper-config.js.map +1 -0
  177. package/dist/smart-agent/tools-rag-handle.d.ts +10 -0
  178. package/dist/smart-agent/tools-rag-handle.d.ts.map +1 -0
  179. package/dist/smart-agent/tools-rag-handle.js +76 -0
  180. package/dist/smart-agent/tools-rag-handle.js.map +1 -0
  181. package/dist/smart-agent/workers/worker-registry.d.ts +159 -0
  182. package/dist/smart-agent/workers/worker-registry.d.ts.map +1 -0
  183. package/dist/smart-agent/workers/worker-registry.js +203 -0
  184. package/dist/smart-agent/workers/worker-registry.js.map +1 -0
  185. package/dist/smart-agent/yaml-loader.d.ts +7 -0
  186. package/dist/smart-agent/yaml-loader.d.ts.map +1 -0
  187. package/dist/smart-agent/yaml-loader.js +146 -0
  188. package/dist/smart-agent/yaml-loader.js.map +1 -0
  189. package/package.json +7 -7
@@ -0,0 +1,327 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { buildExternalResults, normalizeAndValidateExternalTools, toToolCallDelta, } from '@mcp-abap-adt/llm-agent';
3
+ import { SessionLogger, } from '@mcp-abap-adt/llm-agent-libs';
4
+ import { jsonError, jsonValidationError, mapStopReason, readBody, } from './response-helpers.js';
5
+ /**
6
+ * POST /v1/chat/completions handler (OpenAI-compatible), extracted verbatim
7
+ * from SmartServer._handleChat. The only change vs. the original is that the
8
+ * three `this.cfg` reads are now the trailing `cfg` parameter.
9
+ */
10
+ export async function handleChat(req, res, _requestLogger, smartAgent, _chat, _streamChat, log, modelProvider, session, cfg) {
11
+ const rawBody = await readBody(req);
12
+ let parsed;
13
+ try {
14
+ parsed = JSON.parse(rawBody);
15
+ }
16
+ catch {
17
+ res.writeHead(400, { 'Content-Type': 'application/json' });
18
+ res.end(jsonError('Invalid JSON body', 'invalid_request_error'));
19
+ return;
20
+ }
21
+ if (typeof parsed !== 'object' ||
22
+ parsed === null ||
23
+ !Array.isArray(parsed.messages)) {
24
+ res.writeHead(400, { 'Content-Type': 'application/json' });
25
+ res.end(jsonError('messages must be a non-empty array', 'invalid_request_error'));
26
+ return;
27
+ }
28
+ const body = parsed;
29
+ const extractText = (c) => {
30
+ if (c === null || c === undefined)
31
+ return '';
32
+ if (typeof c === 'string')
33
+ return c;
34
+ if (!Array.isArray(c))
35
+ return '';
36
+ return c
37
+ .filter((b) => typeof b === 'object' &&
38
+ b !== null &&
39
+ b.type === 'text' &&
40
+ typeof b.text === 'string')
41
+ .map((b) => b.text)
42
+ .join('\n');
43
+ };
44
+ const userMessages = body.messages.filter((m) => m.role === 'user');
45
+ if (userMessages.length === 0) {
46
+ res.writeHead(400, { 'Content-Type': 'application/json' });
47
+ res.end(jsonError('at least one message with role "user" is required', 'invalid_request_error'));
48
+ return;
49
+ }
50
+ // Prefer the session injected by `_withSession` (cookie identity); fall
51
+ // back to the legacy x-session-id header / 'default' bucket only when no
52
+ // session was wired (defensive — production routes always inject one).
53
+ const traceId = session?.traceId ?? randomUUID();
54
+ const sessionId = session?.sessionId ?? req.headers['x-session-id'] ?? 'default';
55
+ const sessionLogger = new SessionLogger(cfg.logDir || null, sessionId, traceId);
56
+ const toolsValidationMode = cfg.agent?.externalToolsValidationMode ?? 'permissive';
57
+ const externalToolsValidation = normalizeAndValidateExternalTools(body.tools);
58
+ const externalTools = externalToolsValidation.tools;
59
+ if (externalToolsValidation.errors.length > 0) {
60
+ log({
61
+ event: 'invalid_external_tools_detected',
62
+ traceId,
63
+ sessionId,
64
+ mode: toolsValidationMode,
65
+ count: externalToolsValidation.errors.length,
66
+ errors: externalToolsValidation.errors,
67
+ });
68
+ sessionLogger.logStep('invalid_external_tools_detected', {
69
+ mode: toolsValidationMode,
70
+ count: externalToolsValidation.errors.length,
71
+ errors: externalToolsValidation.errors,
72
+ });
73
+ if (toolsValidationMode === 'strict') {
74
+ const firstError = externalToolsValidation.errors[0];
75
+ res.writeHead(400, { 'Content-Type': 'application/json' });
76
+ res.end(jsonValidationError(firstError.message, firstError.code, firstError.param));
77
+ return;
78
+ }
79
+ }
80
+ const t0 = Date.now();
81
+ log({ event: 'request_start', stream: body.stream ?? false, traceId });
82
+ const opts = {
83
+ stream: body.stream,
84
+ externalTools,
85
+ sessionId,
86
+ trace: { traceId },
87
+ sessionLogger,
88
+ model: body.model,
89
+ ...(session
90
+ ? {
91
+ toolAvailability: session.graph.toolAvailability,
92
+ pendingToolResults: session.graph.pendingToolResults,
93
+ }
94
+ : {}),
95
+ ...(body.temperature !== undefined
96
+ ? { temperature: body.temperature }
97
+ : {}),
98
+ ...(body.max_tokens !== undefined ? { maxTokens: body.max_tokens } : {}),
99
+ ...(body.top_p !== undefined ? { topP: body.top_p } : {}),
100
+ ...(body.stop !== undefined
101
+ ? { stop: Array.isArray(body.stop) ? body.stop : [body.stop] }
102
+ : {}),
103
+ };
104
+ const responseModel = body.model ?? modelProvider?.getModel() ?? 'smart-agent';
105
+ const normalizedMessages = body.messages
106
+ .map((m) => {
107
+ const role = m.role;
108
+ const normalizedMessage = {
109
+ role,
110
+ content: extractText(m.content),
111
+ };
112
+ if (role === 'tool') {
113
+ if (typeof m.tool_call_id === 'string' && m.tool_call_id.trim()) {
114
+ normalizedMessage.tool_call_id = m.tool_call_id;
115
+ }
116
+ else {
117
+ sessionLogger.logStep('drop_orphan_tool_message', {
118
+ reason: 'missing_tool_call_id',
119
+ });
120
+ return null;
121
+ }
122
+ }
123
+ if (role === 'assistant' && Array.isArray(m.tool_calls)) {
124
+ const toolCalls = m.tool_calls
125
+ .filter((tc) => typeof tc === 'object' &&
126
+ tc !== null &&
127
+ typeof tc.id === 'string' &&
128
+ tc.type === 'function' &&
129
+ typeof tc.function
130
+ ?.name === 'string' &&
131
+ typeof tc.function
132
+ ?.arguments === 'string')
133
+ .map((tc) => ({
134
+ id: tc.id,
135
+ type: 'function',
136
+ function: {
137
+ name: tc.function.name,
138
+ arguments: tc.function.arguments,
139
+ },
140
+ }));
141
+ if (toolCalls.length > 0) {
142
+ normalizedMessage.tool_calls = toolCalls;
143
+ if (!normalizedMessage.content)
144
+ normalizedMessage.content = null;
145
+ }
146
+ }
147
+ return normalizedMessage;
148
+ })
149
+ .filter((m) => m !== null);
150
+ // #171 (review#11): consume external (client-executed) tool result turns
151
+ // from the incoming history into a validated `extId → result` map and strip
152
+ // those raw turns from the messages forwarded to the agent (so no internal
153
+ // LLM call ever sees an unmatched assistant tool_calls). On a normal request
154
+ // with no external history this returns the messages unchanged + an empty
155
+ // map — a safe no-op. The map is threaded via options.externalResults.
156
+ const { results: externalResults, sanitizedMessages } = buildExternalResults(normalizedMessages);
157
+ const invalidToolsHeader = externalToolsValidation.errors.length > 0
158
+ ? {
159
+ 'x-smartagent-invalid-tools': String(externalToolsValidation.errors.length),
160
+ }
161
+ : {};
162
+ if (body.stream) {
163
+ res.writeHead(200, {
164
+ 'Content-Type': 'text/event-stream',
165
+ 'Cache-Control': 'no-cache',
166
+ Connection: 'keep-alive',
167
+ ...invalidToolsHeader,
168
+ });
169
+ const id = `chatcmpl-${randomUUID()}`;
170
+ const created = Math.floor(Date.now() / 1000);
171
+ const stream = smartAgent.streamProcess(sanitizedMessages, {
172
+ ...opts,
173
+ externalResults,
174
+ });
175
+ let firstChunk = true;
176
+ let finishReasonSent = false;
177
+ let lastUsage = null;
178
+ for await (const chunk of stream) {
179
+ if (!chunk.ok) {
180
+ const errorChunk = {
181
+ id,
182
+ object: 'chat.completion.chunk',
183
+ created,
184
+ model: responseModel,
185
+ choices: [
186
+ {
187
+ index: 0,
188
+ delta: { content: `[Error] ${chunk.error.message}` },
189
+ finish_reason: 'stop',
190
+ },
191
+ ],
192
+ };
193
+ res.write(`data: ${JSON.stringify(errorChunk)}\n\n`);
194
+ finishReasonSent = true;
195
+ break;
196
+ }
197
+ // SSE heartbeat comment — keeps connection alive, ignored by clients
198
+ if (chunk.value.heartbeat) {
199
+ const hb = chunk.value.heartbeat;
200
+ res.write(`: heartbeat tool=${hb.tool} elapsed=${hb.elapsed}ms\n\n`);
201
+ continue;
202
+ }
203
+ // SSE timing breakdown comment — sent with the final chunk
204
+ if (chunk.value.timing) {
205
+ const parts = chunk.value.timing.map((t) => `${t.phase}=${t.duration}ms`);
206
+ res.write(`: timing ${parts.join(' ')}\n\n`);
207
+ }
208
+ if (chunk.value.usage) {
209
+ lastUsage = {
210
+ prompt_tokens: chunk.value.usage.promptTokens,
211
+ completion_tokens: chunk.value.usage.completionTokens,
212
+ total_tokens: chunk.value.usage.totalTokens,
213
+ };
214
+ }
215
+ const baseResponse = {
216
+ id,
217
+ object: 'chat.completion.chunk',
218
+ created,
219
+ model: responseModel,
220
+ usage: null,
221
+ };
222
+ if (firstChunk) {
223
+ res.write(`data: ${JSON.stringify({ ...baseResponse, choices: [{ index: 0, delta: { role: 'assistant', content: chunk.value.content || '' }, finish_reason: null }] })}\n\n`);
224
+ firstChunk = false;
225
+ if (!chunk.value.finishReason && !chunk.value.toolCalls)
226
+ continue;
227
+ }
228
+ if (chunk.value.content || chunk.value.toolCalls) {
229
+ const delta = {};
230
+ if (chunk.value.content)
231
+ delta.content = chunk.value.content;
232
+ if (chunk.value.toolCalls) {
233
+ delta.tool_calls = chunk.value.toolCalls.map((call, index) => {
234
+ const tc = toToolCallDelta(call, index);
235
+ return {
236
+ index: tc.index,
237
+ id: tc.id,
238
+ type: 'function',
239
+ function: {
240
+ name: tc.name,
241
+ arguments: tc.arguments || '',
242
+ },
243
+ };
244
+ });
245
+ }
246
+ res.write(`data: ${JSON.stringify({ ...baseResponse, choices: [{ index: 0, delta, finish_reason: null }] })}\n\n`);
247
+ }
248
+ if (chunk.value.finishReason) {
249
+ res.write(`data: ${JSON.stringify({ ...baseResponse, choices: [{ index: 0, delta: {}, finish_reason: mapStopReason(chunk.value.finishReason) }] })}\n\n`);
250
+ finishReasonSent = true;
251
+ }
252
+ }
253
+ if (!finishReasonSent) {
254
+ const baseResponse = {
255
+ id,
256
+ object: 'chat.completion.chunk',
257
+ created,
258
+ model: responseModel,
259
+ usage: null,
260
+ };
261
+ res.write(`data: ${JSON.stringify({ ...baseResponse, choices: [{ index: 0, delta: {}, finish_reason: 'stop' }] })}\n\n`);
262
+ }
263
+ if ((cfg.reportUsage !== false || body.stream_options?.include_usage) &&
264
+ lastUsage) {
265
+ res.write(`data: ${JSON.stringify({ id, object: 'chat.completion.chunk', created, model: responseModel, choices: [], usage: lastUsage })}\n\n`);
266
+ }
267
+ res.write('data: [DONE]\n\n');
268
+ res.end();
269
+ log({
270
+ event: 'request_done',
271
+ ok: true,
272
+ stream: true,
273
+ finishReason: finishReasonSent ? 'sent' : 'fallback_stop',
274
+ durationMs: Date.now() - t0,
275
+ });
276
+ return;
277
+ }
278
+ const result = await smartAgent.process(sanitizedMessages, {
279
+ ...opts,
280
+ externalResults,
281
+ });
282
+ log({ event: 'request_done', ok: result.ok, durationMs: Date.now() - t0 });
283
+ const finalContent = result.ok
284
+ ? result.value.content || (result.value.toolCalls ? null : '(no response)')
285
+ : `Error: ${result.error.message}`;
286
+ const finalFinishReason = result.ok
287
+ ? mapStopReason(result.value.stopReason)
288
+ : 'stop';
289
+ let finalUsage = null;
290
+ if (result.ok && result.value.usage) {
291
+ finalUsage = {
292
+ prompt_tokens: result.value.usage.promptTokens,
293
+ completion_tokens: result.value.usage.completionTokens,
294
+ total_tokens: result.value.usage.totalTokens,
295
+ };
296
+ }
297
+ const message = {
298
+ role: 'assistant',
299
+ content: finalContent,
300
+ };
301
+ if (result.ok && result.value.toolCalls) {
302
+ message.tool_calls = result.value.toolCalls;
303
+ }
304
+ res.writeHead(200, {
305
+ 'Content-Type': 'application/json',
306
+ ...invalidToolsHeader,
307
+ });
308
+ res.end(JSON.stringify({
309
+ id: `chatcmpl-${randomUUID()}`,
310
+ object: 'chat.completion',
311
+ created: Math.floor(Date.now() / 1000),
312
+ model: responseModel,
313
+ choices: [
314
+ {
315
+ index: 0,
316
+ message,
317
+ finish_reason: finalFinishReason,
318
+ },
319
+ ],
320
+ usage: finalUsage || {
321
+ prompt_tokens: 0,
322
+ completion_tokens: 0,
323
+ total_tokens: 0,
324
+ },
325
+ }));
326
+ }
327
+ //# sourceMappingURL=chat-route-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-route-handler.js","sourceRoot":"","sources":["../../../src/smart-agent/http/chat-route-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { IncomingMessage, ServerResponse } from 'node:http';
2
+ import type { ILlm, IModelResolver } from '@mcp-abap-adt/llm-agent';
3
+ import type { SmartAgent } from '@mcp-abap-adt/llm-agent-libs';
4
+ /** Exactly the SmartServer state PUT /v1/config touches — the hot-swap seam. */
5
+ export interface IConfigUpdateTarget {
6
+ readonly modelResolver?: IModelResolver;
7
+ setMainLlm(llm: ILlm): void;
8
+ setClassifierLlm(llm: ILlm): void;
9
+ setHelperLlm(llm: ILlm): void;
10
+ /** Deep-merge `patch` into the mirrored `cfg.agent` (preserve untouched startup fields). */
11
+ mirrorAgentCfg(patch: Record<string, unknown>): void;
12
+ drainWorkers(): Promise<void>;
13
+ invalidateSessions(): Promise<void>;
14
+ }
15
+ /**
16
+ * PUT /v1/config handler, extracted verbatim from SmartServer._handleConfigUpdate.
17
+ * SmartServer state is reached through `target` (IConfigUpdateTarget): the LLM
18
+ * setters ARE the hot-swap that RoleLlmResolver's live accessors observe.
19
+ */
20
+ export declare function handleConfigUpdate(req: IncomingMessage, res: ServerResponse, smartAgent: SmartAgent, target: IConfigUpdateTarget): Promise<void>;
21
+ //# sourceMappingURL=config-route-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-route-handler.d.ts","sourceRoot":"","sources":["../../../src/smart-agent/http/config-route-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,KAAK,EACV,UAAU,EAEX,MAAM,8BAA8B,CAAC;AAGtC,gFAAgF;AAChF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,aAAa,CAAC,EAAE,cAAc,CAAC;IACxC,UAAU,CAAC,GAAG,EAAE,IAAI,GAAG,IAAI,CAAC;IAC5B,gBAAgB,CAAC,GAAG,EAAE,IAAI,GAAG,IAAI,CAAC;IAClC,YAAY,CAAC,GAAG,EAAE,IAAI,GAAG,IAAI,CAAC;IAC9B,4FAA4F;IAC5F,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACrD,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACrC;AAaD;;;;GAIG;AACH,wBAAsB,kBAAkB,CACtC,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,UAAU,EAAE,UAAU,EACtB,MAAM,EAAE,mBAAmB,GAC1B,OAAO,CAAC,IAAI,CAAC,CA0Jf"}
@@ -0,0 +1,149 @@
1
+ import { jsonError, readBody } from './response-helpers.js';
2
+ /** Whitelisted agent config fields allowed via PUT /v1/config. */
3
+ const AGENT_CONFIG_FIELDS = new Set([
4
+ 'maxIterations',
5
+ 'maxToolCalls',
6
+ 'ragQueryK',
7
+ 'toolUnavailableTtlMs',
8
+ 'showReasoning',
9
+ 'historyAutoSummarizeLimit',
10
+ 'classificationEnabled',
11
+ ]);
12
+ /**
13
+ * PUT /v1/config handler, extracted verbatim from SmartServer._handleConfigUpdate.
14
+ * SmartServer state is reached through `target` (IConfigUpdateTarget): the LLM
15
+ * setters ARE the hot-swap that RoleLlmResolver's live accessors observe.
16
+ */
17
+ export async function handleConfigUpdate(req, res, smartAgent, target) {
18
+ const raw = await readBody(req);
19
+ let parsed;
20
+ try {
21
+ parsed = JSON.parse(raw);
22
+ }
23
+ catch {
24
+ res.writeHead(400, { 'Content-Type': 'application/json' });
25
+ res.end(jsonError('Invalid JSON body', 'invalid_request_error'));
26
+ return;
27
+ }
28
+ if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
29
+ res.writeHead(400, { 'Content-Type': 'application/json' });
30
+ res.end(jsonError('Request body must be a JSON object', 'invalid_request_error'));
31
+ return;
32
+ }
33
+ const body = parsed;
34
+ // --- Validate agent fields against whitelist ---
35
+ if (body.agent !== undefined) {
36
+ if (typeof body.agent !== 'object' ||
37
+ body.agent === null ||
38
+ Array.isArray(body.agent)) {
39
+ res.writeHead(400, { 'Content-Type': 'application/json' });
40
+ res.end(jsonError('"agent" must be a JSON object', 'invalid_request_error'));
41
+ return;
42
+ }
43
+ const agentFields = body.agent;
44
+ const unsupported = Object.keys(agentFields).filter((k) => !AGENT_CONFIG_FIELDS.has(k));
45
+ if (unsupported.length > 0) {
46
+ res.writeHead(400, { 'Content-Type': 'application/json' });
47
+ res.end(jsonError(`Unsupported agent config fields: ${unsupported.join(', ')}`, 'invalid_request_error'));
48
+ return;
49
+ }
50
+ }
51
+ // --- Validate and resolve models (atomic: resolve ALL before mutating) ---
52
+ let resolvedModels;
53
+ if (body.models !== undefined) {
54
+ if (typeof body.models !== 'object' ||
55
+ body.models === null ||
56
+ Array.isArray(body.models)) {
57
+ res.writeHead(400, { 'Content-Type': 'application/json' });
58
+ res.end(jsonError('"models" must be a JSON object', 'invalid_request_error'));
59
+ return;
60
+ }
61
+ if (!target.modelResolver) {
62
+ res.writeHead(400, { 'Content-Type': 'application/json' });
63
+ res.end(jsonError('model resolver not configured', 'invalid_request_error'));
64
+ return;
65
+ }
66
+ const modelFields = body.models;
67
+ const validKeys = new Set(['mainModel', 'classifierModel', 'helperModel']);
68
+ const unknownKeys = Object.keys(modelFields).filter((k) => !validKeys.has(k));
69
+ if (unknownKeys.length > 0) {
70
+ res.writeHead(400, { 'Content-Type': 'application/json' });
71
+ res.end(jsonError(`Unknown model fields: ${unknownKeys.join(', ')}`, 'invalid_request_error'));
72
+ return;
73
+ }
74
+ try {
75
+ const resolver = target.modelResolver;
76
+ const [mainLlm, classifierLlm, helperLlm] = await Promise.all([
77
+ modelFields.mainModel
78
+ ? resolver.resolve(String(modelFields.mainModel), 'main')
79
+ : undefined,
80
+ modelFields.classifierModel
81
+ ? resolver.resolve(String(modelFields.classifierModel), 'classifier')
82
+ : undefined,
83
+ modelFields.helperModel
84
+ ? resolver.resolve(String(modelFields.helperModel), 'helper')
85
+ : undefined,
86
+ ]);
87
+ resolvedModels = {};
88
+ if (mainLlm)
89
+ resolvedModels.mainLlm = mainLlm;
90
+ if (classifierLlm)
91
+ resolvedModels.classifierLlm = classifierLlm;
92
+ if (helperLlm)
93
+ resolvedModels.helperLlm = helperLlm;
94
+ }
95
+ catch (err) {
96
+ res.writeHead(500, { 'Content-Type': 'application/json' });
97
+ res.end(jsonError(String(err), 'server_error'));
98
+ return;
99
+ }
100
+ }
101
+ // --- All validation passed — apply mutations ---
102
+ if (resolvedModels) {
103
+ smartAgent.reconfigure(resolvedModels);
104
+ // Mirror onto the hoisted globals consumed by `buildSessionAgent` so
105
+ // freshly-built session graphs pick up the new LLMs by reference
106
+ // (otherwise `this._mainLlm` etc. would keep pointing at the originals
107
+ // captured during `start()`).
108
+ if (resolvedModels.mainLlm)
109
+ target.setMainLlm(resolvedModels.mainLlm);
110
+ if (resolvedModels.classifierLlm)
111
+ target.setClassifierLlm(resolvedModels.classifierLlm);
112
+ if (resolvedModels.helperLlm)
113
+ target.setHelperLlm(resolvedModels.helperLlm);
114
+ }
115
+ if (body.agent) {
116
+ const patch = body.agent;
117
+ smartAgent.applyConfigUpdate(patch);
118
+ // Mirror onto `this.cfg.agent` so freshly-built session graphs (which
119
+ // read `this.cfg.agent` in `buildSessionAgent`) observe the update.
120
+ // Deep-merge to preserve untouched startup fields; replacing the whole
121
+ // `agent` block would drop YAML defaults the validator already applied.
122
+ target.mirrorAgentCfg(patch);
123
+ }
124
+ // Invalidate per-session SmartAgents + the worker-LLM cache so the next
125
+ // request mints a session graph that observes the just-applied config.
126
+ // Without this, chat routes dispatch to `graph.agent` (the per-session
127
+ // SmartAgent) which was built with the OLD config, and the PUT is a
128
+ // no-op from the consumer's perspective. Failures are non-fatal so the
129
+ // 200 response isn't blocked by a dispose hiccup.
130
+ if (resolvedModels || body.agent) {
131
+ // Fix #21: drain per-worker SmartAgentHandle.close() BEFORE clearing the
132
+ // cache so MCP clients owned by the discarded handles disconnect.
133
+ await target.drainWorkers();
134
+ try {
135
+ await target.invalidateSessions();
136
+ }
137
+ catch {
138
+ // Swallow: cleanup errors must not turn a successful config update
139
+ // into a 500. The next request will still get a fresh build because
140
+ // `_workers.cache` is already cleared and dispose is idempotent.
141
+ }
142
+ }
143
+ // --- Return updated config ---
144
+ const models = smartAgent.getActiveConfig();
145
+ const agent = smartAgent.getAgentConfig();
146
+ res.writeHead(200, { 'Content-Type': 'application/json' });
147
+ res.end(JSON.stringify({ models, agent }));
148
+ }
149
+ //# sourceMappingURL=config-route-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-route-handler.js","sourceRoot":"","sources":["../../../src/smart-agent/http/config-route-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { RouteContext } from './route-table.js';
2
+ /**
3
+ * GET /health | /v1/health — return server + MCP health status.
4
+ *
5
+ * Body moved verbatim from `SmartServer._buildRouteTable` (route index 6).
6
+ * Reads only `rc.healthChecker`, `rc.ready`, and `rc.res` — no private server
7
+ * fields, so no threading is required.
8
+ * MCP-down ⇒ NOT_READY ⇒ 503 (not just LLM-unhealthy), so a load balancer
9
+ * stops routing while MCP is unreachable.
10
+ */
11
+ export declare function handleHealthRoute(rc: RouteContext): Promise<void>;
12
+ //# sourceMappingURL=health-route-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-route-handler.d.ts","sourceRoot":"","sources":["../../../src/smart-agent/http/health-route-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CAAC,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAQvE"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * GET /health | /v1/health — return server + MCP health status.
3
+ *
4
+ * Body moved verbatim from `SmartServer._buildRouteTable` (route index 6).
5
+ * Reads only `rc.healthChecker`, `rc.ready`, and `rc.res` — no private server
6
+ * fields, so no threading is required.
7
+ * MCP-down ⇒ NOT_READY ⇒ 503 (not just LLM-unhealthy), so a load balancer
8
+ * stops routing while MCP is unreachable.
9
+ */
10
+ export async function handleHealthRoute(rc) {
11
+ const status = await rc.healthChecker.check();
12
+ // 503 == NOT READY (can't serve, e.g. MCP down). LLM/RAG/circuit soft
13
+ // signals surface in the body (status: degraded) but do NOT 503 a service
14
+ // that can still serve — a load balancer must not drop a working pod.
15
+ const httpCode = rc.ready ? 200 : 503;
16
+ rc.res.writeHead(httpCode, { 'Content-Type': 'application/json' });
17
+ rc.res.end(JSON.stringify({ ...status, ready: rc.ready }));
18
+ }
19
+ //# sourceMappingURL=health-route-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health-route-handler.js","sourceRoot":"","sources":["../../../src/smart-agent/http/health-route-handler.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,EAAgB;IACtD,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC;IAC9C,sEAAsE;IACtE,0EAA0E;IAC1E,sEAAsE;IACtE,MAAM,QAAQ,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACtC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;IACnE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { RouteContext } from './route-table.js';
2
+ /**
3
+ * GET /v1/models | /models — list LLM models available through this server.
4
+ *
5
+ * Body moved verbatim from `SmartServer._buildRouteTable` (route index 0).
6
+ * Reads only `rc.rawUrl`, `rc.modelProvider`, and `rc.res` — no private server
7
+ * fields, so no threading is required.
8
+ */
9
+ export declare function handleModelsList(rc: RouteContext): Promise<void>;
10
+ /**
11
+ * GET /v1/embedding-models | /embedding-models — list embedding models.
12
+ *
13
+ * Body moved verbatim from `SmartServer._buildRouteTable` (route index 1).
14
+ * Reads only `rc.modelProvider` and `rc.res`.
15
+ */
16
+ export declare function handleEmbeddingModelsList(rc: RouteContext): Promise<void>;
17
+ //# sourceMappingURL=models-route-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models-route-handler.d.ts","sourceRoot":"","sources":["../../../src/smart-agent/http/models-route-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BtE;AAED;;;;;GAKG;AACH,wBAAsB,yBAAyB,CAC7C,EAAE,EAAE,YAAY,GACf,OAAO,CAAC,IAAI,CAAC,CAsBf"}