@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.
- package/dist/adapters/llm-provider-bridge.js +2 -2
- package/dist/adapters/llm-provider-bridge.js.map +1 -1
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +48 -37
- package/dist/agent.js.map +1 -1
- package/dist/builder.d.ts +10 -0
- package/dist/builder.d.ts.map +1 -1
- package/dist/builder.js +17 -3
- package/dist/builder.js.map +1 -1
- package/dist/classifier/llm-classifier.d.ts.map +1 -1
- package/dist/classifier/llm-classifier.js +1 -0
- package/dist/classifier/llm-classifier.js.map +1 -1
- package/dist/coordinator/dag/abort-error-strategy.d.ts +7 -0
- package/dist/coordinator/dag/abort-error-strategy.d.ts.map +1 -0
- package/dist/coordinator/dag/abort-error-strategy.js +8 -0
- package/dist/coordinator/dag/abort-error-strategy.js.map +1 -0
- package/dist/coordinator/dag/compose-node-task.d.ts +8 -0
- package/dist/coordinator/dag/compose-node-task.d.ts.map +1 -0
- package/dist/coordinator/dag/compose-node-task.js +41 -0
- package/dist/coordinator/dag/compose-node-task.js.map +1 -0
- package/dist/coordinator/dag/dag-plan-interpreter.d.ts +9 -0
- package/dist/coordinator/dag/dag-plan-interpreter.d.ts.map +1 -0
- package/dist/coordinator/dag/dag-plan-interpreter.js +220 -0
- package/dist/coordinator/dag/dag-plan-interpreter.js.map +1 -0
- package/dist/coordinator/dag/index.d.ts +5 -0
- package/dist/coordinator/dag/index.d.ts.map +1 -0
- package/dist/coordinator/dag/index.js +5 -0
- package/dist/coordinator/dag/index.js.map +1 -0
- package/dist/coordinator/dag/llm-dag-planner.d.ts +17 -0
- package/dist/coordinator/dag/llm-dag-planner.d.ts.map +1 -0
- package/dist/coordinator/dag/llm-dag-planner.js +152 -0
- package/dist/coordinator/dag/llm-dag-planner.js.map +1 -0
- package/dist/coordinator/dag/llm-finalizer.d.ts +21 -0
- package/dist/coordinator/dag/llm-finalizer.d.ts.map +1 -0
- package/dist/coordinator/dag/llm-finalizer.js +77 -0
- package/dist/coordinator/dag/llm-finalizer.js.map +1 -0
- package/dist/coordinator/dag/llm-review-strategy.d.ts +17 -0
- package/dist/coordinator/dag/llm-review-strategy.d.ts.map +1 -0
- package/dist/coordinator/dag/llm-review-strategy.js +149 -0
- package/dist/coordinator/dag/llm-review-strategy.js.map +1 -0
- package/dist/coordinator/dag/noop-review-strategy.d.ts +8 -0
- package/dist/coordinator/dag/noop-review-strategy.d.ts.map +1 -0
- package/dist/coordinator/dag/noop-review-strategy.js +11 -0
- package/dist/coordinator/dag/noop-review-strategy.js.map +1 -0
- package/dist/coordinator/dag/passthrough-finalizer.d.ts +11 -0
- package/dist/coordinator/dag/passthrough-finalizer.d.ts.map +1 -0
- package/dist/coordinator/dag/passthrough-finalizer.js +13 -0
- package/dist/coordinator/dag/passthrough-finalizer.js.map +1 -0
- package/dist/coordinator/dag/render-ancestor-context.d.ts +8 -0
- package/dist/coordinator/dag/render-ancestor-context.d.ts.map +1 -0
- package/dist/coordinator/dag/render-ancestor-context.js +27 -0
- package/dist/coordinator/dag/render-ancestor-context.js.map +1 -0
- package/dist/coordinator/dag/replan-error-strategy.d.ts +15 -0
- package/dist/coordinator/dag/replan-error-strategy.d.ts.map +1 -0
- package/dist/coordinator/dag/replan-error-strategy.js +32 -0
- package/dist/coordinator/dag/replan-error-strategy.js.map +1 -0
- package/dist/coordinator/dag/reviewer-error-strategy.d.ts +15 -0
- package/dist/coordinator/dag/reviewer-error-strategy.d.ts.map +1 -0
- package/dist/coordinator/dag/reviewer-error-strategy.js +38 -0
- package/dist/coordinator/dag/reviewer-error-strategy.js.map +1 -0
- package/dist/coordinator/dag/splice-sub-plan.d.ts +12 -0
- package/dist/coordinator/dag/splice-sub-plan.d.ts.map +1 -0
- package/dist/coordinator/dag/splice-sub-plan.js +41 -0
- package/dist/coordinator/dag/splice-sub-plan.js.map +1 -0
- package/dist/coordinator/dag/subagent-state-oracle.d.ts +19 -0
- package/dist/coordinator/dag/subagent-state-oracle.d.ts.map +1 -0
- package/dist/coordinator/dag/subagent-state-oracle.js +31 -0
- package/dist/coordinator/dag/subagent-state-oracle.js.map +1 -0
- package/dist/coordinator/dag/template-finalizer.d.ts +11 -0
- package/dist/coordinator/dag/template-finalizer.d.ts.map +1 -0
- package/dist/coordinator/dag/template-finalizer.js +17 -0
- package/dist/coordinator/dag/template-finalizer.js.map +1 -0
- package/dist/coordinator/dispatch/subagent.d.ts.map +1 -1
- package/dist/coordinator/dispatch/subagent.js +6 -12
- package/dist/coordinator/dispatch/subagent.js.map +1 -1
- package/dist/coordinator/index.d.ts +6 -0
- package/dist/coordinator/index.d.ts.map +1 -1
- package/dist/coordinator/index.js +6 -0
- package/dist/coordinator/index.js.map +1 -1
- package/dist/coordinator/planning/one-shot.d.ts.map +1 -1
- package/dist/coordinator/planning/one-shot.js +14 -7
- package/dist/coordinator/planning/one-shot.js.map +1 -1
- package/dist/index.d.ts +8 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/logger/default-request-logger.d.ts +18 -6
- package/dist/logger/default-request-logger.d.ts.map +1 -1
- package/dist/logger/default-request-logger.js +15 -4
- package/dist/logger/default-request-logger.js.map +1 -1
- package/dist/logger/noop-request-logger.d.ts +10 -5
- package/dist/logger/noop-request-logger.d.ts.map +1 -1
- package/dist/logger/noop-request-logger.js +4 -3
- package/dist/logger/noop-request-logger.js.map +1 -1
- package/dist/logger/session-request-logger.d.ts +50 -0
- package/dist/logger/session-request-logger.d.ts.map +1 -0
- package/dist/logger/session-request-logger.js +151 -0
- package/dist/logger/session-request-logger.js.map +1 -0
- package/dist/pipeline/context.d.ts +8 -3
- package/dist/pipeline/context.d.ts.map +1 -1
- package/dist/pipeline/default-pipeline.d.ts +27 -4
- package/dist/pipeline/default-pipeline.d.ts.map +1 -1
- package/dist/pipeline/default-pipeline.js +42 -7
- package/dist/pipeline/default-pipeline.js.map +1 -1
- package/dist/pipeline/handlers/coordinator.d.ts +0 -3
- package/dist/pipeline/handlers/coordinator.d.ts.map +1 -1
- package/dist/pipeline/handlers/coordinator.js +33 -22
- package/dist/pipeline/handlers/coordinator.js.map +1 -1
- package/dist/pipeline/handlers/dag-coordinator.d.ts +47 -0
- package/dist/pipeline/handlers/dag-coordinator.d.ts.map +1 -0
- package/dist/pipeline/handlers/dag-coordinator.js +369 -0
- package/dist/pipeline/handlers/dag-coordinator.js.map +1 -0
- package/dist/pipeline/handlers/index.d.ts +7 -0
- package/dist/pipeline/handlers/index.d.ts.map +1 -1
- package/dist/pipeline/handlers/index.js +5 -1
- package/dist/pipeline/handlers/index.js.map +1 -1
- package/dist/pipeline/handlers/rag-query.d.ts.map +1 -1
- package/dist/pipeline/handlers/rag-query.js +1 -0
- package/dist/pipeline/handlers/rag-query.js.map +1 -1
- package/dist/pipeline/handlers/subagent.d.ts.map +1 -1
- package/dist/pipeline/handlers/subagent.js +0 -2
- package/dist/pipeline/handlers/subagent.js.map +1 -1
- package/dist/pipeline/handlers/summarize.d.ts.map +1 -1
- package/dist/pipeline/handlers/summarize.js +5 -0
- package/dist/pipeline/handlers/summarize.js.map +1 -1
- package/dist/pipeline/handlers/tool-loop.d.ts.map +1 -1
- package/dist/pipeline/handlers/tool-loop.js +16 -0
- package/dist/pipeline/handlers/tool-loop.js.map +1 -1
- package/dist/pipeline/handlers/translate.d.ts.map +1 -1
- package/dist/pipeline/handlers/translate.js +1 -0
- package/dist/pipeline/handlers/translate.js.map +1 -1
- package/dist/pipeline/index.d.ts +2 -1
- package/dist/pipeline/index.d.ts.map +1 -1
- package/dist/pipeline/index.js +1 -1
- package/dist/pipeline/index.js.map +1 -1
- package/dist/session/session-graph-factory.d.ts +66 -0
- package/dist/session/session-graph-factory.d.ts.map +1 -0
- package/dist/session/session-graph-factory.js +63 -0
- package/dist/session/session-graph-factory.js.map +1 -0
- package/dist/session/session-graph.d.ts +54 -0
- package/dist/session/session-graph.d.ts.map +1 -0
- package/dist/session/session-graph.js +76 -0
- package/dist/session/session-graph.js.map +1 -0
- package/dist/session/session-registry.d.ts +89 -0
- package/dist/session/session-registry.d.ts.map +1 -0
- package/dist/session/session-registry.js +279 -0
- package/dist/session/session-registry.js.map +1 -0
- package/dist/subagent/direct-llm-subagent.d.ts.map +1 -1
- package/dist/subagent/direct-llm-subagent.js +0 -2
- package/dist/subagent/direct-llm-subagent.js.map +1 -1
- package/dist/subagent/smart-agent-subagent.d.ts.map +1 -1
- package/dist/subagent/smart-agent-subagent.js +3 -3
- package/dist/subagent/smart-agent-subagent.js.map +1 -1
- 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;
|
|
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"}
|
|
@@ -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,
|
|
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;
|
|
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
|
-
|
|
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;
|
|
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": "
|
|
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": "^
|
|
35
|
-
"@mcp-abap-adt/llm-agent-mcp": "^
|
|
36
|
-
"@mcp-abap-adt/llm-agent-rag": "^
|
|
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": "^
|
|
44
|
-
"@mcp-abap-adt/anthropic-llm": "^
|
|
45
|
-
"@mcp-abap-adt/deepseek-llm": "^
|
|
46
|
-
"@mcp-abap-adt/ollama-llm": "^
|
|
47
|
-
"@mcp-abap-adt/sap-aicore-llm": "^
|
|
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": "^
|
|
68
|
-
"@mcp-abap-adt/anthropic-llm": "^
|
|
69
|
-
"@mcp-abap-adt/deepseek-llm": "^
|
|
70
|
-
"@mcp-abap-adt/ollama-llm": "^
|
|
71
|
-
"@mcp-abap-adt/sap-aicore-llm": "^
|
|
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"
|