@tambo-ai/react 0.69.0 → 0.70.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. package/README.md +7 -7
  2. package/dist/hooks/use-tambo-threads.test.js.map +1 -1
  3. package/dist/index.d.ts +1 -1
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js.map +1 -1
  6. package/dist/mcp/index.d.ts +4 -5
  7. package/dist/mcp/index.d.ts.map +1 -1
  8. package/dist/mcp/index.js +4 -5
  9. package/dist/mcp/index.js.map +1 -1
  10. package/dist/model/component-metadata.d.ts +88 -241
  11. package/dist/model/component-metadata.d.ts.map +1 -1
  12. package/dist/model/component-metadata.js.map +1 -1
  13. package/dist/model/mcp-server-info.d.ts +3 -3
  14. package/dist/model/mcp-server-info.js.map +1 -1
  15. package/dist/providers/hooks/use-tambo-session-token.test.js.map +1 -1
  16. package/dist/providers/tambo-component-provider.d.ts +2 -2
  17. package/dist/providers/tambo-component-provider.d.ts.map +1 -1
  18. package/dist/providers/tambo-component-provider.js.map +1 -1
  19. package/dist/providers/tambo-interactable-provider.d.ts +1 -1
  20. package/dist/providers/tambo-registry-provider.d.ts +4 -4
  21. package/dist/providers/tambo-registry-provider.d.ts.map +1 -1
  22. package/dist/providers/tambo-registry-provider.js +11 -8
  23. package/dist/providers/tambo-registry-provider.js.map +1 -1
  24. package/dist/providers/tambo-registry-provider.test.js +31 -0
  25. package/dist/providers/tambo-registry-provider.test.js.map +1 -1
  26. package/dist/providers/tambo-registry-schema-compat.test.js +42 -52
  27. package/dist/providers/tambo-registry-schema-compat.test.js.map +1 -1
  28. package/dist/providers/tambo-stubs.d.ts +2 -2
  29. package/dist/providers/tambo-stubs.d.ts.map +1 -1
  30. package/dist/providers/tambo-stubs.js.map +1 -1
  31. package/dist/providers/tambo-thread-provider-initial-messages.test.js.map +1 -1
  32. package/dist/providers/tambo-thread-provider.d.ts.map +1 -1
  33. package/dist/providers/tambo-thread-provider.js +110 -142
  34. package/dist/providers/tambo-thread-provider.js.map +1 -1
  35. package/dist/providers/tambo-thread-provider.test.js +362 -445
  36. package/dist/providers/tambo-thread-provider.test.js.map +1 -1
  37. package/dist/schema/index.d.ts +1 -2
  38. package/dist/schema/index.d.ts.map +1 -1
  39. package/dist/schema/index.js +1 -5
  40. package/dist/schema/index.js.map +1 -1
  41. package/dist/schema/schema.d.ts +7 -24
  42. package/dist/schema/schema.d.ts.map +1 -1
  43. package/dist/schema/schema.js +34 -105
  44. package/dist/schema/schema.js.map +1 -1
  45. package/dist/schema/schema.test.js +26 -124
  46. package/dist/schema/schema.test.js.map +1 -1
  47. package/dist/testing/tools.d.ts +2 -12
  48. package/dist/testing/tools.d.ts.map +1 -1
  49. package/dist/testing/tools.js +1 -20
  50. package/dist/testing/tools.js.map +1 -1
  51. package/dist/testing/types.d.ts +2 -2
  52. package/dist/testing/types.d.ts.map +1 -1
  53. package/dist/testing/types.js.map +1 -1
  54. package/dist/util/registry-validators.d.ts +2 -2
  55. package/dist/util/registry-validators.d.ts.map +1 -1
  56. package/dist/util/registry-validators.js +37 -17
  57. package/dist/util/registry-validators.js.map +1 -1
  58. package/dist/util/registry-validators.test.js +64 -25
  59. package/dist/util/registry-validators.test.js.map +1 -1
  60. package/dist/util/registry.d.ts +4 -10
  61. package/dist/util/registry.d.ts.map +1 -1
  62. package/dist/util/registry.js +6 -22
  63. package/dist/util/registry.js.map +1 -1
  64. package/dist/util/registry.test.js +1 -47
  65. package/dist/util/registry.test.js.map +1 -1
  66. package/dist/util/tool-caller.d.ts +2 -2
  67. package/dist/util/tool-caller.d.ts.map +1 -1
  68. package/dist/util/tool-caller.js +5 -12
  69. package/dist/util/tool-caller.js.map +1 -1
  70. package/dist/v1/index.d.ts +35 -0
  71. package/dist/v1/index.d.ts.map +1 -0
  72. package/dist/v1/index.js +47 -0
  73. package/dist/v1/index.js.map +1 -0
  74. package/dist/v1/types/component.d.ts +47 -0
  75. package/dist/v1/types/component.d.ts.map +1 -0
  76. package/dist/v1/types/component.js +11 -0
  77. package/dist/v1/types/component.js.map +1 -0
  78. package/dist/v1/types/event.d.ts +63 -0
  79. package/dist/v1/types/event.d.ts.map +1 -0
  80. package/dist/v1/types/event.js +9 -0
  81. package/dist/v1/types/event.js.map +1 -0
  82. package/dist/v1/types/message.d.ts +39 -0
  83. package/dist/v1/types/message.d.ts.map +1 -0
  84. package/dist/v1/types/message.js +10 -0
  85. package/dist/v1/types/message.js.map +1 -0
  86. package/dist/v1/types/thread.d.ts +54 -0
  87. package/dist/v1/types/thread.d.ts.map +1 -0
  88. package/dist/v1/types/thread.js +9 -0
  89. package/dist/v1/types/thread.js.map +1 -0
  90. package/dist/v1/types/tool.d.ts +52 -0
  91. package/dist/v1/types/tool.d.ts.map +1 -0
  92. package/dist/v1/types/tool.js +11 -0
  93. package/dist/v1/types/tool.js.map +1 -0
  94. package/esm/hooks/use-tambo-threads.test.js.map +1 -1
  95. package/esm/index.d.ts +1 -1
  96. package/esm/index.d.ts.map +1 -1
  97. package/esm/index.js.map +1 -1
  98. package/esm/mcp/index.d.ts +4 -5
  99. package/esm/mcp/index.d.ts.map +1 -1
  100. package/esm/mcp/index.js +4 -5
  101. package/esm/mcp/index.js.map +1 -1
  102. package/esm/model/component-metadata.d.ts +88 -241
  103. package/esm/model/component-metadata.d.ts.map +1 -1
  104. package/esm/model/component-metadata.js.map +1 -1
  105. package/esm/model/mcp-server-info.d.ts +3 -3
  106. package/esm/model/mcp-server-info.js.map +1 -1
  107. package/esm/providers/hooks/use-tambo-session-token.test.js.map +1 -1
  108. package/esm/providers/tambo-component-provider.d.ts +2 -2
  109. package/esm/providers/tambo-component-provider.d.ts.map +1 -1
  110. package/esm/providers/tambo-component-provider.js.map +1 -1
  111. package/esm/providers/tambo-interactable-provider.d.ts +1 -1
  112. package/esm/providers/tambo-registry-provider.d.ts +4 -4
  113. package/esm/providers/tambo-registry-provider.d.ts.map +1 -1
  114. package/esm/providers/tambo-registry-provider.js +11 -8
  115. package/esm/providers/tambo-registry-provider.js.map +1 -1
  116. package/esm/providers/tambo-registry-provider.test.js +31 -0
  117. package/esm/providers/tambo-registry-provider.test.js.map +1 -1
  118. package/esm/providers/tambo-registry-schema-compat.test.js +42 -52
  119. package/esm/providers/tambo-registry-schema-compat.test.js.map +1 -1
  120. package/esm/providers/tambo-stubs.d.ts +2 -2
  121. package/esm/providers/tambo-stubs.d.ts.map +1 -1
  122. package/esm/providers/tambo-stubs.js.map +1 -1
  123. package/esm/providers/tambo-thread-provider-initial-messages.test.js.map +1 -1
  124. package/esm/providers/tambo-thread-provider.d.ts.map +1 -1
  125. package/esm/providers/tambo-thread-provider.js +110 -142
  126. package/esm/providers/tambo-thread-provider.js.map +1 -1
  127. package/esm/providers/tambo-thread-provider.test.js +329 -445
  128. package/esm/providers/tambo-thread-provider.test.js.map +1 -1
  129. package/esm/schema/index.d.ts +1 -2
  130. package/esm/schema/index.d.ts.map +1 -1
  131. package/esm/schema/index.js +1 -2
  132. package/esm/schema/index.js.map +1 -1
  133. package/esm/schema/schema.d.ts +7 -24
  134. package/esm/schema/schema.d.ts.map +1 -1
  135. package/esm/schema/schema.js +34 -103
  136. package/esm/schema/schema.js.map +1 -1
  137. package/esm/schema/schema.test.js +27 -125
  138. package/esm/schema/schema.test.js.map +1 -1
  139. package/esm/testing/tools.d.ts +2 -12
  140. package/esm/testing/tools.d.ts.map +1 -1
  141. package/esm/testing/tools.js +2 -20
  142. package/esm/testing/tools.js.map +1 -1
  143. package/esm/testing/types.d.ts +2 -2
  144. package/esm/testing/types.d.ts.map +1 -1
  145. package/esm/testing/types.js.map +1 -1
  146. package/esm/util/registry-validators.d.ts +2 -2
  147. package/esm/util/registry-validators.d.ts.map +1 -1
  148. package/esm/util/registry-validators.js +38 -18
  149. package/esm/util/registry-validators.js.map +1 -1
  150. package/esm/util/registry-validators.test.js +64 -25
  151. package/esm/util/registry-validators.test.js.map +1 -1
  152. package/esm/util/registry.d.ts +4 -10
  153. package/esm/util/registry.d.ts.map +1 -1
  154. package/esm/util/registry.js +7 -22
  155. package/esm/util/registry.js.map +1 -1
  156. package/esm/util/registry.test.js +3 -49
  157. package/esm/util/registry.test.js.map +1 -1
  158. package/esm/util/tool-caller.d.ts +2 -2
  159. package/esm/util/tool-caller.d.ts.map +1 -1
  160. package/esm/util/tool-caller.js +5 -12
  161. package/esm/util/tool-caller.js.map +1 -1
  162. package/esm/v1/index.d.ts +35 -0
  163. package/esm/v1/index.d.ts.map +1 -0
  164. package/esm/v1/index.js +46 -0
  165. package/esm/v1/index.js.map +1 -0
  166. package/esm/v1/types/component.d.ts +47 -0
  167. package/esm/v1/types/component.d.ts.map +1 -0
  168. package/esm/v1/types/component.js +10 -0
  169. package/esm/v1/types/component.js.map +1 -0
  170. package/esm/v1/types/event.d.ts +63 -0
  171. package/esm/v1/types/event.d.ts.map +1 -0
  172. package/esm/v1/types/event.js +8 -0
  173. package/esm/v1/types/event.js.map +1 -0
  174. package/esm/v1/types/message.d.ts +39 -0
  175. package/esm/v1/types/message.d.ts.map +1 -0
  176. package/esm/v1/types/message.js +9 -0
  177. package/esm/v1/types/message.js.map +1 -0
  178. package/esm/v1/types/thread.d.ts +54 -0
  179. package/esm/v1/types/thread.d.ts.map +1 -0
  180. package/esm/v1/types/thread.js +8 -0
  181. package/esm/v1/types/thread.js.map +1 -0
  182. package/esm/v1/types/tool.d.ts +52 -0
  183. package/esm/v1/types/tool.d.ts.map +1 -0
  184. package/esm/v1/types/tool.js +10 -0
  185. package/esm/v1/types/tool.js.map +1 -0
  186. package/package.json +18 -8
  187. package/dist/schema/zod.d.ts +0 -57
  188. package/dist/schema/zod.d.ts.map +0 -1
  189. package/dist/schema/zod.js +0 -191
  190. package/dist/schema/zod.js.map +0 -1
  191. package/dist/schema/zod.test.d.ts +0 -2
  192. package/dist/schema/zod.test.d.ts.map +0 -1
  193. package/dist/schema/zod.test.js +0 -663
  194. package/dist/schema/zod.test.js.map +0 -1
  195. package/esm/schema/zod.d.ts +0 -57
  196. package/esm/schema/zod.d.ts.map +0 -1
  197. package/esm/schema/zod.js +0 -180
  198. package/esm/schema/zod.js.map +0 -1
  199. package/esm/schema/zod.test.d.ts +0 -2
  200. package/esm/schema/zod.test.d.ts.map +0 -1
  201. package/esm/schema/zod.test.js +0 -628
  202. package/esm/schema/zod.test.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"schema.test.js","sourceRoot":"","sources":["../../src/schema/schema.test.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JSONSchema7 } from \"json-schema\";\nimport * as z3 from \"zod/v3\";\nimport * as z4 from \"zod/v4\";\nimport {\n TamboTool,\n TamboToolWithToolSchema,\n} from \"../model/component-metadata\";\nimport { looksLikeJSONSchema } from \"./json-schema\";\nimport {\n getParametersFromToolSchema,\n hasInputSchema,\n safeSchemaToJsonSchema,\n schemaToJsonSchema,\n} from \"./schema\";\nimport { isStandardSchema } from \"./standard-schema\";\n\ndescribe(\"schema utilities\", () => {\n describe(\"looksLikeJSONSchema\", () => {\n it(\"returns true for a basic JSON Schema object\", () => {\n const jsonSchema: JSONSchema7 = {\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n age: { type: \"integer\" },\n },\n required: [\"name\"],\n };\n\n expect(looksLikeJSONSchema(jsonSchema)).toBe(true);\n });\n\n it(\"returns true for a union type JSON Schema\", () => {\n const jsonSchema: JSONSchema7 = {\n type: [\"string\", \"null\"],\n };\n\n expect(looksLikeJSONSchema(jsonSchema)).toBe(true);\n });\n\n it(\"returns false for Standard Schema validators\", () => {\n const zodSchema = z4.object({\n name: z4.string(),\n });\n\n expect(isStandardSchema(zodSchema)).toBe(true);\n expect(looksLikeJSONSchema(zodSchema)).toBe(false);\n });\n\n it(\"returns false for arbitrary objects that do not resemble JSON Schema\", () => {\n const notSchema = {\n type: \"foo\",\n other: \"bar\",\n };\n\n expect(looksLikeJSONSchema(notSchema)).toBe(false);\n });\n });\n\n describe(\"getParametersFromToolSchema\", () => {\n describe(\"inputSchema interface (object schemas)\", () => {\n it(\"extracts parameters from Zod 4 object schema properties\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: z4.object({\n query: z4.string().describe(\"Search query\"),\n limit: z4.number().describe(\"Max results\"),\n enabled: z4.boolean().optional().describe(\"Whether enabled\"),\n }),\n outputSchema: z4.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(3);\n\n const queryParam = params.find((p) => p.name === \"query\");\n expect(queryParam).toBeDefined();\n expect(queryParam?.type).toBe(\"string\");\n expect(queryParam?.description).toBe(\"Search query\");\n expect(queryParam?.isRequired).toBe(true);\n\n const limitParam = params.find((p) => p.name === \"limit\");\n expect(limitParam).toBeDefined();\n expect(limitParam?.type).toBe(\"number\");\n expect(limitParam?.description).toBe(\"Max results\");\n expect(limitParam?.isRequired).toBe(true);\n\n const enabledParam = params.find((p) => p.name === \"enabled\");\n expect(enabledParam).toBeDefined();\n expect(enabledParam?.type).toBe(\"boolean\");\n // Optional fields are not required\n expect(enabledParam?.isRequired).toBe(false);\n });\n\n it(\"extracts parameters from Zod 3 object schema properties\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: z3.object({\n name: z3.string().describe(\"User name\"),\n age: z3.number().optional(),\n }),\n outputSchema: z3.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(2);\n\n const nameParam = params.find((p) => p.name === \"name\");\n expect(nameParam).toBeDefined();\n expect(nameParam?.type).toBe(\"string\");\n expect(nameParam?.isRequired).toBe(true);\n\n const ageParam = params.find((p) => p.name === \"age\");\n expect(ageParam).toBeDefined();\n expect(ageParam?.type).toBe(\"number\");\n expect(ageParam?.isRequired).toBe(false);\n });\n\n it(\"extracts parameters from JSON Schema object properties\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: {\n type: \"object\",\n properties: {\n id: { type: \"string\", description: \"Item ID\" },\n count: { type: \"number\", description: \"Item count\" },\n active: { type: \"boolean\" },\n },\n required: [\"id\"],\n } as JSONSchema7,\n outputSchema: {},\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(3);\n\n const idParam = params.find((p) => p.name === \"id\");\n expect(idParam).toBeDefined();\n expect(idParam?.type).toBe(\"string\");\n expect(idParam?.description).toBe(\"Item ID\");\n expect(idParam?.isRequired).toBe(true);\n\n const countParam = params.find((p) => p.name === \"count\");\n expect(countParam).toBeDefined();\n expect(countParam?.type).toBe(\"number\");\n expect(countParam?.isRequired).toBe(false);\n\n const activeParam = params.find((p) => p.name === \"active\");\n expect(activeParam).toBeDefined();\n expect(activeParam?.type).toBe(\"boolean\");\n expect(activeParam?.isRequired).toBe(false);\n });\n\n it(\"handles empty object schema\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: z4.object({}),\n outputSchema: z4.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n expect(params).toHaveLength(0);\n });\n\n it(\"handles nested object schemas\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: z4.object({\n user: z4\n .object({\n name: z4.string(),\n email: z4.string(),\n })\n .describe(\"User info\"),\n options: z4.object({\n notify: z4.boolean(),\n }),\n }),\n outputSchema: z4.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(2);\n\n const userParam = params.find((p) => p.name === \"user\");\n expect(userParam).toBeDefined();\n expect(userParam?.type).toBe(\"object\");\n expect(userParam?.description).toBe(\"User info\");\n\n const optionsParam = params.find((p) => p.name === \"options\");\n expect(optionsParam).toBeDefined();\n expect(optionsParam?.type).toBe(\"object\");\n });\n\n it(\"handles array properties\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: z4.object({\n tags: z4.array(z4.string()).describe(\"List of tags\"),\n items: z4.array(z4.object({ id: z4.number() })),\n }),\n outputSchema: z4.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(2);\n\n const tagsParam = params.find((p) => p.name === \"tags\");\n expect(tagsParam).toBeDefined();\n expect(tagsParam?.type).toBe(\"array\");\n expect(tagsParam?.description).toBe(\"List of tags\");\n\n const itemsParam = params.find((p) => p.name === \"items\");\n expect(itemsParam).toBeDefined();\n expect(itemsParam?.type).toBe(\"array\");\n });\n });\n\n describe(\"realistic inputSchema scenarios\", () => {\n it(\"handles enum properties\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: z4.object({\n status: z4.enum([\"pending\", \"active\", \"completed\"]),\n priority: z4\n .enum([\"low\", \"medium\", \"high\"])\n .describe(\"Task priority\"),\n }),\n outputSchema: z4.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(2);\n\n const statusParam = params.find((p) => p.name === \"status\");\n expect(statusParam).toBeDefined();\n expect(statusParam?.type).toBe(\"string\");\n expect(statusParam?.isRequired).toBe(true);\n\n const priorityParam = params.find((p) => p.name === \"priority\");\n expect(priorityParam).toBeDefined();\n expect(priorityParam?.type).toBe(\"string\");\n expect(priorityParam?.description).toBe(\"Task priority\");\n });\n\n it(\"handles nullable properties\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: z4.object({\n name: z4.string().nullable().describe(\"Optional name\"),\n count: z4.number().nullable(),\n }),\n outputSchema: z4.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(2);\n\n const nameParam = params.find((p) => p.name === \"name\");\n expect(nameParam).toBeDefined();\n expect(nameParam?.description).toBe(\"Optional name\");\n // Nullable fields are still required (they must be provided, even if null)\n expect(nameParam?.isRequired).toBe(true);\n });\n\n it(\"handles deeply nested schemas and preserves full schema\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: z4.object({\n config: z4.object({\n database: z4.object({\n host: z4.string(),\n port: z4.number().optional(),\n }),\n }),\n }),\n outputSchema: z4.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(1);\n expect(params[0].name).toBe(\"config\");\n expect(params[0].type).toBe(\"object\");\n // The full nested schema should be preserved\n expect(params[0].schema).toHaveProperty(\"properties\");\n });\n\n it(\"handles mixed required and optional fields correctly\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: z4.object({\n required1: z4.string(),\n optional1: z4.string().optional(),\n required2: z4.number(),\n }),\n outputSchema: z4.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(3);\n\n const required1 = params.find((p) => p.name === \"required1\");\n const optional1 = params.find((p) => p.name === \"optional1\");\n const required2 = params.find((p) => p.name === \"required2\");\n\n expect(required1?.isRequired).toBe(true);\n expect(optional1?.isRequired).toBe(false);\n expect(required2?.isRequired).toBe(true);\n });\n });\n\n describe(\"deprecated toolSchema interface (tuple/positional args)\", () => {\n it(\"extracts positional parameters from Zod 3 function schema\", () => {\n const tool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n toolSchema: z3\n .function()\n .args(\n z3.string().describe(\"First arg\"),\n z3.number().describe(\"Second arg\"),\n )\n .returns(z3.void()),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n // toolSchema uses positional params (param1, param2, etc.)\n expect(params.length).toBeGreaterThanOrEqual(1);\n expect(params[0].name).toBe(\"param1\");\n });\n\n it(\"handles toolSchema with JSON Schema directly\", () => {\n const tool: TamboToolWithToolSchema = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n toolSchema: {\n type: \"object\",\n properties: {\n query: { type: \"string\", description: \"Search query\" },\n },\n required: [\"query\"],\n } as JSONSchema7,\n };\n\n const params = getParametersFromToolSchema(tool);\n\n // JSON Schema in toolSchema should return params wrapped\n expect(params.length).toBeGreaterThanOrEqual(1);\n });\n });\n\n describe(\"edge cases and error handling\", () => {\n it(\"returns empty params when inputSchema is unknown type\", () => {\n // Create a tool with an invalid inputSchema that isn't Standard Schema or JSON Schema\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: \"invalid-schema\" as any, // Not a valid schema\n outputSchema: z4.void(),\n };\n\n const consoleSpy = jest.spyOn(console, \"warn\").mockImplementation();\n const params = getParametersFromToolSchema(tool);\n consoleSpy.mockRestore();\n\n expect(params).toEqual([]);\n });\n\n it(\"throws when toolSchema is undefined\", () => {\n // Create a tool with toolSchema that has undefined toolSchema\n const tool: TamboToolWithToolSchema = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n toolSchema: undefined as any,\n };\n\n expect(() => getParametersFromToolSchema(tool)).toThrow(\n \"Unable to determine parameters from zod function schema\",\n );\n });\n\n it(\"throws when toolSchema args are not recognized\", () => {\n // Create a tool with toolSchema that is not a function schema or JSON schema\n // This causes getArgsFromToolSchema to attempt extraction but fail\n const tool: TamboToolWithToolSchema = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n toolSchema: { notASchema: true } as any,\n };\n\n // This throws because it's not a Zod function schema\n expect(() => getParametersFromToolSchema(tool)).toThrow(\n \"Unable to determine parameters from zod function schema\",\n );\n });\n });\n\n describe(\"toolSchema with JSON Schema tuple\", () => {\n it(\"handles toolSchema with JSON Schema array/tuple directly\", () => {\n const tool: TamboToolWithToolSchema = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n // JSON Schema tuple format\n toolSchema: {\n type: \"array\",\n items: [\n { type: \"string\", description: \"First param\" },\n { type: \"number\", description: \"Second param\" },\n ],\n } as JSONSchema7,\n };\n\n const params = getParametersFromToolSchema(tool);\n\n // JSON Schema tuples should be extracted as positional params\n expect(params).toHaveLength(2);\n expect(params[0].name).toBe(\"param1\");\n expect(params[0].type).toBe(\"string\");\n expect(params[0].description).toBe(\"First param\");\n expect(params[1].name).toBe(\"param2\");\n expect(params[1].type).toBe(\"number\");\n });\n\n it(\"handles toolSchema with JSON Schema prefixItems (2020-12 format)\", () => {\n const tool: TamboToolWithToolSchema = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n // JSON Schema 2020-12 tuple format\n toolSchema: {\n type: \"array\",\n prefixItems: [\n { type: \"boolean\", description: \"Flag\" },\n { type: \"string\" },\n ],\n } as JSONSchema7,\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(2);\n expect(params[0].name).toBe(\"param1\");\n expect(params[0].type).toBe(\"boolean\");\n expect(params[0].description).toBe(\"Flag\");\n expect(params[1].name).toBe(\"param2\");\n expect(params[1].type).toBe(\"string\");\n });\n\n it(\"handles toolSchema with non-tuple JSON Schema (fallback)\", () => {\n const tool: TamboToolWithToolSchema = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n // Non-tuple JSON Schema - should be wrapped as single param\n toolSchema: {\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n },\n } as JSONSchema7,\n };\n\n const params = getParametersFromToolSchema(tool);\n\n // Non-tuple schemas should be wrapped as a single param\n expect(params).toHaveLength(1);\n expect(params[0].name).toBe(\"param1\");\n expect(params[0].type).toBe(\"object\");\n });\n });\n });\n\n describe(\"schemaToJsonSchema\", () => {\n it(\"returns JSON Schema as-is when already a JSON Schema\", () => {\n const jsonSchema: JSONSchema7 = {\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n },\n };\n\n const result = schemaToJsonSchema(jsonSchema);\n expect(result).toBe(jsonSchema); // Same reference\n });\n\n it(\"converts Zod 4 schema to JSON Schema\", () => {\n const zodSchema = z4.object({\n name: z4.string(),\n count: z4.number(),\n });\n\n const result = schemaToJsonSchema(zodSchema);\n\n expect(result).toEqual(\n expect.objectContaining({\n type: \"object\",\n properties: expect.objectContaining({\n name: expect.objectContaining({ type: \"string\" }),\n count: expect.objectContaining({ type: \"number\" }),\n }),\n }),\n );\n });\n\n it(\"converts Zod 3 schema to JSON Schema\", () => {\n const zodSchema = z3.object({\n title: z3.string(),\n });\n\n const result = schemaToJsonSchema(zodSchema);\n\n expect(result).toEqual(\n expect.objectContaining({\n type: \"object\",\n properties: expect.objectContaining({\n title: expect.objectContaining({ type: \"string\" }),\n }),\n }),\n );\n });\n });\n\n describe(\"safeSchemaToJsonSchema\", () => {\n it(\"returns undefined for null schema\", () => {\n expect(safeSchemaToJsonSchema(null)).toBeUndefined();\n });\n\n it(\"returns undefined for undefined schema\", () => {\n expect(safeSchemaToJsonSchema(undefined)).toBeUndefined();\n });\n\n it(\"converts valid schema successfully\", () => {\n const zodSchema = z4.object({ name: z4.string() });\n const result = safeSchemaToJsonSchema(zodSchema);\n\n expect(result).toEqual(\n expect.objectContaining({\n type: \"object\",\n properties: expect.objectContaining({\n name: expect.objectContaining({ type: \"string\" }),\n }),\n }),\n );\n });\n\n it(\"returns undefined and calls onError for invalid schema\", () => {\n // Create something that looks like a Standard Schema but will fail conversion\n const brokenSchema = {\n \"~standard\": {\n version: 1,\n vendor: \"broken\",\n validate: () => ({ value: {} }),\n },\n };\n\n const onError = jest.fn();\n const consoleSpy = jest.spyOn(console, \"error\").mockImplementation();\n\n const result = safeSchemaToJsonSchema(brokenSchema as any, onError);\n\n consoleSpy.mockRestore();\n\n expect(result).toBeUndefined();\n expect(onError).toHaveBeenCalled();\n });\n\n it(\"logs error to console when conversion fails\", () => {\n const brokenSchema = {\n \"~standard\": {\n version: 1,\n vendor: \"broken\",\n validate: () => ({ value: {} }),\n },\n };\n\n const consoleSpy = jest.spyOn(console, \"error\").mockImplementation();\n\n safeSchemaToJsonSchema(brokenSchema as any);\n\n expect(consoleSpy).toHaveBeenCalledWith(\n \"Error converting schema to JSON Schema:\",\n expect.any(Error),\n );\n\n consoleSpy.mockRestore();\n });\n });\n\n describe(\"hasInputSchema\", () => {\n it(\"returns true for tool with inputSchema\", () => {\n const tool: TamboTool = {\n name: \"test\",\n description: \"test\",\n tool: jest.fn(),\n inputSchema: z4.object({ a: z4.string() }),\n outputSchema: z4.void(),\n };\n\n expect(hasInputSchema(tool)).toBe(true);\n });\n\n it(\"returns false for tool with toolSchema (deprecated)\", () => {\n const tool: TamboToolWithToolSchema = {\n name: \"test\",\n description: \"test\",\n tool: jest.fn(),\n toolSchema: z3.function().args(z3.string()).returns(z3.void()),\n };\n\n expect(hasInputSchema(tool)).toBe(false);\n });\n\n it(\"returns false for tool with null inputSchema\", () => {\n const tool = {\n name: \"test\",\n description: \"test\",\n tool: jest.fn(),\n inputSchema: null,\n outputSchema: z4.void(),\n };\n\n expect(hasInputSchema(tool as any)).toBe(false);\n });\n });\n});\n"]}
