@modelprofile.com/flexharness 10.23.0 → 10.24.1

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 (83) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/classes.flexharness.admission.d.ts +17 -0
  3. package/dist_ts/classes.flexharness.admission.js +263 -0
  4. package/dist_ts/classes.flexharness.callbacks.d.ts +38 -0
  5. package/dist_ts/classes.flexharness.callbacks.js +313 -0
  6. package/dist_ts/classes.flexharness.compaction.d.ts +25 -0
  7. package/dist_ts/classes.flexharness.compaction.js +87 -0
  8. package/dist_ts/classes.flexharness.configurations.d.ts +11 -0
  9. package/dist_ts/classes.flexharness.configurations.js +137 -0
  10. package/dist_ts/classes.flexharness.core.d.ts +143 -0
  11. package/dist_ts/classes.flexharness.core.js +1538 -0
  12. package/dist_ts/classes.flexharness.d.ts +2 -437
  13. package/dist_ts/classes.flexharness.deletion.d.ts +31 -0
  14. package/dist_ts/classes.flexharness.deletion.js +396 -0
  15. package/dist_ts/classes.flexharness.imports.d.ts +24 -0
  16. package/dist_ts/classes.flexharness.imports.js +345 -0
  17. package/dist_ts/classes.flexharness.js +119 -9776
  18. package/dist_ts/classes.flexharness.lifecycle.d.ts +47 -0
  19. package/dist_ts/classes.flexharness.lifecycle.js +625 -0
  20. package/dist_ts/classes.flexharness.permissions.d.ts +19 -0
  21. package/dist_ts/classes.flexharness.permissions.js +450 -0
  22. package/dist_ts/classes.flexharness.projects.d.ts +55 -0
  23. package/dist_ts/classes.flexharness.projects.js +575 -0
  24. package/dist_ts/classes.flexharness.prompts.d.ts +44 -0
  25. package/dist_ts/classes.flexharness.prompts.js +659 -0
  26. package/dist_ts/classes.flexharness.providers.d.ts +18 -0
  27. package/dist_ts/classes.flexharness.providers.js +267 -0
  28. package/dist_ts/classes.flexharness.results.d.ts +26 -0
  29. package/dist_ts/classes.flexharness.results.js +89 -0
  30. package/dist_ts/classes.flexharness.reversions.d.ts +52 -0
  31. package/dist_ts/classes.flexharness.reversions.js +1306 -0
  32. package/dist_ts/classes.flexharness.runs.d.ts +63 -0
  33. package/dist_ts/classes.flexharness.runs.js +1058 -0
  34. package/dist_ts/classes.flexharness.sessions.d.ts +20 -0
  35. package/dist_ts/classes.flexharness.sessions.js +381 -0
  36. package/dist_ts/classes.flexharness.slashcommands.d.ts +40 -0
  37. package/dist_ts/classes.flexharness.slashcommands.js +458 -0
  38. package/dist_ts/classes.flexharness.subagents.d.ts +31 -0
  39. package/dist_ts/classes.flexharness.subagents.js +690 -0
  40. package/dist_ts/classes.flexharness.tooldispatch.d.ts +53 -0
  41. package/dist_ts/classes.flexharness.tooldispatch.js +418 -0
  42. package/dist_ts/interfaces.flexharness.d.ts +455 -0
  43. package/dist_ts/interfaces.flexharness.js +2 -0
  44. package/dist_ts/utils.flexharness.d.ts +19 -0
  45. package/dist_ts/utils.flexharness.js +83 -0
  46. package/dist_ts_compaction/plugins.d.ts +2 -2
  47. package/dist_ts_compaction/plugins.js +3 -3
  48. package/dist_ts_compaction/smartagent.compaction.js +6 -5
  49. package/dist_ts_stores_nosqldb/classes.nosqldbstores.d.ts +9 -0
  50. package/dist_ts_stores_nosqldb/classes.nosqldbstores.js +13 -1
  51. package/dist_ts_stores_nosqldb/classes.recordstore.d.ts +2 -2
  52. package/dist_ts_stores_nosqldb/classes.recordstore.js +3 -3
  53. package/package.json +3 -3
  54. package/readme.md +1 -1
  55. package/ts/00_commitinfo_data.ts +1 -1
  56. package/ts/classes.flexharness.admission.ts +331 -0
  57. package/ts/classes.flexharness.callbacks.ts +352 -0
  58. package/ts/classes.flexharness.compaction.ts +167 -0
  59. package/ts/classes.flexharness.configurations.ts +167 -0
  60. package/ts/classes.flexharness.core.ts +1830 -0
  61. package/ts/classes.flexharness.deletion.ts +616 -0
  62. package/ts/classes.flexharness.imports.ts +414 -0
  63. package/ts/classes.flexharness.lifecycle.ts +786 -0
  64. package/ts/classes.flexharness.permissions.ts +535 -0
  65. package/ts/classes.flexharness.projects.ts +1006 -0
  66. package/ts/classes.flexharness.prompts.ts +857 -0
  67. package/ts/classes.flexharness.providers.ts +322 -0
  68. package/ts/classes.flexharness.results.ts +98 -0
  69. package/ts/classes.flexharness.reversions.ts +1684 -0
  70. package/ts/classes.flexharness.runs.ts +1204 -0
  71. package/ts/classes.flexharness.sessions.ts +483 -0
  72. package/ts/classes.flexharness.slashcommands.ts +705 -0
  73. package/ts/classes.flexharness.subagents.ts +860 -0
  74. package/ts/classes.flexharness.tooldispatch.ts +475 -0
  75. package/ts/classes.flexharness.ts +147 -12567
  76. package/ts/interfaces.flexharness.ts +517 -0
  77. package/ts/readme.md +1 -1
  78. package/ts/utils.flexharness.ts +121 -0
  79. package/ts_compaction/plugins.ts +2 -2
  80. package/ts_compaction/smartagent.compaction.ts +5 -4
  81. package/ts_stores_nosqldb/classes.nosqldbstores.ts +13 -0
  82. package/ts_stores_nosqldb/classes.recordstore.ts +5 -5
  83. package/ts_stores_nosqldb/readme.md +7 -0
