@mcp-abap-adt/llm-agent 20.7.1 → 20.9.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 (66) hide show
  1. package/README.md +1 -1
  2. package/dist/index.d.ts +8 -1
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +8 -1
  5. package/dist/index.js.map +1 -1
  6. package/dist/interfaces/assert-client-descriptors.d.ts +6 -0
  7. package/dist/interfaces/assert-client-descriptors.d.ts.map +1 -0
  8. package/dist/interfaces/assert-client-descriptors.js +27 -0
  9. package/dist/interfaces/assert-client-descriptors.js.map +1 -0
  10. package/dist/interfaces/build-namespaced-tools.d.ts +21 -0
  11. package/dist/interfaces/build-namespaced-tools.d.ts.map +1 -0
  12. package/dist/interfaces/build-namespaced-tools.js +48 -0
  13. package/dist/interfaces/build-namespaced-tools.js.map +1 -0
  14. package/dist/interfaces/builder.d.ts +17 -1
  15. package/dist/interfaces/builder.d.ts.map +1 -1
  16. package/dist/interfaces/health.d.ts +11 -0
  17. package/dist/interfaces/health.d.ts.map +1 -1
  18. package/dist/interfaces/index.d.ts +4 -2
  19. package/dist/interfaces/index.d.ts.map +1 -1
  20. package/dist/interfaces/index.js +3 -1
  21. package/dist/interfaces/index.js.map +1 -1
  22. package/dist/interfaces/mcp-connection-strategy.d.ts +14 -0
  23. package/dist/interfaces/mcp-connection-strategy.d.ts.map +1 -1
  24. package/dist/interfaces/merge-offered-tools.d.ts +8 -0
  25. package/dist/interfaces/merge-offered-tools.d.ts.map +1 -0
  26. package/dist/interfaces/merge-offered-tools.js +14 -0
  27. package/dist/interfaces/merge-offered-tools.js.map +1 -0
  28. package/dist/interfaces/pipeline-plugin.d.ts +4 -0
  29. package/dist/interfaces/pipeline-plugin.d.ts.map +1 -1
  30. package/dist/interfaces/rag.d.ts +31 -0
  31. package/dist/interfaces/rag.d.ts.map +1 -1
  32. package/dist/interfaces/rag.js +10 -0
  33. package/dist/interfaces/rag.js.map +1 -1
  34. package/dist/interfaces/tool-catalog.d.ts +35 -0
  35. package/dist/interfaces/tool-catalog.d.ts.map +1 -0
  36. package/dist/interfaces/tool-catalog.js +7 -0
  37. package/dist/interfaces/tool-catalog.js.map +1 -0
  38. package/dist/interfaces/tool-namespace.d.ts +24 -0
  39. package/dist/interfaces/tool-namespace.d.ts.map +1 -0
  40. package/dist/interfaces/tool-namespace.js +20 -0
  41. package/dist/interfaces/tool-namespace.js.map +1 -0
  42. package/dist/interfaces/tool-record-key.d.ts +59 -0
  43. package/dist/interfaces/tool-record-key.d.ts.map +1 -0
  44. package/dist/interfaces/tool-record-key.js +40 -0
  45. package/dist/interfaces/tool-record-key.js.map +1 -0
  46. package/dist/resilience/batch-chunking-embedder.d.ts +23 -0
  47. package/dist/resilience/batch-chunking-embedder.d.ts.map +1 -0
  48. package/dist/resilience/batch-chunking-embedder.js +45 -0
  49. package/dist/resilience/batch-chunking-embedder.js.map +1 -0
  50. package/dist/resilience/circuit-breaker-embedder.d.ts +23 -3
  51. package/dist/resilience/circuit-breaker-embedder.d.ts.map +1 -1
  52. package/dist/resilience/circuit-breaker-embedder.js +25 -1
  53. package/dist/resilience/circuit-breaker-embedder.js.map +1 -1
  54. package/dist/resilience/embedder-resilience.d.ts +42 -0
  55. package/dist/resilience/embedder-resilience.d.ts.map +1 -0
  56. package/dist/resilience/embedder-resilience.js +66 -0
  57. package/dist/resilience/embedder-resilience.js.map +1 -0
  58. package/dist/resilience/index.d.ts +4 -1
  59. package/dist/resilience/index.d.ts.map +1 -1
  60. package/dist/resilience/index.js +4 -1
  61. package/dist/resilience/index.js.map +1 -1
  62. package/dist/resilience/retry-embedder.d.ts +79 -0
  63. package/dist/resilience/retry-embedder.d.ts.map +1 -0
  64. package/dist/resilience/retry-embedder.js +124 -0
  65. package/dist/resilience/retry-embedder.js.map +1 -0
  66. package/package.json +1 -1