1
+ {"version":3,"file":"schema.test.js","sourceRoot":"","sources":["../../src/schema/schema.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,2CAA6B;AAC7B,2CAA6B;AAE7B,+CAAoD;AACpD,qCAIkB;AAClB,uDAAqD;AAErD,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;QACnC,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,UAAU,GAAgB;gBAC9B,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;oBACxB,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;iBACzB;gBACD,QAAQ,EAAE,CAAC,MAAM,CAAC;aACnB,CAAC;YAEF,MAAM,CAAC,IAAA,iCAAmB,EAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,MAAM,UAAU,GAAgB;gBAC9B,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;aACzB,CAAC;YAEF,MAAM,CAAC,IAAA,iCAAmB,EAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;YACtD,MAAM,SAAS,GAAG,EAAE,CAAC,MAAM,CAAC;gBAC1B,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE;aAClB,CAAC,CAAC;YAEH,MAAM,CAAC,IAAA,kCAAgB,EAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/C,MAAM,CAAC,IAAA,iCAAmB,EAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sEAAsE,EAAE,GAAG,EAAE;YAC9E,MAAM,SAAS,GAAG;gBAChB,IAAI,EAAE,KAAK;gBACX,KAAK,EAAE,KAAK;aACb,CAAC;YAEF,MAAM,CAAC,IAAA,iCAAmB,EAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;QAC3C,QAAQ,CAAC,wCAAwC,EAAE,GAAG,EAAE;YACtD,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;gBACjE,MAAM,IAAI,GAAc;oBACtB,IAAI,EAAE,WAAW;oBACjB,WAAW,EAAE,WAAW;oBACxB,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;oBACf,WAAW,EAAE,EAAE,CAAC,MAAM,CAAC;wBACrB,KAAK,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;wBAC3C,KAAK,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;wBAC1C,OAAO,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;qBAC7D,CAAC;oBACF,YAAY,EAAE,EAAE,CAAC,IAAI,EAAE;iBACxB,CAAC;gBAEF,MAAM,MAAM,GAAG,IAAA,oCAA2B,EAAC,IAAI,CAAC,CAAC;gBAEjD,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAE/B,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;gBAC1D,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;gBACjC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACxC,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBACrD,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAE1C,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;gBAC1D,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;gBACjC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACxC,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBACpD,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAE1C,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;gBAC9D,MAAM,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;gBACnC,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC3C,mCAAmC;gBACnC,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC/C,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;gBACjE,MAAM,IAAI,GAAc;oBACtB,IAAI,EAAE,WAAW;oBACjB,WAAW,EAAE,WAAW;oBACxB,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;oBACf,WAAW,EAAE,EAAE,CAAC,MAAM,CAAC;wBACrB,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;wBACvC,GAAG,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;qBAC5B,CAAC;oBACF,YAAY,EAAE,EAAE,CAAC,IAAI,EAAE;iBACxB,CAAC;gBAEF,MAAM,MAAM,GAAG,IAAA,oCAA2B,EAAC,IAAI,CAAC,CAAC;gBAEjD,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAE/B,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;gBACxD,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;gBAChC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACvC,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEzC,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC;gBACtD,MAAM,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;gBAC/B,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACtC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;gBAChE,MAAM,IAAI,GAAc;oBACtB,IAAI,EAAE,WAAW;oBACjB,WAAW,EAAE,WAAW;oBACxB,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;oBACf,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,EAAE,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,SAAS,EAAE;4BAC9C,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE;4BACpD,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;yBAC5B;wBACD,QAAQ,EAAE,CAAC,IAAI,CAAC;qBACF;oBAChB,YAAY,EAAE,EAAE;iBACjB,CAAC;gBAEF,MAAM,MAAM,GAAG,IAAA,oCAA2B,EAAC,IAAI,CAAC,CAAC;gBAEjD,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAE/B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;gBACpD,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;gBAC9B,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACrC,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC7C,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEvC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;gBAC1D,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;gBACjC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACxC,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAE3C,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;gBAC5D,MAAM,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC;gBAClC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC1C,MAAM,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC9C,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;gBACrC,MAAM,IAAI,GAAc;oBACtB,IAAI,EAAE,WAAW;oBACjB,WAAW,EAAE,WAAW;oBACxB,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;oBACf,WAAW,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC1B,YAAY,EAAE,EAAE,CAAC,IAAI,EAAE;iBACxB,CAAC;gBAEF,MAAM,MAAM,GAAG,IAAA,oCAA2B,EAAC,IAAI,CAAC,CAAC;gBACjD,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACjC,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;gBACvC,MAAM,IAAI,GAAc;oBACtB,IAAI,EAAE,WAAW;oBACjB,WAAW,EAAE,WAAW;oBACxB,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;oBACf,WAAW,EAAE,EAAE,CAAC,MAAM,CAAC;wBACrB,IAAI,EAAE,EAAE;6BACL,MAAM,CAAC;4BACN,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE;4BACjB,KAAK,EAAE,EAAE,CAAC,MAAM,EAAE;yBACnB,CAAC;6BACD,QAAQ,CAAC,WAAW,CAAC;wBACxB,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC;4BACjB,MAAM,EAAE,EAAE,CAAC,OAAO,EAAE;yBACrB,CAAC;qBACH,CAAC;oBACF,YAAY,EAAE,EAAE,CAAC,IAAI,EAAE;iBACxB,CAAC;gBAEF,MAAM,MAAM,GAAG,IAAA,oCAA2B,EAAC,IAAI,CAAC,CAAC;gBAEjD,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAE/B,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;gBACxD,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;gBAChC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACvC,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;gBAEjD,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;gBAC9D,MAAM,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;gBACnC,MAAM,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC5C,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;gBAClC,MAAM,IAAI,GAAc;oBACtB,IAAI,EAAE,WAAW;oBACjB,WAAW,EAAE,WAAW;oBACxB,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;oBACf,WAAW,EAAE,EAAE,CAAC,MAAM,CAAC;wBACrB,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC;wBACpD,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;qBAChD,CAAC;oBACF,YAAY,EAAE,EAAE,CAAC,IAAI,EAAE;iBACxB,CAAC;gBAEF,MAAM,MAAM,GAAG,IAAA,oCAA2B,EAAC,IAAI,CAAC,CAAC;gBAEjD,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAE/B,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;gBACxD,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;gBAChC,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACtC,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;gBAEpD,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;gBAC1D,MAAM,CAAC,UAAU,CAAC,CAAC,WAAW,EAAE,CAAC;gBACjC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACzC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;YAC/C,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;gBACjC,MAAM,IAAI,GAAc;oBACtB,IAAI,EAAE,WAAW;oBACjB,WAAW,EAAE,WAAW;oBACxB,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;oBACf,WAAW,EAAE,EAAE,CAAC,MAAM,CAAC;wBACrB,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;wBACnD,QAAQ,EAAE,EAAE;6BACT,IAAI,CAAC,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;6BAC/B,QAAQ,CAAC,eAAe,CAAC;qBAC7B,CAAC;oBACF,YAAY,EAAE,EAAE,CAAC,IAAI,EAAE;iBACxB,CAAC;gBAEF,MAAM,MAAM,GAAG,IAAA,oCAA2B,EAAC,IAAI,CAAC,CAAC;gBAEjD,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAE/B,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;gBAC5D,MAAM,CAAC,WAAW,CAAC,CAAC,WAAW,EAAE,CAAC;gBAClC,MAAM,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACzC,MAAM,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAE3C,MAAM,aAAa,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC;gBAChE,MAAM,CAAC,aAAa,CAAC,CAAC,WAAW,EAAE,CAAC;gBACpC,MAAM,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBAC3C,MAAM,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;YAC3D,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;gBACrC,MAAM,IAAI,GAAc;oBACtB,IAAI,EAAE,WAAW;oBACjB,WAAW,EAAE,WAAW;oBACxB,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;oBACf,WAAW,EAAE,EAAE,CAAC,MAAM,CAAC;wBACrB,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,eAAe,CAAC;wBACtD,KAAK,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;qBAC9B,CAAC;oBACF,YAAY,EAAE,EAAE,CAAC,IAAI,EAAE;iBACxB,CAAC;gBAEF,MAAM,MAAM,GAAG,IAAA,oCAA2B,EAAC,IAAI,CAAC,CAAC;gBAEjD,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAE/B,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;gBACxD,MAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;gBAChC,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;gBACrD,2EAA2E;gBAC3E,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;gBACjE,MAAM,IAAI,GAAc;oBACtB,IAAI,EAAE,WAAW;oBACjB,WAAW,EAAE,WAAW;oBACxB,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;oBACf,WAAW,EAAE,EAAE,CAAC,MAAM,CAAC;wBACrB,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC;4BAChB,QAAQ,EAAE,EAAE,CAAC,MAAM,CAAC;gCAClB,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE;gCACjB,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;6BAC7B,CAAC;yBACH,CAAC;qBACH,CAAC;oBACF,YAAY,EAAE,EAAE,CAAC,IAAI,EAAE;iBACxB,CAAC;gBAEF,MAAM,MAAM,GAAG,IAAA,oCAA2B,EAAC,IAAI,CAAC,CAAC;gBAEjD,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACtC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACtC,6CAA6C;gBAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC;YACxD,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;gBAC9D,MAAM,IAAI,GAAc;oBACtB,IAAI,EAAE,WAAW;oBACjB,WAAW,EAAE,WAAW;oBACxB,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;oBACf,WAAW,EAAE,EAAE,CAAC,MAAM,CAAC;wBACrB,SAAS,EAAE,EAAE,CAAC,MAAM,EAAE;wBACtB,SAAS,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;wBACjC,SAAS,EAAE,EAAE,CAAC,MAAM,EAAE;qBACvB,CAAC;oBACF,YAAY,EAAE,EAAE,CAAC,IAAI,EAAE;iBACxB,CAAC;gBAEF,MAAM,MAAM,GAAG,IAAA,oCAA2B,EAAC,IAAI,CAAC,CAAC;gBAEjD,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAE/B,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;gBAC7D,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;gBAC7D,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC;gBAE7D,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACzC,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC1C,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;YAC7C,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;gBAC/D,sFAAsF;gBACtF,MAAM,IAAI,GAAc;oBACtB,IAAI,EAAE,WAAW;oBACjB,WAAW,EAAE,WAAW;oBACxB,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;oBACf,WAAW,EAAE,gBAAuB,EAAE,qBAAqB;oBAC3D,YAAY,EAAE,EAAE,CAAC,IAAI,EAAE;iBACxB,CAAC;gBAEF,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,EAAE,CAAC;gBACpE,MAAM,MAAM,GAAG,IAAA,oCAA2B,EAAC,IAAI,CAAC,CAAC;gBACjD,UAAU,CAAC,WAAW,EAAE,CAAC;gBAEzB,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC7B,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;gBACtD,iEAAiE;gBACjE,MAAM,IAAI,GAAc;oBACtB,IAAI,EAAE,WAAW;oBACjB,WAAW,EAAE,WAAW;oBACxB,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;oBACf,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,sBAAsB;qBACR;oBAChB,YAAY,EAAE,EAAE,CAAC,IAAI,EAAE;iBACxB,CAAC;gBAEF,MAAM,MAAM,GAAG,IAAA,oCAA2B,EAAC,IAAI,CAAC,CAAC;gBACjD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC7B,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;gBAC7D,kDAAkD;gBAClD,MAAM,IAAI,GAAc;oBACtB,IAAI,EAAE,WAAW;oBACjB,WAAW,EAAE,WAAW;oBACxB,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;oBACf,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,iBAAiB;4BAC3C,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,iBAAiB;yBAC3C;qBACa;oBAChB,YAAY,EAAE,EAAE,CAAC,IAAI,EAAE;iBACxB,CAAC;gBAEF,MAAM,MAAM,GAAG,IAAA,oCAA2B,EAAC,IAAI,CAAC,CAAC;gBAEjD,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACvC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACzC,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;gBAC7D,6FAA6F;gBAC7F,MAAM,IAAI,GAAc;oBACtB,IAAI,EAAE,WAAW;oBACjB,WAAW,EAAE,WAAW;oBACxB,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE;oBACf,WAAW,EAAE;wBACX,IAAI,EAAE,QAAQ;wBACd,UAAU,EAAE;4BACV,iEAAiE;4BACjE,KAAK,EAAE,IAAI;yBACL;qBACM;oBAChB,YAAY,EAAE,EAAE,CAAC,IAAI,EAAE;iBACxB,CAAC;gBAEF,MAAM,MAAM,GAAG,IAAA,oCAA2B,EAAC,IAAI,CAAC,CAAC;gBAEjD,MAAM,CAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;gBAC/B,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACrC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACvC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,sDAAsD,EAAE,GAAG,EAAE;YAC9D,MAAM,UAAU,GAAgB;gBAC9B,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE;oBACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;iBACzB;aACF,CAAC;YAEF,MAAM,MAAM,GAAG,IAAA,2BAAkB,EAAC,UAAU,CAAC,CAAC;YAC9C,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,iBAAiB;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,SAAS,GAAG,EAAE,CAAC,MAAM,CAAC;gBAC1B,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE;gBACjB,KAAK,EAAE,EAAE,CAAC,MAAM,EAAE;aACnB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,IAAA,2BAAkB,EAAC,SAAS,CAAC,CAAC;YAE7C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CACpB,MAAM,CAAC,gBAAgB,CAAC;gBACtB,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,MAAM,CAAC,gBAAgB,CAAC;oBAClC,IAAI,EAAE,MAAM,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;oBACjD,KAAK,EAAE,MAAM,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;iBACnD,CAAC;aACH,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;YAC9C,MAAM,SAAS,GAAG,EAAE,CAAC,MAAM,CAAC;gBAC1B,KAAK,EAAE,EAAE,CAAC,MAAM,EAAE;aACnB,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,IAAA,2BAAkB,EAAC,SAAS,CAAC,CAAC;YAE7C,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CACpB,MAAM,CAAC,gBAAgB,CAAC;gBACtB,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,MAAM,CAAC,gBAAgB,CAAC;oBAClC,KAAK,EAAE,MAAM,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;iBACnD,CAAC;aACH,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,wBAAwB,EAAE,GAAG,EAAE;QACtC,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;YAC3C,MAAM,CAAC,IAAA,+BAAsB,EAAC,IAAI,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QACvD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,MAAM,CAAC,IAAA,+BAAsB,EAAC,SAAS,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,MAAM,SAAS,GAAG,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YACnD,MAAM,MAAM,GAAG,IAAA,+BAAsB,EAAC,SAAS,CAAC,CAAC;YAEjD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CACpB,MAAM,CAAC,gBAAgB,CAAC;gBACtB,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,MAAM,CAAC,gBAAgB,CAAC;oBAClC,IAAI,EAAE,MAAM,CAAC,gBAAgB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;iBAClD,CAAC;aACH,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;YAChE,8EAA8E;YAC9E,MAAM,YAAY,GAAG;gBACnB,WAAW,EAAE;oBACX,OAAO,EAAE,CAAC;oBACV,MAAM,EAAE,QAAQ;oBAChB,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;iBAChC;aACF,CAAC;YAEF,MAAM,OAAO,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;YAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,EAAE,CAAC;YAErE,MAAM,MAAM,GAAG,IAAA,+BAAsB,EAAC,YAAmB,EAAE,OAAO,CAAC,CAAC;YAEpE,UAAU,CAAC,WAAW,EAAE,CAAC;YAEzB,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,CAAC;YAC/B,MAAM,CAAC,OAAO,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACrC,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,MAAM,YAAY,GAAG;gBACnB,WAAW,EAAE;oBACX,OAAO,EAAE,CAAC;oBACV,MAAM,EAAE,QAAQ;oBAChB,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;iBAChC;aACF,CAAC;YAEF,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,EAAE,CAAC;YAErE,IAAA,+BAAsB,EAAC,YAAmB,CAAC,CAAC;YAE5C,MAAM,CAAC,UAAU,CAAC,CAAC,oBAAoB,CACrC,yCAAyC,EACzC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAClB,CAAC;YAEF,UAAU,CAAC,WAAW,EAAE,CAAC;QAC3B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import type { JSONSchema7 } from \"json-schema\";\nimport * as z3 from \"zod/v3\";\nimport * as z4 from \"zod/v4\";\nimport { TamboTool } from \"../model/component-metadata\";\nimport { looksLikeJSONSchema } from \"./json-schema\";\nimport {\n getParametersFromToolSchema,\n safeSchemaToJsonSchema,\n schemaToJsonSchema,\n} from \"./schema\";\nimport { isStandardSchema } from \"./standard-schema\";\n\ndescribe(\"schema utilities\", () => {\n describe(\"looksLikeJSONSchema\", () => {\n it(\"returns true for a basic JSON Schema object\", () => {\n const jsonSchema: JSONSchema7 = {\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n age: { type: \"integer\" },\n },\n required: [\"name\"],\n };\n\n expect(looksLikeJSONSchema(jsonSchema)).toBe(true);\n });\n\n it(\"returns true for a union type JSON Schema\", () => {\n const jsonSchema: JSONSchema7 = {\n type: [\"string\", \"null\"],\n };\n\n expect(looksLikeJSONSchema(jsonSchema)).toBe(true);\n });\n\n it(\"returns false for Standard Schema validators\", () => {\n const zodSchema = z4.object({\n name: z4.string(),\n });\n\n expect(isStandardSchema(zodSchema)).toBe(true);\n expect(looksLikeJSONSchema(zodSchema)).toBe(false);\n });\n\n it(\"returns false for arbitrary objects that do not resemble JSON Schema\", () => {\n const notSchema = {\n type: \"foo\",\n other: \"bar\",\n };\n\n expect(looksLikeJSONSchema(notSchema)).toBe(false);\n });\n });\n\n describe(\"getParametersFromToolSchema\", () => {\n describe(\"inputSchema interface (object schemas)\", () => {\n it(\"extracts parameters from Zod 4 object schema properties\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: z4.object({\n query: z4.string().describe(\"Search query\"),\n limit: z4.number().describe(\"Max results\"),\n enabled: z4.boolean().optional().describe(\"Whether enabled\"),\n }),\n outputSchema: z4.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(3);\n\n const queryParam = params.find((p) => p.name === \"query\");\n expect(queryParam).toBeDefined();\n expect(queryParam?.type).toBe(\"string\");\n expect(queryParam?.description).toBe(\"Search query\");\n expect(queryParam?.isRequired).toBe(true);\n\n const limitParam = params.find((p) => p.name === \"limit\");\n expect(limitParam).toBeDefined();\n expect(limitParam?.type).toBe(\"number\");\n expect(limitParam?.description).toBe(\"Max results\");\n expect(limitParam?.isRequired).toBe(true);\n\n const enabledParam = params.find((p) => p.name === \"enabled\");\n expect(enabledParam).toBeDefined();\n expect(enabledParam?.type).toBe(\"boolean\");\n // Optional fields are not required\n expect(enabledParam?.isRequired).toBe(false);\n });\n\n it(\"extracts parameters from Zod 3 object schema properties\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: z3.object({\n name: z3.string().describe(\"User name\"),\n age: z3.number().optional(),\n }),\n outputSchema: z3.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(2);\n\n const nameParam = params.find((p) => p.name === \"name\");\n expect(nameParam).toBeDefined();\n expect(nameParam?.type).toBe(\"string\");\n expect(nameParam?.isRequired).toBe(true);\n\n const ageParam = params.find((p) => p.name === \"age\");\n expect(ageParam).toBeDefined();\n expect(ageParam?.type).toBe(\"number\");\n expect(ageParam?.isRequired).toBe(false);\n });\n\n it(\"extracts parameters from JSON Schema object properties\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: {\n type: \"object\",\n properties: {\n id: { type: \"string\", description: \"Item ID\" },\n count: { type: \"number\", description: \"Item count\" },\n active: { type: \"boolean\" },\n },\n required: [\"id\"],\n } as JSONSchema7,\n outputSchema: {},\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(3);\n\n const idParam = params.find((p) => p.name === \"id\");\n expect(idParam).toBeDefined();\n expect(idParam?.type).toBe(\"string\");\n expect(idParam?.description).toBe(\"Item ID\");\n expect(idParam?.isRequired).toBe(true);\n\n const countParam = params.find((p) => p.name === \"count\");\n expect(countParam).toBeDefined();\n expect(countParam?.type).toBe(\"number\");\n expect(countParam?.isRequired).toBe(false);\n\n const activeParam = params.find((p) => p.name === \"active\");\n expect(activeParam).toBeDefined();\n expect(activeParam?.type).toBe(\"boolean\");\n expect(activeParam?.isRequired).toBe(false);\n });\n\n it(\"handles empty object schema\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: z4.object({}),\n outputSchema: z4.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n expect(params).toHaveLength(0);\n });\n\n it(\"handles nested object schemas\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: z4.object({\n user: z4\n .object({\n name: z4.string(),\n email: z4.string(),\n })\n .describe(\"User info\"),\n options: z4.object({\n notify: z4.boolean(),\n }),\n }),\n outputSchema: z4.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(2);\n\n const userParam = params.find((p) => p.name === \"user\");\n expect(userParam).toBeDefined();\n expect(userParam?.type).toBe(\"object\");\n expect(userParam?.description).toBe(\"User info\");\n\n const optionsParam = params.find((p) => p.name === \"options\");\n expect(optionsParam).toBeDefined();\n expect(optionsParam?.type).toBe(\"object\");\n });\n\n it(\"handles array properties\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: z4.object({\n tags: z4.array(z4.string()).describe(\"List of tags\"),\n items: z4.array(z4.object({ id: z4.number() })),\n }),\n outputSchema: z4.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(2);\n\n const tagsParam = params.find((p) => p.name === \"tags\");\n expect(tagsParam).toBeDefined();\n expect(tagsParam?.type).toBe(\"array\");\n expect(tagsParam?.description).toBe(\"List of tags\");\n\n const itemsParam = params.find((p) => p.name === \"items\");\n expect(itemsParam).toBeDefined();\n expect(itemsParam?.type).toBe(\"array\");\n });\n });\n\n describe(\"realistic inputSchema scenarios\", () => {\n it(\"handles enum properties\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: z4.object({\n status: z4.enum([\"pending\", \"active\", \"completed\"]),\n priority: z4\n .enum([\"low\", \"medium\", \"high\"])\n .describe(\"Task priority\"),\n }),\n outputSchema: z4.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(2);\n\n const statusParam = params.find((p) => p.name === \"status\");\n expect(statusParam).toBeDefined();\n expect(statusParam?.type).toBe(\"string\");\n expect(statusParam?.isRequired).toBe(true);\n\n const priorityParam = params.find((p) => p.name === \"priority\");\n expect(priorityParam).toBeDefined();\n expect(priorityParam?.type).toBe(\"string\");\n expect(priorityParam?.description).toBe(\"Task priority\");\n });\n\n it(\"handles nullable properties\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: z4.object({\n name: z4.string().nullable().describe(\"Optional name\"),\n count: z4.number().nullable(),\n }),\n outputSchema: z4.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(2);\n\n const nameParam = params.find((p) => p.name === \"name\");\n expect(nameParam).toBeDefined();\n expect(nameParam?.description).toBe(\"Optional name\");\n // Nullable fields are still required (they must be provided, even if null)\n expect(nameParam?.isRequired).toBe(true);\n });\n\n it(\"handles deeply nested schemas and preserves full schema\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: z4.object({\n config: z4.object({\n database: z4.object({\n host: z4.string(),\n port: z4.number().optional(),\n }),\n }),\n }),\n outputSchema: z4.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(1);\n expect(params[0].name).toBe(\"config\");\n expect(params[0].type).toBe(\"object\");\n // The full nested schema should be preserved\n expect(params[0].schema).toHaveProperty(\"properties\");\n });\n\n it(\"handles mixed required and optional fields correctly\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: z4.object({\n required1: z4.string(),\n optional1: z4.string().optional(),\n required2: z4.number(),\n }),\n outputSchema: z4.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(3);\n\n const required1 = params.find((p) => p.name === \"required1\");\n const optional1 = params.find((p) => p.name === \"optional1\");\n const required2 = params.find((p) => p.name === \"required2\");\n\n expect(required1?.isRequired).toBe(true);\n expect(optional1?.isRequired).toBe(false);\n expect(required2?.isRequired).toBe(true);\n });\n });\n\n describe(\"edge cases and error handling\", () => {\n it(\"returns empty params when inputSchema is unknown type\", () => {\n // Create a tool with an invalid inputSchema that isn't Standard Schema or JSON Schema\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: \"invalid-schema\" as any, // Not a valid schema\n outputSchema: z4.void(),\n };\n\n const consoleSpy = jest.spyOn(console, \"warn\").mockImplementation();\n const params = getParametersFromToolSchema(tool);\n consoleSpy.mockRestore();\n\n expect(params).toEqual([]);\n });\n\n it(\"handles JSON Schema with no properties field\", () => {\n // Test the fallback: const properties = schema.properties ?? {};\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: {\n type: \"object\",\n // No properties field\n } as JSONSchema7,\n outputSchema: z4.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n expect(params).toEqual([]);\n });\n\n it(\"handles JSON Schema properties without descriptions\", () => {\n // Test the fallback: propSchema.description ?? \"\"\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: {\n type: \"object\",\n properties: {\n name: { type: \"string\" }, // No description\n age: { type: \"number\" }, // No description\n },\n } as JSONSchema7,\n outputSchema: z4.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(2);\n expect(params[0].description).toBe(\"\");\n expect(params[1].description).toBe(\"\");\n });\n\n it(\"handles JSON Schema with non-object property values\", () => {\n // Test the fallback: typeof propSchema === \"object\" && propSchema !== null ? propSchema : {}\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: {\n type: \"object\",\n properties: {\n // Properties can technically be boolean (for schema composition)\n weird: true,\n } as any,\n } as JSONSchema7,\n outputSchema: z4.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(1);\n expect(params[0].name).toBe(\"weird\");\n expect(params[0].schema).toEqual({});\n });\n });\n });\n\n describe(\"schemaToJsonSchema\", () => {\n it(\"returns JSON Schema as-is when already a JSON Schema\", () => {\n const jsonSchema: JSONSchema7 = {\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n },\n };\n\n const result = schemaToJsonSchema(jsonSchema);\n expect(result).toBe(jsonSchema); // Same reference\n });\n\n it(\"converts Zod 4 schema to JSON Schema\", () => {\n const zodSchema = z4.object({\n name: z4.string(),\n count: z4.number(),\n });\n\n const result = schemaToJsonSchema(zodSchema);\n\n expect(result).toEqual(\n expect.objectContaining({\n type: \"object\",\n properties: expect.objectContaining({\n name: expect.objectContaining({ type: \"string\" }),\n count: expect.objectContaining({ type: \"number\" }),\n }),\n }),\n );\n });\n\n it(\"converts Zod 3 schema to JSON Schema\", () => {\n const zodSchema = z3.object({\n title: z3.string(),\n });\n\n const result = schemaToJsonSchema(zodSchema);\n\n expect(result).toEqual(\n expect.objectContaining({\n type: \"object\",\n properties: expect.objectContaining({\n title: expect.objectContaining({ type: \"string\" }),\n }),\n }),\n );\n });\n });\n\n describe(\"safeSchemaToJsonSchema\", () => {\n it(\"returns undefined for null schema\", () => {\n expect(safeSchemaToJsonSchema(null)).toBeUndefined();\n });\n\n it(\"returns undefined for undefined schema\", () => {\n expect(safeSchemaToJsonSchema(undefined)).toBeUndefined();\n });\n\n it(\"converts valid schema successfully\", () => {\n const zodSchema = z4.object({ name: z4.string() });\n const result = safeSchemaToJsonSchema(zodSchema);\n\n expect(result).toEqual(\n expect.objectContaining({\n type: \"object\",\n properties: expect.objectContaining({\n name: expect.objectContaining({ type: \"string\" }),\n }),\n }),\n );\n });\n\n it(\"returns undefined and calls onError for invalid schema\", () => {\n // Create something that looks like a Standard Schema but will fail conversion\n const brokenSchema = {\n \"~standard\": {\n version: 1,\n vendor: \"broken\",\n validate: () => ({ value: {} }),\n },\n };\n\n const onError = jest.fn();\n const consoleSpy = jest.spyOn(console, \"error\").mockImplementation();\n\n const result = safeSchemaToJsonSchema(brokenSchema as any, onError);\n\n consoleSpy.mockRestore();\n\n expect(result).toBeUndefined();\n expect(onError).toHaveBeenCalled();\n });\n\n it(\"logs error to console when conversion fails\", () => {\n const brokenSchema = {\n \"~standard\": {\n version: 1,\n vendor: \"broken\",\n validate: () => ({ value: {} }),\n },\n };\n\n const consoleSpy = jest.spyOn(console, \"error\").mockImplementation();\n\n safeSchemaToJsonSchema(brokenSchema as any);\n\n expect(consoleSpy).toHaveBeenCalledWith(\n \"Error converting schema to JSON Schema:\",\n expect.any(Error),\n );\n\n consoleSpy.mockRestore();\n });\n });\n});\n"]}
@@ -1,4 +1,3 @@
1
- import { TamboToolWithToolSchema } from "../model/component-metadata";
2
1
  import { TamboComponent, TamboTool } from "../providers";
