@actuarial-ts/agents 0.3.0 → 0.5.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.
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
package/dist/tools.js CHANGED
@@ -170,15 +170,41 @@ const OPAQUE_TYPE_NAMES = new Set(["ZodAny", "ZodUnknown", "ZodMap"]);
170
170
  * each smuggled a nested tenant id straight past it. On a security seam,
171
171
  * "I don't know what this is" has to mean "refused", not "fine".
172
172
  */
173
- function assertNoTenantKeys(schema, toolId, path, allowUninspected, usedAllowances) {
174
- // Path depth doubles as a cycle guard: a self-referential z.lazy() would
175
- // otherwise recurse forever. 64 levels is far beyond any real tool input.
176
- if (path.split(".").length > 64) {
177
- throw new AgentsError("BAD_INPUT_SCHEMA", `Tool "${toolId}": the input schema nests deeper than 64 levels at "${path.slice(0, 120)}..." ` +
178
- "(likely a self-referential z.lazy()); the tenant lint cannot verify unbounded schemas");
173
+ /**
174
+ * Frame budget for the tenant lint. Cycles are caught exactly by the on-stack
175
+ * set below; this cap only terminates GENERATIVE schemas (a z.lazy() whose
176
+ * getter builds a fresh node every resolution, so no node ever repeats) and
177
+ * absurd finite nesting. 256 frames is far beyond any real tool input
178
+ * wrappers (.optional(), .default(), z.lazy resolution) each cost one frame.
179
+ */
180
+ const MAX_LINT_FRAMES = 256;
181
+ function assertNoTenantKeys(schema, toolId, path, allowUninspected, usedAllowances, stack = new Set(), depth = 0) {
182
+ // Cycle guard by node identity, NOT by counting dots in `path`: only the
183
+ // object branch appends ".", so a cycle routed purely through lazy/union/
184
+ // array/set/tuple/intersection/pipeline used to recurse with a frozen dot
185
+ // count straight into a RangeError. `stack` holds the nodes on the CURRENT
186
+ // recursion path (added on entry, removed on exit), so meeting one again is
187
+ // a true cycle; shared non-cyclic subschemas are deliberately re-visited so
188
+ // per-path allowUninspected accounting keeps working.
189
+ if (depth > MAX_LINT_FRAMES) {
190
+ throw new AgentsError("BAD_INPUT_SCHEMA", `Tool "${toolId}": the input schema nests deeper than the tenant lint's ${MAX_LINT_FRAMES}-frame budget at "${path.slice(0, 120)}..." ` +
191
+ "(likely a z.lazy() that constructs a fresh schema on every resolution); the tenant lint cannot verify unbounded schemas");
179
192
  }
180
193
  if (typeof schema !== "object" || schema === null)
181
194
  return;
195
+ if (stack.has(schema)) {
196
+ throw new AgentsError("BAD_INPUT_SCHEMA", `Tool "${toolId}": the input schema is self-referential at "${path.slice(0, 120)}" ` +
197
+ "(a cyclic z.lazy()); the tenant lint cannot verify unbounded schemas");
198
+ }
199
+ stack.add(schema);
200
+ try {
201
+ lintSchemaNode(schema, toolId, path, allowUninspected, usedAllowances, stack, depth);
202
+ }
203
+ finally {
204
+ stack.delete(schema);
205
+ }
206
+ }
207
+ function lintSchemaNode(schema, toolId, path, allowUninspected, usedAllowances, stack, depth) {
182
208
  const def = schema._def;
183
209
  if (!def)
184
210
  return;
@@ -196,7 +222,7 @@ function assertNoTenantKeys(schema, toolId, path, allowUninspected, usedAllowanc
196
222
  if (TENANT_KEY_PATTERN.test(key)) {
197
223
  throw new AgentsError("TENANT_IN_SCHEMA", `Tool "${toolId}" declares input key "${path}.${key}": tenant ids travel only via the server-set RequestContext (read them with tenantOf), never through the model-facing input schema`);
198
224
  }
199
- assertNoTenantKeys(value, toolId, `${path}.${key}`, allowUninspected, usedAllowances);
225
+ assertNoTenantKeys(value, toolId, `${path}.${key}`, allowUninspected, usedAllowances, stack, depth + 1);
200
226
  }
201
227
  return;
202
228
  }
@@ -222,7 +248,7 @@ function assertNoTenantKeys(schema, toolId, path, allowUninspected, usedAllowanc
222
248
  "exception is deliberate and greppable");
223
249
  }
224
250
  if (typeName === "ZodArray") {
225
- assertNoTenantKeys(def.type, toolId, `${path}[]`, allowUninspected, usedAllowances);
251
+ assertNoTenantKeys(def.type, toolId, `${path}[]`, allowUninspected, usedAllowances, stack, depth + 1);
226
252
  return;
227
253
  }
228
254
  if (typeName === "ZodOptional" ||
@@ -230,49 +256,50 @@ function assertNoTenantKeys(schema, toolId, path, allowUninspected, usedAllowanc
230
256
  typeName === "ZodDefault" ||
231
257
  typeName === "ZodCatch" ||
232
258
  typeName === "ZodReadonly") {
233
- assertNoTenantKeys(def.innerType, toolId, path, allowUninspected, usedAllowances);
259
+ assertNoTenantKeys(def.innerType, toolId, path, allowUninspected, usedAllowances, stack, depth + 1);
234
260
  return;
235
261
  }
236
262
  if (typeName === "ZodPromise" || typeName === "ZodBranded") {
237
- assertNoTenantKeys(def.type, toolId, path, allowUninspected, usedAllowances);
263
+ assertNoTenantKeys(def.type, toolId, path, allowUninspected, usedAllowances, stack, depth + 1);
238
264
  return;
239
265
  }
240
266
  if (typeName === "ZodEffects") {
241
- assertNoTenantKeys(def.schema, toolId, path, allowUninspected, usedAllowances);
267
+ assertNoTenantKeys(def.schema, toolId, path, allowUninspected, usedAllowances, stack, depth + 1);
242
268
  return;
243
269
  }
244
270
  if (typeName === "ZodUnion" || typeName === "ZodDiscriminatedUnion") {
245
271
  for (const opt of def.options ?? [])
246
- assertNoTenantKeys(opt, toolId, path, allowUninspected, usedAllowances);
272
+ assertNoTenantKeys(opt, toolId, path, allowUninspected, usedAllowances, stack, depth + 1);
247
273
  return;
248
274
  }
249
275
  if (typeName === "ZodTuple") {
250
276
  for (const [index, item] of (def.items ?? []).entries()) {
251
- assertNoTenantKeys(item, toolId, `${path}[${index}]`, allowUninspected, usedAllowances);
277
+ assertNoTenantKeys(item, toolId, `${path}[${index}]`, allowUninspected, usedAllowances, stack, depth + 1);
252
278
  }
253
279
  if (def.rest !== undefined && def.rest !== null) {
254
- assertNoTenantKeys(def.rest, toolId, `${path}[rest]`, allowUninspected, usedAllowances);
280
+ assertNoTenantKeys(def.rest, toolId, `${path}[rest]`, allowUninspected, usedAllowances, stack, depth + 1);
255
281
  }
256
282
  return;
257
283
  }
258
284
  if (typeName === "ZodIntersection") {
259
- assertNoTenantKeys(def.left, toolId, path, allowUninspected, usedAllowances);
260
- assertNoTenantKeys(def.right, toolId, path, allowUninspected, usedAllowances);
285
+ assertNoTenantKeys(def.left, toolId, path, allowUninspected, usedAllowances, stack, depth + 1);
286
+ assertNoTenantKeys(def.right, toolId, path, allowUninspected, usedAllowances, stack, depth + 1);
261
287
  return;
262
288
  }
263
289
  if (typeName === "ZodPipeline") {
264
- assertNoTenantKeys(def.in, toolId, path, allowUninspected, usedAllowances);
265
- assertNoTenantKeys(def.out, toolId, path, allowUninspected, usedAllowances);
290
+ assertNoTenantKeys(def.in, toolId, path, allowUninspected, usedAllowances, stack, depth + 1);
291
+ assertNoTenantKeys(def.out, toolId, path, allowUninspected, usedAllowances, stack, depth + 1);
266
292
  return;
267
293
  }
268
294
  if (typeName === "ZodSet") {
269
- assertNoTenantKeys(def.valueType, toolId, `${path}[]`, allowUninspected, usedAllowances);
295
+ assertNoTenantKeys(def.valueType, toolId, `${path}[]`, allowUninspected, usedAllowances, stack, depth + 1);
270
296
  return;
271
297
  }
272
298
  if (typeName === "ZodLazy") {
273
- // Resolve once. A directly self-referential lazy would recurse forever;
274
- // the depth guard below catches that as a schema error rather than a hang.
275
- assertNoTenantKeys(def.getter?.(), toolId, path, allowUninspected, usedAllowances);
299
+ // Resolve once. A self-referential lazy resolves to a node already on the
300
+ // recursion stack and is caught by the cycle guard in assertNoTenantKeys;
301
+ // a generative lazy (fresh node per resolution) hits the frame budget.
302
+ assertNoTenantKeys(def.getter?.(), toolId, path, allowUninspected, usedAllowances, stack, depth + 1);
276
303
  return;
277
304
  }
278
305
  // Fail closed: a typeName this lint has never heard of gets refused, not
package/dist/tools.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../src/tools.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@actuarial-ts/agents",
3
- "version": "0.3.0",
3
+ "version": "0.5.0",
4
4
  "description": "Mastra agent toolkit for the actuarial-ts SDK: typed actuarial tools with a hard tenant seam, human-gated judgment workflows that write the compliance assumption ledger, a reserving advisor factory, and a golden-prompt eval harness.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -46,10 +46,10 @@
46
46
  "prepack": "tsc -p tsconfig.build.json"
47
47
  },
48
48
  "dependencies": {
49
- "@actuarial-ts/compliance": "^0.3.0",
50
- "@actuarial-ts/core": "^0.3.0",
51
- "@actuarial-ts/data": "^0.3.0",
52
- "@actuarial-ts/interchange": "^0.3.0"
49
+ "@actuarial-ts/compliance": "^0.5.0",
50
+ "@actuarial-ts/core": "^0.5.0",
51
+ "@actuarial-ts/data": "^0.5.0",
52
+ "@actuarial-ts/interchange": "^0.5.0"
53
53
  },
54
54
  "devDependencies": {
55
55
  "@mastra/core": "^1.49.0",
@@ -61,8 +61,8 @@
61
61
  },
62
62
  "peerDependencies": {
63
63
  "@mastra/core": ">=1.49.0 <2",
64
- "zod": "^3.25.0",
65
- "@mastra/mcp": ">=1.14.0 <2"
64
+ "@mastra/mcp": ">=1.14.0 <2",
65
+ "zod": "^3.25.0"
66
66
  },
67
67
  "publishConfig": {
68
68
  "access": "public"
package/src/tools.ts CHANGED
@@ -239,23 +239,63 @@ const OPAQUE_TYPE_NAMES = new Set(["ZodAny", "ZodUnknown", "ZodMap"]);
239
239
  * each smuggled a nested tenant id straight past it. On a security seam,
240
240
  * "I don't know what this is" has to mean "refused", not "fine".
241
241
  */
242
+ /**
243
+ * Frame budget for the tenant lint. Cycles are caught exactly by the on-stack
244
+ * set below; this cap only terminates GENERATIVE schemas (a z.lazy() whose
245
+ * getter builds a fresh node every resolution, so no node ever repeats) and
246
+ * absurd finite nesting. 256 frames is far beyond any real tool input —
247
+ * wrappers (.optional(), .default(), z.lazy resolution) each cost one frame.
248
+ */
249
+ const MAX_LINT_FRAMES = 256;
250
+
242
251
  function assertNoTenantKeys(
243
252
  schema: unknown,
244
253
  toolId: string,
245
254
  path: string,
246
255
  allowUninspected?: ReadonlySet<string>,
247
256
  usedAllowances?: Set<string>,
257
+ stack: Set<unknown> = new Set(),
258
+ depth = 0,
248
259
  ): void {
249
- // Path depth doubles as a cycle guard: a self-referential z.lazy() would
250
- // otherwise recurse forever. 64 levels is far beyond any real tool input.
251
- if (path.split(".").length > 64) {
260
+ // Cycle guard by node identity, NOT by counting dots in `path`: only the
261
+ // object branch appends ".", so a cycle routed purely through lazy/union/
262
+ // array/set/tuple/intersection/pipeline used to recurse with a frozen dot
263
+ // count straight into a RangeError. `stack` holds the nodes on the CURRENT
264
+ // recursion path (added on entry, removed on exit), so meeting one again is
265
+ // a true cycle; shared non-cyclic subschemas are deliberately re-visited so
266
+ // per-path allowUninspected accounting keeps working.
267
+ if (depth > MAX_LINT_FRAMES) {
252
268
  throw new AgentsError(
253
269
  "BAD_INPUT_SCHEMA",
254
- `Tool "${toolId}": the input schema nests deeper than 64 levels at "${path.slice(0, 120)}..." ` +
255
- "(likely a self-referential z.lazy()); the tenant lint cannot verify unbounded schemas",
270
+ `Tool "${toolId}": the input schema nests deeper than the tenant lint's ${MAX_LINT_FRAMES}-frame budget at "${path.slice(0, 120)}..." ` +
271
+ "(likely a z.lazy() that constructs a fresh schema on every resolution); the tenant lint cannot verify unbounded schemas",
256
272
  );
257
273
  }
258
274
  if (typeof schema !== "object" || schema === null) return;
275
+ if (stack.has(schema)) {
276
+ throw new AgentsError(
277
+ "BAD_INPUT_SCHEMA",
278
+ `Tool "${toolId}": the input schema is self-referential at "${path.slice(0, 120)}" ` +
279
+ "(a cyclic z.lazy()); the tenant lint cannot verify unbounded schemas",
280
+ );
281
+ }
282
+ stack.add(schema);
283
+ try {
284
+ lintSchemaNode(schema, toolId, path, allowUninspected, usedAllowances, stack, depth);
285
+ } finally {
286
+ stack.delete(schema);
287
+ }
288
+ }
289
+
290
+ function lintSchemaNode(
291
+ schema: object,
292
+ toolId: string,
293
+ path: string,
294
+ allowUninspected: ReadonlySet<string> | undefined,
295
+ usedAllowances: Set<string> | undefined,
296
+ stack: Set<unknown>,
297
+ depth: number,
298
+ ): void {
259
299
  const def = (schema as { _def?: ZodDefLike })._def;
260
300
  if (!def) return;
261
301
  const typeName = def.typeName;
@@ -282,7 +322,7 @@ function assertNoTenantKeys(
282
322
  `Tool "${toolId}" declares input key "${path}.${key}": tenant ids travel only via the server-set RequestContext (read them with tenantOf), never through the model-facing input schema`,
283
323
  );
284
324
  }
285
- assertNoTenantKeys(value, toolId, `${path}.${key}`, allowUninspected, usedAllowances);
325
+ assertNoTenantKeys(value, toolId, `${path}.${key}`, allowUninspected, usedAllowances, stack, depth + 1);
286
326
  }
287
327
  return;
288
328
  }
@@ -314,7 +354,7 @@ function assertNoTenantKeys(
314
354
  );
315
355
  }