@@ -0,0 +1,124 @@
1
+ /**
2
+ * RetryEmbedder — IEmbedder decorators that retry transient failures with
3
+ * exponential backoff. Ported from RetryLlm (llm-agent-libs) onto IEmbedder,
4
+ * which throws instead of returning a Result.
5
+ *
6
+ * Two classes behind a factory, following wrapEmbedder: a single class exposing
7
+ * embedBatch unconditionally would make every non-batch embedder look
8
+ * batch-capable to isBatchEmbedder.
9
+ */
10
+ import { isBatchEmbedder } from '../interfaces/rag.js';
11
+ import { RagError } from '../interfaces/types.js';
12
+ import { DefaultWaitStrategy } from '../interfaces/wait-strategy.js';
13
+ const DEFAULT_OPTIONS = {
14
+ maxAttempts: 3,
15
+ backoffMs: 2000,
16
+ retryOn: [429, 500, 502, 503],
17
+ // Stateless, so one shared instance is safe.
18
+ waitStrategy: new DefaultWaitStrategy(),
19
+ };
20
+ const MAX_CAUSE_DEPTH = 5;
21
+ /**
22
+ * Resolve an HTTP status from an unknown thrown value: own status/statusCode,
23
+ * then the same walking `cause`, bounded by depth and a visited set so a cyclic
24
+ * chain cannot hang. Returns undefined when no numeric status is present.
25
+ */
26
+ export function extractStatusCode(err) {
27
+ const visited = new Set();
28
+ let cur = err;
29
+ for (let depth = 0; depth < MAX_CAUSE_DEPTH; depth++) {
30
+ if (typeof cur !== 'object' || cur === null || visited.has(cur))
31
+ return;
32
+ visited.add(cur);
33
+ const rec = cur;
34
+ if (typeof rec.status === 'number')
35
+ return rec.status;
36
+ if (typeof rec.statusCode === 'number')
37
+ return rec.statusCode;
38
+ cur = rec.cause;
39
+ }
40
+ return undefined;
41
+ }
42
+ /**
43
+ * Whether a thrown value should be retried against a set of HTTP status codes.
44
+ *
45
+ * A structured status (own `status`/`statusCode`, or the same on `cause`) is
46
+ * authoritative. Only when none is present does it fall back to the message,
47
+ * and there it matches on **word boundaries** — a bare `includes('429')` also
48
+ * fires on `4290`, an id, or a byte count, turning a hard error into a
49
+ * multi-second backoff stall.
50
+ *
51
+ * Shared by both retry decorators (embedder and LLM) so the classification
52
+ * cannot drift between them.
53
+ */
54
+ export function isRetryableStatus(err, retryOn) {
55
+ const status = extractStatusCode(err);
56
+ if (status !== undefined)
57
+ return retryOn.includes(status);
58
+ const msg = err instanceof Error ? err.message : String(err);
59
+ return retryOn.some((code) => new RegExp(`\\b${code}\\b`).test(msg));
60
+ }
61
+ export class RetryEmbedder {
62
+ inner;
63
+ opts;
64
+ constructor(inner, options) {
65
+ this.inner = inner;
66
+ // waitStrategy is re-applied after the spread: an explicit
67
+ // `{ waitStrategy: undefined }` would otherwise overwrite the default with
68
+ // undefined and crash on the first backoff.
69
+ this.opts = {
70
+ ...DEFAULT_OPTIONS,
71
+ ...options,
72
+ waitStrategy: options?.waitStrategy ?? DEFAULT_OPTIONS.waitStrategy,
73
+ };
74
+ }
75
+ async embed(text, options) {
76
+ return this.run(() => this.inner.embed(text, options), options);
77
+ }
78
+ async run(call, options) {
79
+ for (let attempt = 0;; attempt++) {
80
+ if (options?.signal?.aborted) {
81
+ throw new RagError('Aborted', 'ABORTED');
82
+ }
83
+ try {
84
+ return await call();
85
+ }
86
+ catch (err) {
87
+ if (attempt >= this.opts.maxAttempts || !this.isRetryable(err))
88
+ throw err;
89
+ await this.backoff(attempt, options?.signal);
90
+ }
91
+ }
92
+ }
93
+ isRetryable(err) {
94
+ return isRetryableStatus(err, this.opts.retryOn);
95
+ }
96
+ /**
97
+ * Delegated to IWaitStrategy rather than hand-rolled: honouring the signal is
98
+ * part of that contract — an already-aborted signal returns immediately
99
+ * (addEventListener never fires for an event that already dispatched), and
100
+ * the listener is removed when the timer wins so a request- or session-scoped
101
+ * signal does not accumulate one per retry.
102
+ */
103
+ async backoff(attempt, signal) {
104
+ const delay = this.opts.backoffMs * 2 ** attempt;
105
+ await this.opts.waitStrategy.wait(delay, signal);
106
+ }
107
+ }
108
+ export class RetryBatchEmbedder extends RetryEmbedder {
109
+ inner;
110
+ constructor(inner, options) {
111
+ super(inner, options);
112
+ this.inner = inner;
113
+ }
114
+ async embedBatch(texts, options) {
115
+ return this.run(() => this.inner.embedBatch(texts, options), options);
116
+ }
117
+ }
118
+ /** Preserves batch capability: never turns a non-batch embedder into one. */
119
+ export function withRetry(inner, options) {
120
+ return isBatchEmbedder(inner)
121
+ ? new RetryBatchEmbedder(inner, options)
122
+ : new RetryEmbedder(inner, options);
123
+ }
124
+ //# sourceMappingURL=retry-embedder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry-embedder.js","sourceRoot":"","sources":["../../src/resilience/retry-embedder.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAGvD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AA2BrE,MAAM,eAAe,GAAyB;IAC5C,WAAW,EAAE,CAAC;IACd,SAAS,EAAE,IAAI;IACf,OAAO,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IAC7B,6CAA6C;IAC7C,YAAY,EAAE,IAAI,mBAAmB,EAAE;CACxC,CAAC;AAEF,MAAM,eAAe,GAAG,CAAC,CAAC;AAE1B;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAY;IAC5C,MAAM,OAAO,GAAG,IAAI,GAAG,EAAW,CAAC;IACnC,IAAI,GAAG,GAAY,GAAG,CAAC;IACvB,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,eAAe,EAAE,KAAK,EAAE,EAAE,CAAC;QACrD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,OAAO;QACxE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjB,MAAM,GAAG,GAAG,GAIX,CAAC;QACF,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ;YAAE,OAAO,GAAG,CAAC,MAAM,CAAC;QACtD,IAAI,OAAO,GAAG,CAAC,UAAU,KAAK,QAAQ;YAAE,OAAO,GAAG,CAAC,UAAU,CAAC;QAC9D,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC;IAClB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,iBAAiB,CAAC,GAAY,EAAE,OAAiB;IAC/D,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACtC,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAC7D,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,OAAO,aAAa;IAIH;IAHF,IAAI,CAAuB;IAE9C,YACqB,KAAgB,EACnC,OAAuC;QADpB,UAAK,GAAL,KAAK,CAAW;QAGnC,2DAA2D;QAC3D,2EAA2E;QAC3E,4CAA4C;QAC5C,IAAI,CAAC,IAAI,GAAG;YACV,GAAG,eAAe;YAClB,GAAG,OAAO;YACV,YAAY,EAAE,OAAO,EAAE,YAAY,IAAI,eAAe,CAAC,YAAY;SACpE,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,IAAY,EAAE,OAAqB;QAC7C,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IAClE,CAAC;IAES,KAAK,CAAC,GAAG,CACjB,IAAsB,EACtB,OAAqB;QAErB,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,EAAE,EAAE,CAAC;YAClC,IAAI,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;gBAC7B,MAAM,IAAI,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YAC3C,CAAC;YACD,IAAI,CAAC;gBACH,OAAO,MAAM,IAAI,EAAE,CAAC;YACtB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC;oBAC5D,MAAM,GAAG,CAAC;gBACZ,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;IACH,CAAC;IAES,WAAW,CAAC,GAAY;QAChC,OAAO,iBAAiB,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACnD,CAAC;IAED;;;;;;OAMG;IACO,KAAK,CAAC,OAAO,CACrB,OAAe,EACf,MAAoB;QAEpB,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,OAAO,CAAC;QACjD,MAAM,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;CACF;AAED,MAAM,OAAO,kBACX,SAAQ,aAAa;IAIA;IADrB,YACqB,KAAqB,EACxC,OAAuC;QAEvC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAHH,UAAK,GAAL,KAAK,CAAgB;IAI1C,CAAC;IAED,KAAK,CAAC,UAAU,CACd,KAAe,EACf,OAAqB;QAErB,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;IACxE,CAAC;CACF;AAED,6EAA6E;AAC7E,MAAM,UAAU,SAAS,CACvB,KAAgB,EAChB,OAAuC;IAEvC,OAAO,eAAe,CAAC,KAAK,CAAC;QAC3B,CAAC,CAAC,IAAI,kBAAkB,CAAC,KAAK,EAAE,OAAO,CAAC;QACxC,CAAC,CAAC,IAAI,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AACxC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcp-abap-adt/llm-agent",
3
- "version": "20.7.1",
3
+ "version": "20.9.0",
4
4
  "description": "Core interfaces, types, and lightweight default implementations for LLM agent orchestration.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",