@mcp-abap-adt/llm-agent 11.1.2 → 12.0.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 (98) hide show
  1. package/README.md +9 -2
  2. package/dist/adapters/cline-client-adapter.d.ts +18 -0
  3. package/dist/adapters/cline-client-adapter.d.ts.map +1 -0
  4. package/dist/adapters/cline-client-adapter.js +21 -0
  5. package/dist/adapters/cline-client-adapter.js.map +1 -0
  6. package/dist/api-adapters/anthropic-adapter.d.ts +10 -0
  7. package/dist/api-adapters/anthropic-adapter.d.ts.map +1 -0
  8. package/dist/api-adapters/anthropic-adapter.js +356 -0
  9. package/dist/api-adapters/anthropic-adapter.js.map +1 -0
  10. package/dist/api-adapters/index.d.ts +3 -0
  11. package/dist/api-adapters/index.d.ts.map +1 -0
  12. package/dist/api-adapters/index.js +3 -0
  13. package/dist/api-adapters/index.js.map +1 -0
  14. package/dist/api-adapters/openai-adapter.d.ts +10 -0
  15. package/dist/api-adapters/openai-adapter.d.ts.map +1 -0
  16. package/dist/api-adapters/openai-adapter.js +277 -0
  17. package/dist/api-adapters/openai-adapter.js.map +1 -0
  18. package/dist/cache/index.d.ts +4 -0
  19. package/dist/cache/index.d.ts.map +1 -0
  20. package/dist/cache/index.js +3 -0
  21. package/dist/cache/index.js.map +1 -0
  22. package/dist/cache/noop-tool-cache.d.ts +7 -0
  23. package/dist/cache/noop-tool-cache.d.ts.map +1 -0
  24. package/dist/cache/noop-tool-cache.js +8 -0
  25. package/dist/cache/noop-tool-cache.js.map +1 -0
  26. package/dist/cache/tool-cache.d.ts +14 -0
  27. package/dist/cache/tool-cache.d.ts.map +1 -0
  28. package/dist/cache/tool-cache.js +32 -0
  29. package/dist/cache/tool-cache.js.map +1 -0
  30. package/dist/cache/types.d.ts +7 -0
  31. package/dist/cache/types.d.ts.map +1 -0
  32. package/dist/cache/types.js +2 -0
  33. package/dist/cache/types.js.map +1 -0
  34. package/dist/external-tools-normalizer.d.ts +15 -0
  35. package/dist/external-tools-normalizer.d.ts.map +1 -0
  36. package/dist/external-tools-normalizer.js +146 -0
  37. package/dist/external-tools-normalizer.js.map +1 -0
  38. package/dist/index.d.ts +18 -0
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +21 -0
  41. package/dist/index.js.map +1 -1
  42. package/dist/interfaces/api-adapter.d.ts +36 -0
  43. package/dist/interfaces/api-adapter.d.ts.map +1 -0
  44. package/dist/interfaces/api-adapter.js +9 -0
  45. package/dist/interfaces/api-adapter.js.map +1 -0
  46. package/dist/interfaces/client-adapter.d.ts +23 -0
  47. package/dist/interfaces/client-adapter.d.ts.map +1 -0
  48. package/dist/interfaces/client-adapter.js +10 -0
  49. package/dist/interfaces/client-adapter.js.map +1 -0
  50. package/dist/logger/types.d.ts +63 -0
  51. package/dist/logger/types.d.ts.map +1 -0
  52. package/dist/logger/types.js +2 -0
  53. package/dist/logger/types.js.map +1 -0
  54. package/dist/policy/fallback-llm-call-strategy.d.ts +16 -0
  55. package/dist/policy/fallback-llm-call-strategy.d.ts.map +1 -0
  56. package/dist/policy/fallback-llm-call-strategy.js +66 -0
  57. package/dist/policy/fallback-llm-call-strategy.js.map +1 -0
  58. package/dist/policy/index.d.ts +4 -0
  59. package/dist/policy/index.d.ts.map +1 -0
  60. package/dist/policy/index.js +4 -0
  61. package/dist/policy/index.js.map +1 -0
  62. package/dist/policy/non-streaming-llm-call-strategy.d.ts +6 -0
  63. package/dist/policy/non-streaming-llm-call-strategy.d.ts.map +1 -0
  64. package/dist/policy/non-streaming-llm-call-strategy.js +21 -0
  65. package/dist/policy/non-streaming-llm-call-strategy.js.map +1 -0
  66. package/dist/policy/streaming-llm-call-strategy.d.ts +6 -0
  67. package/dist/policy/streaming-llm-call-strategy.d.ts.map +1 -0
  68. package/dist/policy/streaming-llm-call-strategy.js +7 -0
  69. package/dist/policy/streaming-llm-call-strategy.js.map +1 -0
  70. package/dist/resilience/circuit-breaker-embedder.d.ts +16 -0
  71. package/dist/resilience/circuit-breaker-embedder.d.ts.map +1 -0
  72. package/dist/resilience/circuit-breaker-embedder.js +47 -0
  73. package/dist/resilience/circuit-breaker-embedder.js.map +1 -0
  74. package/dist/resilience/circuit-breaker-llm.d.ts +19 -0
  75. package/dist/resilience/circuit-breaker-llm.d.ts.map +1 -0
  76. package/dist/resilience/circuit-breaker-llm.js +72 -0
  77. package/dist/resilience/circuit-breaker-llm.js.map +1 -0
  78. package/dist/resilience/circuit-breaker.d.ts +36 -0
  79. package/dist/resilience/circuit-breaker.d.ts.map +1 -0
  80. package/dist/resilience/circuit-breaker.js +60 -0
  81. package/dist/resilience/circuit-breaker.js.map +1 -0
  82. package/dist/resilience/fallback-rag.d.ts +21 -0
  83. package/dist/resilience/fallback-rag.d.ts.map +1 -0
  84. package/dist/resilience/fallback-rag.js +80 -0
  85. package/dist/resilience/fallback-rag.js.map +1 -0
  86. package/dist/resilience/index.d.ts +5 -0
  87. package/dist/resilience/index.d.ts.map +1 -0
  88. package/dist/resilience/index.js +5 -0
  89. package/dist/resilience/index.js.map +1 -0
  90. package/dist/testing/index.d.ts +5 -2
  91. package/dist/testing/index.d.ts.map +1 -1
  92. package/dist/testing/index.js +30 -0
  93. package/dist/testing/index.js.map +1 -1
  94. package/dist/tool-call-deltas.d.ts +4 -0
  95. package/dist/tool-call-deltas.d.ts.map +1 -0
  96. package/dist/tool-call-deltas.js +25 -0
  97. package/dist/tool-call-deltas.js.map +1 -0
  98. package/package.json +1 -1
