network-ai 4.0.16 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,235 @@
1
+ "use strict";
2
+ /**
3
+ * A2AAdapter — Agent-to-Agent (A2A) protocol adapter.
4
+ *
5
+ * Implements the Google A2A (Agent-to-Agent) open protocol that lets
6
+ * independently hosted agents discover each other through a standard
7
+ * Agent Card (/.well-known/agent.json) and exchange tasks via a
8
+ * JSON-RPC envelope posted to the agent's task endpoint.
9
+ *
10
+ * References:
11
+ * https://google.github.io/A2A/
12
+ * https://github.com/google/A2A
13
+ *
14
+ * Usage:
15
+ *
16
+ * const adapter = new A2AAdapter();
17
+ * await adapter.initialize({});
18
+ *
19
+ * // Register a remote agent by its Agent Card URL
20
+ * await adapter.registerRemoteAgent('remote-analyst', 'https://agent.example.com');
21
+ *
22
+ * // Or register a local agent that serves an A2A-compliant card
23
+ * adapter.registerLocalA2AAgent('local-writer', {
24
+ * name: 'Writing Agent',
25
+ * description: 'Draft documents given a topic',
26
+ * version: '1.0',
27
+ * capabilities: { streaming: false },
28
+ * taskEndpoint: 'https://writer.internal/tasks',
29
+ * });
30
+ *
31
+ * await registry.addAdapter(adapter);
32
+ *
33
+ * // In the orchestrator:
34
+ * delegateTask({ targetAgent: 'a2a:remote-analyst', ... })
35
+ *
36
+ * @module A2AAdapter
37
+ * @version 1.0.0
38
+ */
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.A2AAdapter = void 0;
41
+ const base_adapter_1 = require("./base-adapter");
42
+ class A2AAdapter extends base_adapter_1.BaseAdapter {
43
+ name = 'a2a';
44
+ version = '1.0.0';
45
+ a2aAgents = new Map();
46
+ defaultBearerToken;
47
+ defaultTimeoutMs = 30_000;
48
+ fetchImpl = globalThis.fetch;
49
+ get capabilities() {
50
+ return {
51
+ streaming: false,
52
+ parallel: true,
53
+ bidirectional: false,
54
+ discovery: true,
55
+ authentication: true,
56
+ statefulSessions: false,
57
+ };
58
+ }
59
+ async initialize(config) {
60
+ await super.initialize(config);
61
+ if (config.defaultBearerToken)
62
+ this.defaultBearerToken = config.defaultBearerToken;
63
+ if (config.defaultTimeoutMs)
64
+ this.defaultTimeoutMs = config.defaultTimeoutMs;
65
+ if (config.fetchImpl)
66
+ this.fetchImpl = config.fetchImpl;
67
+ }
68
+ // ── Registration ────────────────────────────────────────────────────────────
69
+ /**
70
+ * Fetch the Agent Card from `<baseUrl>/.well-known/agent.json` and register
71
+ * the remote agent for use in the orchestrator.
72
+ *
73
+ * @param agentId - Local identifier (used in `delegate_task` calls)
74
+ * @param baseUrl - Root URL of the remote A2A-compliant agent server
75
+ * @param options - Optional bearer token / timeout override
76
+ */
77
+ async registerRemoteAgent(agentId, baseUrl, options) {
78
+ const url = baseUrl.replace(/\/$/, '');
79
+ const card = await this.fetchAgentCard(url, options?.bearerToken ?? this.defaultBearerToken);
80
+ const taskEndpoint = card.taskEndpoint ??
81
+ (card.url ? `${card.url.replace(/\/$/, '')}/tasks` : `${url}/tasks`);
82
+ this.a2aAgents.set(agentId, {
83
+ baseUrl: url,
84
+ card,
85
+ taskEndpoint,
86
+ bearerToken: options?.bearerToken ?? this.defaultBearerToken,
87
+ timeoutMs: options?.timeoutMs ?? this.defaultTimeoutMs,
88
+ });
89
+ this.registerLocalAgent({
90
+ id: agentId,
91
+ name: card.name,
92
+ description: card.description ?? `Remote A2A agent at ${url}`,
93
+ capabilities: card.capabilities
94
+ ? Object.keys(card.capabilities).filter(k => card.capabilities[k] === true)
95
+ : undefined,
96
+ status: 'available',
97
+ metadata: { a2aBaseUrl: url, taskEndpoint },
98
+ });
99
+ }
100
+ /**
101
+ * Register a local A2A agent whose card you already have (no network fetch).
102
+ * Useful when the card is embedded in config or returned from another service.
103
+ */
104
+ registerLocalA2AAgent(agentId, card, options) {
105
+ this.a2aAgents.set(agentId, {
106
+ baseUrl: card.url ?? '',
107
+ card,
108
+ taskEndpoint: card.taskEndpoint,
109
+ bearerToken: options?.bearerToken ?? this.defaultBearerToken,
110
+ timeoutMs: options?.timeoutMs ?? this.defaultTimeoutMs,
111
+ });
112
+ this.registerLocalAgent({
113
+ id: agentId,
114
+ name: card.name,
115
+ description: card.description ?? `Local A2A agent: ${agentId}`,
116
+ capabilities: card.capabilities
117
+ ? Object.keys(card.capabilities).filter(k => card.capabilities[k] === true)
118
+ : undefined,
119
+ status: 'available',
120
+ });
121
+ }
122
+ // ── Execution ───────────────────────────────────────────────────────────────
123
+ async executeAgent(agentId, payload, context) {
124
+ this.ensureReady();
125
+ const config = this.a2aAgents.get(agentId);
126
+ if (!config) {
127
+ return this.errorResult('AGENT_NOT_FOUND', `A2A agent "${agentId}" is not registered. Call registerRemoteAgent() or registerLocalA2AAgent() first.`, false);
128
+ }
129
+ const startTime = Date.now();
130
+ // Build the task instruction from the handoff payload
131
+ const instruction = payload.handoff?.instruction ??
132
+ (payload.params ? JSON.stringify(payload.params) : 'No instruction provided');
133
+ const taskId = `${context.taskId ?? 'task'}-${Date.now()}`;
134
+ const taskEnvelope = {
135
+ jsonrpc: '2.0',
136
+ id: taskId,
137
+ method: 'tasks/send',
138
+ params: {
139
+ id: taskId,
140
+ message: {
141
+ role: 'user',
142
+ parts: [{ type: 'text', text: instruction }],
143
+ },
144
+ metadata: {
145
+ sourceAgent: context.agentId,
146
+ sessionId: context.sessionId,
147
+ ...(payload.handoff?.context ?? {}),
148
+ },
149
+ },
150
+ };
151
+ try {
152
+ const response = await this.sendTask(config, taskEnvelope);
153
+ if (response.error) {
154
+ return this.errorResult(`A2A_ERROR_${response.error.code}`, response.error.message, response.error.code >= 500, response.error);
155
+ }
156
+ if (!response.result) {
157
+ return this.errorResult('A2A_EMPTY_RESPONSE', 'A2A response had no result field', true);
158
+ }
159
+ const state = response.result.status.state;
160
+ if (state === 'failed' || state === 'canceled') {
161
+ return this.errorResult(`A2A_TASK_${state.toUpperCase()}`, response.result.status.message ?? `Task ended with state: ${state}`, state === 'failed');
162
+ }
163
+ // Extract text from artifacts
164
+ const output = this.extractOutput(response.result.artifacts);
165
+ return this.successResult({ output, state, artifacts: response.result.artifacts, metadata: response.result.metadata }, Date.now() - startTime);
166
+ }
167
+ catch (err) {
168
+ if (err instanceof Error && err.name === 'AbortError') {
169
+ return this.errorResult('A2A_TIMEOUT', `A2A request timed out after ${config.timeoutMs}ms`, true);
170
+ }
171
+ return this.errorResult('A2A_REQUEST_FAILED', err instanceof Error ? err.message : 'A2A request failed', true, err);
172
+ }
173
+ }
174
+ // ── Internals ───────────────────────────────────────────────────────────────
175
+ async fetchAgentCard(baseUrl, bearerToken) {
176
+ const cardUrl = `${baseUrl}/.well-known/agent.json`;
177
+ const headers = { Accept: 'application/json' };
178
+ if (bearerToken)
179
+ headers.Authorization = `Bearer ${bearerToken}`;
180
+ const controller = new AbortController();
181
+ const id = setTimeout(() => controller.abort(), this.defaultTimeoutMs);
182
+ let response;
183
+ try {
184
+ response = await this.fetchImpl(cardUrl, { headers, signal: controller.signal });
185
+ }
186
+ finally {
187
+ clearTimeout(id);
188
+ }
189
+ if (!response.ok) {
190
+ throw new Error(`Failed to fetch agent card from ${cardUrl}: HTTP ${response.status}`);
191
+ }
192
+ const card = await response.json();
193
+ if (!card.name) {
194
+ throw new Error(`Agent card at ${cardUrl} is missing required "name" field`);
195
+ }
196
+ return card;
197
+ }
198
+ async sendTask(config, task) {
199
+ const headers = {
200
+ 'Content-Type': 'application/json',
201
+ Accept: 'application/json',
202
+ };
203
+ if (config.bearerToken)
204
+ headers.Authorization = `Bearer ${config.bearerToken}`;
205
+ const controller = new AbortController();
206
+ const id = setTimeout(() => controller.abort(), config.timeoutMs);
207
+ let response;
208
+ try {
209
+ response = await this.fetchImpl(config.taskEndpoint, {
210
+ method: 'POST',
211
+ headers,
212
+ body: JSON.stringify(task),
213
+ signal: controller.signal,
214
+ });
215
+ }
216
+ finally {
217
+ clearTimeout(id);
218
+ }
219
+ if (!response.ok) {
220
+ throw new Error(`A2A task endpoint returned HTTP ${response.status}: ${response.statusText}`);
221
+ }
222
+ return response.json();
223
+ }
224
+ extractOutput(artifacts) {
225
+ if (!artifacts?.length)
226
+ return '';
227
+ return artifacts
228
+ .flatMap(a => a.parts)
229
+ .filter(p => p.type === 'text' && typeof p.text === 'string')
230
+ .map(p => p.text)
231
+ .join('\n');
232
+ }
233
+ }
234
+ exports.A2AAdapter = A2AAdapter;
235
+ //# sourceMappingURL=a2a-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"a2a-adapter.js","sourceRoot":"","sources":["../../adapters/a2a-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * CustomStreamingAdapter — CustomAdapter with streaming support.
3
+ *
4
+ * Extends {@link CustomAdapter} so that handlers can yield incremental text
5
+ * by returning an `AsyncIterable<string>` or `AsyncIterable<StreamingChunk>`.
6
+ * Plain `Promise<unknown>` handlers work unchanged (single-chunk fallback).
7
+ *
8
+ * Usage:
9
+ *
10
+ * const adapter = new CustomStreamingAdapter();
11
+ *
12
+ * // Streaming handler — yields tokens incrementally
13
+ * adapter.registerHandler('writer', async function*(payload) {
14
+ * yield 'Once ';
15
+ * yield 'upon ';
16
+ * yield 'a time…';
17
+ * });
18
+ *
19
+ * // Non-streaming handler — works exactly as before
20
+ * adapter.registerHandler('analyze', async (payload) => ({ result: 'done' }));
21
+ *
22
+ * // Consume the stream
23
+ * for await (const chunk of adapter.executeAgentStream('writer', payload, ctx)) {
24
+ * process.stdout.write(chunk.text);
25
+ * }
26
+ *
27
+ * @module CustomStreamingAdapter
28
+ * @version 1.0.0
29
+ */
30
+ import type { AgentPayload, AgentContext, AdapterCapabilities } from '../types/agent-adapter';
31
+ import type { IStreamingAdapter, StreamingChunk } from '../types/streaming-adapter';
32
+ import { CustomAdapter, AgentHandler } from './custom-adapter';
33
+ /**
34
+ * Extended handler type that may also return an async iterable of string tokens
35
+ * or full `StreamingChunk` objects.
36
+ */
37
+ export type StreamingAgentHandler = AgentHandler | ((payload: AgentPayload, context: AgentContext) => AsyncIterable<string>) | ((payload: AgentPayload, context: AgentContext) => AsyncIterable<StreamingChunk>);
38
+ export declare class CustomStreamingAdapter extends CustomAdapter implements IStreamingAdapter {
39
+ private streamingHandlers;
40
+ get capabilities(): AdapterCapabilities;
41
+ /**
42
+ * Register a handler. Streaming handlers (functions returning `AsyncIterable`)
43
+ * are detected automatically and exposed through `executeAgentStream()`.
44
+ */
45
+ registerHandler(agentId: string, handler: StreamingAgentHandler, metadata?: {
46
+ description?: string;
47
+ capabilities?: string[];
48
+ }): void;
49
+ /**
50
+ * Mark an already-registered handler as streaming.
51
+ * Useful when the handler function is not an async generator but returns
52
+ * an `AsyncIterable` (e.g. a closure around a separate generator).
53
+ */
54
+ markStreaming(agentId: string): void;
55
+ supportsStreaming(agentId: string): boolean;
56
+ /**
57
+ * Execute a handler with streaming support.
58
+ *
59
+ * - If the handler is registered as streaming (yields tokens), pipes the
60
+ * async iterable to `StreamingChunk` values.
61
+ * - Otherwise falls back to `executeAgent()` and wraps the result as a
62
+ * single chunk (same behaviour as the non-streaming `CustomAdapter`).
63
+ */
64
+ executeAgentStream(agentId: string, payload: AgentPayload, context: AgentContext): AsyncIterable<StreamingChunk>;
65
+ /** Pipe an `AsyncIterable<string | StreamingChunk>` to `StreamingChunk` values. */
66
+ private _pipeIterable;
67
+ }
68
+ //# sourceMappingURL=custom-streaming-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-streaming-adapter.d.ts","sourceRoot":"","sources":["../../adapters/custom-streaming-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC9F,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE/D;;;GAGG;AACH,MAAM,MAAM,qBAAqB,GAC7B,YAAY,GACZ,CAAC,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,KAAK,aAAa,CAAC,MAAM,CAAC,CAAC,GACzE,CAAC,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,KAAK,aAAa,CAAC,cAAc,CAAC,CAAC,CAAC;AAqBtF,qBAAa,sBAAuB,SAAQ,aAAc,YAAW,iBAAiB;IAEpF,OAAO,CAAC,iBAAiB,CAAqB;IAE9C,IAAI,YAAY,IAAI,mBAAmB,CAKtC;IAED;;;OAGG;IACH,eAAe,CACb,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,qBAAqB,EAC9B,QAAQ,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAC3D,IAAI;IAgBP;;;;OAIG;IACH,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAIpC,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI3C;;;;;;;OAOG;IACI,kBAAkB,CACvB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,YAAY,GACpB,aAAa,CAAC,cAAc,CAAC;IA4EhC,mFAAmF;YACpE,aAAa;CAqB7B"}
@@ -0,0 +1,181 @@
1
+ "use strict";
2
+ /**
3
+ * CustomStreamingAdapter — CustomAdapter with streaming support.
4
+ *
5
+ * Extends {@link CustomAdapter} so that handlers can yield incremental text
6
+ * by returning an `AsyncIterable<string>` or `AsyncIterable<StreamingChunk>`.
7
+ * Plain `Promise<unknown>` handlers work unchanged (single-chunk fallback).
8
+ *
9
+ * Usage:
10
+ *
11
+ * const adapter = new CustomStreamingAdapter();
12
+ *
13
+ * // Streaming handler — yields tokens incrementally
14
+ * adapter.registerHandler('writer', async function*(payload) {
15
+ * yield 'Once ';
16
+ * yield 'upon ';
17
+ * yield 'a time…';
18
+ * });
19
+ *
20
+ * // Non-streaming handler — works exactly as before
21
+ * adapter.registerHandler('analyze', async (payload) => ({ result: 'done' }));
22
+ *
23
+ * // Consume the stream
24
+ * for await (const chunk of adapter.executeAgentStream('writer', payload, ctx)) {
25
+ * process.stdout.write(chunk.text);
26
+ * }
27
+ *
28
+ * @module CustomStreamingAdapter
29
+ * @version 1.0.0
30
+ */
31
+ Object.defineProperty(exports, "__esModule", { value: true });
32
+ exports.CustomStreamingAdapter = void 0;
33
+ const custom_adapter_1 = require("./custom-adapter");
34
+ /** Type guard — checks whether the return value of a handler is async-iterable. */
35
+ function isAsyncIterable(val) {
36
+ return (val != null &&
37
+ typeof val === 'object' &&
38
+ Symbol.asyncIterator in val);
39
+ }
40
+ /** Type guard — checks whether a `StreamingChunk`-shaped object was yielded. */
41
+ function isStreamingChunk(val) {
42
+ return (val !== null &&
43
+ typeof val === 'object' &&
44
+ typeof val.text === 'string' &&
45
+ typeof val.done === 'boolean');
46
+ }
47
+ class CustomStreamingAdapter extends custom_adapter_1.CustomAdapter {
48
+ streamingHandlers = new Set();
49
+ get capabilities() {
50
+ return {
51
+ ...super.capabilities,
52
+ streaming: true,
53
+ };
54
+ }
55
+ /**
56
+ * Register a handler. Streaming handlers (functions returning `AsyncIterable`)
57
+ * are detected automatically and exposed through `executeAgentStream()`.
58
+ */
59
+ registerHandler(agentId, handler, metadata) {
60
+ // Probe: call the handler with synthetic inputs and check if the return
61
+ // is async-iterable. We do this via a duck-typed try, falling back safely.
62
+ // Instead, infer from the handler's prototype / generator signature:
63
+ const isGenerator = handler.constructor?.name === 'AsyncGeneratorFunction' ||
64
+ (Object.prototype.toString.call(handler) === '[object AsyncGeneratorFunction]');
65
+ if (isGenerator) {
66
+ this.streamingHandlers.add(agentId);
67
+ }
68
+ // Cast to base AgentHandler — the broader type is compatible at runtime
69
+ super.registerHandler(agentId, handler, metadata);
70
+ }
71
+ /**
72
+ * Mark an already-registered handler as streaming.
73
+ * Useful when the handler function is not an async generator but returns
74
+ * an `AsyncIterable` (e.g. a closure around a separate generator).
75
+ */
76
+ markStreaming(agentId) {
77
+ this.streamingHandlers.add(agentId);
78
+ }
79
+ supportsStreaming(agentId) {
80
+ return this.streamingHandlers.has(agentId);
81
+ }
82
+ /**
83
+ * Execute a handler with streaming support.
84
+ *
85
+ * - If the handler is registered as streaming (yields tokens), pipes the
86
+ * async iterable to `StreamingChunk` values.
87
+ * - Otherwise falls back to `executeAgent()` and wraps the result as a
88
+ * single chunk (same behaviour as the non-streaming `CustomAdapter`).
89
+ */
90
+ async *executeAgentStream(agentId, payload, context) {
91
+ this.ensureReady();
92
+ // Access the internal handlers map stored in the parent class
93
+ const handlers = this.handlers;
94
+ const handler = handlers?.get(agentId);
95
+ if (!handler) {
96
+ // No handler — delegate to base executeAgent (which returns AGENT_NOT_FOUND)
97
+ const result = await this.executeAgent(agentId, payload, context);
98
+ yield {
99
+ text: result.error?.message ?? 'Agent not found',
100
+ done: true,
101
+ metadata: { error: true },
102
+ };
103
+ return;
104
+ }
105
+ // Invoke the handler — may return a Promise or an AsyncIterable
106
+ let returnValue;
107
+ try {
108
+ returnValue = handler(payload, context);
109
+ }
110
+ catch (err) {
111
+ yield {
112
+ text: err instanceof Error ? err.message : 'Handler threw synchronously',
113
+ done: true,
114
+ metadata: { error: true },
115
+ };
116
+ return;
117
+ }
118
+ // If the return is a Promise, await it first
119
+ if (returnValue instanceof Promise) {
120
+ let resolved;
121
+ try {
122
+ resolved = await returnValue;
123
+ }
124
+ catch (err) {
125
+ yield {
126
+ text: err instanceof Error ? err.message : 'Handler rejected',
127
+ done: true,
128
+ metadata: { error: true },
129
+ };
130
+ return;
131
+ }
132
+ if (isAsyncIterable(resolved)) {
133
+ // Resolved to an async iterable — pipe it through
134
+ yield* this._pipeIterable(resolved);
135
+ return;
136
+ }
137
+ // Plain resolved value — single chunk fallback
138
+ const text = typeof resolved === 'string' ? resolved :
139
+ resolved != null ? JSON.stringify(resolved) :
140
+ '';
141
+ yield { text, done: false };
142
+ yield { text: '', done: true };
143
+ return;
144
+ }
145
+ // Returned an AsyncIterable directly (generator function, etc.)
146
+ if (isAsyncIterable(returnValue)) {
147
+ yield* this._pipeIterable(returnValue);
148
+ return;
149
+ }
150
+ // Fallback — single chunk from whatever value was returned
151
+ const text = typeof returnValue === 'string' ? returnValue :
152
+ returnValue != null ? JSON.stringify(returnValue) :
153
+ '';
154
+ yield { text, done: false };
155
+ yield { text: '', done: true };
156
+ }
157
+ /** Pipe an `AsyncIterable<string | StreamingChunk>` to `StreamingChunk` values. */
158
+ async *_pipeIterable(iterable) {
159
+ try {
160
+ for await (const item of iterable) {
161
+ if (isStreamingChunk(item)) {
162
+ yield item;
163
+ }
164
+ else {
165
+ const text = typeof item === 'string' ? item : JSON.stringify(item);
166
+ yield { text, done: false };
167
+ }
168
+ }
169
+ yield { text: '', done: true };
170
+ }
171
+ catch (err) {
172
+ yield {
173
+ text: err instanceof Error ? err.message : 'Stream iteration failed',
174
+ done: true,
175
+ metadata: { error: true },
176
+ };
177
+ }
178
+ }
179
+ }
180
+ exports.CustomStreamingAdapter = CustomStreamingAdapter;
181
+ //# sourceMappingURL=custom-streaming-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-streaming-adapter.js","sourceRoot":"","sources":["../../adapters/custom-streaming-adapter.ts"],"names":[],"mappings":"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"}
@@ -43,5 +43,12 @@ export { DSPyAdapter } from './dspy-adapter';
43
43
  export type { DSPyModule, DSPyProgram, DSPyPrediction, DSPyPredictor } from './dspy-adapter';
