@tambo-ai/react 1.1.0 → 1.2.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/dist/context-helpers/current-interactables-context-helper.d.ts +16 -2
- package/dist/context-helpers/current-interactables-context-helper.d.ts.map +1 -1
- package/dist/context-helpers/current-interactables-context-helper.js.map +1 -1
- package/dist/context-helpers/current-interactables-context-helper.test.d.ts +2 -0
- package/dist/context-helpers/current-interactables-context-helper.test.d.ts.map +1 -0
- package/dist/context-helpers/current-interactables-context-helper.test.js +70 -0
- package/dist/context-helpers/current-interactables-context-helper.test.js.map +1 -0
- package/dist/mcp/elicitation.d.ts +3 -37
- package/dist/mcp/elicitation.d.ts.map +1 -1
- package/dist/mcp/elicitation.js +7 -24
- package/dist/mcp/elicitation.js.map +1 -1
- package/dist/mcp/index.d.ts +4 -4
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +2 -2
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/mcp-client.test.js +17 -17
- package/dist/mcp/mcp-client.test.js.map +1 -1
- package/dist/mcp/mcp-hooks.d.ts.map +1 -1
- package/dist/mcp/mcp-hooks.js +8 -5
- package/dist/mcp/mcp-hooks.js.map +1 -1
- package/dist/mcp/mcp-hooks.test.js +30 -29
- package/dist/mcp/mcp-hooks.test.js.map +1 -1
- package/dist/mcp/tambo-mcp-provider.d.ts +6 -9
- package/dist/mcp/tambo-mcp-provider.d.ts.map +1 -1
- package/dist/mcp/tambo-mcp-provider.js +9 -13
- package/dist/mcp/tambo-mcp-provider.js.map +1 -1
- package/dist/mcp/tambo-mcp-provider.test.js +26 -25
- package/dist/mcp/tambo-mcp-provider.test.js.map +1 -1
- package/dist/mcp/use-mcp-servers.test.js +2 -1
- package/dist/mcp/use-mcp-servers.test.js.map +1 -1
- package/dist/model/component-metadata.d.ts +7 -372
- package/dist/model/component-metadata.d.ts.map +1 -1
- package/dist/model/component-metadata.js.map +1 -1
- package/dist/model/validate-input.test.d.ts +2 -0
- package/dist/model/validate-input.test.d.ts.map +1 -0
- package/dist/model/validate-input.test.js +38 -0
- package/dist/model/validate-input.test.js.map +1 -0
- package/dist/providers/tambo-interactable-provider.d.ts +7 -7
- package/dist/providers/tambo-registry-provider.d.ts +1 -1
- package/dist/providers/tambo-registry-provider.d.ts.map +1 -1
- package/dist/providers/tambo-registry-provider.js.map +1 -1
- package/dist/providers/tambo-registry-schema-compat.test.js +4 -4
- package/dist/providers/tambo-registry-schema-compat.test.js.map +1 -1
- package/dist/schema/index.d.ts +2 -4
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +9 -11
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/json-schema.d.ts +1 -17
- package/dist/schema/json-schema.d.ts.map +1 -1
- package/dist/schema/json-schema.js +5 -69
- package/dist/schema/json-schema.js.map +1 -1
- package/dist/schema/schema.test.js +24 -25
- package/dist/schema/schema.test.js.map +1 -1
- package/dist/schema/standard-schema.test.js +25 -25
- package/dist/schema/standard-schema.test.js.map +1 -1
- package/dist/schema/validate.test.js +33 -33
- package/dist/schema/validate.test.js.map +1 -1
- package/dist/testing/tools.d.ts +4 -4
- package/dist/testing/tools.test.d.ts +2 -0
- package/dist/testing/tools.test.d.ts.map +1 -0
- package/dist/testing/tools.test.js +60 -0
- package/dist/testing/tools.test.js.map +1 -0
- package/dist/util/mcp-server-utils.d.ts +1 -1
- package/dist/util/mcp-server-utils.d.ts.map +1 -1
- package/dist/util/mcp-server-utils.js +4 -4
- package/dist/util/mcp-server-utils.js.map +1 -1
- package/dist/util/mcp-server-utils.test.js +27 -27
- package/dist/util/mcp-server-utils.test.js.map +1 -1
- package/dist/util/registry.js +1 -1
- package/dist/util/registry.js.map +1 -1
- package/dist/util/resource-content-resolver.js +5 -5
- package/dist/util/resource-content-resolver.js.map +1 -1
- package/dist/util/resource-content-resolver.test.js +6 -6
- package/dist/util/resource-content-resolver.test.js.map +1 -1
- package/dist/util/tool-caller.test.d.ts +2 -0
- package/dist/util/tool-caller.test.d.ts.map +1 -0
- package/dist/util/tool-caller.test.js +71 -0
- package/dist/util/tool-caller.test.js.map +1 -0
- package/dist/v1/__tests__/v1-interactables.test.js +1 -0
- package/dist/v1/__tests__/v1-interactables.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-auth-state.d.ts +1 -1
- package/dist/v1/hooks/use-tambo-v1-auth-state.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-auth-state.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-component-state.js +2 -2
- package/dist/v1/hooks/use-tambo-v1-component-state.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-component-state.test.js +1 -1
- package/dist/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-send-message.d.ts +1 -1
- package/dist/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-send-message.js +17 -17
- package/dist/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-send-message.test.js +1 -1
- package/dist/v1/hooks/use-tambo-v1-send-message.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-stream-status.js +2 -2
- package/dist/v1/hooks/use-tambo-v1-stream-status.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-stream-status.test.js +9 -5
- package/dist/v1/hooks/use-tambo-v1-stream-status.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-suggestions.js +2 -2
- package/dist/v1/hooks/use-tambo-v1-suggestions.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1-thread-input.test.js +1 -0
- package/dist/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1.d.ts +7 -6
- package/dist/v1/hooks/use-tambo-v1.d.ts.map +1 -1
- package/dist/v1/hooks/use-tambo-v1.js +2 -2
- package/dist/v1/hooks/use-tambo-v1.js.map +1 -1
- package/dist/v1/hooks/use-tambo-v1.test.js +23 -23
- package/dist/v1/hooks/use-tambo-v1.test.js.map +1 -1
- package/dist/v1/index.d.ts +6 -6
- package/dist/v1/index.d.ts.map +1 -1
- package/dist/v1/index.js +2 -2
- package/dist/v1/index.js.map +1 -1
- package/dist/v1/providers/tambo-v1-provider.d.ts +2 -1
- package/dist/v1/providers/tambo-v1-provider.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-provider.js +2 -0
- package/dist/v1/providers/tambo-v1-provider.js.map +1 -1
- package/dist/v1/providers/tambo-v1-stream-context.d.ts +2 -2
- package/dist/v1/providers/tambo-v1-stream-context.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-stream-context.js +9 -9
- package/dist/v1/providers/tambo-v1-stream-context.js.map +1 -1
- package/dist/v1/providers/tambo-v1-stream-context.test.js +35 -0
- package/dist/v1/providers/tambo-v1-stream-context.test.js.map +1 -1
- package/dist/v1/providers/tambo-v1-stub-provider.d.ts +1 -1
- package/dist/v1/providers/tambo-v1-stub-provider.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-stub-provider.js +1 -1
- package/dist/v1/providers/tambo-v1-stub-provider.js.map +1 -1
- package/dist/v1/providers/tambo-v1-stub-provider.test.js.map +1 -1
- package/dist/v1/providers/tambo-v1-thread-input-provider.d.ts +1 -1
- package/dist/v1/providers/tambo-v1-thread-input-provider.d.ts.map +1 -1
- package/dist/v1/providers/tambo-v1-thread-input-provider.js +2 -2
- package/dist/v1/providers/tambo-v1-thread-input-provider.js.map +1 -1
- package/dist/v1/types/event.test.js +13 -13
- package/dist/v1/types/event.test.js.map +1 -1
- package/dist/v1/types/message.d.ts +12 -109
- package/dist/v1/types/message.d.ts.map +1 -1
- package/dist/v1/types/message.js +0 -7
- package/dist/v1/types/message.js.map +1 -1
- package/dist/v1/utils/event-accumulator.test.js +183 -184
- package/dist/v1/utils/event-accumulator.test.js.map +1 -1
- package/dist/v1/utils/json-patch.test.js +4 -4
- package/dist/v1/utils/json-patch.test.js.map +1 -1
- package/dist/v1/utils/keyed-throttle.test.js +12 -12
- package/dist/v1/utils/keyed-throttle.test.js.map +1 -1
- package/dist/v1/utils/registry-conversion.test.js +13 -13
- package/dist/v1/utils/registry-conversion.test.js.map +1 -1
- package/dist/v1/utils/stream-handler.test.js +5 -5
- package/dist/v1/utils/stream-handler.test.js.map +1 -1
- package/dist/v1/utils/tool-call-tracker.test.js +15 -9
- package/dist/v1/utils/tool-call-tracker.test.js.map +1 -1
- package/dist/v1/utils/tool-executor.test.js +25 -26
- package/dist/v1/utils/tool-executor.test.js.map +1 -1
- package/dist/v1/utils/unstrictify.test.js +16 -16
- package/dist/v1/utils/unstrictify.test.js.map +1 -1
- package/esm/context-helpers/current-interactables-context-helper.d.ts +16 -2
- package/esm/context-helpers/current-interactables-context-helper.d.ts.map +1 -1
- package/esm/context-helpers/current-interactables-context-helper.js.map +1 -1
- package/esm/context-helpers/current-interactables-context-helper.test.d.ts +2 -0
- package/esm/context-helpers/current-interactables-context-helper.test.d.ts.map +1 -0
- package/esm/context-helpers/current-interactables-context-helper.test.js +68 -0
- package/esm/context-helpers/current-interactables-context-helper.test.js.map +1 -0
- package/esm/mcp/elicitation.d.ts +3 -37
- package/esm/mcp/elicitation.d.ts.map +1 -1
- package/esm/mcp/elicitation.js +4 -24
- package/esm/mcp/elicitation.js.map +1 -1
- package/esm/mcp/index.d.ts +4 -4
- 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-client.test.js +1 -1
- package/esm/mcp/mcp-client.test.js.map +1 -1
- package/esm/mcp/mcp-hooks.d.ts.map +1 -1
- package/esm/mcp/mcp-hooks.js +4 -1
- package/esm/mcp/mcp-hooks.js.map +1 -1
- package/esm/mcp/mcp-hooks.test.js +3 -2
- package/esm/mcp/mcp-hooks.test.js.map +1 -1
- package/esm/mcp/tambo-mcp-provider.d.ts +6 -9
- package/esm/mcp/tambo-mcp-provider.d.ts.map +1 -1
- package/esm/mcp/tambo-mcp-provider.js +4 -8
- package/esm/mcp/tambo-mcp-provider.js.map +1 -1
- package/esm/mcp/tambo-mcp-provider.test.js +3 -2
- package/esm/mcp/tambo-mcp-provider.test.js.map +1 -1
- package/esm/mcp/use-mcp-servers.test.js +2 -1
- package/esm/mcp/use-mcp-servers.test.js.map +1 -1
- package/esm/model/component-metadata.d.ts +7 -372
- package/esm/model/component-metadata.d.ts.map +1 -1
- package/esm/model/component-metadata.js.map +1 -1
- package/esm/model/validate-input.test.d.ts +2 -0
- package/esm/model/validate-input.test.d.ts.map +1 -0
- package/esm/model/validate-input.test.js +36 -0
- package/esm/model/validate-input.test.js.map +1 -0
- package/esm/providers/tambo-interactable-provider.d.ts +7 -7
- package/esm/providers/tambo-registry-provider.d.ts +1 -1
- package/esm/providers/tambo-registry-provider.d.ts.map +1 -1
- package/esm/providers/tambo-registry-provider.js.map +1 -1
- package/esm/providers/tambo-registry-schema-compat.test.js +4 -4
- package/esm/providers/tambo-registry-schema-compat.test.js.map +1 -1
- package/esm/schema/index.d.ts +2 -4
- package/esm/schema/index.d.ts.map +1 -1
- package/esm/schema/index.js +2 -4
- package/esm/schema/index.js.map +1 -1
- package/esm/schema/json-schema.d.ts +1 -17
- package/esm/schema/json-schema.d.ts.map +1 -1
- package/esm/schema/json-schema.js +2 -67
- package/esm/schema/json-schema.js.map +1 -1
- package/esm/schema/schema.test.js +1 -2
- package/esm/schema/schema.test.js.map +1 -1
- package/esm/schema/standard-schema.test.js +1 -1
- package/esm/schema/standard-schema.test.js.map +1 -1
- package/esm/schema/validate.test.js +1 -1
- package/esm/schema/validate.test.js.map +1 -1
- package/esm/testing/tools.d.ts +4 -4
- package/esm/testing/tools.test.d.ts +2 -0
- package/esm/testing/tools.test.d.ts.map +1 -0
- package/esm/testing/tools.test.js +58 -0
- package/esm/testing/tools.test.js.map +1 -0
- package/esm/util/mcp-server-utils.d.ts +1 -1
- package/esm/util/mcp-server-utils.d.ts.map +1 -1
- package/esm/util/mcp-server-utils.js +1 -1
- package/esm/util/mcp-server-utils.js.map +1 -1
- package/esm/util/mcp-server-utils.test.js +1 -1
- package/esm/util/mcp-server-utils.test.js.map +1 -1
- package/esm/util/registry.js +1 -1
- package/esm/util/registry.js.map +1 -1
- package/esm/util/resource-content-resolver.js +1 -1
- package/esm/util/resource-content-resolver.js.map +1 -1
- package/esm/util/resource-content-resolver.test.js +2 -2
- package/esm/util/resource-content-resolver.test.js.map +1 -1
- package/esm/util/tool-caller.test.d.ts +2 -0
- package/esm/util/tool-caller.test.d.ts.map +1 -0
- package/esm/util/tool-caller.test.js +69 -0
- package/esm/util/tool-caller.test.js.map +1 -0
- package/esm/v1/__tests__/v1-interactables.test.js +1 -0
- package/esm/v1/__tests__/v1-interactables.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-auth-state.d.ts +1 -1
- package/esm/v1/hooks/use-tambo-v1-auth-state.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-auth-state.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-component-state.js +1 -1
- package/esm/v1/hooks/use-tambo-v1-component-state.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-component-state.test.js +1 -1
- package/esm/v1/hooks/use-tambo-v1-component-state.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-send-message.d.ts +1 -1
- package/esm/v1/hooks/use-tambo-v1-send-message.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-send-message.js +6 -6
- package/esm/v1/hooks/use-tambo-v1-send-message.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-send-message.test.js +1 -1
- package/esm/v1/hooks/use-tambo-v1-send-message.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-stream-status.js +1 -1
- package/esm/v1/hooks/use-tambo-v1-stream-status.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-stream-status.test.js +9 -5
- package/esm/v1/hooks/use-tambo-v1-stream-status.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-suggestions.js +1 -1
- package/esm/v1/hooks/use-tambo-v1-suggestions.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1-thread-input.test.js +1 -0
- package/esm/v1/hooks/use-tambo-v1-thread-input.test.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1.d.ts +7 -6
- package/esm/v1/hooks/use-tambo-v1.d.ts.map +1 -1
- package/esm/v1/hooks/use-tambo-v1.js +1 -1
- package/esm/v1/hooks/use-tambo-v1.js.map +1 -1
- package/esm/v1/hooks/use-tambo-v1.test.js +22 -22
- package/esm/v1/hooks/use-tambo-v1.test.js.map +1 -1
- package/esm/v1/index.d.ts +6 -6
- package/esm/v1/index.d.ts.map +1 -1
- package/esm/v1/index.js +1 -1
- package/esm/v1/index.js.map +1 -1
- package/esm/v1/providers/tambo-v1-provider.d.ts +2 -1
- package/esm/v1/providers/tambo-v1-provider.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-provider.js +2 -0
- package/esm/v1/providers/tambo-v1-provider.js.map +1 -1
- package/esm/v1/providers/tambo-v1-stream-context.d.ts +2 -2
- package/esm/v1/providers/tambo-v1-stream-context.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-stream-context.js +1 -1
- package/esm/v1/providers/tambo-v1-stream-context.js.map +1 -1
- package/esm/v1/providers/tambo-v1-stream-context.test.js +35 -0
- package/esm/v1/providers/tambo-v1-stream-context.test.js.map +1 -1
- package/esm/v1/providers/tambo-v1-stub-provider.d.ts +1 -1
- package/esm/v1/providers/tambo-v1-stub-provider.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-stub-provider.js +1 -1
- package/esm/v1/providers/tambo-v1-stub-provider.js.map +1 -1
- package/esm/v1/providers/tambo-v1-stub-provider.test.js.map +1 -1
- package/esm/v1/providers/tambo-v1-thread-input-provider.d.ts +1 -1
- package/esm/v1/providers/tambo-v1-thread-input-provider.d.ts.map +1 -1
- package/esm/v1/providers/tambo-v1-thread-input-provider.js +1 -1
- package/esm/v1/providers/tambo-v1-thread-input-provider.js.map +1 -1
- package/esm/v1/types/event.test.js +1 -1
- package/esm/v1/types/event.test.js.map +1 -1
- package/esm/v1/types/message.d.ts +12 -109
- package/esm/v1/types/message.d.ts.map +1 -1
- package/esm/v1/types/message.js +0 -7
- package/esm/v1/types/message.js.map +1 -1
- package/esm/v1/utils/event-accumulator.test.js +2 -3
- package/esm/v1/utils/event-accumulator.test.js.map +1 -1
- package/esm/v1/utils/json-patch.test.js +1 -1
- package/esm/v1/utils/json-patch.test.js.map +1 -1
- package/esm/v1/utils/keyed-throttle.test.js +1 -1
- package/esm/v1/utils/keyed-throttle.test.js.map +1 -1
- package/esm/v1/utils/registry-conversion.test.js +1 -1
- package/esm/v1/utils/registry-conversion.test.js.map +1 -1
- package/esm/v1/utils/stream-handler.test.js +1 -1
- package/esm/v1/utils/stream-handler.test.js.map +1 -1
- package/esm/v1/utils/tool-call-tracker.test.js +9 -3
- package/esm/v1/utils/tool-call-tracker.test.js.map +1 -1
- package/esm/v1/utils/tool-executor.test.js +1 -2
- package/esm/v1/utils/tool-executor.test.js.map +1 -1
- package/esm/v1/utils/unstrictify.test.js +1 -1
- package/esm/v1/utils/unstrictify.test.js.map +1 -1
- package/package.json +10 -11
- package/dist/mcp/mcp-client.d.ts +0 -185
- package/dist/mcp/mcp-client.d.ts.map +0 -1
- package/dist/mcp/mcp-client.js +0 -219
- package/dist/mcp/mcp-client.js.map +0 -1
- package/dist/mcp/mcp-constants.d.ts +0 -19
- package/dist/mcp/mcp-constants.d.ts.map +0 -1
- package/dist/mcp/mcp-constants.js +0 -21
- package/dist/mcp/mcp-constants.js.map +0 -1
- package/dist/model/mcp-server-info.d.ts +0 -76
- package/dist/model/mcp-server-info.d.ts.map +0 -1
- package/dist/model/mcp-server-info.js +0 -29
- package/dist/model/mcp-server-info.js.map +0 -1
- package/dist/schema/schema.d.ts +0 -49
- package/dist/schema/schema.d.ts.map +0 -1
- package/dist/schema/schema.js +0 -129
- package/dist/schema/schema.js.map +0 -1
- package/dist/schema/standard-schema.d.ts +0 -22
- package/dist/schema/standard-schema.d.ts.map +0 -1
- package/dist/schema/standard-schema.js +0 -42
- package/dist/schema/standard-schema.js.map +0 -1
- package/dist/schema/validate.d.ts +0 -14
- package/dist/schema/validate.d.ts.map +0 -1
- package/dist/schema/validate.js +0 -148
- package/dist/schema/validate.js.map +0 -1
- package/dist/v1/types/auth.d.ts +0 -24
- package/dist/v1/types/auth.d.ts.map +0 -1
- package/dist/v1/types/auth.js +0 -3
- package/dist/v1/types/auth.js.map +0 -1
- package/dist/v1/types/event.d.ts +0 -89
- package/dist/v1/types/event.d.ts.map +0 -1
- package/dist/v1/types/event.js +0 -57
- package/dist/v1/types/event.js.map +0 -1
- package/dist/v1/types/thread.d.ts +0 -58
- package/dist/v1/types/thread.d.ts.map +0 -1
- package/dist/v1/types/thread.js +0 -9
- package/dist/v1/types/thread.js.map +0 -1
- package/dist/v1/types/tool-choice.d.ts +0 -8
- package/dist/v1/types/tool-choice.d.ts.map +0 -1
- package/dist/v1/types/tool-choice.js +0 -3
- package/dist/v1/types/tool-choice.js.map +0 -1
- package/dist/v1/utils/event-accumulator.d.ts +0 -165
- package/dist/v1/utils/event-accumulator.d.ts.map +0 -1
- package/dist/v1/utils/event-accumulator.js +0 -1277
- package/dist/v1/utils/event-accumulator.js.map +0 -1
- package/dist/v1/utils/json-patch.d.ts +0 -18
- package/dist/v1/utils/json-patch.d.ts.map +0 -1
- package/dist/v1/utils/json-patch.js +0 -35
- package/dist/v1/utils/json-patch.js.map +0 -1
- package/dist/v1/utils/keyed-throttle.d.ts +0 -42
- package/dist/v1/utils/keyed-throttle.d.ts.map +0 -1
- package/dist/v1/utils/keyed-throttle.js +0 -86
- package/dist/v1/utils/keyed-throttle.js.map +0 -1
- package/dist/v1/utils/registry-conversion.d.ts +0 -53
- package/dist/v1/utils/registry-conversion.d.ts.map +0 -1
- package/dist/v1/utils/registry-conversion.js +0 -115
- package/dist/v1/utils/registry-conversion.js.map +0 -1
- package/dist/v1/utils/stream-handler.d.ts +0 -45
- package/dist/v1/utils/stream-handler.d.ts.map +0 -1
- package/dist/v1/utils/stream-handler.js +0 -47
- package/dist/v1/utils/stream-handler.js.map +0 -1
- package/dist/v1/utils/thread-utils.d.ts +0 -16
- package/dist/v1/utils/thread-utils.d.ts.map +0 -1
- package/dist/v1/utils/thread-utils.js +0 -34
- package/dist/v1/utils/thread-utils.js.map +0 -1
- package/dist/v1/utils/tool-call-tracker.d.ts +0 -73
- package/dist/v1/utils/tool-call-tracker.d.ts.map +0 -1
- package/dist/v1/utils/tool-call-tracker.js +0 -180
- package/dist/v1/utils/tool-call-tracker.js.map +0 -1
- package/dist/v1/utils/tool-executor.d.ts +0 -67
- package/dist/v1/utils/tool-executor.d.ts.map +0 -1
- package/dist/v1/utils/tool-executor.js +0 -160
- package/dist/v1/utils/tool-executor.js.map +0 -1
- package/dist/v1/utils/unstrictify.d.ts +0 -32
- package/dist/v1/utils/unstrictify.d.ts.map +0 -1
- package/dist/v1/utils/unstrictify.js +0 -159
- package/dist/v1/utils/unstrictify.js.map +0 -1
- package/esm/mcp/mcp-client.d.ts +0 -185
- package/esm/mcp/mcp-client.d.ts.map +0 -1
- package/esm/mcp/mcp-client.js +0 -216
- package/esm/mcp/mcp-client.js.map +0 -1
- package/esm/mcp/mcp-constants.d.ts +0 -19
- package/esm/mcp/mcp-constants.d.ts.map +0 -1
- package/esm/mcp/mcp-constants.js +0 -18
- package/esm/mcp/mcp-constants.js.map +0 -1
- package/esm/model/mcp-server-info.d.ts +0 -76
- package/esm/model/mcp-server-info.d.ts.map +0 -1
- package/esm/model/mcp-server-info.js +0 -25
- package/esm/model/mcp-server-info.js.map +0 -1
- package/esm/schema/schema.d.ts +0 -49
- package/esm/schema/schema.d.ts.map +0 -1
- package/esm/schema/schema.js +0 -124
- package/esm/schema/schema.js.map +0 -1
- package/esm/schema/standard-schema.d.ts +0 -22
- package/esm/schema/standard-schema.d.ts.map +0 -1
- package/esm/schema/standard-schema.js +0 -39
- package/esm/schema/standard-schema.js.map +0 -1
- package/esm/schema/validate.d.ts +0 -14
- package/esm/schema/validate.d.ts.map +0 -1
- package/esm/schema/validate.js +0 -145
- package/esm/schema/validate.js.map +0 -1
- package/esm/v1/types/auth.d.ts +0 -24
- package/esm/v1/types/auth.d.ts.map +0 -1
- package/esm/v1/types/auth.js +0 -2
- package/esm/v1/types/auth.js.map +0 -1
- package/esm/v1/types/event.d.ts +0 -89
- package/esm/v1/types/event.d.ts.map +0 -1
- package/esm/v1/types/event.js +0 -53
- package/esm/v1/types/event.js.map +0 -1
- package/esm/v1/types/thread.d.ts +0 -58
- package/esm/v1/types/thread.d.ts.map +0 -1
- package/esm/v1/types/thread.js +0 -8
- package/esm/v1/types/thread.js.map +0 -1
- package/esm/v1/types/tool-choice.d.ts +0 -8
- package/esm/v1/types/tool-choice.d.ts.map +0 -1
- package/esm/v1/types/tool-choice.js +0 -2
- package/esm/v1/types/tool-choice.js.map +0 -1
- package/esm/v1/utils/event-accumulator.d.ts +0 -165
- package/esm/v1/utils/event-accumulator.d.ts.map +0 -1
- package/esm/v1/utils/event-accumulator.js +0 -1268
- package/esm/v1/utils/event-accumulator.js.map +0 -1
- package/esm/v1/utils/json-patch.d.ts +0 -18
- package/esm/v1/utils/json-patch.d.ts.map +0 -1
- package/esm/v1/utils/json-patch.js +0 -32
- package/esm/v1/utils/json-patch.js.map +0 -1
- package/esm/v1/utils/keyed-throttle.d.ts +0 -42
- package/esm/v1/utils/keyed-throttle.d.ts.map +0 -1
- package/esm/v1/utils/keyed-throttle.js +0 -83
- package/esm/v1/utils/keyed-throttle.js.map +0 -1
- package/esm/v1/utils/registry-conversion.d.ts +0 -53
- package/esm/v1/utils/registry-conversion.d.ts.map +0 -1
- package/esm/v1/utils/registry-conversion.js +0 -109
- package/esm/v1/utils/registry-conversion.js.map +0 -1
- package/esm/v1/utils/stream-handler.d.ts +0 -45
- package/esm/v1/utils/stream-handler.d.ts.map +0 -1
- package/esm/v1/utils/stream-handler.js +0 -44
- package/esm/v1/utils/stream-handler.js.map +0 -1
- package/esm/v1/utils/thread-utils.d.ts +0 -16
- package/esm/v1/utils/thread-utils.d.ts.map +0 -1
- package/esm/v1/utils/thread-utils.js +0 -31
- package/esm/v1/utils/thread-utils.js.map +0 -1
- package/esm/v1/utils/tool-call-tracker.d.ts +0 -73
- package/esm/v1/utils/tool-call-tracker.d.ts.map +0 -1
- package/esm/v1/utils/tool-call-tracker.js +0 -176
- package/esm/v1/utils/tool-call-tracker.js.map +0 -1
- package/esm/v1/utils/tool-executor.d.ts +0 -67
- package/esm/v1/utils/tool-executor.d.ts.map +0 -1
- package/esm/v1/utils/tool-executor.js +0 -154
- package/esm/v1/utils/tool-executor.js.map +0 -1
- package/esm/v1/utils/unstrictify.d.ts +0 -32
- package/esm/v1/utils/unstrictify.d.ts.map +0 -1
- package/esm/v1/utils/unstrictify.js +0 -155
- package/esm/v1/utils/unstrictify.js.map +0 -1
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const
|
|
3
|
+
const client_1 = require("@tambo-ai/client");
|
|
4
4
|
describe("applyJsonPatch error handling", () => {
|
|
5
5
|
it("includes operation summary in error message", () => {
|
|
6
6
|
const target = { existing: "value" };
|
|
7
7
|
const operations = [
|
|
8
8
|
{ op: "replace", path: "/nonexistent", value: "fail" },
|
|
9
9
|
];
|
|
10
|
-
expect(() => (0,
|
|
10
|
+
expect(() => (0, client_1.applyJsonPatch)(target, operations)).toThrow(/Failed to apply JSON patch operations \[replace \/nonexistent\]/);
|
|
11
11
|
});
|
|
12
12
|
it("includes target keys in error message", () => {
|
|
13
13
|
const target = { foo: 1, bar: 2 };
|
|
14
14
|
const operations = [
|
|
15
15
|
{ op: "replace", path: "/missing", value: "x" },
|
|
16
16
|
];
|
|
17
|
-
expect(() => (0,
|
|
17
|
+
expect(() => (0, client_1.applyJsonPatch)(target, operations)).toThrow(/Target had keys: \[foo, bar\]/);
|
|
18
18
|
});
|
|
19
19
|
it("shows all operations in error summary", () => {
|
|
20
20
|
const target = {};
|
|
@@ -22,7 +22,7 @@ describe("applyJsonPatch error handling", () => {
|
|
|
22
22
|
{ op: "add", path: "/a", value: 1 },
|
|
23
23
|
{ op: "replace", path: "/missing", value: 2 },
|
|
24
24
|
];
|
|
25
|
-
expect(() => (0,
|
|
25
|
+
expect(() => (0, client_1.applyJsonPatch)(target, operations)).toThrow(/add \/a, replace \/missing/);
|
|
26
26
|
});
|
|
27
27
|
});
|
|
28
28
|
//# sourceMappingURL=json-patch.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-patch.test.js","sourceRoot":"","sources":["../../../src/v1/utils/json-patch.test.ts"],"names":[],"mappings":";;AACA,
|
|
1
|
+
{"version":3,"file":"json-patch.test.js","sourceRoot":"","sources":["../../../src/v1/utils/json-patch.test.ts"],"names":[],"mappings":";;AACA,6CAAkD;AAElD,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,IAAA,uBAAc,EAAC,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,IAAA,uBAAc,EAAC,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,IAAA,uBAAc,EAAC,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 \"@tambo-ai/client\";\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"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const
|
|
3
|
+
const client_1 = require("@tambo-ai/client");
|
|
4
4
|
describe("createKeyedThrottle", () => {
|
|
5
5
|
beforeEach(() => {
|
|
6
6
|
jest.useFakeTimers();
|
|
@@ -10,14 +10,14 @@ describe("createKeyedThrottle", () => {
|
|
|
10
10
|
});
|
|
11
11
|
it("fires immediately on first call (leading edge)", () => {
|
|
12
12
|
const fn = jest.fn();
|
|
13
|
-
const throttle = (0,
|
|
13
|
+
const throttle = (0, client_1.createKeyedThrottle)(fn, 100);
|
|
14
14
|
throttle.schedule("a", 1);
|
|
15
15
|
expect(fn).toHaveBeenCalledTimes(1);
|
|
16
16
|
expect(fn).toHaveBeenCalledWith("a", 1);
|
|
17
17
|
});
|
|
18
18
|
it("does not fire again during cooldown window", () => {
|
|
19
19
|
const fn = jest.fn();
|
|
20
|
-
const throttle = (0,
|
|
20
|
+
const throttle = (0, client_1.createKeyedThrottle)(fn, 100);
|
|
21
21
|
throttle.schedule("a", 1);
|
|
22
22
|
throttle.schedule("a", 2);
|
|
23
23
|
throttle.schedule("a", 3);
|
|
@@ -27,7 +27,7 @@ describe("createKeyedThrottle", () => {
|
|
|
27
27
|
});
|
|
28
28
|
it("fires trailing call with latest value after cooldown", () => {
|
|
29
29
|
const fn = jest.fn();
|
|
30
|
-
const throttle = (0,
|
|
30
|
+
const throttle = (0, client_1.createKeyedThrottle)(fn, 100);
|
|
31
31
|
throttle.schedule("a", 1); // leading fire
|
|
32
32
|
throttle.schedule("a", 2);
|
|
33
33
|
throttle.schedule("a", 3);
|
|
@@ -38,7 +38,7 @@ describe("createKeyedThrottle", () => {
|
|
|
38
38
|
});
|
|
39
39
|
it("does not fire trailing call if no new values arrived", () => {
|
|
40
40
|
const fn = jest.fn();
|
|
41
|
-
const throttle = (0,
|
|
41
|
+
const throttle = (0, client_1.createKeyedThrottle)(fn, 100);
|
|
42
42
|
throttle.schedule("a", 1); // leading fire
|
|
43
43
|
jest.advanceTimersByTime(100);
|
|
44
44
|
// No trailing fire — only the leading call
|
|
@@ -46,7 +46,7 @@ describe("createKeyedThrottle", () => {
|
|
|
46
46
|
});
|
|
47
47
|
it("fires periodically during continuous rapid calls", () => {
|
|
48
48
|
const fn = jest.fn();
|
|
49
|
-
const throttle = (0,
|
|
49
|
+
const throttle = (0, client_1.createKeyedThrottle)(fn, 100);
|
|
50
50
|
// Simulate rapid streaming chunks every 30ms for 350ms
|
|
51
51
|
throttle.schedule("a", 1); // t=0, leading fire
|
|
52
52
|
jest.advanceTimersByTime(30);
|
|
@@ -72,7 +72,7 @@ describe("createKeyedThrottle", () => {
|
|
|
72
72
|
});
|
|
73
73
|
it("tracks keys independently", () => {
|
|
74
74
|
const fn = jest.fn();
|
|
75
|
-
const throttle = (0,
|
|
75
|
+
const throttle = (0, client_1.createKeyedThrottle)(fn, 100);
|
|
76
76
|
throttle.schedule("a", 1); // leading fire for "a"
|
|
77
77
|
jest.advanceTimersByTime(50);
|
|
78
78
|
throttle.schedule("b", 2); // leading fire for "b"
|
|
@@ -82,7 +82,7 @@ describe("createKeyedThrottle", () => {
|
|
|
82
82
|
});
|
|
83
83
|
it("tracks keys independently with trailing calls", () => {
|
|
84
84
|
const fn = jest.fn();
|
|
85
|
-
const throttle = (0,
|
|
85
|
+
const throttle = (0, client_1.createKeyedThrottle)(fn, 100);
|
|
86
86
|
throttle.schedule("a", 1); // leading fire for "a"
|
|
87
87
|
throttle.schedule("a", 2); // queued trailing for "a"
|
|
88
88
|
jest.advanceTimersByTime(50);
|
|
@@ -100,7 +100,7 @@ describe("createKeyedThrottle", () => {
|
|
|
100
100
|
});
|
|
101
101
|
it("flush() fires all pending trailing calls immediately", () => {
|
|
102
102
|
const fn = jest.fn();
|
|
103
|
-
const throttle = (0,
|
|
103
|
+
const throttle = (0, client_1.createKeyedThrottle)(fn, 100);
|
|
104
104
|
throttle.schedule("a", 1); // leading fire
|
|
105
105
|
throttle.schedule("a", 2); // queued trailing
|
|
106
106
|
throttle.schedule("b", 3); // leading fire
|
|
@@ -116,13 +116,13 @@ describe("createKeyedThrottle", () => {
|
|
|
116
116
|
});
|
|
117
117
|
it("flush() is a no-op when nothing is pending", () => {
|
|
118
118
|
const fn = jest.fn();
|
|
119
|
-
const throttle = (0,
|
|
119
|
+
const throttle = (0, client_1.createKeyedThrottle)(fn, 100);
|
|
120
120
|
throttle.flush();
|
|
121
121
|
expect(fn).not.toHaveBeenCalled();
|
|
122
122
|
});
|
|
123
123
|
it("flush() skips keys with no trailing value", () => {
|
|
124
124
|
const fn = jest.fn();
|
|
125
|
-
const throttle = (0,
|
|
125
|
+
const throttle = (0, client_1.createKeyedThrottle)(fn, 100);
|
|
126
126
|
throttle.schedule("a", 1); // leading fire, no trailing queued
|
|
127
127
|
expect(fn).toHaveBeenCalledTimes(1);
|
|
128
128
|
throttle.flush();
|
|
@@ -131,7 +131,7 @@ describe("createKeyedThrottle", () => {
|
|
|
131
131
|
});
|
|
132
132
|
it("becomes idle after trailing fire with no new calls", () => {
|
|
133
133
|
const fn = jest.fn();
|
|
134
|
-
const throttle = (0,
|
|
134
|
+
const throttle = (0, client_1.createKeyedThrottle)(fn, 100);
|
|
135
135
|
throttle.schedule("a", 1); // leading
|
|
136
136
|
throttle.schedule("a", 2); // trailing queued
|
|
137
137
|
jest.advanceTimersByTime(100); // trailing fires
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyed-throttle.test.js","sourceRoot":"","sources":["../../../src/v1/utils/keyed-throttle.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { createKeyedThrottle } from \"./keyed-throttle\";\n\ndescribe(\"createKeyedThrottle\", () => {\n beforeEach(() => {\n jest.useFakeTimers();\n });\n\n afterEach(() => {\n jest.useRealTimers();\n });\n\n it(\"fires immediately on first call (leading edge)\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.schedule(\"a\", 1);\n expect(fn).toHaveBeenCalledTimes(1);\n expect(fn).toHaveBeenCalledWith(\"a\", 1);\n });\n\n it(\"does not fire again during cooldown window\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.schedule(\"a\", 1);\n throttle.schedule(\"a\", 2);\n throttle.schedule(\"a\", 3);\n\n // Only the leading call should have fired\n expect(fn).toHaveBeenCalledTimes(1);\n expect(fn).toHaveBeenCalledWith(\"a\", 1);\n });\n\n it(\"fires trailing call with latest value after cooldown\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.schedule(\"a\", 1); // leading fire\n throttle.schedule(\"a\", 2);\n throttle.schedule(\"a\", 3);\n\n jest.advanceTimersByTime(100);\n\n // Trailing fire with latest value\n expect(fn).toHaveBeenCalledTimes(2);\n expect(fn).toHaveBeenLastCalledWith(\"a\", 3);\n });\n\n it(\"does not fire trailing call if no new values arrived\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.schedule(\"a\", 1); // leading fire\n\n jest.advanceTimersByTime(100);\n\n // No trailing fire — only the leading call\n expect(fn).toHaveBeenCalledTimes(1);\n });\n\n it(\"fires periodically during continuous rapid calls\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n // Simulate rapid streaming chunks every 30ms for 350ms\n throttle.schedule(\"a\", 1); // t=0, leading fire\n jest.advanceTimersByTime(30);\n throttle.schedule(\"a\", 2); // t=30\n jest.advanceTimersByTime(30);\n throttle.schedule(\"a\", 3); // t=60\n jest.advanceTimersByTime(30);\n throttle.schedule(\"a\", 4); // t=90\n jest.advanceTimersByTime(10);\n // t=100: cooldown expires, trailing fires with value 4\n expect(fn).toHaveBeenCalledTimes(2);\n expect(fn).toHaveBeenLastCalledWith(\"a\", 4);\n\n jest.advanceTimersByTime(20);\n throttle.schedule(\"a\", 5); // t=120\n jest.advanceTimersByTime(30);\n throttle.schedule(\"a\", 6); // t=150\n jest.advanceTimersByTime(30);\n throttle.schedule(\"a\", 7); // t=180\n jest.advanceTimersByTime(20);\n // t=200: second cooldown expires, trailing fires with value 7\n expect(fn).toHaveBeenCalledTimes(3);\n expect(fn).toHaveBeenLastCalledWith(\"a\", 7);\n });\n\n it(\"tracks keys independently\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.schedule(\"a\", 1); // leading fire for \"a\"\n jest.advanceTimersByTime(50);\n throttle.schedule(\"b\", 2); // leading fire for \"b\"\n\n expect(fn).toHaveBeenCalledTimes(2);\n expect(fn).toHaveBeenCalledWith(\"a\", 1);\n expect(fn).toHaveBeenCalledWith(\"b\", 2);\n });\n\n it(\"tracks keys independently with trailing calls\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.schedule(\"a\", 1); // leading fire for \"a\"\n throttle.schedule(\"a\", 2); // queued trailing for \"a\"\n jest.advanceTimersByTime(50);\n throttle.schedule(\"b\", 3); // leading fire for \"b\"\n throttle.schedule(\"b\", 4); // queued trailing for \"b\"\n\n expect(fn).toHaveBeenCalledTimes(2);\n\n jest.advanceTimersByTime(50);\n // t=100: \"a\" trailing fires\n expect(fn).toHaveBeenCalledTimes(3);\n expect(fn).toHaveBeenCalledWith(\"a\", 2);\n\n jest.advanceTimersByTime(50);\n // t=150: \"b\" trailing fires\n expect(fn).toHaveBeenCalledTimes(4);\n expect(fn).toHaveBeenCalledWith(\"b\", 4);\n });\n\n it(\"flush() fires all pending trailing calls immediately\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.schedule(\"a\", 1); // leading fire\n throttle.schedule(\"a\", 2); // queued trailing\n throttle.schedule(\"b\", 3); // leading fire\n throttle.schedule(\"b\", 4); // queued trailing\n\n expect(fn).toHaveBeenCalledTimes(2); // two leading fires\n\n throttle.flush();\n\n expect(fn).toHaveBeenCalledTimes(4); // two trailing fires\n expect(fn).toHaveBeenCalledWith(\"a\", 2);\n expect(fn).toHaveBeenCalledWith(\"b\", 4);\n\n // Timers should be cancelled — no double-fire\n jest.advanceTimersByTime(200);\n expect(fn).toHaveBeenCalledTimes(4);\n });\n\n it(\"flush() is a no-op when nothing is pending\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.flush();\n expect(fn).not.toHaveBeenCalled();\n });\n\n it(\"flush() skips keys with no trailing value\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.schedule(\"a\", 1); // leading fire, no trailing queued\n\n expect(fn).toHaveBeenCalledTimes(1);\n\n throttle.flush();\n\n // No trailing to fire — still just the one leading call\n expect(fn).toHaveBeenCalledTimes(1);\n });\n\n it(\"becomes idle after trailing fire with no new calls\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.schedule(\"a\", 1); // leading\n throttle.schedule(\"a\", 2); // trailing queued\n\n jest.advanceTimersByTime(100); // trailing fires\n expect(fn).toHaveBeenCalledTimes(2);\n\n jest.advanceTimersByTime(100); // cooldown after trailing — no new calls\n expect(fn).toHaveBeenCalledTimes(2); // no extra fires\n\n // New call should fire immediately (leading again)\n throttle.schedule(\"a\", 3);\n expect(fn).toHaveBeenCalledTimes(3);\n expect(fn).toHaveBeenLastCalledWith(\"a\", 3);\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"keyed-throttle.test.js","sourceRoot":"","sources":["../../../src/v1/utils/keyed-throttle.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { createKeyedThrottle } from \"@tambo-ai/client\";\n\ndescribe(\"createKeyedThrottle\", () => {\n beforeEach(() => {\n jest.useFakeTimers();\n });\n\n afterEach(() => {\n jest.useRealTimers();\n });\n\n it(\"fires immediately on first call (leading edge)\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.schedule(\"a\", 1);\n expect(fn).toHaveBeenCalledTimes(1);\n expect(fn).toHaveBeenCalledWith(\"a\", 1);\n });\n\n it(\"does not fire again during cooldown window\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.schedule(\"a\", 1);\n throttle.schedule(\"a\", 2);\n throttle.schedule(\"a\", 3);\n\n // Only the leading call should have fired\n expect(fn).toHaveBeenCalledTimes(1);\n expect(fn).toHaveBeenCalledWith(\"a\", 1);\n });\n\n it(\"fires trailing call with latest value after cooldown\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.schedule(\"a\", 1); // leading fire\n throttle.schedule(\"a\", 2);\n throttle.schedule(\"a\", 3);\n\n jest.advanceTimersByTime(100);\n\n // Trailing fire with latest value\n expect(fn).toHaveBeenCalledTimes(2);\n expect(fn).toHaveBeenLastCalledWith(\"a\", 3);\n });\n\n it(\"does not fire trailing call if no new values arrived\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.schedule(\"a\", 1); // leading fire\n\n jest.advanceTimersByTime(100);\n\n // No trailing fire — only the leading call\n expect(fn).toHaveBeenCalledTimes(1);\n });\n\n it(\"fires periodically during continuous rapid calls\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n // Simulate rapid streaming chunks every 30ms for 350ms\n throttle.schedule(\"a\", 1); // t=0, leading fire\n jest.advanceTimersByTime(30);\n throttle.schedule(\"a\", 2); // t=30\n jest.advanceTimersByTime(30);\n throttle.schedule(\"a\", 3); // t=60\n jest.advanceTimersByTime(30);\n throttle.schedule(\"a\", 4); // t=90\n jest.advanceTimersByTime(10);\n // t=100: cooldown expires, trailing fires with value 4\n expect(fn).toHaveBeenCalledTimes(2);\n expect(fn).toHaveBeenLastCalledWith(\"a\", 4);\n\n jest.advanceTimersByTime(20);\n throttle.schedule(\"a\", 5); // t=120\n jest.advanceTimersByTime(30);\n throttle.schedule(\"a\", 6); // t=150\n jest.advanceTimersByTime(30);\n throttle.schedule(\"a\", 7); // t=180\n jest.advanceTimersByTime(20);\n // t=200: second cooldown expires, trailing fires with value 7\n expect(fn).toHaveBeenCalledTimes(3);\n expect(fn).toHaveBeenLastCalledWith(\"a\", 7);\n });\n\n it(\"tracks keys independently\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.schedule(\"a\", 1); // leading fire for \"a\"\n jest.advanceTimersByTime(50);\n throttle.schedule(\"b\", 2); // leading fire for \"b\"\n\n expect(fn).toHaveBeenCalledTimes(2);\n expect(fn).toHaveBeenCalledWith(\"a\", 1);\n expect(fn).toHaveBeenCalledWith(\"b\", 2);\n });\n\n it(\"tracks keys independently with trailing calls\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.schedule(\"a\", 1); // leading fire for \"a\"\n throttle.schedule(\"a\", 2); // queued trailing for \"a\"\n jest.advanceTimersByTime(50);\n throttle.schedule(\"b\", 3); // leading fire for \"b\"\n throttle.schedule(\"b\", 4); // queued trailing for \"b\"\n\n expect(fn).toHaveBeenCalledTimes(2);\n\n jest.advanceTimersByTime(50);\n // t=100: \"a\" trailing fires\n expect(fn).toHaveBeenCalledTimes(3);\n expect(fn).toHaveBeenCalledWith(\"a\", 2);\n\n jest.advanceTimersByTime(50);\n // t=150: \"b\" trailing fires\n expect(fn).toHaveBeenCalledTimes(4);\n expect(fn).toHaveBeenCalledWith(\"b\", 4);\n });\n\n it(\"flush() fires all pending trailing calls immediately\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.schedule(\"a\", 1); // leading fire\n throttle.schedule(\"a\", 2); // queued trailing\n throttle.schedule(\"b\", 3); // leading fire\n throttle.schedule(\"b\", 4); // queued trailing\n\n expect(fn).toHaveBeenCalledTimes(2); // two leading fires\n\n throttle.flush();\n\n expect(fn).toHaveBeenCalledTimes(4); // two trailing fires\n expect(fn).toHaveBeenCalledWith(\"a\", 2);\n expect(fn).toHaveBeenCalledWith(\"b\", 4);\n\n // Timers should be cancelled — no double-fire\n jest.advanceTimersByTime(200);\n expect(fn).toHaveBeenCalledTimes(4);\n });\n\n it(\"flush() is a no-op when nothing is pending\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.flush();\n expect(fn).not.toHaveBeenCalled();\n });\n\n it(\"flush() skips keys with no trailing value\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.schedule(\"a\", 1); // leading fire, no trailing queued\n\n expect(fn).toHaveBeenCalledTimes(1);\n\n throttle.flush();\n\n // No trailing to fire — still just the one leading call\n expect(fn).toHaveBeenCalledTimes(1);\n });\n\n it(\"becomes idle after trailing fire with no new calls\", () => {\n const fn = jest.fn();\n const throttle = createKeyedThrottle(fn, 100);\n\n throttle.schedule(\"a\", 1); // leading\n throttle.schedule(\"a\", 2); // trailing queued\n\n jest.advanceTimersByTime(100); // trailing fires\n expect(fn).toHaveBeenCalledTimes(2);\n\n jest.advanceTimersByTime(100); // cooldown after trailing — no new calls\n expect(fn).toHaveBeenCalledTimes(2); // no extra fires\n\n // New call should fire immediately (leading again)\n throttle.schedule(\"a\", 3);\n expect(fn).toHaveBeenCalledTimes(3);\n expect(fn).toHaveBeenLastCalledWith(\"a\", 3);\n });\n});\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const zod_1 = require("zod");
|
|
4
|
-
const
|
|
4
|
+
const client_1 = require("@tambo-ai/client");
|
|
5
5
|
describe("registry-conversion", () => {
|
|
6
6
|
describe("toAvailableComponent", () => {
|
|
7
7
|
it("converts a component with props (JSON Schema)", () => {
|
|
@@ -20,7 +20,7 @@ describe("registry-conversion", () => {
|
|
|
20
20
|
},
|
|
21
21
|
contextTools: [],
|
|
22
22
|
};
|
|
23
|
-
const result = (0,
|
|
23
|
+
const result = (0, client_1.toAvailableComponent)(component);
|
|
24
24
|
expect(result.name).toBe("WeatherCard");
|
|
25
25
|
expect(result.description).toBe("Displays weather information");
|
|
26
26
|
expect(result.propsSchema).toBeDefined();
|
|
@@ -33,7 +33,7 @@ describe("registry-conversion", () => {
|
|
|
33
33
|
component: () => null,
|
|
34
34
|
contextTools: [],
|
|
35
35
|
};
|
|
36
|
-
expect(() => (0,
|
|
36
|
+
expect(() => (0, client_1.toAvailableComponent)(component)).toThrow('Component "BadComponent" missing props');
|
|
37
37
|
});
|
|
38
38
|
});
|
|
39
39
|
describe("toAvailableComponents", () => {
|
|
@@ -62,7 +62,7 @@ describe("registry-conversion", () => {
|
|
|
62
62
|
contextTools: [],
|
|
63
63
|
},
|
|
64
64
|
};
|
|
65
|
-
const result = (0,
|
|
65
|
+
const result = (0, client_1.toAvailableComponents)(components);
|
|
66
66
|
expect(result).toHaveLength(2);
|
|
67
67
|
expect(result.map((c) => c.name)).toContain("Card");
|
|
68
68
|
expect(result.map((c) => c.name)).toContain("Button");
|
|
@@ -84,7 +84,7 @@ describe("registry-conversion", () => {
|
|
|
84
84
|
},
|
|
85
85
|
],
|
|
86
86
|
]);
|
|
87
|
-
const result = (0,
|
|
87
|
+
const result = (0, client_1.toAvailableComponents)(components);
|
|
88
88
|
expect(result).toHaveLength(1);
|
|
89
89
|
expect(result[0].name).toBe("Card");
|
|
90
90
|
});
|
|
@@ -109,7 +109,7 @@ describe("registry-conversion", () => {
|
|
|
109
109
|
contextTools: [],
|
|
110
110
|
},
|
|
111
111
|
};
|
|
112
|
-
const result = (0,
|
|
112
|
+
const result = (0, client_1.toAvailableComponents)(components);
|
|
113
113
|
expect(result).toHaveLength(1);
|
|
114
114
|
expect(result[0].name).toBe("Valid");
|
|
115
115
|
expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('Skipping component "Invalid"'));
|
|
@@ -125,7 +125,7 @@ describe("registry-conversion", () => {
|
|
|
125
125
|
inputSchema: zod_1.z.object({ city: zod_1.z.string() }),
|
|
126
126
|
outputSchema: zod_1.z.any(),
|
|
127
127
|
};
|
|
128
|
-
const result = (0,
|
|
128
|
+
const result = (0, client_1.toAvailableTool)(tool);
|
|
129
129
|
expect(result.name).toBe("get_weather");
|
|
130
130
|
expect(result.description).toBe("Gets weather for a city");
|
|
131
131
|
expect(result.inputSchema).toBeDefined();
|
|
@@ -140,7 +140,7 @@ describe("registry-conversion", () => {
|
|
|
140
140
|
outputSchema: zod_1.z.any(),
|
|
141
141
|
maxCalls: 3,
|
|
142
142
|
};
|
|
143
|
-
const result = (0,
|
|
143
|
+
const result = (0, client_1.toAvailableTool)(tool);
|
|
144
144
|
expect(result.maxCalls).toBe(3);
|
|
145
145
|
});
|
|
146
146
|
it("omits maxCalls when not set", () => {
|
|
@@ -151,7 +151,7 @@ describe("registry-conversion", () => {
|
|
|
151
151
|
inputSchema: zod_1.z.object({ x: zod_1.z.string() }),
|
|
152
152
|
outputSchema: zod_1.z.any(),
|
|
153
153
|
};
|
|
154
|
-
const result = (0,
|
|
154
|
+
const result = (0, client_1.toAvailableTool)(tool);
|
|
155
155
|
expect(result).not.toHaveProperty("maxCalls");
|
|
156
156
|
});
|
|
157
157
|
it("throws when schema is missing", () => {
|
|
@@ -160,7 +160,7 @@ describe("registry-conversion", () => {
|
|
|
160
160
|
description: "Missing schema",
|
|
161
161
|
tool: async () => ({}),
|
|
162
162
|
};
|
|
163
|
-
expect(() => (0,
|
|
163
|
+
expect(() => (0, client_1.toAvailableTool)(tool)).toThrow('Tool "bad_tool" missing inputSchema or toolSchema');
|
|
164
164
|
});
|
|
165
165
|
});
|
|
166
166
|
describe("toAvailableTools", () => {
|
|
@@ -181,7 +181,7 @@ describe("registry-conversion", () => {
|
|
|
181
181
|
outputSchema: zod_1.z.any(),
|
|
182
182
|
},
|
|
183
183
|
};
|
|
184
|
-
const result = (0,
|
|
184
|
+
const result = (0, client_1.toAvailableTools)(tools);
|
|
185
185
|
expect(result).toHaveLength(2);
|
|
186
186
|
expect(result.map((t) => t.name)).toContain("search");
|
|
187
187
|
expect(result.map((t) => t.name)).toContain("calculate");
|
|
@@ -199,7 +199,7 @@ describe("registry-conversion", () => {
|
|
|
199
199
|
},
|
|
200
200
|
],
|
|
201
201
|
]);
|
|
202
|
-
const result = (0,
|
|
202
|
+
const result = (0, client_1.toAvailableTools)(tools);
|
|
203
203
|
expect(result).toHaveLength(1);
|
|
204
204
|
expect(result[0].name).toBe("fetch");
|
|
205
205
|
});
|
|
@@ -219,7 +219,7 @@ describe("registry-conversion", () => {
|
|
|
219
219
|
tool: async () => null,
|
|
220
220
|
},
|
|
221
221
|
};
|
|
222
|
-
const result = (0,
|
|
222
|
+
const result = (0, client_1.toAvailableTools)(tools);
|
|
223
223
|
expect(result).toHaveLength(1);
|
|
224
224
|
expect(result[0].name).toBe("valid");
|
|
225
225
|
expect(warnSpy).toHaveBeenCalledWith(expect.stringContaining('Skipping tool "invalid"'));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry-conversion.test.js","sourceRoot":"","sources":["../../../src/v1/utils/registry-conversion.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from \"zod\";\nimport type {\n RegisteredComponent,\n TamboTool,\n} from \"../../model/component-metadata\";\nimport {\n toAvailableComponent,\n toAvailableComponents,\n toAvailableTool,\n toAvailableTools,\n} from \"./registry-conversion\";\n\ndescribe(\"registry-conversion\", () => {\n describe(\"toAvailableComponent\", () => {\n it(\"converts a component with props (JSON Schema)\", () => {\n // RegisteredComponent has props already converted to JSON Schema\n const component: RegisteredComponent = {\n name: \"WeatherCard\",\n description: \"Displays weather information\",\n component: () => null,\n props: {\n type: \"object\",\n properties: {\n city: { type: \"string\" },\n temperature: { type: \"number\" },\n },\n required: [\"city\", \"temperature\"],\n },\n contextTools: [],\n };\n\n const result = toAvailableComponent(component);\n\n expect(result.name).toBe(\"WeatherCard\");\n expect(result.description).toBe(\"Displays weather information\");\n expect(result.propsSchema).toBeDefined();\n expect((result.propsSchema as Record<string, unknown>).type).toBe(\n \"object\",\n );\n });\n\n it(\"throws when props is missing\", () => {\n const component = {\n name: \"BadComponent\",\n description: \"Missing schema\",\n component: () => null,\n contextTools: [],\n } as unknown as RegisteredComponent;\n\n expect(() => toAvailableComponent(component)).toThrow(\n 'Component \"BadComponent\" missing props',\n );\n });\n });\n\n describe(\"toAvailableComponents\", () => {\n it(\"converts a Record of components\", () => {\n const components: Record<string, RegisteredComponent> = {\n Card: {\n name: \"Card\",\n description: \"A card component\",\n component: () => null,\n props: {\n type: \"object\",\n properties: { title: { type: \"string\" } },\n required: [\"title\"],\n },\n contextTools: [],\n },\n Button: {\n name: \"Button\",\n description: \"A button component\",\n component: () => null,\n props: {\n type: \"object\",\n properties: { label: { type: \"string\" } },\n required: [\"label\"],\n },\n contextTools: [],\n },\n };\n\n const result = toAvailableComponents(components);\n\n expect(result).toHaveLength(2);\n expect(result.map((c) => c.name)).toContain(\"Card\");\n expect(result.map((c) => c.name)).toContain(\"Button\");\n });\n\n it(\"converts a Map of components\", () => {\n const components = new Map<string, RegisteredComponent>([\n [\n \"Card\",\n {\n name: \"Card\",\n description: \"A card\",\n component: () => null,\n props: {\n type: \"object\",\n properties: { title: { type: \"string\" } },\n required: [\"title\"],\n },\n contextTools: [],\n },\n ],\n ]);\n\n const result = toAvailableComponents(components);\n\n expect(result).toHaveLength(1);\n expect(result[0].name).toBe(\"Card\");\n });\n\n it(\"skips invalid components and logs warning\", () => {\n const warnSpy = jest.spyOn(console, \"warn\").mockImplementation(() => {});\n\n const components: Record<string, RegisteredComponent> = {\n Valid: {\n name: \"Valid\",\n description: \"Valid component\",\n component: () => null,\n props: {\n type: \"object\",\n properties: { x: { type: \"string\" } },\n required: [\"x\"],\n },\n contextTools: [],\n },\n Invalid: {\n name: \"Invalid\",\n description: \"Missing schema\",\n component: () => null,\n contextTools: [],\n } as unknown as RegisteredComponent,\n };\n\n const result = toAvailableComponents(components);\n\n expect(result).toHaveLength(1);\n expect(result[0].name).toBe(\"Valid\");\n expect(warnSpy).toHaveBeenCalledWith(\n expect.stringContaining('Skipping component \"Invalid\"'),\n );\n\n warnSpy.mockRestore();\n });\n });\n\n describe(\"toAvailableTool\", () => {\n it(\"converts a tool with inputSchema\", () => {\n const tool: TamboTool = {\n name: \"get_weather\",\n description: \"Gets weather for a city\",\n tool: async () => ({ temp: 72 }),\n inputSchema: z.object({ city: z.string() }),\n outputSchema: z.any(),\n };\n\n const result = toAvailableTool(tool);\n\n expect(result.name).toBe(\"get_weather\");\n expect(result.description).toBe(\"Gets weather for a city\");\n expect(result.inputSchema).toBeDefined();\n expect((result.inputSchema as Record<string, unknown>).type).toBe(\n \"object\",\n );\n });\n\n it(\"includes maxCalls when set\", () => {\n const tool: TamboTool = {\n name: \"limited_tool\",\n description: \"Tool with call limit\",\n tool: async () => ({}),\n inputSchema: z.object({ x: z.string() }),\n outputSchema: z.any(),\n maxCalls: 3,\n };\n\n const result = toAvailableTool(tool);\n\n expect(result.maxCalls).toBe(3);\n });\n\n it(\"omits maxCalls when not set\", () => {\n const tool: TamboTool = {\n name: \"unlimited_tool\",\n description: \"Tool without call limit\",\n tool: async () => ({}),\n inputSchema: z.object({ x: z.string() }),\n outputSchema: z.any(),\n };\n\n const result = toAvailableTool(tool);\n\n expect(result).not.toHaveProperty(\"maxCalls\");\n });\n\n it(\"throws when schema is missing\", () => {\n const tool = {\n name: \"bad_tool\",\n description: \"Missing schema\",\n tool: async () => ({}),\n } as unknown as TamboTool;\n\n expect(() => toAvailableTool(tool)).toThrow(\n 'Tool \"bad_tool\" missing inputSchema or toolSchema',\n );\n });\n });\n\n describe(\"toAvailableTools\", () => {\n it(\"converts a Record of tools\", () => {\n const tools: Record<string, TamboTool> = {\n search: {\n name: \"search\",\n description: \"Search the web\",\n tool: async () => [],\n inputSchema: z.object({ query: z.string() }),\n outputSchema: z.any(),\n },\n calculate: {\n name: \"calculate\",\n description: \"Calculate expression\",\n tool: async () => 0,\n inputSchema: z.object({ expr: z.string() }),\n outputSchema: z.any(),\n },\n };\n\n const result = toAvailableTools(tools);\n\n expect(result).toHaveLength(2);\n expect(result.map((t) => t.name)).toContain(\"search\");\n expect(result.map((t) => t.name)).toContain(\"calculate\");\n });\n\n it(\"converts a Map of tools\", () => {\n const tools = new Map<string, TamboTool>([\n [\n \"fetch\",\n {\n name: \"fetch\",\n description: \"Fetch data\",\n tool: async () => null,\n inputSchema: z.object({ url: z.string() }),\n outputSchema: z.any(),\n },\n ],\n ]);\n\n const result = toAvailableTools(tools);\n\n expect(result).toHaveLength(1);\n expect(result[0].name).toBe(\"fetch\");\n });\n\n it(\"skips invalid tools and logs warning\", () => {\n const warnSpy = jest.spyOn(console, \"warn\").mockImplementation(() => {});\n\n const tools: Record<string, TamboTool> = {\n valid: {\n name: \"valid\",\n description: \"Valid tool\",\n tool: async () => null,\n inputSchema: z.object({ x: z.number() }),\n outputSchema: z.any(),\n },\n invalid: {\n name: \"invalid\",\n description: \"Missing schema\",\n tool: async () => null,\n } as unknown as TamboTool,\n };\n\n const result = toAvailableTools(tools);\n\n expect(result).toHaveLength(1);\n expect(result[0].name).toBe(\"valid\");\n expect(warnSpy).toHaveBeenCalledWith(\n expect.stringContaining('Skipping tool \"invalid\"'),\n );\n\n warnSpy.mockRestore();\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"registry-conversion.test.js","sourceRoot":"","sources":["../../../src/v1/utils/registry-conversion.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from \"zod\";\nimport type {\n RegisteredComponent,\n TamboTool,\n} from \"../../model/component-metadata\";\nimport {\n toAvailableComponent,\n toAvailableComponents,\n toAvailableTool,\n toAvailableTools,\n} from \"@tambo-ai/client\";\n\ndescribe(\"registry-conversion\", () => {\n describe(\"toAvailableComponent\", () => {\n it(\"converts a component with props (JSON Schema)\", () => {\n // RegisteredComponent has props already converted to JSON Schema\n const component: RegisteredComponent = {\n name: \"WeatherCard\",\n description: \"Displays weather information\",\n component: () => null,\n props: {\n type: \"object\",\n properties: {\n city: { type: \"string\" },\n temperature: { type: \"number\" },\n },\n required: [\"city\", \"temperature\"],\n },\n contextTools: [],\n };\n\n const result = toAvailableComponent(component);\n\n expect(result.name).toBe(\"WeatherCard\");\n expect(result.description).toBe(\"Displays weather information\");\n expect(result.propsSchema).toBeDefined();\n expect((result.propsSchema as Record<string, unknown>).type).toBe(\n \"object\",\n );\n });\n\n it(\"throws when props is missing\", () => {\n const component = {\n name: \"BadComponent\",\n description: \"Missing schema\",\n component: () => null,\n contextTools: [],\n } as unknown as RegisteredComponent;\n\n expect(() => toAvailableComponent(component)).toThrow(\n 'Component \"BadComponent\" missing props',\n );\n });\n });\n\n describe(\"toAvailableComponents\", () => {\n it(\"converts a Record of components\", () => {\n const components: Record<string, RegisteredComponent> = {\n Card: {\n name: \"Card\",\n description: \"A card component\",\n component: () => null,\n props: {\n type: \"object\",\n properties: { title: { type: \"string\" } },\n required: [\"title\"],\n },\n contextTools: [],\n },\n Button: {\n name: \"Button\",\n description: \"A button component\",\n component: () => null,\n props: {\n type: \"object\",\n properties: { label: { type: \"string\" } },\n required: [\"label\"],\n },\n contextTools: [],\n },\n };\n\n const result = toAvailableComponents(components);\n\n expect(result).toHaveLength(2);\n expect(result.map((c) => c.name)).toContain(\"Card\");\n expect(result.map((c) => c.name)).toContain(\"Button\");\n });\n\n it(\"converts a Map of components\", () => {\n const components = new Map<string, RegisteredComponent>([\n [\n \"Card\",\n {\n name: \"Card\",\n description: \"A card\",\n component: () => null,\n props: {\n type: \"object\",\n properties: { title: { type: \"string\" } },\n required: [\"title\"],\n },\n contextTools: [],\n },\n ],\n ]);\n\n const result = toAvailableComponents(components);\n\n expect(result).toHaveLength(1);\n expect(result[0].name).toBe(\"Card\");\n });\n\n it(\"skips invalid components and logs warning\", () => {\n const warnSpy = jest.spyOn(console, \"warn\").mockImplementation(() => {});\n\n const components: Record<string, RegisteredComponent> = {\n Valid: {\n name: \"Valid\",\n description: \"Valid component\",\n component: () => null,\n props: {\n type: \"object\",\n properties: { x: { type: \"string\" } },\n required: [\"x\"],\n },\n contextTools: [],\n },\n Invalid: {\n name: \"Invalid\",\n description: \"Missing schema\",\n component: () => null,\n contextTools: [],\n } as unknown as RegisteredComponent,\n };\n\n const result = toAvailableComponents(components);\n\n expect(result).toHaveLength(1);\n expect(result[0].name).toBe(\"Valid\");\n expect(warnSpy).toHaveBeenCalledWith(\n expect.stringContaining('Skipping component \"Invalid\"'),\n );\n\n warnSpy.mockRestore();\n });\n });\n\n describe(\"toAvailableTool\", () => {\n it(\"converts a tool with inputSchema\", () => {\n const tool: TamboTool = {\n name: \"get_weather\",\n description: \"Gets weather for a city\",\n tool: async () => ({ temp: 72 }),\n inputSchema: z.object({ city: z.string() }),\n outputSchema: z.any(),\n };\n\n const result = toAvailableTool(tool);\n\n expect(result.name).toBe(\"get_weather\");\n expect(result.description).toBe(\"Gets weather for a city\");\n expect(result.inputSchema).toBeDefined();\n expect((result.inputSchema as Record<string, unknown>).type).toBe(\n \"object\",\n );\n });\n\n it(\"includes maxCalls when set\", () => {\n const tool: TamboTool = {\n name: \"limited_tool\",\n description: \"Tool with call limit\",\n tool: async () => ({}),\n inputSchema: z.object({ x: z.string() }),\n outputSchema: z.any(),\n maxCalls: 3,\n };\n\n const result = toAvailableTool(tool);\n\n expect(result.maxCalls).toBe(3);\n });\n\n it(\"omits maxCalls when not set\", () => {\n const tool: TamboTool = {\n name: \"unlimited_tool\",\n description: \"Tool without call limit\",\n tool: async () => ({}),\n inputSchema: z.object({ x: z.string() }),\n outputSchema: z.any(),\n };\n\n const result = toAvailableTool(tool);\n\n expect(result).not.toHaveProperty(\"maxCalls\");\n });\n\n it(\"throws when schema is missing\", () => {\n const tool = {\n name: \"bad_tool\",\n description: \"Missing schema\",\n tool: async () => ({}),\n } as unknown as TamboTool;\n\n expect(() => toAvailableTool(tool)).toThrow(\n 'Tool \"bad_tool\" missing inputSchema or toolSchema',\n );\n });\n });\n\n describe(\"toAvailableTools\", () => {\n it(\"converts a Record of tools\", () => {\n const tools: Record<string, TamboTool> = {\n search: {\n name: \"search\",\n description: \"Search the web\",\n tool: async () => [],\n inputSchema: z.object({ query: z.string() }),\n outputSchema: z.any(),\n },\n calculate: {\n name: \"calculate\",\n description: \"Calculate expression\",\n tool: async () => 0,\n inputSchema: z.object({ expr: z.string() }),\n outputSchema: z.any(),\n },\n };\n\n const result = toAvailableTools(tools);\n\n expect(result).toHaveLength(2);\n expect(result.map((t) => t.name)).toContain(\"search\");\n expect(result.map((t) => t.name)).toContain(\"calculate\");\n });\n\n it(\"converts a Map of tools\", () => {\n const tools = new Map<string, TamboTool>([\n [\n \"fetch\",\n {\n name: \"fetch\",\n description: \"Fetch data\",\n tool: async () => null,\n inputSchema: z.object({ url: z.string() }),\n outputSchema: z.any(),\n },\n ],\n ]);\n\n const result = toAvailableTools(tools);\n\n expect(result).toHaveLength(1);\n expect(result[0].name).toBe(\"fetch\");\n });\n\n it(\"skips invalid tools and logs warning\", () => {\n const warnSpy = jest.spyOn(console, \"warn\").mockImplementation(() => {});\n\n const tools: Record<string, TamboTool> = {\n valid: {\n name: \"valid\",\n description: \"Valid tool\",\n tool: async () => null,\n inputSchema: z.object({ x: z.number() }),\n outputSchema: z.any(),\n },\n invalid: {\n name: \"invalid\",\n description: \"Missing schema\",\n tool: async () => null,\n } as unknown as TamboTool,\n };\n\n const result = toAvailableTools(tools);\n\n expect(result).toHaveLength(1);\n expect(result[0].name).toBe(\"valid\");\n expect(warnSpy).toHaveBeenCalledWith(\n expect.stringContaining('Skipping tool \"invalid\"'),\n );\n\n warnSpy.mockRestore();\n });\n });\n});\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const core_1 = require("@ag-ui/core");
|
|
4
|
-
const
|
|
4
|
+
const client_1 = require("@tambo-ai/client");
|
|
5
5
|
describe("handleEventStream", () => {
|
|
6
6
|
it("yields events from the stream", async () => {
|
|
7
7
|
const mockEvents = [
|
|
@@ -19,7 +19,7 @@ describe("handleEventStream", () => {
|
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
const result = [];
|
|
22
|
-
for await (const event of (0,
|
|
22
|
+
for await (const event of (0, client_1.handleEventStream)(mockStream())) {
|
|
23
23
|
result.push(event);
|
|
24
24
|
}
|
|
25
25
|
expect(result).toHaveLength(3);
|
|
@@ -32,7 +32,7 @@ describe("handleEventStream", () => {
|
|
|
32
32
|
// yields nothing
|
|
33
33
|
}
|
|
34
34
|
const result = [];
|
|
35
|
-
for await (const event of (0,
|
|
35
|
+
for await (const event of (0, client_1.handleEventStream)(emptyStream())) {
|
|
36
36
|
result.push(event);
|
|
37
37
|
}
|
|
38
38
|
expect(result).toHaveLength(0);
|
|
@@ -48,7 +48,7 @@ describe("handleEventStream", () => {
|
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
50
|
const result = [];
|
|
51
|
-
for await (const event of (0,
|
|
51
|
+
for await (const event of (0, client_1.handleEventStream)(mockStream(), {
|
|
52
52
|
debug: true,
|
|
53
53
|
})) {
|
|
54
54
|
result.push(event);
|
|
@@ -62,7 +62,7 @@ describe("handleEventStream", () => {
|
|
|
62
62
|
async function* mockStream() {
|
|
63
63
|
yield { type: core_1.EventType.RUN_STARTED };
|
|
64
64
|
}
|
|
65
|
-
for await (const _event of (0,
|
|
65
|
+
for await (const _event of (0, client_1.handleEventStream)(mockStream(), {
|
|
66
66
|
debug: false,
|
|
67
67
|
})) {
|
|
68
68
|
// consume stream
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stream-handler.test.js","sourceRoot":"","sources":["../../../src/v1/utils/stream-handler.test.ts"],"names":[],"mappings":";;AAAA,sCAAwC;AACxC,
|
|
1
|
+
{"version":3,"file":"stream-handler.test.js","sourceRoot":"","sources":["../../../src/v1/utils/stream-handler.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventType } from \"@ag-ui/core\";\nimport { handleEventStream } from \"@tambo-ai/client\";\n\ndescribe(\"handleEventStream\", () => {\n it(\"yields events from the stream\", async () => {\n const mockEvents = [\n { type: EventType.RUN_STARTED, runId: \"run_1\", threadId: \"thread_1\" },\n {\n type: EventType.TEXT_MESSAGE_START,\n messageId: \"msg_1\",\n role: \"assistant\",\n },\n { type: EventType.RUN_FINISHED, runId: \"run_1\", threadId: \"thread_1\" },\n ];\n\n async function* mockStream() {\n for (const event of mockEvents) {\n yield event;\n }\n }\n\n const result: unknown[] = [];\n for await (const event of handleEventStream(mockStream())) {\n result.push(event);\n }\n\n expect(result).toHaveLength(3);\n expect(result[0]).toEqual(mockEvents[0]);\n expect(result[1]).toEqual(mockEvents[1]);\n expect(result[2]).toEqual(mockEvents[2]);\n });\n\n it(\"handles empty stream\", async () => {\n async function* emptyStream() {\n // yields nothing\n }\n\n const result: unknown[] = [];\n for await (const event of handleEventStream(emptyStream())) {\n result.push(event);\n }\n\n expect(result).toHaveLength(0);\n });\n\n it(\"logs events when debug is enabled in non-production\", async () => {\n const originalEnv = process.env.NODE_ENV;\n process.env.NODE_ENV = \"development\";\n const logSpy = jest.spyOn(console, \"log\").mockImplementation(() => {});\n\n const mockEvents = [{ type: EventType.RUN_STARTED, runId: \"run_1\" }];\n\n async function* mockStream() {\n for (const event of mockEvents) {\n yield event;\n }\n }\n\n const result: unknown[] = [];\n for await (const event of handleEventStream(mockStream(), {\n debug: true,\n })) {\n result.push(event);\n }\n\n expect(logSpy).toHaveBeenCalledWith(\n \"[StreamHandler] Event:\",\n expect.objectContaining({ type: EventType.RUN_STARTED }),\n );\n\n logSpy.mockRestore();\n process.env.NODE_ENV = originalEnv;\n });\n\n it(\"does not log when debug is false\", async () => {\n const logSpy = jest.spyOn(console, \"log\").mockImplementation(() => {});\n\n async function* mockStream() {\n yield { type: EventType.RUN_STARTED };\n }\n\n for await (const _event of handleEventStream(mockStream(), {\n debug: false,\n })) {\n // consume stream\n }\n\n expect(logSpy).not.toHaveBeenCalled();\n logSpy.mockRestore();\n });\n});\n"]}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const core_1 = require("@ag-ui/core");
|
|
4
|
-
const
|
|
5
|
-
/**
|
|
4
|
+
const client_1 = require("@tambo-ai/client");
|
|
5
|
+
/**
|
|
6
|
+
* Minimal tool definition for tests — only name + inputSchema are needed.
|
|
7
|
+
* @returns A TamboTool with test defaults.
|
|
8
|
+
*/
|
|
6
9
|
function fakeTool(name, inputSchema) {
|
|
7
10
|
return {
|
|
8
11
|
name,
|
|
@@ -12,9 +15,12 @@ function fakeTool(name, inputSchema) {
|
|
|
12
15
|
outputSchema: {},
|
|
13
16
|
};
|
|
14
17
|
}
|
|
15
|
-
/**
|
|
18
|
+
/**
|
|
19
|
+
* Helper to create a tracker with a started tool call.
|
|
20
|
+
* @returns A ToolCallTracker with a pending tool call.
|
|
21
|
+
*/
|
|
16
22
|
function createTrackerWithToolCall(toolCallId = "call_1", toolCallName = "get_weather", toolRegistry) {
|
|
17
|
-
const tracker = new
|
|
23
|
+
const tracker = new client_1.ToolCallTracker(toolRegistry);
|
|
18
24
|
tracker.handleEvent({
|
|
19
25
|
type: core_1.EventType.TOOL_CALL_START,
|
|
20
26
|
toolCallId,
|
|
@@ -26,11 +32,11 @@ function createTrackerWithToolCall(toolCallId = "call_1", toolCallName = "get_we
|
|
|
26
32
|
describe("ToolCallTracker", () => {
|
|
27
33
|
describe("getAccumulatingToolCall", () => {
|
|
28
34
|
it("returns undefined for unknown tool call ID", () => {
|
|
29
|
-
const tracker = new
|
|
35
|
+
const tracker = new client_1.ToolCallTracker();
|
|
30
36
|
expect(tracker.getAccumulatingToolCall("nonexistent")).toBeUndefined();
|
|
31
37
|
});
|
|
32
38
|
it("returns name and empty accumulated args after TOOL_CALL_START", () => {
|
|
33
|
-
const tracker = new
|
|
39
|
+
const tracker = new client_1.ToolCallTracker();
|
|
34
40
|
tracker.handleEvent({
|
|
35
41
|
type: core_1.EventType.TOOL_CALL_START,
|
|
36
42
|
toolCallId: "call_1",
|
|
@@ -41,7 +47,7 @@ describe("ToolCallTracker", () => {
|
|
|
41
47
|
expect(result).toEqual({ name: "write_story", accumulatedArgs: "" });
|
|
42
48
|
});
|
|
43
49
|
it("returns name and accumulated args after START + ARGS events", () => {
|
|
44
|
-
const tracker = new
|
|
50
|
+
const tracker = new client_1.ToolCallTracker();
|
|
45
51
|
tracker.handleEvent({
|
|
46
52
|
type: core_1.EventType.TOOL_CALL_START,
|
|
47
53
|
toolCallId: "call_1",
|
|
@@ -60,7 +66,7 @@ describe("ToolCallTracker", () => {
|
|
|
60
66
|
});
|
|
61
67
|
});
|
|
62
68
|
it("accumulates multiple ARGS deltas", () => {
|
|
63
|
-
const tracker = new
|
|
69
|
+
const tracker = new client_1.ToolCallTracker();
|
|
64
70
|
tracker.handleEvent({
|
|
65
71
|
type: core_1.EventType.TOOL_CALL_START,
|
|
66
72
|
toolCallId: "call_1",
|
|
@@ -202,7 +208,7 @@ describe("ToolCallTracker", () => {
|
|
|
202
208
|
my_tool: fakeTool("my_tool", schema),
|
|
203
209
|
};
|
|
204
210
|
it("returns undefined for unknown tool call ID", () => {
|
|
205
|
-
const tracker = new
|
|
211
|
+
const tracker = new client_1.ToolCallTracker(registry);
|
|
206
212
|
expect(tracker.parsePartialArgs("nonexistent")).toBeUndefined();
|
|
207
213
|
});
|
|
208
214
|
it("returns undefined when partial JSON is not parseable", () => {
|