llmz 0.9.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. package/DOCS.md +232 -1794
  2. package/ERRORS.md +101 -0
  3. package/README.md +96 -582
  4. package/dist/chat/chat.d.ts +63 -0
  5. package/dist/chat/component.d.ts +31 -0
  6. package/dist/chat/component.default.d.ts +58 -0
  7. package/dist/chat/response.d.ts +15 -0
  8. package/dist/compiler/compiler.d.ts +2 -7
  9. package/dist/compiler/plugins/dynamic-code.d.ts +7 -0
  10. package/dist/compiler/plugins/replace-comment.d.ts +2 -3
  11. package/dist/compiler/plugins/return-async.d.ts +5 -4
  12. package/dist/compiler/plugins/termination.d.ts +8 -0
  13. package/dist/compiler/plugins/tool-resolution.d.ts +4 -0
  14. package/dist/compiler/plugins/variable-extraction.d.ts +2 -8
  15. package/dist/component-CMFoCHyu.cjs +649 -0
  16. package/dist/component-DncqP4fB.js +614 -0
  17. package/dist/context.d.ts +71 -378
  18. package/dist/custom-client-C-WXvLD9.js +1655 -0
  19. package/dist/custom-client-Cgt9_0r1.cjs +1732 -0
  20. package/dist/custom-client.d.ts +12 -2
  21. package/dist/errors/catalog.d.ts +294 -0
  22. package/dist/errors/hooks.d.ts +2 -0
  23. package/dist/errors-C6ppQUZX.cjs +893 -0
  24. package/dist/errors-Crk5P8jo.js +636 -0
  25. package/dist/errors.d.ts +24 -36
  26. package/dist/execute-CiYvPs5Q.js +2061 -0
  27. package/dist/execute-DTTfacsi.cjs +2062 -0
  28. package/dist/{exit-DUM96DN1.cjs → exit-BOtKWPuT.cjs} +38 -28
  29. package/dist/{exit-CDdxDBRT.js → exit-DMPwCSba.js} +37 -27
  30. package/dist/exit.d.ts +19 -16
  31. package/dist/index.cjs +177 -1237
  32. package/dist/index.d.ts +25 -28
  33. package/dist/index.js +137 -1213
  34. package/dist/index.workerd.js +8974 -11145
  35. package/dist/inspect.d.ts +18 -4
  36. package/dist/inspection.d.ts +40 -0
  37. package/dist/native-0bq5ATZM.cjs +212 -0
  38. package/dist/native-n_718Z-T.js +177 -0
  39. package/dist/objects.d.ts +2 -57
  40. package/dist/prompts/native.d.ts +2 -0
  41. package/dist/prompts/prompt.d.ts +10 -101
  42. package/dist/quickjs-variant-21IO97PF.cjs +1080 -0
  43. package/dist/quickjs-variant-CtuGagsb.js +985 -0
  44. package/dist/result.d.ts +30 -861
  45. package/dist/runtime/execute.d.ts +3 -2
  46. package/dist/runtime/execution-activity.d.ts +11 -0
  47. package/dist/runtime/execution-diagnostics.d.ts +11 -0
  48. package/dist/runtime/execution-report.d.ts +51 -0
  49. package/dist/runtime/fixtures/chat.d.ts +8 -0
  50. package/dist/runtime/fixtures/long-search.d.ts +1 -1
  51. package/dist/runtime/fixtures/native-client.d.ts +33 -0
  52. package/dist/runtime/fixtures/protocol-languages.d.ts +1 -1
  53. package/dist/runtime/forced-inspection.d.ts +13 -0
  54. package/dist/runtime/forced-inspection.test.d.ts +1 -0
  55. package/dist/runtime/generate.d.ts +23 -20
  56. package/dist/runtime/generate.test.d.ts +1 -0
  57. package/dist/runtime/hook-provenance.test.d.ts +1 -0
  58. package/dist/runtime/inspection-hook.test.d.ts +1 -0
  59. package/dist/runtime/inspection-values.d.ts +14 -0
  60. package/dist/runtime/inspection-values.test.d.ts +1 -0
  61. package/dist/runtime/interruption-control-flow.test.d.ts +1 -0
  62. package/dist/runtime/interruption-settings.test.d.ts +1 -0
  63. package/dist/runtime/javascript-api.d.ts +62 -0
  64. package/dist/runtime/javascript-api.test.d.ts +1 -0
  65. package/dist/runtime/native-review.test.d.ts +1 -0
  66. package/dist/runtime/native-tools.d.ts +18 -0
  67. package/dist/runtime/native-tools.test.d.ts +1 -0
  68. package/dist/runtime/object-memory.test.d.ts +1 -0
  69. package/dist/runtime/single-tool.test.d.ts +1 -0
  70. package/dist/runtime/think-signal.test.d.ts +1 -0
  71. package/dist/runtime/token-budget.d.ts +22 -0
  72. package/dist/runtime/token-budget.test.d.ts +1 -0
  73. package/dist/runtime/tool-wrapper.d.ts +6 -5
  74. package/dist/runtime/traces.test.d.ts +1 -0
  75. package/dist/runtime/truncation.test.d.ts +1 -0
  76. package/dist/runtime/types.d.ts +47 -31
  77. package/dist/runtime/variable-recovery.test.d.ts +1 -0
  78. package/dist/runtime/vm-context.d.ts +6 -1
  79. package/dist/runtime/worker-completion.test.d.ts +1 -0
  80. package/dist/runtime-names.d.ts +4 -0
  81. package/dist/schema-CXlnbb3n.cjs +68 -0
  82. package/dist/schema-GE4ISPCR.js +45 -0
  83. package/dist/schema.d.ts +10 -0
  84. package/dist/schema.test.d.ts +1 -0
  85. package/dist/session/compactor.d.ts +51 -0
  86. package/dist/session/compactor.test.d.ts +1 -0
  87. package/dist/session/history.d.ts +36 -0
  88. package/dist/session/history.test.d.ts +1 -0
  89. package/dist/session/json.d.ts +3 -0
  90. package/dist/session/json.test.d.ts +1 -0
  91. package/dist/session/memory-codec.d.ts +9 -0
  92. package/dist/session/memory-codec.test.d.ts +1 -0
  93. package/dist/session/memory-render.d.ts +15 -0
  94. package/dist/session/memory-render.test.d.ts +1 -0
  95. package/dist/session/memory.d.ts +112 -0
  96. package/dist/session/memory.test.d.ts +1 -0
  97. package/dist/session/messages.d.ts +19 -0
  98. package/dist/session/messages.test.d.ts +1 -0
  99. package/dist/session/serialization.d.ts +36 -0
  100. package/dist/session/serialization.test.d.ts +1 -0
  101. package/dist/session/session-memory.test.d.ts +1 -0
  102. package/dist/session/session.d.ts +121 -0
  103. package/dist/session/session.test.d.ts +1 -0
  104. package/dist/session/speaker.test.d.ts +1 -0
  105. package/dist/{transcript.d.ts → session/transcript.d.ts} +4 -8
  106. package/dist/session/transcript.test.d.ts +1 -0
  107. package/dist/{tool-Bv8N4IPj.js → tool-DstssiAs.js} +144 -92
  108. package/dist/{tool-Dy6AJpJH.cjs → tool-_wK9hQOb.cjs} +146 -94
  109. package/dist/tool.d.ts +25 -17
  110. package/dist/truncate-BEKbdo3t.js +79 -0
  111. package/dist/truncate-uomAMGPs.cjs +102 -0
  112. package/dist/truncate.d.ts +24 -0
  113. package/dist/truncate.test.d.ts +1 -0
  114. package/dist/types.d.ts +33 -9
  115. package/dist/{typings-3lsqCbkn.cjs → typings-BA_XxAcY.cjs} +38 -193
  116. package/dist/{typings-CrBa7Tyy.js → typings-BEVDvtuk.js} +38 -175
  117. package/dist/typings-formatter.d.ts +1 -1
  118. package/dist/typings.d.ts +3 -0
  119. package/dist/{uniq-BYQ7GWwb.js → uniq-DfUeSNaX.js} +2 -2
  120. package/dist/{uniq-G872RWmE.cjs → uniq-DiXgysNV.cjs} +6 -18
  121. package/dist/{_baseIteratee-P_firB7b.js → utils-BOFzb8Ok.js} +1134 -16
  122. package/dist/{_baseIteratee-CF4qP2a8.cjs → utils-CTlsXvdj.cjs} +1281 -84
  123. package/dist/vm/drivers/node.d.ts +1 -1
  124. package/dist/vm/drivers/quickjs.d.ts +1 -1
  125. package/dist/vm/errors.d.ts +4 -4
  126. package/dist/vm/index.d.ts +3 -4
  127. package/dist/vm/instrument.d.ts +14 -6
  128. package/dist/vm/member-proxy.d.ts +4 -0
  129. package/dist/vm/member-proxy.test.d.ts +1 -0
  130. package/dist/vm/memory.test.d.ts +1 -0
  131. package/dist/vm/return-semantics.test.d.ts +1 -0
  132. package/dist/vm/types.d.ts +20 -3
  133. package/dist/{vm-BLsHw1da.js → vm-C7SfutHn.js} +1187 -180
  134. package/dist/{vm-D6s1zF6M.cjs → vm-gmekHc0i.cjs} +1221 -207
  135. package/package.json +13 -6
  136. package/dist/_baseForOwn-BfWDTL8L.cjs +0 -53
  137. package/dist/_baseForOwn-CFhWe_W6.js +0 -48
  138. package/dist/_getPrototype-CG7Dxrrz.js +0 -6
  139. package/dist/_getPrototype-DQDlNVVM.cjs +0 -10
  140. package/dist/_overArg-C5Hy7oCi.cjs +0 -196
  141. package/dist/_overArg-CRYbj1NH.js +0 -155
  142. package/dist/chat.d.ts +0 -401
  143. package/dist/common-BlRFtdf2.js +0 -807
  144. package/dist/common-BnvrDnIT.cjs +0 -860
  145. package/dist/compiler/plugins/track-tool-calls.d.ts +0 -33
  146. package/dist/compiler-C-OI9sim.cjs +0 -547
  147. package/dist/compiler-CW1VjQsn.js +0 -473
  148. package/dist/component-C6Agl2ns.cjs +0 -73
  149. package/dist/component-DGG7d_Mz.js +0 -44
  150. package/dist/component.d.ts +0 -88
  151. package/dist/component.default.d.ts +0 -278
  152. package/dist/custom-client-ChuZ63zp.js +0 -2658
  153. package/dist/custom-client-DAsGRnYc.cjs +0 -2729
  154. package/dist/dual-modes-DDkoCp3R.js +0 -3006
  155. package/dist/dual-modes-DPXiuvNe.cjs +0 -3090
  156. package/dist/errors-C962uJdS.cjs +0 -220
  157. package/dist/errors-Cg1G0Awu.js +0 -161
  158. package/dist/example-format.d.ts +0 -8
  159. package/dist/example.d.ts +0 -45
  160. package/dist/execute-BWcdv9so.js +0 -1059
  161. package/dist/execute-DM2-7y86.cjs +0 -1060
  162. package/dist/exit-parser.d.ts +0 -39
  163. package/dist/handlers.d.ts +0 -10
  164. package/dist/hoist.d.ts +0 -2
  165. package/dist/isEmpty-BhJRCqIF.js +0 -52
  166. package/dist/isEmpty-LY533Wmh.cjs +0 -57
  167. package/dist/isPlainObject-CSxXVKCk.cjs +0 -56
  168. package/dist/isPlainObject-D39AzPO2.js +0 -51
  169. package/dist/jsx-CIgdGGVs.js +0 -52
  170. package/dist/jsx-owqxrquU.cjs +0 -75
  171. package/dist/jsx.d.ts +0 -11
  172. package/dist/message-stream/index.d.ts +0 -9
  173. package/dist/message-stream/instructions.d.ts +0 -30
  174. package/dist/message-stream/normalizer.d.ts +0 -21
  175. package/dist/message-stream/parser.d.ts +0 -89
  176. package/dist/message-stream/registry.d.ts +0 -14
  177. package/dist/message-stream/replayable.d.ts +0 -27
  178. package/dist/message-stream/response-parser.d.ts +0 -24
  179. package/dist/message-stream/sanitize.d.ts +0 -10
  180. package/dist/message-stream/stream.d.ts +0 -54
  181. package/dist/message-stream/types.d.ts +0 -97
  182. package/dist/message-stream/validator.d.ts +0 -23
  183. package/dist/prompts/chat-mode/protocol.d.ts +0 -2
  184. package/dist/prompts/chat-mode/system.d.ts +0 -2
  185. package/dist/prompts/chat-mode/system.md.d.ts +0 -2
  186. package/dist/prompts/chat-mode/user.d.ts +0 -2
  187. package/dist/prompts/chat-mode/user.md.d.ts +0 -2
  188. package/dist/prompts/code-examples.d.ts +0 -2
  189. package/dist/prompts/common.d.ts +0 -7
  190. package/dist/prompts/dual-modes.d.ts +0 -2
  191. package/dist/prompts/execution-history.d.ts +0 -6
  192. package/dist/prompts/execution-state.d.ts +0 -3
  193. package/dist/prompts/protocol-basics.d.ts +0 -5
  194. package/dist/prompts/protocol.d.ts +0 -31
  195. package/dist/prompts/worker-mode/protocol.d.ts +0 -2
  196. package/dist/prompts/worker-mode/system.d.ts +0 -2
  197. package/dist/prompts/worker-mode/system.md.d.ts +0 -2
  198. package/dist/prompts/worker-mode/user.d.ts +0 -2
  199. package/dist/prompts/worker-mode/user.md.d.ts +0 -2
  200. package/dist/quickjs-variant-BYhMBpwU.js +0 -45
  201. package/dist/quickjs-variant-CsIwTVFC.cjs +0 -56
  202. package/dist/rolldown-runtime-EAsCxrDo.js +0 -14
  203. package/dist/runtime/fixtures/qwen-protocol-failures.d.ts +0 -29
  204. package/dist/runtime/interpret-result.d.ts +0 -22
  205. package/dist/snapshots.d.ts +0 -249
  206. package/dist/stack-traces-BIE_5Xwf.js +0 -21
  207. package/dist/stack-traces-ntw_qhoy.cjs +0 -26
  208. package/dist/truncator-CLkouTCO.cjs +0 -276
  209. package/dist/truncator-DZqEqnpD.js +0 -253
  210. package/dist/truncator.d.ts +0 -118
  211. package/dist/utils-3ESwP3yg.cjs +0 -1075
  212. package/dist/utils-UBeAFeEI.js +0 -950
  213. /package/dist/{citations.d.ts → chat/citations.d.ts} +0 -0
  214. /package/dist/{citations.test.d.ts → chat/citations.test.d.ts} +0 -0
  215. /package/dist/{component.default.test.d.ts → chat/component.default.test.d.ts} +0 -0
  216. /package/dist/{compiler/plugins/track-tool-calls.test.d.ts → chat/component.test.d.ts} +0 -0
  217. /package/dist/{example.test.d.ts → chat/response.test.d.ts} +0 -0
  218. /package/dist/{exit-parser.test.d.ts → compiler/plugins/dynamic-code.test.d.ts} +0 -0
  219. /package/dist/{handlers.test.d.ts → compiler/plugins/tool-resolution.test.d.ts} +0 -0
  220. /package/dist/{hoist.test.d.ts → errors/catalog.test.d.ts} +0 -0
  221. /package/dist/{message-stream/instructions.test.d.ts → exit.test.d.ts} +0 -0
  222. /package/dist/{message-stream/normalizer.test.d.ts → inspection.test.d.ts} +0 -0
  223. /package/dist/{message-stream/parser.test.d.ts → prompts/native.test.d.ts} +0 -0
  224. /package/dist/{message-stream/response-parser.test.d.ts → result.test.d.ts} +0 -0
  225. /package/dist/{message-stream/stream.test.d.ts → runtime/chat-completion.test.d.ts} +0 -0
  226. /package/dist/{message-stream/validator.test.d.ts → runtime/chat-delivery.test.d.ts} +0 -0
  227. /package/dist/{prompts/adherence.test.d.ts → runtime/chat-last-speaker.test.d.ts} +0 -0
  228. /package/dist/{prompts/catalogue-examples.test.d.ts → runtime/compatibility-regressions.test.d.ts} +0 -0
  229. /package/dist/{prompts/code-examples.test.d.ts → runtime/context-registration.test.d.ts} +0 -0
  230. /package/dist/{prompts/common.test.d.ts → runtime/empty-completion.test.d.ts} +0 -0
  231. /package/dist/{prompts/concrete-patterns.test.d.ts → runtime/error-recovery.test.d.ts} +0 -0
  232. /package/dist/{prompts/long-search.test.d.ts → runtime/errors.test.d.ts} +0 -0
  233. /package/dist/{prompts/protocol-simple.test.d.ts → runtime/execution-activity.test.d.ts} +0 -0
  234. /package/dist/{prompts/protocol.test.d.ts → runtime/execution-diagnostics.test.d.ts} +0 -0
  235. /package/dist/{prompts/sections.test.d.ts → runtime/execution-report.test.d.ts} +0 -0
  236. /package/dist/runtime/{interpret-result.test.d.ts → execution-safety.test.d.ts} +0 -0
  237. /package/dist/{transcript.test.d.ts → runtime/exit-control-flow.test.d.ts} +0 -0
  238. /package/dist/{truncator.test.d.ts → runtime/fixtures/long-search.test.d.ts} +0 -0
