@mcp-abap-adt/llm-agent-libs 26.0.0 → 28.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 (95) hide show
  1. package/README.md +11 -14
  2. package/dist/agent.d.ts +2 -1
  3. package/dist/agent.d.ts.map +1 -1
  4. package/dist/agent.js +6 -5
  5. package/dist/agent.js.map +1 -1
  6. package/dist/builder.d.ts +36 -14
  7. package/dist/builder.d.ts.map +1 -1
  8. package/dist/builder.js +472 -348
  9. package/dist/builder.js.map +1 -1
  10. package/dist/config/config-watcher.d.ts.map +1 -1
  11. package/dist/config/config-watcher.js +9 -5
  12. package/dist/config/config-watcher.js.map +1 -1
  13. package/dist/index.d.ts +1 -2
  14. package/dist/index.d.ts.map +1 -1
  15. package/dist/index.js +1 -5
  16. package/dist/index.js.map +1 -1
  17. package/dist/mcp/vectorize-mcp-tools.d.ts.map +1 -1
  18. package/dist/mcp/vectorize-mcp-tools.js +21 -2
  19. package/dist/mcp/vectorize-mcp-tools.js.map +1 -1
  20. package/dist/pipeline/handlers/history-upsert.d.ts.map +1 -1
  21. package/dist/pipeline/handlers/history-upsert.js +8 -1
  22. package/dist/pipeline/handlers/history-upsert.js.map +1 -1
  23. package/dist/pipeline/handlers/rag-query.d.ts +1 -1
  24. package/dist/pipeline/handlers/rag-query.d.ts.map +1 -1
  25. package/dist/pipeline/handlers/rag-query.js +10 -2
  26. package/dist/pipeline/handlers/rag-query.js.map +1 -1
  27. package/dist/plugins/index.d.ts +1 -1
  28. package/dist/plugins/index.d.ts.map +1 -1
  29. package/dist/plugins/index.js +1 -1
  30. package/dist/plugins/index.js.map +1 -1
  31. package/dist/plugins/types.d.ts +7 -0
  32. package/dist/plugins/types.d.ts.map +1 -1
  33. package/dist/plugins/types.js +85 -14
  34. package/dist/plugins/types.js.map +1 -1
  35. package/dist/session/session-graph-factory.d.ts +49 -16
  36. package/dist/session/session-graph-factory.d.ts.map +1 -1
  37. package/dist/session/session-graph-factory.js +140 -62
  38. package/dist/session/session-graph-factory.js.map +1 -1
  39. package/dist/skills/plugin-host/qdrant-store.d.ts +6 -1
  40. package/dist/skills/plugin-host/qdrant-store.d.ts.map +1 -1
  41. package/dist/skills/plugin-host/qdrant-store.js +7 -7
  42. package/dist/skills/plugin-host/qdrant-store.js.map +1 -1
  43. package/dist/util/stop-all.d.ts +19 -0
  44. package/dist/util/stop-all.d.ts.map +1 -0
  45. package/dist/util/stop-all.js +30 -0
  46. package/dist/util/stop-all.js.map +1 -0
  47. package/package.json +10 -38
  48. package/dist/coordinator/dag/reviewer-error-strategy.d.ts +0 -15
  49. package/dist/coordinator/dag/reviewer-error-strategy.d.ts.map +0 -1
  50. package/dist/coordinator/dag/reviewer-error-strategy.js +0 -38
  51. package/dist/coordinator/dag/reviewer-error-strategy.js.map +0 -1
  52. package/dist/providers.d.ts +0 -58
  53. package/dist/providers.d.ts.map +0 -1
  54. package/dist/providers.js +0 -225
  55. package/dist/providers.js.map +0 -1
  56. package/dist/skills/plugin-host/chunker.test.d.ts +0 -2
  57. package/dist/skills/plugin-host/chunker.test.d.ts.map +0 -1
  58. package/dist/skills/plugin-host/chunker.test.js +0 -31
  59. package/dist/skills/plugin-host/chunker.test.js.map +0 -1
  60. package/dist/skills/plugin-host/compatible-skills-rag.test.d.ts +0 -2
  61. package/dist/skills/plugin-host/compatible-skills-rag.test.d.ts.map +0 -1
  62. package/dist/skills/plugin-host/compatible-skills-rag.test.js +0 -174
  63. package/dist/skills/plugin-host/compatible-skills-rag.test.js.map +0 -1
  64. package/dist/skills/plugin-host/http-marketplace-source.test.d.ts +0 -2
  65. package/dist/skills/plugin-host/http-marketplace-source.test.d.ts.map +0 -1
  66. package/dist/skills/plugin-host/http-marketplace-source.test.js +0 -71
  67. package/dist/skills/plugin-host/http-marketplace-source.test.js.map +0 -1
  68. package/dist/skills/plugin-host/in-memory-store.test.d.ts +0 -2
  69. package/dist/skills/plugin-host/in-memory-store.test.d.ts.map +0 -1
  70. package/dist/skills/plugin-host/in-memory-store.test.js +0 -100
  71. package/dist/skills/plugin-host/in-memory-store.test.js.map +0 -1
  72. package/dist/skills/plugin-host/marketplace-adapter.test.d.ts +0 -2
  73. package/dist/skills/plugin-host/marketplace-adapter.test.d.ts.map +0 -1
  74. package/dist/skills/plugin-host/marketplace-adapter.test.js +0 -46
  75. package/dist/skills/plugin-host/marketplace-adapter.test.js.map +0 -1
  76. package/dist/skills/plugin-host/qdrant-store.test.d.ts +0 -2
  77. package/dist/skills/plugin-host/qdrant-store.test.d.ts.map +0 -1
  78. package/dist/skills/plugin-host/qdrant-store.test.js +0 -396
  79. package/dist/skills/plugin-host/qdrant-store.test.js.map +0 -1
  80. package/dist/skills/plugin-host/skill-plugin-host.ingest.test.d.ts +0 -2
  81. package/dist/skills/plugin-host/skill-plugin-host.ingest.test.d.ts.map +0 -1
  82. package/dist/skills/plugin-host/skill-plugin-host.ingest.test.js +0 -520
  83. package/dist/skills/plugin-host/skill-plugin-host.ingest.test.js.map +0 -1
  84. package/dist/skills/plugin-host/skill-plugin-host.recall-and-reload.test.d.ts +0 -2
  85. package/dist/skills/plugin-host/skill-plugin-host.recall-and-reload.test.d.ts.map +0 -1
  86. package/dist/skills/plugin-host/skill-plugin-host.recall-and-reload.test.js +0 -328
  87. package/dist/skills/plugin-host/skill-plugin-host.recall-and-reload.test.js.map +0 -1
  88. package/dist/skills/plugin-host/skills-rag-source.test.d.ts +0 -2
  89. package/dist/skills/plugin-host/skills-rag-source.test.d.ts.map +0 -1
  90. package/dist/skills/plugin-host/skills-rag-source.test.js +0 -69
  91. package/dist/skills/plugin-host/skills-rag-source.test.js.map +0 -1
  92. package/dist/skills/plugin-host/source-strategies.test.d.ts +0 -2
  93. package/dist/skills/plugin-host/source-strategies.test.d.ts.map +0 -1
  94. package/dist/skills/plugin-host/source-strategies.test.js +0 -52
  95. package/dist/skills/plugin-host/source-strategies.test.js.map +0 -1
