@tambo-ai/react 0.65.3 → 0.66.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 +120 -20
- package/dist/{providers/hoc → hoc}/with-tambo-interactable.d.ts +2 -2
- package/dist/hoc/with-tambo-interactable.d.ts.map +1 -0
- package/dist/{providers/hoc → hoc}/with-tambo-interactable.js +29 -2
- package/dist/hoc/with-tambo-interactable.js.map +1 -0
- package/dist/hoc/with-tambo-interactable.test.d.ts +2 -0
- package/dist/hoc/with-tambo-interactable.test.d.ts.map +1 -0
- package/dist/hoc/with-tambo-interactable.test.js +192 -0
- package/dist/hoc/with-tambo-interactable.test.js.map +1 -0
- package/dist/hooks/index.d.ts +1 -1
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/index.js +2 -1
- package/dist/hooks/index.js.map +1 -1
- package/dist/hooks/use-current-message.d.ts +51 -7
- package/dist/hooks/use-current-message.d.ts.map +1 -1
- package/dist/hooks/use-current-message.js +50 -6
- package/dist/hooks/use-current-message.js.map +1 -1
- package/dist/hooks/use-current-message.test.d.ts +2 -0
- package/dist/hooks/use-current-message.test.d.ts.map +1 -0
- package/dist/hooks/use-current-message.test.js +264 -0
- package/dist/hooks/use-current-message.test.js.map +1 -0
- package/dist/index.d.ts +10 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -3
- package/dist/index.js.map +1 -1
- package/dist/mcp/index.d.ts +1 -1
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +2 -1
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/mcp-hooks.d.ts +77 -6
- package/dist/mcp/mcp-hooks.d.ts.map +1 -1
- package/dist/mcp/mcp-hooks.js +104 -40
- package/dist/mcp/mcp-hooks.js.map +1 -1
- package/dist/mcp/mcp-hooks.test.js +83 -18
- 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 +2 -1
- package/dist/mcp/tambo-mcp-provider.js.map +1 -1
- package/dist/model/component-metadata.d.ts +444 -14
- package/dist/model/component-metadata.d.ts.map +1 -1
- package/dist/model/component-metadata.js.map +1 -1
- package/dist/model/generate-component-response.d.ts +12 -1
- package/dist/model/generate-component-response.d.ts.map +1 -1
- package/dist/model/generate-component-response.js.map +1 -1
- package/dist/model/resource-info.d.ts +55 -0
- package/dist/model/resource-info.d.ts.map +1 -0
- package/dist/model/resource-info.js +3 -0
- package/dist/model/resource-info.js.map +1 -0
- 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-component-provider.d.ts +4 -4
- package/dist/providers/tambo-component-provider.d.ts.map +1 -1
- package/dist/providers/tambo-component-provider.js.map +1 -1
- package/dist/providers/tambo-interactable-provider-partial-updates.test.js +87 -87
- package/dist/providers/tambo-interactable-provider-partial-updates.test.js.map +1 -1
- package/dist/providers/tambo-interactable-provider.d.ts +2 -3
- package/dist/providers/tambo-interactable-provider.d.ts.map +1 -1
- package/dist/providers/tambo-interactable-provider.js +47 -41
- package/dist/providers/tambo-interactable-provider.js.map +1 -1
- package/dist/providers/tambo-interactables-additional-context-edge-cases.test.js +9 -9
- package/dist/providers/tambo-interactables-additional-context-edge-cases.test.js.map +1 -1
- package/dist/providers/tambo-interactables-additional-context.test.js +11 -11
- package/dist/providers/tambo-interactables-additional-context.test.js.map +1 -1
- package/dist/providers/tambo-registry-provider.d.ts +28 -7
- package/dist/providers/tambo-registry-provider.d.ts.map +1 -1
- package/dist/providers/tambo-registry-provider.js +70 -181
- package/dist/providers/tambo-registry-provider.js.map +1 -1
- package/dist/providers/tambo-registry-provider.test.js +152 -30
- package/dist/providers/tambo-registry-provider.test.js.map +1 -1
- package/dist/providers/tambo-registry-schema-compat.test.d.ts +2 -0
- package/dist/providers/tambo-registry-schema-compat.test.d.ts.map +1 -0
- package/dist/providers/tambo-registry-schema-compat.test.js +616 -0
- package/dist/providers/tambo-registry-schema-compat.test.js.map +1 -0
- package/dist/providers/tambo-stubs.d.ts +2 -2
- package/dist/providers/tambo-stubs.d.ts.map +1 -1
- package/dist/providers/tambo-stubs.js +5 -0
- package/dist/providers/tambo-stubs.js.map +1 -1
- package/dist/providers/tambo-thread-input-provider.d.ts +1 -0
- package/dist/providers/tambo-thread-input-provider.d.ts.map +1 -1
- package/dist/providers/tambo-thread-input-provider.js +3 -3
- package/dist/providers/tambo-thread-input-provider.js.map +1 -1
- package/dist/providers/tambo-thread-provider.d.ts.map +1 -1
- package/dist/providers/tambo-thread-provider.js.map +1 -1
- package/dist/providers/tambo-thread-provider.test.js +32 -36
- package/dist/providers/tambo-thread-provider.test.js.map +1 -1
- package/dist/schema/index.d.ts +6 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +18 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/json-schema.d.ts +35 -0
- package/dist/schema/json-schema.d.ts.map +1 -0
- package/dist/schema/json-schema.js +103 -0
- package/dist/schema/json-schema.js.map +1 -0
- package/dist/schema/schema.d.ts +66 -0
- package/dist/schema/schema.d.ts.map +1 -0
- package/dist/schema/schema.js +189 -0
- package/dist/schema/schema.js.map +1 -0
- package/dist/schema/schema.test.d.ts +2 -0
- package/dist/schema/schema.test.d.ts.map +1 -0
- package/dist/schema/schema.test.js +41 -0
- package/dist/schema/schema.test.js.map +1 -0
- package/dist/schema/standard-schema.d.ts +21 -0
- package/dist/schema/standard-schema.d.ts.map +1 -0
- package/dist/schema/standard-schema.js +37 -0
- package/dist/schema/standard-schema.js.map +1 -0
- package/dist/schema/validate.d.ts +14 -0
- package/dist/schema/validate.d.ts.map +1 -0
- package/dist/schema/validate.js +148 -0
- package/dist/schema/validate.js.map +1 -0
- package/dist/schema/validate.test.d.ts +2 -0
- package/dist/schema/validate.test.d.ts.map +1 -0
- package/dist/schema/validate.test.js +128 -0
- package/dist/schema/validate.test.js.map +1 -0
- package/dist/schema/zod.d.ts +54 -0
- package/dist/schema/zod.d.ts.map +1 -0
- package/dist/schema/zod.js +147 -0
- package/dist/schema/zod.js.map +1 -0
- package/dist/testing/tools.d.ts +29 -15
- package/dist/testing/tools.d.ts.map +1 -1
- package/dist/testing/tools.js +64 -19
- package/dist/testing/tools.js.map +1 -1
- package/dist/util/generate-component.d.ts.map +1 -1
- package/dist/util/generate-component.js +3 -3
- package/dist/util/generate-component.js.map +1 -1
- package/dist/util/mcp-server-utils.d.ts +23 -0
- package/dist/util/mcp-server-utils.d.ts.map +1 -0
- package/dist/util/mcp-server-utils.js +107 -0
- package/dist/util/mcp-server-utils.js.map +1 -0
- package/dist/util/mcp-server-utils.test.d.ts +2 -0
- package/dist/util/mcp-server-utils.test.d.ts.map +1 -0
- package/dist/util/mcp-server-utils.test.js +287 -0
- package/dist/util/mcp-server-utils.test.js.map +1 -0
- package/dist/util/message-builder.d.ts +2 -1
- package/dist/util/message-builder.d.ts.map +1 -1
- package/dist/util/message-builder.js +54 -36
- package/dist/util/message-builder.js.map +1 -1
- package/dist/util/message-builder.test.js +500 -13
- package/dist/util/message-builder.test.js.map +1 -1
- package/dist/util/registry-validators.d.ts +26 -0
- package/dist/util/registry-validators.d.ts.map +1 -0
- package/dist/util/registry-validators.js +105 -0
- package/dist/util/registry-validators.js.map +1 -0
- package/dist/util/registry-validators.test.d.ts +2 -0
- package/dist/util/registry-validators.test.d.ts.map +1 -0
- package/dist/util/registry-validators.test.js +235 -0
- package/dist/util/registry-validators.test.js.map +1 -0
- package/dist/util/registry.d.ts +35 -7
- package/dist/util/registry.d.ts.map +1 -1
- package/dist/util/registry.js +60 -77
- package/dist/util/registry.js.map +1 -1
- package/dist/util/registry.test.d.ts +2 -0
- package/dist/util/registry.test.d.ts.map +1 -0
- package/dist/util/registry.test.js +204 -0
- package/dist/util/registry.test.js.map +1 -0
- package/dist/util/resource-validators.d.ts +16 -0
- package/dist/util/resource-validators.d.ts.map +1 -0
- package/dist/util/resource-validators.js +34 -0
- package/dist/util/resource-validators.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 +12 -4
- package/dist/util/tool-caller.js.map +1 -1
- package/esm/{providers/hoc → hoc}/with-tambo-interactable.d.ts +2 -2
- package/esm/hoc/with-tambo-interactable.d.ts.map +1 -0
- package/esm/{providers/hoc → hoc}/with-tambo-interactable.js +29 -2
- package/esm/hoc/with-tambo-interactable.js.map +1 -0
- package/esm/hoc/with-tambo-interactable.test.d.ts +2 -0
- package/esm/hoc/with-tambo-interactable.test.d.ts.map +1 -0
- package/esm/hoc/with-tambo-interactable.test.js +187 -0
- package/esm/hoc/with-tambo-interactable.test.js.map +1 -0
- package/esm/hooks/index.d.ts +1 -1
- package/esm/hooks/index.d.ts.map +1 -1
- package/esm/hooks/index.js +1 -1
- package/esm/hooks/index.js.map +1 -1
- package/esm/hooks/use-current-message.d.ts +51 -7
- package/esm/hooks/use-current-message.d.ts.map +1 -1
- package/esm/hooks/use-current-message.js +48 -5
- package/esm/hooks/use-current-message.js.map +1 -1
- package/esm/hooks/use-current-message.test.d.ts +2 -0
- package/esm/hooks/use-current-message.test.d.ts.map +1 -0
- package/esm/hooks/use-current-message.test.js +259 -0
- package/esm/hooks/use-current-message.test.js.map +1 -0
- package/esm/index.d.ts +10 -8
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +4 -2
- package/esm/index.js.map +1 -1
- package/esm/mcp/index.d.ts +1 -1
- package/esm/mcp/index.d.ts.map +1 -1
- package/esm/mcp/index.js +1 -1
- package/esm/mcp/index.js.map +1 -1
- package/esm/mcp/mcp-hooks.d.ts +77 -6
- package/esm/mcp/mcp-hooks.d.ts.map +1 -1
- package/esm/mcp/mcp-hooks.js +103 -40
- package/esm/mcp/mcp-hooks.js.map +1 -1
- package/esm/mcp/mcp-hooks.test.js +84 -19
- 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 +2 -1
- package/esm/mcp/tambo-mcp-provider.js.map +1 -1
- package/esm/model/component-metadata.d.ts +444 -14
- package/esm/model/component-metadata.d.ts.map +1 -1
- package/esm/model/component-metadata.js.map +1 -1
- package/esm/model/generate-component-response.d.ts +12 -1
- package/esm/model/generate-component-response.d.ts.map +1 -1
- package/esm/model/generate-component-response.js.map +1 -1
- package/esm/model/resource-info.d.ts +55 -0
- package/esm/model/resource-info.d.ts.map +1 -0
- package/esm/model/resource-info.js +2 -0
- package/esm/model/resource-info.js.map +1 -0
- 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-component-provider.d.ts +4 -4
- package/esm/providers/tambo-component-provider.d.ts.map +1 -1
- package/esm/providers/tambo-component-provider.js.map +1 -1
- package/esm/providers/tambo-interactable-provider-partial-updates.test.js +1 -1
- package/esm/providers/tambo-interactable-provider-partial-updates.test.js.map +1 -1
- package/esm/providers/tambo-interactable-provider.d.ts +2 -3
- package/esm/providers/tambo-interactable-provider.d.ts.map +1 -1
- package/esm/providers/tambo-interactable-provider.js +44 -38
- package/esm/providers/tambo-interactable-provider.js.map +1 -1
- package/esm/providers/tambo-interactables-additional-context-edge-cases.test.js +3 -3
- package/esm/providers/tambo-interactables-additional-context-edge-cases.test.js.map +1 -1
- package/esm/providers/tambo-interactables-additional-context.test.js +3 -3
- package/esm/providers/tambo-interactables-additional-context.test.js.map +1 -1
- package/esm/providers/tambo-registry-provider.d.ts +28 -7
- package/esm/providers/tambo-registry-provider.d.ts.map +1 -1
- package/esm/providers/tambo-registry-provider.js +67 -175
- package/esm/providers/tambo-registry-provider.js.map +1 -1
- package/esm/providers/tambo-registry-provider.test.js +148 -26
- package/esm/providers/tambo-registry-provider.test.js.map +1 -1
- package/esm/providers/tambo-registry-schema-compat.test.d.ts +2 -0
- package/esm/providers/tambo-registry-schema-compat.test.d.ts.map +1 -0
- package/esm/providers/tambo-registry-schema-compat.test.js +578 -0
- package/esm/providers/tambo-registry-schema-compat.test.js.map +1 -0
- package/esm/providers/tambo-stubs.d.ts +2 -2
- package/esm/providers/tambo-stubs.d.ts.map +1 -1
- package/esm/providers/tambo-stubs.js +5 -0
- package/esm/providers/tambo-stubs.js.map +1 -1
- package/esm/providers/tambo-thread-input-provider.d.ts +1 -0
- package/esm/providers/tambo-thread-input-provider.d.ts.map +1 -1
- package/esm/providers/tambo-thread-input-provider.js +3 -3
- package/esm/providers/tambo-thread-input-provider.js.map +1 -1
- package/esm/providers/tambo-thread-provider.d.ts.map +1 -1
- package/esm/providers/tambo-thread-provider.js.map +1 -1
- package/esm/providers/tambo-thread-provider.test.js +24 -28
- package/esm/providers/tambo-thread-provider.test.js.map +1 -1
- package/esm/schema/index.d.ts +6 -0
- package/esm/schema/index.d.ts.map +1 -0
- package/esm/schema/index.js +6 -0
- package/esm/schema/index.js.map +1 -0
- package/esm/schema/json-schema.d.ts +35 -0
- package/esm/schema/json-schema.d.ts.map +1 -0
- package/esm/schema/json-schema.js +98 -0
- package/esm/schema/json-schema.js.map +1 -0
- package/esm/schema/schema.d.ts +66 -0
- package/esm/schema/schema.d.ts.map +1 -0
- package/esm/schema/schema.js +182 -0
- package/esm/schema/schema.js.map +1 -0
- package/esm/schema/schema.test.d.ts +2 -0
- package/esm/schema/schema.test.d.ts.map +1 -0
- package/esm/schema/schema.test.js +39 -0
- package/esm/schema/schema.test.js.map +1 -0
- package/esm/schema/standard-schema.d.ts +21 -0
- package/esm/schema/standard-schema.d.ts.map +1 -0
- package/esm/schema/standard-schema.js +34 -0
- package/esm/schema/standard-schema.js.map +1 -0
- package/esm/schema/validate.d.ts +14 -0
- package/esm/schema/validate.d.ts.map +1 -0
- package/esm/schema/validate.js +145 -0
- package/esm/schema/validate.js.map +1 -0
- package/esm/schema/validate.test.d.ts +2 -0
- package/esm/schema/validate.test.d.ts.map +1 -0
- package/esm/schema/validate.test.js +126 -0
- package/esm/schema/validate.test.js.map +1 -0
- package/esm/schema/zod.d.ts +54 -0
- package/esm/schema/zod.d.ts.map +1 -0
- package/esm/schema/zod.js +136 -0
- package/esm/schema/zod.js.map +1 -0
- package/esm/testing/tools.d.ts +29 -15
- package/esm/testing/tools.d.ts.map +1 -1
- package/esm/testing/tools.js +62 -16
- package/esm/testing/tools.js.map +1 -1
- package/esm/util/generate-component.d.ts.map +1 -1
- package/esm/util/generate-component.js +3 -3
- package/esm/util/generate-component.js.map +1 -1
- package/esm/util/mcp-server-utils.d.ts +23 -0
- package/esm/util/mcp-server-utils.d.ts.map +1 -0
- package/esm/util/mcp-server-utils.js +102 -0
- package/esm/util/mcp-server-utils.js.map +1 -0
- package/esm/util/mcp-server-utils.test.d.ts +2 -0
- package/esm/util/mcp-server-utils.test.d.ts.map +1 -0
- package/esm/util/mcp-server-utils.test.js +285 -0
- package/esm/util/mcp-server-utils.test.js.map +1 -0
- package/esm/util/message-builder.d.ts +2 -1
- package/esm/util/message-builder.d.ts.map +1 -1
- package/esm/util/message-builder.js +54 -36
- package/esm/util/message-builder.js.map +1 -1
- package/esm/util/message-builder.test.js +500 -13
- package/esm/util/message-builder.test.js.map +1 -1
- package/esm/util/registry-validators.d.ts +26 -0
- package/esm/util/registry-validators.d.ts.map +1 -0
- package/esm/util/registry-validators.js +100 -0
- package/esm/util/registry-validators.js.map +1 -0
- package/esm/util/registry-validators.test.d.ts +2 -0
- package/esm/util/registry-validators.test.d.ts.map +1 -0
- package/esm/util/registry-validators.test.js +233 -0
- package/esm/util/registry-validators.test.js.map +1 -0
- package/esm/util/registry.d.ts +35 -7
- package/esm/util/registry.d.ts.map +1 -1
- package/esm/util/registry.js +57 -73
- package/esm/util/registry.js.map +1 -1
- package/esm/util/registry.test.d.ts +2 -0
- package/esm/util/registry.test.d.ts.map +1 -0
- package/esm/util/registry.test.js +169 -0
- package/esm/util/registry.test.js.map +1 -0
- package/esm/util/resource-validators.d.ts +16 -0
- package/esm/util/resource-validators.d.ts.map +1 -0
- package/esm/util/resource-validators.js +30 -0
- package/esm/util/resource-validators.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 +12 -4
- package/esm/util/tool-caller.js.map +1 -1
- package/package.json +13 -8
- package/dist/providers/hoc/with-tambo-interactable.d.ts.map +0 -1
- package/dist/providers/hoc/with-tambo-interactable.js.map +0 -1
- package/dist/util/validate-zod-schema.d.ts +0 -10
- package/dist/util/validate-zod-schema.d.ts.map +0 -1
- package/dist/util/validate-zod-schema.js +0 -100
- package/dist/util/validate-zod-schema.js.map +0 -1
- package/dist/util/validate-zod-schema.test.d.ts +0 -2
- package/dist/util/validate-zod-schema.test.d.ts.map +0 -1
- package/dist/util/validate-zod-schema.test.js +0 -96
- package/dist/util/validate-zod-schema.test.js.map +0 -1
- package/esm/providers/hoc/with-tambo-interactable.d.ts.map +0 -1
- package/esm/providers/hoc/with-tambo-interactable.js.map +0 -1
- package/esm/util/validate-zod-schema.d.ts +0 -10
- package/esm/util/validate-zod-schema.d.ts.map +0 -1
- package/esm/util/validate-zod-schema.js +0 -97
- package/esm/util/validate-zod-schema.js.map +0 -1
- package/esm/util/validate-zod-schema.test.d.ts +0 -2
- package/esm/util/validate-zod-schema.test.d.ts.map +0 -1
- package/esm/util/validate-zod-schema.test.js +0 -94
- package/esm/util/validate-zod-schema.test.js.map +0 -1
|
@@ -33,89 +33,19 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
return result;
|
|
34
34
|
};
|
|
35
35
|
})();
|
|
36
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
37
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
38
|
-
};
|
|
39
36
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
37
|
exports.useTamboMcpServerInfos = exports.useTamboRegistry = exports.TamboRegistryProvider = exports.TamboRegistryContext = void 0;
|
|
41
38
|
const react_1 = __importStar(require("react"));
|
|
42
|
-
const
|
|
43
|
-
const
|
|
44
|
-
const
|
|
45
|
-
const validate_component_name_1 = require("../util/validate-component-name");
|
|
46
|
-
const validate_zod_schema_1 = require("../util/validate-zod-schema");
|
|
47
|
-
/**
|
|
48
|
-
* Derives a short, meaningful key from a server URL.
|
|
49
|
-
* Strips TLDs and common prefixes to get a human-readable identifier.
|
|
50
|
-
* For example, "https://mcp.linear.app/mcp" becomes "linear".
|
|
51
|
-
* @returns A lowercased, human-readable key derived from the URL
|
|
52
|
-
*/
|
|
53
|
-
function deriveServerKey(url) {
|
|
54
|
-
try {
|
|
55
|
-
const parsed = new URL(url);
|
|
56
|
-
const hostname = parsed.hostname;
|
|
57
|
-
// Split hostname into parts
|
|
58
|
-
const parts = hostname.split(".");
|
|
59
|
-
// Remove common TLD patterns
|
|
60
|
-
// Handle cases like: .com, .org, .co.uk, .com.au, etc.
|
|
61
|
-
let relevantParts = [...parts];
|
|
62
|
-
// If we have 3+ parts and the last two are short (likely TLD like .co.uk)
|
|
63
|
-
if (relevantParts.length >= 3 &&
|
|
64
|
-
relevantParts[relevantParts.length - 1].length <= 3 &&
|
|
65
|
-
relevantParts[relevantParts.length - 2].length <= 3) {
|
|
66
|
-
relevantParts = relevantParts.slice(0, -2);
|
|
67
|
-
}
|
|
68
|
-
// Otherwise just remove the last part (TLD like .com)
|
|
69
|
-
else if (relevantParts.length >= 2) {
|
|
70
|
-
relevantParts = relevantParts.slice(0, -1);
|
|
71
|
-
}
|
|
72
|
-
// From what's left, prefer the rightmost part that's not a common prefix
|
|
73
|
-
// Common prefixes: www, api, mcp, app, etc.
|
|
74
|
-
const commonPrefixes = new Set([
|
|
75
|
-
"www",
|
|
76
|
-
"api",
|
|
77
|
-
"mcp",
|
|
78
|
-
"app",
|
|
79
|
-
"staging",
|
|
80
|
-
"dev",
|
|
81
|
-
"prod",
|
|
82
|
-
]);
|
|
83
|
-
// Work backwards through the parts to find a meaningful name
|
|
84
|
-
for (let i = relevantParts.length - 1; i >= 0; i--) {
|
|
85
|
-
const part = relevantParts[i];
|
|
86
|
-
if (part && !commonPrefixes.has(part.toLowerCase())) {
|
|
87
|
-
return part.toLowerCase();
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
// Fallback: use the last relevant part even if it's a common prefix
|
|
91
|
-
return relevantParts[relevantParts.length - 1]?.toLowerCase() || hostname;
|
|
92
|
-
}
|
|
93
|
-
catch {
|
|
94
|
-
// If URL parsing fails, just return a sanitized version of the input
|
|
95
|
-
return url.replace(/[^a-zA-Z0-9]/g, "_").toLowerCase();
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Normalizes an MCP server info object, ensuring it has a serverKey.
|
|
100
|
-
* If serverKey is not provided, derives it from the URL.
|
|
101
|
-
* @returns The normalized MCP server info object
|
|
102
|
-
*/
|
|
103
|
-
function normalizeServerInfo(server) {
|
|
104
|
-
const base = typeof server === "string"
|
|
105
|
-
? {
|
|
106
|
-
url: server,
|
|
107
|
-
transport: mcp_server_info_1.MCPTransport.HTTP,
|
|
108
|
-
}
|
|
109
|
-
: server;
|
|
110
|
-
const serverKey = base.serverKey ?? deriveServerKey(base.url);
|
|
111
|
-
const transport = base.transport ?? mcp_server_info_1.MCPTransport.HTTP;
|
|
112
|
-
return { ...base, transport, serverKey };
|
|
113
|
-
}
|
|
39
|
+
const mcp_server_utils_1 = require("../util/mcp-server-utils");
|
|
40
|
+
const registry_validators_1 = require("../util/registry-validators");
|
|
41
|
+
const resource_validators_1 = require("../util/resource-validators");
|
|
114
42
|
exports.TamboRegistryContext = (0, react_1.createContext)({
|
|
115
43
|
componentList: {},
|
|
116
44
|
toolRegistry: {},
|
|
117
45
|
componentToolAssociations: {},
|
|
118
46
|
mcpServerInfos: [],
|
|
47
|
+
resources: [],
|
|
48
|
+
resourceSource: null,
|
|
119
49
|
/**
|
|
120
50
|
*
|
|
121
51
|
*/
|
|
@@ -140,6 +70,18 @@ exports.TamboRegistryContext = (0, react_1.createContext)({
|
|
|
140
70
|
*
|
|
141
71
|
*/
|
|
142
72
|
registerMcpServers: () => { },
|
|
73
|
+
/**
|
|
74
|
+
*
|
|
75
|
+
*/
|
|
76
|
+
registerResource: () => { },
|
|
77
|
+
/**
|
|
78
|
+
*
|
|
79
|
+
*/
|
|
80
|
+
registerResources: () => { },
|
|
81
|
+
/**
|
|
82
|
+
*
|
|
83
|
+
*/
|
|
84
|
+
registerResourceSource: () => { },
|
|
143
85
|
});
|
|
144
86
|
/**
|
|
145
87
|
* The TamboRegistryProvider is a React provider that provides a component
|
|
@@ -149,22 +91,22 @@ exports.TamboRegistryContext = (0, react_1.createContext)({
|
|
|
149
91
|
* @param props.components - The components to register
|
|
150
92
|
* @param props.tools - The tools to register
|
|
151
93
|
* @param props.mcpServers - The MCP servers to register
|
|
94
|
+
* @param props.resources - The static resources to register
|
|
95
|
+
* @param props.listResources - The dynamic resource search function (must be paired with getResource)
|
|
96
|
+
* @param props.getResource - The dynamic resource fetch function (must be paired with listResources)
|
|
152
97
|
* @param props.onCallUnregisteredTool - The function to call when an unknown tool is called (optional)
|
|
153
98
|
* @returns The TamboRegistryProvider component
|
|
154
99
|
*/
|
|
155
|
-
const TamboRegistryProvider = ({ children, components: userComponents, tools: userTools, mcpServers: userMcpServers, onCallUnregisteredTool, }) => {
|
|
100
|
+
const TamboRegistryProvider = ({ children, components: userComponents, tools: userTools, mcpServers: userMcpServers, resources: userResources, listResources: userListResources, getResource: userGetResource, onCallUnregisteredTool, }) => {
|
|
156
101
|
const [componentList, setComponentList] = (0, react_1.useState)({});
|
|
157
102
|
const [toolRegistry, setToolRegistry] = (0, react_1.useState)({});
|
|
158
103
|
const [componentToolAssociations, setComponentToolAssociations] = (0, react_1.useState)({});
|
|
159
104
|
const [staticMcpServerInfos, setStaticMcpServerInfos] = (0, react_1.useState)([]);
|
|
160
105
|
const [dynamicMcpServerInfos, setDynamicMcpServerInfos] = (0, react_1.useState)([]);
|
|
106
|
+
const [staticResources, setStaticResources] = (0, react_1.useState)([]);
|
|
107
|
+
const [resourceSource, setResourceSource] = (0, react_1.useState)(null);
|
|
161
108
|
const registerTool = (0, react_1.useCallback)((tool, warnOnOverwrite = true) => {
|
|
162
|
-
|
|
163
|
-
(0, validate_component_name_1.assertValidName)(tool.name, "tool");
|
|
164
|
-
// Validate tool schemas
|
|
165
|
-
if (tool.toolSchema && isZodSchema(tool.toolSchema)) {
|
|
166
|
-
(0, validate_zod_schema_1.assertNoZodRecord)(tool.toolSchema, `toolSchema of tool "${tool.name}"`);
|
|
167
|
-
}
|
|
109
|
+
(0, registry_validators_1.validateTool)(tool);
|
|
168
110
|
setToolRegistry((prev) => {
|
|
169
111
|
if (prev[tool.name] && warnOnOverwrite) {
|
|
170
112
|
console.warn(`Overwriting tool ${tool.name}`);
|
|
@@ -179,46 +121,23 @@ const TamboRegistryProvider = ({ children, components: userComponents, tools: us
|
|
|
179
121
|
tools.forEach((tool) => registerTool(tool, warnOnOverwrite));
|
|
180
122
|
}, [registerTool]);
|
|
181
123
|
const registerMcpServer = (0, react_1.useCallback)((info) => {
|
|
182
|
-
const normalized = normalizeServerInfo(info);
|
|
124
|
+
const normalized = (0, mcp_server_utils_1.normalizeServerInfo)(info);
|
|
183
125
|
setDynamicMcpServerInfos((prev) => [...prev, normalized]);
|
|
184
126
|
}, []);
|
|
185
127
|
const registerMcpServers = (0, react_1.useCallback)((infos) => {
|
|
186
|
-
const normalized = infos.map(normalizeServerInfo);
|
|
128
|
+
const normalized = infos.map(mcp_server_utils_1.normalizeServerInfo);
|
|
187
129
|
setDynamicMcpServerInfos((prev) => [...prev, ...normalized]);
|
|
188
130
|
}, []);
|
|
189
131
|
const addToolAssociation = (0, react_1.useCallback)((componentName, tool) => {
|
|
190
|
-
|
|
191
|
-
(0, validate_component_name_1.assertValidName)(componentName, "component");
|
|
192
|
-
(0, validate_component_name_1.assertValidName)(tool.name, "tool");
|
|
193
|
-
if (!componentList[componentName]) {
|
|
194
|
-
throw new Error(`Component ${componentName} not found in registry`);
|
|
195
|
-
}
|
|
196
|
-
if (!toolRegistry[tool.name]) {
|
|
197
|
-
throw new Error(`Tool ${tool.name} not found in registry`);
|
|
198
|
-
}
|
|
132
|
+
(0, registry_validators_1.validateToolAssociation)(componentName, tool.name, !!componentList[componentName], !!toolRegistry[tool.name]);
|
|
199
133
|
setComponentToolAssociations((prev) => ({
|
|
200
134
|
...prev,
|
|
201
135
|
[componentName]: [...(prev[componentName] || []), tool.name],
|
|
202
136
|
}));
|
|
203
137
|
}, [componentList, toolRegistry]);
|
|
204
138
|
const registerComponent = (0, react_1.useCallback)((options, warnOnOverwrite = true) => {
|
|
205
|
-
const { name, description, component,
|
|
206
|
-
|
|
207
|
-
(0, validate_component_name_1.assertValidName)(name, "component");
|
|
208
|
-
// Validate that at least one props definition is provided
|
|
209
|
-
if (!propsSchema && !propsDefinition) {
|
|
210
|
-
throw new Error(`Component ${name} must have either propsSchema (recommended) or propsDefinition defined`);
|
|
211
|
-
}
|
|
212
|
-
// Validate that only one props definition is provided
|
|
213
|
-
if (propsSchema && propsDefinition) {
|
|
214
|
-
throw new Error(`Component ${name} cannot have both propsSchema and propsDefinition defined. Use only one. We recommend using propsSchema.`);
|
|
215
|
-
}
|
|
216
|
-
// Validate that the propsSchema does not include z.record()
|
|
217
|
-
if (propsSchema && isZodSchema(propsSchema)) {
|
|
218
|
-
(0, validate_zod_schema_1.assertNoZodRecord)(propsSchema, `propsSchema of component "${name}"`);
|
|
219
|
-
}
|
|
220
|
-
// Convert propsSchema to JSON Schema if it exists
|
|
221
|
-
const props = getSerializedProps(propsDefinition, propsSchema, name);
|
|
139
|
+
const { name, description, component, loadingComponent, associatedTools, } = options;
|
|
140
|
+
const { props } = (0, registry_validators_1.validateAndPrepareComponent)(options);
|
|
222
141
|
setComponentList((prev) => {
|
|
223
142
|
if (prev[name] && warnOnOverwrite) {
|
|
224
143
|
console.warn(`overwriting component ${name}`);
|
|
@@ -261,47 +180,63 @@ const TamboRegistryProvider = ({ children, components: userComponents, tools: us
|
|
|
261
180
|
return;
|
|
262
181
|
}
|
|
263
182
|
// Normalize servers from props and ensure all have serverKey and transport
|
|
264
|
-
const normalized = userMcpServers.map(normalizeServerInfo);
|
|
183
|
+
const normalized = userMcpServers.map(mcp_server_utils_1.normalizeServerInfo);
|
|
265
184
|
setStaticMcpServerInfos(normalized);
|
|
266
185
|
}, [userMcpServers]);
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
186
|
+
(0, react_1.useEffect)(() => {
|
|
187
|
+
// Validate that listResources and getResource are both provided or both omitted
|
|
188
|
+
(0, resource_validators_1.validateResourceSource)(userListResources, userGetResource);
|
|
189
|
+
// Set static resources from props
|
|
190
|
+
if (userResources) {
|
|
191
|
+
userResources.forEach((resource) => (0, resource_validators_1.validateResource)(resource));
|
|
192
|
+
setStaticResources(userResources);
|
|
271
193
|
}
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
for (const server of allServers) {
|
|
275
|
-
const key = (0, mcp_server_info_1.getMcpServerUniqueKey)(server);
|
|
276
|
-
byKey.set(key, server);
|
|
194
|
+
else {
|
|
195
|
+
setStaticResources([]);
|
|
277
196
|
}
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
197
|
+
// Set resource source from props
|
|
198
|
+
if (userListResources && userGetResource) {
|
|
199
|
+
setResourceSource({
|
|
200
|
+
listResources: userListResources,
|
|
201
|
+
getResource: userGetResource,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
setResourceSource(null);
|
|
206
|
+
}
|
|
207
|
+
}, [userResources, userListResources, userGetResource]);
|
|
208
|
+
const registerResource = (0, react_1.useCallback)((resource) => {
|
|
209
|
+
(0, resource_validators_1.validateResource)(resource);
|
|
210
|
+
setStaticResources((prev) => [...prev, resource]);
|
|
211
|
+
}, []);
|
|
212
|
+
const registerResources = (0, react_1.useCallback)((resources) => {
|
|
213
|
+
resources.forEach((resource) => (0, resource_validators_1.validateResource)(resource));
|
|
214
|
+
setStaticResources((prev) => [...prev, ...resources]);
|
|
215
|
+
}, []);
|
|
216
|
+
const registerResourceSource = (0, react_1.useCallback)((source) => {
|
|
217
|
+
(0, resource_validators_1.validateResourceSource)(source.listResources, source.getResource);
|
|
218
|
+
setResourceSource(source);
|
|
219
|
+
}, []);
|
|
220
|
+
const mcpServerInfos = (0, react_1.useMemo)(() => {
|
|
221
|
+
const allServers = [...staticMcpServerInfos, ...dynamicMcpServerInfos];
|
|
222
|
+
return (0, mcp_server_utils_1.deduplicateMcpServers)(allServers);
|
|
293
223
|
}, [staticMcpServerInfos, dynamicMcpServerInfos]);
|
|
294
224
|
const value = {
|
|
295
225
|
componentList,
|
|
296
226
|
toolRegistry,
|
|
297
227
|
componentToolAssociations,
|
|
298
228
|
mcpServerInfos,
|
|
229
|
+
resources: staticResources,
|
|
230
|
+
resourceSource,
|
|
299
231
|
registerComponent,
|
|
300
232
|
registerTool,
|
|
301
233
|
registerTools,
|
|
302
234
|
addToolAssociation,
|
|
303
235
|
registerMcpServer,
|
|
304
236
|
registerMcpServers,
|
|
237
|
+
registerResource,
|
|
238
|
+
registerResources,
|
|
239
|
+
registerResourceSource,
|
|
305
240
|
onCallUnregisteredTool,
|
|
306
241
|
};
|
|
307
242
|
return (react_1.default.createElement(exports.TamboRegistryContext.Provider, { value: value }, children));
|
|
@@ -349,50 +284,4 @@ const useTamboMcpServerInfos = () => {
|
|
|
349
284
|
return (0, react_1.useContext)(exports.TamboRegistryContext).mcpServerInfos;
|
|
350
285
|
};
|
|
351
286
|
exports.useTamboMcpServerInfos = useTamboMcpServerInfos;
|
|
352
|
-
function getSerializedProps(propsDefinition, propsSchema, name) {
|
|
353
|
-
if (propsDefinition) {
|
|
354
|
-
console.warn(`propsDefinition is deprecated. Use propsSchema instead.`);
|
|
355
|
-
return propsDefinition;
|
|
356
|
-
}
|
|
357
|
-
if (isZodSchema(propsSchema)) {
|
|
358
|
-
try {
|
|
359
|
-
return (0, zod_to_json_schema_1.default)(propsSchema);
|
|
360
|
-
}
|
|
361
|
-
catch (error) {
|
|
362
|
-
console.error(`Error converting ${name} props schema to JSON Schema:`, error);
|
|
363
|
-
}
|
|
364
|
-
}
|
|
365
|
-
// try to roughly detect JSONSchema, should always be an object with a properties key
|
|
366
|
-
if (isJSONSchema(propsSchema)) {
|
|
367
|
-
return propsSchema;
|
|
368
|
-
}
|
|
369
|
-
throw new Error(`Invalid props schema for ${name}`);
|
|
370
|
-
}
|
|
371
|
-
/**
|
|
372
|
-
* Checks if the propsSchema is a JSON Schema. This is a rough check, and the
|
|
373
|
-
* server will provide the definitive check.
|
|
374
|
-
* @param propsSchema - The props schema to check
|
|
375
|
-
* @returns True if the props schema is a JSON Schema, false otherwise
|
|
376
|
-
*/
|
|
377
|
-
function isJSONSchema(propsSchema) {
|
|
378
|
-
return (propsSchema &&
|
|
379
|
-
typeof propsSchema === "object" &&
|
|
380
|
-
propsSchema.type === "object" &&
|
|
381
|
-
propsSchema.properties);
|
|
382
|
-
}
|
|
383
|
-
/**
|
|
384
|
-
* Since we require a certain zod version, we need to check if the object is a ZodSchema
|
|
385
|
-
* @param obj - The object to check
|
|
386
|
-
* @returns True if the object is a ZodSchema, false otherwise
|
|
387
|
-
*/
|
|
388
|
-
function isZodSchema(obj) {
|
|
389
|
-
if (obj instanceof v3_1.ZodSchema) {
|
|
390
|
-
return true;
|
|
391
|
-
}
|
|
392
|
-
// try to detect if the object is a ZodSchema
|
|
393
|
-
return (typeof obj === "object" &&
|
|
394
|
-
obj !== null &&
|
|
395
|
-
typeof obj.safeParse === "function" &&
|
|
396
|
-
typeof obj._def === "object");
|
|
397
|
-
}
|
|
398
287
|
//# sourceMappingURL=tambo-registry-provider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tambo-registry-provider.js","sourceRoot":"","sources":["../../src/providers/tambo-registry-provider.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\nimport type TamboAI from \"@tambo-ai/typescript-sdk\";\nimport React, {\n createContext,\n PropsWithChildren,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { ZodSchema } from \"zod/v3\";\nimport zodToJsonSchema from \"zod-to-json-schema\";\nimport {\n ComponentRegistry,\n TamboComponent,\n TamboTool,\n} from \"../model/component-metadata\";\nimport {\n getMcpServerUniqueKey,\n McpServerInfo,\n MCPTransport,\n type NormalizedMcpServerInfo,\n} from \"../model/mcp-server-info\";\nimport { assertValidName } from \"../util/validate-component-name\";\nimport { assertNoZodRecord } from \"../util/validate-zod-schema\";\n\n/**\n * Derives a short, meaningful key from a server URL.\n * Strips TLDs and common prefixes to get a human-readable identifier.\n * For example, \"https://mcp.linear.app/mcp\" becomes \"linear\".\n * @returns A lowercased, human-readable key derived from the URL\n */\nfunction deriveServerKey(url: string): string {\n try {\n const parsed = new URL(url);\n const hostname = parsed.hostname;\n\n // Split hostname into parts\n const parts = hostname.split(\".\");\n\n // Remove common TLD patterns\n // Handle cases like: .com, .org, .co.uk, .com.au, etc.\n let relevantParts = [...parts];\n\n // If we have 3+ parts and the last two are short (likely TLD like .co.uk)\n if (\n relevantParts.length >= 3 &&\n relevantParts[relevantParts.length - 1].length <= 3 &&\n relevantParts[relevantParts.length - 2].length <= 3\n ) {\n relevantParts = relevantParts.slice(0, -2);\n }\n // Otherwise just remove the last part (TLD like .com)\n else if (relevantParts.length >= 2) {\n relevantParts = relevantParts.slice(0, -1);\n }\n\n // From what's left, prefer the rightmost part that's not a common prefix\n // Common prefixes: www, api, mcp, app, etc.\n const commonPrefixes = new Set([\n \"www\",\n \"api\",\n \"mcp\",\n \"app\",\n \"staging\",\n \"dev\",\n \"prod\",\n ]);\n\n // Work backwards through the parts to find a meaningful name\n for (let i = relevantParts.length - 1; i >= 0; i--) {\n const part = relevantParts[i];\n if (part && !commonPrefixes.has(part.toLowerCase())) {\n return part.toLowerCase();\n }\n }\n\n // Fallback: use the last relevant part even if it's a common prefix\n return relevantParts[relevantParts.length - 1]?.toLowerCase() || hostname;\n } catch {\n // If URL parsing fails, just return a sanitized version of the input\n return url.replace(/[^a-zA-Z0-9]/g, \"_\").toLowerCase();\n }\n}\n\n/**\n * Normalizes an MCP server info object, ensuring it has a serverKey.\n * If serverKey is not provided, derives it from the URL.\n * @returns The normalized MCP server info object\n */\nfunction normalizeServerInfo(\n server: McpServerInfo | string,\n): NormalizedMcpServerInfo {\n const base: McpServerInfo =\n typeof server === \"string\"\n ? {\n url: server,\n transport: MCPTransport.HTTP,\n }\n : server;\n\n const serverKey = base.serverKey ?? deriveServerKey(base.url);\n const transport = base.transport ?? MCPTransport.HTTP;\n\n return { ...base, transport, serverKey };\n}\n\nexport interface TamboRegistryContext {\n componentList: ComponentRegistry;\n toolRegistry: Record<string, TamboTool>;\n componentToolAssociations: Record<string, string[]>;\n mcpServerInfos: NormalizedMcpServerInfo[];\n registerComponent: (options: TamboComponent) => void;\n registerTool: (tool: TamboTool) => void;\n registerTools: (tools: TamboTool[]) => void;\n addToolAssociation: (componentName: string, tool: TamboTool) => void;\n registerMcpServer: (info: McpServerInfo) => void;\n registerMcpServers: (infos: McpServerInfo[]) => void;\n onCallUnregisteredTool?: (\n toolName: string,\n args: TamboAI.ToolCallParameter[],\n ) => Promise<string>;\n}\n\nexport const TamboRegistryContext = createContext<TamboRegistryContext>({\n componentList: {},\n toolRegistry: {},\n componentToolAssociations: {},\n mcpServerInfos: [],\n /**\n *\n */\n registerComponent: () => {},\n /**\n *\n */\n registerTool: () => {},\n /**\n *\n */\n registerTools: () => {},\n /**\n *\n */\n addToolAssociation: () => {},\n /**\n *\n */\n registerMcpServer: () => {},\n /**\n *\n */\n registerMcpServers: () => {},\n});\n\nexport interface TamboRegistryProviderProps {\n /** The components to register */\n components?: TamboComponent[];\n /** The tools to register */\n tools?: TamboTool[];\n /** The MCP servers to register */\n mcpServers?: (McpServerInfo | string)[];\n\n /**\n * A function to call when an unknown tool is called. If this function is not\n * provided, an error will be thrown when a tool call is requested by the\n * server.\n *\n * Note that this is generally only for agents, where the agent code may\n * request tool calls that are not registered in the tool registry.\n */\n onCallUnregisteredTool?: (\n toolName: string,\n args: TamboAI.ToolCallParameter[],\n ) => Promise<string>;\n}\n\n/**\n * The TamboRegistryProvider is a React provider that provides a component\n * registry to the descendants of the provider.\n * @param props - The props for the TamboRegistryProvider\n * @param props.children - The children to wrap\n * @param props.components - The components to register\n * @param props.tools - The tools to register\n * @param props.mcpServers - The MCP servers to register\n * @param props.onCallUnregisteredTool - The function to call when an unknown tool is called (optional)\n * @returns The TamboRegistryProvider component\n */\nexport const TamboRegistryProvider: React.FC<\n PropsWithChildren<TamboRegistryProviderProps>\n> = ({\n children,\n components: userComponents,\n tools: userTools,\n mcpServers: userMcpServers,\n onCallUnregisteredTool,\n}) => {\n const [componentList, setComponentList] = useState<ComponentRegistry>({});\n const [toolRegistry, setToolRegistry] = useState<Record<string, TamboTool>>(\n {},\n );\n const [componentToolAssociations, setComponentToolAssociations] = useState<\n Record<string, string[]>\n >({});\n const [staticMcpServerInfos, setStaticMcpServerInfos] = useState<\n NormalizedMcpServerInfo[]\n >([]);\n const [dynamicMcpServerInfos, setDynamicMcpServerInfos] = useState<\n NormalizedMcpServerInfo[]\n >([]);\n\n const registerTool = useCallback(\n (tool: TamboTool, warnOnOverwrite = true) => {\n // Validate tool name\n assertValidName(tool.name, \"tool\");\n\n // Validate tool schemas\n if (tool.toolSchema && isZodSchema(tool.toolSchema)) {\n assertNoZodRecord(tool.toolSchema, `toolSchema of tool \"${tool.name}\"`);\n }\n setToolRegistry((prev) => {\n if (prev[tool.name] && warnOnOverwrite) {\n console.warn(`Overwriting tool ${tool.name}`);\n }\n return {\n ...prev,\n [tool.name]: tool,\n };\n });\n },\n [],\n );\n\n const registerTools = useCallback(\n (tools: TamboTool[], warnOnOverwrite = true) => {\n tools.forEach((tool) => registerTool(tool, warnOnOverwrite));\n },\n [registerTool],\n );\n\n const registerMcpServer = useCallback((info: McpServerInfo | string) => {\n const normalized = normalizeServerInfo(info);\n setDynamicMcpServerInfos((prev) => [...prev, normalized]);\n }, []);\n\n const registerMcpServers = useCallback(\n (infos: (McpServerInfo | string)[]) => {\n const normalized = infos.map(normalizeServerInfo);\n setDynamicMcpServerInfos((prev) => [...prev, ...normalized]);\n },\n [],\n );\n\n const addToolAssociation = useCallback(\n (componentName: string, tool: TamboTool) => {\n // Validate component and tool names\n assertValidName(componentName, \"component\");\n assertValidName(tool.name, \"tool\");\n\n if (!componentList[componentName]) {\n throw new Error(`Component ${componentName} not found in registry`);\n }\n if (!toolRegistry[tool.name]) {\n throw new Error(`Tool ${tool.name} not found in registry`);\n }\n\n setComponentToolAssociations((prev) => ({\n ...prev,\n [componentName]: [...(prev[componentName] || []), tool.name],\n }));\n },\n [componentList, toolRegistry],\n );\n\n const registerComponent = useCallback(\n (options: TamboComponent, warnOnOverwrite = true) => {\n const {\n name,\n description,\n component,\n propsSchema,\n propsDefinition,\n loadingComponent,\n associatedTools,\n } = options;\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 z.record()\n if (propsSchema && isZodSchema(propsSchema)) {\n assertNoZodRecord(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 setComponentList((prev) => {\n if (prev[name] && warnOnOverwrite) {\n console.warn(`overwriting component ${name}`);\n }\n return {\n ...prev,\n [name]: {\n component,\n loadingComponent,\n name,\n description,\n props,\n contextTools: [],\n },\n };\n });\n if (associatedTools) {\n registerTools(associatedTools);\n setComponentToolAssociations((prev) => ({\n ...prev,\n [name]: associatedTools.map((tool) => tool.name),\n }));\n }\n },\n [registerTools],\n );\n useEffect(() => {\n if (userComponents) {\n userComponents.forEach((component) => {\n registerComponent(component, false);\n });\n }\n }, [registerComponent, userComponents]);\n\n useEffect(() => {\n if (userTools) {\n registerTools(userTools, false);\n }\n }, [registerTools, userTools]);\n\n useEffect(() => {\n if (!userMcpServers || userMcpServers.length === 0) {\n setStaticMcpServerInfos([]);\n return;\n }\n\n // Normalize servers from props and ensure all have serverKey and transport\n const normalized = userMcpServers.map(normalizeServerInfo);\n setStaticMcpServerInfos(normalized);\n }, [userMcpServers]);\n\n const mcpServerInfos: NormalizedMcpServerInfo[] = useMemo(() => {\n const allServers = [...staticMcpServerInfos, ...dynamicMcpServerInfos];\n if (allServers.length === 0) {\n return allServers;\n }\n\n // 1. Deduplicate by connection identity using a stable key\n const byKey = new Map<string, NormalizedMcpServerInfo>();\n for (const server of allServers) {\n const key = getMcpServerUniqueKey(server);\n byKey.set(key, server);\n }\n\n const deduped = Array.from(byKey.values());\n\n // 2. Ensure serverKey uniqueness for readable, unambiguous prefixes\n const seen = new Map<string, number>();\n return deduped.map((server) => {\n const baseKey = server.serverKey;\n const count = (seen.get(baseKey) ?? 0) + 1;\n seen.set(baseKey, count);\n\n if (count === 1) {\n return server;\n }\n\n return {\n ...server,\n serverKey: `${baseKey}-${count}`,\n };\n });\n }, [staticMcpServerInfos, dynamicMcpServerInfos]);\n\n const value = {\n componentList,\n toolRegistry,\n componentToolAssociations,\n mcpServerInfos,\n registerComponent,\n registerTool,\n registerTools,\n addToolAssociation,\n registerMcpServer,\n registerMcpServers,\n onCallUnregisteredTool,\n };\n\n return (\n <TamboRegistryContext.Provider value={value}>\n {children}\n </TamboRegistryContext.Provider>\n );\n};\n\n/**\n * The useTamboRegistry hook provides access to the component registry\n * to the descendants of the TamboRegistryProvider.\n * @returns The component registry\n */\nexport const useTamboRegistry = () => {\n return useContext(TamboRegistryContext);\n};\n\n/**\n * Hook to access the MCP server metadata from TamboRegistryProvider.\n * This provides access to the registered MCP server configurations (metadata only, not connections).\n *\n * This hook can be used anywhere within the TamboProvider hierarchy to access\n * the list of configured MCP servers without needing to be inside TamboMcpProvider.\n * @returns Array of MCP server metadata\n * @example\n * ```tsx\n * function MyComponent() {\n * const mcpServers = useTamboMcpServerInfos();\n *\n * return (\n * <div>\n * <h3>Configured MCP Servers:</h3>\n * {mcpServers.map((server) => (\n * <div key={server.url}>\n * {server.name || server.url}\n * </div>\n * ))}\n * </div>\n * );\n * }\n * ```\n *\n * The returned objects are `NormalizedMcpServerInfo` instances, meaning both\n * `serverKey` and `transport` are always populated (with `transport`\n * defaulting to HTTP when not explicitly specified).\n */\nexport const useTamboMcpServerInfos = (): NormalizedMcpServerInfo[] => {\n return useContext(TamboRegistryContext).mcpServerInfos;\n};\nfunction getSerializedProps(\n propsDefinition: any,\n propsSchema: any,\n name: string,\n) {\n if (propsDefinition) {\n console.warn(`propsDefinition is deprecated. Use propsSchema instead.`);\n return propsDefinition;\n }\n\n if (isZodSchema(propsSchema)) {\n try {\n return zodToJsonSchema(propsSchema);\n } catch (error) {\n console.error(\n `Error converting ${name} props schema to JSON Schema:`,\n error,\n );\n }\n }\n // try to roughly detect JSONSchema, should always be an object with a properties key\n if (isJSONSchema(propsSchema)) {\n return propsSchema;\n }\n\n throw new Error(`Invalid props schema for ${name}`);\n}\n\n/**\n * Checks if the propsSchema is a JSON Schema. This is a rough check, and the\n * server will provide the definitive check.\n * @param propsSchema - The props schema to check\n * @returns True if the props schema is a JSON Schema, false otherwise\n */\nfunction isJSONSchema(propsSchema: any) {\n return (\n propsSchema &&\n typeof propsSchema === \"object\" &&\n propsSchema.type === \"object\" &&\n propsSchema.properties\n );\n}\n\n/**\n * Since we require a certain zod version, we need to check if the object is a ZodSchema\n * @param obj - The object to check\n * @returns True if the object is a ZodSchema, false otherwise\n */\nfunction isZodSchema(obj: unknown): obj is ZodSchema {\n if (obj instanceof ZodSchema) {\n return true;\n }\n // try to detect if the object is a ZodSchema\n return (\n typeof obj === \"object\" &&\n obj !== null &&\n typeof (obj as any).safeParse === \"function\" &&\n typeof (obj as any)._def === \"object\"\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tambo-registry-provider.js","sourceRoot":"","sources":["../../src/providers/tambo-registry-provider.tsx"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\nimport type TamboAI from \"@tambo-ai/typescript-sdk\";\nimport React, {\n createContext,\n PropsWithChildren,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport type {\n ComponentRegistry,\n RegisterToolFn,\n RegisterToolsFn,\n TamboComponent,\n TamboTool,\n TamboToolRegistry,\n TamboToolWithToolSchema,\n} from \"../model/component-metadata\";\nimport type {\n McpServerInfo,\n NormalizedMcpServerInfo,\n} from \"../model/mcp-server-info\";\nimport type { ListResourceItem, ResourceSource } from \"../model/resource-info\";\nimport {\n deduplicateMcpServers,\n normalizeServerInfo,\n} from \"../util/mcp-server-utils\";\nimport {\n validateAndPrepareComponent,\n validateTool,\n validateToolAssociation,\n} from \"../util/registry-validators\";\nimport {\n validateResource,\n validateResourceSource,\n} from \"../util/resource-validators\";\n\nexport interface TamboRegistryContext {\n componentList: ComponentRegistry;\n toolRegistry: TamboToolRegistry;\n componentToolAssociations: Record<string, string[]>;\n mcpServerInfos: NormalizedMcpServerInfo[];\n resources: ListResourceItem[];\n resourceSource: ResourceSource | null;\n registerComponent: (options: TamboComponent) => void;\n registerTool: RegisterToolFn;\n registerTools: RegisterToolsFn;\n addToolAssociation: (\n componentName: string,\n tool: TamboTool | TamboToolWithToolSchema,\n ) => void;\n registerMcpServer: (info: McpServerInfo) => void;\n registerMcpServers: (infos: McpServerInfo[]) => void;\n registerResource: (resource: ListResourceItem) => void;\n registerResources: (resources: ListResourceItem[]) => void;\n registerResourceSource: (source: ResourceSource) => void;\n onCallUnregisteredTool?: (\n toolName: string,\n args: TamboAI.ToolCallParameter[],\n ) => Promise<string>;\n}\n\nexport const TamboRegistryContext = createContext<TamboRegistryContext>({\n componentList: {},\n toolRegistry: {},\n componentToolAssociations: {},\n mcpServerInfos: [],\n resources: [],\n resourceSource: null,\n /**\n *\n */\n registerComponent: () => {},\n /**\n *\n */\n registerTool: () => {},\n /**\n *\n */\n registerTools: () => {},\n /**\n *\n */\n addToolAssociation: () => {},\n /**\n *\n */\n registerMcpServer: () => {},\n /**\n *\n */\n registerMcpServers: () => {},\n /**\n *\n */\n registerResource: () => {},\n /**\n *\n */\n registerResources: () => {},\n /**\n *\n */\n registerResourceSource: () => {},\n});\n\nexport interface TamboRegistryProviderProps {\n /** The components to register */\n components?: TamboComponent[];\n /** The tools to register */\n tools?: (TamboTool | TamboToolWithToolSchema)[];\n /** The MCP servers to register */\n mcpServers?: (McpServerInfo | string)[];\n /** The static resources to register */\n resources?: ListResourceItem[];\n\n /**\n * Dynamic resource search function. Must be paired with getResource.\n * Called when useTamboMcpResourceList() is used to fetch resources.\n */\n listResources?: ResourceSource[\"listResources\"];\n\n /**\n * Dynamic resource fetch function. Must be paired with listResources.\n * Called when useTamboMcpResource() is used to fetch a specific resource.\n */\n getResource?: ResourceSource[\"getResource\"];\n\n /**\n * A function to call when an unknown tool is called. If this function is not\n * provided, an error will be thrown when a tool call is requested by the\n * server.\n *\n * Note that this is generally only for agents, where the agent code may\n * request tool calls that are not registered in the tool registry.\n */\n onCallUnregisteredTool?: (\n toolName: string,\n args: TamboAI.ToolCallParameter[],\n ) => Promise<string>;\n}\n\n/**\n * The TamboRegistryProvider is a React provider that provides a component\n * registry to the descendants of the provider.\n * @param props - The props for the TamboRegistryProvider\n * @param props.children - The children to wrap\n * @param props.components - The components to register\n * @param props.tools - The tools to register\n * @param props.mcpServers - The MCP servers to register\n * @param props.resources - The static resources to register\n * @param props.listResources - The dynamic resource search function (must be paired with getResource)\n * @param props.getResource - The dynamic resource fetch function (must be paired with listResources)\n * @param props.onCallUnregisteredTool - The function to call when an unknown tool is called (optional)\n * @returns The TamboRegistryProvider component\n */\nexport const TamboRegistryProvider: React.FC<\n PropsWithChildren<TamboRegistryProviderProps>\n> = ({\n children,\n components: userComponents,\n tools: userTools,\n mcpServers: userMcpServers,\n resources: userResources,\n listResources: userListResources,\n getResource: userGetResource,\n onCallUnregisteredTool,\n}) => {\n const [componentList, setComponentList] = useState<ComponentRegistry>({});\n const [toolRegistry, setToolRegistry] = useState<TamboToolRegistry>({});\n const [componentToolAssociations, setComponentToolAssociations] = useState<\n Record<string, string[]>\n >({});\n const [staticMcpServerInfos, setStaticMcpServerInfos] = useState<\n NormalizedMcpServerInfo[]\n >([]);\n const [dynamicMcpServerInfos, setDynamicMcpServerInfos] = useState<\n NormalizedMcpServerInfo[]\n >([]);\n const [staticResources, setStaticResources] = useState<ListResourceItem[]>(\n [],\n );\n const [resourceSource, setResourceSource] = useState<ResourceSource | null>(\n null,\n );\n\n const registerTool = useCallback(\n (tool: TamboTool | TamboToolWithToolSchema, warnOnOverwrite = true) => {\n validateTool(tool);\n\n setToolRegistry((prev) => {\n if (prev[tool.name] && warnOnOverwrite) {\n console.warn(`Overwriting tool ${tool.name}`);\n }\n return {\n ...prev,\n [tool.name]: tool,\n };\n });\n },\n [],\n );\n\n const registerTools = useCallback(\n (\n tools: (TamboTool | TamboToolWithToolSchema)[],\n warnOnOverwrite = true,\n ) => {\n tools.forEach((tool) => registerTool(tool, warnOnOverwrite));\n },\n [registerTool],\n );\n\n const registerMcpServer = useCallback((info: McpServerInfo | string) => {\n const normalized = normalizeServerInfo(info);\n setDynamicMcpServerInfos((prev) => [...prev, normalized]);\n }, []);\n\n const registerMcpServers = useCallback(\n (infos: (McpServerInfo | string)[]) => {\n const normalized = infos.map(normalizeServerInfo);\n setDynamicMcpServerInfos((prev) => [...prev, ...normalized]);\n },\n [],\n );\n\n const addToolAssociation = useCallback(\n (componentName: string, tool: TamboTool | TamboToolWithToolSchema) => {\n validateToolAssociation(\n componentName,\n tool.name,\n !!componentList[componentName],\n !!toolRegistry[tool.name],\n );\n\n setComponentToolAssociations((prev) => ({\n ...prev,\n [componentName]: [...(prev[componentName] || []), tool.name],\n }));\n },\n [componentList, toolRegistry],\n );\n\n const registerComponent = useCallback(\n (options: TamboComponent, warnOnOverwrite = true) => {\n const {\n name,\n description,\n component,\n loadingComponent,\n associatedTools,\n } = options;\n\n const { props } = validateAndPrepareComponent(options);\n\n setComponentList((prev) => {\n if (prev[name] && warnOnOverwrite) {\n console.warn(`overwriting component ${name}`);\n }\n return {\n ...prev,\n [name]: {\n component,\n loadingComponent,\n name,\n description,\n props,\n contextTools: [],\n },\n };\n });\n if (associatedTools) {\n registerTools(associatedTools);\n setComponentToolAssociations((prev) => ({\n ...prev,\n [name]: associatedTools.map((tool) => tool.name),\n }));\n }\n },\n [registerTools],\n );\n useEffect(() => {\n if (userComponents) {\n userComponents.forEach((component) => {\n registerComponent(component, false);\n });\n }\n }, [registerComponent, userComponents]);\n\n useEffect(() => {\n if (userTools) {\n registerTools(userTools, false);\n }\n }, [registerTools, userTools]);\n\n useEffect(() => {\n if (!userMcpServers || userMcpServers.length === 0) {\n setStaticMcpServerInfos([]);\n return;\n }\n\n // Normalize servers from props and ensure all have serverKey and transport\n const normalized = userMcpServers.map(normalizeServerInfo);\n setStaticMcpServerInfos(normalized);\n }, [userMcpServers]);\n\n useEffect(() => {\n // Validate that listResources and getResource are both provided or both omitted\n validateResourceSource(userListResources, userGetResource);\n\n // Set static resources from props\n if (userResources) {\n userResources.forEach((resource) => validateResource(resource));\n setStaticResources(userResources);\n } else {\n setStaticResources([]);\n }\n\n // Set resource source from props\n if (userListResources && userGetResource) {\n setResourceSource({\n listResources: userListResources,\n getResource: userGetResource,\n });\n } else {\n setResourceSource(null);\n }\n }, [userResources, userListResources, userGetResource]);\n\n const registerResource = useCallback((resource: ListResourceItem) => {\n validateResource(resource);\n setStaticResources((prev) => [...prev, resource]);\n }, []);\n\n const registerResources = useCallback((resources: ListResourceItem[]) => {\n resources.forEach((resource) => validateResource(resource));\n setStaticResources((prev) => [...prev, ...resources]);\n }, []);\n\n const registerResourceSource = useCallback((source: ResourceSource) => {\n validateResourceSource(source.listResources, source.getResource);\n setResourceSource(source);\n }, []);\n\n const mcpServerInfos: NormalizedMcpServerInfo[] = useMemo(() => {\n const allServers = [...staticMcpServerInfos, ...dynamicMcpServerInfos];\n return deduplicateMcpServers(allServers);\n }, [staticMcpServerInfos, dynamicMcpServerInfos]);\n\n const value = {\n componentList,\n toolRegistry,\n componentToolAssociations,\n mcpServerInfos,\n resources: staticResources,\n resourceSource,\n registerComponent,\n registerTool,\n registerTools,\n addToolAssociation,\n registerMcpServer,\n registerMcpServers,\n registerResource,\n registerResources,\n registerResourceSource,\n onCallUnregisteredTool,\n };\n\n return (\n <TamboRegistryContext.Provider value={value}>\n {children}\n </TamboRegistryContext.Provider>\n );\n};\n\n/**\n * The useTamboRegistry hook provides access to the component registry\n * to the descendants of the TamboRegistryProvider.\n * @returns The component registry\n */\nexport const useTamboRegistry = () => {\n return useContext(TamboRegistryContext);\n};\n\n/**\n * Hook to access the MCP server metadata from TamboRegistryProvider.\n * This provides access to the registered MCP server configurations (metadata only, not connections).\n *\n * This hook can be used anywhere within the TamboProvider hierarchy to access\n * the list of configured MCP servers without needing to be inside TamboMcpProvider.\n * @returns Array of MCP server metadata\n * @example\n * ```tsx\n * function MyComponent() {\n * const mcpServers = useTamboMcpServerInfos();\n *\n * return (\n * <div>\n * <h3>Configured MCP Servers:</h3>\n * {mcpServers.map((server) => (\n * <div key={server.url}>\n * {server.name || server.url}\n * </div>\n * ))}\n * </div>\n * );\n * }\n * ```\n *\n * The returned objects are `NormalizedMcpServerInfo` instances, meaning both\n * `serverKey` and `transport` are always populated (with `transport`\n * defaulting to HTTP when not explicitly specified).\n */\nexport const useTamboMcpServerInfos = (): NormalizedMcpServerInfo[] => {\n return useContext(TamboRegistryContext).mcpServerInfos;\n};\n"]}
|