@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.
- package/dist_ts/00_commitinfo_data.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/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_compaction/plugins.d.ts +2 -2
- package/dist_ts_compaction/plugins.js +3 -3
- package/dist_ts_compaction/smartagent.compaction.js +6 -5
- package/dist_ts_stores_nosqldb/classes.nosqldbstores.d.ts +9 -0
- package/dist_ts_stores_nosqldb/classes.nosqldbstores.js +13 -1
- package/dist_ts_stores_nosqldb/classes.recordstore.d.ts +2 -2
- package/dist_ts_stores_nosqldb/classes.recordstore.js +3 -3
- package/package.json +3 -3
- package/readme.md +1 -1
- 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/readme.md +1 -1
- package/ts/utils.flexharness.ts +121 -0
- package/ts_compaction/plugins.ts +2 -2
- package/ts_compaction/smartagent.compaction.ts +5 -4
- package/ts_stores_nosqldb/classes.nosqldbstores.ts +13 -0
- package/ts_stores_nosqldb/classes.recordstore.ts +5 -5
- 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
|
+
}
|