@mcp-abap-adt/llm-agent-libs 30.0.0 → 30.1.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 (94) hide show
  1. package/README.md +1 -1
  2. package/dist/adapters/llm-adapter.d.ts.map +1 -1
  3. package/dist/adapters/llm-adapter.js +1 -14
  4. package/dist/adapters/llm-adapter.js.map +1 -1
  5. package/dist/adapters/usage-logging-decision-model.d.ts +7 -0
  6. package/dist/adapters/usage-logging-decision-model.d.ts.map +1 -0
  7. package/dist/adapters/usage-logging-decision-model.js +43 -0
  8. package/dist/adapters/usage-logging-decision-model.js.map +1 -0
  9. package/dist/agent.d.ts.map +1 -1
  10. package/dist/agent.js +6 -18
  11. package/dist/agent.js.map +1 -1
  12. package/dist/builder.d.ts +50 -5
  13. package/dist/builder.d.ts.map +1 -1
  14. package/dist/builder.js +112 -27
  15. package/dist/builder.js.map +1 -1
  16. package/dist/classifier/llm-classifier.d.ts.map +1 -1
  17. package/dist/classifier/llm-classifier.js +1 -14
  18. package/dist/classifier/llm-classifier.js.map +1 -1
  19. package/dist/health/health-checker.d.ts +2 -1
  20. package/dist/health/health-checker.d.ts.map +1 -1
  21. package/dist/health/health-checker.js +6 -4
  22. package/dist/health/health-checker.js.map +1 -1
  23. package/dist/index.d.ts +3 -0
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +6 -0
  26. package/dist/index.js.map +1 -1
  27. package/dist/interfaces/pipeline.d.ts +9 -1
  28. package/dist/interfaces/pipeline.d.ts.map +1 -1
  29. package/dist/logger/default-request-logger.d.ts.map +1 -1
  30. package/dist/logger/default-request-logger.js +2 -0
  31. package/dist/logger/default-request-logger.js.map +1 -1
  32. package/dist/pipeline/context.d.ts +6 -0
  33. package/dist/pipeline/context.d.ts.map +1 -1
  34. package/dist/pipeline/default-pipeline.d.ts +1 -0
  35. package/dist/pipeline/default-pipeline.d.ts.map +1 -1
  36. package/dist/pipeline/default-pipeline.js +33 -8
  37. package/dist/pipeline/default-pipeline.js.map +1 -1
  38. package/dist/pipeline/handlers/history-upsert.js +1 -1
  39. package/dist/pipeline/handlers/history-upsert.js.map +1 -1
  40. package/dist/pipeline/handlers/rerank.d.ts +7 -2
  41. package/dist/pipeline/handlers/rerank.d.ts.map +1 -1
  42. package/dist/pipeline/handlers/rerank.js +21 -2
  43. package/dist/pipeline/handlers/rerank.js.map +1 -1
  44. package/dist/pipeline/handlers/tool-loop-core.d.ts.map +1 -1
  45. package/dist/pipeline/handlers/tool-loop-core.js +19 -5
  46. package/dist/pipeline/handlers/tool-loop-core.js.map +1 -1
  47. package/dist/pipeline/handlers/tool-loop.d.ts.map +1 -1
  48. package/dist/pipeline/handlers/tool-loop.js +1 -0
  49. package/dist/pipeline/handlers/tool-loop.js.map +1 -1
  50. package/dist/reranker/decision-reranker.d.ts +50 -0
  51. package/dist/reranker/decision-reranker.d.ts.map +1 -0
  52. package/dist/reranker/decision-reranker.js +110 -0
  53. package/dist/reranker/decision-reranker.js.map +1 -0
  54. package/dist/reranker/index.d.ts +1 -0
  55. package/dist/reranker/index.d.ts.map +1 -1
  56. package/dist/reranker/index.js +1 -0
  57. package/dist/reranker/index.js.map +1 -1
  58. package/dist/reranker/llm-reranker.d.ts +18 -2
  59. package/dist/reranker/llm-reranker.d.ts.map +1 -1
  60. package/dist/reranker/llm-reranker.js +125 -26
  61. package/dist/reranker/llm-reranker.js.map +1 -1
  62. package/dist/resilience/rate-limiter-llm.d.ts +3 -2
  63. package/dist/resilience/rate-limiter-llm.d.ts.map +1 -1
  64. package/dist/resilience/rate-limiter-llm.js +3 -2
  65. package/dist/resilience/rate-limiter-llm.js.map +1 -1
  66. package/dist/resilience/retry-llm.d.ts +18 -3
  67. package/dist/resilience/retry-llm.d.ts.map +1 -1
  68. package/dist/resilience/retry-llm.js +37 -15
  69. package/dist/resilience/retry-llm.js.map +1 -1
  70. package/dist/retrieval/embedding-retrieval.d.ts +7 -0
  71. package/dist/retrieval/embedding-retrieval.d.ts.map +1 -0
  72. package/dist/retrieval/embedding-retrieval.js +8 -0
  73. package/dist/retrieval/embedding-retrieval.js.map +1 -0
  74. package/dist/retrieval/index.d.ts +4 -0
  75. package/dist/retrieval/index.d.ts.map +1 -0
  76. package/dist/retrieval/index.js +4 -0
  77. package/dist/retrieval/index.js.map +1 -0
  78. package/dist/retrieval/reranked-retrieval.d.ts +28 -0
  79. package/dist/retrieval/reranked-retrieval.d.ts.map +1 -0
  80. package/dist/retrieval/reranked-retrieval.js +65 -0
  81. package/dist/retrieval/reranked-retrieval.js.map +1 -0
  82. package/dist/retrieval/strategy-rag.d.ts +29 -0
  83. package/dist/retrieval/strategy-rag.d.ts.map +1 -0
  84. package/dist/retrieval/strategy-rag.js +65 -0
  85. package/dist/retrieval/strategy-rag.js.map +1 -0
  86. package/dist/util/assert-positive-integer.d.ts +7 -0
  87. package/dist/util/assert-positive-integer.d.ts.map +1 -0
  88. package/dist/util/assert-positive-integer.js +11 -0
  89. package/dist/util/assert-positive-integer.js.map +1 -0
  90. package/dist/utils/with-abort.d.ts +8 -0
  91. package/dist/utils/with-abort.d.ts.map +1 -0
  92. package/dist/utils/with-abort.js +21 -0
  93. package/dist/utils/with-abort.js.map +1 -0
  94. package/package.json +4 -4
