@falai/agent 1.1.2 → 1.2.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/README.md +9 -0
- package/dist/cjs/core/Agent.d.ts +17 -1
- package/dist/cjs/core/Agent.d.ts.map +1 -1
- package/dist/cjs/core/Agent.js +47 -0
- package/dist/cjs/core/Agent.js.map +1 -1
- package/dist/cjs/core/BatchPromptBuilder.d.ts +3 -0
- package/dist/cjs/core/BatchPromptBuilder.d.ts.map +1 -1
- package/dist/cjs/core/BatchPromptBuilder.js +14 -11
- package/dist/cjs/core/BatchPromptBuilder.js.map +1 -1
- package/dist/cjs/core/CompactionEngine.d.ts +65 -0
- package/dist/cjs/core/CompactionEngine.d.ts.map +1 -0
- package/dist/cjs/core/CompactionEngine.js +251 -0
- package/dist/cjs/core/CompactionEngine.js.map +1 -0
- package/dist/cjs/core/PromptComposer.d.ts +8 -1
- package/dist/cjs/core/PromptComposer.d.ts.map +1 -1
- package/dist/cjs/core/PromptComposer.js +238 -118
- package/dist/cjs/core/PromptComposer.js.map +1 -1
- package/dist/cjs/core/PromptSectionCache.d.ts +57 -0
- package/dist/cjs/core/PromptSectionCache.d.ts.map +1 -0
- package/dist/cjs/core/PromptSectionCache.js +108 -0
- package/dist/cjs/core/PromptSectionCache.js.map +1 -0
- package/dist/cjs/core/ResponseEngine.d.ts +3 -0
- package/dist/cjs/core/ResponseEngine.d.ts.map +1 -1
- package/dist/cjs/core/ResponseEngine.js +10 -6
- package/dist/cjs/core/ResponseEngine.js.map +1 -1
- package/dist/cjs/core/ResponseModal.d.ts.map +1 -1
- package/dist/cjs/core/ResponseModal.js +79 -20
- package/dist/cjs/core/ResponseModal.js.map +1 -1
- package/dist/cjs/core/RoutingEngine.d.ts +10 -0
- package/dist/cjs/core/RoutingEngine.d.ts.map +1 -1
- package/dist/cjs/core/RoutingEngine.js +3 -2
- package/dist/cjs/core/RoutingEngine.js.map +1 -1
- package/dist/cjs/core/SessionManager.d.ts.map +1 -1
- package/dist/cjs/core/SessionManager.js +20 -0
- package/dist/cjs/core/SessionManager.js.map +1 -1
- package/dist/cjs/core/StreamingToolExecutor.d.ts +142 -0
- package/dist/cjs/core/StreamingToolExecutor.d.ts.map +1 -0
- package/dist/cjs/core/StreamingToolExecutor.js +455 -0
- package/dist/cjs/core/StreamingToolExecutor.js.map +1 -0
- package/dist/cjs/core/ToolManager.d.ts +18 -1
- package/dist/cjs/core/ToolManager.d.ts.map +1 -1
- package/dist/cjs/core/ToolManager.js +91 -0
- package/dist/cjs/core/ToolManager.js.map +1 -1
- package/dist/cjs/index.d.ts +5 -1
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +8 -2
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/providers/AnthropicProvider.d.ts.map +1 -1
- package/dist/cjs/providers/AnthropicProvider.js +8 -7
- package/dist/cjs/providers/AnthropicProvider.js.map +1 -1
- package/dist/cjs/providers/GeminiProvider.d.ts +25 -0
- package/dist/cjs/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/cjs/providers/GeminiProvider.js +79 -51
- package/dist/cjs/providers/GeminiProvider.js.map +1 -1
- package/dist/cjs/providers/OpenAIProvider.d.ts.map +1 -1
- package/dist/cjs/providers/OpenAIProvider.js +14 -6
- package/dist/cjs/providers/OpenAIProvider.js.map +1 -1
- package/dist/cjs/providers/OpenRouterProvider.d.ts.map +1 -1
- package/dist/cjs/providers/OpenRouterProvider.js +7 -6
- package/dist/cjs/providers/OpenRouterProvider.js.map +1 -1
- package/dist/cjs/types/agent.d.ts +44 -0
- package/dist/cjs/types/agent.d.ts.map +1 -1
- package/dist/cjs/types/agent.js.map +1 -1
- package/dist/cjs/types/compaction.d.ts +50 -0
- package/dist/cjs/types/compaction.d.ts.map +1 -0
- package/dist/cjs/types/compaction.js +6 -0
- package/dist/cjs/types/compaction.js.map +1 -0
- package/dist/cjs/types/index.d.ts +4 -2
- package/dist/cjs/types/index.d.ts.map +1 -1
- package/dist/cjs/types/index.js.map +1 -1
- package/dist/cjs/types/tool.d.ts +84 -0
- package/dist/cjs/types/tool.d.ts.map +1 -1
- package/dist/core/Agent.d.ts +17 -1
- package/dist/core/Agent.d.ts.map +1 -1
- package/dist/core/Agent.js +47 -0
- package/dist/core/Agent.js.map +1 -1
- package/dist/core/BatchPromptBuilder.d.ts +3 -0
- package/dist/core/BatchPromptBuilder.d.ts.map +1 -1
- package/dist/core/BatchPromptBuilder.js +14 -11
- package/dist/core/BatchPromptBuilder.js.map +1 -1
- package/dist/core/CompactionEngine.d.ts +65 -0
- package/dist/core/CompactionEngine.d.ts.map +1 -0
- package/dist/core/CompactionEngine.js +244 -0
- package/dist/core/CompactionEngine.js.map +1 -0
- package/dist/core/PromptComposer.d.ts +8 -1
- package/dist/core/PromptComposer.d.ts.map +1 -1
- package/dist/core/PromptComposer.js +238 -118
- package/dist/core/PromptComposer.js.map +1 -1
- package/dist/core/PromptSectionCache.d.ts +57 -0
- package/dist/core/PromptSectionCache.d.ts.map +1 -0
- package/dist/core/PromptSectionCache.js +104 -0
- package/dist/core/PromptSectionCache.js.map +1 -0
- package/dist/core/ResponseEngine.d.ts +3 -0
- package/dist/core/ResponseEngine.d.ts.map +1 -1
- package/dist/core/ResponseEngine.js +10 -6
- package/dist/core/ResponseEngine.js.map +1 -1
- package/dist/core/ResponseModal.d.ts.map +1 -1
- package/dist/core/ResponseModal.js +79 -20
- package/dist/core/ResponseModal.js.map +1 -1
- package/dist/core/RoutingEngine.d.ts +10 -0
- package/dist/core/RoutingEngine.d.ts.map +1 -1
- package/dist/core/RoutingEngine.js +3 -2
- package/dist/core/RoutingEngine.js.map +1 -1
- package/dist/core/SessionManager.d.ts.map +1 -1
- package/dist/core/SessionManager.js +17 -0
- package/dist/core/SessionManager.js.map +1 -1
- package/dist/core/StreamingToolExecutor.d.ts +142 -0
- package/dist/core/StreamingToolExecutor.d.ts.map +1 -0
- package/dist/core/StreamingToolExecutor.js +448 -0
- package/dist/core/StreamingToolExecutor.js.map +1 -0
- package/dist/core/ToolManager.d.ts +18 -1
- package/dist/core/ToolManager.d.ts.map +1 -1
- package/dist/core/ToolManager.js +91 -0
- package/dist/core/ToolManager.js.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/providers/AnthropicProvider.d.ts.map +1 -1
- package/dist/providers/AnthropicProvider.js +8 -7
- package/dist/providers/AnthropicProvider.js.map +1 -1
- package/dist/providers/GeminiProvider.d.ts +25 -0
- package/dist/providers/GeminiProvider.d.ts.map +1 -1
- package/dist/providers/GeminiProvider.js +79 -51
- package/dist/providers/GeminiProvider.js.map +1 -1
- package/dist/providers/OpenAIProvider.d.ts.map +1 -1
- package/dist/providers/OpenAIProvider.js +14 -6
- package/dist/providers/OpenAIProvider.js.map +1 -1
- package/dist/providers/OpenRouterProvider.d.ts.map +1 -1
- package/dist/providers/OpenRouterProvider.js +7 -6
- package/dist/providers/OpenRouterProvider.js.map +1 -1
- package/dist/types/agent.d.ts +44 -0
- package/dist/types/agent.d.ts.map +1 -1
- package/dist/types/agent.js.map +1 -1
- package/dist/types/compaction.d.ts +50 -0
- package/dist/types/compaction.d.ts.map +1 -0
- package/dist/types/compaction.js +5 -0
- package/dist/types/compaction.js.map +1 -0
- package/dist/types/index.d.ts +4 -2
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/tool.d.ts +84 -0
- package/dist/types/tool.d.ts.map +1 -1
- package/docs/api/overview.md +140 -0
- package/docs/core/tools/enhanced-tool.md +186 -0
- package/docs/core/tools/streaming-execution.md +161 -0
- package/docs/guides/context-compaction.md +96 -0
- package/docs/guides/prompt-optimization.md +164 -0
- package/examples/advanced-patterns/context-compaction.ts +223 -0
- package/examples/advanced-patterns/streaming-responses.ts +85 -7
- package/examples/tools/enhanced-tool-metadata.ts +268 -0
- package/examples/tools/streaming-tool-execution.ts +283 -0
- package/package.json +1 -1
- package/src/core/Agent.ts +58 -2
- package/src/core/BatchPromptBuilder.ts +14 -11
- package/src/core/CompactionEngine.ts +318 -0
- package/src/core/PromptComposer.ts +261 -141
- package/src/core/PromptSectionCache.ts +136 -0
- package/src/core/ResponseEngine.ts +9 -6
- package/src/core/ResponseModal.ts +81 -20
- package/src/core/RoutingEngine.ts +13 -2
- package/src/core/SessionManager.ts +19 -0
- package/src/core/StreamingToolExecutor.ts +572 -0
- package/src/core/ToolManager.ts +151 -41
- package/src/index.ts +14 -0
- package/src/providers/AnthropicProvider.ts +11 -12
- package/src/providers/GeminiProvider.ts +83 -52
- package/src/providers/OpenAIProvider.ts +21 -13
- package/src/providers/OpenRouterProvider.ts +13 -13
- package/src/types/agent.ts +45 -0
- package/src/types/compaction.ts +52 -0
- package/src/types/index.ts +35 -14
- package/src/types/tool.ts +108 -0
|
@@ -0,0 +1,448 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StreamingToolExecutor - Executes tools as they arrive from the LLM stream
|
|
3
|
+
* with concurrency control, abort handling, and ordered result yielding.
|
|
4
|
+
*
|
|
5
|
+
* Concurrency invariant: at any point during execution, either all executing
|
|
6
|
+
* tools have `isConcurrencySafe === true`, or exactly one tool is executing
|
|
7
|
+
* with `isConcurrencySafe === false`.
|
|
8
|
+
*
|
|
9
|
+
* Results are yielded in the original request order (the order addTool was called).
|
|
10
|
+
* Progress messages bypass result ordering and are yielded immediately.
|
|
11
|
+
*/
|
|
12
|
+
import log from "loglevel";
|
|
13
|
+
function createDeferred() {
|
|
14
|
+
let resolve;
|
|
15
|
+
let reject;
|
|
16
|
+
const promise = new Promise((res, rej) => {
|
|
17
|
+
resolve = res;
|
|
18
|
+
reject = rej;
|
|
19
|
+
});
|
|
20
|
+
return { promise, resolve, reject };
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* StreamingToolExecutor manages queuing, concurrent execution, abort propagation,
|
|
24
|
+
* and ordered result yielding for tool calls arriving from an LLM stream.
|
|
25
|
+
*/
|
|
26
|
+
export class StreamingToolExecutor {
|
|
27
|
+
/**
|
|
28
|
+
* @param toolContext - Context provided to each tool handler during execution
|
|
29
|
+
* @param options - Optional configuration for max parallelism and abort signal
|
|
30
|
+
*/
|
|
31
|
+
constructor(toolContext, options) {
|
|
32
|
+
/** Ordered list of tracked tools (insertion order = request order) */
|
|
33
|
+
this.tools = [];
|
|
34
|
+
/** Whether the executor has been discarded (no new tools will be processed) */
|
|
35
|
+
this.discarded = false;
|
|
36
|
+
/** Accumulated context updates from completed tools */
|
|
37
|
+
this.contextUpdates = {};
|
|
38
|
+
/**
|
|
39
|
+
* Sibling abort controller for the current concurrent batch.
|
|
40
|
+
* When one tool in a batch fails, this aborts all siblings.
|
|
41
|
+
*/
|
|
42
|
+
this.siblingAbortController = null;
|
|
43
|
+
/**
|
|
44
|
+
* Set of tool IDs in the current concurrent batch.
|
|
45
|
+
* Reset when a new batch starts.
|
|
46
|
+
*/
|
|
47
|
+
this.currentBatchIds = new Set();
|
|
48
|
+
/**
|
|
49
|
+
* Deferred used to wake up getRemainingResults when state changes
|
|
50
|
+
* (tool completes, progress arrives, or executor finishes).
|
|
51
|
+
*/
|
|
52
|
+
this.waiter = null;
|
|
53
|
+
this.toolContext = toolContext;
|
|
54
|
+
this.maxParallel = options?.maxParallel ?? 10;
|
|
55
|
+
this.parentSignal = options?.signal;
|
|
56
|
+
// Listen to parent abort signal
|
|
57
|
+
if (this.parentSignal) {
|
|
58
|
+
this.parentSignal.addEventListener("abort", () => this.handleParentAbort(), { once: true });
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Queue a tool for execution. The tool's `isConcurrencySafe` is evaluated
|
|
63
|
+
* once at queue time and cached on the TrackedTool.
|
|
64
|
+
*
|
|
65
|
+
* If the executor has been discarded, the tool is ignored.
|
|
66
|
+
*/
|
|
67
|
+
addTool(toolCall, tool) {
|
|
68
|
+
if (this.discarded) {
|
|
69
|
+
log.warn(`[StreamingToolExecutor] Executor discarded, ignoring tool: ${toolCall.toolName}`);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
// Evaluate concurrency safety once at queue time (Req 2.3)
|
|
73
|
+
const isConcurrencySafe = tool.isConcurrencySafe
|
|
74
|
+
? tool.isConcurrencySafe(toolCall.arguments)
|
|
75
|
+
: false; // Default: not concurrency-safe (Req 2.2, 10.2)
|
|
76
|
+
const tracked = {
|
|
77
|
+
id: toolCall.id,
|
|
78
|
+
toolCall,
|
|
79
|
+
tool,
|
|
80
|
+
status: "queued",
|
|
81
|
+
isConcurrencySafe,
|
|
82
|
+
results: [],
|
|
83
|
+
pendingProgress: [],
|
|
84
|
+
};
|
|
85
|
+
this.tools.push(tracked);
|
|
86
|
+
log.debug(`[StreamingToolExecutor] Queued tool ${toolCall.toolName} (id=${toolCall.id}, concurrencySafe=${isConcurrencySafe})`);
|
|
87
|
+
// Kick the queue
|
|
88
|
+
this.processQueue();
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Process the tool queue, starting eligible tools while maintaining
|
|
92
|
+
* the concurrency invariant.
|
|
93
|
+
*
|
|
94
|
+
* Invariant: all executing tools are concurrency-safe OR exactly one
|
|
95
|
+
* non-safe tool is executing. Additionally, the number of concurrently
|
|
96
|
+
* executing tools never exceeds `maxParallel`.
|
|
97
|
+
*/
|
|
98
|
+
processQueue() {
|
|
99
|
+
if (this.discarded)
|
|
100
|
+
return;
|
|
101
|
+
if (this.parentSignal?.aborted)
|
|
102
|
+
return;
|
|
103
|
+
for (const tool of this.tools) {
|
|
104
|
+
if (tool.status !== "queued")
|
|
105
|
+
continue;
|
|
106
|
+
const executing = this.tools.filter((t) => t.status === "executing");
|
|
107
|
+
// Enforce max parallel limit (Req 14.1, 14.2)
|
|
108
|
+
if (executing.length >= this.maxParallel) {
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
const canExecute = executing.length === 0 ||
|
|
112
|
+
(tool.isConcurrencySafe && executing.every((t) => t.isConcurrencySafe));
|
|
113
|
+
if (canExecute) {
|
|
114
|
+
// Start a new concurrent batch if needed
|
|
115
|
+
if (executing.length === 0 || !this.currentBatchIds.has(executing[0]?.id)) {
|
|
116
|
+
this.startNewBatch();
|
|
117
|
+
}
|
|
118
|
+
tool.status = "executing";
|
|
119
|
+
this.currentBatchIds.add(tool.id);
|
|
120
|
+
log.debug(`[StreamingToolExecutor] Starting tool ${tool.toolCall.toolName} (id=${tool.id})`);
|
|
121
|
+
tool.promise = this.executeTool(tool).finally(() => {
|
|
122
|
+
// Re-evaluate queue after each tool completes
|
|
123
|
+
this.processQueue();
|
|
124
|
+
// Wake up any waiting async generator
|
|
125
|
+
this.notifyWaiter();
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
else if (!tool.isConcurrencySafe) {
|
|
129
|
+
// Non-concurrent tool must wait — stop scanning to maintain order (Req 1.3, 1.4)
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
// If tool is concurrency-safe but can't run (non-safe tool executing),
|
|
133
|
+
// skip it and continue scanning — but actually per the design,
|
|
134
|
+
// we should also break here since we need to maintain request order
|
|
135
|
+
// for result yielding. A concurrent-safe tool behind a non-safe tool
|
|
136
|
+
// should wait too.
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Start a new sibling abort controller for a concurrent batch.
|
|
141
|
+
*/
|
|
142
|
+
startNewBatch() {
|
|
143
|
+
this.siblingAbortController = new AbortController();
|
|
144
|
+
this.currentBatchIds = new Set();
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Execute a single tool, handling result capture, progress, truncation,
|
|
148
|
+
* and error/abort propagation.
|
|
149
|
+
*/
|
|
150
|
+
async executeTool(tracked) {
|
|
151
|
+
const { tool, toolCall } = tracked;
|
|
152
|
+
const batchAbortController = this.siblingAbortController;
|
|
153
|
+
try {
|
|
154
|
+
// Create a combined abort signal from parent + sibling
|
|
155
|
+
const toolAbortController = new AbortController();
|
|
156
|
+
const abortTool = () => {
|
|
157
|
+
const behavior = tool.interruptBehavior
|
|
158
|
+
? tool.interruptBehavior()
|
|
159
|
+
: "block"; // Default: block (Req 3.4, 10.5)
|
|
160
|
+
if (behavior === "cancel") {
|
|
161
|
+
toolAbortController.abort();
|
|
162
|
+
}
|
|
163
|
+
// 'block' tools are allowed to complete
|
|
164
|
+
};
|
|
165
|
+
// Listen to sibling abort
|
|
166
|
+
if (batchAbortController) {
|
|
167
|
+
batchAbortController.signal.addEventListener("abort", abortTool, { once: true });
|
|
168
|
+
}
|
|
169
|
+
// Listen to parent abort for this specific tool
|
|
170
|
+
const parentAbortHandler = () => abortTool();
|
|
171
|
+
if (this.parentSignal) {
|
|
172
|
+
this.parentSignal.addEventListener("abort", parentAbortHandler, { once: true });
|
|
173
|
+
}
|
|
174
|
+
// Execute the tool handler
|
|
175
|
+
const result = await tool.handler(this.toolContext, toolCall.arguments);
|
|
176
|
+
// Clean up abort listeners
|
|
177
|
+
if (batchAbortController) {
|
|
178
|
+
batchAbortController.signal.removeEventListener("abort", abortTool);
|
|
179
|
+
}
|
|
180
|
+
if (this.parentSignal) {
|
|
181
|
+
this.parentSignal.removeEventListener("abort", parentAbortHandler);
|
|
182
|
+
}
|
|
183
|
+
// Check if we were aborted during execution
|
|
184
|
+
if (toolAbortController.signal.aborted) {
|
|
185
|
+
tracked.results.push({
|
|
186
|
+
success: false,
|
|
187
|
+
error: "Tool execution was cancelled",
|
|
188
|
+
metadata: { toolId: tool.id, cancelled: true },
|
|
189
|
+
});
|
|
190
|
+
tracked.status = "completed";
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
// Normalize the result
|
|
194
|
+
const executionResult = this.normalizeResult(result, tool);
|
|
195
|
+
// Apply per-tool maxResultSizeChars truncation (Req 9.4)
|
|
196
|
+
const truncatedResult = this.applyResultTruncation(executionResult, tool);
|
|
197
|
+
tracked.results.push(truncatedResult);
|
|
198
|
+
// Accumulate context updates
|
|
199
|
+
if (truncatedResult.contextUpdate) {
|
|
200
|
+
this.contextUpdates = {
|
|
201
|
+
...this.contextUpdates,
|
|
202
|
+
...truncatedResult.contextUpdate,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
tracked.status = "completed";
|
|
206
|
+
// If the tool failed, abort siblings in the batch (Req 3.1)
|
|
207
|
+
if (!truncatedResult.success) {
|
|
208
|
+
this.abortSiblings(tracked.id, batchAbortController);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
213
|
+
log.error(`[StreamingToolExecutor] Tool ${toolCall.toolName} (id=${toolCall.id}) failed: ${errorMessage}`);
|
|
214
|
+
tracked.results.push({
|
|
215
|
+
success: false,
|
|
216
|
+
error: errorMessage,
|
|
217
|
+
metadata: { toolId: tool.id },
|
|
218
|
+
});
|
|
219
|
+
tracked.status = "completed";
|
|
220
|
+
// Abort siblings on failure (Req 3.1)
|
|
221
|
+
this.abortSiblings(tracked.id, batchAbortController);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Normalize a tool handler return value into a ToolExecutionResult.
|
|
226
|
+
*/
|
|
227
|
+
normalizeResult(result, tool) {
|
|
228
|
+
if (result &&
|
|
229
|
+
typeof result === "object" &&
|
|
230
|
+
("data" in result || "success" in result || "error" in result)) {
|
|
231
|
+
const r = result;
|
|
232
|
+
return {
|
|
233
|
+
success: r.success !== false,
|
|
234
|
+
data: r.data,
|
|
235
|
+
error: r.error,
|
|
236
|
+
contextUpdate: r.contextUpdate,
|
|
237
|
+
dataUpdate: r.dataUpdate,
|
|
238
|
+
metadata: {
|
|
239
|
+
toolId: tool.id,
|
|
240
|
+
...r.meta,
|
|
241
|
+
},
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
return {
|
|
245
|
+
success: true,
|
|
246
|
+
data: result,
|
|
247
|
+
metadata: { toolId: tool.id },
|
|
248
|
+
};
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Apply per-tool maxResultSizeChars truncation to a result.
|
|
252
|
+
* If the stringified result data exceeds the limit, truncate with a notice.
|
|
253
|
+
*/
|
|
254
|
+
applyResultTruncation(result, tool) {
|
|
255
|
+
const maxChars = tool.maxResultSizeChars;
|
|
256
|
+
if (maxChars == null || maxChars <= 0 || result.data == null) {
|
|
257
|
+
return result;
|
|
258
|
+
}
|
|
259
|
+
const serialized = typeof result.data === "string"
|
|
260
|
+
? result.data
|
|
261
|
+
: JSON.stringify(result.data);
|
|
262
|
+
if (serialized.length <= maxChars) {
|
|
263
|
+
return result;
|
|
264
|
+
}
|
|
265
|
+
const truncated = serialized.slice(0, maxChars);
|
|
266
|
+
const notice = `\n\n[Truncated: ${serialized.length} chars total, showing first ${maxChars}]`;
|
|
267
|
+
return {
|
|
268
|
+
...result,
|
|
269
|
+
data: truncated + notice,
|
|
270
|
+
metadata: {
|
|
271
|
+
...result.metadata,
|
|
272
|
+
truncated: true,
|
|
273
|
+
originalLength: serialized.length,
|
|
274
|
+
},
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Abort sibling tools in the current concurrent batch when one tool fails.
|
|
279
|
+
* Tools with interruptBehavior 'cancel' are immediately aborted;
|
|
280
|
+
* tools with 'block' are allowed to complete.
|
|
281
|
+
*/
|
|
282
|
+
abortSiblings(failedToolId, batchAbortController) {
|
|
283
|
+
if (!batchAbortController)
|
|
284
|
+
return;
|
|
285
|
+
log.warn(`[StreamingToolExecutor] Tool ${failedToolId} failed, aborting sibling tools in batch`);
|
|
286
|
+
// Fire the sibling abort signal — individual tool handlers
|
|
287
|
+
// check their interruptBehavior to decide whether to cancel or block
|
|
288
|
+
batchAbortController.abort();
|
|
289
|
+
}
|
|
290
|
+
/**
|
|
291
|
+
* Handle parent AbortSignal firing.
|
|
292
|
+
* Cancel 'cancel' tools immediately, let 'block' tools finish,
|
|
293
|
+
* and stop processing new queued tools.
|
|
294
|
+
*/
|
|
295
|
+
handleParentAbort() {
|
|
296
|
+
log.warn("[StreamingToolExecutor] Parent abort signal received");
|
|
297
|
+
// Stop processing new tools
|
|
298
|
+
this.discarded = true;
|
|
299
|
+
// Abort the current batch — individual tools respect their interruptBehavior
|
|
300
|
+
if (this.siblingAbortController) {
|
|
301
|
+
this.siblingAbortController.abort();
|
|
302
|
+
}
|
|
303
|
+
// Mark remaining queued tools as completed with cancellation error
|
|
304
|
+
for (const tool of this.tools) {
|
|
305
|
+
if (tool.status === "queued") {
|
|
306
|
+
tool.results.push({
|
|
307
|
+
success: false,
|
|
308
|
+
error: "Execution cancelled by parent abort signal",
|
|
309
|
+
metadata: { toolId: tool.tool.id, cancelled: true },
|
|
310
|
+
});
|
|
311
|
+
tool.status = "completed";
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
// Wake up any waiting async generator
|
|
315
|
+
this.notifyWaiter();
|
|
316
|
+
}
|
|
317
|
+
/**
|
|
318
|
+
* Yield completed results in original request order.
|
|
319
|
+
* Progress messages are yielded immediately regardless of order.
|
|
320
|
+
*
|
|
321
|
+
* This is a synchronous generator — it yields what's available now
|
|
322
|
+
* without waiting for pending tools.
|
|
323
|
+
*/
|
|
324
|
+
*getCompletedResults() {
|
|
325
|
+
for (const tool of this.tools) {
|
|
326
|
+
// Always yield pending progress immediately (Req 4.1)
|
|
327
|
+
while (tool.pendingProgress.length > 0) {
|
|
328
|
+
yield {
|
|
329
|
+
toolCallId: tool.id,
|
|
330
|
+
progress: tool.pendingProgress.shift(),
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
if (tool.status === "yielded")
|
|
334
|
+
continue;
|
|
335
|
+
if (tool.status === "completed") {
|
|
336
|
+
tool.status = "yielded";
|
|
337
|
+
for (const result of tool.results) {
|
|
338
|
+
yield {
|
|
339
|
+
toolCallId: tool.id,
|
|
340
|
+
result,
|
|
341
|
+
contextUpdate: result.contextUpdate,
|
|
342
|
+
dataUpdate: result.dataUpdate,
|
|
343
|
+
};
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
else {
|
|
347
|
+
// Tool is still queued or executing — stop yielding results
|
|
348
|
+
// to maintain request order, but continue yielding progress
|
|
349
|
+
// for subsequent tools
|
|
350
|
+
break;
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* Async generator that yields all results (completed and pending) in
|
|
356
|
+
* original request order. Waits for pending tools to complete.
|
|
357
|
+
*
|
|
358
|
+
* Progress messages are yielded immediately as they arrive.
|
|
359
|
+
*/
|
|
360
|
+
async *getRemainingResults() {
|
|
361
|
+
let yieldIndex = 0;
|
|
362
|
+
while (yieldIndex < this.tools.length || this.hasUnfinishedTools()) {
|
|
363
|
+
// Yield progress from all tools (bypass ordering)
|
|
364
|
+
for (const tool of this.tools) {
|
|
365
|
+
while (tool.pendingProgress.length > 0) {
|
|
366
|
+
yield {
|
|
367
|
+
toolCallId: tool.id,
|
|
368
|
+
progress: tool.pendingProgress.shift(),
|
|
369
|
+
};
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
// Yield completed results in order
|
|
373
|
+
while (yieldIndex < this.tools.length) {
|
|
374
|
+
const tool = this.tools[yieldIndex];
|
|
375
|
+
if (tool.status === "yielded") {
|
|
376
|
+
yieldIndex++;
|
|
377
|
+
continue;
|
|
378
|
+
}
|
|
379
|
+
if (tool.status === "completed") {
|
|
380
|
+
tool.status = "yielded";
|
|
381
|
+
for (const result of tool.results) {
|
|
382
|
+
yield {
|
|
383
|
+
toolCallId: tool.id,
|
|
384
|
+
result,
|
|
385
|
+
contextUpdate: result.contextUpdate,
|
|
386
|
+
dataUpdate: result.dataUpdate,
|
|
387
|
+
};
|
|
388
|
+
}
|
|
389
|
+
yieldIndex++;
|
|
390
|
+
}
|
|
391
|
+
else {
|
|
392
|
+
// Tool is still queued or executing — wait for it
|
|
393
|
+
break;
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
// If there are still unfinished tools, wait for a state change
|
|
397
|
+
if (yieldIndex < this.tools.length && this.hasUnfinishedTools()) {
|
|
398
|
+
await this.waitForStateChange();
|
|
399
|
+
}
|
|
400
|
+
else {
|
|
401
|
+
break;
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Stop processing new queued tools. Already-executing tools continue
|
|
407
|
+
* to completion based on their interruptBehavior.
|
|
408
|
+
*/
|
|
409
|
+
discard() {
|
|
410
|
+
log.info("[StreamingToolExecutor] Executor discarded, stopping queue processing");
|
|
411
|
+
this.discarded = true;
|
|
412
|
+
this.notifyWaiter();
|
|
413
|
+
}
|
|
414
|
+
/**
|
|
415
|
+
* Return the accumulated context updates from all completed tools.
|
|
416
|
+
*/
|
|
417
|
+
getUpdatedContext() {
|
|
418
|
+
return {
|
|
419
|
+
...this.toolContext.context,
|
|
420
|
+
...this.contextUpdates,
|
|
421
|
+
};
|
|
422
|
+
}
|
|
423
|
+
/**
|
|
424
|
+
* Check if there are any tools that haven't completed yet.
|
|
425
|
+
*/
|
|
426
|
+
hasUnfinishedTools() {
|
|
427
|
+
return this.tools.some((t) => t.status === "queued" || t.status === "executing");
|
|
428
|
+
}
|
|
429
|
+
/**
|
|
430
|
+
* Wait for a state change (tool completion, progress, or discard).
|
|
431
|
+
* Uses a deferred promise pattern.
|
|
432
|
+
*/
|
|
433
|
+
waitForStateChange() {
|
|
434
|
+
this.waiter = createDeferred();
|
|
435
|
+
return this.waiter.promise;
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Notify the waiting async generator that state has changed.
|
|
439
|
+
*/
|
|
440
|
+
notifyWaiter() {
|
|
441
|
+
if (this.waiter) {
|
|
442
|
+
const w = this.waiter;
|
|
443
|
+
this.waiter = null;
|
|
444
|
+
w.resolve();
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
//# sourceMappingURL=StreamingToolExecutor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StreamingToolExecutor.js","sourceRoot":"","sources":["../../src/core/StreamingToolExecutor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* ToolManager - Centralized tool management with simplified creation APIs
|
|
3
3
|
*/
|
|
4
|
-
import type { Tool, ToolExecutionResult, DataEnrichmentConfig, ValidationConfig, ValidationResult, ApiCallConfig, ComputationConfig, Event } from "../types";
|
|
4
|
+
import type { Tool, ToolExecutionResult, DataEnrichmentConfig, ValidationConfig, ValidationResult, ApiCallConfig, ComputationConfig, ToolCallRequest, ToolExecutionUpdate, Event } from "../types";
|
|
5
5
|
import { ToolScope } from "../types";
|
|
6
6
|
import { Agent } from "./Agent";
|
|
7
7
|
import { Route } from "./Route";
|
|
@@ -163,6 +163,23 @@ export declare class ToolManager<TContext = unknown, TData = unknown> {
|
|
|
163
163
|
history: Event[];
|
|
164
164
|
data?: Partial<TData>;
|
|
165
165
|
}): Promise<ToolExecutionResult[]>;
|
|
166
|
+
/**
|
|
167
|
+
* Execute tool calls with concurrency control using StreamingToolExecutor.
|
|
168
|
+
* Creates a StreamingToolExecutor, resolves tools, queues them, and yields
|
|
169
|
+
* ToolExecutionUpdate results in original request order.
|
|
170
|
+
*
|
|
171
|
+
* Concurrency-safe tools run in parallel; non-safe tools run serially.
|
|
172
|
+
* Progress messages are yielded immediately.
|
|
173
|
+
*/
|
|
174
|
+
executeWithConcurrency(params: {
|
|
175
|
+
toolCalls: ToolCallRequest[];
|
|
176
|
+
context: TContext;
|
|
177
|
+
data?: Partial<TData>;
|
|
178
|
+
history?: Event[];
|
|
179
|
+
signal?: AbortSignal;
|
|
180
|
+
route?: Route<TContext, TData>;
|
|
181
|
+
step?: Step<TContext, TData>;
|
|
182
|
+
}): AsyncGenerator<ToolExecutionUpdate<TData>>;
|
|
166
183
|
/**
|
|
167
184
|
* Create a data enrichment tool that modifies collected data
|
|
168
185
|
* Returns a tool instance that can be registered or added to scope
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ToolManager.d.ts","sourceRoot":"","sources":["../../src/core/ToolManager.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,IAAI,EAEJ,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EAEjB,KAAK,EACN,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"ToolManager.d.ts","sourceRoot":"","sources":["../../src/core/ToolManager.ts"],"names":[],"mappings":"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"}
|
package/dist/core/ToolManager.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import { ToolScope } from "../types";
|
|
5
5
|
import { logger } from "../utils";
|
|
6
|
+
import { StreamingToolExecutor } from "./StreamingToolExecutor";
|
|
6
7
|
/**
|
|
7
8
|
* Error thrown when tool creation fails
|
|
8
9
|
*/
|
|
@@ -630,6 +631,38 @@ export class ToolManager {
|
|
|
630
631
|
}
|
|
631
632
|
};
|
|
632
633
|
logger.debug(`[ToolManager] Executing tool: ${tool.id} with args:`, toolArguments);
|
|
634
|
+
// EnhancedTool validation gate (Req 9.2, 10.6)
|
|
635
|
+
const enhanced = tool;
|
|
636
|
+
if (typeof enhanced.validateInput === 'function' && toolArguments) {
|
|
637
|
+
const validation = await enhanced.validateInput(toolArguments, toolContext);
|
|
638
|
+
if (!validation.valid) {
|
|
639
|
+
const executionTime = Date.now() - startTime;
|
|
640
|
+
logger.warn(`[ToolManager] Tool ${tool.id} input validation failed: ${validation.error}`);
|
|
641
|
+
return {
|
|
642
|
+
success: false,
|
|
643
|
+
error: `Validation failed: ${validation.error || 'Invalid input'}`,
|
|
644
|
+
metadata: { toolId: tool.id, executionTime, gate: 'validateInput' }
|
|
645
|
+
};
|
|
646
|
+
}
|
|
647
|
+
}
|
|
648
|
+
// EnhancedTool permission gate (Req 9.3, 10.6)
|
|
649
|
+
if (typeof enhanced.checkPermissions === 'function' && toolArguments) {
|
|
650
|
+
const permission = await enhanced.checkPermissions(toolArguments, toolContext);
|
|
651
|
+
if (!permission.allowed) {
|
|
652
|
+
const executionTime = Date.now() - startTime;
|
|
653
|
+
logger.warn(`[ToolManager] Tool ${tool.id} permission denied: ${permission.reason}`);
|
|
654
|
+
return {
|
|
655
|
+
success: false,
|
|
656
|
+
error: `Permission denied: ${permission.reason || 'Not allowed'}`,
|
|
657
|
+
metadata: {
|
|
658
|
+
toolId: tool.id,
|
|
659
|
+
executionTime,
|
|
660
|
+
gate: 'checkPermissions',
|
|
661
|
+
canOverride: permission.canOverride
|
|
662
|
+
}
|
|
663
|
+
};
|
|
664
|
+
}
|
|
665
|
+
}
|
|
633
666
|
// Execute tool with timeout protection
|
|
634
667
|
const executionTimeout = 30000; // 30 seconds default timeout
|
|
635
668
|
const timeoutPromise = new Promise((_, reject) => {
|
|
@@ -747,6 +780,64 @@ export class ToolManager {
|
|
|
747
780
|
}
|
|
748
781
|
return results;
|
|
749
782
|
}
|
|
783
|
+
/**
|
|
784
|
+
* Execute tool calls with concurrency control using StreamingToolExecutor.
|
|
785
|
+
* Creates a StreamingToolExecutor, resolves tools, queues them, and yields
|
|
786
|
+
* ToolExecutionUpdate results in original request order.
|
|
787
|
+
*
|
|
788
|
+
* Concurrency-safe tools run in parallel; non-safe tools run serially.
|
|
789
|
+
* Progress messages are yielded immediately.
|
|
790
|
+
*/
|
|
791
|
+
async *executeWithConcurrency(params) {
|
|
792
|
+
const { toolCalls, context, data, history, signal, route, step } = params;
|
|
793
|
+
if (toolCalls.length === 0) {
|
|
794
|
+
return;
|
|
795
|
+
}
|
|
796
|
+
// Build a ToolContext for the executor
|
|
797
|
+
const toolContext = {
|
|
798
|
+
context,
|
|
799
|
+
data: data || {},
|
|
800
|
+
history: history || [],
|
|
801
|
+
step: step ? { id: step.id, routeId: route?.id || '' } : undefined,
|
|
802
|
+
updateContext: (updates) => {
|
|
803
|
+
Object.assign(context, updates);
|
|
804
|
+
return Promise.resolve();
|
|
805
|
+
},
|
|
806
|
+
updateData: (updates) => {
|
|
807
|
+
if (data) {
|
|
808
|
+
Object.assign(data, updates);
|
|
809
|
+
}
|
|
810
|
+
return Promise.resolve();
|
|
811
|
+
},
|
|
812
|
+
getField: (key) => {
|
|
813
|
+
return data?.[key];
|
|
814
|
+
},
|
|
815
|
+
setField: (key, value) => {
|
|
816
|
+
if (data) {
|
|
817
|
+
data[key] = value;
|
|
818
|
+
}
|
|
819
|
+
return Promise.resolve();
|
|
820
|
+
},
|
|
821
|
+
hasField: (key) => {
|
|
822
|
+
return data != null && key in data;
|
|
823
|
+
},
|
|
824
|
+
};
|
|
825
|
+
const executor = new StreamingToolExecutor(toolContext, {
|
|
826
|
+
signal,
|
|
827
|
+
});
|
|
828
|
+
// Resolve and queue each tool call
|
|
829
|
+
for (const toolCall of toolCalls) {
|
|
830
|
+
const tool = this.find(toolCall.toolName, undefined, step, route);
|
|
831
|
+
if (!tool) {
|
|
832
|
+
logger.warn(`[ToolManager] Tool not found for concurrent execution: ${toolCall.toolName}`);
|
|
833
|
+
continue;
|
|
834
|
+
}
|
|
835
|
+
// Cast to EnhancedTool — plain Tools are compatible (defaults apply)
|
|
836
|
+
executor.addTool(toolCall, tool);
|
|
837
|
+
}
|
|
838
|
+
// Yield all results in order
|
|
839
|
+
yield* executor.getRemainingResults();
|
|
840
|
+
}
|
|
750
841
|
/**
|
|
751
842
|
* Create a data enrichment tool that modifies collected data
|
|
752
843
|
* Returns a tool instance that can be registered or added to scope
|