@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
@@ -0,0 +1,458 @@
1
+ import * as plugins from './plugins.js';
2
+ import { FlexHarnessAbortError, FlexHarnessSessionBusyError, FlexHarnessSlashCommandReentryError, FlexHarnessSlashCommandUnavailableError, FlexHarnessValidationError, } from './errors.js';
3
+ import { normalizeJsonValue } from './utils.json.js';
4
+ import { normalizeFlexPrompt } from './utils.prompt.js';
5
+ import { FLEX_SLASH_COMMAND_INITIALIZE_TEMPLATE, expandSlashCommandTemplate, isReservedSlashCommandName, parseSlashCommand, slashCommandTemplateHints, } from './utils.slashcommands.js';
6
+ import { publicSnapshot } from './utils.transfer.js';
7
+ import { validateSlashCommandExecutionOptions } from './utils.validation.js';
8
+ import { slashCommandSessionUnavailableReason, requireSessionGeneration, } from './utils.flexharness.js';
9
+ const importedSessionUnavailableReason = 'Session is an imported conversation and is read-only.';
10
+ /** Slash command listing and execution, and the ownership of their activity. */
11
+ export class FlexHarnessSlashCommands {
12
+ core;
13
+ activeSlashCommandExecutions = new Map();
14
+ activeSlashCommandListings = new Set();
15
+ slashCommandInvocationContext = new plugins.AsyncLocalStorage();
16
+ slashCommandActivityContext = new plugins.AsyncLocalStorage();
17
+ constructor(core) {
18
+ this.core = core;
19
+ }
20
+ async listSlashCommands(scopeId, sessionId) {
21
+ const { scope, state } = await this.core.resolveState(scopeId);
22
+ return this.trackSlashCommandListing(scopeId, state, sessionId, async (signal) => {
23
+ await this.core.reversions.awaitReversionOperation(state.scopeQueue, signal);
24
+ signal.throwIfAborted();
25
+ this.core.assertStateAcceptingWork(state);
26
+ const stored = this.core.requireSession(state, sessionId);
27
+ const configuration = await this.core.configurations.resolveSessionConfiguration(scopeId, scope.scope, state, stored, signal);
28
+ await this.core.reversions.reconcileContextAvailability(state, stored);
29
+ signal.throwIfAborted();
30
+ const sessionAvailable = this.isSessionAvailableForSlashCommand(state, stored);
31
+ const reversionIdleReason = await this.core.reversions.reversionUnavailableReason(state, stored, false, signal);
32
+ signal.throwIfAborted();
33
+ const descriptors = this.createSlashCommandDescriptors(state, stored, sessionAvailable, reversionIdleReason, configuration.slashCommands);
34
+ if (stored.session.origin === undefined)
35
+ return descriptors;
36
+ return publicSnapshot(descriptors.map((descriptor) => ({
37
+ ...descriptor,
38
+ available: false,
39
+ unavailableReason: importedSessionUnavailableReason,
40
+ })));
41
+ });
42
+ }
43
+ createSlashCommandDescriptors(state, stored, sessionAvailable, reversionIdleReason, slashCommands = this.core.slashCommands) {
44
+ const sessionAvailability = sessionAvailable
45
+ ? {}
46
+ : { available: false, unavailableReason: slashCommandSessionUnavailableReason };
47
+ const undoUnit = this.core.reversions.reversionUnit(stored, 'undo');
48
+ const redoUnit = this.core.reversions.reversionUnit(stored, 'redo');
49
+ const workspaceReversion = (unit) => !unit
50
+ || !this.core.turnReversionProvider
51
+ || unit.segments.some((segment) => segment.provenance !== 'workspace')
52
+ ? 'unsupported'
53
+ : 'supported';
54
+ const reversionAvailability = (unit) => {
55
+ if (reversionIdleReason)
56
+ return {
57
+ available: false,
58
+ unavailableReason: reversionIdleReason,
59
+ };
60
+ if (!unit)
61
+ return { available: false, unavailableReason: 'No turn is available.' };
62
+ if (!unit.target.contextAvailable)
63
+ return {
64
+ available: false,
65
+ unavailableReason: 'The turn is beyond the context archive horizon.',
66
+ };
67
+ if (unit.segments.some((segment) => segment.disposition === 'revertible' && segment.workspaceReference === undefined))
68
+ return {
69
+ available: false,
70
+ unavailableReason: 'The turn has no available workspace reversion capture.',
71
+ };
72
+ return { available: true };
73
+ };
74
+ const compactAvailable = Boolean(this.core.agentSessionPolicy.contextCompactor) && sessionAvailable;
75
+ const compactUnavailableReason = !this.core.agentSessionPolicy.contextCompactor
76
+ ? 'No context compactor is configured.'
77
+ : !sessionAvailable
78
+ ? slashCommandSessionUnavailableReason
79
+ : undefined;
80
+ const initPrompt = expandSlashCommandTemplate(FLEX_SLASH_COMMAND_INITIALIZE_TEMPLATE, '', []);
81
+ const initAvailability = this.slashCommandPromptAvailability(state, stored, this.core.prompts.promptAdmissionByteSize(initPrompt, {}));
82
+ const descriptors = [
83
+ {
84
+ name: 'compact',
85
+ description: 'Compact the current session context.',
86
+ kind: 'builtin',
87
+ hints: [],
88
+ available: compactAvailable,
89
+ ...(compactUnavailableReason === undefined
90
+ ? {}
91
+ : { unavailableReason: compactUnavailableReason }),
92
+ workspaceReversion: 'not-applicable',
93
+ },
94
+ {
95
+ name: 'init',
96
+ description: 'Create or update AGENTS.md for the active workspace.',
97
+ kind: 'builtin',
98
+ hints: ['$ARGUMENTS'],
99
+ ...initAvailability,
100
+ workspaceReversion: 'not-applicable',
101
+ },
102
+ {
103
+ name: 'undo',
104
+ description: 'Undo the most recent session operation.',
105
+ kind: 'builtin',
106
+ hints: [],
107
+ ...reversionAvailability(undoUnit),
108
+ workspaceReversion: workspaceReversion(undoUnit),
109
+ },
110
+ {
111
+ name: 'redo',
112
+ description: 'Redo the most recently undone session operation.',
113
+ kind: 'builtin',
114
+ hints: [],
115
+ ...reversionAvailability(redoUnit),
116
+ workspaceReversion: workspaceReversion(redoUnit),
117
+ },
118
+ ];
119
+ for (const registration of slashCommands.values()) {
120
+ const template = typeof registration.template === 'string';
121
+ const availability = template
122
+ ? this.slashCommandPromptAvailability(state, stored, this.core.prompts.promptAdmissionByteSize(expandSlashCommandTemplate(registration.template, '', []), {}))
123
+ : { available: sessionAvailable, ...sessionAvailability };
124
+ descriptors.push({
125
+ name: registration.name,
126
+ description: registration.description ?? '',
127
+ kind: template ? 'template' : 'handler',
128
+ hints: template ? slashCommandTemplateHints(registration.template) : [],
129
+ ...availability,
130
+ workspaceReversion: 'not-applicable',
131
+ });
132
+ }
133
+ return publicSnapshot(descriptors);
134
+ }
135
+ async executeSlashCommand(scopeId, sessionId, untouchedInput, options = {}) {
136
+ return this.executeSlashCommandInternal(scopeId, sessionId, untouchedInput, options, false);
137
+ }
138
+ async executeSessionSlashCommand(scopeId, sessionId, untouchedInput, options = {}) {
139
+ return this.executeSlashCommandInternal(scopeId, sessionId, untouchedInput, options, true);
140
+ }
141
+ async executeSlashCommandInternal(scopeId, sessionId, untouchedInput, options, sessionAware) {
142
+ const currentInvocation = this.slashCommandInvocationContext.getStore();
143
+ if (currentInvocation?.scopeId === scopeId && currentInvocation.sessionId === sessionId) {
144
+ throw this.core.trustInternalError(new FlexHarnessSlashCommandReentryError(sessionId));
145
+ }
146
+ const parsed = parseSlashCommand(untouchedInput);
147
+ if (parsed.type !== 'parsed')
148
+ return parsed;
149
+ let registration = sessionAware ? undefined : this.core.slashCommands.get(parsed.name);
150
+ if (!sessionAware && !isReservedSlashCommandName(parsed.name) && !registration) {
151
+ return Object.freeze({
152
+ type: 'unknown',
153
+ input: parsed.input,
154
+ name: parsed.name,
155
+ rawArguments: parsed.rawArguments,
156
+ arguments: parsed.arguments,
157
+ });
158
+ }
159
+ const promptOptions = validateSlashCommandExecutionOptions(options);
160
+ const { scope, state } = await this.core.resolveState(scopeId);
161
+ await state.scopeQueue;
162
+ this.core.assertOpen();
163
+ this.core.assertStateAcceptingWork(state);
164
+ const stored = this.core.requireSession(state, sessionId);
165
+ this.core.assertSessionWritable(stored);
166
+ if (sessionAware) {
167
+ const configuration = await this.core.configurations.resolveSessionConfiguration(scopeId, scope.scope, state, stored, options.signal);
168
+ this.core.assertStateAcceptingWork(state);
169
+ if (state.sessions.get(sessionId) !== stored) {
170
+ throw this.core.trustInternalError(new FlexHarnessAbortError('The session was deleted during slash command resolution.'));
171
+ }
172
+ registration = configuration.slashCommands.get(parsed.name);
173
+ if (!isReservedSlashCommandName(parsed.name) && !registration) {
174
+ return Object.freeze({
175
+ type: 'unknown',
176
+ input: parsed.input,
177
+ name: parsed.name,
178
+ rawArguments: parsed.rawArguments,
179
+ arguments: parsed.arguments,
180
+ });
181
+ }
182
+ }
183
+ else if (stored.session.configurationRef !== undefined) {
184
+ throw new FlexHarnessValidationError('A bound session requires executeSessionSlashCommand().');
185
+ }
186
+ const sessionKey = this.slashCommandSessionKey(state.storageKey, sessionId);
187
+ const invocationOwner = this.slashCommandInvocationContext.getStore();
188
+ if (invocationOwner?.sessionKey === sessionKey) {
189
+ throw this.core.trustInternalError(new FlexHarnessSlashCommandReentryError(sessionId));
190
+ }
191
+ if (this.activeSlashCommandExecutions.has(sessionKey)) {
192
+ throw new FlexHarnessSessionBusyError(sessionId, 'already has an active slash command execution');
193
+ }
194
+ if (parsed.name === 'undo' || parsed.name === 'redo') {
195
+ if (parsed.arguments.length > 0) {
196
+ throw new FlexHarnessValidationError(`Slash command "/${parsed.name}" does not accept arguments.`);
197
+ }
198
+ await this.core.reversions.changeReversionCursorResolved(scopeId, sessionId, parsed.name, scope.scope, state, options.signal);
199
+ return Object.freeze({ type: 'operation', name: parsed.name });
200
+ }
201
+ if (parsed.name === 'compact') {
202
+ if (parsed.arguments.length > 0) {
203
+ throw new FlexHarnessValidationError('Slash command "/compact" does not accept arguments.');
204
+ }
205
+ const ignoredOption = ['system', 'maxSteps']
206
+ .find((key) => promptOptions[key] !== undefined);
207
+ if (ignoredOption) {
208
+ throw new FlexHarnessValidationError(`Slash command "/compact" does not support the "${ignoredOption}" option.`);
209
+ }
210
+ if (!this.core.agentSessionPolicy.contextCompactor) {
211
+ throw new FlexHarnessSlashCommandUnavailableError(parsed.name, 'No context compactor is configured.');
212
+ }
213
+ this.requireSessionAvailableForSlashCommand(state, stored, parsed.name);
214
+ return this.trackSlashCommandExecution(scopeId, state, sessionId, 'operation', options.signal, async (signal) => {
215
+ await this.core.reversions.commitRevertedBranch(state, stored, scopeId, scope.scope);
216
+ await this.core.compaction.compactStoredSession(scopeId, scope.scope, state, stored, promptOptions.modelHint, signal);
217
+ return Object.freeze({ type: 'operation', name: parsed.name });
218
+ });
219
+ }
220
+ if (options.signal?.aborted) {
221
+ throw this.core.trustInternalError(new FlexHarnessAbortError('The slash command was aborted.'));
222
+ }
223
+ if (parsed.name === 'init' || typeof registration?.template === 'string') {
224
+ const template = parsed.name === 'init'
225
+ ? FLEX_SLASH_COMMAND_INITIALIZE_TEMPLATE
226
+ : registration.template;
227
+ const expanded = expandSlashCommandTemplate(template, parsed.rawArguments, parsed.arguments);
228
+ normalizeFlexPrompt(expanded);
229
+ this.requireSlashCommandPromptAvailable(state, stored, parsed.name, this.core.prompts.promptAdmissionByteSize(expanded, promptOptions));
230
+ return this.trackSlashCommandExecution(scopeId, state, sessionId, 'prompt-admission', options.signal, async (signal) => {
231
+ const queued = await this.core.prompts.enqueuePromptInternal(scopeId, sessionId, expanded, promptOptions, undefined, undefined, undefined, signal, true);
232
+ const cancellation = this.core.trustInternalError(new FlexHarnessAbortError('The slash command prompt was aborted.'));
233
+ const cancel = () => {
234
+ const entry = queued.queued;
235
+ if (!entry)
236
+ return;
237
+ this.core.prompts.cancelQueuedPrompt(entry, cancellation, this.core.compaction.createCompactorContext(scopeId, scope.scope, state.storageKey, sessionId));
238
+ };
239
+ const cancellationSignals = options.signal && options.signal !== signal
240
+ ? [signal, options.signal]
241
+ : [signal];
242
+ for (const cancellationSignal of cancellationSignals) {
243
+ cancellationSignal.addEventListener('abort', cancel, { once: true });
244
+ }
245
+ if (cancellationSignals.some((cancellationSignal) => cancellationSignal.aborted))
246
+ cancel();
247
+ let admission;
248
+ try {
249
+ admission = await queued.started;
250
+ if (cancellationSignals.some((cancellationSignal) => cancellationSignal.aborted)) {
251
+ cancel();
252
+ throw cancellationSignals.find((cancellationSignal) => cancellationSignal.aborted)?.reason
253
+ ?? cancellation;
254
+ }
255
+ }
256
+ catch (error) {
257
+ for (const cancellationSignal of cancellationSignals) {
258
+ cancellationSignal.removeEventListener('abort', cancel);
259
+ }
260
+ throw error;
261
+ }
262
+ void admission.completion.finally(() => {
263
+ for (const cancellationSignal of cancellationSignals) {
264
+ cancellationSignal.removeEventListener('abort', cancel);
265
+ }
266
+ }).catch(() => undefined);
267
+ return Object.freeze({ type: 'prompt-admission', name: parsed.name, admission });
268
+ });
269
+ }
270
+ this.requireSessionAvailableForSlashCommand(state, stored, parsed.name);
271
+ return this.executeSlashCommandHandler(scopeId, scope.scope, state, stored, parsed.name, parsed.rawArguments, parsed.arguments, registration.handler, options.signal);
272
+ }
273
+ isSessionAvailableForSlashCommand(state, stored, allowPendingApply = false) {
274
+ return this.core.prompts.isSessionRuntimeIdle(state, stored)
275
+ && !this.activeSlashCommandExecutions.has(this.slashCommandSessionKey(state.storageKey, stored.session.sessionId))
276
+ && (stored.pendingReversion === undefined
277
+ || (allowPendingApply && stored.pendingReversion.kind === 'apply'));
278
+ }
279
+ slashCommandPromptUnavailableReason(state, stored, byteSize) {
280
+ if (state.lifecycle !== 'active')
281
+ return 'The session namespace is not accepting work.';
282
+ if (this.activeSlashCommandExecutions.has(this.slashCommandSessionKey(state.storageKey, stored.session.sessionId)))
283
+ return 'Session already has an active slash command execution.';
284
+ if (stored.pendingReversion)
285
+ return 'Session has a pending reversion operation.';
286
+ if (stored.session.agent !== undefined) {
287
+ return 'Subagent sessions can only be prompted through the foreground delegate tool.';
288
+ }
289
+ if (stored.outstandingPromptsById.size >= this.core.promptQueueLimits.maxOutstandingPromptsPerSession) {
290
+ return 'Session has reached its outstanding prompt limit.';
291
+ }
292
+ if (stored.outstandingPromptBytes + byteSize > this.core.promptQueueLimits.maxOutstandingBytesPerSession) {
293
+ return 'Session has reached its outstanding prompt byte limit.';
294
+ }
295
+ if (this.core.prompts.pendingPromptAdmissions >= this.core.promptQueueLimits.maxPendingAdmissions) {
296
+ return 'FlexHarness has reached its pending prompt admission limit.';
297
+ }
298
+ if (this.core.prompts.pendingPromptAdmissionBytes + byteSize > this.core.promptQueueLimits.maxPendingAdmissionBytes) {
299
+ return 'FlexHarness has reached its pending prompt admission byte limit.';
300
+ }
301
+ return undefined;
302
+ }
303
+ slashCommandPromptAvailability(state, stored, byteSize) {
304
+ const unavailableReason = this.slashCommandPromptUnavailableReason(state, stored, byteSize);
305
+ return unavailableReason === undefined
306
+ ? { available: true }
307
+ : { available: false, unavailableReason };
308
+ }
309
+ requireSlashCommandPromptAvailable(state, stored, commandName, byteSize) {
310
+ const reason = this.slashCommandPromptUnavailableReason(state, stored, byteSize);
311
+ if (reason)
312
+ throw new FlexHarnessSlashCommandUnavailableError(commandName, reason);
313
+ }
314
+ slashCommandSessionKey(storageKey, sessionId) {
315
+ return JSON.stringify([storageKey, sessionId]);
316
+ }
317
+ requireSessionAvailableForSlashCommand(state, stored, commandName) {
318
+ if (!this.isSessionAvailableForSlashCommand(state, stored)) {
319
+ throw new FlexHarnessSlashCommandUnavailableError(commandName, slashCommandSessionUnavailableReason);
320
+ }
321
+ }
322
+ trackSlashCommandExecution(scopeId, state, sessionId, kind, externalSignal, operation) {
323
+ const sessionKey = this.slashCommandSessionKey(state.storageKey, sessionId);
324
+ if (this.activeSlashCommandExecutions.has(sessionKey)) {
325
+ throw new FlexHarnessSessionBusyError(sessionId, 'already has an active slash command execution');
326
+ }
327
+ const controller = new AbortController();
328
+ const abortFromExternalSignal = () => {
329
+ if (!controller.signal.aborted) {
330
+ controller.abort(this.core.trustInternalError(new FlexHarnessAbortError('The slash command was aborted.')));
331
+ }
332
+ };
333
+ externalSignal?.addEventListener('abort', abortFromExternalSignal, { once: true });
334
+ if (externalSignal?.aborted)
335
+ abortFromExternalSignal();
336
+ const activityOwner = Object.freeze({ scopeId, storageKey: state.storageKey, sessionId });
337
+ const completion = Promise.resolve().then(() => this.slashCommandActivityContext.run(activityOwner, () => {
338
+ if (controller.signal.aborted)
339
+ throw controller.signal.reason;
340
+ return operation(controller.signal);
341
+ }));
342
+ const active = {
343
+ kind,
344
+ storageKey: state.storageKey,
345
+ sessionId,
346
+ controller,
347
+ completion,
348
+ };
349
+ this.activeSlashCommandExecutions.set(sessionKey, active);
350
+ return completion.finally(() => {
351
+ externalSignal?.removeEventListener('abort', abortFromExternalSignal);
352
+ if (this.activeSlashCommandExecutions.get(sessionKey) === active) {
353
+ this.activeSlashCommandExecutions.delete(sessionKey);
354
+ }
355
+ });
356
+ }
357
+ trackSlashCommandListing(scopeId, state, sessionId, operation) {
358
+ const controller = new AbortController();
359
+ const activityOwner = Object.freeze({ scopeId, storageKey: state.storageKey, sessionId });
360
+ const completion = Promise.resolve().then(() => this.slashCommandActivityContext.run(activityOwner, () => operation(controller.signal)));
361
+ const active = {
362
+ storageKey: state.storageKey,
363
+ sessionId,
364
+ controller,
365
+ completion,
366
+ };
367
+ this.activeSlashCommandListings.add(active);
368
+ return completion.finally(() => {
369
+ this.activeSlashCommandListings.delete(active);
370
+ });
371
+ }
372
+ async executeSlashCommandHandler(scopeId, scope, state, stored, commandName, rawArguments, arguments_, handler, externalSignal) {
373
+ const sessionKey = this.slashCommandSessionKey(state.storageKey, stored.session.sessionId);
374
+ const invocationOwner = this.slashCommandInvocationContext.getStore();
375
+ if (invocationOwner?.sessionKey === sessionKey) {
376
+ throw this.core.trustInternalError(new FlexHarnessSlashCommandReentryError(stored.session.sessionId));
377
+ }
378
+ if (this.activeSlashCommandExecutions.has(sessionKey)) {
379
+ throw new FlexHarnessSessionBusyError(stored.session.sessionId, 'already has an active slash command execution');
380
+ }
381
+ const owner = Object.freeze({
382
+ scopeId,
383
+ storageKey: state.storageKey,
384
+ sessionId: stored.session.sessionId,
385
+ sessionKey,
386
+ });
387
+ return this.trackSlashCommandExecution(scopeId, state, stored.session.sessionId, 'handler', externalSignal, (signal) => this.slashCommandInvocationContext.run(owner, async () => {
388
+ const context = Object.freeze({
389
+ scopeId,
390
+ scope,
391
+ storageKey: state.storageKey,
392
+ sessionId: stored.session.sessionId,
393
+ ...requireSessionGeneration(stored.session),
394
+ rawArguments,
395
+ arguments: arguments_,
396
+ signal,
397
+ });
398
+ try {
399
+ await this.core.reversions.commitRevertedBranch(state, stored, scopeId, scope);
400
+ const result = await handler(context);
401
+ return Object.freeze({
402
+ type: 'handler-result',
403
+ name: commandName,
404
+ result: normalizeJsonValue(result === undefined ? null : result, this.core.toolOutputLimits),
405
+ });
406
+ }
407
+ catch (error) {
408
+ throw this.core.projectOperationError(error, 'slashCommand', scopeId, stored.session.sessionId, `slash-command:${commandName}`);
409
+ }
410
+ }));
411
+ }
412
+ async abortSlashCommandExecutions(storageKey, reason, errors, sessionId) {
413
+ const active = [...this.activeSlashCommandExecutions.values()]
414
+ .filter((execution) => (storageKey === undefined || execution.storageKey === storageKey)
415
+ && (sessionId === undefined || execution.sessionId === sessionId));
416
+ for (const execution of active) {
417
+ if (!execution.controller.signal.aborted)
418
+ execution.controller.abort(reason);
419
+ }
420
+ const awaited = active.filter((execution) => execution.kind !== 'prompt-admission');
421
+ const results = await Promise.allSettled(awaited.map((execution) => execution.completion));
422
+ for (let index = 0; index < results.length; index++) {
423
+ const result = results[index];
424
+ if (result.status === 'rejected' && awaited[index].kind === 'handler') {
425
+ this.core.appendUnexpectedErrors(errors, result.reason);
426
+ }
427
+ }
428
+ }
429
+ abortSlashCommandListings(storageKey, reason, sessionId) {
430
+ const active = [...this.activeSlashCommandListings]
431
+ .filter((listing) => (storageKey === undefined || listing.storageKey === storageKey)
432
+ && (sessionId === undefined || listing.sessionId === sessionId));
433
+ if (active.length === 0)
434
+ return undefined;
435
+ for (const listing of active) {
436
+ if (!listing.controller.signal.aborted)
437
+ listing.controller.abort(reason);
438
+ }
439
+ return Promise.allSettled(active.map((listing) => listing.completion)).then(() => undefined);
440
+ }
441
+ ambientSlashCommandOwner(criteria = {}) {
442
+ const matches = (owner) => ((criteria.scopeId === undefined || owner.scopeId === criteria.scopeId)
443
+ && (criteria.storageKey === undefined || owner.storageKey === criteria.storageKey)
444
+ && (criteria.sessionId === undefined || owner.sessionId === criteria.sessionId));
445
+ const invocationOwner = this.slashCommandInvocationContext.getStore();
446
+ if (invocationOwner && matches(invocationOwner))
447
+ return invocationOwner;
448
+ const activityOwner = this.slashCommandActivityContext.getStore();
449
+ return activityOwner && matches(activityOwner) ? activityOwner : undefined;
450
+ }
451
+ assertNoAmbientSlashCommandTeardown(criteria = {}) {
452
+ const owner = this.ambientSlashCommandOwner(criteria);
453
+ if (owner) {
454
+ throw this.core.trustInternalError(new FlexHarnessSlashCommandReentryError(owner.sessionId));
455
+ }
456
+ }
457
+ }
458
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5mbGV4aGFybmVzcy5zbGFzaGNvbW1hbmRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5mbGV4aGFybmVzcy5zbGFzaGNvbW1hbmRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsMkJBQTJCLEVBQzNCLG1DQUFtQyxFQUNuQyx1Q0FBdUMsRUFDdkMsMEJBQTBCLEdBQzNCLE1BQU0sYUFBYSxDQUFDO0FBUXJCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXhELE9BQU8sRUFDTCxzQ0FBc0MsRUFDdEMsMEJBQTBCLEVBQzFCLDBCQUEwQixFQUMxQixpQkFBaUIsRUFDakIseUJBQXlCLEdBQzFCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBUzdFLE9BQU8sRUFDTCxvQ0FBb0MsRUFDcEMsd0JBQXdCLEdBQ3pCLE1BQU0sd0JBQXdCLENBQUM7QUFHaEMsTUFBTSxnQ0FBZ0MsR0FBRyx1REFBdUQsQ0FBQztBQUVqRyxnRkFBZ0Y7QUFDaEYsTUFBTSxPQUFPLHdCQUF3QjtJQVVOO0lBVGIsNEJBQTRCLEdBQUcsSUFBSSxHQUFHLEVBQXdDLENBQUM7SUFDOUUsMEJBQTBCLEdBQUcsSUFBSSxHQUFHLEVBQThCLENBQUM7SUFDcEUsNkJBQTZCLEdBQUcsSUFBSSxPQUFPLENBQUMsaUJBQWlCLEVBRTFFLENBQUM7SUFDWSwyQkFBMkIsR0FBRyxJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsRUFFeEUsQ0FBQztJQUVKLFlBQTZCLElBQTZCO1FBQTdCLFNB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
@@ -0,0 +1,31 @@
1
+ import type { IFlexBackgroundExecution, IFlexSteerAdmission, IFlexSteerInput, IFlexSession, IFlexSubagentProvenance } from './interfaces.js';
2
+ import type { IStorageState, IActiveRun } from './interfaces.flexharness.js';
3
+ import type { FlexHarnessCore } from './classes.flexharness.core.js';
4
+ /** Subagent tasks: delegation tools, child sessions, task input and background executions. */
5
+ export declare class FlexHarnessSubagents<TScope> {
6
+ private readonly core;
7
+ constructor(core: FlexHarnessCore<TScope>);
8
+ sendSubagentInput(scopeId: string, parentSessionId: string, parentRunId: string, taskId: string, steer: IFlexSteerInput): Promise<IFlexSteerAdmission>;
9
+ private sendSubagentInputInRun;
10
+ /** Fences live ownership by exact runtime pointers and admission seeds all the way to root. */
11
+ private assertLiveSubagentOwnership;
12
+ listBackgroundExecutions(scopeId: string, sessionId: string): Promise<IFlexBackgroundExecution[]>;
13
+ getBackgroundExecution(scopeId: string, sessionId: string, executionId: string): Promise<IFlexBackgroundExecution>;
14
+ abortBackgroundExecution(scopeId: string, sessionId: string, executionId: string): Promise<void>;
15
+ /**
16
+ * Holds the end of a run's generation until one more of its background subagents settles. The
17
+ * subagent commits its result to the generation before it settles, so the model takes the result
18
+ * in with another step instead of the run ending without it. The engine bounds the scoped
19
+ * wait from its observed dispatch and commits timer check-ins. Returns at once when none runs.
20
+ */
21
+ awaitNextBackgroundSubagent(run: IActiveRun, signal: AbortSignal): Promise<void>;
22
+ createSubagentProvenance(state: IStorageState, session: Readonly<IFlexSession>): Readonly<IFlexSubagentProvenance> | undefined;
23
+ createSubagentTool(run: IActiveRun): unknown;
24
+ private executeSubagentTask;
25
+ createSubagentSendTool(run: IActiveRun): unknown;
26
+ createSubagentResultTool(run: IActiveRun): unknown;
27
+ private acquireSubagentSession;
28
+ private createSubagentSessionId;
29
+ private updateSubagentToolPart;
30
+ private projectBackgroundExecution;
31
+ }