@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.
Files changed (69) 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/package.json +3 -3
  47. package/ts/00_commitinfo_data.ts +1 -1
  48. package/ts/classes.flexharness.admission.ts +331 -0
  49. package/ts/classes.flexharness.callbacks.ts +352 -0
  50. package/ts/classes.flexharness.compaction.ts +167 -0
  51. package/ts/classes.flexharness.configurations.ts +167 -0
  52. package/ts/classes.flexharness.core.ts +1830 -0
  53. package/ts/classes.flexharness.deletion.ts +616 -0
  54. package/ts/classes.flexharness.imports.ts +414 -0
  55. package/ts/classes.flexharness.lifecycle.ts +786 -0
  56. package/ts/classes.flexharness.permissions.ts +535 -0
  57. package/ts/classes.flexharness.projects.ts +1006 -0
  58. package/ts/classes.flexharness.prompts.ts +857 -0
  59. package/ts/classes.flexharness.providers.ts +322 -0
  60. package/ts/classes.flexharness.results.ts +98 -0
  61. package/ts/classes.flexharness.reversions.ts +1684 -0
  62. package/ts/classes.flexharness.runs.ts +1204 -0
  63. package/ts/classes.flexharness.sessions.ts +483 -0
  64. package/ts/classes.flexharness.slashcommands.ts +705 -0
  65. package/ts/classes.flexharness.subagents.ts +860 -0
  66. package/ts/classes.flexharness.tooldispatch.ts +475 -0
  67. package/ts/classes.flexharness.ts +147 -12567
  68. package/ts/interfaces.flexharness.ts +517 -0
  69. 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.0',
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5mbGV4aGFybmVzcy5hZG1pc3Npb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9jbGFzc2VzLmZsZXhoYXJuZXNzLmFkbWlzc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFlaEYsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFHbEUsZ0ZBQWdGO0FBQ2hGLE1BQU0sT0FBTyxnQ0FBZ0M7SUFDZDtJQUE3QixZQUE2QixJQUE2QjtRQUE3QixTQUFJLEdBQUosSUFBSSxDQUF5QjtJQUFHLENBQUM7SUFFdkQsb0NBQW9DLENBQ3pDLElBQWdDLEVBQ2hDLEtBQW9CLEVBQ3BCLFdBQWdDLEVBQ2hDLE9BQWU7UUFFZixNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDO1FBQ2xDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDakMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUM7UUFDekMsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDdEUsTUFBTSxVQUFVLEdBQUcsU0FBUyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQWdDLEVBQUUsQ0FDckYsSUFBSSxDQUFDLElBQUksS0FBSyxNQUFNO2VBQ2pCLElBQUksQ0FBQyxNQUFNLEtBQUssWUFBWTtlQUM1QixJQUFJLENBQUMsVUFBVSxLQUFLLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2hELElBQ0UsSUFBSSxDQUFDLEtBQUssS0FBSyxLQUFLO2VBQ2pCLElBQUksQ0FBQyxVQUFVLEtBQUssS0FBSyxDQUFDLFVBQVU7ZUFDcEMsSUFBSSxDQUFDLE9BQU8sS0FB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
@@ -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
+ }