@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.
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.flexharness.admission.d.ts +17 -0
- package/dist_ts/classes.flexharness.admission.js +263 -0
- package/dist_ts/classes.flexharness.callbacks.d.ts +38 -0
- package/dist_ts/classes.flexharness.callbacks.js +313 -0
- package/dist_ts/classes.flexharness.compaction.d.ts +25 -0
- package/dist_ts/classes.flexharness.compaction.js +87 -0
- package/dist_ts/classes.flexharness.configurations.d.ts +11 -0
- package/dist_ts/classes.flexharness.configurations.js +137 -0
- package/dist_ts/classes.flexharness.core.d.ts +143 -0
- package/dist_ts/classes.flexharness.core.js +1538 -0
- package/dist_ts/classes.flexharness.d.ts +2 -437
- package/dist_ts/classes.flexharness.deletion.d.ts +31 -0
- package/dist_ts/classes.flexharness.deletion.js +396 -0
- package/dist_ts/classes.flexharness.imports.d.ts +24 -0
- package/dist_ts/classes.flexharness.imports.js +345 -0
- package/dist_ts/classes.flexharness.js +119 -9776
- package/dist_ts/classes.flexharness.lifecycle.d.ts +47 -0
- package/dist_ts/classes.flexharness.lifecycle.js +625 -0
- package/dist_ts/classes.flexharness.permissions.d.ts +19 -0
- package/dist_ts/classes.flexharness.permissions.js +450 -0
- package/dist_ts/classes.flexharness.projects.d.ts +55 -0
- package/dist_ts/classes.flexharness.projects.js +575 -0
- package/dist_ts/classes.flexharness.prompts.d.ts +44 -0
- package/dist_ts/classes.flexharness.prompts.js +659 -0
- package/dist_ts/classes.flexharness.providers.d.ts +18 -0
- package/dist_ts/classes.flexharness.providers.js +267 -0
- package/dist_ts/classes.flexharness.results.d.ts +26 -0
- package/dist_ts/classes.flexharness.results.js +89 -0
- package/dist_ts/classes.flexharness.reversions.d.ts +52 -0
- package/dist_ts/classes.flexharness.reversions.js +1306 -0
- package/dist_ts/classes.flexharness.runs.d.ts +63 -0
- package/dist_ts/classes.flexharness.runs.js +1058 -0
- package/dist_ts/classes.flexharness.sessions.d.ts +20 -0
- package/dist_ts/classes.flexharness.sessions.js +381 -0
- package/dist_ts/classes.flexharness.slashcommands.d.ts +40 -0
- package/dist_ts/classes.flexharness.slashcommands.js +458 -0
- package/dist_ts/classes.flexharness.subagents.d.ts +31 -0
- package/dist_ts/classes.flexharness.subagents.js +690 -0
- package/dist_ts/classes.flexharness.tooldispatch.d.ts +53 -0
- package/dist_ts/classes.flexharness.tooldispatch.js +418 -0
- package/dist_ts/interfaces.flexharness.d.ts +455 -0
- package/dist_ts/interfaces.flexharness.js +2 -0
- package/dist_ts/utils.flexharness.d.ts +19 -0
- package/dist_ts/utils.flexharness.js +83 -0
- package/dist_ts_compaction/plugins.d.ts +2 -2
- package/dist_ts_compaction/plugins.js +3 -3
- package/dist_ts_compaction/smartagent.compaction.js +6 -5
- package/dist_ts_stores_nosqldb/classes.nosqldbstores.d.ts +9 -0
- package/dist_ts_stores_nosqldb/classes.nosqldbstores.js +13 -1
- package/dist_ts_stores_nosqldb/classes.recordstore.d.ts +2 -2
- package/dist_ts_stores_nosqldb/classes.recordstore.js +3 -3
- package/package.json +3 -3
- package/readme.md +1 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.flexharness.admission.ts +331 -0
- package/ts/classes.flexharness.callbacks.ts +352 -0
- package/ts/classes.flexharness.compaction.ts +167 -0
- package/ts/classes.flexharness.configurations.ts +167 -0
- package/ts/classes.flexharness.core.ts +1830 -0
- package/ts/classes.flexharness.deletion.ts +616 -0
- package/ts/classes.flexharness.imports.ts +414 -0
- package/ts/classes.flexharness.lifecycle.ts +786 -0
- package/ts/classes.flexharness.permissions.ts +535 -0
- package/ts/classes.flexharness.projects.ts +1006 -0
- package/ts/classes.flexharness.prompts.ts +857 -0
- package/ts/classes.flexharness.providers.ts +322 -0
- package/ts/classes.flexharness.results.ts +98 -0
- package/ts/classes.flexharness.reversions.ts +1684 -0
- package/ts/classes.flexharness.runs.ts +1204 -0
- package/ts/classes.flexharness.sessions.ts +483 -0
- package/ts/classes.flexharness.slashcommands.ts +705 -0
- package/ts/classes.flexharness.subagents.ts +860 -0
- package/ts/classes.flexharness.tooldispatch.ts +475 -0
- package/ts/classes.flexharness.ts +147 -12567
- package/ts/interfaces.flexharness.ts +517 -0
- package/ts/readme.md +1 -1
- package/ts/utils.flexharness.ts +121 -0
- package/ts_compaction/plugins.ts +2 -2
- package/ts_compaction/smartagent.compaction.ts +5 -4
- package/ts_stores_nosqldb/classes.nosqldbstores.ts +13 -0
- package/ts_stores_nosqldb/classes.recordstore.ts +5 -5
- package/ts_stores_nosqldb/readme.md +7 -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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
|