@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.
Files changed (135) hide show
  1. package/dist_ts/00_commitinfo_data.js +2 -2
  2. package/dist_ts/classes.codesandbox.js +1 -1
  3. package/dist_ts/classes.flexharness.admission.d.ts +17 -0
  4. package/dist_ts/classes.flexharness.admission.js +263 -0
  5. package/dist_ts/classes.flexharness.callbacks.d.ts +38 -0
  6. package/dist_ts/classes.flexharness.callbacks.js +313 -0
  7. package/dist_ts/classes.flexharness.compaction.d.ts +25 -0
  8. package/dist_ts/classes.flexharness.compaction.js +87 -0
  9. package/dist_ts/classes.flexharness.configurations.d.ts +11 -0
  10. package/dist_ts/classes.flexharness.configurations.js +137 -0
  11. package/dist_ts/classes.flexharness.core.d.ts +143 -0
  12. package/dist_ts/classes.flexharness.core.js +1538 -0
  13. package/dist_ts/classes.flexharness.d.ts +2 -437
  14. package/dist_ts/classes.flexharness.deletion.d.ts +31 -0
  15. package/dist_ts/classes.flexharness.deletion.js +396 -0
  16. package/dist_ts/classes.flexharness.imports.d.ts +24 -0
  17. package/dist_ts/classes.flexharness.imports.js +345 -0
  18. package/dist_ts/classes.flexharness.js +119 -9776
  19. package/dist_ts/classes.flexharness.lifecycle.d.ts +47 -0
  20. package/dist_ts/classes.flexharness.lifecycle.js +625 -0
  21. package/dist_ts/classes.flexharness.permissions.d.ts +19 -0
  22. package/dist_ts/classes.flexharness.permissions.js +450 -0
  23. package/dist_ts/classes.flexharness.projects.d.ts +55 -0
  24. package/dist_ts/classes.flexharness.projects.js +575 -0
  25. package/dist_ts/classes.flexharness.prompts.d.ts +44 -0
  26. package/dist_ts/classes.flexharness.prompts.js +659 -0
  27. package/dist_ts/classes.flexharness.providers.d.ts +18 -0
  28. package/dist_ts/classes.flexharness.providers.js +267 -0
  29. package/dist_ts/classes.flexharness.results.d.ts +26 -0
  30. package/dist_ts/classes.flexharness.results.js +89 -0
  31. package/dist_ts/classes.flexharness.reversions.d.ts +52 -0
  32. package/dist_ts/classes.flexharness.reversions.js +1306 -0
  33. package/dist_ts/classes.flexharness.runs.d.ts +63 -0
  34. package/dist_ts/classes.flexharness.runs.js +1058 -0
  35. package/dist_ts/classes.flexharness.sessions.d.ts +20 -0
  36. package/dist_ts/classes.flexharness.sessions.js +381 -0
  37. package/dist_ts/classes.flexharness.slashcommands.d.ts +40 -0
  38. package/dist_ts/classes.flexharness.slashcommands.js +458 -0
  39. package/dist_ts/classes.flexharness.subagents.d.ts +31 -0
  40. package/dist_ts/classes.flexharness.subagents.js +690 -0
  41. package/dist_ts/classes.flexharness.tooldispatch.d.ts +53 -0
  42. package/dist_ts/classes.flexharness.tooldispatch.js +418 -0
  43. package/dist_ts/classes.stores.js +1 -1
  44. package/dist_ts/classes.toolcatalog.js +1 -1
  45. package/dist_ts/errors.js +1 -1
  46. package/dist_ts/functions.toolpermissions.js +1 -1
  47. package/dist_ts/interfaces.d.ts +3 -3
  48. package/dist_ts/interfaces.flexharness.d.ts +455 -0
  49. package/dist_ts/interfaces.flexharness.js +2 -0
  50. package/dist_ts/utils.flexharness.d.ts +19 -0
  51. package/dist_ts/utils.flexharness.js +83 -0
  52. package/dist_ts/utils.harnessoptions.js +1 -1
  53. package/dist_ts/utils.json.js +1 -1
  54. package/dist_ts/utils.schemadeclarations.js +1 -1
  55. package/dist_ts/utils.sessionimport.js +1 -1
  56. package/dist_ts/utils.sessionmetrics.d.ts +1 -1
  57. package/dist_ts_chat/classes.chatsession.js +1 -1
  58. package/dist_ts_chat_harness/classes.transcript.js +1 -1
  59. package/dist_ts_chat_harness/functions.intents.js +1 -1
  60. package/dist_ts_chat_harness/functions.mapping.d.ts +1 -1
  61. package/dist_ts_chat_harness/functions.mapping.js +1 -1
  62. package/dist_ts_chat_harness_server/classes.chathub.d.ts +18 -7
  63. package/dist_ts_chat_harness_server/classes.chathub.js +65 -62
  64. package/dist_ts_chat_harness_server/classes.chatsubscription.d.ts +5 -3
  65. package/dist_ts_chat_harness_server/classes.chatsubscription.js +4 -4
  66. package/dist_ts_chat_harness_server/classes.scopedirectory.d.ts +17 -0
  67. package/dist_ts_chat_harness_server/classes.scopedirectory.js +49 -0
  68. package/dist_ts_chat_harness_server/classes.sessionlists.d.ts +3 -5
  69. package/dist_ts_chat_harness_server/classes.sessionlists.js +11 -12
  70. package/dist_ts_chat_harness_server/classes.turngate.d.ts +8 -2
  71. package/dist_ts_chat_harness_server/classes.turngate.js +22 -21
  72. package/dist_ts_chat_harness_server/functions.errorprojector.js +1 -1
  73. package/dist_ts_chat_harness_server/index.d.ts +3 -2
  74. package/dist_ts_chat_harness_server/index.js +3 -2
  75. package/dist_ts_chat_harness_server/interfaces.d.ts +35 -2
  76. package/dist_ts_chat_harness_server/plugins.d.ts +1 -1
  77. package/dist_ts_chat_harness_typedsocket/classes.clienttransport.d.ts +28 -3
  78. package/dist_ts_chat_harness_typedsocket/classes.clienttransport.js +71 -15
  79. package/dist_ts_chat_harness_typedsocket/classes.serverbinding.d.ts +5 -3
  80. package/dist_ts_chat_harness_typedsocket/classes.serverbinding.js +79 -16
  81. package/dist_ts_chat_harness_typedsocket/index.d.ts +2 -2
  82. package/dist_ts_chat_harness_typedsocket/index.js +1 -1
  83. package/dist_ts_chat_harness_typedsocket/interfaces.requests.d.ts +20 -11
  84. package/dist_ts_chat_web/flexchat-input.js +1 -1
  85. package/dist_ts_chat_web/flexchat-message.js +1 -1
  86. package/dist_ts_chat_web/flexchat-window.js +1 -1
  87. package/dist_ts_compaction/smartagent.compaction.js +1 -1
  88. package/dist_ts_kvm/ocr.js +1 -1
  89. package/dist_ts_ocr/classes.imageocr.js +1 -1
  90. package/dist_ts_ocr/ocr.mistral.js +1 -1
  91. package/dist_ts_stores_nosqldb/classes.nosqldbstores.js +1 -1
  92. package/dist_ts_tools/tool.browser.js +1 -1
  93. package/dist_ts_tools/tool.filesystem.js +1 -1
  94. package/dist_ts_tools/tool.shell.js +1 -1
  95. package/dist_ts_tools_node/tool.context.js +1 -1
  96. package/dist_ts_typedrequest/catalog.d.ts +2 -2
  97. package/dist_ts_typedrequest/catalog.js +1 -1
  98. package/package.json +3 -3
  99. package/ts/00_commitinfo_data.ts +1 -1
  100. package/ts/classes.flexharness.admission.ts +331 -0
  101. package/ts/classes.flexharness.callbacks.ts +352 -0
  102. package/ts/classes.flexharness.compaction.ts +167 -0
  103. package/ts/classes.flexharness.configurations.ts +167 -0
  104. package/ts/classes.flexharness.core.ts +1830 -0
  105. package/ts/classes.flexharness.deletion.ts +616 -0
  106. package/ts/classes.flexharness.imports.ts +414 -0
  107. package/ts/classes.flexharness.lifecycle.ts +786 -0
  108. package/ts/classes.flexharness.permissions.ts +535 -0
  109. package/ts/classes.flexharness.projects.ts +1006 -0
  110. package/ts/classes.flexharness.prompts.ts +857 -0
  111. package/ts/classes.flexharness.providers.ts +322 -0
  112. package/ts/classes.flexharness.results.ts +98 -0
  113. package/ts/classes.flexharness.reversions.ts +1684 -0
  114. package/ts/classes.flexharness.runs.ts +1204 -0
  115. package/ts/classes.flexharness.sessions.ts +483 -0
  116. package/ts/classes.flexharness.slashcommands.ts +705 -0
  117. package/ts/classes.flexharness.subagents.ts +860 -0
  118. package/ts/classes.flexharness.tooldispatch.ts +475 -0
  119. package/ts/classes.flexharness.ts +147 -12567
  120. package/ts/interfaces.flexharness.ts +517 -0
  121. package/ts/utils.flexharness.ts +121 -0
  122. package/ts_chat_harness_server/classes.chathub.ts +68 -61
  123. package/ts_chat_harness_server/classes.chatsubscription.ts +7 -5
  124. package/ts_chat_harness_server/classes.scopedirectory.ts +67 -0
  125. package/ts_chat_harness_server/classes.sessionlists.ts +11 -19
  126. package/ts_chat_harness_server/classes.turngate.ts +28 -21
  127. package/ts_chat_harness_server/index.ts +4 -5
  128. package/ts_chat_harness_server/interfaces.ts +35 -2
  129. package/ts_chat_harness_server/plugins.ts +0 -3
  130. package/ts_chat_harness_server/readme.md +6 -4
  131. package/ts_chat_harness_typedsocket/classes.clienttransport.ts +92 -23
  132. package/ts_chat_harness_typedsocket/classes.serverbinding.ts +88 -16
  133. package/ts_chat_harness_typedsocket/index.ts +4 -2
  134. package/ts_chat_harness_typedsocket/interfaces.requests.ts +15 -11
  135. 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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