@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,65 @@
1
+ /**
2
+ * GET /v1/models | /models — list LLM models available through this server.
3
+ *
4
+ * Body moved verbatim from `SmartServer._buildRouteTable` (route index 0).
5
+ * Reads only `rc.rawUrl`, `rc.modelProvider`, and `rc.res` — no private server
6
+ * fields, so no threading is required.
7
+ */
8
+ export async function handleModelsList(rc) {
9
+ const queryString = rc.rawUrl.includes('?') ? rc.rawUrl.split('?')[1] : '';
10
+ const queryParams = new URLSearchParams(queryString);
11
+ const excludeEmbedding = queryParams.get('exclude_embedding') === 'true';
12
+ let data = [
13
+ { id: 'smart-agent', object: 'model', owned_by: 'smart-agent' },
14
+ ];
15
+ if (rc.modelProvider) {
16
+ const result = await rc.modelProvider.getModels({ excludeEmbedding });
17
+ if (result.ok) {
18
+ data = result.value.map((m) => ({
19
+ id: m.id,
20
+ object: 'model',
21
+ owned_by: m.owned_by ?? 'unknown',
22
+ ...(m.displayName ? { display_name: m.displayName } : {}),
23
+ ...(m.provider ? { provider: m.provider } : {}),
24
+ ...(m.capabilities ? { capabilities: m.capabilities } : {}),
25
+ ...(m.contextLength ? { context_length: m.contextLength } : {}),
26
+ ...(m.streamingSupported !== undefined
27
+ ? { streaming_supported: m.streamingSupported }
28
+ : {}),
29
+ ...(m.deprecated !== undefined ? { deprecated: m.deprecated } : {}),
30
+ }));
31
+ }
32
+ }
33
+ rc.res.writeHead(200, { 'Content-Type': 'application/json' });
34
+ rc.res.end(JSON.stringify({ object: 'list', data }));
35
+ }
36
+ /**
37
+ * GET /v1/embedding-models | /embedding-models — list embedding models.
38
+ *
39
+ * Body moved verbatim from `SmartServer._buildRouteTable` (route index 1).
40
+ * Reads only `rc.modelProvider` and `rc.res`.
41
+ */
42
+ export async function handleEmbeddingModelsList(rc) {
43
+ let data = [];
44
+ if (rc.modelProvider?.getEmbeddingModels) {
45
+ const result = await rc.modelProvider.getEmbeddingModels();
46
+ if (result.ok) {
47
+ data = result.value.map((m) => ({
48
+ id: m.id,
49
+ object: 'model',
50
+ owned_by: m.owned_by ?? 'unknown',
51
+ ...(m.displayName ? { display_name: m.displayName } : {}),
52
+ ...(m.provider ? { provider: m.provider } : {}),
53
+ ...(m.capabilities ? { capabilities: m.capabilities } : {}),
54
+ ...(m.contextLength ? { context_length: m.contextLength } : {}),
55
+ ...(m.streamingSupported !== undefined
56
+ ? { streaming_supported: m.streamingSupported }
57
+ : {}),
58
+ ...(m.deprecated !== undefined ? { deprecated: m.deprecated } : {}),
59
+ }));
60
+ }
61
+ }
62
+ rc.res.writeHead(200, { 'Content-Type': 'application/json' });
63
+ rc.res.end(JSON.stringify({ object: 'list', data }));
64
+ }
65
+ //# sourceMappingURL=models-route-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models-route-handler.js","sourceRoot":"","sources":["../../../src/smart-agent/http/models-route-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Pure HTTP response helpers shared by SmartServer's route handlers.
3
+ *
4
+ * Relocated verbatim from `smart-server.ts` so the route table and the
5
+ * SmartServer methods can share them without duplicating logic. Behaviour is
6
+ * byte-identical to the originals; `smart-server.ts` re-exports them so import
7
+ * paths stay stable.
8
+ */
9
+ import type { IncomingMessage } from 'node:http';
10
+ import type { ExternalToolValidationCode } from '@mcp-abap-adt/llm-agent';
11
+ import type { StopReason } from '@mcp-abap-adt/llm-agent-libs';
12
+ export declare function mapStopReason(r: StopReason): 'stop' | 'length' | 'tool_calls';
13
+ export declare function jsonError(message: string, type: string, code?: string): string;
14
+ export declare function jsonValidationError(message: string, code: ExternalToolValidationCode, param: string): string;
15
+ export declare function readBody(req: IncomingMessage): Promise<string>;
16
+ export declare const CORS_HEADERS: {
17
+ 'Access-Control-Allow-Origin': string;
18
+ 'Access-Control-Allow-Methods': string;
19
+ 'Access-Control-Allow-Headers': string;
20
+ };
21
+ /**
22
+ * Pre-dispatch readiness gate response: HTTP 503 with an OpenAI-shaped error,
23
+ * written BEFORE any pipeline run or SSE stream is opened. Used when the server is
24
+ * NOT_READY (MCP unavailable) so a request fails loud instead of being served
25
+ * tool-blind / returning a silent "(no response)".
26
+ */
27
+ export declare function writeNotReady(res: {
28
+ writeHead(code: number, headers?: Record<string, string>): unknown;
29
+ end(body?: string): unknown;
30
+ }): void;
31
+ //# sourceMappingURL=response-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-helpers.d.ts","sourceRoot":"","sources":["../../../src/smart-agent/http/response-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AACjD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,8BAA8B,CAAC;AAE/D,wBAAgB,aAAa,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,YAAY,CAI7E;AAED,wBAAgB,SAAS,CACvB,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,MAAM,GACZ,MAAM,CAIR;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,0BAA0B,EAChC,KAAK,EAAE,MAAM,GACZ,MAAM,CASR;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,eAAe,GAAG,OAAO,CAAC,MAAM,CAAC,CAO9D;AAED,eAAO,MAAM,YAAY;;;;CAIxB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE;IACjC,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC;IACnE,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC7B,GAAG,IAAI,CAUP"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Pure HTTP response helpers shared by SmartServer's route handlers.
3
+ *
4
+ * Relocated verbatim from `smart-server.ts` so the route table and the
5
+ * SmartServer methods can share them without duplicating logic. Behaviour is
6
+ * byte-identical to the originals; `smart-server.ts` re-exports them so import
7
+ * paths stay stable.
8
+ */
9
+ export function mapStopReason(r) {
10
+ if (r === 'stop')
11
+ return 'stop';
12
+ if (r === 'tool_calls')
13
+ return 'tool_calls';
14
+ return 'length';
15
+ }
16
+ export function jsonError(message, type, code) {
17
+ return JSON.stringify({
18
+ error: { message, type, ...(code ? { code } : {}) },
19
+ });
20
+ }
21
+ export function jsonValidationError(message, code, param) {
22
+ return JSON.stringify({
23
+ error: {
24
+ message,
25
+ type: 'invalid_request_error',
26
+ code,
27
+ param,
28
+ },
29
+ });
30
+ }
31
+ export function readBody(req) {
32
+ return new Promise((resolve, reject) => {
33
+ const chunks = [];
34
+ req.on('data', (c) => chunks.push(c));
35
+ req.on('end', () => resolve(Buffer.concat(chunks).toString('utf8')));
36
+ req.on('error', reject);
37
+ });
38
+ }
39
+ export const CORS_HEADERS = {
40
+ 'Access-Control-Allow-Origin': '*',
41
+ 'Access-Control-Allow-Methods': 'GET, POST, PUT, OPTIONS',
42
+ 'Access-Control-Allow-Headers': 'Content-Type, Authorization',
43
+ };
44
+ /**
45
+ * Pre-dispatch readiness gate response: HTTP 503 with an OpenAI-shaped error,
46
+ * written BEFORE any pipeline run or SSE stream is opened. Used when the server is
47
+ * NOT_READY (MCP unavailable) so a request fails loud instead of being served
48
+ * tool-blind / returning a silent "(no response)".
49
+ */
50
+ export function writeNotReady(res) {
51
+ res.writeHead(503, { 'Content-Type': 'application/json' });
52
+ res.end(JSON.stringify({
53
+ error: {
54
+ type: 'service_unavailable',
55
+ message: 'MCP unavailable — server not ready',
56
+ },
57
+ }));
58
+ }
59
+ //# sourceMappingURL=response-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-helpers.js","sourceRoot":"","sources":["../../../src/smart-agent/http/response-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH,MAAM,UAAU,aAAa,CAAC,CAAa;IACzC,IAAI,CAAC,KAAK,MAAM;QAAE,OAAO,MAAM,CAAC;IAChC,IAAI,CAAC,KAAK,YAAY;QAAE,OAAO,YAAY,CAAC;IAC5C,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,SAAS,CACvB,OAAe,EACf,IAAY,EACZ,IAAa;IAEb,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;KACpD,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,OAAe,EACf,IAAgC,EAChC,KAAa;IAEb,OAAO,IAAI,CAAC,SAAS,CAAC;QACpB,KAAK,EAAE;YACL,OAAO;YACP,IAAI,EAAE,uBAAuB;YAC7B,IAAI;YACJ,KAAK;SACN;KACF,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,GAAoB;IAC3C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACrE,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG;IAC1B,6BAA6B,EAAE,GAAG;IAClC,8BAA8B,EAAE,yBAAyB;IACzD,8BAA8B,EAAE,6BAA6B;CAC9D,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,GAG7B;IACC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC3D,GAAG,CAAC,GAAG,CACL,IAAI,CAAC,SAAS,CAAC;QACb,KAAK,EAAE;YACL,IAAI,EAAE,qBAAqB;YAC3B,OAAO,EAAE,oCAAoC;SAC9C;KACF,CAAC,CACH,CAAC;AACJ,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Declarative HTTP route table for SmartServer.
3
+ *
4
+ * Replaces the ~300-line if/else chain in `SmartServer._handle` with an ordered
5
+ * list of routes. Dispatch iterates the routes in registration order; the first
6
+ * route whose method AND path match handles the request. No match ⇒ 404. The
7
+ * order of `add()` calls is therefore semantically significant and MUST mirror
8
+ * the original `_handle` branch order to stay behaviour-preserving.
9
+ */
10
+ import type { IncomingMessage, ServerResponse } from 'node:http';
11
+ import type { ILlmApiAdapter, IModelProvider, IRequestLogger } from '@mcp-abap-adt/llm-agent';
12
+ import type { HealthChecker, SmartAgent, SmartAgentHandle } from '@mcp-abap-adt/llm-agent-libs';
13
+ import type { SmartServer } from '../smart-server.js';
14
+ export interface RouteContext {
15
+ req: IncomingMessage;
16
+ res: ServerResponse;
17
+ rawUrl: string;
18
+ urlPath: string;
19
+ method: string;
20
+ /** Pre-computed once in `_handle`; reused by health/messages/chat. */
21
+ ready: boolean;
22
+ server: SmartServer;
23
+ requestLogger: IRequestLogger;
24
+ smartAgent: SmartAgent;
25
+ chat: SmartAgentHandle['chat'];
26
+ streamChat: SmartAgentHandle['streamChat'];
27
+ log: (e: Record<string, unknown>) => void;
28
+ healthChecker: HealthChecker;
29
+ modelProvider?: IModelProvider;
30
+ adapterMap?: Map<string, ILlmApiAdapter>;
31
+ }
32
+ export type RouteHandler = (rc: RouteContext) => Promise<void>;
33
+ export interface IRoute {
34
+ /** HTTP method(s) this route serves, or `'*'` to match any method. */
35
+ method: string | string[];
36
+ match(urlPath: string): RegExpMatchArray | boolean;
37
+ handle: RouteHandler;
38
+ }
39
+ export declare class HttpRouteTable {
40
+ private readonly routes;
41
+ add(route: IRoute): this;
42
+ dispatch(rc: RouteContext): Promise<void>;
43
+ }
44
+ //# sourceMappingURL=route-table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-table.d.ts","sourceRoot":"","sources":["../../../src/smart-agent/http/route-table.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AACjE,OAAO,KAAK,EACV,cAAc,EACd,cAAc,EACd,cAAc,EACf,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EACV,aAAa,EACb,UAAU,EACV,gBAAgB,EACjB,MAAM,8BAA8B,CAAC;AACtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGtD,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,eAAe,CAAC;IACrB,GAAG,EAAE,cAAc,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,WAAW,CAAC;IACpB,aAAa,EAAE,cAAc,CAAC;IAC9B,UAAU,EAAE,UAAU,CAAC;IACvB,IAAI,EAAE,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAC/B,UAAU,EAAE,gBAAgB,CAAC,YAAY,CAAC,CAAC;IAC3C,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAC1C,aAAa,EAAE,aAAa,CAAC;IAC7B,aAAa,CAAC,EAAE,cAAc,CAAC;IAC/B,UAAU,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAC1C;AAED,MAAM,MAAM,YAAY,GAAG,CAAC,EAAE,EAAE,YAAY,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAE/D,MAAM,WAAW,MAAM;IACrB,sEAAsE;IACtE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAC1B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,GAAG,OAAO,CAAC;IACnD,MAAM,EAAE,YAAY,CAAC;CACtB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;IAEvC,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAKlB,QAAQ,CAAC,EAAE,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;CAmBhD"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Declarative HTTP route table for SmartServer.
3
+ *
4
+ * Replaces the ~300-line if/else chain in `SmartServer._handle` with an ordered
5
+ * list of routes. Dispatch iterates the routes in registration order; the first
6
+ * route whose method AND path match handles the request. No match ⇒ 404. The
7
+ * order of `add()` calls is therefore semantically significant and MUST mirror
8
+ * the original `_handle` branch order to stay behaviour-preserving.
9
+ */
10
+ import { jsonError } from './response-helpers.js';
11
+ export class HttpRouteTable {
12
+ routes = [];
13
+ add(route) {
14
+ this.routes.push(route);
15
+ return this;
16
+ }
17
+ async dispatch(rc) {
18
+ for (const route of this.routes) {
19
+ const methodOk = route.method === '*' ||
20
+ (Array.isArray(route.method)
21
+ ? route.method.includes(rc.method)
22
+ : route.method === rc.method);
23
+ if (!methodOk)
24
+ continue;
25
+ const m = route.match(rc.urlPath);
26
+ if (m) {
27
+ await route.handle(rc);
28
+ return;
29
+ }
30
+ }
31
+ rc.res.writeHead(404, { 'Content-Type': 'application/json' });
32
+ rc.res.end(jsonError(`Cannot ${rc.method} ${rc.urlPath}`, 'invalid_request_error'));
33
+ }
34
+ }
35
+ //# sourceMappingURL=route-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-table.js","sourceRoot":"","sources":["../../../src/smart-agent/http/route-table.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAcH,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AA8BlD,MAAM,OAAO,cAAc;IACR,MAAM,GAAa,EAAE,CAAC;IAEvC,GAAG,CAAC,KAAa;QACf,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAgB;QAC7B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,QAAQ,GACZ,KAAK,CAAC,MAAM,KAAK,GAAG;gBACpB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;oBAC1B,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,CAAC;oBAClC,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,EAAE,CAAC,MAAM,CAAC,CAAC;YAClC,IAAI,CAAC,QAAQ;gBAAE,SAAS;YACxB,MAAM,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;YAClC,IAAI,CAAC,EAAE,CAAC;gBACN,MAAM,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBACvB,OAAO;YACT,CAAC;QACH,CAAC;QACD,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC9D,EAAE,CAAC,GAAG,CAAC,GAAG,CACR,SAAS,CAAC,UAAU,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,OAAO,EAAE,EAAE,uBAAuB,CAAC,CACxE,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,10 @@
1
+ import type { SessionLifecycle } from '../session-lifecycle/index.js';
2
+ import type { RouteContext } from './route-table.js';
3
+ /**
4
+ * Resolve session identity from the request cookie and mint+set a Set-Cookie
5
+ * header when a new session id was minted. Extracted verbatim from the 7×
6
+ * repeated inline block in `_buildRouteTable` / `_withSession`. Returns the
7
+ * resolved identity so callers read `resolved.identity.sessionId`.
8
+ */
9
+ export declare function resolveSessionCookie(rc: RouteContext, lifecycle: SessionLifecycle): ReturnType<SessionLifecycle['resolve']>;
10
+ //# sourceMappingURL=session-cookie.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-cookie.d.ts","sourceRoot":"","sources":["../../../src/smart-agent/http/session-cookie.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AACtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAErD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,YAAY,EAChB,SAAS,EAAE,gBAAgB,GAC1B,UAAU,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC,CASzC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Resolve session identity from the request cookie and mint+set a Set-Cookie
3
+ * header when a new session id was minted. Extracted verbatim from the 7×
4
+ * repeated inline block in `_buildRouteTable` / `_withSession`. Returns the
5
+ * resolved identity so callers read `resolved.identity.sessionId`.
6
+ */
7
+ export function resolveSessionCookie(rc, lifecycle) {
8
+ const isHttps = rc.req.socket.encrypted === true ||
9
+ rc.req.headers['x-forwarded-proto'] === 'https';
10
+ const resolved = lifecycle.resolve(rc.req.headers['cookie'], isHttps);
11
+ if (resolved.minted && resolved.setCookie) {
12
+ rc.res.setHeader('Set-Cookie', resolved.setCookie);
13
+ }
14
+ return resolved;
15
+ }
16
+ //# sourceMappingURL=session-cookie.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-cookie.js","sourceRoot":"","sources":["../../../src/smart-agent/http/session-cookie.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAClC,EAAgB,EAChB,SAA2B;IAE3B,MAAM,OAAO,GACV,EAAE,CAAC,GAAG,CAAC,MAAkC,CAAC,SAAS,KAAK,IAAI;QAC7D,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,mBAAmB,CAAC,KAAK,OAAO,CAAC;IAClD,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC,CAAC;IACtE,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC;QAC1C,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,YAAY,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;IACrD,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { KnowledgeBackend } from '@mcp-abap-adt/llm-agent-libs';
2
+ import { type SessionLifecycle } from '../session-lifecycle/index.js';
3
+ import type { ISessionMetaStore } from '../session-meta-store.js';
4
+ import type { RouteContext } from './route-table.js';
5
+ export declare function handleSessionsList(rc: RouteContext, lifecycle: SessionLifecycle | undefined, metaStore: ISessionMetaStore): Promise<void>;
6
+ export declare function handleSessionResume(rc: RouteContext, lifecycle: SessionLifecycle | undefined, metaStore: ISessionMetaStore): Promise<void>;
7
+ export declare function handleSessionDelete(rc: RouteContext, lifecycle: SessionLifecycle | undefined, metaStore: ISessionMetaStore, knowledgeBackend: KnowledgeBackend | undefined): Promise<void>;
8
+ //# sourceMappingURL=sessions-route-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions-route-handler.d.ts","sourceRoot":"","sources":["../../../src/smart-agent/http/sessions-route-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AACrE,OAAO,EAIL,KAAK,gBAAgB,EACtB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGrD,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,YAAY,EAChB,SAAS,EAAE,gBAAgB,GAAG,SAAS,EACvC,SAAS,EAAE,iBAAiB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAWf;AAED,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,YAAY,EAChB,SAAS,EAAE,gBAAgB,GAAG,SAAS,EACvC,SAAS,EAAE,iBAAiB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAef;AAED,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,YAAY,EAChB,SAAS,EAAE,gBAAgB,GAAG,SAAS,EACvC,SAAS,EAAE,iBAAiB,EAC5B,gBAAgB,EAAE,gBAAgB,GAAG,SAAS,GAC7C,OAAO,CAAC,IAAI,CAAC,CAwBf"}
@@ -0,0 +1,54 @@
1
+ import { handleDeleteSession, handleListSessions, handleResumeSession, } from '../session-lifecycle/index.js';
2
+ import { jsonError } from './response-helpers.js';
3
+ import { resolveSessionCookie } from './session-cookie.js';
4
+ export async function handleSessionsList(rc, lifecycle, metaStore) {
5
+ if (!lifecycle) {
6
+ rc.res.writeHead(500, { 'Content-Type': 'application/json' });
7
+ rc.res.end(jsonError('Session lifecycle not initialized', 'server_error'));
8
+ return;
9
+ }
10
+ const resolved = resolveSessionCookie(rc, lifecycle);
11
+ const identity = resolved.identity.sessionId;
12
+ const body = await handleListSessions(metaStore, identity);
13
+ rc.res.writeHead(200, { 'Content-Type': 'application/json' });
14
+ rc.res.end(JSON.stringify(body));
15
+ }
16
+ export async function handleSessionResume(rc, lifecycle, metaStore) {
17
+ const resumeMatch = rc.urlPath.match(/^\/v1\/sessions\/([^/]+)\/resume$/);
18
+ if (!resumeMatch)
19
+ return;
20
+ const sessionId = resumeMatch[1];
21
+ if (!lifecycle) {
22
+ rc.res.writeHead(500, { 'Content-Type': 'application/json' });
23
+ rc.res.end(jsonError('Session lifecycle not initialized', 'server_error'));
24
+ return;
25
+ }
26
+ const resolved = resolveSessionCookie(rc, lifecycle);
27
+ const identity = resolved.identity.sessionId;
28
+ const body = await handleResumeSession(metaStore, identity, sessionId);
29
+ const status = body.ok ? 200 : 404;
30
+ rc.res.writeHead(status, { 'Content-Type': 'application/json' });
31
+ rc.res.end(JSON.stringify(body));
32
+ }
33
+ export async function handleSessionDelete(rc, lifecycle, metaStore, knowledgeBackend) {
34
+ const deleteMatch = rc.urlPath.match(/^\/v1\/sessions\/([^/]+)$/);
35
+ if (!deleteMatch)
36
+ return;
37
+ const sessionId = deleteMatch[1];
38
+ if (!lifecycle) {
39
+ rc.res.writeHead(500, { 'Content-Type': 'application/json' });
40
+ rc.res.end(jsonError('Session lifecycle not initialized', 'server_error'));
41
+ return;
42
+ }
43
+ const resolved = resolveSessionCookie(rc, lifecycle);
44
+ const identity = resolved.identity.sessionId;
45
+ const evictFn = async (sid) => {
46
+ await lifecycle.registry.evictOne(sid);
47
+ await knowledgeBackend?.deleteSession(sid);
48
+ };
49
+ const body = await handleDeleteSession(metaStore, identity, sessionId, evictFn);
50
+ const status = body.ok ? 200 : 404;
51
+ rc.res.writeHead(status, { 'Content-Type': 'application/json' });
52
+ rc.res.end(JSON.stringify(body));
53
+ }
54
+ //# sourceMappingURL=sessions-route-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sessions-route-handler.js","sourceRoot":"","sources":["../../../src/smart-agent/http/sessions-route-handler.ts"],"names":[],"mappings":"AACA,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,mBAAmB,GAEpB,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,EAAgB,EAChB,SAAuC,EACvC,SAA4B;IAE5B,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC9D,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,mCAAmC,EAAE,cAAc,CAAC,CAAC,CAAC;QAC3E,OAAO;IACT,CAAC;IACD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC7C,MAAM,IAAI,GAAG,MAAM,kBAAkB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC3D,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC9D,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,EAAgB,EAChB,SAAuC,EACvC,SAA4B;IAE5B,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAC1E,IAAI,CAAC,WAAW;QAAE,OAAO;IACzB,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC9D,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,mCAAmC,EAAE,cAAc,CAAC,CAAC,CAAC;QAC3E,OAAO;IACT,CAAC;IACD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC7C,MAAM,IAAI,GAAG,MAAM,mBAAmB,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IACvE,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACnC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;IACjE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,EAAgB,EAChB,SAAuC,EACvC,SAA4B,EAC5B,gBAA8C;IAE9C,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAClE,IAAI,CAAC,WAAW;QAAE,OAAO;IACzB,MAAM,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IACjC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC9D,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,mCAAmC,EAAE,cAAc,CAAC,CAAC,CAAC;QAC3E,OAAO;IACT,CAAC;IACD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC7C,MAAM,OAAO,GAAG,KAAK,EAAE,GAAW,EAAE,EAAE;QACpC,MAAM,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,gBAAgB,EAAE,aAAa,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,MAAM,mBAAmB,CACpC,SAAS,EACT,QAAQ,EACR,SAAS,EACT,OAAO,CACR,CAAC;IACF,MAAM,MAAM,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IACnC,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;IACjE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { SessionLifecycle } from '../session-lifecycle/index.js';
2
+ import type { RouteContext } from './route-table.js';
3
+ /**
4
+ * GET /v1/usage — return per-session token-usage summary.
5
+ *
6
+ * Body moved verbatim from `SmartServer._buildRouteTable` (route index 2).
7
+ * `rc.server._lifecycle` (private) is threaded as the `lifecycle` param so the
8
+ * free function compiles without accessing private class fields.
9
+ * The inline cookie block is replaced with `resolveSessionCookie(rc, lifecycle)`.
10
+ */
11
+ export declare function handleUsageRoute(rc: RouteContext, lifecycle: SessionLifecycle | undefined): Promise<void>;
12
+ //# sourceMappingURL=usage-route-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-route-handler.d.ts","sourceRoot":"","sources":["../../../src/smart-agent/http/usage-route-handler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAGrD;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,EAAE,EAAE,YAAY,EAChB,SAAS,EAAE,gBAAgB,GAAG,SAAS,GACtC,OAAO,CAAC,IAAI,CAAC,CAef"}
@@ -0,0 +1,28 @@
1
+ import { jsonError } from './response-helpers.js';
2
+ import { resolveSessionCookie } from './session-cookie.js';
3
+ /**
4
+ * GET /v1/usage — return per-session token-usage summary.
5
+ *
6
+ * Body moved verbatim from `SmartServer._buildRouteTable` (route index 2).
7
+ * `rc.server._lifecycle` (private) is threaded as the `lifecycle` param so the
8
+ * free function compiles without accessing private class fields.
9
+ * The inline cookie block is replaced with `resolveSessionCookie(rc, lifecycle)`.
10
+ */
11
+ export async function handleUsageRoute(rc, lifecycle) {
12
+ if (!lifecycle) {
13
+ rc.res.writeHead(500, { 'Content-Type': 'application/json' });
14
+ rc.res.end(jsonError('Session lifecycle not initialized', 'server_error'));
15
+ return;
16
+ }
17
+ const resolved = resolveSessionCookie(rc, lifecycle);
18
+ const sessionId = resolved.identity.sessionId;
19
+ const graph = await lifecycle.acquire(sessionId);
20
+ try {
21
+ rc.res.writeHead(200, { 'Content-Type': 'application/json' });
22
+ rc.res.end(JSON.stringify(graph.logger.getSummary()));
23
+ }
24
+ finally {
25
+ lifecycle.release(sessionId, graph);
26
+ }
27
+ }
28
+ //# sourceMappingURL=usage-route-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usage-route-handler.js","sourceRoot":"","sources":["../../../src/smart-agent/http/usage-route-handler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAE3D;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,EAAgB,EAChB,SAAuC;IAEvC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC9D,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,mCAAmC,EAAE,cAAc,CAAC,CAAC,CAAC;QAC3E,OAAO;IACT,CAAC;IACD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,EAAE,EAAE,SAAS,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC;IAC9C,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACjD,IAAI,CAAC;QACH,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAC9D,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC;YAAS,CAAC;QACT,SAAS,CAAC,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ import type { IEmbedder } from '@mcp-abap-adt/llm-agent';
2
+ import { type KnowledgeBackend } from '@mcp-abap-adt/llm-agent-libs';
3
+ /**
4
+ * Build the ONE knowledge backend shared across all requests (JSONL when a
5
+ * logDir is set, else in-memory). When an embedder is provided, an
6
+ * embedder-backed semantic index is attached so recall ranks by meaning.
7
+ * Pure factory — no MCP dependency, safe to call before MCP resolves.
8
+ */
9
+ export declare function makeKnowledgeBackend(input: {
10
+ logDir?: string;
11
+ embedder?: IEmbedder;
12
+ }): KnowledgeBackend;
13
+ //# sourceMappingURL=make-knowledge-backend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"make-knowledge-backend.d.ts","sourceRoot":"","sources":["../../../src/smart-agent/knowledge/make-knowledge-backend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,8BAA8B,CAAC;AAItC;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB,GAAG,gBAAgB,CAOnB"}
@@ -0,0 +1,18 @@
1
+ import { InMemoryKnowledgeBackend, } from '@mcp-abap-adt/llm-agent-libs';
2
+ import { makeKnowledgeSemanticIndex } from '../embedder-knowledge-index.js';
3
+ import { JsonlKnowledgeBackend } from '../jsonl-knowledge-backend.js';
4
+ /**
5
+ * Build the ONE knowledge backend shared across all requests (JSONL when a
6
+ * logDir is set, else in-memory). When an embedder is provided, an
7
+ * embedder-backed semantic index is attached so recall ranks by meaning.
8
+ * Pure factory — no MCP dependency, safe to call before MCP resolves.
9
+ */
10
+ export function makeKnowledgeBackend(input) {
11
+ const semantic = input.embedder
12
+ ? makeKnowledgeSemanticIndex(input.embedder)
13
+ : undefined;
14
+ return input.logDir
15
+ ? new JsonlKnowledgeBackend(input.logDir, semantic)
16
+ : new InMemoryKnowledgeBackend(semantic);
17
+ }
18
+ //# sourceMappingURL=make-knowledge-backend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"make-knowledge-backend.js","sourceRoot":"","sources":["../../../src/smart-agent/knowledge/make-knowledge-backend.ts"],"names":[],"mappings":"AACA,OAAO,EACL,wBAAwB,GAEzB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,0BAA0B,EAAE,MAAM,gCAAgC,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAEtE;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAGpC;IACC,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ;QAC7B,CAAC,CAAC,0BAA0B,CAAC,KAAK,CAAC,QAAQ,CAAC;QAC5C,CAAC,CAAC,SAAS,CAAC;IACd,OAAO,KAAK,CAAC,MAAM;QACjB,CAAC,CAAC,IAAI,qBAAqB,CAAC,KAAK,CAAC,MAAM,EAAE,QAAQ,CAAC;QACnD,CAAC,CAAC,IAAI,wBAAwB,CAAC,QAAQ,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,30 @@
1
+ import type { ILlm } from '@mcp-abap-adt/llm-agent';
2
+ import { type NormalizedLlmMap } from '../config.js';
3
+ import type { SmartServerLlmConfig } from '../smart-server.js';
4
+ /** The real `makeLlm`-backed construction (the SmartServer seam's default). */
5
+ export declare function makeDefaultRoleLlm(lc: SmartServerLlmConfig, mainTemp: number | undefined): Promise<ILlm>;
6
+ export interface IRoleLlmResolver {
7
+ resolve(role: string): Promise<ILlm>;
8
+ makeLlm(lc: SmartServerLlmConfig): Promise<ILlm>;
9
+ }
10
+ export interface RoleLlmResolverDeps {
11
+ getMain(): ILlm | undefined;
12
+ getHelper(): ILlm | undefined;
13
+ getClassifier(): ILlm | undefined;
14
+ getLlmMap(): NormalizedLlmMap | undefined;
15
+ getPipelineFallback(): SmartServerLlmConfig | undefined;
16
+ makeLlm(lc: SmartServerLlmConfig): Promise<ILlm>;
17
+ }
18
+ /**
19
+ * Resolve a per-role LLM through the normalized map → pipelineFallback chain.
20
+ * Reads the role LLM instances through LIVE accessors so a config-reload
21
+ * hot-swap of `main`/`helper`/`classifier` is observed transparently (the
22
+ * SmartServer keeps the fields as source-of-truth).
23
+ */
24
+ export declare class RoleLlmResolver implements IRoleLlmResolver {
25
+ private readonly deps;
26
+ constructor(deps: RoleLlmResolverDeps);
27
+ makeLlm(lc: SmartServerLlmConfig): Promise<ILlm>;
28
+ resolve(role: string): Promise<ILlm>;
29
+ }
30
+ //# sourceMappingURL=role-llm-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-llm-resolver.d.ts","sourceRoot":"","sources":["../../../src/smart-agent/llm/role-llm-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAEpD,OAAO,EAAE,KAAK,gBAAgB,EAAoB,MAAM,cAAc,CAAC;AACvE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAE/D,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAChC,EAAE,EAAE,oBAAoB,EACxB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,OAAO,CAAC,IAAI,CAAC,CAUf;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,OAAO,CAAC,EAAE,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClD;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,IAAI,IAAI,GAAG,SAAS,CAAC;IAC5B,SAAS,IAAI,IAAI,GAAG,SAAS,CAAC;IAC9B,aAAa,IAAI,IAAI,GAAG,SAAS,CAAC;IAClC,SAAS,IAAI,gBAAgB,GAAG,SAAS,CAAC;IAC1C,mBAAmB,IAAI,oBAAoB,GAAG,SAAS,CAAC;IACxD,OAAO,CAAC,EAAE,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClD;AAED;;;;;GAKG;AACH,qBAAa,eAAgB,YAAW,gBAAgB;IAC1C,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,mBAAmB;IAEtD,OAAO,CAAC,EAAE,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1C,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAgB3C"}
@@ -0,0 +1,44 @@
1
+ import { makeLlm } from '@mcp-abap-adt/llm-agent-libs';
2
+ import { resolveLlmConfig } from '../config.js';
3
+ /** The real `makeLlm`-backed construction (the SmartServer seam's default). */
4
+ export function makeDefaultRoleLlm(lc, mainTemp) {
5
+ return makeLlm({
6
+ provider: lc.provider ?? 'deepseek',
7
+ apiKey: lc.apiKey,
8
+ baseURL: lc.url,
9
+ model: lc.model,
10
+ }, Number(lc.temperature ?? mainTemp ?? 0.7));
11
+ }
12
+ /**
13
+ * Resolve a per-role LLM through the normalized map → pipelineFallback chain.
14
+ * Reads the role LLM instances through LIVE accessors so a config-reload
15
+ * hot-swap of `main`/`helper`/`classifier` is observed transparently (the
16
+ * SmartServer keeps the fields as source-of-truth).
17
+ */
18
+ export class RoleLlmResolver {
19
+ deps;
20
+ constructor(deps) {
21
+ this.deps = deps;
22
+ }
23
+ makeLlm(lc) {
24
+ return this.deps.makeLlm(lc);
25
+ }
26
+ async resolve(role) {
27
+ const main = this.deps.getMain();
28
+ const helper = this.deps.getHelper();
29
+ const classifier = this.deps.getClassifier();
30
+ if (role === 'main' && main)
31
+ return main;
32
+ if ((role === 'helper' || role === 'planner') && helper)
33
+ return helper;
34
+ if (role === 'classifier' && classifier)
35
+ return classifier;
36
+ const cfg = resolveLlmConfig(this.deps.getLlmMap(), role, this.deps.getPipelineFallback());
37
+ if (cfg)
38
+ return this.deps.makeLlm(cfg);
39
+ if (main)
40
+ return main;
41
+ throw new Error(`cannot resolve LLM for role '${role}': no config`);
42
+ }
43
+ }
44
+ //# sourceMappingURL=role-llm-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-llm-resolver.js","sourceRoot":"","sources":["../../../src/smart-agent/llm/role-llm-resolver.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,8BAA8B,CAAC;AACvD,OAAO,EAAyB,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGvE,+EAA+E;AAC/E,MAAM,UAAU,kBAAkB,CAChC,EAAwB,EACxB,QAA4B;IAE5B,OAAO,OAAO,CACZ;QACE,QAAQ,EAAE,EAAE,CAAC,QAAQ,IAAI,UAAU;QACnC,MAAM,EAAE,EAAE,CAAC,MAAM;QACjB,OAAO,EAAE,EAAE,CAAC,GAAG;QACf,KAAK,EAAE,EAAE,CAAC,KAAK;KAChB,EACD,MAAM,CAAC,EAAE,CAAC,WAAW,IAAI,QAAQ,IAAI,GAAG,CAAC,CAC1C,CAAC;AACJ,CAAC;AAgBD;;;;;GAKG;AACH,MAAM,OAAO,eAAe;IACG;IAA7B,YAA6B,IAAyB;QAAzB,SAAI,GAAJ,IAAI,CAAqB;IAAG,CAAC;IAE1D,OAAO,CAAC,EAAwB;QAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,IAAY;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACjC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;QACrC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;QAC7C,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;QACzC,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,SAAS,CAAC,IAAI,MAAM;YAAE,OAAO,MAAM,CAAC;QACvE,IAAI,IAAI,KAAK,YAAY,IAAI,UAAU;YAAE,OAAO,UAAU,CAAC;QAC3D,MAAM,GAAG,GAAG,gBAAgB,CAC1B,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,EACrB,IAAI,EACJ,IAAI,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAChC,CAAC;QACF,IAAI,GAAG;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,cAAc,CAAC,CAAC;IACtE,CAAC;CACF"}
@@ -0,0 +1,38 @@
1
+ import type { SmartServerLlmConfig } from './smart-server.js';
2
+ export type LlmConfigMap = Record<string, SmartServerLlmConfig>;
3
+ export type NormalizedLlmMap = {
4
+ main: SmartServerLlmConfig;
5
+ } & LlmConfigMap;
6
+ /**
7
+ * Normalize the optional top-level `llm:` block.
8
+ * - undefined → undefined (pipeline-only configs stay valid)
9
+ * - flat shape (has `provider` | `apiKey` | `model` | `url`) → { main: flat } (backward compat)
10
+ * - map shape → must include `main`; returned as NormalizedLlmMap
11
+ */
12
+ export declare function normalizeLlmConfig(input?: SmartServerLlmConfig | LlmConfigMap): NormalizedLlmMap | undefined;
13
+ /**
14
+ * Strict lookup: returns map[name] if explicitly present, else undefined.
15
+ * Does NOT fall through to map.main. Use when the caller needs to
16
+ * detect explicit-presence (e.g. to decide between an alias and the
17
+ * named map entry).
18
+ */
19
+ export declare function resolveLlmConfigStrict(map: NormalizedLlmMap | undefined, name: string | undefined): SmartServerLlmConfig | undefined;
20
+ /**
21
+ * Resolve a per-role LLM config by name from a normalized map.
22
+ * Lookup chain: map[name] → map.main → pipelineFallback.
23
+ * When map is undefined, falls back to pipelineFallback (so pipeline-only
24
+ * configs keep working with no top-level llm: block).
25
+ *
26
+ * The caller decides whether `undefined` is an error.
27
+ */
28
+ export declare function resolveLlmConfig(map: NormalizedLlmMap | undefined, name?: string, pipelineFallback?: SmartServerLlmConfig): SmartServerLlmConfig | undefined;
29
+ /**
30
+ * Read the reviewer block's LLM-name selector, accepting both the
31
+ * preferred `reviewerLlm` field and the deprecated `plannerLlm` alias.
32
+ * When the alias is used, calls `warn(message)`.
33
+ */
34
+ export declare function resolveReviewerLlmName(block: {
35
+ reviewerLlm?: string;
36
+ plannerLlm?: string;
37
+ } | undefined, warn: (msg: string) => void): string | undefined;
38
+ //# sourceMappingURL=llm-config-map.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"llm-config-map.d.ts","sourceRoot":"","sources":["../../src/smart-agent/llm-config-map.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAE9D,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;AAChE,MAAM,MAAM,gBAAgB,GAAG;IAAE,IAAI,EAAE,oBAAoB,CAAA;CAAE,GAAG,YAAY,CAAC;AAmB7E;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,CAAC,EAAE,oBAAoB,GAAG,YAAY,GAC1C,gBAAgB,GAAG,SAAS,CAY9B;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,gBAAgB,GAAG,SAAS,EACjC,IAAI,EAAE,MAAM,GAAG,SAAS,GACvB,oBAAoB,GAAG,SAAS,CAGlC;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,gBAAgB,GAAG,SAAS,EACjC,IAAI,CAAC,EAAE,MAAM,EACb,gBAAgB,CAAC,EAAE,oBAAoB,GACtC,oBAAoB,GAAG,SAAS,CAIlC;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE;IAAE,WAAW,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,EAChE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GAC1B,MAAM,GAAG,SAAS,CAUpB"}