@modelprofile.com/flexharness 10.24.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 (69) 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/package.json +3 -3
  47. package/ts/00_commitinfo_data.ts +1 -1
  48. package/ts/classes.flexharness.admission.ts +331 -0
  49. package/ts/classes.flexharness.callbacks.ts +352 -0
  50. package/ts/classes.flexharness.compaction.ts +167 -0
  51. package/ts/classes.flexharness.configurations.ts +167 -0
  52. package/ts/classes.flexharness.core.ts +1830 -0
  53. package/ts/classes.flexharness.deletion.ts +616 -0
  54. package/ts/classes.flexharness.imports.ts +414 -0
  55. package/ts/classes.flexharness.lifecycle.ts +786 -0
  56. package/ts/classes.flexharness.permissions.ts +535 -0
  57. package/ts/classes.flexharness.projects.ts +1006 -0
  58. package/ts/classes.flexharness.prompts.ts +857 -0
  59. package/ts/classes.flexharness.providers.ts +322 -0
  60. package/ts/classes.flexharness.results.ts +98 -0
  61. package/ts/classes.flexharness.reversions.ts +1684 -0
  62. package/ts/classes.flexharness.runs.ts +1204 -0
  63. package/ts/classes.flexharness.sessions.ts +483 -0
  64. package/ts/classes.flexharness.slashcommands.ts +705 -0
  65. package/ts/classes.flexharness.subagents.ts +860 -0
  66. package/ts/classes.flexharness.tooldispatch.ts +475 -0
  67. package/ts/classes.flexharness.ts +147 -12567
  68. package/ts/interfaces.flexharness.ts +517 -0
  69. package/ts/utils.flexharness.ts +121 -0