44
44
  export { AgnoAdapter } from './agno-adapter';
45
45
  export type { AgnoAgent, AgnoTeam, AgnoResponse, AgnoFunction, } from './agno-adapter';
46
+ export { StreamingBaseAdapter, collectStream } from './streaming-base-adapter';
47
+ export { LangChainStreamingAdapter } from './langchain-streaming-adapter';
48
+ export { CustomStreamingAdapter } from './custom-streaming-adapter';
49
+ export type { StreamingAgentHandler } from './custom-streaming-adapter';
50
+ export { A2AAdapter } from './a2a-adapter';
51
+ export type { A2AAgentCard, A2ATask, A2ATaskResponse, A2ATaskState, A2AArtifact, A2AAdapterConfig, } from './a2a-adapter';
52
+ export type { StreamingChunk, IStreamingAdapter, StreamCollector } from '../types/streaming-adapter';
46
53
  export type { IAgentAdapter, AgentPayload, AgentContext, AgentResult, AgentInfo, AdapterConfig, AdapterCapabilities, AdapterRoute, RegistryConfig, AdapterEvent, AdapterEventHandler, AdapterEventType, } from '../types/agent-adapter';
47
54
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../adapters/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGlE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,YAAY,EACV,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACtG,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,YAAY,EACV,eAAe,EACf,sBAAsB,EACtB,aAAa,EACb,SAAS,GACV,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,YAAY,EACV,gBAAgB,EAChB,sBAAsB,EACtB,aAAa,EACb,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,YAAY,EACV,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,YAAY,GACb,MAAM,gBAAgB,CAAC;AAGxB,YAAY,EACV,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,SAAS,EACT,aAAa,EACb,mBAAmB,EACnB,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,wBAAwB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../adapters/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGlE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,YAAY,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAClF,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,YAAY,EACV,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACtG,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,YAAY,EACV,eAAe,EACf,sBAAsB,EACtB,aAAa,EACb,SAAS,GACV,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,YAAY,EACV,gBAAgB,EAChB,sBAAsB,EACtB,aAAa,EACb,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC7F,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,YAAY,EACV,SAAS,EACT,QAAQ,EACR,YAAY,EACZ,YAAY,GACb,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC/E,OAAO,EAAE,yBAAyB,EAAE,MAAM,+BAA+B,CAAC;AAC1E,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,YAAY,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAGxE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,YAAY,EACV,YAAY,EACZ,OAAO,EACP,eAAe,EACf,YAAY,EACZ,WAAW,EACX,gBAAgB,GACjB,MAAM,eAAe,CAAC;AAGvB,YAAY,EAAE,cAAc,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAGrG,YAAY,EACV,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,SAAS,EACT,aAAa,EACb,mBAAmB,EACnB,YAAY,EACZ,cAAc,EACd,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,GACjB,MAAM,wBAAwB,CAAC"}
@@ -20,7 +20,7 @@
20
20
  * @version 1.0.0
