@mcp-abap-adt/llm-agent-libs 16.2.0 → 17.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 (154) hide show
  1. package/dist/adapters/llm-provider-bridge.js +2 -2
  2. package/dist/adapters/llm-provider-bridge.js.map +1 -1
  3. package/dist/agent.d.ts.map +1 -1
  4. package/dist/agent.js +48 -37
  5. package/dist/agent.js.map +1 -1
  6. package/dist/builder.d.ts +10 -0
  7. package/dist/builder.d.ts.map +1 -1
  8. package/dist/builder.js +17 -3
  9. package/dist/builder.js.map +1 -1
  10. package/dist/classifier/llm-classifier.d.ts.map +1 -1
  11. package/dist/classifier/llm-classifier.js +1 -0
  12. package/dist/classifier/llm-classifier.js.map +1 -1
  13. package/dist/coordinator/dag/abort-error-strategy.d.ts +7 -0
  14. package/dist/coordinator/dag/abort-error-strategy.d.ts.map +1 -0
  15. package/dist/coordinator/dag/abort-error-strategy.js +8 -0
  16. package/dist/coordinator/dag/abort-error-strategy.js.map +1 -0
  17. package/dist/coordinator/dag/compose-node-task.d.ts +8 -0
  18. package/dist/coordinator/dag/compose-node-task.d.ts.map +1 -0
  19. package/dist/coordinator/dag/compose-node-task.js +41 -0
  20. package/dist/coordinator/dag/compose-node-task.js.map +1 -0
  21. package/dist/coordinator/dag/dag-plan-interpreter.d.ts +9 -0
  22. package/dist/coordinator/dag/dag-plan-interpreter.d.ts.map +1 -0
  23. package/dist/coordinator/dag/dag-plan-interpreter.js +220 -0
  24. package/dist/coordinator/dag/dag-plan-interpreter.js.map +1 -0
  25. package/dist/coordinator/dag/index.d.ts +5 -0
  26. package/dist/coordinator/dag/index.d.ts.map +1 -0
  27. package/dist/coordinator/dag/index.js +5 -0
  28. package/dist/coordinator/dag/index.js.map +1 -0
  29. package/dist/coordinator/dag/llm-dag-planner.d.ts +17 -0
  30. package/dist/coordinator/dag/llm-dag-planner.d.ts.map +1 -0
  31. package/dist/coordinator/dag/llm-dag-planner.js +152 -0
  32. package/dist/coordinator/dag/llm-dag-planner.js.map +1 -0
  33. package/dist/coordinator/dag/llm-finalizer.d.ts +21 -0
  34. package/dist/coordinator/dag/llm-finalizer.d.ts.map +1 -0
  35. package/dist/coordinator/dag/llm-finalizer.js +77 -0
  36. package/dist/coordinator/dag/llm-finalizer.js.map +1 -0
  37. package/dist/coordinator/dag/llm-review-strategy.d.ts +17 -0
  38. package/dist/coordinator/dag/llm-review-strategy.d.ts.map +1 -0
  39. package/dist/coordinator/dag/llm-review-strategy.js +149 -0
  40. package/dist/coordinator/dag/llm-review-strategy.js.map +1 -0
  41. package/dist/coordinator/dag/noop-review-strategy.d.ts +8 -0
  42. package/dist/coordinator/dag/noop-review-strategy.d.ts.map +1 -0
  43. package/dist/coordinator/dag/noop-review-strategy.js +11 -0
  44. package/dist/coordinator/dag/noop-review-strategy.js.map +1 -0
  45. package/dist/coordinator/dag/passthrough-finalizer.d.ts +11 -0
  46. package/dist/coordinator/dag/passthrough-finalizer.d.ts.map +1 -0
  47. package/dist/coordinator/dag/passthrough-finalizer.js +13 -0
  48. package/dist/coordinator/dag/passthrough-finalizer.js.map +1 -0
  49. package/dist/coordinator/dag/render-ancestor-context.d.ts +8 -0
  50. package/dist/coordinator/dag/render-ancestor-context.d.ts.map +1 -0
  51. package/dist/coordinator/dag/render-ancestor-context.js +27 -0
  52. package/dist/coordinator/dag/render-ancestor-context.js.map +1 -0
  53. package/dist/coordinator/dag/replan-error-strategy.d.ts +15 -0
  54. package/dist/coordinator/dag/replan-error-strategy.d.ts.map +1 -0
  55. package/dist/coordinator/dag/replan-error-strategy.js +32 -0
  56. package/dist/coordinator/dag/replan-error-strategy.js.map +1 -0
  57. package/dist/coordinator/dag/reviewer-error-strategy.d.ts +15 -0
  58. package/dist/coordinator/dag/reviewer-error-strategy.d.ts.map +1 -0
  59. package/dist/coordinator/dag/reviewer-error-strategy.js +38 -0
  60. package/dist/coordinator/dag/reviewer-error-strategy.js.map +1 -0
  61. package/dist/coordinator/dag/splice-sub-plan.d.ts +12 -0
  62. package/dist/coordinator/dag/splice-sub-plan.d.ts.map +1 -0
  63. package/dist/coordinator/dag/splice-sub-plan.js +41 -0
  64. package/dist/coordinator/dag/splice-sub-plan.js.map +1 -0
  65. package/dist/coordinator/dag/subagent-state-oracle.d.ts +19 -0
  66. package/dist/coordinator/dag/subagent-state-oracle.d.ts.map +1 -0
  67. package/dist/coordinator/dag/subagent-state-oracle.js +31 -0
  68. package/dist/coordinator/dag/subagent-state-oracle.js.map +1 -0
  69. package/dist/coordinator/dag/template-finalizer.d.ts +11 -0
  70. package/dist/coordinator/dag/template-finalizer.d.ts.map +1 -0
  71. package/dist/coordinator/dag/template-finalizer.js +17 -0
  72. package/dist/coordinator/dag/template-finalizer.js.map +1 -0
  73. package/dist/coordinator/dispatch/subagent.d.ts.map +1 -1
  74. package/dist/coordinator/dispatch/subagent.js +6 -12
  75. package/dist/coordinator/dispatch/subagent.js.map +1 -1
  76. package/dist/coordinator/index.d.ts +6 -0
  77. package/dist/coordinator/index.d.ts.map +1 -1
  78. package/dist/coordinator/index.js +6 -0
  79. package/dist/coordinator/index.js.map +1 -1
  80. package/dist/coordinator/planning/one-shot.d.ts.map +1 -1
  81. package/dist/coordinator/planning/one-shot.js +14 -7
  82. package/dist/coordinator/planning/one-shot.js.map +1 -1
  83. package/dist/index.d.ts +8 -2
  84. package/dist/index.d.ts.map +1 -1
  85. package/dist/index.js +5 -1
  86. package/dist/index.js.map +1 -1
  87. package/dist/logger/default-request-logger.d.ts +18 -6
  88. package/dist/logger/default-request-logger.d.ts.map +1 -1
  89. package/dist/logger/default-request-logger.js +15 -4
  90. package/dist/logger/default-request-logger.js.map +1 -1
  91. package/dist/logger/noop-request-logger.d.ts +10 -5
  92. package/dist/logger/noop-request-logger.d.ts.map +1 -1
  93. package/dist/logger/noop-request-logger.js +4 -3
  94. package/dist/logger/noop-request-logger.js.map +1 -1
  95. package/dist/logger/session-request-logger.d.ts +50 -0
  96. package/dist/logger/session-request-logger.d.ts.map +1 -0
  97. package/dist/logger/session-request-logger.js +151 -0
  98. package/dist/logger/session-request-logger.js.map +1 -0
  99. package/dist/pipeline/context.d.ts +8 -3
  100. package/dist/pipeline/context.d.ts.map +1 -1
  101. package/dist/pipeline/default-pipeline.d.ts +27 -4
  102. package/dist/pipeline/default-pipeline.d.ts.map +1 -1
  103. package/dist/pipeline/default-pipeline.js +42 -7
  104. package/dist/pipeline/default-pipeline.js.map +1 -1
  105. package/dist/pipeline/handlers/coordinator.d.ts +0 -3
  106. package/dist/pipeline/handlers/coordinator.d.ts.map +1 -1
  107. package/dist/pipeline/handlers/coordinator.js +33 -22
  108. package/dist/pipeline/handlers/coordinator.js.map +1 -1
  109. package/dist/pipeline/handlers/dag-coordinator.d.ts +47 -0
  110. package/dist/pipeline/handlers/dag-coordinator.d.ts.map +1 -0
  111. package/dist/pipeline/handlers/dag-coordinator.js +369 -0
  112. package/dist/pipeline/handlers/dag-coordinator.js.map +1 -0
  113. package/dist/pipeline/handlers/index.d.ts +7 -0
  114. package/dist/pipeline/handlers/index.d.ts.map +1 -1
  115. package/dist/pipeline/handlers/index.js +5 -1
  116. package/dist/pipeline/handlers/index.js.map +1 -1
  117. package/dist/pipeline/handlers/rag-query.d.ts.map +1 -1
  118. package/dist/pipeline/handlers/rag-query.js +1 -0
  119. package/dist/pipeline/handlers/rag-query.js.map +1 -1
  120. package/dist/pipeline/handlers/subagent.d.ts.map +1 -1
  121. package/dist/pipeline/handlers/subagent.js +0 -2
  122. package/dist/pipeline/handlers/subagent.js.map +1 -1
  123. package/dist/pipeline/handlers/summarize.d.ts.map +1 -1
  124. package/dist/pipeline/handlers/summarize.js +5 -0
  125. package/dist/pipeline/handlers/summarize.js.map +1 -1
  126. package/dist/pipeline/handlers/tool-loop.d.ts.map +1 -1
  127. package/dist/pipeline/handlers/tool-loop.js +16 -0
  128. package/dist/pipeline/handlers/tool-loop.js.map +1 -1
  129. package/dist/pipeline/handlers/translate.d.ts.map +1 -1
  130. package/dist/pipeline/handlers/translate.js +1 -0
  131. package/dist/pipeline/handlers/translate.js.map +1 -1
  132. package/dist/pipeline/index.d.ts +2 -1
  133. package/dist/pipeline/index.d.ts.map +1 -1
  134. package/dist/pipeline/index.js +1 -1
  135. package/dist/pipeline/index.js.map +1 -1
  136. package/dist/session/session-graph-factory.d.ts +66 -0
  137. package/dist/session/session-graph-factory.d.ts.map +1 -0
  138. package/dist/session/session-graph-factory.js +63 -0
  139. package/dist/session/session-graph-factory.js.map +1 -0
  140. package/dist/session/session-graph.d.ts +54 -0
  141. package/dist/session/session-graph.d.ts.map +1 -0
  142. package/dist/session/session-graph.js +76 -0
  143. package/dist/session/session-graph.js.map +1 -0
  144. package/dist/session/session-registry.d.ts +89 -0
  145. package/dist/session/session-registry.d.ts.map +1 -0
  146. package/dist/session/session-registry.js +279 -0
  147. package/dist/session/session-registry.js.map +1 -0
  148. package/dist/subagent/direct-llm-subagent.d.ts.map +1 -1
  149. package/dist/subagent/direct-llm-subagent.js +0 -2
  150. package/dist/subagent/direct-llm-subagent.js.map +1 -1
  151. package/dist/subagent/smart-agent-subagent.d.ts.map +1 -1
  152. package/dist/subagent/smart-agent-subagent.js +3 -3
  153. package/dist/subagent/smart-agent-subagent.js.map +1 -1
  154. package/package.json +14 -14
