@tambo-ai/react 0.67.1 → 0.69.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 +3 -5
- package/dist/context-helpers/context-helpers.test.js +16 -4
- package/dist/context-helpers/context-helpers.test.js.map +1 -1
- package/dist/context-helpers/current-interactables-context-helper.d.ts +2 -2
- package/dist/context-helpers/current-interactables-context-helper.d.ts.map +1 -1
- package/dist/context-helpers/current-interactables-context-helper.js +31 -12
- package/dist/context-helpers/current-interactables-context-helper.js.map +1 -1
- package/dist/context-helpers/registry.d.ts +2 -2
- package/dist/context-helpers/registry.d.ts.map +1 -1
- package/dist/context-helpers/registry.js.map +1 -1
- package/dist/context-helpers/types.d.ts +2 -2
- package/dist/context-helpers/types.d.ts.map +1 -1
- package/dist/context-helpers/types.js.map +1 -1
- package/dist/hoc/with-tambo-interactable.d.ts +50 -4
- package/dist/hoc/with-tambo-interactable.d.ts.map +1 -1
- package/dist/hoc/with-tambo-interactable.js +20 -5
- package/dist/hoc/with-tambo-interactable.js.map +1 -1
- package/dist/hooks/use-component-state.d.ts +3 -8
- package/dist/hooks/use-component-state.d.ts.map +1 -1
- package/dist/hooks/use-component-state.js +8 -0
- package/dist/hooks/use-component-state.js.map +1 -1
- package/dist/hooks/use-component-state.test.js +37 -0
- package/dist/hooks/use-component-state.test.js.map +1 -1
- package/dist/hooks/use-message-images.test.js +174 -37
- package/dist/hooks/use-message-images.test.js.map +1 -1
- package/dist/hooks/use-tambo-threads.js +1 -1
- package/dist/hooks/use-tambo-threads.js.map +1 -1
- package/dist/hooks/use-tambo-voice.d.ts +1 -1
- package/dist/hooks/use-tambo-voice.js +1 -1
- package/dist/hooks/use-tambo-voice.js.map +1 -1
- package/dist/hooks/use-tambo-voice.test.d.ts +2 -0
- package/dist/hooks/use-tambo-voice.test.d.ts.map +1 -0
- package/dist/hooks/use-tambo-voice.test.js +239 -0
- package/dist/hooks/use-tambo-voice.test.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/elicitation.d.ts.map +1 -1
- package/dist/mcp/elicitation.js +12 -0
- package/dist/mcp/elicitation.js.map +1 -1
- package/dist/mcp/elicitation.test.js +8 -1
- package/dist/mcp/elicitation.test.js.map +1 -1
- package/dist/mcp/mcp-client.d.ts +6 -10
- package/dist/mcp/mcp-client.d.ts.map +1 -1
- package/dist/mcp/mcp-client.js.map +1 -1
- package/dist/mcp/mcp-constants.d.ts +19 -0
- package/dist/mcp/mcp-constants.d.ts.map +1 -0
- package/dist/mcp/mcp-constants.js +21 -0
- package/dist/mcp/mcp-constants.js.map +1 -0
- package/dist/mcp/mcp-hooks.d.ts +21 -40
- package/dist/mcp/mcp-hooks.d.ts.map +1 -1
- package/dist/mcp/mcp-hooks.js +130 -39
- package/dist/mcp/mcp-hooks.js.map +1 -1
- package/dist/mcp/mcp-hooks.test.js +431 -5
- package/dist/mcp/mcp-hooks.test.js.map +1 -1
- package/dist/mcp/tambo-mcp-provider.d.ts +7 -0
- package/dist/mcp/tambo-mcp-provider.d.ts.map +1 -1
- package/dist/mcp/tambo-mcp-provider.js +205 -155
- package/dist/mcp/tambo-mcp-provider.js.map +1 -1
- package/dist/mcp/tambo-mcp-provider.test.js +37 -0
- package/dist/mcp/tambo-mcp-provider.test.js.map +1 -1
- package/dist/model/component-metadata.d.ts +54 -21
- package/dist/model/component-metadata.d.ts.map +1 -1
- package/dist/model/component-metadata.js.map +1 -1
- package/dist/model/tambo-interactable.d.ts +13 -5
- package/dist/model/tambo-interactable.d.ts.map +1 -1
- package/dist/model/tambo-interactable.js.map +1 -1
- package/dist/providers/__tests__/thread-input-resource-resolution.test.d.ts +2 -0
- package/dist/providers/__tests__/thread-input-resource-resolution.test.d.ts.map +1 -0
- package/dist/providers/__tests__/thread-input-resource-resolution.test.js +592 -0
- package/dist/providers/__tests__/thread-input-resource-resolution.test.js.map +1 -0
- package/dist/providers/index.d.ts +1 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/tambo-client-provider.d.ts +8 -0
- package/dist/providers/tambo-client-provider.d.ts.map +1 -1
- package/dist/providers/tambo-client-provider.js +10 -11
- package/dist/providers/tambo-client-provider.js.map +1 -1
- package/dist/providers/tambo-client-provider.test.d.ts +2 -0
- package/dist/providers/tambo-client-provider.test.d.ts.map +1 -0
- package/dist/providers/tambo-client-provider.test.js +208 -0
- package/dist/providers/tambo-client-provider.test.js.map +1 -0
- package/dist/providers/tambo-context-attachment-provider.d.ts +34 -92
- package/dist/providers/tambo-context-attachment-provider.d.ts.map +1 -1
- package/dist/providers/tambo-context-attachment-provider.js +62 -105
- package/dist/providers/tambo-context-attachment-provider.js.map +1 -1
- package/dist/providers/tambo-context-attachment-provider.test.js +229 -463
- package/dist/providers/tambo-context-attachment-provider.test.js.map +1 -1
- package/dist/providers/tambo-interactable-provider-partial-updates.test.js +22 -21
- package/dist/providers/tambo-interactable-provider-partial-updates.test.js.map +1 -1
- package/dist/providers/tambo-interactable-provider.d.ts +5 -2
- package/dist/providers/tambo-interactable-provider.d.ts.map +1 -1
- package/dist/providers/tambo-interactable-provider.js +126 -17
- package/dist/providers/tambo-interactable-provider.js.map +1 -1
- package/dist/providers/tambo-interactable-provider.test.js +242 -0
- package/dist/providers/tambo-interactable-provider.test.js.map +1 -1
- package/dist/providers/tambo-interactables-additional-context.test.js +2 -5
- package/dist/providers/tambo-interactables-additional-context.test.js.map +1 -1
- package/dist/providers/tambo-provider.d.ts +2 -3
- package/dist/providers/tambo-provider.d.ts.map +1 -1
- package/dist/providers/tambo-provider.js +6 -5
- package/dist/providers/tambo-provider.js.map +1 -1
- package/dist/providers/tambo-registry-provider.test.js +16 -0
- package/dist/providers/tambo-registry-provider.test.js.map +1 -1
- package/dist/providers/tambo-registry-schema-compat.test.js +31 -0
- package/dist/providers/tambo-registry-schema-compat.test.js.map +1 -1
- package/dist/providers/tambo-thread-input-provider.d.ts +1 -1
- package/dist/providers/tambo-thread-input-provider.d.ts.map +1 -1
- package/dist/providers/tambo-thread-input-provider.js +26 -4
- package/dist/providers/tambo-thread-input-provider.js.map +1 -1
- package/dist/providers/tambo-thread-provider-initial-messages.test.js +84 -2
- package/dist/providers/tambo-thread-provider-initial-messages.test.js.map +1 -1
- package/dist/providers/tambo-thread-provider.d.ts.map +1 -1
- package/dist/providers/tambo-thread-provider.js +53 -42
- package/dist/providers/tambo-thread-provider.js.map +1 -1
- package/dist/providers/tambo-thread-provider.test.js +368 -262
- package/dist/providers/tambo-thread-provider.test.js.map +1 -1
- package/dist/schema/index.d.ts +1 -1
- package/dist/schema/index.d.ts.map +1 -1
- package/dist/schema/index.js +2 -1
- package/dist/schema/index.js.map +1 -1
- package/dist/schema/json-schema.d.ts +7 -0
- package/dist/schema/json-schema.d.ts.map +1 -1
- package/dist/schema/json-schema.js +40 -29
- package/dist/schema/json-schema.js.map +1 -1
- package/dist/schema/json-schema.test.d.ts +2 -0
- package/dist/schema/json-schema.test.d.ts.map +1 -0
- package/dist/schema/json-schema.test.js +204 -0
- package/dist/schema/json-schema.test.js.map +1 -0
- package/dist/schema/schema.test.js +237 -0
- package/dist/schema/schema.test.js.map +1 -1
- package/dist/schema/standard-schema.d.ts +1 -0
- package/dist/schema/standard-schema.d.ts.map +1 -1
- package/dist/schema/standard-schema.js +18 -13
- package/dist/schema/standard-schema.js.map +1 -1
- package/dist/schema/standard-schema.test.d.ts +2 -0
- package/dist/schema/standard-schema.test.d.ts.map +1 -0
- package/dist/schema/standard-schema.test.js +165 -0
- package/dist/schema/standard-schema.test.js.map +1 -0
- package/dist/schema/validate.test.js +149 -0
- package/dist/schema/validate.test.js.map +1 -1
- package/dist/schema/zod.d.ts +7 -4
- package/dist/schema/zod.d.ts.map +1 -1
- package/dist/schema/zod.js +65 -22
- package/dist/schema/zod.js.map +1 -1
- package/dist/schema/zod.test.js +112 -0
- package/dist/schema/zod.test.js.map +1 -1
- package/dist/setupTests.js +3 -0
- package/dist/setupTests.js.map +1 -1
- package/dist/testing/tools.d.ts +4 -1
- package/dist/testing/tools.d.ts.map +1 -1
- package/dist/testing/tools.js +6 -1
- package/dist/testing/tools.js.map +1 -1
- package/dist/util/generate-component.d.ts.map +1 -1
- package/dist/util/generate-component.js +18 -3
- package/dist/util/generate-component.js.map +1 -1
- package/dist/util/generate-component.test.d.ts +2 -0
- package/dist/util/generate-component.test.d.ts.map +1 -0
- package/dist/util/generate-component.test.js +340 -0
- package/dist/util/generate-component.test.js.map +1 -0
- package/dist/util/is-promise.d.ts +9 -0
- package/dist/util/is-promise.d.ts.map +1 -0
- package/dist/util/is-promise.js +20 -0
- package/dist/util/is-promise.js.map +1 -0
- package/dist/util/is-promise.test.d.ts +2 -0
- package/dist/util/is-promise.test.d.ts.map +1 -0
- package/dist/util/is-promise.test.js +48 -0
- package/dist/util/is-promise.test.js.map +1 -0
- package/dist/util/message-builder.d.ts +3 -1
- package/dist/util/message-builder.d.ts.map +1 -1
- package/dist/util/message-builder.js +20 -3
- package/dist/util/message-builder.js.map +1 -1
- package/dist/util/message-builder.test.js +269 -0
- package/dist/util/message-builder.test.js.map +1 -1
- package/dist/util/query-utils.test.d.ts +2 -0
- package/dist/util/query-utils.test.d.ts.map +1 -0
- package/dist/util/query-utils.test.js +382 -0
- package/dist/util/query-utils.test.js.map +1 -0
- package/dist/util/registry-validators.d.ts.map +1 -1
- package/dist/util/registry-validators.js +7 -0
- package/dist/util/registry-validators.js.map +1 -1
- package/dist/util/registry-validators.test.js +57 -0
- package/dist/util/registry-validators.test.js.map +1 -1
- package/dist/util/registry.d.ts.map +1 -1
- package/dist/util/registry.js +9 -0
- package/dist/util/registry.js.map +1 -1
- package/dist/util/registry.test.js +323 -1
- package/dist/util/registry.test.js.map +1 -1
- package/dist/util/resource-content-resolver.d.ts +20 -0
- package/dist/util/resource-content-resolver.d.ts.map +1 -0
- package/dist/util/resource-content-resolver.js +93 -0
- package/dist/util/resource-content-resolver.js.map +1 -0
- package/dist/util/resource-content-resolver.test.d.ts +2 -0
- package/dist/util/resource-content-resolver.test.d.ts.map +1 -0
- package/dist/util/resource-content-resolver.test.js +254 -0
- package/dist/util/resource-content-resolver.test.js.map +1 -0
- package/dist/util/resource-validators.test.d.ts +2 -0
- package/dist/util/resource-validators.test.d.ts.map +1 -0
- package/dist/util/resource-validators.test.js +90 -0
- package/dist/util/resource-validators.test.js.map +1 -0
- package/dist/util/tool-caller.d.ts +2 -2
- package/dist/util/tool-caller.d.ts.map +1 -1
- package/dist/util/tool-caller.js +8 -8
- package/dist/util/tool-caller.js.map +1 -1
- package/dist/util/validate-component-name.test.d.ts +2 -0
- package/dist/util/validate-component-name.test.d.ts.map +1 -0
- package/dist/util/validate-component-name.test.js +35 -0
- package/dist/util/validate-component-name.test.js.map +1 -0
- package/esm/context-helpers/context-helpers.test.js +16 -4
- package/esm/context-helpers/context-helpers.test.js.map +1 -1
- package/esm/context-helpers/current-interactables-context-helper.d.ts +2 -2
- package/esm/context-helpers/current-interactables-context-helper.d.ts.map +1 -1
- package/esm/context-helpers/current-interactables-context-helper.js +31 -12
- package/esm/context-helpers/current-interactables-context-helper.js.map +1 -1
- package/esm/context-helpers/registry.d.ts +2 -2
- package/esm/context-helpers/registry.d.ts.map +1 -1
- package/esm/context-helpers/registry.js.map +1 -1
- package/esm/context-helpers/types.d.ts +2 -2
- package/esm/context-helpers/types.d.ts.map +1 -1
- package/esm/context-helpers/types.js.map +1 -1
- package/esm/hoc/with-tambo-interactable.d.ts +50 -4
- package/esm/hoc/with-tambo-interactable.d.ts.map +1 -1
- package/esm/hoc/with-tambo-interactable.js +20 -5
- package/esm/hoc/with-tambo-interactable.js.map +1 -1
- package/esm/hooks/use-component-state.d.ts +3 -8
- package/esm/hooks/use-component-state.d.ts.map +1 -1
- package/esm/hooks/use-component-state.js +8 -0
- package/esm/hooks/use-component-state.js.map +1 -1
- package/esm/hooks/use-component-state.test.js +37 -0
- package/esm/hooks/use-component-state.test.js.map +1 -1
- package/esm/hooks/use-message-images.test.js +174 -37
- package/esm/hooks/use-message-images.test.js.map +1 -1
- package/esm/hooks/use-tambo-threads.js +1 -1
- package/esm/hooks/use-tambo-threads.js.map +1 -1
- package/esm/hooks/use-tambo-voice.d.ts +1 -1
- package/esm/hooks/use-tambo-voice.js +1 -1
- package/esm/hooks/use-tambo-voice.js.map +1 -1
- package/esm/hooks/use-tambo-voice.test.d.ts +2 -0
- package/esm/hooks/use-tambo-voice.test.d.ts.map +1 -0
- package/esm/hooks/use-tambo-voice.test.js +234 -0
- package/esm/hooks/use-tambo-voice.test.js.map +1 -0
- package/esm/index.d.ts +2 -2
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js.map +1 -1
- package/esm/mcp/elicitation.d.ts.map +1 -1
- package/esm/mcp/elicitation.js +12 -0
- package/esm/mcp/elicitation.js.map +1 -1
- package/esm/mcp/elicitation.test.js +8 -1
- package/esm/mcp/elicitation.test.js.map +1 -1
- package/esm/mcp/mcp-client.d.ts +6 -10
- package/esm/mcp/mcp-client.d.ts.map +1 -1
- package/esm/mcp/mcp-client.js.map +1 -1
- package/esm/mcp/mcp-constants.d.ts +19 -0
- package/esm/mcp/mcp-constants.d.ts.map +1 -0
- package/esm/mcp/mcp-constants.js +18 -0
- package/esm/mcp/mcp-constants.js.map +1 -0
- package/esm/mcp/mcp-hooks.d.ts +21 -40
- package/esm/mcp/mcp-hooks.d.ts.map +1 -1
- package/esm/mcp/mcp-hooks.js +97 -40
- package/esm/mcp/mcp-hooks.js.map +1 -1
- package/esm/mcp/mcp-hooks.test.js +431 -5
- package/esm/mcp/mcp-hooks.test.js.map +1 -1
- package/esm/mcp/tambo-mcp-provider.d.ts +7 -0
- package/esm/mcp/tambo-mcp-provider.d.ts.map +1 -1
- package/esm/mcp/tambo-mcp-provider.js +204 -154
- package/esm/mcp/tambo-mcp-provider.js.map +1 -1
- package/esm/mcp/tambo-mcp-provider.test.js +37 -0
- package/esm/mcp/tambo-mcp-provider.test.js.map +1 -1
- package/esm/model/component-metadata.d.ts +54 -21
- package/esm/model/component-metadata.d.ts.map +1 -1
- package/esm/model/component-metadata.js.map +1 -1
- package/esm/model/tambo-interactable.d.ts +13 -5
- package/esm/model/tambo-interactable.d.ts.map +1 -1
- package/esm/model/tambo-interactable.js.map +1 -1
- package/esm/providers/__tests__/thread-input-resource-resolution.test.d.ts +2 -0
- package/esm/providers/__tests__/thread-input-resource-resolution.test.d.ts.map +1 -0
- package/esm/providers/__tests__/thread-input-resource-resolution.test.js +587 -0
- package/esm/providers/__tests__/thread-input-resource-resolution.test.js.map +1 -0
- package/esm/providers/index.d.ts +1 -1
- package/esm/providers/index.d.ts.map +1 -1
- package/esm/providers/index.js.map +1 -1
- package/esm/providers/tambo-client-provider.d.ts +8 -0
- package/esm/providers/tambo-client-provider.d.ts.map +1 -1
- package/esm/providers/tambo-client-provider.js +11 -12
- package/esm/providers/tambo-client-provider.js.map +1 -1
- package/esm/providers/tambo-client-provider.test.d.ts +2 -0
- package/esm/providers/tambo-client-provider.test.d.ts.map +1 -0
- package/esm/providers/tambo-client-provider.test.js +203 -0
- package/esm/providers/tambo-client-provider.test.js.map +1 -0
- package/esm/providers/tambo-context-attachment-provider.d.ts +34 -92
- package/esm/providers/tambo-context-attachment-provider.d.ts.map +1 -1
- package/esm/providers/tambo-context-attachment-provider.js +63 -106
- package/esm/providers/tambo-context-attachment-provider.js.map +1 -1
- package/esm/providers/tambo-context-attachment-provider.test.js +230 -464
- package/esm/providers/tambo-context-attachment-provider.test.js.map +1 -1
- package/esm/providers/tambo-interactable-provider-partial-updates.test.js +22 -21
- package/esm/providers/tambo-interactable-provider-partial-updates.test.js.map +1 -1
- package/esm/providers/tambo-interactable-provider.d.ts +5 -2
- package/esm/providers/tambo-interactable-provider.d.ts.map +1 -1
- package/esm/providers/tambo-interactable-provider.js +126 -17
- package/esm/providers/tambo-interactable-provider.js.map +1 -1
- package/esm/providers/tambo-interactable-provider.test.js +242 -0
- package/esm/providers/tambo-interactable-provider.test.js.map +1 -1
- package/esm/providers/tambo-interactables-additional-context.test.js +2 -5
- package/esm/providers/tambo-interactables-additional-context.test.js.map +1 -1
- package/esm/providers/tambo-provider.d.ts +2 -3
- package/esm/providers/tambo-provider.d.ts.map +1 -1
- package/esm/providers/tambo-provider.js +6 -5
- package/esm/providers/tambo-provider.js.map +1 -1
- package/esm/providers/tambo-registry-provider.test.js +16 -0
- package/esm/providers/tambo-registry-provider.test.js.map +1 -1
- package/esm/providers/tambo-registry-schema-compat.test.js +31 -0
- package/esm/providers/tambo-registry-schema-compat.test.js.map +1 -1
- package/esm/providers/tambo-thread-input-provider.d.ts +1 -1
- package/esm/providers/tambo-thread-input-provider.d.ts.map +1 -1
- package/esm/providers/tambo-thread-input-provider.js +26 -4
- package/esm/providers/tambo-thread-input-provider.js.map +1 -1
- package/esm/providers/tambo-thread-provider-initial-messages.test.js +84 -2
- package/esm/providers/tambo-thread-provider-initial-messages.test.js.map +1 -1
- package/esm/providers/tambo-thread-provider.d.ts.map +1 -1
- package/esm/providers/tambo-thread-provider.js +53 -42
- package/esm/providers/tambo-thread-provider.js.map +1 -1
- package/esm/providers/tambo-thread-provider.test.js +368 -262
- package/esm/providers/tambo-thread-provider.test.js.map +1 -1
- package/esm/schema/index.d.ts +1 -1
- package/esm/schema/index.d.ts.map +1 -1
- package/esm/schema/index.js +1 -1
- package/esm/schema/index.js.map +1 -1
- package/esm/schema/json-schema.d.ts +7 -0
- package/esm/schema/json-schema.d.ts.map +1 -1
- package/esm/schema/json-schema.js +11 -1
- package/esm/schema/json-schema.js.map +1 -1
- package/esm/schema/json-schema.test.d.ts +2 -0
- package/esm/schema/json-schema.test.d.ts.map +1 -0
- package/esm/schema/json-schema.test.js +202 -0
- package/esm/schema/json-schema.test.js.map +1 -0
- package/esm/schema/schema.test.js +238 -1
- package/esm/schema/schema.test.js.map +1 -1
- package/esm/schema/standard-schema.d.ts +1 -0
- package/esm/schema/standard-schema.d.ts.map +1 -1
- package/esm/schema/standard-schema.js +18 -13
- package/esm/schema/standard-schema.js.map +1 -1
- package/esm/schema/standard-schema.test.d.ts +2 -0
- package/esm/schema/standard-schema.test.d.ts.map +1 -0
- package/esm/schema/standard-schema.test.js +130 -0
- package/esm/schema/standard-schema.test.js.map +1 -0
- package/esm/schema/validate.test.js +149 -0
- package/esm/schema/validate.test.js.map +1 -1
- package/esm/schema/zod.d.ts +7 -4
- package/esm/schema/zod.d.ts.map +1 -1
- package/esm/schema/zod.js +65 -22
- package/esm/schema/zod.js.map +1 -1
- package/esm/schema/zod.test.js +113 -1
- package/esm/schema/zod.test.js.map +1 -1
- package/esm/setupTests.js +3 -0
- package/esm/setupTests.js.map +1 -1
- package/esm/testing/tools.d.ts +4 -1
- package/esm/testing/tools.d.ts.map +1 -1
- package/esm/testing/tools.js +6 -1
- package/esm/testing/tools.js.map +1 -1
- package/esm/util/generate-component.d.ts.map +1 -1
- package/esm/util/generate-component.js +18 -3
- package/esm/util/generate-component.js.map +1 -1
- package/esm/util/generate-component.test.d.ts +2 -0
- package/esm/util/generate-component.test.d.ts.map +1 -0
- package/esm/util/generate-component.test.js +302 -0
- package/esm/util/generate-component.test.js.map +1 -0
- package/esm/util/is-promise.d.ts +9 -0
- package/esm/util/is-promise.d.ts.map +1 -0
- package/esm/util/is-promise.js +17 -0
- package/esm/util/is-promise.js.map +1 -0
- package/esm/util/is-promise.test.d.ts +2 -0
- package/esm/util/is-promise.test.d.ts.map +1 -0
- package/esm/util/is-promise.test.js +46 -0
- package/esm/util/is-promise.test.js.map +1 -0
- package/esm/util/message-builder.d.ts +3 -1
- package/esm/util/message-builder.d.ts.map +1 -1
- package/esm/util/message-builder.js +20 -3
- package/esm/util/message-builder.js.map +1 -1
- package/esm/util/message-builder.test.js +269 -0
- package/esm/util/message-builder.test.js.map +1 -1
- package/esm/util/query-utils.test.d.ts +2 -0
- package/esm/util/query-utils.test.d.ts.map +1 -0
- package/esm/util/query-utils.test.js +380 -0
- package/esm/util/query-utils.test.js.map +1 -0
- package/esm/util/registry-validators.d.ts.map +1 -1
- package/esm/util/registry-validators.js +7 -0
- package/esm/util/registry-validators.js.map +1 -1
- package/esm/util/registry-validators.test.js +57 -0
- package/esm/util/registry-validators.test.js.map +1 -1
- package/esm/util/registry.d.ts.map +1 -1
- package/esm/util/registry.js +9 -0
- package/esm/util/registry.js.map +1 -1
- package/esm/util/registry.test.js +324 -2
- package/esm/util/registry.test.js.map +1 -1
- package/esm/util/resource-content-resolver.d.ts +20 -0
- package/esm/util/resource-content-resolver.d.ts.map +1 -0
- package/esm/util/resource-content-resolver.js +89 -0
- package/esm/util/resource-content-resolver.js.map +1 -0
- package/esm/util/resource-content-resolver.test.d.ts +2 -0
- package/esm/util/resource-content-resolver.test.d.ts.map +1 -0
- package/esm/util/resource-content-resolver.test.js +252 -0
- package/esm/util/resource-content-resolver.test.js.map +1 -0
- package/esm/util/resource-validators.test.d.ts +2 -0
- package/esm/util/resource-validators.test.d.ts.map +1 -0
- package/esm/util/resource-validators.test.js +88 -0
- package/esm/util/resource-validators.test.js.map +1 -0
- package/esm/util/tool-caller.d.ts +2 -2
- package/esm/util/tool-caller.d.ts.map +1 -1
- package/esm/util/tool-caller.js +8 -8
- package/esm/util/tool-caller.js.map +1 -1
- package/esm/util/validate-component-name.test.d.ts +2 -0
- package/esm/util/validate-component-name.test.d.ts.map +1 -0
- package/esm/util/validate-component-name.test.js +33 -0
- package/esm/util/validate-component-name.test.js.map +1 -0
- package/package.json +15 -23
- package/dist/schema/alias.d.ts +0 -3
- package/dist/schema/alias.d.ts.map +0 -1
- package/dist/schema/alias.js +0 -6
- package/dist/schema/alias.js.map +0 -1
- package/esm/schema/alias.d.ts +0 -3
- package/esm/schema/alias.d.ts.map +0 -1
- package/esm/schema/alias.js +0 -13
- package/esm/schema/alias.js.map +0 -1
|
@@ -672,5 +672,274 @@ describe("buildMessageContent", () => {
|
|
|
672
672
|
expect(result[0].type).toBe("resource");
|
|
673
673
|
});
|
|
674
674
|
});
|
|
675
|
+
describe("resource content resolution", () => {
|
|
676
|
+
it("should include text content from resolved resource", () => {
|
|
677
|
+
const resourceContent = new Map([
|
|
678
|
+
[
|
|
679
|
+
"registry:file:///doc.txt",
|
|
680
|
+
{
|
|
681
|
+
contents: [
|
|
682
|
+
{
|
|
683
|
+
uri: "file:///doc.txt",
|
|
684
|
+
mimeType: "text/plain",
|
|
685
|
+
text: "This is the document content",
|
|
686
|
+
},
|
|
687
|
+
],
|
|
688
|
+
},
|
|
689
|
+
],
|
|
690
|
+
]);
|
|
691
|
+
const result = buildMessageContent("Check @registry:file:///doc.txt", [], {}, resourceContent);
|
|
692
|
+
expect(result).toEqual([
|
|
693
|
+
{
|
|
694
|
+
type: "text",
|
|
695
|
+
text: "Check ",
|
|
696
|
+
},
|
|
697
|
+
{
|
|
698
|
+
type: "resource",
|
|
699
|
+
resource: {
|
|
700
|
+
uri: "file:///doc.txt",
|
|
701
|
+
text: "This is the document content",
|
|
702
|
+
mimeType: "text/plain",
|
|
703
|
+
},
|
|
704
|
+
},
|
|
705
|
+
]);
|
|
706
|
+
});
|
|
707
|
+
it("should include blob content from resolved resource", () => {
|
|
708
|
+
const resourceContent = new Map([
|
|
709
|
+
[
|
|
710
|
+
"registry:file:///image.png",
|
|
711
|
+
{
|
|
712
|
+
contents: [
|
|
713
|
+
{
|
|
714
|
+
uri: "file:///image.png",
|
|
715
|
+
mimeType: "image/png",
|
|
716
|
+
blob: "base64encodeddata",
|
|
717
|
+
},
|
|
718
|
+
],
|
|
719
|
+
},
|
|
720
|
+
],
|
|
721
|
+
]);
|
|
722
|
+
const result = buildMessageContent("Check @registry:file:///image.png", [], {}, resourceContent);
|
|
723
|
+
expect(result).toEqual([
|
|
724
|
+
{
|
|
725
|
+
type: "text",
|
|
726
|
+
text: "Check ",
|
|
727
|
+
},
|
|
728
|
+
{
|
|
729
|
+
type: "resource",
|
|
730
|
+
resource: {
|
|
731
|
+
uri: "file:///image.png",
|
|
732
|
+
blob: "base64encodeddata",
|
|
733
|
+
mimeType: "image/png",
|
|
734
|
+
},
|
|
735
|
+
},
|
|
736
|
+
]);
|
|
737
|
+
});
|
|
738
|
+
it("should include name and resolved content together", () => {
|
|
739
|
+
const resourceNames = {
|
|
740
|
+
"registry:file:///doc.txt": "Important Document",
|
|
741
|
+
};
|
|
742
|
+
const resourceContent = new Map([
|
|
743
|
+
[
|
|
744
|
+
"registry:file:///doc.txt",
|
|
745
|
+
{
|
|
746
|
+
contents: [
|
|
747
|
+
{
|
|
748
|
+
uri: "file:///doc.txt",
|
|
749
|
+
mimeType: "text/plain",
|
|
750
|
+
text: "Document content here",
|
|
751
|
+
},
|
|
752
|
+
],
|
|
753
|
+
},
|
|
754
|
+
],
|
|
755
|
+
]);
|
|
756
|
+
const result = buildMessageContent("@registry:file:///doc.txt", [], resourceNames, resourceContent);
|
|
757
|
+
expect(result).toEqual([
|
|
758
|
+
{
|
|
759
|
+
type: "resource",
|
|
760
|
+
resource: {
|
|
761
|
+
uri: "file:///doc.txt",
|
|
762
|
+
name: "Important Document",
|
|
763
|
+
text: "Document content here",
|
|
764
|
+
mimeType: "text/plain",
|
|
765
|
+
},
|
|
766
|
+
},
|
|
767
|
+
]);
|
|
768
|
+
});
|
|
769
|
+
it("should handle multiple resources with mixed resolved content", () => {
|
|
770
|
+
const resourceContent = new Map([
|
|
771
|
+
[
|
|
772
|
+
"registry:file:///doc1.txt",
|
|
773
|
+
{
|
|
774
|
+
contents: [
|
|
775
|
+
{
|
|
776
|
+
uri: "file:///doc1.txt",
|
|
777
|
+
text: "First doc content",
|
|
778
|
+
},
|
|
779
|
+
],
|
|
780
|
+
},
|
|
781
|
+
],
|
|
782
|
+
// doc2 is NOT in resourceContent - simulates internal server resource
|
|
783
|
+
]);
|
|
784
|
+
const result = buildMessageContent("@registry:file:///doc1.txt and @tambo-abc:tambo://doc2", [], {}, resourceContent);
|
|
785
|
+
expect(result).toEqual([
|
|
786
|
+
{
|
|
787
|
+
type: "resource",
|
|
788
|
+
resource: {
|
|
789
|
+
uri: "file:///doc1.txt",
|
|
790
|
+
text: "First doc content",
|
|
791
|
+
},
|
|
792
|
+
},
|
|
793
|
+
{
|
|
794
|
+
type: "text",
|
|
795
|
+
text: " and ",
|
|
796
|
+
},
|
|
797
|
+
{
|
|
798
|
+
type: "resource",
|
|
799
|
+
resource: {
|
|
800
|
+
uri: "tambo://doc2",
|
|
801
|
+
// No text/blob - internal server resource
|
|
802
|
+
},
|
|
803
|
+
},
|
|
804
|
+
]);
|
|
805
|
+
});
|
|
806
|
+
it("should handle resolved content without mimeType", () => {
|
|
807
|
+
const resourceContent = new Map([
|
|
808
|
+
[
|
|
809
|
+
"server:file:///doc.txt",
|
|
810
|
+
{
|
|
811
|
+
contents: [
|
|
812
|
+
{
|
|
813
|
+
uri: "file:///doc.txt",
|
|
814
|
+
text: "Content without mimeType",
|
|
815
|
+
},
|
|
816
|
+
],
|
|
817
|
+
},
|
|
818
|
+
],
|
|
819
|
+
]);
|
|
820
|
+
const result = buildMessageContent("@server:file:///doc.txt", [], {}, resourceContent);
|
|
821
|
+
expect(result).toEqual([
|
|
822
|
+
{
|
|
823
|
+
type: "resource",
|
|
824
|
+
resource: {
|
|
825
|
+
uri: "file:///doc.txt",
|
|
826
|
+
text: "Content without mimeType",
|
|
827
|
+
},
|
|
828
|
+
},
|
|
829
|
+
]);
|
|
830
|
+
});
|
|
831
|
+
it("should handle empty resourceContent map gracefully", () => {
|
|
832
|
+
const result = buildMessageContent("@registry:file:///doc.txt", [], {}, new Map());
|
|
833
|
+
expect(result).toEqual([
|
|
834
|
+
{
|
|
835
|
+
type: "resource",
|
|
836
|
+
resource: {
|
|
837
|
+
uri: "file:///doc.txt",
|
|
838
|
+
},
|
|
839
|
+
},
|
|
840
|
+
]);
|
|
841
|
+
});
|
|
842
|
+
it("should handle undefined resourceContent gracefully", () => {
|
|
843
|
+
const result = buildMessageContent("@registry:file:///doc.txt", [], {}, undefined);
|
|
844
|
+
expect(result).toEqual([
|
|
845
|
+
{
|
|
846
|
+
type: "resource",
|
|
847
|
+
resource: {
|
|
848
|
+
uri: "file:///doc.txt",
|
|
849
|
+
},
|
|
850
|
+
},
|
|
851
|
+
]);
|
|
852
|
+
});
|
|
853
|
+
it("should handle resolved content with empty contents array", () => {
|
|
854
|
+
const resourceContent = new Map([
|
|
855
|
+
[
|
|
856
|
+
"registry:file:///doc.txt",
|
|
857
|
+
{
|
|
858
|
+
contents: [],
|
|
859
|
+
},
|
|
860
|
+
],
|
|
861
|
+
]);
|
|
862
|
+
const result = buildMessageContent("@registry:file:///doc.txt", [], {}, resourceContent);
|
|
863
|
+
expect(result).toEqual([
|
|
864
|
+
{
|
|
865
|
+
type: "resource",
|
|
866
|
+
resource: {
|
|
867
|
+
uri: "file:///doc.txt",
|
|
868
|
+
},
|
|
869
|
+
},
|
|
870
|
+
]);
|
|
871
|
+
});
|
|
872
|
+
it("should include resolved content with MCP server resources", () => {
|
|
873
|
+
const resourceContent = new Map([
|
|
874
|
+
[
|
|
875
|
+
"linear:linear://issue/123",
|
|
876
|
+
{
|
|
877
|
+
contents: [
|
|
878
|
+
{
|
|
879
|
+
uri: "linear://issue/123",
|
|
880
|
+
mimeType: "application/json",
|
|
881
|
+
text: '{"title": "Bug fix", "status": "open"}',
|
|
882
|
+
},
|
|
883
|
+
],
|
|
884
|
+
},
|
|
885
|
+
],
|
|
886
|
+
]);
|
|
887
|
+
const result = buildMessageContent("Check issue @linear:linear://issue/123", [], {}, resourceContent);
|
|
888
|
+
expect(result).toEqual([
|
|
889
|
+
{
|
|
890
|
+
type: "text",
|
|
891
|
+
text: "Check issue ",
|
|
892
|
+
},
|
|
893
|
+
{
|
|
894
|
+
type: "resource",
|
|
895
|
+
resource: {
|
|
896
|
+
uri: "linear://issue/123",
|
|
897
|
+
text: '{"title": "Bug fix", "status": "open"}',
|
|
898
|
+
mimeType: "application/json",
|
|
899
|
+
},
|
|
900
|
+
},
|
|
901
|
+
]);
|
|
902
|
+
});
|
|
903
|
+
it("should combine resolved content with images", () => {
|
|
904
|
+
const resourceContent = new Map([
|
|
905
|
+
[
|
|
906
|
+
"registry:file:///doc.txt",
|
|
907
|
+
{
|
|
908
|
+
contents: [
|
|
909
|
+
{
|
|
910
|
+
uri: "file:///doc.txt",
|
|
911
|
+
text: "Document content",
|
|
912
|
+
},
|
|
913
|
+
],
|
|
914
|
+
},
|
|
915
|
+
],
|
|
916
|
+
]);
|
|
917
|
+
const images = [
|
|
918
|
+
createMockStagedImage({
|
|
919
|
+
dataUrl: "data:image/png;base64,imagedata",
|
|
920
|
+
}),
|
|
921
|
+
];
|
|
922
|
+
const result = buildMessageContent("Check @registry:file:///doc.txt", images, {}, resourceContent);
|
|
923
|
+
expect(result).toEqual([
|
|
924
|
+
{
|
|
925
|
+
type: "text",
|
|
926
|
+
text: "Check ",
|
|
927
|
+
},
|
|
928
|
+
{
|
|
929
|
+
type: "resource",
|
|
930
|
+
resource: {
|
|
931
|
+
uri: "file:///doc.txt",
|
|
932
|
+
text: "Document content",
|
|
933
|
+
},
|
|
934
|
+
},
|
|
935
|
+
{
|
|
936
|
+
type: "image_url",
|
|
937
|
+
image_url: {
|
|
938
|
+
url: "data:image/png;base64,imagedata",
|
|
939
|
+
},
|
|
940
|
+
},
|
|
941
|
+
]);
|
|
942
|
+
});
|
|
943
|
+
});
|
|
675
944
|
});
|
|
676
945
|
//# sourceMappingURL=message-builder.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-builder.test.js","sourceRoot":"","sources":["../../src/util/message-builder.test.ts"],"names":[],"mappings":"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","sourcesContent":["import type TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { StagedImage } from \"../hooks/use-message-images\";\nimport { buildMessageContent } from \"./message-builder\";\n\ndescribe(\"buildMessageContent\", () => {\n const createMockStagedImage = (\n overrides: Partial<StagedImage> = {},\n ): StagedImage => ({\n id: \"test-id\",\n name: \"test-image.png\",\n dataUrl: \"data:image/png;base64,mock-data\",\n file: new File([\"\"], \"test-image.png\", { type: \"image/png\" }),\n size: 1024,\n type: \"image/png\",\n ...overrides,\n });\n\n it(\"should build content with text only\", () => {\n const result = buildMessageContent(\"Hello world\", [], {});\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Hello world\",\n },\n ]);\n });\n\n it(\"should build content with images only\", () => {\n const image = createMockStagedImage({\n dataUrl: \"data:image/png;base64,abc123\",\n });\n\n const result = buildMessageContent(\"\", [image], {});\n\n expect(result).toEqual([\n {\n type: \"image_url\",\n image_url: {\n url: \"data:image/png;base64,abc123\",\n },\n },\n ]);\n });\n\n it(\"should build content with both text and images\", () => {\n const images = [\n createMockStagedImage({\n id: \"img1\",\n dataUrl: \"data:image/png;base64,abc123\",\n }),\n createMockStagedImage({\n id: \"img2\",\n dataUrl: \"data:image/jpeg;base64,def456\",\n }),\n ];\n\n const result = buildMessageContent(\"Check these images:\", images, {});\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check these images:\",\n },\n {\n type: \"image_url\",\n image_url: {\n url: \"data:image/png;base64,abc123\",\n },\n },\n {\n type: \"image_url\",\n image_url: {\n url: \"data:image/jpeg;base64,def456\",\n },\n },\n ]);\n });\n\n it(\"should preserve leading and trailing whitespace in text\", () => {\n const result = buildMessageContent(\" Hello world \", [], {});\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \" Hello world \",\n },\n ]);\n });\n\n it(\"should skip empty text but keep images\", () => {\n const image = createMockStagedImage();\n const result = buildMessageContent(\" \", [image], {});\n\n expect(result).toEqual([\n {\n type: \"image_url\",\n image_url: {\n url: \"data:image/png;base64,mock-data\",\n },\n },\n ]);\n });\n\n it(\"should handle multiple images correctly\", () => {\n const images = [\n createMockStagedImage({\n id: \"img1\",\n name: \"photo1.jpg\",\n dataUrl: \"data:image/jpeg;base64,photo1data\",\n }),\n createMockStagedImage({\n id: \"img2\",\n name: \"photo2.png\",\n dataUrl: \"data:image/png;base64,photo2data\",\n }),\n createMockStagedImage({\n id: \"img3\",\n name: \"photo3.gif\",\n dataUrl: \"data:image/gif;base64,photo3data\",\n }),\n ];\n\n const result = buildMessageContent(\"Multiple images:\", images, {});\n\n expect(result).toHaveLength(4); // 1 text + 3 images\n expect(result[0]).toEqual({\n type: \"text\",\n text: \"Multiple images:\",\n });\n expect(result[1]).toEqual({\n type: \"image_url\",\n image_url: {\n url: \"data:image/jpeg;base64,photo1data\",\n },\n });\n expect(result[2]).toEqual({\n type: \"image_url\",\n image_url: {\n url: \"data:image/png;base64,photo2data\",\n },\n });\n expect(result[3]).toEqual({\n type: \"image_url\",\n image_url: {\n url: \"data:image/gif;base64,photo3data\",\n },\n });\n });\n\n it(\"should throw error when no content provided\", () => {\n expect(() => {\n buildMessageContent(\"\", [], {});\n }).toThrow(\"Message must contain text or images\");\n });\n\n it(\"should throw error when only whitespace provided\", () => {\n expect(() => {\n buildMessageContent(\" \\n\\t \", [], {});\n }).toThrow(\"Message must contain text or images\");\n });\n\n it(\"should return correct content type structure\", () => {\n const image = createMockStagedImage();\n const result = buildMessageContent(\"Test\", [image], {});\n\n // Verify the structure matches ChatCompletionContentPart interface\n result.forEach((part: TamboAI.Beta.Threads.ChatCompletionContentPart) => {\n expect(part).toHaveProperty(\"type\");\n expect([\"text\", \"image_url\", \"input_audio\"]).toContain(part.type);\n\n if (part.type === \"text\") {\n expect(part).toHaveProperty(\"text\");\n expect(typeof part.text).toBe(\"string\");\n }\n\n if (part.type === \"image_url\") {\n expect(part).toHaveProperty(\"image_url\");\n expect(part.image_url).toHaveProperty(\"url\");\n expect(typeof part.image_url?.url).toBe(\"string\");\n }\n });\n });\n\n it(\"should handle edge case with empty array but valid text\", () => {\n const result = buildMessageContent(\"Just text\", [], {});\n\n expect(result).toHaveLength(1);\n expect(result[0]).toEqual({\n type: \"text\",\n text: \"Just text\",\n });\n });\n\n it(\"should maintain order of text first then images\", () => {\n const images = [\n createMockStagedImage({\n id: \"first\",\n dataUrl: \"data:image/png;base64,first\",\n }),\n createMockStagedImage({\n id: \"second\",\n dataUrl: \"data:image/png;base64,second\",\n }),\n ];\n\n const result = buildMessageContent(\"Text content\", images, {});\n\n expect(result[0].type).toBe(\"text\");\n expect(result[1].type).toBe(\"image_url\");\n expect(result[2].type).toBe(\"image_url\");\n\n if (result[1].type === \"image_url\") {\n expect(result[1].image_url?.url).toBe(\"data:image/png;base64,first\");\n }\n if (result[2].type === \"image_url\") {\n expect(result[2].image_url?.url).toBe(\"data:image/png;base64,second\");\n }\n });\n\n describe(\"resource parsing\", () => {\n it(\"should parse a single resource reference\", () => {\n const result = buildMessageContent(\n \"Check @tambo-1hfs429:tambo:test://static/resource/1\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n ]);\n });\n\n it(\"should parse resource reference at the start of text\", () => {\n const result = buildMessageContent(\n \"@tambo-1hfs429:tambo:test://static/resource/1 check this\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" check this\",\n },\n ]);\n });\n\n it(\"should parse resource reference at the end of text\", () => {\n const result = buildMessageContent(\n \"Check this @tambo-1hfs429:tambo:test://static/resource/1\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check this \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n ]);\n });\n\n it(\"should parse resource reference with name from resourceNames map\", () => {\n const resourceNames = {\n \"tambo-1hfs429:tambo:test://static/resource/1\": \"Documentation.pdf\",\n };\n\n const result = buildMessageContent(\n \"Check @tambo-1hfs429:tambo:test://static/resource/1\",\n [],\n resourceNames,\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n name: \"Documentation.pdf\",\n },\n },\n ]);\n });\n\n it(\"should parse resource reference without name when not in resourceNames map\", () => {\n const resourceNames = {\n \"other-server:other-uri\": \"Other Resource\",\n };\n\n const result = buildMessageContent(\n \"Check @tambo-1hfs429:tambo:test://static/resource/1\",\n [],\n resourceNames,\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n ]);\n });\n\n it(\"should parse multiple resource references\", () => {\n const result = buildMessageContent(\n \"Check @tambo-1hfs429:tambo:test://static/resource/1 and @tambo-1hfs429:tambo:test://static/resource/2\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" and \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/2\",\n },\n },\n ]);\n });\n\n it(\"should preserve whitespace between consecutive resource references\", () => {\n const result = buildMessageContent(\n \"@tambo-1hfs429:tambo:test://static/resource/1 @tambo-1hfs429:tambo:test://static/resource/2\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/2\",\n },\n },\n ]);\n });\n\n it(\"should parse resources with text before, between, and after\", () => {\n const result = buildMessageContent(\n \"Before @tambo-1hfs429:tambo:test://static/resource/1 middle @linear:file://path/to/file.txt after\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Before \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" middle \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"file://path/to/file.txt\",\n },\n },\n {\n type: \"text\",\n text: \" after\",\n },\n ]);\n });\n\n it(\"should parse resources from different server keys\", () => {\n const result = buildMessageContent(\n \"@tambo-1hfs429:tambo:test://static/resource/1 and @linear:linear://issue/123\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" and \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"linear://issue/123\",\n },\n },\n ]);\n });\n\n it(\"should parse resources with various URI formats and preserve whitespace\", () => {\n const result = buildMessageContent(\n \"@server1:file:///path/to/file.txt @server2:https://example.com/doc.pdf @server3:s3://bucket/key.json\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"file:///path/to/file.txt\",\n },\n },\n {\n type: \"text\",\n text: \" \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"https://example.com/doc.pdf\",\n },\n },\n {\n type: \"text\",\n text: \" \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"s3://bucket/key.json\",\n },\n },\n ]);\n });\n\n it(\"should parse resources with hyphens in server key\", () => {\n const result = buildMessageContent(\n \"@my-server-123:file:///path/to/file.txt\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"file:///path/to/file.txt\",\n },\n },\n ]);\n });\n\n it(\"should parse resources with numbers in server key\", () => {\n const result = buildMessageContent(\n \"@server123:tambo:test://static/resource/1\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n ]);\n });\n\n it(\"should preserve whitespace in text segments around resource references\", () => {\n const result = buildMessageContent(\n \" Before @tambo-1hfs429:tambo:test://static/resource/1 After \",\n [],\n {},\n );\n expect(result).toEqual([\n {\n type: \"text\",\n text: \" Before \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" After \",\n },\n ]);\n });\n\n it(\"should handle resource with only whitespace text segments\", () => {\n const result = buildMessageContent(\n \" @tambo-1hfs429:tambo:test://static/resource/1 \",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \" \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" \",\n },\n ]);\n });\n\n it(\"should preserve newlines and spaces around resource references\", () => {\n const result = buildMessageContent(\n \"\\n @tambo-1hfs429:tambo:test://static/resource/1 text\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"\\n \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" text\",\n },\n ]);\n });\n\n it(\"should parse resource-only message without text\", () => {\n const result = buildMessageContent(\n \"@tambo-1hfs429:tambo:test://static/resource/1\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n ]);\n });\n\n it(\"should parse multiple resources with names\", () => {\n const resourceNames = {\n \"tambo-1hfs429:tambo:test://static/resource/1\": \"First Resource\",\n \"tambo-1hfs429:tambo:test://static/resource/2\": \"Second Resource\",\n };\n\n const result = buildMessageContent(\n \"Check @tambo-1hfs429:tambo:test://static/resource/1 and @tambo-1hfs429:tambo:test://static/resource/2\",\n [],\n resourceNames,\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n name: \"First Resource\",\n },\n },\n {\n type: \"text\",\n text: \" and \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/2\",\n name: \"Second Resource\",\n },\n },\n ]);\n });\n\n it(\"should parse resources mixed with images\", () => {\n const images = [\n createMockStagedImage({\n id: \"img1\",\n dataUrl: \"data:image/png;base64,abc123\",\n }),\n ];\n\n const result = buildMessageContent(\n \"Check @tambo-1hfs429:tambo:test://static/resource/1\",\n images,\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"image_url\",\n image_url: {\n url: \"data:image/png;base64,abc123\",\n },\n },\n ]);\n });\n\n it(\"should parse resources and images with proper ordering\", () => {\n const images = [\n createMockStagedImage({\n id: \"img1\",\n dataUrl: \"data:image/png;base64,img1\",\n }),\n createMockStagedImage({\n id: \"img2\",\n dataUrl: \"data:image/jpeg;base64,img2\",\n }),\n ];\n\n const result = buildMessageContent(\n \"Text @tambo-1hfs429:tambo:test://static/resource/1 more text\",\n images,\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Text \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" more text\",\n },\n {\n type: \"image_url\",\n image_url: {\n url: \"data:image/png;base64,img1\",\n },\n },\n {\n type: \"image_url\",\n image_url: {\n url: \"data:image/jpeg;base64,img2\",\n },\n },\n ]);\n });\n\n it(\"should parse resource reference with URI containing colons\", () => {\n const result = buildMessageContent(\n \"@server:http://example.com:8080/path\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"http://example.com:8080/path\",\n },\n },\n ]);\n });\n\n it(\"should parse resource reference with URI containing special characters\", () => {\n const result = buildMessageContent(\n \"@server:file:///path/to/file%20with%20spaces.txt\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"file:///path/to/file%20with%20spaces.txt\",\n },\n },\n ]);\n });\n\n it(\"should not parse @ symbol without server key and colon\", () => {\n const result = buildMessageContent(\n \"Mention @user but not a resource\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Mention @user but not a resource\",\n },\n ]);\n });\n\n it(\"should not parse malformed resource reference missing colon\", () => {\n const result = buildMessageContent(\n \"@serverkey-missing-colon resource\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"@serverkey-missing-colon resource\",\n },\n ]);\n });\n\n it(\"should not parse resource reference with space before colon\", () => {\n const result = buildMessageContent(\"@server key :uri\", [], {});\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"@server key :uri\",\n },\n ]);\n });\n\n it(\"should preserve multiple whitespace characters between consecutive resources\", () => {\n const result = buildMessageContent(\n \"@tambo-1hfs429:tambo:test://static/resource/1 @tambo-1hfs429:tambo:test://static/resource/2\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/2\",\n },\n },\n ]);\n });\n\n it(\"should parse resource with only URI and no surrounding text\", () => {\n const result = buildMessageContent(\n \"@tambo-1hfs429:tambo:test://static/resource/1\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n ]);\n });\n\n it(\"should throw error when only resources with empty text segments\", () => {\n // This should work - resources alone should be valid\n const result = buildMessageContent(\n \"@tambo-1hfs429:tambo:test://static/resource/1\",\n [],\n {},\n );\n\n expect(result.length).toBeGreaterThan(0);\n expect(result[0].type).toBe(\"resource\");\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"message-builder.test.js","sourceRoot":"","sources":["../../src/util/message-builder.test.ts"],"names":[],"mappings":"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","sourcesContent":["import type TamboAI from \"@tambo-ai/typescript-sdk\";\nimport { StagedImage } from \"../hooks/use-message-images\";\nimport { buildMessageContent } from \"./message-builder\";\n\ndescribe(\"buildMessageContent\", () => {\n const createMockStagedImage = (\n overrides: Partial<StagedImage> = {},\n ): StagedImage => ({\n id: \"test-id\",\n name: \"test-image.png\",\n dataUrl: \"data:image/png;base64,mock-data\",\n file: new File([\"\"], \"test-image.png\", { type: \"image/png\" }),\n size: 1024,\n type: \"image/png\",\n ...overrides,\n });\n\n it(\"should build content with text only\", () => {\n const result = buildMessageContent(\"Hello world\", [], {});\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Hello world\",\n },\n ]);\n });\n\n it(\"should build content with images only\", () => {\n const image = createMockStagedImage({\n dataUrl: \"data:image/png;base64,abc123\",\n });\n\n const result = buildMessageContent(\"\", [image], {});\n\n expect(result).toEqual([\n {\n type: \"image_url\",\n image_url: {\n url: \"data:image/png;base64,abc123\",\n },\n },\n ]);\n });\n\n it(\"should build content with both text and images\", () => {\n const images = [\n createMockStagedImage({\n id: \"img1\",\n dataUrl: \"data:image/png;base64,abc123\",\n }),\n createMockStagedImage({\n id: \"img2\",\n dataUrl: \"data:image/jpeg;base64,def456\",\n }),\n ];\n\n const result = buildMessageContent(\"Check these images:\", images, {});\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check these images:\",\n },\n {\n type: \"image_url\",\n image_url: {\n url: \"data:image/png;base64,abc123\",\n },\n },\n {\n type: \"image_url\",\n image_url: {\n url: \"data:image/jpeg;base64,def456\",\n },\n },\n ]);\n });\n\n it(\"should preserve leading and trailing whitespace in text\", () => {\n const result = buildMessageContent(\" Hello world \", [], {});\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \" Hello world \",\n },\n ]);\n });\n\n it(\"should skip empty text but keep images\", () => {\n const image = createMockStagedImage();\n const result = buildMessageContent(\" \", [image], {});\n\n expect(result).toEqual([\n {\n type: \"image_url\",\n image_url: {\n url: \"data:image/png;base64,mock-data\",\n },\n },\n ]);\n });\n\n it(\"should handle multiple images correctly\", () => {\n const images = [\n createMockStagedImage({\n id: \"img1\",\n name: \"photo1.jpg\",\n dataUrl: \"data:image/jpeg;base64,photo1data\",\n }),\n createMockStagedImage({\n id: \"img2\",\n name: \"photo2.png\",\n dataUrl: \"data:image/png;base64,photo2data\",\n }),\n createMockStagedImage({\n id: \"img3\",\n name: \"photo3.gif\",\n dataUrl: \"data:image/gif;base64,photo3data\",\n }),\n ];\n\n const result = buildMessageContent(\"Multiple images:\", images, {});\n\n expect(result).toHaveLength(4); // 1 text + 3 images\n expect(result[0]).toEqual({\n type: \"text\",\n text: \"Multiple images:\",\n });\n expect(result[1]).toEqual({\n type: \"image_url\",\n image_url: {\n url: \"data:image/jpeg;base64,photo1data\",\n },\n });\n expect(result[2]).toEqual({\n type: \"image_url\",\n image_url: {\n url: \"data:image/png;base64,photo2data\",\n },\n });\n expect(result[3]).toEqual({\n type: \"image_url\",\n image_url: {\n url: \"data:image/gif;base64,photo3data\",\n },\n });\n });\n\n it(\"should throw error when no content provided\", () => {\n expect(() => {\n buildMessageContent(\"\", [], {});\n }).toThrow(\"Message must contain text or images\");\n });\n\n it(\"should throw error when only whitespace provided\", () => {\n expect(() => {\n buildMessageContent(\" \\n\\t \", [], {});\n }).toThrow(\"Message must contain text or images\");\n });\n\n it(\"should return correct content type structure\", () => {\n const image = createMockStagedImage();\n const result = buildMessageContent(\"Test\", [image], {});\n\n // Verify the structure matches ChatCompletionContentPart interface\n result.forEach((part: TamboAI.Beta.Threads.ChatCompletionContentPart) => {\n expect(part).toHaveProperty(\"type\");\n expect([\"text\", \"image_url\", \"input_audio\"]).toContain(part.type);\n\n if (part.type === \"text\") {\n expect(part).toHaveProperty(\"text\");\n expect(typeof part.text).toBe(\"string\");\n }\n\n if (part.type === \"image_url\") {\n expect(part).toHaveProperty(\"image_url\");\n expect(part.image_url).toHaveProperty(\"url\");\n expect(typeof part.image_url?.url).toBe(\"string\");\n }\n });\n });\n\n it(\"should handle edge case with empty array but valid text\", () => {\n const result = buildMessageContent(\"Just text\", [], {});\n\n expect(result).toHaveLength(1);\n expect(result[0]).toEqual({\n type: \"text\",\n text: \"Just text\",\n });\n });\n\n it(\"should maintain order of text first then images\", () => {\n const images = [\n createMockStagedImage({\n id: \"first\",\n dataUrl: \"data:image/png;base64,first\",\n }),\n createMockStagedImage({\n id: \"second\",\n dataUrl: \"data:image/png;base64,second\",\n }),\n ];\n\n const result = buildMessageContent(\"Text content\", images, {});\n\n expect(result[0].type).toBe(\"text\");\n expect(result[1].type).toBe(\"image_url\");\n expect(result[2].type).toBe(\"image_url\");\n\n if (result[1].type === \"image_url\") {\n expect(result[1].image_url?.url).toBe(\"data:image/png;base64,first\");\n }\n if (result[2].type === \"image_url\") {\n expect(result[2].image_url?.url).toBe(\"data:image/png;base64,second\");\n }\n });\n\n describe(\"resource parsing\", () => {\n it(\"should parse a single resource reference\", () => {\n const result = buildMessageContent(\n \"Check @tambo-1hfs429:tambo:test://static/resource/1\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n ]);\n });\n\n it(\"should parse resource reference at the start of text\", () => {\n const result = buildMessageContent(\n \"@tambo-1hfs429:tambo:test://static/resource/1 check this\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" check this\",\n },\n ]);\n });\n\n it(\"should parse resource reference at the end of text\", () => {\n const result = buildMessageContent(\n \"Check this @tambo-1hfs429:tambo:test://static/resource/1\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check this \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n ]);\n });\n\n it(\"should parse resource reference with name from resourceNames map\", () => {\n const resourceNames = {\n \"tambo-1hfs429:tambo:test://static/resource/1\": \"Documentation.pdf\",\n };\n\n const result = buildMessageContent(\n \"Check @tambo-1hfs429:tambo:test://static/resource/1\",\n [],\n resourceNames,\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n name: \"Documentation.pdf\",\n },\n },\n ]);\n });\n\n it(\"should parse resource reference without name when not in resourceNames map\", () => {\n const resourceNames = {\n \"other-server:other-uri\": \"Other Resource\",\n };\n\n const result = buildMessageContent(\n \"Check @tambo-1hfs429:tambo:test://static/resource/1\",\n [],\n resourceNames,\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n ]);\n });\n\n it(\"should parse multiple resource references\", () => {\n const result = buildMessageContent(\n \"Check @tambo-1hfs429:tambo:test://static/resource/1 and @tambo-1hfs429:tambo:test://static/resource/2\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" and \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/2\",\n },\n },\n ]);\n });\n\n it(\"should preserve whitespace between consecutive resource references\", () => {\n const result = buildMessageContent(\n \"@tambo-1hfs429:tambo:test://static/resource/1 @tambo-1hfs429:tambo:test://static/resource/2\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/2\",\n },\n },\n ]);\n });\n\n it(\"should parse resources with text before, between, and after\", () => {\n const result = buildMessageContent(\n \"Before @tambo-1hfs429:tambo:test://static/resource/1 middle @linear:file://path/to/file.txt after\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Before \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" middle \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"file://path/to/file.txt\",\n },\n },\n {\n type: \"text\",\n text: \" after\",\n },\n ]);\n });\n\n it(\"should parse resources from different server keys\", () => {\n const result = buildMessageContent(\n \"@tambo-1hfs429:tambo:test://static/resource/1 and @linear:linear://issue/123\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" and \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"linear://issue/123\",\n },\n },\n ]);\n });\n\n it(\"should parse resources with various URI formats and preserve whitespace\", () => {\n const result = buildMessageContent(\n \"@server1:file:///path/to/file.txt @server2:https://example.com/doc.pdf @server3:s3://bucket/key.json\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"file:///path/to/file.txt\",\n },\n },\n {\n type: \"text\",\n text: \" \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"https://example.com/doc.pdf\",\n },\n },\n {\n type: \"text\",\n text: \" \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"s3://bucket/key.json\",\n },\n },\n ]);\n });\n\n it(\"should parse resources with hyphens in server key\", () => {\n const result = buildMessageContent(\n \"@my-server-123:file:///path/to/file.txt\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"file:///path/to/file.txt\",\n },\n },\n ]);\n });\n\n it(\"should parse resources with numbers in server key\", () => {\n const result = buildMessageContent(\n \"@server123:tambo:test://static/resource/1\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n ]);\n });\n\n it(\"should preserve whitespace in text segments around resource references\", () => {\n const result = buildMessageContent(\n \" Before @tambo-1hfs429:tambo:test://static/resource/1 After \",\n [],\n {},\n );\n expect(result).toEqual([\n {\n type: \"text\",\n text: \" Before \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" After \",\n },\n ]);\n });\n\n it(\"should handle resource with only whitespace text segments\", () => {\n const result = buildMessageContent(\n \" @tambo-1hfs429:tambo:test://static/resource/1 \",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \" \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" \",\n },\n ]);\n });\n\n it(\"should preserve newlines and spaces around resource references\", () => {\n const result = buildMessageContent(\n \"\\n @tambo-1hfs429:tambo:test://static/resource/1 text\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"\\n \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" text\",\n },\n ]);\n });\n\n it(\"should parse resource-only message without text\", () => {\n const result = buildMessageContent(\n \"@tambo-1hfs429:tambo:test://static/resource/1\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n ]);\n });\n\n it(\"should parse multiple resources with names\", () => {\n const resourceNames = {\n \"tambo-1hfs429:tambo:test://static/resource/1\": \"First Resource\",\n \"tambo-1hfs429:tambo:test://static/resource/2\": \"Second Resource\",\n };\n\n const result = buildMessageContent(\n \"Check @tambo-1hfs429:tambo:test://static/resource/1 and @tambo-1hfs429:tambo:test://static/resource/2\",\n [],\n resourceNames,\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n name: \"First Resource\",\n },\n },\n {\n type: \"text\",\n text: \" and \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/2\",\n name: \"Second Resource\",\n },\n },\n ]);\n });\n\n it(\"should parse resources mixed with images\", () => {\n const images = [\n createMockStagedImage({\n id: \"img1\",\n dataUrl: \"data:image/png;base64,abc123\",\n }),\n ];\n\n const result = buildMessageContent(\n \"Check @tambo-1hfs429:tambo:test://static/resource/1\",\n images,\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"image_url\",\n image_url: {\n url: \"data:image/png;base64,abc123\",\n },\n },\n ]);\n });\n\n it(\"should parse resources and images with proper ordering\", () => {\n const images = [\n createMockStagedImage({\n id: \"img1\",\n dataUrl: \"data:image/png;base64,img1\",\n }),\n createMockStagedImage({\n id: \"img2\",\n dataUrl: \"data:image/jpeg;base64,img2\",\n }),\n ];\n\n const result = buildMessageContent(\n \"Text @tambo-1hfs429:tambo:test://static/resource/1 more text\",\n images,\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Text \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" more text\",\n },\n {\n type: \"image_url\",\n image_url: {\n url: \"data:image/png;base64,img1\",\n },\n },\n {\n type: \"image_url\",\n image_url: {\n url: \"data:image/jpeg;base64,img2\",\n },\n },\n ]);\n });\n\n it(\"should parse resource reference with URI containing colons\", () => {\n const result = buildMessageContent(\n \"@server:http://example.com:8080/path\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"http://example.com:8080/path\",\n },\n },\n ]);\n });\n\n it(\"should parse resource reference with URI containing special characters\", () => {\n const result = buildMessageContent(\n \"@server:file:///path/to/file%20with%20spaces.txt\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"file:///path/to/file%20with%20spaces.txt\",\n },\n },\n ]);\n });\n\n it(\"should not parse @ symbol without server key and colon\", () => {\n const result = buildMessageContent(\n \"Mention @user but not a resource\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Mention @user but not a resource\",\n },\n ]);\n });\n\n it(\"should not parse malformed resource reference missing colon\", () => {\n const result = buildMessageContent(\n \"@serverkey-missing-colon resource\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"@serverkey-missing-colon resource\",\n },\n ]);\n });\n\n it(\"should not parse resource reference with space before colon\", () => {\n const result = buildMessageContent(\"@server key :uri\", [], {});\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"@server key :uri\",\n },\n ]);\n });\n\n it(\"should preserve multiple whitespace characters between consecutive resources\", () => {\n const result = buildMessageContent(\n \"@tambo-1hfs429:tambo:test://static/resource/1 @tambo-1hfs429:tambo:test://static/resource/2\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n {\n type: \"text\",\n text: \" \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/2\",\n },\n },\n ]);\n });\n\n it(\"should parse resource with only URI and no surrounding text\", () => {\n const result = buildMessageContent(\n \"@tambo-1hfs429:tambo:test://static/resource/1\",\n [],\n {},\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"tambo:test://static/resource/1\",\n },\n },\n ]);\n });\n\n it(\"should throw error when only resources with empty text segments\", () => {\n // This should work - resources alone should be valid\n const result = buildMessageContent(\n \"@tambo-1hfs429:tambo:test://static/resource/1\",\n [],\n {},\n );\n\n expect(result.length).toBeGreaterThan(0);\n expect(result[0].type).toBe(\"resource\");\n });\n });\n\n describe(\"resource content resolution\", () => {\n it(\"should include text content from resolved resource\", () => {\n const resourceContent = new Map([\n [\n \"registry:file:///doc.txt\",\n {\n contents: [\n {\n uri: \"file:///doc.txt\",\n mimeType: \"text/plain\",\n text: \"This is the document content\",\n },\n ],\n },\n ],\n ]);\n\n const result = buildMessageContent(\n \"Check @registry:file:///doc.txt\",\n [],\n {},\n resourceContent,\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"file:///doc.txt\",\n text: \"This is the document content\",\n mimeType: \"text/plain\",\n },\n },\n ]);\n });\n\n it(\"should include blob content from resolved resource\", () => {\n const resourceContent = new Map([\n [\n \"registry:file:///image.png\",\n {\n contents: [\n {\n uri: \"file:///image.png\",\n mimeType: \"image/png\",\n blob: \"base64encodeddata\",\n },\n ],\n },\n ],\n ]);\n\n const result = buildMessageContent(\n \"Check @registry:file:///image.png\",\n [],\n {},\n resourceContent,\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"file:///image.png\",\n blob: \"base64encodeddata\",\n mimeType: \"image/png\",\n },\n },\n ]);\n });\n\n it(\"should include name and resolved content together\", () => {\n const resourceNames = {\n \"registry:file:///doc.txt\": \"Important Document\",\n };\n const resourceContent = new Map([\n [\n \"registry:file:///doc.txt\",\n {\n contents: [\n {\n uri: \"file:///doc.txt\",\n mimeType: \"text/plain\",\n text: \"Document content here\",\n },\n ],\n },\n ],\n ]);\n\n const result = buildMessageContent(\n \"@registry:file:///doc.txt\",\n [],\n resourceNames,\n resourceContent,\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"file:///doc.txt\",\n name: \"Important Document\",\n text: \"Document content here\",\n mimeType: \"text/plain\",\n },\n },\n ]);\n });\n\n it(\"should handle multiple resources with mixed resolved content\", () => {\n const resourceContent = new Map([\n [\n \"registry:file:///doc1.txt\",\n {\n contents: [\n {\n uri: \"file:///doc1.txt\",\n text: \"First doc content\",\n },\n ],\n },\n ],\n // doc2 is NOT in resourceContent - simulates internal server resource\n ]);\n\n const result = buildMessageContent(\n \"@registry:file:///doc1.txt and @tambo-abc:tambo://doc2\",\n [],\n {},\n resourceContent,\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"file:///doc1.txt\",\n text: \"First doc content\",\n },\n },\n {\n type: \"text\",\n text: \" and \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"tambo://doc2\",\n // No text/blob - internal server resource\n },\n },\n ]);\n });\n\n it(\"should handle resolved content without mimeType\", () => {\n const resourceContent = new Map([\n [\n \"server:file:///doc.txt\",\n {\n contents: [\n {\n uri: \"file:///doc.txt\",\n text: \"Content without mimeType\",\n },\n ],\n },\n ],\n ]);\n\n const result = buildMessageContent(\n \"@server:file:///doc.txt\",\n [],\n {},\n resourceContent,\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"file:///doc.txt\",\n text: \"Content without mimeType\",\n },\n },\n ]);\n });\n\n it(\"should handle empty resourceContent map gracefully\", () => {\n const result = buildMessageContent(\n \"@registry:file:///doc.txt\",\n [],\n {},\n new Map(),\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"file:///doc.txt\",\n },\n },\n ]);\n });\n\n it(\"should handle undefined resourceContent gracefully\", () => {\n const result = buildMessageContent(\n \"@registry:file:///doc.txt\",\n [],\n {},\n undefined,\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"file:///doc.txt\",\n },\n },\n ]);\n });\n\n it(\"should handle resolved content with empty contents array\", () => {\n const resourceContent = new Map([\n [\n \"registry:file:///doc.txt\",\n {\n contents: [],\n },\n ],\n ]);\n\n const result = buildMessageContent(\n \"@registry:file:///doc.txt\",\n [],\n {},\n resourceContent,\n );\n\n expect(result).toEqual([\n {\n type: \"resource\",\n resource: {\n uri: \"file:///doc.txt\",\n },\n },\n ]);\n });\n\n it(\"should include resolved content with MCP server resources\", () => {\n const resourceContent = new Map([\n [\n \"linear:linear://issue/123\",\n {\n contents: [\n {\n uri: \"linear://issue/123\",\n mimeType: \"application/json\",\n text: '{\"title\": \"Bug fix\", \"status\": \"open\"}',\n },\n ],\n },\n ],\n ]);\n\n const result = buildMessageContent(\n \"Check issue @linear:linear://issue/123\",\n [],\n {},\n resourceContent,\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check issue \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"linear://issue/123\",\n text: '{\"title\": \"Bug fix\", \"status\": \"open\"}',\n mimeType: \"application/json\",\n },\n },\n ]);\n });\n\n it(\"should combine resolved content with images\", () => {\n const resourceContent = new Map([\n [\n \"registry:file:///doc.txt\",\n {\n contents: [\n {\n uri: \"file:///doc.txt\",\n text: \"Document content\",\n },\n ],\n },\n ],\n ]);\n\n const images = [\n createMockStagedImage({\n dataUrl: \"data:image/png;base64,imagedata\",\n }),\n ];\n\n const result = buildMessageContent(\n \"Check @registry:file:///doc.txt\",\n images,\n {},\n resourceContent,\n );\n\n expect(result).toEqual([\n {\n type: \"text\",\n text: \"Check \",\n },\n {\n type: \"resource\",\n resource: {\n uri: \"file:///doc.txt\",\n text: \"Document content\",\n },\n },\n {\n type: \"image_url\",\n image_url: {\n url: \"data:image/png;base64,imagedata\",\n },\n },\n ]);\n });\n });\n});\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-utils.test.d.ts","sourceRoot":"","sources":["../../src/util/query-utils.test.ts"],"names":[],"mappings":""}
|