@tanstack/ai 0.35.0 → 0.36.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.
Files changed (208) hide show
  1. package/package.json +2 -2
  2. package/skills/ai-core/tool-calling/SKILL.md +26 -1
  3. package/src/activities/chat/index.ts +8 -0
  4. package/src/activities/chat/tools/lazy-tool-manager.ts +12 -4
  5. package/src/activities/chat/tools/lazy-tools.ts +33 -0
  6. package/src/index.ts +5 -0
  7. package/src/types.ts +23 -1
  8. package/dist/esm/activities/chat/adapter.d.ts +0 -163
  9. package/dist/esm/activities/chat/adapter.js +0 -17
  10. package/dist/esm/activities/chat/adapter.js.map +0 -1
  11. package/dist/esm/activities/chat/agent-loop-strategies.d.ts +0 -59
  12. package/dist/esm/activities/chat/agent-loop-strategies.js +0 -23
  13. package/dist/esm/activities/chat/agent-loop-strategies.js.map +0 -1
  14. package/dist/esm/activities/chat/index.d.ts +0 -264
  15. package/dist/esm/activities/chat/index.js +0 -1723
  16. package/dist/esm/activities/chat/index.js.map +0 -1
  17. package/dist/esm/activities/chat/mcp/manager.d.ts +0 -25
  18. package/dist/esm/activities/chat/mcp/manager.js +0 -71
  19. package/dist/esm/activities/chat/mcp/manager.js.map +0 -1
  20. package/dist/esm/activities/chat/mcp/types.d.ts +0 -56
  21. package/dist/esm/activities/chat/messages.d.ts +0 -78
  22. package/dist/esm/activities/chat/messages.js +0 -374
  23. package/dist/esm/activities/chat/messages.js.map +0 -1
  24. package/dist/esm/activities/chat/middleware/builder.d.ts +0 -46
  25. package/dist/esm/activities/chat/middleware/builder.js +0 -17
  26. package/dist/esm/activities/chat/middleware/builder.js.map +0 -1
  27. package/dist/esm/activities/chat/middleware/capabilities.d.ts +0 -93
  28. package/dist/esm/activities/chat/middleware/capabilities.js +0 -45
  29. package/dist/esm/activities/chat/middleware/capabilities.js.map +0 -1
  30. package/dist/esm/activities/chat/middleware/compose.d.ts +0 -87
  31. package/dist/esm/activities/chat/middleware/compose.js +0 -510
  32. package/dist/esm/activities/chat/middleware/compose.js.map +0 -1
  33. package/dist/esm/activities/chat/middleware/define.d.ts +0 -20
  34. package/dist/esm/activities/chat/middleware/define.js +0 -7
  35. package/dist/esm/activities/chat/middleware/define.js.map +0 -1
  36. package/dist/esm/activities/chat/middleware/index.d.ts +0 -10
  37. package/dist/esm/activities/chat/middleware/tool-cache-middleware.d.ts +0 -89
  38. package/dist/esm/activities/chat/middleware/tool-cache-middleware.js +0 -76
  39. package/dist/esm/activities/chat/middleware/tool-cache-middleware.js.map +0 -1
  40. package/dist/esm/activities/chat/middleware/types.d.ts +0 -405
  41. package/dist/esm/activities/chat/middleware/validate.d.ts +0 -19
  42. package/dist/esm/activities/chat/middleware/validate.js +0 -30
  43. package/dist/esm/activities/chat/middleware/validate.js.map +0 -1
  44. package/dist/esm/activities/chat/runtime-context-types.d.ts +0 -43
  45. package/dist/esm/activities/chat/stream/index.d.ts +0 -11
  46. package/dist/esm/activities/chat/stream/json-parser.d.ts +0 -38
  47. package/dist/esm/activities/chat/stream/json-parser.js +0 -28
  48. package/dist/esm/activities/chat/stream/json-parser.js.map +0 -1
  49. package/dist/esm/activities/chat/stream/message-updaters.d.ts +0 -81
  50. package/dist/esm/activities/chat/stream/message-updaters.js +0 -253
  51. package/dist/esm/activities/chat/stream/message-updaters.js.map +0 -1
  52. package/dist/esm/activities/chat/stream/processor.d.ts +0 -439
  53. package/dist/esm/activities/chat/stream/processor.js +0 -1426
  54. package/dist/esm/activities/chat/stream/processor.js.map +0 -1
  55. package/dist/esm/activities/chat/stream/strategies.d.ts +0 -43
  56. package/dist/esm/activities/chat/stream/strategies.js +0 -54
  57. package/dist/esm/activities/chat/stream/strategies.js.map +0 -1
  58. package/dist/esm/activities/chat/stream/types.d.ts +0 -90
  59. package/dist/esm/activities/chat/tools/lazy-tool-manager.d.ts +0 -81
  60. package/dist/esm/activities/chat/tools/lazy-tool-manager.js +0 -188
  61. package/dist/esm/activities/chat/tools/lazy-tool-manager.js.map +0 -1
  62. package/dist/esm/activities/chat/tools/schema-converter.d.ts +0 -140
  63. package/dist/esm/activities/chat/tools/schema-converter.js +0 -167
  64. package/dist/esm/activities/chat/tools/schema-converter.js.map +0 -1
  65. package/dist/esm/activities/chat/tools/tool-calls.d.ts +0 -140
  66. package/dist/esm/activities/chat/tools/tool-calls.js +0 -512
  67. package/dist/esm/activities/chat/tools/tool-calls.js.map +0 -1
  68. package/dist/esm/activities/chat/tools/tool-definition.d.ts +0 -135
  69. package/dist/esm/activities/chat/tools/tool-definition.js +0 -25
  70. package/dist/esm/activities/chat/tools/tool-definition.js.map +0 -1
  71. package/dist/esm/activities/error-payload.d.ts +0 -30
  72. package/dist/esm/activities/error-payload.js +0 -54
  73. package/dist/esm/activities/error-payload.js.map +0 -1
  74. package/dist/esm/activities/generateAudio/adapter.d.ts +0 -62
  75. package/dist/esm/activities/generateAudio/adapter.js +0 -16
  76. package/dist/esm/activities/generateAudio/adapter.js.map +0 -1
  77. package/dist/esm/activities/generateAudio/index.d.ts +0 -85
  78. package/dist/esm/activities/generateAudio/index.js +0 -114
  79. package/dist/esm/activities/generateAudio/index.js.map +0 -1
  80. package/dist/esm/activities/generateImage/adapter.d.ts +0 -78
  81. package/dist/esm/activities/generateImage/adapter.js +0 -16
  82. package/dist/esm/activities/generateImage/adapter.js.map +0 -1
  83. package/dist/esm/activities/generateImage/index.d.ts +0 -134
  84. package/dist/esm/activities/generateImage/index.js +0 -121
  85. package/dist/esm/activities/generateImage/index.js.map +0 -1
  86. package/dist/esm/activities/generateSpeech/adapter.d.ts +0 -62
  87. package/dist/esm/activities/generateSpeech/adapter.js +0 -16
  88. package/dist/esm/activities/generateSpeech/adapter.js.map +0 -1
  89. package/dist/esm/activities/generateSpeech/index.d.ts +0 -96
  90. package/dist/esm/activities/generateSpeech/index.js +0 -119
  91. package/dist/esm/activities/generateSpeech/index.js.map +0 -1
  92. package/dist/esm/activities/generateTranscription/adapter.d.ts +0 -62
  93. package/dist/esm/activities/generateTranscription/adapter.js +0 -16
  94. package/dist/esm/activities/generateTranscription/adapter.js.map +0 -1
  95. package/dist/esm/activities/generateTranscription/index.d.ts +0 -109
  96. package/dist/esm/activities/generateTranscription/index.js +0 -109
  97. package/dist/esm/activities/generateTranscription/index.js.map +0 -1
  98. package/dist/esm/activities/generateVideo/adapter.d.ts +0 -145
  99. package/dist/esm/activities/generateVideo/adapter.js +0 -30
  100. package/dist/esm/activities/generateVideo/adapter.js.map +0 -1
  101. package/dist/esm/activities/generateVideo/index.d.ts +0 -223
  102. package/dist/esm/activities/generateVideo/index.js +0 -295
  103. package/dist/esm/activities/generateVideo/index.js.map +0 -1
  104. package/dist/esm/activities/generateVideo/snap.d.ts +0 -14
  105. package/dist/esm/activities/generateVideo/snap.js +0 -54
  106. package/dist/esm/activities/generateVideo/snap.js.map +0 -1
  107. package/dist/esm/activities/index.d.ts +0 -27
  108. package/dist/esm/activities/index.js +0 -43
  109. package/dist/esm/activities/index.js.map +0 -1
  110. package/dist/esm/activities/middleware/index.d.ts +0 -2
  111. package/dist/esm/activities/middleware/run.d.ts +0 -20
  112. package/dist/esm/activities/middleware/run.js +0 -42
  113. package/dist/esm/activities/middleware/run.js.map +0 -1
  114. package/dist/esm/activities/middleware/types.d.ts +0 -118
  115. package/dist/esm/activities/stream-generation-result.d.ts +0 -15
  116. package/dist/esm/activities/stream-generation-result.js +0 -49
  117. package/dist/esm/activities/stream-generation-result.js.map +0 -1
  118. package/dist/esm/activities/summarize/adapter.d.ts +0 -74
  119. package/dist/esm/activities/summarize/adapter.js +0 -16
  120. package/dist/esm/activities/summarize/adapter.js.map +0 -1
  121. package/dist/esm/activities/summarize/chat-stream-summarize.d.ts +0 -45
  122. package/dist/esm/activities/summarize/chat-stream-summarize.js +0 -212
  123. package/dist/esm/activities/summarize/chat-stream-summarize.js.map +0 -1
  124. package/dist/esm/activities/summarize/index.d.ts +0 -108
  125. package/dist/esm/activities/summarize/index.js +0 -113
  126. package/dist/esm/activities/summarize/index.js.map +0 -1
  127. package/dist/esm/adapter-internals.d.ts +0 -5
  128. package/dist/esm/adapter-internals.js +0 -10
  129. package/dist/esm/adapter-internals.js.map +0 -1
  130. package/dist/esm/client.d.ts +0 -44
  131. package/dist/esm/client.js +0 -67
  132. package/dist/esm/client.js.map +0 -1
  133. package/dist/esm/extend-adapter.d.ts +0 -152
  134. package/dist/esm/extend-adapter.js +0 -21
  135. package/dist/esm/extend-adapter.js.map +0 -1
  136. package/dist/esm/index.d.ts +0 -44
  137. package/dist/esm/index.js +0 -106
  138. package/dist/esm/index.js.map +0 -1
  139. package/dist/esm/logger/console-logger.d.ts +0 -29
  140. package/dist/esm/logger/console-logger.js +0 -83
  141. package/dist/esm/logger/console-logger.js.map +0 -1
  142. package/dist/esm/logger/internal-logger.d.ts +0 -41
  143. package/dist/esm/logger/internal-logger.js +0 -86
  144. package/dist/esm/logger/internal-logger.js.map +0 -1
  145. package/dist/esm/logger/resolve.d.ts +0 -14
  146. package/dist/esm/logger/resolve.js +0 -54
  147. package/dist/esm/logger/resolve.js.map +0 -1
  148. package/dist/esm/logger/types.d.ts +0 -75
  149. package/dist/esm/middlewares/content-guard.d.ts +0 -77
  150. package/dist/esm/middlewares/content-guard.js +0 -156
  151. package/dist/esm/middlewares/content-guard.js.map +0 -1
  152. package/dist/esm/middlewares/index.d.ts +0 -2
  153. package/dist/esm/middlewares/index.js +0 -7
  154. package/dist/esm/middlewares/index.js.map +0 -1
  155. package/dist/esm/middlewares/otel.d.ts +0 -81
  156. package/dist/esm/middlewares/otel.js +0 -745
  157. package/dist/esm/middlewares/otel.js.map +0 -1
  158. package/dist/esm/middlewares/tool-cache.d.ts +0 -1
  159. package/dist/esm/middlewares/usage-attributes.d.ts +0 -24
  160. package/dist/esm/middlewares/usage-attributes.js +0 -43
  161. package/dist/esm/middlewares/usage-attributes.js.map +0 -1
  162. package/dist/esm/realtime/index.d.ts +0 -28
  163. package/dist/esm/realtime/index.js +0 -8
  164. package/dist/esm/realtime/index.js.map +0 -1
  165. package/dist/esm/realtime/types.d.ts +0 -282
  166. package/dist/esm/stream-to-response.d.ts +0 -102
  167. package/dist/esm/stream-to-response.js +0 -121
  168. package/dist/esm/stream-to-response.js.map +0 -1
  169. package/dist/esm/strip-to-spec-middleware.d.ts +0 -18
  170. package/dist/esm/strip-to-spec-middleware.js +0 -20
  171. package/dist/esm/strip-to-spec-middleware.js.map +0 -1
  172. package/dist/esm/system-prompts.d.ts +0 -66
  173. package/dist/esm/system-prompts.js +0 -23
  174. package/dist/esm/system-prompts.js.map +0 -1
  175. package/dist/esm/tool-registry.d.ts +0 -81
  176. package/dist/esm/tool-registry.js +0 -49
  177. package/dist/esm/tool-registry.js.map +0 -1
  178. package/dist/esm/tools/provider-tool.d.ts +0 -30
  179. package/dist/esm/tools/provider-tool.js +0 -7
  180. package/dist/esm/tools/provider-tool.js.map +0 -1
  181. package/dist/esm/types.d.ts +0 -1573
  182. package/dist/esm/utilities/ag-ui-wire.d.ts +0 -44
  183. package/dist/esm/utilities/ag-ui-wire.js +0 -107
  184. package/dist/esm/utilities/ag-ui-wire.js.map +0 -1
  185. package/dist/esm/utilities/chat-params.d.ts +0 -85
  186. package/dist/esm/utilities/chat-params.js +0 -100
  187. package/dist/esm/utilities/chat-params.js.map +0 -1
  188. package/dist/esm/utilities/errors.d.ts +0 -13
  189. package/dist/esm/utilities/errors.js +0 -22
  190. package/dist/esm/utilities/errors.js.map +0 -1
  191. package/dist/esm/utilities/media-prompt.d.ts +0 -35
  192. package/dist/esm/utilities/media-prompt.js +0 -43
  193. package/dist/esm/utilities/media-prompt.js.map +0 -1
  194. package/dist/esm/utilities/numbers.d.ts +0 -8
  195. package/dist/esm/utilities/numbers.js +0 -12
  196. package/dist/esm/utilities/numbers.js.map +0 -1
  197. package/dist/esm/utilities/sampling-keys.d.ts +0 -20
  198. package/dist/esm/utilities/sampling-keys.js +0 -20
  199. package/dist/esm/utilities/sampling-keys.js.map +0 -1
  200. package/dist/esm/utilities/tool-result.d.ts +0 -21
  201. package/dist/esm/utilities/tool-result.js +0 -37
  202. package/dist/esm/utilities/tool-result.js.map +0 -1
  203. package/dist/esm/utilities/usage.d.ts +0 -31
  204. package/dist/esm/utilities/usage.js +0 -11
  205. package/dist/esm/utilities/usage.js.map +0 -1
  206. package/dist/esm/utils.d.ts +0 -17
  207. package/dist/esm/utils.js +0 -20
  208. package/dist/esm/utils.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"tool-result.js","sources":["../../../src/utilities/tool-result.ts"],"sourcesContent":["import type { ContentPart } from '../types'\n\nconst CONTENT_PART_TYPES = new Set([\n 'text',\n 'image',\n 'audio',\n 'video',\n 'document',\n])\n\n/**\n * Structural check for a single `ContentPart`. A text part must carry a string\n * `content`; every other modality must carry a `source` with `type` of\n * `'url' | 'data'` and a string `value`.\n */\nexport function isContentPart(value: unknown): value is ContentPart {\n if (typeof value !== 'object' || value === null) return false\n const part = value as Record<string, unknown>\n if (typeof part.type !== 'string' || !CONTENT_PART_TYPES.has(part.type)) {\n return false\n }\n if (part.type === 'text') {\n return typeof part.content === 'string'\n }\n const source = part.source\n if (typeof source !== 'object' || source === null) return false\n const src = source as Record<string, unknown>\n if (typeof src.value !== 'string') return false\n // `data` sources require a mimeType (matches ContentPartDataSource); `url`\n // sources don't. Requiring it here keeps the runtime guard consistent with\n // the type and avoids emitting `data:undefined;base64,...` downstream.\n if (src.type === 'data') return typeof src.mimeType === 'string'\n return src.type === 'url'\n}\n\n/**\n * True iff `value` is a NON-EMPTY array whose every element is a valid\n * `ContentPart`. Empty arrays and mixed arrays return false so they continue\n * to be treated as ordinary (stringified) data — this keeps the auto-detection\n * footgun narrow.\n */\nexport function isContentPartArray(\n value: unknown,\n): value is Array<ContentPart> {\n return Array.isArray(value) && value.length > 0 && value.every(isContentPart)\n}\n\n/**\n * Normalize a tool's return value for transport:\n * - string → unchanged\n * - ContentPart array → unchanged (multimodal, passed through to the adapter)\n * - anything else → `JSON.stringify`\n */\nexport function normalizeToolResult(\n result: unknown,\n): string | Array<ContentPart> {\n if (typeof result === 'string') return result\n if (isContentPartArray(result)) return result\n return JSON.stringify(result)\n}\n"],"names":[],"mappings":"AAEA,MAAM,yCAAyB,IAAI;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAOM,SAAS,cAAc,OAAsC;AAClE,MAAI,OAAO,UAAU,YAAY,UAAU,KAAM,QAAO;AACxD,QAAM,OAAO;AACb,MAAI,OAAO,KAAK,SAAS,YAAY,CAAC,mBAAmB,IAAI,KAAK,IAAI,GAAG;AACvE,WAAO;AAAA,EACT;AACA,MAAI,KAAK,SAAS,QAAQ;AACxB,WAAO,OAAO,KAAK,YAAY;AAAA,EACjC;AACA,QAAM,SAAS,KAAK;AACpB,MAAI,OAAO,WAAW,YAAY,WAAW,KAAM,QAAO;AAC1D,QAAM,MAAM;AACZ,MAAI,OAAO,IAAI,UAAU,SAAU,QAAO;AAI1C,MAAI,IAAI,SAAS,OAAQ,QAAO,OAAO,IAAI,aAAa;AACxD,SAAO,IAAI,SAAS;AACtB;AAQO,SAAS,mBACd,OAC6B;AAC7B,SAAO,MAAM,QAAQ,KAAK,KAAK,MAAM,SAAS,KAAK,MAAM,MAAM,aAAa;AAC9E;AAQO,SAAS,oBACd,QAC6B;AAC7B,MAAI,OAAO,WAAW,SAAU,QAAO;AACvC,MAAI,mBAAmB,MAAM,EAAG,QAAO;AACvC,SAAO,KAAK,UAAU,MAAM;AAC9B;"}
