@modelprofile.com/flexharness 10.23.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 (83) 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/dist_ts_compaction/plugins.d.ts +2 -2
  47. package/dist_ts_compaction/plugins.js +3 -3
  48. package/dist_ts_compaction/smartagent.compaction.js +6 -5
  49. package/dist_ts_stores_nosqldb/classes.nosqldbstores.d.ts +9 -0
  50. package/dist_ts_stores_nosqldb/classes.nosqldbstores.js +13 -1
  51. package/dist_ts_stores_nosqldb/classes.recordstore.d.ts +2 -2
  52. package/dist_ts_stores_nosqldb/classes.recordstore.js +3 -3
  53. package/package.json +3 -3
  54. package/readme.md +1 -1
  55. package/ts/00_commitinfo_data.ts +1 -1
  56. package/ts/classes.flexharness.admission.ts +331 -0
  57. package/ts/classes.flexharness.callbacks.ts +352 -0
  58. package/ts/classes.flexharness.compaction.ts +167 -0
  59. package/ts/classes.flexharness.configurations.ts +167 -0
  60. package/ts/classes.flexharness.core.ts +1830 -0
  61. package/ts/classes.flexharness.deletion.ts +616 -0
  62. package/ts/classes.flexharness.imports.ts +414 -0
  63. package/ts/classes.flexharness.lifecycle.ts +786 -0
  64. package/ts/classes.flexharness.permissions.ts +535 -0
  65. package/ts/classes.flexharness.projects.ts +1006 -0
  66. package/ts/classes.flexharness.prompts.ts +857 -0
  67. package/ts/classes.flexharness.providers.ts +322 -0
  68. package/ts/classes.flexharness.results.ts +98 -0
  69. package/ts/classes.flexharness.reversions.ts +1684 -0
  70. package/ts/classes.flexharness.runs.ts +1204 -0
  71. package/ts/classes.flexharness.sessions.ts +483 -0
  72. package/ts/classes.flexharness.slashcommands.ts +705 -0
  73. package/ts/classes.flexharness.subagents.ts +860 -0
  74. package/ts/classes.flexharness.tooldispatch.ts +475 -0
  75. package/ts/classes.flexharness.ts +147 -12567
  76. package/ts/interfaces.flexharness.ts +517 -0
  77. package/ts/readme.md +1 -1
  78. package/ts/utils.flexharness.ts +121 -0
  79. package/ts_compaction/plugins.ts +2 -2
  80. package/ts_compaction/smartagent.compaction.ts +5 -4
  81. package/ts_stores_nosqldb/classes.nosqldbstores.ts +13 -0
  82. package/ts_stores_nosqldb/classes.recordstore.ts +5 -5
  83. package/ts_stores_nosqldb/readme.md +7 -0
