@modelprofile.com/flexharness 10.12.0 → 10.14.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 (40) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/classes.codesandbox.d.ts +39 -0
  3. package/dist_ts/classes.codesandbox.js +539 -0
  4. package/dist_ts/classes.flexharness.d.ts +17 -0
  5. package/dist_ts/classes.flexharness.js +222 -8
  6. package/dist_ts/classes.toolcatalog.d.ts +90 -0
  7. package/dist_ts/classes.toolcatalog.js +1398 -0
  8. package/dist_ts/index.d.ts +1 -0
  9. package/dist_ts/index.js +2 -1
  10. package/dist_ts/interfaces.d.ts +237 -3
  11. package/dist_ts/interfaces.js +50 -1
  12. package/dist_ts/plugins.d.ts +66 -1
  13. package/dist_ts/plugins.js +19 -1
  14. package/dist_ts/utils.harnessoptions.d.ts +7 -1
  15. package/dist_ts/utils.harnessoptions.js +48 -2
  16. package/dist_ts/utils.json.js +3 -1
  17. package/dist_ts/utils.schemadeclarations.d.ts +53 -0
  18. package/dist_ts/utils.schemadeclarations.js +315 -0
  19. package/dist_ts/utils.tooloutput.d.ts +2 -0
  20. package/dist_ts/utils.tooloutput.js +11 -1
  21. package/dist_ts_compaction/plugins.d.ts +3 -3
  22. package/dist_ts_compaction/plugins.js +3 -3
  23. package/dist_ts_compaction/smartagent.compaction.d.ts +10 -1
  24. package/dist_ts_compaction/smartagent.compaction.js +79 -38
  25. package/package.json +17 -4
  26. package/readme.md +1 -1
  27. package/ts/00_commitinfo_data.ts +1 -1
  28. package/ts/classes.codesandbox.ts +565 -0
  29. package/ts/classes.flexharness.ts +242 -7
  30. package/ts/classes.toolcatalog.ts +1512 -0
  31. package/ts/index.ts +1 -0
  32. package/ts/interfaces.ts +285 -3
  33. package/ts/plugins.ts +86 -0
  34. package/ts/readme.md +1 -1
  35. package/ts/utils.harnessoptions.ts +55 -0
  36. package/ts/utils.json.ts +2 -0
  37. package/ts/utils.schemadeclarations.ts +322 -0
  38. package/ts/utils.tooloutput.ts +9 -0
  39. package/ts_compaction/plugins.ts +3 -3
  40. package/ts_compaction/smartagent.compaction.ts +90 -34