21
21
  */
22
22
  Object.defineProperty(exports, "__esModule", { value: true });
23
- exports.AgnoAdapter = exports.DSPyAdapter = exports.HaystackAdapter = exports.OpenAIAssistantsAdapter = exports.SemanticKernelAdapter = exports.LlamaIndexAdapter = exports.CustomAdapter = exports.MCPAdapter = exports.CrewAIAdapter = exports.AutoGenAdapter = exports.LangChainAdapter = exports.OpenClawAdapter = exports.getRegistry = exports.AdapterRegistry = exports.BaseAdapter = void 0;
23
+ exports.A2AAdapter = exports.CustomStreamingAdapter = exports.LangChainStreamingAdapter = exports.collectStream = exports.StreamingBaseAdapter = exports.AgnoAdapter = exports.DSPyAdapter = exports.HaystackAdapter = exports.OpenAIAssistantsAdapter = exports.SemanticKernelAdapter = exports.LlamaIndexAdapter = exports.CustomAdapter = exports.MCPAdapter = exports.CrewAIAdapter = exports.AutoGenAdapter = exports.LangChainAdapter = exports.OpenClawAdapter = exports.getRegistry = exports.AdapterRegistry = exports.BaseAdapter = void 0;
24
24
  // Core infrastructure
25
25
  var base_adapter_1 = require("./base-adapter");
