@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
|
@@ -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
|
+
}
|