3
2
  /**
4
3
  * Serializes the registry for testing purposes.
@@ -9,12 +8,12 @@ import { TamboComponent, TamboTool } from "../providers";
9
8
  */
10
9
  export declare function serializeRegistry(mockRegistry: TamboComponent[]): {
11
10
  props: import("json-schema").JSONSchema7 | undefined;
12
- contextTools: import("../model/component-metadata").ComponentContextToolMetadata[] | undefined;
11
+ contextTools: import("..").ComponentContextToolMetadata[] | undefined;
13
12
  name: string;
14
13
  description: string;
15
14
  propsDefinition?: any;
16
15
  loadingComponent?: import("react").ComponentType<any>;
17
- annotations?: import("../model/component-metadata").ToolAnnotations;
16
+ annotations?: import("..").ToolAnnotations;
18
17
  }[];
19
18
  interface CreateMockToolOptions {
20
19
  inputSchema: TamboTool["inputSchema"];
@@ -29,14 +28,5 @@ interface CreateMockToolOptions {
29
28
  * @internal
30
29
  */
31
30
  export declare function createMockTool(schemaOrOptions: TamboTool["inputSchema"] | CreateMockToolOptions): TamboTool;
32
- /**
33
- * Creates a mock TamboToolWithToolSchema for testing purposes.
34
- * Does NOT adapt to inputSchema format - preserves the deprecated toolSchema interface.
35
- * @param toolSchema - The tool schema for the tool
36
- * @param maxCalls - Optional max calls override
37
- * @returns A mock TamboToolWithToolSchema instance (NOT adapted)
38
- * @internal
39
- */
40
- export declare function createMockToolWithToolSchema(toolSchema: TamboToolWithToolSchema["toolSchema"], maxCalls?: number): TamboToolWithToolSchema;
41
31
  export {};
42
32
  //# sourceMappingURL=tools.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/testing/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAOzD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,cAAc,EAAE;;;;;;;;IAiB/D;AAED,UAAU,qBAAqB;IAC7B,WAAW,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC;IACtC,YAAY,CAAC,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAGD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,eAAe,EAAE,SAAS,CAAC,aAAa,CAAC,GAAG,qBAAqB,GAChE,SAAS,CAoCX;AAGD;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,uBAAuB,CAAC,YAAY,CAAC,EACjD,QAAQ,CAAC,EAAE,MAAM,GAChB,uBAAuB,CAQzB"}
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../src/testing/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAIzD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,YAAY,EAAE,cAAc,EAAE;;;;;;;;IAiB/D;AAED,UAAU,qBAAqB;IAC7B,WAAW,EAAE,SAAS,CAAC,aAAa,CAAC,CAAC;IACtC,YAAY,CAAC,EAAE,SAAS,CAAC,cAAc,CAAC,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAGD;;;;;;GAMG;AACH,wBAAgB,cAAc,CAC5B,eAAe,EAAE,SAAS,CAAC,aAAa,CAAC,GAAG,qBAAqB,GAChE,SAAS,CAoCX"}
@@ -2,7 +2,6 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.serializeRegistry = serializeRegistry;
4
4
  exports.createMockTool = createMockTool;
5
- exports.createMockToolWithToolSchema = createMockToolWithToolSchema;
6
5
  const schema_1 = require("../schema");
7
6
  const registry_1 = require("../util/registry");
8
7
  /**
@@ -18,7 +17,7 @@ function serializeRegistry(mockRegistry) {
18
17
  props: (0, schema_1.isStandardSchema)(propsSchema)
19
18
  ? (0, schema_1.safeSchemaToJsonSchema)(propsSchema)
20
19
  : propsSchema,
21
- contextTools: associatedTools?.map((tool) => (0, registry_1.mapTamboToolToContextTool)((0, registry_1.adaptToolFromFnSchema)(tool))),
20
+ contextTools: associatedTools?.map((tool) => (0, registry_1.mapTamboToolToContextTool)(tool)),
22
21
  }));
23
22
  }
24
23
  // Helper to create a minimal TamboTool for testing
@@ -60,22 +59,4 @@ function createMockTool(schemaOrOptions) {
60
59
  outputSchema: { type: "object", properties: {} },
61
60
  };
62
61
  }
63
- // Helper to create a minimal TamboTool for testing -- uses toolSchema field as function instead of inputSchema
64
- /**
65
- * Creates a mock TamboToolWithToolSchema for testing purposes.
66
- * Does NOT adapt to inputSchema format - preserves the deprecated toolSchema interface.
67
- * @param toolSchema - The tool schema for the tool
68
- * @param maxCalls - Optional max calls override
69
- * @returns A mock TamboToolWithToolSchema instance (NOT adapted)
70
- * @internal
71
- */
72
- function createMockToolWithToolSchema(toolSchema, maxCalls) {
73
- return {
74
- name: "testTool",
75
- description: "A test tool",
76
- tool: jest.fn().mockImplementation(() => { }),
77
- toolSchema,
78
- ...(maxCalls !== undefined ? { maxCalls } : {}),
79
- };
80
- }
81
62
  //# sourceMappingURL=tools.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/testing/tools.ts"],"names":[],"mappings":";;AAeA,8CAiBC;AAgBD,wCAsCC;AAWD,oEAWC;AA1GD,sCAAqE;AACrE,+CAG0B;AAE1B;;;;;;GAMG;AACH,SAAgB,iBAAiB,CAAC,YAA8B;IAC9D,OAAO,YAAY,CAAC,GAAG,CACrB,CAAC,EACC,SAAS,EAAE,UAAU,EACrB,WAAW,EACX,eAAe,EACf,GAAG,cAAc,EAClB,EAAE,EAAE,CAAC,CAAC;QACL,GAAG,cAAc;QACjB,KAAK,EAAE,IAAA,yBAAgB,EAAC,WAAW,CAAC;YAClC,CAAC,CAAC,IAAA,+BAAsB,EAAC,WAAW,CAAC;YACrC,CAAC,CAAC,WAAW;QACf,YAAY,EAAE,eAAe,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAC1C,IAAA,oCAAyB,EAAC,IAAA,gCAAqB,EAAC,IAAI,CAAC,CAAC,CACvD;KACF,CAAC,CACH,CAAC;AACJ,CAAC;AAQD,mDAAmD;AACnD;;;;;;GAMG;AACH,SAAgB,cAAc,CAC5B,eAAiE;IAEjE,qCAAqC;IACrC,MAAM,sBAAsB,GAAG,CAC7B,GAAY,EACkB,EAAE;QAChC,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;YACvB,GAAG,KAAK,IAAI;YACZ,aAAa,IAAI,GAAG;YACpB,GAAG,CAAC,WAAW,IAAI,IAAI,CACxB,CAAC;IACJ,CAAC,CAAC;IAEF,IAAI,sBAAsB,CAAC,eAAe,CAAC,EAAE,CAAC;QAC5C,OAAO;YACL,IAAI,EAAE,UAAU;YAChB,WAAW,EAAE,yBAAyB;YACtC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;YAC5C,WAAW,EAAE,eAAe,CAAC,WAAW;YACxC,YAAY,EAAE,eAAe,CAAC,YAAY,IAAI;gBAC5C,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,EAAE;aACf;YACD,GAAG,CAAC,eAAe,CAAC,QAAQ,KAAK,SAAS;gBACxC,CAAC,CAAC,EAAE,QAAQ,EAAE,eAAe,CAAC,QAAQ,EAAE;gBACxC,CAAC,CAAC,EAAE,CAAC;SACR,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,yBAAyB;QACtC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;QAC5C,WAAW,EAAE,eAAe;QAC5B,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;KACjD,CAAC;AACJ,CAAC;AAED,+GAA+G;AAC/G;;;;;;;GAOG;AACH,SAAgB,4BAA4B,CAC1C,UAAiD,EACjD,QAAiB;IAEjB,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,aAAa;QAC1B,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;QAC5C,UAAU;QACV,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACrB,CAAC;AAC/B,CAAC","sourcesContent":["import { TamboToolWithToolSchema } from \"../model/component-metadata\";\nimport { TamboComponent, TamboTool } from \"../providers\";\nimport { isStandardSchema, safeSchemaToJsonSchema } from \"../schema\";\nimport {\n adaptToolFromFnSchema,\n mapTamboToolToContextTool,\n} from \"../util/registry\";\n\n/**\n * Serializes the registry for testing purposes.\n * Converts Standard Schema validators to JSON Schema format.\n * Uses the same logic as production code via mapTamboToolToContextTool.\n * @param mockRegistry - The registry to serialize\n * @returns The serialized registry with JSON Schema representations\n */\nexport function serializeRegistry(mockRegistry: TamboComponent[]) {\n return mockRegistry.map(\n ({\n component: _component,\n propsSchema,\n associatedTools,\n ...componentEntry\n }) => ({\n ...componentEntry,\n props: isStandardSchema(propsSchema)\n ? safeSchemaToJsonSchema(propsSchema)\n : propsSchema,\n contextTools: associatedTools?.map((tool) =>\n mapTamboToolToContextTool(adaptToolFromFnSchema(tool)),\n ),\n }),\n );\n}\n\ninterface CreateMockToolOptions {\n inputSchema: TamboTool[\"inputSchema\"];\n outputSchema?: TamboTool[\"outputSchema\"];\n maxCalls?: number;\n}\n\n// Helper to create a minimal TamboTool for testing\n/**\n * Creates a mock TamboTool with the given input schema for testing purposes.\n * Accepts either an inputSchema directly or an options object with inputSchema and outputSchema.\n * @param schemaOrOptions - The input schema or options object\n * @returns A mock TamboTool instance\n * @internal\n */\nexport function createMockTool(\n schemaOrOptions: TamboTool[\"inputSchema\"] | CreateMockToolOptions,\n): TamboTool {\n // Check if options object was passed\n const hasInputSchemaProperty = (\n obj: unknown,\n ): obj is CreateMockToolOptions => {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"inputSchema\" in obj &&\n obj.inputSchema != null\n );\n };\n\n if (hasInputSchemaProperty(schemaOrOptions)) {\n return {\n name: \"mockTool\",\n description: \"A mock tool for testing\",\n tool: jest.fn().mockImplementation(() => {}),\n inputSchema: schemaOrOptions.inputSchema,\n outputSchema: schemaOrOptions.outputSchema ?? {\n type: \"object\",\n properties: {},\n },\n ...(schemaOrOptions.maxCalls !== undefined\n ? { maxCalls: schemaOrOptions.maxCalls }\n : {}),\n };\n }\n\n return {\n name: \"mockTool\",\n description: \"A mock tool for testing\",\n tool: jest.fn().mockImplementation(() => {}),\n inputSchema: schemaOrOptions,\n outputSchema: { type: \"object\", properties: {} },\n };\n}\n\n// Helper to create a minimal TamboTool for testing -- uses toolSchema field as function instead of inputSchema\n/**\n * Creates a mock TamboToolWithToolSchema for testing purposes.\n * Does NOT adapt to inputSchema format - preserves the deprecated toolSchema interface.\n * @param toolSchema - The tool schema for the tool\n * @param maxCalls - Optional max calls override\n * @returns A mock TamboToolWithToolSchema instance (NOT adapted)\n * @internal\n */\nexport function createMockToolWithToolSchema(\n toolSchema: TamboToolWithToolSchema[\"toolSchema\"],\n maxCalls?: number,\n): TamboToolWithToolSchema {\n return {\n name: \"testTool\",\n description: \"A test tool\",\n tool: jest.fn().mockImplementation(() => {}),\n toolSchema,\n ...(maxCalls !== undefined ? { maxCalls } : {}),\n } as TamboToolWithToolSchema;\n}\n"]}
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../src/testing/tools.ts"],"names":[],"mappings":";;AAWA,8CAiBC;AAgBD,wCAsCC;AAjFD,sCAAqE;AACrE,+CAA6D;AAE7D;;;;;;GAMG;AACH,SAAgB,iBAAiB,CAAC,YAA8B;IAC9D,OAAO,YAAY,CAAC,GAAG,CACrB,CAAC,EACC,SAAS,EAAE,UAAU,EACrB,WAAW,EACX,eAAe,EACf,GAAG,cAAc,EAClB,EAAE,EAAE,CAAC,CAAC;QACL,GAAG,cAAc;QACjB,KAAK,EAAE,IAAA,yBAAgB,EAAC,WAAW,CAAC;YAClC,CAAC,CAAC,IAAA,+BAAsB,EAAC,WAAW,CAAC;YACrC,CAAC,CAAC,WAAW;QACf,YAAY,EAAE,eAAe,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAC1C,IAAA,oCAAyB,EAAC,IAAI,CAAC,CAChC;KACF,CAAC,CACH,CAAC;AACJ,CAAC;AAQD,mDAAmD;AACnD;;;;;;GAMG;AACH,SAAgB,cAAc,CAC5B,eAAiE;IAEjE,qCAAqC;IACrC,MAAM,sBAAsB,GAAG,CAC7B,GAAY,EACkB,EAAE;QAChC,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;YACvB,GAAG,KAAK,IAAI;YACZ,aAAa,IAAI,GAAG;YACpB,GAAG,CAAC,WAAW,IAAI,IAAI,CACxB,CAAC;IACJ,CAAC,CAAC;IAEF,IAAI,sBAAsB,CAAC,eAAe,CAAC,EAAE,CAAC;QAC5C,OAAO;YACL,IAAI,EAAE,UAAU;YAChB,WAAW,EAAE,yBAAyB;YACtC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;YAC5C,WAAW,EAAE,eAAe,CAAC,WAAW;YACxC,YAAY,EAAE,eAAe,CAAC,YAAY,IAAI;gBAC5C,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,EAAE;aACf;YACD,GAAG,CAAC,eAAe,CAAC,QAAQ,KAAK,SAAS;gBACxC,CAAC,CAAC,EAAE,QAAQ,EAAE,eAAe,CAAC,QAAQ,EAAE;gBACxC,CAAC,CAAC,EAAE,CAAC;SACR,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,WAAW,EAAE,yBAAyB;QACtC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC;QAC5C,WAAW,EAAE,eAAe;QAC5B,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;KACjD,CAAC;AACJ,CAAC","sourcesContent":["import { TamboComponent, TamboTool } from \"../providers\";\nimport { isStandardSchema, safeSchemaToJsonSchema } from \"../schema\";\nimport { mapTamboToolToContextTool } from \"../util/registry\";\n\n/**\n * Serializes the registry for testing purposes.\n * Converts Standard Schema validators to JSON Schema format.\n * Uses the same logic as production code via mapTamboToolToContextTool.\n * @param mockRegistry - The registry to serialize\n * @returns The serialized registry with JSON Schema representations\n */\nexport function serializeRegistry(mockRegistry: TamboComponent[]) {\n return mockRegistry.map(\n ({\n component: _component,\n propsSchema,\n associatedTools,\n ...componentEntry\n }) => ({\n ...componentEntry,\n props: isStandardSchema(propsSchema)\n ? safeSchemaToJsonSchema(propsSchema)\n : propsSchema,\n contextTools: associatedTools?.map((tool) =>\n mapTamboToolToContextTool(tool),\n ),\n }),\n );\n}\n\ninterface CreateMockToolOptions {\n inputSchema: TamboTool[\"inputSchema\"];\n outputSchema?: TamboTool[\"outputSchema\"];\n maxCalls?: number;\n}\n\n// Helper to create a minimal TamboTool for testing\n/**\n * Creates a mock TamboTool with the given input schema for testing purposes.\n * Accepts either an inputSchema directly or an options object with inputSchema and outputSchema.\n * @param schemaOrOptions - The input schema or options object\n * @returns A mock TamboTool instance\n * @internal\n */\nexport function createMockTool(\n schemaOrOptions: TamboTool[\"inputSchema\"] | CreateMockToolOptions,\n): TamboTool {\n // Check if options object was passed\n const hasInputSchemaProperty = (\n obj: unknown,\n ): obj is CreateMockToolOptions => {\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n \"inputSchema\" in obj &&\n obj.inputSchema != null\n );\n };\n\n if (hasInputSchemaProperty(schemaOrOptions)) {\n return {\n name: \"mockTool\",\n description: \"A mock tool for testing\",\n tool: jest.fn().mockImplementation(() => {}),\n inputSchema: schemaOrOptions.inputSchema,\n outputSchema: schemaOrOptions.outputSchema ?? {\n type: \"object\",\n properties: {},\n },\n ...(schemaOrOptions.maxCalls !== undefined\n ? { maxCalls: schemaOrOptions.maxCalls }\n : {}),\n };\n }\n\n return {\n name: \"mockTool\",\n description: \"A mock tool for testing\",\n tool: jest.fn().mockImplementation(() => {}),\n inputSchema: schemaOrOptions,\n outputSchema: { type: \"object\", properties: {} },\n };\n}\n"]}
@@ -1,4 +1,4 @@
1
1
  import TamboAI from "@tambo-ai/typescript-sdk";
