@tambo-ai/react 0.67.0 → 0.68.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/LICENSE +21 -0
- package/README.md +2 -4
- package/dist/context-helpers/current-interactables-context-helper.d.ts.map +1 -1
- package/dist/context-helpers/current-interactables-context-helper.js +4 -1
- package/dist/context-helpers/current-interactables-context-helper.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-tambo-threads.d.ts +3 -8
- package/dist/hooks/use-tambo-threads.d.ts.map +1 -1
- package/dist/hooks/use-tambo-threads.js +5 -3
- package/dist/hooks/use-tambo-threads.js.map +1 -1
- package/dist/hooks/use-tambo-threads.test.js +12 -2
- package/dist/hooks/use-tambo-threads.test.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 +32 -3
- package/dist/mcp/mcp-hooks.d.ts.map +1 -1
- package/dist/mcp/mcp-hooks.js +40 -29
- package/dist/mcp/mcp-hooks.js.map +1 -1
- package/dist/mcp/mcp-hooks.test.js +8 -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 +202 -155
- package/dist/mcp/tambo-mcp-provider.js.map +1 -1
- package/dist/model/component-metadata.d.ts +1 -1
- 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 +7 -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/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 +3 -2
- package/dist/providers/tambo-interactable-provider.d.ts.map +1 -1
- package/dist/providers/tambo-interactable-provider.js +98 -14
- 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-provider.d.ts +1 -2
- package/dist/providers/tambo-provider.d.ts.map +1 -1
- package/dist/providers/tambo-provider.js +10 -8
- package/dist/providers/tambo-provider.js.map +1 -1
- package/dist/providers/tambo-stubs.d.ts.map +1 -1
- package/dist/providers/tambo-stubs.js +1 -0
- package/dist/providers/tambo-stubs.js.map +1 -1
- package/dist/providers/tambo-stubs.test.js +1 -1
- package/dist/providers/tambo-stubs.test.js.map +1 -1
- package/dist/providers/tambo-thread-input-provider.d.ts +1 -6
- package/dist/providers/tambo-thread-input-provider.d.ts.map +1 -1
- package/dist/providers/tambo-thread-input-provider.js +25 -8
- package/dist/providers/tambo-thread-input-provider.js.map +1 -1
- package/dist/providers/tambo-thread-provider.d.ts +5 -0
- package/dist/providers/tambo-thread-provider.d.ts.map +1 -1
- package/dist/providers/tambo-thread-provider.js +5 -2
- package/dist/providers/tambo-thread-provider.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 +11 -0
- 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/setupTests.js +3 -0
- package/dist/setupTests.js.map +1 -1
- 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/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/esm/context-helpers/current-interactables-context-helper.d.ts.map +1 -1
- package/esm/context-helpers/current-interactables-context-helper.js +4 -1
- package/esm/context-helpers/current-interactables-context-helper.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-tambo-threads.d.ts +3 -8
- package/esm/hooks/use-tambo-threads.d.ts.map +1 -1
- package/esm/hooks/use-tambo-threads.js +5 -3
- package/esm/hooks/use-tambo-threads.js.map +1 -1
- package/esm/hooks/use-tambo-threads.test.js +12 -2
- package/esm/hooks/use-tambo-threads.test.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 +32 -3
- package/esm/mcp/mcp-hooks.d.ts.map +1 -1
- package/esm/mcp/mcp-hooks.js +40 -30
- package/esm/mcp/mcp-hooks.js.map +1 -1
- package/esm/mcp/mcp-hooks.test.js +8 -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 +201 -154
- package/esm/mcp/tambo-mcp-provider.js.map +1 -1
- package/esm/model/component-metadata.d.ts +1 -1
- 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 +7 -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/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 +3 -2
- package/esm/providers/tambo-interactable-provider.d.ts.map +1 -1
- package/esm/providers/tambo-interactable-provider.js +98 -14
- 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-provider.d.ts +1 -2
- package/esm/providers/tambo-provider.d.ts.map +1 -1
- package/esm/providers/tambo-provider.js +11 -9
- package/esm/providers/tambo-provider.js.map +1 -1
- package/esm/providers/tambo-stubs.d.ts.map +1 -1
- package/esm/providers/tambo-stubs.js +1 -0
- package/esm/providers/tambo-stubs.js.map +1 -1
- package/esm/providers/tambo-stubs.test.js +1 -1
- package/esm/providers/tambo-stubs.test.js.map +1 -1
- package/esm/providers/tambo-thread-input-provider.d.ts +1 -6
- package/esm/providers/tambo-thread-input-provider.d.ts.map +1 -1
- package/esm/providers/tambo-thread-input-provider.js +25 -8
- package/esm/providers/tambo-thread-input-provider.js.map +1 -1
- package/esm/providers/tambo-thread-provider.d.ts +5 -0
- package/esm/providers/tambo-thread-provider.d.ts.map +1 -1
- package/esm/providers/tambo-thread-provider.js +5 -2
- package/esm/providers/tambo-thread-provider.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 +10 -0
- 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/setupTests.js +3 -0
- package/esm/setupTests.js.map +1 -1
- 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/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/package.json +8 -6
|
@@ -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,20 @@
|
|
|
1
|
+
import type { ReadResourceResult } from "@modelcontextprotocol/sdk/types.js";
|
|
2
|
+
import type { McpServer } from "../mcp/tambo-mcp-provider";
|
|
3
|
+
import type { ResourceSource } from "../model/resource-info";
|
|
4
|
+
/**
|
|
5
|
+
* Resolves content for client-side resources (MCP and registry).
|
|
6
|
+
* Server-side (internal Tambo) resources are skipped - the backend can resolve them.
|
|
7
|
+
* @param resourceUris - Prefixed URIs (e.g., "linear:file://foo", "registry:file://bar", "tambo-abc:test://resource")
|
|
8
|
+
* @param mcpServers - Active MCP servers including virtual registry server
|
|
9
|
+
* @param resourceSource - Registry resource source (listResources/getResource)
|
|
10
|
+
* @returns Map of prefixedUri -> ReadResourceResult for resolved resources.
|
|
11
|
+
* Resources that failed to fetch or are internal server resources won't be in the map.
|
|
12
|
+
*/
|
|
13
|
+
export declare function resolveResourceContents(resourceUris: string[], mcpServers: McpServer[], resourceSource: ResourceSource | undefined): Promise<Map<string, ReadResourceResult>>;
|
|
14
|
+
/**
|
|
15
|
+
* Extracts resource URIs from text using the `@serverKey:uri` pattern.
|
|
16
|
+
* @param text - Text potentially containing resource references
|
|
17
|
+
* @returns Array of prefixed resource URIs (e.g., ["linear:file://foo", "registry:file://bar"])
|
|
18
|
+
*/
|
|
19
|
+
export declare function extractResourceUris(text: string): string[];
|
|
20
|
+
//# sourceMappingURL=resource-content-resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-content-resolver.d.ts","sourceRoot":"","sources":["../../src/util/resource-content-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAE7E,OAAO,KAAK,EAAsB,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAU7D;;;;;;;;GAQG;AACH,wBAAsB,uBAAuB,CAC3C,YAAY,EAAE,MAAM,EAAE,EACtB,UAAU,EAAE,SAAS,EAAE,EACvB,cAAc,EAAE,cAAc,GAAG,SAAS,GACzC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC,CAyE1C;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAI1D"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveResourceContents = resolveResourceContents;
|
|
4
|
+
exports.extractResourceUris = extractResourceUris;
|
|
5
|
+
const mcp_constants_1 = require("../mcp/mcp-constants");
|
|
6
|
+
/**
|
|
7
|
+
* Type guard for narrowing McpServer to a connected server.
|
|
8
|
+
* A connected server has a non-null client.
|
|
9
|
+
*/
|
|
10
|
+
function isConnectedMcpServer(server) {
|
|
11
|
+
return "client" in server && server.client != null;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Resolves content for client-side resources (MCP and registry).
|
|
15
|
+
* Server-side (internal Tambo) resources are skipped - the backend can resolve them.
|
|
16
|
+
* @param resourceUris - Prefixed URIs (e.g., "linear:file://foo", "registry:file://bar", "tambo-abc:test://resource")
|
|
17
|
+
* @param mcpServers - Active MCP servers including virtual registry server
|
|
18
|
+
* @param resourceSource - Registry resource source (listResources/getResource)
|
|
19
|
+
* @returns Map of prefixedUri -> ReadResourceResult for resolved resources.
|
|
20
|
+
* Resources that failed to fetch or are internal server resources won't be in the map.
|
|
21
|
+
*/
|
|
22
|
+
async function resolveResourceContents(resourceUris, mcpServers, resourceSource) {
|
|
23
|
+
const results = new Map();
|
|
24
|
+
const fetchPromises = resourceUris.map(async (prefixedUri) => {
|
|
25
|
+
// Parse serverKey and original URI
|
|
26
|
+
// Format: serverKey:originalUri (e.g., "linear:file://foo", "registry:docs://readme")
|
|
27
|
+
const colonIndex = prefixedUri.indexOf(":");
|
|
28
|
+
if (colonIndex === -1)
|
|
29
|
+
return;
|
|
30
|
+
const serverKey = prefixedUri.slice(0, colonIndex);
|
|
31
|
+
const originalUri = prefixedUri.slice(colonIndex + 1);
|
|
32
|
+
try {
|
|
33
|
+
// Handle registry resources directly - no server lookup needed
|
|
34
|
+
// Registry resources are local to the browser and resolved via resourceSource
|
|
35
|
+
if (serverKey === mcp_constants_1.REGISTRY_SERVER_KEY) {
|
|
36
|
+
if (!resourceSource) {
|
|
37
|
+
console.warn(`No resource source available to resolve registry resource: ${prefixedUri}`);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const registryContent = await resourceSource.getResource(originalUri);
|
|
41
|
+
if (registryContent) {
|
|
42
|
+
results.set(prefixedUri, registryContent);
|
|
43
|
+
}
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
// For non-registry resources, find the server by serverKey
|
|
47
|
+
const server = mcpServers.find((s) => s.serverKey === serverKey);
|
|
48
|
+
if (!server) {
|
|
49
|
+
console.warn(`No server found for resource: ${prefixedUri}`);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
switch (server.serverType) {
|
|
53
|
+
case mcp_constants_1.ServerType.TAMBO_INTERNAL:
|
|
54
|
+
// Skip internal server resources - backend can resolve these
|
|
55
|
+
return;
|
|
56
|
+
case mcp_constants_1.ServerType.TAMBO_REGISTRY:
|
|
57
|
+
// Should not reach here since we handle registry above, but keep for safety
|
|
58
|
+
return;
|
|
59
|
+
case mcp_constants_1.ServerType.BROWSER_SIDE: {
|
|
60
|
+
// Client-side MCP resource
|
|
61
|
+
if (!isConnectedMcpServer(server)) {
|
|
62
|
+
console.warn(`MCP server not connected for resource: ${prefixedUri}`);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
const mcpContent = (await server.client.client.readResource({
|
|
66
|
+
uri: originalUri,
|
|
67
|
+
}));
|
|
68
|
+
if (mcpContent) {
|
|
69
|
+
results.set(prefixedUri, mcpContent);
|
|
70
|
+
}
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
// Graceful fallback - log warning and continue without content
|
|
77
|
+
console.warn(`Failed to fetch resource content for ${prefixedUri}:`, error);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
await Promise.all(fetchPromises);
|
|
81
|
+
return results;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Extracts resource URIs from text using the `@serverKey:uri` pattern.
|
|
85
|
+
* @param text - Text potentially containing resource references
|
|
86
|
+
* @returns Array of prefixed resource URIs (e.g., ["linear:file://foo", "registry:file://bar"])
|
|
87
|
+
*/
|
|
88
|
+
function extractResourceUris(text) {
|
|
89
|
+
const pattern = /@([a-zA-Z0-9-]+):(\S+)/g;
|
|
90
|
+
const matches = Array.from(text.matchAll(pattern));
|
|
91
|
+
return matches.map(([, serverKey, uri]) => `${serverKey}:${uri}`);
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=resource-content-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-content-resolver.js","sourceRoot":"","sources":["../../src/util/resource-content-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ReadResourceResult } from \"@modelcontextprotocol/sdk/types.js\";\nimport { REGISTRY_SERVER_KEY, ServerType } from \"../mcp/mcp-constants\";\nimport type { ConnectedMcpServer, McpServer } from \"../mcp/tambo-mcp-provider\";\nimport type { ResourceSource } from \"../model/resource-info\";\n\n/**\n * Type guard for narrowing McpServer to a connected server.\n * A connected server has a non-null client.\n */\nfunction isConnectedMcpServer(server: McpServer): server is ConnectedMcpServer {\n return \"client\" in server && server.client != null;\n}\n\n/**\n * Resolves content for client-side resources (MCP and registry).\n * Server-side (internal Tambo) resources are skipped - the backend can resolve them.\n * @param resourceUris - Prefixed URIs (e.g., \"linear:file://foo\", \"registry:file://bar\", \"tambo-abc:test://resource\")\n * @param mcpServers - Active MCP servers including virtual registry server\n * @param resourceSource - Registry resource source (listResources/getResource)\n * @returns Map of prefixedUri -> ReadResourceResult for resolved resources.\n * Resources that failed to fetch or are internal server resources won't be in the map.\n */\nexport async function resolveResourceContents(\n resourceUris: string[],\n mcpServers: McpServer[],\n resourceSource: ResourceSource | undefined,\n): Promise<Map<string, ReadResourceResult>> {\n const results = new Map<string, ReadResourceResult>();\n\n const fetchPromises = resourceUris.map(async (prefixedUri) => {\n // Parse serverKey and original URI\n // Format: serverKey:originalUri (e.g., \"linear:file://foo\", \"registry:docs://readme\")\n const colonIndex = prefixedUri.indexOf(\":\");\n if (colonIndex === -1) return;\n\n const serverKey = prefixedUri.slice(0, colonIndex);\n const originalUri = prefixedUri.slice(colonIndex + 1);\n\n try {\n // Handle registry resources directly - no server lookup needed\n // Registry resources are local to the browser and resolved via resourceSource\n if (serverKey === REGISTRY_SERVER_KEY) {\n if (!resourceSource) {\n console.warn(\n `No resource source available to resolve registry resource: ${prefixedUri}`,\n );\n return;\n }\n const registryContent = await resourceSource.getResource(originalUri);\n if (registryContent) {\n results.set(prefixedUri, registryContent);\n }\n return;\n }\n\n // For non-registry resources, find the server by serverKey\n const server = mcpServers.find((s) => s.serverKey === serverKey);\n if (!server) {\n console.warn(`No server found for resource: ${prefixedUri}`);\n return;\n }\n\n switch (server.serverType) {\n case ServerType.TAMBO_INTERNAL:\n // Skip internal server resources - backend can resolve these\n return;\n\n case ServerType.TAMBO_REGISTRY:\n // Should not reach here since we handle registry above, but keep for safety\n return;\n\n case ServerType.BROWSER_SIDE: {\n // Client-side MCP resource\n if (!isConnectedMcpServer(server)) {\n console.warn(\n `MCP server not connected for resource: ${prefixedUri}`,\n );\n return;\n }\n const mcpContent = (await server.client.client.readResource({\n uri: originalUri,\n })) as ReadResourceResult | null;\n if (mcpContent) {\n results.set(prefixedUri, mcpContent);\n }\n return;\n }\n }\n } catch (error) {\n // Graceful fallback - log warning and continue without content\n console.warn(\n `Failed to fetch resource content for ${prefixedUri}:`,\n error,\n );\n }\n });\n\n await Promise.all(fetchPromises);\n return results;\n}\n\n/**\n * Extracts resource URIs from text using the `@serverKey:uri` pattern.\n * @param text - Text potentially containing resource references\n * @returns Array of prefixed resource URIs (e.g., [\"linear:file://foo\", \"registry:file://bar\"])\n */\nexport function extractResourceUris(text: string): string[] {\n const pattern = /@([a-zA-Z0-9-]+):(\\S+)/g;\n const matches = Array.from(text.matchAll(pattern));\n return matches.map(([, serverKey, uri]) => `${serverKey}:${uri}`);\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-content-resolver.test.d.ts","sourceRoot":"","sources":["../../src/util/resource-content-resolver.test.ts"],"names":[],"mappings":""}
|