@@ -1,9 +1,10 @@
1
1
  /**
2
2
  * RetryLlm — ILlm decorator that retries transient failures with exponential backoff.
3
3
  *
4
- * Composition order: RetryLlm → CircuitBreakerLlm → LlmAdapter
5
- * Retry sits outside the circuit breaker so that retry attempts are not
6
- * counted as separate failures.
4
+ * Composition order: CircuitBreakerLlm → RetryLlm → LlmAdapter
5
+ * Retry sits INSIDE the circuit breaker, so the breaker records one result per
6
+ * logical call (after the retries), not one per attempt. A rate limiter, when
7
+ * used, sits outermost.
7
8
  */
8
9
  import type { ILlm, Message } from '@mcp-abap-adt/llm-agent';
9
10
  import { type CallOptions, LlmError, type LlmResponse, type LlmStreamChunk, type LlmTool, type Result } from '@mcp-abap-adt/llm-agent';
@@ -19,14 +20,28 @@ export interface RetryOptions {
19
20
  }
20
21
  export declare class RetryLlm implements ILlm {
21
22
  private readonly inner;
23
+ private readonly wait;
22
24
  private readonly opts;
23
25
  healthCheck?: ILlm['healthCheck'];
24
26
  constructor(inner: ILlm, options?: Partial<RetryOptions>);
25
27
  get model(): string | undefined;
26
28
  chat(messages: Message[], tools?: LlmTool[], options?: CallOptions): Promise<Result<LlmResponse, LlmError>>;
27
29
  streamChat(messages: Message[], tools?: LlmTool[], options?: CallOptions): AsyncIterable<Result<LlmStreamChunk, LlmError>>;
30
+ /**
31
+ * One attempt's stream, with a thrown exception (before or during iteration)
32
+ * turned into an error chunk — the same shape CircuitBreakerLlm gives it — so
33
+ * a throwing provider goes through the same retry rules as an error chunk.
34
+ */
35
+ private attemptStream;
28
36
  private isRetryable;
29
37
  private isMidStreamRetryable;
30
38
  private backoff;
31
39
  }
40
+ /**
41
+ * Wraps `llm` in a RetryLlm placed UNDER any CircuitBreakerLlm layers it
42
+ * already has: each breaker wrapper is rebuilt on its own (possibly shared)
43
+ * breaker around the retry, so every breaker counts one result per logical
44
+ * call. Without a breaker this is plain `new RetryLlm(llm, options)`.
45
+ */
46
+ export declare function retryInsideBreakers(llm: ILlm, options?: Partial<RetryOptions>): ILlm;
32
47
  //# sourceMappingURL=retry-llm.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"retry-llm.d.ts","sourceRoot":"","sources":["../../src/resilience/retry-llm.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EACL,KAAK,WAAW,EAGhB,QAAQ,EACR,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,OAAO,EACZ,KAAK,MAAM,EACZ,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,YAAY;IAC3B,oFAAoF;IACpF,WAAW,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,SAAS,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,sGAAsG;IACtG,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AASD,qBAAa,QAAS,YAAW,IAAI;IAKjC,OAAO,CAAC,QAAQ,CAAC,KAAK;IAJxB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAe;IACpC,WAAW,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;gBAGf,KAAK,EAAE,IAAI,EAC5B,OAAO,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC;IAQjC,IAAI,KAAK,IAAI,MAAM,GAAG,SAAS,CAE9B;IAEK,IAAI,CACR,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,CAAC,EAAE,OAAO,EAAE,EACjB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAoBlC,UAAU,CACf,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,CAAC,EAAE,OAAO,EAAE,EACjB,OAAO,CAAC,EAAE,WAAW,GACpB,aAAa,CAAC,MAAM,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IAqDlD,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,OAAO;CAchB"}