2
- import { DeepPartial } from "ts-essentials";
3
- export type PartialTamboAI = DeepPartial<TamboAI>;
2
+ import type { PartialDeep } from "type-fest";
3
+ export type PartialTamboAI = PartialDeep<TamboAI>;
4
4
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/testing/types.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,0BAA0B,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C,MAAM,MAAM,cAAc,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/testing/types.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,0BAA0B,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,MAAM,cAAc,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/testing/types.ts"],"names":[],"mappings":"","sourcesContent":["import TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { DeepPartial } from \"ts-essentials\";\n\nexport type PartialTamboAI = DeepPartial<TamboAI>;\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/testing/types.ts"],"names":[],"mappings":"","sourcesContent":["import TamboAI from \"@tambo-ai/typescript-sdk\";\nimport type { PartialDeep } from \"type-fest\";\n\nexport type PartialTamboAI = PartialDeep<TamboAI>;\n"]}
@@ -1,10 +1,10 @@
1
- import type { TamboComponent, TamboTool, TamboToolWithToolSchema } from "../model/component-metadata";
1
+ import type { TamboComponent, TamboTool } from "../model/component-metadata";
2
2
  /**
3
3
  * Validates a tool before registration.
4
4
  * Throws an error if the tool is invalid.
5
5
  * @param tool - The tool to validate
6
6
  */
