@tambo-ai/react 0.68.0 → 0.69.1
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.
- package/README.md +1 -1
- package/dist/context-helpers/context-helpers.test.js +16 -4
- package/dist/context-helpers/context-helpers.test.js.map +1 -1
- package/dist/context-helpers/current-interactables-context-helper.d.ts +2 -2
- package/dist/context-helpers/current-interactables-context-helper.d.ts.map +1 -1
- package/dist/context-helpers/current-interactables-context-helper.js +31 -15
- package/dist/context-helpers/current-interactables-context-helper.js.map +1 -1
- package/dist/context-helpers/registry.d.ts +2 -2
- package/dist/context-helpers/registry.d.ts.map +1 -1
- package/dist/context-helpers/registry.js.map +1 -1
- package/dist/context-helpers/types.d.ts +2 -2
- package/dist/context-helpers/types.d.ts.map +1 -1
- package/dist/context-helpers/types.js.map +1 -1
- package/dist/hooks/use-message-images.test.js +174 -37
- package/dist/hooks/use-message-images.test.js.map +1 -1
- package/dist/hooks/use-tambo-voice.d.ts +1 -1
- package/dist/hooks/use-tambo-voice.js +1 -1
- package/dist/hooks/use-tambo-voice.js.map +1 -1
- package/dist/hooks/use-tambo-voice.test.d.ts +2 -0
- package/dist/hooks/use-tambo-voice.test.d.ts.map +1 -0
- package/dist/hooks/use-tambo-voice.test.js +239 -0
- package/dist/hooks/use-tambo-voice.test.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/elicitation.d.ts.map +1 -1
- package/dist/mcp/elicitation.js +12 -0
- package/dist/mcp/elicitation.js.map +1 -1
- package/dist/mcp/elicitation.test.js +8 -1
- package/dist/mcp/elicitation.test.js.map +1 -1
- package/dist/mcp/mcp-client.d.ts +6 -10
- package/dist/mcp/mcp-client.d.ts.map +1 -1
- package/dist/mcp/mcp-client.js.map +1 -1
- package/dist/mcp/mcp-hooks.d.ts +12 -60
- package/dist/mcp/mcp-hooks.d.ts.map +1 -1
- package/dist/mcp/mcp-hooks.js +90 -10
- package/dist/mcp/mcp-hooks.js.map +1 -1
- package/dist/mcp/mcp-hooks.test.js +423 -0
- package/dist/mcp/mcp-hooks.test.js.map +1 -1
- package/dist/mcp/tambo-mcp-provider.d.ts.map +1 -1
- package/dist/mcp/tambo-mcp-provider.js +3 -0
- package/dist/mcp/tambo-mcp-provider.js.map +1 -1
- package/dist/mcp/tambo-mcp-provider.test.js +37 -0
- package/dist/mcp/tambo-mcp-provider.test.js.map +1 -1
- package/dist/model/component-metadata.d.ts +53 -20
- package/dist/model/component-metadata.d.ts.map +1 -1
- package/dist/model/component-metadata.js.map +1 -1
- package/dist/model/tambo-interactable.d.ts +6 -0
- package/dist/model/tambo-interactable.d.ts.map +1 -1
- package/dist/model/tambo-interactable.js.map +1 -1
- package/dist/providers/index.d.ts +1 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/tambo-client-provider.d.ts +8 -0
- package/dist/providers/tambo-client-provider.d.ts.map +1 -1
- package/dist/providers/tambo-client-provider.js +10 -11
- package/dist/providers/tambo-client-provider.js.map +1 -1
- package/dist/providers/tambo-client-provider.test.d.ts +2 -0
- package/dist/providers/tambo-client-provider.test.d.ts.map +1 -0
- package/dist/providers/tambo-client-provider.test.js +208 -0
- package/dist/providers/tambo-client-provider.test.js.map +1 -0
- package/dist/providers/tambo-context-attachment-provider.d.ts +34 -92
- package/dist/providers/tambo-context-attachment-provider.d.ts.map +1 -1
- package/dist/providers/tambo-context-attachment-provider.js +62 -105
- package/dist/providers/tambo-context-attachment-provider.js.map +1 -1
- package/dist/providers/tambo-context-attachment-provider.test.js +229 -463
- package/dist/providers/tambo-context-attachment-provider.test.js.map +1 -1
- package/dist/providers/tambo-interactable-provider.d.ts +2 -0
- package/dist/providers/tambo-interactable-provider.d.ts.map +1 -1
- package/dist/providers/tambo-interactable-provider.js +29 -4
- package/dist/providers/tambo-interactable-provider.js.map +1 -1
- package/dist/providers/tambo-interactable-provider.test.js +1 -1
- package/dist/providers/tambo-interactable-provider.test.js.map +1 -1
- package/dist/providers/tambo-interactables-additional-context.test.js +2 -5
- package/dist/providers/tambo-interactables-additional-context.test.js.map +1 -1
- package/dist/providers/tambo-provider.d.ts +2 -3
- package/dist/providers/tambo-provider.d.ts.map +1 -1
- package/dist/providers/tambo-provider.js +5 -6
- package/dist/providers/tambo-provider.js.map +1 -1
- package/dist/providers/tambo-registry-provider.test.js +16 -0
- package/dist/providers/tambo-registry-provider.test.js.map +1 -1
- package/dist/providers/tambo-registry-schema-compat.test.js +31 -0
- package/dist/providers/tambo-registry-schema-compat.test.js.map +1 -1
- package/dist/providers/tambo-thread-input-provider.d.ts +1 -1
- package/dist/providers/tambo-thread-input-provider.d.ts.map +1 -1
- package/dist/providers/tambo-thread-input-provider.js +5 -1
- package/dist/providers/tambo-thread-input-provider.js.map +1 -1
- package/dist/providers/tambo-thread-provider-initial-messages.test.js +84 -2
- package/dist/providers/tambo-thread-provider-initial-messages.test.js.map +1 -1
- package/dist/providers/tambo-thread-provider.d.ts.map +1 -1
- package/dist/providers/tambo-thread-provider.js +56 -43
- package/dist/providers/tambo-thread-provider.js.map +1 -1
- package/dist/providers/tambo-thread-provider.test.js +456 -262
- package/dist/providers/tambo-thread-provider.test.js.map +1 -1
- package/dist/schema/json-schema.js +29 -29
- package/dist/schema/json-schema.js.map +1 -1
- package/dist/schema/schema.test.js +237 -0
- package/dist/schema/schema.test.js.map +1 -1
- package/dist/schema/standard-schema.d.ts +1 -0
- package/dist/schema/standard-schema.d.ts.map +1 -1
- package/dist/schema/standard-schema.js +18 -13
- package/dist/schema/standard-schema.js.map +1 -1
- package/dist/schema/standard-schema.test.d.ts +2 -0
- package/dist/schema/standard-schema.test.d.ts.map +1 -0
- package/dist/schema/standard-schema.test.js +165 -0
- package/dist/schema/standard-schema.test.js.map +1 -0
- package/dist/schema/validate.test.js +149 -0
- package/dist/schema/validate.test.js.map +1 -1
- package/dist/schema/zod.d.ts +7 -4
- package/dist/schema/zod.d.ts.map +1 -1
- package/dist/schema/zod.js +65 -22
- package/dist/schema/zod.js.map +1 -1
- package/dist/schema/zod.test.js +112 -0
- package/dist/schema/zod.test.js.map +1 -1
- package/dist/testing/tools.d.ts +4 -1
- package/dist/testing/tools.d.ts.map +1 -1
- package/dist/testing/tools.js +6 -1
- package/dist/testing/tools.js.map +1 -1
- package/dist/util/generate-component.d.ts.map +1 -1
- package/dist/util/generate-component.js +18 -3
- package/dist/util/generate-component.js.map +1 -1
- package/dist/util/generate-component.test.d.ts +2 -0
- package/dist/util/generate-component.test.d.ts.map +1 -0
- package/dist/util/generate-component.test.js +340 -0
- package/dist/util/generate-component.test.js.map +1 -0
- package/dist/util/is-promise.d.ts +9 -0
- package/dist/util/is-promise.d.ts.map +1 -0
- package/dist/util/is-promise.js +20 -0
- package/dist/util/is-promise.js.map +1 -0
- package/dist/util/is-promise.test.d.ts +2 -0
- package/dist/util/is-promise.test.d.ts.map +1 -0
- package/dist/util/is-promise.test.js +48 -0
- package/dist/util/is-promise.test.js.map +1 -0
- package/dist/util/query-utils.test.d.ts +2 -0
- package/dist/util/query-utils.test.d.ts.map +1 -0
- package/dist/util/query-utils.test.js +382 -0
- package/dist/util/query-utils.test.js.map +1 -0
- package/dist/util/registry-validators.d.ts.map +1 -1
- package/dist/util/registry-validators.js +7 -0
- package/dist/util/registry-validators.js.map +1 -1
- package/dist/util/registry-validators.test.js +57 -0
- package/dist/util/registry-validators.test.js.map +1 -1
- package/dist/util/registry.d.ts.map +1 -1
- package/dist/util/registry.js +9 -0
- package/dist/util/registry.js.map +1 -1
- package/dist/util/registry.test.js +323 -1
- package/dist/util/registry.test.js.map +1 -1
- package/dist/util/resource-validators.test.d.ts +2 -0
- package/dist/util/resource-validators.test.d.ts.map +1 -0
- package/dist/util/resource-validators.test.js +90 -0
- package/dist/util/resource-validators.test.js.map +1 -0
- package/dist/util/tool-caller.d.ts +2 -2
- package/dist/util/tool-caller.d.ts.map +1 -1
- package/dist/util/tool-caller.js +8 -8
- package/dist/util/tool-caller.js.map +1 -1
- package/dist/util/validate-component-name.test.d.ts +2 -0
- package/dist/util/validate-component-name.test.d.ts.map +1 -0
- package/dist/util/validate-component-name.test.js +35 -0
- package/dist/util/validate-component-name.test.js.map +1 -0
- package/esm/context-helpers/context-helpers.test.js +16 -4
- package/esm/context-helpers/context-helpers.test.js.map +1 -1
- package/esm/context-helpers/current-interactables-context-helper.d.ts +2 -2
- package/esm/context-helpers/current-interactables-context-helper.d.ts.map +1 -1
- package/esm/context-helpers/current-interactables-context-helper.js +31 -15
- package/esm/context-helpers/current-interactables-context-helper.js.map +1 -1
- package/esm/context-helpers/registry.d.ts +2 -2
- package/esm/context-helpers/registry.d.ts.map +1 -1
- package/esm/context-helpers/registry.js.map +1 -1
- package/esm/context-helpers/types.d.ts +2 -2
- package/esm/context-helpers/types.d.ts.map +1 -1
- package/esm/context-helpers/types.js.map +1 -1
- package/esm/hooks/use-message-images.test.js +174 -37
- package/esm/hooks/use-message-images.test.js.map +1 -1
- package/esm/hooks/use-tambo-voice.d.ts +1 -1
- package/esm/hooks/use-tambo-voice.js +1 -1
- package/esm/hooks/use-tambo-voice.js.map +1 -1
- package/esm/hooks/use-tambo-voice.test.d.ts +2 -0
- package/esm/hooks/use-tambo-voice.test.d.ts.map +1 -0
- package/esm/hooks/use-tambo-voice.test.js +234 -0
- package/esm/hooks/use-tambo-voice.test.js.map +1 -0
- package/esm/index.d.ts +2 -2
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js.map +1 -1
- package/esm/mcp/elicitation.d.ts.map +1 -1
- package/esm/mcp/elicitation.js +12 -0
- package/esm/mcp/elicitation.js.map +1 -1
- package/esm/mcp/elicitation.test.js +8 -1
- package/esm/mcp/elicitation.test.js.map +1 -1
- package/esm/mcp/mcp-client.d.ts +6 -10
- package/esm/mcp/mcp-client.d.ts.map +1 -1
- package/esm/mcp/mcp-client.js.map +1 -1
- package/esm/mcp/mcp-hooks.d.ts +12 -60
- package/esm/mcp/mcp-hooks.d.ts.map +1 -1
- package/esm/mcp/mcp-hooks.js +57 -10
- package/esm/mcp/mcp-hooks.js.map +1 -1
- package/esm/mcp/mcp-hooks.test.js +423 -0
- package/esm/mcp/mcp-hooks.test.js.map +1 -1
- package/esm/mcp/tambo-mcp-provider.d.ts.map +1 -1
- package/esm/mcp/tambo-mcp-provider.js +3 -0
- package/esm/mcp/tambo-mcp-provider.js.map +1 -1
- package/esm/mcp/tambo-mcp-provider.test.js +37 -0
- package/esm/mcp/tambo-mcp-provider.test.js.map +1 -1
- package/esm/model/component-metadata.d.ts +53 -20
- package/esm/model/component-metadata.d.ts.map +1 -1
- package/esm/model/component-metadata.js.map +1 -1
- package/esm/model/tambo-interactable.d.ts +6 -0
- package/esm/model/tambo-interactable.d.ts.map +1 -1
- package/esm/model/tambo-interactable.js.map +1 -1
- package/esm/providers/index.d.ts +1 -1
- package/esm/providers/index.d.ts.map +1 -1
- package/esm/providers/index.js.map +1 -1
- package/esm/providers/tambo-client-provider.d.ts +8 -0
- package/esm/providers/tambo-client-provider.d.ts.map +1 -1
- package/esm/providers/tambo-client-provider.js +11 -12
- package/esm/providers/tambo-client-provider.js.map +1 -1
- package/esm/providers/tambo-client-provider.test.d.ts +2 -0
- package/esm/providers/tambo-client-provider.test.d.ts.map +1 -0
- package/esm/providers/tambo-client-provider.test.js +203 -0
- package/esm/providers/tambo-client-provider.test.js.map +1 -0
- package/esm/providers/tambo-context-attachment-provider.d.ts +34 -92
- package/esm/providers/tambo-context-attachment-provider.d.ts.map +1 -1
- package/esm/providers/tambo-context-attachment-provider.js +63 -106
- package/esm/providers/tambo-context-attachment-provider.js.map +1 -1
- package/esm/providers/tambo-context-attachment-provider.test.js +230 -464
- package/esm/providers/tambo-context-attachment-provider.test.js.map +1 -1
- package/esm/providers/tambo-interactable-provider.d.ts +2 -0
- package/esm/providers/tambo-interactable-provider.d.ts.map +1 -1
- package/esm/providers/tambo-interactable-provider.js +29 -4
- package/esm/providers/tambo-interactable-provider.js.map +1 -1
- package/esm/providers/tambo-interactable-provider.test.js +1 -1
- package/esm/providers/tambo-interactable-provider.test.js.map +1 -1
- package/esm/providers/tambo-interactables-additional-context.test.js +2 -5
- package/esm/providers/tambo-interactables-additional-context.test.js.map +1 -1
- package/esm/providers/tambo-provider.d.ts +2 -3
- package/esm/providers/tambo-provider.d.ts.map +1 -1
- package/esm/providers/tambo-provider.js +5 -6
- package/esm/providers/tambo-provider.js.map +1 -1
- package/esm/providers/tambo-registry-provider.test.js +16 -0
- package/esm/providers/tambo-registry-provider.test.js.map +1 -1
- package/esm/providers/tambo-registry-schema-compat.test.js +31 -0
- package/esm/providers/tambo-registry-schema-compat.test.js.map +1 -1
- package/esm/providers/tambo-thread-input-provider.d.ts +1 -1
- package/esm/providers/tambo-thread-input-provider.d.ts.map +1 -1
- package/esm/providers/tambo-thread-input-provider.js +5 -1
- package/esm/providers/tambo-thread-input-provider.js.map +1 -1
- package/esm/providers/tambo-thread-provider-initial-messages.test.js +84 -2
- package/esm/providers/tambo-thread-provider-initial-messages.test.js.map +1 -1
- package/esm/providers/tambo-thread-provider.d.ts.map +1 -1
- package/esm/providers/tambo-thread-provider.js +56 -43
- package/esm/providers/tambo-thread-provider.js.map +1 -1
- package/esm/providers/tambo-thread-provider.test.js +456 -262
- package/esm/providers/tambo-thread-provider.test.js.map +1 -1
- package/esm/schema/json-schema.js +1 -1
- package/esm/schema/json-schema.js.map +1 -1
- package/esm/schema/schema.test.js +238 -1
- package/esm/schema/schema.test.js.map +1 -1
- package/esm/schema/standard-schema.d.ts +1 -0
- package/esm/schema/standard-schema.d.ts.map +1 -1
- package/esm/schema/standard-schema.js +18 -13
- package/esm/schema/standard-schema.js.map +1 -1
- package/esm/schema/standard-schema.test.d.ts +2 -0
- package/esm/schema/standard-schema.test.d.ts.map +1 -0
- package/esm/schema/standard-schema.test.js +130 -0
- package/esm/schema/standard-schema.test.js.map +1 -0
- package/esm/schema/validate.test.js +149 -0
- package/esm/schema/validate.test.js.map +1 -1
- package/esm/schema/zod.d.ts +7 -4
- package/esm/schema/zod.d.ts.map +1 -1
- package/esm/schema/zod.js +65 -22
- package/esm/schema/zod.js.map +1 -1
- package/esm/schema/zod.test.js +113 -1
- package/esm/schema/zod.test.js.map +1 -1
- package/esm/testing/tools.d.ts +4 -1
- package/esm/testing/tools.d.ts.map +1 -1
- package/esm/testing/tools.js +6 -1
- package/esm/testing/tools.js.map +1 -1
- package/esm/util/generate-component.d.ts.map +1 -1
- package/esm/util/generate-component.js +18 -3
- package/esm/util/generate-component.js.map +1 -1
- package/esm/util/generate-component.test.d.ts +2 -0
- package/esm/util/generate-component.test.d.ts.map +1 -0
- package/esm/util/generate-component.test.js +302 -0
- package/esm/util/generate-component.test.js.map +1 -0
- package/esm/util/is-promise.d.ts +9 -0
- package/esm/util/is-promise.d.ts.map +1 -0
- package/esm/util/is-promise.js +17 -0
- package/esm/util/is-promise.js.map +1 -0
- package/esm/util/is-promise.test.d.ts +2 -0
- package/esm/util/is-promise.test.d.ts.map +1 -0
- package/esm/util/is-promise.test.js +46 -0
- package/esm/util/is-promise.test.js.map +1 -0
- package/esm/util/query-utils.test.d.ts +2 -0
- package/esm/util/query-utils.test.d.ts.map +1 -0
- package/esm/util/query-utils.test.js +380 -0
- package/esm/util/query-utils.test.js.map +1 -0
- package/esm/util/registry-validators.d.ts.map +1 -1
- package/esm/util/registry-validators.js +7 -0
- package/esm/util/registry-validators.js.map +1 -1
- package/esm/util/registry-validators.test.js +57 -0
- package/esm/util/registry-validators.test.js.map +1 -1
- package/esm/util/registry.d.ts.map +1 -1
- package/esm/util/registry.js +9 -0
- package/esm/util/registry.js.map +1 -1
- package/esm/util/registry.test.js +324 -2
- package/esm/util/registry.test.js.map +1 -1
- package/esm/util/resource-validators.test.d.ts +2 -0
- package/esm/util/resource-validators.test.d.ts.map +1 -0
- package/esm/util/resource-validators.test.js +88 -0
- package/esm/util/resource-validators.test.js.map +1 -0
- package/esm/util/tool-caller.d.ts +2 -2
- package/esm/util/tool-caller.d.ts.map +1 -1
- package/esm/util/tool-caller.js +8 -8
- package/esm/util/tool-caller.js.map +1 -1
- package/esm/util/validate-component-name.test.d.ts +2 -0
- package/esm/util/validate-component-name.test.d.ts.map +1 -0
- package/esm/util/validate-component-name.test.js +33 -0
- package/esm/util/validate-component-name.test.js.map +1 -0
- package/package.json +15 -23
- package/dist/schema/alias.d.ts +0 -3
- package/dist/schema/alias.d.ts.map +0 -1
- package/dist/schema/alias.js +0 -6
- package/dist/schema/alias.js.map +0 -1
- package/esm/schema/alias.d.ts +0 -3
- package/esm/schema/alias.d.ts.map +0 -1
- package/esm/schema/alias.js +0 -13
- package/esm/schema/alias.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry-validators.test.js","sourceRoot":"","sources":["../../src/util/registry-validators.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from \"zod/v3\";\nimport type {\n TamboComponent,\n TamboTool,\n TamboToolWithToolSchema,\n} from \"../model/component-metadata\";\nimport {\n validateAndPrepareComponent,\n validateTool,\n validateToolAssociation,\n} from \"./registry-validators\";\n\ndescribe(\"validateTool\", () => {\n it(\"should validate tool with valid name\", () => {\n const tool: TamboToolWithToolSchema = {\n name: \"valid-tool-name\",\n description: \"A valid tool\",\n tool: () => \"result\",\n toolSchema: z.function().args().returns(z.string()),\n };\n\n expect(() => validateTool(tool)).not.toThrow();\n });\n\n it(\"should throw when tool name contains invalid characters\", () => {\n const tool: TamboToolWithToolSchema = {\n name: \"invalid tool name\",\n description: \"A tool\",\n tool: () => \"result\",\n toolSchema: z.function().args().returns(z.string()),\n };\n\n expect(() => validateTool(tool)).toThrow(\n 'tool \"invalid tool name\" must only contain letters, numbers, underscores, and hyphens.',\n );\n });\n\n it(\"should throw when tool name contains special characters\", () => {\n const tool: TamboToolWithToolSchema = {\n name: \"tool@name\",\n description: \"A tool\",\n tool: () => \"result\",\n toolSchema: z.function().args().returns(z.string()),\n };\n\n expect(() => validateTool(tool)).toThrow(\n 'tool \"tool@name\" must only contain letters, numbers, underscores, and hyphens.',\n );\n });\n\n it(\"should validate tool with valid Zod schema\", () => {\n const tool: TamboToolWithToolSchema = {\n name: \"valid-tool\",\n description: \"A tool\",\n tool: () => \"result\",\n toolSchema: z.function().args().returns(z.string()),\n };\n\n expect(() => validateTool(tool)).not.toThrow();\n });\n\n it(\"should throw when tool schema contains z.record()\", () => {\n const tool: TamboToolWithToolSchema = {\n name: \"invalid-tool\",\n description: \"A tool\",\n tool: () => \"result\",\n toolSchema: z\n .function()\n .args(\n z.object({\n metadata: z.record(z.string()),\n }),\n )\n .returns(z.string()),\n };\n\n expect(() => validateTool(tool)).toThrow(\n 'Record types (objects with dynamic keys) are not supported in toolSchema of tool \"invalid-tool\".',\n );\n });\n\n it(\"should allow tool with JSON Schema (non-Zod)\", () => {\n const tool: TamboToolWithToolSchema = {\n name: \"tool-with-json-schema\",\n description: \"A tool\",\n tool: () => \"result\",\n toolSchema: {\n type: \"object\",\n properties: {\n query: { type: \"string\" },\n },\n },\n };\n\n expect(() => validateTool(tool)).not.toThrow();\n });\n\n it(\"should validate tool with inputSchema (new interface)\", () => {\n const tool: TamboTool = {\n name: \"tool-with-input-schema\",\n description: \"A tool with input schema\",\n tool: (input: { query: string }) => input.query,\n inputSchema: z.object({\n query: z.string(),\n }),\n outputSchema: z.string(),\n };\n\n expect(() => validateTool(tool)).not.toThrow();\n });\n\n it(\"should throw when inputSchema is not an object schema (string)\", () => {\n const tool: TamboTool = {\n name: \"tool-with-string-schema\",\n description: \"A tool with invalid schema\",\n tool: () => \"result\",\n inputSchema: z.string(),\n outputSchema: z.string(),\n };\n\n expect(() => validateTool(tool)).toThrow(\n 'inputSchema of tool \"tool-with-string-schema\" must be an object schema',\n );\n });\n\n it(\"should throw when inputSchema is not an object schema (number)\", () => {\n const tool: TamboTool = {\n name: \"tool-with-number-schema\",\n description: \"A tool with invalid schema\",\n tool: () => \"result\",\n inputSchema: z.number(),\n outputSchema: z.string(),\n };\n\n expect(() => validateTool(tool)).toThrow(\n 'inputSchema of tool \"tool-with-number-schema\" must be an object schema',\n );\n });\n\n it(\"should throw when inputSchema is not an object schema (array)\", () => {\n const tool: TamboTool = {\n name: \"tool-with-array-schema\",\n description: \"A tool with invalid schema\",\n tool: () => \"result\",\n inputSchema: z.array(z.string()),\n outputSchema: z.string(),\n };\n\n expect(() => validateTool(tool)).toThrow(\n 'inputSchema of tool \"tool-with-array-schema\" must be an object schema',\n );\n });\n\n it(\"should throw when inputSchema JSON Schema is not an object type\", () => {\n const tool: TamboTool = {\n name: \"tool-with-json-string-schema\",\n description: \"A tool with invalid JSON schema\",\n tool: () => \"result\",\n inputSchema: { type: \"string\" },\n outputSchema: { type: \"string\" },\n };\n\n expect(() => validateTool(tool)).toThrow(\n 'inputSchema of tool \"tool-with-json-string-schema\" must be an object schema',\n );\n });\n\n it(\"should accept JSON Schema with object type\", () => {\n const tool: TamboTool = {\n name: \"tool-with-json-object-schema\",\n description: \"A tool with valid JSON schema\",\n tool: () => \"result\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: { type: \"string\" },\n },\n },\n outputSchema: { type: \"string\" },\n };\n\n expect(() => validateTool(tool)).not.toThrow();\n });\n\n it(\"should accept JSON Schema with properties but no explicit type\", () => {\n const tool: TamboTool = {\n name: \"tool-with-implicit-object-schema\",\n description: \"A tool with implicit object schema\",\n tool: () => \"result\",\n inputSchema: {\n properties: {\n query: { type: \"string\" },\n },\n },\n outputSchema: { type: \"string\" },\n };\n\n expect(() => validateTool(tool)).not.toThrow();\n });\n});\n\ndescribe(\"validateAndPrepareComponent\", () => {\n it(\"should validate component with propsSchema\", () => {\n const component: TamboComponent = {\n name: \"valid-component\",\n description: \"A valid component\",\n component: () => null,\n propsSchema: z.object({\n title: z.string(),\n count: z.number(),\n }),\n };\n\n const result = validateAndPrepareComponent(component);\n\n expect(result.props).toBeDefined();\n expect(result.props.type).toBe(\"object\");\n expect(result.props.properties).toBeDefined();\n });\n\n it(\"should validate component with propsDefinition\", () => {\n const component: TamboComponent = {\n name: \"valid-component\",\n description: \"A valid component\",\n component: () => null,\n propsDefinition: {\n type: \"object\",\n properties: {\n title: { type: \"string\" },\n },\n },\n };\n\n const result = validateAndPrepareComponent(component);\n\n expect(result.props).toEqual(component.propsDefinition);\n });\n\n it(\"should throw when component name contains invalid characters\", () => {\n const component: TamboComponent = {\n name: \"invalid component name\",\n description: \"A component\",\n component: () => null,\n propsSchema: z.object({}),\n };\n\n expect(() => validateAndPrepareComponent(component)).toThrow(\n 'component \"invalid component name\" must only contain letters, numbers, underscores, and hyphens.',\n );\n });\n\n it(\"should throw when neither propsSchema nor propsDefinition is provided\", () => {\n const component: TamboComponent = {\n name: \"component-without-props\",\n description: \"A component\",\n component: () => null,\n };\n\n expect(() => validateAndPrepareComponent(component)).toThrow(\n \"Component component-without-props must have either propsSchema (recommended) or propsDefinition defined\",\n );\n });\n\n it(\"should throw when both propsSchema and propsDefinition are provided\", () => {\n const component: TamboComponent = {\n name: \"component-with-both\",\n description: \"A component\",\n component: () => null,\n propsSchema: z.object({}),\n propsDefinition: {\n type: \"object\",\n properties: {},\n },\n };\n\n expect(() => validateAndPrepareComponent(component)).toThrow(\n \"Component component-with-both cannot have both propsSchema and propsDefinition defined. Use only one. We recommend using propsSchema.\",\n );\n });\n\n it(\"should throw when propsSchema contains z.record()\", () => {\n const component: TamboComponent = {\n name: \"component-with-record\",\n description: \"A component\",\n component: () => null,\n propsSchema: z.object({\n metadata: z.record(z.string()),\n }),\n };\n\n expect(() => validateAndPrepareComponent(component)).toThrow(\n 'Record types (objects with dynamic keys) are not supported in propsSchema of component \"component-with-record\".',\n );\n });\n\n it(\"should convert Zod schema to JSON Schema\", () => {\n const component: TamboComponent = {\n name: \"component-with-zod\",\n description: \"A component\",\n component: () => null,\n propsSchema: z.object({\n title: z.string().describe(\"The title\"),\n count: z.number().int().min(0),\n tags: z.array(z.string()),\n }),\n };\n\n const result = validateAndPrepareComponent(component);\n\n expect(result.props).toBeDefined();\n expect(result.props.type).toBe(\"object\");\n expect((result.props as any).properties).toBeDefined();\n expect((result.props as any).properties.title).toBeDefined();\n expect((result.props as any).properties.count).toBeDefined();\n expect((result.props as any).properties.tags).toBeDefined();\n });\n\n it(\"should handle complex Zod schema\", () => {\n const component: TamboComponent = {\n name: \"component-complex\",\n description: \"A component\",\n component: () => null,\n propsSchema: z.object({\n user: z.object({\n name: z.string(),\n age: z.number(),\n }),\n items: z.array(\n z.object({\n id: z.string(),\n value: z.number(),\n }),\n ),\n }),\n };\n\n const result = validateAndPrepareComponent(component);\n\n expect(result.props).toBeDefined();\n expect(result.props.type).toBe(\"object\");\n });\n\n it(\"should allow JSON Schema (non-Zod) without validation\", () => {\n const component: TamboComponent = {\n name: \"component-json-schema\",\n description: \"A component\",\n component: () => null,\n propsSchema: {\n type: \"object\",\n properties: {\n title: { type: \"string\" },\n },\n },\n };\n\n const result = validateAndPrepareComponent(component);\n\n expect(result.props).toEqual(component.propsSchema);\n });\n});\n\ndescribe(\"validateToolAssociation\", () => {\n it(\"should validate valid tool association\", () => {\n expect(() =>\n validateToolAssociation(\"valid-component\", \"valid-tool\", true, true),\n ).not.toThrow();\n });\n\n it(\"should throw when component name is invalid\", () => {\n expect(() =>\n validateToolAssociation(\"invalid component\", \"valid-tool\", true, true),\n ).toThrow(\n 'component \"invalid component\" must only contain letters, numbers, underscores, and hyphens.',\n );\n });\n\n it(\"should throw when tool name is invalid\", () => {\n expect(() =>\n validateToolAssociation(\"valid-component\", \"invalid tool\", true, true),\n ).toThrow(\n 'tool \"invalid tool\" must only contain letters, numbers, underscores, and hyphens.',\n );\n });\n\n it(\"should throw when component does not exist\", () => {\n expect(() =>\n validateToolAssociation(\"missing-component\", \"valid-tool\", false, true),\n ).toThrow(\"Component missing-component not found in registry\");\n });\n\n it(\"should throw when tool does not exist\", () => {\n expect(() =>\n validateToolAssociation(\"valid-component\", \"missing-tool\", true, false),\n ).toThrow(\"Tool missing-tool not found in registry\");\n });\n\n it(\"should throw when both component and tool do not exist\", () => {\n expect(() => {\n validateToolAssociation(\n \"missing-component\",\n \"missing-tool\",\n false,\n false,\n );\n }).toThrow(\"Component missing-component not found in registry\");\n });\n\n it(\"should validate with valid names containing underscores and hyphens\", () => {\n expect(() =>\n validateToolAssociation(\"my_component-123\", \"my_tool-456\", true, true),\n ).not.toThrow();\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"registry-validators.test.js","sourceRoot":"","sources":["../../src/util/registry-validators.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from \"zod/v3\";\nimport type {\n TamboComponent,\n TamboTool,\n TamboToolWithToolSchema,\n} from \"../model/component-metadata\";\nimport {\n validateAndPrepareComponent,\n validateTool,\n validateToolAssociation,\n} from \"./registry-validators\";\n\ndescribe(\"validateTool\", () => {\n it(\"should validate tool with valid name\", () => {\n const tool: TamboToolWithToolSchema = {\n name: \"valid-tool-name\",\n description: \"A valid tool\",\n tool: () => \"result\",\n toolSchema: z.function().args().returns(z.string()),\n };\n\n expect(() => validateTool(tool)).not.toThrow();\n });\n\n it(\"should throw when tool name contains invalid characters\", () => {\n const tool: TamboToolWithToolSchema = {\n name: \"invalid tool name\",\n description: \"A tool\",\n tool: () => \"result\",\n toolSchema: z.function().args().returns(z.string()),\n };\n\n expect(() => validateTool(tool)).toThrow(\n 'tool \"invalid tool name\" must only contain letters, numbers, underscores, and hyphens.',\n );\n });\n\n it(\"should throw when tool name contains special characters\", () => {\n const tool: TamboToolWithToolSchema = {\n name: \"tool@name\",\n description: \"A tool\",\n tool: () => \"result\",\n toolSchema: z.function().args().returns(z.string()),\n };\n\n expect(() => validateTool(tool)).toThrow(\n 'tool \"tool@name\" must only contain letters, numbers, underscores, and hyphens.',\n );\n });\n\n it(\"should validate tool with valid Zod schema\", () => {\n const tool: TamboToolWithToolSchema = {\n name: \"valid-tool\",\n description: \"A tool\",\n tool: () => \"result\",\n toolSchema: z.function().args().returns(z.string()),\n };\n\n expect(() => validateTool(tool)).not.toThrow();\n });\n\n it(\"should throw when tool schema contains z.record()\", () => {\n const tool: TamboToolWithToolSchema = {\n name: \"invalid-tool\",\n description: \"A tool\",\n tool: () => \"result\",\n toolSchema: z\n .function()\n .args(\n z.object({\n metadata: z.record(z.string()),\n }),\n )\n .returns(z.string()),\n };\n\n expect(() => validateTool(tool)).toThrow(\n 'Record types (objects with dynamic keys) are not supported in toolSchema of tool \"invalid-tool\".',\n );\n });\n\n it(\"should allow tool with JSON Schema (non-Zod)\", () => {\n const tool: TamboToolWithToolSchema = {\n name: \"tool-with-json-schema\",\n description: \"A tool\",\n tool: () => \"result\",\n toolSchema: {\n type: \"object\",\n properties: {\n query: { type: \"string\" },\n },\n },\n };\n\n expect(() => validateTool(tool)).not.toThrow();\n });\n\n it(\"should validate tool with inputSchema (new interface)\", () => {\n const tool: TamboTool = {\n name: \"tool-with-input-schema\",\n description: \"A tool with input schema\",\n tool: (input: { query: string }) => input.query,\n inputSchema: z.object({\n query: z.string(),\n }),\n outputSchema: z.string(),\n };\n\n expect(() => validateTool(tool)).not.toThrow();\n });\n\n it(\"should throw when inputSchema is not an object schema (string)\", () => {\n const tool: TamboTool = {\n name: \"tool-with-string-schema\",\n description: \"A tool with invalid schema\",\n tool: () => \"result\",\n inputSchema: z.string(),\n outputSchema: z.string(),\n };\n\n expect(() => validateTool(tool)).toThrow(\n 'inputSchema of tool \"tool-with-string-schema\" must be an object schema',\n );\n });\n\n it(\"should throw when inputSchema is not an object schema (number)\", () => {\n const tool: TamboTool = {\n name: \"tool-with-number-schema\",\n description: \"A tool with invalid schema\",\n tool: () => \"result\",\n inputSchema: z.number(),\n outputSchema: z.string(),\n };\n\n expect(() => validateTool(tool)).toThrow(\n 'inputSchema of tool \"tool-with-number-schema\" must be an object schema',\n );\n });\n\n it(\"should throw when inputSchema is not an object schema (array)\", () => {\n const tool: TamboTool = {\n name: \"tool-with-array-schema\",\n description: \"A tool with invalid schema\",\n tool: () => \"result\",\n inputSchema: z.array(z.string()),\n outputSchema: z.string(),\n };\n\n expect(() => validateTool(tool)).toThrow(\n 'inputSchema of tool \"tool-with-array-schema\" must be an object schema',\n );\n });\n\n it(\"should throw when inputSchema JSON Schema is not an object type\", () => {\n const tool: TamboTool = {\n name: \"tool-with-json-string-schema\",\n description: \"A tool with invalid JSON schema\",\n tool: () => \"result\",\n inputSchema: { type: \"string\" },\n outputSchema: { type: \"string\" },\n };\n\n expect(() => validateTool(tool)).toThrow(\n 'inputSchema of tool \"tool-with-json-string-schema\" must be an object schema',\n );\n });\n\n it(\"should accept JSON Schema with object type\", () => {\n const tool: TamboTool = {\n name: \"tool-with-json-object-schema\",\n description: \"A tool with valid JSON schema\",\n tool: () => \"result\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: { type: \"string\" },\n },\n },\n outputSchema: { type: \"string\" },\n };\n\n expect(() => validateTool(tool)).not.toThrow();\n });\n\n it(\"should accept JSON Schema with properties but no explicit type\", () => {\n const tool: TamboTool = {\n name: \"tool-with-implicit-object-schema\",\n description: \"A tool with implicit object schema\",\n tool: () => \"result\",\n inputSchema: {\n properties: {\n query: { type: \"string\" },\n },\n },\n outputSchema: { type: \"string\" },\n };\n\n expect(() => validateTool(tool)).not.toThrow();\n });\n\n describe(\"maxCalls validation\", () => {\n it(\"should throw when maxCalls is a negative integer\", () => {\n const tool: TamboTool = {\n name: \"tool-with-negative-maxcalls\",\n description: \"A tool with negative maxCalls\",\n tool: () => \"result\",\n inputSchema: z.object({ query: z.string() }),\n outputSchema: z.string(),\n maxCalls: -1,\n };\n\n expect(() => validateTool(tool)).toThrow(\n 'maxCalls for tool \"tool-with-negative-maxcalls\" must be a positive integer',\n );\n });\n\n it(\"should throw when maxCalls is a decimal number\", () => {\n const tool: TamboTool = {\n name: \"tool-with-decimal-maxcalls\",\n description: \"A tool with decimal maxCalls\",\n tool: () => \"result\",\n inputSchema: z.object({ query: z.string() }),\n outputSchema: z.string(),\n maxCalls: 1.5,\n };\n\n expect(() => validateTool(tool)).toThrow(\n 'maxCalls for tool \"tool-with-decimal-maxcalls\" must be a positive integer',\n );\n });\n\n it(\"should throw when maxCalls is NaN\", () => {\n const tool: TamboTool = {\n name: \"tool-with-nan-maxcalls\",\n description: \"A tool with NaN maxCalls\",\n tool: () => \"result\",\n inputSchema: z.object({ query: z.string() }),\n outputSchema: z.string(),\n maxCalls: NaN,\n };\n\n expect(() => validateTool(tool)).toThrow(\n 'maxCalls for tool \"tool-with-nan-maxcalls\" must be a positive integer',\n );\n });\n\n it(\"should accept tool with maxCalls as zero\", () => {\n const tool: TamboTool = {\n name: \"tool-with-zero-maxcalls\",\n description: \"A tool with zero maxCalls\",\n tool: () => \"result\",\n inputSchema: z.object({ query: z.string() }),\n outputSchema: z.string(),\n maxCalls: 0,\n };\n\n expect(() => validateTool(tool)).not.toThrow();\n });\n\n it(\"should accept tool with explicitly undefined maxCalls\", () => {\n const tool: TamboTool = {\n name: \"tool-with-undefined-maxcalls\",\n description: \"A tool with undefined maxCalls\",\n tool: () => \"result\",\n inputSchema: z.object({ query: z.string() }),\n outputSchema: z.string(),\n maxCalls: undefined,\n };\n\n expect(() => validateTool(tool)).not.toThrow();\n });\n });\n});\n\ndescribe(\"validateAndPrepareComponent\", () => {\n it(\"should validate component with propsSchema\", () => {\n const component: TamboComponent = {\n name: \"valid-component\",\n description: \"A valid component\",\n component: () => null,\n propsSchema: z.object({\n title: z.string(),\n count: z.number(),\n }),\n };\n\n const result = validateAndPrepareComponent(component);\n\n expect(result.props).toBeDefined();\n expect(result.props.type).toBe(\"object\");\n expect(result.props.properties).toBeDefined();\n });\n\n it(\"should validate component with propsDefinition\", () => {\n const component: TamboComponent = {\n name: \"valid-component\",\n description: \"A valid component\",\n component: () => null,\n propsDefinition: {\n type: \"object\",\n properties: {\n title: { type: \"string\" },\n },\n },\n };\n\n const result = validateAndPrepareComponent(component);\n\n expect(result.props).toEqual(component.propsDefinition);\n });\n\n it(\"should throw when component name contains invalid characters\", () => {\n const component: TamboComponent = {\n name: \"invalid component name\",\n description: \"A component\",\n component: () => null,\n propsSchema: z.object({}),\n };\n\n expect(() => validateAndPrepareComponent(component)).toThrow(\n 'component \"invalid component name\" must only contain letters, numbers, underscores, and hyphens.',\n );\n });\n\n it(\"should throw when neither propsSchema nor propsDefinition is provided\", () => {\n const component: TamboComponent = {\n name: \"component-without-props\",\n description: \"A component\",\n component: () => null,\n };\n\n expect(() => validateAndPrepareComponent(component)).toThrow(\n \"Component component-without-props must have either propsSchema (recommended) or propsDefinition defined\",\n );\n });\n\n it(\"should throw when both propsSchema and propsDefinition are provided\", () => {\n const component: TamboComponent = {\n name: \"component-with-both\",\n description: \"A component\",\n component: () => null,\n propsSchema: z.object({}),\n propsDefinition: {\n type: \"object\",\n properties: {},\n },\n };\n\n expect(() => validateAndPrepareComponent(component)).toThrow(\n \"Component component-with-both cannot have both propsSchema and propsDefinition defined. Use only one. We recommend using propsSchema.\",\n );\n });\n\n it(\"should throw when propsSchema contains z.record()\", () => {\n const component: TamboComponent = {\n name: \"component-with-record\",\n description: \"A component\",\n component: () => null,\n propsSchema: z.object({\n metadata: z.record(z.string()),\n }),\n };\n\n expect(() => validateAndPrepareComponent(component)).toThrow(\n 'Record types (objects with dynamic keys) are not supported in propsSchema of component \"component-with-record\".',\n );\n });\n\n it(\"should convert Zod schema to JSON Schema\", () => {\n const component: TamboComponent = {\n name: \"component-with-zod\",\n description: \"A component\",\n component: () => null,\n propsSchema: z.object({\n title: z.string().describe(\"The title\"),\n count: z.number().int().min(0),\n tags: z.array(z.string()),\n }),\n };\n\n const result = validateAndPrepareComponent(component);\n\n expect(result.props).toBeDefined();\n expect(result.props.type).toBe(\"object\");\n expect((result.props as any).properties).toBeDefined();\n expect((result.props as any).properties.title).toBeDefined();\n expect((result.props as any).properties.count).toBeDefined();\n expect((result.props as any).properties.tags).toBeDefined();\n });\n\n it(\"should handle complex Zod schema\", () => {\n const component: TamboComponent = {\n name: \"component-complex\",\n description: \"A component\",\n component: () => null,\n propsSchema: z.object({\n user: z.object({\n name: z.string(),\n age: z.number(),\n }),\n items: z.array(\n z.object({\n id: z.string(),\n value: z.number(),\n }),\n ),\n }),\n };\n\n const result = validateAndPrepareComponent(component);\n\n expect(result.props).toBeDefined();\n expect(result.props.type).toBe(\"object\");\n });\n\n it(\"should allow JSON Schema (non-Zod) without validation\", () => {\n const component: TamboComponent = {\n name: \"component-json-schema\",\n description: \"A component\",\n component: () => null,\n propsSchema: {\n type: \"object\",\n properties: {\n title: { type: \"string\" },\n },\n },\n };\n\n const result = validateAndPrepareComponent(component);\n\n expect(result.props).toEqual(component.propsSchema);\n });\n});\n\ndescribe(\"validateToolAssociation\", () => {\n it(\"should validate valid tool association\", () => {\n expect(() =>\n validateToolAssociation(\"valid-component\", \"valid-tool\", true, true),\n ).not.toThrow();\n });\n\n it(\"should throw when component name is invalid\", () => {\n expect(() =>\n validateToolAssociation(\"invalid component\", \"valid-tool\", true, true),\n ).toThrow(\n 'component \"invalid component\" must only contain letters, numbers, underscores, and hyphens.',\n );\n });\n\n it(\"should throw when tool name is invalid\", () => {\n expect(() =>\n validateToolAssociation(\"valid-component\", \"invalid tool\", true, true),\n ).toThrow(\n 'tool \"invalid tool\" must only contain letters, numbers, underscores, and hyphens.',\n );\n });\n\n it(\"should throw when component does not exist\", () => {\n expect(() =>\n validateToolAssociation(\"missing-component\", \"valid-tool\", false, true),\n ).toThrow(\"Component missing-component not found in registry\");\n });\n\n it(\"should throw when tool does not exist\", () => {\n expect(() =>\n validateToolAssociation(\"valid-component\", \"missing-tool\", true, false),\n ).toThrow(\"Tool missing-tool not found in registry\");\n });\n\n it(\"should throw when both component and tool do not exist\", () => {\n expect(() => {\n validateToolAssociation(\n \"missing-component\",\n \"missing-tool\",\n false,\n false,\n );\n }).toThrow(\"Component missing-component not found in registry\");\n });\n\n it(\"should validate with valid names containing underscores and hyphens\", () => {\n expect(() =>\n validateToolAssociation(\"my_component-123\", \"my_tool-456\", true, true),\n ).not.toThrow();\n });\n});\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/util/registry.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,0BAA0B,CAAC;AAC/C,OAAO,EACL,4BAA4B,EAC5B,iBAAiB,EACjB,YAAY,EACZ,mBAAmB,EACnB,SAAS,EACT,qBAAqB,EACrB,iBAAiB,EACjB,uBAAuB,EACxB,MAAM,6BAA6B,CAAC;AASrC;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,GACjC,mBAAmB,iBAAiB,EACpC,cAAc,iBAAiB,EAC/B,kBAAkB,qBAAqB,KACtC,OAAO,CAAC,kBAAkB,EAuB5B,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAC/B,cAAc,iBAAiB,EAC/B,kBAAkB,qBAAqB,KACtC,CAAC,SAAS,GAAG,uBAAuB,CAAC,EAKvC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,GACnC,WAAW,mBAAmB,KAC7B,OAYF,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,SAAS,GAAG,uBAAuB,GACxC,SAAS,
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/util/registry.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,0BAA0B,CAAC;AAC/C,OAAO,EACL,4BAA4B,EAC5B,iBAAiB,EACjB,YAAY,EACZ,mBAAmB,EACnB,SAAS,EACT,qBAAqB,EACrB,iBAAiB,EACjB,uBAAuB,EACxB,MAAM,6BAA6B,CAAC;AASrC;;;;;;GAMG;AACH,eAAO,MAAM,sBAAsB,GACjC,mBAAmB,iBAAiB,EACpC,cAAc,iBAAiB,EAC/B,kBAAkB,qBAAqB,KACtC,OAAO,CAAC,kBAAkB,EAuB5B,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,oBAAoB,GAC/B,cAAc,iBAAiB,EAC/B,kBAAkB,qBAAqB,KACtC,CAAC,SAAS,GAAG,uBAAuB,CAAC,EAKvC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,wBAAwB,GACnC,WAAW,mBAAmB,KAC7B,OAYF,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,SAAS,GAAG,uBAAuB,GACxC,SAAS,CAeX;AAED;;;;;GAKG;AACH,eAAO,MAAM,wBAAwB,GACnC,eAAe,MAAM,EACrB,mBAAmB,iBAAiB,KACnC,mBAUF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,yBAAyB,GACpC,MAAM,SAAS,GAAG,uBAAuB,KACxC,4BAcF,CAAC;AAEF;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,UAAU,EAAE,YAExB,CAAC"}
|
package/dist/util/registry.js
CHANGED
|
@@ -77,6 +77,9 @@ function adaptToolFromFnSchema(tool) {
|
|
|
77
77
|
tool: tool.tool,
|
|
78
78
|
inputSchema: (0, schema_1.getZodFunctionArgs)(tool.toolSchema),
|
|
79
79
|
outputSchema: (0, schema_1.getZodFunctionReturns)(tool.toolSchema),
|
|
80
|
+
...("maxCalls" in tool && tool.maxCalls !== undefined
|
|
81
|
+
? { maxCalls: tool.maxCalls }
|
|
82
|
+
: {}),
|
|
80
83
|
};
|
|
81
84
|
}
|
|
82
85
|
/**
|
|
@@ -104,6 +107,12 @@ const mapTamboToolToContextTool = (tool) => {
|
|
|
104
107
|
name: tool.name,
|
|
105
108
|
description: tool.description,
|
|
106
109
|
parameters,
|
|
110
|
+
...("maxCalls" in tool && tool.maxCalls !== undefined
|
|
111
|
+
? { maxCalls: tool.maxCalls }
|
|
112
|
+
: {}),
|
|
113
|
+
...("annotations" in tool && tool.annotations !== undefined
|
|
114
|
+
? { annotations: tool.annotations }
|
|
115
|
+
: {}),
|
|
107
116
|
};
|
|
108
117
|
};
|
|
109
118
|
exports.mapTamboToolToContextTool = mapTamboToolToContextTool;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/util/registry.ts"],"names":[],"mappings":";;;AAiGA,
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/util/registry.ts"],"names":[],"mappings":"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","sourcesContent":["import TamboAI from \"@tambo-ai/typescript-sdk\";\nimport {\n ComponentContextToolMetadata,\n ComponentRegistry,\n DefineToolFn,\n RegisteredComponent,\n TamboTool,\n TamboToolAssociations,\n TamboToolRegistry,\n TamboToolWithToolSchema,\n} from \"../model/component-metadata\";\nimport {\n getParametersFromToolSchema,\n getZodFunctionArgs,\n getZodFunctionReturns,\n isStandardSchema,\n schemaToJsonSchema,\n} from \"../schema\";\n\n/**\n * Get all the available components from the component registry\n * @param componentRegistry - The component registry\n * @param toolRegistry - The tool registry\n * @param toolAssociations - The tool associations\n * @returns The available components\n */\nexport const getAvailableComponents = (\n componentRegistry: ComponentRegistry,\n toolRegistry: TamboToolRegistry,\n toolAssociations: TamboToolAssociations,\n): TamboAI.AvailableComponent[] => {\n const availableComponents: TamboAI.AvailableComponent[] = [];\n\n for (const [name, componentEntry] of Object.entries(componentRegistry)) {\n const associatedToolNames = toolAssociations[name] || [];\n\n const contextTools = associatedToolNames\n .map((toolName) => {\n const tool = toolRegistry[toolName];\n if (!tool) return null;\n return mapTamboToolToContextTool(tool);\n })\n .filter((tool): tool is ComponentContextToolMetadata => tool !== null);\n\n availableComponents.push({\n name: componentEntry.name,\n description: componentEntry.description,\n props: componentEntry.props,\n contextTools,\n });\n }\n\n return availableComponents;\n};\n\n/**\n * Get tools from tool registry that are not associated with any component\n * @param toolRegistry - The tool registry\n * @param toolAssociations - The tool associations\n * @returns The tools that are not associated with any component\n */\nexport const getUnassociatedTools = (\n toolRegistry: TamboToolRegistry,\n toolAssociations: TamboToolAssociations,\n): (TamboTool | TamboToolWithToolSchema)[] => {\n return Object.values(toolRegistry).filter((tool) => {\n // Check if the tool's name appears in any of the tool association arrays\n return !Object.values(toolAssociations).flat().includes(tool.name);\n });\n};\n\n/**\n * Helper function to convert component props from Standard Schema or JSON Schema\n * @param component - The component to convert\n * @returns The converted props as JSON Schema\n */\nexport const convertPropsToJsonSchema = (\n component: RegisteredComponent,\n): unknown => {\n if (!component.props) {\n return component.props;\n }\n\n // Check if props is a Standard Schema (Zod, Valibot, ArkType, etc.)\n if (isStandardSchema(component.props)) {\n return schemaToJsonSchema(component.props);\n }\n\n // Already JSON Schema or unknown format - return as-is\n return component.props;\n};\n\n/**\n * Adapt a Tambo tool defined with function schema to a standard Tambo tool\n * @param tool - The Tambo tool with function schema\n * @returns The adapted Tambo tool\n */\nexport function adaptToolFromFnSchema(\n tool: TamboTool | TamboToolWithToolSchema,\n): TamboTool {\n if (!(\"toolSchema\" in tool)) {\n return tool;\n }\n\n return {\n name: tool.name,\n description: tool.description,\n tool: tool.tool,\n inputSchema: getZodFunctionArgs(tool.toolSchema),\n outputSchema: getZodFunctionReturns(tool.toolSchema),\n ...(\"maxCalls\" in tool && tool.maxCalls !== undefined\n ? { maxCalls: tool.maxCalls }\n : {}),\n };\n}\n\n/**\n * Get a component by name from the component registry\n * @param componentName - The name of the component to get\n * @param componentRegistry - The component registry\n * @returns The component registration information\n */\nexport const getComponentFromRegistry = (\n componentName: string,\n componentRegistry: ComponentRegistry,\n): RegisteredComponent => {\n const componentEntry = componentRegistry[componentName];\n\n if (!componentEntry) {\n throw new Error(\n `Tambo tried to use Component ${componentName}, but it was not found.`,\n );\n }\n\n return componentEntry;\n};\n\n/**\n * Map a Tambo tool to a context tool\n * @param tool - The tool to map (supports both new inputSchema and deprecated toolSchema interfaces)\n * @returns The context tool\n */\nexport const mapTamboToolToContextTool = (\n tool: TamboTool | TamboToolWithToolSchema,\n): ComponentContextToolMetadata => {\n const parameters = getParametersFromToolSchema(tool);\n\n return {\n name: tool.name,\n description: tool.description,\n parameters,\n ...(\"maxCalls\" in tool && tool.maxCalls !== undefined\n ? { maxCalls: tool.maxCalls }\n : {}),\n ...(\"annotations\" in tool && tool.annotations !== undefined\n ? { annotations: tool.annotations }\n : {}),\n };\n};\n\n/**\n * Provides type safety for defining a Tambo Tool.\n *\n * Tambo uses the [standard-schema.dev](https://standard-schema.dev) spec which means you can use any Standard Schema\n * compliant validator (Zod, Valibot, ArkType, etc.). This ensures the tool function args and output types are correctly\n * inferred from the provided schemas.\n * @example\n * ```typescript\n * import { z } from \"zod/v4\";\n *\n * const myTool = defineTamboTool({\n * // ...\n * });\n * ```\n * @param tool The tool definition to register\n * @returns The registered tool definition\n */\nexport const defineTool: DefineToolFn = (tool: any) => {\n return tool;\n};\n"]}
|
|
@@ -40,12 +40,13 @@ const registry_1 = require("./registry");
|
|
|
40
40
|
describe("getParametersFromToolSchema (via mapTamboToolToContextTool)", () => {
|
|
41
41
|
describe("Deprecated toolSchema interface (Zod function schemas)", () => {
|
|
42
42
|
it("should handle tool with toolSchema", () => {
|
|
43
|
-
const tool = (0, tools_1.createMockToolWithToolSchema)(z3.function().args(z3.string().describe("The name")).returns(z3.void()));
|
|
43
|
+
const tool = (0, tools_1.createMockToolWithToolSchema)(z3.function().args(z3.string().describe("The name")).returns(z3.void()), 3);
|
|
44
44
|
const result = (0, registry_1.mapTamboToolToContextTool)(tool);
|
|
45
45
|
// Should have at least one parameter (either extracted or wrapped)
|
|
46
46
|
expect(result.parameters.length).toBeGreaterThanOrEqual(1);
|
|
47
47
|
expect(result.name).toBe("testTool");
|
|
48
48
|
expect(result.description).toBe("A test tool");
|
|
49
|
+
expect(result.maxCalls).toBe(3);
|
|
49
50
|
});
|
|
50
51
|
it("should handle toolSchema with multiple args", () => {
|
|
51
52
|
const tool = (0, tools_1.createMockToolWithToolSchema)(z3
|
|
@@ -66,8 +67,10 @@ describe("getParametersFromToolSchema (via mapTamboToolToContextTool)", () => {
|
|
|
66
67
|
age: z4.number().describe("User age"),
|
|
67
68
|
}),
|
|
68
69
|
outputSchema: z4.boolean(),
|
|
70
|
+
maxCalls: 10,
|
|
69
71
|
});
|
|
70
72
|
const result = (0, registry_1.mapTamboToolToContextTool)(tool);
|
|
73
|
+
expect(result.maxCalls).toBe(10);
|
|
71
74
|
expect(result.parameters).toHaveLength(2);
|
|
72
75
|
// Parameters should be extracted from object properties
|
|
73
76
|
const nameParam = result.parameters.find((p) => p.name === "name");
|
|
@@ -214,4 +217,323 @@ describe("getParametersFromToolSchema (via mapTamboToolToContextTool)", () => {
|
|
|
214
217
|
});
|
|
215
218
|
});
|
|
216
219
|
});
|
|
220
|
+
describe("registry util: maxCalls", () => {
|
|
221
|
+
it("adaptToolFromFnSchema preserves maxCalls for legacy toolSchema", () => {
|
|
222
|
+
const legacy = (0, tools_1.createMockToolWithToolSchema)(z3.function().args(z3.string()).returns(z3.string()), 2);
|
|
223
|
+
const adapted = (0, registry_1.adaptToolFromFnSchema)(legacy);
|
|
224
|
+
expect(adapted.maxCalls).toBe(2);
|
|
225
|
+
});
|
|
226
|
+
it("mapTamboToolToContextTool includes maxCalls when present", () => {
|
|
227
|
+
const tool = (0, tools_1.createMockTool)({
|
|
228
|
+
inputSchema: z3.object({ q: z3.string() }),
|
|
229
|
+
maxCalls: 5,
|
|
230
|
+
});
|
|
231
|
+
const meta = (0, registry_1.mapTamboToolToContextTool)(tool);
|
|
232
|
+
expect(meta.maxCalls).toBe(5);
|
|
233
|
+
});
|
|
234
|
+
it("getUnassociatedTools does not drop unassociated tools and preserves maxCalls", () => {
|
|
235
|
+
const t1 = {
|
|
236
|
+
name: "a",
|
|
237
|
+
description: "a",
|
|
238
|
+
tool: () => { },
|
|
239
|
+
inputSchema: {},
|
|
240
|
+
outputSchema: {},
|
|
241
|
+
maxCalls: 3,
|
|
242
|
+
};
|
|
243
|
+
const registry = { a: t1 };
|
|
244
|
+
const associations = { SomeComponent: [] };
|
|
245
|
+
const out = (0, registry_1.getUnassociatedTools)(registry, associations);
|
|
246
|
+
expect(out.find((t) => t.name === "a")?.maxCalls).toBe(3);
|
|
247
|
+
});
|
|
248
|
+
});
|
|
249
|
+
describe("registry util: annotations", () => {
|
|
250
|
+
it("mapTamboToolToContextTool includes annotations when present", () => {
|
|
251
|
+
const tool = {
|
|
252
|
+
name: "read-only-tool",
|
|
253
|
+
description: "A tool that can be called with partial args",
|
|
254
|
+
tool: () => { },
|
|
255
|
+
inputSchema: z3.object({ text: z3.string() }),
|
|
256
|
+
outputSchema: z3.string(),
|
|
257
|
+
annotations: { readOnlyHint: true },
|
|
258
|
+
};
|
|
259
|
+
const meta = (0, registry_1.mapTamboToolToContextTool)(tool);
|
|
260
|
+
expect(meta.annotations).toEqual({ readOnlyHint: true });
|
|
261
|
+
});
|
|
262
|
+
it("mapTamboToolToContextTool does not include annotations when undefined", () => {
|
|
263
|
+
const tool = {
|
|
264
|
+
name: "regular-tool",
|
|
265
|
+
description: "A regular tool",
|
|
266
|
+
tool: () => { },
|
|
267
|
+
inputSchema: z3.object({ text: z3.string() }),
|
|
268
|
+
outputSchema: z3.string(),
|
|
269
|
+
};
|
|
270
|
+
const meta = (0, registry_1.mapTamboToolToContextTool)(tool);
|
|
271
|
+
expect(meta.annotations).toBeUndefined();
|
|
272
|
+
});
|
|
273
|
+
it("mapTamboToolToContextTool includes annotations with readOnlyHint: false when explicitly set", () => {
|
|
274
|
+
const tool = {
|
|
275
|
+
name: "explicit-non-read-only-tool",
|
|
276
|
+
description: "A tool explicitly marked as non-read-only",
|
|
277
|
+
tool: () => { },
|
|
278
|
+
inputSchema: z3.object({ text: z3.string() }),
|
|
279
|
+
outputSchema: z3.string(),
|
|
280
|
+
annotations: { readOnlyHint: false },
|
|
281
|
+
};
|
|
282
|
+
const meta = (0, registry_1.mapTamboToolToContextTool)(tool);
|
|
283
|
+
expect(meta.annotations).toEqual({ readOnlyHint: false });
|
|
284
|
+
});
|
|
285
|
+
it("getUnassociatedTools preserves annotations", () => {
|
|
286
|
+
const tool = {
|
|
287
|
+
name: "streaming-tool",
|
|
288
|
+
description: "A streaming tool",
|
|
289
|
+
tool: () => { },
|
|
290
|
+
inputSchema: {},
|
|
291
|
+
outputSchema: {},
|
|
292
|
+
annotations: { readOnlyHint: true },
|
|
293
|
+
};
|
|
294
|
+
const registry = { "streaming-tool": tool };
|
|
295
|
+
const associations = { SomeComponent: [] };
|
|
296
|
+
const out = (0, registry_1.getUnassociatedTools)(registry, associations);
|
|
297
|
+
expect(out.find((t) => t.name === "streaming-tool")?.annotations).toEqual({
|
|
298
|
+
readOnlyHint: true,
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
it("mapTamboToolToContextTool includes tamboStreamableHint annotation", () => {
|
|
302
|
+
const tool = {
|
|
303
|
+
name: "streamable-tool",
|
|
304
|
+
description: "A tool safe to call during streaming",
|
|
305
|
+
tool: () => { },
|
|
306
|
+
inputSchema: z3.object({ text: z3.string() }),
|
|
307
|
+
outputSchema: z3.string(),
|
|
308
|
+
annotations: { tamboStreamableHint: true },
|
|
309
|
+
};
|
|
310
|
+
const meta = (0, registry_1.mapTamboToolToContextTool)(tool);
|
|
311
|
+
expect(meta.annotations).toEqual({ tamboStreamableHint: true });
|
|
312
|
+
});
|
|
313
|
+
it("mapTamboToolToContextTool preserves multiple combined annotations", () => {
|
|
314
|
+
const tool = {
|
|
315
|
+
name: "combined-annotations-tool",
|
|
316
|
+
description: "A tool with multiple annotations",
|
|
317
|
+
tool: () => { },
|
|
318
|
+
inputSchema: z3.object({ text: z3.string() }),
|
|
319
|
+
outputSchema: z3.string(),
|
|
320
|
+
annotations: { readOnlyHint: true, tamboStreamableHint: true },
|
|
321
|
+
};
|
|
322
|
+
const meta = (0, registry_1.mapTamboToolToContextTool)(tool);
|
|
323
|
+
expect(meta.annotations).toEqual({
|
|
324
|
+
readOnlyHint: true,
|
|
325
|
+
tamboStreamableHint: true,
|
|
326
|
+
});
|
|
327
|
+
});
|
|
328
|
+
});
|
|
329
|
+
describe("convertPropsToJsonSchema", () => {
|
|
330
|
+
it("should return undefined when component has no props", () => {
|
|
331
|
+
const component = {
|
|
332
|
+
name: "TestComponent",
|
|
333
|
+
description: "A test component",
|
|
334
|
+
component: () => null,
|
|
335
|
+
props: undefined,
|
|
336
|
+
contextTools: [],
|
|
337
|
+
};
|
|
338
|
+
expect((0, registry_1.convertPropsToJsonSchema)(component)).toBeUndefined();
|
|
339
|
+
});
|
|
340
|
+
it("should convert Standard Schema (Zod) props to JSON Schema", () => {
|
|
341
|
+
const zodSchema = z4.object({
|
|
342
|
+
title: z4.string(),
|
|
343
|
+
count: z4.number(),
|
|
344
|
+
});
|
|
345
|
+
const component = {
|
|
346
|
+
name: "TestComponent",
|
|
347
|
+
description: "A test component",
|
|
348
|
+
component: () => null,
|
|
349
|
+
props: zodSchema,
|
|
350
|
+
contextTools: [],
|
|
351
|
+
};
|
|
352
|
+
const result = (0, registry_1.convertPropsToJsonSchema)(component);
|
|
353
|
+
expect(result).toEqual(expect.objectContaining({
|
|
354
|
+
type: "object",
|
|
355
|
+
properties: expect.objectContaining({
|
|
356
|
+
title: expect.objectContaining({ type: "string" }),
|
|
357
|
+
count: expect.objectContaining({ type: "number" }),
|
|
358
|
+
}),
|
|
359
|
+
}));
|
|
360
|
+
});
|
|
361
|
+
it("should pass through JSON Schema props as-is", () => {
|
|
362
|
+
const jsonSchema = {
|
|
363
|
+
type: "object",
|
|
364
|
+
properties: {
|
|
365
|
+
title: { type: "string" },
|
|
366
|
+
count: { type: "number" },
|
|
367
|
+
},
|
|
368
|
+
};
|
|
369
|
+
const component = {
|
|
370
|
+
name: "TestComponent",
|
|
371
|
+
description: "A test component",
|
|
372
|
+
component: () => null,
|
|
373
|
+
props: jsonSchema,
|
|
374
|
+
contextTools: [],
|
|
375
|
+
};
|
|
376
|
+
const result = (0, registry_1.convertPropsToJsonSchema)(component);
|
|
377
|
+
expect(result).toBe(jsonSchema); // Should be the same reference
|
|
378
|
+
});
|
|
379
|
+
it("should pass through unknown format as-is", () => {
|
|
380
|
+
const unknownFormat = { custom: "format", notStandard: true };
|
|
381
|
+
const component = {
|
|
382
|
+
name: "TestComponent",
|
|
383
|
+
description: "A test component",
|
|
384
|
+
component: () => null,
|
|
385
|
+
props: unknownFormat,
|
|
386
|
+
contextTools: [],
|
|
387
|
+
};
|
|
388
|
+
const result = (0, registry_1.convertPropsToJsonSchema)(component);
|
|
389
|
+
expect(result).toBe(unknownFormat);
|
|
390
|
+
});
|
|
391
|
+
});
|
|
392
|
+
describe("adaptToolFromFnSchema", () => {
|
|
393
|
+
it("should return tool unchanged when it has inputSchema (new interface)", () => {
|
|
394
|
+
const tool = (0, tools_1.createMockTool)({
|
|
395
|
+
inputSchema: z4.object({ name: z4.string() }),
|
|
396
|
+
outputSchema: z4.string(),
|
|
397
|
+
});
|
|
398
|
+
const result = (0, registry_1.adaptToolFromFnSchema)(tool);
|
|
399
|
+
expect(result).toBe(tool); // Same reference
|
|
400
|
+
expect(result.inputSchema).toBeDefined();
|
|
401
|
+
});
|
|
402
|
+
it("should adapt toolSchema to inputSchema/outputSchema", () => {
|
|
403
|
+
const tool = (0, tools_1.createMockToolWithToolSchema)(z3
|
|
404
|
+
.function()
|
|
405
|
+
.args(z3.string().describe("Name"), z3.number().describe("Age"))
|
|
406
|
+
.returns(z3.boolean()));
|
|
407
|
+
const result = (0, registry_1.adaptToolFromFnSchema)(tool);
|
|
408
|
+
expect(result.inputSchema).toBeDefined();
|
|
409
|
+
expect(result.outputSchema).toBeDefined();
|
|
410
|
+
expect("toolSchema" in result).toBe(false);
|
|
411
|
+
});
|
|
412
|
+
});
|
|
413
|
+
describe("getComponentFromRegistry", () => {
|
|
414
|
+
const mockRegistry = {
|
|
415
|
+
TestComponent: {
|
|
416
|
+
name: "TestComponent",
|
|
417
|
+
description: "A test component",
|
|
418
|
+
component: () => null,
|
|
419
|
+
props: { type: "object" },
|
|
420
|
+
contextTools: [],
|
|
421
|
+
},
|
|
422
|
+
AnotherComponent: {
|
|
423
|
+
name: "AnotherComponent",
|
|
424
|
+
description: "Another component",
|
|
425
|
+
component: () => null,
|
|
426
|
+
props: { type: "object" },
|
|
427
|
+
contextTools: [],
|
|
428
|
+
},
|
|
429
|
+
};
|
|
430
|
+
it("should return component when found in registry", () => {
|
|
431
|
+
const result = (0, registry_1.getComponentFromRegistry)("TestComponent", mockRegistry);
|
|
432
|
+
expect(result.name).toBe("TestComponent");
|
|
433
|
+
expect(result.description).toBe("A test component");
|
|
434
|
+
});
|
|
435
|
+
it("should throw error when component not found", () => {
|
|
436
|
+
expect(() => (0, registry_1.getComponentFromRegistry)("NonExistent", mockRegistry)).toThrow("Tambo tried to use Component NonExistent, but it was not found");
|
|
437
|
+
});
|
|
438
|
+
it("should be case-sensitive for component names", () => {
|
|
439
|
+
expect(() => (0, registry_1.getComponentFromRegistry)("testcomponent", mockRegistry)).toThrow("Tambo tried to use Component testcomponent, but it was not found");
|
|
440
|
+
});
|
|
441
|
+
});
|
|
442
|
+
describe("getAvailableComponents", () => {
|
|
443
|
+
const mockComponent = () => null;
|
|
444
|
+
const mockRegistry = {
|
|
445
|
+
TestComponent: {
|
|
446
|
+
name: "TestComponent",
|
|
447
|
+
description: "A test component",
|
|
448
|
+
component: mockComponent,
|
|
449
|
+
props: { type: "object", properties: { title: { type: "string" } } },
|
|
450
|
+
contextTools: [],
|
|
451
|
+
},
|
|
452
|
+
};
|
|
453
|
+
const mockTool = (0, tools_1.createMockTool)({
|
|
454
|
+
inputSchema: z4.object({ query: z4.string() }),
|
|
455
|
+
outputSchema: z4.string(),
|
|
456
|
+
});
|
|
457
|
+
mockTool.name = "testTool";
|
|
458
|
+
const mockToolRegistry = {
|
|
459
|
+
testTool: mockTool,
|
|
460
|
+
};
|
|
461
|
+
it("should return available components with no tools when no associations", () => {
|
|
462
|
+
const associations = {};
|
|
463
|
+
const result = (0, registry_1.getAvailableComponents)(mockRegistry, mockToolRegistry, associations);
|
|
464
|
+
expect(result).toHaveLength(1);
|
|
465
|
+
expect(result[0].name).toBe("TestComponent");
|
|
466
|
+
expect(result[0].description).toBe("A test component");
|
|
467
|
+
expect(result[0].contextTools).toHaveLength(0);
|
|
468
|
+
});
|
|
469
|
+
it("should include associated tools with components", () => {
|
|
470
|
+
const associations = {
|
|
471
|
+
TestComponent: ["testTool"],
|
|
472
|
+
};
|
|
473
|
+
const result = (0, registry_1.getAvailableComponents)(mockRegistry, mockToolRegistry, associations);
|
|
474
|
+
expect(result).toHaveLength(1);
|
|
475
|
+
expect(result[0].contextTools).toHaveLength(1);
|
|
476
|
+
expect(result[0].contextTools?.[0].name).toBe("testTool");
|
|
477
|
+
});
|
|
478
|
+
it("should skip tools not found in registry", () => {
|
|
479
|
+
const associations = {
|
|
480
|
+
TestComponent: ["testTool", "nonExistentTool"],
|
|
481
|
+
};
|
|
482
|
+
const result = (0, registry_1.getAvailableComponents)(mockRegistry, mockToolRegistry, associations);
|
|
483
|
+
expect(result[0].contextTools).toHaveLength(1);
|
|
484
|
+
expect(result[0].contextTools?.[0].name).toBe("testTool");
|
|
485
|
+
});
|
|
486
|
+
it("should handle empty registries", () => {
|
|
487
|
+
const result = (0, registry_1.getAvailableComponents)({}, {}, {});
|
|
488
|
+
expect(result).toHaveLength(0);
|
|
489
|
+
});
|
|
490
|
+
});
|
|
491
|
+
describe("getUnassociatedTools", () => {
|
|
492
|
+
const mockTool1 = (0, tools_1.createMockTool)({
|
|
493
|
+
inputSchema: z4.object({ a: z4.string() }),
|
|
494
|
+
outputSchema: z4.void(),
|
|
495
|
+
});
|
|
496
|
+
mockTool1.name = "tool1";
|
|
497
|
+
const mockTool2 = (0, tools_1.createMockTool)({
|
|
498
|
+
inputSchema: z4.object({ b: z4.string() }),
|
|
499
|
+
outputSchema: z4.void(),
|
|
500
|
+
});
|
|
501
|
+
mockTool2.name = "tool2";
|
|
502
|
+
const mockTool3 = (0, tools_1.createMockTool)({
|
|
503
|
+
inputSchema: z4.object({ c: z4.string() }),
|
|
504
|
+
outputSchema: z4.void(),
|
|
505
|
+
});
|
|
506
|
+
mockTool3.name = "tool3";
|
|
507
|
+
const mockToolRegistry = {
|
|
508
|
+
tool1: mockTool1,
|
|
509
|
+
tool2: mockTool2,
|
|
510
|
+
tool3: mockTool3,
|
|
511
|
+
};
|
|
512
|
+
it("should return all tools when no associations exist", () => {
|
|
513
|
+
const associations = {};
|
|
514
|
+
const result = (0, registry_1.getUnassociatedTools)(mockToolRegistry, associations);
|
|
515
|
+
expect(result).toHaveLength(3);
|
|
516
|
+
expect(result.map((t) => t.name)).toEqual(expect.arrayContaining(["tool1", "tool2", "tool3"]));
|
|
517
|
+
});
|
|
518
|
+
it("should exclude tools that are associated with components", () => {
|
|
519
|
+
const associations = {
|
|
520
|
+
ComponentA: ["tool1"],
|
|
521
|
+
ComponentB: ["tool2"],
|
|
522
|
+
};
|
|
523
|
+
const result = (0, registry_1.getUnassociatedTools)(mockToolRegistry, associations);
|
|
524
|
+
expect(result).toHaveLength(1);
|
|
525
|
+
expect(result[0].name).toBe("tool3");
|
|
526
|
+
});
|
|
527
|
+
it("should return empty array when all tools are associated", () => {
|
|
528
|
+
const associations = {
|
|
529
|
+
ComponentA: ["tool1", "tool2", "tool3"],
|
|
530
|
+
};
|
|
531
|
+
const result = (0, registry_1.getUnassociatedTools)(mockToolRegistry, associations);
|
|
532
|
+
expect(result).toHaveLength(0);
|
|
533
|
+
});
|
|
534
|
+
it("should handle empty tool registry", () => {
|
|
535
|
+
const result = (0, registry_1.getUnassociatedTools)({}, { ComponentA: ["tool1"] });
|
|
536
|
+
expect(result).toHaveLength(0);
|
|
537
|
+
});
|
|
538
|
+
});
|
|
217
539
|
//# sourceMappingURL=registry.test.js.map
|