@@ -0,0 +1,19 @@
1
+ import type { IFlexPermissionRequest, IFlexPermissionRequestInput, TFlexPermissionDecision, TJsonValue } from './interfaces.js';
2
+ import type { IStorageState, IActiveRun, IPendingPermission } from './interfaces.flexharness.js';
3
+ import type { FlexHarnessCore } from './classes.flexharness.core.js';
4
+ /** Permission requests and responses, and the permission policy of sessions. */
5
+ export declare class FlexHarnessPermissions<TScope> {
6
+ private readonly core;
7
+ constructor(core: FlexHarnessCore<TScope>);
8
+ listPendingPermissions(scopeId: string, sessionId?: string): Promise<IFlexPermissionRequest[]>;
9
+ respondToPermission(scopeId: string, sessionId: string, permissionId: string, decision: TFlexPermissionDecision): Promise<void>;
10
+ requestPermission(state: IStorageState, run: IActiveRun, input: IFlexPermissionRequestInput, exactMetadata?: TJsonValue): Promise<void>;
11
+ private decideSessionPermissionPolicy;
12
+ private applyPermissionResponse;
13
+ private rollbackRememberedGrant;
14
+ private reconcileRememberedPermissionRemoval;
15
+ rejectRunPermissions(state: IStorageState, run: IActiveRun, error: unknown): void;
16
+ rejectPending(state: IStorageState, pending: IPendingPermission, error: unknown): void;
17
+ private forceRejectPending;
18
+ private mutatePermissions;
19
+ }
@@ -0,0 +1,450 @@
1
+ import * as plugins from './plugins.js';
2
+ import { FlexHarnessAbortError, FlexHarnessNotFoundError, FlexHarnessPermissionRejectedError, FlexHarnessPermissionStateError, FlexHarnessStoreConflictError, FlexHarnessStoreCommitUncertainError, FlexHarnessValidationError, } from './errors.js';
3
+ import { cloneSerializable, normalizeJsonValue } from './utils.json.js';
4
+ import { maxTransferMetadataBytes, publicSnapshot, truncateUtf8 } from './utils.transfer.js';
5
+ import { validateIdentifier } from './utils.validation.js';
6
+ import { requireSessionGeneration, combineErrors } from './utils.flexharness.js';
7
+ /** Permission requests and responses, and the permission policy of sessions. */
8
+ export class FlexHarnessPermissions {
9
+ core;
10
+ constructor(core) {
11
+ this.core = core;
12
+ }
13
+ async listPendingPermissions(scopeId, sessionId) {
14
+ const { state } = await this.core.resolveState(scopeId);
15
+ await state.scopeQueue;
16
+ this.core.assertStateAcceptingWork(state);
17
+ return publicSnapshot([...state.pendingPermissions.values()]
18
+ .map((pending) => pending.request)
19
+ .filter((request) => !sessionId || request.sessionId === sessionId)
20
+ .sort((left, right) => left.createdAt.localeCompare(right.createdAt)));
21
+ }
22
+ async respondToPermission(scopeId, sessionId, permissionId, decision) {
23
+ validateIdentifier(permissionId, 'permissionId');
24
+ const { scope, state } = await this.core.resolveState(scopeId);
25
+ const pending = state.pendingPermissions.get(permissionId);
26
+ if (!pending || pending.request.sessionId !== sessionId) {
27
+ throw new FlexHarnessNotFoundError('Permission', permissionId);
28
+ }
29
+ const context = this.core.compaction.createCompactorContext(scopeId, scope.scope, state.storageKey, sessionId);
30
+ const response = pending.responseQueue.then(() => this.core.compaction.withCompactorContext(context, () => this.applyPermissionResponse(state, pending, decision, context)));
31
+ pending.responseQueue = response.then(() => undefined, () => undefined);
32
+ return response;
33
+ }
34
+ async requestPermission(state, run, input, exactMetadata) {
35
+ validateIdentifier(input.kind, 'permission kind');
36
+ validateIdentifier(input.description, 'permission description');
37
+ if (input.rememberKey !== undefined)
38
+ validateIdentifier(input.rememberKey, 'rememberKey');
39
+ if (input.toolCallId !== undefined)
40
+ validateIdentifier(input.toolCallId, 'toolCallId');
41
+ run.controller.signal.throwIfAborted();
42
+ await run.stored.permissionQueue;
43
+ run.controller.signal.throwIfAborted();
44
+ if (state.activeRuns.get(run.sessionId) !== run || run.callbacksClosed) {
45
+ throw new FlexHarnessPermissionStateError(`Run "${run.runId}" no longer accepts permission requests.`);
46
+ }
47
+ if (!run.permissionPolicy && input.rememberKey && run.stored.rememberedPermissionKeys.has(input.rememberKey)) {
48
+ return;
49
+ }
50
+ const candidate = {
51
+ permissionId: plugins.crypto.randomUUID(),
52
+ scopeId: run.scopeId,
53
+ sessionId: run.sessionId,
54
+ ...requireSessionGeneration(run.stored.session),
55
+ runId: run.runId,
56
+ kind: input.kind,
57
+ description: truncateUtf8(input.description, maxTransferMetadataBytes),
58
+ ...(input.toolCallId ? { toolCallId: input.toolCallId } : {}),
59
+ ...(input.rememberKey ? { rememberKey: input.rememberKey } : {}),
60
+ ...(exactMetadata !== undefined
61
+ ? { metadata: cloneSerializable(exactMetadata) }
62
+ : input.metadata === undefined
63
+ ? {}
64
+ : { metadata: normalizeJsonValue(input.metadata, this.core.toolOutputLimits) }),
65
+ createdAt: new Date().toISOString(),
66
+ };
67
+ const policyDecision = run.permissionPolicy
68
+ ? await this.decideSessionPermissionPolicy(state, run, candidate)
69
+ : 'inherit';
70
+ if (policyDecision === 'allow' || policyDecision === 'deny') {
71
+ this.core.emitEvent(run.scopeId, run.stored.session, {
72
+ type: 'permission.resolved',
73
+ runId: run.runId,
74
+ request: publicSnapshot(candidate),
75
+ decision: policyDecision === 'allow' ? 'once' : 'reject',
76
+ origin: 'policy',
77
+ });
78
+ if (policyDecision === 'deny') {
79
+ const rejection = this.core.trustInternalError(new FlexHarnessPermissionRejectedError(candidate.permissionId));
80
+ this.core.runs.abortRunInternally(run, rejection);
81
+ throw rejection;
82
+ }
83
+ return;
84
+ }
85
+ if (policyDecision === 'inherit'
86
+ && input.rememberKey && run.stored.rememberedPermissionKeys.has(input.rememberKey))
87
+ return;
88
+ const request = { ...candidate };
89
+ if (policyDecision === 'ask') {
90
+ delete request.rememberKey;
91
+ request.requiresExplicitResponse = true;
92
+ }
93
+ let resolvePermission;
94
+ let rejectPermission;
95
+ const promise = new Promise((resolve, reject) => {
96
+ resolvePermission = resolve;
97
+ rejectPermission = reject;
98
+ });
99
+ void promise.catch(() => undefined);
100
+ const abortListener = () => {
101
+ const pending = state.pendingPermissions.get(request.permissionId);
102
+ if (pending)
103
+ this.rejectPending(state, pending, run.controller.signal.reason);
104
+ };
105
+ const pending = {
106
+ request,
107
+ run,
108
+ resolve: resolvePermission,
109
+ reject: rejectPermission,
110
+ settled: false,
111
+ responding: false,
112
+ responseQueue: Promise.resolve(),
113
+ abortListener,
114
+ };
115
+ const closePublication = this.core.openPublication(state, run.sessionId);
116
+ try {
117
+ state.pendingPermissions.set(request.permissionId, pending);
118
+ run.pendingPermissionIds.add(request.permissionId);
119
+ run.controller.signal.addEventListener('abort', abortListener, { once: true });
120
+ try {
121
+ await this.core.mutateScope(state, () => {
122
+ if (state.sessions.get(run.sessionId) !== run.stored) {
123
+ throw new FlexHarnessAbortError('The session was deleted while permission was pending.');
124
+ }
125
+ run.stored.session.status = 'waiting_permission';
126
+ run.stored.session.activity.status = 'waiting_permission';
127
+ run.stored.session.updatedAt = new Date().toISOString();
128
+ }, true);
129
+ }
130
+ catch (error) {
131
+ this.forceRejectPending(state, pending, this.core.projectExternalError(run, error, 'persistence'));
132
+ return promise;
133
+ }
134
+ if (!pending.settled) {
135
+ this.core.emitEvent(run.scopeId, run.stored.session, {
136
+ type: 'permission.requested',
137
+ runId: run.runId,
138
+ request: publicSnapshot(request),
139
+ });
140
+ }
141
+ }
142
+ finally {
143
+ closePublication();
144
+ }
145
+ return promise;
146
+ }
147
+ async decideSessionPermissionPolicy(state, run, request) {
148
+ const policy = run.permissionPolicy;
149
+ const signal = run.controller.signal;
150
+ const context = Object.freeze({
151
+ scopeId: run.scopeId,
152
+ scope: run.scope,
153
+ storageKey: state.storageKey,
154
+ sessionId: run.sessionId,
155
+ ...requireSessionGeneration(run.stored.session),
156
+ runId: run.runId,
157
+ configurationRef: run.stored.session.configurationRef,
158
+ ...(run.stored.session.agent === undefined ? {} : { agent: run.stored.session.agent }),
159
+ request: publicSnapshot(request),
160
+ signal,
161
+ });
162
+ let onAbort;
163
+ const aborted = new Promise((_resolve, reject) => {
164
+ onAbort = () => reject(signal.reason ?? this.core.trustInternalError(new FlexHarnessAbortError()));
165
+ });
166
+ signal.addEventListener('abort', onAbort, { once: true });
167
+ if (signal.aborted)
168
+ onAbort();
169
+ let decision;
170
+ try {
171
+ decision = await Promise.race([
172
+ Promise.resolve().then(() => {
173
+ signal.throwIfAborted();
174
+ return policy(context);
175
+ }),
176
+ aborted,
177
+ ]);
178
+ if (!['inherit', 'allow', 'ask', 'deny'].includes(decision)) {
179
+ throw new FlexHarnessValidationError('Session permissionPolicy returned an invalid decision.');
180
+ }
181
+ }
182
+ catch (error) {
183
+ if (signal.aborted)
184
+ throw signal.reason;
185
+ const projected = this.core.projectExternalError(run, error, 'permissionPolicy');
186
+ this.core.runs.abortRunInternally(run, projected);
187
+ throw projected;
188
+ }
189
+ finally {
190
+ signal.removeEventListener('abort', onAbort);
191
+ }
192
+ signal.throwIfAborted();
193
+ const generation = requireSessionGeneration(run.stored.session);
194
+ if (state.lifecycle !== 'active'
195
+ || state.activeRuns.get(run.sessionId) !== run
196
+ || state.sessions.get(run.sessionId) !== run.stored
197
+ || run.callbacksClosed
198
+ || generation.sessionGenerationId !== request.sessionGenerationId
199
+ || generation.sessionGenerationSequence !== request.sessionGenerationSequence) {
200
+ const ownershipError = this.core.trustInternalError(new FlexHarnessAbortError('Permission policy lost its exact run ownership.'));
201
+ this.core.runs.abortRunInternally(run, ownershipError);
202
+ throw ownershipError;
203
+ }
204
+ return decision;
205
+ }
206
+ async applyPermissionResponse(state, pending, decision, context) {
207
+ if (pending.settled) {
208
+ throw new FlexHarnessPermissionStateError(`Permission "${pending.request.permissionId}" has already been resolved.`);
209
+ }
210
+ if (!['once', 'always', 'reject'].includes(decision)) {
211
+ throw new FlexHarnessPermissionStateError(`Unknown permission decision "${decision}".`);
212
+ }
213
+ if (decision === 'always' && !pending.request.rememberKey) {
214
+ throw new FlexHarnessPermissionStateError('The always decision requires rememberKey.');
215
+ }
216
+ const stored = pending.run.stored;
217
+ const rememberKey = pending.request.rememberKey;
218
+ let addedRememberKey = false;
219
+ pending.responding = true;
220
+ try {
221
+ if (decision === 'always' && rememberKey) {
222
+ await this.mutatePermissions(state, stored, () => {
223
+ addedRememberKey = !stored.rememberedPermissionKeys.has(rememberKey);
224
+ stored.rememberedPermissionKeys.add(rememberKey);
225
+ });
226
+ }
227
+ await this.core.mutateScope(state, () => {
228
+ if (state.sessions.get(pending.request.sessionId) !== stored) {
229
+ throw new FlexHarnessAbortError('The session was deleted while permission was resolving.');
230
+ }
231
+ const hasOtherPending = [...state.pendingPermissions.values()].some((entry) => entry !== pending && !entry.settled && entry.request.sessionId === pending.request.sessionId);
232
+ stored.session.status = hasOtherPending ? 'waiting_permission' : 'running';
233
+ stored.session.activity.status = hasOtherPending ? 'waiting_permission' : 'running';
234
+ stored.session.updatedAt = new Date().toISOString();
235
+ }, true);
236
+ }
237
+ catch (error) {
238
+ pending.responding = false;
239
+ const projected = this.core.projectExternalError(pending.run, error, 'persistence');
240
+ const rollbackErrors = await this.rollbackRememberedGrant(state, pending, addedRememberKey, rememberKey);
241
+ if (pending.abortReason === undefined
242
+ && state.sessions.get(pending.request.sessionId) === stored
243
+ && stored.session.status !== 'waiting_permission') {
244
+ try {
245
+ await this.core.mutateScope(state, () => {
246
+ stored.session.status = 'waiting_permission';
247
+ stored.session.activity.status = 'waiting_permission';
248
+ stored.session.updatedAt = new Date().toISOString();
249
+ }, true);
250
+ }
251
+ catch (rollbackError) {
252
+ rollbackErrors.push(this.core.projectExternalError(pending.run, rollbackError, 'persistence'));
253
+ }
254
+ }
255
+ if (pending.abortReason !== undefined) {
256
+ this.forceRejectPending(state, pending, pending.abortReason);
257
+ }
258
+ if (rollbackErrors.length > 0 || state.lifecycle === 'fenced') {
259
+ if (!pending.settled)
260
+ this.forceRejectPending(state, pending, projected);
261
+ const combined = combineErrors([
262
+ ...(pending.abortReason === undefined ? [] : [pending.abortReason]),
263
+ projected,
264
+ ...rollbackErrors,
265
+ ]);
266
+ await this.core.lifecycle.fenceNamespace(state, pending.run, combined);
267
+ throw combined;
268
+ }
269
+ if (pending.abortReason !== undefined)
270
+ throw pending.abortReason;
271
+ throw projected;
272
+ }
273
+ if (pending.abortReason !== undefined) {
274
+ const rollbackErrors = await this.rollbackRememberedGrant(state, pending, addedRememberKey, rememberKey);
275
+ pending.responding = false;
276
+ this.forceRejectPending(state, pending, pending.abortReason);
277
+ if (rollbackErrors.length > 0) {
278
+ const combined = combineErrors([pending.abortReason, ...rollbackErrors]);
279
+ await this.core.lifecycle.fenceNamespace(state, pending.run, combined);
280
+ throw combined;
281
+ }
282
+ throw pending.abortReason;
283
+ }
284
+ pending.settled = true;
285
+ pending.responding = false;
286
+ state.pendingPermissions.delete(pending.request.permissionId);
287
+ pending.run.pendingPermissionIds.delete(pending.request.permissionId);
288
+ pending.run.controller.signal.removeEventListener('abort', pending.abortListener);
289
+ this.core.emitEvent(pending.request.scopeId, pending.run.stored.session, {
290
+ type: 'permission.resolved',
291
+ runId: pending.request.runId,
292
+ request: publicSnapshot(pending.request),
293
+ decision,
294
+ });
295
+ if (decision === 'reject') {
296
+ const rejection = this.core.trustInternalError(new FlexHarnessPermissionRejectedError(pending.request.permissionId));
297
+ this.core.runs.abortRunInternally(pending.run, rejection, context);
298
+ pending.reject(rejection);
299
+ }
300
+ else {
301
+ pending.resolve();
302
+ }
303
+ }
304
+ async rollbackRememberedGrant(state, pending, added, rememberKey) {
305
+ if (!added
306
+ || !rememberKey
307
+ || !pending.run.stored.rememberedPermissionKeys.has(rememberKey))
308
+ return [];
309
+ try {
310
+ await this.mutatePermissions(state, pending.run.stored, () => {
311
+ pending.run.stored.rememberedPermissionKeys.delete(rememberKey);
312
+ }, true);
313
+ return [];
314
+ }
315
+ catch (error) {
316
+ const initialError = this.core.projectExternalError(pending.run, error, 'persistence');
317
+ try {
318
+ await this.reconcileRememberedPermissionRemoval(pending.run.stored, state.storageKey, rememberKey);
319
+ return [];
320
+ }
321
+ catch (recoveryError) {
322
+ return [initialError, this.core.projectExternalError(pending.run, recoveryError, 'persistence')];
323
+ }
324
+ }
325
+ }
326
+ async reconcileRememberedPermissionRemoval(stored, storageKey, rememberKey) {
327
+ const operation = stored.permissionQueue.then(async () => {
328
+ let lastError;
329
+ for (let attempt = 0; attempt < 3; attempt++) {
330
+ try {
331
+ const current = await this.core.stores.permissions.load(storageKey, stored.session.sessionId);
332
+ if (!current || !current.rememberedPermissionKeys.includes(rememberKey)) {
333
+ stored.rememberedPermissionKeys = new Set(current?.rememberedPermissionKeys ?? []);
334
+ stored.permissionRevision = current?.revision ?? 0;
335
+ return;
336
+ }
337
+ const snapshot = {
338
+ ...current,
339
+ revision: current.revision + 1,
340
+ rememberedPermissionKeys: current.rememberedPermissionKeys.filter((entry) => entry !== rememberKey),
341
+ };
342
+ await this.core.stores.permissions.save(storageKey, stored.session.sessionId, snapshot, current.revision);
343
+ stored.rememberedPermissionKeys = new Set(snapshot.rememberedPermissionKeys);
344
+ stored.permissionRevision = snapshot.revision;
345
+ return;
346
+ }
347
+ catch (error) {
348
+ lastError = error;
349
+ }
350
+ }
351
+ throw lastError ?? new Error('Remembered permission rollback could not be reconciled.');
352
+ });
353
+ stored.permissionQueue = operation.then(() => undefined, () => undefined);
354
+ await operation;
355
+ }
356
+ rejectRunPermissions(state, run, error) {
357
+ for (const permissionId of [...run.pendingPermissionIds]) {
358
+ const pending = state.pendingPermissions.get(permissionId);
359
+ if (pending)
360
+ this.rejectPending(state, pending, error);
361
+ }
362
+ }
363
+ rejectPending(state, pending, error) {
364
+ if (pending.settled)
365
+ return;
366
+ if (pending.responding) {
367
+ pending.abortReason ??= error;
368
+ return;
369
+ }
370
+ this.forceRejectPending(state, pending, error);
371
+ }
372
+ forceRejectPending(state, pending, error) {
373
+ if (pending.settled)
374
+ return;
375
+ pending.settled = true;
376
+ state.pendingPermissions.delete(pending.request.permissionId);
377
+ pending.run.pendingPermissionIds.delete(pending.request.permissionId);
378
+ pending.run.controller.signal.removeEventListener('abort', pending.abortListener);
379
+ pending.reject(error);
380
+ }
381
+ mutatePermissions(state, stored, mutation, _allowDuringDrain = false) {
382
+ const operation = stored.permissionQueue.then(async () => {
383
+ const beforeRevision = stored.permissionRevision;
384
+ const beforeKeys = new Set(stored.rememberedPermissionKeys);
385
+ const beforeSnapshot = {
386
+ schemaVersion: 1,
387
+ revision: beforeRevision,
388
+ rememberedPermissionKeys: [...beforeKeys].sort(),
389
+ };
390
+ const restore = () => {
391
+ stored.permissionRevision = beforeRevision;
392
+ stored.rememberedPermissionKeys = beforeKeys;
393
+ };
394
+ let result;
395
+ try {
396
+ result = mutation();
397
+ }
398
+ catch (error) {
399
+ restore();
400
+ throw error;
401
+ }
402
+ const snapshot = {
403
+ schemaVersion: 1,
404
+ revision: beforeRevision + 1,
405
+ rememberedPermissionKeys: [...stored.rememberedPermissionKeys].sort(),
406
+ };
407
+ try {
408
+ await this.core.stores.permissions.save(state.storageKey, stored.session.sessionId, snapshot, beforeRevision);
409
+ stored.permissionRevision = snapshot.revision;
410
+ return result;
411
+ }
412
+ catch (error) {
413
+ if (error instanceof FlexHarnessStoreConflictError) {
414
+ restore();
415
+ throw error;
416
+ }
417
+ if (error instanceof FlexHarnessStoreCommitUncertainError) {
418
+ stored.permissionRevision = snapshot.revision;
419
+ state.lifecycle = 'fenced';
420
+ throw error;
421
+ }
422
+ let current;
423
+ let reconciliationError;
424
+ try {
425
+ current = await this.core.stores.permissions.load(state.storageKey, stored.session.sessionId);
426
+ }
427
+ catch (loadError) {
428
+ reconciliationError = loadError;
429
+ }
430
+ if (current && JSON.stringify(current) === JSON.stringify(snapshot)) {
431
+ stored.permissionRevision = snapshot.revision;
432
+ throw error;
433
+ }
434
+ if ((current === undefined && beforeRevision === 0)
435
+ || (current !== undefined && JSON.stringify(current) === JSON.stringify(beforeSnapshot))) {
436
+ restore();
437
+ throw error;
438
+ }
439
+ stored.permissionRevision = snapshot.revision;
440
+ state.lifecycle = 'fenced';
441
+ throw reconciliationError === undefined
442
+ ? error
443
+ : combineErrors([error, reconciliationError]);
444
+ }
445
+ });
446
+ stored.permissionQueue = operation.then(() => undefined, () => undefined);
447
+ return operation;
448
+ }
449
+ }
450
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5mbGV4aGFybmVzcy5wZXJtaXNzaW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuZmxleGhhcm5lc3MucGVybWlzc2lvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUNMLHFCQUFxQixFQUNyQix3QkFBd0IsRUFDeEIsa0NBQWtDLEVBQ2xDLCtCQUErQixFQUMvQiw2QkFBNkIsRUFDN0Isb0NBQW9DLEVBQ3BDLDBCQUEwQixHQUMzQixNQUFNLGFBQWEsQ0FBQztBQVVyQixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN4RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzdGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBTzNELE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUdqRixnRkFBZ0Y7QUFDaEYsTUFBTSxPQUFPLHNCQUFzQjtJQUNKO0lBQTdCLFlBQTZCLElBQTZCO1FBQTdCLFNBQUksR0FBSixJQUFJLENBQXlCO0lBQUcsQ0FBQztJQUV2RCxLQUFLLENBQUMsc0JBQXNCLENBQ2pDLE9BQWUsRUFDZixTQUFrQjtRQUVsQixNQUFNLEVBQUUsS0FBSyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4RCxNQUFNLEtBQUssQ0FBQyxVQUFVLENBQUM7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyxPQUFPLGNBQWMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxD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
@@ -0,0 +1,55 @@
1
+ import { type IFlexCreateProjectTaskInput, type IFlexProjectGoalResult, type IFlexProjectScratchpadResult, type IFlexProjectStateResult, type IFlexProjectTaskResult, type IFlexProjectTasksResult, type IFlexSessionTombstone, type IFlexUpdateProjectTaskInput } from './interfaces.js';
2
+ import type { IStorageState, IActiveRun } from './interfaces.flexharness.js';
3
+ import type { FlexHarnessCore } from './classes.flexharness.core.js';
4
+ /** The project tasks, goal and scratchpad that a session tree shares, and their agent tools. */
5
+ export declare class FlexHarnessProjectManagement<TScope> {
6
+ private readonly core;
7
+ readonly projectManagementQueues: Map<string, Promise<void>>;
8
+ constructor(core: FlexHarnessCore<TScope>);
9
+ getProjectState(scopeId: string, sessionId: string): Promise<IFlexProjectStateResult>;
10
+ listProjectTasks(scopeId: string, sessionId: string): Promise<IFlexProjectTasksResult>;
11
+ createProjectTask(scopeId: string, sessionId: string, input: IFlexCreateProjectTaskInput): Promise<IFlexProjectTaskResult>;
12
+ updateProjectTask(scopeId: string, sessionId: string, input: IFlexUpdateProjectTaskInput): Promise<IFlexProjectTaskResult>;
13
+ deleteProjectTask(scopeId: string, sessionId: string, taskId: string): Promise<IFlexProjectTaskResult>;
14
+ clearProjectTasks(scopeId: string, sessionId: string): Promise<IFlexProjectTasksResult>;
15
+ getProjectGoal(scopeId: string, sessionId: string): Promise<IFlexProjectGoalResult>;
16
+ setProjectGoal(scopeId: string, sessionId: string, goal: string): Promise<IFlexProjectGoalResult>;
17
+ clearProjectGoal(scopeId: string, sessionId: string): Promise<IFlexProjectGoalResult>;
18
+ getProjectScratchpad(scopeId: string, sessionId: string): Promise<IFlexProjectScratchpadResult>;
19
+ setProjectScratchpad(scopeId: string, sessionId: string, content: string): Promise<IFlexProjectScratchpadResult>;
20
+ appendProjectScratchpad(scopeId: string, sessionId: string, content: string): Promise<IFlexProjectScratchpadResult>;
21
+ clearProjectScratchpad(scopeId: string, sessionId: string): Promise<IFlexProjectScratchpadResult>;
22
+ private requireProjectManagementTools;
23
+ projectManagementKey(storageKey: string, sessionId: string): string;
24
+ private queueProjectManagementOperation;
25
+ awaitProjectManagementOperations(storageKey: string, sessionIds: Iterable<string>): Promise<void>;
26
+ private resolveProjectManagementSession;
27
+ private assertProjectManagementSession;
28
+ private loadProjectManagementState;
29
+ private readProjectManagementState;
30
+ private mutateProjectManagementState;
31
+ private projectStateResult;
32
+ private createProjectManagementSessionContext;
33
+ private projectTaskResult;
34
+ private projectTasksResult;
35
+ private projectGoalResult;
36
+ private projectScratchpadResult;
37
+ private createProjectTaskInState;
38
+ private updateProjectTaskInState;
39
+ private deleteProjectTaskInState;
40
+ private clearProjectTasksInState;
41
+ private setProjectGoalInState;
42
+ private clearProjectGoalInState;
43
+ private setProjectScratchpadInState;
44
+ private appendProjectScratchpadInState;
45
+ private clearProjectScratchpadInState;
46
+ createProjectTaskTool(run: IActiveRun): unknown;
47
+ createProjectGoalTool(run: IActiveRun): unknown;
48
+ createProjectScratchpadTool(run: IActiveRun): unknown;
49
+ private projectManagementAgentWriteContext;
50
+ private executeProjectTaskTool;
51
+ private executeProjectGoalTool;
52
+ private executeProjectScratchpadTool;
53
+ private createProjectTaskId;
54
+ tombstoneProjectManagementSession(state: IStorageState, sessionTombstone: IFlexSessionTombstone): Promise<void>;
55
+ }