@@ -0,0 +1,277 @@
1
+ // src/smart-agent/api-adapters/openai-adapter.ts
2
+ import { randomUUID } from 'node:crypto';
3
+ import { AdapterValidationError, } from '../interfaces/api-adapter.js';
4
+ import { toToolCallDelta } from '../tool-call-deltas.js';
5
+ // ---------------------------------------------------------------------------
6
+ // Helpers
7
+ // ---------------------------------------------------------------------------
8
+ function mapStopReason(r) {
9
+ switch (r) {
10
+ case 'stop':
11
+ return 'stop';
12
+ case 'tool_calls':
13
+ return 'tool_calls';
14
+ case 'error':
15
+ return 'stop';
16
+ default:
17
+ return 'length';
18
+ }
19
+ }
20
+ // ---------------------------------------------------------------------------
21
+ // OpenAiApiAdapter
22
+ // ---------------------------------------------------------------------------
23
+ export class OpenAiApiAdapter {
24
+ name = 'openai';
25
+ // -------------------------------------------------------------------------
26
+ // normalizeRequest
27
+ // -------------------------------------------------------------------------
28
+ normalizeRequest(request) {
29
+ if (typeof request !== 'object' || request === null) {
30
+ throw new AdapterValidationError('Request body must be a JSON object');
31
+ }
32
+ const body = request;
33
+ if (!Array.isArray(body.messages)) {
34
+ throw new AdapterValidationError('messages must be a non-empty array');
35
+ }
36
+ const messages = body.messages;
37
+ if (messages.length === 0) {
38
+ throw new AdapterValidationError('messages must be a non-empty array');
39
+ }
40
+ const options = {};
41
+ if (body.temperature !== undefined)
42
+ options.temperature = body.temperature;
43
+ if (body.max_tokens !== undefined)
44
+ options.maxTokens = body.max_tokens;
45
+ if (body.top_p !== undefined)
46
+ options.topP = body.top_p;
47
+ if (Array.isArray(body.tools))
48
+ options.externalTools = body.tools;
49
+ if (body.model !== undefined)
50
+ options.model = body.model;
51
+ const id = `chatcmpl-${randomUUID()}`;
52
+ const created = Math.floor(Date.now() / 1000);
53
+ const context = {
54
+ adapterName: this.name,
55
+ protocol: {
56
+ id,
57
+ created,
58
+ model: body.model ?? 'smart-agent',
59
+ },
60
+ };
61
+ return {
62
+ messages,
63
+ stream: body.stream === true,
64
+ options,
65
+ context,
66
+ };
67
+ }
68
+ // -------------------------------------------------------------------------
69
+ // formatResult
70
+ // -------------------------------------------------------------------------
71
+ formatResult(response, context) {
72
+ const { id, created, model } = context.protocol;
73
+ const message = {
74
+ role: 'assistant',
75
+ content: response.content,
76
+ };
77
+ if (response.toolCalls) {
78
+ message.tool_calls = response.toolCalls;
79
+ if (!message.content)
80
+ message.content = null;
81
+ }
82
+ return {
83
+ id,
84
+ object: 'chat.completion',
85
+ created,
86
+ model,
87
+ choices: [
88
+ {
89
+ index: 0,
90
+ message,
91
+ finish_reason: mapStopReason(response.stopReason),
92
+ },
93
+ ],
94
+ usage: {
95
+ prompt_tokens: response.usage?.promptTokens ?? 0,
96
+ completion_tokens: response.usage?.completionTokens ?? 0,
97
+ total_tokens: response.usage?.totalTokens ?? 0,
98
+ },
99
+ };
100
+ }
101
+ // -------------------------------------------------------------------------
102
+ // formatError
103
+ // -------------------------------------------------------------------------
104
+ formatError(error, _context) {
105
+ return {
106
+ error: {
107
+ message: error.message,
108
+ type: 'server_error',
109
+ code: error.code,
110
+ },
111
+ };
112
+ }
113
+ // -------------------------------------------------------------------------
114
+ // transformStream
115
+ // -------------------------------------------------------------------------
116
+ async *transformStream(source, context) {
117
+ const { id, created, model } = context.protocol;
118
+ const baseResponse = {
119
+ id,
120
+ object: 'chat.completion.chunk',
121
+ created,
122
+ model,
123
+ usage: null,
124
+ };
125
+ let firstChunk = true;
126
+ let finishReasonSent = false;
127
+ let lastUsage = null;
128
+ for await (const chunk of source) {
129
+ // Error chunk
130
+ if (!chunk.ok) {
131
+ const errorPayload = {
132
+ ...baseResponse,
133
+ choices: [
134
+ {
135
+ index: 0,
136
+ delta: { content: `[Error] ${chunk.error.message}` },
137
+ finish_reason: 'stop',
138
+ },
139
+ ],
140
+ };
141
+ yield { data: JSON.stringify(errorPayload) };
142
+ finishReasonSent = true;
143
+ break;
144
+ }
145
+ const val = chunk.value;
146
+ // Skip heartbeat-only and timing-only chunks
147
+ if (!val.content &&
148
+ !val.toolCalls &&
149
+ !val.finishReason &&
150
+ !val.usage &&
151
+ (val.heartbeat || val.timing)) {
152
+ continue;
153
+ }
154
+ // Capture usage for final emission
155
+ if (val.usage) {
156
+ lastUsage = {
157
+ prompt_tokens: val.usage.promptTokens,
158
+ completion_tokens: val.usage.completionTokens,
159
+ total_tokens: val.usage.totalTokens,
160
+ };
161
+ }
162
+ // Skip chunks that carry only usage (no content, no tool_calls, no finishReason)
163
+ if (!val.content && !val.toolCalls && !val.finishReason) {
164
+ continue;
165
+ }
166
+ // First chunk includes role: 'assistant'
167
+ if (firstChunk) {
168
+ const firstDelta = {
169
+ role: 'assistant',
170
+ content: val.content || '',
171
+ };
172
+ if (val.toolCalls) {
173
+ firstDelta.tool_calls = val.toolCalls.map((call, index) => {
174
+ const tc = toToolCallDelta(call, index);
175
+ return {
176
+ index: tc.index,
177
+ id: tc.id,
178
+ type: 'function',
179
+ function: {
180
+ name: tc.name,
181
+ arguments: tc.arguments || '',
182
+ },
183
+ };
184
+ });
185
+ }
186
+ yield {
187
+ data: JSON.stringify({
188
+ ...baseResponse,
189
+ choices: [
190
+ {
191
+ index: 0,
192
+ delta: firstDelta,
193
+ finish_reason: null,
194
+ },
195
+ ],
196
+ }),
197
+ };
198
+ firstChunk = false;
199
+ if (!val.finishReason)
200
+ continue;
201
+ }
202
+ // Regular content / tool call delta
203
+ if ((val.content || val.toolCalls) && !firstChunk) {
204
+ const delta = {};
205
+ if (val.content)
206
+ delta.content = val.content;
207
+ if (val.toolCalls) {
208
+ delta.tool_calls = val.toolCalls.map((call, index) => {
209
+ const tc = toToolCallDelta(call, index);
210
+ return {
211
+ index: tc.index,
212
+ id: tc.id,
213
+ type: 'function',
214
+ function: {
215
+ name: tc.name,
216
+ arguments: tc.arguments || '',
217
+ },
218
+ };
219
+ });
220
+ }
221
+ yield {
222
+ data: JSON.stringify({
223
+ ...baseResponse,
224
+ choices: [
225
+ {
226
+ index: 0,
227
+ delta,
228
+ finish_reason: null,
229
+ },
230
+ ],
231
+ }),
232
+ };
233
+ }
234
+ // Finish reason in separate chunk
235
+ if (val.finishReason) {
236
+ yield {
237
+ data: JSON.stringify({
238
+ ...baseResponse,
239
+ choices: [
240
+ {
241
+ index: 0,
242
+ delta: {},
243
+ finish_reason: mapStopReason(val.finishReason),
244
+ },
245
+ ],
246
+ }),
247
+ };
248
+ finishReasonSent = true;
249
+ }
250
+ }
251
+ // Default finish reason if none was sent
252
+ if (!finishReasonSent) {
253
+ yield {
254
+ data: JSON.stringify({
255
+ ...baseResponse,
256
+ choices: [{ index: 0, delta: {}, finish_reason: 'stop' }],
257
+ }),
258
+ };
259
+ }
260
+ // Usage chunk
261
+ if (lastUsage) {
262
+ yield {
263
+ data: JSON.stringify({
264
+ id,
265
+ object: 'chat.completion.chunk',
266
+ created,
267
+ model,
268
+ choices: [],
269
+ usage: lastUsage,
270
+ }),
271
+ };
272
+ }
273
+ // Terminal sentinel
274
+ yield { data: '[DONE]' };
275
+ }
276
+ }
277
+ //# sourceMappingURL=openai-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai-adapter.js","sourceRoot":"","sources":["../../src/api-adapters/openai-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export { NoopToolCache } from './noop-tool-cache.js';
2
+ export { ToolCache } from './tool-cache.js';
3
+ export type { IToolCache } from './types.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { NoopToolCache } from './noop-tool-cache.js';
2
+ export { ToolCache } from './tool-cache.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cache/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { IToolCache } from './types.js';
2
+ export declare class NoopToolCache implements IToolCache {
3
+ get(): undefined;
4
+ set(): void;
5
+ clear(): void;
6
+ }
7
+ //# sourceMappingURL=noop-tool-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noop-tool-cache.d.ts","sourceRoot":"","sources":["../../src/cache/noop-tool-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE7C,qBAAa,aAAc,YAAW,UAAU;IAC9C,GAAG,IAAI,SAAS;IAGhB,GAAG,IAAI,IAAI;IACX,KAAK,IAAI,IAAI;CACd"}
@@ -0,0 +1,8 @@
1
+ export class NoopToolCache {
2
+ get() {
3
+ return undefined;
4
+ }
5
+ set() { }
6
+ clear() { }
7
+ }
8
+ //# sourceMappingURL=noop-tool-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noop-tool-cache.js","sourceRoot":"","sources":["../../src/cache/noop-tool-cache.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,aAAa;IACxB,GAAG;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,GAAG,KAAU,CAAC;IACd,KAAK,KAAU,CAAC;CACjB"}
@@ -0,0 +1,14 @@
1
+ import type { McpToolResult } from '@mcp-abap-adt/llm-agent';
2
+ import type { IToolCache } from './types.js';
3
+ export declare class ToolCache implements IToolCache {
4
+ private readonly map;
5
+ private readonly ttlMs;
6
+ constructor(opts?: {
7
+ ttlMs?: number;
8
+ });
9
+ get(toolName: string, args: Record<string, unknown>): McpToolResult | undefined;
10
+ set(toolName: string, args: Record<string, unknown>, result: McpToolResult): void;
11
+ clear(): void;
12
+ private _key;
13
+ }
14
+ //# sourceMappingURL=tool-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-cache.d.ts","sourceRoot":"","sources":["../../src/cache/tool-cache.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAO7C,qBAAa,SAAU,YAAW,UAAU;IAC1C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAiC;IACrD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;gBAEnB,IAAI,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAIrC,GAAG,CACD,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,aAAa,GAAG,SAAS;IAW5B,GAAG,CACD,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,aAAa,GACpB,IAAI;IAKP,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,IAAI;CAKb"}
@@ -0,0 +1,32 @@
1
+ import { createHash } from 'node:crypto';
2
+ export class ToolCache {
3
+ map = new Map();
4
+ ttlMs;
5
+ constructor(opts) {
6
+ this.ttlMs = opts?.ttlMs ?? 300_000;
7
+ }
8
+ get(toolName, args) {
9
+ const key = this._key(toolName, args);
10
+ const entry = this.map.get(key);
11
+ if (!entry)
12
+ return undefined;
13
+ if (Date.now() > entry.expiresAt) {
14
+ this.map.delete(key);
15
+ return undefined;
16
+ }
17
+ return entry.result;
18
+ }
19
+ set(toolName, args, result) {
20
+ const key = this._key(toolName, args);
21
+ this.map.set(key, { result, expiresAt: Date.now() + this.ttlMs });
22
+ }
23
+ clear() {
24
+ this.map.clear();
25
+ }
26
+ _key(toolName, args) {
27
+ const sorted = JSON.stringify(args, Object.keys(args).sort());
28
+ const hash = createHash('sha256').update(sorted).digest('hex');
29
+ return `${toolName}:${hash}`;
30
+ }
31
+ }
32
+ //# sourceMappingURL=tool-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-cache.js","sourceRoot":"","sources":["../../src/cache/tool-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AASzC,MAAM,OAAO,SAAS;IACH,GAAG,GAAG,IAAI,GAAG,EAAsB,CAAC;IACpC,KAAK,CAAS;IAE/B,YAAY,IAAyB;QACnC,IAAI,CAAC,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,OAAO,CAAC;IACtC,CAAC;IAED,GAAG,CACD,QAAgB,EAChB,IAA6B;QAE7B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAC7B,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;YACjC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACrB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,KAAK,CAAC,MAAM,CAAC;IACtB,CAAC;IAED,GAAG,CACD,QAAgB,EAChB,IAA6B,EAC7B,MAAqB;QAErB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACtC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,KAAK;QACH,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;IAEO,IAAI,CAAC,QAAgB,EAAE,IAA6B;QAC1D,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9D,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/D,OAAO,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAC;IAC/B,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ import type { McpToolResult } from '@mcp-abap-adt/llm-agent';
2
+ export interface IToolCache {
3
+ get(toolName: string, args: Record<string, unknown>): McpToolResult | undefined;
4
+ set(toolName: string, args: Record<string, unknown>, result: McpToolResult): void;
5
+ clear(): void;
6
+ }
7
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/cache/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE7D,MAAM,WAAW,UAAU;IACzB,GAAG,CACD,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC5B,aAAa,GAAG,SAAS,CAAC;IAC7B,GAAG,CACD,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,MAAM,EAAE,aAAa,GACpB,IAAI,CAAC;IACR,KAAK,IAAI,IAAI,CAAC;CACf"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/cache/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import type { LlmTool } from '@mcp-abap-adt/llm-agent';
2
+ export type ExternalToolValidationCode = 'INVALID_TOOL_SCHEMA' | 'UNSUPPORTED_TOOL_FORMAT' | 'TOOL_NAME_INVALID' | 'TOOL_PARAMETERS_INVALID';
3
+ export interface ExternalToolValidationError {
4
+ code: ExternalToolValidationCode;
5
+ message: string;
6
+ param: string;
7
+ toolIndex: number;
8
+ }
9
+ export declare const CLIENT_PROVIDED_PREFIX = "[client-provided] ";
10
+ export declare function normalizeExternalTools(rawTools?: unknown[]): LlmTool[];
11
+ export declare function normalizeAndValidateExternalTools(rawTools?: unknown[]): {
12
+ tools: LlmTool[];
13
+ errors: ExternalToolValidationError[];
14
+ };
15
+ //# sourceMappingURL=external-tools-normalizer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-tools-normalizer.d.ts","sourceRoot":"","sources":["../src/external-tools-normalizer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAEvD,MAAM,MAAM,0BAA0B,GAClC,qBAAqB,GACrB,yBAAyB,GACzB,mBAAmB,GACnB,yBAAyB,CAAC;AAE9B,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,0BAA0B,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AA8BD,eAAO,MAAM,sBAAsB,uBAAuB,CAAC;AAiI3D,wBAAgB,sBAAsB,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAEtE;AAED,wBAAgB,iCAAiC,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,GAAG;IACvE,KAAK,EAAE,OAAO,EAAE,CAAC;IACjB,MAAM,EAAE,2BAA2B,EAAE,CAAC;CACvC,CAYA"}
@@ -0,0 +1,146 @@
1
+ function isRecord(value) {
2
+ return typeof value === 'object' && value !== null;
3
+ }
4
+ function asString(value) {
5
+ return typeof value === 'string' ? value : undefined;
6
+ }
7
+ function asSchema(value) {
8
+ return isRecord(value) ? value : { type: 'object', properties: {} };
9
+ }
10
+ function validateDescription(value, toolIndex, param) {
11
+ if (value === undefined || value === null || typeof value === 'string') {
12
+ return null;
13
+ }
14
+ return {
15
+ code: 'INVALID_TOOL_SCHEMA',
16
+ message: `${param} must be a string when provided`,
17
+ param,
18
+ toolIndex,
19
+ };
20
+ }
21
+ export const CLIENT_PROVIDED_PREFIX = '[client-provided] ';
22
+ function isAlreadyNormalized(raw) {
23
+ return (typeof raw.name === 'string' &&
24
+ raw.name.length > 0 &&
25
+ typeof raw.description === 'string' &&
26
+ raw.description.startsWith(CLIENT_PROVIDED_PREFIX));
27
+ }
28
+ function normalizeExternalTool(raw, toolIndex) {
29
+ if (!isRecord(raw)) {
30
+ return {
31
+ tool: null,
32
+ error: {
33
+ code: 'INVALID_TOOL_SCHEMA',
34
+ message: `tools[${toolIndex}] must be an object`,
35
+ param: `tools[${toolIndex}]`,
36
+ toolIndex,
37
+ },
38
+ };
39
+ }
40
+ // Idempotent: already-normalized LlmTool passes through unchanged
41
+ if (isAlreadyNormalized(raw)) {
42
+ return { tool: raw, error: null };
43
+ }
44
+ const directDescriptionError = validateDescription(raw.description, toolIndex, `tools[${toolIndex}].description`);
45
+ if (directDescriptionError)
46
+ return { tool: null, error: directDescriptionError };
47
+ const name = asString(raw.name);
48
+ if (name) {
49
+ if (!isRecord(raw.inputSchema) && raw.inputSchema !== undefined) {
50
+ return {
51
+ tool: null,
52
+ error: {
53
+ code: 'TOOL_PARAMETERS_INVALID',
54
+ message: `tools[${toolIndex}].inputSchema must be an object`,
55
+ param: `tools[${toolIndex}].inputSchema`,
56
+ toolIndex,
57
+ },
58
+ };
59
+ }
60
+ return {
61
+ tool: {
62
+ name,
63
+ description: `${CLIENT_PROVIDED_PREFIX}${asString(raw.description) ?? ''}`,
64
+ inputSchema: asSchema(raw.inputSchema),
65
+ },
66
+ error: null,
67
+ };
68
+ }
69
+ if (raw.name !== undefined) {
70
+ return {
71
+ tool: null,
72
+ error: {
73
+ code: 'TOOL_NAME_INVALID',
74
+ message: `tools[${toolIndex}].name must be a non-empty string`,
75
+ param: `tools[${toolIndex}].name`,
76
+ toolIndex,
77
+ },
78
+ };
79
+ }
80
+ if (!isRecord(raw.function)) {
81
+ return {
82
+ tool: null,
83
+ error: {
84
+ code: 'UNSUPPORTED_TOOL_FORMAT',
85
+ message: `tools[${toolIndex}] must contain either name or function.name`,
86
+ param: `tools[${toolIndex}]`,
87
+ toolIndex,
88
+ },
89
+ };
90
+ }
91
+ const fn = raw.function;
92
+ const functionDescriptionError = validateDescription(fn.description, toolIndex, `tools[${toolIndex}].function.description`);
93
+ if (functionDescriptionError) {
94
+ return { tool: null, error: functionDescriptionError };
95
+ }
96
+ const functionName = asString(fn?.name);
97
+ if (!functionName) {
98
+ return {
99
+ tool: null,
100
+ error: {
101
+ code: 'TOOL_NAME_INVALID',
102
+ message: `tools[${toolIndex}].function.name must be a non-empty string`,
103
+ param: `tools[${toolIndex}].function.name`,
104
+ toolIndex,
105
+ },
106
+ };
107
+ }
108
+ if (!isRecord(fn.parameters) && fn.parameters !== undefined) {
109
+ return {
110
+ tool: null,
111
+ error: {
112
+ code: 'TOOL_PARAMETERS_INVALID',
113
+ message: `tools[${toolIndex}].function.parameters must be an object`,
114
+ param: `tools[${toolIndex}].function.parameters`,
115
+ toolIndex,
116
+ },
117
+ };
118
+ }
119
+ return {
120
+ tool: {
121
+ name: functionName,
122
+ description: `${CLIENT_PROVIDED_PREFIX}${asString(fn?.description) ?? ''}`,
123
+ inputSchema: asSchema(fn?.parameters),
124
+ },
125
+ error: null,
126
+ };
127
+ }
128
+ export function normalizeExternalTools(rawTools) {
129
+ return normalizeAndValidateExternalTools(rawTools).tools;
130
+ }
131
+ export function normalizeAndValidateExternalTools(rawTools) {
132
+ if (!Array.isArray(rawTools) || rawTools.length === 0) {
133
+ return { tools: [], errors: [] };
134
+ }
135
+ const tools = [];
136
+ const errors = [];
137
+ for (const [index, rawTool] of rawTools.entries()) {
138
+ const { tool, error } = normalizeExternalTool(rawTool, index);
139
+ if (tool)
140
+ tools.push(tool);
141
+ if (error)
142
+ errors.push(error);
143
+ }
144
+ return { tools, errors };
145
+ }
146
+ //# sourceMappingURL=external-tools-normalizer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"external-tools-normalizer.js","sourceRoot":"","sources":["../src/external-tools-normalizer.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -3,4 +3,22 @@ export * from './interfaces/index.js';
3
3
  export { BaseLLMProvider, type LLMProvider } from './llm/base-llm-provider.js';
