@tambo-ai/react 0.69.1 → 0.71.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -7
- package/dist/hooks/use-tambo-threads.test.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/index.d.ts +4 -5
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +4 -5
- package/dist/mcp/index.js.map +1 -1
- package/dist/model/component-metadata.d.ts +88 -241
- package/dist/model/component-metadata.d.ts.map +1 -1
- package/dist/model/component-metadata.js.map +1 -1
- package/dist/model/mcp-server-info.d.ts +3 -3
- package/dist/model/mcp-server-info.js.map +1 -1
- package/dist/providers/hooks/use-tambo-session-token.test.js.map +1 -1
- package/dist/providers/tambo-component-provider.d.ts +2 -2
- 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.d.ts +1 -1
- package/dist/providers/tambo-registry-provider.d.ts +4 -4
- package/dist/providers/tambo-registry-provider.d.ts.map +1 -1
- package/dist/providers/tambo-registry-provider.js +11 -8
- package/dist/providers/tambo-registry-provider.js.map +1 -1
- package/dist/providers/tambo-registry-provider.test.js +31 -0
- package/dist/providers/tambo-registry-provider.test.js.map +1 -1
- package/dist/providers/tambo-registry-schema-compat.test.js +42 -52
- package/dist/providers/tambo-registry-schema-compat.test.js.map +1 -1
- 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.map +1 -1
- 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 +107 -141
- package/dist/providers/tambo-thread-provider.js.map +1 -1
- package/dist/providers/tambo-thread-provider.test.js +274 -445
- package/dist/providers/tambo-thread-provider.test.js.map +1 -1
- package/dist/schema/index.d.ts +1 -2
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +1 -5
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/schema.d.ts +7 -24
- package/dist/schema/schema.d.ts.map +1 -1
- package/dist/schema/schema.js +34 -105
- package/dist/schema/schema.js.map +1 -1
- package/dist/schema/schema.test.js +26 -124
- package/dist/schema/schema.test.js.map +1 -1
- package/dist/testing/tools.d.ts +2 -12
- package/dist/testing/tools.d.ts.map +1 -1
- package/dist/testing/tools.js +1 -20
- package/dist/testing/tools.js.map +1 -1
- package/dist/testing/types.d.ts +2 -2
- package/dist/testing/types.d.ts.map +1 -1
- package/dist/testing/types.js.map +1 -1
- package/dist/util/registry-validators.d.ts +2 -2
- package/dist/util/registry-validators.d.ts.map +1 -1
- package/dist/util/registry-validators.js +37 -17
- package/dist/util/registry-validators.js.map +1 -1
- package/dist/util/registry-validators.test.js +64 -25
- package/dist/util/registry-validators.test.js.map +1 -1
- package/dist/util/registry.d.ts +4 -10
- package/dist/util/registry.d.ts.map +1 -1
- package/dist/util/registry.js +6 -22
- package/dist/util/registry.js.map +1 -1
- package/dist/util/registry.test.js +1 -47
- package/dist/util/registry.test.js.map +1 -1
- 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 +5 -12
- package/dist/util/tool-caller.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-messages.d.ts +58 -0
- package/dist/v1/hooks/use-tambo-v1-messages.d.ts.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-messages.js +54 -0
- package/dist/v1/hooks/use-tambo-v1-messages.js.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-messages.test.d.ts +2 -0
- package/dist/v1/hooks/use-tambo-v1-messages.test.d.ts.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-messages.test.js +137 -0
- package/dist/v1/hooks/use-tambo-v1-messages.test.js.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-send-message.d.ts +96 -0
- package/dist/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-send-message.js +227 -0
- package/dist/v1/hooks/use-tambo-v1-send-message.js.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-send-message.test.d.ts +2 -0
- package/dist/v1/hooks/use-tambo-v1-send-message.test.d.ts.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-send-message.test.js +827 -0
- package/dist/v1/hooks/use-tambo-v1-send-message.test.js.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-thread-list.d.ts +61 -0
- package/dist/v1/hooks/use-tambo-v1-thread-list.d.ts.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-thread-list.js +56 -0
- package/dist/v1/hooks/use-tambo-v1-thread-list.js.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-thread-list.test.d.ts +2 -0
- package/dist/v1/hooks/use-tambo-v1-thread-list.test.d.ts.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-thread-list.test.js +98 -0
- package/dist/v1/hooks/use-tambo-v1-thread-list.test.js.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-thread.d.ts +37 -0
- package/dist/v1/hooks/use-tambo-v1-thread.d.ts.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-thread.js +49 -0
- package/dist/v1/hooks/use-tambo-v1-thread.js.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-thread.test.d.ts +2 -0
- package/dist/v1/hooks/use-tambo-v1-thread.test.d.ts.map +1 -0
- package/dist/v1/hooks/use-tambo-v1-thread.test.js +83 -0
- package/dist/v1/hooks/use-tambo-v1-thread.test.js.map +1 -0
- package/dist/v1/hooks/use-tambo-v1.d.ts +107 -0
- package/dist/v1/hooks/use-tambo-v1.d.ts.map +1 -0
- package/dist/v1/hooks/use-tambo-v1.js +87 -0
- package/dist/v1/hooks/use-tambo-v1.js.map +1 -0
- package/dist/v1/hooks/use-tambo-v1.test.d.ts +2 -0
- package/dist/v1/hooks/use-tambo-v1.test.d.ts.map +1 -0
- package/dist/v1/hooks/use-tambo-v1.test.js +150 -0
- package/dist/v1/hooks/use-tambo-v1.test.js.map +1 -0
- package/dist/v1/index.d.ts +73 -0
- package/dist/v1/index.d.ts.map +1 -0
- package/dist/v1/index.js +106 -0
- package/dist/v1/index.js.map +1 -0
- package/dist/v1/providers/tambo-v1-provider.d.ts +91 -0
- package/dist/v1/providers/tambo-v1-provider.d.ts.map +1 -0
- package/dist/v1/providers/tambo-v1-provider.js +110 -0
- package/dist/v1/providers/tambo-v1-provider.js.map +1 -0
- package/dist/v1/providers/tambo-v1-provider.test.d.ts +2 -0
- package/dist/v1/providers/tambo-v1-provider.test.d.ts.map +1 -0
- package/dist/v1/providers/tambo-v1-provider.test.js +123 -0
- package/dist/v1/providers/tambo-v1-provider.test.js.map +1 -0
- package/dist/v1/providers/tambo-v1-stream-context.d.ts +136 -0
- package/dist/v1/providers/tambo-v1-stream-context.d.ts.map +1 -0
- package/dist/v1/providers/tambo-v1-stream-context.js +230 -0
- package/dist/v1/providers/tambo-v1-stream-context.js.map +1 -0
- package/dist/v1/providers/tambo-v1-stream-context.test.d.ts +2 -0
- package/dist/v1/providers/tambo-v1-stream-context.test.d.ts.map +1 -0
- package/dist/v1/providers/tambo-v1-stream-context.test.js +85 -0
- package/dist/v1/providers/tambo-v1-stream-context.test.js.map +1 -0
- package/dist/v1/types/component.d.ts +50 -0
- package/dist/v1/types/component.d.ts.map +1 -0
- package/dist/v1/types/component.js +14 -0
- package/dist/v1/types/component.js.map +1 -0
- package/dist/v1/types/event.d.ts +72 -0
- package/dist/v1/types/event.d.ts.map +1 -0
- package/dist/v1/types/event.js +54 -0
- package/dist/v1/types/event.js.map +1 -0
- package/dist/v1/types/event.test.d.ts +2 -0
- package/dist/v1/types/event.test.d.ts.map +1 -0
- package/dist/v1/types/event.test.js +70 -0
- package/dist/v1/types/event.test.js.map +1 -0
- package/dist/v1/types/message.d.ts +35 -0
- package/dist/v1/types/message.d.ts.map +1 -0
- package/dist/v1/types/message.js +10 -0
- package/dist/v1/types/message.js.map +1 -0
- package/dist/v1/types/thread.d.ts +52 -0
- package/dist/v1/types/thread.d.ts.map +1 -0
- package/dist/v1/types/thread.js +9 -0
- package/dist/v1/types/thread.js.map +1 -0
- package/dist/v1/utils/event-accumulator.d.ts +100 -0
- package/dist/v1/utils/event-accumulator.d.ts.map +1 -0
- package/dist/v1/utils/event-accumulator.js +715 -0
- package/dist/v1/utils/event-accumulator.js.map +1 -0
- package/dist/v1/utils/event-accumulator.test.d.ts +2 -0
- package/dist/v1/utils/event-accumulator.test.d.ts.map +1 -0
- package/dist/v1/utils/event-accumulator.test.js +1010 -0
- package/dist/v1/utils/event-accumulator.test.js.map +1 -0
- package/dist/v1/utils/json-patch.d.ts +18 -0
- package/dist/v1/utils/json-patch.d.ts.map +1 -0
- package/dist/v1/utils/json-patch.js +35 -0
- package/dist/v1/utils/json-patch.js.map +1 -0
- package/dist/v1/utils/json-patch.test.d.ts +2 -0
- package/dist/v1/utils/json-patch.test.d.ts.map +1 -0
- package/dist/v1/utils/json-patch.test.js +28 -0
- package/dist/v1/utils/json-patch.test.js.map +1 -0
- package/dist/v1/utils/registry-conversion.d.ts +53 -0
- package/dist/v1/utils/registry-conversion.d.ts.map +1 -0
- package/dist/v1/utils/registry-conversion.js +114 -0
- package/dist/v1/utils/registry-conversion.js.map +1 -0
- package/dist/v1/utils/registry-conversion.test.d.ts +2 -0
- package/dist/v1/utils/registry-conversion.test.d.ts.map +1 -0
- package/dist/v1/utils/registry-conversion.test.js +179 -0
- package/dist/v1/utils/registry-conversion.test.js.map +1 -0
- package/dist/v1/utils/stream-handler.d.ts +45 -0
- package/dist/v1/utils/stream-handler.d.ts.map +1 -0
- package/dist/v1/utils/stream-handler.js +47 -0
- package/dist/v1/utils/stream-handler.js.map +1 -0
- package/dist/v1/utils/stream-handler.test.d.ts +2 -0
- package/dist/v1/utils/stream-handler.test.d.ts.map +1 -0
- package/dist/v1/utils/stream-handler.test.js +74 -0
- package/dist/v1/utils/stream-handler.test.js.map +1 -0
- package/dist/v1/utils/tool-call-tracker.d.ts +41 -0
- package/dist/v1/utils/tool-call-tracker.d.ts.map +1 -0
- package/dist/v1/utils/tool-call-tracker.js +90 -0
- package/dist/v1/utils/tool-call-tracker.js.map +1 -0
- package/dist/v1/utils/tool-executor.d.ts +33 -0
- package/dist/v1/utils/tool-executor.d.ts.map +1 -0
- package/dist/v1/utils/tool-executor.js +103 -0
- package/dist/v1/utils/tool-executor.js.map +1 -0
- package/dist/v1/utils/tool-executor.test.d.ts +2 -0
- package/dist/v1/utils/tool-executor.test.d.ts.map +1 -0
- package/dist/v1/utils/tool-executor.test.js +222 -0
- package/dist/v1/utils/tool-executor.test.js.map +1 -0
- package/esm/hooks/use-tambo-threads.test.js.map +1 -1
- package/esm/index.d.ts +1 -1
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js.map +1 -1
- package/esm/mcp/index.d.ts +4 -5
- package/esm/mcp/index.d.ts.map +1 -1
- package/esm/mcp/index.js +4 -5
- package/esm/mcp/index.js.map +1 -1
- package/esm/model/component-metadata.d.ts +88 -241
- package/esm/model/component-metadata.d.ts.map +1 -1
- package/esm/model/component-metadata.js.map +1 -1
- package/esm/model/mcp-server-info.d.ts +3 -3
- package/esm/model/mcp-server-info.js.map +1 -1
- package/esm/providers/hooks/use-tambo-session-token.test.js.map +1 -1
- package/esm/providers/tambo-component-provider.d.ts +2 -2
- 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.d.ts +1 -1
- package/esm/providers/tambo-registry-provider.d.ts +4 -4
- package/esm/providers/tambo-registry-provider.d.ts.map +1 -1
- package/esm/providers/tambo-registry-provider.js +11 -8
- package/esm/providers/tambo-registry-provider.js.map +1 -1
- package/esm/providers/tambo-registry-provider.test.js +31 -0
- package/esm/providers/tambo-registry-provider.test.js.map +1 -1
- package/esm/providers/tambo-registry-schema-compat.test.js +42 -52
- package/esm/providers/tambo-registry-schema-compat.test.js.map +1 -1
- 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.map +1 -1
- 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 +107 -141
- package/esm/providers/tambo-thread-provider.js.map +1 -1
- package/esm/providers/tambo-thread-provider.test.js +241 -445
- package/esm/providers/tambo-thread-provider.test.js.map +1 -1
- package/esm/schema/index.d.ts +1 -2
- package/esm/schema/index.d.ts.map +1 -1
- package/esm/schema/index.js +1 -2
- package/esm/schema/index.js.map +1 -1
- package/esm/schema/schema.d.ts +7 -24
- package/esm/schema/schema.d.ts.map +1 -1
- package/esm/schema/schema.js +34 -103
- package/esm/schema/schema.js.map +1 -1
- package/esm/schema/schema.test.js +27 -125
- package/esm/schema/schema.test.js.map +1 -1
- package/esm/testing/tools.d.ts +2 -12
- package/esm/testing/tools.d.ts.map +1 -1
- package/esm/testing/tools.js +2 -20
- package/esm/testing/tools.js.map +1 -1
- package/esm/testing/types.d.ts +2 -2
- package/esm/testing/types.d.ts.map +1 -1
- package/esm/testing/types.js.map +1 -1
- package/esm/util/registry-validators.d.ts +2 -2
- package/esm/util/registry-validators.d.ts.map +1 -1
- package/esm/util/registry-validators.js +38 -18
- package/esm/util/registry-validators.js.map +1 -1
- package/esm/util/registry-validators.test.js +64 -25
- package/esm/util/registry-validators.test.js.map +1 -1
- package/esm/util/registry.d.ts +4 -10
- package/esm/util/registry.d.ts.map +1 -1
- package/esm/util/registry.js +7 -22
- package/esm/util/registry.js.map +1 -1
- package/esm/util/registry.test.js +3 -49
- package/esm/util/registry.test.js.map +1 -1
- 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 +5 -12
- package/esm/util/tool-caller.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-messages.d.ts +58 -0
- package/esm/v1/hooks/use-tambo-v1-messages.d.ts.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-messages.js +51 -0
- package/esm/v1/hooks/use-tambo-v1-messages.js.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-messages.test.d.ts +2 -0
- package/esm/v1/hooks/use-tambo-v1-messages.test.d.ts.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-messages.test.js +132 -0
- package/esm/v1/hooks/use-tambo-v1-messages.test.js.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-send-message.d.ts +96 -0
- package/esm/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-send-message.js +223 -0
- package/esm/v1/hooks/use-tambo-v1-send-message.js.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-send-message.test.d.ts +2 -0
- package/esm/v1/hooks/use-tambo-v1-send-message.test.d.ts.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-send-message.test.js +822 -0
- package/esm/v1/hooks/use-tambo-v1-send-message.test.js.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-thread-list.d.ts +61 -0
- package/esm/v1/hooks/use-tambo-v1-thread-list.d.ts.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-thread-list.js +53 -0
- package/esm/v1/hooks/use-tambo-v1-thread-list.js.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-thread-list.test.d.ts +2 -0
- package/esm/v1/hooks/use-tambo-v1-thread-list.test.d.ts.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-thread-list.test.js +93 -0
- package/esm/v1/hooks/use-tambo-v1-thread-list.test.js.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-thread.d.ts +37 -0
- package/esm/v1/hooks/use-tambo-v1-thread.d.ts.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-thread.js +46 -0
- package/esm/v1/hooks/use-tambo-v1-thread.js.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-thread.test.d.ts +2 -0
- package/esm/v1/hooks/use-tambo-v1-thread.test.d.ts.map +1 -0
- package/esm/v1/hooks/use-tambo-v1-thread.test.js +78 -0
- package/esm/v1/hooks/use-tambo-v1-thread.test.js.map +1 -0
- package/esm/v1/hooks/use-tambo-v1.d.ts +107 -0
- package/esm/v1/hooks/use-tambo-v1.d.ts.map +1 -0
- package/esm/v1/hooks/use-tambo-v1.js +84 -0
- package/esm/v1/hooks/use-tambo-v1.js.map +1 -0
- package/esm/v1/hooks/use-tambo-v1.test.d.ts +2 -0
- package/esm/v1/hooks/use-tambo-v1.test.d.ts.map +1 -0
- package/esm/v1/hooks/use-tambo-v1.test.js +145 -0
- package/esm/v1/hooks/use-tambo-v1.test.js.map +1 -0
- package/esm/v1/index.d.ts +73 -0
- package/esm/v1/index.d.ts.map +1 -0
- package/esm/v1/index.js +83 -0
- package/esm/v1/index.js.map +1 -0
- package/esm/v1/providers/tambo-v1-provider.d.ts +91 -0
- package/esm/v1/providers/tambo-v1-provider.d.ts.map +1 -0
- package/esm/v1/providers/tambo-v1-provider.js +74 -0
- package/esm/v1/providers/tambo-v1-provider.js.map +1 -0
- package/esm/v1/providers/tambo-v1-provider.test.d.ts +2 -0
- package/esm/v1/providers/tambo-v1-provider.test.d.ts.map +1 -0
- package/esm/v1/providers/tambo-v1-provider.test.js +118 -0
- package/esm/v1/providers/tambo-v1-provider.test.js.map +1 -0
- package/esm/v1/providers/tambo-v1-stream-context.d.ts +136 -0
- package/esm/v1/providers/tambo-v1-stream-context.d.ts.map +1 -0
- package/esm/v1/providers/tambo-v1-stream-context.js +191 -0
- package/esm/v1/providers/tambo-v1-stream-context.js.map +1 -0
- package/esm/v1/providers/tambo-v1-stream-context.test.d.ts +2 -0
- package/esm/v1/providers/tambo-v1-stream-context.test.d.ts.map +1 -0
- package/esm/v1/providers/tambo-v1-stream-context.test.js +80 -0
- package/esm/v1/providers/tambo-v1-stream-context.test.js.map +1 -0
- package/esm/v1/types/component.d.ts +50 -0
- package/esm/v1/types/component.d.ts.map +1 -0
- package/esm/v1/types/component.js +13 -0
- package/esm/v1/types/component.js.map +1 -0
- package/esm/v1/types/event.d.ts +72 -0
- package/esm/v1/types/event.d.ts.map +1 -0
- package/esm/v1/types/event.js +50 -0
- package/esm/v1/types/event.js.map +1 -0
- package/esm/v1/types/event.test.d.ts +2 -0
- package/esm/v1/types/event.test.d.ts.map +1 -0
- package/esm/v1/types/event.test.js +68 -0
- package/esm/v1/types/event.test.js.map +1 -0
- package/esm/v1/types/message.d.ts +35 -0
- package/esm/v1/types/message.d.ts.map +1 -0
- package/esm/v1/types/message.js +9 -0
- package/esm/v1/types/message.js.map +1 -0
- package/esm/v1/types/thread.d.ts +52 -0
- package/esm/v1/types/thread.d.ts.map +1 -0
- package/esm/v1/types/thread.js +8 -0
- package/esm/v1/types/thread.js.map +1 -0
- package/esm/v1/utils/event-accumulator.d.ts +100 -0
- package/esm/v1/utils/event-accumulator.d.ts.map +1 -0
- package/esm/v1/utils/event-accumulator.js +708 -0
- package/esm/v1/utils/event-accumulator.js.map +1 -0
- package/esm/v1/utils/event-accumulator.test.d.ts +2 -0
- package/esm/v1/utils/event-accumulator.test.d.ts.map +1 -0
- package/esm/v1/utils/event-accumulator.test.js +1008 -0
- package/esm/v1/utils/event-accumulator.test.js.map +1 -0
- package/esm/v1/utils/json-patch.d.ts +18 -0
- package/esm/v1/utils/json-patch.d.ts.map +1 -0
- package/esm/v1/utils/json-patch.js +32 -0
- package/esm/v1/utils/json-patch.js.map +1 -0
- package/esm/v1/utils/json-patch.test.d.ts +2 -0
- package/esm/v1/utils/json-patch.test.d.ts.map +1 -0
- package/esm/v1/utils/json-patch.test.js +26 -0
- package/esm/v1/utils/json-patch.test.js.map +1 -0
- package/esm/v1/utils/registry-conversion.d.ts +53 -0
- package/esm/v1/utils/registry-conversion.d.ts.map +1 -0
- package/esm/v1/utils/registry-conversion.js +108 -0
- package/esm/v1/utils/registry-conversion.js.map +1 -0
- package/esm/v1/utils/registry-conversion.test.d.ts +2 -0
- package/esm/v1/utils/registry-conversion.test.d.ts.map +1 -0
- package/esm/v1/utils/registry-conversion.test.js +177 -0
- package/esm/v1/utils/registry-conversion.test.js.map +1 -0
- package/esm/v1/utils/stream-handler.d.ts +45 -0
- package/esm/v1/utils/stream-handler.d.ts.map +1 -0
- package/esm/v1/utils/stream-handler.js +44 -0
- package/esm/v1/utils/stream-handler.js.map +1 -0
- package/esm/v1/utils/stream-handler.test.d.ts +2 -0
- package/esm/v1/utils/stream-handler.test.d.ts.map +1 -0
- package/esm/v1/utils/stream-handler.test.js +72 -0
- package/esm/v1/utils/stream-handler.test.js.map +1 -0
- package/esm/v1/utils/tool-call-tracker.d.ts +41 -0
- package/esm/v1/utils/tool-call-tracker.d.ts.map +1 -0
- package/esm/v1/utils/tool-call-tracker.js +86 -0
- package/esm/v1/utils/tool-call-tracker.js.map +1 -0
- package/esm/v1/utils/tool-executor.d.ts +33 -0
- package/esm/v1/utils/tool-executor.d.ts.map +1 -0
- package/esm/v1/utils/tool-executor.js +99 -0
- package/esm/v1/utils/tool-executor.js.map +1 -0
- package/esm/v1/utils/tool-executor.test.d.ts +2 -0
- package/esm/v1/utils/tool-executor.test.d.ts.map +1 -0
- package/esm/v1/utils/tool-executor.test.js +220 -0
- package/esm/v1/utils/tool-executor.test.js.map +1 -0
- package/package.json +20 -9
- package/dist/schema/zod.d.ts +0 -57
- package/dist/schema/zod.d.ts.map +0 -1
- package/dist/schema/zod.js +0 -191
- package/dist/schema/zod.js.map +0 -1
- package/dist/schema/zod.test.d.ts +0 -2
- package/dist/schema/zod.test.d.ts.map +0 -1
- package/dist/schema/zod.test.js +0 -663
- package/dist/schema/zod.test.js.map +0 -1
- package/esm/schema/zod.d.ts +0 -57
- package/esm/schema/zod.d.ts.map +0 -1
- package/esm/schema/zod.js +0 -180
- package/esm/schema/zod.js.map +0 -1
- package/esm/schema/zod.test.d.ts +0 -2
- package/esm/schema/zod.test.d.ts.map +0 -1
- package/esm/schema/zod.test.js +0 -628
- package/esm/schema/zod.test.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-accumulator.test.js","sourceRoot":"","sources":["../../../src/v1/utils/event-accumulator.test.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n EventType,\n type CustomEvent,\n type RunErrorEvent,\n type RunFinishedEvent,\n type RunStartedEvent,\n type StateSnapshotEvent,\n type TextMessageContentEvent,\n type TextMessageEndEvent,\n type TextMessageStartEvent,\n type ToolCallArgsEvent,\n type ToolCallEndEvent,\n type ToolCallResultEvent,\n type ToolCallStartEvent,\n} from \"@ag-ui/core\";\nimport type {\n ComponentContent,\n ToolUseContent,\n} from \"@tambo-ai/typescript-sdk/resources/threads/threads\";\nimport {\n createInitialState,\n createInitialThreadState,\n streamReducer,\n type StreamState,\n type ThreadState,\n} from \"./event-accumulator\";\nimport type { Content } from \"../types/message\";\n\n/**\n * Helper to extract a ToolUseContent from a message content array.\n * @param content - Content array from a message\n * @param index - Index of the content item\n * @returns The content as ToolUseContent\n */\nfunction asToolUseContent(content: Content[], index: number): ToolUseContent {\n return content[index] as ToolUseContent;\n}\n\n/**\n * Helper to extract a ComponentContent from a message content array.\n * @param content - Content array from a message\n * @param index - Index of the content item\n * @returns The content as ComponentContent\n */\nfunction asComponentContent(\n content: Content[],\n index: number,\n): ComponentContent {\n return content[index] as ComponentContent;\n}\n\n// Helper to create a base thread state for testing\nfunction createTestThreadState(threadId: string): ThreadState {\n return {\n ...createInitialThreadState(threadId),\n thread: {\n ...createInitialThreadState(threadId).thread,\n // Use fixed timestamps for snapshot stability\n createdAt: \"2024-01-01T00:00:00.000Z\",\n updatedAt: \"2024-01-01T00:00:00.000Z\",\n },\n };\n}\n\n// Helper to create stream state with a thread\nfunction createTestStreamState(threadId: string): StreamState {\n return {\n threadMap: {\n [threadId]: createTestThreadState(threadId),\n },\n currentThreadId: threadId,\n };\n}\n\ndescribe(\"createInitialThreadState\", () => {\n it(\"creates thread state with correct structure\", () => {\n const state = createInitialThreadState(\"thread_123\");\n\n expect(state.thread.id).toBe(\"thread_123\");\n expect(state.thread.messages).toEqual([]);\n expect(state.thread.status).toBe(\"idle\");\n expect(state.streaming.status).toBe(\"idle\");\n expect(state.accumulatingToolArgs).toBeInstanceOf(Map);\n expect(state.accumulatingToolArgs.size).toBe(0);\n });\n});\n\ndescribe(\"createInitialState\", () => {\n it(\"creates empty stream state\", () => {\n const state = createInitialState();\n\n expect(state.threadMap).toEqual({});\n expect(state.currentThreadId).toBeNull();\n });\n});\n\ndescribe(\"streamReducer\", () => {\n // Mock console.warn for tests that check logging\n let consoleWarnSpy: jest.SpyInstance;\n\n beforeEach(() => {\n consoleWarnSpy = jest.spyOn(console, \"warn\").mockImplementation(() => {});\n });\n\n afterEach(() => {\n consoleWarnSpy.mockRestore();\n });\n\n describe(\"unknown thread handling\", () => {\n it(\"auto-initializes unknown thread when receiving events\", () => {\n const state = createInitialState();\n const event: RunStartedEvent = {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"unknown_thread\",\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"unknown_thread\",\n });\n\n // Should auto-initialize the thread rather than dropping the event\n expect(result.threadMap.unknown_thread).toBeDefined();\n expect(result.threadMap.unknown_thread.thread.id).toBe(\"unknown_thread\");\n expect(result.threadMap.unknown_thread.streaming.status).toBe(\n \"streaming\",\n );\n expect(result.threadMap.unknown_thread.streaming.runId).toBe(\"run_1\");\n // No warning should be logged for auto-initialization\n expect(consoleWarnSpy).not.toHaveBeenCalled();\n });\n });\n\n describe(\"unsupported event types\", () => {\n it(\"logs warning for unsupported AG-UI events\", () => {\n const state = createTestStreamState(\"thread_1\");\n const event: StateSnapshotEvent = {\n type: EventType.STATE_SNAPSHOT,\n snapshot: {},\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n expect(result).toBe(state);\n expect(consoleWarnSpy).toHaveBeenCalledWith(\n expect.stringContaining(\"unsupported event type\"),\n );\n });\n\n it(\"throws for completely unknown event types (fail-fast)\", () => {\n const state = createTestStreamState(\"thread_1\");\n // Create an event with an unknown type (not in EventType enum)\n // This tests fail-fast behavior when SDK returns unexpected event types\n const event = {\n type: \"TOTALLY_UNKNOWN_EVENT_TYPE\",\n };\n\n expect(() =>\n streamReducer(state, {\n type: \"EVENT\",\n event: event as unknown as RunStartedEvent,\n threadId: \"thread_1\",\n }),\n ).toThrow(\"Unreachable case\");\n });\n\n it(\"logs warning for unknown custom event names\", () => {\n const state = createTestStreamState(\"thread_1\");\n const event: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"unknown.custom.event\",\n value: {},\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n expect(result.threadMap.thread_1).toBe(state.threadMap.thread_1);\n expect(consoleWarnSpy).toHaveBeenCalledWith(\n expect.stringContaining(\"Unknown custom event name\"),\n );\n });\n });\n\n describe(\"RUN_STARTED event\", () => {\n it(\"updates thread status to streaming\", () => {\n const state = createTestStreamState(\"thread_1\");\n const event: RunStartedEvent = {\n type: EventType.RUN_STARTED,\n runId: \"run_123\",\n threadId: \"thread_1\",\n timestamp: 1704067200000,\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n expect(result.threadMap.thread_1.thread.status).toBe(\"streaming\");\n expect(result.threadMap.thread_1.streaming.status).toBe(\"streaming\");\n expect(result.threadMap.thread_1.streaming.runId).toBe(\"run_123\");\n });\n\n it(\"uses provided timestamp for startTime\", () => {\n const state = createTestStreamState(\"thread_1\");\n const event: RunStartedEvent = {\n type: EventType.RUN_STARTED,\n runId: \"run_123\",\n threadId: \"thread_1\",\n timestamp: 1704067200000,\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n expect(result.threadMap.thread_1.streaming.startTime).toBe(1704067200000);\n });\n });\n\n describe(\"RUN_FINISHED event\", () => {\n it(\"updates thread status to complete\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.status = \"streaming\";\n state.threadMap.thread_1.streaming.status = \"streaming\";\n\n const event: RunFinishedEvent = {\n type: EventType.RUN_FINISHED,\n runId: \"run_123\",\n threadId: \"thread_1\",\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n expect(result.threadMap.thread_1.thread.status).toBe(\"complete\");\n expect(result.threadMap.thread_1.streaming.status).toBe(\"complete\");\n });\n });\n\n describe(\"RUN_ERROR event\", () => {\n it(\"updates thread status to error with details\", () => {\n const state = createTestStreamState(\"thread_1\");\n const event: RunErrorEvent = {\n type: EventType.RUN_ERROR,\n message: \"Something went wrong\",\n code: \"ERR_001\",\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n expect(result.threadMap.thread_1.thread.status).toBe(\"error\");\n expect(result.threadMap.thread_1.streaming.status).toBe(\"error\");\n expect(result.threadMap.thread_1.streaming.error).toEqual({\n message: \"Something went wrong\",\n code: \"ERR_001\",\n });\n });\n });\n\n describe(\"TEXT_MESSAGE_START event\", () => {\n it(\"creates new message in thread\", () => {\n const state = createTestStreamState(\"thread_1\");\n const event: TextMessageStartEvent = {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_1\",\n role: \"assistant\",\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n const messages = result.threadMap.thread_1.thread.messages;\n expect(messages).toHaveLength(1);\n expect(messages[0].id).toBe(\"msg_1\");\n expect(messages[0].role).toBe(\"assistant\");\n expect(messages[0].content).toEqual([]);\n });\n\n it(\"creates user message when role is user\", () => {\n const state = createTestStreamState(\"thread_1\");\n const event: TextMessageStartEvent = {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_1\",\n role: \"user\",\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n const messages = result.threadMap.thread_1.thread.messages;\n expect(messages).toHaveLength(1);\n expect(messages[0].role).toBe(\"user\");\n });\n });\n\n describe(\"TEXT_MESSAGE_CONTENT event\", () => {\n it(\"appends text content to message\", () => {\n const state = createTestStreamState(\"thread_1\");\n // Add a message first\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: TextMessageContentEvent = {\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: \"msg_1\",\n delta: \"Hello \",\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n const content = result.threadMap.thread_1.thread.messages[0].content;\n expect(content).toHaveLength(1);\n expect(content[0]).toEqual({ type: \"text\", text: \"Hello \" });\n });\n\n it(\"creates new text block after non-text content\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [\n { type: \"tool_use\", id: \"tool_1\", name: \"test\", input: {} },\n ],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: TextMessageContentEvent = {\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: \"msg_1\",\n delta: \"After tool call\",\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n const content = result.threadMap.thread_1.thread.messages[0].content;\n expect(content).toHaveLength(2);\n expect(content[0]).toEqual({\n type: \"tool_use\",\n id: \"tool_1\",\n name: \"test\",\n input: {},\n });\n expect(content[1]).toEqual({ type: \"text\", text: \"After tool call\" });\n });\n\n it(\"accumulates text content deltas\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [{ type: \"text\", text: \"Hello \" }],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: TextMessageContentEvent = {\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: \"msg_1\",\n delta: \"world!\",\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n const content = result.threadMap.thread_1.thread.messages[0].content;\n expect(content).toHaveLength(1);\n expect(content[0]).toEqual({ type: \"text\", text: \"Hello world!\" });\n });\n\n it(\"throws when message not found\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: TextMessageContentEvent = {\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: \"unknown_msg\",\n delta: \"Hello\",\n };\n\n expect(() => {\n streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n }).toThrow(\"Message unknown_msg not found\");\n });\n });\n\n describe(\"TEXT_MESSAGE_END event\", () => {\n it(\"throws when messageId doesn't match active message\", () => {\n const state = createTestStreamState(\"thread_1\");\n // Set up an active message in streaming state\n state.threadMap.thread_1.streaming.messageId = \"msg_1\";\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [{ type: \"text\", text: \"Hello\" }],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: TextMessageEndEvent = {\n type: EventType.TEXT_MESSAGE_END,\n messageId: \"wrong_msg_id\",\n };\n\n expect(() => {\n streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n }).toThrow(\"TEXT_MESSAGE_END messageId mismatch\");\n });\n\n it(\"clears active messageId on success\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.streaming.messageId = \"msg_1\";\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [{ type: \"text\", text: \"Hello\" }],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: TextMessageEndEvent = {\n type: EventType.TEXT_MESSAGE_END,\n messageId: \"msg_1\",\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n expect(result.threadMap.thread_1.streaming.messageId).toBeUndefined();\n });\n });\n\n describe(\"TOOL_CALL_START event\", () => {\n it(\"adds tool_use content block to message\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: ToolCallStartEvent = {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"tool_1\",\n toolCallName: \"get_weather\",\n parentMessageId: \"msg_1\",\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n const content = result.threadMap.thread_1.thread.messages[0].content;\n expect(content).toHaveLength(1);\n expect(content[0]).toEqual({\n type: \"tool_use\",\n id: \"tool_1\",\n name: \"get_weather\",\n input: {},\n });\n });\n });\n\n describe(\"TOOL_CALL_START event\", () => {\n it(\"uses last message when no parentMessageId provided\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: ToolCallStartEvent = {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"tool_1\",\n toolCallName: \"get_weather\",\n // No parentMessageId - should use last message\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n const content = result.threadMap.thread_1.thread.messages[0].content;\n expect(content).toHaveLength(1);\n expect(content[0]).toEqual({\n type: \"tool_use\",\n id: \"tool_1\",\n name: \"get_weather\",\n input: {},\n });\n });\n\n it(\"throws when parentMessageId message not found\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: ToolCallStartEvent = {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"tool_1\",\n toolCallName: \"get_weather\",\n parentMessageId: \"unknown_msg\",\n };\n\n expect(() => {\n streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n }).toThrow(\"Message unknown_msg not found for TOOL_CALL_START event\");\n });\n\n it(\"throws when no messages exist\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [];\n\n const event: ToolCallStartEvent = {\n type: EventType.TOOL_CALL_START,\n toolCallId: \"tool_1\",\n toolCallName: \"get_weather\",\n // No parentMessageId, no messages\n };\n\n expect(() => {\n streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n }).toThrow(\"No messages exist for TOOL_CALL_START event\");\n });\n });\n\n describe(\"TOOL_CALL_ARGS and TOOL_CALL_END events\", () => {\n it(\"handles TOOL_CALL_END with no accumulated args\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [\n { type: \"tool_use\", id: \"tool_1\", name: \"test\", input: {} },\n ],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n // Send TOOL_CALL_END without any TOOL_CALL_ARGS first\n const endEvent: ToolCallEndEvent = {\n type: EventType.TOOL_CALL_END,\n toolCallId: \"tool_1\",\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event: endEvent,\n threadId: \"thread_1\",\n });\n\n // Should return unchanged state since no args were accumulated\n expect(result.threadMap.thread_1).toBe(state.threadMap.thread_1);\n });\n\n it(\"accumulates and parses tool arguments\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [\n { type: \"tool_use\", id: \"tool_1\", name: \"test\", input: {} },\n ],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n // Send TOOL_CALL_ARGS\n const argsEvent1: ToolCallArgsEvent = {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"tool_1\",\n delta: '{\"city\":',\n };\n\n let result = streamReducer(state, {\n type: \"EVENT\",\n event: argsEvent1,\n threadId: \"thread_1\",\n });\n\n const argsEvent2: ToolCallArgsEvent = {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"tool_1\",\n delta: '\"NYC\"}',\n };\n\n result = streamReducer(result, {\n type: \"EVENT\",\n event: argsEvent2,\n threadId: \"thread_1\",\n });\n\n // Send TOOL_CALL_END\n const endEvent: ToolCallEndEvent = {\n type: EventType.TOOL_CALL_END,\n toolCallId: \"tool_1\",\n };\n\n result = streamReducer(result, {\n type: \"EVENT\",\n event: endEvent,\n threadId: \"thread_1\",\n });\n\n const toolContent = asToolUseContent(\n result.threadMap.thread_1.thread.messages[0].content,\n 0,\n );\n expect(toolContent.input).toEqual({ city: \"NYC\" });\n });\n\n it(\"throws when tool arguments JSON is invalid\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [\n { type: \"tool_use\", id: \"tool_1\", name: \"test\", input: {} },\n ],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n // Send invalid JSON via TOOL_CALL_ARGS\n const argsEvent: ToolCallArgsEvent = {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"tool_1\",\n delta: \"{invalid json\",\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event: argsEvent,\n threadId: \"thread_1\",\n });\n\n // Send TOOL_CALL_END - should throw when parsing\n const endEvent: ToolCallEndEvent = {\n type: EventType.TOOL_CALL_END,\n toolCallId: \"tool_1\",\n };\n\n expect(() => {\n streamReducer(result, {\n type: \"EVENT\",\n event: endEvent,\n threadId: \"thread_1\",\n });\n }).toThrow(\"Failed to parse tool call arguments\");\n });\n });\n\n describe(\"custom component events\", () => {\n it(\"handles tambo.component.start event\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"tambo.component.start\",\n value: {\n messageId: \"msg_1\",\n componentId: \"comp_1\",\n componentName: \"WeatherCard\",\n },\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n const content = result.threadMap.thread_1.thread.messages[0].content;\n expect(content).toHaveLength(1);\n expect(content[0]).toEqual({\n type: \"component\",\n id: \"comp_1\",\n name: \"WeatherCard\",\n props: {},\n });\n });\n\n it(\"handles tambo.component.props_delta event\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [\n { type: \"component\", id: \"comp_1\", name: \"Test\", props: {} },\n ],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"tambo.component.props_delta\",\n value: {\n componentId: \"comp_1\",\n operations: [{ op: \"add\", path: \"/temperature\", value: 72 }],\n },\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n const component = asComponentContent(\n result.threadMap.thread_1.thread.messages[0].content,\n 0,\n );\n expect(component.props).toEqual({ temperature: 72 });\n });\n\n it(\"throws when component not found for props_delta\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [], // No component\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"tambo.component.props_delta\",\n value: {\n componentId: \"unknown_comp\",\n operations: [{ op: \"add\", path: \"/value\", value: 1 }],\n },\n };\n\n expect(() => {\n streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n }).toThrow(\"component unknown_comp not found\");\n });\n\n it(\"handles tambo.run.awaiting_input event\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.status = \"streaming\";\n\n const event: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"tambo.run.awaiting_input\",\n value: { pendingToolCallIds: [\"tool_1\", \"tool_2\"] },\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n expect(result.threadMap.thread_1.thread.status).toBe(\"waiting\");\n expect(result.threadMap.thread_1.streaming.status).toBe(\"waiting\");\n });\n\n it(\"handles tambo.component.state_delta event\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [\n { type: \"component\", id: \"comp_1\", name: \"Counter\", props: {} },\n ],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"tambo.component.state_delta\",\n value: {\n componentId: \"comp_1\",\n operations: [{ op: \"add\", path: \"/count\", value: 42 }],\n },\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n const component = asComponentContent(\n result.threadMap.thread_1.thread.messages[0].content,\n 0,\n );\n expect(component.state).toEqual({ count: 42 });\n });\n\n it(\"handles tambo.component.end event\", () => {\n const state = createTestStreamState(\"thread_1\");\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [\n { type: \"component\", id: \"comp_1\", name: \"Test\", props: {} },\n ],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n const event: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"tambo.component.end\",\n value: { componentId: \"comp_1\" },\n };\n\n const result = streamReducer(state, {\n type: \"EVENT\",\n event,\n threadId: \"thread_1\",\n });\n\n // component.end doesn't change state currently, just returns unchanged\n expect(result.threadMap.thread_1.thread.messages[0].content[0]).toEqual({\n type: \"component\",\n id: \"comp_1\",\n name: \"Test\",\n props: {},\n });\n });\n });\n\n describe(\"snapshot tests for complex state transitions\", () => {\n it(\"matches snapshot for full message flow\", () => {\n let state = createTestStreamState(\"thread_1\");\n\n // RUN_STARTED\n const runStarted: RunStartedEvent = {\n type: EventType.RUN_STARTED,\n runId: \"run_1\",\n threadId: \"thread_1\",\n timestamp: 1704067200000,\n };\n state = streamReducer(state, {\n type: \"EVENT\",\n event: runStarted,\n threadId: \"thread_1\",\n });\n\n // TEXT_MESSAGE_START\n const msgStart: TextMessageStartEvent = {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_1\",\n role: \"assistant\",\n };\n state = streamReducer(state, {\n type: \"EVENT\",\n event: msgStart,\n threadId: \"thread_1\",\n });\n\n // TEXT_MESSAGE_CONTENT\n const msgContent: TextMessageContentEvent = {\n type: EventType.TEXT_MESSAGE_CONTENT,\n messageId: \"msg_1\",\n delta: \"Hello, how can I help?\",\n };\n state = streamReducer(state, {\n type: \"EVENT\",\n event: msgContent,\n threadId: \"thread_1\",\n });\n\n // TEXT_MESSAGE_END\n const msgEnd: TextMessageEndEvent = {\n type: EventType.TEXT_MESSAGE_END,\n messageId: \"msg_1\",\n };\n state = streamReducer(state, {\n type: \"EVENT\",\n event: msgEnd,\n threadId: \"thread_1\",\n });\n\n // RUN_FINISHED\n const runFinished: RunFinishedEvent = {\n type: EventType.RUN_FINISHED,\n runId: \"run_1\",\n threadId: \"thread_1\",\n };\n state = streamReducer(state, {\n type: \"EVENT\",\n event: runFinished,\n threadId: \"thread_1\",\n });\n\n // Normalize timestamps for snapshot stability\n const snapshot = {\n ...state,\n threadMap: {\n thread_1: {\n ...state.threadMap.thread_1,\n thread: {\n ...state.threadMap.thread_1.thread,\n messages: state.threadMap.thread_1.thread.messages.map((m) => ({\n ...m,\n createdAt: \"[TIMESTAMP]\",\n })),\n createdAt: \"[TIMESTAMP]\",\n updatedAt: \"[TIMESTAMP]\",\n },\n },\n },\n };\n\n expect(snapshot).toMatchSnapshot();\n });\n\n it(\"matches snapshot for component streaming flow\", () => {\n let state = createTestStreamState(\"thread_1\");\n\n // Add a message\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n // COMPONENT_START\n const compStart: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"tambo.component.start\",\n value: {\n messageId: \"msg_1\",\n componentId: \"comp_1\",\n componentName: \"WeatherCard\",\n },\n };\n state = streamReducer(state, {\n type: \"EVENT\",\n event: compStart,\n threadId: \"thread_1\",\n });\n\n // COMPONENT_PROPS_DELTA - add city\n const propsDelta1: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"tambo.component.props_delta\",\n value: {\n componentId: \"comp_1\",\n operations: [{ op: \"add\", path: \"/city\", value: \"New York\" }],\n },\n };\n state = streamReducer(state, {\n type: \"EVENT\",\n event: propsDelta1,\n threadId: \"thread_1\",\n });\n\n // COMPONENT_PROPS_DELTA - add temperature\n const propsDelta2: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"tambo.component.props_delta\",\n value: {\n componentId: \"comp_1\",\n operations: [{ op: \"add\", path: \"/temperature\", value: 72 }],\n },\n };\n state = streamReducer(state, {\n type: \"EVENT\",\n event: propsDelta2,\n threadId: \"thread_1\",\n });\n\n // COMPONENT_END\n const compEnd: CustomEvent = {\n type: EventType.CUSTOM,\n name: \"tambo.component.end\",\n value: { componentId: \"comp_1\" },\n };\n state = streamReducer(state, {\n type: \"EVENT\",\n event: compEnd,\n threadId: \"thread_1\",\n });\n\n // Normalize timestamps for snapshot stability\n const snapshot = {\n ...state,\n threadMap: {\n thread_1: {\n ...state.threadMap.thread_1,\n thread: {\n ...state.threadMap.thread_1.thread,\n messages: state.threadMap.thread_1.thread.messages.map((m) => ({\n ...m,\n createdAt: \"[TIMESTAMP]\",\n })),\n createdAt: \"[TIMESTAMP]\",\n updatedAt: \"[TIMESTAMP]\",\n },\n },\n },\n };\n\n expect(snapshot).toMatchSnapshot();\n });\n\n it(\"matches snapshot for tool call flow\", () => {\n let state = createTestStreamState(\"thread_1\");\n\n // Add a message with tool_use\n state.threadMap.thread_1.thread.messages = [\n {\n id: \"msg_1\",\n role: \"assistant\",\n content: [\n { type: \"tool_use\", id: \"tool_1\", name: \"get_weather\", input: {} },\n ],\n createdAt: \"2024-01-01T00:00:00.000Z\",\n },\n ];\n\n // TOOL_CALL_ARGS\n const toolArgs: ToolCallArgsEvent = {\n type: EventType.TOOL_CALL_ARGS,\n toolCallId: \"tool_1\",\n delta: '{\"city\":\"San Francisco\",\"units\":\"fahrenheit\"}',\n };\n state = streamReducer(state, {\n type: \"EVENT\",\n event: toolArgs,\n threadId: \"thread_1\",\n });\n\n // TOOL_CALL_END\n const toolEnd: ToolCallEndEvent = {\n type: EventType.TOOL_CALL_END,\n toolCallId: \"tool_1\",\n };\n state = streamReducer(state, {\n type: \"EVENT\",\n event: toolEnd,\n threadId: \"thread_1\",\n });\n\n // TOOL_CALL_RESULT\n const toolResult: ToolCallResultEvent = {\n type: EventType.TOOL_CALL_RESULT,\n toolCallId: \"tool_1\",\n messageId: \"msg_1\",\n content: \"Temperature: 65°F, Sunny\",\n role: \"tool\",\n };\n state = streamReducer(state, {\n type: \"EVENT\",\n event: toolResult,\n threadId: \"thread_1\",\n });\n\n // Normalize timestamps for snapshot stability\n const snapshot = {\n ...state,\n threadMap: {\n thread_1: {\n ...state.threadMap.thread_1,\n thread: {\n ...state.threadMap.thread_1.thread,\n messages: state.threadMap.thread_1.thread.messages.map((m) => ({\n ...m,\n createdAt: \"[TIMESTAMP]\",\n })),\n createdAt: \"[TIMESTAMP]\",\n updatedAt: \"[TIMESTAMP]\",\n },\n },\n },\n };\n\n expect(snapshot).toMatchSnapshot();\n });\n });\n});\n"]}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON Patch Utilities (RFC 6902)
|
|
3
|
+
*
|
|
4
|
+
* Wrapper around fast-json-patch for applying JSON Patch operations.
|
|
5
|
+
* Used to update component props and state during streaming.
|
|
6
|
+
*/
|
|
7
|
+
import { type Operation } from "fast-json-patch";
|
|
8
|
+
/**
|
|
9
|
+
* Apply JSON Patch operations to an object.
|
|
10
|
+
*
|
|
11
|
+
* Returns a new object with patches applied without mutating the original.
|
|
12
|
+
* @param target - The object to patch
|
|
13
|
+
* @param operations - Array of JSON Patch operations
|
|
14
|
+
* @returns New object with patches applied
|
|
15
|
+
* @throws {Error} With context about the failed operation if patching fails
|
|
16
|
+
*/
|
|
17
|
+
export declare function applyJsonPatch<T extends Record<string, unknown>>(target: T, operations: Operation[]): T;
|
|
18
|
+
//# sourceMappingURL=json-patch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-patch.d.ts","sourceRoot":"","sources":["../../../src/v1/utils/json-patch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAc,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE7D;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9D,MAAM,EAAE,CAAC,EACT,UAAU,EAAE,SAAS,EAAE,GACtB,CAAC,CAmBH"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON Patch Utilities (RFC 6902)
|
|
3
|
+
*
|
|
4
|
+
* Wrapper around fast-json-patch for applying JSON Patch operations.
|
|
5
|
+
* Used to update component props and state during streaming.
|
|
6
|
+
*/
|
|
7
|
+
import { applyPatch } from "fast-json-patch";
|
|
8
|
+
/**
|
|
9
|
+
* Apply JSON Patch operations to an object.
|
|
10
|
+
*
|
|
11
|
+
* Returns a new object with patches applied without mutating the original.
|
|
12
|
+
* @param target - The object to patch
|
|
13
|
+
* @param operations - Array of JSON Patch operations
|
|
14
|
+
* @returns New object with patches applied
|
|
15
|
+
* @throws {Error} With context about the failed operation if patching fails
|
|
16
|
+
*/
|
|
17
|
+
export function applyJsonPatch(target, operations) {
|
|
18
|
+
try {
|
|
19
|
+
// Apply patches with mutate=false so fast-json-patch handles cloning
|
|
20
|
+
const result = applyPatch(target, operations,
|
|
21
|
+
/* validate */ true,
|
|
22
|
+
/* mutate */ false);
|
|
23
|
+
return result.newDocument;
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
const opSummary = operations.map((op) => `${op.op} ${op.path}`).join(", ");
|
|
27
|
+
throw new Error(`Failed to apply JSON patch operations [${opSummary}]: ` +
|
|
28
|
+
`${error instanceof Error ? error.message : String(error)}. ` +
|
|
29
|
+
`Target had keys: [${Object.keys(target).join(", ")}]`);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=json-patch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-patch.js","sourceRoot":"","sources":["../../../src/v1/utils/json-patch.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,UAAU,EAAkB,MAAM,iBAAiB,CAAC;AAE7D;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAC5B,MAAS,EACT,UAAuB;IAEvB,IAAI,CAAC;QACH,qEAAqE;QACrE,MAAM,MAAM,GAAG,UAAU,CACvB,MAAM,EACN,UAAU;QACV,cAAc,CAAC,IAAI;QACnB,YAAY,CAAC,KAAK,CACnB,CAAC;QAEF,OAAO,MAAM,CAAC,WAAW,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3E,MAAM,IAAI,KAAK,CACb,0CAA0C,SAAS,KAAK;YACtD,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI;YAC7D,qBAAqB,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACzD,CAAC;IACJ,CAAC;AACH,CAAC","sourcesContent":["/**\n * JSON Patch Utilities (RFC 6902)\n *\n * Wrapper around fast-json-patch for applying JSON Patch operations.\n * Used to update component props and state during streaming.\n */\n\nimport { applyPatch, type Operation } from \"fast-json-patch\";\n\n/**\n * Apply JSON Patch operations to an object.\n *\n * Returns a new object with patches applied without mutating the original.\n * @param target - The object to patch\n * @param operations - Array of JSON Patch operations\n * @returns New object with patches applied\n * @throws {Error} With context about the failed operation if patching fails\n */\nexport function applyJsonPatch<T extends Record<string, unknown>>(\n target: T,\n operations: Operation[],\n): T {\n try {\n // Apply patches with mutate=false so fast-json-patch handles cloning\n const result = applyPatch(\n target,\n operations,\n /* validate */ true,\n /* mutate */ false,\n );\n\n return result.newDocument;\n } catch (error) {\n const opSummary = operations.map((op) => `${op.op} ${op.path}`).join(\", \");\n throw new Error(\n `Failed to apply JSON patch operations [${opSummary}]: ` +\n `${error instanceof Error ? error.message : String(error)}. ` +\n `Target had keys: [${Object.keys(target).join(\", \")}]`,\n );\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-patch.test.d.ts","sourceRoot":"","sources":["../../../src/v1/utils/json-patch.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { applyJsonPatch } from "./json-patch";
|
|
2
|
+
describe("applyJsonPatch error handling", () => {
|
|
3
|
+
it("includes operation summary in error message", () => {
|
|
4
|
+
const target = { existing: "value" };
|
|
5
|
+
const operations = [
|
|
6
|
+
{ op: "replace", path: "/nonexistent", value: "fail" },
|
|
7
|
+
];
|
|
8
|
+
expect(() => applyJsonPatch(target, operations)).toThrow(/Failed to apply JSON patch operations \[replace \/nonexistent\]/);
|
|
9
|
+
});
|
|
10
|
+
it("includes target keys in error message", () => {
|
|
11
|
+
const target = { foo: 1, bar: 2 };
|
|
12
|
+
const operations = [
|
|
13
|
+
{ op: "replace", path: "/missing", value: "x" },
|
|
14
|
+
];
|
|
15
|
+
expect(() => applyJsonPatch(target, operations)).toThrow(/Target had keys: \[foo, bar\]/);
|
|
16
|
+
});
|
|
17
|
+
it("shows all operations in error summary", () => {
|
|
18
|
+
const target = {};
|
|
19
|
+
const operations = [
|
|
20
|
+
{ op: "add", path: "/a", value: 1 },
|
|
21
|
+
{ op: "replace", path: "/missing", value: 2 },
|
|
22
|
+
];
|
|
23
|
+
expect(() => applyJsonPatch(target, operations)).toThrow(/add \/a, replace \/missing/);
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
//# sourceMappingURL=json-patch.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-patch.test.js","sourceRoot":"","sources":["../../../src/v1/utils/json-patch.test.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE9C,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,MAAM,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;QACrC,MAAM,UAAU,GAAgB;YAC9B,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,EAAE;SACvD,CAAC;QAEF,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CACtD,iEAAiE,CAClE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,MAAM,GAAG,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;QAClC,MAAM,UAAU,GAAgB;YAC9B,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE;SAChD,CAAC;QAEF,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CACtD,+BAA+B,CAChC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,MAAM,UAAU,GAAgB;YAC9B,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE;YACnC,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,EAAE;SAC9C,CAAC;QAEF,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC,OAAO,CACtD,4BAA4B,CAC7B,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import type { Operation } from \"fast-json-patch\";\nimport { applyJsonPatch } from \"./json-patch\";\n\ndescribe(\"applyJsonPatch error handling\", () => {\n it(\"includes operation summary in error message\", () => {\n const target = { existing: \"value\" };\n const operations: Operation[] = [\n { op: \"replace\", path: \"/nonexistent\", value: \"fail\" },\n ];\n\n expect(() => applyJsonPatch(target, operations)).toThrow(\n /Failed to apply JSON patch operations \\[replace \\/nonexistent\\]/,\n );\n });\n\n it(\"includes target keys in error message\", () => {\n const target = { foo: 1, bar: 2 };\n const operations: Operation[] = [\n { op: \"replace\", path: \"/missing\", value: \"x\" },\n ];\n\n expect(() => applyJsonPatch(target, operations)).toThrow(\n /Target had keys: \\[foo, bar\\]/,\n );\n });\n\n it(\"shows all operations in error summary\", () => {\n const target = {};\n const operations: Operation[] = [\n { op: \"add\", path: \"/a\", value: 1 },\n { op: \"replace\", path: \"/missing\", value: 2 },\n ];\n\n expect(() => applyJsonPatch(target, operations)).toThrow(\n /add \\/a, replace \\/missing/,\n );\n });\n});\n"]}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry Conversion Utilities
|
|
3
|
+
*
|
|
4
|
+
* Converts beta SDK component/tool types to v1 API format.
|
|
5
|
+
* Reuses the beta SDK's TamboRegistryProvider but provides conversion
|
|
6
|
+
* utilities for sending component/tool metadata to the v1 API.
|
|
7
|
+
*/
|
|
8
|
+
import type { TamboComponent, TamboTool, UnsupportedSchemaTamboTool } from "../../model/component-metadata";
|
|
9
|
+
import type { RunCreateParams } from "@tambo-ai/typescript-sdk/resources/threads/runs";
|
|
10
|
+
type AvailableComponent = RunCreateParams.AvailableComponent;
|
|
11
|
+
type Tool = RunCreateParams.Tool;
|
|
12
|
+
/**
|
|
13
|
+
* Convert a registered component to v1 API format.
|
|
14
|
+
*
|
|
15
|
+
* Transforms TamboComponent (beta SDK format with Standard Schema support)
|
|
16
|
+
* to AvailableComponent (v1 API format requiring JSON Schema).
|
|
17
|
+
* @param component - Component from beta SDK registry
|
|
18
|
+
* @returns Component metadata in v1 API format
|
|
19
|
+
* @throws {Error} if propsSchema conversion fails
|
|
20
|
+
*/
|
|
21
|
+
export declare function toAvailableComponent(component: TamboComponent): AvailableComponent;
|
|
22
|
+
/**
|
|
23
|
+
* Convert multiple registered components to v1 API format.
|
|
24
|
+
*
|
|
25
|
+
* Transforms a Record/Map of TamboComponents to an array of AvailableComponents.
|
|
26
|
+
* Components without propsSchema will be logged as warnings and skipped.
|
|
27
|
+
* @param components - Record or Map of components from beta SDK registry
|
|
28
|
+
* @returns Array of component metadata in v1 API format
|
|
29
|
+
*/
|
|
30
|
+
export declare function toAvailableComponents(components: Record<string, TamboComponent> | Map<string, TamboComponent>): AvailableComponent[];
|
|
31
|
+
/**
|
|
32
|
+
* Convert a registered tool to v1 API format.
|
|
33
|
+
*
|
|
34
|
+
* Transforms TamboTool or UnsupportedSchemaTamboTool (beta SDK format with
|
|
35
|
+
* Standard Schema support) to Tool (v1 API format requiring JSON Schema).
|
|
36
|
+
* Handles both new inputSchema and deprecated toolSchema formats.
|
|
37
|
+
* @param tool - Tool from beta SDK registry
|
|
38
|
+
* @returns Tool metadata in v1 API format
|
|
39
|
+
* @throws {Error} if schema conversion fails or schema is missing
|
|
40
|
+
*/
|
|
41
|
+
export declare function toAvailableTool(tool: TamboTool | UnsupportedSchemaTamboTool): Tool;
|
|
42
|
+
/**
|
|
43
|
+
* Convert multiple registered tools to v1 API format.
|
|
44
|
+
*
|
|
45
|
+
* Transforms a Record/Map of TamboTools or UnsupportedSchemaTamboTool to an array
|
|
46
|
+
* of Tools. Tools without inputSchema/toolSchema will be logged as warnings
|
|
47
|
+
* and skipped.
|
|
48
|
+
* @param tools - Record or Map of tools from beta SDK registry
|
|
49
|
+
* @returns Array of tool metadata in v1 API format
|
|
50
|
+
*/
|
|
51
|
+
export declare function toAvailableTools(tools: Record<string, TamboTool | UnsupportedSchemaTamboTool> | Map<string, TamboTool | UnsupportedSchemaTamboTool>): Tool[];
|
|
52
|
+
export {};
|
|
53
|
+
//# sourceMappingURL=registry-conversion.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-conversion.d.ts","sourceRoot":"","sources":["../../../src/v1/utils/registry-conversion.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,KAAK,EACV,cAAc,EACd,SAAS,EACT,0BAA0B,EAC3B,MAAM,gCAAgC,CAAC;AAExC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,iDAAiD,CAAC;AAGvF,KAAK,kBAAkB,GAAG,eAAe,CAAC,kBAAkB,CAAC;AAC7D,KAAK,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC;AAEjC;;;;;;;;GAQG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,cAAc,GACxB,kBAAkB,CAiBpB;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,GACvE,kBAAkB,EAAE,CAmBtB;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,SAAS,GAAG,0BAA0B,GAC3C,IAAI,CAwBN;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EACD,MAAM,CAAC,MAAM,EAAE,SAAS,GAAG,0BAA0B,CAAC,GACtD,GAAG,CAAC,MAAM,EAAE,SAAS,GAAG,0BAA0B,CAAC,GACtD,IAAI,EAAE,CAiBR"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Registry Conversion Utilities
|
|
3
|
+
*
|
|
4
|
+
* Converts beta SDK component/tool types to v1 API format.
|
|
5
|
+
* Reuses the beta SDK's TamboRegistryProvider but provides conversion
|
|
6
|
+
* utilities for sending component/tool metadata to the v1 API.
|
|
7
|
+
*/
|
|
8
|
+
import { schemaToJsonSchema } from "../../schema/schema";
|
|
9
|
+
/**
|
|
10
|
+
* Convert a registered component to v1 API format.
|
|
11
|
+
*
|
|
12
|
+
* Transforms TamboComponent (beta SDK format with Standard Schema support)
|
|
13
|
+
* to AvailableComponent (v1 API format requiring JSON Schema).
|
|
14
|
+
* @param component - Component from beta SDK registry
|
|
15
|
+
* @returns Component metadata in v1 API format
|
|
16
|
+
* @throws {Error} if propsSchema conversion fails
|
|
17
|
+
*/
|
|
18
|
+
export function toAvailableComponent(component) {
|
|
19
|
+
// Convert propsSchema (required for v1)
|
|
20
|
+
if (!component.propsSchema) {
|
|
21
|
+
throw new Error(`Component "${component.name}" missing propsSchema - required for v1 API`);
|
|
22
|
+
}
|
|
23
|
+
const propsSchema = schemaToJsonSchema(component.propsSchema);
|
|
24
|
+
return {
|
|
25
|
+
name: component.name,
|
|
26
|
+
description: component.description,
|
|
27
|
+
propsSchema: propsSchema,
|
|
28
|
+
// stateSchema is v1-specific and not available in beta SDK components
|
|
29
|
+
// Components can still have state, but schema must be defined separately
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Convert multiple registered components to v1 API format.
|
|
34
|
+
*
|
|
35
|
+
* Transforms a Record/Map of TamboComponents to an array of AvailableComponents.
|
|
36
|
+
* Components without propsSchema will be logged as warnings and skipped.
|
|
37
|
+
* @param components - Record or Map of components from beta SDK registry
|
|
38
|
+
* @returns Array of component metadata in v1 API format
|
|
39
|
+
*/
|
|
40
|
+
export function toAvailableComponents(components) {
|
|
41
|
+
const results = [];
|
|
42
|
+
const entries = components instanceof Map
|
|
43
|
+
? Array.from(components.entries())
|
|
44
|
+
: Object.entries(components);
|
|
45
|
+
for (const [name, component] of entries) {
|
|
46
|
+
try {
|
|
47
|
+
results.push(toAvailableComponent(component));
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
console.warn(`Skipping component "${name}" in v1 conversion: ${error instanceof Error ? error.message : String(error)}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return results;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Convert a registered tool to v1 API format.
|
|
57
|
+
*
|
|
58
|
+
* Transforms TamboTool or UnsupportedSchemaTamboTool (beta SDK format with
|
|
59
|
+
* Standard Schema support) to Tool (v1 API format requiring JSON Schema).
|
|
60
|
+
* Handles both new inputSchema and deprecated toolSchema formats.
|
|
61
|
+
* @param tool - Tool from beta SDK registry
|
|
62
|
+
* @returns Tool metadata in v1 API format
|
|
63
|
+
* @throws {Error} if schema conversion fails or schema is missing
|
|
64
|
+
*/
|
|
65
|
+
export function toAvailableTool(tool) {
|
|
66
|
+
// Check for inputSchema (modern format - required in TamboTool)
|
|
67
|
+
if ("inputSchema" in tool && tool.inputSchema) {
|
|
68
|
+
const inputSchema = schemaToJsonSchema(tool.inputSchema);
|
|
69
|
+
return {
|
|
70
|
+
name: tool.name,
|
|
71
|
+
description: tool.description,
|
|
72
|
+
inputSchema: inputSchema,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
// Check for deprecated toolSchema format (UnsupportedSchemaTamboTool)
|
|
76
|
+
if ("toolSchema" in tool && tool.toolSchema) {
|
|
77
|
+
const inputSchema = schemaToJsonSchema(tool.toolSchema);
|
|
78
|
+
return {
|
|
79
|
+
name: tool.name,
|
|
80
|
+
description: tool.description,
|
|
81
|
+
inputSchema: inputSchema,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
throw new Error(`Tool "${tool.name}" missing inputSchema or toolSchema - required for v1 API`);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Convert multiple registered tools to v1 API format.
|
|
88
|
+
*
|
|
89
|
+
* Transforms a Record/Map of TamboTools or UnsupportedSchemaTamboTool to an array
|
|
90
|
+
* of Tools. Tools without inputSchema/toolSchema will be logged as warnings
|
|
91
|
+
* and skipped.
|
|
92
|
+
* @param tools - Record or Map of tools from beta SDK registry
|
|
93
|
+
* @returns Array of tool metadata in v1 API format
|
|
94
|
+
*/
|
|
95
|
+
export function toAvailableTools(tools) {
|
|
96
|
+
const results = [];
|
|
97
|
+
const entries = tools instanceof Map ? Array.from(tools.entries()) : Object.entries(tools);
|
|
98
|
+
for (const [name, tool] of entries) {
|
|
99
|
+
try {
|
|
100
|
+
results.push(toAvailableTool(tool));
|
|
101
|
+
}
|
|
102
|
+
catch (error) {
|
|
103
|
+
console.warn(`Skipping tool "${name}" in v1 conversion: ${error instanceof Error ? error.message : String(error)}`);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return results;
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=registry-conversion.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-conversion.js","sourceRoot":"","sources":["../../../src/v1/utils/registry-conversion.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Registry Conversion Utilities\n *\n * Converts beta SDK component/tool types to v1 API format.\n * Reuses the beta SDK's TamboRegistryProvider but provides conversion\n * utilities for sending component/tool metadata to the v1 API.\n */\n\nimport type { JSONSchema7 } from \"json-schema\";\nimport type {\n TamboComponent,\n TamboTool,\n UnsupportedSchemaTamboTool,\n} from \"../../model/component-metadata\";\nimport { schemaToJsonSchema } from \"../../schema/schema\";\nimport type { RunCreateParams } from \"@tambo-ai/typescript-sdk/resources/threads/runs\";\n\n// Use the SDK's types for API requests\ntype AvailableComponent = RunCreateParams.AvailableComponent;\ntype Tool = RunCreateParams.Tool;\n\n/**\n * Convert a registered component to v1 API format.\n *\n * Transforms TamboComponent (beta SDK format with Standard Schema support)\n * to AvailableComponent (v1 API format requiring JSON Schema).\n * @param component - Component from beta SDK registry\n * @returns Component metadata in v1 API format\n * @throws {Error} if propsSchema conversion fails\n */\nexport function toAvailableComponent(\n component: TamboComponent,\n): AvailableComponent {\n // Convert propsSchema (required for v1)\n if (!component.propsSchema) {\n throw new Error(\n `Component \"${component.name}\" missing propsSchema - required for v1 API`,\n );\n }\n\n const propsSchema: JSONSchema7 = schemaToJsonSchema(component.propsSchema);\n\n return {\n name: component.name,\n description: component.description,\n propsSchema: propsSchema as Record<string, unknown>,\n // stateSchema is v1-specific and not available in beta SDK components\n // Components can still have state, but schema must be defined separately\n };\n}\n\n/**\n * Convert multiple registered components to v1 API format.\n *\n * Transforms a Record/Map of TamboComponents to an array of AvailableComponents.\n * Components without propsSchema will be logged as warnings and skipped.\n * @param components - Record or Map of components from beta SDK registry\n * @returns Array of component metadata in v1 API format\n */\nexport function toAvailableComponents(\n components: Record<string, TamboComponent> | Map<string, TamboComponent>,\n): AvailableComponent[] {\n const results: AvailableComponent[] = [];\n\n const entries =\n components instanceof Map\n ? Array.from(components.entries())\n : Object.entries(components);\n\n for (const [name, component] of entries) {\n try {\n results.push(toAvailableComponent(component));\n } catch (error) {\n console.warn(\n `Skipping component \"${name}\" in v1 conversion: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n return results;\n}\n\n/**\n * Convert a registered tool to v1 API format.\n *\n * Transforms TamboTool or UnsupportedSchemaTamboTool (beta SDK format with\n * Standard Schema support) to Tool (v1 API format requiring JSON Schema).\n * Handles both new inputSchema and deprecated toolSchema formats.\n * @param tool - Tool from beta SDK registry\n * @returns Tool metadata in v1 API format\n * @throws {Error} if schema conversion fails or schema is missing\n */\nexport function toAvailableTool(\n tool: TamboTool | UnsupportedSchemaTamboTool,\n): Tool {\n // Check for inputSchema (modern format - required in TamboTool)\n if (\"inputSchema\" in tool && tool.inputSchema) {\n const inputSchema: JSONSchema7 = schemaToJsonSchema(tool.inputSchema);\n return {\n name: tool.name,\n description: tool.description,\n inputSchema: inputSchema as Record<string, unknown>,\n };\n }\n\n // Check for deprecated toolSchema format (UnsupportedSchemaTamboTool)\n if (\"toolSchema\" in tool && tool.toolSchema) {\n const inputSchema: JSONSchema7 = schemaToJsonSchema(tool.toolSchema);\n return {\n name: tool.name,\n description: tool.description,\n inputSchema: inputSchema as Record<string, unknown>,\n };\n }\n\n throw new Error(\n `Tool \"${tool.name}\" missing inputSchema or toolSchema - required for v1 API`,\n );\n}\n\n/**\n * Convert multiple registered tools to v1 API format.\n *\n * Transforms a Record/Map of TamboTools or UnsupportedSchemaTamboTool to an array\n * of Tools. Tools without inputSchema/toolSchema will be logged as warnings\n * and skipped.\n * @param tools - Record or Map of tools from beta SDK registry\n * @returns Array of tool metadata in v1 API format\n */\nexport function toAvailableTools(\n tools:\n | Record<string, TamboTool | UnsupportedSchemaTamboTool>\n | Map<string, TamboTool | UnsupportedSchemaTamboTool>,\n): Tool[] {\n const results: Tool[] = [];\n\n const entries =\n tools instanceof Map ? Array.from(tools.entries()) : Object.entries(tools);\n\n for (const [name, tool] of entries) {\n try {\n results.push(toAvailableTool(tool));\n } catch (error) {\n console.warn(\n `Skipping tool \"${name}\" in v1 conversion: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n return results;\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry-conversion.test.d.ts","sourceRoot":"","sources":["../../../src/v1/utils/registry-conversion.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { toAvailableComponent, toAvailableComponents, toAvailableTool, toAvailableTools, } from "./registry-conversion";
|
|
3
|
+
describe("registry-conversion", () => {
|
|
4
|
+
describe("toAvailableComponent", () => {
|
|
5
|
+
it("converts a component with propsSchema", () => {
|
|
6
|
+
const component = {
|
|
7
|
+
name: "WeatherCard",
|
|
8
|
+
description: "Displays weather information",
|
|
9
|
+
component: () => null,
|
|
10
|
+
propsSchema: z.object({
|
|
11
|
+
city: z.string(),
|
|
12
|
+
temperature: z.number(),
|
|
13
|
+
}),
|
|
14
|
+
};
|
|
15
|
+
const result = toAvailableComponent(component);
|
|
16
|
+
expect(result.name).toBe("WeatherCard");
|
|
17
|
+
expect(result.description).toBe("Displays weather information");
|
|
18
|
+
expect(result.propsSchema).toBeDefined();
|
|
19
|
+
expect(result.propsSchema.type).toBe("object");
|
|
20
|
+
});
|
|
21
|
+
it("throws when propsSchema is missing", () => {
|
|
22
|
+
const component = {
|
|
23
|
+
name: "BadComponent",
|
|
24
|
+
description: "Missing schema",
|
|
25
|
+
component: () => null,
|
|
26
|
+
};
|
|
27
|
+
expect(() => toAvailableComponent(component)).toThrow('Component "BadComponent" missing propsSchema');
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
describe("toAvailableComponents", () => {
|
|
31
|
+
it("converts a Record of components", () => {
|
|
32
|
+
const components = {
|
|
33
|
+
Card: {
|
|
34
|
+
name: "Card",
|
|
35
|
+
description: "A card component",
|
|
36
|
+
component: () => null,
|
|
37
|
+
propsSchema: z.object({ title: z.string() }),
|
|
38
|
+
},
|
|
39
|
+
Button: {
|
|
40
|
+
name: "Button",
|
|
41
|
+
description: "A button component",
|
|
42
|
+
component: () => null,
|
|
43
|
+
propsSchema: z.object({ label: z.string() }),
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
const result = toAvailableComponents(components);
|
|
47
|
+
expect(result).toHaveLength(2);
|
|
48
|
+
expect(result.map((c) => c.name)).toContain("Card");
|
|
49
|
+
expect(result.map((c) => c.name)).toContain("Button");
|
|
50
|
+
});
|
|
51
|
+
it("converts a Map of components", () => {
|
|
52
|
+
const components = new Map([
|
|
53
|
+
[
|
|
54
|
+
"Card",
|
|
55
|
+
{
|
|
56
|
+
name: "Card",
|
|
57
|
+
description: "A card",
|
|
58
|
+
component: () => null,
|
|
59
|
+
propsSchema: z.object({ title: z.string() }),
|
|
60
|
+
},
|
|
61
|
+
],
|
|
62
|
+
]);
|
|
63
|
+
const result = toAvailableComponents(components);
|
|
64
|
+
expect(result).toHaveLength(1);
|
|
65
|
+
expect(result[0].name).toBe("Card");
|
|
66
|
+
});
|
|
67
|
+
it("skips invalid components and logs warning", () => {
|
|
68
|
+
const warnSpy = jest.spyOn(console, "warn").mockImplementation(() => { });
|
|
69
|
+
const components = {
|
|
70
|
+
Valid: {
|
|
71
|
+
name: "Valid",
|
|
72
|
+
description: "Valid component",
|
|
73
|
+
component: () => null,
|
|
74
|
+
propsSchema: z.object({ x: z.string() }),
|
|
75
|
+
},
|
|
76
|
+
Invalid: {
|
|
77
|
+
name: "Invalid",
|
|
78
|
+
description: "Missing schema",
|
|
79
|
+
component: () => null,
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
const result = toAvailableComponents(components);
|
|
83
|
+
expect(result).toHaveLength(1);
|
|
84
|
+
expect(result[0].name).toBe("Valid");
|
|
85
|
+
expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('Skipping component "Invalid"'));
|
|
86
|
+
warnSpy.mockRestore();
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
describe("toAvailableTool", () => {
|
|
90
|
+
it("converts a tool with inputSchema", () => {
|
|
91
|
+
const tool = {
|
|
92
|
+
name: "get_weather",
|
|
93
|
+
description: "Gets weather for a city",
|
|
94
|
+
tool: async () => ({ temp: 72 }),
|
|
95
|
+
inputSchema: z.object({ city: z.string() }),
|
|
96
|
+
outputSchema: z.any(),
|
|
97
|
+
};
|
|
98
|
+
const result = toAvailableTool(tool);
|
|
99
|
+
expect(result.name).toBe("get_weather");
|
|
100
|
+
expect(result.description).toBe("Gets weather for a city");
|
|
101
|
+
expect(result.inputSchema).toBeDefined();
|
|
102
|
+
expect(result.inputSchema.type).toBe("object");
|
|
103
|
+
});
|
|
104
|
+
it("throws when schema is missing", () => {
|
|
105
|
+
const tool = {
|
|
106
|
+
name: "bad_tool",
|
|
107
|
+
description: "Missing schema",
|
|
108
|
+
tool: async () => ({}),
|
|
109
|
+
};
|
|
110
|
+
expect(() => toAvailableTool(tool)).toThrow('Tool "bad_tool" missing inputSchema or toolSchema');
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
describe("toAvailableTools", () => {
|
|
114
|
+
it("converts a Record of tools", () => {
|
|
115
|
+
const tools = {
|
|
116
|
+
search: {
|
|
117
|
+
name: "search",
|
|
118
|
+
description: "Search the web",
|
|
119
|
+
tool: async () => [],
|
|
120
|
+
inputSchema: z.object({ query: z.string() }),
|
|
121
|
+
outputSchema: z.any(),
|
|
122
|
+
},
|
|
123
|
+
calculate: {
|
|
124
|
+
name: "calculate",
|
|
125
|
+
description: "Calculate expression",
|
|
126
|
+
tool: async () => 0,
|
|
127
|
+
inputSchema: z.object({ expr: z.string() }),
|
|
128
|
+
outputSchema: z.any(),
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
const result = toAvailableTools(tools);
|
|
132
|
+
expect(result).toHaveLength(2);
|
|
133
|
+
expect(result.map((t) => t.name)).toContain("search");
|
|
134
|
+
expect(result.map((t) => t.name)).toContain("calculate");
|
|
135
|
+
});
|
|
136
|
+
it("converts a Map of tools", () => {
|
|
137
|
+
const tools = new Map([
|
|
138
|
+
[
|
|
139
|
+
"fetch",
|
|
140
|
+
{
|
|
141
|
+
name: "fetch",
|
|
142
|
+
description: "Fetch data",
|
|
143
|
+
tool: async () => null,
|
|
144
|
+
inputSchema: z.object({ url: z.string() }),
|
|
145
|
+
outputSchema: z.any(),
|
|
146
|
+
},
|
|
147
|
+
],
|
|
148
|
+
]);
|
|
149
|
+
const result = toAvailableTools(tools);
|
|
150
|
+
expect(result).toHaveLength(1);
|
|
151
|
+
expect(result[0].name).toBe("fetch");
|
|
152
|
+
});
|
|
153
|
+
it("skips invalid tools and logs warning", () => {
|
|
154
|
+
const warnSpy = jest.spyOn(console, "warn").mockImplementation(() => { });
|
|
155
|
+
const tools = {
|
|
156
|
+
valid: {
|
|
157
|
+
name: "valid",
|
|
158
|
+
description: "Valid tool",
|
|
159
|
+
tool: async () => null,
|
|
160
|
+
inputSchema: z.object({ x: z.number() }),
|
|
161
|
+
outputSchema: z.any(),
|
|
162
|
+
},
|
|
163
|
+
invalid: {
|
|
164
|
+
name: "invalid",
|
|
165
|
+
description: "Missing schema",
|
|
166
|
+
tool: async () => null,
|
|
167
|
+
},
|
|
168
|
+
};
|
|
169
|
+
const result = toAvailableTools(tools);
|
|
170
|
+
expect(result).toHaveLength(1);
|
|
171
|
+
expect(result[0].name).toBe("valid");
|
|
172
|
+
expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('Skipping tool "invalid"'));
|
|
173
|
+
warnSpy.mockRestore();
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
//# sourceMappingURL=registry-conversion.test.js.map
|