@@ -16,11 +16,37 @@ export function emptyLoadedPlugins() {
16
16
  clientAdapters: [],
17
17
  apiAdapters: new Map(),
18
18
  pipelinePlugins: new Map(),
19
+ pipelinePluginFactories: new Map(),
19
20
  pipelinePluginSources: new Map(),
20
21
  loadedFiles: [],
21
22
  errors: [],
22
23
  };
23
24
  }
25
+ const isRecord = (v) => typeof v === 'object' && v !== null && !Array.isArray(v);
26
+ const kindOf = (v) => (v === null ? 'null' : typeof v);
27
+ /**
28
+ * What is wrong with a value offered as a pipeline plugin under `key`, or
29
+ * `undefined` when nothing is. An imported module is `unknown` until something
30
+ * inspects it, so this is the check that makes the cast after it honest (§4.6.7).
31
+ * The loader runs it on an instance export; the server runs it on a factory's result.
32
+ */
33
+ export function describePipelinePluginDefect(value, key) {
34
+ if (typeof value !== 'object' || value === null) {
35
+ return `expected an object with 'name' and 'build', got ${kindOf(value)}`;
36
+ }
37
+ const { name, build } = value;
38
+ const missing = [];
39
+ if (typeof name !== 'string')
40
+ missing.push(`'name' must be a string, got ${kindOf(name)}`);
41
+ if (typeof build !== 'function')
42
+ missing.push(`'build' must be a function, got ${kindOf(build)}`);
43
+ if (missing.length > 0)
44
+ return missing.join('; ');
45
+ if (name !== key) {
46
+ return `its name '${String(name)}' differs from the key '${key}' it is registered under`;
47
+ }
48
+ return undefined;
49
+ }
24
50
  /**
25
51
  * Merges a single plugin module's exports into a {@link LoadedPlugins} result.
26
52
  * Useful for custom `IPluginLoader` implementations.
@@ -80,21 +106,66 @@ export function mergePluginExports(result, mod, source) {
80
106
  }
81
107
  }
82
108
  }
83
- if (mod.pipelinePlugins && typeof mod.pipelinePlugins === 'object') {
84
- for (const [name, plugin] of Object.entries(mod.pipelinePlugins)) {
85
- if (!plugin || typeof plugin.build !== 'function')
86
- continue;
87
- if (result.pipelinePlugins.has(name)) {
88
- const prior = result.pipelinePluginSources.get(name) ?? 'unknown';
89
- result.errors.push({
90
- file: source,
91
- error: `duplicate pipeline name '${name}' from '${source}'; already registered by '${prior}' (keeping the first)`,
92
- });
93
- continue; // keep the first
109
+ // One key space for instances and factories; the first source keeps a key.
110
+ const claim = (key) => {
111
+ const prior = result.pipelinePluginSources.get(key);
112
+ if (prior === undefined)
113
+ return true;
114
+ result.errors.push({
115
+ file: source,
116
+ error: `duplicate pipeline name '${key}' from '${source}'; already registered by '${prior}' (keeping the first)`,
117
+ });
118
+ return false;
119
+ };
120
+ if (mod.pipelinePlugins !== undefined) {
121
+ if (!isRecord(mod.pipelinePlugins)) {
122
+ result.errors.push({
123
+ file: source,
124
+ error: `'pipelinePlugins' from '${source}' must be an object keyed by pipeline name`,
125
+ });
126
+ }
127
+ else {
128
+ for (const [key, plugin] of Object.entries(mod.pipelinePlugins)) {
129
+ const defect = describePipelinePluginDefect(plugin, key);
130
+ if (defect !== undefined) {
131
+ result.errors.push({
132
+ file: source,
133
+ error: `pipeline plugin '${key}' from '${source}' refused: ${defect}`,
134
+ });
135
+ continue;
136
+ }
137
+ if (!claim(key))
138
+ continue;
139
+ result.pipelinePlugins.set(key, plugin);
140
+ result.pipelinePluginSources.set(key, source);
141
+ registered = true;
142
+ }
143
+ }
144
+ }
145
+ if (mod.pipelinePluginFactories !== undefined) {
146
+ if (!isRecord(mod.pipelinePluginFactories)) {
147
+ result.errors.push({
148
+ file: source,
149
+ error: `'pipelinePluginFactories' from '${source}' must be an object keyed by pipeline name`,
150
+ });
151
+ }
152
+ else {
153
+ result.pipelinePluginFactories ??= new Map();
154
+ const factories = result.pipelinePluginFactories;
155
+ for (const [key, factory] of Object.entries(mod.pipelinePluginFactories)) {
156
+ if (typeof factory !== 'function') {
157
+ result.errors.push({
158
+ file: source,
159
+ error: `pipeline plugin factory '${key}' from '${source}' refused: expected a function, got ${kindOf(factory)}`,
160
+ });
161
+ continue;
162
+ }
163
+ if (!claim(key))
164
+ continue;
165
+ factories.set(key, factory);
166
+ result.pipelinePluginSources.set(key, source);
167
+ registered = true;
94
168
  }
95
- result.pipelinePlugins.set(name, plugin);
96
- result.pipelinePluginSources.set(name, source);
97
- registered = true;
98
169
  }
99
170
  }
100
171
  if (registered) {
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/plugins/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/plugins/types.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { ILogger, IMcpClient, IRag, IRagRegistry, McpClientDescriptor } from '@mcp-abap-adt/llm-agent';
1
+ import type { AnyLogger, IMcpClient, IMcpServer, IRag, IRagRegistry, McpClientDescriptor } from '@mcp-abap-adt/llm-agent';
2
2
  import type { SmartAgent } from '../agent.js';
3
3
  import { SessionRequestLogger } from '../logger/session-request-logger.js';
4
4
  import { SessionGraph } from './session-graph.js';
@@ -29,13 +29,27 @@ export interface SessionAgentParts {
29
29
  readonly logger: SessionRequestLogger;
30
30
  }
31
31
  export interface SessionGraphFactoryOptions {
32
+ /**
33
+ * Servers for THIS caller: the factory starts each one before `buildAgent`,
34
+ * hands the clients over, and stops them last on dispose. Takes the identity,
35
+ * which is what per-caller credentials need and what `mcpClientFactory` never
36
+ * had.
37
+ *
38
+ * When set it takes precedence over `mcpClientFactory` and
39
+ * `mcpClientFactoryWithDescriptors`.
40
+ */
41
+ readonly mcpServerFactory?: (identity: SessionGraphIdentity) => IMcpServer[];
32
42
  /**
33
43
  * Resolve this session's MCP client(s). Per-session-CAPABLE: the default
34
44
  * factory returns the shared GLOBAL client(s) by reference (no re-connect);
35
45
  * a creds-aware build (out of scope) returns a fresh per-session client.
36
46
  * Either way the tools-catalog RAG is never re-vectorized.
47
+ *
48
+ * @deprecated Use `mcpServerFactory`, which also owns lifetime and receives
49
+ * the identity. Optional since this release: supply exactly one of
50
+ * `mcpServerFactory`, `mcpClientFactoryWithDescriptors` or this.
37
51
  */
