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