26
26
  Object.defineProperty(exports, "BaseAdapter", { enumerable: true, get: function () { return base_adapter_1.BaseAdapter; } });
@@ -53,4 +53,15 @@ var dspy_adapter_1 = require("./dspy-adapter");
53
53
  Object.defineProperty(exports, "DSPyAdapter", { enumerable: true, get: function () { return dspy_adapter_1.DSPyAdapter; } });
54
54
  var agno_adapter_1 = require("./agno-adapter");
55
55
  Object.defineProperty(exports, "AgnoAdapter", { enumerable: true, get: function () { return agno_adapter_1.AgnoAdapter; } });
56
+ // Streaming adapters
57
+ var streaming_base_adapter_1 = require("./streaming-base-adapter");
58
+ Object.defineProperty(exports, "StreamingBaseAdapter", { enumerable: true, get: function () { return streaming_base_adapter_1.StreamingBaseAdapter; } });
59
+ Object.defineProperty(exports, "collectStream", { enumerable: true, get: function () { return streaming_base_adapter_1.collectStream; } });
60
+ var langchain_streaming_adapter_1 = require("./langchain-streaming-adapter");
61
+ Object.defineProperty(exports, "LangChainStreamingAdapter", { enumerable: true, get: function () { return langchain_streaming_adapter_1.LangChainStreamingAdapter; } });
62
+ var custom_streaming_adapter_1 = require("./custom-streaming-adapter");
63
+ Object.defineProperty(exports, "CustomStreamingAdapter", { enumerable: true, get: function () { return custom_streaming_adapter_1.CustomStreamingAdapter; } });
64
+ // A2A (Agent-to-Agent) adapter
65
+ var a2a_adapter_1 = require("./a2a-adapter");
66
+ Object.defineProperty(exports, "A2AAdapter", { enumerable: true, get: function () { return a2a_adapter_1.A2AAdapter; } });
56
67
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../adapters/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;;AAEH,sBAAsB;AACtB,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AACpB,uDAAkE;AAAzD,mHAAA,eAAe,OAAA;AAAE,+GAAA,WAAW,OAAA;AAErC,mCAAmC;AACnC,uDAAqD;AAA5C,mHAAA,eAAe,OAAA;AACxB,yDAAuD;AAA9C,qHAAA,gBAAgB,OAAA;AAEzB,qDAAmD;AAA1C,iHAAA,cAAc,OAAA;AAEvB,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AAEtB,6CAA2C;AAAlC,yGAAA,UAAU,OAAA;AAEnB,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AAGtB,8BAA8B;AAC9B,2DAAyD;AAAhD,uHAAA,iBAAiB,OAAA;AAO1B,qEAAkE;AAAzD,gIAAA,qBAAqB,OAAA;AAE9B,yEAAsE;AAA7D,oIAAA,uBAAuB,OAAA;AAOhC,uDAAqD;AAA5C,mHAAA,eAAe,OAAA;AAQxB,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AAEpB,+CAA6C;AAApC,2GAAA,WAAW,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../adapters/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;GAmBG;;;AAEH,sBAAsB;AACtB,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AACpB,uDAAkE;AAAzD,mHAAA,eAAe,OAAA;AAAE,+GAAA,WAAW,OAAA;AAErC,mCAAmC;AACnC,uDAAqD;AAA5C,mHAAA,eAAe,OAAA;AACxB,yDAAuD;AAA9C,qHAAA,gBAAgB,OAAA;AAEzB,qDAAmD;AAA1C,iHAAA,cAAc,OAAA;AAEvB,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AAEtB,6CAA2C;AAAlC,yGAAA,UAAU,OAAA;AAEnB,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AAGtB,8BAA8B;AAC9B,2DAAyD;AAAhD,uHAAA,iBAAiB,OAAA;AAO1B,qEAAkE;AAAzD,gIAAA,qBAAqB,OAAA;AAE9B,yEAAsE;AAA7D,oIAAA,uBAAuB,OAAA;AAOhC,uDAAqD;AAA5C,mHAAA,eAAe,OAAA;AAQxB,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AAEpB,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AAQpB,qBAAqB;AACrB,mEAA+E;AAAtE,8HAAA,oBAAoB,OAAA;AAAE,uHAAA,aAAa,OAAA;AAC5C,6EAA0E;AAAjE,wIAAA,yBAAyB,OAAA;AAClC,uEAAoE;AAA3D,kIAAA,sBAAsB,OAAA;AAG/B,+BAA+B;AAC/B,6CAA2C;AAAlC,yGAAA,UAAU,OAAA"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * LangChainStreamingAdapter — LangChainAdapter with real incremental streaming.
3
+ *
4
+ * Extends {@link LangChainAdapter} with genuine streaming via the LangChain
5
+ * Runnable `.stream()` interface. Falls back gracefully to `.invoke()` for
6
+ * agents whose Runnable does not expose `.stream()`.
7
+ *
8
+ * Usage (drop-in replacement for LangChainAdapter):
9
+ *
10
+ * const adapter = new LangChainStreamingAdapter();
11
+ * adapter.registerAgent('analyst', myChain); // same API
12
+ * await registry.addAdapter(adapter);
13
+ *
14
+ * // Stream the response
15
+ * for await (const chunk of adapter.executeAgentStream('analyst', payload, ctx)) {
16
+ * process.stdout.write(chunk.text);
17
+ * if (chunk.done) break;
18
+ * }
19
+ *
20
+ * @module LangChainStreamingAdapter
21
+ * @version 1.0.0
22
+ */
23
+ import type { AgentPayload, AgentContext, AdapterCapabilities } from '../types/agent-adapter';
24
+ import type { StreamingChunk } from '../types/streaming-adapter';
25
+ import type { IStreamingAdapter } from '../types/streaming-adapter';
26
+ import { LangChainAdapter, LangChainRunnable } from './langchain-adapter';
27
+ export declare class LangChainStreamingAdapter extends LangChainAdapter implements IStreamingAdapter {
28
+ private streamableAgentIds;
29
+ get capabilities(): AdapterCapabilities;
30
+ /**
31
+ * Register a LangChain agent. Automatically detects `.stream()` support.
32
+ */
33
+ registerAgent(agentId: string, runnable: LangChainRunnable, metadata?: {
34
+ description?: string;
35
+ capabilities?: string[];
36
+ }): void;
37
+ /** Returns `true` when the agent exposes LangChain's `.stream()` method. */
38
+ supportsStreaming(agentId: string): boolean;
39
+ /**
40
+ * Stream agent execution as incremental `StreamingChunk` values.
41
+ *
42
+ * - If the registered Runnable exposes `.stream()`, emits tokens incrementally.
43
+ * - Otherwise falls back to `.invoke()` and emits a single chunk.
44
+ */
45
+ executeAgentStream(agentId: string, payload: AgentPayload, context: AgentContext): AsyncIterable<StreamingChunk>;
46
+ private _fallbackStream;
47
+ }
48
+ //# sourceMappingURL=langchain-streaming-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"langchain-streaming-adapter.d.ts","sourceRoot":"","sources":["../../adapters/langchain-streaming-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAC9F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AACjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAsC1E,qBAAa,yBAA0B,SAAQ,gBAAiB,YAAW,iBAAiB;IAG1F,OAAO,CAAC,kBAAkB,CAAqB;IAE/C,IAAI,YAAY,IAAI,mBAAmB,CAKtC;IAED;;OAEG;IACH,aAAa,CACX,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,iBAAiB,EAC3B,QAAQ,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAC3D,IAAI;IAOP,4EAA4E;IAC5E,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAI3C;;;;;OAKG;IACI,kBAAkB,CACvB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,YAAY,EACrB,OAAO,EAAE,YAAY,GACpB,aAAa,CAAC,cAAc,CAAC;YAkEjB,eAAe;CAsB/B"}