@modelprofile.com/flexharness 10.24.0 → 11.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_ts/00_commitinfo_data.js +2 -2
- package/dist_ts/classes.codesandbox.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/classes.stores.js +1 -1
- package/dist_ts/classes.toolcatalog.js +1 -1
- package/dist_ts/errors.js +1 -1
- package/dist_ts/functions.toolpermissions.js +1 -1
- package/dist_ts/interfaces.d.ts +3 -3
- 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/utils.harnessoptions.js +1 -1
- package/dist_ts/utils.json.js +1 -1
- package/dist_ts/utils.schemadeclarations.js +1 -1
- package/dist_ts/utils.sessionimport.js +1 -1
- package/dist_ts/utils.sessionmetrics.d.ts +1 -1
- package/dist_ts_chat/classes.chatsession.js +1 -1
- package/dist_ts_chat_harness/classes.transcript.js +1 -1
- package/dist_ts_chat_harness/functions.intents.js +1 -1
- package/dist_ts_chat_harness/functions.mapping.d.ts +1 -1
- package/dist_ts_chat_harness/functions.mapping.js +1 -1
- package/dist_ts_chat_harness_server/classes.chathub.d.ts +18 -7
- package/dist_ts_chat_harness_server/classes.chathub.js +65 -62
- package/dist_ts_chat_harness_server/classes.chatsubscription.d.ts +5 -3
- package/dist_ts_chat_harness_server/classes.chatsubscription.js +4 -4
- package/dist_ts_chat_harness_server/classes.scopedirectory.d.ts +17 -0
- package/dist_ts_chat_harness_server/classes.scopedirectory.js +49 -0
- package/dist_ts_chat_harness_server/classes.sessionlists.d.ts +3 -5
- package/dist_ts_chat_harness_server/classes.sessionlists.js +11 -12
- package/dist_ts_chat_harness_server/classes.turngate.d.ts +8 -2
- package/dist_ts_chat_harness_server/classes.turngate.js +22 -21
- package/dist_ts_chat_harness_server/functions.errorprojector.js +1 -1
- package/dist_ts_chat_harness_server/index.d.ts +3 -2
- package/dist_ts_chat_harness_server/index.js +3 -2
- package/dist_ts_chat_harness_server/interfaces.d.ts +35 -2
- package/dist_ts_chat_harness_server/plugins.d.ts +1 -1
- package/dist_ts_chat_harness_typedsocket/classes.clienttransport.d.ts +28 -3
- package/dist_ts_chat_harness_typedsocket/classes.clienttransport.js +71 -15
- package/dist_ts_chat_harness_typedsocket/classes.serverbinding.d.ts +5 -3
- package/dist_ts_chat_harness_typedsocket/classes.serverbinding.js +79 -16
- package/dist_ts_chat_harness_typedsocket/index.d.ts +2 -2
- package/dist_ts_chat_harness_typedsocket/index.js +1 -1
- package/dist_ts_chat_harness_typedsocket/interfaces.requests.d.ts +20 -11
- package/dist_ts_chat_web/flexchat-input.js +1 -1
- package/dist_ts_chat_web/flexchat-message.js +1 -1
- package/dist_ts_chat_web/flexchat-window.js +1 -1
- package/dist_ts_compaction/smartagent.compaction.js +1 -1
- package/dist_ts_kvm/ocr.js +1 -1
- package/dist_ts_ocr/classes.imageocr.js +1 -1
- package/dist_ts_ocr/ocr.mistral.js +1 -1
- package/dist_ts_stores_nosqldb/classes.nosqldbstores.js +1 -1
- package/dist_ts_tools/tool.browser.js +1 -1
- package/dist_ts_tools/tool.filesystem.js +1 -1
- package/dist_ts_tools/tool.shell.js +1 -1
- package/dist_ts_tools_node/tool.context.js +1 -1
- package/dist_ts_typedrequest/catalog.d.ts +2 -2
- package/dist_ts_typedrequest/catalog.js +1 -1
- package/package.json +3 -3
- 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/utils.flexharness.ts +121 -0
- package/ts_chat_harness_server/classes.chathub.ts +68 -61
- package/ts_chat_harness_server/classes.chatsubscription.ts +7 -5
- package/ts_chat_harness_server/classes.scopedirectory.ts +67 -0
- package/ts_chat_harness_server/classes.sessionlists.ts +11 -19
- package/ts_chat_harness_server/classes.turngate.ts +28 -21
- package/ts_chat_harness_server/index.ts +4 -5
- package/ts_chat_harness_server/interfaces.ts +35 -2
- package/ts_chat_harness_server/plugins.ts +0 -3
- package/ts_chat_harness_server/readme.md +6 -4
- package/ts_chat_harness_typedsocket/classes.clienttransport.ts +92 -23
- package/ts_chat_harness_typedsocket/classes.serverbinding.ts +88 -16
- package/ts_chat_harness_typedsocket/index.ts +4 -2
- package/ts_chat_harness_typedsocket/interfaces.requests.ts +15 -11
- package/ts_chat_harness_typedsocket/readme.md +7 -3
|
@@ -0,0 +1,659 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { FlexHarnessAbortError, FlexHarnessNotFoundError, FlexHarnessQueueFullError, FlexHarnessSessionBusyError, FlexHarnessSlashCommandReentryError, FlexHarnessSteerRejectedError, FlexHarnessStoreCommitUncertainError, FlexHarnessValidationError, errorToInfo, } from './errors.js';
|
|
3
|
+
import { cloneSerializable } from './utils.json.js';
|
|
4
|
+
import { normalizeFlexPrompt } from './utils.prompt.js';
|
|
5
|
+
import { jsonBytes, publicSnapshot, requireTransferIdentifier } from './utils.transfer.js';
|
|
6
|
+
import { validateIdentifier, validatePromptOptions } from './utils.validation.js';
|
|
7
|
+
import { createSessionMetricsOperation } from './utils.sessionmetrics.js';
|
|
8
|
+
import { combineErrors, isAbortError } from './utils.flexharness.js';
|
|
9
|
+
const maxScheduleDebounceMs = 24 * 60 * 60 * 1000;
|
|
10
|
+
function containsStoreCommitUncertainty(error, seen = new Set()) {
|
|
11
|
+
if (error instanceof FlexHarnessStoreCommitUncertainError)
|
|
12
|
+
return true;
|
|
13
|
+
if (!(error instanceof Error) || seen.has(error))
|
|
14
|
+
return false;
|
|
15
|
+
seen.add(error);
|
|
16
|
+
try {
|
|
17
|
+
if (error instanceof AggregateError) {
|
|
18
|
+
for (const nested of error.errors) {
|
|
19
|
+
if (containsStoreCommitUncertainty(nested, seen))
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return containsStoreCommitUncertainty(error.cause, seen);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/** The prompt queue: admission, scheduling, promotion and cancellation of prompts and steers. */
|
|
30
|
+
export class FlexHarnessPromptQueue {
|
|
31
|
+
core;
|
|
32
|
+
pendingPromptAdmissionOwners = new Set();
|
|
33
|
+
promptQueueSequence = 0;
|
|
34
|
+
pendingPromptAdmissions = 0;
|
|
35
|
+
pendingPromptAdmissionBytes = 0;
|
|
36
|
+
constructor(core) {
|
|
37
|
+
this.core = core;
|
|
38
|
+
}
|
|
39
|
+
promptAdmissionByteSize(prompt, options, scheduleKey, debounceMs) {
|
|
40
|
+
return jsonBytes({
|
|
41
|
+
prompt: normalizeFlexPrompt(prompt),
|
|
42
|
+
options: cloneSerializable(options),
|
|
43
|
+
scheduleKey,
|
|
44
|
+
debounceMs,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
isSessionRuntimeIdle(state, stored) {
|
|
48
|
+
return stored.session.status === 'idle'
|
|
49
|
+
&& !state.activeRuns.has(stored.session.sessionId)
|
|
50
|
+
&& stored.outstandingPromptsById.size === 0;
|
|
51
|
+
}
|
|
52
|
+
async prompt(scopeId, sessionId, prompt, options = {}) {
|
|
53
|
+
const admission = await this.startPrompt(scopeId, sessionId, prompt, options);
|
|
54
|
+
return admission.completion;
|
|
55
|
+
}
|
|
56
|
+
async startPrompt(scopeId, sessionId, prompt, options = {}) {
|
|
57
|
+
validatePromptOptions(options, false);
|
|
58
|
+
const queued = await this.enqueuePromptInternal(scopeId, sessionId, prompt, options);
|
|
59
|
+
return queued.started;
|
|
60
|
+
}
|
|
61
|
+
async enqueuePrompt(scopeId, sessionId, prompt, options = {}) {
|
|
62
|
+
validatePromptOptions(options, false);
|
|
63
|
+
const queued = await this.enqueuePromptInternal(scopeId, sessionId, prompt, options);
|
|
64
|
+
return queued.admission;
|
|
65
|
+
}
|
|
66
|
+
async schedulePrompt(scopeId, sessionId, scheduleKey, prompt, options = {}) {
|
|
67
|
+
validateIdentifier(scheduleKey, 'scheduleKey');
|
|
68
|
+
requireTransferIdentifier(scheduleKey, 'scheduleKey');
|
|
69
|
+
validatePromptOptions(options, true);
|
|
70
|
+
const debounceMs = options.debounceMs ?? 50;
|
|
71
|
+
if (!Number.isSafeInteger(debounceMs) || debounceMs < 0 || debounceMs > maxScheduleDebounceMs) {
|
|
72
|
+
throw new FlexHarnessValidationError(`debounceMs must be an integer from 0 through ${maxScheduleDebounceMs}.`);
|
|
73
|
+
}
|
|
74
|
+
const queued = await this.enqueuePromptInternal(scopeId, sessionId, prompt, options, scheduleKey, debounceMs);
|
|
75
|
+
const admission = await queued.started;
|
|
76
|
+
return Object.freeze({ ...admission, scheduleKey });
|
|
77
|
+
}
|
|
78
|
+
async getPromptQueueEntry(scopeId, sessionId, queueId) {
|
|
79
|
+
validateIdentifier(queueId, 'queueId');
|
|
80
|
+
requireTransferIdentifier(queueId, 'queueId');
|
|
81
|
+
const { state } = await this.core.resolveState(scopeId);
|
|
82
|
+
this.core.assertStateAcceptingWork(state);
|
|
83
|
+
const stored = this.core.requireSession(state, sessionId);
|
|
84
|
+
const entry = this.promptQueueEntry(stored, queueId);
|
|
85
|
+
if (!entry)
|
|
86
|
+
throw new FlexHarnessNotFoundError('Prompt queue entry', queueId);
|
|
87
|
+
return publicSnapshot(entry);
|
|
88
|
+
}
|
|
89
|
+
async listPromptQueueEntries(scopeId, sessionId) {
|
|
90
|
+
const { state } = await this.core.resolveState(scopeId);
|
|
91
|
+
this.core.assertStateAcceptingWork(state);
|
|
92
|
+
const stored = this.core.requireSession(state, sessionId);
|
|
93
|
+
return publicSnapshot([
|
|
94
|
+
...[...stored.outstandingPromptsById.values()].map((entry) => this.projectPromptQueueEntry(entry)),
|
|
95
|
+
...stored.terminalPromptQueueEntries.values(),
|
|
96
|
+
].sort((left, right) => left.queueSequence - right.queueSequence));
|
|
97
|
+
}
|
|
98
|
+
async cancelPrompt(scopeId, sessionId, queueId) {
|
|
99
|
+
validateIdentifier(queueId, 'queueId');
|
|
100
|
+
requireTransferIdentifier(queueId, 'queueId');
|
|
101
|
+
const { scope, state } = await this.core.resolveState(scopeId);
|
|
102
|
+
const stored = this.core.requireSession(state, sessionId);
|
|
103
|
+
const queued = stored.outstandingPromptsById.get(queueId);
|
|
104
|
+
if (!queued) {
|
|
105
|
+
if (stored.terminalPromptQueueEntries.has(queueId))
|
|
106
|
+
return false;
|
|
107
|
+
throw new FlexHarnessNotFoundError('Prompt queue entry', queueId);
|
|
108
|
+
}
|
|
109
|
+
return this.cancelQueuedPrompt(queued, this.core.trustInternalError(new FlexHarnessAbortError('The queued prompt was cancelled.')), this.core.compaction.createCompactorContext(scopeId, scope.scope, state.storageKey, sessionId));
|
|
110
|
+
}
|
|
111
|
+
async cancelScheduledPrompt(scopeId, sessionId, scheduleKey) {
|
|
112
|
+
validateIdentifier(scheduleKey, 'scheduleKey');
|
|
113
|
+
const { scope, state } = await this.core.resolveState(scopeId);
|
|
114
|
+
const stored = this.core.requireSession(state, sessionId);
|
|
115
|
+
const queued = [...stored.outstandingPromptsById.values()]
|
|
116
|
+
.find((entry) => entry.scheduleKey === scheduleKey);
|
|
117
|
+
if (!queued)
|
|
118
|
+
return false;
|
|
119
|
+
const cancellation = this.core.trustInternalError(new FlexHarnessAbortError('The scheduled run was cancelled.'));
|
|
120
|
+
return this.cancelQueuedPrompt(queued, cancellation, this.core.compaction.createCompactorContext(scopeId, scope.scope, state.storageKey, sessionId));
|
|
121
|
+
}
|
|
122
|
+
async steerPrompt(scopeId, sessionId, queueId, steer) {
|
|
123
|
+
validateIdentifier(queueId, 'queueId');
|
|
124
|
+
requireTransferIdentifier(queueId, 'queueId');
|
|
125
|
+
validateIdentifier(steer.steerId, 'steerId');
|
|
126
|
+
requireTransferIdentifier(steer.steerId, 'steerId');
|
|
127
|
+
this.core.assertOpen();
|
|
128
|
+
const prompt = normalizeFlexPrompt(steer.prompt);
|
|
129
|
+
const byteSize = this.promptAdmissionByteSize(steer.prompt, {});
|
|
130
|
+
const { state } = await this.core.resolveState(scopeId);
|
|
131
|
+
this.core.assertStateAcceptingWork(state);
|
|
132
|
+
const stored = this.core.requireSession(state, sessionId);
|
|
133
|
+
this.core.assertSessionWritable(stored);
|
|
134
|
+
if (stored.session.agent !== undefined) {
|
|
135
|
+
throw new FlexHarnessValidationError('Subagent sessions can only be prompted through the foreground delegate tool.');
|
|
136
|
+
}
|
|
137
|
+
const run = state.activeRuns.get(sessionId);
|
|
138
|
+
if (!run || run.queueId !== queueId) {
|
|
139
|
+
if (stored.outstandingPromptsById.has(queueId) || stored.terminalPromptQueueEntries.has(queueId)) {
|
|
140
|
+
throw new FlexHarnessSteerRejectedError('not-running', steer.steerId);
|
|
141
|
+
}
|
|
142
|
+
throw new FlexHarnessNotFoundError('Prompt queue entry', queueId);
|
|
143
|
+
}
|
|
144
|
+
return this.admitRunSteer(run, steer, prompt, byteSize);
|
|
145
|
+
}
|
|
146
|
+
/** The shared synchronous admission point; neither entrypoint starts or resumes a run. */
|
|
147
|
+
admitRunSteer(run, steer, prompt, byteSize) {
|
|
148
|
+
if (run.phase === 'closing'
|
|
149
|
+
|| run.phase === 'finalizing'
|
|
150
|
+
|| run.phase === 'promoting'
|
|
151
|
+
|| run.callbacksClosed
|
|
152
|
+
|| run.controller.signal.aborted
|
|
153
|
+
|| run.stop.signal.aborted
|
|
154
|
+
|| run.state.activeRuns.get(run.sessionId) !== run)
|
|
155
|
+
throw new FlexHarnessSteerRejectedError('not-running', steer.steerId);
|
|
156
|
+
const steering = run.steering;
|
|
157
|
+
if (!steering.input.closed && !steering.accepted.has(steer.steerId)) {
|
|
158
|
+
if (steering.accepted.size - steering.applied.size
|
|
159
|
+
>= this.core.promptQueueLimits.maxOutstandingPromptsPerSession) {
|
|
160
|
+
throw new FlexHarnessQueueFullError(`Session "${run.sessionId}" has reached its pending steer limit.`);
|
|
161
|
+
}
|
|
162
|
+
// Pending steers hold outstanding prompt bytes of the session until they are taken in.
|
|
163
|
+
if (steering.stored.outstandingPromptBytes + byteSize
|
|
164
|
+
> this.core.promptQueueLimits.maxOutstandingBytesPerSession) {
|
|
165
|
+
throw new FlexHarnessQueueFullError(`Session "${run.sessionId}" has reached its outstanding prompt byte limit.`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
try {
|
|
169
|
+
steering.input.add({
|
|
170
|
+
inputId: steer.steerId,
|
|
171
|
+
content: cloneSerializable(prompt.modelMessage.content),
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
catch (error) {
|
|
175
|
+
if (error instanceof plugins.AgentPendingInputRejectedError) {
|
|
176
|
+
throw new FlexHarnessSteerRejectedError(error.reason === 'duplicate' ? 'duplicate' : 'not-running', steer.steerId);
|
|
177
|
+
}
|
|
178
|
+
throw error;
|
|
179
|
+
}
|
|
180
|
+
steering.accepted.set(steer.steerId, { prompt, byteSize });
|
|
181
|
+
steering.stored.outstandingPromptBytes += byteSize;
|
|
182
|
+
this.core.emitEvent(run.scopeId, run.stored.session, {
|
|
183
|
+
type: 'prompt.steer.accepted',
|
|
184
|
+
queueId: run.queueId,
|
|
185
|
+
runId: run.runId,
|
|
186
|
+
steerId: steer.steerId,
|
|
187
|
+
});
|
|
188
|
+
return { steerId: steer.steerId, queueId: run.queueId, runId: run.runId };
|
|
189
|
+
}
|
|
190
|
+
async enqueuePromptInternal(scopeId, sessionId, prompt, options, scheduleKey, debounceMs, delegationSeed, admissionSignal, slashCommandAdmission = false) {
|
|
191
|
+
this.core.assertOpen();
|
|
192
|
+
const normalizedPrompt = normalizeFlexPrompt(prompt);
|
|
193
|
+
const normalizedOptions = cloneSerializable(options);
|
|
194
|
+
const byteSize = this.promptAdmissionByteSize(prompt, options, scheduleKey, debounceMs);
|
|
195
|
+
const releasePendingAdmission = this.reservePendingPromptAdmission(byteSize);
|
|
196
|
+
let resolveSettled;
|
|
197
|
+
const pendingOwner = {
|
|
198
|
+
controller: new AbortController(),
|
|
199
|
+
settled: new Promise((resolve) => {
|
|
200
|
+
resolveSettled = resolve;
|
|
201
|
+
}),
|
|
202
|
+
resolveSettled: () => resolveSettled(),
|
|
203
|
+
};
|
|
204
|
+
this.pendingPromptAdmissionOwners.add(pendingOwner);
|
|
205
|
+
const admissionSignals = [
|
|
206
|
+
pendingOwner.controller.signal,
|
|
207
|
+
...(admissionSignal === undefined ? [] : [admissionSignal]),
|
|
208
|
+
];
|
|
209
|
+
let abortAdmission;
|
|
210
|
+
const abortPromise = new Promise((_resolve, reject) => {
|
|
211
|
+
abortAdmission = () => {
|
|
212
|
+
const aborted = admissionSignals.find((signal) => signal.aborted);
|
|
213
|
+
reject(aborted?.reason ?? new FlexHarnessAbortError());
|
|
214
|
+
};
|
|
215
|
+
for (const signal of admissionSignals) {
|
|
216
|
+
signal.addEventListener('abort', abortAdmission, { once: true });
|
|
217
|
+
}
|
|
218
|
+
if (admissionSignals.some((signal) => signal.aborted))
|
|
219
|
+
abortAdmission();
|
|
220
|
+
});
|
|
221
|
+
try {
|
|
222
|
+
const resolved = await Promise.race([this.core.resolveState(scopeId), abortPromise]);
|
|
223
|
+
const state = resolved.state;
|
|
224
|
+
await Promise.race([state.scopeQueue, abortPromise]);
|
|
225
|
+
if (admissionSignal?.aborted) {
|
|
226
|
+
throw admissionSignal.reason ?? new FlexHarnessAbortError();
|
|
227
|
+
}
|
|
228
|
+
this.core.assertStateAcceptingWork(state);
|
|
229
|
+
const stored = this.core.requireSession(state, sessionId);
|
|
230
|
+
this.core.assertSessionWritable(stored);
|
|
231
|
+
const sessionKey = this.core.commands.slashCommandSessionKey(state.storageKey, sessionId);
|
|
232
|
+
const invocationOwner = this.core.commands.slashCommandInvocationContext.getStore();
|
|
233
|
+
if (invocationOwner?.sessionKey === sessionKey) {
|
|
234
|
+
throw this.core.trustInternalError(new FlexHarnessSlashCommandReentryError(sessionId));
|
|
235
|
+
}
|
|
236
|
+
if (!slashCommandAdmission && this.core.commands.activeSlashCommandExecutions.has(sessionKey)) {
|
|
237
|
+
throw new FlexHarnessSessionBusyError(sessionId, 'already has an active slash command execution');
|
|
238
|
+
}
|
|
239
|
+
if (stored.pendingReversion) {
|
|
240
|
+
throw new FlexHarnessSessionBusyError(sessionId, 'has a pending reversion operation');
|
|
241
|
+
}
|
|
242
|
+
if (stored.session.agent !== undefined && delegationSeed === undefined) {
|
|
243
|
+
throw new FlexHarnessValidationError('Subagent sessions can only be prompted through the foreground delegate tool.');
|
|
244
|
+
}
|
|
245
|
+
if (delegationSeed !== undefined) {
|
|
246
|
+
this.core.admission.assertDelegatedRunAdmissionOwnership(delegationSeed, state, stored, scopeId);
|
|
247
|
+
}
|
|
248
|
+
if (stored.outstandingPromptsById.size >= this.core.promptQueueLimits.maxOutstandingPromptsPerSession) {
|
|
249
|
+
throw new FlexHarnessQueueFullError(`Session "${sessionId}" has reached its outstanding prompt limit.`);
|
|
250
|
+
}
|
|
251
|
+
if (stored.outstandingPromptBytes + byteSize
|
|
252
|
+
> this.core.promptQueueLimits.maxOutstandingBytesPerSession) {
|
|
253
|
+
throw new FlexHarnessQueueFullError(`Session "${sessionId}" has reached its outstanding prompt byte limit.`);
|
|
254
|
+
}
|
|
255
|
+
if (scheduleKey
|
|
256
|
+
&& [...stored.outstandingPromptsById.values()]
|
|
257
|
+
.some((entry) => entry.scheduleKey === scheduleKey)) {
|
|
258
|
+
throw new FlexHarnessSessionBusyError(sessionId, `already has scheduled key "${scheduleKey}"`);
|
|
259
|
+
}
|
|
260
|
+
let resolveCompletion;
|
|
261
|
+
let rejectCompletion;
|
|
262
|
+
const completion = new Promise((resolve, reject) => {
|
|
263
|
+
resolveCompletion = resolve;
|
|
264
|
+
rejectCompletion = reject;
|
|
265
|
+
});
|
|
266
|
+
void completion.catch(() => undefined);
|
|
267
|
+
let resolveStarted;
|
|
268
|
+
let rejectStarted;
|
|
269
|
+
const started = new Promise((resolve, reject) => {
|
|
270
|
+
resolveStarted = resolve;
|
|
271
|
+
rejectStarted = reject;
|
|
272
|
+
});
|
|
273
|
+
void started.catch(() => undefined);
|
|
274
|
+
const queued = {
|
|
275
|
+
state,
|
|
276
|
+
stored,
|
|
277
|
+
scopeId,
|
|
278
|
+
scope: delegationSeed === undefined ? resolved.scope.scope : delegationSeed.scope,
|
|
279
|
+
sessionId,
|
|
280
|
+
queueId: plugins.crypto.randomUUID(),
|
|
281
|
+
queueSequence: ++this.promptQueueSequence,
|
|
282
|
+
status: 'queued',
|
|
283
|
+
queuedAt: new Date().toISOString(),
|
|
284
|
+
...(scheduleKey === undefined ? {} : { scheduleKey, debounceMs }),
|
|
285
|
+
prompt: normalizedPrompt,
|
|
286
|
+
options: normalizedOptions,
|
|
287
|
+
...(delegationSeed === undefined ? {} : { delegationSeed }),
|
|
288
|
+
byteSize,
|
|
289
|
+
completion,
|
|
290
|
+
resolveCompletion,
|
|
291
|
+
rejectCompletion,
|
|
292
|
+
started,
|
|
293
|
+
resolveStarted,
|
|
294
|
+
rejectStarted,
|
|
295
|
+
};
|
|
296
|
+
stored.promptQueue.push(queued);
|
|
297
|
+
stored.outstandingPromptsById.set(queued.queueId, queued);
|
|
298
|
+
stored.outstandingPromptBytes += byteSize;
|
|
299
|
+
this.emitPromptQueueEvent(queued, 'prompt.queued');
|
|
300
|
+
this.schedulePromptQueueDrain(state, stored);
|
|
301
|
+
return {
|
|
302
|
+
admission: Object.freeze({ queueId: queued.queueId, completion }),
|
|
303
|
+
started,
|
|
304
|
+
queued,
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
finally {
|
|
308
|
+
for (const signal of admissionSignals) {
|
|
309
|
+
signal.removeEventListener('abort', abortAdmission);
|
|
310
|
+
}
|
|
311
|
+
this.pendingPromptAdmissionOwners.delete(pendingOwner);
|
|
312
|
+
releasePendingAdmission();
|
|
313
|
+
pendingOwner.resolveSettled();
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
reservePendingPromptAdmission(byteSize) {
|
|
317
|
+
if (this.pendingPromptAdmissions >= this.core.promptQueueLimits.maxPendingAdmissions) {
|
|
318
|
+
throw new FlexHarnessQueueFullError('FlexHarness has reached its pending prompt admission limit.');
|
|
319
|
+
}
|
|
320
|
+
if (this.pendingPromptAdmissionBytes + byteSize
|
|
321
|
+
> this.core.promptQueueLimits.maxPendingAdmissionBytes) {
|
|
322
|
+
throw new FlexHarnessQueueFullError('FlexHarness has reached its pending prompt admission byte limit.');
|
|
323
|
+
}
|
|
324
|
+
this.pendingPromptAdmissions++;
|
|
325
|
+
this.pendingPromptAdmissionBytes += byteSize;
|
|
326
|
+
let released = false;
|
|
327
|
+
return () => {
|
|
328
|
+
if (released)
|
|
329
|
+
return;
|
|
330
|
+
released = true;
|
|
331
|
+
this.pendingPromptAdmissions--;
|
|
332
|
+
this.pendingPromptAdmissionBytes -= byteSize;
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
schedulePromptQueueDrain(state, stored) {
|
|
336
|
+
if (stored.promptQueueDrain)
|
|
337
|
+
return;
|
|
338
|
+
let drain;
|
|
339
|
+
drain = Promise.resolve()
|
|
340
|
+
.then(() => this.drainPromptQueue(state, stored))
|
|
341
|
+
.finally(() => {
|
|
342
|
+
if (stored.promptQueueDrain === drain)
|
|
343
|
+
delete stored.promptQueueDrain;
|
|
344
|
+
if (stored.promptQueue.length > 0
|
|
345
|
+
&& !state.activeRuns.has(stored.session.sessionId)
|
|
346
|
+
&& state.lifecycle === 'active'
|
|
347
|
+
&& state.sessions.get(stored.session.sessionId) === stored)
|
|
348
|
+
this.schedulePromptQueueDrain(state, stored);
|
|
349
|
+
});
|
|
350
|
+
stored.promptQueueDrain = drain;
|
|
351
|
+
void drain.catch(() => undefined);
|
|
352
|
+
}
|
|
353
|
+
async drainPromptQueue(state, stored) {
|
|
354
|
+
while (state.lifecycle === 'active'
|
|
355
|
+
&& state.sessions.get(stored.session.sessionId) === stored
|
|
356
|
+
&& !state.activeRuns.has(stored.session.sessionId)) {
|
|
357
|
+
const queued = stored.promptQueue.shift();
|
|
358
|
+
if (!queued)
|
|
359
|
+
return;
|
|
360
|
+
if (stored.outstandingPromptsById.get(queued.queueId) !== queued)
|
|
361
|
+
continue;
|
|
362
|
+
queued.status = 'starting';
|
|
363
|
+
queued.runId = plugins.crypto.randomUUID();
|
|
364
|
+
queued.startedAt = new Date().toISOString();
|
|
365
|
+
const run = this.core.runs.createActiveRun(queued);
|
|
366
|
+
state.activeRuns.set(queued.sessionId, run);
|
|
367
|
+
try {
|
|
368
|
+
await this.promoteQueuedPrompt(queued, run);
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
catch (error) {
|
|
372
|
+
if (state.activeRuns.get(queued.sessionId) === run)
|
|
373
|
+
state.activeRuns.delete(queued.sessionId);
|
|
374
|
+
const cancellation = isAbortError(error);
|
|
375
|
+
this.finishQueuedPrompt(queued, cancellation ? 'cancelled' : 'failed', error);
|
|
376
|
+
if (state.lifecycle !== 'active')
|
|
377
|
+
return;
|
|
378
|
+
}
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
assertPromptPromotion(queued, run) {
|
|
382
|
+
if (run.controller.signal.aborted) {
|
|
383
|
+
throw run.controller.signal.reason ?? new FlexHarnessAbortError();
|
|
384
|
+
}
|
|
385
|
+
this.core.assertStateAcceptingWork(run.state);
|
|
386
|
+
if (run.state.sessions.get(run.sessionId) !== run.stored
|
|
387
|
+
|| run.stored.outstandingPromptsById.get(run.queueId) !== queued
|
|
388
|
+
|| run.state.activeRuns.get(run.sessionId) !== run)
|
|
389
|
+
throw this.core.trustInternalError(new FlexHarnessAbortError('The prompt was retired during admission.'));
|
|
390
|
+
if (queued.delegationSeed) {
|
|
391
|
+
this.core.admission.assertDelegatedRunAdmissionOwnership(queued.delegationSeed, run.state, run.stored, run.scopeId);
|
|
392
|
+
if (run.queueId !== queued.queueId
|
|
393
|
+
|| run.runId !== queued.runId
|
|
394
|
+
|| run.sessionId !== queued.delegationSeed.sessionId) {
|
|
395
|
+
throw this.core.trustInternalError(new FlexHarnessAbortError('The delegated prompt lost its exact child run ownership.'));
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
async promoteQueuedPrompt(queued, run) {
|
|
400
|
+
const prompt = queued.prompt;
|
|
401
|
+
const options = queued.options;
|
|
402
|
+
let projectionReserved = false;
|
|
403
|
+
// Open from the reservation until its messages are announced or rolled back.
|
|
404
|
+
let closeReservationPublication = () => undefined;
|
|
405
|
+
try {
|
|
406
|
+
try {
|
|
407
|
+
this.assertPromptPromotion(queued, run);
|
|
408
|
+
await this.core.admission.acquireDelegatedRunAdmission(queued, run);
|
|
409
|
+
this.assertPromptPromotion(queued, run);
|
|
410
|
+
await this.core.reversions.commitRevertedBranch(run.state, run.stored, run.scopeId, run.scope);
|
|
411
|
+
this.assertPromptPromotion(queued, run);
|
|
412
|
+
const generationPrompt = cloneSerializable(prompt.modelMessage.content);
|
|
413
|
+
this.assertPromptPromotion(queued, run);
|
|
414
|
+
run.transaction = await this.core.compaction.withRunCompactorContext(run, () => run.stored.agentSession.beginGeneration(generationPrompt, { generationId: run.runId }));
|
|
415
|
+
this.assertPromptPromotion(queued, run);
|
|
416
|
+
const reservation = this.core.runs.createReservation(run, prompt);
|
|
417
|
+
closeReservationPublication = this.core.openPublication(run.state, run.sessionId);
|
|
418
|
+
run.metricsOperation = createSessionMetricsOperation(run.runId, 'generation');
|
|
419
|
+
await this.core.mutateProjection(run.state, run.stored, () => {
|
|
420
|
+
if (run.stored.metrics.pendingGenerationId !== undefined) {
|
|
421
|
+
throw new Error('Session metrics already owns a generation.');
|
|
422
|
+
}
|
|
423
|
+
run.stored.metrics.pendingGenerationId = run.runId;
|
|
424
|
+
run.stored.messages.push(reservation.userMessage, reservation.assistantMessage);
|
|
425
|
+
if (run.stored.session.agent === undefined) {
|
|
426
|
+
this.core.reversions.pruneReversionState(run.stored, true);
|
|
427
|
+
const captureId = this.core.turnReversionProvider
|
|
428
|
+
? this.core.reversions.reversionId('capture', run.state.storageKey, run.sessionId, run.runId)
|
|
429
|
+
: undefined;
|
|
430
|
+
const protocolVersion = this.core.reversions.reversionProviderProtocolVersion() ?? 1;
|
|
431
|
+
run.stored.reversionSegments.push({
|
|
432
|
+
runId: run.runId,
|
|
433
|
+
userMessageId: reservation.userMessage.messageId,
|
|
434
|
+
status: 'capturing',
|
|
435
|
+
contextAvailable: true,
|
|
436
|
+
eventIds: [],
|
|
437
|
+
workspaceCaptured: captureId !== undefined,
|
|
438
|
+
protocolVersion,
|
|
439
|
+
provenance: captureId === undefined ? 'transcript' : 'workspace',
|
|
440
|
+
...(captureId === undefined ? {} : { disposition: 'pending' }),
|
|
441
|
+
...(captureId === undefined ? {} : { captureId }),
|
|
442
|
+
});
|
|
443
|
+
if (captureId) {
|
|
444
|
+
run.stored.pendingReversion = {
|
|
445
|
+
kind: 'capture',
|
|
446
|
+
runId: run.runId,
|
|
447
|
+
captureId,
|
|
448
|
+
state: 'preparing',
|
|
449
|
+
protocolVersion,
|
|
450
|
+
};
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
});
|
|
454
|
+
projectionReserved = true;
|
|
455
|
+
run.reservedUserMessage = publicSnapshot(reservation.userMessage);
|
|
456
|
+
run.reservedAssistantMessage = publicSnapshot(reservation.assistantMessage);
|
|
457
|
+
this.assertPromptPromotion(queued, run);
|
|
458
|
+
await this.core.mutateScope(run.state, () => {
|
|
459
|
+
if (run.controller.signal.aborted) {
|
|
460
|
+
throw run.controller.signal.reason ?? new FlexHarnessAbortError();
|
|
461
|
+
}
|
|
462
|
+
if (run.state.tombstones.has(run.sessionId) || run.state.sessions.get(run.sessionId) !== run.stored) {
|
|
463
|
+
throw new FlexHarnessAbortError('The session was deleted during prompt admission.');
|
|
464
|
+
}
|
|
465
|
+
run.stored.session.status = run.scheduleKey ? 'scheduled' : 'running';
|
|
466
|
+
run.stored.session.activity = {
|
|
467
|
+
runId: run.runId,
|
|
468
|
+
status: run.scheduleKey ? 'scheduled' : 'running',
|
|
469
|
+
startedAt: reservation.userMessage.createdAt,
|
|
470
|
+
};
|
|
471
|
+
run.stored.session.updatedAt = reservation.userMessage.createdAt;
|
|
472
|
+
});
|
|
473
|
+
}
|
|
474
|
+
catch (error) {
|
|
475
|
+
if (containsStoreCommitUncertainty(error))
|
|
476
|
+
run.state.lifecycle = 'fenced';
|
|
477
|
+
const safeError = this.core.projectExternalError(run, error, projectionReserved ? 'persistence' : 'agentSession');
|
|
478
|
+
let cleanupErrors = [];
|
|
479
|
+
let cleanupFailure;
|
|
480
|
+
try {
|
|
481
|
+
await this.core.admission.closeRunDelegatedRunAdmission(run, !run.delegatedRunAdmissionOwner?.acquisitionDetached);
|
|
482
|
+
}
|
|
483
|
+
catch (closeError) {
|
|
484
|
+
cleanupErrors.push(closeError);
|
|
485
|
+
}
|
|
486
|
+
try {
|
|
487
|
+
cleanupErrors.push(...await this.core.runs.rollbackAdmission(run, projectionReserved, safeError));
|
|
488
|
+
}
|
|
489
|
+
catch (rollbackError) {
|
|
490
|
+
cleanupFailure = rollbackError;
|
|
491
|
+
}
|
|
492
|
+
if (cleanupFailure !== undefined && cleanupErrors.length > 0) {
|
|
493
|
+
cleanupFailure = combineErrors([cleanupFailure, ...cleanupErrors]);
|
|
494
|
+
}
|
|
495
|
+
if (run.state.lifecycle === 'fenced' && cleanupFailure === undefined) {
|
|
496
|
+
const combined = combineErrors([safeError, ...cleanupErrors]);
|
|
497
|
+
try {
|
|
498
|
+
await this.core.lifecycle.fenceNamespace(run.state, run, combined);
|
|
499
|
+
}
|
|
500
|
+
catch (fenceError) {
|
|
501
|
+
cleanupFailure = fenceError;
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
const rejection = cleanupFailure
|
|
505
|
+
?? (cleanupErrors.length > 0 ? combineErrors([safeError, ...cleanupErrors]) : safeError);
|
|
506
|
+
throw rejection;
|
|
507
|
+
}
|
|
508
|
+
const runType = run.scheduleKey ? 'run.scheduled' : 'run.started';
|
|
509
|
+
this.core.emitEvent(run.scopeId, run.stored.session, {
|
|
510
|
+
type: runType,
|
|
511
|
+
runId: run.runId,
|
|
512
|
+
messageId: run.userMessageId,
|
|
513
|
+
session: publicSnapshot(run.stored.session),
|
|
514
|
+
});
|
|
515
|
+
for (const message of [run.reservedUserMessage, run.reservedAssistantMessage]) {
|
|
516
|
+
this.core.emitEvent(run.scopeId, run.stored.session, {
|
|
517
|
+
type: 'message.created',
|
|
518
|
+
runId: run.runId,
|
|
519
|
+
messageId: message.messageId,
|
|
520
|
+
message,
|
|
521
|
+
});
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
finally {
|
|
525
|
+
closeReservationPublication();
|
|
526
|
+
}
|
|
527
|
+
queued.status = run.scheduleKey ? 'scheduled' : 'starting';
|
|
528
|
+
this.emitPromptQueueEvent(queued, 'prompt.started');
|
|
529
|
+
queued.resolveStarted(Object.freeze({
|
|
530
|
+
queueId: queued.queueId,
|
|
531
|
+
runId: run.runId,
|
|
532
|
+
completion: queued.completion,
|
|
533
|
+
}));
|
|
534
|
+
run.phase = run.scheduleKey ? 'scheduled' : 'running';
|
|
535
|
+
const generateOptions = {
|
|
536
|
+
transaction: run.transaction,
|
|
537
|
+
abort: run.controller.signal,
|
|
538
|
+
stop: run.stop.signal,
|
|
539
|
+
prepare: (context) => this.core.runs.prepareGeneration(run, options, context.abortSignal),
|
|
540
|
+
pendingInput: run.steering.input,
|
|
541
|
+
activateOnBackgroundJobs: true,
|
|
542
|
+
onCacheDispatch: (dispatch) => { run.cacheDispatch = dispatch; },
|
|
543
|
+
onInputApplied: (input) => this.core.runs.applyRunSteer(run, input),
|
|
544
|
+
beforeFinish: (context) => this.core.subagentTasks.awaitNextBackgroundSubagent(run, context.abortSignal),
|
|
545
|
+
};
|
|
546
|
+
const generation = this.core.compaction.withRunCompactorContext(run, () => run.scheduleKey
|
|
547
|
+
? run.stored.agentSession.scheduleGenerate({
|
|
548
|
+
key: run.scheduleKey,
|
|
549
|
+
debounceMs: run.debounceMs,
|
|
550
|
+
...generateOptions,
|
|
551
|
+
})
|
|
552
|
+
: run.stored.agentSession.generate(generateOptions));
|
|
553
|
+
const execution = this.core.runs.executeRun(run, generation).then((result) => this.finishQueuedPrompt(queued, 'completed', undefined, result), (error) => this.finishQueuedPrompt(queued, isAbortError(error) ? 'cancelled' : 'failed', error)).finally(() => this.schedulePromptQueueDrain(run.state, run.stored));
|
|
554
|
+
void execution.catch(() => undefined);
|
|
555
|
+
}
|
|
556
|
+
projectPromptQueueEntry(queued) {
|
|
557
|
+
return {
|
|
558
|
+
queueId: queued.queueId,
|
|
559
|
+
queueSequence: queued.queueSequence,
|
|
560
|
+
scopeId: queued.scopeId,
|
|
561
|
+
sessionId: queued.sessionId,
|
|
562
|
+
status: queued.status,
|
|
563
|
+
queuedAt: queued.queuedAt,
|
|
564
|
+
...(queued.runId ? { runId: queued.runId } : {}),
|
|
565
|
+
...(queued.scheduleKey ? { scheduleKey: queued.scheduleKey } : {}),
|
|
566
|
+
...(queued.startedAt ? { startedAt: queued.startedAt } : {}),
|
|
567
|
+
};
|
|
568
|
+
}
|
|
569
|
+
promptQueueEntry(stored, queueId) {
|
|
570
|
+
const outstanding = stored.outstandingPromptsById.get(queueId);
|
|
571
|
+
return outstanding
|
|
572
|
+
? this.projectPromptQueueEntry(outstanding)
|
|
573
|
+
: stored.terminalPromptQueueEntries.get(queueId);
|
|
574
|
+
}
|
|
575
|
+
emitPromptQueueEvent(queued, type, entry = this.projectPromptQueueEntry(queued)) {
|
|
576
|
+
this.core.emitEvent(queued.scopeId, queued.stored.session, {
|
|
577
|
+
type,
|
|
578
|
+
queueId: queued.queueId,
|
|
579
|
+
...(entry.runId ? { runId: entry.runId } : {}),
|
|
580
|
+
entry: publicSnapshot(entry),
|
|
581
|
+
});
|
|
582
|
+
}
|
|
583
|
+
finishQueuedPrompt(queued, status, error, result) {
|
|
584
|
+
const stored = queued.stored;
|
|
585
|
+
if (stored.outstandingPromptsById.get(queued.queueId) !== queued)
|
|
586
|
+
return;
|
|
587
|
+
stored.promptQueue = stored.promptQueue.filter((entry) => entry !== queued);
|
|
588
|
+
stored.outstandingPromptsById.delete(queued.queueId);
|
|
589
|
+
stored.outstandingPromptBytes = Math.max(0, stored.outstandingPromptBytes - queued.byteSize);
|
|
590
|
+
delete queued.prompt;
|
|
591
|
+
delete queued.options;
|
|
592
|
+
delete queued.delegationSeed;
|
|
593
|
+
const steering = queued.steering === undefined ? undefined : this.core.runs.closeRunSteering(queued.steering);
|
|
594
|
+
const terminal = {
|
|
595
|
+
...this.projectPromptQueueEntry(queued),
|
|
596
|
+
status,
|
|
597
|
+
finishedAt: new Date().toISOString(),
|
|
598
|
+
...(error === undefined ? {} : { error: errorToInfo(error) }),
|
|
599
|
+
keptInContext: steering?.keptInContext ?? false,
|
|
600
|
+
...(steering === undefined || steering.unappliedSteerIds.length === 0
|
|
601
|
+
? {}
|
|
602
|
+
: { unappliedSteerIds: [...steering.unappliedSteerIds] }),
|
|
603
|
+
};
|
|
604
|
+
stored.terminalPromptQueueEntries.set(queued.queueId, terminal);
|
|
605
|
+
while (stored.terminalPromptQueueEntries.size
|
|
606
|
+
> this.core.promptQueueLimits.maxTerminalEntriesPerSession) {
|
|
607
|
+
const oldest = stored.terminalPromptQueueEntries.keys().next().value;
|
|
608
|
+
if (!oldest)
|
|
609
|
+
break;
|
|
610
|
+
stored.terminalPromptQueueEntries.delete(oldest);
|
|
611
|
+
}
|
|
612
|
+
this.emitPromptQueueEvent(queued, 'prompt.finished', terminal);
|
|
613
|
+
if (status === 'completed') {
|
|
614
|
+
if (!result)
|
|
615
|
+
throw new Error('A completed queued prompt requires a result.');
|
|
616
|
+
queued.resolveCompletion(result);
|
|
617
|
+
}
|
|
618
|
+
else {
|
|
619
|
+
const rejection = error ?? this.core.trustInternalError(new FlexHarnessAbortError());
|
|
620
|
+
queued.rejectStarted(rejection);
|
|
621
|
+
queued.rejectCompletion(rejection);
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
cancelQueuedPrompt(queued, reason, context) {
|
|
625
|
+
if (queued.stored.outstandingPromptsById.get(queued.queueId) !== queued)
|
|
626
|
+
return false;
|
|
627
|
+
if (queued.status === 'queued') {
|
|
628
|
+
this.finishQueuedPrompt(queued, 'cancelled', reason);
|
|
629
|
+
this.schedulePromptQueueDrain(queued.state, queued.stored);
|
|
630
|
+
return true;
|
|
631
|
+
}
|
|
632
|
+
const run = queued.state.activeRuns.get(queued.sessionId);
|
|
633
|
+
if (!run || run.queueId !== queued.queueId)
|
|
634
|
+
return false;
|
|
635
|
+
if (run.phase === 'finalizing' || run.phase === 'promoting')
|
|
636
|
+
return false;
|
|
637
|
+
this.core.runs.cancelRun(run, reason, context);
|
|
638
|
+
return true;
|
|
639
|
+
}
|
|
640
|
+
cancelStoredPromptQueue(stored, reason, excludedQueueId, context) {
|
|
641
|
+
for (const queued of [...stored.outstandingPromptsById.values()]) {
|
|
642
|
+
if (queued.queueId === excludedQueueId)
|
|
643
|
+
continue;
|
|
644
|
+
this.cancelQueuedPrompt(queued, reason, context);
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
purgeStoredPromptQueue(stored) {
|
|
648
|
+
for (const queued of stored.outstandingPromptsById.values()) {
|
|
649
|
+
delete queued.prompt;
|
|
650
|
+
delete queued.options;
|
|
651
|
+
delete queued.delegationSeed;
|
|
652
|
+
}
|
|
653
|
+
stored.promptQueue.length = 0;
|
|
654
|
+
stored.outstandingPromptsById.clear();
|
|
655
|
+
stored.terminalPromptQueueEntries.clear();
|
|
656
|
+
stored.outstandingPromptBytes = 0;
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5mbGV4aGFybmVzcy5wcm9tcHRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5mbGV4aGFybmVzcy5wcm9tcHRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsd0JBQXdCLEVBQ3hCLHlCQUF5QixFQUN6QiwyQkFBMkIsRUFDM0IsbUNBQW1DLEVBQ25DLDZCQUE2QixFQUM3QixvQ0FBb0MsRUFDcEMsMEJBQTBCLEVBQzFCLFdBQVcsR0FDWixNQUFNLGFBQWEsQ0FBQztBQWNyQixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsbUJBQW1CLEVBQThCLE1BQU0sbUJBQW1CLENBQUM7QUFDcEYsT0FBTyxFQUFFLFNBQVMsRUFBRSxjQUFjLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMzRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNsRixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQVMxRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBR3JFLE1BQU0scUJBQXFCLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBRWxELFNBQVMsOEJBQThCLENBQUMsS0FBYyxFQUFFLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBVztJQUMvRSxJQUFJLEtBQUssWUFBWSxvQ0FBb0M7UUFBRSxPQUFPLElBQUksQ0FBQztJQUN2RSxJQUFJLENBQUMsQ0FBQyxLQUFLLFlBQVksS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJ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
|