@@ -0,0 +1,315 @@
1
+ /**
2
+ * Renders JSON Schema as TypeScript declarations for the tool catalog. The output depends only on
3
+ * the schema, so the same schema always renders to the same bytes.
4
+ */
5
+ const identifierPattern = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
6
+ const maxRenderDepth = 32;
7
+ const maxInlineObjectCharacters = 100;
8
+ const maxSafeInteger = Number.MAX_SAFE_INTEGER;
9
+ export const isSchemaRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
10
+ export const isIdentifier = (value) => identifierPattern.test(value);
11
+ const literal = (value) => {
12
+ if (typeof value === 'string')
13
+ return JSON.stringify(value);
14
+ if (typeof value === 'number' && Number.isFinite(value))
15
+ return String(value);
16
+ if (typeof value === 'boolean' || value === null)
17
+ return String(value);
18
+ return 'unknown';
19
+ };
20
+ /**
21
+ * Reports whether `character` occurs outside brackets, braces, parentheses, string literals and
22
+ * comments.
23
+ */
24
+ const hasTopLevel = (text, character) => {
25
+ let depth = 0;
26
+ let quote;
27
+ for (let index = 0; index < text.length; index++) {
28
+ const current = text[index];
29
+ if (quote) {
30
+ if (current === '\\')
31
+ index++;
32
+ else if (current === quote)
33
+ quote = undefined;
34
+ continue;
35
+ }
36
+ if (current === '/' && text[index + 1] === '*') {
37
+ const end = text.indexOf('*/', index + 2);
38
+ if (end === -1)
39
+ return false;
40
+ index = end + 1;
41
+ continue;
42
+ }
43
+ if (current === '"' || current === "'")
44
+ quote = current;
45
+ else if (current === '{' || current === '[' || current === '(' || current === '<')
46
+ depth++;
47
+ else if (current === '}' || current === ']' || current === ')' || current === '>')
48
+ depth--;
49
+ else if (depth === 0 && current === character)
50
+ return true;
51
+ }
52
+ return false;
53
+ };
54
+ const union = (parts) => {
55
+ const unique = [...new Set(parts)];
56
+ if (unique.includes('unknown'))
57
+ return 'unknown';
58
+ const withoutNever = unique.length > 1 ? unique.filter((part) => part !== 'never') : unique;
59
+ return withoutNever.join(' | ');
60
+ };
61
+ const intersection = (parts) => {
62
+ const unique = [...new Set(parts)].filter((part) => part !== 'unknown');
63
+ if (unique.length === 0)
64
+ return 'unknown';
65
+ return unique.map((part) => hasTopLevel(part, '|') ? `(${part})` : part).join(' & ');
66
+ };
67
+ const arrayOf = (element) => hasTopLevel(element, '|') || hasTopLevel(element, '&') ? `(${element})[]` : `${element}[]`;
68
+ const propertyKey = (name) => isIdentifier(name) ? name : JSON.stringify(name);
69
+ /** A JSDoc block at `indent`; a short single line stays on one line. */
70
+ export const docBlock = (text, indent) => {
71
+ const lines = text.replace(/\*\//g, '*\\/').split('\n').map((line) => line.trimEnd());
72
+ if (lines.length === 1 && indent.length + lines[0].length <= 100)
73
+ return `${indent}/** ${lines[0]} */\n`;
74
+ return `${indent}/**\n${lines.map((line) => line ? `${indent} * ${line}` : `${indent} *`).join('\n')}\n${indent} */\n`;
75
+ };
76
+ export const countOf = (count, unit) => `${count} ${unit}${count === 1 ? '' : 's'}`;
77
+ /** Constraints a TypeScript type cannot state, in a short readable form. */
78
+ const constraintsOf = (schema) => {
79
+ const constraints = [];
80
+ const types = Array.isArray(schema.type) ? schema.type : [schema.type];
81
+ if (types.includes('integer'))
82
+ constraints.push('integer');
83
+ if (typeof schema.format === 'string')
84
+ constraints.push(`format ${schema.format}`);
85
+ const bound = (value) => typeof value === 'number' && Number.isFinite(value) && Math.abs(value) !== maxSafeInteger;
86
+ if (bound(schema.exclusiveMinimum))
87
+ constraints.push(`> ${schema.exclusiveMinimum}`);
88
+ else if (bound(schema.minimum))
89
+ constraints.push(`${schema.exclusiveMinimum === true ? '>' : '>='} ${schema.minimum}`);
90
+ if (bound(schema.exclusiveMaximum))
91
+ constraints.push(`< ${schema.exclusiveMaximum}`);
92
+ else if (bound(schema.maximum))
93
+ constraints.push(`${schema.exclusiveMaximum === true ? '<' : '<='} ${schema.maximum}`);
94
+ if (bound(schema.multipleOf))
95
+ constraints.push(`multiple of ${schema.multipleOf}`);
96
+ const range = (min, max, unit) => {
97
+ const hasMin = bound(min) && min > 0;
98
+ const hasMax = bound(max);
99
+ if (hasMin && hasMax)
100
+ constraints.push(min === max ? countOf(min, unit) : `${min}-${countOf(max, unit)}`);
101
+ else if (hasMin)
102
+ constraints.push(`at least ${countOf(min, unit)}`);
103
+ else if (hasMax)
104
+ constraints.push(`at most ${countOf(max, unit)}`);
105
+ };
106
+ range(schema.minLength, schema.maxLength, 'character');
107
+ range(schema.minItems, schema.maxItems, 'item');
108
+ if (schema.uniqueItems === true)
109
+ constraints.push('unique items');
110
+ if (typeof schema.pattern === 'string')
111
+ constraints.push(`pattern /${schema.pattern}/`);
112
+ if (schema.default !== undefined) {
113
+ const value = JSON.stringify(schema.default);
114
+ if (value !== undefined && value.length <= 60)
115
+ constraints.push(`default ${value}`);
116
+ }
117
+ if (schema.deprecated === true)
118
+ constraints.push('deprecated');
119
+ return constraints;
120
+ };
121
+ /** The documentation of a property: its description and the constraints its type cannot state. */
122
+ export const schemaDoc = (schema, description) => {
123
+ if (!isSchemaRecord(schema))
124
+ return description?.trim() || undefined;
125
+ const text = (description ?? (typeof schema.description === 'string' ? schema.description : '')).trim();
126
+ const constraints = constraintsOf(schema);
127
+ if (constraints.length === 0)
128
+ return text || undefined;
129
+ return text ? `${text} (${constraints.join(', ')})` : constraints.join(', ');
130
+ };
131
+ export class SchemaDeclarationWriter {
132
+ context;
133
+ used = new Set();
134
+ inlining = new Set();
135
+ constructor(context) {
136
+ this.context = context;
137
+ }
138
+ get usedTypes() {
139
+ return [...this.used].sort();
140
+ }
141
+ /** The TypeScript type of `schema`, with continuation lines indented relative to `indent`. */
142
+ type(schema, indent = '', depth = 0, omitMemberDocs = false) {
143
+ if (depth > maxRenderDepth)
144
+ return 'unknown';
145
+ if (schema === true)
146
+ return 'unknown';
147
+ if (schema === false)
148
+ return 'never';
149
+ if (!isSchemaRecord(schema))
150
+ return 'unknown';
151
+ const base = this.baseType(schema, indent, depth, omitMemberDocs);
152
+ return schema.nullable === true ? union([base, 'null']) : base;
153
+ }
154
+ /** The members of an object schema; undefined when the schema is not a plain object type. */
155
+ objectMembers(schema) {
156
+ if (!isSchemaRecord(schema) || !this.isPlainObject(schema))
157
+ return undefined;
158
+ const properties = isSchemaRecord(schema.properties) ? schema.properties : {};
159
+ return Object.entries(properties).map(([name, property]) => {
160
+ const doc = schemaDoc(property);
161
+ return { name, ...(doc === undefined ? {} : { doc }) };
162
+ });
163
+ }
164
+ /** Whether an object schema requires none of its properties. */
165
+ hasNoRequiredProperties(schema) {
166
+ return isSchemaRecord(schema)
167
+ && this.isPlainObject(schema)
168
+ && !(Array.isArray(schema.required) && schema.required.length > 0);
169
+ }
170
+ /** `interface Name { … }` for a plain object schema, otherwise `type Name = …;`. */
171
+ namedDeclaration(name, schema, description) {
172
+ const doc = isSchemaRecord(schema)
173
+ ? (description ?? (typeof schema.description === 'string' ? schema.description : undefined))?.trim()
174
+ : description?.trim();
175
+ const prefix = doc ? docBlock(doc, '') : '';
176
+ if (isSchemaRecord(schema) && this.isPlainObject(schema) && schema.nullable !== true) {
177
+ return `${prefix}interface ${name} ${this.objectType(schema, '', 0, false)}`;
178
+ }
179
+ return `${prefix}type ${name} = ${this.type(schema, '', 0)};`;
180
+ }
181
+ isPlainObject(schema) {
182
+ if (schema.$ref !== undefined || 'const' in schema || schema.enum !== undefined)
183
+ return false;
184
+ if (schema.anyOf !== undefined || schema.oneOf !== undefined || schema.allOf !== undefined)
185
+ return false;
186
+ if (schema.type === 'object')
187
+ return true;
188
+ return schema.type === undefined && isSchemaRecord(schema.properties);
189
+ }
190
+ baseType(schema, indent, depth, omitMemberDocs) {
191
+ if (typeof schema.$ref === 'string')
192
+ return this.reference(schema.$ref, indent, depth);
193
+ if ('const' in schema)
194
+ return literal(schema.const);
195
+ if (Array.isArray(schema.enum))
196
+ return schema.enum.length ? union(schema.enum.map(literal)) : 'never';
197
+ const alternatives = Array.isArray(schema.anyOf) ? schema.anyOf : Array.isArray(schema.oneOf) ? schema.oneOf : undefined;
198
+ if (alternatives?.length) {
199
+ return union(alternatives.map((alternative) => this.type(alternative, indent, depth + 1)));
200
+ }
201
+ if (Array.isArray(schema.allOf) && schema.allOf.length) {
202
+ const own = { ...schema };
203
+ delete own.allOf;
204
+ const hasOwnShape = own.type !== undefined || own.properties !== undefined;
205
+ return intersection([
206
+ ...schema.allOf.map((part) => this.type(part, indent, depth + 1)),
207
+ ...(hasOwnShape ? [this.type(own, indent, depth + 1)] : []),
208
+ ]);
209
+ }
210
+ const types = Array.isArray(schema.type)
211
+ ? schema.type.filter((type) => typeof type === 'string')
212
+ : typeof schema.type === 'string'
213
+ ? [schema.type]
214
+ : this.inferredTypes(schema);
215
+ if (types.length === 0)
216
+ return 'unknown';
217
+ return union(types.map((type) => {
218
+ switch (type) {
219
+ case 'string': return 'string';
220
+ case 'number':
221
+ case 'integer': return 'number';
222
+ case 'boolean': return 'boolean';
223
+ case 'null': return 'null';
224
+ case 'array': return this.arrayType(schema, indent, depth);
225
+ case 'object': return this.objectType(schema, indent, depth, omitMemberDocs);
226
+ default: return 'unknown';
227
+ }
228
+ }));
229
+ }
230
+ inferredTypes(schema) {
231
+ if (schema.properties !== undefined
232
+ || schema.additionalProperties !== undefined
233
+ || schema.patternProperties !== undefined
234
+ || schema.required !== undefined)
235
+ return ['object'];
236
+ if (schema.items !== undefined || schema.prefixItems !== undefined)
237
+ return ['array'];
238
+ return [];
239
+ }
240
+ reference(ref, indent, depth) {
241
+ const name = this.context.namedType(ref);
242
+ if (name) {
243
+ this.used.add(name);
244
+ return name;
245
+ }
246
+ const target = this.context.resolve(ref);
247
+ if (target === undefined || this.inlining.has(ref))
248
+ return 'unknown';
249
+ this.inlining.add(ref);
250
+ try {
251
+ return this.type(target, indent, depth + 1);
252
+ }
253
+ finally {
254
+ this.inlining.delete(ref);
255
+ }
256
+ }
257
+ arrayType(schema, indent, depth) {
258
+ const tuple = Array.isArray(schema.prefixItems)
259
+ ? schema.prefixItems
260
+ : Array.isArray(schema.items) ? schema.items : undefined;
261
+ if (tuple) {
262
+ const rest = Array.isArray(schema.prefixItems) ? schema.items : schema.additionalItems;
263
+ const members = tuple.map((item) => this.type(item, indent, depth + 1));
264
+ if (rest !== undefined && rest !== false) {
265
+ members.push(`...${arrayOf(this.type(rest, indent, depth + 1))}`);
266
+ }
267
+ return `[${members.join(', ')}]`;
268
+ }
269
+ if (schema.items === undefined)
270
+ return 'unknown[]';
271
+ return arrayOf(this.type(schema.items, indent, depth + 1));
272
+ }
273
+ objectType(schema, indent, depth, omitMemberDocs) {
274
+ const memberIndent = `${indent} `;
275
+ const properties = isSchemaRecord(schema.properties) ? schema.properties : {};
276
+ const required = new Set(Array.isArray(schema.required)
277
+ ? schema.required.filter((name) => typeof name === 'string')
278
+ : []);
279
+ const members = [];
280
+ for (const [name, property] of Object.entries(properties)) {
281
+ const type = this.type(property, memberIndent, depth + 1);
282
+ const doc = omitMemberDocs ? undefined : schemaDoc(property);
283
+ members.push({
284
+ ...(doc === undefined ? {} : { doc }),
285
+ text: `${propertyKey(name)}${required.has(name) ? '' : '?'}: ${type}`,
286
+ });
287
+ }
288
+ const indexTypes = [];
289
+ if (isSchemaRecord(schema.patternProperties)) {
290
+ for (const property of Object.values(schema.patternProperties)) {
291
+ indexTypes.push(this.type(property, memberIndent, depth + 1));
292
+ }
293
+ }
294
+ if (isSchemaRecord(schema.additionalProperties)) {
295
+ indexTypes.push(this.type(schema.additionalProperties, memberIndent, depth + 1));
296
+ }
297
+ else if (schema.additionalProperties === true && members.length > 0) {
298
+ indexTypes.push('unknown');
299
+ }
300
+ if (indexTypes.length)
301
+ members.push({ text: `[key: string]: ${union(indexTypes)}` });
302
+ if (members.length === 0)
303
+ return schema.additionalProperties === false ? '{}' : 'Record<string, unknown>';
304
+ if (members.every((member) => member.doc === undefined && !member.text.includes('\n'))) {
305
+ const inline = `{ ${members.map((member) => member.text).join('; ')} }`;
306
+ if (inline.length <= maxInlineObjectCharacters)
307
+ return inline;
308
+ }
309
+ const lines = members.map((member) => `${member.doc === undefined ? '' : docBlock(member.doc, memberIndent)}${memberIndent}${member.text};`);
310
+ return `{\n${lines.join('\n')}\n${indent}}`;
311
+ }
312
+ }
313
+ /** Indents every non-empty line of `text`. */
314
+ export const indentLines = (text, indent) => text.split('\n').map((line) => line ? `${indent}${line}` : line).join('\n');
315
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuc2NoZW1hZGVjbGFyYXRpb25zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvdXRpbHMuc2NoZW1hZGVjbGFyYXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7R0FHRztBQWlCSCxNQUFNLGlCQUFpQixHQUFHLDRCQUE0QixDQUFDO0FBQ3ZELE1BQU0sY0FBYyxHQUFHLEVBQUUsQ0FBQztBQUMxQixNQUFNLHlCQUF5QixHQUFHLEdBQUcsQ0FBQztBQUN0QyxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUM7QUFFL0MsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQUMsS0FBYyxFQUF1QyxFQUFFLENBQ3BGLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUV2RSxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxLQUFhLEVBQVcsRUFBRSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUV0RixNQUFNLE9BQU8sR0FBRyxDQUFDLEtBQWMsRUFBVSxFQUFFO0lBQ3pDLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUTtRQUFFLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1RCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlFLElBQUksT0FBTyxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJO1FBQUUsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkUsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyxDQUFDO0FBRUY7OztHQUdHO0FBQ0gsTUFBTSxXQUFXLEdBQUcs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
@@ -1,2 +1,4 @@
1
1
  import type { IFlexHarnessOptions, TFlexAgentToolSet } from './interfaces.js';
2
+ /** A tool output's final value: the value itself, or the last value an async iterable yields. */
3
+ export declare function settleToolOutput(output: unknown): Promise<unknown>;
2
4
  export declare function wrapToolSet(tools: TFlexAgentToolSet, limits: Required<NonNullable<IFlexHarnessOptions<unknown>['toolOutputLimits']>>, projectError: (error: unknown) => Error): TFlexAgentToolSet;
@@ -13,6 +13,16 @@ async function* normalizeAsyncIterable(iterable, limits, projectError) {
13
13
  throw projectError(error);
14
14
  }
15
15
  }
