{"version":3,"file":"utils.cjs","names":[],"sources":["../src/utils.ts"],"sourcesContent":["import { ContentChunk as MistralAIContentChunk } from \"@mistralai/mistralai/models/components/contentchunk.js\";\nimport { ContentBlock, MessageContent } from \"@langchain/core/messages\";\n\n// Mistral enforces a specific pattern for tool call IDs\nconst TOOL_CALL_ID_PATTERN = /^[a-zA-Z0-9]{9}$/;\n\nexport function _isValidMistralToolCallId(toolCallId: string): boolean {\n  return TOOL_CALL_ID_PATTERN.test(toolCallId);\n}\n\nfunction _base62Encode(num: number): string {\n  let numCopy = num;\n  const base62 =\n    \"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\";\n  if (numCopy === 0) return base62[0];\n  const arr: string[] = [];\n  const base = base62.length;\n  while (numCopy) {\n    arr.push(base62[numCopy % base]);\n    numCopy = Math.floor(numCopy / base);\n  }\n  return arr.reverse().join(\"\");\n}\n\nfunction _simpleHash(str: string): number {\n  let hash = 0;\n  for (let i = 0; i < str.length; i += 1) {\n    const char = str.charCodeAt(i);\n    hash = (hash << 5) - hash + char;\n    hash &= hash; // Convert to 32-bit integer\n  }\n  return Math.abs(hash);\n}\n\nexport function _convertToolCallIdToMistralCompatible(\n  toolCallId: string\n): string {\n  if (_isValidMistralToolCallId(toolCallId)) {\n    return toolCallId;\n  } else {\n    const hash = _simpleHash(toolCallId);\n    const base62Str = _base62Encode(hash);\n    if (base62Str.length >= 9) {\n      return base62Str.slice(0, 9);\n    } else {\n      return base62Str.padStart(9, \"0\");\n    }\n  }\n}\n\nexport function _mistralContentChunkToMessageContentComplex(\n  content: string | MistralAIContentChunk[] | null | undefined\n): MessageContent {\n  if (!content) {\n    return \"\";\n  }\n  if (typeof content === \"string\") {\n    return content;\n  }\n  return content.map((contentChunk): ContentBlock => {\n    // Only Mistral ImageURLChunks need conversion to ContentBlock\n    if (contentChunk.type === \"image_url\") {\n      if (\n        typeof contentChunk.imageUrl !== \"string\" &&\n        contentChunk.imageUrl?.detail\n      ) {\n        const { detail } = contentChunk.imageUrl;\n        // Mistral detail can be any string, but ContentBlock only supports\n        // detail to be \"high\", \"auto\", or \"low\"\n        if (detail !== \"high\" && detail !== \"auto\" && detail !== \"low\") {\n          return {\n            type: contentChunk.type,\n            image_url: {\n              url: contentChunk.imageUrl.url,\n            },\n          };\n        }\n      }\n      return {\n        type: contentChunk.type,\n        image_url: contentChunk.imageUrl,\n      };\n    }\n    if (contentChunk.type === \"text\") {\n      return {\n        type: contentChunk.type,\n        text: contentChunk.text,\n      };\n    }\n    // For other chunk types (reference, file, audio, document, think), pass through as-is\n    return contentChunk as ContentBlock;\n  });\n}\n"],"mappings":";AAIA,MAAM,uBAAuB;AAE7B,SAAgB,0BAA0B,YAA6B;AACrE,QAAO,qBAAqB,KAAK,WAAW;;AAG9C,SAAS,cAAc,KAAqB;CAC1C,IAAI,UAAU;CACd,MAAM,SACJ;AACF,KAAI,YAAY,EAAG,QAAO,OAAO;CACjC,MAAM,MAAgB,EAAE;CACxB,MAAM,OAAO;AACb,QAAO,SAAS;AACd,MAAI,KAAK,OAAO,UAAU,MAAM;AAChC,YAAU,KAAK,MAAM,UAAU,KAAK;;AAEtC,QAAO,IAAI,SAAS,CAAC,KAAK,GAAG;;AAG/B,SAAS,YAAY,KAAqB;CACxC,IAAI,OAAO;AACX,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK,GAAG;EACtC,MAAM,OAAO,IAAI,WAAW,EAAE;AAC9B,UAAQ,QAAQ,KAAK,OAAO;AAC5B,UAAQ;;AAEV,QAAO,KAAK,IAAI,KAAK;;AAGvB,SAAgB,sCACd,YACQ;AACR,KAAI,0BAA0B,WAAW,CACvC,QAAO;MACF;EAEL,MAAM,YAAY,cADL,YAAY,WAAW,CACC;AACrC,MAAI,UAAU,UAAU,EACtB,QAAO,UAAU,MAAM,GAAG,EAAE;MAE5B,QAAO,UAAU,SAAS,GAAG,IAAI;;;AAKvC,SAAgB,4CACd,SACgB;AAChB,KAAI,CAAC,QACH,QAAO;AAET,KAAI,OAAO,YAAY,SACrB,QAAO;AAET,QAAO,QAAQ,KAAK,iBAA+B;AAEjD,MAAI,aAAa,SAAS,aAAa;AACrC,OACE,OAAO,aAAa,aAAa,YACjC,aAAa,UAAU,QACvB;IACA,MAAM,EAAE,WAAW,aAAa;AAGhC,QAAI,WAAW,UAAU,WAAW,UAAU,WAAW,MACvD,QAAO;KACL,MAAM,aAAa;KACnB,WAAW,EACT,KAAK,aAAa,SAAS,KAC5B;KACF;;AAGL,UAAO;IACL,MAAM,aAAa;IACnB,WAAW,aAAa;IACzB;;AAEH,MAAI,aAAa,SAAS,OACxB,QAAO;GACL,MAAM,aAAa;GACnB,MAAM,aAAa;GACpB;AAGH,SAAO;GACP"}