4
4
  export * from './rag/index.js';
5
5
  export * from './types.js';
6
+ export { ClineClientAdapter } from './adapters/cline-client-adapter.js';
7
+ export { AnthropicApiAdapter } from './api-adapters/anthropic-adapter.js';
8
+ export { OpenAiApiAdapter } from './api-adapters/openai-adapter.js';
9
+ export { NoopToolCache } from './cache/noop-tool-cache.js';
10
+ export { ToolCache } from './cache/tool-cache.js';
11
+ export type { IToolCache } from './cache/types.js';
12
+ export { CLIENT_PROVIDED_PREFIX, type ExternalToolValidationCode, type ExternalToolValidationError, normalizeAndValidateExternalTools, normalizeExternalTools, } from './external-tools-normalizer.js';
13
+ export { AdapterValidationError, type ApiRequestContext, type ApiSseEvent, type ILlmApiAdapter, type NormalizedRequest, } from './interfaces/api-adapter.js';
14
+ export type { IClientAdapter } from './interfaces/client-adapter.js';
15
+ export type { ILogger, LogEvent } from './logger/types.js';
16
+ export { FallbackLlmCallStrategy } from './policy/fallback-llm-call-strategy.js';
17
+ export { NonStreamingLlmCallStrategy } from './policy/non-streaming-llm-call-strategy.js';
18
+ export { StreamingLlmCallStrategy } from './policy/streaming-llm-call-strategy.js';
19
+ export { CircuitBreaker, type CircuitBreakerConfig, type CircuitState, } from './resilience/circuit-breaker.js';
20
+ export { CircuitBreakerEmbedder } from './resilience/circuit-breaker-embedder.js';
21
+ export { CircuitBreakerLlm } from './resilience/circuit-breaker-llm.js';
22
+ export { FallbackRag } from './resilience/fallback-rag.js';
23
+ export { getStreamToolCallName, toToolCallDelta, } from './tool-call-deltas.js';
6
24
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,KAAK,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC/E,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,KAAK,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAC/E,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAI3B,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAExE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAElD,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EACL,sBAAsB,EACtB,KAAK,0BAA0B,EAC/B,KAAK,2BAA2B,EAChC,iCAAiC,EACjC,sBAAsB,GACvB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACL,sBAAsB,EACtB,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,iBAAiB,GACvB,MAAM,6BAA6B,CAAC;AAErC,YAAY,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAErE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AAEjF,OAAO,EAAE,2BAA2B,EAAE,MAAM,6CAA6C,CAAC;AAC1F,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAC;AAEnF,OAAO,EACL,cAAc,EACd,KAAK,oBAAoB,EACzB,KAAK,YAAY,GAClB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EACL,qBAAqB,EACrB,eAAe,GAChB,MAAM,uBAAuB,CAAC"}
package/dist/index.js CHANGED
@@ -4,4 +4,25 @@ export * from './interfaces/index.js';
4
4
  export { BaseLLMProvider } from './llm/base-llm-provider.js';