16
+ /** A tool output's final value: the value itself, or the last value an async iterable yields. */
17
+ export async function settleToolOutput(output) {
18
+ const value = await output;
19
+ if (!isAsyncIterable(value))
20
+ return value;
21
+ let last;
22
+ for await (const item of value)
23
+ last = item;
24
+ return last;
25
+ }
16
26
  export function wrapToolSet(tools, limits, projectError) {
17
27
  const wrapped = {};
18
28
  for (const [name, tool] of Object.entries(tools)) {
@@ -53,4 +63,4 @@ export function wrapToolSet(tools, limits, projectError) {
53
63
  }
54
64
  return wrapped;
55
65
  }
56
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMudG9vbG91dHB1dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3V0aWxzLnRvb2xvdXRwdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFNckQsU0FBUyxlQUFlLENBQUMsS0FBYztJQUNyQyxPQUFPLE9BQU8sQ0FDWixLQUFLO1dBQ0YsQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLEtBQUssVUFBVSxDQUFDO1dBQzFELE9BQVEsS0FBOEMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQUssVUFBVSxDQUMvRixDQUFDO0FBQ0osQ0FBQztBQUVELEtBQUssU0FBUyxDQUFDLENBQUMsc0JBQXNCLENBQ3BDLFFBQWdDLEVBQ2hDLE1BQStFLEVBQy9FLFlBQXVDO0lBRXZDLElBQUksQ0FBQztRQUNILElBQUksS0FBSyxFQUFFLE1BQU0sS0FBSyxJQUFJLFFBQVE7WUFBRSxNQUFNLGtCQUFrQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVCLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLFdBQVcsQ0FDekIsS0FBd0IsRUFDeEIsTUFBK0UsRUFDL0UsWUFBdUM7SUFFdkMsTUFBTSxPQUFPLEdBQTRCLEVBQUUsQ0FBQztJQUM1QyxLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ2pELE1BQU0sVUFBVSxHQUFHLElBQXdDLENBQUM7UUFDNUQsSUFBSSxPQUFPLFVBQVUsQ0FBQyxPQUFPLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDN0MsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQztZQUNyQixTQUFTO1FBQ1gsQ0FBQztRQUNELE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxPQUFPLENBQUM7UUFDbkMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHO1lBQ2QsR0FBRyxVQUFVO1lBQ2IsT0FBTyxDQUFDLEtBQWMsRUFBRSxPQUFnQjtnQkFDdEMsSUFBSSxNQUFlLENBQUM7Z0JBQ3BCLElBQUksQ0FBQztvQkFDSCxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO29CQUM1QyxJQUFJLGVBQWUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO3dCQUM1QixPQUFPLHNCQUFzQixDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7b0JBQzlELENBQUM7Z0JBQ0gsQ0FBQztnQkFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO29CQUNmLE1BQU0sWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM1QixDQUFDO2dCQUNELE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLENBQ2pDLENBQUMsS0FBSyxFQUFFLEVBQUU7b0JBQ1IsSUFBSSxDQUFDO3dCQUNILElBQUksZUFBZSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7NEJBQzNCLE9BQU8sc0JBQXNCLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxZQUFZLENBQUMsQ0FBQzt3QkFDN0QsQ0FBQzt3QkFDRCxPQUFPLGtCQUFrQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztvQkFDM0MsQ0FBQztvQkFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO3dCQUNmLE1BQU0sWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUM1QixDQUFDO2dCQUNILENBQUMsRUFDRCxDQUFDLEtBQWMsRUFBRSxFQUFFO29CQUNqQixNQUFNLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDNUIsQ0FBQyxDQUNGLENBQUM7WUFDSixDQUFDO1NBQ0YsQ0FBQztJQUNKLENBQUM7SUFDRCxPQUFPLE9BQTRCLENBQUM7QUFDdEMsQ0FBQyJ9
66
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMudG9vbG91dHB1dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3V0aWxzLnRvb2xvdXRwdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFNckQsU0FBUyxlQUFlLENBQUMsS0FBYztJQUNyQyxPQUFPLE9BQU8sQ0FDWixLQUFLO1dBQ0YsQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLEtBQUssVUFBVSxDQUFDO1dBQzFELE9BQVEsS0FBOEMsQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQUssVUFBVSxDQUMvRixDQUFDO0FBQ0osQ0FBQztBQUVELEtBQUssU0FBUyxDQUFDLENBQUMsc0JBQXNCLENBQ3BDLFFBQWdDLEVBQ2hDLE1BQStFLEVBQy9FLFlBQXVDO0lBRXZDLElBQUksQ0FBQztRQUNILElBQUksS0FBSyxFQUFFLE1BQU0sS0FBSyxJQUFJLFFBQVE7WUFBRSxNQUFNLGtCQUFrQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLE1BQU0sWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVCLENBQUM7QUFDSCxDQUFDO0FBRUQsaUdBQWlHO0FBQ2pHLE1BQU0sQ0FBQyxLQUFLLFVBQVUsZ0JBQWdCLENBQUMsTUFBZTtJQUNwRCxNQUFNLEtBQUssR0FBRyxNQUFNLE1BQU0sQ0FBQztJQUMzQixJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBQzFDLElBQUksSUFBYSxDQUFDO0lBQ2xCLElBQUksS0FBSyxFQUFFLE1BQU0sSUFBSSxJQUFJLEtBQUs7UUFBRSxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQzVDLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELE1BQU0sVUFBVSxXQUFXLENBQ3pCLEtBQXdCLEVBQ3hCLE1BQStFLEVBQy9FLFlBQXVDO0lBRXZDLE1BQU0sT0FBTyxHQUE0QixFQUFFLENBQUM7SUFDNUMsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNqRCxNQUFNLFVBQVUsR0FBRyxJQUF3QyxDQUFDO1FBQzVELElBQUksT0FBTyxVQUFVLENBQUMsT0FBTyxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQzdDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7WUFDckIsU0FBUztRQUNYLENBQUM7UUFDRCxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDO1FBQ25DLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRztZQUNkLEdBQUcsVUFBVTtZQUNiLE9BQU8sQ0FBQyxLQUFjLEVBQUUsT0FBZ0I7Z0JBQ3RDLElBQUksTUFBZSxDQUFDO2dCQUNwQixJQUFJLENBQUM7b0JBQ0gsTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztvQkFDNUMsSUFBSSxlQUFlLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQzt3QkFDNUIsT0FBTyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO29CQUM5RCxDQUFDO2dCQUNILENBQUM7Z0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztvQkFDZixNQUFNLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDNUIsQ0FBQztnQkFDRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUNqQyxDQUFDLEtBQUssRUFBRSxFQUFFO29CQUNSLElBQUksQ0FBQzt3QkFDSCxJQUFJLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDOzRCQUMzQixPQUFPLHNCQUFzQixDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7d0JBQzdELENBQUM7d0JBQ0QsT0FBTyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7b0JBQzNDLENBQUM7b0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQzt3QkFDZixNQUFNLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDNUIsQ0FBQztnQkFDSCxDQUFDLEVBQ0QsQ0FBQyxLQUFjLEVBQUUsRUFBRTtvQkFDakIsTUFBTSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzVCLENBQUMsQ0FDRixDQUFDO1lBQ0osQ0FBQztTQUNGLENBQUM7SUFDSixDQUFDO0lBQ0QsT0FBTyxPQUE0QixDQUFDO0FBQ3RDLENBQUMifQ==
@@ -1,6 +1,6 @@
1
- import { streamText, wrapLanguageModel } from 'ai';
2
- export { streamText, wrapLanguageModel };
3
- export type { ModelMessage } from 'ai';
1
+ import { asSchema, streamText, wrapLanguageModel } from 'ai';
2
+ export { asSchema, streamText, wrapLanguageModel };
3
+ export type { ModelMessage, ToolSet } from 'ai';
4
4
  export type { TSmartAiLanguageModel } from '@modelprofile.com/flexharness-models';
5
5
  import { AgentModelCallUsageRecorder } from '@modelprofile.com/flexharness-agent';
6
6
  export { AgentModelCallUsageRecorder };
@@ -1,5 +1,5 @@
1
- import { streamText, wrapLanguageModel } from 'ai';
2
- export { streamText, wrapLanguageModel };
1
+ import { asSchema, streamText, wrapLanguageModel } from 'ai';
2
+ export { asSchema, streamText, wrapLanguageModel };
3
3
  import { AgentModelCallUsageRecorder } from '@modelprofile.com/flexharness-agent';
4
4
  export { AgentModelCallUsageRecorder };
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX2NvbXBhY3Rpb24vcGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sSUFBSSxDQUFDO0FBRW5ELE9BQU8sRUFBRSxVQUFVLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztBQUt6QyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUVsRixPQUFPLEVBQUUsMkJBQTJCLEVBQUUsQ0FBQyJ9
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX2NvbXBhY3Rpb24vcGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLElBQUksQ0FBQztBQUU3RCxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxpQkFBaUIsRUFBRSxDQUFDO0FBS25ELE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRWxGLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxDQUFDIn0=
@@ -19,12 +19,21 @@ export interface ICompactMessagesOptions {
19
19
  * options' `providerOptions` through.
20
20
  */
21
21
  providerOptions?: plugins.ProviderOptions;
22
+ /**
23
+ * The tools the conversation's turns are sent with. The summary call carries their definitions,
24
+ * none of their code, so its request repeats the turns' prefix and reads it from the provider's
25
+ * prompt cache, unless the definitions outweigh the history nine times, when reading them would
26
+ * cost more than the history saves. A context compactor passes its options' `tools` through.
27
+ */
28
+ tools?: plugins.ToolSet;
22
29
  }
23
30
  /**
24
31
  * Compacts a message history into a summary.
25
32
  *
26
33
  * The summary is one streamed, instructed model call, the shape every agent turn has, so it reaches
27
- * a provider that serves only that shape (the ChatGPT Codex backend) the way the turns do.
34
+ * a provider that serves only that shape (the ChatGPT Codex backend) the way the turns do. With the
35
+ * turns' `tools` it also repeats their prefix, which the provider has cached; a model that answers
36
+ * it with a tool call instead of a summary is asked once more with tool use turned off.
28
37
  *
29
38
  * @param model The same model used by runAgent, or a cheaper small model
30
39
  * @param messages The full message history that overflowed
@@ -22,11 +22,36 @@ When constructing the summary, try to stick to this template:
22
22
  ---`;
23
23
  /** The instructions of a summary call whose caller names none of the conversation's own. */
24
24
  const COMPACTION_INSTRUCTIONS = 'You summarize a conversation so that another agent can continue its work.';
25
+ /** Added to the summary request when it carries the conversation's tools. */
26
+ const NO_TOOL_CALLS = 'Do not call any tool. Reply with the summary text only.';
27
+ /**
28
+ * Whether the summary request should carry the turns' tool definitions. A cached prefix is read at
29
+ * about a tenth of the input price (Anthropic and OpenAI), so repeating the turns' prefix costs about
30
+ * 0.1 x (tools + history), while a request without the tools reads nothing and pays the history in
31
+ * full: the tools pay their way while they are less than nine times the history.
32
+ */
33
+ async function toolsRepayTheirPrefix(tools, messages) {
34
+ let toolBytes = 0;
35
+ for (const [name, definition] of Object.entries(tools)) {
36
+ const schema = definition.type === 'provider' ? definition.args : await plugins.asSchema(definition.inputSchema).jsonSchema;
37
+ toolBytes += name.length + JSON.stringify([definition.description ?? '', schema ?? null]).length;
38
+ }
39
+ return toolBytes <= 9 * JSON.stringify(messages).length;
40
+ }
41
+ /** A tool set's definitions without anything that runs: no `execute`, no input callbacks. */
42
+ function toolDefinitions(tools) {
43
+ return Object.fromEntries(Object.entries(tools).map(([name, definition]) => {
44
+ const { execute: _execute, onInputStart: _onInputStart, onInputDelta: _onInputDelta, onInputAvailable: _onInputAvailable, ...rest } = definition;
45
+ return [name, rest];
46
+ }));
47
+ }
25
48
  /**
26
49
  * Compacts a message history into a summary.
27
50
  *
28
51
  * The summary is one streamed, instructed model call, the shape every agent turn has, so it reaches
29
- * a provider that serves only that shape (the ChatGPT Codex backend) the way the turns do.
52
+ * a provider that serves only that shape (the ChatGPT Codex backend) the way the turns do. With the
53
+ * turns' `tools` it also repeats their prefix, which the provider has cached; a model that answers
54
+ * it with a tool call instead of a summary is asked once more with tool use turned off.
30
55
  *
31
56
  * @param model The same model used by runAgent, or a cheaper small model
32
57
  * @param messages The full message history that overflowed
@@ -34,9 +59,12 @@ const COMPACTION_INSTRUCTIONS = 'You summarize a conversation so that another ag
34
59
  * @returns A minimal ModelMessage[] containing the summary as context
35
60
  */
36
61
  export async function compactMessages(model, messages, options = {}) {
62
+ const tools = options.tools && Object.keys(options.tools).length > 0 && await toolsRepayTheirPrefix(options.tools, messages)
63
+ ? toolDefinitions(options.tools)
64
+ : undefined;
37
65
  const prompt = [
38
66
  ...messages,
39
- { role: 'user', content: COMPACTION_PROMPT },
67
+ { role: 'user', content: tools ? `${COMPACTION_PROMPT}\n\n${NO_TOOL_CALLS}` : COMPACTION_PROMPT },
40
68
  ];
41
69
  const reportUsage = options.reportUsage;
42
70
  const modelCalls = reportUsage
@@ -61,41 +89,54 @@ export async function compactMessages(model, messages, options = {}) {
61
89
  },
62
90
  })