38
- readonly mcpClientFactory: (identity: SessionGraphIdentity) => IMcpClient[];
52
+ readonly mcpClientFactory?: (identity: SessionGraphIdentity) => IMcpClient[];
39
53
  /**
40
54
  * ADDITIVE descriptor-aware seam (#244): when set, takes precedence over
41
55
  * `mcpClientFactory` and pairs the resolved clients with the STABLE
@@ -44,6 +58,10 @@ export interface SessionGraphFactoryOptions {
44
58
  * active slots `[0,2]` collapse to array indices `[0,1]`). `mcpClientFactory`
45
59
  * stays required for back-compat; this field is optional and, when absent,
46
60
  * `build()` falls back to `mcpClientFactory` (descriptors stay `undefined`).
61
+ *
62
+ * @deprecated Use `mcpServerFactory`, which also owns lifetime and receives
63
+ * the identity. Optional since this release: supply exactly one of
64
+ * `mcpServerFactory`, this or `mcpClientFactory`.
47
65
  */
48
66
  readonly mcpClientFactoryWithDescriptors?: (identity: SessionGraphIdentity) => {
49
67
  clients: IMcpClient[];
@@ -52,8 +70,22 @@ export interface SessionGraphFactoryOptions {
52
70
  };
53
71
  /** GLOBAL vectorized tools-catalog RAG — injected by reference, never re-vectorized. */
54
72
  readonly toolsRag: IRag | undefined;
55
- /** GLOBAL RAG provider/registry — shared; the per-call scope filter isolates. */
56
- readonly ragRegistry: IRagRegistry;
73
+ /**
74
+ * One RAG registry shared by every session, when `ragRegistryFactory` is
75
+ * absent. Its collections are addressed by name, so every session sees
76
+ * every collection it holds — the per-call filter is the only isolation.
77
+ * Supply exactly one of this or `ragRegistryFactory`.
78
+ */
79
+ readonly ragRegistry?: IRagRegistry;
80
+ /**
81
+ * Builds the registry THIS session owns (§6.4): handed to `buildAgent`, and
82
+ * the one `dispose()` closes — the shared `ragRegistry` is then neither used
83
+ * nor closed. Receives the full identity, which a build callback cannot
84
+ * (`SessionAgentParts` has no userId), and is awaited, because hydration is
85
+ * asynchronous (describeCollections, openCollection). Called before any MCP
86
+ * server starts, so a rejection leaves nothing to stop.
87
+ */
88
+ readonly ragRegistryFactory?: (identity: SessionGraphIdentity) => Promise<IRagRegistry>;
57
89
  /**
58
90
  * Builds the per-session SmartAgent + FRESH per-session workers from `parts`.
59
91
  * Production wiring runs a `SmartAgentBuilder.build()` with the injected globals
@@ -67,8 +99,10 @@ export interface SessionGraphFactoryOptions {
67
99
  * (`ragRegistry.closeSession` returning `{ ok: false }`). Without a logger
68
100
  * the failure falls back to `console.warn` so it is never silent. The
69
101
  * dispose hook never throws — a failed close must not crash session teardown.
102
+ * An ordinary text logger (`ITextLogger`) is also accepted; it is normalised
103
+ * to the event `ILogger` once, at the constructor.
70
104
  */
71
- readonly logger?: ILogger;
105
+ readonly logger?: AnyLogger;
72
106
  /**
73
107
  * Optional per-session teardown hook run during `SessionGraph.dispose()`,
74
108
  * AFTER the session-RAG `closeSession`. The host uses this to free per-session
@@ -78,21 +112,20 @@ export interface SessionGraphFactoryOptions {
78
112
  * crashes the registry.
79
113
  */
80
114
  readonly onDispose?: (sessionId: string) => Promise<void>;
115
+ /**
116
+ * Per-session teardown that must run BEFORE the session's RAG collections are
117
+ * deleted — closing a pipeline still in flight, which must not write into a
118
+ * collection being removed.
119
+ *
120
+ * `onDispose` keeps its documented place after `closeSession`; this hook is
121
+ * the one that runs first.
122
+ */
123
+ readonly closePipeline?: (sessionId: string) => Promise<void>;
81
124
  }