5
5
  export * from './rag/index.js';
6
6
  export * from './types.js';
7
+ // --- Library helpers (moved from @mcp-abap-adt/llm-agent-server) ---
8
+ export { ClineClientAdapter } from './adapters/cline-client-adapter.js';
9
+ // API adapters
10
+ export { AnthropicApiAdapter } from './api-adapters/anthropic-adapter.js';
11
+ export { OpenAiApiAdapter } from './api-adapters/openai-adapter.js';
12
+ export { NoopToolCache } from './cache/noop-tool-cache.js';
13
+ export { ToolCache } from './cache/tool-cache.js';
14
+ // Tool utilities
15
+ export { CLIENT_PROVIDED_PREFIX, normalizeAndValidateExternalTools, normalizeExternalTools, } from './external-tools-normalizer.js';
16
+ // API adapter interfaces
17
+ export { AdapterValidationError, } from './interfaces/api-adapter.js';
18
+ export { FallbackLlmCallStrategy } from './policy/fallback-llm-call-strategy.js';
19
+ // LLM call policies
20
+ export { NonStreamingLlmCallStrategy } from './policy/non-streaming-llm-call-strategy.js';
21
+ export { StreamingLlmCallStrategy } from './policy/streaming-llm-call-strategy.js';
22
+ // Resilience
23
+ export { CircuitBreaker, } from './resilience/circuit-breaker.js';
24
+ export { CircuitBreakerEmbedder } from './resilience/circuit-breaker-embedder.js';
25
+ export { CircuitBreakerLlm } from './resilience/circuit-breaker-llm.js';
26
+ export { FallbackRag } from './resilience/fallback-rag.js';
27
+ export { getStreamToolCallName, toToolCallDelta, } from './tool-call-deltas.js';
7
28
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,eAAe,EAAoB,MAAM,4BAA4B,CAAC;AAC/E,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC;AACtC,OAAO,EAAE,eAAe,EAAoB,MAAM,4BAA4B,CAAC;AAC/E,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAE3B,sEAAsE;AAEtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AACxE,eAAe;AACf,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAGlD,iBAAiB;AACjB,OAAO,EACL,sBAAsB,EAGtB,iCAAiC,EACjC,sBAAsB,GACvB,MAAM,gCAAgC,CAAC;AACxC,yBAAyB;AACzB,OAAO,EACL,sBAAsB,GAKvB,MAAM,6BAA6B,CAAC;AAKrC,OAAO,EAAE,uBAAuB,EAAE,MAAM,wCAAwC,CAAC;AACjF,oBAAoB;AACpB,OAAO,EAAE,2BAA2B,EAAE,MAAM,6CAA6C,CAAC;AAC1F,OAAO,EAAE,wBAAwB,EAAE,MAAM,yCAAyC,CAAC;AACnF,aAAa;AACb,OAAO,EACL,cAAc,GAGf,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,sBAAsB,EAAE,MAAM,0CAA0C,CAAC;AAClF,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAC3D,OAAO,EACL,qBAAqB,EACrB,eAAe,GAChB,MAAM,uBAAuB,CAAC"}