@mcp-abap-adt/llm-agent-server-libs 19.2.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.
- package/dist/builders/controller-skill-pipeline-builder.d.ts +57 -0
- package/dist/builders/controller-skill-pipeline-builder.d.ts.map +1 -0
- package/dist/builders/controller-skill-pipeline-builder.js +175 -0
- package/dist/builders/controller-skill-pipeline-builder.js.map +1 -0
- package/dist/factories/controller-factory.d.ts +2 -2
- package/dist/factories/controller-factory.d.ts.map +1 -1
- package/dist/factories/controller-factory.js +2 -1
- package/dist/factories/controller-factory.js.map +1 -1
- package/dist/generated/version.d.ts +1 -1
- package/dist/generated/version.js +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/pipelines/controller.d.ts +4 -2
- package/dist/pipelines/controller.d.ts.map +1 -1
- package/dist/pipelines/controller.js +33 -8
- package/dist/pipelines/controller.js.map +1 -1
- package/dist/pipelines/coordinator-resolvers.d.ts +68 -0
- package/dist/pipelines/coordinator-resolvers.d.ts.map +1 -0
- package/dist/pipelines/coordinator-resolvers.js +97 -0
- package/dist/pipelines/coordinator-resolvers.js.map +1 -0
- package/dist/pipelines/dag.d.ts +2 -2
- package/dist/pipelines/dag.js +2 -2
- package/dist/pipelines/parsers.d.ts +1 -1
- package/dist/pipelines/parsers.d.ts.map +1 -1
- package/dist/pipelines/parsers.js +5 -4
- package/dist/pipelines/parsers.js.map +1 -1
- package/dist/pipelines/register-skill-sources.d.ts.map +1 -1
- package/dist/pipelines/register-skill-sources.js +5 -0
- package/dist/pipelines/register-skill-sources.js.map +1 -1
- package/dist/pipelines/stepper.d.ts +2 -2
- package/dist/pipelines/stepper.js +2 -2
- package/dist/smart-agent/build-stepper-root.d.ts +3 -2
- package/dist/smart-agent/build-stepper-root.d.ts.map +1 -1
- package/dist/smart-agent/build-stepper-root.js +2 -1
- package/dist/smart-agent/build-stepper-root.js.map +1 -1
- package/dist/smart-agent/config-reload-watcher.d.ts +30 -0
- package/dist/smart-agent/config-reload-watcher.d.ts.map +1 -0
- package/dist/smart-agent/config-reload-watcher.js +101 -0
- package/dist/smart-agent/config-reload-watcher.js.map +1 -0
- package/dist/smart-agent/config-validator.d.ts +21 -0
- package/dist/smart-agent/config-validator.d.ts.map +1 -0
- package/dist/smart-agent/config-validator.js +196 -0
- package/dist/smart-agent/config-validator.js.map +1 -0
- package/dist/smart-agent/config.d.ts +16 -254
- package/dist/smart-agent/config.d.ts.map +1 -1
- package/dist/smart-agent/config.js +17 -904
- package/dist/smart-agent/config.js.map +1 -1
- package/dist/smart-agent/controller/board.d.ts +6 -3
- package/dist/smart-agent/controller/board.d.ts.map +1 -1
- package/dist/smart-agent/controller/board.js +21 -0
- package/dist/smart-agent/controller/board.js.map +1 -1
- package/dist/smart-agent/controller/controller-coordinator-handler.d.ts +16 -50
- package/dist/smart-agent/controller/controller-coordinator-handler.d.ts.map +1 -1
- package/dist/smart-agent/controller/controller-coordinator-handler.js +83 -371
- package/dist/smart-agent/controller/controller-coordinator-handler.js.map +1 -1
- package/dist/smart-agent/controller/finalizer.d.ts +5 -0
- package/dist/smart-agent/controller/finalizer.d.ts.map +1 -1
- package/dist/smart-agent/controller/finalizer.js +12 -5
- package/dist/smart-agent/controller/finalizer.js.map +1 -1
- package/dist/smart-agent/controller/parser.d.ts +11 -0
- package/dist/smart-agent/controller/parser.d.ts.map +1 -0
- package/dist/smart-agent/controller/parser.js +77 -0
- package/dist/smart-agent/controller/parser.js.map +1 -0
- package/dist/smart-agent/controller/planner.d.ts +20 -16
- package/dist/smart-agent/controller/planner.d.ts.map +1 -1
- package/dist/smart-agent/controller/planner.js +58 -64
- package/dist/smart-agent/controller/planner.js.map +1 -1
- package/dist/smart-agent/controller/recall.d.ts +48 -0
- package/dist/smart-agent/controller/recall.d.ts.map +1 -0
- package/dist/smart-agent/controller/recall.js +196 -0
- package/dist/smart-agent/controller/recall.js.map +1 -0
- package/dist/smart-agent/controller/reviewer.d.ts.map +1 -1
- package/dist/smart-agent/controller/reviewer.js +1 -1
- package/dist/smart-agent/controller/reviewer.js.map +1 -1
- package/dist/smart-agent/controller/types.d.ts +8 -9
- package/dist/smart-agent/controller/types.d.ts.map +1 -1
- package/dist/smart-agent/controller/usage-logging.d.ts +16 -0
- package/dist/smart-agent/controller/usage-logging.d.ts.map +1 -0
- package/dist/smart-agent/controller/usage-logging.js +39 -0
- package/dist/smart-agent/controller/usage-logging.js.map +1 -0
- package/dist/smart-agent/http/adapter-route-handler.d.ts +13 -0
- package/dist/smart-agent/http/adapter-route-handler.d.ts.map +1 -0
- package/dist/smart-agent/http/adapter-route-handler.js +76 -0
- package/dist/smart-agent/http/adapter-route-handler.js.map +1 -0
- package/dist/smart-agent/http/chat-route-handler.d.ts +15 -0
- package/dist/smart-agent/http/chat-route-handler.d.ts.map +1 -0
- package/dist/smart-agent/http/chat-route-handler.js +327 -0
- package/dist/smart-agent/http/chat-route-handler.js.map +1 -0
- package/dist/smart-agent/http/config-route-handler.d.ts +21 -0
- package/dist/smart-agent/http/config-route-handler.d.ts.map +1 -0
- package/dist/smart-agent/http/config-route-handler.js +149 -0
- package/dist/smart-agent/http/config-route-handler.js.map +1 -0
- package/dist/smart-agent/http/health-route-handler.d.ts +12 -0
- package/dist/smart-agent/http/health-route-handler.d.ts.map +1 -0
- package/dist/smart-agent/http/health-route-handler.js +19 -0
- package/dist/smart-agent/http/health-route-handler.js.map +1 -0
- package/dist/smart-agent/http/models-route-handler.d.ts +17 -0
- package/dist/smart-agent/http/models-route-handler.d.ts.map +1 -0
- package/dist/smart-agent/http/models-route-handler.js +65 -0
- package/dist/smart-agent/http/models-route-handler.js.map +1 -0
- package/dist/smart-agent/http/response-helpers.d.ts +31 -0
- package/dist/smart-agent/http/response-helpers.d.ts.map +1 -0
- package/dist/smart-agent/http/response-helpers.js +59 -0
- package/dist/smart-agent/http/response-helpers.js.map +1 -0
- package/dist/smart-agent/http/route-table.d.ts +44 -0
- package/dist/smart-agent/http/route-table.d.ts.map +1 -0
- package/dist/smart-agent/http/route-table.js +35 -0
- package/dist/smart-agent/http/route-table.js.map +1 -0
- package/dist/smart-agent/http/session-cookie.d.ts +10 -0
- package/dist/smart-agent/http/session-cookie.d.ts.map +1 -0
- package/dist/smart-agent/http/session-cookie.js +16 -0
- package/dist/smart-agent/http/session-cookie.js.map +1 -0
- package/dist/smart-agent/http/sessions-route-handler.d.ts +8 -0
- package/dist/smart-agent/http/sessions-route-handler.d.ts.map +1 -0
- package/dist/smart-agent/http/sessions-route-handler.js +54 -0
- package/dist/smart-agent/http/sessions-route-handler.js.map +1 -0
- package/dist/smart-agent/http/usage-route-handler.d.ts +12 -0
- package/dist/smart-agent/http/usage-route-handler.d.ts.map +1 -0
- package/dist/smart-agent/http/usage-route-handler.js +28 -0
- package/dist/smart-agent/http/usage-route-handler.js.map +1 -0
- package/dist/smart-agent/knowledge/make-knowledge-backend.d.ts +13 -0
- package/dist/smart-agent/knowledge/make-knowledge-backend.d.ts.map +1 -0
- package/dist/smart-agent/knowledge/make-knowledge-backend.js +18 -0
- package/dist/smart-agent/knowledge/make-knowledge-backend.js.map +1 -0
- package/dist/smart-agent/llm/role-llm-resolver.d.ts +30 -0
- package/dist/smart-agent/llm/role-llm-resolver.d.ts.map +1 -0
- package/dist/smart-agent/llm/role-llm-resolver.js +44 -0
- package/dist/smart-agent/llm/role-llm-resolver.js.map +1 -0
- package/dist/smart-agent/llm-config-map.d.ts +38 -0
- package/dist/smart-agent/llm-config-map.d.ts.map +1 -0
- package/dist/smart-agent/llm-config-map.js +75 -0
- package/dist/smart-agent/llm-config-map.js.map +1 -0
- package/dist/smart-agent/mcp-readiness-monitor.d.ts +38 -0
- package/dist/smart-agent/mcp-readiness-monitor.d.ts.map +1 -0
- package/dist/smart-agent/mcp-readiness-monitor.js +81 -0
- package/dist/smart-agent/mcp-readiness-monitor.js.map +1 -0
- package/dist/smart-agent/mcp-readiness-registry.d.ts +37 -0
- package/dist/smart-agent/mcp-readiness-registry.d.ts.map +1 -0
- package/dist/smart-agent/mcp-readiness-registry.js +55 -0
- package/dist/smart-agent/mcp-readiness-registry.js.map +1 -0
- package/dist/smart-agent/resolve-config-sections.d.ts +15 -0
- package/dist/smart-agent/resolve-config-sections.d.ts.map +1 -0
- package/dist/smart-agent/resolve-config-sections.js +212 -0
- package/dist/smart-agent/resolve-config-sections.js.map +1 -0
- package/dist/smart-agent/session-lifecycle/index.d.ts +117 -0
- package/dist/smart-agent/session-lifecycle/index.d.ts.map +1 -0
- package/dist/smart-agent/session-lifecycle/index.js +152 -0
- package/dist/smart-agent/session-lifecycle/index.js.map +1 -0
- package/dist/smart-agent/skill-plugins-config.d.ts +9 -1
- package/dist/smart-agent/skill-plugins-config.d.ts.map +1 -1
- package/dist/smart-agent/skill-plugins-config.js +27 -1
- package/dist/smart-agent/skill-plugins-config.js.map +1 -1
- package/dist/smart-agent/skill-plugins-host-factory.d.ts +14 -2
- package/dist/smart-agent/skill-plugins-host-factory.d.ts.map +1 -1
- package/dist/smart-agent/skill-plugins-host-factory.js +16 -4
- package/dist/smart-agent/skill-plugins-host-factory.js.map +1 -1
- package/dist/smart-agent/smart-server.d.ts +151 -222
- package/dist/smart-agent/smart-server.d.ts.map +1 -1
- package/dist/smart-agent/smart-server.js +529 -1385
- package/dist/smart-agent/smart-server.js.map +1 -1
- package/dist/smart-agent/stepper-config.d.ts +138 -0
- package/dist/smart-agent/stepper-config.d.ts.map +1 -0
- package/dist/smart-agent/stepper-config.js +216 -0
- package/dist/smart-agent/stepper-config.js.map +1 -0
- package/dist/smart-agent/tools-rag-handle.d.ts +10 -0
- package/dist/smart-agent/tools-rag-handle.d.ts.map +1 -0
- package/dist/smart-agent/tools-rag-handle.js +76 -0
- package/dist/smart-agent/tools-rag-handle.js.map +1 -0
- package/dist/smart-agent/workers/worker-registry.d.ts +159 -0
- package/dist/smart-agent/workers/worker-registry.d.ts.map +1 -0
- package/dist/smart-agent/workers/worker-registry.js +203 -0
- package/dist/smart-agent/workers/worker-registry.js.map +1 -0
- package/dist/smart-agent/yaml-loader.d.ts +7 -0
- package/dist/smart-agent/yaml-loader.d.ts.map +1 -0
- package/dist/smart-agent/yaml-loader.js +146 -0
- package/dist/smart-agent/yaml-loader.js.map +1 -0
- package/package.json +7 -7
|
@@ -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"}
|
|
@@ -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":"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"}
|
|
@@ -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"}
|