@modelprofile.com/flexharness 10.24.0 → 11.0.0

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 (135) hide show
  1. package/dist_ts/00_commitinfo_data.js +2 -2
  2. package/dist_ts/classes.codesandbox.js +1 -1
  3. package/dist_ts/classes.flexharness.admission.d.ts +17 -0
  4. package/dist_ts/classes.flexharness.admission.js +263 -0
  5. package/dist_ts/classes.flexharness.callbacks.d.ts +38 -0
  6. package/dist_ts/classes.flexharness.callbacks.js +313 -0
  7. package/dist_ts/classes.flexharness.compaction.d.ts +25 -0
  8. package/dist_ts/classes.flexharness.compaction.js +87 -0
  9. package/dist_ts/classes.flexharness.configurations.d.ts +11 -0
  10. package/dist_ts/classes.flexharness.configurations.js +137 -0
  11. package/dist_ts/classes.flexharness.core.d.ts +143 -0
  12. package/dist_ts/classes.flexharness.core.js +1538 -0
  13. package/dist_ts/classes.flexharness.d.ts +2 -437
  14. package/dist_ts/classes.flexharness.deletion.d.ts +31 -0
  15. package/dist_ts/classes.flexharness.deletion.js +396 -0
  16. package/dist_ts/classes.flexharness.imports.d.ts +24 -0
  17. package/dist_ts/classes.flexharness.imports.js +345 -0
  18. package/dist_ts/classes.flexharness.js +119 -9776
  19. package/dist_ts/classes.flexharness.lifecycle.d.ts +47 -0
  20. package/dist_ts/classes.flexharness.lifecycle.js +625 -0
  21. package/dist_ts/classes.flexharness.permissions.d.ts +19 -0
  22. package/dist_ts/classes.flexharness.permissions.js +450 -0
  23. package/dist_ts/classes.flexharness.projects.d.ts +55 -0
  24. package/dist_ts/classes.flexharness.projects.js +575 -0
  25. package/dist_ts/classes.flexharness.prompts.d.ts +44 -0
  26. package/dist_ts/classes.flexharness.prompts.js +659 -0
  27. package/dist_ts/classes.flexharness.providers.d.ts +18 -0
  28. package/dist_ts/classes.flexharness.providers.js +267 -0
  29. package/dist_ts/classes.flexharness.results.d.ts +26 -0
  30. package/dist_ts/classes.flexharness.results.js +89 -0
  31. package/dist_ts/classes.flexharness.reversions.d.ts +52 -0
  32. package/dist_ts/classes.flexharness.reversions.js +1306 -0
  33. package/dist_ts/classes.flexharness.runs.d.ts +63 -0
  34. package/dist_ts/classes.flexharness.runs.js +1058 -0
  35. package/dist_ts/classes.flexharness.sessions.d.ts +20 -0
  36. package/dist_ts/classes.flexharness.sessions.js +381 -0
  37. package/dist_ts/classes.flexharness.slashcommands.d.ts +40 -0
  38. package/dist_ts/classes.flexharness.slashcommands.js +458 -0
  39. package/dist_ts/classes.flexharness.subagents.d.ts +31 -0
  40. package/dist_ts/classes.flexharness.subagents.js +690 -0
  41. package/dist_ts/classes.flexharness.tooldispatch.d.ts +53 -0
  42. package/dist_ts/classes.flexharness.tooldispatch.js +418 -0
  43. package/dist_ts/classes.stores.js +1 -1
  44. package/dist_ts/classes.toolcatalog.js +1 -1
  45. package/dist_ts/errors.js +1 -1
  46. package/dist_ts/functions.toolpermissions.js +1 -1
  47. package/dist_ts/interfaces.d.ts +3 -3
  48. package/dist_ts/interfaces.flexharness.d.ts +455 -0
  49. package/dist_ts/interfaces.flexharness.js +2 -0
  50. package/dist_ts/utils.flexharness.d.ts +19 -0
  51. package/dist_ts/utils.flexharness.js +83 -0
  52. package/dist_ts/utils.harnessoptions.js +1 -1
  53. package/dist_ts/utils.json.js +1 -1
  54. package/dist_ts/utils.schemadeclarations.js +1 -1
  55. package/dist_ts/utils.sessionimport.js +1 -1
  56. package/dist_ts/utils.sessionmetrics.d.ts +1 -1
  57. package/dist_ts_chat/classes.chatsession.js +1 -1
  58. package/dist_ts_chat_harness/classes.transcript.js +1 -1
  59. package/dist_ts_chat_harness/functions.intents.js +1 -1
  60. package/dist_ts_chat_harness/functions.mapping.d.ts +1 -1
  61. package/dist_ts_chat_harness/functions.mapping.js +1 -1
  62. package/dist_ts_chat_harness_server/classes.chathub.d.ts +18 -7
  63. package/dist_ts_chat_harness_server/classes.chathub.js +65 -62
  64. package/dist_ts_chat_harness_server/classes.chatsubscription.d.ts +5 -3
  65. package/dist_ts_chat_harness_server/classes.chatsubscription.js +4 -4
  66. package/dist_ts_chat_harness_server/classes.scopedirectory.d.ts +17 -0
  67. package/dist_ts_chat_harness_server/classes.scopedirectory.js +49 -0
  68. package/dist_ts_chat_harness_server/classes.sessionlists.d.ts +3 -5
  69. package/dist_ts_chat_harness_server/classes.sessionlists.js +11 -12
  70. package/dist_ts_chat_harness_server/classes.turngate.d.ts +8 -2
  71. package/dist_ts_chat_harness_server/classes.turngate.js +22 -21
  72. package/dist_ts_chat_harness_server/functions.errorprojector.js +1 -1
  73. package/dist_ts_chat_harness_server/index.d.ts +3 -2
  74. package/dist_ts_chat_harness_server/index.js +3 -2
  75. package/dist_ts_chat_harness_server/interfaces.d.ts +35 -2
  76. package/dist_ts_chat_harness_server/plugins.d.ts +1 -1
  77. package/dist_ts_chat_harness_typedsocket/classes.clienttransport.d.ts +28 -3
  78. package/dist_ts_chat_harness_typedsocket/classes.clienttransport.js +71 -15
  79. package/dist_ts_chat_harness_typedsocket/classes.serverbinding.d.ts +5 -3
  80. package/dist_ts_chat_harness_typedsocket/classes.serverbinding.js +79 -16
  81. package/dist_ts_chat_harness_typedsocket/index.d.ts +2 -2
  82. package/dist_ts_chat_harness_typedsocket/index.js +1 -1
  83. package/dist_ts_chat_harness_typedsocket/interfaces.requests.d.ts +20 -11
  84. package/dist_ts_chat_web/flexchat-input.js +1 -1
  85. package/dist_ts_chat_web/flexchat-message.js +1 -1
  86. package/dist_ts_chat_web/flexchat-window.js +1 -1
  87. package/dist_ts_compaction/smartagent.compaction.js +1 -1
  88. package/dist_ts_kvm/ocr.js +1 -1
  89. package/dist_ts_ocr/classes.imageocr.js +1 -1
  90. package/dist_ts_ocr/ocr.mistral.js +1 -1
  91. package/dist_ts_stores_nosqldb/classes.nosqldbstores.js +1 -1
  92. package/dist_ts_tools/tool.browser.js +1 -1
  93. package/dist_ts_tools/tool.filesystem.js +1 -1
  94. package/dist_ts_tools/tool.shell.js +1 -1
  95. package/dist_ts_tools_node/tool.context.js +1 -1
  96. package/dist_ts_typedrequest/catalog.d.ts +2 -2
  97. package/dist_ts_typedrequest/catalog.js +1 -1
  98. package/package.json +3 -3
  99. package/ts/00_commitinfo_data.ts +1 -1
  100. package/ts/classes.flexharness.admission.ts +331 -0
  101. package/ts/classes.flexharness.callbacks.ts +352 -0
  102. package/ts/classes.flexharness.compaction.ts +167 -0
  103. package/ts/classes.flexharness.configurations.ts +167 -0
  104. package/ts/classes.flexharness.core.ts +1830 -0
  105. package/ts/classes.flexharness.deletion.ts +616 -0
  106. package/ts/classes.flexharness.imports.ts +414 -0
  107. package/ts/classes.flexharness.lifecycle.ts +786 -0
  108. package/ts/classes.flexharness.permissions.ts +535 -0
  109. package/ts/classes.flexharness.projects.ts +1006 -0
  110. package/ts/classes.flexharness.prompts.ts +857 -0
  111. package/ts/classes.flexharness.providers.ts +322 -0
  112. package/ts/classes.flexharness.results.ts +98 -0
  113. package/ts/classes.flexharness.reversions.ts +1684 -0
  114. package/ts/classes.flexharness.runs.ts +1204 -0
  115. package/ts/classes.flexharness.sessions.ts +483 -0
  116. package/ts/classes.flexharness.slashcommands.ts +705 -0
  117. package/ts/classes.flexharness.subagents.ts +860 -0
  118. package/ts/classes.flexharness.tooldispatch.ts +475 -0
  119. package/ts/classes.flexharness.ts +147 -12567
  120. package/ts/interfaces.flexharness.ts +517 -0
  121. package/ts/utils.flexharness.ts +121 -0
  122. package/ts_chat_harness_server/classes.chathub.ts +68 -61
  123. package/ts_chat_harness_server/classes.chatsubscription.ts +7 -5
  124. package/ts_chat_harness_server/classes.scopedirectory.ts +67 -0
  125. package/ts_chat_harness_server/classes.sessionlists.ts +11 -19
  126. package/ts_chat_harness_server/classes.turngate.ts +28 -21
  127. package/ts_chat_harness_server/index.ts +4 -5
  128. package/ts_chat_harness_server/interfaces.ts +35 -2
  129. package/ts_chat_harness_server/plugins.ts +0 -3
  130. package/ts_chat_harness_server/readme.md +6 -4
  131. package/ts_chat_harness_typedsocket/classes.clienttransport.ts +92 -23
  132. package/ts_chat_harness_typedsocket/classes.serverbinding.ts +88 -16
  133. package/ts_chat_harness_typedsocket/index.ts +4 -2
  134. package/ts_chat_harness_typedsocket/interfaces.requests.ts +15 -11
  135. package/ts_chat_harness_typedsocket/readme.md +7 -3
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5mbGV4aGFybmVzcy5zbGFzaGNvbW1hbmRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvY2xhc3Nlcy5mbGV4aGFybmVzcy5zbGFzaGNvbW1hbmRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsMkJBQTJCLEVBQzNCLG1DQUFtQyxFQUNuQyx1Q0FBdUMsRUFDdkMsMEJBQTBCLEdBQzNCLE1BQU0sYUFBYSxDQUFDO0FBUXJCLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXhELE9BQU8sRUFDTCxzQ0FBc0MsRUFDdEMsMEJBQTBCLEVBQzFCLDBCQUEwQixFQUMxQixpQkFBaUIsRUFDakIseUJBQXlCLEdBQzFCLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxvQ0FBb0MsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBUzdFLE9BQU8sRUFDTCxvQ0FBb0MsRUFDcEMsd0JBQXdCLEdBQ3pCLE1BQU0sd0JBQXdCLENBQUM7QUFHaEMsTUFBTSxnQ0FBZ0MsR0FBRyx1REFBdUQsQ0FBQztBQUVqRyxnRkFBZ0Y7QUFDaEYsTUFBTSxPQUFPLHdCQUF3QjtJQVVOLElBQUk7SUFUakIsNEJBQTRCLEdBQUcsSUFBSSxHQUFHLEVBQXdDLENBQUM7SUFDOUUsMEJBQTBCLEdBQUcsSUFBSSxHQUFHLEVBQThCLENBQUM7SUFDcEUsNkJBQTZCLEdBQUcsSUFBSSxPQUFPLENBQUMsaUJBQWlCLEVBRTFFLENBQUM7SUFDWSwyQkFBMkIsR0FBRyxJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsRUFFeEUsQ0FBQztJQUVKLFlBQTZCLElBQTZCO29C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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
+ }