@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,20 @@
|
|
|
1
|
+
import { type IFlexCreateSessionOptions, type IFlexEventArchiveMetadata, type IFlexMessage, type IFlexMessagePage, type IFlexMessagePageOptions, type IFlexSession, type IFlexSessionView, type IFlexSessionMetrics, type IFlexUpdateSessionOptions, type IJsonObject } from './interfaces.js';
|
|
2
|
+
import type { FlexHarnessCore } from './classes.flexharness.core.js';
|
|
3
|
+
/** Sessions and their messages: listing, creation, updates, views and message pages. */
|
|
4
|
+
export declare class FlexHarnessSessions<TScope> {
|
|
5
|
+
private readonly core;
|
|
6
|
+
constructor(core: FlexHarnessCore<TScope>);
|
|
7
|
+
listSessions(scopeId: string): Promise<IFlexSession[]>;
|
|
8
|
+
createSession(scopeId: string, options?: IFlexCreateSessionOptions): Promise<IFlexSession>;
|
|
9
|
+
getSession(scopeId: string, sessionId: string): Promise<IFlexSession>;
|
|
10
|
+
getSessionMetrics(scopeId: string, sessionId: string): Promise<IFlexSessionMetrics>;
|
|
11
|
+
updateSession(scopeId: string, sessionId: string, options: IFlexUpdateSessionOptions): Promise<IFlexSession>;
|
|
12
|
+
getSessionView(scopeId: string, sessionId: string): Promise<IFlexSessionView>;
|
|
13
|
+
getMessages(scopeId: string, sessionId: string): Promise<IFlexMessage[]>;
|
|
14
|
+
listMessagePage(scopeId: string, sessionId: string, options?: IFlexMessagePageOptions): Promise<IFlexMessagePage>;
|
|
15
|
+
getMessage(scopeId: string, sessionId: string, messageId: string): Promise<IFlexMessage>;
|
|
16
|
+
pushRuntimeEvent(scopeId: string, sessionId: string, event: IJsonObject & {
|
|
17
|
+
type: string;
|
|
18
|
+
}): Promise<void>;
|
|
19
|
+
archiveSessionEvents(scopeId: string, sessionId: string, compactionEventId?: string): Promise<IFlexEventArchiveMetadata | undefined>;
|
|
20
|
+
}
|
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { FlexHarnessAbortError, FlexHarnessSessionBusyError, FlexHarnessValidationError, } from './errors.js';
|
|
3
|
+
import { FLEX_PROJECT_MANAGEMENT_LIMITS, } from './interfaces.js';
|
|
4
|
+
import { cloneSerializable } from './utils.json.js';
|
|
5
|
+
import { createBoundedTransferMessage, jsonBytes, maxMessagePageCursorBytes, maxMessagePageSize, maxTransferPageBytes, publicSnapshot, requireTransferIdentifier, } from './utils.transfer.js';
|
|
6
|
+
import { validateIdentifier, validateSessionGenerationId, validateSessionConfigurationRef, validateUpdateSessionOptions, validateUtf8String, } from './utils.validation.js';
|
|
7
|
+
import { sessionMetricsView } from './utils.sessionmetrics.js';
|
|
8
|
+
import { createSessionGenerationId, requireSessionGeneration, combineErrors, } from './utils.flexharness.js';
|
|
9
|
+
/**
|
|
10
|
+
* Consecutive waits a session view makes for queued writes and open sections to settle. Each wait
|
|
11
|
+
* ends only when real work finishes, so the bound limits starvation by a session that never stops
|
|
12
|
+
* changing, not the time one slow save may take.
|
|
13
|
+
*/
|
|
14
|
+
const maxSessionViewPasses = 64;
|
|
15
|
+
/** Sessions and their messages: listing, creation, updates, views and message pages. */
|
|
16
|
+
export class FlexHarnessSessions {
|
|
17
|
+
core;
|
|
18
|
+
constructor(core) {
|
|
19
|
+
this.core = core;
|
|
20
|
+
}
|
|
21
|
+
async listSessions(scopeId) {
|
|
22
|
+
const { state } = await this.core.resolveState(scopeId);
|
|
23
|
+
await state.scopeQueue;
|
|
24
|
+
this.core.assertOpen();
|
|
25
|
+
this.core.assertStateAcceptingWork(state);
|
|
26
|
+
return publicSnapshot([...state.sessions.values()]
|
|
27
|
+
.filter((stored) => !state.initializingSessions.has(stored.session.sessionId))
|
|
28
|
+
.map((stored) => stored.session)
|
|
29
|
+
.sort((left, right) => right.updatedAt.localeCompare(left.updatedAt)));
|
|
30
|
+
}
|
|
31
|
+
async createSession(scopeId, options = {}) {
|
|
32
|
+
if (!options || typeof options !== 'object' || Array.isArray(options)) {
|
|
33
|
+
throw new FlexHarnessValidationError('createSession options must be a plain object.');
|
|
34
|
+
}
|
|
35
|
+
const unsupported = Object.keys(options).find((key) => !['sessionId', 'sessionGenerationId', 'configurationRef', 'title'].includes(key));
|
|
36
|
+
if (unsupported)
|
|
37
|
+
throw new FlexHarnessValidationError(`createSession does not support "${unsupported}".`);
|
|
38
|
+
const requestedSessionGenerationId = options.sessionGenerationId;
|
|
39
|
+
if (requestedSessionGenerationId !== undefined) {
|
|
40
|
+
validateSessionGenerationId(requestedSessionGenerationId);
|
|
41
|
+
}
|
|
42
|
+
if (options.configurationRef !== undefined)
|
|
43
|
+
validateSessionConfigurationRef(options.configurationRef);
|
|
44
|
+
const resolved = await this.core.resolveState(scopeId);
|
|
45
|
+
const sessionId = options.sessionId ?? plugins.crypto.randomUUID();
|
|
46
|
+
validateIdentifier(sessionId, 'sessionId');
|
|
47
|
+
requireTransferIdentifier(sessionId, 'sessionId');
|
|
48
|
+
if (options.title !== undefined) {
|
|
49
|
+
validateUtf8String(options.title, 'title', FLEX_PROJECT_MANAGEMENT_LIMITS.maxTitleBytes, true);
|
|
50
|
+
}
|
|
51
|
+
await resolved.state.scopeQueue;
|
|
52
|
+
if (resolved.state.sessions.has(sessionId)
|
|
53
|
+
|| resolved.state.tombstones.has(sessionId)
|
|
54
|
+
|| resolved.state.initializingSessions.has(sessionId)) {
|
|
55
|
+
throw new FlexHarnessValidationError(`Session "${sessionId}" already exists or is being deleted.`);
|
|
56
|
+
}
|
|
57
|
+
resolved.state.initializingSessions.add(sessionId);
|
|
58
|
+
let resolveInitialization;
|
|
59
|
+
const initializationCompletion = new Promise((resolve) => {
|
|
60
|
+
resolveInitialization = resolve;
|
|
61
|
+
});
|
|
62
|
+
let initializationCompleted = false;
|
|
63
|
+
const completeInitialization = () => {
|
|
64
|
+
if (initializationCompleted)
|
|
65
|
+
return;
|
|
66
|
+
initializationCompleted = true;
|
|
67
|
+
if (resolved.state.sessionInitializations.get(sessionId) === initializationCompletion) {
|
|
68
|
+
resolved.state.sessionInitializations.delete(sessionId);
|
|
69
|
+
}
|
|
70
|
+
resolveInitialization();
|
|
71
|
+
};
|
|
72
|
+
resolved.state.sessionInitializations.set(sessionId, initializationCompletion);
|
|
73
|
+
let scopeReserved = false;
|
|
74
|
+
let metadata;
|
|
75
|
+
try {
|
|
76
|
+
await this.core.mutateScope(resolved.state, () => {
|
|
77
|
+
if (resolved.state.sessions.has(sessionId) || resolved.state.tombstones.has(sessionId)) {
|
|
78
|
+
throw new FlexHarnessValidationError(`Session "${sessionId}" already exists or is being deleted.`);
|
|
79
|
+
}
|
|
80
|
+
const timestamp = new Date().toISOString();
|
|
81
|
+
metadata = {
|
|
82
|
+
scopeId,
|
|
83
|
+
sessionId,
|
|
84
|
+
sessionGenerationId: requestedSessionGenerationId ?? createSessionGenerationId(),
|
|
85
|
+
sessionGenerationSequence: resolved.state.revision + 1,
|
|
86
|
+
...(options.configurationRef === undefined ? {} : { configurationRef: options.configurationRef }),
|
|
87
|
+
...(options.title ? { title: options.title } : {}),
|
|
88
|
+
createdAt: timestamp,
|
|
89
|
+
updatedAt: timestamp,
|
|
90
|
+
status: 'idle',
|
|
91
|
+
activity: { status: 'idle' },
|
|
92
|
+
depth: 0,
|
|
93
|
+
};
|
|
94
|
+
resolved.state.sessions.set(sessionId, this.core.createUninitializedStoredSession(metadata, resolved.state.storageKey));
|
|
95
|
+
});
|
|
96
|
+
scopeReserved = true;
|
|
97
|
+
const placeholder = resolved.state.sessions.get(sessionId);
|
|
98
|
+
const initialization = this.core.loadSessionRuntime(resolved.state, metadata, scopeId, resolved.scope.scope, placeholder.compactorLifecycleController, true);
|
|
99
|
+
const loaded = await initialization;
|
|
100
|
+
if (resolved.state.sessions.get(sessionId) !== placeholder) {
|
|
101
|
+
const aborted = new FlexHarnessAbortError('The session was deleted while it was being created.');
|
|
102
|
+
try {
|
|
103
|
+
await this.core.lifecycle.closeStoredSession(loaded);
|
|
104
|
+
}
|
|
105
|
+
catch (closeError) {
|
|
106
|
+
this.core.lifecycle.orphanedStoredSessions.add(loaded);
|
|
107
|
+
throw combineErrors([aborted, closeError]);
|
|
108
|
+
}
|
|
109
|
+
throw aborted;
|
|
110
|
+
}
|
|
111
|
+
resolved.state.sessions.set(sessionId, loaded);
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
const projectedError = this.core.projectOperationError(error, 'agentSession', scopeId, sessionId, 'session-create');
|
|
115
|
+
scopeReserved ||= resolved.state.sessions.has(sessionId);
|
|
116
|
+
if (!scopeReserved)
|
|
117
|
+
throw projectedError;
|
|
118
|
+
const tombstone = {
|
|
119
|
+
sessionId,
|
|
120
|
+
...requireSessionGeneration(metadata),
|
|
121
|
+
deletedAt: new Date().toISOString(),
|
|
122
|
+
rootSessionId: sessionId,
|
|
123
|
+
depth: 0,
|
|
124
|
+
};
|
|
125
|
+
let tombstoneCommitted = false;
|
|
126
|
+
let domainCleanupCompleted = false;
|
|
127
|
+
try {
|
|
128
|
+
await this.core.mutateScope(resolved.state, () => {
|
|
129
|
+
resolved.state.sessions.delete(sessionId);
|
|
130
|
+
resolved.state.tombstones.set(sessionId, tombstone);
|
|
131
|
+
}, true);
|
|
132
|
+
tombstoneCommitted = true;
|
|
133
|
+
completeInitialization();
|
|
134
|
+
await this.core.deletion.finishTombstoneCleanup(resolved.state, sessionId, scopeId, { scopeId, scope: resolved.scope.scope });
|
|
135
|
+
domainCleanupCompleted = true;
|
|
136
|
+
}
|
|
137
|
+
catch (cleanupError) {
|
|
138
|
+
const projectedCleanup = this.core.projectOperationError(cleanupError, 'persistence', scopeId, sessionId, 'session-create-cleanup');
|
|
139
|
+
if (!tombstoneCommitted || domainCleanupCompleted) {
|
|
140
|
+
resolved.state.sessions.delete(sessionId);
|
|
141
|
+
const stateLoad = this.core.stateLoads.get(resolved.state.storageKey);
|
|
142
|
+
if (stateLoad) {
|
|
143
|
+
completeInitialization();
|
|
144
|
+
try {
|
|
145
|
+
await this.core.lifecycle.drainStorage(resolved.state.storageKey, stateLoad, this.core.trustInternalError(new FlexHarnessAbortError('The session namespace was fenced after uncertain creation cleanup.')), { scopeId, scope: resolved.scope.scope });
|
|
146
|
+
}
|
|
147
|
+
catch {
|
|
148
|
+
// The projected creation and cleanup errors remain safe for the caller.
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
throw combineErrors([projectedError, projectedCleanup]);
|
|
153
|
+
}
|
|
154
|
+
throw projectedError;
|
|
155
|
+
}
|
|
156
|
+
finally {
|
|
157
|
+
resolved.state.initializingSessions.delete(sessionId);
|
|
158
|
+
completeInitialization();
|
|
159
|
+
}
|
|
160
|
+
const result = publicSnapshot(metadata);
|
|
161
|
+
this.core.emitEvent(scopeId, metadata, { type: 'session.created', session: result });
|
|
162
|
+
return result;
|
|
163
|
+
}
|
|
164
|
+
async getSession(scopeId, sessionId) {
|
|
165
|
+
const { state } = await this.core.resolveState(scopeId);
|
|
166
|
+
await state.scopeQueue;
|
|
167
|
+
this.core.assertStateAcceptingWork(state);
|
|
168
|
+
return publicSnapshot(this.core.requireSession(state, sessionId).session);
|
|
169
|
+
}
|
|
170
|
+
async getSessionMetrics(scopeId, sessionId) {
|
|
171
|
+
const { state } = await this.core.resolveState(scopeId);
|
|
172
|
+
const stored = this.core.requireSession(state, sessionId);
|
|
173
|
+
await stored.projectionQueue;
|
|
174
|
+
this.core.assertStateAcceptingWork(state);
|
|
175
|
+
if (stored.metricsFailure !== undefined)
|
|
176
|
+
throw stored.metricsFailure;
|
|
177
|
+
return publicSnapshot(sessionMetricsView(stored.metrics));
|
|
178
|
+
}
|
|
179
|
+
async updateSession(scopeId, sessionId, options) {
|
|
180
|
+
validateUpdateSessionOptions(options);
|
|
181
|
+
const { state } = await this.core.resolveState(scopeId);
|
|
182
|
+
let result;
|
|
183
|
+
await this.core.mutateScope(state, () => {
|
|
184
|
+
const stored = Object.prototype.hasOwnProperty.call(options, 'archived')
|
|
185
|
+
? this.core.requireMutableSession(state, sessionId)
|
|
186
|
+
: this.core.requireSession(state, sessionId);
|
|
187
|
+
const timestamp = new Date().toISOString();
|
|
188
|
+
if (Object.prototype.hasOwnProperty.call(options, 'title')) {
|
|
189
|
+
if (options.title === null)
|
|
190
|
+
delete stored.session.title;
|
|
191
|
+
else
|
|
192
|
+
stored.session.title = options.title;
|
|
193
|
+
}
|
|
194
|
+
if (options.archived === true)
|
|
195
|
+
stored.session.archivedAt ??= timestamp;
|
|
196
|
+
else if (options.archived === false)
|
|
197
|
+
delete stored.session.archivedAt;
|
|
198
|
+
stored.session.updatedAt = timestamp;
|
|
199
|
+
result = publicSnapshot(stored.session);
|
|
200
|
+
});
|
|
201
|
+
this.core.emitEvent(scopeId, result, { type: 'session.updated', session: result });
|
|
202
|
+
return result;
|
|
203
|
+
}
|
|
204
|
+
async getSessionView(scopeId, sessionId) {
|
|
205
|
+
const { state } = await this.core.resolveState(scopeId);
|
|
206
|
+
let stored = this.core.requireSession(state, sessionId);
|
|
207
|
+
for (let pass = 0;; pass++) {
|
|
208
|
+
if (pass === maxSessionViewPasses) {
|
|
209
|
+
throw new FlexHarnessSessionBusyError(sessionId, `kept changing through ${maxSessionViewPasses} consecutive waits for a settled view`);
|
|
210
|
+
}
|
|
211
|
+
const scopeQueue = state.scopeQueue;
|
|
212
|
+
const projectionQueue = stored.projectionQueue;
|
|
213
|
+
const publications = [...(state.publications.get(sessionId) ?? [])];
|
|
214
|
+
await Promise.all([scopeQueue, projectionQueue, ...publications]);
|
|
215
|
+
this.core.assertStateAcceptingWork(state);
|
|
216
|
+
stored = this.core.requireSession(state, sessionId);
|
|
217
|
+
if (state.scopeQueue === scopeQueue
|
|
218
|
+
&& stored.projectionQueue === projectionQueue
|
|
219
|
+
&& !state.publications.get(sessionId)?.size)
|
|
220
|
+
break;
|
|
221
|
+
}
|
|
222
|
+
const run = state.activeRuns.get(sessionId);
|
|
223
|
+
const messages = this.core.visibleMessages(stored).map((message) => (run && run.stored === stored && message.messageId === run.assistantMessageId
|
|
224
|
+
&& message.status === 'streaming'
|
|
225
|
+
? { ...message, parts: run.callbackParts }
|
|
226
|
+
: message));
|
|
227
|
+
return publicSnapshot({
|
|
228
|
+
session: stored.session,
|
|
229
|
+
messages,
|
|
230
|
+
pendingPermissions: [...state.pendingPermissions.values()]
|
|
231
|
+
.map((pending) => pending.request)
|
|
232
|
+
.filter((request) => request.sessionId === sessionId)
|
|
233
|
+
.sort((left, right) => left.createdAt.localeCompare(right.createdAt)),
|
|
234
|
+
sequence: this.core.sequence,
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
async getMessages(scopeId, sessionId) {
|
|
238
|
+
const { state } = await this.core.resolveState(scopeId);
|
|
239
|
+
const stored = this.core.requireSession(state, sessionId);
|
|
240
|
+
await stored.projectionQueue;
|
|
241
|
+
this.core.assertStateAcceptingWork(state);
|
|
242
|
+
return publicSnapshot(this.core.visibleMessages(stored));
|
|
243
|
+
}
|
|
244
|
+
async listMessagePage(scopeId, sessionId, options = {}) {
|
|
245
|
+
if (!options || typeof options !== 'object' || Array.isArray(options)) {
|
|
246
|
+
throw new FlexHarnessValidationError('Message page options must be a plain object.');
|
|
247
|
+
}
|
|
248
|
+
const unsupported = Object.keys(options).find((key) => key !== 'limit' && key !== 'before');
|
|
249
|
+
if (unsupported)
|
|
250
|
+
throw new FlexHarnessValidationError(`Message page options do not support "${unsupported}".`);
|
|
251
|
+
const limit = options.limit ?? maxMessagePageSize;
|
|
252
|
+
if (!Number.isSafeInteger(limit) || limit < 1 || limit > maxMessagePageSize) {
|
|
253
|
+
throw new FlexHarnessValidationError(`Message page limit must be an integer from 1 through ${maxMessagePageSize}.`);
|
|
254
|
+
}
|
|
255
|
+
if (options.before !== undefined
|
|
256
|
+
&& (typeof options.before !== 'string'
|
|
257
|
+
|| !options.before
|
|
258
|
+
|| Buffer.byteLength(options.before, 'utf8') > maxMessagePageCursorBytes)) {
|
|
259
|
+
throw new FlexHarnessValidationError('Message page cursor is invalid.');
|
|
260
|
+
}
|
|
261
|
+
const { state } = await this.core.resolveState(scopeId);
|
|
262
|
+
const stored = this.core.requireSession(state, sessionId);
|
|
263
|
+
await stored.projectionQueue;
|
|
264
|
+
this.core.assertStateAcceptingWork(state);
|
|
265
|
+
const namespace = this.core.messageCursorNamespace(state.storageKey);
|
|
266
|
+
const visibleMessages = this.core.visibleMessages(stored);
|
|
267
|
+
let end = visibleMessages.length;
|
|
268
|
+
if (options.before !== undefined) {
|
|
269
|
+
const cursor = this.core.parseMessageCursor(options.before);
|
|
270
|
+
if (cursor.namespace !== namespace || cursor.sessionId !== sessionId) {
|
|
271
|
+
throw new FlexHarnessValidationError('Message page cursor is invalid.');
|
|
272
|
+
}
|
|
273
|
+
const anchor = visibleMessages.findIndex((message) => message.messageId === cursor.anchorMessageId);
|
|
274
|
+
if (anchor < 0)
|
|
275
|
+
throw new FlexHarnessValidationError('Message page cursor is stale.');
|
|
276
|
+
end = anchor;
|
|
277
|
+
}
|
|
278
|
+
let start = end;
|
|
279
|
+
let messages = [];
|
|
280
|
+
for (let index = end - 1; index >= 0 && messages.length < limit; index--) {
|
|
281
|
+
const candidate = createBoundedTransferMessage(visibleMessages[index]);
|
|
282
|
+
const candidateMessages = [candidate, ...messages];
|
|
283
|
+
const nextCursor = index > 0
|
|
284
|
+
? this.core.createMessageCursor(namespace, sessionId, candidate.messageId)
|
|
285
|
+
: undefined;
|
|
286
|
+
const candidatePage = {
|
|
287
|
+
messages: candidateMessages,
|
|
288
|
+
startIndex: index,
|
|
289
|
+
...(nextCursor ? { nextCursor } : {}),
|
|
290
|
+
};
|
|
291
|
+
if (jsonBytes(candidatePage) > maxTransferPageBytes)
|
|
292
|
+
break;
|
|
293
|
+
start = index;
|
|
294
|
+
messages = candidateMessages;
|
|
295
|
+
}
|
|
296
|
+
if (messages.length === 0 && end > 0) {
|
|
297
|
+
throw new FlexHarnessValidationError('Stored message exceeds the page transfer limit.');
|
|
298
|
+
}
|
|
299
|
+
const nextCursor = start > 0
|
|
300
|
+
? this.core.createMessageCursor(namespace, sessionId, messages[0].messageId)
|
|
301
|
+
: undefined;
|
|
302
|
+
return publicSnapshot({ messages, startIndex: start, ...(nextCursor ? { nextCursor } : {}) });
|
|
303
|
+
}
|
|
304
|
+
async getMessage(scopeId, sessionId, messageId) {
|
|
305
|
+
validateIdentifier(messageId, 'messageId');
|
|
306
|
+
requireTransferIdentifier(messageId, 'messageId');
|
|
307
|
+
const { state } = await this.core.resolveState(scopeId);
|
|
308
|
+
const stored = this.core.requireSession(state, sessionId);
|
|
309
|
+
await stored.projectionQueue;
|
|
310
|
+
this.core.assertStateAcceptingWork(state);
|
|
311
|
+
return publicSnapshot(createBoundedTransferMessage(this.core.requireMessage(stored, messageId)));
|
|
312
|
+
}
|
|
313
|
+
async pushRuntimeEvent(scopeId, sessionId, event) {
|
|
314
|
+
this.core.validateRuntimeEvent(event);
|
|
315
|
+
const { scope, state } = await this.core.resolveState(scopeId);
|
|
316
|
+
const stored = this.core.requireSession(state, sessionId);
|
|
317
|
+
this.core.assertSessionWritable(stored);
|
|
318
|
+
this.core.assertStateAcceptingWork(state);
|
|
319
|
+
try {
|
|
320
|
+
await this.core.compaction.withCompactorContext(this.core.compaction.createCompactorContext(scopeId, scope.scope, state.storageKey, sessionId), () => stored.agentSession.pushRuntimeEvent(cloneSerializable(event)));
|
|
321
|
+
}
|
|
322
|
+
catch (error) {
|
|
323
|
+
throw this.core.projectOperationError(error, 'agentSession', scopeId, sessionId, 'runtime-event');
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
async archiveSessionEvents(scopeId, sessionId, compactionEventId) {
|
|
327
|
+
if (compactionEventId !== undefined) {
|
|
328
|
+
validateIdentifier(compactionEventId, 'compactionEventId');
|
|
329
|
+
requireTransferIdentifier(compactionEventId, 'compactionEventId');
|
|
330
|
+
}
|
|
331
|
+
const { scope, state } = await this.core.resolveState(scopeId);
|
|
332
|
+
const stored = this.core.requireSession(state, sessionId);
|
|
333
|
+
this.core.assertSessionWritable(stored);
|
|
334
|
+
this.core.assertStateAcceptingWork(state);
|
|
335
|
+
this.core.commands.requireSessionAvailableForSlashCommand(state, stored, 'archive');
|
|
336
|
+
const compaction = compactionEventId === undefined
|
|
337
|
+
? [...stored.agentSession.getEvents()].reverse().find((event) => event.type === 'context-compaction')
|
|
338
|
+
: stored.agentSession.getEvents().find((event) => event.type === 'context-compaction' && event.id === compactionEventId);
|
|
339
|
+
if (!compaction || compaction.type !== 'context-compaction')
|
|
340
|
+
return undefined;
|
|
341
|
+
let archive;
|
|
342
|
+
try {
|
|
343
|
+
archive = await stored.agentSession.archiveCompactedEvents(compaction.id);
|
|
344
|
+
}
|
|
345
|
+
catch (error) {
|
|
346
|
+
throw this.core.projectOperationError(error, 'agentSession', scopeId, sessionId, 'archive');
|
|
347
|
+
}
|
|
348
|
+
if (!archive)
|
|
349
|
+
return undefined;
|
|
350
|
+
let branchCommitted = false;
|
|
351
|
+
try {
|
|
352
|
+
const archivedIds = new Set(archive.events.map((event) => event.id));
|
|
353
|
+
await this.core.mutateProjection(state, stored, () => {
|
|
354
|
+
branchCommitted = this.core.reversions.commitRevertedBranchState(stored);
|
|
355
|
+
for (const segment of stored.reversionSegments) {
|
|
356
|
+
if (segment.eventIds.some((eventId) => archivedIds.has(eventId))) {
|
|
357
|
+
segment.contextAvailable = false;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
this.core.reversions.pruneReversionState(stored);
|
|
361
|
+
}, true);
|
|
362
|
+
}
|
|
363
|
+
catch (error) {
|
|
364
|
+
throw this.core.projectOperationError(error, 'persistence', scopeId, sessionId, 'archive-horizon');
|
|
365
|
+
}
|
|
366
|
+
if (branchCommitted) {
|
|
367
|
+
this.core.emitEvent(scopeId, stored.session, {
|
|
368
|
+
type: 'session.history.changed',
|
|
369
|
+
direction: 'branch',
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
await this.core.reversions.drainReversionReleases(state, stored, scopeId, scope.scope, false);
|
|
373
|
+
return publicSnapshot({
|
|
374
|
+
archiveId: this.core.boundedIdentifier(archive.archiveId, 'archiveId'),
|
|
375
|
+
sessionId: this.core.boundedIdentifier(archive.sessionId, 'sessionId'),
|
|
376
|
+
createdAt: new Date(archive.createdAt).toISOString(),
|
|
377
|
+
eventCount: archive.events.length,
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5mbGV4aGFybmVzcy5zZXNzaW9ucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuZmxleGhhcm5lc3Muc2Vzc2lvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUNMLHFCQUFxQixFQUNyQiwyQkFBMkIsRUFDM0IsMEJBQTBCLEdBQzNCLE1BQU0sYUFBYSxDQUFDO0FBQ3JCLE9BQU8sRUFDTCw4QkFBOEIsR0FZL0IsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQ0wsNEJBQTRCLEVBQzVCLFNBQVMsRUFDVCx5QkFBeUIsRUFDekIsa0JBQWtCLEVBQ2xCLG9CQUFvQixFQUNwQixjQUFjLEVBQ2QseUJBQXlCLEdBQzFCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUNMLGtCQUFrQixFQUNsQiwyQkFBMkIsRUFDM0IsK0JBQStCLEVBQy9CLDRCQUE0QixFQUM1QixrQkFBa0IsR0FDbkIsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMvRCxPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLHdCQUF3QixFQUN4QixhQUFhLEdBQ2QsTUFBTSx3QkFBd0IsQ0FBQztBQUdoQzs7OztHQUlHO0FBQ0gsTUFBTSxvQkFBb0IsR0FBRyxFQUFFLENBQUM7QUFFaEMsd0ZBQXdGO0FBQ3hGLE1BQU0sT0FBTyxtQkFBbUI7SUFDRDtJQUE3QixZQUE2QixJQUE2QjtRQUE3QixTQUFJLEdBQUosSUFBSSxDQUF5QjtJQUFHLENBQUM7SUFFdkQsS0FBSyxDQUFDLFlBQVksQ0FBQyxPQUFlO1FBQ3ZDLE1BQU0sRUFBRSxLQUFLLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMs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
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { FlexHarnessAbortError } from './errors.js';
|
|
3
|
+
import type { IFlexSlashCommandDescriptor, IFlexSlashCommandExecutionOptions, TFlexSlashCommandExecutionResult } from './interfaces.js';
|
|
4
|
+
import type { IStoredSessionState, IStorageState, IActiveSlashCommandExecution, ISlashCommandInvocationOwner, ISlashCommandActivityOwner } from './interfaces.flexharness.js';
|
|
5
|
+
import type { FlexHarnessCore } from './classes.flexharness.core.js';
|
|
6
|
+
/** Slash command listing and execution, and the ownership of their activity. */
|
|
7
|
+
export declare class FlexHarnessSlashCommands<TScope> {
|
|
8
|
+
private readonly core;
|
|
9
|
+
readonly activeSlashCommandExecutions: Map<string, IActiveSlashCommandExecution>;
|
|
10
|
+
private readonly activeSlashCommandListings;
|
|
11
|
+
readonly slashCommandInvocationContext: plugins.AsyncLocalStorage<ISlashCommandInvocationOwner>;
|
|
12
|
+
readonly slashCommandActivityContext: plugins.AsyncLocalStorage<ISlashCommandActivityOwner>;
|
|
13
|
+
constructor(core: FlexHarnessCore<TScope>);
|
|
14
|
+
listSlashCommands(scopeId: string, sessionId: string): Promise<IFlexSlashCommandDescriptor[]>;
|
|
15
|
+
private createSlashCommandDescriptors;
|
|
16
|
+
executeSlashCommand(scopeId: string, sessionId: string, untouchedInput: string, options?: IFlexSlashCommandExecutionOptions): Promise<TFlexSlashCommandExecutionResult>;
|
|
17
|
+
executeSessionSlashCommand(scopeId: string, sessionId: string, untouchedInput: string, options?: IFlexSlashCommandExecutionOptions): Promise<TFlexSlashCommandExecutionResult>;
|
|
18
|
+
private executeSlashCommandInternal;
|
|
19
|
+
private isSessionAvailableForSlashCommand;
|
|
20
|
+
private slashCommandPromptUnavailableReason;
|
|
21
|
+
private slashCommandPromptAvailability;
|
|
22
|
+
private requireSlashCommandPromptAvailable;
|
|
23
|
+
slashCommandSessionKey(storageKey: string, sessionId: string): string;
|
|
24
|
+
requireSessionAvailableForSlashCommand(state: IStorageState, stored: IStoredSessionState, commandName: string): void;
|
|
25
|
+
trackSlashCommandExecution<TResult>(scopeId: string, state: IStorageState, sessionId: string, kind: IActiveSlashCommandExecution['kind'], externalSignal: AbortSignal | undefined, operation: (signal: AbortSignal) => Promise<TResult>): Promise<TResult>;
|
|
26
|
+
private trackSlashCommandListing;
|
|
27
|
+
private executeSlashCommandHandler;
|
|
28
|
+
abortSlashCommandExecutions(storageKey: string | undefined, reason: FlexHarnessAbortError, errors: unknown[], sessionId?: string): Promise<void>;
|
|
29
|
+
abortSlashCommandListings(storageKey: string | undefined, reason: FlexHarnessAbortError, sessionId?: string): Promise<void> | undefined;
|
|
30
|
+
ambientSlashCommandOwner(criteria?: {
|
|
31
|
+
scopeId?: string;
|
|
32
|
+
storageKey?: string;
|
|
33
|
+
sessionId?: string;
|
|
34
|
+
}): ISlashCommandInvocationOwner | ISlashCommandActivityOwner | undefined;
|
|
35
|
+
assertNoAmbientSlashCommandTeardown(criteria?: {
|
|
36
|
+
scopeId?: string;
|
|
37
|
+
storageKey?: string;
|
|
38
|
+
sessionId?: string;
|
|
39
|
+
}): void;
|
|
40
|
+
}
|