82
- /**
83
- * Central per-session composition path (spec A.2). Assembles a SessionGraph by
84
- * injecting the GLOBAL heavy resources (vectorized toolsRag, RAG registry,
85
- * cached per-worker LLM/embedder) by reference — never re-vectorizing tools or
86
- * rebuilding LLM clients — resolving this session's MCP client(s) via
87
- * `mcpClientFactory(identity)` (default: shared global by reference), and
88
- * allocating the cheap per-session instances (logger + sessionId-keyed
89
- * registries + the per-session agent/pipeline/interpreter/coordinator/WORKERS).
90
- * The per-session worker set is FRESH per session (re-wired via buildAgent
91
- * with the session logger), never the server's global worker map.
92
- */
93
125
  export declare class SessionGraphFactory {
94
126
  private readonly opts;
95
127
  constructor(opts: SessionGraphFactoryOptions);
128
+ private resolveRagRegistry;
96
129
  build(identity: SessionGraphIdentity): Promise<SessionGraph>;
97
130
  }
98
131
  //# sourceMappingURL=session-graph-factory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-graph-factory.d.ts","sourceRoot":"","sources":["../../src/session/session-graph-factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,UAAU,EACV,IAAI,EACJ,YAAY,EACZ,mBAAmB,EACpB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAG3E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,CAAC;IAClC;;;;;OAKG;IACH,QAAQ,CAAC,oBAAoB,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAC/D,iFAAiF;IACjF,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,IAAI,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;CACvC;AAED,MAAM,WAAW,0BAA0B;IACzC;;;;;OAKG;IACH,QAAQ,CAAC,gBAAgB,EAAE,CAAC,QAAQ,EAAE,oBAAoB,KAAK,UAAU,EAAE,CAAC;IAC5E;;;;;;;;OAQG;IACH,QAAQ,CAAC,+BAA+B,CAAC,EAAE,CACzC,QAAQ,EAAE,oBAAoB,KAC3B;QACH,OAAO,EAAE,UAAU,EAAE,CAAC;QACtB,iBAAiB,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAC;QACnD,mBAAmB,CAAC,EAAE,MAAM,CAAC;KAC9B,CAAC;IACF,wFAAwF;IACxF,QAAQ,CAAC,QAAQ,EAAE,IAAI,GAAG,SAAS,CAAC;IACpC,iFAAiF;IACjF,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC;IACnC;;;;;;OAMG;IACH,QAAQ,CAAC,UAAU,EAAE,CACnB,KAAK,EAAE,iBAAiB,KACrB,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;IACrC;;;;;OAKG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;;;OAOG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3D;AAED;;;;;;;;;;GAUG;AACH,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAAJ,IAAI,EAAE,0BAA0B;IAEvD,KAAK,CAAC,QAAQ,EAAE,oBAAoB,GAAG,OAAO,CAAC,YAAY,CAAC;CA4EnE"}