7
- export declare function validateTool(tool: TamboTool | TamboToolWithToolSchema): void;
7
+ export declare function validateTool(tool: unknown): asserts tool is TamboTool;
8
8
  /**
9
9
  * Validates a component and prepares its props for registration.
10
10
  * Throws an error if the component is invalid.
@@ -1 +1 @@
1
- {"version":3,"file":"registry-validators.d.ts","sourceRoot":"","sources":["../../src/util/registry-validators.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,cAAc,EACd,SAAS,EACT,uBAAuB,EACxB,MAAM,6BAA6B,CAAC;AAoDrC;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,GAAG,uBAAuB,GAAG,IAAI,CAiC5E;AA0CD;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,cAAc,GAAG;IACtE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC,CA6BA;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,OAAO,EACxB,UAAU,EAAE,OAAO,GAClB,IAAI,CAWN"}
1
+ {"version":3,"file":"registry-validators.d.ts","sourceRoot":"","sources":["../../src/util/registry-validators.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAkD7E;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,IAAI,SAAS,CAyErE;AA0CD;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,SAAS,EAAE,cAAc,GAAG;IACtE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC,CA6BA;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,MAAM,EACrB,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,OAAO,EACxB,UAAU,EAAE,OAAO,GAClB,IAAI,CAWN"}
@@ -4,7 +4,6 @@ exports.validateTool = validateTool;
4
4
  exports.validateAndPrepareComponent = validateAndPrepareComponent;
5
5
  exports.validateToolAssociation = validateToolAssociation;
6
6
  const schema_1 = require("../schema");
7
- const zod_1 = require("../schema/zod");
8
7
  const validate_component_name_1 = require("./validate-component-name");
9
8
  /**
10
9
  * Checks if a JSON Schema represents an object type.
@@ -50,28 +49,49 @@ function assertObjectSchema(schema, context) {
50
49
  * @param tool - The tool to validate
51
50
  */
