@modelprofile.com/flexharness 10.24.0 → 10.24.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/classes.flexharness.admission.d.ts +17 -0
  3. package/dist_ts/classes.flexharness.admission.js +263 -0
  4. package/dist_ts/classes.flexharness.callbacks.d.ts +38 -0
  5. package/dist_ts/classes.flexharness.callbacks.js +313 -0
  6. package/dist_ts/classes.flexharness.compaction.d.ts +25 -0
  7. package/dist_ts/classes.flexharness.compaction.js +87 -0
  8. package/dist_ts/classes.flexharness.configurations.d.ts +11 -0
  9. package/dist_ts/classes.flexharness.configurations.js +137 -0
  10. package/dist_ts/classes.flexharness.core.d.ts +143 -0
  11. package/dist_ts/classes.flexharness.core.js +1538 -0
  12. package/dist_ts/classes.flexharness.d.ts +2 -437
  13. package/dist_ts/classes.flexharness.deletion.d.ts +31 -0
  14. package/dist_ts/classes.flexharness.deletion.js +396 -0
  15. package/dist_ts/classes.flexharness.imports.d.ts +24 -0
  16. package/dist_ts/classes.flexharness.imports.js +345 -0
  17. package/dist_ts/classes.flexharness.js +119 -9776
  18. package/dist_ts/classes.flexharness.lifecycle.d.ts +47 -0
  19. package/dist_ts/classes.flexharness.lifecycle.js +625 -0
  20. package/dist_ts/classes.flexharness.permissions.d.ts +19 -0
  21. package/dist_ts/classes.flexharness.permissions.js +450 -0
  22. package/dist_ts/classes.flexharness.projects.d.ts +55 -0
  23. package/dist_ts/classes.flexharness.projects.js +575 -0
  24. package/dist_ts/classes.flexharness.prompts.d.ts +44 -0
  25. package/dist_ts/classes.flexharness.prompts.js +659 -0
  26. package/dist_ts/classes.flexharness.providers.d.ts +18 -0
  27. package/dist_ts/classes.flexharness.providers.js +267 -0
  28. package/dist_ts/classes.flexharness.results.d.ts +26 -0
  29. package/dist_ts/classes.flexharness.results.js +89 -0
  30. package/dist_ts/classes.flexharness.reversions.d.ts +52 -0
  31. package/dist_ts/classes.flexharness.reversions.js +1306 -0
  32. package/dist_ts/classes.flexharness.runs.d.ts +63 -0
  33. package/dist_ts/classes.flexharness.runs.js +1058 -0
  34. package/dist_ts/classes.flexharness.sessions.d.ts +20 -0
  35. package/dist_ts/classes.flexharness.sessions.js +381 -0
  36. package/dist_ts/classes.flexharness.slashcommands.d.ts +40 -0
  37. package/dist_ts/classes.flexharness.slashcommands.js +458 -0
  38. package/dist_ts/classes.flexharness.subagents.d.ts +31 -0
  39. package/dist_ts/classes.flexharness.subagents.js +690 -0
  40. package/dist_ts/classes.flexharness.tooldispatch.d.ts +53 -0
  41. package/dist_ts/classes.flexharness.tooldispatch.js +418 -0
  42. package/dist_ts/interfaces.flexharness.d.ts +455 -0
  43. package/dist_ts/interfaces.flexharness.js +2 -0
  44. package/dist_ts/utils.flexharness.d.ts +19 -0
  45. package/dist_ts/utils.flexharness.js +83 -0
  46. package/package.json +3 -3
  47. package/ts/00_commitinfo_data.ts +1 -1
  48. package/ts/classes.flexharness.admission.ts +331 -0
  49. package/ts/classes.flexharness.callbacks.ts +352 -0
  50. package/ts/classes.flexharness.compaction.ts +167 -0
  51. package/ts/classes.flexharness.configurations.ts +167 -0
  52. package/ts/classes.flexharness.core.ts +1830 -0
  53. package/ts/classes.flexharness.deletion.ts +616 -0
  54. package/ts/classes.flexharness.imports.ts +414 -0
  55. package/ts/classes.flexharness.lifecycle.ts +786 -0
  56. package/ts/classes.flexharness.permissions.ts +535 -0
  57. package/ts/classes.flexharness.projects.ts +1006 -0
  58. package/ts/classes.flexharness.prompts.ts +857 -0
  59. package/ts/classes.flexharness.providers.ts +322 -0
  60. package/ts/classes.flexharness.results.ts +98 -0
  61. package/ts/classes.flexharness.reversions.ts +1684 -0
  62. package/ts/classes.flexharness.runs.ts +1204 -0
  63. package/ts/classes.flexharness.sessions.ts +483 -0
  64. package/ts/classes.flexharness.slashcommands.ts +705 -0
  65. package/ts/classes.flexharness.subagents.ts +860 -0
  66. package/ts/classes.flexharness.tooldispatch.ts +475 -0
  67. package/ts/classes.flexharness.ts +147 -12567
  68. package/ts/interfaces.flexharness.ts +517 -0
  69. package/ts/utils.flexharness.ts +121 -0