@@ -0,0 +1,1058 @@
1
+ import * as plugins from './plugins.js';
2
+ import { FlexHarnessAbortError, FlexHarnessExternalError, FlexHarnessNotFoundError, FlexHarnessRunError, FlexHarnessStepLimitError, FlexHarnessValidationError, errorToInfo, } from './errors.js';
3
+ import { FLEX_PROJECT_MANAGEMENT_LIMITS, FLEX_RESULT_METHOD, } from './interfaces.js';
4
+ import { FlexToolCatalog, assertNoCatalogCollisions } from './classes.toolcatalog.js';
5
+ import { FlexCodeSandbox } from './classes.codesandbox.js';
6
+ import { cloneSerializable } from './utils.json.js';
7
+ import { describeAttachment, maxTransferMetadataBytes, normalizeResolvedModel, normalizeRunResult, publicSnapshot, truncateUtf8, } from './utils.transfer.js';
8
+ import { wrapToolSet } from './utils.tooloutput.js';
9
+ import { validateUtf8String } from './utils.validation.js';
10
+ import { externalErrorFallback, requireSessionGeneration, combineErrors, terminalActivityError, } from './utils.flexharness.js';
11
+ /** The run execution engine: generations, terminal outcomes, steering and cancellation. */
12
+ export class FlexHarnessRuns {
13
+ core;
14
+ constructor(core) {
15
+ this.core = core;
16
+ }
17
+ async abort(scopeId, sessionId) {
18
+ const { scope, state } = await this.core.resolveState(scopeId);
19
+ const run = state.activeRuns.get(sessionId);
20
+ if (!run || run.phase === 'finalizing' || run.phase === 'promoting')
21
+ return false;
22
+ this.cancelRun(run, this.core.trustInternalError(new FlexHarnessAbortError()), this.core.compaction.createCompactorContext(scopeId, scope.scope, state.storageKey, sessionId));
23
+ return true;
24
+ }
25
+ createActiveRun(queued) {
26
+ const steering = {
27
+ input: new plugins.AgentPendingInputQueue(),
28
+ stored: queued.stored,
29
+ accepted: new Map(),
30
+ applied: new Set(),
31
+ };
32
+ queued.steering = steering;
33
+ return {
34
+ steering,
35
+ stop: new AbortController(),
36
+ subagents: this.core.subagents,
37
+ state: queued.state,
38
+ stored: queued.stored,
39
+ originCompactorContext: this.core.compaction.createCompactorContext(queued.scopeId, queued.scope, queued.state.storageKey, queued.sessionId),
40
+ scopeId: queued.scopeId,
41
+ scope: queued.scope,
42
+ sessionId: queued.sessionId,
43
+ queueId: queued.queueId,
44
+ runId: queued.runId,
45
+ userMessageId: plugins.crypto.randomUUID(),
46
+ assistantMessageId: plugins.crypto.randomUUID(),
47
+ controller: new AbortController(),
48
+ ...(queued.scheduleKey === undefined
49
+ ? {}
50
+ : { scheduleKey: queued.scheduleKey, debounceMs: queued.debounceMs }),
51
+ callbackEventCount: 0,
52
+ callbackOutputBytes: 0,
53
+ callbackParts: [],
54
+ partTextUtf8Bytes: new Map(),
55
+ callbacksClosed: false,
56
+ finishedEventEmitted: false,
57
+ usage: {
58
+ inputTokens: 0,
59
+ outputTokens: 0,
60
+ totalTokens: 0,
61
+ cacheReadTokens: 0,
62
+ cacheWriteTokens: 0,
63
+ },
64
+ reasoningPartIds: new Map(),
65
+ toolPartIds: new Map(),
66
+ trustedToolExecutionErrors: new Map(),
67
+ unconfirmedToolCalls: new Map(),
68
+ readCalls: new Map(),
69
+ deduplicatedToolCalls: new Map(),
70
+ subagentCallCount: 0,
71
+ subagentSessionIds: new Set(),
72
+ backgroundSubagents: new Set(),
73
+ pendingPermissionIds: new Set(),
74
+ phase: 'admitting',
75
+ completion: queued.completion,
76
+ };
77
+ }
78
+ async executeRun(run, generation) {
79
+ let generated = false;
80
+ try {
81
+ // The transactional generation settles only after its model calls are reported, so
82
+ // `run.usage` is complete once it settles, also for a cancelled run.
83
+ let rawResult;
84
+ try {
85
+ rawResult = await generation;
86
+ generated = true;
87
+ }
88
+ finally {
89
+ await this.core.callbacks.settleMetricsOperation(run.state, run.stored, run.metricsOperation);
90
+ }
91
+ if (rawResult.terminationReason === 'step-limit') {
92
+ throw this.core.trustInternalError(new FlexHarnessStepLimitError(rawResult.steps));
93
+ }
94
+ // Background tools do not block inference, but the owning turn joins its admitted children
95
+ // before releasing its authority or committing its terminal projection.
96
+ await Promise.all([...run.backgroundSubagents]);
97
+ if (run.callbackError)
98
+ throw run.callbackError;
99
+ if (run.controller.signal.aborted)
100
+ throw run.controller.signal.reason;
101
+ const result = normalizeRunResult(rawResult);
102
+ if (!run.modelResolution)
103
+ throw new FlexHarnessValidationError('Generation completed without a resolved model.');
104
+ await this.core.reversions.finalizeRunReversion(run, 'completed');
105
+ await this.core.admission.closeRunDelegatedRunAdmission(run);
106
+ const terminal = this.buildTerminal(run, 'completed', result);
107
+ try {
108
+ await this.core.mutateProjection(run.state, run.stored, () => {
109
+ this.replaceStagedTerminal(run.stored, terminal);
110
+ }, true);
111
+ }
112
+ catch (error) {
113
+ throw this.core.projectExternalError(run, error, 'persistence');
114
+ }
115
+ if (run.controller.signal.aborted)
116
+ throw run.controller.signal.reason;
117
+ run.phase = 'finalizing';
118
+ try {
119
+ await this.core.compaction.withRunCompactorContext(run, () => run.stored.agentSession.finalizeGeneration(run.transaction, 'accepted'));
120
+ }
121
+ catch (error) {
122
+ const projected = this.core.projectExternalError(run, error, 'agentSession');
123
+ await this.core.lifecycle.fenceNamespace(run.state, run, projected);
124
+ throw projected;
125
+ }
126
+ run.steering.keptInContext = true;
127
+ this.core.reversions.refreshAutomaticArchiveHorizon(run.stored);
128
+ run.phase = 'promoting';
129
+ const closePublication = this.core.openPublication(run.state, run.sessionId);
130
+ try {
131
+ try {
132
+ await this.promoteCompletedTerminal(run, terminal);
133
+ }
134
+ catch (error) {
135
+ const projected = this.core.projectExternalError(run, error, 'persistence');
136
+ await this.core.lifecycle.fenceNamespace(run.state, run, projected);
137
+ throw projected;
138
+ }
139
+ this.emitTerminalProjection(run, terminal);
140
+ this.emitFinalRunEvent(run, terminal.assistantMessage, undefined, false);
141
+ }
142
+ finally {
143
+ closePublication();
144
+ }
145
+ await this.core.reversions.drainReversionReleases(run.state, run.stored, run.scopeId, run.scope, false);
146
+ return {
147
+ runId: run.runId,
148
+ sessionId: run.sessionId,
149
+ userMessage: publicSnapshot(terminal.userMessage),
150
+ assistantMessage: publicSnapshot(terminal.assistantMessage),
151
+ model: publicSnapshot(terminal.model),
152
+ usage: publicSnapshot(terminal.usage),
153
+ finishReason: terminal.finishReason,
154
+ steps: terminal.steps,
155
+ unappliedSteerIds: [...this.closeRunSteering(run.steering).unappliedSteerIds],
156
+ };
157
+ }
158
+ catch (error) {
159
+ // A failed parent must cancel its admitted children before joining them. Otherwise a
160
+ // child waiting for permission or model I/O can keep a failed parent alive indefinitely.
161
+ if (run.backgroundSubagents.size > 0 && !run.controller.signal.aborted)
162
+ run.controller.abort(error);
163
+ await Promise.allSettled([...run.backgroundSubagents]);
164
+ try {
165
+ if (run.state.lifecycle === 'fenced') {
166
+ await this.core.lifecycle.fenceNamespace(run.state, run, error);
167
+ throw error;
168
+ }
169
+ if (run.state.lifecycle === 'retired')
170
+ throw error;
171
+ return await this.finishFailedRun(run, error, generated);
172
+ }
173
+ catch (finalError) {
174
+ this.emitUnpublishedRunFinish(run, finalError, generated);
175
+ throw finalError;
176
+ }
177
+ }
178
+ finally {
179
+ run.callbacksClosed = true;
180
+ this.core.permissions.rejectRunPermissions(run.state, run, run.ownerCancellation ?? new FlexHarnessAbortError('The run ended before permission was resolved.'));
181
+ if (run.state.activeRuns.get(run.sessionId) === run)
182
+ run.state.activeRuns.delete(run.sessionId);
183
+ }
184
+ }
185
+ async finishFailedRun(run, error, generated) {
186
+ run.callbacksClosed = true;
187
+ run.phase = 'closing';
188
+ const cancelled = run.ownerCancellation !== undefined && run.internalFailure === undefined;
189
+ const safeError = cancelled
190
+ ? run.ownerCancellation
191
+ : this.core.projectExternalError(run, error, generated ? 'persistence' : 'agentSession');
192
+ const errors = [safeError];
193
+ let reversionFailed = false;
194
+ try {
195
+ await this.core.reversions.finalizeRunReversion(run, cancelled ? 'cancelled' : 'failed');
196
+ }
197
+ catch (reversionError) {
198
+ errors.push(reversionError);
199
+ reversionFailed = true;
200
+ }
201
+ try {
202
+ await this.core.admission.closeRunDelegatedRunAdmission(run);
203
+ }
204
+ catch (closeError) {
205
+ if (!errors.includes(closeError))
206
+ errors.push(closeError);
207
+ }
208
+ if (reversionFailed) {
209
+ const combined = combineErrors(errors);
210
+ await this.core.lifecycle.fenceNamespace(run.state, run, combined);
211
+ throw combined;
212
+ }
213
+ if (generated && !this.core.isTombstoned(run)) {
214
+ const failedStage = this.buildTerminal(run, cancelled ? 'cancelled' : 'failed', undefined, safeError);
215
+ try {
216
+ await this.core.mutateProjection(run.state, run.stored, () => {
217
+ this.replaceStagedTerminal(run.stored, failedStage);
218
+ }, true);
219
+ }
220
+ catch (stageError) {
221
+ errors.push(this.core.projectExternalError(run, stageError, 'persistence'));
222
+ }
223
+ }
224
+ run.phase = 'finalizing';
225
+ const desiredOutcome = cancelled || !generated ? 'interrupted' : 'rejected';
226
+ try {
227
+ await this.core.compaction.withRunCompactorContext(run, () => run.stored.agentSession.finalizeGeneration(run.transaction, desiredOutcome, { stopped: desiredOutcome === 'interrupted' && cancelled }));
228
+ }
229
+ catch (finalizationError) {
230
+ errors.push(this.core.projectExternalError(run, finalizationError, 'agentSession'));
231
+ }
232
+ let outcome;
233
+ try {
234
+ const snapshot = await run.stored.eventStore.load(run.stored.session.sessionId);
235
+ const events = snapshot?.events ?? [];
236
+ outcome = this.core.canonicalOutcomes(events).get(run.runId);
237
+ // A generation without a durable outcome is interrupted by the next load, which leaves it
238
+ // out of the model context.
239
+ run.steering.keptInContext = outcome !== undefined
240
+ && plugins.isGenerationInModelContext(events, run.runId);
241
+ this.core.reversions.refreshAutomaticArchiveHorizon(run.stored);
242
+ }
243
+ catch (outcomeError) {
244
+ errors.push(this.core.projectExternalError(run, outcomeError, 'persistence'));
245
+ }
246
+ if (!outcome) {
247
+ const combined = combineErrors(errors);
248
+ await this.core.lifecycle.fenceNamespace(run.state, run, combined);
249
+ throw combined;
250
+ }
251
+ if (outcome === 'accepted') {
252
+ const combined = combineErrors(errors);
253
+ await this.core.lifecycle.fenceNamespace(run.state, run, combined);
254
+ throw combined;
255
+ }
256
+ const publicStatus = outcome === 'rejected' || !cancelled ? 'failed' : 'cancelled';
257
+ const terminalError = publicStatus === 'cancelled'
258
+ ? run.ownerCancellation ?? this.core.trustInternalError(new FlexHarnessAbortError())
259
+ : safeError;
260
+ const terminal = this.buildTerminal(run, publicStatus, undefined, terminalError);
261
+ if (!this.core.isTombstoned(run)) {
262
+ const closePublication = this.core.openPublication(run.state, run.sessionId);
263
+ try {
264
+ try {
265
+ await this.publishFailedTerminal(run, terminal);
266
+ }
267
+ catch (persistenceError) {
268
+ errors.push(this.core.projectExternalError(run, persistenceError, 'persistence'));
269
+ const combined = combineErrors(errors);
270
+ await this.core.lifecycle.fenceNamespace(run.state, run, combined);
271
+ throw combined;
272
+ }
273
+ this.emitTerminalProjection(run, terminal);
274
+ this.emitFinalRunEvent(run, terminal.assistantMessage, terminalError, publicStatus === 'cancelled');
275
+ }
276
+ finally {
277
+ closePublication();
278
+ }
279
+ }
280
+ await this.core.reversions.drainReversionReleases(run.state, run.stored, run.scopeId, run.scope, false);
281
+ throw errors.length > 1 ? combineErrors(errors) : terminalError;
282
+ }
283
+ async prepareGeneration(run, options, signal) {
284
+ signal.throwIfAborted();
285
+ const configuration = await this.core.configurations.resolveSessionConfiguration(run.scopeId, run.scope, run.state, run.stored, signal);
286
+ run.subagents = configuration.subagents;
287
+ run.allowedTools = configuration.allowedTools;
288
+ run.permissionPolicy = configuration.permissionPolicy;
289
+ const agent = run.stored.session.agent;
290
+ if (agent !== undefined) {
291
+ const definition = configuration.subagents.get(agent);
292
+ if (!definition)
293
+ throw new FlexHarnessValidationError(`Subagent "${agent}" is disabled.`);
294
+ run.agentAllowedTools = definition.allowedTools;
295
+ }
296
+ await this.core.reversions.prepareRunReversion(run, signal);
297
+ run.phase = 'running';
298
+ const queued = run.stored.outstandingPromptsById.get(run.queueId);
299
+ if (queued && (queued.status === 'starting' || queued.status === 'scheduled')) {
300
+ queued.status = 'running';
301
+ this.core.prompts.emitPromptQueueEvent(queued, 'prompt.running');
302
+ }
303
+ const resolverRelationship = {
304
+ ...(run.stored.session.parentSessionId === undefined
305
+ ? {}
306
+ : { parentSessionId: run.stored.session.parentSessionId }),
307
+ ...(run.stored.session.agent === undefined ? {} : { agent: run.stored.session.agent }),
308
+ };
309
+ const modelOutcome = Promise.resolve()
310
+ .then(() => this.core.modelResolver.resolveModel(Object.freeze({
311
+ scopeId: run.scopeId,
312
+ scope: run.scope,
313
+ sessionId: run.sessionId,
314
+ ...requireSessionGeneration(run.stored.session),
315
+ runId: run.runId,
316
+ ...(options.modelHint ? { modelHint: options.modelHint } : {}),
317
+ ...resolverRelationship,
318
+ signal,
319
+ })))
320
+ .then((value) => ({ source: 'model', success: true, value }), (error) => ({ source: 'model', success: false, error }));
321
+ const toolProviderContext = Object.freeze({
322
+ scopeId: run.scopeId,
323
+ scope: run.scope,
324
+ sessionId: run.sessionId,
325
+ ...requireSessionGeneration(run.stored.session),
326
+ runId: run.runId,
327
+ ...resolverRelationship,
328
+ signal,
329
+ requestPermission: async (request) => {
330
+ // A call that started early asks once the model's response confirmed it.
331
+ const confirmed = request.toolCallId === undefined
332
+ ? undefined
333
+ : run.unconfirmedToolCalls.get(request.toolCallId);
334
+ if (confirmed)
335
+ await confirmed;
336
+ return this.core.permissions.requestPermission(run.state, run, request);
337
+ },
338
+ });
339
+ const toolOutcome = Promise.resolve()
340
+ .then(() => this.core.providers.provideRunToolHandle(run, toolProviderContext))
341
+ .then((value) => ({ source: 'tools', success: true, value }), (error) => ({ source: 'tools', success: false, error }));
342
+ let resolveAbort;
343
+ const abortOutcome = new Promise((resolve) => {
344
+ resolveAbort = resolve;
345
+ });
346
+ const onAbort = () => resolveAbort({
347
+ source: 'abort',
348
+ success: false,
349
+ error: signal.reason ?? new FlexHarnessAbortError(),
350
+ });
351
+ signal.addEventListener('abort', onAbort, { once: true });
352
+ if (signal.aborted)
353
+ onAbort();
354
+ let model;
355
+ let toolHandle;
356
+ try {
357
+ const first = await Promise.race([modelOutcome, toolOutcome, abortOutcome]);
358
+ if (!first.success) {
359
+ const failure = first.source === 'abort'
360
+ ? first.error
361
+ : this.core.projectExternalError(run, first.error, first.source === 'model' ? 'modelResolver' : 'toolProvider');
362
+ if (first.source !== 'abort')
363
+ this.abortRunInternally(run, failure);
364
+ if (first.source !== 'tools')
365
+ this.core.providers.observeDetachedToolProvider(toolOutcome, run);
366
+ throw failure;
367
+ }
368
+ try {
369
+ if (first.source === 'model')
370
+ model = normalizeResolvedModel(first.value);
371
+ else
372
+ toolHandle = this.core.providers.normalizeToolHandle(run, first.value);
373
+ }
374
+ catch (error) {
375
+ const projected = first.source === 'model'
376
+ ? this.core.projectExternalError(run, error, 'modelResolver')
377
+ : this.core.projectExternalError(run, error, 'toolProvider');
378
+ this.abortRunInternally(run, projected);
379
+ if (first.source === 'model')
380
+ this.core.providers.observeDetachedToolProvider(toolOutcome, run);
381
+ throw projected;
382
+ }
383
+ const second = await Promise.race([
384
+ first.source === 'model' ? toolOutcome : modelOutcome,
385
+ abortOutcome,
386
+ ]);
387
+ if (!second.success) {
388
+ const failure = second.source === 'abort'
389
+ ? second.error
390
+ : this.core.projectExternalError(run, second.error, second.source === 'model' ? 'modelResolver' : 'toolProvider');
391
+ if (second.source !== 'abort')
392
+ this.abortRunInternally(run, failure);
393
+ if (!toolHandle && first.source === 'model' && second.source === 'abort') {
394
+ this.core.providers.observeDetachedToolProvider(toolOutcome, run);
395
+ }
396
+ throw failure;
397
+ }
398
+ try {
399
+ if (second.source === 'model')
400
+ model = normalizeResolvedModel(second.value);
401
+ else
402
+ toolHandle = this.core.providers.normalizeToolHandle(run, second.value);
403
+ }
404
+ catch (error) {
405
+ const projected = second.source === 'model'
406
+ ? this.core.projectExternalError(run, error, 'modelResolver')
407
+ : this.core.projectExternalError(run, error, 'toolProvider');
408
+ this.abortRunInternally(run, projected);
409
+ throw projected;
410
+ }
411
+ signal.throwIfAborted();
412
+ run.modelResolution = model;
413
+ run.toolProviderContext = toolProviderContext;
414
+ run.isReadOnlyHostCall = toolHandle?.isReadOnlyToolCall;
415
+ let catalog;
416
+ if (toolHandle?.catalog) {
417
+ try {
418
+ catalog = await FlexToolCatalog.create(toolHandle.catalog, this.core.toolCatalogOptions, {
419
+ results: this.core.stores.results !== undefined,
420
+ });
421
+ if (catalog.codeMode)
422
+ run.codeSandbox = await FlexCodeSandbox.load();
423
+ }
424
+ catch (error) {
425
+ throw this.core.projectExternalError(run, error, 'toolProvider');
426
+ }
427
+ signal.throwIfAborted();
428
+ }
429
+ let tools;
430
+ try {
431
+ const providedTools = toolHandle?.tools;
432
+ const combinedTools = { ...(providedTools ?? {}) };
433
+ Object.assign(combinedTools, this.createBuiltInTools(run));
434
+ if (catalog)
435
+ assertNoCatalogCollisions(catalog, combinedTools);
436
+ const globalNames = run.allowedTools === undefined ? undefined : new Set(run.allowedTools);
437
+ const agentNames = run.agentAllowedTools === undefined ? undefined : new Set(run.agentAllowedTools);
438
+ const admitted = (name) => (globalNames === undefined || globalNames.has(name))
439
+ && (agentNames === undefined || agentNames.has(name));
440
+ const admittedTools = globalNames === undefined && agentNames === undefined
441
+ ? combinedTools
442
+ : Object.fromEntries(Object.entries(combinedTools).filter(([name]) => admitted(name)));
443
+ const admittedCatalog = catalog && (globalNames === undefined && agentNames === undefined
444
+ ? catalog
445
+ : catalog.restrict(catalog.methods.filter((name) => name === FLEX_RESULT_METHOD || admitted(name))));
446
+ if (admittedCatalog && admittedCatalog.methods.length > 0) {
447
+ run.toolCatalog = admittedCatalog;
448
+ Object.assign(admittedTools, this.core.toolDispatch.createCatalogTools(run, admittedCatalog));
449
+ }
450
+ tools = Object.keys(admittedTools).length > 0
451
+ ? this.core.toolDispatch.trackToolCalls(run, wrapToolSet(admittedTools, this.core.toolOutputLimits, (toolError) => this.core.projectExternalError(run, toolError, 'toolExecution'), (output) => this.core.results.budgetOutput(run, output)))
452
+ : undefined;
453
+ }
454
+ catch (error) {
455
+ throw this.core.projectExternalError(run, error, 'toolProvider');
456
+ }
457
+ let closed = false;
458
+ let closePromise;
459
+ const close = toolHandle?.close
460
+ ? async () => {
461
+ if (closed)
462
+ return;
463
+ // Inference has ended before its tool lease closes. Fence follow-up admission
464
+ // synchronously, even when external cleanup has not settled yet.
465
+ run.steering.input.close();
466
+ closePromise ??= Promise.resolve()
467
+ .then(() => toolHandle.close())
468
+ .then(() => {
469
+ closed = true;
470
+ })
471
+ .catch((cleanupError) => {
472
+ closePromise = undefined;
473
+ throw this.core.projectExternalError(run, cleanupError, 'toolCleanup');
474
+ });
475
+ await closePromise;
476
+ }
477
+ : undefined;
478
+ return {
479
+ model: model.model,
480
+ ...(options.system ?? model.system ? { system: options.system ?? model.system } : {}),
481
+ ...(tools ? {
482
+ tools,
483
+ isReadOnlyToolCall: ({ toolName, input }) => this.core.toolDispatch.isReadOnlyToolCall(run, toolName, input),
484
+ } : {}),
485
+ ...(model.providerOptions ? { providerOptions: model.providerOptions } : {}),
486
+ ...(model.cache === undefined ? {} : { cache: model.cache }),
487
+ ...(options.maxSteps ?? model.maxSteps ? { maxSteps: options.maxSteps ?? model.maxSteps } : {}),
488
+ ...(close ? { close } : {}),
489
+ };
490
+ }
491
+ catch (error) {
492
+ if (toolHandle) {
493
+ try {
494
+ await this.core.providers.closePartialToolHandle(toolHandle, run);
495
+ }
496
+ catch (cleanupError) {
497
+ throw combineErrors([error, cleanupError]);
498
+ }
499
+ }
500
+ throw error;
501
+ }
502
+ finally {
503
+ signal.removeEventListener('abort', onAbort);
504
+ }
505
+ }
506
+ enabledBuiltInToolNames(run) {
507
+ const names = new Set();
508
+ if (run.subagents.size > 0 && (run.stored.session.depth ?? 0) < this.core.maxSubagentDepth) {
509
+ names.add('delegate');
510
+ names.add('delegate_result');
511
+ names.add('delegate_send');
512
+ }
513
+ if (this.core.builtInTools.renameSession)
514
+ names.add('rename_session');
515
+ const projectManagement = this.core.builtInTools.projectManagement;
516
+ if (projectManagement?.task)
517
+ names.add('task');
518
+ if (projectManagement?.goal)
519
+ names.add('goal');
520
+ if (projectManagement?.scratchpad)
521
+ names.add('scratchpad');
522
+ return names;
523
+ }
524
+ assertNoBuiltInToolCollisions(run, tools) {
525
+ const reserved = this.enabledBuiltInToolNames(run);
526
+ const collision = Object.keys(tools).find((name) => reserved.has(name));
527
+ if (collision) {
528
+ throw new FlexHarnessValidationError(`Tool provider cannot define enabled built-in tool "${collision}".`);
529
+ }
530
+ }
531
+ createBuiltInTools(run) {
532
+ const tools = {};
533
+ if (run.subagents.size > 0 && (run.stored.session.depth ?? 0) < this.core.maxSubagentDepth) {
534
+ tools.delegate = this.core.subagentTasks.createSubagentTool(run);
535
+ tools.delegate_result = this.core.subagentTasks.createSubagentResultTool(run);
536
+ tools.delegate_send = this.core.subagentTasks.createSubagentSendTool(run);
537
+ }
538
+ if (this.core.builtInTools.renameSession)
539
+ tools.rename_session = this.createRenameSessionTool(run);
540
+ const projectManagement = this.core.builtInTools.projectManagement;
541
+ if (projectManagement?.task)
542
+ tools.task = this.core.projects.createProjectTaskTool(run);
543
+ if (projectManagement?.goal)
544
+ tools.goal = this.core.projects.createProjectGoalTool(run);
545
+ if (projectManagement?.scratchpad)
546
+ tools.scratchpad = this.core.projects.createProjectScratchpadTool(run);
547
+ return tools;
548
+ }
549
+ createRenameSessionTool(run) {
550
+ return plugins.tool({
551
+ description: 'Set the current FlexHarness session title.',
552
+ inputSchema: plugins.z.object({
553
+ title: plugins.z.string().min(1).max(FLEX_PROJECT_MANAGEMENT_LIMITS.maxTitleBytes),
554
+ }).strict(),
555
+ execute: async ({ title }) => {
556
+ validateUtf8String(title, 'title', FLEX_PROJECT_MANAGEMENT_LIMITS.maxTitleBytes, true);
557
+ let session;
558
+ await this.core.mutateScope(run.state, () => {
559
+ if (run.state.sessions.get(run.sessionId) !== run.stored) {
560
+ throw new FlexHarnessNotFoundError('Session', run.sessionId);
561
+ }
562
+ run.stored.session.title = title;
563
+ run.stored.session.updatedAt = new Date().toISOString();
564
+ session = publicSnapshot(run.stored.session);
565
+ });
566
+ this.core.emitEvent(run.scopeId, session, {
567
+ type: 'session.updated',
568
+ session,
569
+ });
570
+ return { session };
571
+ },
572
+ });
573
+ }
574
+ abortExactRun(state, sessionId, runId, reason) {
575
+ const active = state.activeRuns.get(sessionId);
576
+ if (!active || active.runId !== runId || active.phase === 'finalizing' || active.phase === 'promoting') {
577
+ return false;
578
+ }
579
+ const cancellation = reason instanceof FlexHarnessAbortError
580
+ ? reason
581
+ : this.core.trustInternalError(new FlexHarnessAbortError('The parent run was aborted.'));
582
+ this.cancelRun(active, cancellation);
583
+ return true;
584
+ }
585
+ createReservation(run, prompt) {
586
+ const timestamp = new Date().toISOString();
587
+ const userMessage = {
588
+ messageId: run.userMessageId,
589
+ sessionId: run.sessionId,
590
+ runId: run.runId,
591
+ role: 'user',
592
+ status: 'streaming',
593
+ createdAt: timestamp,
594
+ parts: this.userMessageParts(prompt),
595
+ };
596
+ const assistantMessage = {
597
+ messageId: run.assistantMessageId,
598
+ sessionId: run.sessionId,
599
+ runId: run.runId,
600
+ role: 'assistant',
601
+ status: 'streaming',
602
+ createdAt: timestamp,
603
+ parts: [],
604
+ };
605
+ return { userMessage, assistantMessage };
606
+ }
607
+ userMessageParts(prompt) {
608
+ return prompt.parts.map((part) => {
609
+ if (part.type === 'text') {
610
+ return { partId: plugins.crypto.randomUUID(), type: 'text', text: part.text };
611
+ }
612
+ return {
613
+ partId: plugins.crypto.randomUUID(),
614
+ type: 'attachment',
615
+ attachmentType: part.type,
616
+ ...describeAttachment(part),
617
+ };
618
+ });
619
+ }
620
+ /**
621
+ * Ends steering intake once the run's generation has settled and fixes what became of its
622
+ * steers. A run that stays in the model context reports the steers its generation did not
623
+ * record; a run that does not, because it failed, was stopped before any model output or its
624
+ * outcome could not be established, reports every steer it accepted, since the model context
625
+ * of later turns holds none of them. The bytes of the steers not taken in are released.
626
+ */
627
+ closeRunSteering(steering) {
628
+ if (steering.outcome)
629
+ return steering.outcome;
630
+ steering.input.close();
631
+ const keptInContext = steering.keptInContext === true;
632
+ const unappliedSteerIds = [];
633
+ let heldBytes = 0;
634
+ for (const [steerId, entry] of steering.accepted) {
635
+ const applied = steering.applied.has(steerId);
636
+ if (!applied)
637
+ heldBytes += entry.byteSize;
638
+ if (!keptInContext || !applied)
639
+ unappliedSteerIds.push(steerId);
640
+ }
641
+ steering.stored.outstandingPromptBytes = Math.max(0, steering.stored.outstandingPromptBytes - heldBytes);
642
+ steering.outcome = Object.freeze({
643
+ keptInContext,
644
+ unappliedSteerIds: Object.freeze(unappliedSteerIds),
645
+ });
646
+ return steering.outcome;
647
+ }
648
+ /**
649
+ * Projects a steer the run's generation took in as a user message of the run. The assistant
650
+ * message that answered before it is completed and the run answers on in a new one; a steer
651
+ * taken in before the run answered anything is placed before its still empty assistant message.
652
+ */
653
+ async applyRunSteer(run, applied) {
654
+ const steering = run.steering;
655
+ const accepted = steering.accepted.get(applied.inputId);
656
+ if (!accepted
657
+ || applied.generationId !== run.runId
658
+ || steering.applied.has(applied.inputId)
659
+ || steering.outcome !== undefined) {
660
+ throw new Error(`Steer "${applied.inputId}" was taken in without being accepted by its run.`);
661
+ }
662
+ // The generation recorded the steer durably: it is in the model context whenever the run is.
663
+ steering.applied.add(applied.inputId);
664
+ steering.stored.outstandingPromptBytes = Math.max(0, steering.stored.outstandingPromptBytes - accepted.byteSize);
665
+ const timestamp = new Date().toISOString();
666
+ const steerMessage = {
667
+ messageId: plugins.crypto.randomUUID(),
668
+ sessionId: run.sessionId,
669
+ runId: run.runId,
670
+ role: 'user',
671
+ status: 'completed',
672
+ createdAt: timestamp,
673
+ completedAt: timestamp,
674
+ steerId: applied.inputId,
675
+ parts: this.userMessageParts(accepted.prompt),
676
+ };
677
+ const answered = run.callbackParts.length > 0;
678
+ const answeredAssistantId = run.assistantMessageId;
679
+ let completedAssistant;
680
+ const nextAssistant = answered
681
+ ? {
682
+ messageId: plugins.crypto.randomUUID(),
683
+ sessionId: run.sessionId,
684
+ runId: run.runId,
685
+ role: 'assistant',
686
+ status: 'streaming',
687
+ createdAt: timestamp,
688
+ parts: [],
689
+ }
690
+ : undefined;
691
+ const closePublication = this.core.openPublication(run.state, run.sessionId);
692
+ try {
693
+ await this.core.mutateProjection(run.state, run.stored, () => {
694
+ const index = run.stored.messages.findIndex((message) => message.messageId === answeredAssistantId);
695
+ if (index < 0)
696
+ throw new Error('The steered run has no projected assistant message.');
697
+ if (!nextAssistant) {
698
+ run.stored.messages.splice(index, 0, cloneSerializable(steerMessage));
699
+ return;
700
+ }
701
+ completedAssistant = {
702
+ ...cloneSerializable(run.stored.messages[index]),
703
+ status: 'completed',
704
+ completedAt: timestamp,
705
+ parts: cloneSerializable(run.callbackParts),
706
+ ...(run.modelResolution ? { model: cloneSerializable(run.modelResolution.identity) } : {}),
707
+ };
708
+ run.stored.messages.splice(index, 1, cloneSerializable(completedAssistant), cloneSerializable(steerMessage), cloneSerializable(nextAssistant));
709
+ });
710
+ if (completedAssistant && nextAssistant) {
711
+ run.assistantMessageId = nextAssistant.messageId;
712
+ run.reservedAssistantMessage = publicSnapshot(nextAssistant);
713
+ run.callbackParts = [];
714
+ run.reasoningPartIds.clear();
715
+ this.core.emitEvent(run.scopeId, run.stored.session, {
716
+ type: 'message.updated',
717
+ runId: run.runId,
718
+ messageId: completedAssistant.messageId,
719
+ message: publicSnapshot(completedAssistant),
720
+ });
721
+ }
722
+ this.core.emitEvent(run.scopeId, run.stored.session, {
723
+ type: 'message.created',
724
+ runId: run.runId,
725
+ messageId: steerMessage.messageId,
726
+ message: publicSnapshot(steerMessage),
727
+ });
728
+ if (nextAssistant) {
729
+ this.core.emitEvent(run.scopeId, run.stored.session, {
730
+ type: 'message.created',
731
+ runId: run.runId,
732
+ messageId: nextAssistant.messageId,
733
+ message: publicSnapshot(nextAssistant),
734
+ });
735
+ }
736
+ this.core.emitEvent(run.scopeId, run.stored.session, {
737
+ type: 'prompt.steer.applied',
738
+ queueId: run.queueId,
739
+ runId: run.runId,
740
+ steerId: applied.inputId,
741
+ messageId: steerMessage.messageId,
742
+ });
743
+ }
744
+ finally {
745
+ closePublication();
746
+ }
747
+ }
748
+ buildTerminal(run, status, result, error) {
749
+ const timestamp = new Date().toISOString();
750
+ const userMessage = cloneSerializable(run.reservedUserMessage
751
+ ?? run.stored.messages.find((message) => message.messageId === run.userMessageId)
752
+ ?? {
753
+ messageId: run.userMessageId,
754
+ sessionId: run.sessionId,
755
+ runId: run.runId,
756
+ role: 'user',
757
+ status: 'streaming',
758
+ createdAt: timestamp,
759
+ parts: [],
760
+ });
761
+ const assistantMessage = cloneSerializable(run.reservedAssistantMessage
762
+ ?? run.stored.messages.find((message) => message.messageId === run.assistantMessageId)
763
+ ?? {
764
+ messageId: run.assistantMessageId,
765
+ sessionId: run.sessionId,
766
+ runId: run.runId,
767
+ role: 'assistant',
768
+ status: 'streaming',
769
+ createdAt: timestamp,
770
+ parts: [],
771
+ });
772
+ assistantMessage.parts = cloneSerializable(run.callbackParts);
773
+ const terminalParts = assistantMessage.parts;
774
+ for (const part of terminalParts) {
775
+ if (part.type === 'reasoning' && part.status === 'running') {
776
+ part.status = status === 'completed' ? 'completed' : 'cancelled';
777
+ part.completedAt = timestamp;
778
+ }
779
+ else if (part.type === 'tool' && part.status === 'running') {
780
+ part.status = status === 'cancelled' ? 'cancelled' : 'failed';
781
+ delete part.output;
782
+ part.error = status === 'cancelled'
783
+ ? 'Tool execution was cancelled.'
784
+ : 'Tool execution ended without a terminal event.';
785
+ part.completedAt = timestamp;
786
+ }
787
+ }
788
+ userMessage.status = status;
789
+ userMessage.completedAt = timestamp;
790
+ assistantMessage.status = status;
791
+ assistantMessage.completedAt = timestamp;
792
+ if (run.modelResolution)
793
+ assistantMessage.model = cloneSerializable(run.modelResolution.identity);
794
+ if (status === 'completed' && result) {
795
+ if (!assistantMessage.parts.some((part) => part.type === 'text')) {
796
+ assistantMessage.parts.push({
797
+ partId: plugins.crypto.randomUUID(),
798
+ type: 'text',
799
+ text: truncateUtf8(result.text, this.core.callbackLimits.maxOutputBytes),
800
+ });
801
+ }
802
+ assistantMessage.usage = cloneSerializable(result.usage);
803
+ }
804
+ else {
805
+ assistantMessage.usage = cloneSerializable(run.usage);
806
+ const message = truncateUtf8(error?.message ?? externalErrorFallback.message, maxTransferMetadataBytes);
807
+ const limit = error instanceof FlexHarnessExternalError ? error.limit : undefined;
808
+ for (const failedMessage of [userMessage, assistantMessage]) {
809
+ failedMessage.error = message;
810
+ if (limit)
811
+ failedMessage.limit = cloneSerializable(limit);
812
+ }
813
+ }
814
+ return {
815
+ runId: run.runId,
816
+ status,
817
+ userMessage,
818
+ assistantMessage,
819
+ ...(run.modelResolution ? { model: cloneSerializable(run.modelResolution.identity) } : {}),
820
+ ...(status === 'completed' && result
821
+ ? {
822
+ usage: cloneSerializable(result.usage),
823
+ finishReason: result.finishReason,
824
+ steps: result.steps,
825
+ }
826
+ : { usage: cloneSerializable(run.usage) }),
827
+ };
828
+ }
829
+ async promoteCompletedTerminal(run, terminal) {
830
+ await this.core.mutateProjection(run.state, run.stored, () => {
831
+ this.replaceVisibleRun(run.stored, terminal);
832
+ run.stored.stagedTerminals = run.stored.stagedTerminals.filter((entry) => entry.runId !== run.runId);
833
+ }, true);
834
+ if (!this.core.isTombstoned(run)) {
835
+ await this.core.mutateScope(run.state, () => {
836
+ if (run.state.sessions.get(run.sessionId) !== run.stored)
837
+ return;
838
+ const timestamp = terminal.assistantMessage.completedAt;
839
+ run.stored.session.status = 'idle';
840
+ run.stored.session.activity = {
841
+ runId: run.runId,
842
+ status: 'idle',
843
+ startedAt: run.stored.session.activity.startedAt,
844
+ completedAt: timestamp,
845
+ };
846
+ run.stored.session.updatedAt = timestamp;
847
+ }, true);
848
+ }
849
+ }
850
+ async publishFailedTerminal(run, terminal) {
851
+ await this.core.mutateProjection(run.state, run.stored, () => {
852
+ this.replaceVisibleRun(run.stored, terminal);
853
+ run.stored.stagedTerminals = run.stored.stagedTerminals.filter((entry) => entry.runId !== run.runId);
854
+ }, true);
855
+ await this.core.mutateScope(run.state, () => {
856
+ if (run.state.sessions.get(run.sessionId) !== run.stored)
857
+ return;
858
+ const timestamp = terminal.assistantMessage.completedAt;
859
+ const activityStatus = terminal.status === 'completed' ? 'idle' : terminal.status;
860
+ run.stored.session.status = activityStatus;
861
+ run.stored.session.activity = {
862
+ runId: run.runId,
863
+ status: activityStatus,
864
+ startedAt: run.stored.session.activity.startedAt,
865
+ completedAt: timestamp,
866
+ ...terminalActivityError(terminal.assistantMessage),
867
+ };
868
+ run.stored.session.updatedAt = timestamp;
869
+ }, true);
870
+ }
871
+ replaceStagedTerminal(stored, terminal) {
872
+ stored.stagedTerminals = stored.stagedTerminals.filter((entry) => entry.runId !== terminal.runId);
873
+ stored.stagedTerminals.push(cloneSerializable(terminal));
874
+ }
875
+ /**
876
+ * Puts a run's terminal messages in place of their projected versions: its prompt, and its last
877
+ * assistant message. The steers a run took in, and the assistant messages it completed before
878
+ * them, stay where they are. A terminal message that is not projected yet is added: the prompt
879
+ * before the run's other messages, the assistant message after them.
880
+ */
881
+ replaceVisibleRun(stored, terminal) {
882
+ const replacements = new Map([
883
+ [terminal.userMessage.messageId, terminal.userMessage],
884
+ [terminal.assistantMessage.messageId, terminal.assistantMessage],
885
+ ]);
886
+ const placed = new Set();
887
+ stored.messages = stored.messages.map((message) => {
888
+ const replacement = message.runId === terminal.runId
889
+ ? replacements.get(message.messageId)
890
+ : undefined;
891
+ if (!replacement)
892
+ return message;
893
+ placed.add(replacement.messageId);
894
+ return cloneSerializable(replacement);
895
+ });
896
+ const firstIndex = stored.messages.findIndex((message) => message.runId === terminal.runId);
897
+ if (!placed.has(terminal.userMessage.messageId)) {
898
+ stored.messages.splice(firstIndex < 0 ? stored.messages.length : firstIndex, 0, cloneSerializable(terminal.userMessage));
899
+ }
900
+ if (!placed.has(terminal.assistantMessage.messageId)) {
901
+ const lastIndex = stored.messages.reduce((last, message, index) => message.runId === terminal.runId ? index : last, -1);
902
+ stored.messages.splice(lastIndex < 0 ? stored.messages.length : lastIndex + 1, 0, cloneSerializable(terminal.assistantMessage));
903
+ }
904
+ }
905
+ emitTerminalProjection(run, terminal) {
906
+ for (const part of terminal.assistantMessage.parts) {
907
+ const callbackPart = run.callbackParts.find((entry) => entry.partId === part.partId);
908
+ const shouldComplete = part.type === 'text'
909
+ ? callbackPart?.type === 'text'
910
+ : part.type === 'reasoning'
911
+ ? callbackPart?.type === 'reasoning' && callbackPart.status === 'running'
912
+ : part.type === 'tool'
913
+ ? callbackPart?.type === 'tool' && callbackPart.status === 'running'
914
+ : false;
915
+ if (shouldComplete) {
916
+ this.core.emitPartEvent(run, 'part.completed', part);
917
+ }
918
+ }
919
+ for (const message of [terminal.userMessage, terminal.assistantMessage]) {
920
+ this.core.emitEvent(run.scopeId, run.stored.session, {
921
+ type: 'message.updated',
922
+ runId: run.runId,
923
+ messageId: message.messageId,
924
+ message: publicSnapshot(message),
925
+ });
926
+ }
927
+ }
928
+ /**
929
+ * Ends a run that fails without publishing a terminal projection, because its namespace was
930
+ * fenced or retired or its durable outcome could not be established: listeners still receive
931
+ * its terminal message events and its one `run.finished`. Nothing here is persisted; the next
932
+ * load of the namespace repairs the stored projection from the canonical outcome.
933
+ */
934
+ emitUnpublishedRunFinish(run, error, generated) {
935
+ if (run.finishedEventEmitted || run.state.tombstones.has(run.sessionId))
936
+ return;
937
+ const cancelled = run.ownerCancellation !== undefined && run.internalFailure === undefined;
938
+ const terminalError = cancelled
939
+ ? run.ownerCancellation
940
+ : error instanceof FlexHarnessRunError
941
+ ? error
942
+ : this.core.projectExternalError(run, error, generated ? 'persistence' : 'agentSession');
943
+ const terminal = this.buildTerminal(run, cancelled ? 'cancelled' : 'failed', undefined, terminalError);
944
+ this.emitTerminalProjection(run, terminal);
945
+ this.emitFinalRunEvent(run, terminal.assistantMessage, terminalError, cancelled);
946
+ }
947
+ emitFinalRunEvent(run, message, error, cancelled) {
948
+ const status = error
949
+ ? cancelled ? 'cancelled' : 'failed'
950
+ : 'completed';
951
+ run.finishedEventEmitted = true;
952
+ const steering = this.closeRunSteering(run.steering);
953
+ this.core.emitEvent(run.scopeId, run.stored.session, {
954
+ type: 'run.finished',
955
+ runId: run.runId,
956
+ messageId: run.assistantMessageId,
957
+ status,
958
+ message: publicSnapshot(message),
959
+ ...(error === undefined ? {} : { error: errorToInfo(error) }),
960
+ keptInContext: steering.keptInContext,
961
+ unappliedSteerIds: [...steering.unappliedSteerIds],
962
+ });
963
+ }
964
+ cancelRun(run, reason, context) {
965
+ const invocationContext = context ?? this.core.compaction.createRunCompactorContext(run);
966
+ // A stopped run takes no further steers; the ones it has not taken in are reported unapplied.
967
+ run.steering.input.close();
968
+ if (run.internalFailure === undefined && run.ownerCancellation === undefined) {
969
+ run.ownerCancellation = reason;
970
+ run.deferredCompactorContext = invocationContext;
971
+ this.core.compaction.deferredCompactorContexts.set(run.originCompactorContext, invocationContext);
972
+ }
973
+ this.core.compaction.withCompactorContext((run.deferredCompactorContext ?? invocationContext), () => {
974
+ this.core.permissions.rejectRunPermissions(run.state, run, reason);
975
+ // The owner stops the generation: what its model produced stays in the model context.
976
+ if (run.ownerCancellation === reason && !run.stop.signal.aborted)
977
+ run.stop.abort(reason);
978
+ if (!run.controller.signal.aborted)
979
+ run.controller.abort(reason);
980
+ if (run.phase === 'admitting')
981
+ return;
982
+ if (run.scheduleKey) {
983
+ run.stored.agentSession.cancelScheduledGeneration(run.scheduleKey, reason);
984
+ }
985
+ else {
986
+ run.stored.agentSession.abortCurrentGeneration(reason);
987
+ }
988
+ });
989
+ }
990
+ abortRunInternally(run, error, context) {
991
+ const invocationContext = context ?? this.core.compaction.createRunCompactorContext(run);
992
+ run.steering.input.close();
993
+ if (run.internalFailure === undefined) {
994
+ run.internalFailure = error ?? new Error('Internal FlexHarness run failure.');
995
+ run.deferredCompactorContext = invocationContext;
996
+ this.core.compaction.deferredCompactorContexts.set(run.originCompactorContext, invocationContext);
997
+ }
998
+ this.core.compaction.withCompactorContext((run.deferredCompactorContext ?? invocationContext), () => {
999
+ if (!run.controller.signal.aborted)
1000
+ run.controller.abort(run.internalFailure);
1001
+ run.stored.agentSession.abortCurrentGeneration(run.internalFailure);
1002
+ });
1003
+ }
1004
+ async rollbackAdmission(run, projectionReserved, originalError) {
1005
+ const errors = [];
1006
+ if (run.transaction) {
1007
+ try {
1008
+ await this.core.compaction.withRunCompactorContext(run, () => run.stored.agentSession.finalizeGeneration(run.transaction, 'interrupted'));
1009
+ }
1010
+ catch (error) {
1011
+ errors.push(this.core.projectExternalError(run, error, 'agentSession'));
1012
+ }
1013
+ try {
1014
+ const outcome = (await this.core.durableCanonicalOutcomes(run.stored)).get(run.runId);
1015
+ if (outcome !== 'interrupted') {
1016
+ errors.push(this.core.projectExternalError(run, new Error('Prompt admission interruption is not durably established.'), 'persistence'));
1017
+ }
1018
+ }
1019
+ catch (error) {
1020
+ errors.push(this.core.projectExternalError(run, error, 'persistence'));
1021
+ }
1022
+ }
1023
+ if (projectionReserved || run.stored.metrics.pendingGenerationId === run.runId) {
1024
+ try {
1025
+ await this.core.mutateProjection(run.state, run.stored, () => {
1026
+ if (run.stored.metrics.pendingGenerationId === run.runId) {
1027
+ delete run.stored.metrics.pendingGenerationId;
1028
+ }
1029
+ run.stored.messages = run.stored.messages.filter((message) => message.runId !== run.runId);
1030
+ run.stored.stagedTerminals = run.stored.stagedTerminals.filter((entry) => entry.runId !== run.runId);
1031
+ run.stored.reversionSegments = run.stored.reversionSegments.filter((segment) => segment.runId !== run.runId);
1032
+ if (run.stored.pendingReversion?.kind === 'capture'
1033
+ && run.stored.pendingReversion.runId === run.runId)
1034
+ delete run.stored.pendingReversion;
1035
+ }, true);
1036
+ }
1037
+ catch (error) {
1038
+ errors.push(this.core.projectExternalError(run, error, 'persistence'));
1039
+ }
1040
+ }
1041
+ if (run.state.sessions.get(run.sessionId) === run.stored && run.stored.session.activity.runId === run.runId) {
1042
+ try {
1043
+ await this.core.mutateScope(run.state, () => {
1044
+ run.stored.session.status = 'idle';
1045
+ run.stored.session.activity = { status: 'idle' };
1046
+ run.stored.session.updatedAt = new Date().toISOString();
1047
+ }, true);
1048
+ }
1049
+ catch (error) {
1050
+ errors.push(this.core.projectExternalError(run, error, 'persistence'));
1051
+ }
1052
+ }
1053
+ if (errors.length > 0)
1054
+ await this.core.lifecycle.fenceNamespace(run.state, run, combineErrors([originalError, ...errors]));
1055
+ return errors;
1056
+ }
1057
+ }
1058
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5mbGV4aGFybmVzcy5ydW5zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5mbGV4aGFybmVzcy5ydW5zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsd0JBQXdCLEVBQ3hCLHdCQUF3QixFQUN4QixtQkFBbUIsRUFDbkIseUJBQXlCLEVBQ3pCLDBCQUEwQixFQUMxQixXQUFXLEdBQ1osTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUNMLDhCQUE4QixFQUM5QixrQkFBa0IsR0FjbkIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsZUFBZSxFQUFFLHlCQUF5QixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDdEYsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXBELE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsd0JBQXdCLEVBQ3hCLHNCQUFzQixFQUN0QixrQkFBa0IsRUFDbEIsY0FBYyxFQUNkLFlBQVksR0FFYixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQVczRCxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLHdCQUF3QixFQUN4QixhQUFhLEVBQ2IscUJBQXFCLEdBQ3RCLE1BQU0sd0JBQXdCLENBQUM7QUFHaEMsMkZBQTJGO0FBQzNGLE1BQU0sT0FBTyxlQUFlO0lBQ0c7SUFBN0IsWUFBNkIsSUFBNkI7UUFBN0IsU0FBSSxHQUFKLElBQUksQ0FBeUI7SUFBRyxDQUFDO0lBRXZELEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBZSxFQUFFLFNB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