63
91
  : model;
64
- let streamError;
65
- try {
66
- const result = plugins.streamText({
67
- model: observedModel,
68
- instructions: options.system ?? COMPACTION_INSTRUCTIONS,
69
- messages: prompt,
70
- allowSystemInMessages: true,
71
- ...(options.providerOptions ? { providerOptions: options.providerOptions } : {}),
72
- abortSignal: options.abortSignal,
73
- onError: ({ error }) => {
74
- streamError ??= error;
75
- },
76
- ...(modelCalls
77
- ? {
78
- onLanguageModelCallEnd: ({ modelId, usage }) => {
79
- modelCalls.end(modelId, usage);
80
- },
81
- }
82
- : {}),
83
- });
84
- let summary = '';
85
- for await (const delta of result.textStream)
86
- summary += delta;
87
- // A stream that fails delivers its error to onError and ends, and an aborted stream just ends;
88
- // either way the summary is incomplete and must not replace the history.
89
- if (streamError !== undefined)
90
- throw streamError;
91
- options.abortSignal?.throwIfAborted();
92
- modelCalls?.settle('missing');
93
- return summaryMessages(summary);
94
- }
95
- catch (error) {
96
- modelCalls?.settle(options.abortSignal?.aborted ? 'aborted' : 'failed');
97
- throw streamError ?? error;
98
- }
92
+ // The summary is asked for in the shape of a turn, the tools offered as the turns offer them. A
93
+ // model that calls a tool instead of answering is asked again with tool use turned off, which
94
+ // keeps the tool definitions and so still the cached tools and instructions.
95
+ const summarize = async (toolChoice) => {
96
+ let streamError;
97
+ try {
98
+ const result = plugins.streamText({
99
+ model: observedModel,
100
+ instructions: options.system ?? COMPACTION_INSTRUCTIONS,
101
+ messages: prompt,
102
+ allowSystemInMessages: true,
103
+ ...(tools ? { tools, ...(toolChoice ? { toolChoice } : {}) } : {}),
104
+ ...(options.providerOptions ? { providerOptions: options.providerOptions } : {}),
105
+ abortSignal: options.abortSignal,
106
+ onError: ({ error }) => {
107
+ streamError ??= error;
108
+ },
109
+ ...(modelCalls
110
+ ? {
111
+ onLanguageModelCallEnd: ({ modelId, usage }) => {
112
+ modelCalls.end(modelId, usage);
113
+ },
114
+ }
115
+ : {}),
116
+ });
117
+ let summary = '';
118
+ for await (const delta of result.textStream)
119
+ summary += delta;
120
+ // A stream that fails delivers its error to onError and ends, and an aborted stream just ends;
121
+ // either way the summary is incomplete and must not replace the history.
122
+ if (streamError !== undefined)
123
+ throw streamError;
124
+ options.abortSignal?.throwIfAborted();
125
+ modelCalls?.settle('missing');
126
+ return { summary, calledTools: tools !== undefined && (await result.toolCalls).length > 0 };
127
+ }
128
+ catch (error) {
129
+ modelCalls?.settle(options.abortSignal?.aborted ? 'aborted' : 'failed');
130
+ throw streamError ?? error;
131
+ }
132
+ };
133
+ // A provider-executed tool, such as a web search, would run on the provider's side before the
134
+ // retry could prevent it: with one in the set, tool use is off from the start.
135
+ const providerExecuted = tools !== undefined && Object.values(tools).some((definition) => definition.type === 'provider');
136
+ let { summary, calledTools } = await summarize(providerExecuted ? 'none' : undefined);
137
+ if (calledTools && !summary.trim())
138
+ ({ summary } = await summarize('none'));
139
+ return summaryMessages(summary);
99
140
  }