316
356
  if (typeName === "ZodArray") {
317
- assertNoTenantKeys(def.type, toolId, `${path}[]`, allowUninspected, usedAllowances);
357
+ assertNoTenantKeys(def.type, toolId, `${path}[]`, allowUninspected, usedAllowances, stack, depth + 1);
318
358
  return;
319
359
  }
320
360
  if (
@@ -324,48 +364,49 @@ function assertNoTenantKeys(
324
364
  typeName === "ZodCatch" ||
325
365
  typeName === "ZodReadonly"
326
366
  ) {
327
- assertNoTenantKeys(def.innerType, toolId, path, allowUninspected, usedAllowances);
367
+ assertNoTenantKeys(def.innerType, toolId, path, allowUninspected, usedAllowances, stack, depth + 1);
328
368
  return;
329
369
  }
330
370
  if (typeName === "ZodPromise" || typeName === "ZodBranded") {
331
- assertNoTenantKeys(def.type, toolId, path, allowUninspected, usedAllowances);
371
+ assertNoTenantKeys(def.type, toolId, path, allowUninspected, usedAllowances, stack, depth + 1);
332
372
  return;
333
373
  }
334
374
  if (typeName === "ZodEffects") {
335
- assertNoTenantKeys(def.schema, toolId, path, allowUninspected, usedAllowances);
375
+ assertNoTenantKeys(def.schema, toolId, path, allowUninspected, usedAllowances, stack, depth + 1);
336
376
  return;
337
377
  }
338
378
  if (typeName === "ZodUnion" || typeName === "ZodDiscriminatedUnion") {
339
- for (const opt of def.options ?? []) assertNoTenantKeys(opt, toolId, path, allowUninspected, usedAllowances);
379
+ for (const opt of def.options ?? []) assertNoTenantKeys(opt, toolId, path, allowUninspected, usedAllowances, stack, depth + 1);
340
380
  return;
341
381
  }
342
382
  if (typeName === "ZodTuple") {
343
383
  for (const [index, item] of (def.items ?? []).entries()) {
344
- assertNoTenantKeys(item, toolId, `${path}[${index}]`, allowUninspected, usedAllowances);
384
+ assertNoTenantKeys(item, toolId, `${path}[${index}]`, allowUninspected, usedAllowances, stack, depth + 1);
345
385
  }
346
386
  if (def.rest !== undefined && def.rest !== null) {
347
- assertNoTenantKeys(def.rest, toolId, `${path}[rest]`, allowUninspected, usedAllowances);
387
+ assertNoTenantKeys(def.rest, toolId, `${path}[rest]`, allowUninspected, usedAllowances, stack, depth + 1);
348
388
  }
349
389
  return;
350
390
  }
351
391
  if (typeName === "ZodIntersection") {
352
- assertNoTenantKeys(def.left, toolId, path, allowUninspected, usedAllowances);
353
- assertNoTenantKeys(def.right, toolId, path, allowUninspected, usedAllowances);
392
+ assertNoTenantKeys(def.left, toolId, path, allowUninspected, usedAllowances, stack, depth + 1);
393
+ assertNoTenantKeys(def.right, toolId, path, allowUninspected, usedAllowances, stack, depth + 1);
354
394
  return;
355
395
  }
356
396
  if (typeName === "ZodPipeline") {
357
- assertNoTenantKeys(def.in, toolId, path, allowUninspected, usedAllowances);
358
- assertNoTenantKeys(def.out, toolId, path, allowUninspected, usedAllowances);
397
+ assertNoTenantKeys(def.in, toolId, path, allowUninspected, usedAllowances, stack, depth + 1);
398
+ assertNoTenantKeys(def.out, toolId, path, allowUninspected, usedAllowances, stack, depth + 1);
359
399
  return;
360
400
  }
361
401
  if (typeName === "ZodSet") {
362
- assertNoTenantKeys(def.valueType, toolId, `${path}[]`, allowUninspected, usedAllowances);
402
+ assertNoTenantKeys(def.valueType, toolId, `${path}[]`, allowUninspected, usedAllowances, stack, depth + 1);
363
403
  return;
364
404
  }
365
405
  if (typeName === "ZodLazy") {
366
- // Resolve once. A directly self-referential lazy would recurse forever;
367
- // the depth guard below catches that as a schema error rather than a hang.
368
- assertNoTenantKeys(def.getter?.(), toolId, path, allowUninspected, usedAllowances);
406
+ // Resolve once. A self-referential lazy resolves to a node already on the
407
+ // recursion stack and is caught by the cycle guard in assertNoTenantKeys;
408
+ // a generative lazy (fresh node per resolution) hits the frame budget.
409
+ assertNoTenantKeys(def.getter?.(), toolId, path, allowUninspected, usedAllowances, stack, depth + 1);
369
410
  return;
370
411
  }
371
412