@@ -1,31 +0,0 @@
1
- import { ProviderUsageDetails, TokenUsage } from '../types.js';
2
- /**
3
- * Input parameters for building base TokenUsage.
4
- * Provider functions should extract these from their SDK's response.
5
- */
6
- export interface BaseUsageInput {
7
- /** Total input/prompt tokens */
8
- promptTokens: number;
9
- /** Total output/completion tokens */
10
- completionTokens: number;
11
- /** Total tokens (prompt + completion) */
12
- totalTokens: number;
13
- }
14
- /**
15
- * Builds the base TokenUsage object with core fields.
16
- * Provider-specific functions should use this and then add their own details.
17
- *
18
- * @param input - The base token counts
19
- * @returns A TokenUsage object with promptTokens, completionTokens, totalTokens
20
- *
21
- * @example
22
- * ```typescript
23
- * const base = buildBaseUsage({
24
- * promptTokens: 100,
25
- * completionTokens: 50,
26
- * totalTokens: 150
27
- * });
28
- * // Returns: { promptTokens: 100, completionTokens: 50, totalTokens: 150 }
29
- * ```
30
- */
31
- export declare function buildBaseUsage<TProviderDetails = ProviderUsageDetails>(input: BaseUsageInput): TokenUsage<TProviderDetails>;
@@ -1,11 +0,0 @@
1
- function buildBaseUsage(input) {
2
- return {
3
- promptTokens: input.promptTokens,
4
- completionTokens: input.completionTokens,
5
- totalTokens: input.totalTokens
6
- };
7
- }
8
- export {
9
- buildBaseUsage
10
- };
11
- //# sourceMappingURL=usage.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"usage.js","sources":["../../../src/utilities/usage.ts"],"sourcesContent":["import type { ProviderUsageDetails, TokenUsage } from '../types'\n\n/**\n * Input parameters for building base TokenUsage.\n * Provider functions should extract these from their SDK's response.\n */\nexport interface BaseUsageInput {\n /** Total input/prompt tokens */\n promptTokens: number\n /** Total output/completion tokens */\n completionTokens: number\n /** Total tokens (prompt + completion) */\n totalTokens: number\n}\n\n/**\n * Builds the base TokenUsage object with core fields.\n * Provider-specific functions should use this and then add their own details.\n *\n * @param input - The base token counts\n * @returns A TokenUsage object with promptTokens, completionTokens, totalTokens\n *\n * @example\n * ```typescript\n * const base = buildBaseUsage({\n * promptTokens: 100,\n * completionTokens: 50,\n * totalTokens: 150\n * });\n * // Returns: { promptTokens: 100, completionTokens: 50, totalTokens: 150 }\n * ```\n */\nexport function buildBaseUsage<TProviderDetails = ProviderUsageDetails>(\n input: BaseUsageInput,\n): TokenUsage<TProviderDetails> {\n return {\n promptTokens: input.promptTokens,\n completionTokens: input.completionTokens,\n totalTokens: input.totalTokens,\n }\n}\n"],"names":[],"mappings":"AAgCO,SAAS,eACd,OAC8B;AAC9B,SAAO;AAAA,IACL,cAAc,MAAM;AAAA,IACpB,kBAAkB,MAAM;AAAA,IACxB,aAAa,MAAM;AAAA,EAAA;AAEvB;"}
@@ -1,17 +0,0 @@
1
- /**
2
- * Detect image mime type from base64 data using magic bytes.
3
- * Returns undefined if the format cannot be detected.
4
- *
5
- * This function analyzes the first few bytes of base64-encoded image data
6
- * to determine the image format based on file signature (magic bytes).
7
- *
8
- * @param base64Data - The base64-encoded image data
9
- * @returns The detected mime type, or undefined if unrecognized
10
- *
11
- * @example
12
- * ```ts
13
- * const mimeType = detectImageMimeType(imageBase64)
14
- * // Returns 'image/jpeg', 'image/png', 'image/gif', 'image/webp', or undefined
15
- * ```
16
- */
17
- export declare function detectImageMimeType(base64Data: string): 'image/jpeg' | 'image/png' | 'image/gif' | 'image/webp' | undefined;
package/dist/esm/utils.js DELETED
@@ -1,20 +0,0 @@
1
- function detectImageMimeType(base64Data) {
2
- const prefix = base64Data.substring(0, 20);
3
- if (prefix.startsWith("/9j/")) {
4
- return "image/jpeg";
5
- }
6
- if (prefix.startsWith("iVBORw0KGgo")) {
7
- return "image/png";
8
- }
9
- if (prefix.startsWith("R0lGOD")) {
10
- return "image/gif";
11
- }
12
- if (prefix.startsWith("UklGR")) {
13
- return "image/webp";
14
- }
15
- return void 0;
16
- }
17
- export {
18
- detectImageMimeType
19
- };
20
- //# sourceMappingURL=utils.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"utils.js","sources":["../../src/utils.ts"],"sourcesContent":["/**\n * Detect image mime type from base64 data using magic bytes.\n * Returns undefined if the format cannot be detected.\n *\n * This function analyzes the first few bytes of base64-encoded image data\n * to determine the image format based on file signature (magic bytes).\n *\n * @param base64Data - The base64-encoded image data\n * @returns The detected mime type, or undefined if unrecognized\n *\n * @example\n * ```ts\n * const mimeType = detectImageMimeType(imageBase64)\n * // Returns 'image/jpeg', 'image/png', 'image/gif', 'image/webp', or undefined\n * ```\n */\nexport function detectImageMimeType(\n base64Data: string,\n): 'image/jpeg' | 'image/png' | 'image/gif' | 'image/webp' | undefined {\n // Get first few bytes (base64 encoded)\n const prefix = base64Data.substring(0, 20)\n\n // JPEG: starts with /9j/ (FFD8FF in base64)\n if (prefix.startsWith('/9j/')) {\n return 'image/jpeg'\n }\n // PNG: starts with iVBORw0KGgo (89504E47 in base64)\n if (prefix.startsWith('iVBORw0KGgo')) {\n return 'image/png'\n }\n // GIF: starts with R0lGOD (474946 in base64)\n if (prefix.startsWith('R0lGOD')) {\n return 'image/gif'\n }\n // WebP: starts with UklGR (52494646 in base64, followed by WEBP)\n if (prefix.startsWith('UklGR')) {\n return 'image/webp'\n }\n\n return undefined\n}\n"],"names":[],"mappings":"AAgBO,SAAS,oBACd,YACqE;AAErE,QAAM,SAAS,WAAW,UAAU,GAAG,EAAE;AAGzC,MAAI,OAAO,WAAW,MAAM,GAAG;AAC7B,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,WAAW,aAAa,GAAG;AACpC,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,WAAW,QAAQ,GAAG;AAC/B,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,WAAW,OAAO,GAAG;AAC9B,WAAO;AAAA,EACT;AAEA,SAAO;AACT;"}