@modelprofile.com/flexharness 4.1.0 → 4.1.2
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/changelog.md +18 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.flexharness.js +8 -667
- package/dist_ts/classes.stores.js +2 -198
- package/dist_ts/utils.harnessoptions.d.ts +21 -0
- package/dist_ts/utils.harnessoptions.js +267 -0
- package/dist_ts/utils.slashcommands.d.ts +1 -0
- package/dist_ts/utils.slashcommands.js +5 -1
- package/dist_ts/utils.storecodecs.d.ts +9 -0
- package/dist_ts/utils.storecodecs.js +201 -0
- package/dist_ts/utils.tooloutput.d.ts +2 -0
- package/dist_ts/utils.tooloutput.js +56 -0
- package/dist_ts/utils.transfer.d.ts +24 -0
- package/dist_ts/utils.transfer.js +195 -0
- package/dist_ts/utils.validation.d.ts +13 -0
- package/dist_ts/utils.validation.js +158 -0
- package/package.json +2 -2
- package/readme.hints.md +8 -1
- package/readme.md +1 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.flexharness.ts +47 -818
- package/ts/classes.stores.ts +10 -243
- package/ts/utils.harnessoptions.ts +372 -0
- package/ts/utils.slashcommands.ts +5 -0
- package/ts/utils.storecodecs.ts +246 -0
- package/ts/utils.tooloutput.ts +72 -0
- package/ts/utils.transfer.ts +210 -0
- package/ts/utils.validation.ts +204 -0
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import { FlexHarnessValidationError } from './errors.js';
|
|
2
|
+
import { FLEX_REVERSION_DEFAULT_LIMITS, FLEX_REVERSION_MAXIMUM_LIMITS, } from './interfaces.js';
|
|
3
|
+
import { FLEX_SLASH_COMMAND_MAX_INPUT_BYTES, isReservedSlashCommandName, isValidSlashCommandName, } from './utils.slashcommands.js';
|
|
4
|
+
import { validateUtf8String } from './utils.validation.js';
|
|
5
|
+
const DEFAULT_CALLBACK_LIMITS = {
|
|
6
|
+
maxEvents: 10_000,
|
|
7
|
+
maxOutputBytes: 1024 * 1024,
|
|
8
|
+
maxParts: 2_000,
|
|
9
|
+
};
|
|
10
|
+
const DEFAULT_PROMPT_QUEUE_LIMITS = {
|
|
11
|
+
maxOutstandingPromptsPerSession: 16,
|
|
12
|
+
maxOutstandingBytesPerSession: 64 * 1024 * 1024,
|
|
13
|
+
maxPendingAdmissions: 64,
|
|
14
|
+
maxPendingAdmissionBytes: 128 * 1024 * 1024,
|
|
15
|
+
maxTerminalEntriesPerSession: 64,
|
|
16
|
+
};
|
|
17
|
+
const maxSubagentDefinitions = 32;
|
|
18
|
+
export const maxSubagentNameBytes = 128;
|
|
19
|
+
const maxSubagentDescriptionBytes = 2048;
|
|
20
|
+
const maxSubagentModelHintBytes = 512;
|
|
21
|
+
const maxSubagentSystemBytes = 64 * 1024;
|
|
22
|
+
const maxSlashCommandRegistrations = 128;
|
|
23
|
+
const maxSlashCommandDescriptionBytes = 2048;
|
|
24
|
+
const maxSlashCommandTemplateBytes = FLEX_SLASH_COMMAND_MAX_INPUT_BYTES;
|
|
25
|
+
export function normalizeSubagents(definitions) {
|
|
26
|
+
if (definitions === undefined)
|
|
27
|
+
return new Map();
|
|
28
|
+
if (!Array.isArray(definitions) || definitions.length > maxSubagentDefinitions) {
|
|
29
|
+
throw new FlexHarnessValidationError(`subagents must be an array with at most ${maxSubagentDefinitions} definitions.`);
|
|
30
|
+
}
|
|
31
|
+
const normalized = new Map();
|
|
32
|
+
for (let index = 0; index < definitions.length; index++) {
|
|
33
|
+
const definition = definitions[index];
|
|
34
|
+
if (!definition
|
|
35
|
+
|| typeof definition !== 'object'
|
|
36
|
+
|| Array.isArray(definition)
|
|
37
|
+
|| ![Object.prototype, null].includes(Object.getPrototypeOf(definition))) {
|
|
38
|
+
throw new FlexHarnessValidationError(`subagents[${index}] must be a plain object.`);
|
|
39
|
+
}
|
|
40
|
+
const unsupported = Object.keys(definition).find((key) => !['name', 'description', 'modelHint', 'system', 'maxSteps'].includes(key));
|
|
41
|
+
if (unsupported) {
|
|
42
|
+
throw new FlexHarnessValidationError(`subagents[${index}] does not support "${unsupported}".`);
|
|
43
|
+
}
|
|
44
|
+
validateUtf8String(definition.name, `subagents[${index}].name`, maxSubagentNameBytes, true);
|
|
45
|
+
validateUtf8String(definition.description, `subagents[${index}].description`, maxSubagentDescriptionBytes);
|
|
46
|
+
if (definition.modelHint !== undefined) {
|
|
47
|
+
validateUtf8String(definition.modelHint, `subagents[${index}].modelHint`, maxSubagentModelHintBytes);
|
|
48
|
+
}
|
|
49
|
+
if (definition.system !== undefined) {
|
|
50
|
+
validateUtf8String(definition.system, `subagents[${index}].system`, maxSubagentSystemBytes);
|
|
51
|
+
}
|
|
52
|
+
if (definition.maxSteps !== undefined
|
|
53
|
+
&& (!Number.isSafeInteger(definition.maxSteps) || definition.maxSteps < 1)) {
|
|
54
|
+
throw new FlexHarnessValidationError(`subagents[${index}].maxSteps must be a positive integer.`);
|
|
55
|
+
}
|
|
56
|
+
if (normalized.has(definition.name)) {
|
|
57
|
+
throw new FlexHarnessValidationError(`Duplicate subagent definition "${definition.name}".`);
|
|
58
|
+
}
|
|
59
|
+
normalized.set(definition.name, Object.freeze({
|
|
60
|
+
name: definition.name,
|
|
61
|
+
description: definition.description,
|
|
62
|
+
...(definition.modelHint === undefined ? {} : { modelHint: definition.modelHint }),
|
|
63
|
+
...(definition.system === undefined ? {} : { system: definition.system }),
|
|
64
|
+
...(definition.maxSteps === undefined ? {} : { maxSteps: definition.maxSteps }),
|
|
65
|
+
}));
|
|
66
|
+
}
|
|
67
|
+
return Object.freeze(normalized);
|
|
68
|
+
}
|
|
69
|
+
export function normalizeBuiltInTools(options) {
|
|
70
|
+
if (options === undefined)
|
|
71
|
+
return Object.freeze({ renameSession: false });
|
|
72
|
+
if (!options
|
|
73
|
+
|| typeof options !== 'object'
|
|
74
|
+
|| Array.isArray(options)
|
|
75
|
+
|| ![Object.prototype, null].includes(Object.getPrototypeOf(options))) {
|
|
76
|
+
throw new FlexHarnessValidationError('builtInTools must be a plain object.');
|
|
77
|
+
}
|
|
78
|
+
const unsupported = Object.keys(options)
|
|
79
|
+
.find((key) => !['renameSession', 'projectManagement'].includes(key));
|
|
80
|
+
if (unsupported)
|
|
81
|
+
throw new FlexHarnessValidationError(`builtInTools does not support "${unsupported}".`);
|
|
82
|
+
if (options.renameSession !== undefined && typeof options.renameSession !== 'boolean') {
|
|
83
|
+
throw new FlexHarnessValidationError('builtInTools.renameSession must be a boolean.');
|
|
84
|
+
}
|
|
85
|
+
const projectManagement = options.projectManagement;
|
|
86
|
+
if (projectManagement === undefined) {
|
|
87
|
+
return Object.freeze({ renameSession: options.renameSession ?? false });
|
|
88
|
+
}
|
|
89
|
+
if (!projectManagement
|
|
90
|
+
|| typeof projectManagement !== 'object'
|
|
91
|
+
|| Array.isArray(projectManagement)
|
|
92
|
+
|| ![Object.prototype, null].includes(Object.getPrototypeOf(projectManagement))) {
|
|
93
|
+
throw new FlexHarnessValidationError('builtInTools.projectManagement must be a plain object.');
|
|
94
|
+
}
|
|
95
|
+
const unsupportedProjectOption = Object.keys(projectManagement)
|
|
96
|
+
.find((key) => !['task', 'goal', 'scratchpad'].includes(key));
|
|
97
|
+
if (unsupportedProjectOption) {
|
|
98
|
+
throw new FlexHarnessValidationError(`builtInTools.projectManagement does not support "${unsupportedProjectOption}".`);
|
|
99
|
+
}
|
|
100
|
+
for (const key of ['task', 'goal', 'scratchpad']) {
|
|
101
|
+
if (projectManagement[key] !== undefined && typeof projectManagement[key] !== 'boolean') {
|
|
102
|
+
throw new FlexHarnessValidationError(`builtInTools.projectManagement.${key} must be a boolean.`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return Object.freeze({
|
|
106
|
+
renameSession: options.renameSession ?? false,
|
|
107
|
+
projectManagement: Object.freeze({
|
|
108
|
+
task: projectManagement.task ?? true,
|
|
109
|
+
goal: projectManagement.goal ?? true,
|
|
110
|
+
scratchpad: projectManagement.scratchpad ?? true,
|
|
111
|
+
}),
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
export function normalizeSlashCommands(registrations) {
|
|
115
|
+
if (registrations === undefined)
|
|
116
|
+
return new Map();
|
|
117
|
+
if (!Array.isArray(registrations) || registrations.length > maxSlashCommandRegistrations) {
|
|
118
|
+
throw new FlexHarnessValidationError(`slashCommands must be an array with at most ${maxSlashCommandRegistrations} registrations.`);
|
|
119
|
+
}
|
|
120
|
+
const normalized = new Map();
|
|
121
|
+
for (let index = 0; index < registrations.length; index++) {
|
|
122
|
+
const registration = registrations[index];
|
|
123
|
+
if (!registration
|
|
124
|
+
|| typeof registration !== 'object'
|
|
125
|
+
|| Array.isArray(registration)
|
|
126
|
+
|| ![Object.prototype, null].includes(Object.getPrototypeOf(registration))) {
|
|
127
|
+
throw new FlexHarnessValidationError(`slashCommands[${index}] must be a plain object.`);
|
|
128
|
+
}
|
|
129
|
+
const keys = Object.keys(registration);
|
|
130
|
+
const hasTemplate = Object.prototype.hasOwnProperty.call(registration, 'template');
|
|
131
|
+
const hasHandler = Object.prototype.hasOwnProperty.call(registration, 'handler');
|
|
132
|
+
const supported = hasTemplate
|
|
133
|
+
? ['name', 'description', 'template']
|
|
134
|
+
: ['name', 'description', 'handler'];
|
|
135
|
+
const unsupported = keys.find((key) => !supported.includes(key));
|
|
136
|
+
if (unsupported || hasTemplate === hasHandler) {
|
|
137
|
+
throw new FlexHarnessValidationError(`slashCommands[${index}] must define exactly one of template or handler.`);
|
|
138
|
+
}
|
|
139
|
+
if (typeof registration.name !== 'string' || !isValidSlashCommandName(registration.name)) {
|
|
140
|
+
throw new FlexHarnessValidationError(`slashCommands[${index}].name is invalid.`);
|
|
141
|
+
}
|
|
142
|
+
if (isReservedSlashCommandName(registration.name)) {
|
|
143
|
+
throw new FlexHarnessValidationError(`Slash command "${registration.name}" is reserved.`);
|
|
144
|
+
}
|
|
145
|
+
if (normalized.has(registration.name)) {
|
|
146
|
+
throw new FlexHarnessValidationError(`Duplicate slash command "${registration.name}".`);
|
|
147
|
+
}
|
|
148
|
+
if (registration.description !== undefined) {
|
|
149
|
+
validateUtf8String(registration.description, `slashCommands[${index}].description`, maxSlashCommandDescriptionBytes, true);
|
|
150
|
+
}
|
|
151
|
+
if (hasTemplate) {
|
|
152
|
+
const template = registration.template;
|
|
153
|
+
validateUtf8String(template, `slashCommands[${index}].template`, maxSlashCommandTemplateBytes, true);
|
|
154
|
+
normalized.set(registration.name, Object.freeze({
|
|
155
|
+
name: registration.name,
|
|
156
|
+
...(registration.description === undefined
|
|
157
|
+
? {}
|
|
158
|
+
: { description: registration.description }),
|
|
159
|
+
template,
|
|
160
|
+
}));
|
|
161
|
+
}
|
|
162
|
+
else {
|
|
163
|
+
const handler = registration.handler;
|
|
164
|
+
if (typeof handler !== 'function') {
|
|
165
|
+
throw new FlexHarnessValidationError(`slashCommands[${index}].handler must be a function.`);
|
|
166
|
+
}
|
|
167
|
+
normalized.set(registration.name, Object.freeze({
|
|
168
|
+
name: registration.name,
|
|
169
|
+
...(registration.description === undefined
|
|
170
|
+
? {}
|
|
171
|
+
: { description: registration.description }),
|
|
172
|
+
handler,
|
|
173
|
+
}));
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return Object.freeze(normalized);
|
|
177
|
+
}
|
|
178
|
+
export function resolveBoundedPositiveInteger(value, name, defaultValue, maximum) {
|
|
179
|
+
const resolved = value ?? defaultValue;
|
|
180
|
+
if (!Number.isSafeInteger(resolved) || resolved < 1 || resolved > maximum) {
|
|
181
|
+
throw new FlexHarnessValidationError(`${name} must be an integer from 1 through ${maximum}.`);
|
|
182
|
+
}
|
|
183
|
+
return resolved;
|
|
184
|
+
}
|
|
185
|
+
export function resolveCallbackLimits(limits = {}) {
|
|
186
|
+
const resolved = {
|
|
187
|
+
maxEvents: limits.maxEvents ?? DEFAULT_CALLBACK_LIMITS.maxEvents,
|
|
188
|
+
maxOutputBytes: limits.maxOutputBytes ?? DEFAULT_CALLBACK_LIMITS.maxOutputBytes,
|
|
189
|
+
maxParts: limits.maxParts ?? DEFAULT_CALLBACK_LIMITS.maxParts,
|
|
190
|
+
};
|
|
191
|
+
for (const [name, value] of Object.entries(resolved)) {
|
|
192
|
+
if (!Number.isSafeInteger(value) || value < 1) {
|
|
193
|
+
throw new FlexHarnessValidationError(`callbackLimits.${name} must be a positive integer.`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return resolved;
|
|
197
|
+
}
|
|
198
|
+
export function resolvePromptQueueLimits(limits = {}) {
|
|
199
|
+
const resolved = {
|
|
200
|
+
maxOutstandingPromptsPerSession: limits.maxOutstandingPromptsPerSession
|
|
201
|
+
?? DEFAULT_PROMPT_QUEUE_LIMITS.maxOutstandingPromptsPerSession,
|
|
202
|
+
maxOutstandingBytesPerSession: limits.maxOutstandingBytesPerSession
|
|
203
|
+
?? DEFAULT_PROMPT_QUEUE_LIMITS.maxOutstandingBytesPerSession,
|
|
204
|
+
maxPendingAdmissions: limits.maxPendingAdmissions
|
|
205
|
+
?? DEFAULT_PROMPT_QUEUE_LIMITS.maxPendingAdmissions,
|
|
206
|
+
maxPendingAdmissionBytes: limits.maxPendingAdmissionBytes
|
|
207
|
+
?? DEFAULT_PROMPT_QUEUE_LIMITS.maxPendingAdmissionBytes,
|
|
208
|
+
maxTerminalEntriesPerSession: limits.maxTerminalEntriesPerSession
|
|
209
|
+
?? DEFAULT_PROMPT_QUEUE_LIMITS.maxTerminalEntriesPerSession,
|
|
210
|
+
};
|
|
211
|
+
for (const [name, value] of Object.entries(resolved)) {
|
|
212
|
+
if (!Number.isSafeInteger(value) || value < 1) {
|
|
213
|
+
throw new FlexHarnessValidationError(`promptQueueLimits.${name} must be a positive integer.`);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return resolved;
|
|
217
|
+
}
|
|
218
|
+
export function resolveReversionLimits(limits = {}) {
|
|
219
|
+
const resolved = {
|
|
220
|
+
maxCompletedTurns: limits.maxCompletedTurns ?? FLEX_REVERSION_DEFAULT_LIMITS.maxCompletedTurns,
|
|
221
|
+
maxSegments: limits.maxSegments ?? FLEX_REVERSION_DEFAULT_LIMITS.maxSegments,
|
|
222
|
+
maxExcludedRunIds: limits.maxExcludedRunIds ?? FLEX_REVERSION_DEFAULT_LIMITS.maxExcludedRunIds,
|
|
223
|
+
maxPendingReversionReleases: limits.maxPendingReversionReleases
|
|
224
|
+
?? FLEX_REVERSION_DEFAULT_LIMITS.maxPendingReversionReleases,
|
|
225
|
+
};
|
|
226
|
+
for (const [name, value] of Object.entries(resolved)) {
|
|
227
|
+
const maximum = FLEX_REVERSION_MAXIMUM_LIMITS[name];
|
|
228
|
+
if (!Number.isSafeInteger(value) || value < 1 || value > maximum) {
|
|
229
|
+
throw new FlexHarnessValidationError(`reversionLimits.${name} must be an integer from 1 through ${maximum}.`);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
return resolved;
|
|
233
|
+
}
|
|
234
|
+
export function normalizeAgentSessionPolicy(policy = {}) {
|
|
235
|
+
return {
|
|
236
|
+
...(policy.contextBuilder === undefined ? {} : { contextBuilder: policy.contextBuilder }),
|
|
237
|
+
...(policy.contextCompactor === undefined ? {} : { contextCompactor: policy.contextCompactor }),
|
|
238
|
+
...(policy.eventRetention === undefined ? {} : { eventRetention: policy.eventRetention }),
|
|
239
|
+
...(policy.changeListenerTimeoutMs === undefined
|
|
240
|
+
? {}
|
|
241
|
+
: { changeListenerTimeoutMs: policy.changeListenerTimeoutMs }),
|
|
242
|
+
...(policy.maxPendingSessionChanges === undefined
|
|
243
|
+
? {}
|
|
244
|
+
: { maxPendingSessionChanges: policy.maxPendingSessionChanges }),
|
|
245
|
+
...(policy.generationLeaseCleanupTimeoutMs === undefined
|
|
246
|
+
? {}
|
|
247
|
+
: { generationLeaseCleanupTimeoutMs: policy.generationLeaseCleanupTimeoutMs }),
|
|
248
|
+
...(policy.maxArchivedTransactionTombstones === undefined
|
|
249
|
+
? {}
|
|
250
|
+
: { maxArchivedTransactionTombstones: policy.maxArchivedTransactionTombstones }),
|
|
251
|
+
...(policy.maxContextOverflowRetries === undefined
|
|
252
|
+
? {}
|
|
253
|
+
: { maxContextOverflowRetries: policy.maxContextOverflowRetries }),
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
export function requireHarnessStores(stores) {
|
|
257
|
+
const projectManagement = stores?.projectManagement;
|
|
258
|
+
if (!projectManagement
|
|
259
|
+
|| typeof projectManagement.load !== 'function'
|
|
260
|
+
|| typeof projectManagement.save !== 'function'
|
|
261
|
+
|| typeof projectManagement.tombstoneSession !== 'function'
|
|
262
|
+
|| typeof projectManagement.purgeNamespace !== 'function') {
|
|
263
|
+
throw new FlexHarnessValidationError('stores.projectManagement requires load/save/tombstoneSession/purgeNamespace methods.');
|
|
264
|
+
}
|
|
265
|
+
return stores;
|
|
266
|
+
}
|
|
267
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuaGFybmVzc29wdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy91dGlscy5oYXJuZXNzb3B0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDekQsT0FBTyxFQUNMLDZCQUE2QixFQUM3Qiw2QkFBNkIsR0FDOUIsTUFBTSxpQkFBaUIsQ0FBQztBQWF6QixPQUFPLEVBQ0wsa0NBQWtDLEVBQ2xDLDBCQUEwQixFQUMxQix1QkFBdUIsR0FDeEIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQWlCM0QsTUFBTSx1QkFBdUIsR0FBa0M7SUFDN0QsU0FBUyxFQUFFLE1BQU07SUFDakIsY0FBYyxFQUFFLElBQUksR0FBRyxJQUFJO0lBQzNCLFFBQVEsRUFBRSxLQUFLO0NBQ2hCLENBQUM7QUFDRixNQUFNLDJCQUEyQixHQUFxQztJQUNwRSwrQkFBK0IsRUFBRSxFQUFFO0lBQ25DLDZCQUE2QixFQUFFLEVBQUUsR0FBRyxJQUFJLEdBQUcsSUFBSTtJQUMvQyxvQkFBb0IsRUFBRSxFQUFFO0lBQ3hCLHdCQUF3QixFQUFFLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSTtJQUMzQyw0QkFBNEIsRUFBRSxFQUFFO0NBQ2pDLENBQUM7QUFDRixNQUFNLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztBQUNsQyxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLENBQUM7QUFDeEMsTUFBTSwyQkFBMkIsR0FBRyxJQUFJLENBQUM7QUFDekMsTUFBTSx5QkFBeUIsR0FBRyxHQUFHLENBQUM7QUFDdEMsTUFBTSxzQkFBc0IsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ3pDLE1BQU0sNEJBQTRCLEdBQUcsR0FBRyxDQUFDO0FBQ3pDLE1BQU0sK0JBQStCLEdBQUcsSUFBSSxDQUFDO0FBQzdDLE1BQU0sNEJBQTRCLEdBQUcsa0NBQWtDLENBQUM7QUFFeEUsTUFBTSxVQUFVLGtCQUFrQixDQUNoQyxXQUFrRDtJQUVsRCxJQUFJLFdBQVcsS0FBSyxTQUFTO1FBQUUsT0FBTyxJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQ2hELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxNQUFNLEdBQUcsc0JBQXNCLEVBQUUsQ0FBQztRQUMvRSxNQUFNLElBQUksMEJBQTBCLENBQ2xDLDJDQUEyQyxzQkFBc0IsZUFBZSxDQUNqRixDQUFDO0lBQ0osQ0FBQztJQUNELE1BQU0sVUFBVSxHQUFHLElBQUksR0FBRyxFQUE2QyxDQUFDO0lBQ3hFLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDeEQsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3RDLElBQ0UsQ0FBQyxVQUFVO2VBQ1IsT0FBTyxVQUFVLEtBQUssUUFBUTtlQUM5QixLQUFLLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQztlQUN6QixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUN4RSxDQUFDO1lBQ0QsTUFBTSxJQUFJLDBCQUEwQixDQUFDLGFBQWEsS0FBSywyQkFBMkIsQ0FBQyxDQUFDO1FBQ3RGLENBQUM7UUFDRCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FDOUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUNuRixDQUFDO1FBQ0YsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixNQUFNLElBQUksMEJBQTBCLENBQUMsYUFBYSxLQUFLLHVCQUF1QixXQUFXLElBQUksQ0FBQyxDQUFDO1FBQ2pHLENBQUM7UUFDRCxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLGFBQWEsS0FBSyxRQUFRLEVBQUUsb0JBQW9CLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDNUYsa0JBQWtCLENBQ2hCLFVBQVUsQ0FBQyxXQUFXLEVBQ3RCLGFBQWEsS0FBSyxlQUFlLEVBQ2pDLDJCQUEyQixDQUM1QixDQUFDO1FBQ0YsSUFBSSxVQUFVLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3ZDLGtCQUFrQixDQUNoQixVQUFVLENBQUMsU0FBUyxFQUNwQixhQUFhLEtBQUssYUFBYSxFQUMvQix5QkFBeUIsQ0FDMUIsQ0FBQztRQUNKLENBQUM7UUFDRCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDcEMsa0JBQWtCLENBQ2hCLFVBQVUsQ0FBQyxNQUFNLEVBQ2pCLGFBQWEsS0FBSyxVQUFVLEVBQzVCLHNCQUFzQixDQUN2QixDQUFDO1FBQ0osQ0FBQztRQUNELElBQ0UsVUFBVSxDQUFDLFFBQVEsS0FBSyxTQUFTO2VBQzlCLENBQUMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxVQUFVLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUMxRSxDQUFDO1lBQ0QsTUFBTSxJQUFJLDBCQUEwQixDQUFDLGFBQWEsS0FBSyx3Q0FBd0MsQ0FBQyxDQUFDO1FBQ25HLENBQUM7UUFDRCxJQUFJLFVBQVUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDcEMsTUFBTSxJQUFJLDBCQUEwQixDQUFDLGtDQUFrQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztRQUM5RixDQUFDO1FBQ0QsVUFBVSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDNUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxJQUFJO1lBQ3JCLFdBQVcsRUFBRSxVQUFVLENBQUMsV0FBVztZQUNuQyxHQUFHLENBQUMsVUFBVSxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2xGLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDekUsR0FBRyxDQUFDLFVBQVUsQ0FBQyxRQUFRLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLFVBQVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUNoRixDQUFDLENBQUMsQ0FBQztJQUNOLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUVELE1BQU0sVUFBVSxxQkFBcUIsQ0FDbkMsT0FBcUQ7SUFFckQsSUFBSSxPQUFPLEtBQUssU0FBUztRQUFFLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLElBQ0UsQ0FBQyxPQUFPO1dBQ0wsT0FBTyxPQUFPLEtBQUssUUFBUTtXQUMzQixLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztXQUN0QixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUNyRSxDQUFDO1FBQ0QsTUFBTSxJQUFJLDBCQUEwQixDQUFDLHNDQUFzQyxDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUNELE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDO1NBQ3JDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGVBQWUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLElBQUksV0FBVztRQUFFLE1BQU0sSUFBSSwwQkFBMEIsQ0FBQyxrQ0FBa0MsV0FBVyxJQUFJLENBQUMsQ0FBQztJQUN6RyxJQUFJLE9BQU8sQ0FBQyxhQUFhLEtBQUssU0FBUyxJQUFJLE9BQU8sT0FBTyxDQUFDLGFBQWEsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUN0RixNQUFNLElBQUksMEJBQTBCLENBQUMsK0NBQStDLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBQ0QsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsaUJBQWlCLENBQUM7SUFDcEQsSUFBSSxpQkFBaUIsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUNwQyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxhQUFhLEVBQUUsT0FBTyxDQUFDLGFBQWEsSUFBSSxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFDRCxJQUNFLENBQUMsaUJBQWlCO1dBQ2YsT0FBTyxpQkFBaUIsS0FBSyxRQUFRO1dBQ3JDLEtBQUssQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUM7V0FDaEMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxFQUMvRSxDQUFDO1FBQ0QsTUFBTSxJQUFJLDBCQUEwQixDQUFDLHdEQUF3RCxDQUFDLENBQUM7SUFDakcsQ0FBQztJQUNELE1BQU0sd0JBQXdCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQztTQUM1RCxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLElBQUksd0JBQXdCLEVBQUUsQ0FBQztRQUM3QixNQUFNLElBQUksMEJBQTBCLENBQ2xDLG9EQUFvRCx3QkFBd0IsSUFBSSxDQUNqRixDQUFDO0lBQ0osQ0FBQztJQUNELEtBQUssTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBVSxFQUFFLENBQUM7UUFDMUQsSUFBSSxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLElBQUksT0FBTyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN4RixNQUFNLElBQUksMEJBQTBCLENBQUMsa0NBQWtDLEdBQUcscUJBQXFCLENBQUMsQ0FBQztRQUNuRyxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUNuQixhQUFhLEVBQUUsT0FBTyxDQUFDLGFBQWEsSUFBSSxLQUFLO1FBQzdDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDL0IsSUFBSSxFQUFFLGlCQUFpQixDQUFDLElBQUksSUFBSSxJQUFJO1lBQ3BDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxJQUFJLElBQUksSUFBSTtZQUNwQyxVQUFVLEVBQUUsaUJBQWlCLENBQUMsVUFBVSxJQUFJLElBQUk7U0FDakQsQ0FBQztLQUNILENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxNQUFNLFVBQVUsc0JBQXNCLENBQ3BDLGFBQTJFO0lBRTNFLElBQUksYUFBYSxLQUFLLFNBQVM7UUFBRSxPQUFPLElBQUksR0FBRyxFQUFFLENBQUM7SUFDbEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLElBQUksYUFBYSxDQUFDLE1BQU0sR0FBRyw0QkFBNEIsRUFBRSxDQUFDO1FBQ3pGLE1BQU0sSUFBSSwwQkFBMEIsQ0FDbEMsK0NBQStDLDRCQUE0QixpQkFBaUIsQ0FDN0YsQ0FBQztJQUNKLENBQUM7SUFDRCxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBMkMsQ0FBQztJQUN0RSxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQzFELE1BQU0sWUFBWSxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyxJQUNFLENBQUMsWUFBWTtlQUNWLE9BQU8sWUFBWSxLQUFLLFFBQVE7ZUFDaEMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUM7ZUFDM0IsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUMsRUFDMUUsQ0FBQztZQUNELE1BQU0sSUFBSSwwQkFBMEIsQ0FBQyxpQkFBaUIsS0FBSywyQkFBMkIsQ0FBQyxDQUFDO1FBQzFGLENBQUM7UUFDRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDbkYsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNqRixNQUFNLFNBQVMsR0FBRyxXQUFXO1lBQzNCLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsVUFBVSxDQUFDO1lBQ3JDLENBQUMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDdkMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDakUsSUFBSSxXQUFXLElBQUksV0FBVyxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQzlDLE1BQU0sSUFBSSwwQkFBMEIsQ0FDbEMsaUJBQWlCLEtBQUssbURBQW1ELENBQzFFLENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxPQUFPLFlBQVksQ0FBQyxJQUFJLEtBQUssUUFBUSxJQUFJLENBQUMsdUJBQXVCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDekYsTUFBTSxJQUFJLDBCQUEwQixDQUFDLGlCQUFpQixLQUFLLG9CQUFvQixDQUFDLENBQUM7UUFDbkYsQ0FBQztRQUNELElBQUksMEJBQTBCLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDbEQsTUFBTSxJQUFJLDBCQUEwQixDQUNsQyxrQkFBa0IsWUFBWSxDQUFDLElBQUksZ0JBQWdCLENBQ3BELENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxVQUFVLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3RDLE1BQU0sSUFBSSwwQkFBMEIsQ0FBQyw0QkFBNEIsWUFBWSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUM7UUFDMUYsQ0FBQztRQUNELElBQUksWUFBWSxDQUFDLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUMzQyxrQkFBa0IsQ0FDaEIsWUFBWSxDQUFDLFdBQVcsRUFDeEIsaUJBQWlCLEtBQUssZUFBZSxFQUNyQywrQkFBK0IsRUFDL0IsSUFBSSxDQUNMLENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxXQUFXLEVBQUUsQ0FBQztZQUNoQixNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDO1lBQ3ZDLGtCQUFrQixDQUNoQixRQUFRLEVBQ1IsaUJBQWlCLEtBQUssWUFBWSxFQUNsQyw0QkFBNEIsRUFDNUIsSUFBSSxDQUNMLENBQUM7WUFDRixVQUFVLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDOUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxJQUFJO2dCQUN2QixHQUFHLENBQUMsWUFBWSxDQUFDLFdBQVcsS0FBSyxTQUFTO29CQUN4QyxDQUFDLENBQUMsRUFBRTtvQkFDSixDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDO2dCQUM5QyxRQUFRO2FBQ1QsQ0FBQyxDQUFDLENBQUM7UUFDTixDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUM7WUFDckMsSUFBSSxPQUFPLE9BQU8sS0FBSyxVQUFVLEVBQUUsQ0FBQztnQkFDbEMsTUFBTSxJQUFJLDBCQUEwQixDQUFDLGlCQUFpQixLQUFLLCtCQUErQixDQUFDLENBQUM7WUFDOUYsQ0FBQztZQUNELFVBQVUsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDO2dCQUM5QyxJQUFJLEVBQUUsWUFBWSxDQUFDLElBQUk7Z0JBQ3ZCLEdBQUcsQ0FBQyxZQUFZLENBQUMsV0FBVyxLQUFLLFNBQVM7b0JBQ3hDLENBQUMsQ0FBQyxFQUFFO29CQUNKLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQzlDLE9BQU87YUFDUixDQUFDLENBQUMsQ0FBQztRQUNOLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0FBQ25DLENBQUM7QUFFRCxNQUFNLFVBQVUsNkJBQTZCLENBQzNDLEtBQXlCLEVBQ3pCLElBQVksRUFDWixZQUFvQixFQUNwQixPQUFlO0lBRWYsTUFBTSxRQUFRLEdBQUcsS0FBSyxJQUFJLFlBQVksQ0FBQztJQUN2QyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxJQUFJLFFBQVEsR0FBRyxPQUFPLEVBQUUsQ0FBQztRQUMxRSxNQUFNLElBQUksMEJBQTBCLENBQUMsR0FBRyxJQUFJLHNDQUFzQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0lBQ2hHLENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQsTUFBTSxVQUFVLHFCQUFxQixDQUFDLFNBQThCLEVBQUU7SUFDcEUsTUFBTSxRQUFRLEdBQUc7UUFDZixTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVMsSUFBSSx1QkFBdUIsQ0FBQyxTQUFTO1FBQ2hFLGNBQWMsRUFBRSxNQUFNLENBQUMsY0FBYyxJQUFJLHVCQUF1QixDQUFDLGNBQWM7UUFDL0UsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRLElBQUksdUJBQXVCLENBQUMsUUFBUTtLQUM5RCxDQUFDO0lBQ0YsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUNyRCxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDOUMsTUFBTSxJQUFJLDBCQUEwQixDQUFDLGtCQUFrQixJQUFJLDhCQUE4QixDQUFDLENBQUM7UUFDN0YsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQsTUFBTSxVQUFVLHdCQUF3QixDQUN0QyxTQUFpQyxFQUFFO0lBRW5DLE1BQU0sUUFBUSxHQUFHO1FBQ2YsK0JBQStCLEVBQUUsTUFBTSxDQUFDLCtCQUErQjtlQUNsRSwyQkFBMkIsQ0FBQywrQkFBK0I7UUFDaEUsNkJBQTZCLEVBQUUsTUFBTSxDQUFDLDZCQUE2QjtlQUM5RCwyQkFBMkIsQ0FBQyw2QkFBNkI7UUFDOUQsb0JBQW9CLEVBQUUsTUFBTSxDQUFDLG9CQUFvQjtlQUM1QywyQkFBMkIsQ0FBQyxvQkFBb0I7UUFDckQsd0JBQXdCLEVBQUUsTUFBTSxDQUFDLHdCQUF3QjtlQUNwRCwyQkFBMkIsQ0FBQyx3QkFBd0I7UUFDekQsNEJBQTRCLEVBQUUsTUFBTSxDQUFDLDRCQUE0QjtlQUM1RCwyQkFBMkIsQ0FBQyw0QkFBNEI7S0FDOUQsQ0FBQztJQUNGLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDckQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzlDLE1BQU0sSUFBSSwwQkFBMEIsQ0FBQyxxQkFBcUIsSUFBSSw4QkFBOEIsQ0FBQyxDQUFDO1FBQ2hHLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVELE1BQU0sVUFBVSxzQkFBc0IsQ0FDcEMsU0FBK0IsRUFBRTtJQUVqQyxNQUFNLFFBQVEsR0FBRztRQUNmLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxpQkFBaUIsSUFBSSw2QkFBNkIsQ0FBQyxpQkFBaUI7UUFDOUYsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXLElBQUksNkJBQTZCLENBQUMsV0FBVztRQUM1RSxpQkFBaUIsRUFBRSxNQUFNLENBQUMsaUJBQWlCLElBQUksNkJBQTZCLENBQUMsaUJBQWlCO1FBQzlGLDJCQUEyQixFQUFFLE1BQU0sQ0FBQywyQkFBMkI7ZUFDMUQsNkJBQTZCLENBQUMsMkJBQTJCO0tBQy9ELENBQUM7SUFDRixLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1FBQ3JELE1BQU0sT0FBTyxHQUFHLDZCQUE2QixDQUFDLElBQWtDLENBQUMsQ0FBQztRQUNsRixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEtBQUssR0FBRyxPQUFPLEVBQUUsQ0FBQztZQUNqRSxNQUFNLElBQUksMEJBQTBCLENBQ2xDLG1CQUFtQixJQUFJLHNDQUFzQyxPQUFPLEdBQUcsQ0FDeEUsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVELE1BQU0sVUFBVSwyQkFBMkIsQ0FDekMsU0FBMEMsRUFBRTtJQUU1QyxPQUFPO1FBQ0wsR0FBRyxDQUFDLE1BQU0sQ0FBQyxjQUFjLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN6RixHQUFHLENBQUMsTUFBTSxDQUFDLGdCQUFnQixLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQy9GLEdBQUcsQ0FBQyxNQUFNLENBQUMsY0FBYyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDekYsR0FBRyxDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsS0FBSyxTQUFTO1lBQzlDLENBQUMsQ0FBQyxFQUFFO1lBQ0osQ0FBQyxDQUFDLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxDQUFDLHVCQUF1QixFQUFFLENBQUM7UUFDaEUsR0FBRyxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsS0FBSyxTQUFTO1lBQy9DLENBQUMsQ0FBQyxFQUFFO1lBQ0osQ0FBQyxDQUFDLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFDbEUsR0FBRyxDQUFDLE1BQU0sQ0FBQywrQkFBK0IsS0FBSyxTQUFTO1lBQ3RELENBQUMsQ0FBQyxFQUFFO1lBQ0osQ0FBQyxDQUFDLEVBQUUsK0JBQStCLEVBQUUsTUFBTSxDQUFDLCtCQUErQixFQUFFLENBQUM7UUFDaEYsR0FBRyxDQUFDLE1BQU0sQ0FBQyxnQ0FBZ0MsS0FBSyxTQUFTO1lBQ3ZELENBQUMsQ0FBQyxFQUFFO1lBQ0osQ0FBQyxDQUFDLEVBQUUsZ0NBQWdDLEVBQUUsTUFBTSxDQUFDLGdDQUFnQyxFQUFFLENBQUM7UUFDbEYsR0FBRyxDQUFDLE1BQU0sQ0FBQyx5QkFBeUIsS0FBSyxTQUFTO1lBQ2hELENBQUMsQ0FBQyxFQUFFO1lBQ0osQ0FBQyxDQUFDLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxDQUFDLHlCQUF5QixFQUFFLENBQUM7S0FDckUsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsTUFBMEI7SUFDN0QsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLEVBQUUsaUJBQWlCLENBQUM7SUFDcEQsSUFDRSxDQUFDLGlCQUFpQjtXQUNmLE9BQU8saUJBQWlCLENBQUMsSUFBSSxLQUFLLFVBQVU7V0FDNUMsT0FBTyxpQkFBaUIsQ0FBQyxJQUFJLEtBQUssVUFBVTtXQUM1QyxPQUFPLGlCQUFpQixDQUFDLGdCQUFnQixLQUFLLFVBQVU7V0FDeEQsT0FBTyxpQkFBaUIsQ0FBQyxjQUFjLEtBQUssVUFBVSxFQUN6RCxDQUFDO1FBQ0QsTUFBTSxJQUFJLDBCQUEwQixDQUNsQyxzRkFBc0YsQ0FDdkYsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIn0=
|
|
@@ -2,6 +2,7 @@ import type { TFlexSlashCommandParseResult } from './interfaces.js';
|
|
|
2
2
|
export declare const FLEX_SLASH_COMMAND_MAX_INPUT_BYTES: number;
|
|
3
3
|
export declare const FLEX_SLASH_COMMAND_INITIALIZE_TEMPLATE = "Create or update `AGENTS.md` for this repository.\n\nThe goal is a compact instruction file that helps future OpenCode sessions avoid mistakes and ramp up quickly. Every line should answer: \"Would an agent likely miss this without help?\" If not, leave it out.\n\nUser-provided focus or constraints (honor these):\n$ARGUMENTS\n\n## How to investigate\n\nRead the highest-value sources first:\n- `README*`, root manifests, workspace config, lockfiles\n- build, test, lint, formatter, typecheck, and codegen config\n- CI workflows and pre-commit / task runner config\n- existing instruction files (`AGENTS.md`, `CLAUDE.md`, `.cursor/rules/`, `.cursorrules`, `.github/copilot-instructions.md`)\n- repo-local OpenCode config such as `opencode.json`\n\nIf architecture is still unclear after reading config and docs, inspect a small number of representative code files to find the real entrypoints, package boundaries, and execution flow. Prefer reading the files that explain how the system is wired together over random leaf files.\n\nPrefer executable sources of truth over prose. If docs conflict with config or scripts, trust the executable source and only keep what you can verify.\n\n## What to extract\n\nLook for the highest-signal facts for an agent working in this repo:\n- exact developer commands, especially non-obvious ones\n- how to run a single test, a single package, or a focused verification step\n- required command order when it matters, such as `lint -> typecheck -> test`\n- monorepo or multi-package boundaries, ownership of major directories, and the real app/library entrypoints\n- framework or toolchain quirks: generated code, migrations, codegen, build artifacts, special env loading, dev servers, infra deploy flow\n- repo-specific style or workflow conventions that differ from defaults\n- testing quirks: fixtures, integration test prerequisites, snapshot workflows, required services, flaky or expensive suites\n- important constraints from existing instruction files worth preserving\n\nGood `AGENTS.md` content is usually hard-earned context that took reading multiple files to infer.\n\n## Questions\n\nOnly ask the user questions if the repo cannot answer something important. Use the `question` tool for one short batch at most.\n\nGood questions:\n- undocumented team conventions\n- branch / PR / release expectations\n- missing setup or test prerequisites that are known but not written down\n\nDo not ask about anything the repo already makes clear.\n\n## Writing rules\n\nInclude only high-signal, repo-specific guidance such as:\n- exact commands and shortcuts the agent would otherwise guess wrong\n- architecture notes that are not obvious from filenames\n- conventions that differ from language or framework defaults\n- setup requirements, environment quirks, and operational gotchas\n- references to existing instruction sources that matter\n\nExclude:\n- generic software advice\n- long tutorials or exhaustive file trees\n- obvious language conventions\n- speculative claims or anything you could not verify\n- content better stored in another file referenced via `opencode.json` `instructions`\n\nWhen in doubt, omit.\n\nPrefer short sections and bullets. If the repo is simple, keep the file simple. If the repo is large, summarize the few structural facts that actually change how an agent should work.\n\nIf `AGENTS.md` already exists in the active workspace, improve it in place rather than rewriting blindly. Preserve verified useful guidance, delete fluff or stale claims, and reconcile it with the current codebase.\n";
|
|
4
4
|
export declare function isValidSlashCommandName(name: string): boolean;
|
|
5
|
+
export declare function isReservedSlashCommandName(name: string): boolean;
|
|
5
6
|
export declare function parseSlashCommand(input: string): TFlexSlashCommandParseResult;
|
|
6
7
|
export declare function slashCommandTemplateHints(template: string): string[];
|
|
7
8
|
export declare function expandSlashCommandTemplate(template: string, rawArguments: string, arguments_: readonly string[]): string;
|
|
@@ -6,6 +6,7 @@ const slashCommandArgumentsPattern = /(?:\[Image\s+\d+\]|"[^"]*"|'[^']*'|[^\s"']
|
|
|
6
6
|
const slashCommandQuoteTrimPattern = /^["']|["']$/g;
|
|
7
7
|
const slashCommandPlaceholderPattern = /\$(\d+)/g;
|
|
8
8
|
const slashCommandAllPlaceholderPattern = /\$ARGUMENTS|\$(\d+)/g;
|
|
9
|
+
const reservedSlashCommandNames = new Set(['compact', 'undo', 'redo', 'init']);
|
|
9
10
|
export const FLEX_SLASH_COMMAND_INITIALIZE_TEMPLATE = `Create or update \`AGENTS.md\` for this repository.
|
|
10
11
|
|
|
11
12
|
The goal is a compact instruction file that helps future OpenCode sessions avoid mistakes and ramp up quickly. Every line should answer: "Would an agent likely miss this without help?" If not, leave it out.
|
|
@@ -76,6 +77,9 @@ If \`AGENTS.md\` already exists in the active workspace, improve it in place rat
|
|
|
76
77
|
export function isValidSlashCommandName(name) {
|
|
77
78
|
return slashCommandNamePattern.test(name);
|
|
78
79
|
}
|
|
80
|
+
export function isReservedSlashCommandName(name) {
|
|
81
|
+
return reservedSlashCommandNames.has(name);
|
|
82
|
+
}
|
|
79
83
|
function tokenizeSlashCommandArguments(rawArguments) {
|
|
80
84
|
const tokens = rawArguments.match(slashCommandArgumentsPattern) ?? [];
|
|
81
85
|
return tokens.map((token) => token.replace(slashCommandQuoteTrimPattern, ''));
|
|
@@ -161,4 +165,4 @@ export function expandSlashCommandTemplate(template, rawArguments, arguments_) {
|
|
|
161
165
|
}
|
|
162
166
|
return expanded;
|
|
163
167
|
}
|
|
164
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
168
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuc2xhc2hjb21tYW5kcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3V0aWxzLnNsYXNoY29tbWFuZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBTXpELE1BQU0sQ0FBQyxNQUFNLGtDQUFrQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUM7QUFFN0QsTUFBTSx1QkFBdUIsR0FBRyx5QkFBeUIsQ0FBQztBQUMxRCxNQUFNLG1CQUFtQixHQUFHLGlEQUFpRCxDQUFDO0FBQzlFLE1BQU0sNEJBQTRCLEdBQUcsZ0RBQWdELENBQUM7QUFDdEYsTUFBTSw0QkFBNEIsR0FBRyxjQUFjLENBQUM7QUFDcEQsTUFBTSw4QkFBOEIsR0FBRyxVQUFVLENBQUM7QUFDbEQsTUFBTSxpQ0FBaUMsR0FBRyxzQkFBc0IsQ0FBQztBQUNqRSxNQUFNLHlCQUF5QixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUUvRSxNQUFNLENBQUMsTUFBTSxzQ0FBc0MsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBa0VyRCxDQUFDO0FBRUYsTUFBTSxVQUFVLHVCQUF1QixDQUFDLElBQVk7SUFDbEQsT0FBTyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDNUMsQ0FBQztBQUVELE1BQU0sVUFBVSwwQkFBMEIsQ0FBQyxJQUFZO0lBQ3JELE9BQU8seUJBQXlCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzdDLENBQUM7QUFFRCxTQUFTLDZCQUE2QixDQUFDLFlBQW9CO0lBQ3pELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsNEJBQTRCLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdEUsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLDRCQUE0QixFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDaEYsQ0FBQztBQUVELE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxLQUFhO0lBQzdDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDOUIsTUFBTSxJQUFJLDBCQUEwQixDQUFDLHVDQUF1QyxDQUFDLENBQUM7SUFDaEYsQ0FBQztJQUNELElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQztRQUFFLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEdBQUcsa0NBQWtDLEVBQUUsQ0FBQztRQUMxRSxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDbkIsSUFBSSxFQUFFLFdBQVc7WUFDakIsTUFBTSxFQUFFLCtCQUErQixrQ0FBa0MsZUFBZTtTQUN6RixDQUFDLENBQUM7SUFDTCxDQUFDO0lBQ0QsTUFBTSxLQUFLLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQztZQUNuQixJQUFJLEVBQUUsV0FBVztZQUNqQixNQUFNLEVBQUUsa0NBQWtDO1NBQzNDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxNQUFNLFVBQVUsR0FBRyw2QkFBNkIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDakUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMxQixPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDbkIsSUFBSSxFQUFFLFFBQVE7UUFDZCxLQUFLO1FBQ0wsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDZCxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7UUFDNUIsU0FBUyxFQUFFLFVBQVU7S0FDWSxDQUFDLENBQUM7QUFDdkMsQ0FBQztBQUVELE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxRQUFnQjtJQUN4RCxNQUFNLEtBQUssR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2xFLElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzlELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELE1BQU0sVUFBVSwwQkFBMEIsQ0FDeEMsUUFBZ0IsRUFDaEIsWUFBb0IsRUFDcEIsVUFBNkI7SUFFN0IsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUMxRSxJQUFJLGVBQWUsR0FBRyxDQUFDLENBQUM7SUFDeEIsS0FBSyxNQUFNLFdBQVcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUN2QyxlQUFlLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFDRCxNQUFNLFFBQVEsR0FBYSxFQUFFLENBQUM7SUFDOUIsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLElBQUksYUFBYSxHQUFHLENBQUMsQ0FBQztJQUN0QixLQUFLLE1BQU0sS0FBSyxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsaUNBQWlDLENBQUMsRUFBRSxDQUFDO1FBQ3pFLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2RCxJQUFJLFdBQW1CLENBQUM7UUFDeEIsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssWUFBWSxFQUFFLENBQUM7WUFDOUIsV0FBVyxHQUFHLFlBQVksQ0FBQztRQUM3QixDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQyxNQUFNLGFBQWEsR0FBRyxRQUFRLEdBQUcsQ0FBQyxDQUFDO1lBQ25DLFdBQVcsR0FBRyxhQUFhLEdBQUcsQ0FBQyxJQUFJLGFBQWEsSUFBSSxVQUFVLENBQUMsTUFBTTtnQkFDbkUsQ0FBQyxDQUFDLEVBQUU7Z0JBQ0osQ0FBQyxDQUFDLFFBQVEsS0FBSyxlQUFlO29CQUM1QixDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO29CQUMzQyxDQUFDLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2xDLENBQUM7UUFDRCxhQUFhLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDN0YsSUFBSSxhQUFhLEdBQUcsa0NBQWtDLEVBQUUsQ0FBQztZQUN2RCxNQUFNLElBQUksMEJBQTBCLENBQUMsd0RBQXdELENBQUMsQ0FBQztRQUNqRyxDQUFDO1FBQ0QsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDcEMsU0FBUyxHQUFHLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUM1QyxDQUFDO0lBQ0QsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDekMsYUFBYSxJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzdELElBQUksYUFBYSxHQUFHLGtDQUFrQyxFQUFFLENBQUM7UUFDdkQsTUFBTSxJQUFJLDBCQUEwQixDQUFDLHdEQUF3RCxDQUFDLENBQUM7SUFDakcsQ0FBQztJQUNELElBQUksUUFBUSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDakMsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLElBQUksWUFBWSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7UUFDekYsSUFDRSxhQUFhLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxZQUFZLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQztjQUN6RCxrQ0FBa0MsRUFDcEMsQ0FBQztZQUNELE1BQU0sSUFBSSwwQkFBMEIsQ0FBQyx3REFBd0QsQ0FBQyxDQUFDO1FBQ2pHLENBQUM7UUFDRCxRQUFRLElBQUksT0FBTyxZQUFZLEVBQUUsQ0FBQztJQUNwQyxDQUFDO0lBQ0QsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQyJ9
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
export declare function normalizeJsonObjectUndefined<TValue>(value: TValue, path?: string): TValue;
|
|
3
|
+
export declare function assertExactKeys(value: Record<string, unknown>, keys: readonly string[], path: string): void;
|
|
4
|
+
export declare function assertRecord(value: unknown, path: string): asserts value is Record<string, unknown>;
|
|
5
|
+
export declare function createAgentEventSnapshot(sessionId: string, events: readonly plugins.TAgentEvent[], revision: number): plugins.IAgentEventSnapshotV2;
|
|
6
|
+
export declare function validateAgentEventSnapshot(value: unknown, sessionId: string): plugins.IAgentEventSnapshotV2;
|
|
7
|
+
export declare function validateAgentEventArchive(value: unknown, sessionId: string, archiveId: string): plugins.IAgentEventArchiveV2;
|
|
8
|
+
export declare function validateToolJobSnapshot(value: unknown): plugins.IToolJobSnapshot;
|
|
9
|
+
export declare function createToolJobSnapshot(jobs: readonly plugins.IToolJobState[], revision: number): plugins.IToolJobSnapshot;
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
import * as plugins from './plugins.js';
|
|
2
|
+
import { FlexHarnessStoreFormatError } from './errors.js';
|
|
3
|
+
import { assertJsonSerializable } from './utils.json.js';
|
|
4
|
+
export function normalizeJsonObjectUndefined(value, path = '$') {
|
|
5
|
+
const seen = new WeakSet();
|
|
6
|
+
const visit = (current, currentPath) => {
|
|
7
|
+
if (current === null
|
|
8
|
+
|| typeof current === 'string'
|
|
9
|
+
|| typeof current === 'boolean')
|
|
10
|
+
return current;
|
|
11
|
+
if (typeof current === 'number') {
|
|
12
|
+
if (!Number.isFinite(current)) {
|
|
13
|
+
throw new FlexHarnessStoreFormatError(`${currentPath} contains a non-finite number.`);
|
|
14
|
+
}
|
|
15
|
+
return current;
|
|
16
|
+
}
|
|
17
|
+
if (typeof current !== 'object') {
|
|
18
|
+
throw new FlexHarnessStoreFormatError(`${currentPath} contains ${typeof current}, which is not JSON-safe.`);
|
|
19
|
+
}
|
|
20
|
+
if (seen.has(current)) {
|
|
21
|
+
throw new FlexHarnessStoreFormatError(`${currentPath} contains a circular reference.`);
|
|
22
|
+
}
|
|
23
|
+
const prototype = Object.getPrototypeOf(current);
|
|
24
|
+
if (!Array.isArray(current) && prototype !== Object.prototype && prototype !== null) {
|
|
25
|
+
throw new FlexHarnessStoreFormatError(`${currentPath} contains a non-plain object.`);
|
|
26
|
+
}
|
|
27
|
+
if (Object.getOwnPropertySymbols(current).length > 0) {
|
|
28
|
+
throw new FlexHarnessStoreFormatError(`${currentPath} contains a symbol-keyed property.`);
|
|
29
|
+
}
|
|
30
|
+
seen.add(current);
|
|
31
|
+
if (Array.isArray(current)) {
|
|
32
|
+
const result = current.map((entry, index) => {
|
|
33
|
+
if (!(index in current) || entry === undefined) {
|
|
34
|
+
throw new FlexHarnessStoreFormatError(`${currentPath}[${index}] is not JSON-safe.`);
|
|
35
|
+
}
|
|
36
|
+
return visit(entry, `${currentPath}[${index}]`);
|
|
37
|
+
});
|
|
38
|
+
seen.delete(current);
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
const result = {};
|
|
42
|
+
for (const key of Object.getOwnPropertyNames(current)) {
|
|
43
|
+
const descriptor = Object.getOwnPropertyDescriptor(current, key);
|
|
44
|
+
if (!descriptor.enumerable || !('value' in descriptor)) {
|
|
45
|
+
throw new FlexHarnessStoreFormatError(`${currentPath}.${key} is not a plain JSON property.`);
|
|
46
|
+
}
|
|
47
|
+
if (descriptor.value !== undefined) {
|
|
48
|
+
result[key] = visit(descriptor.value, `${currentPath}.${key}`);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
seen.delete(current);
|
|
52
|
+
return result;
|
|
53
|
+
};
|
|
54
|
+
const normalized = visit(value, path);
|
|
55
|
+
assertJsonSerializable(normalized, path);
|
|
56
|
+
return normalized;
|
|
57
|
+
}
|
|
58
|
+
function assertNonEmptyString(value, path) {
|
|
59
|
+
if (typeof value !== 'string' || !value.trim()) {
|
|
60
|
+
throw new FlexHarnessStoreFormatError(`${path} must be a non-empty string.`);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
function assertNonNegativeInteger(value, path) {
|
|
64
|
+
if (!Number.isSafeInteger(value) || Number(value) < 0) {
|
|
65
|
+
throw new FlexHarnessStoreFormatError(`${path} must be a non-negative integer.`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export function assertExactKeys(value, keys, path) {
|
|
69
|
+
const invalidKey = Object.keys(value).find((key) => !keys.includes(key));
|
|
70
|
+
if (invalidKey) {
|
|
71
|
+
throw new FlexHarnessStoreFormatError(`${path}.${invalidKey} is not supported.`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
export function assertRecord(value, path) {
|
|
75
|
+
if (!value
|
|
76
|
+
|| typeof value !== 'object'
|
|
77
|
+
|| Array.isArray(value)
|
|
78
|
+
|| (Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null)) {
|
|
79
|
+
throw new FlexHarnessStoreFormatError(`${path} must be a plain object.`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
export function createAgentEventSnapshot(sessionId, events, revision) {
|
|
83
|
+
return {
|
|
84
|
+
schemaVersion: 2,
|
|
85
|
+
sessionId,
|
|
86
|
+
revision,
|
|
87
|
+
updatedAt: events.reduce((latest, event) => Math.max(latest, event.timestamp), 0),
|
|
88
|
+
events: normalizeJsonObjectUndefined([...events], '$events'),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
export function validateAgentEventSnapshot(value, sessionId) {
|
|
92
|
+
assertJsonSerializable(value, '$snapshot');
|
|
93
|
+
try {
|
|
94
|
+
return plugins.validateAgentEventSnapshotV2(value, sessionId);
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
throw new FlexHarnessStoreFormatError(`$snapshot is not a canonical schema-2 Agent event snapshot: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
export function validateAgentEventArchive(value, sessionId, archiveId) {
|
|
101
|
+
assertJsonSerializable(value, '$archive');
|
|
102
|
+
try {
|
|
103
|
+
return plugins.validateAgentEventArchiveV2(value, sessionId, archiveId);
|
|
104
|
+
}
|
|
105
|
+
catch (error) {
|
|
106
|
+
throw new FlexHarnessStoreFormatError(`$archive is not a canonical schema-2 Agent event archive: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
export function validateToolJobSnapshot(value) {
|
|
110
|
+
assertJsonSerializable(value, '$snapshot');
|
|
111
|
+
assertRecord(value, '$snapshot');
|
|
112
|
+
assertExactKeys(value, ['schemaVersion', 'revision', 'updatedAt', 'jobs'], '$snapshot');
|
|
113
|
+
if (value.schemaVersion !== 1) {
|
|
114
|
+
throw new FlexHarnessStoreFormatError('Tool job snapshot schemaVersion must be 1.');
|
|
115
|
+
}
|
|
116
|
+
assertNonNegativeInteger(value.revision, '$snapshot.revision');
|
|
117
|
+
assertNonNegativeInteger(value.updatedAt, '$snapshot.updatedAt');
|
|
118
|
+
if (!Array.isArray(value.jobs)) {
|
|
119
|
+
throw new FlexHarnessStoreFormatError('$snapshot.jobs must be an array.');
|
|
120
|
+
}
|
|
121
|
+
const executionIds = new Set();
|
|
122
|
+
for (let index = 0; index < value.jobs.length; index++) {
|
|
123
|
+
const path = `$snapshot.jobs[${index}]`;
|
|
124
|
+
assertRecord(value.jobs[index], path);
|
|
125
|
+
const job = value.jobs[index];
|
|
126
|
+
assertExactKeys(job, [
|
|
127
|
+
'executionId',
|
|
128
|
+
'type',
|
|
129
|
+
'state',
|
|
130
|
+
'request',
|
|
131
|
+
'exitCode',
|
|
132
|
+
'stdout',
|
|
133
|
+
'stderr',
|
|
134
|
+
'signal',
|
|
135
|
+
'startedAt',
|
|
136
|
+
'updatedAt',
|
|
137
|
+
'finishedAt',
|
|
138
|
+
], path);
|
|
139
|
+
assertNonEmptyString(job.executionId, `${path}.executionId`);
|
|
140
|
+
if (executionIds.has(job.executionId)) {
|
|
141
|
+
throw new FlexHarnessStoreFormatError(`$snapshot.jobs contains duplicate job "${job.executionId}".`);
|
|
142
|
+
}
|
|
143
|
+
executionIds.add(job.executionId);
|
|
144
|
+
assertNonEmptyString(job.type, `${path}.type`);
|
|
145
|
+
if (!['running', 'finished', 'failed', 'aborted'].includes(String(job.state))) {
|
|
146
|
+
throw new FlexHarnessStoreFormatError(`${path}.state is invalid.`);
|
|
147
|
+
}
|
|
148
|
+
if (job.request !== undefined) {
|
|
149
|
+
const requestPath = `${path}.request`;
|
|
150
|
+
assertRecord(job.request, requestPath);
|
|
151
|
+
assertExactKeys(job.request, ['type', 'command', 'cwd', 'timeoutMs', 'metadata'], requestPath);
|
|
152
|
+
assertNonEmptyString(job.request.type, `${requestPath}.type`);
|
|
153
|
+
if (job.request.command !== undefined) {
|
|
154
|
+
const commandPath = `${requestPath}.command`;
|
|
155
|
+
assertRecord(job.request.command, commandPath);
|
|
156
|
+
assertExactKeys(job.request.command, ['executable', 'args'], commandPath);
|
|
157
|
+
assertNonEmptyString(job.request.command.executable, `${commandPath}.executable`);
|
|
158
|
+
if (!Array.isArray(job.request.command.args)) {
|
|
159
|
+
throw new FlexHarnessStoreFormatError(`${commandPath}.args must be an array.`);
|
|
160
|
+
}
|
|
161
|
+
for (let argumentIndex = 0; argumentIndex < job.request.command.args.length; argumentIndex++) {
|
|
162
|
+
if (typeof job.request.command.args[argumentIndex] !== 'string') {
|
|
163
|
+
throw new FlexHarnessStoreFormatError(`${commandPath}.args[${argumentIndex}] must be a string.`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
if (job.request.cwd !== undefined && typeof job.request.cwd !== 'string') {
|
|
168
|
+
throw new FlexHarnessStoreFormatError(`${requestPath}.cwd must be a string.`);
|
|
169
|
+
}
|
|
170
|
+
if (job.request.timeoutMs !== undefined) {
|
|
171
|
+
assertNonNegativeInteger(job.request.timeoutMs, `${requestPath}.timeoutMs`);
|
|
172
|
+
}
|
|
173
|
+
if (job.request.metadata !== undefined) {
|
|
174
|
+
assertRecord(job.request.metadata, `${requestPath}.metadata`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
if (job.exitCode !== undefined && job.exitCode !== null && !Number.isSafeInteger(job.exitCode)) {
|
|
178
|
+
throw new FlexHarnessStoreFormatError(`${path}.exitCode must be an integer or null.`);
|
|
179
|
+
}
|
|
180
|
+
for (const key of ['stdout', 'stderr', 'signal']) {
|
|
181
|
+
if (job[key] !== undefined && typeof job[key] !== 'string') {
|
|
182
|
+
throw new FlexHarnessStoreFormatError(`${path}.${key} must be a string.`);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
for (const key of ['startedAt', 'updatedAt', 'finishedAt']) {
|
|
186
|
+
if (job[key] !== undefined)
|
|
187
|
+
assertNonNegativeInteger(job[key], `${path}.${key}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return value;
|
|
191
|
+
}
|
|
192
|
+
export function createToolJobSnapshot(jobs, revision) {
|
|
193
|
+
const snapshot = {
|
|
194
|
+
schemaVersion: 1,
|
|
195
|
+
revision,
|
|
196
|
+
updatedAt: Date.now(),
|
|
197
|
+
jobs: normalizeJsonObjectUndefined([...jobs], '$jobs'),
|
|
198
|
+
};
|
|
199
|
+
return validateToolJobSnapshot(snapshot);
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuc3RvcmVjb2RlY3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy91dGlscy5zdG9yZWNvZGVjcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGNBQWMsQ0FBQztBQUN4QyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDMUQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFekQsTUFBTSxVQUFVLDRCQUE0QixDQUFTLEtBQWEsRUFBRSxJQUFJLEdBQUcsR0FBRztJQUM1RSxNQUFNLElBQUksR0FBRyxJQUFJLE9BQU8sRUFBVSxDQUFDO0lBQ25DLE1BQU0sS0FBSyxHQUFHLENBQUMsT0FBZ0IsRUFBRSxXQUFtQixFQUFXLEVBQUU7UUFDL0QsSUFDRSxPQUFPLEtBQUssSUFBSTtlQUNiLE9BQU8sT0FBTyxLQUFLLFFBQVE7ZUFDM0IsT0FBTyxPQUFPLEtBQUssU0FBUztZQUMvQixPQUFPLE9BQU8sQ0FBQztRQUNqQixJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQzlCLE1BQU0sSUFBSSwyQkFBMkIsQ0FBQyxHQUFHLFdBQVcsZ0NBQWdDLENBQUMsQ0FBQztZQUN4RixDQUFDO1lBQ0QsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQztRQUNELElBQUksT0FBTyxPQUFPLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDaEMsTUFBTSxJQUFJLDJCQUEyQixDQUNuQyxHQUFHLFdBQVcsYUFBYSxPQUFPLE9BQU8sMkJBQTJCLENBQ3JFLENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDdEIsTUFBTSxJQUFJLDJCQUEyQixDQUFDLEdBQUcsV0FBVyxpQ0FB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
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import type { IFlexHarnessOptions, TFlexAgentToolSet } from './interfaces.js';
|
|
2
|
+
export declare function wrapToolSet(tools: TFlexAgentToolSet, limits: Required<NonNullable<IFlexHarnessOptions<unknown>['toolOutputLimits']>>, projectError: (error: unknown) => Error): TFlexAgentToolSet;
|