@modelprofile.com/flexharness 10.24.0 → 10.24.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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/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
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@modelprofile.com/flexharness',
|
|
6
|
-
version: '10.24.
|
|
6
|
+
version: '10.24.1',
|
|
7
7
|
description: 'The FlexHarness toolbox source repository and shared dependency catalog.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSwrQkFBK0I7SUFDckMsT0FBTyxFQUFFLFNBQVM7SUFDbEIsV0FBVyxFQUFFLDBFQUEwRTtDQUN4RixDQUFBIn0=
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { IFlexSession, IFlexSubagentDefinition } from './interfaces.js';
|
|
2
|
+
import type { IStoredSessionState, IStorageState, IActiveRun, IDelegatedRunAdmissionSeed, IDelegatedRunAdmissionOwner, IQueuedPrompt } from './interfaces.flexharness.js';
|
|
3
|
+
import type { FlexHarnessCore } from './classes.flexharness.core.js';
|
|
4
|
+
/** Admission of delegated runs through the delegated run admission provider. */
|
|
5
|
+
export declare class FlexHarnessDelegatedRunAdmission<TScope> {
|
|
6
|
+
private readonly core;
|
|
7
|
+
constructor(core: FlexHarnessCore<TScope>);
|
|
8
|
+
assertDelegatedRunAdmissionOwnership(seed: IDelegatedRunAdmissionSeed, state: IStorageState, childStored: IStoredSessionState, scopeId: string): void;
|
|
9
|
+
acquireDelegatedRunAdmission(queued: IQueuedPrompt, run: IActiveRun): Promise<void>;
|
|
10
|
+
private normalizeDelegatedRunAdmissionLease;
|
|
11
|
+
private requestDelegatedRunAdmissionClose;
|
|
12
|
+
private startDelegatedRunAdmissionCloseAttempt;
|
|
13
|
+
closeRunDelegatedRunAdmission(run: IActiveRun, awaitSettlement?: boolean): Promise<void>;
|
|
14
|
+
createDelegatedRunAdmissionSeed(run: IActiveRun, child: IStoredSessionState, definition: Readonly<IFlexSubagentDefinition>, toolCallId: string): IDelegatedRunAdmissionSeed;
|
|
15
|
+
delegatedRunAdmissionOwnersForGeneration(state: IStorageState, session: Readonly<Pick<IFlexSession, 'sessionId' | 'sessionGenerationId' | 'sessionGenerationSequence'>>): IDelegatedRunAdmissionOwner[];
|
|
16
|
+
settleDelegatedRunAdmissionOwners(owners: readonly IDelegatedRunAdmissionOwner[]): Promise<Error[]>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
import { FlexHarnessAbortError, FlexHarnessValidationError } from './errors.js';
|
|
2
|
+
import { requireSessionGeneration } from './utils.flexharness.js';
|
|
3
|
+
/** Admission of delegated runs through the delegated run admission provider. */
|
|
4
|
+
export class FlexHarnessDelegatedRunAdmission {
|
|
5
|
+
core;
|
|
6
|
+
constructor(core) {
|
|
7
|
+
this.core = core;
|
|
8
|
+
}
|
|
9
|
+
assertDelegatedRunAdmissionOwnership(seed, state, childStored, scopeId) {
|
|
10
|
+
const child = childStored.session;
|
|
11
|
+
const parentRun = seed.parentRun;
|
|
12
|
+
const parent = seed.parentStored.session;
|
|
13
|
+
const parentPartId = parentRun.toolPartIds.get(seed.parentToolCallId);
|
|
14
|
+
const parentPart = parentRun.callbackParts.find((part) => part.type === 'tool'
|
|
15
|
+
&& part.partId === parentPartId
|
|
16
|
+
&& part.toolCallId === seed.parentToolCallId);
|
|
17
|
+
if (seed.state !== state
|
|
18
|
+
|| seed.storageKey !== state.storageKey
|
|
19
|
+
|| seed.scopeId !== scopeId
|
|
20
|
+
|| seed.childStored !== childStored
|
|
21
|
+
|| childStored.storageKey !== seed.storageKey
|
|
22
|
+
|| state.sessions.get(seed.sessionId) !== childStored
|
|
23
|
+
|| state.tombstones.has(seed.sessionId)
|
|
24
|
+
|| state.initializingSessions.has(seed.sessionId)
|
|
25
|
+
|| child.sessionId !== seed.sessionId
|
|
26
|
+
|| child.sessionGenerationId !== seed.sessionGenerationId
|
|
27
|
+
|| child.sessionGenerationSequence !== seed.sessionGenerationSequence
|
|
28
|
+
|| child.parentSessionId !== seed.parentSessionId
|
|
29
|
+
|| child.parentRunId !== seed.originParentRunId
|
|
30
|
+
|| child.parentToolCallId !== seed.originParentToolCallId
|
|
31
|
+
|| child.agent !== seed.agent
|
|
32
|
+
|| child.depth !== seed.depth
|
|
33
|
+
|| seed.parentStored !== parentRun.stored
|
|
34
|
+
|| seed.parentStored.storageKey !== seed.storageKey
|
|
35
|
+
|| parentRun.state !== state
|
|
36
|
+
|| parentRun.scopeId !== seed.scopeId
|
|
37
|
+
|| parentRun.scope !== seed.scope
|
|
38
|
+
|| parentRun.sessionId !== seed.parentSessionId
|
|
39
|
+
|| parentRun.queueId !== seed.parentQueueId
|
|
40
|
+
|| parentRun.runId !== seed.parentRunId
|
|
41
|
+
|| state.sessions.get(seed.parentSessionId) !== seed.parentStored
|
|
42
|
+
|| state.tombstones.has(seed.parentSessionId)
|
|
43
|
+
|| parent.sessionId !== seed.parentSessionId
|
|
44
|
+
|| parent.sessionGenerationId !== seed.parentSessionGenerationId
|
|
45
|
+
|| parent.sessionGenerationSequence !== seed.parentSessionGenerationSequence
|
|
46
|
+
|| state.activeRuns.get(seed.parentSessionId) !== parentRun
|
|
47
|
+
|| parentRun.callbacksClosed
|
|
48
|
+
|| parentRun.controller.signal.aborted
|
|
49
|
+
|| parentPart?.status !== 'running') {
|
|
50
|
+
throw this.core.trustInternalError(new FlexHarnessAbortError('The delegated prompt lost its exact parent or child ownership.'));
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
async acquireDelegatedRunAdmission(queued, run) {
|
|
54
|
+
const seed = queued.delegationSeed;
|
|
55
|
+
const provider = this.core.delegatedRunAdmissionProvider;
|
|
56
|
+
if (!seed || !provider)
|
|
57
|
+
return;
|
|
58
|
+
const context = Object.freeze({
|
|
59
|
+
scopeId: seed.scopeId,
|
|
60
|
+
scope: seed.scope,
|
|
61
|
+
storageKey: seed.storageKey,
|
|
62
|
+
sessionId: seed.sessionId,
|
|
63
|
+
sessionGenerationId: seed.sessionGenerationId,
|
|
64
|
+
sessionGenerationSequence: seed.sessionGenerationSequence,
|
|
65
|
+
queueId: queued.queueId,
|
|
66
|
+
runId: run.runId,
|
|
67
|
+
parentSessionId: seed.parentSessionId,
|
|
68
|
+
parentSessionGenerationId: seed.parentSessionGenerationId,
|
|
69
|
+
parentSessionGenerationSequence: seed.parentSessionGenerationSequence,
|
|
70
|
+
parentQueueId: seed.parentQueueId,
|
|
71
|
+
parentRunId: seed.parentRunId,
|
|
72
|
+
parentToolCallId: seed.parentToolCallId,
|
|
73
|
+
originParentRunId: seed.originParentRunId,
|
|
74
|
+
originParentToolCallId: seed.originParentToolCallId,
|
|
75
|
+
agent: seed.agent,
|
|
76
|
+
depth: seed.depth,
|
|
77
|
+
signal: run.controller.signal,
|
|
78
|
+
});
|
|
79
|
+
const owner = {
|
|
80
|
+
storageState: run.state,
|
|
81
|
+
run,
|
|
82
|
+
context,
|
|
83
|
+
status: 'acquiring',
|
|
84
|
+
acquisitionSettled: false,
|
|
85
|
+
acquisitionDetached: false,
|
|
86
|
+
closeAttemptSequence: 0,
|
|
87
|
+
};
|
|
88
|
+
run.state.delegatedRunAdmissionOwners.add(owner);
|
|
89
|
+
run.delegatedRunAdmissionOwner = owner;
|
|
90
|
+
const acquisition = Promise.resolve()
|
|
91
|
+
.then(() => provider.acquireDelegatedRunAdmission(context))
|
|
92
|
+
.then((lease) => this.normalizeDelegatedRunAdmissionLease(lease))
|
|
93
|
+
.then((lease) => {
|
|
94
|
+
owner.lease = lease;
|
|
95
|
+
owner.acquisitionSettled = true;
|
|
96
|
+
if (owner.status === 'acquiring')
|
|
97
|
+
owner.status = 'acquired';
|
|
98
|
+
if (owner.status === 'close-requested') {
|
|
99
|
+
void this.startDelegatedRunAdmissionCloseAttempt(owner).catch(() => undefined);
|
|
100
|
+
}
|
|
101
|
+
}, (error) => {
|
|
102
|
+
owner.acquisitionError = this.core.projectExternalError(run, error, 'delegatedRunAdmissionProvider');
|
|
103
|
+
owner.acquisitionSettled = true;
|
|
104
|
+
owner.status = 'closed';
|
|
105
|
+
run.state.delegatedRunAdmissionOwners.delete(owner);
|
|
106
|
+
});
|
|
107
|
+
owner.acquisitionCompletion = acquisition;
|
|
108
|
+
let resolveAbort;
|
|
109
|
+
const abort = new Promise((resolve) => {
|
|
110
|
+
resolveAbort = () => resolve('aborted');
|
|
111
|
+
});
|
|
112
|
+
run.controller.signal.addEventListener('abort', resolveAbort, { once: true });
|
|
113
|
+
if (run.controller.signal.aborted)
|
|
114
|
+
resolveAbort();
|
|
115
|
+
try {
|
|
116
|
+
const outcome = await Promise.race([
|
|
117
|
+
acquisition.then(() => 'settled'),
|
|
118
|
+
abort,
|
|
119
|
+
]);
|
|
120
|
+
if (outcome === 'aborted') {
|
|
121
|
+
owner.acquisitionDetached = true;
|
|
122
|
+
throw run.controller.signal.reason ?? this.core.trustInternalError(new FlexHarnessAbortError());
|
|
123
|
+
}
|
|
124
|
+
if (run.controller.signal.aborted) {
|
|
125
|
+
throw run.controller.signal.reason ?? this.core.trustInternalError(new FlexHarnessAbortError());
|
|
126
|
+
}
|
|
127
|
+
if (owner.acquisitionError)
|
|
128
|
+
throw owner.acquisitionError;
|
|
129
|
+
if (owner.status !== 'acquired' || !owner.lease) {
|
|
130
|
+
throw this.core.trustInternalError(new FlexHarnessAbortError('The delegated run admission was retired during acquisition.'));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
finally {
|
|
134
|
+
run.controller.signal.removeEventListener('abort', resolveAbort);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
normalizeDelegatedRunAdmissionLease(value) {
|
|
138
|
+
if (!value || (typeof value !== 'object' && typeof value !== 'function')) {
|
|
139
|
+
throw new FlexHarnessValidationError('Delegated run admission provider returned an invalid lease.');
|
|
140
|
+
}
|
|
141
|
+
const close = value.close;
|
|
142
|
+
if (typeof close !== 'function') {
|
|
143
|
+
throw new FlexHarnessValidationError('Delegated run admission provider returned an invalid lease.');
|
|
144
|
+
}
|
|
145
|
+
return Object.freeze({ close: () => close.call(value) });
|
|
146
|
+
}
|
|
147
|
+
requestDelegatedRunAdmissionClose(owner) {
|
|
148
|
+
const priorAttemptSequence = owner.closeAttemptSequence;
|
|
149
|
+
const joinedAttempt = owner.closeAttempt;
|
|
150
|
+
if (owner.status === 'closed')
|
|
151
|
+
return Promise.resolve();
|
|
152
|
+
if (owner.status !== 'retrying')
|
|
153
|
+
owner.status = 'close-requested';
|
|
154
|
+
return (async () => {
|
|
155
|
+
await owner.acquisitionCompletion;
|
|
156
|
+
if (owner.status === 'closed')
|
|
157
|
+
return;
|
|
158
|
+
if (joinedAttempt) {
|
|
159
|
+
await joinedAttempt;
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
if (owner.closeAttempt) {
|
|
163
|
+
await owner.closeAttempt;
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
if (owner.closeFailure && owner.closeFailure.sequence > priorAttemptSequence) {
|
|
167
|
+
throw owner.closeFailure.error;
|
|
168
|
+
}
|
|
169
|
+
await this.startDelegatedRunAdmissionCloseAttempt(owner);
|
|
170
|
+
})();
|
|
171
|
+
}
|
|
172
|
+
startDelegatedRunAdmissionCloseAttempt(owner) {
|
|
173
|
+
if (owner.closeAttempt)
|
|
174
|
+
return owner.closeAttempt;
|
|
175
|
+
if (!owner.lease) {
|
|
176
|
+
throw new Error('Acquired delegated run admission has no lease.');
|
|
177
|
+
}
|
|
178
|
+
owner.status = 'retrying';
|
|
179
|
+
owner.closeFailure = undefined;
|
|
180
|
+
const sequence = ++owner.closeAttemptSequence;
|
|
181
|
+
let attempt;
|
|
182
|
+
attempt = Promise.resolve()
|
|
183
|
+
.then(() => owner.lease.close())
|
|
184
|
+
.then(() => {
|
|
185
|
+
owner.status = 'closed';
|
|
186
|
+
delete owner.lease;
|
|
187
|
+
owner.storageState.delegatedRunAdmissionOwners.delete(owner);
|
|
188
|
+
}, (error) => {
|
|
189
|
+
const projected = this.core.projectExternalError(owner.run, error, 'delegatedRunAdmissionProvider');
|
|
190
|
+
owner.closeFailure = { sequence, error: projected };
|
|
191
|
+
owner.status = 'close-requested';
|
|
192
|
+
throw projected;
|
|
193
|
+
})
|
|
194
|
+
.finally(() => {
|
|
195
|
+
if (owner.closeAttempt === attempt)
|
|
196
|
+
owner.closeAttempt = undefined;
|
|
197
|
+
});
|
|
198
|
+
owner.closeAttempt = attempt;
|
|
199
|
+
return attempt;
|
|
200
|
+
}
|
|
201
|
+
async closeRunDelegatedRunAdmission(run, awaitSettlement = true) {
|
|
202
|
+
const owner = run.delegatedRunAdmissionOwner;
|
|
203
|
+
if (!owner)
|
|
204
|
+
return;
|
|
205
|
+
if (!run.delegatedRunAdmissionClose) {
|
|
206
|
+
run.delegatedRunAdmissionClose = this.requestDelegatedRunAdmissionClose(owner);
|
|
207
|
+
void run.delegatedRunAdmissionClose.catch(() => undefined);
|
|
208
|
+
}
|
|
209
|
+
if (awaitSettlement)
|
|
210
|
+
await run.delegatedRunAdmissionClose;
|
|
211
|
+
}
|
|
212
|
+
createDelegatedRunAdmissionSeed(run, child, definition, toolCallId) {
|
|
213
|
+
const childGeneration = requireSessionGeneration(child.session);
|
|
214
|
+
const parentGeneration = requireSessionGeneration(run.stored.session);
|
|
215
|
+
if (!child.session.parentRunId || !child.session.parentToolCallId) {
|
|
216
|
+
throw new FlexHarnessValidationError('Subagent session origin metadata is missing.');
|
|
217
|
+
}
|
|
218
|
+
const seed = Object.freeze({
|
|
219
|
+
state: run.state,
|
|
220
|
+
childStored: child,
|
|
221
|
+
parentRun: run,
|
|
222
|
+
parentStored: run.stored,
|
|
223
|
+
scopeId: run.scopeId,
|
|
224
|
+
scope: run.scope,
|
|
225
|
+
storageKey: run.state.storageKey,
|
|
226
|
+
sessionId: child.session.sessionId,
|
|
227
|
+
...childGeneration,
|
|
228
|
+
originParentRunId: child.session.parentRunId,
|
|
229
|
+
originParentToolCallId: child.session.parentToolCallId,
|
|
230
|
+
parentSessionId: run.sessionId,
|
|
231
|
+
parentSessionGenerationId: parentGeneration.sessionGenerationId,
|
|
232
|
+
parentSessionGenerationSequence: parentGeneration.sessionGenerationSequence,
|
|
233
|
+
parentQueueId: run.queueId,
|
|
234
|
+
parentRunId: run.runId,
|
|
235
|
+
parentToolCallId: toolCallId,
|
|
236
|
+
...(run.stored.session.configurationRef === undefined
|
|
237
|
+
? {}
|
|
238
|
+
: { configurationRef: run.stored.session.configurationRef }),
|
|
239
|
+
agent: definition.name,
|
|
240
|
+
depth: (run.stored.session.depth ?? 0) + 1,
|
|
241
|
+
});
|
|
242
|
+
this.assertDelegatedRunAdmissionOwnership(seed, run.state, child, run.scopeId);
|
|
243
|
+
return seed;
|
|
244
|
+
}
|
|
245
|
+
delegatedRunAdmissionOwnersForGeneration(state, session) {
|
|
246
|
+
return [...state.delegatedRunAdmissionOwners].filter((owner) => owner.storageState === state
|
|
247
|
+
&& owner.context.sessionId === session.sessionId
|
|
248
|
+
&& owner.context.sessionGenerationId === session.sessionGenerationId
|
|
249
|
+
&& owner.context.sessionGenerationSequence === session.sessionGenerationSequence);
|
|
250
|
+
}
|
|
251
|
+
async settleDelegatedRunAdmissionOwners(owners) {
|
|
252
|
+
const results = await Promise.allSettled(owners.map((owner) => this.requestDelegatedRunAdmissionClose(owner)));
|
|
253
|
+
return results.flatMap((result, index) => {
|
|
254
|
+
if (result.status === 'fulfilled')
|
|
255
|
+
return [];
|
|
256
|
+
const error = result.reason instanceof Error
|
|
257
|
+
? result.reason
|
|
258
|
+
: this.core.projectExternalError(owners[index].run, result.reason, 'delegatedRunAdmissionProvider');
|
|
259
|
+
return [error];
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5mbGV4aGFybmVzcy5hZG1pc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmZsZXhoYXJuZXNzLmFkbWlzc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFlaEYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHbEUsZ0ZBQWdGO0FBQ2hGLE1BQU0sT0FBTyxnQ0FBZ0M7SUFDZDtJQUE3QixZQUE2QixJQUE2QjtRQUE3QixTQUFJLEdBQUosSUFBSSxDQUF5QjtJQUFHLENBQUM7SUFFdkQsb0NBQW9DLENBQ3pDLElBQWdDLEVBQ2hDLEtBQW9CLEVBQ3BCLFdBQWdDLEVBQ2hDLE9BQWU7UUFFZixNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDO1FBQ2xDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDakMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUM7UUFDekMsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDdEUsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQWdDLEVBQUUsQ0FDckYsSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNO2VBQ2pCLElBQUksQ0FBQyxNQUFNLEtBQUssWUFBWTtlQUM1QixJQUFJLENBQUMsVUFBVSxLQUFLLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2hELElBQ0UsSUFBSSxDQUFDLEtBQUssS0FBSyxLQUFLO2VBQ2pCLElBQUksQ0FBQyxVQUFVLEtBQUssS0FBSyxDQUFDLFVBQVU7ZUFDcEMsSUFBSSxDQUFDLE9BQU8sS0FBSyxPQUFPO2VBQ3hCLElBQUksQ0FBQyxXQUFXLEtBQUssV0FBVztlQUNoQyxXQUFXLENBQUMsVUFBVSxLQUFLLElBQUksQ0FBQyxVQUFVO2VBQzFDLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxXQUFXO2VBQ2xELEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7ZUFDcEMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO2VBQzlDLEtBQUssQ0FBQyxTQUFTLEtBQUssSUFBSSxDQUFDLFNBQVM7ZUFDbEMsS0FBSyxDQUFDLG1CQUFtQixLQUFLLElBQUksQ0FBQyxtQkFBbUI7ZUFDdEQsS0FBSyxDQUFDLHlCQUF5QixLQUFLLElBQUksQ0FBQyx5QkFBeUI7ZUFDbEUsS0FBSyxDQUFDLGVBQWUsS0FBSyxJQUFJLENBQUMsZUFBZTtlQUM5QyxLQUFLLENBQUMsV0FBVyxLQUFLLElBQUksQ0FBQyxpQkFBaUI7ZUFDNUMsS0FBSyxDQUFDLGdCQUFnQixLQUFLLElBQUksQ0FBQyxzQkFBc0I7ZUFDdEQsS0FBSyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsS0FBSztlQUMxQixLQUFLLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxLQUFLO2VBQzFCLElBQUksQ0FBQyxZQUFZLEtBQUssU0FBUyxDQUFDLE1BQU07ZUFDdEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEtBQUssSUFBSSxDQUFDLFVBQVU7ZUFDaEQsU0FBUyxDQUFDLEtBQUssS0FBSyxLQUFLO2VBQ3pCLFNBQVMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLE9BQU87ZUFDbEMsU0FBUyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsS0FBSztlQUM5QixTQUFTLENBQUMsU0FBUyxLQUFLLElBQUksQ0FBQyxlQUFlO2VBQzVDLFNBQVMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLGFBQWE7ZUFDeEMsU0FBUyxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsV0FBVztlQUNwQyxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssSUFBSSxDQUFDLFlBQVk7ZUFDOUQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQztlQUMxQyxNQUFNLENBQUMsU0FBUyxLQUFLLElBQUksQ0FBQyxlQUFlO2VBQ3pDLE1BQU0sQ0FBQyxtQkFBbUIsS0FBSyxJQUFJLENBQUMseUJBQXlCO2VBQzdELE1BQU0sQ0FBQyx5QkFBeUIsS0FBSyxJQUFJLENBQUMsK0JBQStCO2VBQ3pFLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsS0FBSyxTQUFTO2VBQ3hELFNBQVMsQ0FBQyxlQUFlO2VBQ3pCLFNBQVMsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU87ZUFDbkMsVUFBVSxFQUFFLE1BQU0sS0FBSyxTQUFTLEVBQ25DLENBQUM7WUFDRCxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQ2hDLElBQUkscUJBQXFCLENBQUMsZ0VBQWdFLENBQUMsQ0FDNUYsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBRU0sS0FBSyxDQUFDLDRCQUE0QixDQUN2QyxNQUFxQixFQUNyQixHQUFlO1FBRWYsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQztRQUNuQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDO1FBQ3pELElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRO1lBQUUsT0FBTztRQUMvQixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1lBQzVCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQWU7WUFDM0IsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzNCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztZQUN6QixtQkFBbUIsRUFBRSxJQUFJLENBQUMsbUJBQW1CO1lBQzdDLHlCQUF5QixFQUFFLElBQUksQ0FBQyx5QkFBeUI7WUFDekQsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1lBQ3ZCLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSztZQUNoQixlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWU7WUFDckMseUJBQXlCLEVBQUUsSUFBSSxDQUFDLHlCQUF5QjtZQUN6RCwrQkFBK0IsRUFBRSxJQUFJLENBQUMsK0JBQStCO1lBQ3JFLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtZQUNqQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDN0IsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjtZQUN2QyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsaUJBQWlCO1lBQ3pDLHNCQUFzQixFQUFFLElBQUksQ0FBQyxzQkFBc0I7WUFDbkQsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixNQUFNLEVBQUUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNO1NBQzlCLENBQUMsQ0FBQztRQUNILE1BQU0sS0FBSyxHQUFnQztZQUN6QyxZQUFZLEVBQUUsR0FBRyxDQUFDLEtBQUs7WUFDdkIsR0FBRztZQUNILE9BQU87WUFDUCxNQUFNLEVBQUUsV0FBVztZQUNuQixrQkFBa0IsRUFBRSxLQUFLO1lBQ3pCLG1CQUFtQixFQUFFLEtBQUs7WUFDMUIsb0JBQW9CLEVBQUUsQ0FBQztTQUN4QixDQUFDO1FBQ0YsR0FBRyxDQUFDLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDakQsR0FBRyxDQUFDLDBCQUEwQixHQUFHLEtBQUssQ0FBQztRQUN2QyxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFO2FBQ2xDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsNEJBQTRCLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDMUQsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsbUNBQW1DLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDaEUsSUFBSSxDQUNILENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDUixLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUNwQixLQUFLLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDO1lBQ2hDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxXQUFXO2dCQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDO1lBQzVELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxpQkFBaUIsRUFBRSxDQUFDO2dCQUN2QyxLQUFLLElBQUksQ0FBQyxzQ0FBc0MsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDakYsQ0FBQztRQUNILENBQUMsRUFDRCxDQUFDLEtBQWMsRUFBRSxFQUFFO1lBQ2pCLEtBQUssQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUNyRCxHQUFHLEVBQ0gsS0FBSyxFQUNMLCtCQUErQixDQUNoQyxDQUFDO1lBQ0YsS0FBSyxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztZQUNoQyxLQUFLLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQztZQUN4QixHQUFHLENBQUMsS0FBSyxDQUFDLDJCQUEyQixDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0RCxDQUFDLENBQ0YsQ0FBQztRQUNKLEtBQUssQ0FBQyxxQkFBcUIsR0FBRyxXQUFXLENBQUM7UUFFMUMsSUFBSSxZQUF5QixDQUFDO1FBQzlCLE1BQU0sS0FBSyxHQUFHLElBQUksT0FBTyxDQUFZLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFDL0MsWUFBWSxHQUFHLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxQyxDQUFDLENBQUMsQ0FBQztRQUNILEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM5RSxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU87WUFBRSxZQUFZLEVBQUUsQ0FBQztRQUNsRCxJQUFJLENBQUM7WUFDSCxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxJQUFJLENBQUM7Z0JBQ2pDLFdBQVcsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsU0FBa0IsQ0FBQztnQkFDMUMsS0FBSzthQUNOLENBQUMsQ0FBQztZQUNILElBQUksT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUMxQixLQUFLLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDO2dCQUNqQyxNQUFNLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUkscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO1lBQ2xHLENBQUM7WUFDRCxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNsQyxNQUFNLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUkscUJBQXFCLEVBQUUsQ0FBQyxDQUFDO1lBQ2xHLENBQUM7WUFDRCxJQUFJLEtBQUssQ0FBQyxnQkFBZ0I7Z0JBQUUsTUFBTSxLQUFLLENBQUMsZ0JBQWdCLENBQUM7WUFDekQsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLFVBQVUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDaEQsTUFBTSxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUNoQyxJQUFJLHFCQUFxQixDQUFDLDZEQUE2RCxDQUFDLENBQ3pGLENBQUM7WUFDSixDQUFDO1FBQ0gsQ0FBQztnQkFBUyxDQUFDO1lBQ1QsR0FBRyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ25FLENBQUM7SUFDSCxDQUFDO0lBRU8sbUNBQW1DLENBQ3pDLEtBQXNDO1FBRXRDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLEtBQUssVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUN6RSxNQUFNLElBQUksMEJBQTBCLENBQ2xDLDZEQUE2RCxDQUM5RCxDQUFDO1FBQ0osQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFDMUIsSUFBSSxPQUFPLEtBQUssS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUNoQyxNQUFNLElBQUksMEJBQTBCLENBQ2xDLDZEQUE2RCxDQUM5RCxDQUFDO1FBQ0osQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMzRCxDQUFDO0lBRU8saUNBQWlDLENBQ3ZDLEtBQWtDO1FBRWxDLE1BQU0sb0JBQW9CLEdBQUcsS0FBSyxDQUFDLG9CQUFvQixDQUFDO1FBQ3hELE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7UUFDekMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLFFBQVE7WUFBRSxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUN4RCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssVUFBVTtZQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsaUJBQWlCLENBQUM7UUFDbEUsT0FBTyxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ2pCLE1BQU0sS0FBSyxDQUFDLHFCQUFxQixDQUFDO1lBQ2xDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxRQUFRO2dCQUFFLE9BQU87WUFDdEMsSUFBSSxhQUFhLEVBQUUsQ0FBQztnQkFDbEIsTUFBTSxhQUFhLENBQUM7Z0JBQ3BCLE9BQU87WUFDVCxDQUFDO1lBQ0QsSUFBSSxLQUFLLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sS0FBSyxDQUFDLFlBQVksQ0FBQztnQkFDekIsT0FBTztZQUNULENBQUM7WUFDRCxJQUFJLEtBQUssQ0FBQyxZQUFZLElBQUksS0FBSyxDQUFDLFlBQVksQ0FBQyxRQUFRLEdBQUcsb0JBQW9CLEVBQUUsQ0FBQztnQkFDN0UsTUFBTSxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQztZQUNqQyxDQUFDO1lBQ0QsTUFBTSxJQUFJLENBQUMsc0NBQXNDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0QsQ0FBQyxDQUFDLEVBQUUsQ0FBQztJQUNQLENBQUM7SUFFTyxzQ0FBc0MsQ0FDNUMsS0FBa0M7UUFFbEMsSUFBSSxLQUFLLENBQUMsWUFBWTtZQUFFLE9BQU8sS0FBSyxDQUFDLFlBQVksQ0FBQztRQUNsRCxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0RBQWdELENBQUMsQ0FBQztRQUNwRSxDQUFDO1FBQ0QsS0FBSyxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUM7UUFDMUIsS0FBSyxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUM7UUFDL0IsTUFBTSxRQUFRLEdBQUcsRUFBRSxLQUFLLENBQUMsb0JBQW9CLENBQUM7UUFDOUMsSUFBSSxPQUF1QixDQUFDO1FBQzVCLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFO2FBQ3hCLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBTSxDQUFDLEtBQUssRUFBRSxDQUFDO2FBQ2hDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDVCxLQUFLLENBQUMsTUFBTSxHQUFHLFFBQVEsQ0FBQztZQUN4QixPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDbkIsS0FBSyxDQUFDLFlBQVksQ0FBQywyQkFBMkIsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0QsQ0FBQyxFQUFFLENBQUMsS0FBYyxFQUFFLEVBQUU7WUFDcEIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FDOUMsS0FBSyxDQUFDLEdBQUcsRUFDVCxLQUFLLEVBQ0wsK0JBQStCLENBQ2hDLENBQUM7WUFDRixLQUFLLENBQUMsWUFBWSxHQUFHLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsQ0FBQztZQUNwRCxLQUFLLENBQUMsTUFBTSxHQUFHLGlCQUFpQixDQUFDO1lBQ2pDLE1BQU0sU0FBUyxDQUFDO1FBQ2xCLENBQUMsQ0FBQzthQUNELE9BQU8sQ0FBQyxHQUFHLEVBQUU7WUFDWixJQUFJLEtBQUssQ0FBQyxZQUFZLEtBQUssT0FBTztnQkFBRSxLQUFLLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQztRQUNyRSxDQUFDLENBQUMsQ0FBQztRQUNMLEtBQUssQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDO1FBQzdCLE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFFTSxLQUFLLENBQUMsNkJBQTZCLENBQ3hDLEdBQWUsRUFDZixlQUFlLEdBQUcsSUFBSTtRQUV0QixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsMEJBQTBCLENBQUM7UUFDN0MsSUFBSSxDQUFDLEtBQUs7WUFBRSxPQUFPO1FBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztZQUNwQyxHQUFHLENBQUMsMEJBQTBCLEdBQUcsSUFBSSxDQUFDLGlDQUFpQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQy9FLEtBQUssR0FBRyxDQUFDLDBCQUEwQixDQUFDLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3RCxDQUFDO1FBQ0QsSUFBSSxlQUFlO1lBQUUsTUFBTSxHQUFHLENBQUMsMEJBQTBCLENBQUM7SUFDNUQsQ0FBQztJQUVNLCtCQUErQixDQUNwQyxHQUFlLEVBQ2YsS0FBMEIsRUFDMUIsVUFBNkMsRUFDN0MsVUFBa0I7UUFFbEIsTUFBTSxlQUFlLEdBQUcsd0JBQXdCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sZ0JBQWdCLEdBQUcsd0JBQXdCLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0RSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDbEUsTUFBTSxJQUFJLDBCQUEwQixDQUFDLDhDQUE4QyxDQUFDLENBQUM7UUFDdkYsQ0FBQztRQUNELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDekIsS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLO1lBQ2hCLFdBQVcsRUFBRSxLQUFLO1lBQ2xCLFNBQVMsRUFBRSxHQUFHO1lBQ2QsWUFBWSxFQUFFLEdBQUcsQ0FBQyxNQUFNO1lBQ3hCLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTztZQUNwQixLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUs7WUFDaEIsVUFBVSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsVUFBVTtZQUNoQyxTQUFTLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTO1lBQ2xDLEdBQUcsZUFBZTtZQUNsQixpQkFBaUIsRUFBRSxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVc7WUFDNUMsc0JBQXNCLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0I7WUFDdEQsZUFBZSxFQUFFLEdBQUcsQ0FBQyxTQUFTO1lBQzlCLHlCQUF5QixFQUFFLGdCQUFnQixDQUFDLG1CQUFtQjtZQUMvRCwrQkFBK0IsRUFBRSxnQkFBZ0IsQ0FBQyx5QkFBeUI7WUFDM0UsYUFBYSxFQUFFLEdBQUcsQ0FBQyxPQUFPO1lBQzFCLFdBQVcsRUFBRSxHQUFHLENBQUMsS0FBSztZQUN0QixnQkFBZ0IsRUFBRSxVQUFVO1lBQzVCLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsS0FBSyxTQUFTO2dCQUNuRCxDQUFDLENBQUMsRUFBRTtnQkFDSixDQUFDLENBQUMsRUFBRSxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQzlELEtBQUssRUFBRSxVQUFVLENBQUMsSUFBSTtZQUN0QixLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQztTQUMzQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsb0NBQW9DLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvRSxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFTSx3Q0FBd0MsQ0FDN0MsS0FBb0IsRUFDcEIsT0FHRTtRQUVGLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQzdELEtBQUssQ0FBQyxZQUFZLEtBQUssS0FBSztlQUN6QixLQUFLLENBQUMsT0FBTyxDQUFDLFNBQVMsS0FBSyxPQUFPLENBQUMsU0FBUztlQUM3QyxLQUFLLENBQUMsT0FBTyxDQUFDLG1CQUFtQixLQUFLLE9BQU8sQ0FBQyxtQkFBbUI7ZUFDakUsS0FBSyxDQUFDLE9BQU8sQ0FBQyx5QkFBeUIsS0FBSyxPQUFPLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBRU0sS0FBSyxDQUFDLGlDQUFpQyxDQUM1QyxNQUE4QztRQUU5QyxNQUFNLE9BQU8sR0FBRyxNQUFNLE9BQU8sQ0FBQyxVQUFVLENBQ3RDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxpQ0FBaUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUNyRSxDQUFDO1FBQ0YsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO1lBQ3ZDLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxXQUFXO2dCQUFFLE9BQU8sRUFBRSxDQUFDO1lBQzdDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLFlBQVksS0FBSztnQkFDMUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNO2dCQUNmLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUM1QixNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxFQUNqQixNQUFNLENBQUMsTUFBTSxFQUNiLCtCQUErQixDQUNoQyxDQUFDO1lBQ04sT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGIn0=
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { type TFlexAgentToolCallUpdateEvent, type TFlexAgentToolCallFinishEvent } from './interfaces.js';
|
|
3
|
+
import { type ISessionMetricsOperation } from './utils.sessionmetrics.js';
|
|
4
|
+
import type { IStoredSessionState, IStorageState, IActiveRun } from './interfaces.flexharness.js';
|
|
5
|
+
import type { FlexHarnessCore } from './classes.flexharness.core.js';
|
|
6
|
+
/** The model stream callbacks of a run: text, reasoning, tool, retry and usage events. */
|
|
7
|
+
export declare class FlexHarnessRunCallbacks<TScope> {
|
|
8
|
+
private readonly core;
|
|
9
|
+
constructor(core: FlexHarnessCore<TScope>);
|
|
10
|
+
onTextDelta(state: IStorageState, sessionId: string, delta: string): void;
|
|
11
|
+
onReasoningStart(state: IStorageState, sessionId: string, id: string): void;
|
|
12
|
+
onReasoningDelta(state: IStorageState, sessionId: string, id: string, delta: string): void;
|
|
13
|
+
onReasoningEnd(state: IStorageState, sessionId: string, id: string, text: string): void;
|
|
14
|
+
private textAppendAccounting;
|
|
15
|
+
onToolStart(state: IStorageState, sessionId: string, event: {
|
|
16
|
+
toolCallId: string;
|
|
17
|
+
toolName: string;
|
|
18
|
+
input: unknown;
|
|
19
|
+
parentToolCallId?: string;
|
|
20
|
+
}): void;
|
|
21
|
+
onToolFinish(state: IStorageState, sessionId: string, event: TFlexAgentToolCallFinishEvent): void;
|
|
22
|
+
onToolUpdate(state: IStorageState, sessionId: string, event: TFlexAgentToolCallUpdateEvent): void;
|
|
23
|
+
onRetry(state: IStorageState, sessionId: string, retry: plugins.IAgentRetryEvent): void;
|
|
24
|
+
/**
|
|
25
|
+
* Emits the usage of every model call and adds reported usage to its run. A run executes a
|
|
26
|
+
* transactional generation, and `AgentSession.generate()` settles a transactional generation only
|
|
27
|
+
* after it has reported each of its model calls, also when it is aborted. `executeRun()` awaits
|
|
28
|
+
* that settlement before it builds the terminal, so the run is still active for each of its
|
|
29
|
+
* events: they all reach `run.usage` and precede its `run.finished`. The events bypass the
|
|
30
|
+
* callback limits and a failed callback: their number is bounded by the run's model calls, and
|
|
31
|
+
* the usage of a run that exhausted its callback budget or failed in a callback must not be lost.
|
|
32
|
+
*/
|
|
33
|
+
onModelCallUsage(state: IStorageState, stored: IStoredSessionState, event: plugins.TAgentModelCallUsageEvent): void;
|
|
34
|
+
settleMetricsOperation(state: IStorageState, stored: IStoredSessionState, operation: ISessionMetricsOperation): Promise<void>;
|
|
35
|
+
private callbackRun;
|
|
36
|
+
reserveCallbackCapacity(run: IActiveRun, eventCount: number, outputBytes: number, partCount: number): boolean;
|
|
37
|
+
private failCallback;
|
|
38
|
+
}
|