@modelprofile.com/flexharness 10.24.0 → 11.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_ts/00_commitinfo_data.js +2 -2
- package/dist_ts/classes.codesandbox.js +1 -1
- package/dist_ts/classes.flexharness.admission.d.ts +17 -0
- package/dist_ts/classes.flexharness.admission.js +263 -0
- package/dist_ts/classes.flexharness.callbacks.d.ts +38 -0
- package/dist_ts/classes.flexharness.callbacks.js +313 -0
- package/dist_ts/classes.flexharness.compaction.d.ts +25 -0
- package/dist_ts/classes.flexharness.compaction.js +87 -0
- package/dist_ts/classes.flexharness.configurations.d.ts +11 -0
- package/dist_ts/classes.flexharness.configurations.js +137 -0
- package/dist_ts/classes.flexharness.core.d.ts +143 -0
- package/dist_ts/classes.flexharness.core.js +1538 -0
- package/dist_ts/classes.flexharness.d.ts +2 -437
- package/dist_ts/classes.flexharness.deletion.d.ts +31 -0
- package/dist_ts/classes.flexharness.deletion.js +396 -0
- package/dist_ts/classes.flexharness.imports.d.ts +24 -0
- package/dist_ts/classes.flexharness.imports.js +345 -0
- package/dist_ts/classes.flexharness.js +119 -9776
- package/dist_ts/classes.flexharness.lifecycle.d.ts +47 -0
- package/dist_ts/classes.flexharness.lifecycle.js +625 -0
- package/dist_ts/classes.flexharness.permissions.d.ts +19 -0
- package/dist_ts/classes.flexharness.permissions.js +450 -0
- package/dist_ts/classes.flexharness.projects.d.ts +55 -0
- package/dist_ts/classes.flexharness.projects.js +575 -0
- package/dist_ts/classes.flexharness.prompts.d.ts +44 -0
- package/dist_ts/classes.flexharness.prompts.js +659 -0
- package/dist_ts/classes.flexharness.providers.d.ts +18 -0
- package/dist_ts/classes.flexharness.providers.js +267 -0
- package/dist_ts/classes.flexharness.results.d.ts +26 -0
- package/dist_ts/classes.flexharness.results.js +89 -0
- package/dist_ts/classes.flexharness.reversions.d.ts +52 -0
- package/dist_ts/classes.flexharness.reversions.js +1306 -0
- package/dist_ts/classes.flexharness.runs.d.ts +63 -0
- package/dist_ts/classes.flexharness.runs.js +1058 -0
- package/dist_ts/classes.flexharness.sessions.d.ts +20 -0
- package/dist_ts/classes.flexharness.sessions.js +381 -0
- package/dist_ts/classes.flexharness.slashcommands.d.ts +40 -0
- package/dist_ts/classes.flexharness.slashcommands.js +458 -0
- package/dist_ts/classes.flexharness.subagents.d.ts +31 -0
- package/dist_ts/classes.flexharness.subagents.js +690 -0
- package/dist_ts/classes.flexharness.tooldispatch.d.ts +53 -0
- package/dist_ts/classes.flexharness.tooldispatch.js +418 -0
- package/dist_ts/classes.stores.js +1 -1
- package/dist_ts/classes.toolcatalog.js +1 -1
- package/dist_ts/errors.js +1 -1
- package/dist_ts/functions.toolpermissions.js +1 -1
- package/dist_ts/interfaces.d.ts +3 -3
- package/dist_ts/interfaces.flexharness.d.ts +455 -0
- package/dist_ts/interfaces.flexharness.js +2 -0
- package/dist_ts/utils.flexharness.d.ts +19 -0
- package/dist_ts/utils.flexharness.js +83 -0
- package/dist_ts/utils.harnessoptions.js +1 -1
- package/dist_ts/utils.json.js +1 -1
- package/dist_ts/utils.schemadeclarations.js +1 -1
- package/dist_ts/utils.sessionimport.js +1 -1
- package/dist_ts/utils.sessionmetrics.d.ts +1 -1
- package/dist_ts_chat/classes.chatsession.js +1 -1
- package/dist_ts_chat_harness/classes.transcript.js +1 -1
- package/dist_ts_chat_harness/functions.intents.js +1 -1
- package/dist_ts_chat_harness/functions.mapping.d.ts +1 -1
- package/dist_ts_chat_harness/functions.mapping.js +1 -1
- package/dist_ts_chat_harness_server/classes.chathub.d.ts +18 -7
- package/dist_ts_chat_harness_server/classes.chathub.js +65 -62
- package/dist_ts_chat_harness_server/classes.chatsubscription.d.ts +5 -3
- package/dist_ts_chat_harness_server/classes.chatsubscription.js +4 -4
- package/dist_ts_chat_harness_server/classes.scopedirectory.d.ts +17 -0
- package/dist_ts_chat_harness_server/classes.scopedirectory.js +49 -0
- package/dist_ts_chat_harness_server/classes.sessionlists.d.ts +3 -5
- package/dist_ts_chat_harness_server/classes.sessionlists.js +11 -12
- package/dist_ts_chat_harness_server/classes.turngate.d.ts +8 -2
- package/dist_ts_chat_harness_server/classes.turngate.js +22 -21
- package/dist_ts_chat_harness_server/functions.errorprojector.js +1 -1
- package/dist_ts_chat_harness_server/index.d.ts +3 -2
- package/dist_ts_chat_harness_server/index.js +3 -2
- package/dist_ts_chat_harness_server/interfaces.d.ts +35 -2
- package/dist_ts_chat_harness_server/plugins.d.ts +1 -1
- package/dist_ts_chat_harness_typedsocket/classes.clienttransport.d.ts +28 -3
- package/dist_ts_chat_harness_typedsocket/classes.clienttransport.js +71 -15
- package/dist_ts_chat_harness_typedsocket/classes.serverbinding.d.ts +5 -3
- package/dist_ts_chat_harness_typedsocket/classes.serverbinding.js +79 -16
- package/dist_ts_chat_harness_typedsocket/index.d.ts +2 -2
- package/dist_ts_chat_harness_typedsocket/index.js +1 -1
- package/dist_ts_chat_harness_typedsocket/interfaces.requests.d.ts +20 -11
- package/dist_ts_chat_web/flexchat-input.js +1 -1
- package/dist_ts_chat_web/flexchat-message.js +1 -1
- package/dist_ts_chat_web/flexchat-window.js +1 -1
- package/dist_ts_compaction/smartagent.compaction.js +1 -1
- package/dist_ts_kvm/ocr.js +1 -1
- package/dist_ts_ocr/classes.imageocr.js +1 -1
- package/dist_ts_ocr/ocr.mistral.js +1 -1
- package/dist_ts_stores_nosqldb/classes.nosqldbstores.js +1 -1
- package/dist_ts_tools/tool.browser.js +1 -1
- package/dist_ts_tools/tool.filesystem.js +1 -1
- package/dist_ts_tools/tool.shell.js +1 -1
- package/dist_ts_tools_node/tool.context.js +1 -1
- package/dist_ts_typedrequest/catalog.d.ts +2 -2
- package/dist_ts_typedrequest/catalog.js +1 -1
- package/package.json +3 -3
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.flexharness.admission.ts +331 -0
- package/ts/classes.flexharness.callbacks.ts +352 -0
- package/ts/classes.flexharness.compaction.ts +167 -0
- package/ts/classes.flexharness.configurations.ts +167 -0
- package/ts/classes.flexharness.core.ts +1830 -0
- package/ts/classes.flexharness.deletion.ts +616 -0
- package/ts/classes.flexharness.imports.ts +414 -0
- package/ts/classes.flexharness.lifecycle.ts +786 -0
- package/ts/classes.flexharness.permissions.ts +535 -0
- package/ts/classes.flexharness.projects.ts +1006 -0
- package/ts/classes.flexharness.prompts.ts +857 -0
- package/ts/classes.flexharness.providers.ts +322 -0
- package/ts/classes.flexharness.results.ts +98 -0
- package/ts/classes.flexharness.reversions.ts +1684 -0
- package/ts/classes.flexharness.runs.ts +1204 -0
- package/ts/classes.flexharness.sessions.ts +483 -0
- package/ts/classes.flexharness.slashcommands.ts +705 -0
- package/ts/classes.flexharness.subagents.ts +860 -0
- package/ts/classes.flexharness.tooldispatch.ts +475 -0
- package/ts/classes.flexharness.ts +147 -12567
- package/ts/interfaces.flexharness.ts +517 -0
- package/ts/utils.flexharness.ts +121 -0
- package/ts_chat_harness_server/classes.chathub.ts +68 -61
- package/ts_chat_harness_server/classes.chatsubscription.ts +7 -5
- package/ts_chat_harness_server/classes.scopedirectory.ts +67 -0
- package/ts_chat_harness_server/classes.sessionlists.ts +11 -19
- package/ts_chat_harness_server/classes.turngate.ts +28 -21
- package/ts_chat_harness_server/index.ts +4 -5
- package/ts_chat_harness_server/interfaces.ts +35 -2
- package/ts_chat_harness_server/plugins.ts +0 -3
- package/ts_chat_harness_server/readme.md +6 -4
- package/ts_chat_harness_typedsocket/classes.clienttransport.ts +92 -23
- package/ts_chat_harness_typedsocket/classes.serverbinding.ts +88 -16
- package/ts_chat_harness_typedsocket/index.ts +4 -2
- package/ts_chat_harness_typedsocket/interfaces.requests.ts +15 -11
- package/ts_chat_harness_typedsocket/readme.md +7 -3
|
@@ -0,0 +1,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
|
+
}
|