@@ -1,9 +1,59 @@
1
- import { n as __exportAll } from "./rolldown-runtime-EAsCxrDo.js";
2
- import { t as uniq } from "./uniq-BYQ7GWwb.js";
3
- import { c as isJsonSchema, l as isValidIdentifier, r as fromJSONSchemaCompat, u as isZuiSchema } from "./utils-UBeAFeEI.js";
4
- import { t as isEmpty } from "./isEmpty-BhJRCqIF.js";
5
- import { t as getTypings } from "./typings-CrBa7Tyy.js";
1
+ import { F as isBuffer, I as isArguments, L as isPrototype, M as isTypedArray, R as isArrayLike, U as isArray, Y as __exportAll, c as isValidIdentifier, j as baseKeys, l as isZuiSchema, n as fromJSONSchemaCompat, s as isJsonSchema, x as _getTag_default } from "./utils-BOFzb8Ok.js";
2
+ import { E as InvalidToolError, H as isCriticalError, L as ToolExecutionError, R as ToolInputError, U as isLLMzError, r as VMSignal } from "./errors-Crk5P8jo.js";
3
+ import { t as uniq } from "./uniq-DfUeSNaX.js";
4
+ import { i as toModelSchema, r as schemaInput, t as parseSchemaAsync } from "./schema-GE4ISPCR.js";
5
+ import { i as unwrapTruncated, n as isTruncated } from "./truncate-BEKbdo3t.js";
6
+ import { t as getTypings } from "./typings-BEVDvtuk.js";
6
7
  import { transforms, z } from "@bpinternal/zui";
