@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,396 @@
1
+ import { FlexHarnessAbortError, FlexHarnessNotFoundError, FlexHarnessValidationError, } from './errors.js';
2
+ import { cloneSerializable } from './utils.json.js';
3
+ import { publicSnapshot, requireTransferIdentifier } from './utils.transfer.js';
4
+ import { validateDeleteSessionGenerationCohortInput, validateIdentifier, } from './utils.validation.js';
5
+ import { requireSessionGeneration, combineErrors } from './utils.flexharness.js';
6
+ function matchesSessionGeneration(session, expected) {
7
+ const actual = requireSessionGeneration(session);
8
+ return actual.sessionGenerationId === expected.sessionGenerationId
9
+ && actual.sessionGenerationSequence === expected.sessionGenerationSequence;
10
+ }
11
+ /**
12
+ * Session deletion: reservations, subtree tombstones and the cleanup of every domain a session
13
+ * owns.
14
+ */
15
+ export class FlexHarnessSessionDeletion {
16
+ core;
17
+ constructor(core) {
18
+ this.core = core;
19
+ }
20
+ async deleteSessionGenerationCohort(scopeId, input) {
21
+ const validated = validateDeleteSessionGenerationCohortInput(input);
22
+ requireTransferIdentifier(validated.root.sessionId, 'root.sessionId');
23
+ for (const entry of validated.authorizedBySessionId.values()) {
24
+ requireTransferIdentifier(entry.sessionId, 'authorizedCohort sessionId');
25
+ }
26
+ this.core.commands.assertNoAmbientSlashCommandTeardown({
27
+ scopeId,
28
+ sessionId: validated.root.sessionId,
29
+ });
30
+ const { scope, state } = await this.core.resolveState(scopeId);
31
+ this.core.commands.assertNoAmbientSlashCommandTeardown({ storageKey: state.storageKey });
32
+ const plan = await this.core.withScopeMutationOwnership(state, async () => {
33
+ const stored = state.sessions.get(validated.root.sessionId);
34
+ if (stored) {
35
+ if (!matchesSessionGeneration(stored.session, validated.root)) {
36
+ return { matched: false };
37
+ }
38
+ const subtree = this.collectSessionSubtree(state, validated.root.sessionId);
39
+ const descendantRoots = this.descendantTombstoneRoots(state, validated.root.sessionId);
40
+ this.assertAuthorizedSessionGenerationCohort([
41
+ ...subtree.map((entry) => entry.session),
42
+ ...this.tombstonesForRoots(state, descendantRoots),
43
+ ], validated.authorizedBySessionId);
44
+ const reservation = await this.core.mutateScopeOwned(state, () => this.reserveLiveSessionDeletion(state, validated.root.sessionId, stored, subtree, descendantRoots));
45
+ return {
46
+ matched: true,
47
+ deletion: this.startReservedSessionDeletion(state, scopeId, scope.scope, validated.root.sessionId, reservation),
48
+ };
49
+ }
50
+ const tombstone = state.tombstones.get(validated.root.sessionId);
51
+ if (!tombstone || !matchesSessionGeneration(tombstone, validated.root)) {
52
+ return { matched: false };
53
+ }
54
+ this.core.imports.assertNoCommittingSessionImport(state, validated.root.sessionId);
55
+ const rootSessionId = tombstone.rootSessionId ?? tombstone.sessionId;
56
+ const descendantRoots = this.descendantTombstoneRoots(state, rootSessionId);
57
+ this.assertAuthorizedSessionGenerationCohort(this.tombstonesForRoots(state, [rootSessionId, ...descendantRoots]), validated.authorizedBySessionId);
58
+ return {
59
+ matched: true,
60
+ deletion: this.startSessionDeletion(state, scopeId, scope.scope, validated.root.sessionId),
61
+ };
62
+ });
63
+ if (!plan.matched)
64
+ return publicSnapshot({ matched: false });
65
+ if (!plan.deletion)
66
+ throw new Error('Matched session deletion has no cleanup operation.');
67
+ await plan.deletion;
68
+ return publicSnapshot({ matched: true });
69
+ }
70
+ async deleteSession(scopeId, sessionId) {
71
+ this.core.commands.assertNoAmbientSlashCommandTeardown({ scopeId, sessionId });
72
+ const { scope, state } = await this.core.resolveState(scopeId);
73
+ this.core.commands.assertNoAmbientSlashCommandTeardown({ storageKey: state.storageKey });
74
+ validateIdentifier(sessionId, 'sessionId');
75
+ await state.scopeQueue;
76
+ this.core.imports.assertNoCommittingSessionImport(state, sessionId);
77
+ return this.startSessionDeletion(state, scopeId, scope.scope, sessionId);
78
+ }
79
+ startSessionDeletion(state, scopeId, scope, sessionId) {
80
+ const deletionKey = state.tombstones.get(sessionId)?.rootSessionId ?? sessionId;
81
+ return this.registerSessionDeletion(state, deletionKey, () => this.deleteSessionInternal(state, scopeId, scope, sessionId));
82
+ }
83
+ startReservedSessionDeletion(state, scopeId, scope, sessionId, reservation) {
84
+ return this.registerSessionDeletion(state, sessionId, () => this.finishReservedSessionDeletion(state, scopeId, scope, sessionId, reservation));
85
+ }
86
+ registerSessionDeletion(state, deletionKey, operation) {
87
+ const existingDeletion = state.sessionDeletions.get(deletionKey);
88
+ if (existingDeletion)
89
+ return existingDeletion;
90
+ let deletion;
91
+ deletion = operation().finally(() => {
92
+ if (state.sessionDeletions.get(deletionKey) === deletion) {
93
+ state.sessionDeletions.delete(deletionKey);
94
+ }
95
+ });
96
+ state.sessionDeletions.set(deletionKey, deletion);
97
+ return deletion;
98
+ }
99
+ assertAuthorizedSessionGenerationCohort(entries, authorizedBySessionId) {
100
+ for (const entry of entries) {
101
+ const authorized = authorizedBySessionId.get(entry.sessionId);
102
+ if (!authorized || !matchesSessionGeneration(entry, authorized)) {
103
+ throw new FlexHarnessValidationError(`authorizedCohort does not authorize the exact generation of session "${entry.sessionId}".`);
104
+ }
105
+ }
106
+ }
107
+ reserveLiveSessionDeletion(state, sessionId, stored, subtree, descendantRoots) {
108
+ if (state.sessions.get(sessionId) !== stored) {
109
+ throw new FlexHarnessNotFoundError('Session', sessionId);
110
+ }
111
+ const rootDepth = stored.session.depth ?? 0;
112
+ const deletedAt = new Date().toISOString();
113
+ const deletedSessions = subtree.map((entry) => cloneSerializable(entry.session));
114
+ const provenanceBySessionId = new Map(subtree.map((entry) => [
115
+ entry.session.sessionId,
116
+ this.core.subagentTasks.createSubagentProvenance(state, entry.session),
117
+ ]));
118
+ for (const entry of subtree) {
119
+ const entrySessionId = entry.session.sessionId;
120
+ const subagent = provenanceBySessionId.get(entrySessionId);
121
+ state.sessions.delete(entrySessionId);
122
+ state.retainedSessionCleanups.set(entrySessionId, {
123
+ stored: entry,
124
+ domainsCompleted: false,
125
+ });
126
+ state.tombstones.set(entrySessionId, {
127
+ sessionId: entrySessionId,
128
+ ...requireSessionGeneration(entry.session),
129
+ deletedAt,
130
+ rootSessionId: sessionId,
131
+ depth: (entry.session.depth ?? rootDepth) - rootDepth,
132
+ ...(entry.session.parentSessionId === undefined
133
+ ? {}
134
+ : { parentSessionId: entry.session.parentSessionId }),
135
+ ...(subagent === undefined ? {} : { subagent: cloneSerializable(subagent) }),
136
+ ...(entry.session.origin === undefined ? {} : { imported: true }),
137
+ });
138
+ }
139
+ return {
140
+ deletedSessions,
141
+ descendantRoots: [...descendantRoots],
142
+ };
143
+ }
144
+ async deleteSessionInternal(state, scopeId, scope, sessionId) {
145
+ const existingTombstone = state.tombstones.get(sessionId);
146
+ if (existingTombstone) {
147
+ const rootSessionId = existingTombstone.rootSessionId ?? existingTombstone.sessionId;
148
+ const descendantRoots = this.descendantTombstoneRoots(state, sessionId)
149
+ .filter((candidate) => candidate !== rootSessionId);
150
+ try {
151
+ const orphanErrors = await this.core.lifecycle.closeOrphanedResources(state.storageKey);
152
+ if (orphanErrors.length > 0)
153
+ throw combineErrors(orphanErrors);
154
+ for (const descendantRoot of descendantRoots) {
155
+ await this.finishTombstoneCleanup(state, descendantRoot, scopeId, { scopeId, scope });
156
+ }
157
+ await this.finishTombstoneCleanup(state, rootSessionId, scopeId, { scopeId, scope });
158
+ }
159
+ catch (error) {
160
+ throw this.core.projectOperationError(error, 'persistence', scopeId, sessionId, 'session-delete');
161
+ }
162
+ return;
163
+ }
164
+ const stored = this.core.requireSession(state, sessionId);
165
+ const reservation = await this.core.mutateScope(state, () => {
166
+ const subtree = this.collectSessionSubtree(state, sessionId);
167
+ const descendantRoots = this.descendantTombstoneRoots(state, sessionId);
168
+ return this.reserveLiveSessionDeletion(state, sessionId, stored, subtree, descendantRoots);
169
+ });
170
+ await this.finishReservedSessionDeletion(state, scopeId, scope, sessionId, reservation);
171
+ }
172
+ async finishReservedSessionDeletion(state, scopeId, scope, sessionId, reservation) {
173
+ const { deletedSessions, descendantRoots } = reservation;
174
+ const reason = this.core.trustInternalError(new FlexHarnessAbortError('The session subtree was deleted.'));
175
+ const configurationSettlement = this.core.configurations.abortSessionConfigurations(state.storageKey, reason, new Set(deletedSessions.map((deleted) => deleted.sessionId)));
176
+ if (configurationSettlement)
177
+ await configurationSettlement;
178
+ const slashCommandErrors = [];
179
+ for (const deleted of deletedSessions) {
180
+ const listingSettlement = this.core.commands.abortSlashCommandListings(state.storageKey, reason, deleted.sessionId);
181
+ if (listingSettlement)
182
+ await listingSettlement;
183
+ await this.core.commands.abortSlashCommandExecutions(state.storageKey, reason, slashCommandErrors, deleted.sessionId);
184
+ }
185
+ const childFirstDeletedSessions = [...deletedSessions].sort((left, right) => (right.depth ?? 0) - (left.depth ?? 0)
186
+ || left.sessionId.localeCompare(right.sessionId));
187
+ for (const deleted of childFirstDeletedSessions) {
188
+ const active = state.activeRuns.get(deleted.sessionId);
189
+ if (active) {
190
+ this.core.runs.cancelRun(active, reason, this.core.compaction.createCompactorContext(scopeId, scope, state.storageKey, deleted.sessionId));
191
+ }
192
+ }
193
+ try {
194
+ const orphanErrors = [
195
+ ...slashCommandErrors,
196
+ ...await this.core.lifecycle.closeOrphanedResources(state.storageKey),
197
+ ];
198
+ if (orphanErrors.length > 0)
199
+ throw combineErrors(orphanErrors);
200
+ for (const descendantRoot of descendantRoots) {
201
+ await this.finishTombstoneCleanup(state, descendantRoot, scopeId, { scopeId, scope });
202
+ }
203
+ await this.finishTombstoneCleanup(state, sessionId, scopeId, { scopeId, scope });
204
+ }
205
+ catch (error) {
206
+ throw this.core.projectOperationError(error, 'persistence', scopeId, sessionId, 'session-delete');
207
+ }
208
+ for (const deleted of childFirstDeletedSessions) {
209
+ this.core.emitEvent(scopeId, deleted, {
210
+ type: 'session.deleted',
211
+ session: publicSnapshot(deleted),
212
+ });
213
+ }
214
+ }
215
+ async cleanupSessionDomains(state, tombstone) {
216
+ const storageKey = state.storageKey;
217
+ const sessionId = tombstone.sessionId;
218
+ const projectManagementCleanup = async () => {
219
+ await this.core.projects.projectManagementQueues.get(this.core.projects.projectManagementKey(storageKey, sessionId));
220
+ await this.core.projects.tombstoneProjectManagementSession(state, tombstone);
221
+ };
222
+ const resultStore = this.core.stores.results;
223
+ const resultCleanup = async () => {
224
+ // A result being saved for the session is written before its results are deleted.
225
+ await this.core.results.resultQueues.get(this.core.results.resultQueueKey(storageKey, sessionId));
226
+ await resultStore.deleteSession(storageKey, sessionId);
227
+ };
228
+ const results = await Promise.allSettled([
229
+ this.core.stores.agentEvents.deleteSession(storageKey, sessionId),
230
+ this.core.stores.jobs.deleteSession(storageKey, sessionId),
231
+ this.core.stores.projections.deleteSession(storageKey, sessionId),
232
+ this.core.stores.permissions.deleteSession(storageKey, sessionId),
233
+ ...(resultStore ? [resultCleanup()] : []),
234
+ // An imported session refuses every project-management write, so it has no state to fence.
235
+ ...(tombstone.imported ? [] : [projectManagementCleanup()]),
236
+ ]);
237
+ const errors = results
238
+ .filter((result) => result.status === 'rejected')
239
+ .map((result) => result.reason);
240
+ if (errors.length > 0)
241
+ throw combineErrors(errors);
242
+ }
243
+ collectSessionSubtree(state, rootSessionId) {
244
+ const subtree = [];
245
+ const pending = [rootSessionId];
246
+ const seen = new Set();
247
+ while (pending.length > 0) {
248
+ const sessionId = pending.pop();
249
+ if (seen.has(sessionId)) {
250
+ throw new FlexHarnessValidationError('Session relationships contain a cycle.');
251
+ }
252
+ seen.add(sessionId);
253
+ const stored = state.sessions.get(sessionId);
254
+ if (!stored)
255
+ continue;
256
+ subtree.push(stored);
257
+ const children = [...state.sessions.values()]
258
+ .filter((candidate) => candidate.session.parentSessionId === sessionId)
259
+ .map((candidate) => candidate.session.sessionId)
260
+ .sort()
261
+ .reverse();
262
+ pending.push(...children);
263
+ }
264
+ return subtree;
265
+ }
266
+ tombstoneGroup(state, rootSessionId) {
267
+ return [...state.tombstones.values()]
268
+ .filter((tombstone) => (tombstone.rootSessionId ?? tombstone.sessionId) === rootSessionId)
269
+ .sort((left, right) => (right.depth ?? 0) - (left.depth ?? 0)
270
+ || left.sessionId.localeCompare(right.sessionId));
271
+ }
272
+ tombstonesForRoots(state, rootSessionIds) {
273
+ return [...new Set(rootSessionIds)]
274
+ .flatMap((rootSessionId) => this.tombstoneGroup(state, rootSessionId));
275
+ }
276
+ descendantTombstoneRoots(state, ancestorSessionId) {
277
+ return [...new Set([...state.tombstones.values()]
278
+ .map((tombstone) => tombstone.rootSessionId ?? tombstone.sessionId)
279
+ .filter((rootSessionId) => rootSessionId !== ancestorSessionId
280
+ && this.core.isSessionAncestor(state, ancestorSessionId, rootSessionId)))]
281
+ .sort((left, right) => this.core.sessionAncestryDepth(state, right) - this.core.sessionAncestryDepth(state, left)
282
+ || left.localeCompare(right));
283
+ }
284
+ orderTombstoneRootsChildFirst(state, rootSessionIds) {
285
+ return [...rootSessionIds].sort((left, right) => this.core.sessionAncestryDepth(state, right) - this.core.sessionAncestryDepth(state, left)
286
+ || left.localeCompare(right));
287
+ }
288
+ finishTombstoneCleanup(state, rootSessionId, scopeId, invocation) {
289
+ const existing = state.tombstoneCleanups.get(rootSessionId);
290
+ if (existing)
291
+ return existing;
292
+ let cleanup;
293
+ cleanup = this.finishTombstoneCleanupInternal(state, rootSessionId, scopeId, invocation).finally(() => {
294
+ if (state.tombstoneCleanups.get(rootSessionId) === cleanup) {
295
+ state.tombstoneCleanups.delete(rootSessionId);
296
+ }
297
+ });
298
+ state.tombstoneCleanups.set(rootSessionId, cleanup);
299
+ return cleanup;
300
+ }
301
+ async finishTombstoneCleanupInternal(state, rootSessionId, scopeId, invocation) {
302
+ for (const descendantRoot of this.descendantTombstoneRoots(state, rootSessionId)) {
303
+ await this.finishTombstoneCleanup(state, descendantRoot, scopeId, invocation);
304
+ }
305
+ const group = this.tombstoneGroup(state, rootSessionId);
306
+ if (group.length === 0)
307
+ return;
308
+ const exactInvocation = invocation ?? {
309
+ scopeId: state.scopeContext.scopeId,
310
+ scope: state.scopeContext.scope,
311
+ };
312
+ const groupIds = new Set(group.map((tombstone) => tombstone.sessionId));
313
+ const reason = this.core.trustInternalError(new FlexHarnessAbortError('The session subtree was deleted.'));
314
+ const contextFor = (sessionId, retained) => exactInvocation
315
+ ? this.core.compaction.createCompactorContext(exactInvocation.scopeId, exactInvocation.scope, state.storageKey, sessionId)
316
+ : retained?.stored.compactorContext;
317
+ for (const sessionId of groupIds) {
318
+ const retained = state.retainedSessionCleanups.get(sessionId);
319
+ const context = contextFor(sessionId, retained);
320
+ if (retained) {
321
+ this.core.compaction.abortCompactorLifecycle(retained.stored, reason);
322
+ this.core.prompts.cancelStoredPromptQueue(retained.stored, reason, undefined, context);
323
+ }
324
+ const run = state.activeRuns.get(sessionId);
325
+ if (run)
326
+ this.core.runs.cancelRun(run, reason, context);
327
+ }
328
+ await Promise.allSettled([...groupIds]
329
+ .map((sessionId) => state.sessionInitializations.get(sessionId))
330
+ .filter((completion) => completion !== undefined));
331
+ for (const tombstone of group) {
332
+ const sessionId = tombstone.sessionId;
333
+ const retained = state.retainedSessionCleanups.get(sessionId);
334
+ const errors = [];
335
+ const run = state.activeRuns.get(sessionId);
336
+ const context = contextFor(sessionId, retained);
337
+ if (retained && !retained.stored.agentSessionAbortCompleted) {
338
+ try {
339
+ await this.core.lifecycle.abortStoredSession(retained.stored, reason, context);
340
+ }
341
+ catch (error) {
342
+ errors.push(this.core.projectOperationError(error, 'agentSession', scopeId, sessionId, 'session-delete'));
343
+ }
344
+ }
345
+ if (run) {
346
+ const settled = await Promise.allSettled([run.completion]);
347
+ if (settled[0].status === 'rejected') {
348
+ this.core.appendUnexpectedErrors(errors, settled[0].reason);
349
+ }
350
+ }
351
+ errors.push(...await this.core.admission.settleDelegatedRunAdmissionOwners(this.core.admission.delegatedRunAdmissionOwnersForGeneration(state, tombstone)));
352
+ if (retained) {
353
+ if (retained.stored.promptQueueDrain) {
354
+ const settled = await Promise.allSettled([retained.stored.promptQueueDrain]);
355
+ if (settled[0].status === 'rejected')
356
+ errors.push(settled[0].reason);
357
+ }
358
+ try {
359
+ await this.core.lifecycle.closeStoredSession(retained.stored, context);
360
+ }
361
+ catch (error) {
362
+ this.core.appendUnexpectedErrors(errors, this.core.projectOperationError(error, 'toolCleanup', scopeId, sessionId, 'session-delete'));
363
+ }
364
+ }
365
+ if (errors.length > 0) {
366
+ if (retained
367
+ && state.lifecycle === 'retired'
368
+ && !this.core.lifecycle.storedSessionCleanupCompleted(retained.stored))
369
+ this.core.lifecycle.orphanedStoredSessions.add(retained.stored);
370
+ throw combineErrors(errors);
371
+ }
372
+ if (retained)
373
+ this.core.prompts.purgeStoredPromptQueue(retained.stored);
374
+ if (!retained?.domainsCompleted) {
375
+ if (this.core.lifecycle.hasOrphanedSessionResources(state.storageKey, sessionId)) {
376
+ throw new Error(`Session "${sessionId}" still has runtime cleanup ownership.`);
377
+ }
378
+ const releaseContext = exactInvocation ?? retained?.stored.compactorContext;
379
+ if (!releaseContext) {
380
+ throw new FlexHarnessValidationError('Tombstone cleanup requires its exact scope context before deleting projection data.');
381
+ }
382
+ await this.core.reversions.releaseDeletedSessionReversions(state, state.storageKey, tombstone, releaseContext.scopeId, releaseContext.scope, retained?.stored);
383
+ await this.cleanupSessionDomains(state, tombstone);
384
+ if (retained)
385
+ retained.domainsCompleted = true;
386
+ }
387
+ }
388
+ await this.core.mutateScope(state, () => {
389
+ for (const tombstone of group) {
390
+ state.tombstones.delete(tombstone.sessionId);
391
+ state.retainedSessionCleanups.delete(tombstone.sessionId);
392
+ }
393
+ }, true);
394
+ }
395
+ }
396
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5mbGV4aGFybmVzcy5kZWxldGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuZmxleGhhcm5lc3MuZGVsZXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHFCQUFxQixFQUNyQix3QkFBd0IsRUFDeEIsMEJBQTBCLEdBQzNCLE1BQU0sYUFBYSxDQUFDO0FBVXJCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxjQUFjLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRixPQUFPLEVBQ0wsMENBQTBDLEVBQzFDLGtCQUFrQixHQUNuQixNQUFNLHVCQUF1QixDQUFDO0FBUS9CLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUdqRixTQUFTLHdCQUF3QixDQUMvQixPQUdDLEVBQ0QsUUFBMEM7SUFFMUMsTUFBTSxNQUFNLEdBQUcsd0JBQXdCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakQsT0FBTyxNQUFNLENBQUMsbUJBQW1CLEtBQUssUUFBUSxDQUFDLG1CQUFtQjtXQUM3RCxNQUFNLENBQUMseUJBQXlCLEtBQUssUUFBUSxDQUFDLHlCQUF5QixDQUFDO0FBQy9FLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sMEJBQTBCO0lBQ1IsSUFBSTtJQUFqQyxZQUE2QixJQUE2QjtvQkFBN0IsSUFBSTtJQUE0QixDQUFDO0lBRXZELEtBQUssQ0FBQyw2QkFBNkIsQ0FDeEMsT0FBZSxFQUNmLEtBQThDO1FBRTlDLE1BQU0sU0FBUyxHQUFHLDBDQUEwQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BFLHlCQUF5QixDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGdCQUFnQixDQUFDLENBQUM7UUFDdEUsS0FBSyxNQUFNLEtBQUssSUFBSSxTQUFT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
@@ -0,0 +1,24 @@
1
+ import { type IFlexBeginSessionImportOptions, type IFlexImportedRun, type IFlexSession, type IFlexSessionImportHandle, type IFlexSessionImportProgress, type TFlexBeginSessionImportResult } from './interfaces.js';
2
+ import type { IStagedSessionImport, IStorageState } from './interfaces.flexharness.js';
3
+ import type { FlexHarnessCore } from './classes.flexharness.core.js';
4
+ /** Staged imports of finished conversations as read-only sessions. */
5
+ export declare class FlexHarnessSessionImports<TScope> {
6
+ private readonly core;
7
+ private readonly stagedSessionImports;
8
+ constructor(core: FlexHarnessCore<TScope>);
9
+ beginSessionImport(scopeId: string, options: IFlexBeginSessionImportOptions): Promise<TFlexBeginSessionImportResult>;
10
+ appendImportedRuns(handle: IFlexSessionImportHandle, runs: readonly IFlexImportedRun[]): Promise<IFlexSessionImportProgress>;
11
+ commitSessionImport(handle: IFlexSessionImportHandle): Promise<IFlexSession>;
12
+ abortSessionImport(handle: IFlexSessionImportHandle): Promise<void>;
13
+ assertNoCommittingSessionImport(state: IStorageState, sessionId: string): void;
14
+ private findStagedSessionImport;
15
+ private requireStagedSessionImport;
16
+ private armStagedImportIdleTimer;
17
+ private clearStagedImportIdleTimer;
18
+ releaseStagedSessionImport(staged: IStagedSessionImport): void;
19
+ /**
20
+ * An imported child session belongs to a committed imported parent whose run `parent.runId` holds
21
+ * the tool call `parent.toolCallId` naming the child, and no other session claims that tool call.
22
+ */
23
+ private requireImportParent;
24
+ }