@@ -0,0 +1,53 @@
1
+ import { type IFlexUncertainToolExecution, type TFlexAgentToolSet, type TFlexToolExecutionReconciliation } from './interfaces.js';
2
+ import { FlexToolCatalog } from './classes.toolcatalog.js';
3
+ import type { IActiveRun } from './interfaces.flexharness.js';
4
+ import type { FlexHarnessCore } from './classes.flexharness.core.js';
5
+ /**
6
+ * Tool call dispatch: read-only classification, call tracking, reconciliation and the tool catalog.
7
+ */
8
+ export declare class FlexHarnessToolDispatch<TScope> {
9
+ private readonly core;
10
+ constructor(core: FlexHarnessCore<TScope>);
11
+ listUncertainToolExecutions(scopeId: string, sessionId: string): Promise<IFlexUncertainToolExecution[]>;
12
+ reconcileToolExecution(scopeId: string, sessionId: string, intentId: string, reconciliation: TFlexToolExecutionReconciliation): Promise<void>;
13
+ /**
14
+ * Whether a call of the run's tools only reads: search_tools and describe_tools, an `execute` of
15
+ * a method declared read-only, or a call the tool handle classifies as read-only by its real name.
16
+ */
17
+ isReadOnlyToolCall(run: IActiveRun, toolName: string, input: unknown): boolean;
18
+ /** The method's path when the prepared call only reads, for the turn's reads. */
19
+ private readOnlyMethod;
20
+ /** A method whose `onCall` decides its calls is gated: its calls run in order, whatever they read. */
21
+ private isReadOnlyCatalogCall;
22
+ private classifyHostToolCall;
23
+ /**
24
+ * Runs the run's tools through the turn's reads: a read-only call identical to an earlier read of
25
+ * the turn shares its output, and any other call clears them. Records the confirmation of each
26
+ * call that started while the model still streamed, which the permission requests naming the
27
+ * call wait for. The catalog's tools read and run their methods by real name themselves.
28
+ */
29
+ trackToolCalls(run: IActiveRun, tools: TFlexAgentToolSet): TFlexAgentToolSet;
30
+ /**
31
+ * Answers a read-only call (`name` set) from an identical read earlier in the turn, sharing the
32
+ * output of one still running, or runs it and keeps its output for the reads after it. A failed
33
+ * read, and a read whose response was discarded, are not kept. Any other call clears the turn's
34
+ * reads before it runs.
35
+ */
36
+ private readOnce;
37
+ /**
38
+ * search_tools, describe_tools and execute. `execute` validates the call and runs the method
39
+ * inside this tool call, so the tool wrapper bounds its output and projects its errors, and the
40
+ * call's part, events and permission requests carry the method's path.
41
+ */
42
+ createCatalogTools(run: IActiveRun, catalog: FlexToolCatalog<unknown>): Record<string, unknown>;
43
+ /** A refused catalog call as the trusted error the model and the tool part show. */
44
+ private catalogCallError;
45
+ /**
46
+ * Runs a `run_code` program. Every catalog call it makes is dispatched like an `execute`
47
+ * (validation, `onCall`, the method's run with its permission requests, the output limits, error
48
+ * projection) and recorded as a tool part of its own, named by the method, with the `run_code`
49
+ * call as its parent. Proposals go to `onProposals` as one batch once the program finished; a
50
+ * program that fails proposes nothing.
51
+ */
52
+ private runCatalogProgram;
53
+ }
@@ -0,0 +1,418 @@
1
+ import * as plugins from './plugins.js';
2
+ import { FlexHarnessValidationError } from './errors.js';
3
+ import { FLEX_CODE_MODE_TOOL_NAME, FLEX_RESULT_METHOD, FLEX_TOOL_CATALOG_TOOL_NAMES, } from './interfaces.js';
4
+ import { FlexToolCatalog, catalogToolInputSchema } from './classes.toolcatalog.js';
5
+ import { canonicalJson, normalizeJsonValue } from './utils.json.js';
6
+ import { maxTransferMetadataBytes, publicSnapshot, requireTransferIdentifier, truncateUtf8, } from './utils.transfer.js';
7
+ import { isAsyncIterable, settleToolOutput } from './utils.tooloutput.js';
8
+ import { validateIdentifier } from './utils.validation.js';
9
+ const notShared = Symbol('not shared');
10
+ /**
11
+ * Tool call dispatch: read-only classification, call tracking, reconciliation and the tool catalog.
12
+ */
13
+ export class FlexHarnessToolDispatch {
14
+ core;
15
+ constructor(core) {
16
+ this.core = core;
17
+ }
18
+ async listUncertainToolExecutions(scopeId, sessionId) {
19
+ const { state } = await this.core.resolveState(scopeId);
20
+ const stored = this.core.requireSession(state, sessionId);
21
+ this.core.assertStateAcceptingWork(state);
22
+ try {
23
+ return publicSnapshot(stored.agentSession.listUncertainToolExecutions().map((intent) => ({
24
+ intentId: this.core.boundedIdentifier(intent.id, 'intentId'),
25
+ generationId: this.core.boundedIdentifier(intent.generationId, 'generationId'),
26
+ toolCallId: this.core.boundedIdentifier(intent.toolCallId, 'toolCallId'),
27
+ toolName: this.core.boundedIdentifier(intent.toolName, 'toolName'),
28
+ input: normalizeJsonValue(intent.input, this.core.toolOutputLimits),
29
+ timestamp: new Date(intent.timestamp).toISOString(),
30
+ })));
31
+ }
32
+ catch (error) {
33
+ throw this.core.projectOperationError(error, 'agentSession', scopeId, sessionId, 'uncertain-tools');
34
+ }
35
+ }
36
+ async reconcileToolExecution(scopeId, sessionId, intentId, reconciliation) {
37
+ validateIdentifier(intentId, 'intentId');
38
+ requireTransferIdentifier(intentId, 'intentId');
39
+ if (!reconciliation || typeof reconciliation !== 'object' || Array.isArray(reconciliation)) {
40
+ throw new FlexHarnessValidationError('Tool execution reconciliation must be a plain object.');
41
+ }
42
+ const { scope, state } = await this.core.resolveState(scopeId);
43
+ const stored = this.core.requireSession(state, sessionId);
44
+ this.core.assertSessionWritable(stored);
45
+ this.core.assertStateAcceptingWork(state);
46
+ let canonical;
47
+ if (reconciliation.resolution === 'executed') {
48
+ const output = normalizeJsonValue(reconciliation.output, this.core.toolOutputLimits);
49
+ canonical = { resolution: 'executed', output, modelOutput: { type: 'json', value: output } };
50
+ }
51
+ else if (reconciliation.resolution === 'not-executed'
52
+ || reconciliation.resolution === 'abandoned-unknown') {
53
+ if (reconciliation.error !== undefined && typeof reconciliation.error !== 'string') {
54
+ throw new FlexHarnessValidationError('Reconciliation error must be a string.');
55
+ }
56
+ canonical = {
57
+ resolution: reconciliation.resolution,
58
+ ...(reconciliation.error === undefined
59
+ ? {}
60
+ : { error: truncateUtf8(reconciliation.error, maxTransferMetadataBytes) }),
61
+ };
62
+ }
63
+ else {
64
+ throw new FlexHarnessValidationError('Unknown tool execution reconciliation.');
65
+ }
66
+ try {
67
+ await this.core.compaction.withCompactorContext(this.core.compaction.createCompactorContext(scopeId, scope.scope, state.storageKey, sessionId), () => stored.agentSession.reconcileToolExecution(intentId, canonical));
68
+ }
69
+ catch (error) {
70
+ throw this.core.projectOperationError(error, 'agentSession', scopeId, sessionId, 'tool-reconciliation');
71
+ }
72
+ }
73
+ /**
74
+ * Whether a call of the run's tools only reads: search_tools and describe_tools, an `execute` of
75
+ * a method declared read-only, or a call the tool handle classifies as read-only by its real name.
76
+ */
77
+ isReadOnlyToolCall(run, toolName, input) {
78
+ const names = FLEX_TOOL_CATALOG_TOOL_NAMES;
79
+ const catalog = run.toolCatalog;
80
+ if (catalog) {
81
+ if (toolName === names.search || toolName === names.describe)
82
+ return true;
83
+ if (toolName === names.execute) {
84
+ const target = catalog.callTarget(input);
85
+ return target !== undefined && this.isReadOnlyCatalogCall(run, catalog, target.method, target.params);
86
+ }
87
+ if (toolName === FLEX_CODE_MODE_TOOL_NAME)
88
+ return false;
89
+ }
90
+ if (this.core.runs.enabledBuiltInToolNames(run).has(toolName))
91
+ return false;
92
+ return this.classifyHostToolCall(run, toolName, input);
93
+ }
94
+ /** The method's path when the prepared call only reads, for the turn's reads. */
95
+ readOnlyMethod(run, catalog, call) {
96
+ return this.isReadOnlyCatalogCall(run, catalog, call.method, call.params) ? call.method : undefined;
97
+ }
98
+ /** A method whose `onCall` decides its calls is gated: its calls run in order, whatever they read. */
99
+ isReadOnlyCatalogCall(run, catalog, method, params) {
100
+ return !catalog.decides(method)
101
+ && (catalog.isReadOnly(method) || this.classifyHostToolCall(run, method, params));
102
+ }
103
+ classifyHostToolCall(run, toolName, input) {
104
+ try {
105
+ return run.isReadOnlyHostCall?.({ toolName, input }) === true;
106
+ }
107
+ catch (error) {
108
+ throw this.core.projectExternalError(run, error, 'toolProvider');
109
+ }
110
+ }
111
+ /**
112
+ * Runs the run's tools through the turn's reads: a read-only call identical to an earlier read of
113
+ * the turn shares its output, and any other call clears them. Records the confirmation of each
114
+ * call that started while the model still streamed, which the permission requests naming the
115
+ * call wait for. The catalog's tools read and run their methods by real name themselves.
116
+ */
117
+ trackToolCalls(run, tools) {
118
+ const catalogTools = new Set(run.toolCatalog
119
+ ? [...Object.values(FLEX_TOOL_CATALOG_TOOL_NAMES), FLEX_CODE_MODE_TOOL_NAME]
120
+ : []);
121
+ const tracked = {};
122
+ for (const [name, tool] of Object.entries(tools)) {
123
+ const execute = tool.execute;
124
+ if (typeof execute !== 'function') {
125
+ tracked[name] = tool;
126
+ continue;
127
+ }
128
+ tracked[name] = {
129
+ ...tool,
130
+ execute: (input, options) => {
131
+ const confirmed = options?.confirmed;
132
+ const toolCallId = options?.toolCallId ?? '';
133
+ if (confirmed && toolCallId) {
134
+ run.unconfirmedToolCalls.set(toolCallId, confirmed);
135
+ const forget = () => run.unconfirmedToolCalls.delete(toolCallId);
136
+ confirmed.then(forget, forget);
137
+ }
138
+ const executeTool = () => execute.call(tool, input, options);
139
+ if (catalogTools.has(name))
140
+ return executeTool();
141
+ const readName = this.isReadOnlyToolCall(run, name, input) ? name : undefined;
142
+ return this.readOnce(run, toolCallId, readName, input, confirmed, executeTool);
143
+ },
144
+ };
145
+ }
146
+ return tracked;
147
+ }
148
+ /**
149
+ * Answers a read-only call (`name` set) from an identical read earlier in the turn, sharing the
150
+ * output of one still running, or runs it and keeps its output for the reads after it. A failed
151
+ * read, and a read whose response was discarded, are not kept. Any other call clears the turn's
152
+ * reads before it runs.
153
+ */
154
+ readOnce(run, toolCallId, name, params, confirmed, execute) {
155
+ if (name === undefined) {
156
+ run.readCalls.clear();
157
+ return execute();
158
+ }
159
+ const canonicalParams = canonicalJson(params);
160
+ if (canonicalParams === undefined)
161
+ return execute();
162
+ const key = `${name}\n${canonicalParams}`;
163
+ const earlier = run.readCalls.get(key);
164
+ if (earlier) {
165
+ return earlier.output.then((output) => {
166
+ if (output === notShared)
167
+ return execute();
168
+ run.deduplicatedToolCalls.set(toolCallId, earlier.toolCallId);
169
+ return output;
170
+ }, (error) => {
171
+ run.deduplicatedToolCalls.set(toolCallId, earlier.toolCallId);
172
+ throw error;
173
+ });
174
+ }
175
+ const result = execute();
176
+ const entry = {
177
+ toolCallId,
178
+ output: Promise.resolve(result).then((output) => isAsyncIterable(output) ? notShared : output),
179
+ };
180
+ run.readCalls.set(key, entry);
181
+ const forget = () => {
182
+ if (run.readCalls.get(key) === entry)
183
+ run.readCalls.delete(key);
184
+ };
185
+ entry.output.catch(forget);
186
+ confirmed?.catch(forget);
187
+ return result;
188
+ }
189
+ /**
190
+ * search_tools, describe_tools and execute. `execute` validates the call and runs the method
191
+ * inside this tool call, so the tool wrapper bounds its output and projects its errors, and the
192
+ * call's part, events and permission requests carry the method's path.
193
+ */
194
+ createCatalogTools(run, catalog) {
195
+ const names = FLEX_TOOL_CATALOG_TOOL_NAMES;
196
+ const definitions = catalog.toolDefinitions();
197
+ const describeBytes = Math.max(1024, this.core.toolOutputLimits.maxBytes - 1024);
198
+ return {
199
+ [names.search]: plugins.tool({
200
+ description: definitions[names.search].description,
201
+ strict: false,
202
+ inputSchema: catalogToolInputSchema(definitions[names.search]),
203
+ execute: async (input, options) => catalog.search(input, { declaredTypes: catalog.declaredTypesIn(options?.messages), maxBytes: describeBytes }),
204
+ }),
205
+ [names.describe]: plugins.tool({
206
+ description: definitions[names.describe].description,
207
+ strict: false,
208
+ inputSchema: catalogToolInputSchema(definitions[names.describe]),
209
+ execute: async (input, options) => catalog.describe(input, {
210
+ declaredTypes: catalog.declaredTypesIn(options?.messages),
211
+ maxBytes: describeBytes,
212
+ }).output,
213
+ }),
214
+ [names.execute]: plugins.tool({
215
+ description: definitions[names.execute].description,
216
+ strict: false,
217
+ inputSchema: catalogToolInputSchema(definitions[names.execute]),
218
+ execute: async (input, options) => {
219
+ const toolCallId = options?.toolCallId ?? '';
220
+ const abortSignal = options?.abortSignal ?? run.controller.signal;
221
+ const confirmed = options?.confirmed;
222
+ const call = await catalog.prepareCall(input.method, input.params);
223
+ if (!call.success)
224
+ throw this.catalogCallError(run, toolCallId, call.error);
225
+ if (call.method === FLEX_RESULT_METHOD) {
226
+ const read = await this.core.results.readResult(run, call.params);
227
+ if (!read.ok)
228
+ throw this.catalogCallError(run, toolCallId, read.error);
229
+ return read.value;
230
+ }
231
+ // A call that started early asks for permission once the response confirmed it.
232
+ const base = run.toolProviderContext;
233
+ const provider = confirmed
234
+ ? Object.freeze({
235
+ ...base,
236
+ requestPermission: async (request) => {
237
+ await confirmed;
238
+ return base.requestPermission(request);
239
+ },
240
+ })
241
+ : base;
242
+ const context = { method: call.method, toolCallId, abortSignal, provider };
243
+ const decision = await call.decide(context);
244
+ if (decision === 'run') {
245
+ return this.readOnce(run, toolCallId, this.readOnlyMethod(run, catalog, call), call.params, confirmed, () => call.run(context));
246
+ }
247
+ if (decision === 'propose') {
248
+ return catalog.propose([{ id: toolCallId, method: call.method, params: call.params }], { toolCallId, abortSignal, provider: run.toolProviderContext });
249
+ }
250
+ throw this.catalogCallError(run, toolCallId, { error: 'denied', method: call.method, reason: decision.deny });
251
+ },
252
+ }),
253
+ ...(catalog.codeMode && run.codeSandbox ? {
254
+ [FLEX_CODE_MODE_TOOL_NAME]: plugins.tool({
255
+ description: definitions[FLEX_CODE_MODE_TOOL_NAME].description,
256
+ strict: false,
257
+ inputSchema: catalogToolInputSchema(definitions[FLEX_CODE_MODE_TOOL_NAME]),
258
+ execute: async (input, options) => this.runCatalogProgram(run, catalog, input.code, options?.toolCallId ?? '', options?.abortSignal ?? run.controller.signal),
259
+ }),
260
+ } : {}),
261
+ };
262
+ }
263
+ /** A refused catalog call as the trusted error the model and the tool part show. */
264
+ catalogCallError(run, toolCallId, payload) {
265
+ const error = this.core.trustInternalError(new FlexHarnessValidationError(JSON.stringify(payload)));
266
+ if (toolCallId)
267
+ run.trustedToolExecutionErrors.set(toolCallId, error);
268
+ return error;
269
+ }
270
+ /**
271
+ * Runs a `run_code` program. Every catalog call it makes is dispatched like an `execute`
272
+ * (validation, `onCall`, the method's run with its permission requests, the output limits, error
273
+ * projection) and recorded as a tool part of its own, named by the method, with the `run_code`
274
+ * call as its parent. Proposals go to `onProposals` as one batch once the program finished; a
275
+ * program that fails proposes nothing.
276
+ */
277
+ async runCatalogProgram(run, catalog, code, toolCallId, abortSignal) {
278
+ const proposals = [];
279
+ const base = run.toolProviderContext;
280
+ // Waiting for a permission decision is the user's time, not the program's.
281
+ let waitedMs = 0;
282
+ let waiting = 0;
283
+ let waitingSince = 0;
284
+ /** The provider context of one call: its permission waits are timed, and end when the program stops. */
285
+ const providerFor = (signal) => Object.freeze({
286
+ ...base,
287
+ requestPermission: async (request) => {
288
+ signal.throwIfAborted();
289
+ if (waiting++ === 0)
290
+ waitingSince = performance.now();
291
+ let onAbort;
292
+ try {
293
+ await Promise.race([
294
+ base.requestPermission(request),
295
+ new Promise((_resolve, reject) => {
296
+ onAbort = () => reject(signal.reason);
297
+ signal.addEventListener('abort', onAbort, { once: true });
298
+ }),
299
+ ]);
300
+ }
301
+ finally {
302
+ if (onAbort)
303
+ signal.removeEventListener('abort', onAbort);
304
+ if (--waiting === 0)
305
+ waitedMs += performance.now() - waitingSince;
306
+ }
307
+ },
308
+ });
309
+ const stopped = (method) => ({ ok: false, error: { error: 'aborted', method } });
310
+ let callNumber = 0;
311
+ // Read-only calls run concurrently; any other call runs after every call the program made before it.
312
+ const order = new plugins.AgentToolCallScheduler(abortSignal);
313
+ const finish = (id, method, input, outcome) => {
314
+ if ('error' in outcome)
315
+ run.trustedToolExecutionErrors.set(id, outcome.error);
316
+ this.core.callbacks.onToolFinish(run.state, run.sessionId, 'error' in outcome
317
+ ? { toolCallId: id, toolName: method, input, success: false, error: outcome.error.message }
318
+ : { toolCallId: id, toolName: method, input, success: true, output: outcome.output });
319
+ };
320
+ const callInTurn = async (id, method, params, signal, classification) => {
321
+ const call = await catalog.prepareCall(method, params);
322
+ if (!call.success) {
323
+ if (catalog.has(method)) {
324
+ this.core.callbacks.onToolStart(run.state, run.sessionId, { toolCallId: id, toolName: method, input: params ?? {}, parentToolCallId: toolCallId });
325
+ finish(id, method, params, { error: this.catalogCallError(run, id, call.error) });
326
+ }
327
+ return { ok: false, error: call.error };
328
+ }
329
+ try {
330
+ await order.waitForTurn(id, signal);
331
+ }
332
+ catch {
333
+ return stopped(call.method);
334
+ }
335
+ if (signal.aborted)
336
+ return stopped(call.method);
337
+ this.core.callbacks.onToolStart(run.state, run.sessionId, {
338
+ toolCallId: id, toolName: call.method, input: call.params, parentToolCallId: toolCallId,
339
+ });
340
+ if ('error' in classification) {
341
+ finish(id, call.method, call.params, { error: classification.error });
342
+ return { ok: false, error: { error: 'failed', method: call.method, message: classification.error.message } };
343
+ }
344
+ if (call.method === FLEX_RESULT_METHOD) {
345
+ const read = await this.core.results.readResult(run, call.params);
346
+ finish(id, call.method, call.params, read.ok
347
+ ? { output: read.value }
348
+ : { error: this.catalogCallError(run, id, read.error) });
349
+ return read;
350
+ }
351
+ const readOnly = classification.readOnly;
352
+ const context = { method: call.method, toolCallId: id, abortSignal: signal, provider: providerFor(signal) };
353
+ try {
354
+ const decision = await call.decide(context);
355
+ signal.throwIfAborted();
356
+ if (decision === 'propose') {
357
+ proposals.push({ id, method: call.method, params: call.params });
358
+ const value = { proposed: true, id };
359
+ finish(id, call.method, call.params, { output: value });
360
+ return { ok: true, value };
361
+ }
362
+ if (decision !== 'run') {
363
+ const payload = { error: 'denied', method: call.method, reason: decision.deny };
364
+ finish(id, call.method, call.params, { error: this.catalogCallError(run, id, payload) });
365
+ return { ok: false, error: payload };
366
+ }
367
+ const output = this.readOnce(run, id, readOnly ? call.method : undefined, call.params, undefined, () => call.run(context));
368
+ const value = await this.core.results.budgetOutput(run, await settleToolOutput(output));
369
+ finish(id, call.method, call.params, { output: value });
370
+ return { ok: true, value };
371
+ }
372
+ catch (error) {
373
+ const projected = this.core.projectExternalError(run, error, 'toolExecution');
374
+ finish(id, call.method, call.params, { error: projected });
375
+ return { ok: false, error: { error: 'failed', method: call.method, message: projected.message } };
376
+ }
377
+ };
378
+ const host = {
379
+ waitedMs: () => waitedMs + (waiting > 0 ? performance.now() - waitingSince : 0),
380
+ call: async (method, params, signal) => {
381
+ if (signal.aborted)
382
+ return stopped(method);
383
+ const id = `${toolCallId}.${++callNumber}`;
384
+ // The call takes its place in the program's order now, before anything is awaited.
385
+ let classification;
386
+ try {
387
+ classification = {
388
+ readOnly: catalog.has(method) && this.isReadOnlyCatalogCall(run, catalog, method, params ?? {}),
389
+ };
390
+ }
391
+ catch (error) {
392
+ classification = {
393
+ error: error instanceof Error ? error : this.core.projectExternalError(run, error, 'toolProvider'),
394
+ };
395
+ }
396
+ order.begin(id, 'readOnly' in classification && classification.readOnly);
397
+ try {
398
+ return await callInTurn(id, method, params, signal, classification);
399
+ }
400
+ finally {
401
+ order.settle(id);
402
+ }
403
+ },
404
+ };
405
+ const result = await run.codeSandbox.run(code, host, catalog.codeMode, abortSignal);
406
+ if (!result.ok)
407
+ throw this.catalogCallError(run, toolCallId, result.failure);
408
+ return {
409
+ result: result.value,
410
+ calls: result.calls,
411
+ ...(result.logs ? { logs: result.logs } : {}),
412
+ ...(proposals.length > 0
413
+ ? { proposals: await catalog.propose(proposals, { toolCallId, abortSignal, provider: base }) }
414
+ : {}),
415
+ };
416
+ }
417
+ }
418
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5mbGV4aGFybmVzcy50b29sZGlzcGF0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmZsZXhoYXJuZXNzLnRvb2xkaXNwYXRjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDekQsT0FBTyxFQUNMLHdCQUF3QixFQUN4QixrQkFBa0IsRUFDbEIsNEJBQTRCLEdBVTdCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGVBQWUsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRW5GLE9BQU8sRUFBRSxhQUFhLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRSxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLGNBQWMsRUFDZCx5QkFBeUIsRUFDekIsWUFBWSxHQUNiLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLGVBQWUsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBSTNELE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUV2Qzs7R0FFRztBQUNILE1BQU0sT0FBTyx1QkFBdUI7SUFDTDtJQUE3QixZQUE2QixJQUE2QjtRQUE3QixTQUFJLEdBQUosSUFBSSxDQUF5QjtJQUFHLENBQUM7SUFFdkQsS0FBSyxDQUFDLDJCQUEyQixDQUN0QyxPQUFlLEVBQ2YsU0FBaUI7UUFFakIsTUFBTSxFQUFFLEtBQUssRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDeEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxj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