1
+ {"version":3,"file":"session-graph-factory.d.ts","sourceRoot":"","sources":["../../src/session/session-graph-factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,SAAS,EAET,UAAU,EACV,UAAU,EACV,IAAI,EACJ,YAAY,EACZ,mBAAmB,EACpB,MAAM,yBAAyB,CAAC;AAKjC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,qCAAqC,CAAC;AAI3E,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;GAKG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,CAAC;IAClC;;;;;OAKG;IACH,QAAQ,CAAC,oBAAoB,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAC/D,iFAAiF;IACjF,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,IAAI,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,WAAW,EAAE,YAAY,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;CACvC;AAED,MAAM,WAAW,0BAA0B;IACzC;;;;;;;;OAQG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,oBAAoB,KAAK,UAAU,EAAE,CAAC;IAC7E;;;;;;;;;OASG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,oBAAoB,KAAK,UAAU,EAAE,CAAC;IAC7E;;;;;;;;;;;;OAYG;IACH,QAAQ,CAAC,+BAA+B,CAAC,EAAE,CACzC,QAAQ,EAAE,oBAAoB,KAC3B;QACH,OAAO,EAAE,UAAU,EAAE,CAAC;QACtB,iBAAiB,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAC;QACnD,mBAAmB,CAAC,EAAE,MAAM,CAAC;KAC9B,CAAC;IACF,wFAAwF;IACxF,QAAQ,CAAC,QAAQ,EAAE,IAAI,GAAG,SAAS,CAAC;IACpC;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,YAAY,CAAC;IACpC;;;;;;;OAOG;IACH,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAC5B,QAAQ,EAAE,oBAAoB,KAC3B,OAAO,CAAC,YAAY,CAAC,CAAC;IAC3B;;;;;;OAMG;IACH,QAAQ,CAAC,UAAU,EAAE,CACnB,KAAK,EAAE,iBAAiB,KACrB,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;IACrC;;;;;;;OAOG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;IAC5B;;;;;;;OAOG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D;;;;;;;OAOG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/D;AAyBD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAuC;gBAEhD,IAAI,EAAE,0BAA0B;YAM9B,kBAAkB;IAY1B,KAAK,CAAC,QAAQ,EAAE,oBAAoB,GAAG,OAAO,CAAC,YAAY,CAAC;CA0KnE"}
@@ -1,96 +1,174 @@
1
+ import { collectServerDescriptors, normaliseLogger, } from '@mcp-abap-adt/llm-agent';
1
2
  import { SessionRequestLogger } from '../logger/session-request-logger.js';
2
3
  import { PendingToolResultsRegistry } from '../policy/pending-tool-results-registry.js';
3
4
  import { ToolAvailabilityRegistry } from '../policy/tool-availability-registry.js';
5
+ import { stopAll } from '../util/stop-all.js';
4
6
  import { SessionGraph } from './session-graph.js';
5
- /**
6
- * Central per-session composition path (spec A.2). Assembles a SessionGraph by
7
- * injecting the GLOBAL heavy resources (vectorized toolsRag, RAG registry,
8
- * cached per-worker LLM/embedder) by reference — never re-vectorizing tools or
9
- * rebuilding LLM clients — resolving this session's MCP client(s) via
10
- * `mcpClientFactory(identity)` (default: shared global by reference), and
11
- * allocating the cheap per-session instances (logger + sessionId-keyed
12
- * registries + the per-session agent/pipeline/interpreter/coordinator/WORKERS).
13
- * The per-session worker set is FRESH per session (re-wired via buildAgent
14
- * with the session logger), never the server's global worker map.
15
- */
16
7
  export class SessionGraphFactory {
17
8
  opts;
18
9
  constructor(opts) {
19
- this.opts = opts;
10
+ this.opts = opts.logger
11
+ ? { ...opts, logger: normaliseLogger(opts.logger) }
12
+ : opts;
13
+ }
14
+ async resolveRagRegistry(identity) {
15
+ if (this.opts.ragRegistryFactory) {
16
+ return this.opts.ragRegistryFactory(identity);
17
+ }
18
+ if (this.opts.ragRegistry)
19
+ return this.opts.ragRegistry;
20
+ throw new Error('SessionGraphFactory needs one of ragRegistryFactory or ragRegistry');
20
21
  }
21
22
  async build(identity) {
23
+ if (!this.opts.mcpServerFactory &&
24
+ !this.opts.mcpClientFactoryWithDescriptors &&
25
+ !this.opts.mcpClientFactory)
26
+ throw new Error('SessionGraphFactory needs one of mcpServerFactory, mcpClientFactoryWithDescriptors or mcpClientFactory');
27
+ // Before any MCP server starts: a factory that rejects leaves nothing to stop.
28
+ const ragRegistry = await this.resolveRagRegistry(identity);
22
29
  const logger = new SessionRequestLogger();
23
30
  const toolAvailability = new ToolAvailabilityRegistry();
24
31
  const pendingToolResults = new PendingToolResultsRegistry();
25
32
  let mcpClients;
26
33
  let mcpClientDescriptors;
27
34
  let configuredSlotCount;
28
- if (this.opts.mcpClientFactoryWithDescriptors) {
35
+ const startedServers = [];
36
+ if (this.opts.mcpServerFactory) {
37
+ const servers = this.opts.mcpServerFactory(identity);
38
+ // All or none — see the builder's identical check and why it throws.
39
+ const descriptors = collectServerDescriptors(servers, 'mcpServerFactory');
40
+ const clients = [];
41
+ try {
42
+ for (const server of servers) {
43
+ clients.push(await server.start());
44
+ startedServers.push(server);
45
+ }
46
+ }
47
+ catch (err) {
48
+ await stopAll(startedServers.splice(0).map((server) => () => server.stop()));
49
+ throw err;
50
+ }
51
+ mcpClients = clients;
52
+ mcpClientDescriptors = descriptors;
53
+ // Nothing was filtered out of a configured set, so there is no original
54
+ // count to preserve; array position is the pairing.
55
+ configuredSlotCount = undefined;
56
+ }
57
+ else if (this.opts.mcpClientFactoryWithDescriptors) {
29
58
  const built = this.opts.mcpClientFactoryWithDescriptors(identity);
30
59
  mcpClients = built.clients;
31
60
  mcpClientDescriptors = built.clientDescriptors;
32
61
  configuredSlotCount = built.configuredSlotCount;
33
62
  }
34
63
  else {
35
- mcpClients = this.opts.mcpClientFactory(identity);
64
+ // The guard at the top of build() has already ruled out "none set".
65
+ mcpClients = this.opts.mcpClientFactory?.(identity) ?? [];
36
66
  }
37
- const agent = await this.opts.buildAgent({
38
- sessionId: identity.sessionId,
39
- mcpClients,
40
- mcpClientDescriptors,
41
- configuredSlotCount,
42
- toolsRag: this.opts.toolsRag,
43
- ragRegistry: this.opts.ragRegistry,
44
- logger,
45
- });
46
- return new SessionGraph({
47
- sessionId: identity.sessionId,
48
- toolAvailability,
49
- pendingToolResults,
50
- logger,
51
- agent,
52
- // Reuse the EXISTING registry teardown — closes scope:session collections
53
- // for this sessionId; global/user collections survive (spec A.4). The
54
- // Result<void, RagError> is INSPECTED here — a failed close is surfaced
55
- // via the optional logger (or console.warn fallback), never silently
56
- // dropped (review MEDIUM #2).
57
- dispose: async (sessionId) => {
58
- const res = await this.opts.ragRegistry.closeSession(sessionId);
59
- if (!res.ok) {
60
- const message = res.error?.message ?? String(res.error);
61
- if (this.opts.logger) {
62
- this.opts.logger.log({
63
- type: 'warning',
64
- traceId: `session:${sessionId}`,
65
- message: `session_close_failed: ${message}`,
66
- });
67
- }
68
- else {
69
- console.warn(`[session] closeSession(${sessionId}) failed: ${message}`);
70
- }
71
- }
72
- // Host-supplied per-session teardown (e.g. pipeline IPipelineInstance.close).
73
- // Best-effort: a failure here must not crash session disposal.
74
- if (this.opts.onDispose) {
75
- try {
76
- await this.opts.onDispose(sessionId);
77
- }
78
- catch (err) {
79
- const message = err instanceof Error ? err.message : String(err);
67
+ // `buildAgent` runs a full `SmartAgentBuilder.build()` — model validation,
68
+ // network work — and can throw. When it does, no `SessionGraph` is
69
+ // constructed, so `dispose()` never runs and `startedServers` becomes
70
+ // unreachable: stop them here, on the ORIGINAL failure, before rethrowing.
71
+ let agent;
72
+ let graph;
73
+ try {
74
+ agent = await this.opts.buildAgent({
75
+ sessionId: identity.sessionId,
76
+ mcpClients,
77
+ mcpClientDescriptors,
78
+ configuredSlotCount,
79
+ toolsRag: this.opts.toolsRag,
80
+ ragRegistry,
81
+ logger,
82
+ });
83
+ graph = new SessionGraph({
84
+ sessionId: identity.sessionId,
85
+ toolAvailability,
86
+ pendingToolResults,
87
+ logger,
88
+ agent,
89
+ // Closes this session's collections in the registry it was built with
90
+ // — its own when `ragRegistryFactory` supplied one, the shared one
91
+ // otherwise; global and user collections survive. The Result<void,
92
+ // RagError> is INSPECTED here — a failed close is surfaced via the
93
+ // optional logger (or console.warn fallback), never silently dropped
94
+ // (review MEDIUM #2).
95
+ dispose: async (sessionId) => {
96
+ // Single sink for every best-effort teardown failure below: routes to
97
+ // the configured logger, or console.warn when there is none. Each call
98
+ // site's two message strings are unchanged from before this helper
99
+ // existed — the teardown tests assert on them.
100
+ const warn = (logMessage, consoleMessage) => {
80
101
  if (this.opts.logger) {
81
102
  this.opts.logger.log({
82
103
  type: 'warning',
83
104
  traceId: `session:${sessionId}`,
84
- message: `session_dispose_hook_failed: ${message}`,
105
+ message: logMessage,
85
106
  });
86
107
  }
87
108
  else {
88
- console.warn(`[session] onDispose(${sessionId}) failed: ${message}`);
109
+ console.warn(consoleMessage);
110
+ }
111
+ };
112
+ // Runs first: a pipeline still in flight must not write into a session
113
+ // collection that `closeSession` is about to delete. Best-effort, like
114
+ // every other step here.
115
+ if (this.opts.closePipeline) {
116
+ try {
117
+ await this.opts.closePipeline(sessionId);
118
+ }
119
+ catch (err) {
120
+ const message = err instanceof Error ? err.message : String(err);
121
+ warn(`session_close_pipeline_failed: ${message}`, `[session] closePipeline(${sessionId}) failed: ${message}`);
89
122
  }
90
123
  }
91
- }
92
- },
93
- });
124
+ // Best-effort like every other step here: a REJECTING closeSession
125
+ // must not skip onDispose/stop below it, exactly like a resolved
126
+ // `{ ok: false }` result must not (handled right underneath). Both
127
+ // cases route through the same two message strings — unchanged —
128
+ // since the pre-existing teardown tests assert on them.
129
+ try {
130
+ const res = await ragRegistry.closeSession(sessionId);
131
+ if (!res.ok) {
132
+ const message = res.error?.message ?? String(res.error);
133
+ warn(`session_close_failed: ${message}`, `[session] closeSession(${sessionId}) failed: ${message}`);
134
+ }
135
+ }
136
+ catch (err) {
137
+ const message = err instanceof Error ? err.message : String(err);
138
+ warn(`session_close_failed: ${message}`, `[session] closeSession(${sessionId}) failed: ${message}`);
139
+ }
140
+ // Host-supplied per-session teardown (e.g. pipeline IPipelineInstance.close).
141
+ // Best-effort: a failure here must not crash session disposal.
142
+ if (this.opts.onDispose) {
143
+ try {
144
+ await this.opts.onDispose(sessionId);
145
+ }
146
+ catch (err) {
147
+ const message = err instanceof Error ? err.message : String(err);
148
+ warn(`session_dispose_hook_failed: ${message}`, `[session] onDispose(${sessionId}) failed: ${message}`);
149
+ }
150
+ }
151
+ // Last: the clients outlive the pipeline that was still calling them.
152
+ for (const server of startedServers) {
153
+ try {
154
+ await server.stop();
155
+ }
156
+ catch (err) {
157
+ const message = err instanceof Error ? err.message : String(err);
158
+ warn(`session_mcp_stop_failed: ${message}`, `[session] mcp stop(${sessionId}) failed: ${message}`);
159
+ }
160
+ }
161
+ },
162
+ });
163
+ }
164
+ catch (err) {
165
+ // `buildAgent` (or, in principle, the `SessionGraph` construction above)
166
+ // threw before a `SessionGraph` exists to own teardown — nothing else
167
+ // will ever stop these servers. Stop them here, on the ORIGINAL error.
168
+ await stopAll(startedServers.map((server) => () => server.stop()));
169
+ throw err;
170
+ }
171
+ return graph;
94
172
  }
95
173
  }
96
174
  //# sourceMappingURL=session-graph-factory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-graph-factory.js","sourceRoot":"","sources":["../../src/session/session-graph-factory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-graph-factory.js","sourceRoot":"","sources":["../../src/session/session-graph-factory.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import type { IApiKeyCredential } from '@mcp-abap-adt/interfaces-auth';
1
2
  import type { CallOptions, CatalogEntry, CatalogSnapshot, ISkillsRagBackendProvider, ISkillsStoreProvider } from '@mcp-abap-adt/llm-agent';
2
3
  export interface QdrantPoint {
3
4
  id: string;
@@ -57,7 +58,11 @@ export declare function makePgCatalogReader(deps: {
57
58
  }): ICatalogReader;
58
59
  interface QdrantRestOptions {
59
60
  url: string;
60
- apiKey?: string;
61
+ /**
62
+ * Asked for on every request — never cached — so a rotating key rotates.
63
+ * Optional: an unauthenticated Qdrant works without one, as before.
64
+ */
65
+ credential?: IApiKeyCredential;
61
66
  collection: string;
62
67
  }
63
68
  /** Read-only Qdrant reader (search + scroll). Used by recall-only with a read key. */
@@ -1 +1 @@
1
- {"version":3,"file":"qdrant-store.d.ts","sourceRoot":"","sources":["../../../src/skills/plugin-host/qdrant-store.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"qdrant-store.d.ts","sourceRoot":"","sources":["../../../src/skills/plugin-host/qdrant-store.ts"],"names":[],"mappings":"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"}
@@ -251,10 +251,10 @@ function toQdrantFilter(filter) {
251
251
  }
252
252
  return { must };
253
253
  }
254
- function qdrantHeaders(apiKey) {
254
+ async function qdrantHeaders(credential) {
255
255
  const h = { 'content-type': 'application/json' };
256
- if (apiKey)
257
- h['api-key'] = apiKey;
256
+ if (credential)
257
+ h['api-key'] = await credential.secret();
258
258
  return h;
259
259
  }
260
260
  function makeQdrantReaderImpl(opts) {
@@ -263,7 +263,7 @@ function makeQdrantReaderImpl(opts) {
263
263
  async search(filter, vector, k, options) {
264
264
  const res = await fetch(`${base}/points/search`, {
265
265
  method: 'POST',
266
- headers: qdrantHeaders(opts.apiKey),
266
+ headers: await qdrantHeaders(opts.credential),
267
267
  body: JSON.stringify({
268
268
  vector,
269
269
  limit: k,
@@ -280,7 +280,7 @@ function makeQdrantReaderImpl(opts) {
280
280
  async scroll(filter, cursor) {
281
281
  const res = await fetch(`${base}/points/scroll`, {
282
282
  method: 'POST',
283
- headers: qdrantHeaders(opts.apiKey),
283
+ headers: await qdrantHeaders(opts.credential),
284
284
  body: JSON.stringify({
285
285
  limit: 256,
286
286
  with_payload: true,
@@ -317,7 +317,7 @@ export function makeQdrantClient(opts) {
317
317
  const q = upsertOpts?.wait ? '?wait=true' : '';
318
318
  const res = await fetch(`${base}/points${q}`, {
319
319
  method: 'PUT',
320
- headers: qdrantHeaders(opts.apiKey),
320
+ headers: await qdrantHeaders(opts.credential),
321
321
  body: JSON.stringify({
322
322
  points: points.map((p) => ({
323
323
  id: p.id,
@@ -332,7 +332,7 @@ export function makeQdrantClient(opts) {
332
332
  async deleteByFilter(filter) {
333
333
  const res = await fetch(`${base}/points/delete`, {
334
334
  method: 'POST',
335
- headers: qdrantHeaders(opts.apiKey),
335
+ headers: await qdrantHeaders(opts.credential),
336
336
  body: JSON.stringify({
337
337
  filter: toQdrantFilter(filter),
338
338
  }),