52
51
  function validateTool(tool) {
53
- // Validate tool name
52
+ // Basic runtime type checks before narrowing
53
+ if (!tool || typeof tool !== "object") {
54
+ throw new Error("Tool must be an object");
55
+ }
56
+ // Extract name for error messages (before we know it's valid)
57
+ const toolName = "name" in tool && typeof tool.name === "string" ? tool.name : "<unknown>";
58
+ // Check for deprecated toolSchema - throw error with migration instructions
59
+ if ("toolSchema" in tool) {
60
+ throw new Error(`Tool "${toolName}" uses deprecated "toolSchema" property. ` +
61
+ `Migrate to "inputSchema" and "outputSchema" properties. ` +
62
+ `See migration guide: https://tambo.ai/docs/migration/toolschema`);
63
+ }
64
+ // Validate required properties exist
65
+ if (!("name" in tool) || typeof tool.name !== "string") {
66
+ throw new Error("Tool must have a 'name' property of type string");
67
+ }
68
+ if (!("description" in tool) || typeof tool.description !== "string") {
69
+ throw new Error(`Tool "${tool.name}" must have a 'description' property of type string`);
70
+ }
71
+ if (!("tool" in tool) || typeof tool.tool !== "function") {
72
+ throw new Error(`Tool "${tool.name}" must have a 'tool' property of type function`);
73
+ }
74
+ if (!("inputSchema" in tool)) {
75
+ throw new Error(`Tool "${tool.name}" must have an 'inputSchema' property`);
76
+ }
77
+ if (!("outputSchema" in tool)) {
78
+ throw new Error(`Tool "${tool.name}" must have an 'outputSchema' property`);
79
+ }
80
+ // Validate tool name format
54
81
  (0, validate_component_name_1.assertValidName)(tool.name, "tool");
55
- // Validate tool schemas
56
- // 1. check inputSchema
57
- if ("inputSchema" in tool && tool.inputSchema) {
58
- // inputSchema must be an object schema
82
+ // Validate tool schemas - inputSchema must be an object schema
83
+ if (tool.inputSchema) {
59
84
  assertObjectSchema(tool.inputSchema, `inputSchema of tool "${tool.name}"`);
60
85
  (0, schema_1.assertNoRecordSchema)(tool.inputSchema, `inputSchema of tool "${tool.name}"`);
61
86
  }
62
- // 2. check deprecated toolSchema
63
- else if ("toolSchema" in tool && tool.toolSchema) {
64
- let inputSchema = tool.toolSchema;
65
- // toolSchema may sometimes be a zod function schema, extract args if so
66
- if ((0, zod_1.isZodFunctionSchema)(tool.toolSchema)) {
67
- inputSchema = (0, schema_1.getZodFunctionArgs)(tool.toolSchema);
68
- }
69
- (0, schema_1.assertNoRecordSchema)(inputSchema, `toolSchema of tool "${tool.name}"`);
70
- }
71
87
  // Validate maxCalls if provided - must be a positive integer
72
- if ("maxCalls" in tool && tool.maxCalls !== undefined) {
88
+ if ("maxCalls" in tool &&
89
+ tool.maxCalls !== undefined &&
90
+ tool.maxCalls !== null) {
73
91
  const maxCalls = tool.maxCalls;
74
- if (!Number.isInteger(maxCalls) || maxCalls < 0) {
92
+ if (typeof maxCalls !== "number" ||
93
+ !Number.isInteger(maxCalls) ||
94
+ maxCalls < 0) {
75
95
  throw new Error(`maxCalls for tool "${tool.name}" must be a positive integer`);
76
96
  }
77
97
  }
@@ -1 +1 @@
1
- {"version":3,"file":"registry-validators.js","sourceRoot":"","sources":["../../src/util/registry-validators.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JSONSchema7 } from \"json-schema\";\nimport type {\n TamboComponent,\n TamboTool,\n TamboToolWithToolSchema,\n} from \"../model/component-metadata\";\nimport {\n assertNoRecordSchema,\n getZodFunctionArgs,\n isStandardSchema,\n looksLikeJSONSchema,\n schemaToJsonSchema,\n} from \"../schema\";\nimport { isZodFunctionSchema } from \"../schema/zod\";\nimport { assertValidName } from \"./validate-component-name\";\n\n/**\n * Checks if a JSON Schema represents an object type.\n * @param schema - The JSON Schema to check\n * @returns True if the schema is an object type\n */\nfunction isObjectSchema(schema: JSONSchema7): boolean {\n return schema.type === \"object\" || schema.properties !== undefined;\n}\n\n/**\n * Validates that a schema is an object type.\n * Throws an error if it's not.\n * @param schema - The schema to validate (Standard Schema or JSON Schema)\n * @param context - Description of where the schema is used (for error messages)\n */\nfunction assertObjectSchema(schema: unknown, context: string): void {\n let jsonSchema: JSONSchema7;\n\n if (isStandardSchema(schema)) {\n try {\n jsonSchema = schemaToJsonSchema(schema);\n } catch {\n // If conversion fails, we can't validate - let it fail later\n return;\n }\n } else if (looksLikeJSONSchema(schema)) {\n jsonSchema = schema;\n } else {\n // Unknown schema type, can't validate\n return;\n }\n\n if (!isObjectSchema(jsonSchema)) {\n throw new Error(\n `${context} must be an object schema (e.g., z.object({...})). ` +\n `Received type: \"${jsonSchema.type ?? \"unknown\"}\". ` +\n `Tool parameters are passed as a single object argument.`,\n );\n }\n}\n\n/**\n * Validates a tool before registration.\n * Throws an error if the tool is invalid.\n * @param tool - The tool to validate\n */\nexport function validateTool(tool: TamboTool | TamboToolWithToolSchema): void {\n // Validate tool name\n assertValidName(tool.name, \"tool\");\n\n // Validate tool schemas\n // 1. check inputSchema\n if (\"inputSchema\" in tool && tool.inputSchema) {\n // inputSchema must be an object schema\n assertObjectSchema(tool.inputSchema, `inputSchema of tool \"${tool.name}\"`);\n assertNoRecordSchema(\n tool.inputSchema,\n `inputSchema of tool \"${tool.name}\"`,\n );\n }\n // 2. check deprecated toolSchema\n else if (\"toolSchema\" in tool && tool.toolSchema) {\n let inputSchema = tool.toolSchema;\n // toolSchema may sometimes be a zod function schema, extract args if so\n if (isZodFunctionSchema(tool.toolSchema)) {\n inputSchema = getZodFunctionArgs(tool.toolSchema);\n }\n assertNoRecordSchema(inputSchema, `toolSchema of tool \"${tool.name}\"`);\n }\n\n // Validate maxCalls if provided - must be a positive integer\n if (\"maxCalls\" in tool && tool.maxCalls !== undefined) {\n const maxCalls = tool.maxCalls;\n if (!Number.isInteger(maxCalls) || maxCalls < 0) {\n throw new Error(\n `maxCalls for tool \"${tool.name}\" must be a positive integer`,\n );\n }\n }\n}\n\n/**\n * Converts a props schema to a serialized JSON Schema format.\n * @param propsDefinition - Deprecated: legacy props definition (will log warning)\n * @param propsSchema - The props schema (Standard Schema or JSON Schema)\n * @param name - Component/tool name for error messages\n * @returns Serialized JSON Schema object\n */\nfunction getSerializedProps(\n propsDefinition: unknown,\n propsSchema: unknown,\n name: string,\n): Record<string, unknown> {\n if (propsDefinition) {\n console.warn(`propsDefinition is deprecated. Use propsSchema instead.`);\n return propsDefinition as Record<string, unknown>;\n }\n\n // Check for Standard Schema (Zod, Valibot, ArkType, etc.)\n if (isStandardSchema(propsSchema)) {\n try {\n return schemaToJsonSchema(propsSchema) as Record<string, unknown>;\n } catch (error) {\n console.error(\n `Error converting ${name} props schema to JSON Schema:`,\n error,\n );\n throw new Error(\n `Error converting ${name} props schema to JSON Schema: ${error}`,\n );\n }\n }\n\n // Check for JSON Schema\n if (looksLikeJSONSchema(propsSchema)) {\n return propsSchema as Record<string, unknown>;\n }\n\n throw new Error(`Invalid props schema for ${name}`);\n}\n\n/**\n * Validates a component and prepares its props for registration.\n * Throws an error if the component is invalid.\n * @param component - The component to validate and prepare\n * @returns Object containing the serialized props\n */\nexport function validateAndPrepareComponent(component: TamboComponent): {\n props: Record<string, unknown>;\n} {\n const { name, propsSchema, propsDefinition } = component;\n\n // Validate component name\n assertValidName(name, \"component\");\n\n // Validate that at least one props definition is provided\n if (!propsSchema && !propsDefinition) {\n throw new Error(\n `Component ${name} must have either propsSchema (recommended) or propsDefinition defined`,\n );\n }\n\n // Validate that only one props definition is provided\n if (propsSchema && propsDefinition) {\n throw new Error(\n `Component ${name} cannot have both propsSchema and propsDefinition defined. Use only one. We recommend using propsSchema.`,\n );\n }\n\n // Validate that the propsSchema does not include record types\n if (propsSchema) {\n assertNoRecordSchema(propsSchema, `propsSchema of component \"${name}\"`);\n }\n\n // Convert propsSchema to JSON Schema if it exists\n const props = getSerializedProps(propsDefinition, propsSchema, name);\n\n return { props };\n}\n\n/**\n * Validates a tool association between a component and tool.\n * Throws an error if the association is invalid.\n * @param componentName - The component name\n * @param toolName - The tool name\n * @param componentExists - Whether the component exists in the registry\n * @param toolExists - Whether the tool exists in the registry\n */\nexport function validateToolAssociation(\n componentName: string,\n toolName: string,\n componentExists: boolean,\n toolExists: boolean,\n): void {\n // Validate component and tool names\n assertValidName(componentName, \"component\");\n assertValidName(toolName, \"tool\");\n\n if (!componentExists) {\n throw new Error(`Component ${componentName} not found in registry`);\n }\n if (!toolExists) {\n throw new Error(`Tool ${toolName} not found in registry`);\n }\n}\n"]}
1
+ {"version":3,"file":"registry-validators.js","sourceRoot":"","sources":["../../src/util/registry-validators.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JSONSchema7 } from \"json-schema\";\nimport type { TamboComponent, TamboTool } from \"../model/component-metadata\";\nimport {\n assertNoRecordSchema,\n isStandardSchema,\n looksLikeJSONSchema,\n schemaToJsonSchema,\n} from \"../schema\";\nimport { assertValidName } from \"./validate-component-name\";\n\n/**\n * Checks if a JSON Schema represents an object type.\n * @param schema - The JSON Schema to check\n * @returns True if the schema is an object type\n */\nfunction isObjectSchema(schema: JSONSchema7): boolean {\n return schema.type === \"object\" || schema.properties !== undefined;\n}\n\n/**\n * Validates that a schema is an object type.\n * Throws an error if it's not.\n * @param schema - The schema to validate (Standard Schema or JSON Schema)\n * @param context - Description of where the schema is used (for error messages)\n */\nfunction assertObjectSchema(schema: unknown, context: string): void {\n let jsonSchema: JSONSchema7;\n\n if (isStandardSchema(schema)) {\n try {\n jsonSchema = schemaToJsonSchema(schema);\n } catch {\n // If conversion fails, we can't validate - let it fail later\n return;\n }\n } else if (looksLikeJSONSchema(schema)) {\n jsonSchema = schema;\n } else {\n // Unknown schema type, can't validate\n return;\n }\n\n if (!isObjectSchema(jsonSchema)) {\n throw new Error(\n `${context} must be an object schema (e.g., z.object({...})). ` +\n `Received type: \"${jsonSchema.type ?? \"unknown\"}\". ` +\n `Tool parameters are passed as a single object argument.`,\n );\n }\n}\n\n/**\n * Validates a tool before registration.\n * Throws an error if the tool is invalid.\n * @param tool - The tool to validate\n */\nexport function validateTool(tool: unknown): asserts tool is TamboTool {\n // Basic runtime type checks before narrowing\n if (!tool || typeof tool !== \"object\") {\n throw new Error(\"Tool must be an object\");\n }\n\n // Extract name for error messages (before we know it's valid)\n const toolName =\n \"name\" in tool && typeof tool.name === \"string\" ? tool.name : \"<unknown>\";\n\n // Check for deprecated toolSchema - throw error with migration instructions\n if (\"toolSchema\" in tool) {\n throw new Error(\n `Tool \"${toolName}\" uses deprecated \"toolSchema\" property. ` +\n `Migrate to \"inputSchema\" and \"outputSchema\" properties. ` +\n `See migration guide: https://tambo.ai/docs/migration/toolschema`,\n );\n }\n\n // Validate required properties exist\n if (!(\"name\" in tool) || typeof tool.name !== \"string\") {\n throw new Error(\"Tool must have a 'name' property of type string\");\n }\n\n if (!(\"description\" in tool) || typeof tool.description !== \"string\") {\n throw new Error(\n `Tool \"${tool.name}\" must have a 'description' property of type string`,\n );\n }\n\n if (!(\"tool\" in tool) || typeof tool.tool !== \"function\") {\n throw new Error(\n `Tool \"${tool.name}\" must have a 'tool' property of type function`,\n );\n }\n\n if (!(\"inputSchema\" in tool)) {\n throw new Error(`Tool \"${tool.name}\" must have an 'inputSchema' property`);\n }\n\n if (!(\"outputSchema\" in tool)) {\n throw new Error(`Tool \"${tool.name}\" must have an 'outputSchema' property`);\n }\n\n // Validate tool name format\n assertValidName(tool.name, \"tool\");\n\n // Validate tool schemas - inputSchema must be an object schema\n if (tool.inputSchema) {\n assertObjectSchema(tool.inputSchema, `inputSchema of tool \"${tool.name}\"`);\n assertNoRecordSchema(\n tool.inputSchema,\n `inputSchema of tool \"${tool.name}\"`,\n );\n }\n\n // Validate maxCalls if provided - must be a positive integer\n if (\n \"maxCalls\" in tool &&\n tool.maxCalls !== undefined &&\n tool.maxCalls !== null\n ) {\n const maxCalls = tool.maxCalls;\n if (\n typeof maxCalls !== \"number\" ||\n !Number.isInteger(maxCalls) ||\n maxCalls < 0\n ) {\n throw new Error(\n `maxCalls for tool \"${tool.name}\" must be a positive integer`,\n );\n }\n }\n}\n\n/**\n * Converts a props schema to a serialized JSON Schema format.\n * @param propsDefinition - Deprecated: legacy props definition (will log warning)\n * @param propsSchema - The props schema (Standard Schema or JSON Schema)\n * @param name - Component/tool name for error messages\n * @returns Serialized JSON Schema object\n */\nfunction getSerializedProps(\n propsDefinition: unknown,\n propsSchema: unknown,\n name: string,\n): Record<string, unknown> {\n if (propsDefinition) {\n console.warn(`propsDefinition is deprecated. Use propsSchema instead.`);\n return propsDefinition as Record<string, unknown>;\n }\n\n // Check for Standard Schema (Zod, Valibot, ArkType, etc.)\n if (isStandardSchema(propsSchema)) {\n try {\n return schemaToJsonSchema(propsSchema) as Record<string, unknown>;\n } catch (error) {\n console.error(\n `Error converting ${name} props schema to JSON Schema:`,\n error,\n );\n throw new Error(\n `Error converting ${name} props schema to JSON Schema: ${error}`,\n );\n }\n }\n\n // Check for JSON Schema\n if (looksLikeJSONSchema(propsSchema)) {\n return propsSchema as Record<string, unknown>;\n }\n\n throw new Error(`Invalid props schema for ${name}`);\n}\n\n/**\n * Validates a component and prepares its props for registration.\n * Throws an error if the component is invalid.\n * @param component - The component to validate and prepare\n * @returns Object containing the serialized props\n */\nexport function validateAndPrepareComponent(component: TamboComponent): {\n props: Record<string, unknown>;\n} {\n const { name, propsSchema, propsDefinition } = component;\n\n // Validate component name\n assertValidName(name, \"component\");\n\n // Validate that at least one props definition is provided\n if (!propsSchema && !propsDefinition) {\n throw new Error(\n `Component ${name} must have either propsSchema (recommended) or propsDefinition defined`,\n );\n }\n\n // Validate that only one props definition is provided\n if (propsSchema && propsDefinition) {\n throw new Error(\n `Component ${name} cannot have both propsSchema and propsDefinition defined. Use only one. We recommend using propsSchema.`,\n );\n }\n\n // Validate that the propsSchema does not include record types\n if (propsSchema) {\n assertNoRecordSchema(propsSchema, `propsSchema of component \"${name}\"`);\n }\n\n // Convert propsSchema to JSON Schema if it exists\n const props = getSerializedProps(propsDefinition, propsSchema, name);\n\n return { props };\n}\n\n/**\n * Validates a tool association between a component and tool.\n * Throws an error if the association is invalid.\n * @param componentName - The component name\n * @param toolName - The tool name\n * @param componentExists - Whether the component exists in the registry\n * @param toolExists - Whether the tool exists in the registry\n */\nexport function validateToolAssociation(\n componentName: string,\n toolName: string,\n componentExists: boolean,\n toolExists: boolean,\n): void {\n // Validate component and tool names\n assertValidName(componentName, \"component\");\n assertValidName(toolName, \"tool\");\n\n if (!componentExists) {\n throw new Error(`Component ${componentName} not found in registry`);\n }\n if (!toolExists) {\n throw new Error(`Tool ${toolName} not found in registry`);\n }\n}\n"]}
@@ -8,7 +8,8 @@ describe("validateTool", () => {
8
8
  name: "valid-tool-name",
9
9
  description: "A valid tool",
10
10
  tool: () => "result",
11
- toolSchema: v3_1.z.function().args().returns(v3_1.z.string()),
11
+ inputSchema: v3_1.z.object({ query: v3_1.z.string() }),
12
+ outputSchema: v3_1.z.string(),
12
13
  };
13
14
  expect(() => (0, registry_validators_1.validateTool)(tool)).not.toThrow();
14
15
  });
@@ -17,7 +18,8 @@ describe("validateTool", () => {
17
18
  name: "invalid tool name",
18
19
  description: "A tool",
19
20
  tool: () => "result",
20
- toolSchema: v3_1.z.function().args().returns(v3_1.z.string()),
21
+ inputSchema: v3_1.z.object({ query: v3_1.z.string() }),
22
+ outputSchema: v3_1.z.string(),
21
23
  };
22
24
  expect(() => (0, registry_validators_1.validateTool)(tool)).toThrow('tool "invalid tool name" must only contain letters, numbers, underscores, and hyphens.');
23
25
  });
@@ -26,46 +28,83 @@ describe("validateTool", () => {
26
28
  name: "tool@name",
27
29
  description: "A tool",
28
30
  tool: () => "result",
29
- toolSchema: v3_1.z.function().args().returns(v3_1.z.string()),
31
+ inputSchema: v3_1.z.object({ query: v3_1.z.string() }),
32
+ outputSchema: v3_1.z.string(),
30
33
  };
31
34
  expect(() => (0, registry_validators_1.validateTool)(tool)).toThrow('tool "tool@name" must only contain letters, numbers, underscores, and hyphens.');
32
35
  });
33
- it("should validate tool with valid Zod schema", () => {
36
+ it("should throw when deprecated toolSchema is used", () => {
34
37
  const tool = {
35
- name: "valid-tool",
36
- description: "A tool",
38
+ name: "deprecated-tool",
39
+ description: "A tool using deprecated API",
37
40
  tool: () => "result",
38
41
  toolSchema: v3_1.z.function().args().returns(v3_1.z.string()),
39
42
  };
40
- expect(() => (0, registry_validators_1.validateTool)(tool)).not.toThrow();
43
+ expect(() => (0, registry_validators_1.validateTool)(tool)).toThrow('Tool "deprecated-tool" uses deprecated "toolSchema" property.');
44
+ expect(() => (0, registry_validators_1.validateTool)(tool)).toThrow('Migrate to "inputSchema" and "outputSchema" properties.');
45
+ });
46
+ it("should throw when tool is not an object", () => {
47
+ expect(() => (0, registry_validators_1.validateTool)(null)).toThrow("Tool must be an object");
48
+ expect(() => (0, registry_validators_1.validateTool)(undefined)).toThrow("Tool must be an object");
49
+ expect(() => (0, registry_validators_1.validateTool)("string")).toThrow("Tool must be an object");
50
+ expect(() => (0, registry_validators_1.validateTool)(42)).toThrow("Tool must be an object");
41
51
  });
42
- it("should throw when tool schema contains z.record()", () => {
52
+ it("should throw when tool name is missing", () => {
43
53
  const tool = {
44
- name: "invalid-tool",
45
54
  description: "A tool",
46
55
  tool: () => "result",
47
- toolSchema: v3_1.z
48
- .function()
49
- .args(v3_1.z.object({
50
- metadata: v3_1.z.record(v3_1.z.string()),
51
- }))
52
- .returns(v3_1.z.string()),
56
+ inputSchema: v3_1.z.object({}),
57
+ outputSchema: v3_1.z.string(),
58
+ };
59
+ expect(() => (0, registry_validators_1.validateTool)(tool)).toThrow("Tool must have a 'name' property of type string");
60
+ });
61
+ it("should throw when tool description is missing", () => {
62
+ const tool = {
63
+ name: "my-tool",
64
+ tool: () => "result",
65
+ inputSchema: v3_1.z.object({}),
66
+ outputSchema: v3_1.z.string(),
67
+ };
68
+ expect(() => (0, registry_validators_1.validateTool)(tool)).toThrow("Tool \"my-tool\" must have a 'description' property of type string");
69
+ });
70
+ it("should throw when tool function is missing", () => {
71
+ const tool = {
72
+ name: "my-tool",
73
+ description: "A tool",
74
+ inputSchema: v3_1.z.object({}),
75
+ outputSchema: v3_1.z.string(),
53
76
  };
54
- expect(() => (0, registry_validators_1.validateTool)(tool)).toThrow('Record types (objects with dynamic keys) are not supported in toolSchema of tool "invalid-tool".');
77
+ expect(() => (0, registry_validators_1.validateTool)(tool)).toThrow("Tool \"my-tool\" must have a 'tool' property of type function");
55
78
  });
56
- it("should allow tool with JSON Schema (non-Zod)", () => {
79
+ it("should throw when inputSchema is missing", () => {
57
80
  const tool = {
58
- name: "tool-with-json-schema",
81
+ name: "my-tool",
59
82
  description: "A tool",
60
83
  tool: () => "result",
61
- toolSchema: {
62
- type: "object",
63
- properties: {
64
- query: { type: "string" },
65
- },
66
- },
84
+ outputSchema: v3_1.z.string(),
67
85
  };
68
- expect(() => (0, registry_validators_1.validateTool)(tool)).not.toThrow();
86
+ expect(() => (0, registry_validators_1.validateTool)(tool)).toThrow("Tool \"my-tool\" must have an 'inputSchema' property");
87
+ });
88
+ it("should throw when outputSchema is missing", () => {
89
+ const tool = {
90
+ name: "my-tool",
91
+ description: "A tool",
92
+ tool: () => "result",
93
+ inputSchema: v3_1.z.object({}),
94
+ };
95
+ expect(() => (0, registry_validators_1.validateTool)(tool)).toThrow("Tool \"my-tool\" must have an 'outputSchema' property");
96
+ });
97
+ it("should throw when inputSchema contains z.record()", () => {
98
+ const tool = {
99
+ name: "invalid-tool",
100
+ description: "A tool",
101
+ tool: () => "result",
102
+ inputSchema: v3_1.z.object({
103
+ metadata: v3_1.z.record(v3_1.z.string()),
104
+ }),
105
+ outputSchema: v3_1.z.string(),
106
+ };
107
+ expect(() => (0, registry_validators_1.validateTool)(tool)).toThrow('Record types (objects with dynamic keys) are not supported in inputSchema of tool "invalid-tool".');
69
108
  });
70
109
  it("should validate tool with inputSchema (new interface)", () => {
71
110
  const tool = {