@@ -0,0 +1,89 @@
1
+ import type { SessionGraph } from './session-graph.js';
2
+ import type { SessionGraphIdentity } from './session-graph-factory.js';
3
+ /** Minimal seam over SessionGraphFactory so the registry is unit-testable. */
4
+ export interface SessionGraphSource {
5
+ build(identity: SessionGraphIdentity): Promise<SessionGraph>;
6
+ }
7
+ export interface SessionRegistryOptions {
8
+ /** Idle time before an unpinned graph is evicted. */
9
+ idleTtlMs: number;
10
+ /** Max live sessions before LRU eviction of unpinned graphs (drain if pinned). */
11
+ maxSessions: number;
12
+ factory: SessionGraphSource;
13
+ }
14
+ export declare class SessionRegistry {
15
+ private readonly opts;
16
+ private readonly graphs;
17
+ /**
18
+ * Graphs detached from `graphs` because they were pinned at the moment
19
+ * `invalidateAll()` was called. We cannot dispose mid-run, so we move them
20
+ * here to drain — once their last in-flight `release()` lands, dispose
21
+ * fires. They are NOT served to new `acquire()` calls, which forces those
22
+ * to mint a fresh graph using the just-applied config. Keyed by sessionId
23
+ * so `release()` can find them after `graphs.get(sessionId)` misses.
24
+ */
25
+ private readonly draining;
26
+ /** Single-flight guard: in-flight builds keyed by sessionId (review HIGH #2). */
27
+ private readonly pendingBuilds;
28
+ private readonly pending;
29
+ /**
30
+ * Set by `disposeAll` BEFORE any await. While closed the registry refuses new
31
+ * `acquire` calls so a post-shutdown caller cannot orphan a fresh graph past
32
+ * disposal. Defense-in-depth — the server's `close()` drains HTTP first, so
33
+ * in practice no acquire arrives after disposeAll.
34
+ */
35
+ private _closed;
36
+ /**
37
+ * Monotonic counter bumped by `invalidateAll()` (Fix #19). Each acquire
38
+ * captures the value BEFORE awaiting the build; if the counter has moved
39
+ * by the time the build resolves, the in-flight build is treated as
40
+ * orphaned — its `.then()` disposes the resolved graph instead of
41
+ * publishing it, and the awaiting acquire rejects. Closes the race where
42
+ * a build started before invalidate would otherwise publish a graph built
43
+ * with the OLD config after the invalidate completed.
44
+ */
45
+ private _generation;
46
+ constructor(opts: SessionRegistryOptions);
47
+ get size(): number;
48
+ /**
49
+ * Lazy-build + pin. Async because factory.build is async. SINGLE-FLIGHT: two
50
+ * concurrent acquires for the SAME new sessionId await the SAME build promise
51
+ * and receive the identical graph (never two graphs for one session). Each
52
+ * in-flight request increments the refcount (spec A.4).
53
+ */
54
+ acquire(sessionId: string): Promise<SessionGraph>;
55
+ /**
56
+ * Release one in-flight request. Non-creating lookup: an unknown/removed
57
+ * sessionId is a no-op (never resurrect). Disposes a marked graph once idle.
58
+ */
59
+ release(sessionId: string, graph?: SessionGraph): void;
60
+ /** Evict every unpinned graph idle longer than idleTtlMs. */
61
+ evictIdle(): Promise<void>;
62
+ /** Resolve all in-flight dispose() calls (test + shutdown helper). */
63
+ flushEvictions(): Promise<void>;
64
+ /**
65
+ * Dispose every graph (server shutdown). Awaits in-flight builds FIRST so
66
+ * graphs whose build resolves after disposeAll's initial sweep are not
67
+ * orphaned. `allSettled` is intentional: a failed build must not reject
68
+ * disposeAll (the failing build cleared its pendingBuilds slot in its own
69
+ * catch handler, so there is nothing to dispose for it).
70
+ */
71
+ disposeAll(): Promise<void>;
72
+ /**
73
+ * Soft reset — dispose every graph but keep the registry OPEN for new
74
+ * acquires. Used by config-reload (PUT /v1/config + hot-reload) to force
75
+ * the next request to mint a fresh per-session graph that picks up the
76
+ * just-applied config. Unpinned graphs are disposed immediately; pinned
77
+ * graphs are marked for disposal (drained when their last in-flight
78
+ * request releases) — same drain semantics as `enforceCap`.
79
+ *
80
+ * Unlike `disposeAll`, this does NOT set `_closed`, so callers can keep
81
+ * serving traffic after a config change.
82
+ */
83
+ invalidateAll(): Promise<void>;
84
+ private enforceCap;
85
+ /** Sessions that still count toward the cap (not yet draining). */
86
+ private liveCount;
87
+ private evictNow;
88
+ }
89
+ //# sourceMappingURL=session-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-registry.d.ts","sourceRoot":"","sources":["../../src/session/session-registry.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAEvE,8EAA8E;AAC9E,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,QAAQ,EAAE,oBAAoB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CAC9D;AAED,MAAM,WAAW,sBAAsB;IACrC,qDAAqD;IACrD,SAAS,EAAE,MAAM,CAAC;IAClB,kFAAkF;IAClF,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,kBAAkB,CAAC;CAC7B;AAED,qBAAa,eAAe;IAgCd,OAAO,CAAC,QAAQ,CAAC,IAAI;IA/BjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmC;IAC1D;;;;;;;OAOG;IACH,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAC5D,iFAAiF;IACjF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAA4C;IAC1E,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAuB;IAC/C;;;;;OAKG;IACH,OAAO,CAAC,OAAO,CAAS;IACxB;;;;;;;;OAQG;IACH,OAAO,CAAC,WAAW,CAAK;gBAEK,IAAI,EAAE,sBAAsB;IAEzD,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;;;;OAKG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAiFvD;;;OAGG;IACH,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,YAAY,GAAG,IAAI;IA2CtD,6DAA6D;IACvD,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAUhC,sEAAsE;IAChE,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrC;;;;;;OAMG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAoBjC;;;;;;;;;;OAUG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IA6BpC,OAAO,CAAC,UAAU;IAuBlB,mEAAmE;IACnE,OAAO,CAAC,SAAS;IAMjB,OAAO,CAAC,QAAQ;CAIjB"}
@@ -0,0 +1,279 @@
1
+ import { OrchestratorError } from '@mcp-abap-adt/llm-agent';
2
+ export class SessionRegistry {
3
+ opts;
4
+ graphs = new Map();
5
+ /**
6
+ * Graphs detached from `graphs` because they were pinned at the moment
7
+ * `invalidateAll()` was called. We cannot dispose mid-run, so we move them
8
+ * here to drain — once their last in-flight `release()` lands, dispose
9
+ * fires. They are NOT served to new `acquire()` calls, which forces those
10
+ * to mint a fresh graph using the just-applied config. Keyed by sessionId
11
+ * so `release()` can find them after `graphs.get(sessionId)` misses.
12
+ */
13
+ draining = new Map();
14
+ /** Single-flight guard: in-flight builds keyed by sessionId (review HIGH #2). */
15
+ pendingBuilds = new Map();
16
+ pending = [];
17
+ /**
18
+ * Set by `disposeAll` BEFORE any await. While closed the registry refuses new
19
+ * `acquire` calls so a post-shutdown caller cannot orphan a fresh graph past
20
+ * disposal. Defense-in-depth — the server's `close()` drains HTTP first, so
21
+ * in practice no acquire arrives after disposeAll.
22
+ */
23
+ _closed = false;
24
+ /**
25
+ * Monotonic counter bumped by `invalidateAll()` (Fix #19). Each acquire
26
+ * captures the value BEFORE awaiting the build; if the counter has moved
27
+ * by the time the build resolves, the in-flight build is treated as
28
+ * orphaned — its `.then()` disposes the resolved graph instead of
29
+ * publishing it, and the awaiting acquire rejects. Closes the race where
30
+ * a build started before invalidate would otherwise publish a graph built
31
+ * with the OLD config after the invalidate completed.
32
+ */
33
+ _generation = 0;
34
+ constructor(opts) {
35
+ this.opts = opts;
36
+ }
37
+ get size() {
38
+ return this.graphs.size;
39
+ }
40
+ /**
41
+ * Lazy-build + pin. Async because factory.build is async. SINGLE-FLIGHT: two
42
+ * concurrent acquires for the SAME new sessionId await the SAME build promise
43
+ * and receive the identical graph (never two graphs for one session). Each
44
+ * in-flight request increments the refcount (spec A.4).
45
+ */
46
+ async acquire(sessionId) {
47
+ if (this._closed) {
48
+ throw new OrchestratorError('SessionRegistry is closed; cannot acquire', 'SESSION_REGISTRY_CLOSED');
49
+ }
50
+ // Capture generation BEFORE awaiting the build (Fix #19). If
51
+ // invalidateAll() bumps the counter mid-build, the build's `.then()`
52
+ // disposes the resolved graph instead of publishing it, and the
53
+ // post-await check below rejects this acquire.
54
+ const gen = this._generation;
55
+ let g = this.graphs.get(sessionId);
56
+ if (!g) {
57
+ let build = this.pendingBuilds.get(sessionId);
58
+ if (!build) {
59
+ const buildGen = gen;
60
+ // Forward reference so .then/.catch can identify "are we still the
61
+ // entry in pendingBuilds?" (Fix #20). Without this, a stale
62
+ // invalidated build A would unconditionally delete the pendingBuilds
63
+ // slot — evicting a NEWER in-flight build B that took A's place
64
+ // after `invalidateAll()` cleared pendingBuilds.
65
+ let self;
66
+ const clearIfMine = () => {
67
+ if (this.pendingBuilds.get(sessionId) === self) {
68
+ this.pendingBuilds.delete(sessionId);
69
+ }
70
+ };
71
+ build = this.opts.factory
72
+ .build({ sessionId })
73
+ .then((graph) => {
74
+ if (this._generation !== buildGen) {
75
+ // Orphaned by invalidateAll(); dispose async and do NOT
76
+ // publish into `graphs` (which would be a stale-config graph).
77
+ this.pending.push(graph.dispose());
78
+ clearIfMine();
79
+ throw new OrchestratorError('Session graph invalidated mid-build', 'SESSION_INVALIDATED');
80
+ }
81
+ this.graphs.set(sessionId, graph);
82
+ clearIfMine();
83
+ this.enforceCap();
84
+ return graph;
85
+ })
86
+ .catch((err) => {
87
+ // Clear the in-flight entry so a later request can retry the build
88
+ // — but ONLY if we are still the current entry (Fix #20).
89
+ clearIfMine();
90
+ throw err;
91
+ });
92
+ self = build;
93
+ this.pendingBuilds.set(sessionId, build);
94
+ }
95
+ g = await build;
96
+ }
97
+ // Re-check after the await: disposeAll() may have completed during the
98
+ // build's then-callback, which inserts the graph and then disposes it.
99
+ // Without this re-check the post-await continuation would acquire() on a
100
+ // disposed graph (SessionGraph.acquire() also guards via _disposed —
101
+ // defense in depth).
102
+ if (this._closed) {
103
+ throw new OrchestratorError('SessionRegistry is closed; cannot acquire', 'SESSION_REGISTRY_CLOSED');
104
+ }
105
+ // Mid-build invalidate check (Fix #19). If we awaited an existing
106
+ // pending build whose `.then()` had not yet observed the bump (different
107
+ // task ordering than the throw path above), still refuse to publish.
108
+ if (this._generation !== gen) {
109
+ throw new OrchestratorError('Session graph invalidated mid-build', 'SESSION_INVALIDATED');
110
+ }
111
+ g.acquire();
112
+ return g;
113
+ }
114
+ /**
115
+ * Release one in-flight request. Non-creating lookup: an unknown/removed
116
+ * sessionId is a no-op (never resurrect). Disposes a marked graph once idle.
117
+ */
118
+ release(sessionId, graph) {
119
+ // When the caller passes the exact graph reference they acquired (recent
120
+ // change required by `invalidateAll`), use it directly — a draining graph
121
+ // and a freshly-built replacement may coexist under the same sessionId,
122
+ // and only the original graph instance must be decremented.
123
+ if (graph) {
124
+ graph.release();
125
+ if (!graph.isPinned) {
126
+ const drain = this.draining.get(sessionId);
127
+ if (drain === graph) {
128
+ this.draining.delete(sessionId);
129
+ this.pending.push(graph.dispose());
130
+ return;
131
+ }
132
+ if (graph.markedForDisposal) {
133
+ const live = this.graphs.get(sessionId);
134
+ if (live === graph)
135
+ this.graphs.delete(sessionId);
136
+ this.pending.push(graph.dispose());
137
+ }
138
+ }
139
+ return;
140
+ }
141
+ // Legacy by-sessionId path — preserved for callers that haven't been
142
+ // updated. When a draining entry exists it wins (those graphs are
143
+ // detached and otherwise unreachable for release).
144
+ const drain = this.draining.get(sessionId);
145
+ if (drain) {
146
+ drain.release();
147
+ if (!drain.isPinned) {
148
+ this.draining.delete(sessionId);
149
+ this.pending.push(drain.dispose());
150
+ }
151
+ return;
152
+ }
153
+ const g = this.graphs.get(sessionId);
154
+ if (!g)
155
+ return;
156
+ g.release();
157
+ if (g.markedForDisposal && !g.isPinned) {
158
+ this.graphs.delete(sessionId);
159
+ this.pending.push(g.dispose());
160
+ }
161
+ }
162
+ /** Evict every unpinned graph idle longer than idleTtlMs. */
163
+ async evictIdle() {
164
+ const now = Date.now();
165
+ for (const [id, g] of this.graphs) {
166
+ if (!g.isPinned && now - g.lastUsedMs >= this.opts.idleTtlMs) {
167
+ this.evictNow(id, g);
168
+ }
169
+ }
170
+ await this.flushEvictions();
171
+ }
172
+ /** Resolve all in-flight dispose() calls (test + shutdown helper). */
173
+ async flushEvictions() {
174
+ await Promise.all(this.pending.splice(0));
175
+ }
176
+ /**
177
+ * Dispose every graph (server shutdown). Awaits in-flight builds FIRST so
178
+ * graphs whose build resolves after disposeAll's initial sweep are not
179
+ * orphaned. `allSettled` is intentional: a failed build must not reject
180
+ * disposeAll (the failing build cleared its pendingBuilds slot in its own
181
+ * catch handler, so there is nothing to dispose for it).
182
+ */
183
+ async disposeAll() {
184
+ // Mark closed BEFORE the first await so concurrent acquire() calls observe
185
+ // the closed state and reject — never start a build that escapes disposal.
186
+ this._closed = true;
187
+ if (this.pendingBuilds.size > 0) {
188
+ await Promise.allSettled([...this.pendingBuilds.values()]);
189
+ }
190
+ for (const [id, g] of this.graphs) {
191
+ this.graphs.delete(id);
192
+ this.pending.push(g.dispose());
193
+ }
194
+ // Drain any graphs detached by a prior `invalidateAll()`.
195
+ for (const [id, g] of this.draining) {
196
+ this.draining.delete(id);
197
+ this.pending.push(g.dispose());
198
+ }
199
+ this.pendingBuilds.clear();
200
+ await this.flushEvictions();
201
+ }
202
+ /**
203
+ * Soft reset — dispose every graph but keep the registry OPEN for new
204
+ * acquires. Used by config-reload (PUT /v1/config + hot-reload) to force
205
+ * the next request to mint a fresh per-session graph that picks up the
206
+ * just-applied config. Unpinned graphs are disposed immediately; pinned
207
+ * graphs are marked for disposal (drained when their last in-flight
208
+ * request releases) — same drain semantics as `enforceCap`.
209
+ *
210
+ * Unlike `disposeAll`, this does NOT set `_closed`, so callers can keep
211
+ * serving traffic after a config change.
212
+ */
213
+ async invalidateAll() {
214
+ // Bump generation FIRST (Fix #19). Any in-flight build's `.then()` will
215
+ // observe the new value and dispose its result instead of publishing it.
216
+ this._generation++;
217
+ for (const [id, g] of [...this.graphs]) {
218
+ if (g.isPinned) {
219
+ // Detach: move to the draining side-map so a fresh `acquire(id)`
220
+ // builds a NEW graph with the just-applied config, while the
221
+ // original pinned graph keeps serving its current in-flight
222
+ // request until its last `release(id, graph)` lands.
223
+ g.markForDisposal();
224
+ this.graphs.delete(id);
225
+ this.draining.set(id, g);
226
+ }
227
+ else {
228
+ this.evictNow(id, g);
229
+ }
230
+ }
231
+ // Also abandon any in-flight builds — when they resolve they will insert
232
+ // their graph back into `graphs`, but we want next acquires to rebuild
233
+ // using the new config. Clearing pendingBuilds means the next acquire
234
+ // will start a fresh build; the resolved-but-orphan graph is unpinned
235
+ // and will be evicted by enforceCap (it never gets returned to a caller
236
+ // because the acquire that started it already returned the OLD graph).
237
+ // Defense-in-depth: pendingBuilds is rarely non-empty at config-change
238
+ // time in practice.
239
+ this.pendingBuilds.clear();
240
+ await this.flushEvictions();
241
+ }
242
+ enforceCap() {
243
+ while (this.liveCount() > this.opts.maxSessions) {
244
+ let lruId;
245
+ let lruGraph;
246
+ let lruTime = Number.POSITIVE_INFINITY;
247
+ for (const [id, g] of this.graphs) {
248
+ if (g.markedForDisposal)
249
+ continue; // already draining
250
+ if (g.lastUsedMs < lruTime) {
251
+ lruTime = g.lastUsedMs;
252
+ lruId = id;
253
+ lruGraph = g;
254
+ }
255
+ }
256
+ if (!lruId || !lruGraph)
257
+ break; // nothing left to mark
258
+ if (lruGraph.isPinned) {
259
+ // DRAIN: cannot dispose mid-run; mark and stop (release() finishes it).
260
+ lruGraph.markForDisposal();
261
+ break;
262
+ }
263
+ this.evictNow(lruId, lruGraph);
264
+ }
265
+ }
266
+ /** Sessions that still count toward the cap (not yet draining). */
267
+ liveCount() {
268
+ let n = 0;
269
+ for (const g of this.graphs.values())
270
+ if (!g.markedForDisposal)
271
+ n++;
272
+ return n;
273
+ }
274
+ evictNow(sessionId, g) {
275
+ this.graphs.delete(sessionId);
276
+ this.pending.push(g.dispose());
277
+ }
278
+ }
279
+ //# sourceMappingURL=session-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-registry.js","sourceRoot":"","sources":["../../src/session/session-registry.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"direct-llm-subagent.d.ts","sourceRoot":"","sources":["../../src/subagent/direct-llm-subagent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,IAAI,EACJ,SAAS,EACT,cAAc,EACd,eAAe,EAEf,oBAAoB,EACrB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,wBAAwB;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC;CACvD;AAED;;;;;;;GAOG;AACH,qBAAa,iBAAkB,YAAW,SAAS;aAM/B,IAAI,EAAE,MAAM;IAC5B,OAAO,CAAC,QAAQ,CAAC,GAAG;IANtB,SAAgB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrC,SAAgB,YAAY,EAAE,oBAAoB,CAAC;IACnD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAGpB,IAAI,EAAE,MAAM,EACX,GAAG,EAAE,IAAI,EAC1B,IAAI,EAAE,wBAAwB;IAW1B,GAAG,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;CAiC3D"}
1
+ {"version":3,"file":"direct-llm-subagent.d.ts","sourceRoot":"","sources":["../../src/subagent/direct-llm-subagent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,IAAI,EACJ,SAAS,EACT,cAAc,EACd,eAAe,EAEf,oBAAoB,EACrB,MAAM,yBAAyB,CAAC;AAEjC,MAAM,WAAW,wBAAwB;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,UAAU,GAAG,UAAU,GAAG,WAAW,CAAC;CACvD;AAED;;;;;;;GAOG;AACH,qBAAa,iBAAkB,YAAW,SAAS;aAM/B,IAAI,EAAE,MAAM;IAC5B,OAAO,CAAC,QAAQ,CAAC,GAAG;IANtB,SAAgB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrC,SAAgB,YAAY,EAAE,oBAAoB,CAAC;IACnD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAGpB,IAAI,EAAE,MAAM,EACX,GAAG,EAAE,IAAI,EAC1B,IAAI,EAAE,wBAAwB;IAS1B,GAAG,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;CAiC3D"}
@@ -18,8 +18,6 @@ export class DirectLlmSubAgent {
18
18
  this.description = opts.description;
19
19
  this.systemPrompt = opts.systemPrompt;
20
20
  this.capabilities = {
21
- kind: 'constrained',
22
- canDispatchChildren: false,
23
21
  contextPolicy: opts.contextPolicy ?? 'required',
24
22
  };
25
23
  }
@@ -1 +1 @@
1
- {"version":3,"file":"direct-llm-subagent.js","sourceRoot":"","sources":["../../src/subagent/direct-llm-subagent.ts"],"names":[],"mappings":"AAeA;;;;;;;GAOG;AACH,MAAM,OAAO,iBAAiB;IAMV;IACC;IANH,WAAW,CAAU;IACrB,YAAY,CAAuB;IAClC,YAAY,CAAS;IAEtC,YACkB,IAAY,EACX,GAAS,EAC1B,IAA8B;QAFd,SAAI,GAAJ,IAAI,CAAQ;QACX,QAAG,GAAH,GAAG,CAAM;QAG1B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,YAAY,GAAG;YAClB,IAAI,EAAE,aAAa;YACnB,mBAAmB,EAAE,KAAK;YAC1B,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,UAAU;SAChD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,KAAqB;QAC7B,IACE,IAAI,CAAC,YAAY,CAAC,aAAa,KAAK,UAAU;YAC9C,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,EAC9C,CAAC;YACD,MAAM,IAAI,KAAK,CACb,sBAAsB,IAAI,CAAC,IAAI,6CAA6C,CAC7E,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GACf,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;YACvC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,OAAO,KAAK,CAAC,IAAI,EAAE;YACrC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;QAEjB,MAAM,QAAQ,GAAc;YAC1B,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE;YAC9C,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE;SACvC,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE;YAC5C,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,SAAS,EAAE,KAAK,CAAC,SAAS;SAC3B,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,GAAG,CAAC,KAAK,CAAC;QAClB,CAAC;QAED,OAAO;YACL,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO;YACzB,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK;SACvB,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"direct-llm-subagent.js","sourceRoot":"","sources":["../../src/subagent/direct-llm-subagent.ts"],"names":[],"mappings":"AAeA;;;;;;;GAOG;AACH,MAAM,OAAO,iBAAiB;IAMV;IACC;IANH,WAAW,CAAU;IACrB,YAAY,CAAuB;IAClC,YAAY,CAAS;IAEtC,YACkB,IAAY,EACX,GAAS,EAC1B,IAA8B;QAFd,SAAI,GAAJ,IAAI,CAAQ;QACX,QAAG,GAAH,GAAG,CAAM;QAG1B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACtC,IAAI,CAAC,YAAY,GAAG;YAClB,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,UAAU;SAChD,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,KAAqB;QAC7B,IACE,IAAI,CAAC,YAAY,CAAC,aAAa,KAAK,UAAU;YAC9C,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,EAC9C,CAAC;YACD,MAAM,IAAI,KAAK,CACb,sBAAsB,IAAI,CAAC,IAAI,6CAA6C,CAC7E,CAAC;QACJ,CAAC;QAED,MAAM,WAAW,GACf,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;YACvC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,OAAO,KAAK,CAAC,IAAI,EAAE;YACrC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;QAEjB,MAAM,QAAQ,GAAc;YAC1B,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE;YAC9C,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE;SACvC,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,EAAE;YAC5C,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,SAAS,EAAE,KAAK,CAAC,SAAS;SAC3B,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,GAAG,CAAC,KAAK,CAAC;QAClB,CAAC;QAED,OAAO;YACL,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO;YACzB,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK;SACvB,CAAC;IACJ,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"smart-agent-subagent.d.ts","sourceRoot":"","sources":["../../src/subagent/smart-agent-subagent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,eAAe,EAEf,oBAAoB,EACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,qBAAa,kBAAmB,YAAW,SAAS;aAShC,IAAI,EAAE,MAAM;IAC5B,OAAO,CAAC,QAAQ,CAAC,KAAK;IATxB,SAAgB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrC,SAAgB,YAAY,EAAE,oBAAoB,CAIhD;gBAGgB,IAAI,EAAE,MAAM,EACX,KAAK,EAAE,UAAU,EAClC,IAAI,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE;IAK3B,GAAG,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;CAmC3D"}
1
+ {"version":3,"file":"smart-agent-subagent.d.ts","sourceRoot":"","sources":["../../src/subagent/smart-agent-subagent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EACT,cAAc,EACd,eAAe,EAEf,oBAAoB,EACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,qBAAa,kBAAmB,YAAW,SAAS;aAOhC,IAAI,EAAE,MAAM;IAC5B,OAAO,CAAC,QAAQ,CAAC,KAAK;IAPxB,SAAgB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrC,SAAgB,YAAY,EAAE,oBAAoB,CAEhD;gBAGgB,IAAI,EAAE,MAAM,EACX,KAAK,EAAE,UAAU,EAClC,IAAI,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE;IAK3B,GAAG,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC;CAqC3D"}
@@ -3,8 +3,6 @@ export class SmartAgentSubAgent {
3
3
  agent;
4
4
  description;
5
5
  capabilities = {
6
- kind: 'autonomous',
7
- canDispatchChildren: true,
8
6
  contextPolicy: 'optional',
9
7
  };
10
8
  constructor(name, agent, opts) {
@@ -19,7 +17,9 @@ export class SmartAgentSubAgent {
19
17
  const res = await this.agent.process(prompt, {
20
18
  sessionId: input.sessionId,
21
19
  signal: input.signal,
22
- layer: input.layer,
20
+ trace: input.trace,
21
+ sessionLogger: input.sessionLogger,
22
+ onPartial: input.onPartial,
23
23
  });
24
24
  if (!res.ok) {
25
25
  throw res.error;
@@ -1 +1 @@
1
- {"version":3,"file":"smart-agent-subagent.js","sourceRoot":"","sources":["../../src/subagent/smart-agent-subagent.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,kBAAkB;IASX;IACC;IATH,WAAW,CAAU;IACrB,YAAY,GAAyB;QACnD,IAAI,EAAE,YAAY;QAClB,mBAAmB,EAAE,IAAI;QACzB,aAAa,EAAE,UAAU;KAC1B,CAAC;IAEF,YACkB,IAAY,EACX,KAAiB,EAClC,IAA+B;QAFf,SAAI,GAAJ,IAAI,CAAQ;QACX,UAAK,GAAL,KAAK,CAAY;QAGlC,IAAI,CAAC,WAAW,GAAG,IAAI,EAAE,WAAW,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,KAAqB;QAC7B,MAAM,MAAM,GACV,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;YACvC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,OAAO,KAAK,CAAC,IAAI,EAAE;YACrC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;QACjB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE;YAC3C,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,KAAK,EAAE,KAAK,CAAC,KAAK;SACnB,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,GAAG,CAAC,KAAK,CAAC;QAClB,CAAC;QAED,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC;QAEhD,MAAM,eAAe,GAA8B,SAAS,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACzE,EAAE,EAAE,EAAE,CAAC,EAAE;YACT,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI;YACtB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAA4B;SACxE,CAAC,CAAC,CAAC;QAEJ,OAAO;YACL,MAAM,EAAE,OAAO;YACf,SAAS,EAAE,eAAe;YAC1B,KAAK,EAAE,KAAK;gBACV,CAAC,CAAC;oBACE,YAAY,EAAE,KAAK,CAAC,YAAY;oBAChC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;oBACxC,WAAW,EAAE,KAAK,CAAC,WAAW;iBAC/B;gBACH,CAAC,CAAC,SAAS;SACd,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"smart-agent-subagent.js","sourceRoot":"","sources":["../../src/subagent/smart-agent-subagent.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,kBAAkB;IAOX;IACC;IAPH,WAAW,CAAU;IACrB,YAAY,GAAyB;QACnD,aAAa,EAAE,UAAU;KAC1B,CAAC;IAEF,YACkB,IAAY,EACX,KAAiB,EAClC,IAA+B;QAFf,SAAI,GAAJ,IAAI,CAAQ;QACX,UAAK,GAAL,KAAK,CAAY;QAGlC,IAAI,CAAC,WAAW,GAAG,IAAI,EAAE,WAAW,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,KAAqB;QAC7B,MAAM,MAAM,GACV,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;YACvC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,OAAO,KAAK,CAAC,IAAI,EAAE;YACrC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;QACjB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE;YAC3C,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,SAAS,EAAE,KAAK,CAAC,SAAS;SAC3B,CAAC,CAAC;QAEH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,GAAG,CAAC,KAAK,CAAC;QAClB,CAAC;QAED,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC;QAEhD,MAAM,eAAe,GAA8B,SAAS,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YACzE,EAAE,EAAE,EAAE,CAAC,EAAE;YACT,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI;YACtB,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,SAAS,CAA4B;SACxE,CAAC,CAAC,CAAC;QAEJ,OAAO;YACL,MAAM,EAAE,OAAO;YACf,SAAS,EAAE,eAAe;YAC1B,KAAK,EAAE,KAAK;gBACV,CAAC,CAAC;oBACE,YAAY,EAAE,KAAK,CAAC,YAAY;oBAChC,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;oBACxC,WAAW,EAAE,KAAK,CAAC,WAAW;iBAC/B;gBACH,CAAC,CAAC,SAAS;SACd,CAAC;IACJ,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mcp-abap-adt/llm-agent-libs",
3
- "version": "16.2.0",
3
+ "version": "17.0.0",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -31,20 +31,20 @@
31
31
  "test": "node --import tsx/esm --test --test-reporter=spec 'src/**/*.test.ts'"
32
32
  },
33
33
  "dependencies": {
34
- "@mcp-abap-adt/llm-agent": "^16.2.0",
35
- "@mcp-abap-adt/llm-agent-mcp": "^16.2.0",
36
- "@mcp-abap-adt/llm-agent-rag": "^16.2.0",
34
+ "@mcp-abap-adt/llm-agent": "^17.0.0",
35
+ "@mcp-abap-adt/llm-agent-mcp": "^17.0.0",
36
+ "@mcp-abap-adt/llm-agent-rag": "^17.0.0",
37
37
  "@opentelemetry/api": "^1.9.1",
38
38
  "dotenv": "^17.3.1",
39
39
  "yaml": "^2.8.3",
40
40
  "zod": "^4.3.6"
41
41
  },
42
42
  "peerDependencies": {
43
- "@mcp-abap-adt/openai-llm": "^16.2.0",
44
- "@mcp-abap-adt/anthropic-llm": "^16.2.0",
45
- "@mcp-abap-adt/deepseek-llm": "^16.2.0",
46
- "@mcp-abap-adt/ollama-llm": "^16.2.0",
47
- "@mcp-abap-adt/sap-aicore-llm": "^16.2.0"
43
+ "@mcp-abap-adt/openai-llm": "^17.0.0",
44
+ "@mcp-abap-adt/anthropic-llm": "^17.0.0",
45
+ "@mcp-abap-adt/deepseek-llm": "^17.0.0",
46
+ "@mcp-abap-adt/ollama-llm": "^17.0.0",
47
+ "@mcp-abap-adt/sap-aicore-llm": "^17.0.0"
48
48
  },
49
49
  "peerDependenciesMeta": {
50
50
  "@mcp-abap-adt/openai-llm": {
@@ -64,11 +64,11 @@
64
64
  }
65
65
  },
66
66
  "devDependencies": {
67
- "@mcp-abap-adt/openai-llm": "^16.2.0",
68
- "@mcp-abap-adt/anthropic-llm": "^16.2.0",
69
- "@mcp-abap-adt/deepseek-llm": "^16.2.0",
70
- "@mcp-abap-adt/ollama-llm": "^16.2.0",
71
- "@mcp-abap-adt/sap-aicore-llm": "^16.2.0"
67
+ "@mcp-abap-adt/openai-llm": "^17.0.0",
68
+ "@mcp-abap-adt/anthropic-llm": "^17.0.0",
69
+ "@mcp-abap-adt/deepseek-llm": "^17.0.0",
70
+ "@mcp-abap-adt/ollama-llm": "^17.0.0",
71
+ "@mcp-abap-adt/sap-aicore-llm": "^17.0.0"
72
72
  },
73
73
  "publishConfig": {
74
74
  "access": "public"