@nexface/tools 0.1.13-alpha.4 → 0.1.13-alpha.5

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.
@@ -3,8 +3,17 @@ const types = new Set(["object", "array", "string", "number", "integer", "boolea
3
3
  const counts = ["minLength", "maxLength", "minItems", "maxItems"];
4
4
  const bounds = ["minimum", "maximum", "exclusiveMinimum", "exclusiveMaximum"];
5
5
  const keywords = new Set([
6
- "type", "description", "properties", "required", "items", "enum", "additionalProperties",
7
- ...counts, ...bounds, "pattern", "uniqueItems",
6
+ "type",
7
+ "description",
8
+ "properties",
9
+ "required",
10
+ "items",
11
+ "enum",
12
+ "additionalProperties",
13
+ ...counts,
14
+ ...bounds,
15
+ "pattern",
16
+ "uniqueItems",
8
17
  ]);
9
18
  const checkedSchemas = new WeakSet();
10
19
  const patterns = new WeakMap();
@@ -24,7 +33,9 @@ function assertJson(value, path, ancestors = new Set()) {
24
33
  invalid(path, "must be JSON-compatible.");
25
34
  if (ancestors.has(value))
26
35
  invalid(path, "must not contain circular references.");
27
- if (!Array.isArray(value) && Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null) {
36
+ if (!Array.isArray(value) &&
37
+ Object.getPrototypeOf(value) !== Object.prototype &&
38
+ Object.getPrototypeOf(value) !== null) {
28
39
  invalid(path, "must be a plain JSON object.");
29
40
  }
30
41
  if (Object.getOwnPropertySymbols(value).length)
@@ -85,7 +96,8 @@ function assertSchema(value, path) {
85
96
  invalid(`${path}.${key}`, "must be a non-negative integer.");
86
97
  }
87
98
  for (const key of bounds) {
88
- if (value[key] !== undefined && (typeof value[key] !== "number" || !Number.isFinite(value[key])))
99
+ if (value[key] !== undefined &&
100
+ (typeof value[key] !== "number" || !Number.isFinite(value[key])))
89
101
  invalid(`${path}.${key}`, "must be a finite number.");
90
102
  }
91
103
  if (value.pattern !== undefined) {
@@ -95,7 +107,8 @@ function assertSchema(value, path) {
95
107
  }
96
108
  if (value.enum !== undefined && (!Array.isArray(value.enum) || value.enum.length === 0))
97
109
  invalid(`${path}.enum`, "must be a non-empty array.");
98
- if (Array.isArray(value.enum) && value.enum.some((item, index, entries) => entries.slice(0, index).some((other) => jsonEqual(item, other))))
110
+ if (Array.isArray(value.enum) &&
111
+ value.enum.some((item, index, entries) => entries.slice(0, index).some((other) => jsonEqual(item, other))))
99
112
  invalid(`${path}.enum`, "must contain unique values.");
100
113
  if (value.properties !== undefined) {
101
114
  if (value.type !== "object" || !isRecord(value.properties))
@@ -104,7 +117,10 @@ function assertSchema(value, path) {
104
117
  assertSchema(property, `${path}.properties.${name}`);
105
118
  }
106
119
  if (value.required !== undefined) {
107
- if (value.type !== "object" || !Array.isArray(value.required) || value.required.some((name) => typeof name !== "string") || new Set(value.required).size !== value.required.length)
120
+ if (value.type !== "object" ||
121
+ !Array.isArray(value.required) ||
122
+ value.required.some((name) => typeof name !== "string") ||
123
+ new Set(value.required).size !== value.required.length)
108
124
  invalid(`${path}.required`, "must contain unique property names.");
109
125
  const properties = value.properties;
110
126
  if (value.required.some((name) => !properties || !Object.hasOwn(properties, name)))
@@ -118,7 +134,7 @@ function assertSchema(value, path) {
118
134
  }
119
135
  export function assertAgentToolInputSchema(value, path = "inputSchema") {
120
136
  if (!isRecord(value) || value.type !== "object")
121
- invalid(path, 'root type must be object.');
137
+ invalid(path, "root type must be object.");
122
138
  if (checkedSchemas.has(value))
123
139
  return;
124
140
  const frozen = assertJson(value, path);
@@ -130,21 +146,29 @@ function jsonEqual(left, right) {
130
146
  if (left === right)
131
147
  return true;
132
148
  if (Array.isArray(left) && Array.isArray(right))
133
- return left.length === right.length && left.every((item, index) => jsonEqual(item, right[index]));
149
+ return (left.length === right.length && left.every((item, index) => jsonEqual(item, right[index])));
134
150
  if (!isRecord(left) || !isRecord(right))
135
151
  return false;
136
152
  const keys = Object.keys(left);
137
- return keys.length === Object.keys(right).length && keys.every((key) => Object.hasOwn(right, key) && jsonEqual(left[key], right[key]));
153
+ return (keys.length === Object.keys(right).length &&
154
+ keys.every((key) => Object.hasOwn(right, key) && jsonEqual(left[key], right[key])));
138
155
  }
139
156
  function typeMatches(schema, value) {
140
157
  switch (schema.type) {
141
- case undefined: return true;
142
- case "null": return value === null;
143
- case "array": return Array.isArray(value);
144
- case "object": return isRecord(value);
145
- case "integer": return typeof value === "number" && Number.isInteger(value);
146
- case "number": return typeof value === "number" && Number.isFinite(value);
147
- default: return typeof value === schema.type;
158
+ case undefined:
159
+ return true;
160
+ case "null":
161
+ return value === null;
162
+ case "array":
163
+ return Array.isArray(value);
164
+ case "object":
165
+ return isRecord(value);
166
+ case "integer":
167
+ return typeof value === "number" && Number.isInteger(value);
168
+ case "number":
169
+ return typeof value === "number" && Number.isFinite(value);
170
+ default:
171
+ return typeof value === schema.type;
148
172
  }
149
173
  }
150
174
  export function validateAgentToolInput(schema, value, path = "input") {
@@ -177,7 +201,8 @@ export function validateAgentToolInput(schema, value, path = "input") {
177
201
  errors.push(`${path} must have at least ${schema.minItems} items.`);
178
202
  if (schema.maxItems !== undefined && value.length > schema.maxItems)
179
203
  errors.push(`${path} must have at most ${schema.maxItems} items.`);
180
- if (schema.uniqueItems && value.some((item, index) => value.slice(0, index).some((other) => jsonEqual(item, other))))
204
+ if (schema.uniqueItems &&
205
+ value.some((item, index) => value.slice(0, index).some((other) => jsonEqual(item, other))))
181
206
  errors.push(`${path} must contain unique items.`);
182
207
  if (schema.items)
183
208
  value.forEach((item, index) => errors.push(...validateAgentToolInput(schema.items, item, `${path}[${index}]`)));
@@ -188,7 +213,9 @@ export function validateAgentToolInput(schema, value, path = "input") {
188
213
  errors.push(`${path}.${key} is required.`);
189
214
  }
190
215
  for (const [key, item] of Object.entries(value)) {
191
- const property = schema.properties && Object.hasOwn(schema.properties, key) ? schema.properties[key] : undefined;
216
+ const property = schema.properties && Object.hasOwn(schema.properties, key)
217
+ ? schema.properties[key]
218
+ : undefined;
192
219
  if (property)
193
220
  errors.push(...validateAgentToolInput(property, item, `${path}.${key}`));
194
221
  else if (schema.additionalProperties === false)