8
+ //#region ../../node_modules/.pnpm/lodash-es@4.17.21/node_modules/lodash-es/isEmpty.js
9
+ /** `Object#toString` result references. */
10
+ var mapTag = "[object Map]";
11
+ var setTag = "[object Set]";
12
+ /** Used to check objects for own properties. */
13
+ var hasOwnProperty = Object.prototype.hasOwnProperty;
14
+ /**
15
+ * Checks if `value` is an empty object, collection, map, or set.
16
+ *
17
+ * Objects are considered empty if they have no own enumerable string keyed
18
+ * properties.
19
+ *
20
+ * Array-like values such as `arguments` objects, arrays, buffers, strings, or
21
+ * jQuery-like collections are considered empty if they have a `length` of `0`.
22
+ * Similarly, maps and sets are considered empty if they have a `size` of `0`.
23
+ *
24
+ * @static
25
+ * @memberOf _
26
+ * @since 0.1.0
27
+ * @category Lang
28
+ * @param {*} value The value to check.
29
+ * @returns {boolean} Returns `true` if `value` is empty, else `false`.
30
+ * @example
31
+ *
32
+ * _.isEmpty(null);
33
+ * // => true
34
+ *
35
+ * _.isEmpty(true);
36
+ * // => true
37
+ *
38
+ * _.isEmpty(1);
39
+ * // => true
40
+ *
41
+ * _.isEmpty([1, 2, 3]);
42
+ * // => false
43
+ *
44
+ * _.isEmpty({ 'a': 1 });
45
+ * // => false
46
+ */
47
+ function isEmpty(value) {
48
+ if (value == null) return true;
49
+ if (isArrayLike(value) && (isArray(value) || typeof value == "string" || typeof value.splice == "function" || isBuffer(value) || isTypedArray(value) || isArguments(value))) return !value.length;
50
+ var tag = _getTag_default(value);
51
+ if (tag == mapTag || tag == setTag) return !value.size;
52
+ if (isPrototype(value)) return !baseKeys(value).length;
53
+ for (var key in value) if (hasOwnProperty.call(value, key)) return false;
54
+ return true;
55
+ }
56
+ //#endregion
7
57
  //#region src/convert.ts