@@ -0,0 +1,1306 @@
1
+ import * as plugins from './plugins.js';
2
+ import { FlexHarnessAbortError, FlexHarnessSessionBusyError, FlexHarnessSlashCommandReentryError, FlexHarnessSlashCommandUnavailableError, FlexHarnessValidationError, } from './errors.js';
3
+ import { FLEX_REVERSION_MAX_AFFECTED_WORKSPACES, FLEX_REVERSION_REASON_CODE_MAX_BYTES, FLEX_REVERSION_REFERENCE_MAX_BYTES, FLEX_REVERSION_WORKSPACE_ID_MAX_BYTES, FLEX_REVERSION_WORKSPACE_LABEL_MAX_BYTES, } from './interfaces.js';
4
+ import { cloneSerializable, normalizeJsonValue } from './utils.json.js';
5
+ import { publicSnapshot } from './utils.transfer.js';
6
+ import { slashCommandSessionUnavailableReason, requireSessionGeneration, sha256Hex, combineErrors, } from './utils.flexharness.js';
7
+ /** Turn reversion: capture, undo and redo, and the release of reversion state. */
8
+ export class FlexHarnessReversions {
9
+ core;
10
+ constructor(core) {
11
+ this.core = core;
12
+ }
13
+ async getSessionReversionInfo(scopeId, sessionId) {
14
+ const { state } = await this.core.resolveState(scopeId);
15
+ const stored = this.core.requireSession(state, sessionId);
16
+ await stored.projectionQueue;
17
+ this.core.assertStateAcceptingWork(state);
18
+ await this.reconcileContextAvailability(state, stored);
19
+ const unavailableReason = await this.reversionUnavailableReason(state, stored);
20
+ const groups = this.reversionGroups(stored);
21
+ const undo = this.reversionUnit(stored, 'undo');
22
+ const redo = this.reversionUnit(stored, 'redo');
23
+ const isAvailable = (unit) => Boolean(!unavailableReason
24
+ && unit
25
+ && unit.target.contextAvailable
26
+ && !unit.segments.some((segment) => segment.provenance === 'workspace'
27
+ && segment.disposition === 'revertible'
28
+ && segment.workspaceReference === undefined));
29
+ return publicSnapshot({
30
+ undoAvailable: isAvailable(undo),
31
+ redoAvailable: isAvailable(redo),
32
+ groups: groups.map((group, index) => ({
33
+ runId: group.target.runId,
34
+ kind: group.kind,
35
+ visibility: index < stored.revertCursor ? 'visible' : 'hidden',
36
+ affectedWorkspaces: cloneSerializable(group.affectedWorkspaces),
37
+ affectedWorkspacesTruncated: group.affectedWorkspacesTruncated,
38
+ })),
39
+ });
40
+ }
41
+ async undoSession(scopeId, sessionId, signal) {
42
+ const result = await this.changeReversionCursor(scopeId, sessionId, 'undo', signal);
43
+ return Object.freeze({ revertedRunId: result });
44
+ }
45
+ async redoSession(scopeId, sessionId, signal) {
46
+ const result = await this.changeReversionCursor(scopeId, sessionId, 'redo', signal);
47
+ return Object.freeze({ restoredRunId: result });
48
+ }
49
+ reversionUnit(stored, direction) {
50
+ const groups = this.reversionGroups(stored);
51
+ if (direction === 'undo') {
52
+ let start = stored.revertCursor - 1;
53
+ while (start >= 0 && groups[start]?.kind === 'no-change')
54
+ start--;
55
+ const candidate = groups[start];
56
+ if (!candidate || candidate.kind !== 'candidate')
57
+ return undefined;
58
+ return {
59
+ target: candidate.target,
60
+ segments: groups.slice(start, stored.revertCursor).flatMap((group) => group.segments),
61
+ toCursor: start,
62
+ };
63
+ }
64
+ const candidate = groups[stored.revertCursor];
65
+ if (!candidate || candidate.kind !== 'candidate')
66
+ return undefined;
67
+ let end = stored.revertCursor + 1;
68
+ while (groups[end]?.kind === 'no-change')
69
+ end++;
70
+ return {
71
+ target: candidate.target,
72
+ segments: groups.slice(stored.revertCursor, end).flatMap((group) => group.segments),
73
+ toCursor: end,
74
+ };
75
+ }
76
+ reversionGroups(stored) {
77
+ const groups = [];
78
+ let leading = [];
79
+ for (const segment of stored.reversionSegments) {
80
+ if (segment.status === 'completed') {
81
+ const segments = groups.length === 0 ? [...leading, segment] : [segment];
82
+ leading = [];
83
+ groups.push({
84
+ target: segment,
85
+ segments,
86
+ kind: 'candidate',
87
+ affectedWorkspaces: [],
88
+ affectedWorkspacesTruncated: false,
89
+ });
90
+ }
91
+ else if (groups.length > 0) {
92
+ groups[groups.length - 1].segments.push(segment);
93
+ }
94
+ else {
95
+ leading.push(segment);
96
+ }
97
+ }
98
+ for (const group of groups) {
99
+ const affected = new Map();
100
+ for (const workspace of group.segments.flatMap((segment) => segment.affectedWorkspaces ?? [])) {
101
+ if (affected.has(workspace.id))
102
+ continue;
103
+ if (affected.size < FLEX_REVERSION_MAX_AFFECTED_WORKSPACES) {
104
+ affected.set(workspace.id, cloneSerializable(workspace));
105
+ }
106
+ else {
107
+ group.affectedWorkspacesTruncated = true;
108
+ }
109
+ }
110
+ group.affectedWorkspaces = [...affected.values()];
111
+ if (this.core.reversionPolicy === 'transcript-optional')
112
+ continue;
113
+ if (group.segments.some((segment) => segment.status === 'capturing'
114
+ || segment.disposition === 'pending'
115
+ || (segment.protocolVersion === 1 && segment.provenance === 'transcript')
116
+ || segment.disposition === 'nonrevertible')) {
117
+ group.kind = 'barrier';
118
+ }
119
+ else if (group.segments.some((segment) => segment.disposition === 'revertible')) {
120
+ group.kind = 'candidate';
121
+ }
122
+ else {
123
+ group.kind = 'no-change';
124
+ }
125
+ }
126
+ return groups;
127
+ }
128
+ async requireReversionIdle(state, stored, sessionId, allowPendingApply = false, operationSignal) {
129
+ const reason = await this.reversionUnavailableReason(state, stored, allowPendingApply, operationSignal);
130
+ if (reason)
131
+ throw new FlexHarnessSessionBusyError(sessionId, reason.toLowerCase().replace(/\.$/u, ''));
132
+ }
133
+ async reversionUnavailableReason(state, stored, allowPendingApply = false, operationSignal) {
134
+ if (stored.pendingReversion && !(allowPendingApply && stored.pendingReversion.kind === 'apply')) {
135
+ return 'Session has a pending reversion operation.';
136
+ }
137
+ if (!this.core.prompts.isSessionRuntimeIdle(state, stored)) {
138
+ return slashCommandSessionUnavailableReason;
139
+ }
140
+ const activeOperation = this.core.commands.activeSlashCommandExecutions.get(this.core.commands.slashCommandSessionKey(state.storageKey, stored.session.sessionId));
141
+ if (activeOperation && activeOperation.controller.signal !== operationSignal) {
142
+ return 'Session already has an active slash command execution.';
143
+ }
144
+ if ([...state.pendingPermissions.values()].some((pending) => !pending.settled && pending.request.sessionId === stored.session.sessionId)) {
145
+ return 'Session has a pending permission.';
146
+ }
147
+ if (stored.agentSession.listUncertainToolExecutions().length > 0) {
148
+ return 'Session has uncertain tool executions.';
149
+ }
150
+ if (stored.jobs) {
151
+ operationSignal?.throwIfAborted();
152
+ const jobs = Promise.resolve().then(() => stored.jobs.list());
153
+ if ((await this.awaitReversionOperation(jobs, operationSignal))
154
+ .some((job) => job.state === 'running')) {
155
+ return 'Session has running background jobs.';
156
+ }
157
+ }
158
+ return undefined;
159
+ }
160
+ async awaitReversionOperation(operation, signal) {
161
+ if (!signal)
162
+ return operation;
163
+ void operation.catch(() => undefined);
164
+ let rejectForAbort;
165
+ const aborted = new Promise((_resolve, reject) => {
166
+ rejectForAbort = () => reject(signal.reason ?? this.core.trustInternalError(new FlexHarnessAbortError('The slash command was aborted.')));
167
+ signal.addEventListener('abort', rejectForAbort, { once: true });
168
+ if (signal.aborted)
169
+ rejectForAbort();
170
+ });
171
+ try {
172
+ return await Promise.race([operation, aborted]);
173
+ }
174
+ finally {
175
+ signal.removeEventListener('abort', rejectForAbort);
176
+ }
177
+ }
178
+ async changeReversionCursor(scopeId, sessionId, direction, signal) {
179
+ const { scope, state } = await this.core.resolveState(scopeId);
180
+ return this.changeReversionCursorResolved(scopeId, sessionId, direction, scope.scope, state, signal);
181
+ }
182
+ async changeReversionCursorResolved(scopeId, sessionId, direction, scope, state, signal) {
183
+ const stored = this.core.requireSession(state, sessionId);
184
+ this.core.assertSessionWritable(stored);
185
+ this.core.assertStateAcceptingWork(state);
186
+ const invocationOwner = this.core.commands.slashCommandInvocationContext.getStore();
187
+ if (invocationOwner?.sessionKey === this.core.commands.slashCommandSessionKey(state.storageKey, sessionId)) {
188
+ throw this.core.trustInternalError(new FlexHarnessSlashCommandReentryError(sessionId));
189
+ }
190
+ return this.core.commands.trackSlashCommandExecution(scopeId, state, sessionId, 'operation', signal, async (operationSignal) => {
191
+ await stored.projectionQueue;
192
+ const resumable = stored.pendingReversion?.kind === 'apply'
193
+ && stored.pendingReversion.direction === direction;
194
+ await this.requireReversionIdle(state, stored, sessionId, resumable, operationSignal);
195
+ await this.reconcileContextAvailability(state, stored);
196
+ operationSignal.throwIfAborted();
197
+ const pending = stored.pendingReversion;
198
+ if (pending?.kind === 'apply') {
199
+ if (pending.direction !== direction) {
200
+ throw new FlexHarnessSessionBusyError(sessionId, 'has a pending opposite reversion operation');
201
+ }
202
+ const target = pending.segmentRunIds
203
+ .map((runId) => stored.reversionSegments.find((segment) => segment.runId === runId))
204
+ .find((segment) => segment?.status === 'completed');
205
+ if (!target)
206
+ throw new FlexHarnessValidationError('Pending reversion has no target candidate.');
207
+ const closePublication = this.core.openPublication(state, sessionId);
208
+ try {
209
+ await this.resumePendingApply(state, stored, scopeId, scope, operationSignal);
210
+ this.core.emitEvent(scopeId, stored.session, {
211
+ type: 'session.history.changed',
212
+ direction,
213
+ runId: target.runId,
214
+ });
215
+ }
216
+ finally {
217
+ closePublication();
218
+ }
219
+ return target.runId;
220
+ }
221
+ const unit = this.reversionUnit(stored, direction);
222
+ if (!unit) {
223
+ throw new FlexHarnessSlashCommandUnavailableError(direction, direction === 'undo' ? 'No visible turn can be undone.' : 'No hidden turn can be redone.');
224
+ }
225
+ if (!unit.target.contextAvailable) {
226
+ throw new FlexHarnessSlashCommandUnavailableError(direction, 'The turn is beyond the context archive horizon.');
227
+ }
228
+ if (this.core.turnReversionProvider && unit.segments.some((segment) => segment.disposition === 'revertible' && segment.workspaceReference === undefined)) {
229
+ throw new FlexHarnessSlashCommandUnavailableError(direction, 'The turn has no available workspace reversion capture.');
230
+ }
231
+ await this.core.mutateProjection(state, stored, () => {
232
+ // The write-ahead record commits at exactly projectionRevision + 1, so the
233
+ // revision it replaces makes this apply's ID unique. Retries and recovery
234
+ // read the persisted ID instead of deriving it again.
235
+ const operationId = this.reversionId('apply', state.storageKey, sessionId, JSON.stringify([
236
+ direction,
237
+ stored.revertCursor,
238
+ unit.toCursor,
239
+ unit.target.runId,
240
+ stored.projectionRevision,
241
+ ]));
242
+ stored.pendingReversion = {
243
+ kind: 'apply',
244
+ operationId,
245
+ direction,
246
+ fromCursor: stored.revertCursor,
247
+ toCursor: unit.toCursor,
248
+ segmentRunIds: unit.segments.map((segment) => segment.runId),
249
+ appliedRunIds: [],
250
+ };
251
+ }, true);
252
+ const closePublication = this.core.openPublication(state, sessionId);
253
+ try {
254
+ await this.resumePendingApply(state, stored, scopeId, scope, operationSignal);
255
+ this.core.emitEvent(scopeId, stored.session, {
256
+ type: 'session.history.changed',
257
+ direction,
258
+ runId: unit.target.runId,
259
+ });
260
+ }
261
+ finally {
262
+ closePublication();
263
+ }
264
+ return unit.target.runId;
265
+ });
266
+ }
267
+ async reconcileContextAvailability(state, stored) {
268
+ const activeEvents = new Set(stored.agentSession.getEvents().map((event) => event.id));
269
+ if (!stored.reversionSegments.some((segment) => segment.contextAvailable
270
+ && segment.eventIds.length > 0
271
+ && !segment.eventIds.some((eventId) => activeEvents.has(eventId))))
272
+ return false;
273
+ let branchCommitted = false;
274
+ await this.core.mutateProjection(state, stored, () => {
275
+ for (const segment of stored.reversionSegments) {
276
+ if (segment.contextAvailable
277
+ && segment.eventIds.length > 0
278
+ && !segment.eventIds.some((eventId) => activeEvents.has(eventId)))
279
+ segment.contextAvailable = false;
280
+ }
281
+ branchCommitted = this.commitArchivedHiddenBranchState(stored);
282
+ this.pruneReversionState(stored, false, true);
283
+ }, true);
284
+ const context = stored.compactorContext;
285
+ if (context) {
286
+ await this.drainReversionReleases(state, stored, context.scopeId, context.scope, false);
287
+ }
288
+ return branchCommitted;
289
+ }
290
+ async resumePendingApply(state, stored, scopeId, scope, signal) {
291
+ const pending = stored.pendingReversion;
292
+ if (pending?.kind !== 'apply')
293
+ return;
294
+ const sessionGeneration = requireSessionGeneration(stored.session);
295
+ const segmentMap = new Map(stored.reversionSegments.map((segment) => [segment.runId, segment]));
296
+ if (pending.segmentRunIds.some((runId) => segmentMap.get(runId)?.disposition === 'revertible')
297
+ && !this.core.turnReversionProvider) {
298
+ throw new FlexHarnessValidationError('Pending workspace reversion recovery requires its turn reversion provider.');
299
+ }
300
+ const orderedRunIds = pending.direction === 'undo'
301
+ ? [...pending.segmentRunIds].reverse()
302
+ : [...pending.segmentRunIds];
303
+ let workspaceProgress = pending.appliedRunIds.some((runId) => segmentMap.get(runId)?.disposition === 'revertible');
304
+ for (const runId of orderedRunIds) {
305
+ if (pending.appliedRunIds.includes(runId))
306
+ continue;
307
+ if (signal?.aborted && !workspaceProgress) {
308
+ await this.persistKnownNotApplied(state, stored, pending.operationId, runId);
309
+ throw signal.reason;
310
+ }
311
+ const segment = segmentMap.get(runId);
312
+ if (!segment)
313
+ throw new FlexHarnessValidationError('Pending reversion references a missing segment.');
314
+ if (segment.disposition === 'revertible') {
315
+ if (!this.core.turnReversionProvider || !segment.captureId || segment.workspaceReference === undefined) {
316
+ throw new FlexHarnessValidationError('Pending workspace reversion segment is incomplete.');
317
+ }
318
+ if (this.reversionProviderProtocolVersion() !== segment.protocolVersion) {
319
+ throw new FlexHarnessValidationError(`Pending workspace reversion requires protocolVersion ${segment.protocolVersion}.`);
320
+ }
321
+ const captureId = segment.captureId;
322
+ const reference = segment.workspaceReference;
323
+ const childOperationId = `${pending.operationId}:${sha256Hex(runId).slice(0, 16)}`;
324
+ const createContext = (contextSignal) => Object.freeze({
325
+ scopeId,
326
+ scope,
327
+ storageKey: state.storageKey,
328
+ sessionId: stored.session.sessionId,
329
+ ...sessionGeneration,
330
+ runId,
331
+ captureId,
332
+ reference: cloneSerializable(reference),
333
+ operationId: childOperationId,
334
+ direction: pending.direction,
335
+ signal: contextSignal,
336
+ });
337
+ let inspection;
338
+ try {
339
+ inspection = await this.withReversionMaintenanceSignal((inspectionSignal) => this.core.turnReversionProvider.inspectApply(createContext(inspectionSignal)));
340
+ }
341
+ catch (inspectionError) {
342
+ state.lifecycle = 'fenced';
343
+ throw this.core.projectOperationError(inspectionError, 'turnReversion', scopeId, stored.session.sessionId, childOperationId);
344
+ }
345
+ if (inspection.status === 'unknown') {
346
+ state.lifecycle = 'fenced';
347
+ throw new FlexHarnessValidationError('Workspace reversion apply outcome is unknown.');
348
+ }
349
+ if (inspection.status === 'not-applied') {
350
+ try {
351
+ if (signal && !workspaceProgress) {
352
+ await this.core.turnReversionProvider.apply(createContext(signal));
353
+ }
354
+ else {
355
+ await this.withReversionMaintenanceSignal((maintenanceSignal) => this.core.turnReversionProvider.apply(createContext(maintenanceSignal)));
356
+ }
357
+ }
358
+ catch (error) {
359
+ try {
360
+ inspection = await this.withReversionMaintenanceSignal((inspectionSignal) => this.core.turnReversionProvider.inspectApply(createContext(inspectionSignal)));
361
+ }
362
+ catch (inspectionError) {
363
+ state.lifecycle = 'fenced';
364
+ throw this.core.projectOperationError(inspectionError, 'turnReversion', scopeId, stored.session.sessionId, childOperationId);
365
+ }
366
+ if (inspection.status !== 'applied') {
367
+ if (inspection.status === 'unknown')
368
+ state.lifecycle = 'fenced';
369
+ else
370
+ await this.persistKnownNotApplied(state, stored, pending.operationId, runId);
371
+ throw this.core.projectOperationError(error, 'turnReversion', scopeId, stored.session.sessionId, childOperationId);
372
+ }
373
+ }
374
+ }
375
+ }
376
+ await this.core.mutateProjection(state, stored, () => {
377
+ const current = stored.pendingReversion;
378
+ if (current?.kind !== 'apply' || current.operationId !== pending.operationId) {
379
+ throw new FlexHarnessValidationError('Pending reversion changed while applying.');
380
+ }
381
+ if (!current.appliedRunIds.includes(runId))
382
+ current.appliedRunIds.push(runId);
383
+ }, true);
384
+ if (segment.disposition === 'revertible')
385
+ workspaceProgress = true;
386
+ }
387
+ await this.core.mutateProjection(state, stored, () => {
388
+ const current = stored.pendingReversion;
389
+ if (current?.kind !== 'apply' || current.operationId !== pending.operationId) {
390
+ throw new FlexHarnessValidationError('Pending reversion changed before cursor commit.');
391
+ }
392
+ stored.revertCursor = current.toCursor;
393
+ delete stored.pendingReversion;
394
+ }, true);
395
+ }
396
+ async persistKnownNotApplied(state, stored, operationId, runId) {
397
+ await this.core.mutateProjection(state, stored, () => {
398
+ const current = stored.pendingReversion;
399
+ if (current?.kind !== 'apply' || current.operationId !== operationId) {
400
+ throw new FlexHarnessValidationError('Pending reversion changed while recording failed apply.');
401
+ }
402
+ current.appliedRunIds = current.appliedRunIds.filter((entry) => entry !== runId);
403
+ const hasWorkspaceProgress = current.appliedRunIds.some((appliedRunId) => stored.reversionSegments.some((segment) => segment.runId === appliedRunId && segment.disposition === 'revertible'));
404
+ if (!hasWorkspaceProgress) {
405
+ stored.revertCursor = current.fromCursor;
406
+ delete stored.pendingReversion;
407
+ }
408
+ }, true);
409
+ }
410
+ async recoverPendingCapture(state, stored, scopeId, scope, outcomes) {
411
+ const pending = stored.pendingReversion;
412
+ if (pending?.kind !== 'capture' || !this.core.turnReversionProvider)
413
+ return;
414
+ const segment = stored.reversionSegments.find((entry) => entry.runId === pending.runId);
415
+ if (!segment)
416
+ throw new FlexHarnessValidationError('Pending capture references a missing segment.');
417
+ if (this.reversionProviderProtocolVersion() !== pending.protocolVersion) {
418
+ throw new FlexHarnessValidationError(`Pending capture recovery requires protocolVersion ${pending.protocolVersion}.`);
419
+ }
420
+ const outcome = outcomes.get(pending.runId);
421
+ if (pending.state === 'prepared') {
422
+ await this.core.mutateProjection(state, stored, () => {
423
+ const current = stored.pendingReversion;
424
+ if (current?.kind !== 'capture' || current.captureId !== pending.captureId) {
425
+ throw new FlexHarnessValidationError('Pending capture changed before finalization.');
426
+ }
427
+ current.state = 'finalizing';
428
+ }, true);
429
+ }
430
+ const finalizedOutcome = await this.resolveReversionCaptureOutcome(state, scopeId, scope, stored.session.sessionId, requireSessionGeneration(stored.session), pending.runId, pending.captureId, pending.state === 'prepared' ? 'finalizing' : pending.state);
431
+ if (finalizedOutcome === undefined) {
432
+ await this.core.mutateProjection(state, stored, () => {
433
+ stored.reversionSegments = stored.reversionSegments.filter((entry) => entry.runId !== pending.runId);
434
+ delete stored.pendingReversion;
435
+ }, true);
436
+ return;
437
+ }
438
+ await this.core.mutateProjection(state, stored, () => {
439
+ segment.status = outcome === 'accepted'
440
+ ? 'completed'
441
+ : outcome === 'rejected'
442
+ ? 'failed'
443
+ : 'cancelled';
444
+ this.applyFinalizedReversionOutcome(stored, segment, finalizedOutcome);
445
+ segment.eventIds = stored.agentSession.getEvents()
446
+ .filter((event) => event.generationId === pending.runId)
447
+ .map((event) => event.id);
448
+ if (segment.status === 'completed')
449
+ stored.revertCursor++;
450
+ if (outcome === undefined && !stored.excludedRunIds.includes(pending.runId)) {
451
+ stored.excludedRunIds.push(pending.runId);
452
+ }
453
+ delete stored.pendingReversion;
454
+ this.pruneReversionState(stored, false, true);
455
+ }, true);
456
+ await this.drainReversionReleases(state, stored, scopeId, scope, false);
457
+ }
458
+ reversionId(kind, storageKey, sessionId, value) {
459
+ return `${kind}_${sha256Hex(JSON.stringify([storageKey, sessionId, value]))}`;
460
+ }
461
+ reversionProviderProtocolVersion() {
462
+ if (!this.core.turnReversionProvider)
463
+ return undefined;
464
+ return 'protocolVersion' in this.core.turnReversionProvider ? 2 : 1;
465
+ }
466
+ reversionCaptureContext(run, captureId, signal) {
467
+ return Object.freeze({
468
+ scopeId: run.scopeId,
469
+ scope: run.scope,
470
+ storageKey: run.state.storageKey,
471
+ sessionId: run.sessionId,
472
+ ...requireSessionGeneration(run.stored.session),
473
+ runId: run.runId,
474
+ captureId,
475
+ signal,
476
+ });
477
+ }
478
+ async withReversionMaintenanceSignal(operation) {
479
+ const controller = new AbortController();
480
+ const timeoutMs = this.core.reversionMaintenanceTimeoutMs;
481
+ const timeoutError = new Error(`Turn reversion maintenance timed out after ${timeoutMs}ms.`);
482
+ let rejectTimeout;
483
+ const timeout = new Promise((_resolve, reject) => {
484
+ rejectTimeout = reject;
485
+ });
486
+ const timer = setTimeout(() => {
487
+ controller.abort(timeoutError);
488
+ rejectTimeout(timeoutError);
489
+ }, timeoutMs);
490
+ const completion = Promise.resolve().then(() => operation(controller.signal));
491
+ void completion.catch(() => undefined);
492
+ try {
493
+ return await Promise.race([completion, timeout]);
494
+ }
495
+ finally {
496
+ clearTimeout(timer);
497
+ }
498
+ }
499
+ inspectReversionCapture(scopeId, scope, storageKey, sessionId, sessionGeneration, runId, captureId) {
500
+ return this.withReversionMaintenanceSignal(async (signal) => {
501
+ const provider = this.core.turnReversionProvider;
502
+ const inspection = await provider.inspectCapture(Object.freeze({
503
+ scopeId,
504
+ scope,
505
+ storageKey,
506
+ sessionId,
507
+ ...sessionGeneration,
508
+ runId,
509
+ captureId,
510
+ signal,
511
+ }));
512
+ if (inspection.status !== 'finalized')
513
+ return { status: inspection.status };
514
+ if (this.reversionProviderProtocolVersion() === 2) {
515
+ if (!('outcome' in inspection)) {
516
+ throw new FlexHarnessValidationError('Protocol-2 finalized inspection has no outcome.');
517
+ }
518
+ return {
519
+ status: 'finalized',
520
+ outcome: this.normalizeReversionOutcome(inspection.outcome),
521
+ };
522
+ }
523
+ if (!('reference' in inspection) || inspection.reference === undefined) {
524
+ throw new FlexHarnessValidationError('Protocol-1 finalized inspection has no reference.');
525
+ }
526
+ return {
527
+ status: 'finalized',
528
+ outcome: {
529
+ disposition: 'revertible',
530
+ reference: this.normalizeReversionReference(inspection.reference),
531
+ affectedWorkspaces: [],
532
+ },
533
+ };
534
+ });
535
+ }
536
+ finalizeReversionCapture(scopeId, scope, storageKey, sessionId, sessionGeneration, runId, captureId) {
537
+ return this.withReversionMaintenanceSignal(async (signal) => {
538
+ const result = await this.core.turnReversionProvider.finalize(Object.freeze({
539
+ scopeId,
540
+ scope,
541
+ storageKey,
542
+ sessionId,
543
+ ...sessionGeneration,
544
+ runId,
545
+ captureId,
546
+ signal,
547
+ }));
548
+ return this.reversionProviderProtocolVersion() === 2
549
+ ? this.normalizeReversionOutcome(result)
550
+ : {
551
+ disposition: 'revertible',
552
+ reference: this.normalizeReversionReference(result),
553
+ affectedWorkspaces: [],
554
+ };
555
+ });
556
+ }
557
+ async resolveReversionCaptureOutcome(state, scopeId, scope, sessionId, sessionGeneration, runId, captureId, durableState) {
558
+ let inspection;
559
+ try {
560
+ inspection = await this.inspectReversionCapture(scopeId, scope, state.storageKey, sessionId, sessionGeneration, runId, captureId);
561
+ }
562
+ catch (error) {
563
+ state.lifecycle = 'fenced';
564
+ throw this.core.projectOperationError(error, 'turnReversion', scopeId, sessionId, captureId);
565
+ }
566
+ if (inspection.status === 'unknown') {
567
+ state.lifecycle = 'fenced';
568
+ throw new FlexHarnessValidationError('Reversion capture outcome is unknown.');
569
+ }
570
+ if (inspection.status === 'missing') {
571
+ if (durableState === 'preparing')
572
+ return undefined;
573
+ state.lifecycle = 'fenced';
574
+ throw new FlexHarnessValidationError('Prepared reversion capture is missing.');
575
+ }
576
+ let outcome = inspection.status === 'finalized' ? inspection.outcome : undefined;
577
+ if (inspection.status === 'prepared') {
578
+ try {
579
+ outcome = await this.finalizeReversionCapture(scopeId, scope, state.storageKey, sessionId, sessionGeneration, runId, captureId);
580
+ }
581
+ catch (error) {
582
+ const finalInspection = await this.inspectReversionCapture(scopeId, scope, state.storageKey, sessionId, sessionGeneration, runId, captureId);
583
+ if (finalInspection.status !== 'finalized') {
584
+ if (finalInspection.status === 'unknown')
585
+ state.lifecycle = 'fenced';
586
+ throw this.core.projectOperationError(error, 'turnReversion', scopeId, sessionId, captureId);
587
+ }
588
+ outcome = finalInspection.outcome;
589
+ }
590
+ }
591
+ if (outcome === undefined) {
592
+ state.lifecycle = 'fenced';
593
+ throw new FlexHarnessValidationError('Finalized reversion capture has no outcome.');
594
+ }
595
+ return outcome;
596
+ }
597
+ normalizeReversionReference(reference) {
598
+ return normalizeJsonValue(reference, {
599
+ maxDepth: this.core.toolOutputLimits.maxDepth,
600
+ maxBytes: Math.min(this.core.toolOutputLimits.maxBytes, FLEX_REVERSION_REFERENCE_MAX_BYTES),
601
+ });
602
+ }
603
+ normalizeReversionOutcome(value) {
604
+ if (!value
605
+ || typeof value !== 'object'
606
+ || Array.isArray(value)
607
+ || (Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null))
608
+ throw new FlexHarnessValidationError('Turn reversion finalized outcome must be a plain object.');
609
+ const outcome = value;
610
+ const disposition = outcome.disposition;
611
+ if (!['revertible', 'no-change', 'nonrevertible'].includes(String(disposition))) {
612
+ throw new FlexHarnessValidationError('Turn reversion finalized outcome disposition is invalid.');
613
+ }
614
+ const allowedKeys = disposition === 'nonrevertible'
615
+ ? ['disposition', 'reference', 'reasonCode', 'affectedWorkspaces']
616
+ : ['disposition', 'reference', 'affectedWorkspaces'];
617
+ const unsupported = Object.keys(outcome).find((key) => !allowedKeys.includes(key));
618
+ if (unsupported) {
619
+ throw new FlexHarnessValidationError(`Turn reversion finalized outcome does not support "${unsupported}".`);
620
+ }
621
+ if (!Object.prototype.hasOwnProperty.call(outcome, 'reference')) {
622
+ throw new FlexHarnessValidationError('Turn reversion finalized outcome requires a reference.');
623
+ }
624
+ const reference = this.normalizeReversionReference(outcome.reference);
625
+ const affectedWorkspaces = outcome.affectedWorkspaces === undefined
626
+ ? undefined
627
+ : this.normalizeAffectedWorkspaces(outcome.affectedWorkspaces);
628
+ if (disposition === 'revertible') {
629
+ if (affectedWorkspaces === undefined) {
630
+ throw new FlexHarnessValidationError('Revertible outcome requires affectedWorkspaces.');
631
+ }
632
+ return { disposition, reference, affectedWorkspaces };
633
+ }
634
+ if (disposition === 'no-change') {
635
+ if (affectedWorkspaces && affectedWorkspaces.length > 0) {
636
+ throw new FlexHarnessValidationError('No-change outcome cannot affect a workspace.');
637
+ }
638
+ return {
639
+ disposition,
640
+ reference,
641
+ ...(affectedWorkspaces === undefined ? {} : { affectedWorkspaces: [] }),
642
+ };
643
+ }
644
+ if (typeof outcome.reasonCode !== 'string'
645
+ || !/^[A-Za-z0-9][A-Za-z0-9._-]*$/u.test(outcome.reasonCode)
646
+ || Buffer.byteLength(outcome.reasonCode, 'utf8') > FLEX_REVERSION_REASON_CODE_MAX_BYTES)
647
+ throw new FlexHarnessValidationError('Nonrevertible outcome reasonCode is invalid.');
648
+ return {
649
+ disposition: 'nonrevertible',
650
+ reference,
651
+ reasonCode: outcome.reasonCode,
652
+ ...(affectedWorkspaces === undefined ? {} : { affectedWorkspaces }),
653
+ };
654
+ }
655
+ normalizeAffectedWorkspaces(value) {
656
+ if (!Array.isArray(value) || value.length > FLEX_REVERSION_MAX_AFFECTED_WORKSPACES) {
657
+ throw new FlexHarnessValidationError(`affectedWorkspaces must contain at most ${FLEX_REVERSION_MAX_AFFECTED_WORKSPACES} entries.`);
658
+ }
659
+ const ids = new Set();
660
+ return value.map((entry, index) => {
661
+ if (!entry
662
+ || typeof entry !== 'object'
663
+ || Array.isArray(entry)
664
+ || (Object.getPrototypeOf(entry) !== Object.prototype && Object.getPrototypeOf(entry) !== null))
665
+ throw new FlexHarnessValidationError(`affectedWorkspaces[${index}] must be a plain object.`);
666
+ const descriptor = entry;
667
+ const unsupported = Object.keys(descriptor).find((key) => !['id', 'label'].includes(key));
668
+ if (unsupported) {
669
+ throw new FlexHarnessValidationError(`affectedWorkspaces[${index}] does not support "${unsupported}".`);
670
+ }
671
+ if (typeof descriptor.id !== 'string'
672
+ || !descriptor.id.trim()
673
+ || Buffer.byteLength(descriptor.id, 'utf8') > FLEX_REVERSION_WORKSPACE_ID_MAX_BYTES)
674
+ throw new FlexHarnessValidationError(`affectedWorkspaces[${index}].id is invalid.`);
675
+ if (typeof descriptor.label !== 'string'
676
+ || !descriptor.label.trim()
677
+ || Buffer.byteLength(descriptor.label, 'utf8') > FLEX_REVERSION_WORKSPACE_LABEL_MAX_BYTES)
678
+ throw new FlexHarnessValidationError(`affectedWorkspaces[${index}].label is invalid.`);
679
+ if (ids.has(descriptor.id)) {
680
+ throw new FlexHarnessValidationError(`affectedWorkspaces contains duplicate id "${descriptor.id}".`);
681
+ }
682
+ ids.add(descriptor.id);
683
+ return { id: descriptor.id, label: descriptor.label };
684
+ });
685
+ }
686
+ async prepareRunReversion(run, signal) {
687
+ if (run.stored.session.agent !== undefined || !this.core.turnReversionProvider)
688
+ return;
689
+ const segment = run.stored.reversionSegments.find((entry) => entry.runId === run.runId);
690
+ const captureId = segment?.captureId;
691
+ if (!segment || !captureId) {
692
+ throw this.core.projectExternalError(run, new Error('Root generation is missing its durable reversion capture intent.'), 'turnReversion');
693
+ }
694
+ const context = this.reversionCaptureContext(run, captureId, signal);
695
+ if (this.reversionProviderProtocolVersion() !== segment.protocolVersion) {
696
+ throw this.core.projectExternalError(run, new Error(`Root generation requires reversion protocolVersion ${segment.protocolVersion}.`), 'turnReversion');
697
+ }
698
+ try {
699
+ await this.core.turnReversionProvider.prepare(context);
700
+ }
701
+ catch (error) {
702
+ let inspection;
703
+ try {
704
+ inspection = await this.inspectReversionCapture(run.scopeId, run.scope, run.state.storageKey, run.sessionId, requireSessionGeneration(run.stored.session), run.runId, captureId);
705
+ }
706
+ catch (inspectionError) {
707
+ run.state.lifecycle = 'fenced';
708
+ throw this.core.projectExternalError(run, inspectionError, 'turnReversion');
709
+ }
710
+ if (inspection.status !== 'prepared' && inspection.status !== 'finalized') {
711
+ if (inspection.status === 'unknown')
712
+ run.state.lifecycle = 'fenced';
713
+ throw this.core.projectExternalError(run, error, 'turnReversion');
714
+ }
715
+ }
716
+ await this.core.mutateProjection(run.state, run.stored, () => {
717
+ const pending = run.stored.pendingReversion;
718
+ if (pending?.kind !== 'capture' || pending.runId !== run.runId) {
719
+ throw new FlexHarnessValidationError('Reversion capture intent changed during preparation.');
720
+ }
721
+ pending.state = 'prepared';
722
+ }, true);
723
+ }
724
+ async finalizeRunReversion(run, status) {
725
+ if (run.stored.session.agent !== undefined)
726
+ return;
727
+ const segment = run.stored.reversionSegments.find((entry) => entry.runId === run.runId);
728
+ if (!segment)
729
+ return;
730
+ const eventIds = run.stored.agentSession.getEvents()
731
+ .filter((event) => event.generationId === run.runId)
732
+ .map((event) => event.id);
733
+ if (!this.core.turnReversionProvider || segment.provenance === 'transcript') {
734
+ await this.core.mutateProjection(run.state, run.stored, () => {
735
+ const wasCompleted = segment.status === 'completed';
736
+ segment.status = status;
737
+ segment.eventIds = eventIds;
738
+ if (!wasCompleted && status === 'completed')
739
+ run.stored.revertCursor++;
740
+ else if (wasCompleted && status !== 'completed')
741
+ run.stored.revertCursor--;
742
+ delete run.stored.pendingReversion;
743
+ this.pruneReversionState(run.stored);
744
+ }, true);
745
+ return;
746
+ }
747
+ if (!segment.captureId) {
748
+ throw new FlexHarnessValidationError('Workspace reversion segment has no capture ownership.');
749
+ }
750
+ const captureId = segment.captureId;
751
+ if (segment.workspaceReference !== undefined) {
752
+ await this.core.mutateProjection(run.state, run.stored, () => {
753
+ const wasCompleted = segment.status === 'completed';
754
+ segment.status = status;
755
+ segment.eventIds = eventIds;
756
+ if (!wasCompleted && status === 'completed')
757
+ run.stored.revertCursor++;
758
+ else if (wasCompleted && status !== 'completed')
759
+ run.stored.revertCursor--;
760
+ delete run.stored.pendingReversion;
761
+ }, true);
762
+ return;
763
+ }
764
+ const pending = run.stored.pendingReversion;
765
+ if (pending?.kind !== 'capture' || pending.runId !== run.runId) {
766
+ throw new FlexHarnessValidationError('Reversion capture intent changed before finalization.');
767
+ }
768
+ if (this.reversionProviderProtocolVersion() !== pending.protocolVersion) {
769
+ throw new FlexHarnessValidationError(`Reversion capture finalization requires protocolVersion ${pending.protocolVersion}.`);
770
+ }
771
+ if (pending.state === 'prepared') {
772
+ await this.core.mutateProjection(run.state, run.stored, () => {
773
+ const current = run.stored.pendingReversion;
774
+ if (current?.kind !== 'capture' || current.captureId !== captureId) {
775
+ throw new FlexHarnessValidationError('Reversion capture changed before finalization.');
776
+ }
777
+ current.state = 'finalizing';
778
+ }, true);
779
+ }
780
+ const outcome = await this.resolveReversionCaptureOutcome(run.state, run.scopeId, run.scope, run.sessionId, requireSessionGeneration(run.stored.session), run.runId, captureId, pending.state === 'prepared' ? 'finalizing' : pending.state);
781
+ if (outcome === undefined) {
782
+ await this.core.mutateProjection(run.state, run.stored, () => {
783
+ run.stored.reversionSegments = run.stored.reversionSegments.filter((entry) => entry.runId !== run.runId);
784
+ delete run.stored.pendingReversion;
785
+ }, true);
786
+ return;
787
+ }
788
+ await this.core.mutateProjection(run.state, run.stored, () => {
789
+ const current = run.stored.pendingReversion;
790
+ if (current?.kind !== 'capture' || current.runId !== run.runId) {
791
+ throw new FlexHarnessValidationError('Reversion capture intent changed before finalization.');
792
+ }
793
+ const wasCompleted = segment.status === 'completed';
794
+ segment.status = status;
795
+ segment.eventIds = eventIds;
796
+ this.applyFinalizedReversionOutcome(run.stored, segment, outcome);
797
+ if (!wasCompleted && status === 'completed')
798
+ run.stored.revertCursor++;
799
+ else if (wasCompleted && status !== 'completed')
800
+ run.stored.revertCursor--;
801
+ delete run.stored.pendingReversion;
802
+ this.pruneReversionState(run.stored);
803
+ }, true);
804
+ }
805
+ applyFinalizedReversionOutcome(stored, segment, outcome) {
806
+ const captureId = segment.captureId;
807
+ if (!captureId) {
808
+ throw new FlexHarnessValidationError('Finalized workspace outcome has no capture ownership.');
809
+ }
810
+ segment.disposition = outcome.disposition;
811
+ delete segment.affectedWorkspaces;
812
+ delete segment.reasonCode;
813
+ if (segment.protocolVersion === 2) {
814
+ if (outcome.affectedWorkspaces !== undefined) {
815
+ segment.affectedWorkspaces = cloneSerializable([...outcome.affectedWorkspaces]);
816
+ }
817
+ if (outcome.disposition === 'nonrevertible')
818
+ segment.reasonCode = outcome.reasonCode;
819
+ }
820
+ if (outcome.disposition === 'revertible') {
821
+ segment.workspaceReference = cloneSerializable(outcome.reference);
822
+ return;
823
+ }
824
+ this.enqueueReversionReleaseReference(stored, {
825
+ runId: segment.runId,
826
+ captureId,
827
+ reference: cloneSerializable(outcome.reference),
828
+ protocolVersion: segment.protocolVersion,
829
+ });
830
+ delete segment.captureId;
831
+ delete segment.workspaceReference;
832
+ }
833
+ hiddenReversionSegments(stored) {
834
+ const firstHidden = this.reversionGroups(stored)[stored.revertCursor]?.segments[0];
835
+ if (!firstHidden)
836
+ return [];
837
+ const index = stored.reversionSegments.findIndex((segment) => segment.runId === firstHidden.runId);
838
+ if (index < 0)
839
+ return [];
840
+ return stored.reversionSegments.slice(index);
841
+ }
842
+ enqueueReversionRelease(stored, segment) {
843
+ if (segment.disposition !== 'revertible')
844
+ return;
845
+ if (segment.captureId === undefined || segment.workspaceReference === undefined) {
846
+ throw new FlexHarnessValidationError('Capture-backed segment has no releasable workspace reference.');
847
+ }
848
+ this.enqueueReversionReleaseReference(stored, {
849
+ runId: segment.runId,
850
+ captureId: segment.captureId,
851
+ reference: cloneSerializable(segment.workspaceReference),
852
+ protocolVersion: segment.protocolVersion,
853
+ });
854
+ }
855
+ enqueueReversionReleaseReference(stored, release) {
856
+ if (stored.pendingReversionReleases.some((entry) => entry.captureId === release.captureId)) {
857
+ return;
858
+ }
859
+ if (stored.pendingReversionReleases.length >= this.core.reversionLimits.maxPendingReversionReleases) {
860
+ throw new FlexHarnessValidationError('Pending reversion release limit was reached.');
861
+ }
862
+ stored.pendingReversionReleases.push(cloneSerializable(release));
863
+ }
864
+ pruneReversionState(stored, reserveSegment = false, dropNonUndoablePrefix = false) {
865
+ if (stored.pendingReversion || stored.revertCursor !== this.completedReversionCandidates(stored).length) {
866
+ return;
867
+ }
868
+ while (stored.reversionSegments.length > 0) {
869
+ const candidates = this.completedReversionCandidates(stored);
870
+ const overLimit = candidates.length + (reserveSegment ? 1 : 0)
871
+ > this.core.reversionLimits.maxCompletedTurns
872
+ || stored.reversionSegments.length + (reserveSegment ? 1 : 0)
873
+ > this.core.reversionLimits.maxSegments;
874
+ const firstCandidate = candidates[0];
875
+ const nextCandidate = candidates[1];
876
+ let end = 0;
877
+ if (!firstCandidate) {
878
+ if (dropNonUndoablePrefix)
879
+ end = stored.reversionSegments.length;
880
+ else if (overLimit) {
881
+ end = Math.max(1, stored.reversionSegments.length + (reserveSegment ? 1 : 0)
882
+ - this.core.reversionLimits.maxSegments);
883
+ }
884
+ else
885
+ break;
886
+ }
887
+ else if (!firstCandidate.contextAvailable) {
888
+ end = nextCandidate
889
+ ? stored.reversionSegments.findIndex((segment) => segment.runId === nextCandidate.runId)
890
+ : stored.reversionSegments.length;
891
+ }
892
+ else if (overLimit) {
893
+ end = nextCandidate
894
+ ? stored.reversionSegments.findIndex((segment) => segment.runId === nextCandidate.runId)
895
+ : stored.reversionSegments.length;
896
+ }
897
+ else {
898
+ break;
899
+ }
900
+ if (end <= 0)
901
+ break;
902
+ const prefix = stored.reversionSegments.slice(0, end);
903
+ if (prefix.some((segment) => segment.disposition === 'revertible' && segment.workspaceReference === undefined))
904
+ break;
905
+ for (const segment of prefix)
906
+ this.enqueueReversionRelease(stored, segment);
907
+ stored.reversionSegments.splice(0, end);
908
+ stored.revertCursor = Math.max(0, stored.revertCursor - prefix.filter((segment) => segment.status === 'completed').length);
909
+ }
910
+ if (stored.excludedRunIds.length > this.core.reversionLimits.maxExcludedRunIds) {
911
+ throw new FlexHarnessValidationError('Excluded reversion run limit was reached.');
912
+ }
913
+ }
914
+ async commitRevertedBranch(state, stored, scopeId, scope) {
915
+ if (stored.pendingReversionReleases.length > 0) {
916
+ await this.drainReversionReleases(state, stored, scopeId, scope, false);
917
+ this.core.assertStateAcceptingWork(state);
918
+ }
919
+ if (this.hiddenReversionSegments(stored).length === 0) {
920
+ return;
921
+ }
922
+ await this.core.mutateProjection(state, stored, () => this.commitRevertedBranchState(stored), true);
923
+ this.core.emitEvent(scopeId, stored.session, {
924
+ type: 'session.history.changed',
925
+ direction: 'branch',
926
+ });
927
+ await this.drainReversionReleases(state, stored, scopeId, scope, false);
928
+ }
929
+ commitRevertedBranchState(stored) {
930
+ const hidden = this.hiddenReversionSegments(stored);
931
+ if (hidden.length === 0)
932
+ return false;
933
+ const hiddenRunIds = new Set(hidden.map((segment) => segment.runId));
934
+ stored.messages = stored.messages.filter((message) => !hiddenRunIds.has(message.runId));
935
+ stored.stagedTerminals = stored.stagedTerminals.filter((terminal) => !hiddenRunIds.has(terminal.runId));
936
+ for (const segment of hidden) {
937
+ this.enqueueReversionRelease(stored, segment);
938
+ if (!stored.excludedRunIds.includes(segment.runId))
939
+ stored.excludedRunIds.push(segment.runId);
940
+ }
941
+ stored.reversionSegments = stored.reversionSegments.filter((segment) => !hiddenRunIds.has(segment.runId));
942
+ stored.revertCursor = this.completedReversionCandidates(stored).length;
943
+ this.pruneReversionState(stored);
944
+ return true;
945
+ }
946
+ commitArchivedHiddenBranchState(stored) {
947
+ const hidden = this.hiddenReversionSegments(stored);
948
+ return hidden.some((segment) => !segment.contextAvailable)
949
+ ? this.commitRevertedBranchState(stored)
950
+ : false;
951
+ }
952
+ refreshAutomaticArchiveHorizon(stored) {
953
+ const events = stored.agentSession.getEvents();
954
+ const activeIds = new Set(events.map((event) => event.id));
955
+ const archivedIds = new Set(events.flatMap((event) => event.type === 'context-compaction' && event.automatic
956
+ ? event.coveredEventIds.filter((id) => !activeIds.has(id)) : []));
957
+ if (archivedIds.size === 0)
958
+ return;
959
+ for (const segment of stored.reversionSegments) {
960
+ if (segment.eventIds.some((id) => archivedIds.has(id)))
961
+ segment.contextAvailable = false;
962
+ }
963
+ this.commitArchivedHiddenBranchState(stored);
964
+ this.pruneReversionState(stored, false, true);
965
+ }
966
+ filterReversionContextEvents(stored, events) {
967
+ const hiddenRunIds = new Set([
968
+ ...this.hiddenReversionSegments(stored).map((segment) => segment.runId),
969
+ ...stored.excludedRunIds,
970
+ ]);
971
+ const hiddenRawIds = new Set([
972
+ ...this.hiddenReversionSegments(stored).flatMap((segment) => segment.eventIds),
973
+ ...events.filter((event) => event.generationId && hiddenRunIds.has(event.generationId))
974
+ .map((event) => event.id),
975
+ ]);
976
+ const taintedCompactionIds = new Set();
977
+ let changed = true;
978
+ while (changed) {
979
+ changed = false;
980
+ for (const event of events) {
981
+ if (event.type !== 'context-compaction' || taintedCompactionIds.has(event.id))
982
+ continue;
983
+ if (event.coveredEventIds.some((id) => hiddenRawIds.has(id) || taintedCompactionIds.has(id))
984
+ || event.archivedTransactions?.some((transaction) => hiddenRunIds.has(transaction.generationId))) {
985
+ taintedCompactionIds.add(event.id);
986
+ changed = true;
987
+ }
988
+ }
989
+ }
990
+ return events.filter((event) => !(event.generationId && hiddenRunIds.has(event.generationId))
991
+ && !taintedCompactionIds.has(event.id));
992
+ }
993
+ async drainReversionReleases(state, stored, scopeId, scope, throwOnFailure) {
994
+ await this.core.reconcileProjectionFromStore(stored);
995
+ if (!this.core.turnReversionProvider) {
996
+ if (stored.pendingReversionReleases.length > 0) {
997
+ throw new FlexHarnessValidationError('Pending workspace capture releases require their turn reversion provider.');
998
+ }
999
+ return;
1000
+ }
1001
+ const sessionGeneration = requireSessionGeneration(stored.session);
1002
+ while (stored.pendingReversionReleases.length > 0) {
1003
+ const release = stored.pendingReversionReleases[0];
1004
+ if (this.reversionProviderProtocolVersion() !== release.protocolVersion) {
1005
+ throw new FlexHarnessValidationError(`Pending workspace release requires protocolVersion ${release.protocolVersion}.`);
1006
+ }
1007
+ try {
1008
+ await this.withReversionMaintenanceSignal((signal) => this.core.turnReversionProvider.release(Object.freeze({
1009
+ scopeId,
1010
+ scope,
1011
+ storageKey: state.storageKey,
1012
+ sessionId: stored.session.sessionId,
1013
+ ...sessionGeneration,
1014
+ runId: release.runId,
1015
+ captureId: release.captureId,
1016
+ reference: cloneSerializable(release.reference),
1017
+ signal,
1018
+ })));
1019
+ }
1020
+ catch (error) {
1021
+ if (throwOnFailure) {
1022
+ throw this.core.projectOperationError(error, 'turnReversion', scopeId, stored.session.sessionId, `release:${release.captureId}`);
1023
+ }
1024
+ return;
1025
+ }
1026
+ try {
1027
+ await this.core.mutateProjection(state, stored, () => {
1028
+ if (stored.pendingReversionReleases[0]?.captureId === release.captureId) {
1029
+ stored.pendingReversionReleases.shift();
1030
+ }
1031
+ }, true);
1032
+ }
1033
+ catch (error) {
1034
+ if (!throwOnFailure && state.lifecycle === 'fenced') {
1035
+ this.core.lifecycle.deferReversionReleaseDrain(state, stored, scopeId, scope);
1036
+ }
1037
+ if (throwOnFailure)
1038
+ throw error;
1039
+ return;
1040
+ }
1041
+ if (stored.projectionReconciliationRequired)
1042
+ return;
1043
+ }
1044
+ }
1045
+ async releaseDeletedSessionReversions(state, storageKey, tombstone, scopeId, scope, stored) {
1046
+ const sessionId = tombstone.sessionId;
1047
+ const sessionGeneration = requireSessionGeneration(stored?.session ?? tombstone);
1048
+ if (stored)
1049
+ await stored.projectionQueue;
1050
+ let durableProjection = await this.core.stores.projections.load(storageKey, sessionId);
1051
+ if (!durableProjection)
1052
+ return;
1053
+ let projection = this.core.upgradeProjectionSnapshot(durableProjection);
1054
+ const persistDirect = async (next) => {
1055
+ const before = durableProjection;
1056
+ try {
1057
+ await this.core.stores.projections.save(storageKey, sessionId, next, projection.revision);
1058
+ durableProjection = next;
1059
+ projection = next;
1060
+ }
1061
+ catch (error) {
1062
+ let current;
1063
+ let reconciliationError;
1064
+ try {
1065
+ current = await this.core.stores.projections.load(storageKey, sessionId);
1066
+ }
1067
+ catch (loadError) {
1068
+ reconciliationError = loadError;
1069
+ }
1070
+ if (current && JSON.stringify(current) === JSON.stringify(next)) {
1071
+ durableProjection = current;
1072
+ projection = next;
1073
+ return;
1074
+ }
1075
+ if (current && before && JSON.stringify(current) === JSON.stringify(before))
1076
+ throw error;
1077
+ state.lifecycle = 'fenced';
1078
+ throw reconciliationError === undefined ? error : combineErrors([error, reconciliationError]);
1079
+ }
1080
+ };
1081
+ if (projection.pendingReversion?.kind === 'apply') {
1082
+ if (stored) {
1083
+ await this.resumePendingApply(state, stored, scopeId, scope);
1084
+ }
1085
+ else {
1086
+ const pending = projection.pendingReversion;
1087
+ const orderedRunIds = pending.direction === 'undo'
1088
+ ? [...pending.segmentRunIds].reverse()
1089
+ : [...pending.segmentRunIds];
1090
+ for (const runId of orderedRunIds) {
1091
+ if (pending.appliedRunIds.includes(runId))
1092
+ continue;
1093
+ const segment = projection.reversionSegments.find((entry) => entry.runId === runId);
1094
+ if (segment.disposition === 'revertible') {
1095
+ if (!this.core.turnReversionProvider || !segment.captureId || segment.workspaceReference === undefined) {
1096
+ throw new FlexHarnessValidationError('Pending workspace reversion deletion requires its turn reversion provider.');
1097
+ }
1098
+ if (this.reversionProviderProtocolVersion() !== segment.protocolVersion) {
1099
+ throw new FlexHarnessValidationError(`Pending workspace reversion deletion requires protocolVersion ${segment.protocolVersion}.`);
1100
+ }
1101
+ const captureId = segment.captureId;
1102
+ const reference = segment.workspaceReference;
1103
+ const operationId = `${pending.operationId}:${sha256Hex(runId).slice(0, 16)}`;
1104
+ const createContext = (signal) => Object.freeze({
1105
+ scopeId,
1106
+ scope,
1107
+ storageKey,
1108
+ sessionId,
1109
+ ...sessionGeneration,
1110
+ runId,
1111
+ captureId,
1112
+ reference: cloneSerializable(reference),
1113
+ operationId,
1114
+ direction: pending.direction,
1115
+ signal,
1116
+ });
1117
+ let inspection = await this.withReversionMaintenanceSignal((signal) => this.core.turnReversionProvider.inspectApply(createContext(signal)));
1118
+ if (inspection.status === 'unknown') {
1119
+ state.lifecycle = 'fenced';
1120
+ throw new FlexHarnessValidationError('Workspace reversion apply outcome is unknown.');
1121
+ }
1122
+ if (inspection.status === 'not-applied') {
1123
+ try {
1124
+ await this.withReversionMaintenanceSignal((signal) => this.core.turnReversionProvider.apply(createContext(signal)));
1125
+ }
1126
+ catch (error) {
1127
+ inspection = await this.withReversionMaintenanceSignal((signal) => this.core.turnReversionProvider.inspectApply(createContext(signal)));
1128
+ if (inspection.status !== 'applied') {
1129
+ if (inspection.status === 'unknown')
1130
+ state.lifecycle = 'fenced';
1131
+ throw error;
1132
+ }
1133
+ }
1134
+ }
1135
+ }
1136
+ pending.appliedRunIds.push(runId);
1137
+ await persistDirect({ ...projection, revision: projection.revision + 1 });
1138
+ }
1139
+ const { pendingReversion: _pendingReversion, ...completedProjection } = projection;
1140
+ const completed = {
1141
+ ...completedProjection,
1142
+ revision: projection.revision + 1,
1143
+ revertCursor: pending.toCursor,
1144
+ };
1145
+ await persistDirect(completed);
1146
+ }
1147
+ const recoveredProjection = await this.core.stores.projections.load(storageKey, sessionId);
1148
+ if (!recoveredProjection)
1149
+ return;
1150
+ durableProjection = recoveredProjection;
1151
+ projection = this.core.upgradeProjectionSnapshot(recoveredProjection);
1152
+ }
1153
+ const releases = new Map();
1154
+ for (const release of projection.pendingReversionReleases) {
1155
+ releases.set(release.captureId, cloneSerializable(release));
1156
+ }
1157
+ for (const segment of projection.reversionSegments) {
1158
+ if (segment.captureId && segment.workspaceReference !== undefined) {
1159
+ releases.set(segment.captureId, {
1160
+ runId: segment.runId,
1161
+ captureId: segment.captureId,
1162
+ reference: cloneSerializable(segment.workspaceReference),
1163
+ protocolVersion: segment.protocolVersion,
1164
+ });
1165
+ }
1166
+ }
1167
+ const unresolvedCaptures = new Map();
1168
+ for (const segment of projection.reversionSegments) {
1169
+ if (segment.captureId && !releases.has(segment.captureId)) {
1170
+ unresolvedCaptures.set(segment.captureId, {
1171
+ runId: segment.runId,
1172
+ captureId: segment.captureId,
1173
+ protocolVersion: segment.protocolVersion,
1174
+ });
1175
+ }
1176
+ }
1177
+ if (projection.pendingReversion?.kind === 'capture') {
1178
+ unresolvedCaptures.set(projection.pendingReversion.captureId, {
1179
+ runId: projection.pendingReversion.runId,
1180
+ captureId: projection.pendingReversion.captureId,
1181
+ protocolVersion: projection.pendingReversion.protocolVersion,
1182
+ durableState: projection.pendingReversion.state,
1183
+ });
1184
+ }
1185
+ if (unresolvedCaptures.size > 0 && !this.core.turnReversionProvider) {
1186
+ throw new FlexHarnessValidationError('Capture-backed session deletion requires its turn reversion provider.');
1187
+ }
1188
+ for (const capture of unresolvedCaptures.values()) {
1189
+ if (this.reversionProviderProtocolVersion() !== capture.protocolVersion) {
1190
+ throw new FlexHarnessValidationError(`Deleted session capture requires protocolVersion ${capture.protocolVersion}.`);
1191
+ }
1192
+ if (capture.durableState === 'prepared') {
1193
+ if (stored) {
1194
+ await this.core.mutateProjection(state, stored, () => {
1195
+ const pending = stored.pendingReversion;
1196
+ if (pending?.kind !== 'capture' || pending.captureId !== capture.captureId) {
1197
+ throw new FlexHarnessValidationError('Deleted session capture changed before finalization.');
1198
+ }
1199
+ pending.state = 'finalizing';
1200
+ }, true);
1201
+ }
1202
+ else if (projection.pendingReversion?.kind === 'capture') {
1203
+ projection.pendingReversion.state = 'finalizing';
1204
+ await persistDirect({ ...projection, revision: projection.revision + 1 });
1205
+ }
1206
+ capture.durableState = 'finalizing';
1207
+ }
1208
+ let inspection;
1209
+ try {
1210
+ inspection = await this.inspectReversionCapture(scopeId, scope, storageKey, sessionId, sessionGeneration, capture.runId, capture.captureId);
1211
+ }
1212
+ catch (error) {
1213
+ throw this.core.projectOperationError(error, 'turnReversion', scopeId, sessionId, `release:${capture.captureId}`);
1214
+ }
1215
+ if (inspection.status === 'unknown') {
1216
+ state.lifecycle = 'fenced';
1217
+ throw new FlexHarnessValidationError('Deleted session capture outcome is unknown.');
1218
+ }
1219
+ if (inspection.status === 'missing') {
1220
+ if (capture.durableState === 'preparing')
1221
+ continue;
1222
+ state.lifecycle = 'fenced';
1223
+ throw new FlexHarnessValidationError('Prepared deleted-session capture is missing.');
1224
+ }
1225
+ let outcome = inspection.status === 'finalized' ? inspection.outcome : undefined;
1226
+ if (inspection.status === 'prepared') {
1227
+ try {
1228
+ outcome = await this.finalizeReversionCapture(scopeId, scope, storageKey, sessionId, sessionGeneration, capture.runId, capture.captureId);
1229
+ }
1230
+ catch (error) {
1231
+ const finalInspection = await this.inspectReversionCapture(scopeId, scope, storageKey, sessionId, sessionGeneration, capture.runId, capture.captureId);
1232
+ if (finalInspection.status !== 'finalized') {
1233
+ if (finalInspection.status === 'unknown')
1234
+ state.lifecycle = 'fenced';
1235
+ throw this.core.projectOperationError(error, 'turnReversion', scopeId, sessionId, `release:${capture.captureId}`);
1236
+ }
1237
+ outcome = finalInspection.outcome;
1238
+ }
1239
+ }
1240
+ if (outcome === undefined) {
1241
+ throw new FlexHarnessValidationError('Deleted session capture has no release reference.');
1242
+ }
1243
+ releases.set(capture.captureId, {
1244
+ runId: capture.runId,
1245
+ captureId: capture.captureId,
1246
+ reference: cloneSerializable(outcome.reference),
1247
+ protocolVersion: capture.protocolVersion,
1248
+ });
1249
+ }
1250
+ if (releases.size === 0)
1251
+ return;
1252
+ if (!this.core.turnReversionProvider) {
1253
+ throw new FlexHarnessValidationError('Capture-backed session deletion requires its turn reversion provider.');
1254
+ }
1255
+ if (stored) {
1256
+ await this.core.mutateProjection(state, stored, () => {
1257
+ stored.reversionSegments = [];
1258
+ stored.revertCursor = 0;
1259
+ delete stored.pendingReversion;
1260
+ stored.pendingReversionReleases = [...releases.values()].map((release) => cloneSerializable(release));
1261
+ }, true);
1262
+ await this.drainReversionReleases(state, stored, scopeId, scope, true);
1263
+ }
1264
+ else {
1265
+ const { pendingReversion: _pendingReversion, ...withoutPending } = projection;
1266
+ await persistDirect({
1267
+ ...withoutPending,
1268
+ revision: projection.revision + 1,
1269
+ reversionSegments: [],
1270
+ revertCursor: 0,
1271
+ pendingReversionReleases: [...releases.values()].map((release) => cloneSerializable(release)),
1272
+ });
1273
+ while (projection.pendingReversionReleases.length > 0) {
1274
+ const release = projection.pendingReversionReleases[0];
1275
+ if (this.reversionProviderProtocolVersion() !== release.protocolVersion) {
1276
+ throw new FlexHarnessValidationError(`Deleted session release requires protocolVersion ${release.protocolVersion}.`);
1277
+ }
1278
+ try {
1279
+ await this.withReversionMaintenanceSignal((signal) => this.core.turnReversionProvider.release(Object.freeze({
1280
+ scopeId,
1281
+ scope,
1282
+ storageKey,
1283
+ sessionId,
1284
+ ...sessionGeneration,
1285
+ runId: release.runId,
1286
+ captureId: release.captureId,
1287
+ reference: cloneSerializable(release.reference),
1288
+ signal,
1289
+ })));
1290
+ }
1291
+ catch (error) {
1292
+ throw this.core.projectOperationError(error, 'turnReversion', scopeId, sessionId, `release:${release.captureId}`);
1293
+ }
1294
+ await persistDirect({
1295
+ ...projection,
1296
+ revision: projection.revision + 1,
1297
+ pendingReversionReleases: projection.pendingReversionReleases.slice(1),
1298
+ });
1299
+ }
1300
+ }
1301
+ }
1302
+ completedReversionCandidates(stored) {
1303
+ return stored.reversionSegments.filter((segment) => segment.status === 'completed');
1304
+ }
1305
+ }
1306
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5mbGV4aGFybmVzcy5yZXZlcnNpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5mbGV4aGFybmVzcy5yZXZlcnNpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsMkJBQTJCLEVBQzNCLG1DQUFtQyxFQUNuQyx1Q0FBdUMsRUFDdkMsMEJBQTBCLEdBQzNCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFDTCxzQ0FBc0MsRUFDdEMsb0NBQW9DLEVBQ3BDLGtDQUFrQyxFQUNsQyxxQ0FBcUMsRUFDckMsd0NBQXdDLEdBZXpDLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBU3JELE9BQU8sRUFDTCxvQ0FBb0MsRUFDcEMsd0JBQXdCLEVBQ3hCLFNBQVMsRUFDVCxhQUFhLEdBQ2QsTUFBTSx3QkFBd0IsQ0FBQztBQUdoQyxrRkFBa0Y7QUFDbEYsTUFBTSxPQUFPLHFCQUFxQjtJQUNIO0lBQTdCLFlBQTZCLElBQTZCO1FBQTdCLFNBQUksR0FBSixJQUFJLENBQXlCO0lBQUcsQ0FBQztJQUV2RCxLQUFLLENBQUMsdUJBQXVCLENBQ2xDLE9BQWUsRUFDZixTQUFpQjtRQUVqQixNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDMUQsTUFBTSxNQUFNLENBQUMsZUFBZSxDQUFDO1FBQzdCLElBQUksQ0FB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