1
+ {"version":3,"file":"retry-llm.d.ts","sourceRoot":"","sources":["../../src/resilience/retry-llm.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EACL,KAAK,WAAW,EAMhB,QAAQ,EACR,KAAK,WAAW,EAChB,KAAK,cAAc,EACnB,KAAK,OAAO,EACZ,KAAK,MAAM,EACZ,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,YAAY;IAC3B,oFAAoF;IACpF,WAAW,EAAE,MAAM,CAAC;IACpB,wEAAwE;IACxE,SAAS,EAAE,MAAM,CAAC;IAClB,2EAA2E;IAC3E,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,sGAAsG;IACtG,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B;AASD,qBAAa,QAAS,YAAW,IAAI;IAMjC,OAAO,CAAC,QAAQ,CAAC,KAAK;IALxB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAA6B;IAClD,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAe;IACpC,WAAW,CAAC,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;gBAGf,KAAK,EAAE,IAAI,EAC5B,OAAO,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC;IAQjC,IAAI,KAAK,IAAI,MAAM,GAAG,SAAS,CAE9B;IAEK,IAAI,CACR,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,CAAC,EAAE,OAAO,EAAE,EACjB,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAoBlC,UAAU,CACf,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,CAAC,EAAE,OAAO,EAAE,EACjB,OAAO,CAAC,EAAE,WAAW,GACpB,aAAa,CAAC,MAAM,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IAoDlD;;;;OAIG;YACY,aAAa;IAY5B,OAAO,CAAC,WAAW;IAYnB,OAAO,CAAC,oBAAoB;YAMd,OAAO;CAGtB;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,IAAI,EACT,OAAO,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,GAC9B,IAAI,CAQN"}
@@ -1,11 +1,12 @@
1
1
  /**
2
2
  * RetryLlm — ILlm decorator that retries transient failures with exponential backoff.
3
3
  *
4
- * Composition order: RetryLlm → CircuitBreakerLlm → LlmAdapter
5
- * Retry sits outside the circuit breaker so that retry attempts are not
6
- * counted as separate failures.
4
+ * Composition order: CircuitBreakerLlm → RetryLlm → LlmAdapter
5
+ * Retry sits INSIDE the circuit breaker, so the breaker records one result per
6
+ * logical call (after the retries), not one per attempt. A rate limiter, when
7
+ * used, sits outermost.
7
8
  */
8
- import { findThrottled, isRetryableStatus, LlmError, } from '@mcp-abap-adt/llm-agent';
9
+ import { CircuitBreakerLlm, DefaultWaitStrategy, findThrottled, isCallerCancellation, isRetryableStatus, LlmError, } from '@mcp-abap-adt/llm-agent';
9
10
  const DEFAULT_OPTIONS = {
10
11
  maxAttempts: 3,
11
12
  backoffMs: 2000,
@@ -14,6 +15,7 @@ const DEFAULT_OPTIONS = {
14
15
  };
15
16
  export class RetryLlm {
16
17
  inner;
18
+ wait = new DefaultWaitStrategy();
17
19
  opts;
18
20
  healthCheck;
19
21
  constructor(inner, options) {
@@ -48,13 +50,15 @@ export class RetryLlm {
48
50
  }
49
51
  let chunksYielded = 0;
50
52
  let shouldRetry = false;
51
- for await (const chunk of this.inner.streamChat(messages, tools, options)) {
53
+ for await (const chunk of this.attemptStream(messages, tools, options)) {
52
54
  if (chunk.ok) {
53
55
  chunksYielded++;
54
56
  yield chunk;
55
57
  }
56
58
  else {
57
- const canRetry = attempt < this.opts.maxAttempts;
59
+ // A caller's cancellation is never retried.
60
+ const canRetry = attempt < this.opts.maxAttempts &&
61
+ !isCallerCancellation(options?.signal);
58
62
  // Pre-stream failure: retry on HTTP status codes (existing behavior)
59
63
  if (chunksYielded === 0 &&
60
64
  canRetry &&
@@ -79,6 +83,19 @@ export class RetryLlm {
79
83
  await this.backoff(attempt, options?.signal);
80
84
  }
81
85
  }
86
+ /**
87
+ * One attempt's stream, with a thrown exception (before or during iteration)
88
+ * turned into an error chunk — the same shape CircuitBreakerLlm gives it — so
89
+ * a throwing provider goes through the same retry rules as an error chunk.
90
+ */
91
+ async *attemptStream(messages, tools, options) {
92
+ try {
93
+ yield* this.inner.streamChat(messages, tools, options);
94
+ }
95
+ catch (err) {
96
+ yield { ok: false, error: new LlmError(String(err), 'LLM_ERROR') };
97
+ }
98
+ }
82
99
  isRetryable(error) {
83
100
  // A provider that runs its own rate-limit policy marks the error when that
84
101
  // policy is spent — it has already backed off, honoured Retry-After and
@@ -97,15 +114,20 @@ export class RetryLlm {
97
114
  const msg = error.message;
98
115
  return this.opts.retryOnMidStream.some((sub) => msg.includes(sub));
99
116
  }
100
- backoff(attempt, signal) {
101
- const delay = this.opts.backoffMs * 2 ** attempt;
102
- return new Promise((resolve) => {
103
- const timer = setTimeout(resolve, delay);
104
- signal?.addEventListener('abort', () => {
105
- clearTimeout(timer);
106
- resolve();
107
- }, { once: true });
108
- });
117
+ async backoff(attempt, signal) {
118
+ await this.wait.wait(this.opts.backoffMs * 2 ** attempt, signal);
119
+ }
120
+ }
121
+ /**
122
+ * Wraps `llm` in a RetryLlm placed UNDER any CircuitBreakerLlm layers it
123
+ * already has: each breaker wrapper is rebuilt on its own (possibly shared)
124
+ * breaker around the retry, so every breaker counts one result per logical
125
+ * call. Without a breaker this is plain `new RetryLlm(llm, options)`.
126
+ */
127
+ export function retryInsideBreakers(llm, options) {
128
+ if (llm instanceof CircuitBreakerLlm) {
129
+ return new CircuitBreakerLlm(retryInsideBreakers(llm.inner, options), llm.breaker);
109
130
  }
131
+ return new RetryLlm(llm, options);
110
132
  }
111
133
  //# sourceMappingURL=retry-llm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"retry-llm.js","sourceRoot":"","sources":["../../src/resilience/retry-llm.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"retry-llm.js","sourceRoot":"","sources":["../../src/resilience/retry-llm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { CallOptions, IQueryEmbedding, IRag, IRetrievalStrategy, RagError, RagResult, Result } from '@mcp-abap-adt/llm-agent';
2
+ /** Today's behaviour: the store's own (embedding) ranking. */
3
+ export declare class EmbeddingRetrieval implements IRetrievalStrategy {
4
+ readonly name = "embedding";
5
+ retrieve(store: IRag, query: IQueryEmbedding, k: number, options?: CallOptions): Promise<Result<RagResult[], RagError>>;
6
+ }
7
+ //# sourceMappingURL=embedding-retrieval.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding-retrieval.d.ts","sourceRoot":"","sources":["../../src/retrieval/embedding-retrieval.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EACf,IAAI,EACJ,kBAAkB,EAClB,QAAQ,EACR,SAAS,EACT,MAAM,EACP,MAAM,yBAAyB,CAAC;AAEjC,8DAA8D;AAC9D,qBAAa,kBAAmB,YAAW,kBAAkB;IAC3D,QAAQ,CAAC,IAAI,eAAe;IAC5B,QAAQ,CACN,KAAK,EAAE,IAAI,EACX,KAAK,EAAE,eAAe,EACtB,CAAC,EAAE,MAAM,EACT,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,QAAQ,CAAC,CAAC;CAG1C"}
@@ -0,0 +1,8 @@
1
+ /** Today's behaviour: the store's own (embedding) ranking. */
2
+ export class EmbeddingRetrieval {
3
+ name = 'embedding';
4
+ retrieve(store, query, k, options) {
5
+ return store.query(query, k, options);
6
+ }
7
+ }
8
+ //# sourceMappingURL=embedding-retrieval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding-retrieval.js","sourceRoot":"","sources":["../../src/retrieval/embedding-retrieval.ts"],"names":[],"mappings":"AAUA,8DAA8D;AAC9D,MAAM,OAAO,kBAAkB;IACpB,IAAI,GAAG,WAAW,CAAC;IAC5B,QAAQ,CACN,KAAW,EACX,KAAsB,EACtB,CAAS,EACT,OAAqB;QAErB,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ export { EmbeddingRetrieval } from './embedding-retrieval.js';
2
+ export { RerankAllRetrieval, RerankedRetrieval, } from './reranked-retrieval.js';
3
+ export { applyRetrievalStrategy, hasRetrievalStrategy, StrategyRag, } from './strategy-rag.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/retrieval/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EACL,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,WAAW,GACZ,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { EmbeddingRetrieval } from './embedding-retrieval.js';
2
+ export { RerankAllRetrieval, RerankedRetrieval, } from './reranked-retrieval.js';
3
+ export { applyRetrievalStrategy, hasRetrievalStrategy, StrategyRag, } from './strategy-rag.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/retrieval/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,EACL,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,sBAAsB,EACtB,oBAAoB,EACpB,WAAW,GACZ,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import type { CallOptions, IQueryEmbedding, IRag, IReranker, IRetrievalStrategy, RagError, RagResult, Result } from '@mcp-abap-adt/llm-agent';
2
+ /** Embedding top (k × overfetch) → rerank → top-k. */
3
+ export declare class RerankedRetrieval implements IRetrievalStrategy {
4
+ private readonly reranker;
5
+ private readonly opts;
6
+ readonly name = "rerank";
7
+ private readonly overfetch;
8
+ constructor(reranker: IReranker, opts?: {
9
+ overfetch?: number;
10
+ storeName?: string;
11
+ });
12
+ retrieve(store: IRag, query: IQueryEmbedding, k: number, options?: CallOptions): Promise<Result<RagResult[], RagError>>;
13
+ }
14
+ /**
15
+ * The store's first `maxCandidates` (configured, never assumed) → rerank all → top-k.
16
+ * Fetches at least `k`, so a `maxCandidates` below `k` never shrinks the result.
17
+ */
18
+ export declare class RerankAllRetrieval implements IRetrievalStrategy {
19
+ private readonly reranker;
20
+ private readonly opts;
21
+ readonly name = "rerank-all";
22
+ constructor(reranker: IReranker, opts: {
23
+ maxCandidates: number;
24
+ storeName?: string;
25
+ });
26
+ retrieve(store: IRag, query: IQueryEmbedding, k: number, options?: CallOptions): Promise<Result<RagResult[], RagError>>;
27
+ }
28
+ //# sourceMappingURL=reranked-retrieval.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reranked-retrieval.d.ts","sourceRoot":"","sources":["../../src/retrieval/reranked-retrieval.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EACf,IAAI,EACJ,SAAS,EACT,kBAAkB,EAClB,QAAQ,EACR,SAAS,EACT,MAAM,EACP,MAAM,yBAAyB,CAAC;AAmCjC,sDAAsD;AACtD,qBAAa,iBAAkB,YAAW,kBAAkB;IAKxD,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI;IALvB,QAAQ,CAAC,IAAI,YAAY;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAGhB,QAAQ,EAAE,SAAS,EACnB,IAAI,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO;IAMlE,QAAQ,CACZ,KAAK,EAAE,IAAI,EACX,KAAK,EAAE,eAAe,EACtB,CAAC,EAAE,MAAM,EACT,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,QAAQ,CAAC,CAAC;CAa1C;AAED;;;GAGG;AACH,qBAAa,kBAAmB,YAAW,kBAAkB;IAIzD,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAJvB,QAAQ,CAAC,IAAI,gBAAgB;gBAGV,QAAQ,EAAE,SAAS,EACnB,IAAI,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE;IAShE,QAAQ,CACZ,KAAK,EAAE,IAAI,EACX,KAAK,EAAE,eAAe,EACtB,CAAC,EAAE,MAAM,EACT,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,QAAQ,CAAC,CAAC;CAiB1C"}
@@ -0,0 +1,65 @@
1
+ import { assertPositiveInteger } from '../util/assert-positive-integer.js';
2
+ /** Cap on a thrown error's text in the step: enough for a reason, never a dump. */
3
+ const MAX_THROWN_MESSAGE = 500;
4
+ async function rerankOrFallback(name, storeName, reranker, query, candidates, k, options) {
5
+ let code;
6
+ let message;
7
+ try {
8
+ const r = await reranker.rerank(query.text, candidates, options);
9
+ if (r.ok)
10
+ return { ok: true, value: r.value.slice(0, k) };
11
+ code = r.error.code;
12
+ message = r.error.message;
13
+ }
14
+ catch (err) {
15
+ code = 'RERANK_THROWN';
16
+ message = String(err).slice(0, MAX_THROWN_MESSAGE);
17
+ }
18
+ options?.sessionLogger?.logStep('retrieval_rerank_error', {
19
+ store: storeName,
20
+ strategy: name,
21
+ code,
22
+ message,
23
+ });
24
+ return { ok: true, value: candidates.slice(0, k) };
25
+ }
26
+ /** Embedding top (k × overfetch) → rerank → top-k. */
27
+ export class RerankedRetrieval {
28
+ reranker;
29
+ opts;
30
+ name = 'rerank';
31
+ overfetch;
32
+ constructor(reranker, opts = {}) {
33
+ this.reranker = reranker;
34
+ this.opts = opts;
35
+ this.overfetch = opts.overfetch ?? 2;
36
+ assertPositiveInteger('RerankedRetrieval', 'overfetch', this.overfetch);
37
+ }
38
+ async retrieve(store, query, k, options) {
39
+ const cand = await store.query(query, k * this.overfetch, options);
40
+ if (!cand.ok)
41
+ return cand;
42
+ return rerankOrFallback(this.name, this.opts.storeName, this.reranker, query, cand.value, k, options);
43
+ }
44
+ }
45
+ /**
46
+ * The store's first `maxCandidates` (configured, never assumed) → rerank all → top-k.
47
+ * Fetches at least `k`, so a `maxCandidates` below `k` never shrinks the result.
48
+ */
49
+ export class RerankAllRetrieval {
50
+ reranker;
51
+ opts;
52
+ name = 'rerank-all';
53
+ constructor(reranker, opts) {
54
+ this.reranker = reranker;
55
+ this.opts = opts;
56
+ assertPositiveInteger('RerankAllRetrieval', 'maxCandidates', opts.maxCandidates);
57
+ }
58
+ async retrieve(store, query, k, options) {
59
+ const cand = await store.query(query, Math.max(k, this.opts.maxCandidates), options);
60
+ if (!cand.ok)
61
+ return cand;
62
+ return rerankOrFallback(this.name, this.opts.storeName, this.reranker, query, cand.value, k, options);
63
+ }
64
+ }
65
+ //# sourceMappingURL=reranked-retrieval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reranked-retrieval.js","sourceRoot":"","sources":["../../src/retrieval/reranked-retrieval.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { type CallOptions, type IQueryEmbedding, type IRag, type IRagBackendWriter, type IRagDecorator, type IRetrievalStrategy, type RagError, type RagResult, type Result } from '@mcp-abap-adt/llm-agent';
2
+ declare const BRAND: unique symbol;
3
+ /** IRag decorator: `query` goes through the strategy, everything else to `inner` (spec §13.3). */
4
+ export declare class StrategyRag implements IRag, IRagDecorator {
5
+ readonly inner: IRag;
6
+ readonly strategy: IRetrievalStrategy;
7
+ readonly [BRAND] = true;
8
+ constructor(inner: IRag, strategy: IRetrievalStrategy);
9
+ query(embedding: IQueryEmbedding, k: number, options?: CallOptions): Promise<Result<RagResult[], RagError>>;
10
+ healthCheck(options?: CallOptions): Promise<Result<void, RagError>>;
11
+ getById(id: string, options?: CallOptions): Promise<Result<RagResult | null, RagError>>;
12
+ writer(): IRagBackendWriter | undefined;
13
+ }
14
+ /** True when `rag`, or any store it decorates, carries a retrieval strategy. */
15
+ export declare function hasRetrievalStrategy(rag: IRag): boolean;
16
+ /** Wrap an explicitly configured store (embedding included); idempotent through decorators. */
17
+ export declare function applyRetrievalStrategy(rag: IRag, strategy: IRetrievalStrategy): IRag;
18
+ /**
19
+ * The store an agent queries for one of its built-in slots (`tools`, `history`).
20
+ * The agent's OWN store always has priority: the projected entry is used only
21
+ * when it carries a retrieval strategy and decorates `own` (so layers such as
22
+ * the circuit-breaker fallback are kept); otherwise `ownWithStrategy` — `own`
23
+ * with the explicit strategy applied once by the caller, or `own` itself. A
24
+ * projected entry over another agent's store (a worker sharing its parent's
25
+ * registry) never wins. Internal; not re-exported.
26
+ */
27
+ export declare function ownBuiltInStore(own: IRag, ownWithStrategy: IRag, projected: IRag | undefined): IRag;
28
+ export {};
29
+ //# sourceMappingURL=strategy-rag.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strategy-rag.d.ts","sourceRoot":"","sources":["../../src/retrieval/strategy-rag.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,IAAI,EACT,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EAEvB,KAAK,QAAQ,EACb,KAAK,SAAS,EACd,KAAK,MAAM,EACZ,MAAM,yBAAyB,CAAC;AAEjC,QAAA,MAAM,KAAK,eAA2C,CAAC;AAEvD,kGAAkG;AAClG,qBAAa,WAAY,YAAW,IAAI,EAAE,aAAa;IAGnD,QAAQ,CAAC,KAAK,EAAE,IAAI;IACpB,QAAQ,CAAC,QAAQ,EAAE,kBAAkB;IAHvC,QAAQ,CAAC,CAAC,KAAK,CAAC,QAAQ;gBAEb,KAAK,EAAE,IAAI,EACX,QAAQ,EAAE,kBAAkB;IAEvC,KAAK,CACH,SAAS,EAAE,eAAe,EAC1B,CAAC,EAAE,MAAM,EACT,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,QAAQ,CAAC,CAAC;IAGzC,WAAW,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAGnE,OAAO,CACL,EAAE,EAAE,MAAM,EACV,OAAO,CAAC,EAAE,WAAW,GACpB,OAAO,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,EAAE,QAAQ,CAAC,CAAC;IAG9C,MAAM,IAAI,iBAAiB,GAAG,SAAS;CAGxC;AAED,gFAAgF;AAChF,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,IAAI,GAAG,OAAO,CAOvD;AAED,+FAA+F;AAC/F,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,IAAI,EACT,QAAQ,EAAE,kBAAkB,GAC3B,IAAI,CAEN;AAYD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,IAAI,EACT,eAAe,EAAE,IAAI,EACrB,SAAS,EAAE,IAAI,GAAG,SAAS,GAC1B,IAAI,CAMN"}
@@ -0,0 +1,65 @@
1
+ import { isRagDecorator, } from '@mcp-abap-adt/llm-agent';
2
+ const BRAND = Symbol.for('@mcp-abap-adt/strategy-rag');
3
+ /** IRag decorator: `query` goes through the strategy, everything else to `inner` (spec §13.3). */
4
+ export class StrategyRag {
5
+ inner;
6
+ strategy;
7
+ [BRAND] = true;
8
+ constructor(inner, strategy) {
9
+ this.inner = inner;
10
+ this.strategy = strategy;
11
+ }
12
+ query(embedding, k, options) {
13
+ return this.strategy.retrieve(this.inner, embedding, k, options);
14
+ }
15
+ healthCheck(options) {
16
+ return this.inner.healthCheck(options);
17
+ }
18
+ getById(id, options) {
19
+ return this.inner.getById(id, options);
20
+ }
21
+ writer() {
22
+ return this.inner.writer?.();
23
+ }
24
+ }
25
+ /** True when `rag`, or any store it decorates, carries a retrieval strategy. */
26
+ export function hasRetrievalStrategy(rag) {
27
+ let cur = rag;
28
+ for (let depth = 0; cur && depth < 16; depth++) {
29
+ if (cur[BRAND])
30
+ return true;
31
+ cur = isRagDecorator(cur) ? cur.inner : undefined;
32
+ }
33
+ return false;
34
+ }
35
+ /** Wrap an explicitly configured store (embedding included); idempotent through decorators. */
36
+ export function applyRetrievalStrategy(rag, strategy) {
37
+ return hasRetrievalStrategy(rag) ? rag : new StrategyRag(rag, strategy);
38
+ }
39
+ /** True when `rag` is `target` or decorates it (through `IRagDecorator.inner`). */
40
+ function decorates(rag, target) {
41
+ let cur = rag;
42
+ for (let depth = 0; cur && depth < 16; depth++) {
43
+ if (cur === target)
44
+ return true;
45
+ cur = isRagDecorator(cur) ? cur.inner : undefined;
46
+ }
47
+ return false;
48
+ }
49
+ /**
50
+ * The store an agent queries for one of its built-in slots (`tools`, `history`).
51
+ * The agent's OWN store always has priority: the projected entry is used only
52
+ * when it carries a retrieval strategy and decorates `own` (so layers such as
53
+ * the circuit-breaker fallback are kept); otherwise `ownWithStrategy` — `own`
54
+ * with the explicit strategy applied once by the caller, or `own` itself. A
55
+ * projected entry over another agent's store (a worker sharing its parent's
56
+ * registry) never wins. Internal; not re-exported.
57
+ */
58
+ export function ownBuiltInStore(own, ownWithStrategy, projected) {
59
+ return projected &&
60
+ hasRetrievalStrategy(projected) &&
61
+ decorates(projected, own)
62
+ ? projected
63
+ : ownWithStrategy;
64
+ }
65
+ //# sourceMappingURL=strategy-rag.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"strategy-rag.js","sourceRoot":"","sources":["../../src/retrieval/strategy-rag.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,cAAc,GAIf,MAAM,yBAAyB,CAAC;AAEjC,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;AAEvD,kGAAkG;AAClG,MAAM,OAAO,WAAW;IAGX;IACA;IAHF,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC;IACxB,YACW,KAAW,EACX,QAA4B;QAD5B,UAAK,GAAL,KAAK,CAAM;QACX,aAAQ,GAAR,QAAQ,CAAoB;IACpC,CAAC;IACJ,KAAK,CACH,SAA0B,EAC1B,CAAS,EACT,OAAqB;QAErB,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;IACnE,CAAC;IACD,WAAW,CAAC,OAAqB;QAC/B,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,CACL,EAAU,EACV,OAAqB;QAErB,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;IACzC,CAAC;IACD,MAAM;QACJ,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;IAC/B,CAAC;CACF;AAED,gFAAgF;AAChF,MAAM,UAAU,oBAAoB,CAAC,GAAS;IAC5C,IAAI,GAAG,GAAqB,GAAG,CAAC;IAChC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,GAAG,IAAI,KAAK,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC;QAC/C,IAAK,GAA6B,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QACvD,GAAG,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACpD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,sBAAsB,CACpC,GAAS,EACT,QAA4B;IAE5B,OAAO,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;AAC1E,CAAC;AAED,mFAAmF;AACnF,SAAS,SAAS,CAAC,GAAS,EAAE,MAAY;IACxC,IAAI,GAAG,GAAqB,GAAG,CAAC;IAChC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,GAAG,IAAI,KAAK,GAAG,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC;QAC/C,IAAI,GAAG,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC;QAChC,GAAG,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACpD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,eAAe,CAC7B,GAAS,EACT,eAAqB,EACrB,SAA2B;IAE3B,OAAO,SAAS;QACd,oBAAoB,CAAC,SAAS,CAAC;QAC/B,SAAS,CAAC,SAAS,EAAE,GAAG,CAAC;QACzB,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,eAAe,CAAC;AACtB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Throw unless `v` is a finite positive integer (NaN, Infinity, 0, negatives
3
+ * and fractions are refused). Used by constructors whose numeric options size
4
+ * loops: `Math.max(1, NaN)` is NaN, and a NaN loop bound runs nothing.
5
+ */
6
+ export declare function assertPositiveInteger(cls: string, field: string, v: number): void;
7
+ //# sourceMappingURL=assert-positive-integer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assert-positive-integer.d.ts","sourceRoot":"","sources":["../../src/util/assert-positive-integer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,EACb,CAAC,EAAE,MAAM,GACR,IAAI,CAIN"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Throw unless `v` is a finite positive integer (NaN, Infinity, 0, negatives
3
+ * and fractions are refused). Used by constructors whose numeric options size
4
+ * loops: `Math.max(1, NaN)` is NaN, and a NaN loop bound runs nothing.
5
+ */
6
+ export function assertPositiveInteger(cls, field, v) {
7
+ if (!Number.isInteger(v) || v < 1) {
8
+ throw new Error(`${cls}: ${field} must be a positive integer (got ${v})`);
9
+ }
10
+ }
11
+ //# sourceMappingURL=assert-positive-integer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assert-positive-integer.js","sourceRoot":"","sources":["../../src/util/assert-positive-integer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CACnC,GAAW,EACX,KAAa,EACb,CAAS;IAET,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,GAAG,GAAG,KAAK,KAAK,oCAAoC,CAAC,GAAG,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { SmartAgentError } from '@mcp-abap-adt/llm-agent';
2
+ /**
3
+ * Race `promise` against the caller's abort signal. The `abort` listener is
4
+ * removed from the signal once the race settles (resolve, reject or abort), so
5
+ * a long-lived signal does not accumulate one listener per call.
6
+ */
7
+ export declare function withAbort<T>(promise: Promise<T>, signal: AbortSignal | undefined, makeError: () => SmartAgentError): Promise<T>;
8
+ //# sourceMappingURL=with-abort.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with-abort.d.ts","sourceRoot":"","sources":["../../src/utils/with-abort.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,CAAC,EACzB,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,SAAS,EAAE,MAAM,eAAe,GAC/B,OAAO,CAAC,CAAC,CAAC,CAWZ"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Race `promise` against the caller's abort signal. The `abort` listener is
3
+ * removed from the signal once the race settles (resolve, reject or abort), so
4
+ * a long-lived signal does not accumulate one listener per call.
5
+ */
6
+ export function withAbort(promise, signal, makeError) {
7
+ if (!signal)
8
+ return promise;
9
+ if (signal.aborted)
10
+ return Promise.reject(makeError());
11
+ let onAbort;
12
+ const aborted = new Promise((_, reject) => {
13
+ onAbort = () => reject(makeError());
14
+ signal.addEventListener('abort', onAbort, { once: true });
15
+ });
16
+ return Promise.race([promise, aborted]).finally(() => {
17
+ if (onAbort)
18
+ signal.removeEventListener('abort', onAbort);
19
+ });
20
+ }
21
+ //# sourceMappingURL=with-abort.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with-abort.js","sourceRoot":"","sources":["../../src/utils/with-abort.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,SAAS,CACvB,OAAmB,EACnB,MAA+B,EAC/B,SAAgC;IAEhC,IAAI,CAAC,MAAM;QAAE,OAAO,OAAO,CAAC;IAC5B,IAAI,MAAM,CAAC,OAAO;QAAE,OAAO,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IACvD,IAAI,OAAiC,CAAC;IACtC,MAAM,OAAO,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QAC/C,OAAO,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;QACpC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;IACH,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE;QACnD,IAAI,OAAO;YAAE,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC5D,CAAC,CAAC,CAAC;AACL,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcp-abap-adt/llm-agent-libs",
3
- "version": "30.0.0",
3
+ "version": "30.1.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -44,8 +44,8 @@
44
44
  "license": "LGPL-3.0-only",
45
45
  "peerDependencies": {
46
46
  "@mcp-abap-adt/interfaces-auth": "^2.1.0",
47
- "@mcp-abap-adt/llm-agent": "^30.0.0",
48
- "@mcp-abap-adt/llm-agent-mcp": "^30.0.0",
49
- "@mcp-abap-adt/llm-agent-rag": "^30.0.0"
47
+ "@mcp-abap-adt/llm-agent": "^30.1.0",
48
+ "@mcp-abap-adt/llm-agent-mcp": "^30.1.0",
49
+ "@mcp-abap-adt/llm-agent-rag": "^30.1.0"
50
50
  }
51
51
  }