8
58
  function convertObjectToZuiLiterals(obj, nested = false) {
9
59
  if (typeof obj === "string") return z.literal(obj).catch(() => obj);
@@ -37,7 +87,7 @@ var tool_exports = /* @__PURE__ */ __exportAll({ Tool: () => Tool });
37
87
  *
38
88
  * ## Key Features
39
89
  * - **Type Safety**: Full TypeScript inference with Zui/Zod schema validation
40
- * - **Input/Output Validation**: Automatic validation of inputs and outputs against schemas
90
+ * - **Input Validation**: Parse inputs through their original schema; output schemas are documentation only
41
91
  * - **Retry Logic**: Built-in retry mechanisms with custom retry functions
42
92
  * - **Static Values**: Pre-configure parameters that won't change between calls
43
93
  * - **Tool Cloning**: Create variations of existing tools with modified behavior
@@ -164,7 +214,7 @@ var tool_exports = /* @__PURE__ */ __exportAll({ Tool: () => Tool });
164
214
  *
165
215
  * Tools automatically handle:
166
216
  * - **Input validation**: Invalid inputs throw descriptive errors
167
- * - **Output validation**: Outputs are validated but invalid outputs are still returned
217
+ * - **Output hints**: Schemas describe likely outputs; results are never parsed or rejected
168
218
  * - **Handler errors**: Exceptions in handlers are caught and can trigger retries
169
219
  * - **Type coercion**: Basic type coercion where possible
170
220
  *
@@ -175,7 +225,9 @@ var Tool = class Tool {
175
225
  aliases = [];
176
226
  description;
177
227
  metadata;
228
+ /** Model-facing input description; zInput retains the original validator. */
178
229
  input;
230
+ /** Expected raw output shape, used for documentation only. */
179
231
  output;
180
232
  retry;
181
233
  MAX_RETRIES = 1e3;
@@ -226,8 +278,8 @@ var Tool = class Tool {
226
278
  return this;
227
279
  }
228
280
  const input = this.input ? fromJSONSchemaCompat(this.input) : z.any();
229
- if (z.is.zuiObject(input) && typeof values !== "object") throw new Error(`Invalid static input values for tool ${this.name}. Expected an object, but got type "${typeof values}"`);
230
- if (z.is.zuiArray(input) && !Array.isArray(values)) throw new Error(`Invalid static input values for tool ${this.name}. Expected an array, but got type "${typeof values}"`);
281
+ if (z.is.zuiObject(input) && typeof values !== "object") throw new InvalidToolError(`Invalid static input values for tool ${this.name}. Expected an object, but got type "${typeof values}"`);
282
+ if (z.is.zuiArray(input) && !Array.isArray(values)) throw new InvalidToolError(`Invalid static input values for tool ${this.name}. Expected an array, but got type "${typeof values}"`);
231
283
  this._staticInputValues = values;
232
284
  return this;
233
285
  }
@@ -241,28 +293,19 @@ var Tool = class Tool {
241
293
  * @internal
242
294
  */
243
295
  get zInput() {
244
- let input;
245
- if (this.input) try {
246
- input = transforms.fromJSONSchema(this.input);
247
- } catch {
248
- input = transforms.fromJSONSchemaLegacy(this.input);
249
- }
250
- else input = z.any();
251
- if (!isEmpty(this._staticInputValues)) {
252
- if (z.is.zuiObject(input)) {
253
- const inputExtensions = convertObjectToZuiLiterals(this._staticInputValues);
254
- input = input.extend(inputExtensions);
255
- } else if (z.is.zuiArray(input)) {
256
- const inputExtensions = convertObjectToZuiLiterals(this._staticInputValues);
257
- input = z.array(input.element.extend(inputExtensions));
258
- } else input = convertObjectToZuiLiterals(this._staticInputValues);
259
- }
260
- return input;
296
+ const input = this._inputSchema ?? (this.input ? fromJSONSchemaCompat(this.input) : z.any());
297
+ if (isEmpty(this._staticInputValues)) return input;
298
+ const shape = schemaInput(input);
299
+ let overrides;
300
+ if (z.is.zuiObject(shape)) overrides = z.object(convertObjectToZuiLiterals(this._staticInputValues)).passthrough();
301
+ else if (z.is.zuiArray(shape)) overrides = z.array(z.object(convertObjectToZuiLiterals(this._staticInputValues)).passthrough());
302
+ else overrides = convertObjectToZuiLiterals(this._staticInputValues);
303
+ return overrides.pipe(input);
261
304
  }
262
305
  /**
263
- * Gets the output schema for validation.
306
+ * Gets the output description as a promise schema. It is never used to parse tool results.
264
307
  *
265
- * @returns The Zui schema for output validation
308
+ * @returns The Zui schema used to describe likely output
266
309
  * @internal
267
310
  */
268
311
  get zOutput() {
@@ -290,7 +333,7 @@ var Tool = class Tool {
290
333
  */
291
334
  rename(name) {
292
335
  const before = this.name;
293
- if (!isValidIdentifier(name)) throw new Error(`Invalid name for tool ${name}. A tool name must start with a letter and contain only letters, numbers, and underscores. It must be 1-50 characters long.`);
336
+ if (!isValidIdentifier(name)) throw new InvalidToolError(`Invalid name for tool ${name}. A tool name must start with a letter and contain only letters, numbers, and underscores. It must be 1-50 characters long.`);
294
337
  this.name = name;
295
338
  this.aliases = uniq([name, ...this.aliases.map((alias) => alias === before ? name : alias)]);
296
339
  return this;
@@ -353,33 +396,30 @@ var Tool = class Tool {
353
396
  */
354
397
  clone(props = {}) {
355
398
  try {
356
- var _props$input, _props$output;
357
- let zInput;
358
- if (this.input) try {
359
- zInput = transforms.fromJSONSchema(this.input);
360
- } catch {
361
- zInput = transforms.fromJSONSchemaLegacy(this.input);
362
- }
363
- let zOutput;
364
- if (this.output) try {
365
- zOutput = transforms.fromJSONSchema(this.output);
366
- } catch {
367
- zOutput = transforms.fromJSONSchemaLegacy(this.output);
368
- }
399
+ const zInput = this._inputSchema ?? (this.input ? fromJSONSchemaCompat(this.input) : void 0);
400
+ const zOutput = this._outputSchema ?? (this.output ? fromJSONSchemaCompat(this.output) : void 0);
401
+ let input = zInput;
402
+ if (typeof props.input === "function") input = props.input(zInput);
403
+ else if (z.is.zuiType(props.input)) input = props.input;
404
+ let output = zOutput;
405
+ if (typeof props.output === "function") output = props.output(zOutput);
406
+ else if (z.is.zuiType(props.output)) output = props.output;
369
407
  return new Tool({
370
408
  name: props.name ?? this.name,
371
409
  aliases: props.aliases ?? [...this.aliases],
372
410
  description: props.description ?? this.description,
373
411
  metadata: JSON.parse(JSON.stringify(props.metadata ?? this.metadata)),
374
- input: typeof props.input === "function" ? (_props$input = props.input) === null || _props$input === void 0 ? void 0 : _props$input.call(props, zInput) : z.is.zuiType(props.input) ? props.input : zInput,
375
- output: typeof props.output === "function" ? (_props$output = props.output) === null || _props$output === void 0 ? void 0 : _props$output.call(props, zOutput) : z.is.zuiType(props.output) ? props.output : zOutput,
412
+ input,
413
+ output,
376
414
  handler: props.handler ?? this._handler,
377
415
  retry: props.retry ?? this.retry
378
416
  }).setStaticInputValues(props.staticInputValues ?? this._staticInputValues);
379
417
  } catch (e) {
380
- throw new Error(`Failed to clone tool "${this.name}": ${e}`);
418
+ throw new InvalidToolError(`Failed to clone tool "${this.name}": ${e}`);
381
419
  }
382
420
  }
421
+ _inputSchema;
422
+ _outputSchema;
383
423
  _handler;
384
424
  /**
385
425
  * Creates a new Tool instance.
@@ -388,7 +428,7 @@ var Tool = class Tool {
388
428
  * @param props.name - Unique tool name (must be valid TypeScript identifier)
389
429
  * @param props.description - Human-readable description for the LLM
390
430
  * @param props.input - Zui/Zod schema for input validation (optional)
391
- * @param props.output - Zui/Zod schema for output validation (optional)
431
+ * @param props.output - Schema describing likely raw output; never used for validation or normalization
392
432
  * @param props.handler - Async function that implements the tool logic
393
433
  * @param props.aliases - Alternative names for the tool (optional)
394
434
  * @param props.metadata - Additional metadata for the tool (optional)
@@ -458,29 +498,32 @@ var Tool = class Tool {
458
498
  * ```
459
499
  */
460
500
  constructor(props) {
461
- if (!isValidIdentifier(props.name)) throw new Error(`Invalid name for tool ${props.name}. A tool name must start with a letter and contain only letters, numbers, and underscores. It must be 1-50 characters long.`);
462
- if (props.description !== void 0 && typeof props.description !== "string") throw new Error(`Invalid description for tool ${props.name}. Expected a string, but got type "${typeof props.description}"`);
463
- if (props.metadata !== void 0 && typeof props.metadata !== "object") throw new Error(`Invalid metadata for tool ${props.name}. Expected an object, but got type "${typeof props.metadata}"`);
464
- if (typeof props.handler !== "function") throw new Error(`Invalid handler for tool ${props.name}. Expected a function, but got type "${typeof props.handler}"`);
465
- if (props.aliases !== void 0 && !Array.isArray(props.aliases)) throw new Error(`Invalid aliases for tool ${props.name}. Expected an array, but got type "${typeof props.aliases}"`);
466
- if (props.aliases && props.aliases.some((alias) => !isValidIdentifier(alias))) throw new Error(`Invalid aliases for tool ${props.name}. Expected an array of valid identifiers.`);
501
+ if (!props || typeof props !== "object" || Array.isArray(props)) throw new InvalidToolError("Tool definition must be an object.");
502
+ if (!isValidIdentifier(props.name)) throw new InvalidToolError(`Invalid name for tool ${props.name}. A tool name must start with a letter and contain only letters, numbers, and underscores. It must be 1-50 characters long.`);
503
+ if (props.description !== void 0 && typeof props.description !== "string") throw new InvalidToolError(`Invalid description for tool ${props.name}. Expected a string, but got type "${typeof props.description}"`);
504
+ if (props.metadata !== void 0 && typeof props.metadata !== "object") throw new InvalidToolError(`Invalid metadata for tool ${props.name}. Expected an object, but got type "${typeof props.metadata}"`);
505
+ if (typeof props.handler !== "function") throw new InvalidToolError(`Invalid handler for tool ${props.name}. Expected a function, but got type "${typeof props.handler}"`);
506
+ if (props.aliases !== void 0 && !Array.isArray(props.aliases)) throw new InvalidToolError(`Invalid aliases for tool ${props.name}. Expected an array, but got type "${typeof props.aliases}"`);
507
+ if (props.aliases && props.aliases.some((alias) => !isValidIdentifier(alias))) throw new InvalidToolError(`Invalid aliases for tool ${props.name}. Expected an array of valid identifiers.`);
467
508
  if (typeof props.input !== "undefined") {
468
509
  if (isZuiSchema(props.input)) try {
469
- this.input = transforms.toJSONSchema(props.input);
470
- } catch {
471
- this.input = transforms.toJSONSchemaLegacy(props.input);
510
+ this.input = toModelSchema(props.input);
511
+ this._inputSchema = props.input;
512
+ } catch (cause) {
513
+ throw new InvalidToolError(`Cannot describe input schema for tool ${props.name}: ${String(cause)}`, { cause });
472
514
  }
473
515
  else if (isJsonSchema(props.input)) this.input = props.input;
474
- else throw new Error(`Invalid input schema for tool ${props.name}. Expected a ZodType or JSONSchema, but got type "${typeof props.input}"`);
516
+ else throw new InvalidToolError(`Invalid input schema for tool ${props.name}. Expected a ZodType or JSONSchema, but got type "${typeof props.input}"`);
475
517
  }
476
518
  if (typeof props.output !== "undefined") {
477
519
  if (isZuiSchema(props.output)) try {
478
- this.output = transforms.toJSONSchema(props.output);
479
- } catch {
480
- this.output = transforms.toJSONSchemaLegacy(props.output);
520
+ this.output = toModelSchema(props.output);
521
+ this._outputSchema = props.output;
522
+ } catch (cause) {
523
+ throw new InvalidToolError(`Cannot describe output schema for tool ${props.name}: ${String(cause)}`, { cause });
481
524
  }
482
525
  else if (isJsonSchema(props.output)) this.output = props.output;
483
- else throw new Error(`Invalid output schema for tool ${props.name}. Expected a ZodType or JSONSchema, but got type "${typeof props.output}"`);
526
+ else throw new InvalidToolError(`Invalid output schema for tool ${props.name}. Expected a ZodType or JSONSchema, but got type "${typeof props.output}"`);
484
527
  }
485
528
  this.name = props.name;
486
529
  this.aliases = uniq([props.name, ...props.aliases ?? []]);
@@ -490,28 +533,10 @@ var Tool = class Tool {
490
533
  this.setStaticInputValues(props.staticInputValues);
491
534
  this.retry = props.retry;
492
535
  }
493
- async _executeHandler(input, ctx, chat, yieldedCount, setYieldedCount) {
494
- const handler = this._handler(input, ctx);
495
- if (!(typeof handler === "object" && handler !== null && "next" in handler)) return handler;
496
- let yieldIndex = 0;
497
- while (true) {
498
- const { value, done } = await handler.next();
499
- if (done) return value;
500
- if (yieldIndex >= yieldedCount) {
501
- var _chat$handler;
502
- setYieldedCount(yieldIndex + 1);
503
- await (chat === null || chat === void 0 || (_chat$handler = chat.handler) === null || _chat$handler === void 0 ? void 0 : _chat$handler.call(chat, value, {
504
- iterationId: ctx.iterationId ?? ctx.callId,
505
- id: `${ctx.callId}:yield-${yieldIndex}`
506
- }));
507
- }
508
- yieldIndex++;
509
- }
510
- }
511
536
  /**
512
537
  * Executes the tool with the given input and context.
513
538
  *
514
- * This method handles input validation, retry logic, output validation, and error handling.
539
+ * This method parses inputs and handles retries. Output schemas are hints: results pass through unchanged.
515
540
  * It's called internally by the LLMz execution engine when generated code calls the tool.
516
541
  *
517
542
  * @param input - Input data to pass to the tool handler
@@ -532,27 +557,43 @@ var Tool = class Tool {
532
557
  *
533
558
  * @internal This method is primarily used internally by the LLMz execution engine
534
559
  */
535
- async execute(rawInput, ctx, chat) {
536
- const input = this.zInput._def.typeName === "ZodObject" ? rawInput ?? {} : rawInput;
537
- const pInput = this.zInput.safeParse(input);
538
- if (!pInput.success) throw new Error(`Tool "${this.name}" received invalid input: ${pInput.error.message}`);
560
+ async execute(rawInput, ctx) {
561
+ var _ctx$onInput;
562
+ const schema = this.zInput;
563
+ const input = z.is.zuiObject(schemaInput(schema)) ? rawInput ?? {} : rawInput;
564
+ const pInput = await parseSchemaAsync(schema, input, `Tool "${this.name}" input`);
565
+ if (!pInput.success) {
566
+ const expectedInput = await getTypings(this._inputSchema ?? schema);
567
+ const issues = pInput.error.issues.map(({ path, message }) => ({
568
+ path,
569
+ message
570
+ }));
571
+ throw new ToolInputError(this.name, issues, expectedInput);
572
+ }
573
+ (_ctx$onInput = ctx.onInput) === null || _ctx$onInput === void 0 || _ctx$onInput.call(ctx, pInput.data);
539
574
  let attempt = 0;
540
- let yieldedCount = 0;
575
+ let lastError;
541
576
  while (attempt < this.MAX_RETRIES) try {
542
- const result = await this._executeHandler(pInput.data, ctx, chat, yieldedCount, (n) => {
543
- yieldedCount = n;
577
+ const result = await this._handler(pInput.data, ctx);
578
+ const policy = isTruncated(result) ? result.$$truncate : void 0;
579
+ const output = unwrapTruncated(result);
580
+ if (!policy) return output;
581
+ return Promise.resolve(output).then((parsed) => {
582
+ var _ctx$onTruncation;
583
+ (_ctx$onTruncation = ctx.onTruncation) === null || _ctx$onTruncation === void 0 || _ctx$onTruncation.call(ctx, parsed, policy);
584
+ return parsed;
544
585
  });
545
- const pOutput = this.zOutput.safeParse(result);
546
- return pOutput.success ? pOutput.data : result;
547
586
  } catch (err) {
548
587
  var _this$retry;
588
+ if (isCriticalError(err) || VMSignal.is(err)) throw err;
589
+ lastError = err;
549
590
  if (!await ((_this$retry = this.retry) === null || _this$retry === void 0 ? void 0 : _this$retry.call(this, {
550
591
  input: pInput.data,
551
592
  attempt: ++attempt,
552
593
  error: err
553
- }))) throw err;
594
+ }))) throw VMSignal.is(err) || isLLMzError(err) ? err : new ToolExecutionError(this.name, err);
554
595
  }
555
- throw new Error(`Tool "${this.name}" failed after ${this.MAX_RETRIES} attempts. Last error: ${JSON.stringify(input)}`);
596
+ throw new ToolExecutionError(this.name, lastError);
556
597
  }
557
598
  /**
558
599
  * Generates TypeScript type definitions for this tool.
@@ -570,6 +611,8 @@ var Tool = class Tool {
570
611
  } catch {
571
612
  input = transforms.fromJSONSchemaLegacy(this.input);
572
613
  }
614
+ const originalInput = this._inputSchema && schemaInput(this._inputSchema);
615
+ if (originalInput && (z.is.zuiVoid(originalInput) || z.is.zuiUndefined(originalInput))) input = originalInput;
573
616
  let output;
574
617
  if (!this.output || Object.keys(this.output).length === 0) output = z.void();
575
618
  else try {
@@ -581,7 +624,16 @@ var Tool = class Tool {
581
624
  const inputExtensions = convertObjectToZuiLiterals(this._staticInputValues);
582
625
  input = input.extend(inputExtensions);
583
626
  } else if (this._staticInputValues !== void 0) input = convertObjectToZuiLiterals(this._staticInputValues);
584
- const fnType = z.function(input, z.promise(output)).title(this.name).describe(this.description ?? "");
627
+ const valueType = input === null || input === void 0 ? void 0 : input.naked();
628
+ let directType;
629
+ if (valueType) {
630
+ if (z.is.zuiString(valueType)) directType = "string";
631
+ else if (z.is.zuiNumber(valueType)) directType = "number";
632
+ else if (z.is.zuiBoolean(valueType)) directType = "boolean";
633
+ else if (z.is.zuiArray(valueType)) directType = "array";
634
+ }
635
+ const description = [this.description, directType && `Pass the ${directType} itself as the argument, not an object containing it.`].filter(Boolean).join("\n");
636
+ const fnType = z.function(input, z.promise(output)).title(this.name).describe(description);
585
637
  return getTypings(fnType, { declaration: true });
586
638
  }
587
639
  /**
@@ -625,7 +677,7 @@ var Tool = class Tool {
625
677
  });
626
678
  };
627
679
  /**
628
- * Converts the tool to its JSON representation.
680
+ * Serializes model-facing descriptions, not JavaScript validators. Use clone() to retain schema effects.
629
681
  *
630
682
  * @returns JSON representation of the Tool instance
631
683
  */