100
141
  function summaryMessages(summary) {
101
142
  return [
@@ -105,4 +146,4 @@ function summaryMessages(summary) {
105
146
  },
106
147
  ];
107
148
  }
108
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhZ2VudC5jb21wYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfY29tcGFjdGlvbi9zbWFydGFnZW50LmNvbXBhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFeEMsTUFBTSxpQkFBaUIsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFvQnRCLENBQUM7QUFFTCw0RkFBNEY7QUFDNUYsTUFBTSx1QkFBdUIsR0FBRywyRUFBMkUsQ0FBQztBQXdCNUc7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsZUFBZSxDQUNuQyxLQUFvQyxFQUNwQyxRQUFnQyxFQUNoQyxVQUFtQyxFQUFFO0lBRXJDLE1BQU0sTUFBTSxHQUEyQjtRQUNyQyxHQUFHLFFBQVE7UUFDWCxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLGlCQUFpQixFQUFFO0tBQzdDLENBQUM7SUFDRixNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDO0lBQ3hDLE1BQU0sVUFBVSxHQUFHLFdBQVc7UUFDNUIsQ0FBQyxDQUFDLElBQUksT0FBTyxDQUFDLDJCQUEyQixDQUFDLEtBQUssRUFBRSxXQUFXLENBQUM7UUFDN0QsQ0FBQyxDQUFDLFNBQVMsQ0FBQztJQUNkLDZGQUE2RjtJQUM3RixnR0FBZ0c7SUFDaEcsTUFBTSxhQUFhLEdBQUcsVUFBVTtRQUM5QixDQUFDLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDO1lBQ3hCLEtBQUs7WUFDTCxVQUFVLEVBQUU7Z0JBQ1YsVUFBVSxFQUFFLEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFO29CQUN6QyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ25CLElBQUksQ0FBQzt3QkFDSCxPQUFPLE1BQU0sUUFBUSxFQUFFLENBQUM7b0JBQzFCLENBQUM7b0JBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQzt3QkFDZixVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO3dCQUN0RSxNQUFNLEtBQUssQ0FBQztvQkFDZCxDQUFDO2dCQUNILENBQUM7YUFDRjtTQUNGLENBQUM7UUFDSixDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ1YsSUFBSSxXQUFvQixDQUFDO0lBQ3pCLElBQUksQ0FBQztRQUNILE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUM7WUFDaEMsS0FBSyxFQUFFLGFBQWE7WUFDcEIsWUFBWSxFQUFFLE9BQU8sQ0FBQyxNQUFNLElBQUksdUJBQXVCO1lBQ3ZELFFBQVEsRUFBRSxNQUFNO1lBQ2hCLHFCQUFxQixFQUFFLElBQUk7WUFDM0IsR0FBRyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLEVBQUUsZUFBZSxFQUFFLE9BQU8sQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2hGLFdBQVcsRUFBRSxPQUFPLENBQUMsV0FBVztZQUNoQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUU7Z0JBQ3JCLFdBQVcsS0FBSyxLQUFLLENBQUM7WUFDeEIsQ0FBQztZQUNELEdBQUcsQ0FBQyxVQUFVO2dCQUNaLENBQUMsQ0FBQztvQkFDRSxzQkFBc0IsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUU7d0JBQzdDLFVBQVUsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO29CQUNqQyxDQUFDO2lCQUNGO2dCQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDUixDQUFDLENBQUM7UUFDSCxJQUFJLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxLQUFLLEVBQUUsTUFBTSxLQUFLLElBQUksTUFBTSxDQUFDLFVBQVU7WUFBRSxPQUFPLElBQUksS0FBSyxDQUFDO1FBQzlELCtGQUErRjtRQUMvRix5RUFBeUU7UUFDekUsSUFBSSxXQUFXLEtBQUssU0FBUztZQUFFLE1BQU0sV0FBVyxDQUFDO1FBQ2pELE9BQU8sQ0FBQyxXQUFXLEVBQUUsY0FBYyxFQUFFLENBQUM7UUFDdEMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5QixPQUFPLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNsQyxDQUFDO0lBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztRQUNmLFVBQVUsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEUsTUFBTSxXQUFXLElBQUksS0FBSyxDQUFDO0lBQzdCLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsT0FBZTtJQUN0QyxPQUFPO1FBQ0w7WUFDRSxJQUFJLEVBQUUsTUFBTTtZQUNaLE9BQU8sRUFBRSxzQ0FBc0MsT0FBTywyQ0FBMkM7U0FDbEc7S0FDRixDQUFDO0FBQ0osQ0FBQyJ9
149
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnRhZ2VudC5jb21wYWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfY29tcGFjdGlvbi9zbWFydGFnZW50LmNvbXBhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFFeEMsTUFBTSxpQkFBaUIsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUFvQnRCLENBQUM7QUFFTCw0RkFBNEY7QUFDNUYsTUFBTSx1QkFBdUIsR0FBRywyRUFBMkUsQ0FBQztBQUU1Ryw2RUFBNkU7QUFDN0UsTUFBTSxhQUFhLEdBQUcseURBQXlELENBQUM7QUErQmhGOzs7OztHQUtHO0FBQ0gsS0FBSyxVQUFVLHFCQUFxQixDQUFDLEtBQXNCLEVBQUUsUUFBZ0M7SUFDM0YsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDdkQsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLElBQUksS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUMsVUFBVSxDQUFDO1FBQzVILFNBQVMsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxVQUFVLENBQUMsV0FBVyxJQUFJLEVBQUUsRUFBRSxNQUFNLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDbkcsQ0FBQztJQUNELE9BQU8sU0FBUyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQztBQUMxRCxDQUFDO0FBRUQsNkZBQTZGO0FBQzdGLFNB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