@modelprofile.com/flexharness 10.12.0 → 10.13.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.
@@ -0,0 +1,1336 @@
1
+ import * as plugins from './plugins.js';
2
+ import { FlexHarnessValidationError } from './errors.js';
3
+ import { FLEX_TOOL_CATALOG_LIMITS as limits, FLEX_TOOL_CATALOG_TOOL_NAMES as toolNames, } from './interfaces.js';
4
+ import { SchemaDeclarationWriter, countOf, docBlock, indentLines, isIdentifier, isSchemaRecord, } from './utils.schemadeclarations.js';
5
+ import { validateUtf8String } from './utils.validation.js';
6
+ const aiSchemaSymbol = Symbol.for('vercel.ai.schema');
7
+ const methodPathPattern = /^[A-Za-z_][A-Za-z0-9_]*(?:\.[A-Za-z_][A-Za-z0-9_]*)*$/;
8
+ const typeNamePattern = /^[A-Za-z_][A-Za-z0-9_]*$/;
9
+ /** Words a declaration cannot use as a function, namespace or type name. */
10
+ const reservedWords = new Set([
11
+ 'await', 'break', 'case', 'catch', 'class', 'const', 'continue', 'debugger', 'default', 'delete', 'do',
12
+ 'else', 'enum', 'export', 'extends', 'false', 'finally', 'for', 'function', 'if', 'implements', 'import',
13
+ 'in', 'instanceof', 'interface', 'let', 'new', 'null', 'package', 'private', 'protected', 'public',
14
+ 'return', 'static', 'super', 'switch', 'this', 'throw', 'true', 'try', 'typeof', 'var', 'void', 'while',
15
+ 'with', 'yield',
16
+ ]);
17
+ const controlPattern = /[\u0000-\u001f\u007f]/;
18
+ const definitionRefPattern = /^#\/(\$defs|definitions)\/([^/]+)$/;
19
+ const declaredTypesHeader = '// Declares types: ';
20
+ const identifierScanPattern = /[A-Za-z_$][A-Za-z0-9_$]*/g;
21
+ const describeFormats = new Set(['typescript', 'json-schema']);
22
+ const methodKeys = new Set([
23
+ 'method', 'summary', 'description', 'tags', 'examples', 'inputSchema', 'outputSchema', 'declaration', 'run',
24
+ ]);
25
+ const typeKeys = new Set(['name', 'description', 'schema', 'declaration']);
26
+ const stopWords = new Set([
27
+ 'a', 'an', 'and', 'are', 'all', 'as', 'be', 'by', 'for', 'from', 'get', 'i', 'in', 'is', 'it', 'me', 'my',
28
+ 'of', 'on', 'or', 'that', 'the', 'this', 'to', 'with',
29
+ ]);
30
+ const fieldWeights = { name: 3, namespace: 1.5, summary: 2, tags: 2, description: 1 };
31
+ const bm25K1 = 1.2;
32
+ const bm25B = 0.75;
33
+ const coreCache = new WeakMap();
34
+ const isPlainObject = (value) => typeof value === 'object'
35
+ && value !== null
36
+ && !Array.isArray(value)
37
+ && [Object.prototype, null].includes(Object.getPrototypeOf(value));
38
+ const compareCodePoints = (left, right) => left < right ? -1 : left > right ? 1 : 0;
39
+ const stableStringify = (value) => {
40
+ if (Array.isArray(value))
41
+ return `[${value.map(stableStringify).join(',')}]`;
42
+ if (isSchemaRecord(value)) {
43
+ return `{${Object.keys(value).sort(compareCodePoints)
44
+ .map((key) => `${JSON.stringify(key)}:${stableStringify(value[key])}`).join(',')}}`;
45
+ }
46
+ return JSON.stringify(value) ?? 'null';
47
+ };
48
+ const deepFreeze = (value) => {
49
+ if (typeof value === 'object' && value !== null && !Object.isFrozen(value)) {
50
+ Object.freeze(value);
51
+ for (const child of Object.values(value))
52
+ deepFreeze(child);
53
+ }
54
+ return value;
55
+ };
56
+ const decodePointerToken = (token) => {
57
+ let decoded = token;
58
+ try {
59
+ decoded = decodeURI(token);
60
+ }
61
+ catch {
62
+ decoded = token;
63
+ }
64
+ return decoded.replace(/~1/g, '/').replace(/~0/g, '~');
65
+ };
66
+ const pointerTokens = (pointer) => pointer.replace(/^#/, '').split('/').slice(1).map(decodePointerToken);
67
+ /** Resolves a local JSON pointer against `root`, following `$ref` tokens of keyword locations. */
68
+ const resolvePointer = (root, pointer) => {
69
+ let node = root;
70
+ for (const token of pointerTokens(pointer)) {
71
+ if (token === '$ref' && isSchemaRecord(node) && typeof node.$ref === 'string') {
72
+ node = node.$ref.startsWith('#') ? resolvePointer(root, node.$ref) : undefined;
73
+ continue;
74
+ }
75
+ if (Array.isArray(node))
76
+ node = node[Number(token)];
77
+ else if (isSchemaRecord(node))
78
+ node = Object.prototype.hasOwnProperty.call(node, token) ? node[token] : undefined;
79
+ else
80
+ return undefined;
81
+ }
82
+ return node;
83
+ };
84
+ const collectRefs = (node, refs) => {
85
+ if (Array.isArray(node)) {
86
+ for (const child of node)
87
+ collectRefs(child, refs);
88
+ return;
89
+ }
90
+ if (!isSchemaRecord(node))
91
+ return;
92
+ for (const [key, child] of Object.entries(node)) {
93
+ if (key === '$ref' && typeof child === 'string')
94
+ refs.add(child);
95
+ else if (key !== 'const' && key !== 'enum' && key !== 'default' && key !== 'examples')
96
+ collectRefs(child, refs);
97
+ }
98
+ };
99
+ const schemaDraft = (root) => {
100
+ const declared = isSchemaRecord(root) && typeof root.$schema === 'string' ? root.$schema : '';
101
+ if (declared.includes('draft-04'))
102
+ return '4';
103
+ if (declared.includes('draft-06') || declared.includes('draft-07'))
104
+ return '7';
105
+ if (declared.includes('2019-09'))
106
+ return '2019-09';
107
+ return '2020-12';
108
+ };
109
+ const withoutDraft = (schema) => {
110
+ if (!isSchemaRecord(schema) || schema.$schema === undefined)
111
+ return schema;
112
+ const { $schema: _draft, ...rest } = schema;
113
+ return rest;
114
+ };
115
+ const stem = (word) => {
116
+ if (word.length > 4 && word.endsWith('ies'))
117
+ return `${word.slice(0, -3)}y`;
118
+ if (word.length > 3 && word.endsWith('s') && !word.endsWith('ss'))
119
+ return word.slice(0, -1);
120
+ return word;
121
+ };
122
+ const searchTerms = (text) => text
123
+ .replace(/([a-z0-9])([A-Z])/g, '$1 $2')
124
+ .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2')
125
+ .toLowerCase()
126
+ .split(/[^\p{L}\p{N}]+/u)
127
+ .filter(Boolean)
128
+ .map(stem);
129
+ const editDistance = (left, right, limit) => {
130
+ if (Math.abs(left.length - right.length) > limit)
131
+ return limit + 1;
132
+ let previous = Array.from({ length: right.length + 1 }, (_, index) => index);
133
+ for (let row = 1; row <= left.length; row++) {
134
+ const current = [row];
135
+ let best = row;
136
+ for (let column = 1; column <= right.length; column++) {
137
+ const cost = left[row - 1] === right[column - 1] ? 0 : 1;
138
+ current[column] = Math.min(previous[column] + 1, current[column - 1] + 1, previous[column - 1] + cost);
139
+ best = Math.min(best, current[column]);
140
+ }
141
+ if (best > limit)
142
+ return limit + 1;
143
+ previous = current;
144
+ }
145
+ return previous[right.length];
146
+ };
147
+ const closeMatches = (wanted, candidates, count = 3) => {
148
+ const normalized = wanted.toLowerCase();
149
+ const limit = Math.max(2, Math.floor(normalized.length / 3));
150
+ const scored = [];
151
+ for (const candidate of candidates) {
152
+ const lower = candidate.toLowerCase();
153
+ const lastSegment = lower.slice(lower.lastIndexOf('.') + 1);
154
+ const distance = Math.min(editDistance(normalized, lower, limit), lower.includes(normalized) || normalized.includes(lastSegment) ? 1 : limit + 1);
155
+ if (distance <= limit)
156
+ scored.push({ name: candidate, distance });
157
+ }
158
+ return scored
159
+ .sort((left, right) => left.distance - right.distance || compareCodePoints(left.name, right.name))
160
+ .slice(0, count)
161
+ .map((entry) => entry.name);
162
+ };
163
+ const preview = (value) => {
164
+ if (value === undefined)
165
+ return 'missing';
166
+ let text;
167
+ try {
168
+ text = JSON.stringify(value) ?? String(value);
169
+ }
170
+ catch {
171
+ text = String(value);
172
+ }
173
+ return text.length > 80 ? `${text.slice(0, 77)}...` : text;
174
+ };
175
+ const paramsPath = (tokens) => tokens.reduce((path, token) => {
176
+ if (typeof token === 'number' || /^\d+$/.test(token))
177
+ return `${path}[${token}]`;
178
+ return isIdentifier(token) ? `${path}.${token}` : `${path}[${JSON.stringify(token)}]`;
179
+ }, 'params');
180
+ const valueAt = (value, tokens) => {
181
+ let node = value;
182
+ for (const token of tokens) {
183
+ if (Array.isArray(node))
184
+ node = node[Number(token)];
185
+ else if (isSchemaRecord(node))
186
+ node = Object.prototype.hasOwnProperty.call(node, token) ? node[String(token)] : undefined;
187
+ else
188
+ return undefined;
189
+ }
190
+ return node;
191
+ };
192
+ const compactType = (text) => {
193
+ const compact = text.replace(/\/\*\*[\s\S]*?\*\//g, '').replace(/\s+/g, ' ').trim();
194
+ return compact.length > 200 ? `${compact.slice(0, 197)}...` : compact;
195
+ };
196
+ const textOf = (value, label, options) => {
197
+ if (typeof value !== 'string' || !value.trim()) {
198
+ throw new FlexHarnessValidationError(`${label} must be a non-empty string.`);
199
+ }
200
+ if (options.maxBytes !== undefined)
201
+ validateUtf8String(value, label, options.maxBytes, true);
202
+ if (options.maxCharacters !== undefined && [...value].length > options.maxCharacters) {
203
+ throw new FlexHarnessValidationError(`${label} must be at most ${options.maxCharacters} characters.`);
204
+ }
205
+ if (options.singleLine && controlPattern.test(value)) {
206
+ throw new FlexHarnessValidationError(`${label} must be one line without control characters.`);
207
+ }
208
+ return value;
209
+ };
210
+ const textListOf = (value, label, maxItems, options) => {
211
+ if (value === undefined)
212
+ return [];
213
+ if (!Array.isArray(value) || value.length > maxItems) {
214
+ throw new FlexHarnessValidationError(`${label} must be an array with at most ${maxItems} entries.`);
215
+ }
216
+ return value.map((entry, index) => textOf(entry, `${label}[${index}]`, options));
217
+ };
218
+ async function resolveCatalogSchema(schema, label) {
219
+ let json;
220
+ let validate;
221
+ if (typeof schema === 'function'
222
+ || (isSchemaRecord(schema) && (aiSchemaSymbol in schema || '~standard' in schema))) {
223
+ let resolved;
224
+ try {
225
+ resolved = plugins.asSchema(schema);
226
+ json = await resolved.jsonSchema;
227
+ }
228
+ catch (error) {
229
+ throw new FlexHarnessValidationError(`${label} cannot be converted to JSON Schema.`, { cause: error });
230
+ }
231
+ if (resolved.validate) {
232
+ const validator = resolved.validate;
233
+ validate = (value) => validator(value);
234
+ }
235
+ }
236
+ else if (isPlainObject(schema) || typeof schema === 'boolean') {
237
+ json = schema;
238
+ }
239
+ else {
240
+ throw new FlexHarnessValidationError(`${label} must be a JSON Schema object, or a zod, Standard Schema or AI SDK schema.`);
241
+ }
242
+ let copy;
243
+ try {
244
+ copy = structuredClone(json);
245
+ }
246
+ catch (error) {
247
+ throw new FlexHarnessValidationError(`${label} must be plain JSON.`, { cause: error });
248
+ }
249
+ if (!isSchemaRecord(copy) && typeof copy !== 'boolean') {
250
+ throw new FlexHarnessValidationError(`${label} must be a JSON Schema object.`);
251
+ }
252
+ validateUtf8String(JSON.stringify(copy), label, limits.maxSchemaBytes, true);
253
+ return { json: deepFreeze(copy), ...(validate ? { validate } : {}) };
254
+ }
255
+ class CatalogSearchIndex {
256
+ entries;
257
+ postings = new Map();
258
+ idf = new Map();
259
+ constructor(entries) {
260
+ this.entries = entries;
261
+ const fieldTexts = (entry) => ({
262
+ name: searchTerms(entry.name),
263
+ namespace: searchTerms(entry.namespace),
264
+ summary: searchTerms(entry.summary),
265
+ tags: entry.tags.flatMap(searchTerms),
266
+ description: searchTerms(entry.description ?? ''),
267
+ });
268
+ const documents = entries.map(fieldTexts);
269
+ const fields = Object.keys(fieldWeights);
270
+ const averageLength = Object.fromEntries(fields.map((field) => [
271
+ field,
272
+ Math.max(1, documents.reduce((sum, document) => sum + document[field].length, 0) / Math.max(1, documents.length)),
273
+ ]));
274
+ const documentFrequency = new Map();
275
+ documents.forEach((document, index) => {
276
+ const weights = new Map();
277
+ for (const field of fields) {
278
+ const frequencies = new Map();
279
+ for (const term of document[field])
280
+ frequencies.set(term, (frequencies.get(term) ?? 0) + 1);
281
+ const norm = 1 - bm25B + bm25B * (document[field].length / averageLength[field]);
282
+ for (const [term, frequency] of frequencies) {
283
+ weights.set(term, (weights.get(term) ?? 0) + fieldWeights[field] * frequency / norm);
284
+ }
285
+ }
286
+ for (const [term, weight] of weights) {
287
+ documentFrequency.set(term, (documentFrequency.get(term) ?? 0) + 1);
288
+ const postings = this.postings.get(term) ?? [];
289
+ postings.push({ index, weight });
290
+ this.postings.set(term, postings);
291
+ }
292
+ });
293
+ for (const [term, frequency] of documentFrequency) {
294
+ this.idf.set(term, Math.log(1 + (entries.length - frequency + 0.5) / (frequency + 0.5)));
295
+ }
296
+ }
297
+ /** Methods ranked by BM25 over name, namespace, summary, tags and description. */
298
+ search(query, accept) {
299
+ const allTerms = [...new Set(searchTerms(query))];
300
+ const meaningful = allTerms.filter((term) => !stopWords.has(term));
301
+ const terms = meaningful.length > 0 ? meaningful : allTerms;
302
+ const scores = new Map();
303
+ for (const term of terms) {
304
+ const idf = this.idf.get(term);
305
+ if (idf === undefined)
306
+ continue;
307
+ for (const { index, weight } of this.postings.get(term)) {
308
+ scores.set(index, (scores.get(index) ?? 0) + idf * weight * (bm25K1 + 1) / (weight + bm25K1));
309
+ }
310
+ }
311
+ const exact = query.trim().toLowerCase();
312
+ return [...scores.entries()]
313
+ .map(([index, score]) => {
314
+ const entry = this.entries[index];
315
+ const bonus = entry.path.toLowerCase() === exact || entry.name.toLowerCase() === exact ? 1000 : 0;
316
+ return { entry, score: score + bonus };
317
+ })
318
+ .filter(({ entry }) => accept(entry))
319
+ .sort((left, right) => right.score - left.score || compareCodePoints(left.entry.path, right.entry.path))
320
+ .map(({ entry }) => entry);
321
+ }
322
+ }
323
+ class FlexToolCatalogCore {
324
+ mode;
325
+ methods;
326
+ types;
327
+ renderedMethods = new Map();
328
+ renderedTypes = new Map();
329
+ validators = new Map();
330
+ selfContainedInputs = new Map();
331
+ index;
332
+ constructor(mode, methods, types) {
333
+ this.mode = mode;
334
+ this.methods = methods;
335
+ this.types = types;
336
+ this.index = new CatalogSearchIndex([...methods.values()]);
337
+ }
338
+ static async build(catalog, mode) {
339
+ if (!isPlainObject(catalog))
340
+ throw new FlexHarnessValidationError('A tool catalog must be a plain object.');
341
+ const unsupported = Object.keys(catalog).find((key) => key !== 'methods' && key !== 'types');
342
+ if (unsupported)
343
+ throw new FlexHarnessValidationError(`A tool catalog does not support "${unsupported}".`);
344
+ if (!Array.isArray(catalog.methods) || catalog.methods.length > limits.maxMethods) {
345
+ throw new FlexHarnessValidationError(`Tool catalog methods must be an array with at most ${limits.maxMethods} entries.`);
346
+ }
347
+ if (catalog.types !== undefined && (!Array.isArray(catalog.types) || catalog.types.length > limits.maxTypes)) {
348
+ throw new FlexHarnessValidationError(`Tool catalog types must be an array with at most ${limits.maxTypes} entries.`);
349
+ }
350
+ const catalogTypes = new Map();
351
+ for (const [index, type] of (catalog.types ?? []).entries()) {
352
+ const entry = await FlexToolCatalogCore.normalizeType(type, `Tool catalog type ${index}`);
353
+ if (catalogTypes.has(entry.name)) {
354
+ throw new FlexHarnessValidationError(`Tool catalog type "${entry.name}" is defined twice.`);
355
+ }
356
+ catalogTypes.set(entry.name, entry);
357
+ }
358
+ const methodInputs = [];
359
+ for (const [index, method] of catalog.methods.entries()) {
360
+ methodInputs.push(await FlexToolCatalogCore.normalizeMethod(method, `Tool catalog method ${index}`));
361
+ }
362
+ methodInputs.sort((left, right) => compareCodePoints(left.path, right.path));
363
+ const paths = new Set();
364
+ for (const method of methodInputs) {
365
+ if (paths.has(method.path))
366
+ throw new FlexHarnessValidationError(`Tool catalog method "${method.path}" is defined twice.`);
367
+ paths.add(method.path);
368
+ }
369
+ for (const method of methodInputs) {
370
+ for (let end = method.path.indexOf('.'); end !== -1; end = method.path.indexOf('.', end + 1)) {
371
+ const namespace = method.path.slice(0, end);
372
+ if (paths.has(namespace)) {
373
+ throw new FlexHarnessValidationError(`Tool catalog path "${namespace}" is both a method and a namespace.`);
374
+ }
375
+ }
376
+ }
377
+ const registry = new Map(catalogTypes);
378
+ const canonicalDefinitions = new Map();
379
+ const scopeOf = (root, label, requireSchemas) => {
380
+ const scope = { root, localNames: new Map() };
381
+ FlexToolCatalogCore.checkRefs(root, label, catalogTypes, requireSchemas);
382
+ if (!isSchemaRecord(root))
383
+ return scope;
384
+ for (const container of ['$defs', 'definitions']) {
385
+ const definitions = root[container];
386
+ if (!isSchemaRecord(definitions))
387
+ continue;
388
+ for (const key of Object.keys(definitions).sort(compareCodePoints)) {
389
+ if (!typeNamePattern.test(key) || reservedWords.has(key) || key.length > limits.maxIdentifierCharacters)
390
+ continue;
391
+ const definition = definitions[key];
392
+ const canonical = stableStringify(definition);
393
+ let name = key;
394
+ for (let suffix = 2;; suffix++) {
395
+ const existing = registry.get(name);
396
+ if (!existing) {
397
+ registry.set(name, { name, definition, scope });
398
+ canonicalDefinitions.set(name, canonical);
399
+ break;
400
+ }
401
+ if (existing.definition === undefined || canonicalDefinitions.get(name) === canonical)
402
+ break;
403
+ name = `${key}_${suffix}`;
404
+ }
405
+ scope.localNames.set(`${container}/${key}`, name);
406
+ }
407
+ }
408
+ return scope;
409
+ };
410
+ for (const type of catalogTypes.values()) {
411
+ if (!type.schema)
412
+ continue;
413
+ registry.set(type.name, { ...type, scope: scopeOf(type.schema.json, `Tool catalog type "${type.name}"`, true) });
414
+ }
415
+ const methods = new Map();
416
+ for (const method of methodInputs) {
417
+ methods.set(method.path, {
418
+ ...method,
419
+ inputScope: scopeOf(method.input.json, `Tool catalog method "${method.path}" inputSchema`, true),
420
+ ...(method.output
421
+ ? { outputScope: scopeOf(method.output.json, `Tool catalog method "${method.path}" outputSchema`, false) }
422
+ : {}),
423
+ });
424
+ }
425
+ const types = new Map([...registry.entries()].sort(([left], [right]) => compareCodePoints(left, right)));
426
+ return new FlexToolCatalogCore(mode, methods, types);
427
+ }
428
+ static async normalizeType(value, label) {
429
+ if (!isPlainObject(value))
430
+ throw new FlexHarnessValidationError(`${label} must be a plain object.`);
431
+ const unsupported = Object.keys(value).find((key) => !typeKeys.has(key));
432
+ if (unsupported)
433
+ throw new FlexHarnessValidationError(`${label} does not support "${unsupported}".`);
434
+ const name = textOf(value.name, `${label} name`, { maxCharacters: limits.maxIdentifierCharacters, singleLine: true });
435
+ if (!typeNamePattern.test(name) || reservedWords.has(name)) {
436
+ throw new FlexHarnessValidationError(`${label} name must be an identifier that is not a reserved word.`);
437
+ }
438
+ if (value.schema === undefined && value.declaration === undefined) {
439
+ throw new FlexHarnessValidationError(`Tool catalog type "${name}" needs a schema or a declaration.`);
440
+ }
441
+ const description = value.description === undefined
442
+ ? undefined
443
+ : textOf(value.description, `Tool catalog type "${name}" description`, { maxBytes: limits.maxDescriptionBytes });
444
+ const declaration = value.declaration === undefined
445
+ ? undefined
446
+ : textOf(value.declaration, `Tool catalog type "${name}" declaration`, { maxBytes: limits.maxDeclarationBytes });
447
+ if (declaration !== undefined && !new RegExp(`\\b(?:interface|type|enum|class)\\s+${name}\\b`).test(declaration)) {
448
+ throw new FlexHarnessValidationError(`Tool catalog type "${name}" declaration must declare "${name}".`);
449
+ }
450
+ const schema = value.schema === undefined
451
+ ? undefined
452
+ : await resolveCatalogSchema(value.schema, `Tool catalog type "${name}" schema`);
453
+ if (schema && isSchemaRecord(schema.json) && (schema.json.$defs !== undefined || schema.json.definitions !== undefined)) {
454
+ throw new FlexHarnessValidationError(`Tool catalog type "${name}" schema must refer to other catalog types instead of defining $defs.`);
455
+ }
456
+ return {
457
+ name,
458
+ ...(description === undefined ? {} : { description }),
459
+ ...(declaration === undefined ? {} : { declaration }),
460
+ ...(schema === undefined ? {} : { schema }),
461
+ };
462
+ }
463
+ static async normalizeMethod(value, label) {
464
+ if (!isPlainObject(value))
465
+ throw new FlexHarnessValidationError(`${label} must be a plain object.`);
466
+ const unsupported = Object.keys(value).find((key) => !methodKeys.has(key));
467
+ if (unsupported)
468
+ throw new FlexHarnessValidationError(`${label} does not support "${unsupported}".`);
469
+ const path = textOf(value.method, `${label} method`, { maxCharacters: limits.maxMethodPathCharacters, singleLine: true });
470
+ const segments = path.split('.');
471
+ if (!methodPathPattern.test(path)
472
+ || segments.length > limits.maxMethodPathSegments
473
+ || segments.some((segment) => segment.length > limits.maxIdentifierCharacters)) {
474
+ throw new FlexHarnessValidationError(`${label} method "${path}" must be a dotted path of at most ${limits.maxMethodPathSegments} identifiers.`);
475
+ }
476
+ const reserved = segments.find((segment) => reservedWords.has(segment));
477
+ if (reserved) {
478
+ throw new FlexHarnessValidationError(`${label} method "${path}" uses the reserved word "${reserved}", which a declaration cannot name.`);
479
+ }
480
+ const methodLabel = `Tool catalog method "${path}"`;
481
+ const summary = textOf(value.summary, `${methodLabel} summary`, {
482
+ maxCharacters: limits.maxSummaryCharacters, singleLine: true,
483
+ }).trim();
484
+ const description = value.description === undefined
485
+ ? undefined
486
+ : textOf(value.description, `${methodLabel} description`, { maxBytes: limits.maxDescriptionBytes }).trim();
487
+ const tags = textListOf(value.tags, `${methodLabel} tags`, limits.maxTags, {
488
+ maxCharacters: limits.maxTagCharacters, singleLine: true,
489
+ });
490
+ const examples = textListOf(value.examples, `${methodLabel} examples`, limits.maxExamples, {
491
+ maxBytes: limits.maxExampleBytes,
492
+ });
493
+ const name = segments[segments.length - 1];
494
+ const declaration = value.declaration === undefined
495
+ ? undefined
496
+ : textOf(value.declaration, `${methodLabel} declaration`, { maxBytes: limits.maxDeclarationBytes });
497
+ if (declaration !== undefined && !new RegExp(`\\bfunction\\s+${name}\\s*[<(]`).test(declaration)) {
498
+ throw new FlexHarnessValidationError(`${methodLabel} declaration must declare "function ${name}(".`);
499
+ }
500
+ if (typeof value.run !== 'function')
501
+ throw new FlexHarnessValidationError(`${methodLabel} run must be a function.`);
502
+ if (value.inputSchema === undefined)
503
+ throw new FlexHarnessValidationError(`${methodLabel} needs an inputSchema.`);
504
+ const input = await resolveCatalogSchema(value.inputSchema, `${methodLabel} inputSchema`);
505
+ const inputJson = input.json;
506
+ const describesObject = isSchemaRecord(inputJson) && (inputJson.type === 'object'
507
+ || (Array.isArray(inputJson.type) && inputJson.type.includes('object'))
508
+ || (inputJson.type === undefined && (inputJson.properties !== undefined || inputJson.$ref !== undefined
509
+ || inputJson.anyOf !== undefined || inputJson.oneOf !== undefined || inputJson.allOf !== undefined)));
510
+ if (!describesObject)
511
+ throw new FlexHarnessValidationError(`${methodLabel} inputSchema must describe an object.`);
512
+ const output = value.outputSchema === undefined
513
+ ? undefined
514
+ : await resolveCatalogSchema(value.outputSchema, `${methodLabel} outputSchema`);
515
+ const run = value.run;
516
+ return {
517
+ path,
518
+ namespace: segments.slice(0, -1).join('.'),
519
+ name,
520
+ summary,
521
+ ...(description ? { description } : {}),
522
+ tags: Object.freeze(tags),
523
+ examples: Object.freeze(examples),
524
+ input,
525
+ ...(output ? { output } : {}),
526
+ ...(declaration === undefined ? {} : { declaration }),
527
+ run: (params, context) => run.call(value, params, context),
528
+ };
529
+ }
530
+ /** Every `$ref` must be local and resolve here or, as a definition reference, to a catalog type. */
531
+ static checkRefs(root, label, catalogTypes, requireSchemas) {
532
+ const refs = new Set();
533
+ collectRefs(root, refs);
534
+ const pending = [...refs];
535
+ const visited = new Set();
536
+ while (pending.length > 0) {
537
+ const ref = pending.pop();
538
+ if (visited.has(ref))
539
+ continue;
540
+ visited.add(ref);
541
+ if (!ref.startsWith('#'))
542
+ throw new FlexHarnessValidationError(`${label} has the non-local $ref "${ref}".`);
543
+ if (resolvePointer(root, ref) !== undefined)
544
+ continue;
545
+ const match = definitionRefPattern.exec(ref);
546
+ const type = match ? catalogTypes.get(decodePointerToken(match[2])) : undefined;
547
+ if (!type)
548
+ throw new FlexHarnessValidationError(`${label} has the unresolved $ref "${ref}".`);
549
+ if (!requireSchemas)
550
+ continue;
551
+ if (!type.schema) {
552
+ throw new FlexHarnessValidationError(`${label} refers to type "${type.name}", which has no schema to validate with.`);
553
+ }
554
+ const nested = new Set();
555
+ collectRefs(type.schema.json, nested);
556
+ pending.push(...nested);
557
+ }
558
+ }
559
+ scopeContext(scope) {
560
+ return {
561
+ namedType: (ref) => {
562
+ const match = definitionRefPattern.exec(ref);
563
+ if (!match)
564
+ return undefined;
565
+ const key = decodePointerToken(match[2]);
566
+ const local = scope.localNames.get(`${match[1]}/${key}`);
567
+ if (local)
568
+ return local;
569
+ if (resolvePointer(scope.root, ref) !== undefined)
570
+ return undefined;
571
+ return this.types.has(key) ? key : undefined;
572
+ },
573
+ resolve: (ref) => {
574
+ const target = resolvePointer(scope.root, ref);
575
+ return isSchemaRecord(target) || typeof target === 'boolean' ? target : undefined;
576
+ },
577
+ };
578
+ }
579
+ renderType(name) {
580
+ const cached = this.renderedTypes.get(name);
581
+ if (cached)
582
+ return cached;
583
+ const type = this.types.get(name);
584
+ let rendered;
585
+ if (type.declaration !== undefined) {
586
+ rendered = { text: type.declaration.trim(), types: this.scanTypes(type.declaration, name) };
587
+ }
588
+ else {
589
+ const schema = type.definition ?? type.schema.json;
590
+ const writer = new SchemaDeclarationWriter(this.scopeContext(type.scope));
591
+ const text = writer.namedDeclaration(name, schema, type.description);
592
+ rendered = { text, types: writer.usedTypes.filter((used) => used !== name) };
593
+ }
594
+ this.renderedTypes.set(name, rendered);
595
+ return rendered;
596
+ }
597
+ renderMethod(entry) {
598
+ const cached = this.renderedMethods.get(entry.path);
599
+ if (cached)
600
+ return cached;
601
+ let rendered;
602
+ if (entry.declaration !== undefined) {
603
+ rendered = { text: entry.declaration.trim(), types: this.scanTypes(entry.declaration) };
604
+ }
605
+ else {
606
+ const inputWriter = new SchemaDeclarationWriter(this.scopeContext(entry.inputScope));
607
+ const members = inputWriter.objectMembers(entry.input.json);
608
+ const paramsType = inputWriter.type(entry.input.json, '', 0, members !== undefined);
609
+ const optional = inputWriter.hasNoRequiredProperties(entry.input.json) ? '?' : '';
610
+ const outputWriter = entry.output && entry.outputScope
611
+ ? new SchemaDeclarationWriter(this.scopeContext(entry.outputScope))
612
+ : undefined;
613
+ const resultType = outputWriter ? outputWriter.type(entry.output.json) : 'unknown';
614
+ const lines = [entry.summary];
615
+ if (entry.description && entry.description !== entry.summary)
616
+ lines.push('', ...entry.description.split('\n'));
617
+ for (const member of members ?? []) {
618
+ if (member.doc === undefined)
619
+ continue;
620
+ const key = isIdentifier(member.name) ? `.${member.name}` : `[${JSON.stringify(member.name)}]`;
621
+ lines.push(`@param params${key} ${member.doc.replace(/\s*\n\s*/g, ' ')}`);
622
+ }
623
+ for (const example of entry.examples) {
624
+ lines.push(...(example.includes('\n') ? ['@example', ...example.split('\n')] : [`@example ${example}`]));
625
+ }
626
+ const signature = `function ${entry.name}(params${optional}: ${paramsType}): Promise<${resultType}>;`;
627
+ rendered = {
628
+ text: `${docBlock(lines.join('\n'), '')}${signature}`,
629
+ types: [...new Set([...inputWriter.usedTypes, ...(outputWriter?.usedTypes ?? [])])].sort(compareCodePoints),
630
+ };
631
+ }
632
+ this.renderedMethods.set(entry.path, rendered);
633
+ return rendered;
634
+ }
635
+ scanTypes(text, self) {
636
+ const found = new Set();
637
+ for (const match of text.matchAll(identifierScanPattern)) {
638
+ if (match[0] !== self && this.types.has(match[0]))
639
+ found.add(match[0]);
640
+ }
641
+ return [...found].sort(compareCodePoints);
642
+ }
643
+ /** `names` and every type they use, transitively, sorted. */
644
+ typeClosure(names, stop = new Set()) {
645
+ const result = new Set();
646
+ const pending = [...names];
647
+ while (pending.length > 0) {
648
+ const name = pending.pop();
649
+ if (result.has(name) || stop.has(name) || !this.types.has(name))
650
+ continue;
651
+ result.add(name);
652
+ pending.push(...this.renderType(name).types);
653
+ }
654
+ return [...result].sort(compareCodePoints);
655
+ }
656
+ /** The method's input schema with the catalog types it refers to added as definitions. */
657
+ selfContainedInput(entry) {
658
+ const cached = this.selfContainedInputs.get(entry.path);
659
+ if (cached !== undefined)
660
+ return cached;
661
+ const root = structuredClone(entry.input.json);
662
+ if (isSchemaRecord(root)) {
663
+ const pending = new Set();
664
+ collectRefs(root, pending);
665
+ const queue = [...pending];
666
+ while (queue.length > 0) {
667
+ const ref = queue.pop();
668
+ const match = definitionRefPattern.exec(ref);
669
+ if (!match || resolvePointer(root, ref) !== undefined)
670
+ continue;
671
+ const type = this.types.get(decodePointerToken(match[2]));
672
+ if (!type?.schema)
673
+ continue;
674
+ const container = (isSchemaRecord(root[match[1]]) ? root[match[1]] : (root[match[1]] = {}));
675
+ container[decodePointerToken(match[2])] = withoutDraft(structuredClone(type.schema.json));
676
+ const nested = new Set();
677
+ collectRefs(type.schema.json, nested);
678
+ queue.push(...nested);
679
+ }
680
+ }
681
+ deepFreeze(root);
682
+ this.selfContainedInputs.set(entry.path, root);
683
+ return root;
684
+ }
685
+ validator(entry) {
686
+ let validator = this.validators.get(entry.path);
687
+ if (!validator) {
688
+ const root = structuredClone(this.selfContainedInput(entry));
689
+ validator = new plugins.JsonSchemaValidator(root, schemaDraft(root), false);
690
+ this.validators.set(entry.path, validator);
691
+ }
692
+ return validator;
693
+ }
694
+ }
695
+ /**
696
+ * A tool catalog prepared for the model: search, TypeScript declarations, parameter validation and
697
+ * dispatch. FlexHarness builds one for every catalog a tool provider returns; it is public so a
698
+ * host can check what its catalog shows the model, and measure it, without running a session.
699
+ */
700
+ export class FlexToolCatalog {
701
+ core;
702
+ admitted;
703
+ namespaceTree;
704
+ constructor(core, admitted) {
705
+ this.core = core;
706
+ this.admitted = admitted;
707
+ }
708
+ /**
709
+ * Prepares `catalog`. Preparing the same object again returns the cached preparation, so a host
710
+ * that returns one catalog object for every run pays for it once.
711
+ */
712
+ static async create(catalog, options = {}) {
713
+ const mode = options.declarations ?? 'typescript';
714
+ if (!describeFormats.has(mode)) {
715
+ throw new FlexHarnessValidationError('toolCatalog.declarations must be "typescript" or "json-schema".');
716
+ }
717
+ if (typeof catalog !== 'object' || catalog === null) {
718
+ throw new FlexHarnessValidationError('A tool catalog must be a plain object.');
719
+ }
720
+ let byMode = coreCache.get(catalog);
721
+ if (!byMode) {
722
+ byMode = new Map();
723
+ coreCache.set(catalog, byMode);
724
+ }
725
+ let core = byMode.get(mode);
726
+ if (!core) {
727
+ core = FlexToolCatalogCore.build(catalog, mode);
728
+ byMode.set(mode, core);
729
+ }
730
+ return new FlexToolCatalog(await core, undefined);
731
+ }
732
+ /** Every method path this catalog offers, sorted. */
733
+ get methods() {
734
+ return [...this.core.methods.keys()].filter((path) => this.isAdmitted(path));
735
+ }
736
+ /** Every named type, sorted. */
737
+ get types() {
738
+ return [...this.core.types.keys()];
739
+ }
740
+ /** The same catalog offering only `paths`. */
741
+ restrict(paths) {
742
+ const allowed = new Set(paths);
743
+ return new FlexToolCatalog(this.core, new Set([...this.core.methods.keys()].filter((path) => allowed.has(path) && this.isAdmitted(path))));
744
+ }
745
+ has(path) {
746
+ return this.core.methods.has(path) && this.isAdmitted(path);
747
+ }
748
+ /** The three built-in tools as the model sees them. Their text depends only on the catalog. */
749
+ toolDefinitions() {
750
+ const typescript = this.core.mode === 'typescript';
751
+ const methodPath = { type: 'string', maxLength: limits.maxMethodPathCharacters };
752
+ return {
753
+ [toolNames.search]: {
754
+ description: [
755
+ 'Search the API catalog. Its methods are called with execute, not as tools. `query` ranks methods by',
756
+ 'name, summary and description; `namespace` (a dotted path) narrows the search or, without `query`, lists',
757
+ `the namespace like ls. Read a method's ${typescript ? 'TypeScript declaration' : 'description and JSON Schema'}`,
758
+ 'with describe_tools before calling it.',
759
+ this.topLevelLine(),
760
+ ].join(' '),
761
+ inputSchema: {
762
+ type: 'object',
763
+ properties: {
764
+ query: { type: 'string', maxLength: limits.maxQueryCharacters },
765
+ namespace: methodPath,
766
+ limit: { type: 'integer', minimum: 1, maximum: limits.maxSearchResults },
767
+ offset: { type: 'integer', minimum: 0 },
768
+ },
769
+ additionalProperties: false,
770
+ },
771
+ },
772
+ [toolNames.describe]: {
773
+ description: typescript
774
+ ? 'Return the TypeScript declarations of catalog methods (`methods`: dotted paths) and named types (`types`). '
775
+ + 'A declaration comes with the named types it uses that this conversation has not declared yet.'
776
+ : 'Return the description and JSON Schema of catalog methods (`methods`: dotted paths) and named types (`types`).',
777
+ inputSchema: {
778
+ type: 'object',
779
+ properties: {
780
+ methods: { type: 'array', items: methodPath, maxItems: limits.maxDescribeMethods },
781
+ types: {
782
+ type: 'array',
783
+ items: { type: 'string', maxLength: limits.maxIdentifierCharacters },
784
+ maxItems: limits.maxDescribeTypes,
785
+ },
786
+ },
787
+ additionalProperties: false,
788
+ },
789
+ },
790
+ [toolNames.execute]: {
791
+ description: 'Call a catalog method: `method` is its dotted path, `params` the parameter object of its '
792
+ + 'declaration. Invalid params return an error naming each path, what was expected and what was given.',
793
+ inputSchema: {
794
+ type: 'object',
795
+ properties: {
796
+ method: { ...methodPath, minLength: 1 },
797
+ params: { type: 'object' },
798
+ },
799
+ required: ['method'],
800
+ additionalProperties: false,
801
+ },
802
+ },
803
+ };
804
+ }
805
+ /** Search results or a namespace listing as text. */
806
+ search(input = {}) {
807
+ const limit = input.limit ?? limits.defaultSearchResults;
808
+ const offset = input.offset ?? 0;
809
+ if (!Number.isSafeInteger(limit) || limit < 1 || limit > limits.maxSearchResults) {
810
+ throw new FlexHarnessValidationError(`limit must be an integer from 1 through ${limits.maxSearchResults}.`);
811
+ }
812
+ if (!Number.isSafeInteger(offset) || offset < 0)
813
+ throw new FlexHarnessValidationError('offset must be a non-negative integer.');
814
+ const namespace = (input.namespace ?? '').trim().replace(/\.\*?$/, '');
815
+ const tree = this.tree();
816
+ if (namespace && !tree.has(namespace)) {
817
+ if (this.has(namespace)) {
818
+ return `${namespace} is a method, not a namespace; read it with describe_tools.`;
819
+ }
820
+ const suggestions = closeMatches(namespace, [...tree.keys()].filter(Boolean));
821
+ return [
822
+ `There is no namespace ${namespace}.${suggestions.length ? ` Did you mean ${suggestions.join(', ')}?` : ''}`,
823
+ this.topLevelLine(),
824
+ ].join('\n');
825
+ }
826
+ const query = (input.query ?? '').trim();
827
+ if (query) {
828
+ const prefix = namespace ? `${namespace}.` : '';
829
+ const matches = this.core.index.search(query, (entry) => this.isAdmitted(entry.path) && entry.path.startsWith(prefix));
830
+ if (matches.length === 0) {
831
+ return [`No methods match "${query}"${namespace ? ` in ${namespace}` : ''}.`, this.topLevelLine()].join('\n');
832
+ }
833
+ return this.page(matches.map((entry) => `${entry.path} - ${entry.summary}`), offset, limit, 'matches');
834
+ }
835
+ const node = tree.get(namespace);
836
+ const lines = [...node.children.entries()].map(([child, count]) => `${child}.* (${count} method${count === 1 ? '' : 's'})`);
837
+ const methodLines = node.methods.map((entry) => `${entry.path} - ${entry.summary}`);
838
+ if (methodLines.length === 0)
839
+ return lines.join('\n') || 'The catalog has no methods.';
840
+ return [...lines, this.page(methodLines, offset, limit, 'methods')].filter(Boolean).join('\n');
841
+ }
842
+ /**
843
+ * The declarations of `input.methods` and `input.types`. Method declarations bring the named
844
+ * types they use, minus `declaredTypes`, which a session already has.
845
+ */
846
+ describe(input, options = {}) {
847
+ const requestedMethods = [...new Set(input.methods ?? [])];
848
+ const requestedTypes = [...new Set(input.types ?? [])];
849
+ if (requestedMethods.length > limits.maxDescribeMethods || requestedTypes.length > limits.maxDescribeTypes) {
850
+ throw new FlexHarnessValidationError(`describe_tools takes at most ${limits.maxDescribeMethods} methods and ${limits.maxDescribeTypes} types.`);
851
+ }
852
+ const maxBytes = Math.min(options.maxBytes ?? limits.maxDescribeBytes, limits.maxDescribeBytes);
853
+ const entries = requestedMethods.filter((path) => this.has(path)).sort(compareCodePoints)
854
+ .map((path) => this.core.methods.get(path));
855
+ const unknownMethods = requestedMethods.filter((path) => !this.has(path)).sort(compareCodePoints);
856
+ const knownTypes = requestedTypes.filter((name) => this.core.types.has(name)).sort(compareCodePoints);
857
+ const unknownTypes = requestedTypes.filter((name) => !this.core.types.has(name)).sort(compareCodePoints);
858
+ const notes = [
859
+ ...unknownMethods.map((path) => {
860
+ const suggestions = closeMatches(path, this.methods);
861
+ return `Unknown method ${path}.${suggestions.length ? ` Did you mean ${suggestions.join(', ')}?` : ' Find methods with search_tools.'}`;
862
+ }),
863
+ ...unknownTypes.map((name) => {
864
+ const suggestions = closeMatches(name, this.core.types.keys());
865
+ return `Unknown type ${name}.${suggestions.length ? ` Did you mean ${suggestions.join(', ')}?` : ''}`;
866
+ }),
867
+ ];
868
+ if (requestedMethods.length === 0 && requestedTypes.length === 0) {
869
+ notes.push('Pass methods (dotted paths) or types to describe.');
870
+ }
871
+ return this.core.mode === 'json-schema'
872
+ ? this.describeJson(entries, knownTypes, notes, maxBytes)
873
+ : this.describeTypescript(entries, knownTypes, notes, new Set(options.declaredTypes ?? []), maxBytes);
874
+ }
875
+ /** The named types `describe_tools` results in `messages` declared. */
876
+ declaredTypesIn(messages) {
877
+ const declared = new Set();
878
+ for (const message of messages ?? []) {
879
+ if (message.role !== 'tool' || !Array.isArray(message.content))
880
+ continue;
881
+ for (const part of message.content) {
882
+ if (part.type !== 'tool-result' || part.toolName !== toolNames.describe)
883
+ continue;
884
+ const output = part.output;
885
+ if (output.type !== 'text' || typeof output.value !== 'string' || !output.value.startsWith(declaredTypesHeader))
886
+ continue;
887
+ const lineEnd = output.value.indexOf('\n');
888
+ const header = output.value.slice(declaredTypesHeader.length, lineEnd === -1 ? undefined : lineEnd);
889
+ for (const name of header.split(', '))
890
+ if (this.core.types.has(name))
891
+ declared.add(name);
892
+ }
893
+ }
894
+ return declared;
895
+ }
896
+ /**
897
+ * Resolves and validates a call. A failure is the error `execute` reports to the model; success
898
+ * returns the run with the validated parameters. A schema validator that throws rejects.
899
+ */
900
+ async prepareCall(method, params) {
901
+ const path = typeof method === 'string' ? method : '';
902
+ if (!this.has(path)) {
903
+ const isNamespace = path !== '' && this.tree().has(path);
904
+ return {
905
+ success: false,
906
+ error: {
907
+ error: 'unknown_method',
908
+ method: path,
909
+ didYouMean: isNamespace ? [] : closeMatches(path, this.methods),
910
+ hint: isNamespace
911
+ ? `${path} is a namespace; list it with search_tools({"namespace":"${path}"}).`
912
+ : 'Find methods with search_tools.',
913
+ },
914
+ };
915
+ }
916
+ const entry = this.core.methods.get(path);
917
+ const value = params === undefined ? {} : params;
918
+ const issues = this.validateStructure(entry, value);
919
+ let validated = value;
920
+ if (issues.length === 0 && entry.input.validate) {
921
+ // A validator that throws failed itself; only a failure it reports is the model's to repair.
922
+ const result = await entry.input.validate(value);
923
+ if (result.success)
924
+ validated = result.value;
925
+ else
926
+ issues.push(...this.foreignIssues(result.error, value));
927
+ }
928
+ if (issues.length > 0) {
929
+ const listed = issues.slice(0, limits.maxParamIssues);
930
+ return {
931
+ success: false,
932
+ error: {
933
+ error: 'invalid_params',
934
+ method: path,
935
+ issues: listed,
936
+ ...(issues.length > listed.length ? { more: issues.length - listed.length } : {}),
937
+ see: `describe_tools({"methods":["${path}"]})`,
938
+ },
939
+ };
940
+ }
941
+ return {
942
+ success: true,
943
+ method: path,
944
+ params: validated,
945
+ run: (context) => entry.run(validated, context),
946
+ };
947
+ }
948
+ /** The real method and params of an `execute` input, when it names a method of this catalog. */
949
+ callTarget(input) {
950
+ if (!isSchemaRecord(input) || typeof input.method !== 'string' || !this.has(input.method))
951
+ return undefined;
952
+ return { method: input.method, params: input.params === undefined ? {} : input.params };
953
+ }
954
+ isAdmitted(path) {
955
+ return this.admitted === undefined || this.admitted.has(path);
956
+ }
957
+ tree() {
958
+ if (this.namespaceTree)
959
+ return this.namespaceTree;
960
+ const tree = new Map();
961
+ const node = (namespace) => {
962
+ let entry = tree.get(namespace);
963
+ if (!entry) {
964
+ entry = { methods: [], children: new Map() };
965
+ tree.set(namespace, entry);
966
+ }
967
+ return entry;
968
+ };
969
+ node('');
970
+ for (const entry of this.core.methods.values()) {
971
+ if (!this.isAdmitted(entry.path))
972
+ continue;
973
+ node(entry.namespace).methods.push(entry);
974
+ const segments = entry.path.split('.');
975
+ for (let depth = 1; depth < segments.length; depth++) {
976
+ const parent = segments.slice(0, depth - 1).join('.');
977
+ const child = segments.slice(0, depth).join('.');
978
+ const children = node(parent).children;
979
+ children.set(child, (children.get(child) ?? 0) + 1);
980
+ node(child);
981
+ }
982
+ }
983
+ for (const entry of tree.values()) {
984
+ entry.children = new Map([...entry.children.entries()].sort(([left], [right]) => compareCodePoints(left, right)));
985
+ }
986
+ this.namespaceTree = tree;
987
+ return tree;
988
+ }
989
+ topLevelLine() {
990
+ const root = this.tree().get('');
991
+ const namespaces = [...root.children.entries()];
992
+ const shown = namespaces.slice(0, 40).map(([name, count]) => `${name}.* (${count})`);
993
+ if (namespaces.length > shown.length)
994
+ shown.push(`${namespaces.length - shown.length} more namespaces`);
995
+ if (root.methods.length > 0) {
996
+ shown.push(namespaces.length > 0
997
+ ? `${root.methods.length} top-level method${root.methods.length === 1 ? '' : 's'}`
998
+ : `${root.methods.length} method${root.methods.length === 1 ? '' : 's'}`);
999
+ }
1000
+ return `Top level: ${shown.join(', ') || 'no methods'}.`;
1001
+ }
1002
+ page(lines, offset, limit, noun) {
1003
+ const shown = lines.slice(offset, offset + limit);
1004
+ if (shown.length === 0)
1005
+ return `No more ${noun}: there are ${lines.length}.`;
1006
+ if (offset === 0 && shown.length === lines.length)
1007
+ return shown.join('\n');
1008
+ const end = offset + shown.length;
1009
+ const more = end < lines.length ? `; pass offset ${end} for more` : '';
1010
+ return [...shown, `Showing ${offset + 1}-${end} of ${lines.length} ${noun}${more}.`].join('\n');
1011
+ }
1012
+ describeTypescript(entries, requestedTypes, notes, declared, maxBytes) {
1013
+ const included = [];
1014
+ const omitted = [];
1015
+ const alreadyDeclared = new Set([...declared].filter((name) => !requestedTypes.includes(name)));
1016
+ let types = this.core.typeClosure(requestedTypes, alreadyDeclared);
1017
+ const assemble = (methods, typeNames, skipped) => {
1018
+ const used = new Set(methods.flatMap((entry) => this.core.typeClosure(this.core.renderMethod(entry).types)));
1019
+ const earlier = [...used].filter((name) => declared.has(name) && !typeNames.includes(name)).sort(compareCodePoints);
1020
+ const blocks = [];
1021
+ if (typeNames.length)
1022
+ blocks.push(`${declaredTypesHeader}${typeNames.join(', ')}`);
1023
+ for (const name of typeNames)
1024
+ blocks.push(this.core.renderType(name).text);
1025
+ const byNamespace = new Map();
1026
+ for (const entry of methods)
1027
+ byNamespace.set(entry.namespace, [...(byNamespace.get(entry.namespace) ?? []), entry]);
1028
+ for (const [namespace, members] of byNamespace) {
1029
+ const texts = members.map((entry) => this.core.renderMethod(entry).text);
1030
+ if (namespace)
1031
+ blocks.push(`declare namespace ${namespace} {\n${indentLines(texts.join('\n'), ' ')}\n}`);
1032
+ else
1033
+ blocks.push(...texts.map(withDeclare));
1034
+ }
1035
+ const trailing = [
1036
+ ...(earlier.length ? [`Declared earlier: ${earlier.join(', ')}; describe_tools({"types":[...]}) declares them again.`] : []),
1037
+ ...notes,
1038
+ ...(skipped.length ? [`Not included to stay within the size limit: ${skipped.join(', ')}; describe them in another call.`] : []),
1039
+ ];
1040
+ if (trailing.length)
1041
+ blocks.push(trailing.map((note) => `// ${note}`).join('\n'));
1042
+ return blocks.join('\n\n');
1043
+ };
1044
+ for (const entry of entries) {
1045
+ const candidate = [...included, entry];
1046
+ const candidateTypes = this.core.typeClosure([...requestedTypes, ...candidate.flatMap((method) => this.core.renderMethod(method).types)], alreadyDeclared);
1047
+ const text = assemble(candidate, candidateTypes, entries.slice(candidate.length).map((method) => method.path));
1048
+ if (Buffer.byteLength(JSON.stringify(text), 'utf8') > maxBytes && included.length > 0) {
1049
+ omitted.push(...entries.slice(included.length).map((method) => method.path));
1050
+ break;
1051
+ }
1052
+ included.push(entry);
1053
+ types = candidateTypes;
1054
+ }
1055
+ const text = assemble(included, types, omitted);
1056
+ return { output: text, declaredTypes: types };
1057
+ }
1058
+ describeJson(entries, requestedTypes, notes, maxBytes) {
1059
+ const methods = [];
1060
+ const omitted = [];
1061
+ const typeSchemas = requestedTypes.flatMap((name) => {
1062
+ const type = this.core.types.get(name);
1063
+ const schema = type.definition ?? type.schema?.json;
1064
+ return [{
1065
+ name,
1066
+ ...(type.description ? { description: type.description } : {}),
1067
+ ...(schema === undefined ? { declaration: type.declaration } : { schema: withoutDraft(schema) }),
1068
+ }];
1069
+ });
1070
+ let size = Buffer.byteLength(JSON.stringify({ types: typeSchemas, notes }), 'utf8');
1071
+ for (const entry of entries) {
1072
+ const method = {
1073
+ method: entry.path,
1074
+ summary: entry.summary,
1075
+ ...(entry.description ? { description: entry.description } : {}),
1076
+ inputSchema: withoutDraft(this.core.selfContainedInput(entry)),
1077
+ ...(entry.output ? { outputSchema: withoutDraft(entry.output.json) } : {}),
1078
+ ...(entry.examples.length ? { examples: [...entry.examples] } : {}),
1079
+ };
1080
+ const bytes = Buffer.byteLength(JSON.stringify(method), 'utf8') + 1;
1081
+ if (methods.length > 0 && size + bytes > maxBytes) {
1082
+ omitted.push(...entries.slice(methods.length).map((skipped) => skipped.path));
1083
+ break;
1084
+ }
1085
+ size += bytes;
1086
+ methods.push(method);
1087
+ }
1088
+ return {
1089
+ output: JSON.parse(JSON.stringify({
1090
+ methods,
1091
+ ...(typeSchemas.length ? { types: typeSchemas } : {}),
1092
+ ...(notes.length ? { notes } : {}),
1093
+ ...(omitted.length ? { omitted } : {}),
1094
+ })),
1095
+ declaredTypes: [],
1096
+ };
1097
+ }
1098
+ /** Issues the method's JSON Schema finds in `value`. */
1099
+ validateStructure(entry, value) {
1100
+ const result = this.core.validator(entry).validate(value);
1101
+ if (result.valid)
1102
+ return [];
1103
+ const root = this.core.selfContainedInput(entry);
1104
+ const writer = new SchemaDeclarationWriter({
1105
+ namedType: (ref) => {
1106
+ const match = definitionRefPattern.exec(ref);
1107
+ const key = match ? decodePointerToken(match[2]) : undefined;
1108
+ return key && typeNamePattern.test(key) ? key : undefined;
1109
+ },
1110
+ resolve: (ref) => {
1111
+ const target = resolvePointer(root, ref);
1112
+ return isSchemaRecord(target) || typeof target === 'boolean' ? target : undefined;
1113
+ },
1114
+ });
1115
+ const typeText = (schema) => isSchemaRecord(schema) || typeof schema === 'boolean' ? compactType(writer.type(schema)) : 'a value';
1116
+ const issues = [];
1117
+ const covered = [];
1118
+ let container;
1119
+ for (const unit of result.errors) {
1120
+ if (covered.some((prefix) => unit.keywordLocation.startsWith(`${prefix}/`)))
1121
+ continue;
1122
+ const tokens = pointerTokens(unit.instanceLocation);
1123
+ const path = paramsPath(tokens);
1124
+ const got = preview(valueAt(value, tokens));
1125
+ const schemaHere = resolvePointer(root, unit.keywordLocation);
1126
+ const parent = resolvePointer(root, unit.keywordLocation.slice(0, unit.keywordLocation.lastIndexOf('/')));
1127
+ switch (unit.keyword) {
1128
+ case 'additionalProperties':
1129
+ case 'unevaluatedProperties':
1130
+ container = unit;
1131
+ continue;
1132
+ case 'properties':
1133
+ case 'patternProperties':
1134
+ case 'items':
1135
+ case 'prefixItems':
1136
+ case 'additionalItems':
1137
+ case 'unevaluatedItems':
1138
+ case 'allOf':
1139
+ case '$ref':
1140
+ case '$recursiveRef':
1141
+ case '$dynamicRef':
1142
+ case 'dependentSchemas':
1143
+ case 'if':
1144
+ case 'then':
1145
+ case 'else':
1146
+ continue;
1147
+ case 'false': {
1148
+ const name = tokens[tokens.length - 1] ?? '';
1149
+ const owner = container && unit.instanceLocation.startsWith(`${container.instanceLocation}/`)
1150
+ ? resolvePointer(root, container.keywordLocation.slice(0, container.keywordLocation.lastIndexOf('/')))
1151
+ : undefined;
1152
+ if (isSchemaRecord(owner)) {
1153
+ const declaredProperty = isSchemaRecord(owner.properties)
1154
+ && Object.prototype.hasOwnProperty.call(owner.properties, name);
1155
+ const matchesPattern = isSchemaRecord(owner.patternProperties)
1156
+ && Object.keys(owner.patternProperties).some((pattern) => {
1157
+ try {
1158
+ return new RegExp(pattern, 'u').test(name);
1159
+ }
1160
+ catch {
1161
+ return false;
1162
+ }
1163
+ });
1164
+ if (declaredProperty || matchesPattern)
1165
+ continue;
1166
+ const known = isSchemaRecord(owner.properties) ? Object.keys(owner.properties) : [];
1167
+ issues.push({
1168
+ path,
1169
+ expected: known.length
1170
+ ? `no such property; known properties: ${known.slice(0, 20).join(', ')}`
1171
+ : 'no such property',
1172
+ got,
1173
+ });
1174
+ }
1175
+ else {
1176
+ issues.push({ path, expected: 'no value', got });
1177
+ }
1178
+ continue;
1179
+ }
1180
+ case 'required': {
1181
+ const required = Array.isArray(schemaHere) ? schemaHere.filter((key) => typeof key === 'string') : [];
1182
+ const instance = valueAt(value, tokens);
1183
+ for (const key of required) {
1184
+ if (isSchemaRecord(instance) && Object.prototype.hasOwnProperty.call(instance, key))
1185
+ continue;
1186
+ const property = isSchemaRecord(parent) && isSchemaRecord(parent.properties) ? parent.properties[key] : undefined;
1187
+ issues.push({ path: paramsPath([...tokens, key]), expected: typeText(property), got: 'missing' });
1188
+ }
1189
+ continue;
1190
+ }
1191
+ case 'anyOf':
1192
+ case 'oneOf':
1193
+ case 'not':
1194
+ covered.push(unit.keywordLocation);
1195
+ issues.push({ path, expected: unit.keyword === 'not' ? `not ${typeText(schemaHere)}` : typeText(parent), got });
1196
+ continue;
1197
+ case 'type':
1198
+ issues.push({
1199
+ path,
1200
+ expected: Array.isArray(schemaHere) ? schemaHere.join(' | ') : String(schemaHere),
1201
+ got,
1202
+ });
1203
+ continue;
1204
+ case 'enum':
1205
+ case 'const':
1206
+ issues.push({ path, expected: typeText(parent), got });
1207
+ continue;
1208
+ case 'minimum':
1209
+ case 'exclusiveMinimum':
1210
+ case 'maximum':
1211
+ case 'exclusiveMaximum':
1212
+ case 'multipleOf':
1213
+ case 'minLength':
1214
+ case 'maxLength':
1215
+ case 'minItems':
1216
+ case 'maxItems':
1217
+ case 'uniqueItems':
1218
+ case 'pattern':
1219
+ case 'format': {
1220
+ const constraint = new SchemaDeclarationWriter({ namedType: () => undefined, resolve: () => undefined });
1221
+ const text = isSchemaRecord(parent) ? compactType(constraint.type(parent)) : 'a value';
1222
+ const subset = isSchemaRecord(parent) ? { type: parent.type, [unit.keyword]: schemaHere } : {};
1223
+ const doc = Object.keys(subset).length ? constraintText(subset) : unit.error;
1224
+ issues.push({ path, expected: doc ? `${text} (${doc})` : text, got });
1225
+ continue;
1226
+ }
1227
+ default:
1228
+ issues.push({ path, expected: unit.error, got });
1229
+ }
1230
+ }
1231
+ const seen = new Set();
1232
+ return issues.filter((issue) => {
1233
+ const key = `${issue.path}\u0000${issue.expected}`;
1234
+ if (seen.has(key))
1235
+ return false;
1236
+ seen.add(key);
1237
+ return true;
1238
+ });
1239
+ }
1240
+ /** Issues reported by a zod, Standard Schema or AI SDK validator. */
1241
+ foreignIssues(error, value) {
1242
+ const source = error;
1243
+ const list = Array.isArray(source.issues)
1244
+ ? source.issues
1245
+ : isSchemaRecord(source.cause) && Array.isArray(source.cause.issues)
1246
+ ? source.cause.issues
1247
+ : Array.isArray(source.cause) ? source.cause : undefined;
1248
+ if (!list || list.length === 0)
1249
+ return [{ path: 'params', expected: error.message || 'valid params', got: preview(value) }];
1250
+ return list.map((issue) => {
1251
+ const record = isSchemaRecord(issue) ? issue : {};
1252
+ const tokens = (Array.isArray(record.path) ? record.path : []).map((segment) => {
1253
+ const key = isSchemaRecord(segment) ? segment.key : segment;
1254
+ return typeof key === 'number' ? key : String(key);
1255
+ });
1256
+ const expected = typeof record.expected === 'string'
1257
+ ? record.expected
1258
+ : typeof record.message === 'string' ? record.message : 'a valid value';
1259
+ return { path: paramsPath(tokens), expected, got: preview(valueAt(value, tokens)) };
1260
+ });
1261
+ }
1262
+ }
1263
+ const constraintText = (subset) => {
1264
+ const parts = [];
1265
+ const value = (key) => subset[key];
1266
+ if (typeof value('minimum') === 'number')
1267
+ parts.push(`>= ${value('minimum')}`);
1268
+ if (typeof value('exclusiveMinimum') === 'number')
1269
+ parts.push(`> ${value('exclusiveMinimum')}`);
1270
+ if (typeof value('maximum') === 'number')
1271
+ parts.push(`<= ${value('maximum')}`);
1272
+ if (typeof value('exclusiveMaximum') === 'number')
1273
+ parts.push(`< ${value('exclusiveMaximum')}`);
1274
+ if (typeof value('multipleOf') === 'number')
1275
+ parts.push(`multiple of ${value('multipleOf')}`);
1276
+ if (typeof value('minLength') === 'number')
1277
+ parts.push(`at least ${countOf(value('minLength'), 'character')}`);
1278
+ if (typeof value('maxLength') === 'number')
1279
+ parts.push(`at most ${countOf(value('maxLength'), 'character')}`);
1280
+ if (typeof value('minItems') === 'number')
1281
+ parts.push(`at least ${countOf(value('minItems'), 'item')}`);
1282
+ if (typeof value('maxItems') === 'number')
1283
+ parts.push(`at most ${countOf(value('maxItems'), 'item')}`);
1284
+ if (value('uniqueItems') === true)
1285
+ parts.push('unique items');
1286
+ if (typeof value('pattern') === 'string')
1287
+ parts.push(`matching /${value('pattern')}/`);
1288
+ if (typeof value('format') === 'string')
1289
+ parts.push(`format ${value('format')}`);
1290
+ return parts.join(', ');
1291
+ };
1292
+ /**
1293
+ * While a run has a catalog, its three tool names are reserved, and a method path must differ from
1294
+ * every tool name.
1295
+ */
1296
+ export const assertNoCatalogCollisions = (catalog, tools) => {
1297
+ const catalogToolNames = new Set(Object.values(toolNames));
1298
+ for (const name of catalogToolNames) {
1299
+ if (Object.prototype.hasOwnProperty.call(tools, name)) {
1300
+ throw new FlexHarnessValidationError(`Tool provider cannot define enabled built-in tool "${name}".`);
1301
+ }
1302
+ }
1303
+ for (const path of catalog.methods) {
1304
+ if (Object.prototype.hasOwnProperty.call(tools, path) || catalogToolNames.has(path) || path === 'invalid') {
1305
+ throw new FlexHarnessValidationError(`Tool catalog method "${path}" has the name of a tool.`);
1306
+ }
1307
+ }
1308
+ };
1309
+ /**
1310
+ * The AI SDK schema of a built-in catalog tool: the definition's JSON Schema, validated with it, so a
1311
+ * malformed call goes back to the model like any other invalid tool input.
1312
+ */
1313
+ export const catalogToolInputSchema = (definition) => {
1314
+ const validator = new plugins.JsonSchemaValidator(structuredClone(definition.inputSchema), '2020-12', false);
1315
+ return plugins.jsonSchema(definition.inputSchema, {
1316
+ validate: (value) => {
1317
+ const result = validator.validate(value);
1318
+ if (result.valid)
1319
+ return { success: true, value: value };
1320
+ const message = result.errors
1321
+ .filter((unit) => !['properties', 'items', 'additionalProperties'].includes(unit.keyword))
1322
+ .map((unit) => `${unit.instanceLocation.replace(/^#/, '') || '/'}: ${unit.error}`)
1323
+ .join(' ');
1324
+ return { success: false, error: new Error(message || 'Invalid input.') };
1325
+ },
1326
+ });
1327
+ };
1328
+ /** A root-level method declaration gets `declare`, as a namespace member does not need it. */
1329
+ const withDeclare = (text) => {
1330
+ const lines = text.split('\n');
1331
+ const index = lines.findIndex((line) => /^(?:async\s+)?function\s/.test(line));
1332
+ if (index !== -1)
1333
+ lines[index] = `declare ${lines[index]}`;
1334
+ return lines.join('\n');
1335
+ };
1336
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy50b29sY2F0YWxvZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMudG9vbGNhdGFsb2cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLDBCQUEwQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pELE9BQU8sRUFDTCx3QkFBd0IsSUFBSSxNQUFNLEVBQ2xDLDRCQUE0QixJQUFJLFNBQVMsR0FZMUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN6QixPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLE9BQU8sRUFDUCxRQUFRLEVBQ1IsV0FBVyxFQUNYLFlBQVksRUFDWixjQUFjLEdBR2YsTUFBTSwrQkFBK0IsQ0FBQztBQUN2QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQTJEM0QsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBQ3RELE1BQU0saUJBQWlCLEdBQUcsdURBQXVELENBQUM7QUFDbEYsTUFBTSxlQUFlLEdBQUcsMEJBQTBCLENBQUM7QUFDbkQsNEVBQTRFO0FBQzVFLE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxDQUFDO0lBQzVCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxJQUFJO0lBQ3RHLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxRQUFRO0lBQ3hHLElBQUksRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxT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