@teodorruskvi/chat-core 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/features/conversation/contexts/ChatUIContext.d.ts +41 -0
- package/dist/features/conversation/contexts/ThreadStateProvider.d.ts +24 -0
- package/dist/features/conversation/contexts/ThreadsProvider.d.ts +10 -0
- package/dist/features/conversation/contexts/index.d.ts +3 -0
- package/dist/features/conversation/contexts/reducers/MessageReducer.d.ts +22 -0
- package/dist/features/conversation/contexts/reducers/utils/reducerUtils.d.ts +21 -0
- package/dist/features/conversation/hooks/index.d.ts +7 -0
- package/dist/features/conversation/hooks/useChatController.d.ts +50 -0
- package/dist/features/conversation/hooks/useChatSession.d.ts +49 -0
- package/dist/features/conversation/hooks/useFilePreview.d.ts +15 -0
- package/dist/features/conversation/hooks/useParsedMessageContent.d.ts +12 -0
- package/dist/features/conversation/hooks/useThreadHistoryState.d.ts +44 -0
- package/dist/features/conversation/hooks/useThreadsState.d.ts +40 -0
- package/dist/features/conversation/messages/components/MessageBubble.d.ts +25 -0
- package/dist/features/conversation/messages/hooks/index.d.ts +2 -0
- package/dist/features/conversation/messages/hooks/useMessageContent.d.ts +13 -0
- package/dist/features/conversation/messages/hooks/useStreamingMarkdownBuffer.d.ts +3 -0
- package/dist/features/conversation/messages/hooks/useToolPayload.d.ts +15 -0
- package/dist/features/conversation/messages/renderers/tooling/ToolContent.d.ts +27 -0
- package/dist/features/conversation/messages/renderers/tooling/artifacts/ArtifactProgress.d.ts +13 -0
- package/dist/features/conversation/messages/utils/artifactUtils.d.ts +51 -0
- package/dist/features/conversation/messages/utils/index.d.ts +6 -0
- package/dist/features/conversation/messages/utils/messageUtils.d.ts +32 -0
- package/dist/features/persistence/checkpoints/hooks/index.d.ts +1 -0
- package/dist/features/persistence/checkpoints/hooks/useCheckpointIndex.d.ts +2 -0
- package/dist/features/persistence/checkpoints/types/index.d.ts +33 -0
- package/dist/features/persistence/checkpoints/utils/checkpointIndex.d.ts +18 -0
- package/dist/features/persistence/checkpoints/utils/editUtils.d.ts +11 -0
- package/dist/features/persistence/checkpoints/utils/historyUtils.d.ts +8 -0
- package/dist/features/persistence/checkpoints/utils/messagePreviews.d.ts +8 -0
- package/dist/features/persistence/checkpoints/utils/schemaUtils.d.ts +6 -0
- package/dist/features/streaming/contexts/StreamingProvider.d.ts +19 -0
- package/dist/features/streaming/contexts/index.d.ts +1 -0
- package/dist/features/streaming/contexts/types.d.ts +76 -0
- package/dist/features/streaming/hooks/types.d.ts +50 -0
- package/dist/features/streaming/hooks/use-stream.d.ts +2 -0
- package/dist/features/streaming/index.d.ts +5 -0
- package/dist/features/streaming/utils/index.d.ts +1 -0
- package/dist/features/streaming/utils/toolHandlers.d.ts +14 -0
- package/dist/features/thread/contexts/index.d.ts +1 -0
- package/dist/features/thread/contexts/reducers/MessageReducer.d.ts +1 -0
- package/dist/features/thread/hooks/useThreadHistoryState.d.ts +1 -0
- package/dist/features/thread/hooks/useThreadsState.d.ts +1 -0
- package/dist/index.esm.js +5344 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.umd.js +9 -0
- package/dist/index.umd.js.map +1 -0
- package/dist/lib/core.d.ts +26 -0
- package/dist/lib/utils.d.ts +2 -0
- package/dist/shared/core/api/clients/authClient.d.ts +13 -0
- package/dist/shared/core/api/clients/chatClient.d.ts +50 -0
- package/dist/shared/core/api/clients/fileClient.d.ts +12 -0
- package/dist/shared/core/api/clients/index.d.ts +2 -0
- package/dist/shared/core/api/index.d.ts +2 -0
- package/dist/shared/core/api/utils/http.d.ts +20 -0
- package/dist/shared/core/api/utils/index.d.ts +1 -0
- package/dist/shared/core/constants/env.d.ts +39 -0
- package/dist/shared/core/constants/index.d.ts +2 -0
- package/dist/shared/core/constants/storage.d.ts +14 -0
- package/dist/shared/core/contexts/index.d.ts +4 -0
- package/dist/shared/core/contexts/providers/ApiProvider.d.ts +11 -0
- package/dist/shared/core/contexts/providers/ChatProviders.d.ts +25 -0
- package/dist/shared/core/contexts/providers/index.d.ts +2 -0
- package/dist/shared/core/hooks/index.d.ts +2 -0
- package/dist/shared/core/hooks/useApi.d.ts +1 -0
- package/dist/shared/core/hooks/useShallowStableValue.d.ts +1 -0
- package/dist/shared/core/index.d.ts +6 -0
- package/dist/shared/core/types/index.d.ts +1 -0
- package/dist/shared/core/utils/caseUtils.d.ts +1 -0
- package/dist/shared/core/utils/chatUtils.d.ts +10 -0
- package/dist/shared/core/utils/guards.d.ts +8 -0
- package/dist/shared/core/utils/index.d.ts +8 -0
- package/dist/shared/core/utils/messageFactory.d.ts +14 -0
- package/dist/shared/core/utils/metaUtils.d.ts +22 -0
- package/dist/shared/core/utils/normalizationUtils.d.ts +20 -0
- package/dist/shared/core/utils/parsers.d.ts +22 -0
- package/dist/shared/core/utils/toolCallUtils.d.ts +14 -0
- package/dist/shared/core/utils/toolFormatting.d.ts +8 -0
- package/dist/shared/ui/components/toast.d.ts +15 -0
- package/dist/shared/ui/hooks/use-toast.d.ts +44 -0
- package/dist/shared/ui/utils/cn.d.ts +2 -0
- package/dist/shared/ui/utils/index.d.ts +1 -0
- package/dist/shared/utils/jsonUtils.d.ts +18 -0
- package/dist/types/api/auth.d.ts +15 -0
- package/dist/types/api/common.d.ts +9 -0
- package/dist/types/api/files.d.ts +7 -0
- package/dist/types/api/runs.d.ts +104 -0
- package/dist/types/api.d.ts +7 -0
- package/dist/types/core/context.d.ts +5 -0
- package/dist/types/core/models.d.ts +6 -0
- package/dist/types/core.d.ts +97 -0
- package/dist/types/domain/artifacts.d.ts +94 -0
- package/dist/types/domain/chat.d.ts +80 -0
- package/dist/types/domain/index.d.ts +10 -0
- package/dist/types/domain/messages.d.ts +54 -0
- package/dist/types/domain/persistence.d.ts +67 -0
- package/dist/types/domain/primitives.d.ts +39 -0
- package/dist/types/domain/streaming.d.ts +231 -0
- package/dist/types/domain/tools.d.ts +66 -0
- package/dist/types/index.d.ts +13 -0
- package/dist/types/shared/common.d.ts +19 -0
- package/package.json +42 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx/dist/clsx.mjs","../../../node_modules/.pnpm/tailwind-merge@2.6.0/node_modules/tailwind-merge/dist/bundle-mjs.mjs","../../../src/lib/utils.ts","../../../src/shared/utils/jsonUtils.ts","../../../src/shared/core/utils/guards.ts","../../../src/shared/core/utils/parsers.ts","../../../src/features/conversation/messages/utils/messageUtils.ts","../../../src/shared/core/utils/toolFormatting.ts","../../../src/shared/core/utils/caseUtils.ts","../../../src/shared/core/utils/normalizationUtils.ts","../../../src/shared/core/utils/toolCallUtils.ts","../../../src/shared/core/constants/storage.ts","../../../src/shared/core/api/utils/http.ts","../../../src/shared/core/api/clients/chatClient.ts","../../../src/shared/core/api/clients/fileClient.ts","../../../src/shared/core/api/clients/authClient.ts","../../../src/shared/core/contexts/providers/ApiProvider.tsx","../../../src/shared/core/utils/chatUtils.ts","../../../src/shared/core/utils/metaUtils.ts","../../../src/shared/core/hooks/useApi.ts","../../../src/shared/core/utils/messageFactory.ts","../../../src/features/persistence/checkpoints/utils/schemaUtils.ts","../../../src/features/persistence/checkpoints/utils/historyUtils.ts","../../../src/types/core.ts","../../../src/features/streaming/hooks/use-stream.ts","../../../src/features/conversation/hooks/useThreadsState.ts","../../../src/features/conversation/contexts/ThreadsProvider.tsx","../../../src/features/conversation/messages/utils/artifactUtils.ts","../../../src/features/conversation/contexts/reducers/utils/reducerUtils.ts","../../../src/features/conversation/contexts/reducers/MessageReducer.tsx","../../../src/features/persistence/checkpoints/utils/messagePreviews.ts","../../../src/features/persistence/checkpoints/utils/checkpointIndex.ts","../../../src/features/persistence/checkpoints/hooks/useCheckpointIndex.ts","../../../src/features/conversation/hooks/useThreadHistoryState.ts","../../../src/features/conversation/contexts/ThreadStateProvider.tsx","../../../src/features/streaming/contexts/StreamingProvider.tsx","../../../src/shared/core/hooks/useShallowStableValue.ts","../../../src/features/streaming/utils/toolHandlers.ts","../../../src/shared/core/contexts/providers/ChatProviders.tsx","../../../src/shared/ui/hooks/use-toast.ts","../../../src/features/conversation/hooks/useFilePreview.ts","../../../src/features/conversation/hooks/useParsedMessageContent.ts","../../../src/features/conversation/messages/hooks/useToolPayload.ts","../../../src/features/conversation/hooks/useChatSession.ts","../../../src/features/conversation/hooks/useChatController.ts","../../../src/features/conversation/messages/hooks/useMessageContent.ts","../../../src/features/conversation/messages/hooks/useStreamingMarkdownBuffer.ts"],"sourcesContent":["function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","const CLASS_PART_SEPARATOR = '-';\nconst createClassGroupUtils = config => {\n const classMap = createClassMap(config);\n const {\n conflictingClassGroups,\n conflictingClassGroupModifiers\n } = config;\n const getClassGroupId = className => {\n const classParts = className.split(CLASS_PART_SEPARATOR);\n // Classes like `-inset-1` produce an empty string as first classPart. We assume that classes for negative values are used correctly and remove it from classParts.\n if (classParts[0] === '' && classParts.length !== 1) {\n classParts.shift();\n }\n return getGroupRecursive(classParts, classMap) || getGroupIdForArbitraryProperty(className);\n };\n const getConflictingClassGroupIds = (classGroupId, hasPostfixModifier) => {\n const conflicts = conflictingClassGroups[classGroupId] || [];\n if (hasPostfixModifier && conflictingClassGroupModifiers[classGroupId]) {\n return [...conflicts, ...conflictingClassGroupModifiers[classGroupId]];\n }\n return conflicts;\n };\n return {\n getClassGroupId,\n getConflictingClassGroupIds\n };\n};\nconst getGroupRecursive = (classParts, classPartObject) => {\n if (classParts.length === 0) {\n return classPartObject.classGroupId;\n }\n const currentClassPart = classParts[0];\n const nextClassPartObject = classPartObject.nextPart.get(currentClassPart);\n const classGroupFromNextClassPart = nextClassPartObject ? getGroupRecursive(classParts.slice(1), nextClassPartObject) : undefined;\n if (classGroupFromNextClassPart) {\n return classGroupFromNextClassPart;\n }\n if (classPartObject.validators.length === 0) {\n return undefined;\n }\n const classRest = classParts.join(CLASS_PART_SEPARATOR);\n return classPartObject.validators.find(({\n validator\n }) => validator(classRest))?.classGroupId;\n};\nconst arbitraryPropertyRegex = /^\\[(.+)\\]$/;\nconst getGroupIdForArbitraryProperty = className => {\n if (arbitraryPropertyRegex.test(className)) {\n const arbitraryPropertyClassName = arbitraryPropertyRegex.exec(className)[1];\n const property = arbitraryPropertyClassName?.substring(0, arbitraryPropertyClassName.indexOf(':'));\n if (property) {\n // I use two dots here because one dot is used as prefix for class groups in plugins\n return 'arbitrary..' + property;\n }\n }\n};\n/**\n * Exported for testing only\n */\nconst createClassMap = config => {\n const {\n theme,\n prefix\n } = config;\n const classMap = {\n nextPart: new Map(),\n validators: []\n };\n const prefixedClassGroupEntries = getPrefixedClassGroupEntries(Object.entries(config.classGroups), prefix);\n prefixedClassGroupEntries.forEach(([classGroupId, classGroup]) => {\n processClassesRecursively(classGroup, classMap, classGroupId, theme);\n });\n return classMap;\n};\nconst processClassesRecursively = (classGroup, classPartObject, classGroupId, theme) => {\n classGroup.forEach(classDefinition => {\n if (typeof classDefinition === 'string') {\n const classPartObjectToEdit = classDefinition === '' ? classPartObject : getPart(classPartObject, classDefinition);\n classPartObjectToEdit.classGroupId = classGroupId;\n return;\n }\n if (typeof classDefinition === 'function') {\n if (isThemeGetter(classDefinition)) {\n processClassesRecursively(classDefinition(theme), classPartObject, classGroupId, theme);\n return;\n }\n classPartObject.validators.push({\n validator: classDefinition,\n classGroupId\n });\n return;\n }\n Object.entries(classDefinition).forEach(([key, classGroup]) => {\n processClassesRecursively(classGroup, getPart(classPartObject, key), classGroupId, theme);\n });\n });\n};\nconst getPart = (classPartObject, path) => {\n let currentClassPartObject = classPartObject;\n path.split(CLASS_PART_SEPARATOR).forEach(pathPart => {\n if (!currentClassPartObject.nextPart.has(pathPart)) {\n currentClassPartObject.nextPart.set(pathPart, {\n nextPart: new Map(),\n validators: []\n });\n }\n currentClassPartObject = currentClassPartObject.nextPart.get(pathPart);\n });\n return currentClassPartObject;\n};\nconst isThemeGetter = func => func.isThemeGetter;\nconst getPrefixedClassGroupEntries = (classGroupEntries, prefix) => {\n if (!prefix) {\n return classGroupEntries;\n }\n return classGroupEntries.map(([classGroupId, classGroup]) => {\n const prefixedClassGroup = classGroup.map(classDefinition => {\n if (typeof classDefinition === 'string') {\n return prefix + classDefinition;\n }\n if (typeof classDefinition === 'object') {\n return Object.fromEntries(Object.entries(classDefinition).map(([key, value]) => [prefix + key, value]));\n }\n return classDefinition;\n });\n return [classGroupId, prefixedClassGroup];\n });\n};\n\n// LRU cache inspired from hashlru (https://github.com/dominictarr/hashlru/blob/v1.0.4/index.js) but object replaced with Map to improve performance\nconst createLruCache = maxCacheSize => {\n if (maxCacheSize < 1) {\n return {\n get: () => undefined,\n set: () => {}\n };\n }\n let cacheSize = 0;\n let cache = new Map();\n let previousCache = new Map();\n const update = (key, value) => {\n cache.set(key, value);\n cacheSize++;\n if (cacheSize > maxCacheSize) {\n cacheSize = 0;\n previousCache = cache;\n cache = new Map();\n }\n };\n return {\n get(key) {\n let value = cache.get(key);\n if (value !== undefined) {\n return value;\n }\n if ((value = previousCache.get(key)) !== undefined) {\n update(key, value);\n return value;\n }\n },\n set(key, value) {\n if (cache.has(key)) {\n cache.set(key, value);\n } else {\n update(key, value);\n }\n }\n };\n};\nconst IMPORTANT_MODIFIER = '!';\nconst createParseClassName = config => {\n const {\n separator,\n experimentalParseClassName\n } = config;\n const isSeparatorSingleCharacter = separator.length === 1;\n const firstSeparatorCharacter = separator[0];\n const separatorLength = separator.length;\n // parseClassName inspired by https://github.com/tailwindlabs/tailwindcss/blob/v3.2.2/src/util/splitAtTopLevelOnly.js\n const parseClassName = className => {\n const modifiers = [];\n let bracketDepth = 0;\n let modifierStart = 0;\n let postfixModifierPosition;\n for (let index = 0; index < className.length; index++) {\n let currentCharacter = className[index];\n if (bracketDepth === 0) {\n if (currentCharacter === firstSeparatorCharacter && (isSeparatorSingleCharacter || className.slice(index, index + separatorLength) === separator)) {\n modifiers.push(className.slice(modifierStart, index));\n modifierStart = index + separatorLength;\n continue;\n }\n if (currentCharacter === '/') {\n postfixModifierPosition = index;\n continue;\n }\n }\n if (currentCharacter === '[') {\n bracketDepth++;\n } else if (currentCharacter === ']') {\n bracketDepth--;\n }\n }\n const baseClassNameWithImportantModifier = modifiers.length === 0 ? className : className.substring(modifierStart);\n const hasImportantModifier = baseClassNameWithImportantModifier.startsWith(IMPORTANT_MODIFIER);\n const baseClassName = hasImportantModifier ? baseClassNameWithImportantModifier.substring(1) : baseClassNameWithImportantModifier;\n const maybePostfixModifierPosition = postfixModifierPosition && postfixModifierPosition > modifierStart ? postfixModifierPosition - modifierStart : undefined;\n return {\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition\n };\n };\n if (experimentalParseClassName) {\n return className => experimentalParseClassName({\n className,\n parseClassName\n });\n }\n return parseClassName;\n};\n/**\n * Sorts modifiers according to following schema:\n * - Predefined modifiers are sorted alphabetically\n * - When an arbitrary variant appears, it must be preserved which modifiers are before and after it\n */\nconst sortModifiers = modifiers => {\n if (modifiers.length <= 1) {\n return modifiers;\n }\n const sortedModifiers = [];\n let unsortedModifiers = [];\n modifiers.forEach(modifier => {\n const isArbitraryVariant = modifier[0] === '[';\n if (isArbitraryVariant) {\n sortedModifiers.push(...unsortedModifiers.sort(), modifier);\n unsortedModifiers = [];\n } else {\n unsortedModifiers.push(modifier);\n }\n });\n sortedModifiers.push(...unsortedModifiers.sort());\n return sortedModifiers;\n};\nconst createConfigUtils = config => ({\n cache: createLruCache(config.cacheSize),\n parseClassName: createParseClassName(config),\n ...createClassGroupUtils(config)\n});\nconst SPLIT_CLASSES_REGEX = /\\s+/;\nconst mergeClassList = (classList, configUtils) => {\n const {\n parseClassName,\n getClassGroupId,\n getConflictingClassGroupIds\n } = configUtils;\n /**\n * Set of classGroupIds in following format:\n * `{importantModifier}{variantModifiers}{classGroupId}`\n * @example 'float'\n * @example 'hover:focus:bg-color'\n * @example 'md:!pr'\n */\n const classGroupsInConflict = [];\n const classNames = classList.trim().split(SPLIT_CLASSES_REGEX);\n let result = '';\n for (let index = classNames.length - 1; index >= 0; index -= 1) {\n const originalClassName = classNames[index];\n const {\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition\n } = parseClassName(originalClassName);\n let hasPostfixModifier = Boolean(maybePostfixModifierPosition);\n let classGroupId = getClassGroupId(hasPostfixModifier ? baseClassName.substring(0, maybePostfixModifierPosition) : baseClassName);\n if (!classGroupId) {\n if (!hasPostfixModifier) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n continue;\n }\n classGroupId = getClassGroupId(baseClassName);\n if (!classGroupId) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n continue;\n }\n hasPostfixModifier = false;\n }\n const variantModifier = sortModifiers(modifiers).join(':');\n const modifierId = hasImportantModifier ? variantModifier + IMPORTANT_MODIFIER : variantModifier;\n const classId = modifierId + classGroupId;\n if (classGroupsInConflict.includes(classId)) {\n // Tailwind class omitted due to conflict\n continue;\n }\n classGroupsInConflict.push(classId);\n const conflictGroups = getConflictingClassGroupIds(classGroupId, hasPostfixModifier);\n for (let i = 0; i < conflictGroups.length; ++i) {\n const group = conflictGroups[i];\n classGroupsInConflict.push(modifierId + group);\n }\n // Tailwind class not in conflict\n result = originalClassName + (result.length > 0 ? ' ' + result : result);\n }\n return result;\n};\n\n/**\n * The code in this file is copied from https://github.com/lukeed/clsx and modified to suit the needs of tailwind-merge better.\n *\n * Specifically:\n * - Runtime code from https://github.com/lukeed/clsx/blob/v1.2.1/src/index.js\n * - TypeScript types from https://github.com/lukeed/clsx/blob/v1.2.1/clsx.d.ts\n *\n * Original code has MIT license: Copyright (c) Luke Edwards <luke.edwards05@gmail.com> (lukeed.com)\n */\nfunction twJoin() {\n let index = 0;\n let argument;\n let resolvedValue;\n let string = '';\n while (index < arguments.length) {\n if (argument = arguments[index++]) {\n if (resolvedValue = toValue(argument)) {\n string && (string += ' ');\n string += resolvedValue;\n }\n }\n }\n return string;\n}\nconst toValue = mix => {\n if (typeof mix === 'string') {\n return mix;\n }\n let resolvedValue;\n let string = '';\n for (let k = 0; k < mix.length; k++) {\n if (mix[k]) {\n if (resolvedValue = toValue(mix[k])) {\n string && (string += ' ');\n string += resolvedValue;\n }\n }\n }\n return string;\n};\nfunction createTailwindMerge(createConfigFirst, ...createConfigRest) {\n let configUtils;\n let cacheGet;\n let cacheSet;\n let functionToCall = initTailwindMerge;\n function initTailwindMerge(classList) {\n const config = createConfigRest.reduce((previousConfig, createConfigCurrent) => createConfigCurrent(previousConfig), createConfigFirst());\n configUtils = createConfigUtils(config);\n cacheGet = configUtils.cache.get;\n cacheSet = configUtils.cache.set;\n functionToCall = tailwindMerge;\n return tailwindMerge(classList);\n }\n function tailwindMerge(classList) {\n const cachedResult = cacheGet(classList);\n if (cachedResult) {\n return cachedResult;\n }\n const result = mergeClassList(classList, configUtils);\n cacheSet(classList, result);\n return result;\n }\n return function callTailwindMerge() {\n return functionToCall(twJoin.apply(null, arguments));\n };\n}\nconst fromTheme = key => {\n const themeGetter = theme => theme[key] || [];\n themeGetter.isThemeGetter = true;\n return themeGetter;\n};\nconst arbitraryValueRegex = /^\\[(?:([a-z-]+):)?(.+)\\]$/i;\nconst fractionRegex = /^\\d+\\/\\d+$/;\nconst stringLengths = /*#__PURE__*/new Set(['px', 'full', 'screen']);\nconst tshirtUnitRegex = /^(\\d+(\\.\\d+)?)?(xs|sm|md|lg|xl)$/;\nconst lengthUnitRegex = /\\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\\b(calc|min|max|clamp)\\(.+\\)|^0$/;\nconst colorFunctionRegex = /^(rgba?|hsla?|hwb|(ok)?(lab|lch))\\(.+\\)$/;\n// Shadow always begins with x and y offset separated by underscore optionally prepended by inset\nconst shadowRegex = /^(inset_)?-?((\\d+)?\\.?(\\d+)[a-z]+|0)_-?((\\d+)?\\.?(\\d+)[a-z]+|0)/;\nconst imageRegex = /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\\(.+\\)$/;\nconst isLength = value => isNumber(value) || stringLengths.has(value) || fractionRegex.test(value);\nconst isArbitraryLength = value => getIsArbitraryValue(value, 'length', isLengthOnly);\nconst isNumber = value => Boolean(value) && !Number.isNaN(Number(value));\nconst isArbitraryNumber = value => getIsArbitraryValue(value, 'number', isNumber);\nconst isInteger = value => Boolean(value) && Number.isInteger(Number(value));\nconst isPercent = value => value.endsWith('%') && isNumber(value.slice(0, -1));\nconst isArbitraryValue = value => arbitraryValueRegex.test(value);\nconst isTshirtSize = value => tshirtUnitRegex.test(value);\nconst sizeLabels = /*#__PURE__*/new Set(['length', 'size', 'percentage']);\nconst isArbitrarySize = value => getIsArbitraryValue(value, sizeLabels, isNever);\nconst isArbitraryPosition = value => getIsArbitraryValue(value, 'position', isNever);\nconst imageLabels = /*#__PURE__*/new Set(['image', 'url']);\nconst isArbitraryImage = value => getIsArbitraryValue(value, imageLabels, isImage);\nconst isArbitraryShadow = value => getIsArbitraryValue(value, '', isShadow);\nconst isAny = () => true;\nconst getIsArbitraryValue = (value, label, testValue) => {\n const result = arbitraryValueRegex.exec(value);\n if (result) {\n if (result[1]) {\n return typeof label === 'string' ? result[1] === label : label.has(result[1]);\n }\n return testValue(result[2]);\n }\n return false;\n};\nconst isLengthOnly = value =>\n// `colorFunctionRegex` check is necessary because color functions can have percentages in them which which would be incorrectly classified as lengths.\n// For example, `hsl(0 0% 0%)` would be classified as a length without this check.\n// I could also use lookbehind assertion in `lengthUnitRegex` but that isn't supported widely enough.\nlengthUnitRegex.test(value) && !colorFunctionRegex.test(value);\nconst isNever = () => false;\nconst isShadow = value => shadowRegex.test(value);\nconst isImage = value => imageRegex.test(value);\nconst validators = /*#__PURE__*/Object.defineProperty({\n __proto__: null,\n isAny,\n isArbitraryImage,\n isArbitraryLength,\n isArbitraryNumber,\n isArbitraryPosition,\n isArbitraryShadow,\n isArbitrarySize,\n isArbitraryValue,\n isInteger,\n isLength,\n isNumber,\n isPercent,\n isTshirtSize\n}, Symbol.toStringTag, {\n value: 'Module'\n});\nconst getDefaultConfig = () => {\n const colors = fromTheme('colors');\n const spacing = fromTheme('spacing');\n const blur = fromTheme('blur');\n const brightness = fromTheme('brightness');\n const borderColor = fromTheme('borderColor');\n const borderRadius = fromTheme('borderRadius');\n const borderSpacing = fromTheme('borderSpacing');\n const borderWidth = fromTheme('borderWidth');\n const contrast = fromTheme('contrast');\n const grayscale = fromTheme('grayscale');\n const hueRotate = fromTheme('hueRotate');\n const invert = fromTheme('invert');\n const gap = fromTheme('gap');\n const gradientColorStops = fromTheme('gradientColorStops');\n const gradientColorStopPositions = fromTheme('gradientColorStopPositions');\n const inset = fromTheme('inset');\n const margin = fromTheme('margin');\n const opacity = fromTheme('opacity');\n const padding = fromTheme('padding');\n const saturate = fromTheme('saturate');\n const scale = fromTheme('scale');\n const sepia = fromTheme('sepia');\n const skew = fromTheme('skew');\n const space = fromTheme('space');\n const translate = fromTheme('translate');\n const getOverscroll = () => ['auto', 'contain', 'none'];\n const getOverflow = () => ['auto', 'hidden', 'clip', 'visible', 'scroll'];\n const getSpacingWithAutoAndArbitrary = () => ['auto', isArbitraryValue, spacing];\n const getSpacingWithArbitrary = () => [isArbitraryValue, spacing];\n const getLengthWithEmptyAndArbitrary = () => ['', isLength, isArbitraryLength];\n const getNumberWithAutoAndArbitrary = () => ['auto', isNumber, isArbitraryValue];\n const getPositions = () => ['bottom', 'center', 'left', 'left-bottom', 'left-top', 'right', 'right-bottom', 'right-top', 'top'];\n const getLineStyles = () => ['solid', 'dashed', 'dotted', 'double', 'none'];\n const getBlendModes = () => ['normal', 'multiply', 'screen', 'overlay', 'darken', 'lighten', 'color-dodge', 'color-burn', 'hard-light', 'soft-light', 'difference', 'exclusion', 'hue', 'saturation', 'color', 'luminosity'];\n const getAlign = () => ['start', 'end', 'center', 'between', 'around', 'evenly', 'stretch'];\n const getZeroAndEmpty = () => ['', '0', isArbitraryValue];\n const getBreaks = () => ['auto', 'avoid', 'all', 'avoid-page', 'page', 'left', 'right', 'column'];\n const getNumberAndArbitrary = () => [isNumber, isArbitraryValue];\n return {\n cacheSize: 500,\n separator: ':',\n theme: {\n colors: [isAny],\n spacing: [isLength, isArbitraryLength],\n blur: ['none', '', isTshirtSize, isArbitraryValue],\n brightness: getNumberAndArbitrary(),\n borderColor: [colors],\n borderRadius: ['none', '', 'full', isTshirtSize, isArbitraryValue],\n borderSpacing: getSpacingWithArbitrary(),\n borderWidth: getLengthWithEmptyAndArbitrary(),\n contrast: getNumberAndArbitrary(),\n grayscale: getZeroAndEmpty(),\n hueRotate: getNumberAndArbitrary(),\n invert: getZeroAndEmpty(),\n gap: getSpacingWithArbitrary(),\n gradientColorStops: [colors],\n gradientColorStopPositions: [isPercent, isArbitraryLength],\n inset: getSpacingWithAutoAndArbitrary(),\n margin: getSpacingWithAutoAndArbitrary(),\n opacity: getNumberAndArbitrary(),\n padding: getSpacingWithArbitrary(),\n saturate: getNumberAndArbitrary(),\n scale: getNumberAndArbitrary(),\n sepia: getZeroAndEmpty(),\n skew: getNumberAndArbitrary(),\n space: getSpacingWithArbitrary(),\n translate: getSpacingWithArbitrary()\n },\n classGroups: {\n // Layout\n /**\n * Aspect Ratio\n * @see https://tailwindcss.com/docs/aspect-ratio\n */\n aspect: [{\n aspect: ['auto', 'square', 'video', isArbitraryValue]\n }],\n /**\n * Container\n * @see https://tailwindcss.com/docs/container\n */\n container: ['container'],\n /**\n * Columns\n * @see https://tailwindcss.com/docs/columns\n */\n columns: [{\n columns: [isTshirtSize]\n }],\n /**\n * Break After\n * @see https://tailwindcss.com/docs/break-after\n */\n 'break-after': [{\n 'break-after': getBreaks()\n }],\n /**\n * Break Before\n * @see https://tailwindcss.com/docs/break-before\n */\n 'break-before': [{\n 'break-before': getBreaks()\n }],\n /**\n * Break Inside\n * @see https://tailwindcss.com/docs/break-inside\n */\n 'break-inside': [{\n 'break-inside': ['auto', 'avoid', 'avoid-page', 'avoid-column']\n }],\n /**\n * Box Decoration Break\n * @see https://tailwindcss.com/docs/box-decoration-break\n */\n 'box-decoration': [{\n 'box-decoration': ['slice', 'clone']\n }],\n /**\n * Box Sizing\n * @see https://tailwindcss.com/docs/box-sizing\n */\n box: [{\n box: ['border', 'content']\n }],\n /**\n * Display\n * @see https://tailwindcss.com/docs/display\n */\n display: ['block', 'inline-block', 'inline', 'flex', 'inline-flex', 'table', 'inline-table', 'table-caption', 'table-cell', 'table-column', 'table-column-group', 'table-footer-group', 'table-header-group', 'table-row-group', 'table-row', 'flow-root', 'grid', 'inline-grid', 'contents', 'list-item', 'hidden'],\n /**\n * Floats\n * @see https://tailwindcss.com/docs/float\n */\n float: [{\n float: ['right', 'left', 'none', 'start', 'end']\n }],\n /**\n * Clear\n * @see https://tailwindcss.com/docs/clear\n */\n clear: [{\n clear: ['left', 'right', 'both', 'none', 'start', 'end']\n }],\n /**\n * Isolation\n * @see https://tailwindcss.com/docs/isolation\n */\n isolation: ['isolate', 'isolation-auto'],\n /**\n * Object Fit\n * @see https://tailwindcss.com/docs/object-fit\n */\n 'object-fit': [{\n object: ['contain', 'cover', 'fill', 'none', 'scale-down']\n }],\n /**\n * Object Position\n * @see https://tailwindcss.com/docs/object-position\n */\n 'object-position': [{\n object: [...getPositions(), isArbitraryValue]\n }],\n /**\n * Overflow\n * @see https://tailwindcss.com/docs/overflow\n */\n overflow: [{\n overflow: getOverflow()\n }],\n /**\n * Overflow X\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-x': [{\n 'overflow-x': getOverflow()\n }],\n /**\n * Overflow Y\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-y': [{\n 'overflow-y': getOverflow()\n }],\n /**\n * Overscroll Behavior\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n overscroll: [{\n overscroll: getOverscroll()\n }],\n /**\n * Overscroll Behavior X\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-x': [{\n 'overscroll-x': getOverscroll()\n }],\n /**\n * Overscroll Behavior Y\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-y': [{\n 'overscroll-y': getOverscroll()\n }],\n /**\n * Position\n * @see https://tailwindcss.com/docs/position\n */\n position: ['static', 'fixed', 'absolute', 'relative', 'sticky'],\n /**\n * Top / Right / Bottom / Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n inset: [{\n inset: [inset]\n }],\n /**\n * Right / Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-x': [{\n 'inset-x': [inset]\n }],\n /**\n * Top / Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-y': [{\n 'inset-y': [inset]\n }],\n /**\n * Start\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n start: [{\n start: [inset]\n }],\n /**\n * End\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n end: [{\n end: [inset]\n }],\n /**\n * Top\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n top: [{\n top: [inset]\n }],\n /**\n * Right\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n right: [{\n right: [inset]\n }],\n /**\n * Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n bottom: [{\n bottom: [inset]\n }],\n /**\n * Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n left: [{\n left: [inset]\n }],\n /**\n * Visibility\n * @see https://tailwindcss.com/docs/visibility\n */\n visibility: ['visible', 'invisible', 'collapse'],\n /**\n * Z-Index\n * @see https://tailwindcss.com/docs/z-index\n */\n z: [{\n z: ['auto', isInteger, isArbitraryValue]\n }],\n // Flexbox and Grid\n /**\n * Flex Basis\n * @see https://tailwindcss.com/docs/flex-basis\n */\n basis: [{\n basis: getSpacingWithAutoAndArbitrary()\n }],\n /**\n * Flex Direction\n * @see https://tailwindcss.com/docs/flex-direction\n */\n 'flex-direction': [{\n flex: ['row', 'row-reverse', 'col', 'col-reverse']\n }],\n /**\n * Flex Wrap\n * @see https://tailwindcss.com/docs/flex-wrap\n */\n 'flex-wrap': [{\n flex: ['wrap', 'wrap-reverse', 'nowrap']\n }],\n /**\n * Flex\n * @see https://tailwindcss.com/docs/flex\n */\n flex: [{\n flex: ['1', 'auto', 'initial', 'none', isArbitraryValue]\n }],\n /**\n * Flex Grow\n * @see https://tailwindcss.com/docs/flex-grow\n */\n grow: [{\n grow: getZeroAndEmpty()\n }],\n /**\n * Flex Shrink\n * @see https://tailwindcss.com/docs/flex-shrink\n */\n shrink: [{\n shrink: getZeroAndEmpty()\n }],\n /**\n * Order\n * @see https://tailwindcss.com/docs/order\n */\n order: [{\n order: ['first', 'last', 'none', isInteger, isArbitraryValue]\n }],\n /**\n * Grid Template Columns\n * @see https://tailwindcss.com/docs/grid-template-columns\n */\n 'grid-cols': [{\n 'grid-cols': [isAny]\n }],\n /**\n * Grid Column Start / End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start-end': [{\n col: ['auto', {\n span: ['full', isInteger, isArbitraryValue]\n }, isArbitraryValue]\n }],\n /**\n * Grid Column Start\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start': [{\n 'col-start': getNumberWithAutoAndArbitrary()\n }],\n /**\n * Grid Column End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-end': [{\n 'col-end': getNumberWithAutoAndArbitrary()\n }],\n /**\n * Grid Template Rows\n * @see https://tailwindcss.com/docs/grid-template-rows\n */\n 'grid-rows': [{\n 'grid-rows': [isAny]\n }],\n /**\n * Grid Row Start / End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start-end': [{\n row: ['auto', {\n span: [isInteger, isArbitraryValue]\n }, isArbitraryValue]\n }],\n /**\n * Grid Row Start\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start': [{\n 'row-start': getNumberWithAutoAndArbitrary()\n }],\n /**\n * Grid Row End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-end': [{\n 'row-end': getNumberWithAutoAndArbitrary()\n }],\n /**\n * Grid Auto Flow\n * @see https://tailwindcss.com/docs/grid-auto-flow\n */\n 'grid-flow': [{\n 'grid-flow': ['row', 'col', 'dense', 'row-dense', 'col-dense']\n }],\n /**\n * Grid Auto Columns\n * @see https://tailwindcss.com/docs/grid-auto-columns\n */\n 'auto-cols': [{\n 'auto-cols': ['auto', 'min', 'max', 'fr', isArbitraryValue]\n }],\n /**\n * Grid Auto Rows\n * @see https://tailwindcss.com/docs/grid-auto-rows\n */\n 'auto-rows': [{\n 'auto-rows': ['auto', 'min', 'max', 'fr', isArbitraryValue]\n }],\n /**\n * Gap\n * @see https://tailwindcss.com/docs/gap\n */\n gap: [{\n gap: [gap]\n }],\n /**\n * Gap X\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-x': [{\n 'gap-x': [gap]\n }],\n /**\n * Gap Y\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-y': [{\n 'gap-y': [gap]\n }],\n /**\n * Justify Content\n * @see https://tailwindcss.com/docs/justify-content\n */\n 'justify-content': [{\n justify: ['normal', ...getAlign()]\n }],\n /**\n * Justify Items\n * @see https://tailwindcss.com/docs/justify-items\n */\n 'justify-items': [{\n 'justify-items': ['start', 'end', 'center', 'stretch']\n }],\n /**\n * Justify Self\n * @see https://tailwindcss.com/docs/justify-self\n */\n 'justify-self': [{\n 'justify-self': ['auto', 'start', 'end', 'center', 'stretch']\n }],\n /**\n * Align Content\n * @see https://tailwindcss.com/docs/align-content\n */\n 'align-content': [{\n content: ['normal', ...getAlign(), 'baseline']\n }],\n /**\n * Align Items\n * @see https://tailwindcss.com/docs/align-items\n */\n 'align-items': [{\n items: ['start', 'end', 'center', 'baseline', 'stretch']\n }],\n /**\n * Align Self\n * @see https://tailwindcss.com/docs/align-self\n */\n 'align-self': [{\n self: ['auto', 'start', 'end', 'center', 'stretch', 'baseline']\n }],\n /**\n * Place Content\n * @see https://tailwindcss.com/docs/place-content\n */\n 'place-content': [{\n 'place-content': [...getAlign(), 'baseline']\n }],\n /**\n * Place Items\n * @see https://tailwindcss.com/docs/place-items\n */\n 'place-items': [{\n 'place-items': ['start', 'end', 'center', 'baseline', 'stretch']\n }],\n /**\n * Place Self\n * @see https://tailwindcss.com/docs/place-self\n */\n 'place-self': [{\n 'place-self': ['auto', 'start', 'end', 'center', 'stretch']\n }],\n // Spacing\n /**\n * Padding\n * @see https://tailwindcss.com/docs/padding\n */\n p: [{\n p: [padding]\n }],\n /**\n * Padding X\n * @see https://tailwindcss.com/docs/padding\n */\n px: [{\n px: [padding]\n }],\n /**\n * Padding Y\n * @see https://tailwindcss.com/docs/padding\n */\n py: [{\n py: [padding]\n }],\n /**\n * Padding Start\n * @see https://tailwindcss.com/docs/padding\n */\n ps: [{\n ps: [padding]\n }],\n /**\n * Padding End\n * @see https://tailwindcss.com/docs/padding\n */\n pe: [{\n pe: [padding]\n }],\n /**\n * Padding Top\n * @see https://tailwindcss.com/docs/padding\n */\n pt: [{\n pt: [padding]\n }],\n /**\n * Padding Right\n * @see https://tailwindcss.com/docs/padding\n */\n pr: [{\n pr: [padding]\n }],\n /**\n * Padding Bottom\n * @see https://tailwindcss.com/docs/padding\n */\n pb: [{\n pb: [padding]\n }],\n /**\n * Padding Left\n * @see https://tailwindcss.com/docs/padding\n */\n pl: [{\n pl: [padding]\n }],\n /**\n * Margin\n * @see https://tailwindcss.com/docs/margin\n */\n m: [{\n m: [margin]\n }],\n /**\n * Margin X\n * @see https://tailwindcss.com/docs/margin\n */\n mx: [{\n mx: [margin]\n }],\n /**\n * Margin Y\n * @see https://tailwindcss.com/docs/margin\n */\n my: [{\n my: [margin]\n }],\n /**\n * Margin Start\n * @see https://tailwindcss.com/docs/margin\n */\n ms: [{\n ms: [margin]\n }],\n /**\n * Margin End\n * @see https://tailwindcss.com/docs/margin\n */\n me: [{\n me: [margin]\n }],\n /**\n * Margin Top\n * @see https://tailwindcss.com/docs/margin\n */\n mt: [{\n mt: [margin]\n }],\n /**\n * Margin Right\n * @see https://tailwindcss.com/docs/margin\n */\n mr: [{\n mr: [margin]\n }],\n /**\n * Margin Bottom\n * @see https://tailwindcss.com/docs/margin\n */\n mb: [{\n mb: [margin]\n }],\n /**\n * Margin Left\n * @see https://tailwindcss.com/docs/margin\n */\n ml: [{\n ml: [margin]\n }],\n /**\n * Space Between X\n * @see https://tailwindcss.com/docs/space\n */\n 'space-x': [{\n 'space-x': [space]\n }],\n /**\n * Space Between X Reverse\n * @see https://tailwindcss.com/docs/space\n */\n 'space-x-reverse': ['space-x-reverse'],\n /**\n * Space Between Y\n * @see https://tailwindcss.com/docs/space\n */\n 'space-y': [{\n 'space-y': [space]\n }],\n /**\n * Space Between Y Reverse\n * @see https://tailwindcss.com/docs/space\n */\n 'space-y-reverse': ['space-y-reverse'],\n // Sizing\n /**\n * Width\n * @see https://tailwindcss.com/docs/width\n */\n w: [{\n w: ['auto', 'min', 'max', 'fit', 'svw', 'lvw', 'dvw', isArbitraryValue, spacing]\n }],\n /**\n * Min-Width\n * @see https://tailwindcss.com/docs/min-width\n */\n 'min-w': [{\n 'min-w': [isArbitraryValue, spacing, 'min', 'max', 'fit']\n }],\n /**\n * Max-Width\n * @see https://tailwindcss.com/docs/max-width\n */\n 'max-w': [{\n 'max-w': [isArbitraryValue, spacing, 'none', 'full', 'min', 'max', 'fit', 'prose', {\n screen: [isTshirtSize]\n }, isTshirtSize]\n }],\n /**\n * Height\n * @see https://tailwindcss.com/docs/height\n */\n h: [{\n h: [isArbitraryValue, spacing, 'auto', 'min', 'max', 'fit', 'svh', 'lvh', 'dvh']\n }],\n /**\n * Min-Height\n * @see https://tailwindcss.com/docs/min-height\n */\n 'min-h': [{\n 'min-h': [isArbitraryValue, spacing, 'min', 'max', 'fit', 'svh', 'lvh', 'dvh']\n }],\n /**\n * Max-Height\n * @see https://tailwindcss.com/docs/max-height\n */\n 'max-h': [{\n 'max-h': [isArbitraryValue, spacing, 'min', 'max', 'fit', 'svh', 'lvh', 'dvh']\n }],\n /**\n * Size\n * @see https://tailwindcss.com/docs/size\n */\n size: [{\n size: [isArbitraryValue, spacing, 'auto', 'min', 'max', 'fit']\n }],\n // Typography\n /**\n * Font Size\n * @see https://tailwindcss.com/docs/font-size\n */\n 'font-size': [{\n text: ['base', isTshirtSize, isArbitraryLength]\n }],\n /**\n * Font Smoothing\n * @see https://tailwindcss.com/docs/font-smoothing\n */\n 'font-smoothing': ['antialiased', 'subpixel-antialiased'],\n /**\n * Font Style\n * @see https://tailwindcss.com/docs/font-style\n */\n 'font-style': ['italic', 'not-italic'],\n /**\n * Font Weight\n * @see https://tailwindcss.com/docs/font-weight\n */\n 'font-weight': [{\n font: ['thin', 'extralight', 'light', 'normal', 'medium', 'semibold', 'bold', 'extrabold', 'black', isArbitraryNumber]\n }],\n /**\n * Font Family\n * @see https://tailwindcss.com/docs/font-family\n */\n 'font-family': [{\n font: [isAny]\n }],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-normal': ['normal-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-ordinal': ['ordinal'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-slashed-zero': ['slashed-zero'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-figure': ['lining-nums', 'oldstyle-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-spacing': ['proportional-nums', 'tabular-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-fraction': ['diagonal-fractions', 'stacked-fractions'],\n /**\n * Letter Spacing\n * @see https://tailwindcss.com/docs/letter-spacing\n */\n tracking: [{\n tracking: ['tighter', 'tight', 'normal', 'wide', 'wider', 'widest', isArbitraryValue]\n }],\n /**\n * Line Clamp\n * @see https://tailwindcss.com/docs/line-clamp\n */\n 'line-clamp': [{\n 'line-clamp': ['none', isNumber, isArbitraryNumber]\n }],\n /**\n * Line Height\n * @see https://tailwindcss.com/docs/line-height\n */\n leading: [{\n leading: ['none', 'tight', 'snug', 'normal', 'relaxed', 'loose', isLength, isArbitraryValue]\n }],\n /**\n * List Style Image\n * @see https://tailwindcss.com/docs/list-style-image\n */\n 'list-image': [{\n 'list-image': ['none', isArbitraryValue]\n }],\n /**\n * List Style Type\n * @see https://tailwindcss.com/docs/list-style-type\n */\n 'list-style-type': [{\n list: ['none', 'disc', 'decimal', isArbitraryValue]\n }],\n /**\n * List Style Position\n * @see https://tailwindcss.com/docs/list-style-position\n */\n 'list-style-position': [{\n list: ['inside', 'outside']\n }],\n /**\n * Placeholder Color\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/placeholder-color\n */\n 'placeholder-color': [{\n placeholder: [colors]\n }],\n /**\n * Placeholder Opacity\n * @see https://tailwindcss.com/docs/placeholder-opacity\n */\n 'placeholder-opacity': [{\n 'placeholder-opacity': [opacity]\n }],\n /**\n * Text Alignment\n * @see https://tailwindcss.com/docs/text-align\n */\n 'text-alignment': [{\n text: ['left', 'center', 'right', 'justify', 'start', 'end']\n }],\n /**\n * Text Color\n * @see https://tailwindcss.com/docs/text-color\n */\n 'text-color': [{\n text: [colors]\n }],\n /**\n * Text Opacity\n * @see https://tailwindcss.com/docs/text-opacity\n */\n 'text-opacity': [{\n 'text-opacity': [opacity]\n }],\n /**\n * Text Decoration\n * @see https://tailwindcss.com/docs/text-decoration\n */\n 'text-decoration': ['underline', 'overline', 'line-through', 'no-underline'],\n /**\n * Text Decoration Style\n * @see https://tailwindcss.com/docs/text-decoration-style\n */\n 'text-decoration-style': [{\n decoration: [...getLineStyles(), 'wavy']\n }],\n /**\n * Text Decoration Thickness\n * @see https://tailwindcss.com/docs/text-decoration-thickness\n */\n 'text-decoration-thickness': [{\n decoration: ['auto', 'from-font', isLength, isArbitraryLength]\n }],\n /**\n * Text Underline Offset\n * @see https://tailwindcss.com/docs/text-underline-offset\n */\n 'underline-offset': [{\n 'underline-offset': ['auto', isLength, isArbitraryValue]\n }],\n /**\n * Text Decoration Color\n * @see https://tailwindcss.com/docs/text-decoration-color\n */\n 'text-decoration-color': [{\n decoration: [colors]\n }],\n /**\n * Text Transform\n * @see https://tailwindcss.com/docs/text-transform\n */\n 'text-transform': ['uppercase', 'lowercase', 'capitalize', 'normal-case'],\n /**\n * Text Overflow\n * @see https://tailwindcss.com/docs/text-overflow\n */\n 'text-overflow': ['truncate', 'text-ellipsis', 'text-clip'],\n /**\n * Text Wrap\n * @see https://tailwindcss.com/docs/text-wrap\n */\n 'text-wrap': [{\n text: ['wrap', 'nowrap', 'balance', 'pretty']\n }],\n /**\n * Text Indent\n * @see https://tailwindcss.com/docs/text-indent\n */\n indent: [{\n indent: getSpacingWithArbitrary()\n }],\n /**\n * Vertical Alignment\n * @see https://tailwindcss.com/docs/vertical-align\n */\n 'vertical-align': [{\n align: ['baseline', 'top', 'middle', 'bottom', 'text-top', 'text-bottom', 'sub', 'super', isArbitraryValue]\n }],\n /**\n * Whitespace\n * @see https://tailwindcss.com/docs/whitespace\n */\n whitespace: [{\n whitespace: ['normal', 'nowrap', 'pre', 'pre-line', 'pre-wrap', 'break-spaces']\n }],\n /**\n * Word Break\n * @see https://tailwindcss.com/docs/word-break\n */\n break: [{\n break: ['normal', 'words', 'all', 'keep']\n }],\n /**\n * Hyphens\n * @see https://tailwindcss.com/docs/hyphens\n */\n hyphens: [{\n hyphens: ['none', 'manual', 'auto']\n }],\n /**\n * Content\n * @see https://tailwindcss.com/docs/content\n */\n content: [{\n content: ['none', isArbitraryValue]\n }],\n // Backgrounds\n /**\n * Background Attachment\n * @see https://tailwindcss.com/docs/background-attachment\n */\n 'bg-attachment': [{\n bg: ['fixed', 'local', 'scroll']\n }],\n /**\n * Background Clip\n * @see https://tailwindcss.com/docs/background-clip\n */\n 'bg-clip': [{\n 'bg-clip': ['border', 'padding', 'content', 'text']\n }],\n /**\n * Background Opacity\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/background-opacity\n */\n 'bg-opacity': [{\n 'bg-opacity': [opacity]\n }],\n /**\n * Background Origin\n * @see https://tailwindcss.com/docs/background-origin\n */\n 'bg-origin': [{\n 'bg-origin': ['border', 'padding', 'content']\n }],\n /**\n * Background Position\n * @see https://tailwindcss.com/docs/background-position\n */\n 'bg-position': [{\n bg: [...getPositions(), isArbitraryPosition]\n }],\n /**\n * Background Repeat\n * @see https://tailwindcss.com/docs/background-repeat\n */\n 'bg-repeat': [{\n bg: ['no-repeat', {\n repeat: ['', 'x', 'y', 'round', 'space']\n }]\n }],\n /**\n * Background Size\n * @see https://tailwindcss.com/docs/background-size\n */\n 'bg-size': [{\n bg: ['auto', 'cover', 'contain', isArbitrarySize]\n }],\n /**\n * Background Image\n * @see https://tailwindcss.com/docs/background-image\n */\n 'bg-image': [{\n bg: ['none', {\n 'gradient-to': ['t', 'tr', 'r', 'br', 'b', 'bl', 'l', 'tl']\n }, isArbitraryImage]\n }],\n /**\n * Background Color\n * @see https://tailwindcss.com/docs/background-color\n */\n 'bg-color': [{\n bg: [colors]\n }],\n /**\n * Gradient Color Stops From Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from-pos': [{\n from: [gradientColorStopPositions]\n }],\n /**\n * Gradient Color Stops Via Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via-pos': [{\n via: [gradientColorStopPositions]\n }],\n /**\n * Gradient Color Stops To Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to-pos': [{\n to: [gradientColorStopPositions]\n }],\n /**\n * Gradient Color Stops From\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from': [{\n from: [gradientColorStops]\n }],\n /**\n * Gradient Color Stops Via\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via': [{\n via: [gradientColorStops]\n }],\n /**\n * Gradient Color Stops To\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to': [{\n to: [gradientColorStops]\n }],\n // Borders\n /**\n * Border Radius\n * @see https://tailwindcss.com/docs/border-radius\n */\n rounded: [{\n rounded: [borderRadius]\n }],\n /**\n * Border Radius Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-s': [{\n 'rounded-s': [borderRadius]\n }],\n /**\n * Border Radius End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-e': [{\n 'rounded-e': [borderRadius]\n }],\n /**\n * Border Radius Top\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-t': [{\n 'rounded-t': [borderRadius]\n }],\n /**\n * Border Radius Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-r': [{\n 'rounded-r': [borderRadius]\n }],\n /**\n * Border Radius Bottom\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-b': [{\n 'rounded-b': [borderRadius]\n }],\n /**\n * Border Radius Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-l': [{\n 'rounded-l': [borderRadius]\n }],\n /**\n * Border Radius Start Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ss': [{\n 'rounded-ss': [borderRadius]\n }],\n /**\n * Border Radius Start End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-se': [{\n 'rounded-se': [borderRadius]\n }],\n /**\n * Border Radius End End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ee': [{\n 'rounded-ee': [borderRadius]\n }],\n /**\n * Border Radius End Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-es': [{\n 'rounded-es': [borderRadius]\n }],\n /**\n * Border Radius Top Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tl': [{\n 'rounded-tl': [borderRadius]\n }],\n /**\n * Border Radius Top Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tr': [{\n 'rounded-tr': [borderRadius]\n }],\n /**\n * Border Radius Bottom Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-br': [{\n 'rounded-br': [borderRadius]\n }],\n /**\n * Border Radius Bottom Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-bl': [{\n 'rounded-bl': [borderRadius]\n }],\n /**\n * Border Width\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w': [{\n border: [borderWidth]\n }],\n /**\n * Border Width X\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-x': [{\n 'border-x': [borderWidth]\n }],\n /**\n * Border Width Y\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-y': [{\n 'border-y': [borderWidth]\n }],\n /**\n * Border Width Start\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-s': [{\n 'border-s': [borderWidth]\n }],\n /**\n * Border Width End\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-e': [{\n 'border-e': [borderWidth]\n }],\n /**\n * Border Width Top\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-t': [{\n 'border-t': [borderWidth]\n }],\n /**\n * Border Width Right\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-r': [{\n 'border-r': [borderWidth]\n }],\n /**\n * Border Width Bottom\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-b': [{\n 'border-b': [borderWidth]\n }],\n /**\n * Border Width Left\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-l': [{\n 'border-l': [borderWidth]\n }],\n /**\n * Border Opacity\n * @see https://tailwindcss.com/docs/border-opacity\n */\n 'border-opacity': [{\n 'border-opacity': [opacity]\n }],\n /**\n * Border Style\n * @see https://tailwindcss.com/docs/border-style\n */\n 'border-style': [{\n border: [...getLineStyles(), 'hidden']\n }],\n /**\n * Divide Width X\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-x': [{\n 'divide-x': [borderWidth]\n }],\n /**\n * Divide Width X Reverse\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-x-reverse': ['divide-x-reverse'],\n /**\n * Divide Width Y\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-y': [{\n 'divide-y': [borderWidth]\n }],\n /**\n * Divide Width Y Reverse\n * @see https://tailwindcss.com/docs/divide-width\n */\n 'divide-y-reverse': ['divide-y-reverse'],\n /**\n * Divide Opacity\n * @see https://tailwindcss.com/docs/divide-opacity\n */\n 'divide-opacity': [{\n 'divide-opacity': [opacity]\n }],\n /**\n * Divide Style\n * @see https://tailwindcss.com/docs/divide-style\n */\n 'divide-style': [{\n divide: getLineStyles()\n }],\n /**\n * Border Color\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color': [{\n border: [borderColor]\n }],\n /**\n * Border Color X\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-x': [{\n 'border-x': [borderColor]\n }],\n /**\n * Border Color Y\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-y': [{\n 'border-y': [borderColor]\n }],\n /**\n * Border Color S\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-s': [{\n 'border-s': [borderColor]\n }],\n /**\n * Border Color E\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-e': [{\n 'border-e': [borderColor]\n }],\n /**\n * Border Color Top\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-t': [{\n 'border-t': [borderColor]\n }],\n /**\n * Border Color Right\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-r': [{\n 'border-r': [borderColor]\n }],\n /**\n * Border Color Bottom\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-b': [{\n 'border-b': [borderColor]\n }],\n /**\n * Border Color Left\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-l': [{\n 'border-l': [borderColor]\n }],\n /**\n * Divide Color\n * @see https://tailwindcss.com/docs/divide-color\n */\n 'divide-color': [{\n divide: [borderColor]\n }],\n /**\n * Outline Style\n * @see https://tailwindcss.com/docs/outline-style\n */\n 'outline-style': [{\n outline: ['', ...getLineStyles()]\n }],\n /**\n * Outline Offset\n * @see https://tailwindcss.com/docs/outline-offset\n */\n 'outline-offset': [{\n 'outline-offset': [isLength, isArbitraryValue]\n }],\n /**\n * Outline Width\n * @see https://tailwindcss.com/docs/outline-width\n */\n 'outline-w': [{\n outline: [isLength, isArbitraryLength]\n }],\n /**\n * Outline Color\n * @see https://tailwindcss.com/docs/outline-color\n */\n 'outline-color': [{\n outline: [colors]\n }],\n /**\n * Ring Width\n * @see https://tailwindcss.com/docs/ring-width\n */\n 'ring-w': [{\n ring: getLengthWithEmptyAndArbitrary()\n }],\n /**\n * Ring Width Inset\n * @see https://tailwindcss.com/docs/ring-width\n */\n 'ring-w-inset': ['ring-inset'],\n /**\n * Ring Color\n * @see https://tailwindcss.com/docs/ring-color\n */\n 'ring-color': [{\n ring: [colors]\n }],\n /**\n * Ring Opacity\n * @see https://tailwindcss.com/docs/ring-opacity\n */\n 'ring-opacity': [{\n 'ring-opacity': [opacity]\n }],\n /**\n * Ring Offset Width\n * @see https://tailwindcss.com/docs/ring-offset-width\n */\n 'ring-offset-w': [{\n 'ring-offset': [isLength, isArbitraryLength]\n }],\n /**\n * Ring Offset Color\n * @see https://tailwindcss.com/docs/ring-offset-color\n */\n 'ring-offset-color': [{\n 'ring-offset': [colors]\n }],\n // Effects\n /**\n * Box Shadow\n * @see https://tailwindcss.com/docs/box-shadow\n */\n shadow: [{\n shadow: ['', 'inner', 'none', isTshirtSize, isArbitraryShadow]\n }],\n /**\n * Box Shadow Color\n * @see https://tailwindcss.com/docs/box-shadow-color\n */\n 'shadow-color': [{\n shadow: [isAny]\n }],\n /**\n * Opacity\n * @see https://tailwindcss.com/docs/opacity\n */\n opacity: [{\n opacity: [opacity]\n }],\n /**\n * Mix Blend Mode\n * @see https://tailwindcss.com/docs/mix-blend-mode\n */\n 'mix-blend': [{\n 'mix-blend': [...getBlendModes(), 'plus-lighter', 'plus-darker']\n }],\n /**\n * Background Blend Mode\n * @see https://tailwindcss.com/docs/background-blend-mode\n */\n 'bg-blend': [{\n 'bg-blend': getBlendModes()\n }],\n // Filters\n /**\n * Filter\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/filter\n */\n filter: [{\n filter: ['', 'none']\n }],\n /**\n * Blur\n * @see https://tailwindcss.com/docs/blur\n */\n blur: [{\n blur: [blur]\n }],\n /**\n * Brightness\n * @see https://tailwindcss.com/docs/brightness\n */\n brightness: [{\n brightness: [brightness]\n }],\n /**\n * Contrast\n * @see https://tailwindcss.com/docs/contrast\n */\n contrast: [{\n contrast: [contrast]\n }],\n /**\n * Drop Shadow\n * @see https://tailwindcss.com/docs/drop-shadow\n */\n 'drop-shadow': [{\n 'drop-shadow': ['', 'none', isTshirtSize, isArbitraryValue]\n }],\n /**\n * Grayscale\n * @see https://tailwindcss.com/docs/grayscale\n */\n grayscale: [{\n grayscale: [grayscale]\n }],\n /**\n * Hue Rotate\n * @see https://tailwindcss.com/docs/hue-rotate\n */\n 'hue-rotate': [{\n 'hue-rotate': [hueRotate]\n }],\n /**\n * Invert\n * @see https://tailwindcss.com/docs/invert\n */\n invert: [{\n invert: [invert]\n }],\n /**\n * Saturate\n * @see https://tailwindcss.com/docs/saturate\n */\n saturate: [{\n saturate: [saturate]\n }],\n /**\n * Sepia\n * @see https://tailwindcss.com/docs/sepia\n */\n sepia: [{\n sepia: [sepia]\n }],\n /**\n * Backdrop Filter\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://tailwindcss.com/docs/backdrop-filter\n */\n 'backdrop-filter': [{\n 'backdrop-filter': ['', 'none']\n }],\n /**\n * Backdrop Blur\n * @see https://tailwindcss.com/docs/backdrop-blur\n */\n 'backdrop-blur': [{\n 'backdrop-blur': [blur]\n }],\n /**\n * Backdrop Brightness\n * @see https://tailwindcss.com/docs/backdrop-brightness\n */\n 'backdrop-brightness': [{\n 'backdrop-brightness': [brightness]\n }],\n /**\n * Backdrop Contrast\n * @see https://tailwindcss.com/docs/backdrop-contrast\n */\n 'backdrop-contrast': [{\n 'backdrop-contrast': [contrast]\n }],\n /**\n * Backdrop Grayscale\n * @see https://tailwindcss.com/docs/backdrop-grayscale\n */\n 'backdrop-grayscale': [{\n 'backdrop-grayscale': [grayscale]\n }],\n /**\n * Backdrop Hue Rotate\n * @see https://tailwindcss.com/docs/backdrop-hue-rotate\n */\n 'backdrop-hue-rotate': [{\n 'backdrop-hue-rotate': [hueRotate]\n }],\n /**\n * Backdrop Invert\n * @see https://tailwindcss.com/docs/backdrop-invert\n */\n 'backdrop-invert': [{\n 'backdrop-invert': [invert]\n }],\n /**\n * Backdrop Opacity\n * @see https://tailwindcss.com/docs/backdrop-opacity\n */\n 'backdrop-opacity': [{\n 'backdrop-opacity': [opacity]\n }],\n /**\n * Backdrop Saturate\n * @see https://tailwindcss.com/docs/backdrop-saturate\n */\n 'backdrop-saturate': [{\n 'backdrop-saturate': [saturate]\n }],\n /**\n * Backdrop Sepia\n * @see https://tailwindcss.com/docs/backdrop-sepia\n */\n 'backdrop-sepia': [{\n 'backdrop-sepia': [sepia]\n }],\n // Tables\n /**\n * Border Collapse\n * @see https://tailwindcss.com/docs/border-collapse\n */\n 'border-collapse': [{\n border: ['collapse', 'separate']\n }],\n /**\n * Border Spacing\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing': [{\n 'border-spacing': [borderSpacing]\n }],\n /**\n * Border Spacing X\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-x': [{\n 'border-spacing-x': [borderSpacing]\n }],\n /**\n * Border Spacing Y\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-y': [{\n 'border-spacing-y': [borderSpacing]\n }],\n /**\n * Table Layout\n * @see https://tailwindcss.com/docs/table-layout\n */\n 'table-layout': [{\n table: ['auto', 'fixed']\n }],\n /**\n * Caption Side\n * @see https://tailwindcss.com/docs/caption-side\n */\n caption: [{\n caption: ['top', 'bottom']\n }],\n // Transitions and Animation\n /**\n * Tranisition Property\n * @see https://tailwindcss.com/docs/transition-property\n */\n transition: [{\n transition: ['none', 'all', '', 'colors', 'opacity', 'shadow', 'transform', isArbitraryValue]\n }],\n /**\n * Transition Duration\n * @see https://tailwindcss.com/docs/transition-duration\n */\n duration: [{\n duration: getNumberAndArbitrary()\n }],\n /**\n * Transition Timing Function\n * @see https://tailwindcss.com/docs/transition-timing-function\n */\n ease: [{\n ease: ['linear', 'in', 'out', 'in-out', isArbitraryValue]\n }],\n /**\n * Transition Delay\n * @see https://tailwindcss.com/docs/transition-delay\n */\n delay: [{\n delay: getNumberAndArbitrary()\n }],\n /**\n * Animation\n * @see https://tailwindcss.com/docs/animation\n */\n animate: [{\n animate: ['none', 'spin', 'ping', 'pulse', 'bounce', isArbitraryValue]\n }],\n // Transforms\n /**\n * Transform\n * @see https://tailwindcss.com/docs/transform\n */\n transform: [{\n transform: ['', 'gpu', 'none']\n }],\n /**\n * Scale\n * @see https://tailwindcss.com/docs/scale\n */\n scale: [{\n scale: [scale]\n }],\n /**\n * Scale X\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-x': [{\n 'scale-x': [scale]\n }],\n /**\n * Scale Y\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-y': [{\n 'scale-y': [scale]\n }],\n /**\n * Rotate\n * @see https://tailwindcss.com/docs/rotate\n */\n rotate: [{\n rotate: [isInteger, isArbitraryValue]\n }],\n /**\n * Translate X\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-x': [{\n 'translate-x': [translate]\n }],\n /**\n * Translate Y\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-y': [{\n 'translate-y': [translate]\n }],\n /**\n * Skew X\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-x': [{\n 'skew-x': [skew]\n }],\n /**\n * Skew Y\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-y': [{\n 'skew-y': [skew]\n }],\n /**\n * Transform Origin\n * @see https://tailwindcss.com/docs/transform-origin\n */\n 'transform-origin': [{\n origin: ['center', 'top', 'top-right', 'right', 'bottom-right', 'bottom', 'bottom-left', 'left', 'top-left', isArbitraryValue]\n }],\n // Interactivity\n /**\n * Accent Color\n * @see https://tailwindcss.com/docs/accent-color\n */\n accent: [{\n accent: ['auto', colors]\n }],\n /**\n * Appearance\n * @see https://tailwindcss.com/docs/appearance\n */\n appearance: [{\n appearance: ['none', 'auto']\n }],\n /**\n * Cursor\n * @see https://tailwindcss.com/docs/cursor\n */\n cursor: [{\n cursor: ['auto', 'default', 'pointer', 'wait', 'text', 'move', 'help', 'not-allowed', 'none', 'context-menu', 'progress', 'cell', 'crosshair', 'vertical-text', 'alias', 'copy', 'no-drop', 'grab', 'grabbing', 'all-scroll', 'col-resize', 'row-resize', 'n-resize', 'e-resize', 's-resize', 'w-resize', 'ne-resize', 'nw-resize', 'se-resize', 'sw-resize', 'ew-resize', 'ns-resize', 'nesw-resize', 'nwse-resize', 'zoom-in', 'zoom-out', isArbitraryValue]\n }],\n /**\n * Caret Color\n * @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities\n */\n 'caret-color': [{\n caret: [colors]\n }],\n /**\n * Pointer Events\n * @see https://tailwindcss.com/docs/pointer-events\n */\n 'pointer-events': [{\n 'pointer-events': ['none', 'auto']\n }],\n /**\n * Resize\n * @see https://tailwindcss.com/docs/resize\n */\n resize: [{\n resize: ['none', 'y', 'x', '']\n }],\n /**\n * Scroll Behavior\n * @see https://tailwindcss.com/docs/scroll-behavior\n */\n 'scroll-behavior': [{\n scroll: ['auto', 'smooth']\n }],\n /**\n * Scroll Margin\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-m': [{\n 'scroll-m': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Margin X\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mx': [{\n 'scroll-mx': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Margin Y\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-my': [{\n 'scroll-my': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Margin Start\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ms': [{\n 'scroll-ms': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Margin End\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-me': [{\n 'scroll-me': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Margin Top\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mt': [{\n 'scroll-mt': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Margin Right\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mr': [{\n 'scroll-mr': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Margin Bottom\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mb': [{\n 'scroll-mb': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Margin Left\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ml': [{\n 'scroll-ml': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Padding\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-p': [{\n 'scroll-p': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Padding X\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-px': [{\n 'scroll-px': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Padding Y\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-py': [{\n 'scroll-py': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Padding Start\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-ps': [{\n 'scroll-ps': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Padding End\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pe': [{\n 'scroll-pe': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Padding Top\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pt': [{\n 'scroll-pt': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Padding Right\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pr': [{\n 'scroll-pr': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Padding Bottom\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pb': [{\n 'scroll-pb': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Padding Left\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pl': [{\n 'scroll-pl': getSpacingWithArbitrary()\n }],\n /**\n * Scroll Snap Align\n * @see https://tailwindcss.com/docs/scroll-snap-align\n */\n 'snap-align': [{\n snap: ['start', 'end', 'center', 'align-none']\n }],\n /**\n * Scroll Snap Stop\n * @see https://tailwindcss.com/docs/scroll-snap-stop\n */\n 'snap-stop': [{\n snap: ['normal', 'always']\n }],\n /**\n * Scroll Snap Type\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-type': [{\n snap: ['none', 'x', 'y', 'both']\n }],\n /**\n * Scroll Snap Type Strictness\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-strictness': [{\n snap: ['mandatory', 'proximity']\n }],\n /**\n * Touch Action\n * @see https://tailwindcss.com/docs/touch-action\n */\n touch: [{\n touch: ['auto', 'none', 'manipulation']\n }],\n /**\n * Touch Action X\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-x': [{\n 'touch-pan': ['x', 'left', 'right']\n }],\n /**\n * Touch Action Y\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-y': [{\n 'touch-pan': ['y', 'up', 'down']\n }],\n /**\n * Touch Action Pinch Zoom\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-pz': ['touch-pinch-zoom'],\n /**\n * User Select\n * @see https://tailwindcss.com/docs/user-select\n */\n select: [{\n select: ['none', 'text', 'all', 'auto']\n }],\n /**\n * Will Change\n * @see https://tailwindcss.com/docs/will-change\n */\n 'will-change': [{\n 'will-change': ['auto', 'scroll', 'contents', 'transform', isArbitraryValue]\n }],\n // SVG\n /**\n * Fill\n * @see https://tailwindcss.com/docs/fill\n */\n fill: [{\n fill: [colors, 'none']\n }],\n /**\n * Stroke Width\n * @see https://tailwindcss.com/docs/stroke-width\n */\n 'stroke-w': [{\n stroke: [isLength, isArbitraryLength, isArbitraryNumber]\n }],\n /**\n * Stroke\n * @see https://tailwindcss.com/docs/stroke\n */\n stroke: [{\n stroke: [colors, 'none']\n }],\n // Accessibility\n /**\n * Screen Readers\n * @see https://tailwindcss.com/docs/screen-readers\n */\n sr: ['sr-only', 'not-sr-only'],\n /**\n * Forced Color Adjust\n * @see https://tailwindcss.com/docs/forced-color-adjust\n */\n 'forced-color-adjust': [{\n 'forced-color-adjust': ['auto', 'none']\n }]\n },\n conflictingClassGroups: {\n overflow: ['overflow-x', 'overflow-y'],\n overscroll: ['overscroll-x', 'overscroll-y'],\n inset: ['inset-x', 'inset-y', 'start', 'end', 'top', 'right', 'bottom', 'left'],\n 'inset-x': ['right', 'left'],\n 'inset-y': ['top', 'bottom'],\n flex: ['basis', 'grow', 'shrink'],\n gap: ['gap-x', 'gap-y'],\n p: ['px', 'py', 'ps', 'pe', 'pt', 'pr', 'pb', 'pl'],\n px: ['pr', 'pl'],\n py: ['pt', 'pb'],\n m: ['mx', 'my', 'ms', 'me', 'mt', 'mr', 'mb', 'ml'],\n mx: ['mr', 'ml'],\n my: ['mt', 'mb'],\n size: ['w', 'h'],\n 'font-size': ['leading'],\n 'fvn-normal': ['fvn-ordinal', 'fvn-slashed-zero', 'fvn-figure', 'fvn-spacing', 'fvn-fraction'],\n 'fvn-ordinal': ['fvn-normal'],\n 'fvn-slashed-zero': ['fvn-normal'],\n 'fvn-figure': ['fvn-normal'],\n 'fvn-spacing': ['fvn-normal'],\n 'fvn-fraction': ['fvn-normal'],\n 'line-clamp': ['display', 'overflow'],\n rounded: ['rounded-s', 'rounded-e', 'rounded-t', 'rounded-r', 'rounded-b', 'rounded-l', 'rounded-ss', 'rounded-se', 'rounded-ee', 'rounded-es', 'rounded-tl', 'rounded-tr', 'rounded-br', 'rounded-bl'],\n 'rounded-s': ['rounded-ss', 'rounded-es'],\n 'rounded-e': ['rounded-se', 'rounded-ee'],\n 'rounded-t': ['rounded-tl', 'rounded-tr'],\n 'rounded-r': ['rounded-tr', 'rounded-br'],\n 'rounded-b': ['rounded-br', 'rounded-bl'],\n 'rounded-l': ['rounded-tl', 'rounded-bl'],\n 'border-spacing': ['border-spacing-x', 'border-spacing-y'],\n 'border-w': ['border-w-s', 'border-w-e', 'border-w-t', 'border-w-r', 'border-w-b', 'border-w-l'],\n 'border-w-x': ['border-w-r', 'border-w-l'],\n 'border-w-y': ['border-w-t', 'border-w-b'],\n 'border-color': ['border-color-s', 'border-color-e', 'border-color-t', 'border-color-r', 'border-color-b', 'border-color-l'],\n 'border-color-x': ['border-color-r', 'border-color-l'],\n 'border-color-y': ['border-color-t', 'border-color-b'],\n 'scroll-m': ['scroll-mx', 'scroll-my', 'scroll-ms', 'scroll-me', 'scroll-mt', 'scroll-mr', 'scroll-mb', 'scroll-ml'],\n 'scroll-mx': ['scroll-mr', 'scroll-ml'],\n 'scroll-my': ['scroll-mt', 'scroll-mb'],\n 'scroll-p': ['scroll-px', 'scroll-py', 'scroll-ps', 'scroll-pe', 'scroll-pt', 'scroll-pr', 'scroll-pb', 'scroll-pl'],\n 'scroll-px': ['scroll-pr', 'scroll-pl'],\n 'scroll-py': ['scroll-pt', 'scroll-pb'],\n touch: ['touch-x', 'touch-y', 'touch-pz'],\n 'touch-x': ['touch'],\n 'touch-y': ['touch'],\n 'touch-pz': ['touch']\n },\n conflictingClassGroupModifiers: {\n 'font-size': ['leading']\n }\n };\n};\n\n/**\n * @param baseConfig Config where other config will be merged into. This object will be mutated.\n * @param configExtension Partial config to merge into the `baseConfig`.\n */\nconst mergeConfigs = (baseConfig, {\n cacheSize,\n prefix,\n separator,\n experimentalParseClassName,\n extend = {},\n override = {}\n}) => {\n overrideProperty(baseConfig, 'cacheSize', cacheSize);\n overrideProperty(baseConfig, 'prefix', prefix);\n overrideProperty(baseConfig, 'separator', separator);\n overrideProperty(baseConfig, 'experimentalParseClassName', experimentalParseClassName);\n for (const configKey in override) {\n overrideConfigProperties(baseConfig[configKey], override[configKey]);\n }\n for (const key in extend) {\n mergeConfigProperties(baseConfig[key], extend[key]);\n }\n return baseConfig;\n};\nconst overrideProperty = (baseObject, overrideKey, overrideValue) => {\n if (overrideValue !== undefined) {\n baseObject[overrideKey] = overrideValue;\n }\n};\nconst overrideConfigProperties = (baseObject, overrideObject) => {\n if (overrideObject) {\n for (const key in overrideObject) {\n overrideProperty(baseObject, key, overrideObject[key]);\n }\n }\n};\nconst mergeConfigProperties = (baseObject, mergeObject) => {\n if (mergeObject) {\n for (const key in mergeObject) {\n const mergeValue = mergeObject[key];\n if (mergeValue !== undefined) {\n baseObject[key] = (baseObject[key] || []).concat(mergeValue);\n }\n }\n }\n};\nconst extendTailwindMerge = (configExtension, ...createConfig) => typeof configExtension === 'function' ? createTailwindMerge(getDefaultConfig, configExtension, ...createConfig) : createTailwindMerge(() => mergeConfigs(getDefaultConfig(), configExtension), ...createConfig);\nconst twMerge = /*#__PURE__*/createTailwindMerge(getDefaultConfig);\nexport { createTailwindMerge, extendTailwindMerge, fromTheme, getDefaultConfig, mergeConfigs, twJoin, twMerge, validators };\n//# sourceMappingURL=bundle-mjs.mjs.map\n","import { type ClassValue, clsx } from \"clsx\"\nimport { twMerge } from \"tailwind-merge\"\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","/**\n * Pure JSON parsing and text analysis utilities\n * Shared across persistence and UI layers\n */\n\n/**\n * Normalize Python-like JSON to valid JSON\n * Handles single quotes, True/False/None\n */\nfunction normalizePythonLikeJson(text: string): string | null {\n let inString = false;\n let escape = false;\n let normalized = \"\";\n\n for (const char of text) {\n if (char === \"\\\\\") {\n normalized += char;\n escape = !escape;\n continue;\n }\n if (char === \"'\" && !escape) {\n normalized += '\"';\n inString = !inString;\n continue;\n }\n normalized += char;\n escape = false;\n }\n\n const replacedBooleans = normalized\n .replace(/\\bTrue\\b/g, \"true\")\n .replace(/\\bFalse\\b/g, \"false\")\n .replace(/\\bNone\\b/g, \"null\");\n\n return replacedBooleans;\n}\n\n/**\n * Try to parse a JSON object/array safely.\n * \n * Includes a \"Best Effort\" recovery mode for Python-style string representations \n * (single quotes, True/False, None) which are common in AI agent outputs.\n * Since standard JSON.parse is tried first, this is zero-risk for valid JSON.\n * \n * Returns null if invalid or definitely not a JSON structure.\n */\nexport function parseJsonSafe(text: string): any | null {\n const t = text?.trim();\n if (!t) return null;\n if (!(t.startsWith(\"{\") || t.startsWith(\"[\"))) return null;\n try {\n return JSON.parse(t);\n } catch {\n const normalized = normalizePythonLikeJson(t);\n if (normalized) {\n try {\n return JSON.parse(normalized);\n } catch {\n return null;\n }\n }\n return null;\n }\n}\n\n/**\n * Detect if content looks like markdown (has markdown indicators)\n */\nexport function looksLikeMarkdown(text: string): boolean {\n if (typeof text !== \"string\") return false;\n // Check for common markdown patterns\n return /^[\\s\\n]*[-*]\\s|^[\\s\\n]*#+\\s|```|^\\s*\\[.*\\]\\(|^>\\s/.test(text);\n}\n","import type { \n ChatMessage, \n MessagePart, \n TextPart, \n ImagePart, \n FilePart\n} from \"@/types\";\n\n// ============ Role Guards ============\n\nexport function isHumanMessage(msg: ChatMessage): boolean {\n return msg.role === \"user\";\n}\n\nexport function isAIMessage(msg: ChatMessage): boolean {\n return msg.role === \"assistant\";\n}\n\nexport function isSystemMessage(msg: ChatMessage): boolean {\n return msg.role === \"system\";\n}\n\nexport function isToolMessage(msg: ChatMessage): boolean {\n return msg.role === \"tool\";\n}\n\n// ============ Content Block Guards ============\n\nexport function isTextPart(part: MessagePart): part is TextPart {\n return part.type === \"text\";\n}\n\nexport function isImagePart(part: MessagePart): part is ImagePart {\n return part.type === \"image_url\";\n}\n\nexport function isFilePart(part: MessagePart): part is FilePart {\n return part.type === \"file\";\n}\n","import type { ChatMessage, ImagePart, FilePart, ToolCall, TextPart } from \"@/types\";\nimport { isImagePart, isFilePart } from \"./guards\";\n\n/**\n * Extracts all text content from a message as a single string.\n */\nexport function extractTextContent(message: ChatMessage): string {\n if (!Array.isArray(message.content)) {\n // Handle string content (legacy format)\n return typeof message.content === \"string\" ? message.content : \"\";\n }\n \n return message.content\n .filter((p): p is TextPart => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\\n\")\n .trim();\n}\n\n/**\n * Extracts all images from a message.\n */\nexport function extractImageParts(message: ChatMessage): ImagePart[] {\n return message.content.filter(isImagePart);\n}\n\n/**\n * Extracts all files from a message.\n */\nexport function extractFileParts(message: ChatMessage): FilePart[] {\n return message.content.filter(isFilePart);\n}\n\n/**\n * Extracts all tool calls from an AI message.\n */\nexport function extractToolCalls(message: ChatMessage): ToolCall[] {\n return Array.isArray(message.toolCalls) ? message.toolCalls : [];\n}\n\n/**\n * Extracts all artifacts from a message list for gallery display.\n * Includes top-level artifacts from Tool messages and part-level artifacts from Tool Calls.\n */\nexport function extractAllArtifacts(messages: ChatMessage[]): any[] {\n const results: any[] = [];\n \n messages.forEach((m) => {\n // 1. Check top-level artifact (standard for ToolMessages)\n if (m.artifact) {\n results.push(m.artifact);\n }\n \n // 2. Check tool-call artifacts stored on the message\n if (Array.isArray(m.toolCalls)) {\n m.toolCalls.forEach(call => {\n if (call?.artifact) {\n results.push(call.artifact);\n }\n });\n }\n });\n \n return results;\n}\n","/**\n * Message utility functions for parsing, sanitizing, and rendering message content\n */\n\nimport { looksLikeMarkdown } from \"@/shared/utils/jsonUtils\";\n\n// -------------------- Display sanitization utilities --------------------\n\n/**\n * Check if an object is file-like (has file properties)\n */\nexport function isFileLike(x: any): boolean {\n return !!(\n x &&\n typeof x === \"object\" &&\n (x.type === \"file\" || x.mimeType || x.filename || x.sourceType === \"base64\")\n );\n}\n\n/**\n * Sanitize content for display by removing file-like objects and large content\n */\nexport function sanitizeForDisplay(x: any): any {\n if (typeof x === \"string\") {\n return x;\n }\n\n if (x && typeof x === \"object\") {\n if (Array.isArray(x)) {\n // Sanitize items, drop any that turned into undefined\n const arr = x.map(sanitizeForDisplay).filter(v => v !== undefined);\n // If nothing left, bubble up undefined so parents drop this array entirely\n if (!arr.length) {\n console.debug('[message-utils] sanitizeForDisplay - array emptied -> returning undefined', { originalLength: x.length });\n return undefined;\n }\n return arr;\n }\n\n // Omit file-like objects entirely\n if (isFileLike(x)) {\n try {\n console.debug('[message-utils] sanitizeForDisplay - dropping file-like object', {\n sampleFilename: x && (x.filename || x.name) ? (x.filename || x.name) : undefined,\n keys: Object.keys(x || {}),\n });\n } catch (e) {\n console.debug('[message-utils] sanitizeForDisplay - dropped file-like (unable to inspect)', { err: String(e) });\n }\n return undefined;\n }\n\n const out: any = {};\n for (const k of Object.keys(x)) {\n const v = x[k];\n if (k === \"data\" && typeof v === \"string\" && v.length > 100) {\n out[k] = `[base64 ${v.length} chars omitted]`;\n } else {\n const sv = sanitizeForDisplay(v);\n if (sv !== undefined) out[k] = sv; // drop file-like / emptied children\n }\n }\n // If no keys survived, bubble up undefined so parents drop this object\n if (Object.keys(out).length) {\n return out;\n } else {\n try {\n console.debug('[message-utils] sanitizeForDisplay - object emptied -> returning undefined', { originalKeys: Object.keys(x || {}) });\n } catch (e) {\n console.debug('[message-utils] sanitizeForDisplay - object emptied -> returning undefined (inspect failed)', { err: String(e) });\n }\n return undefined;\n }\n }\n\n return x;\n}\n\n/**\n * Pretty print content for display\n */\nexport function pretty(x: any): string {\n if (typeof x === \"string\") return x;\n if (isFileLike(x)) return \"\"; // top-level file -> empty\n\n try {\n const sanitized = sanitizeForDisplay(x);\n if (sanitized === undefined) return \"\"; // fully omitted content\n return typeof sanitized === \"string\"\n ? sanitized\n : JSON.stringify(sanitized, null, 2);\n } catch {\n return \"\";\n }\n}\n\n/**\n * Intelligently format tool output - markdown if it looks like it, otherwise raw\n */\nexport function formatToolOutput(x: any): { content: string; isMarkdown: boolean } {\n const pretty_str = pretty(x);\n\n if (typeof x === \"string\" && looksLikeMarkdown(x)) {\n return { content: x, isMarkdown: true };\n }\n\n // Fallback to pretty JSON\n return { content: pretty_str, isMarkdown: false };\n}\n\n// Re-export shared utilities for backward compatibility\nexport { parseJsonSafe, looksLikeMarkdown } from \"@/shared/utils/jsonUtils\";\n\n\nimport type { ChatMessage, MessagePart, TextPart } from \"@/types\";\n\n/**\n * Stringify tool call parts for display/debugging\n */\nexport function stringifyTool(parts: MessagePart[]): string {\n const sanitizeAndStringify = (obj: unknown): string => {\n try {\n const sanitized = sanitizeForDisplay(obj);\n return typeof sanitized === \"string\" ? sanitized : JSON.stringify(sanitized ?? \"\");\n } catch {\n return \"\";\n }\n };\n\n const textParts = parts.filter((p) => p.type === \"text\") as TextPart[];\n if (textParts.length) {\n return sanitizeAndStringify(textParts.map((p) => p.text).join(\"\\n\"));\n }\n\n return sanitizeAndStringify(parts);\n}\n\n/**\n * Check if a message has actual text or image content (not just tool calls)\n */\nexport function hasContent(message: ChatMessage): boolean {\n return message.content.some((p: MessagePart) => {\n if (p.type === \"text\") return p.text.trim().length > 0;\n if (p.type === \"image_url\") return true;\n if (p.type === \"file\") return true;\n return false;\n });\n}\n","/**\n * Safely parses a JSON string, returning null on failure.\n */\n\n\nimport { parseJsonSafe } from \"@/shared/utils/jsonUtils\";\n\n/**\n * Normalizes tool output by unwrapping nested structures (JSON strings, result objects, arrays, ChatMessages).\n * Used during streaming, history hydration, and rendering.\n */\nexport function extractToolContent(x: any): any {\n if (x === null || x === undefined) return x;\n\n // 1. If it's a string that looks like JSON, try to parse and recurse\n if (typeof x === \"string\") {\n const trimmed = x.trim();\n if (trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\")) {\n const parsed = parseJsonSafe(trimmed);\n if (parsed !== null) {\n return extractToolContent(parsed);\n }\n }\n return x;\n }\n\n // 2. If it's an object with a 'content' or 'value' property\n if (typeof x === \"object\" && !Array.isArray(x)) {\n if (x.content !== undefined) {\n if (Array.isArray(x.content)) {\n // Extract and join text from message content parts\n return x.content\n .map((p: any) => extractToolContent(p))\n .filter(Boolean)\n .join(\"\\n\");\n }\n return extractToolContent(x.content);\n }\n \n // Support '.value' property (common in tool payloads)\n if (x.value !== undefined) {\n return extractToolContent(x.value);\n }\n }\n\n // 3. If it's a MessagePart (specifically TextPart) or object with .text\n if (typeof x === \"object\" && !Array.isArray(x)) {\n if (x.type === \"text\" && typeof x.text === \"string\") return x.text;\n if (typeof x.text === \"string\") return (x as any).text;\n }\n\n // 4. If it's an array, try to extract from the first element (common for tool result lists)\n if (Array.isArray(x) && x.length > 0) {\n return extractToolContent(x[0]);\n }\n\n return x;\n}\n","export function toCamel(value: string): string {\n return value.replace(/[_-](\\w)/g, (_, c) => (c ? c.toUpperCase() : \"\")).replace(/^\\w/, (c) => c.toLowerCase());\n}\n","import type { ChatMessage, MessagePart, Role, ToolCall } from \"@/types\";\nimport type { StreamEvent } from \"@/types/domain/streaming\";\nimport { toCamel } from \"./caseUtils\";\n\n/**\n * Recursively normalizes object keys to camelCase.\n * Useful for normalizing entire snapshots or metadata blobs from the API.\n */\nexport function normalizeKeysRecursive(obj: any): any {\n if (!obj || typeof obj !== \"object\") return obj;\n\n if (Array.isArray(obj)) {\n return obj.map(normalizeKeysRecursive);\n }\n\n return Object.fromEntries(\n Object.entries(obj).map(([key, value]) => [\n toCamel(key),\n normalizeKeysRecursive(value),\n ])\n );\n}\n\n/**\n * Standardizes a message object, ensuring consistent field names (camelCase)\n * and resolving role/content variations.\n */\nexport function normalizeChatMessage(entry: any): ChatMessage | null {\n if (!entry || typeof entry !== \"object\") return null;\n\n // Deeply normalize keys first to simplify subsequent access\n const norm = normalizeKeysRecursive(entry);\n\n // 1. Resolve Role\n const role = resolveRole(norm);\n if (!role) {\n return null;\n }\n\n // 2. Normalize Tool Calls + Content (strip tool_call parts if toolCalls present)\n const toolCalls = Array.isArray(norm.toolCalls) ? norm.toolCalls.map(normalizeToolCall) : undefined;\n const content = normalizeContent(norm.content ?? norm.parts, Boolean(toolCalls?.length));\n\n // 3. Extract Basic Fields\n const id = norm.id ?? `msg-${Date.now().toString(16)}-${Math.random().toString(16).slice(2)}`;\n const createdAt =\n norm.createdAt ??\n norm.additionalKwargs?.createdAt ??\n new Date().toISOString();\n const name =\n norm.name ??\n norm.additionalKwargs?.agentName ??\n norm.additionalKwargs?.agent_name ??\n undefined;\n\n const model = norm.model ?? norm.additionalKwargs?.model ?? undefined;\n\n // 4. Extract Tool Fields\n const toolCallId = norm.toolCallId ?? undefined;\n\n // 5. Extract Kwargs & Metadata\n const additionalKwargs = norm.additionalKwargs ?? undefined;\n const responseMetadata = norm.responseMetadata ?? undefined;\n const checkpointId =\n norm.checkpointId ??\n norm.additionalKwargs?.checkpointId ??\n norm.additionalKwargs?.checkpoint_id ??\n undefined;\n const checkpointNs =\n norm.checkpointNs ??\n norm.additionalKwargs?.checkpointNs ??\n norm.additionalKwargs?.checkpoint_ns ??\n undefined;\n const toolStreaming =\n typeof norm.toolStreaming === \"boolean\"\n ? norm.toolStreaming\n : Boolean(norm.additionalKwargs?.toolStreaming);\n\n const normalized = {\n ...norm,\n id,\n role,\n content,\n createdAt,\n name,\n model,\n toolCallId,\n toolCalls,\n checkpointId,\n checkpointNs,\n toolStreaming,\n additionalKwargs,\n responseMetadata,\n artifact: norm.artifact ?? undefined,\n };\n\n return normalized;\n}\n\n/**\n * Normalizes a streaming event, ensuring consistent field names.\n */\nexport function normalizeStreamEvent(ev: any): StreamEvent {\n if (!ev || typeof ev !== \"object\") return ev;\n \n // Deeply normalize keys\n const out = normalizeKeysRecursive(ev);\n\n // Specific mappings that might not be automated or need naming changes\n if (out.tool && !out.name) {\n out.name = out.tool;\n }\n\n // Handle nested artifact metadata\n if (out.type === \"artifact.update\" && out.artifact && typeof out.artifact === \"object\") {\n const art = out.artifact;\n if (!art.id && art.artifactId) art.id = art.artifactId;\n if (!art.type && art.artifactType) art.type = art.artifactType;\n }\n\n return out as StreamEvent;\n}\n\n/**\n * Normalizes an individual tool call object.\n */\nexport function normalizeToolCall(call: any): ToolCall {\n const norm = normalizeKeysRecursive(call);\n \n // Standard tool call normalization - content is expected to be a string or object from the tool\n const content = norm.content ?? norm.output ?? undefined;\n\n return {\n ...norm,\n type: \"tool_call\",\n id: norm.id ?? norm.callId,\n name: norm.name ?? norm.tool ?? undefined,\n args: norm.args ?? norm.arguments ?? undefined,\n content: typeof content === 'string' ? content : (content ? JSON.stringify(content) : undefined),\n };\n}\n\n/**\n * Normalizes message content into an array of MessageParts.\n */\nfunction normalizeContent(content: any, hasToolCalls: boolean): MessagePart[] {\n if (Array.isArray(content)) {\n return content\n .map(part => {\n if (part.type === \"tool_call\" || part.type === \"tool\") {\n // If toolCalls are already present on the message, skip duplicate tool_call parts\n return hasToolCalls ? null : normalizeToolCall(normalizeKeysRecursive(part));\n }\n return part;\n })\n .filter(\n (item): item is MessagePart => Boolean(item && typeof item === \"object\" && typeof (item as MessagePart).type === \"string\")\n );\n }\n return [];\n}\n\n/**\n * Resolves the message role from varied input formats.\n */\nfunction resolveRole(entry: any): Role | null {\n const norm = normalizeKeysRecursive(entry);\n const maybeRole = norm.role;\n if (maybeRole && (\n maybeRole === \"assistant\" || \n maybeRole === \"user\" || \n maybeRole === \"system\" || \n maybeRole === \"tool\" || \n maybeRole === \"interrupt\"\n )) {\n return maybeRole as Role;\n }\n\n const type = norm.type;\n if (type === \"human\") return \"user\";\n if (type === \"ai\") return \"assistant\";\n if (type === \"tool\") return \"tool\";\n if (type === \"system\") return \"system\";\n\n return null;\n}\n","import type { ChatMessage, MessagePart, ToolCall } from \"@/types\";\nimport { extractToolCalls } from \"./parsers\";\nimport { pretty } from \"@/features/conversation/messages/utils/messageUtils\";\nimport { extractToolContent } from \"./toolFormatting\";\nimport { normalizeToolCall } from \"./normalizationUtils\";\n\nexport type ToolCallState = \"pending\" | \"completed\" | \"error\";\n\nexport type ToolCallWithResult = {\n call: ToolCall;\n result?: ChatMessage;\n state: ToolCallState;\n progress?: Array<Record<string, unknown>>;\n artifact?: unknown;\n};\n\nfunction normalizeToolCallState(status?: string | null): ToolCallState | null {\n if (!status) return null;\n const normalized = String(status).toLowerCase();\n if (normalized === \"running\" || normalized === \"pending\") return \"pending\";\n if (normalized === \"completed\" || normalized === \"success\") return \"completed\";\n if (normalized === \"error\" || normalized === \"failed\" || normalized === \"failure\") return \"error\";\n return null;\n}\n\nfunction getAssistantToolCalls(message: ChatMessage): ToolCall[] {\n const calls = Array.isArray(message.toolCalls) ? message.toolCalls : extractToolCalls(message);\n return calls.map(normalizeToolCall);\n}\n\nfunction findToolResultMessage(\n callId: string,\n messages: ChatMessage[]\n): ChatMessage | undefined {\n return messages.find(\n (msg) =>\n msg.role === \"tool\" &&\n (msg.toolCallId === callId || msg.id === callId)\n );\n}\n\nfunction buildSyntheticResult(\n message: ChatMessage,\n call: ToolCall\n): ChatMessage | undefined {\n const response = (call as any).response ?? call.content;\n if (!response) return undefined;\n const text =\n typeof response === \"string\" ? response : pretty(response);\n if (!text.trim()) return undefined;\n\n const content: MessagePart[] = [{ type: \"text\", text }];\n return {\n id: `tool-${call.id}`,\n role: \"tool\",\n content,\n name: call.name,\n toolCallId: call.id,\n artifact: call.artifact,\n createdAt: message.createdAt,\n };\n}\n\n/**\n * getToolCalls - Helper for rendering tool calls with results (LangGraph-style).\n */\nexport function getToolCalls(\n input: ChatMessage | ChatMessage[],\n allMessages: ChatMessage[] = []\n): ToolCallWithResult[] {\n // Handle array input (full turn)\n if (Array.isArray(input)) {\n const assistantMessages = input.filter((m) => m.role === \"assistant\");\n const turnCalls = assistantMessages.flatMap((m) => getAssistantToolCalls(m));\n\n // Deduplicate tool calls by ID, keeping the latest version\n const uniqueCalls = new Map<string, ToolCall>();\n turnCalls.forEach((call) => uniqueCalls.set(call.id, call));\n\n return Array.from(uniqueCalls.values()).map((call) => {\n // Find the result in the turn array or external context\n const result =\n findToolResultMessage(call.id, input) ||\n findToolResultMessage(call.id, allMessages);\n\n const progress = Array.isArray(result?.additionalKwargs?.toolProgress)\n ? (result?.additionalKwargs?.toolProgress as Array<Record<string, unknown>>)\n : undefined;\n\n const artifact = result?.artifact ?? call.artifact;\n\n const resolvedState =\n normalizeToolCallState(call.status) ??\n (result?.additionalKwargs?.toolStreaming ? \"pending\" : null) ??\n (result ? \"completed\" : \"pending\");\n\n // Populate content from result message if missing (for hover in history)\n if (result && !call.content && resolvedState === \"completed\") {\n const extracted = extractToolContent(result);\n if (typeof extracted === \"string\") {\n call.content = extracted;\n }\n }\n\n return {\n call,\n result,\n state: resolvedState,\n progress,\n artifact,\n };\n });\n }\n\n // Handle single message input (legacy)\n if (input.role !== \"assistant\") return [];\n\n const calls = getAssistantToolCalls(input);\n if (calls.length === 0) return [];\n\n return calls.map((call) => {\n const result =\n findToolResultMessage(call.id, allMessages) ??\n buildSyntheticResult(input, call);\n\n const progress = Array.isArray(result?.additionalKwargs?.toolProgress)\n ? (result?.additionalKwargs?.toolProgress as Array<Record<string, unknown>>)\n : undefined;\n const artifact = result?.artifact ?? call.artifact;\n\n const resolvedState =\n normalizeToolCallState(call.status) ??\n (result?.additionalKwargs?.toolStreaming ? \"pending\" : null) ??\n (result ? \"completed\" : \"pending\");\n\n // Populate content from result message if missing (for hover in history)\n if (result && !call.content && resolvedState === \"completed\") {\n const extracted = extractToolContent(result);\n if (typeof extracted === \"string\") {\n call.content = extracted;\n }\n }\n\n return {\n call,\n result,\n state: resolvedState,\n progress,\n artifact,\n };\n });\n}\n\nexport function getToolCallArtifacts(\n message: ChatMessage,\n allMessages: ChatMessage[] = []\n): unknown[] {\n return getToolCalls(message, allMessages)\n .map((entry) => entry.artifact)\n .filter((artifact): artifact is NonNullable<typeof artifact> => Boolean(artifact));\n}\n","/**\n * Centralized localStorage keys for the chat UI.\n * Keep all key names and builders in one place to avoid drift.\n */\n\nexport const STORAGE_KEYS = {\n authToken: \"authToken\",\n authTokenExpiresAt: \"authTokenExpiresAt\",\n authSessionId: \"authSessionId\",\n chatSettings: \"chat-settings\",\n threadManagerView: \"thread-manager-view\",\n playgroundSettings: \"new-chat-ui-chat-settings\",\n debugLogs: \"app:debugLogs\",\n};\n\nexport function draftKey(threadId: string): string {\n return `draft:${threadId}`;\n}\n","/**\n * Chat-only API Client\n * \n * This client only handles chat-related operations. Authentication is handled\n * by the host application which passes tokens via apiConfig.\n */\n\nimport type { TokenListener } from \"@/types/core/models\";\nimport axios, { AxiosError, AxiosInstance, AxiosRequestConfig, AxiosResponse } from \"axios\";\nimport { STORAGE_KEYS } from \"@/shared/core/constants/storage\";\n\n// ---- Environment & Configuration ----\n// When used as a library, rely entirely on runtime configuration via apiConfig prop.\n\n// ---- Token Management (for chat operations only) ----\nlet inMemoryToken: string | null = null;\n\n// Simple event emitter for token changes\nconst tokenListeners = new Set<TokenListener>();\n\nexport function getChatToken(): string | null {\n return inMemoryToken;\n}\n\nexport function setChatToken(token: string | null): void {\n inMemoryToken = token;\n tokenListeners.forEach(listener => listener(token));\n}\n\nexport function onChatTokenChanged(callback: TokenListener): () => void {\n tokenListeners.add(callback);\n return () => tokenListeners.delete(callback);\n}\n\n// ---- HTTP Client ----\nexport const DEFAULT_TIMEOUT_MS = 30000;\nexport const HISTORY_TIMEOUT_MS = 90000;\n\nconst httpClient: AxiosInstance = axios.create({\n // BaseURL is set dynamically via ApiProvider -> api.updateConfig\n timeout: DEFAULT_TIMEOUT_MS,\n withCredentials: true,\n});\n\n// Auth interceptor - only adds token if available\nhttpClient.interceptors.request.use((config) => {\n if (inMemoryToken) {\n (config.headers as Record<string, string>)['Authorization'] = `Bearer ${inMemoryToken}`;\n }\n return config;\n});\n\n// Response interceptor - sync tokens from responses and handle errors\nhttpClient.interceptors.response.use(\n (res) => {\n // Extract token from response and store in localStorage\n if (typeof window !== 'undefined' && res?.data) {\n try {\n const data = res.data as Record<string, unknown>;\n\n // Support multiple response formats:\n // 1. Root level: { token: \"...\", expires_at: ... }\n // 2. Nested data: { data: { token: \"...\", expires_at: ... } }\n // 3. Envelope pattern: { data: {...}, token: \"...\", expires_at: ... }\n const nestedData = (data.data as Record<string, unknown>) || {};\n\n const token =\n (typeof data.token === 'string' && data.token) ||\n (typeof nestedData.token === 'string' && nestedData.token) ||\n null;\n\n const expiresAt =\n (typeof data.expires_at === 'number' && data.expires_at) ||\n (typeof nestedData.expires_at === 'number' && nestedData.expires_at) ||\n (typeof data.expiresAt === 'number' && data.expiresAt) ||\n (typeof nestedData.expiresAt === 'number' && nestedData.expiresAt) ||\n null;\n\n if (token) {\n localStorage.setItem(STORAGE_KEYS.authToken, token);\n setChatToken(token);\n }\n if (expiresAt) {\n localStorage.setItem(STORAGE_KEYS.authTokenExpiresAt, expiresAt.toString());\n }\n\n // Dispatch custom event so host app can react to token updates in same tab\n if (token || expiresAt) {\n window.dispatchEvent(\n new CustomEvent('smartorg:chat-token-updated', {\n detail: { token, expiresAt }\n })\n );\n }\n } catch (error) {\n console.warn('[chat-api] Error storing token:', error);\n }\n }\n return res;\n },\n (error: AxiosError) => Promise.reject(error)\n);\n\n// ---- Exported API Client Functions ----\n\n// ---- HTTP Helper Functions ----\nexport async function get<T = unknown>(url: string, config?: AxiosRequestConfig): Promise<T> {\n if (!httpClient.defaults.baseURL) {\n return Promise.reject(new Error('API base URL is not configured'));\n }\n const res: AxiosResponse<T> = await httpClient.get(url, config);\n return res.data;\n}\n\nexport async function post<T = unknown, B = unknown>(url: string, body?: B, config?: AxiosRequestConfig): Promise<T> {\n if (!httpClient.defaults.baseURL) {\n return Promise.reject(new Error('API base URL is not configured'));\n }\n const res: AxiosResponse<T> = await httpClient.post(url, body, config);\n return res.data;\n}\n\nexport async function put<T = unknown, B = unknown>(url: string, body?: B, config?: AxiosRequestConfig): Promise<T> {\n if (!httpClient.defaults.baseURL) {\n return Promise.reject(new Error('API base URL is not configured'));\n }\n const res: AxiosResponse<T> = await httpClient.put(url, body, config);\n return res.data;\n}\n\nexport async function del<T = unknown>(url: string, config?: AxiosRequestConfig): Promise<T> {\n if (!httpClient.defaults.baseURL) {\n return Promise.reject(new Error('API base URL is not configured'));\n }\n const res: AxiosResponse<T> = await httpClient.delete(url, config);\n return res.data;\n}\n\n// ---- Utility Functions ----\nexport function unwrap<T>(response: unknown): T {\n return (response && typeof response === \"object\" && \"data\" in response ? (response as { data: T }).data : response) as T;\n}\n\nexport { httpClient };\n","import type {\n AgentDetail,\n AgentList,\n AgentSchemaInfo,\n AgentSummary,\n} from \"@/types/api\";\nimport type {\n TokenListener,\n} from \"@/types/core/models\";\nimport type {\n ApiConfig,\n} from \"@/types/core/context\";\nimport type {\n HistoryPayload,\n SharedThreadSummary,\n CheckpointSnapshot,\n ThreadSummary,\n} from \"@/types/api\";\nimport type {\n ThreadInfo,\n ThreadShareResponse,\n} from \"@/types/api\";\nimport { del, get, getChatToken, HISTORY_TIMEOUT_MS, httpClient, onChatTokenChanged, post, put, setChatToken, unwrap } from \"../utils\";\n\n// ---- Chat API Client Class ----\nexport class ChatApi {\n // ---- Configuration ----\n // Chat client uses the default httpClient baseURL, no need for internal tracking\n // unless we want to support multiple instances with different URLs in the future.\n\n get baseUrl(): string {\n return httpClient.defaults.baseURL || '';\n }\n\n updateConfig(config: ApiConfig): void {\n // 1. Set Chat Base URL\n // Priority: Explicit chatBaseUrl > Derived from baseUrl > Keep current\n if (config.chatBaseUrl) {\n httpClient.defaults.baseURL = config.chatBaseUrl;\n } else if (config.baseUrl) {\n // Remove trailing slashes and append /chat\n // This relies on the new logic where we trust the base URL to be the root\n const base = config.baseUrl.replace(/\\/+$/, '');\n\n // Check if it already ends in /chat to be safe (idempotency)\n if (base.endsWith('/chat')) {\n httpClient.defaults.baseURL = base;\n } else {\n httpClient.defaults.baseURL = `${base}/chat`;\n }\n }\n\n // Set auth token from apiKey or getToken callback\n if (config.apiKey !== undefined) {\n setChatToken(config.apiKey);\n } else if (config.getToken) {\n setChatToken(config.getToken());\n }\n }\n\n // ---- Token Management ----\n getAuthToken(): string | null {\n return getChatToken();\n }\n\n setAuthToken(token: string | null): void {\n setChatToken(token);\n }\n\n onTokenChange(callback: TokenListener): () => void {\n return onChatTokenChanged(callback);\n }\n\n // ---- Thread Management ----\n async listThreads(): Promise<ThreadSummary[]> {\n // Support both legacy responses ({ items: [...] }) and wrapped responses ({ data: { items: [...] } })\n const response = await get(\"/threads\");\n const data = unwrap<{ items?: ThreadSummary[] }>(response) as { items?: ThreadSummary[] } | null;\n return data?.items ?? (response as { items?: ThreadSummary[] })?.items ?? [];\n }\n\n async listSharedThreads(): Promise<SharedThreadSummary[]> {\n const response = await get(\"/threads/shared\");\n const data = unwrap<{ items?: SharedThreadSummary[] }>(response) as { items?: SharedThreadSummary[] } | null;\n return data?.items ?? (response as { items?: SharedThreadSummary[] })?.items ?? [];\n }\n\n // listUsers moved to AuthApi\n\n async createThread(title?: string, project?: { id: string; name: string }): Promise<ThreadInfo> {\n const payload: any = {};\n if (title) payload.title = title;\n if (project) payload.project = project;\n const response = await post<ThreadInfo>(\"/threads\", Object.keys(payload).length ? payload : undefined);\n return unwrap<ThreadInfo>(response);\n }\n\n async updateThread(threadId: string, title: string): Promise<ThreadInfo> {\n const response = await put<ThreadInfo>(`/threads/${threadId}`, { title });\n return unwrap<ThreadInfo>(response);\n }\n\n async deleteThread(threadId: string): Promise<{ ok: boolean; threadId: string }> {\n const response = await del<{ ok: boolean; threadId: string }>(`/threads/${threadId}`);\n return unwrap<{ ok: boolean; threadId: string }>(response);\n }\n\n async shareThread(threadId: string, sharedWithUserId: string): Promise<ThreadShareResponse> {\n const response = await post<ThreadShareResponse>(`/threads/${threadId}/share`, {\n shared_with_user_id: sharedWithUserId,\n });\n return unwrap<ThreadShareResponse>(response);\n }\n\n async threadInfo(threadId: string): Promise<ThreadInfo> {\n const response = await get<ThreadInfo>(`/threads/${threadId}/info`);\n return unwrap<ThreadInfo>(response);\n }\n\n // ---- Agents ----\n async listAgents(): Promise<AgentSummary[]> {\n const response = await get<AgentList>(\"/agents\");\n const data = unwrap<AgentList>(response);\n return data?.items ?? [];\n }\n\n async getAgent(agentId: string): Promise<AgentDetail> {\n const response = await get<AgentDetail>(`/agents/${agentId}`);\n return unwrap<AgentDetail>(response);\n }\n\n async getAgentSchema(agentId: string): Promise<AgentSchemaInfo> {\n const response = await get<AgentSchemaInfo>(`/agents/${agentId}/schema`);\n return unwrap<AgentSchemaInfo>(response);\n }\n\n async getState(params: {\n threadId: string;\n checkpointId?: string;\n checkpointNs?: string\n }): Promise<CheckpointSnapshot> {\n const response = await get<CheckpointSnapshot>(`/threads/${params.threadId}/state`, {\n params: {\n thread_id: params.threadId,\n checkpoint_id: params.checkpointId,\n checkpoint_ns: params.checkpointNs,\n },\n });\n return unwrap<CheckpointSnapshot>(response);\n }\n\n async getStateHistory(params: {\n threadId: string;\n checkpointId?: string;\n checkpointNs?: string;\n signal?: AbortSignal;\n }): Promise<HistoryPayload> {\n const response = await get<HistoryPayload>(`/threads/${params.threadId}/state/history`, {\n params: {\n thread_id: params.threadId,\n checkpoint_id: params.checkpointId,\n checkpoint_ns: params.checkpointNs,\n },\n timeout: HISTORY_TIMEOUT_MS,\n signal: params.signal,\n });\n return unwrap<HistoryPayload>(response);\n }\n\n // ---- Run Management ----\n async cancelRun(threadId: string): Promise<{ status: string }> {\n const response = await post<{ status: string }>(\"/stream/cancel\", { threadId });\n return unwrap<{ status: string }>(response);\n }\n\n async unshareThread(threadId: string, shareId: string): Promise<{ ok: boolean; shareId: string }> {\n const response = await del<{ ok: boolean; shareId: string }>(`/threads/${threadId}/share/${shareId}`);\n return unwrap<{ ok: boolean; shareId: string }>(response);\n }\n\n}\n\n// ---- Default Exports ----\nexport const chatApiClient = new ChatApi();\nexport default chatApiClient;\n\n// ---- Re-export utility functions ----\nexport { getChatToken, onChatTokenChanged, setChatToken };\n","import { get, post } from \"../utils\";\n\n\nexport class FileApi {\n // Config logic could go here if files ever need a distinct base URL from chat\n // For now, it shares the chatBaseUrl via the shared httpClient\n\n async fetchFileBlob(path: string, onProgress?: (p: number) => void): Promise<Blob> {\n const blob = await get<Blob>(path, {\n responseType: \"blob\" as const,\n onDownloadProgress: (ev: ProgressEvent) => {\n try {\n if (onProgress && ev.lengthComputable) {\n const p = ev.loaded / ev.total;\n onProgress(p);\n }\n } catch {\n // ignore progress errors\n }\n },\n // Allow large downloads\n maxBodyLength: Infinity as any,\n } as any);\n return blob as Blob;\n }\n\n async viewFileById(fileId: number | string, onProgress?: (p: number) => void): Promise<void> {\n const blob = await this.fetchFileBlob(`/files/${fileId}/view`, onProgress);\n const url = URL.createObjectURL(blob);\n window.open(url, \"_blank\");\n setTimeout(() => URL.revokeObjectURL(url), 60_000);\n }\n\n async getFileBlob(fileId: number | string, onProgress?: (p: number) => void): Promise<Blob> {\n return await this.fetchFileBlob(`/files/${fileId}/view`, onProgress);\n }\n\n async getFileContent(fileId: number | string, onProgress?: (p: number) => void): Promise<string> {\n const blob = await this.fetchFileBlob(`/files/${fileId}/view`, onProgress);\n return await blob.text();\n }\n\n async downloadFileById(fileId: number | string, onProgress?: (p: number) => void): Promise<void> {\n const blob = await this.fetchFileBlob(`/files/${fileId}/download`, onProgress);\n const url = URL.createObjectURL(blob);\n let filename = `file_${fileId}`;\n try {\n const info = await get<any>(`/files/${fileId}`);\n filename = info?.filename ?? filename;\n } catch {\n // ignore metadata errors\n }\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n a.remove();\n setTimeout(() => URL.revokeObjectURL(url), 60_000);\n }\n\n async getFileInfo(fileId: number | string): Promise<any> {\n return await get(`/files/${fileId}` as any);\n }\n\n async listFiles(threadId?: string | null, limit: number = 50, offset: number = 0): Promise<any[]> {\n const params: any = { limit, offset };\n if (threadId) params.thread_id = threadId;\n return await get(`/files` as any, { params });\n }\n\n async uploadFile(\n file: File,\n threadId?: string | null,\n onProgress?: (p: number) => void\n ): Promise<any> {\n const formData = new FormData();\n formData.append(\"file\", file);\n if (threadId) {\n formData.append(\"thread_id\", threadId);\n }\n\n // Use the internal axios instance exposed via post/get helpers if possible,\n // or assume `post` is available. \n // Since `get` is imported, let's check imports. \n // Wait, the file checks showed only `get` imported. I need `post`.\n // I need to update imports first. \n \n // Actually, I'll assume `post` is exported from `../utils` alongside `get`.\n // I should check `../utils` first to be safe, but typically it is.\n // Let me update the import in the same tool call if possible? No, it's safer to do it separately if allowMultiple is false.\n // But I can't see `post` in the file view of `fileClient.ts` imports. I'll blindly add it.\n \n // Re-reading file content of `fileClient.ts`:\n // It imports `get` from `../utils`.\n // I will replace `import { get } from \"../utils\";` with `import { get, post } from \"../utils\";` in a separate block if needed,\n // or simpler: I will update the import line in this `replace_file_content` if I use `multi_replace`.\n // But I'm using `replace_file_content` which is single block.\n \n // I will use `post` here and update the import in a subsequent/parallel tool call or trust `multi_replace`. \n // Wait, I can't use `multi_replace` because the instructions say \"Use this tool ONLY when...\".\n // I will update the method here assuming `post` is available, and then fix the import.\n \n return await post(`/files/upload-form`, formData, {\n onUploadProgress: (ev: ProgressEvent) => {\n try {\n if (onProgress && ev.lengthComputable) {\n const p = ev.loaded / ev.total;\n onProgress(p);\n }\n } catch {\n // ignore\n }\n },\n } as any);\n }\n}\n\nexport const fileApiClient = new FileApi();\nexport default fileApiClient;\n","import type {\n ApiConfig,\n} from \"@/types/core/context\";\nimport type { User } from \"@/types/api\";\nimport { get, getChatToken, onChatTokenChanged, setChatToken } from \"../utils\";\n\n// ---- Auth API Client Class ----\nexport class AuthApi {\n // ---- Configuration ----\n private _authBaseUrl: string = '';\n\n get baseUrl(): string {\n return this._authBaseUrl;\n }\n\n updateConfig(config: ApiConfig): void {\n // 1. Set Auth Base URL\n // Priority: Explicit authBaseUrl > Derived from baseUrl > Keep current\n if (config.authBaseUrl) {\n this._authBaseUrl = config.authBaseUrl;\n } else if (config.baseUrl) {\n // Remove trailing slashes and append /auth\n const base = config.baseUrl.replace(/\\/+$/, '');\n this._authBaseUrl = `${base}/auth`;\n }\n\n // Set auth token from apiKey or getToken callback if provided\n // (Note: Auth token management is shared utility, but good to trigger updates here too)\n if (config.apiKey !== undefined) {\n setChatToken(config.apiKey);\n } else if (config.getToken) {\n setChatToken(config.getToken());\n }\n }\n\n // ---- Token Management ----\n getAuthToken(): string | null {\n return getChatToken();\n }\n\n setAuthToken(token: string | null): void {\n setChatToken(token);\n }\n\n onTokenChange(callback: (token: string | null) => void): () => void {\n return onChatTokenChanged(callback);\n }\n\n // ---- User Management ----\n async listUsers(): Promise<User[]> {\n // Use the specific auth URL for this request\n const response = await get<{ users: User[] }>(\"/users\", { baseURL: this.baseUrl });\n return response?.users ?? [];\n }\n}\n\n// ---- Default Exports ----\nexport const authApiClient = new AuthApi();\nexport default authApiClient;\n","/**\n * ApiProvider - Lowest level context providing API client and auth token\n */\n\nimport { chatApiClient } from \"@/shared/core\";\nimport { authApiClient } from \"@/shared/core/api/clients/authClient\";\nimport { fileApiClient } from \"@/shared/core/api/clients/fileClient\";\nimport type { ApiConfig, ApiContextValue } from '@/types/core';\nimport { createContext, type ReactNode } from 'react';\n\nexport const ApiContext = createContext<ApiContextValue | null>(null);\n\nexport interface ApiProviderProps {\n children: ReactNode;\n apiConfig?: ApiConfig;\n}\n\nexport function ApiProvider({ children, apiConfig }: ApiProviderProps) {\n const api = chatApiClient;\n const authApi = authApiClient;\n\n // Configure API client SYNCHRONOUSLY before first render to avoid race conditions\n // This ensures ThreadProvider can immediately use the API\n if (apiConfig) {\n // Only update if different from current config to avoid unnecessary updates\n const currentBaseUrl = api.baseUrl;\n const currentAuthBaseUrl = authApi.baseUrl;\n const currentToken = api.getAuthToken();\n\n // Update Chat API Config\n if (apiConfig.baseUrl || apiConfig.chatBaseUrl) {\n if (\n (apiConfig.chatBaseUrl && apiConfig.chatBaseUrl !== currentBaseUrl) ||\n (apiConfig.baseUrl && !currentBaseUrl.startsWith(apiConfig.baseUrl))\n ) {\n api.updateConfig(apiConfig);\n }\n }\n\n // Update Auth API Config\n if (apiConfig.baseUrl || apiConfig.authBaseUrl) {\n if (\n (apiConfig.authBaseUrl && apiConfig.authBaseUrl !== currentAuthBaseUrl) ||\n (apiConfig.baseUrl && !currentAuthBaseUrl.startsWith(apiConfig.baseUrl))\n ) {\n authApi.updateConfig(apiConfig);\n }\n }\n\n if (apiConfig.apiKey !== undefined && apiConfig.apiKey !== currentToken) {\n api.updateConfig({ apiKey: apiConfig.apiKey });\n authApi.updateConfig({ apiKey: apiConfig.apiKey });\n }\n }\n\n const value: ApiContextValue = {\n token: api.getAuthToken(),\n setToken: (t: string | null) => {\n api.setAuthToken(t);\n authApi.setAuthToken(t);\n },\n chatApi: api,\n authApi,\n fileApi: fileApiClient,\n baseUrl: api.baseUrl,\n };\n\n return (\n <ApiContext.Provider value={value}>\n {children}\n </ApiContext.Provider>\n );\n}\n","import type { MessagePart } from \"@/types\";\n\nexport async function fileToBase64(file: File): Promise<string> {\n return await new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => {\n try {\n const buf = reader.result as ArrayBuffer;\n const bytes = new Uint8Array(buf);\n let binary = \"\";\n const len = bytes.byteLength;\n for (let i = 0; i < len; i++) binary += String.fromCharCode(bytes[i]);\n resolve(btoa(binary));\n } catch (e) {\n reject(e);\n }\n };\n reader.onerror = (e) => reject(e);\n reader.readAsArrayBuffer(file);\n });\n}\n\nexport async function processAttachments(files: File[] = []): Promise<{\n contentParts: MessagePart[];\n filesInfo: Array<{ filename: string; data: string; mime_type: string }>;\n}> {\n const contentParts: MessagePart[] = [];\n const filesInfo: Array<{\n filename: string;\n data: string;\n mime_type: string;\n }> = [];\n\n for (const file of files) {\n try {\n const b64 = await fileToBase64(file);\n const mimeType = file.type || \"application/octet-stream\";\n\n filesInfo.push({\n filename: file.name,\n data: b64,\n mime_type: mimeType,\n });\n\n if (mimeType.startsWith(\"image/\")) {\n contentParts.push({\n type: \"image_url\",\n image_url: { url: `data:${mimeType};base64,${b64}` },\n });\n } else {\n contentParts.push({\n type: \"file\",\n url: `data:${mimeType};base64,${b64}`,\n mimeType: mimeType,\n name: file.name,\n size: file.size,\n });\n }\n } catch {\n // ignore Failures\n }\n }\n\n return { contentParts, filesInfo };\n}\n","import type { ChatMessage, TextPart, MessagePart, ToolMeta } from \"@/types\";\n\n/**\n * Collect all text parts into a single string\n */\nexport function collectText(parts: MessagePart[]): string {\n return parts\n .filter((p) => p.type === \"text\")\n .map((p) => (p as TextPart).text)\n .join(\"\");\n}\n\n/**\n * Normalize interrupt ID strings\n */\nexport function normalizeInterruptId(id: unknown): string | null {\n if (id === undefined || id === null) return null;\n const normalized = String(id).trim();\n return normalized.length > 0 ? normalized : null;\n}\n\n\n/**\n * Extract tool metadata (ID and name) from a message.\n * Standardized to camelCase.\n */\nexport function extractToolMeta(message: ChatMessage): ToolMeta {\n const toolCallId = message.toolCallId ?? (message.role === \"tool\" ? message.id : undefined);\n \n if (message.role === \"tool\" && !toolCallId) {\n console.error(\"[meta-utils] CRITICAL: Tool message missing toolCallId!\", message);\n }\n\n return {\n toolCallId: toolCallId ?? undefined,\n name: message.name ?? undefined,\n };\n}\n\n/**\n * Extract agent name from message metadata\n */\nexport function getAgentNameFromMessage(m: ChatMessage): string | null {\n if (m.name && m.name.trim()) return m.name;\n \n const kwargsName = m.additionalKwargs?.agentName ?? m.additionalKwargs?.agent_name;\n if (typeof kwargsName === \"string\" && kwargsName.trim()) {\n return kwargsName;\n }\n\n if (m.model && m.model.includes(\"/\")) return m.model.split(\"/\").pop() || null;\n return m.model || null;\n}\n\n/**\n * Create a unique signature for a message for stable rendering\n */\nexport function messageSignature(message: ChatMessage): string {\n const stamp = (message as any).updatedAt ?? message.createdAt ?? \"\";\n const partsSig = Array.isArray(message.content)\n ? message.content\n .map((part) => {\n switch (part.type) {\n case \"text\":\n return `t:${(part as TextPart).text.length}`;\n case \"image_url\":\n return \"img\";\n default:\n if ((part as any).type === \"interrupt\") return \"interrupt\";\n return \"unknown\";\n }\n })\n .join(\"|\")\n : \"\";\n const checkpointIdSegment =\n \"checkpointId\" in message && message.checkpointId ? `cp:${message.checkpointId}` : \"\";\n const checkpointNsSegment =\n \"checkpointNs\" in message && message.checkpointNs ? `ns:${message.checkpointNs}` : \"\";\n const extras = [checkpointIdSegment, checkpointNsSegment].filter(Boolean).join(\"|\");\n return `${message.id}:${stamp}:${partsSig}${extras ? `:${extras}` : \"\"}`;\n}\n","import { useContext } from 'react';\nimport { ApiContext } from '@/shared/core/contexts/providers/ApiProvider';\n\nexport function useApi() {\n const ctx = useContext(ApiContext);\n if (!ctx) throw new Error('useApi must be used within ApiProvider');\n return ctx;\n}\n","import type { ChatMessage, MessagePart, Role } from \"@/types\";\n\n/**\n * Creates a standard ChatMessage object with a generated ID and timestamp.\n */\nexport function createMessage(\n role: Role,\n content: string | MessagePart[],\n options?: Partial<Omit<ChatMessage, \"id\" | \"role\" | \"content\" | \"createdAt\">>\n): ChatMessage {\n const normalizedContent: MessagePart[] =\n typeof content === \"string\" ? [{ type: \"text\", text: content }] : content;\n\n return {\n id: `msg-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`,\n role,\n content: normalizedContent,\n createdAt: new Date().toISOString(),\n ...options,\n };\n}\n\n/**\n * Normalizes input content into a standard MessagePart array.\n */\nexport function normalizeContent(content: string | MessagePart[]): MessagePart[] {\n if (typeof content === \"string\") {\n return [{ type: \"text\", text: content }];\n }\n return content;\n}\n\n/**\n * Normalizes a potential message input (string or partial object) into a full ChatMessage.\n * useful for polymorphic APIs that accept string | ChatMessage.\n */\nexport function normalizeMessage(\n input: string | ChatMessage,\n role: Role = \"user\"\n): ChatMessage {\n if (typeof input === \"string\") {\n return createMessage(role, input);\n }\n return input;\n}\n","type PlainObject = Record<string, unknown>;\n\nexport function toPlainObject(value: unknown): PlainObject | undefined {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return undefined;\n }\n return { ...(value as PlainObject) };\n}\n\nexport function readString(source: PlainObject | undefined, keys: string[]): string | undefined {\n if (!source) return undefined;\n for (const key of keys) {\n const value = source[key];\n if (typeof value === \"string\" && value.trim()) {\n return value.trim();\n }\n }\n return undefined;\n}\n\nexport function readNumber(source: PlainObject | undefined, keys: string[]): number | null {\n if (!source) return null;\n for (const key of keys) {\n const value = source[key];\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n }\n return null;\n}\n\nexport function extractConfigFields(source: unknown): PlainObject | undefined {\n const base = toPlainObject(source);\n if (!base) return undefined;\n return toPlainObject(base.configurable) ?? base;\n}\n","import type {\n ChatMessage,\n HistoryPayload,\n HydratedCheckpointSnapshot,\n PendingInterrupt,\n CheckpointSnapshot,\n} from \"@/types\";\nimport {\n extractConfigFields,\n readNumber,\n readString,\n toPlainObject,\n} from \"./schemaUtils\";\nimport { normalizeChatMessage, normalizeKeysRecursive } from \"@/shared/core/utils\";\n\nexport type HistoryHydrationResult = {\n threadId: string;\n latest: HydratedCheckpointSnapshot | null;\n checkpoints: HydratedCheckpointSnapshot[];\n interrupt: PendingInterrupt;\n};\n\nexport function hydrateHistorySnapshots(history: HistoryPayload | null | undefined): HistoryHydrationResult {\n const rawCheckpoints = Array.isArray(history?.checkpoints)\n ? history?.checkpoints ?? []\n : history?.checkpoints\n ? (Object.values(history.checkpoints as Record<string, CheckpointSnapshot>))\n : [];\n\n // 1. Initial normalization\n const normalized = rawCheckpoints\n .map((snapshot, index) => normalizeSnapshot(normalizeKeysRecursive(snapshot), index))\n .filter((snapshot): snapshot is HydratedCheckpointSnapshot => Boolean(snapshot));\n\n const ordered = [...normalized].sort((a, b) => toTimestamp(b.createdAt) - toTimestamp(a.createdAt));\n const latest = ordered[0] ?? null;\n\n return {\n threadId: history?.threadId ?? \"\",\n latest,\n checkpoints: ordered,\n interrupt: latest?.interrupt ?? null,\n };\n}\n\nfunction normalizeSnapshot(snapshot: CheckpointSnapshot, index: number): HydratedCheckpointSnapshot | null {\n if (!snapshot) return null;\n\n const activeAgent = (snapshot.values?.activeAgent ?? null) as string | null;\n const potentialMessages = snapshot.values?.messages;\n const rawMessages = Array.isArray(potentialMessages) ? potentialMessages : [];\n const messages = rawMessages\n .map((entry: unknown) => normalizeMessageEntry(entry, activeAgent))\n .filter((entry): entry is ChatMessage => Boolean(entry));\n\n const metadata = toPlainObject(snapshot.metadata) ?? {};\n const configFields = extractConfigFields(snapshot.config);\n const parentConfig = toPlainObject(snapshot.parentConfig);\n const parentFields = extractConfigFields(parentConfig);\n\n const checkpointId = readString(configFields, [\"checkpointId\"]);\n const checkpointNs = readString(configFields, [\"checkpointNs\"]);\n const parentId = readString(parentFields, [\"checkpointId\"]);\n const configRecord = toPlainObject(snapshot.config);\n\n const normalizedTasks = Array.isArray(snapshot.tasks)\n ? snapshot.tasks.map((task: unknown) => ({ ...(task as Record<string, unknown>) }))\n : snapshot.tasks ?? null;\n\n const normalizedNext = Array.isArray(snapshot.next)\n ? [...snapshot.next]\n : snapshot.next ?? null;\n\n const createdAt =\n typeof snapshot.createdAt === \"string\" && snapshot.createdAt.trim()\n ? snapshot.createdAt\n : new Date(Date.now() - index).toISOString();\n\n const normalizedMetadata = {\n ...metadata,\n step: readNumber(metadata, [\"step\"]) ?? 0,\n source: readString(metadata, [\"source\"]) ?? null,\n };\n\n // 🔍 Attach checkpointId to each message.\n // Priority:\n // 1. Message's own checkpointId (normalized)\n // 2. The ID of the current checkpoint we found it in\n const messagesWithCheckpointId = messages.map((msg: ChatMessage) => {\n return {\n ...msg,\n checkpointId: msg.checkpointId ?? checkpointId ?? null,\n checkpointNs: msg.checkpointNs ?? checkpointNs ?? null,\n };\n });\n\n const snapshotValues = snapshot.values as any;\n const rawInterruptEntries = (Array.isArray(snapshot.interrupts)\n ? snapshot.interrupts\n : Array.isArray(snapshotValues?.interrupts)\n ? snapshotValues.interrupts\n : []) as unknown[];\n\n return {\n checkpointId: checkpointId ?? null,\n checkpointNs: checkpointNs ?? null,\n createdAt,\n parentId: parentId ?? null,\n messages: messagesWithCheckpointId,\n interrupt: deriveInterruptFromSnapshot(\n rawInterruptEntries,\n index,\n checkpointId ?? null,\n ),\n metadata: normalizedMetadata,\n config: configRecord ?? null,\n parentConfig: parentConfig ?? null,\n next: normalizedNext,\n tasks: normalizedTasks,\n values: snapshot.values ?? {},\n };\n}\n\nfunction normalizeMessageEntry(entry: unknown, activeAgent?: string | null): ChatMessage | null {\n const normalized = normalizeChatMessage(entry);\n if (!normalized) {\n return null;\n }\n\n // Specific to history: ensure 'assistant' message has a name if missing\n if (normalized.role === \"assistant\" && !normalized.name && activeAgent) {\n normalized.name = activeAgent;\n }\n\n return normalized;\n}\n\nfunction deriveInterruptFromSnapshot(\n rawInterrupts: unknown[],\n fallbackIndex: number,\n checkpointId?: string | null,\n): PendingInterrupt {\n const rawCount = rawInterrupts.length;\n // Skip checking message interrupts - aiNav uses thread state interrupts only\n for (let i = rawCount - 1; i >= 0; i -= 1) {\n const entry = rawInterrupts[i];\n if (!entry || typeof entry !== \"object\") {\n continue;\n }\n const interruptEntry = entry as Record<string, unknown>;\n const value = interruptEntry.value ?? entry;\n if (value === null || value === undefined) {\n continue;\n }\n const rawId =\n typeof interruptEntry.id === \"string\" && interruptEntry.id.trim()\n ? interruptEntry.id\n : `interrupt-${checkpointId ?? fallbackIndex}-${i}`;\n const result = {\n id: rawId,\n value,\n };\n return result;\n }\n return null;\n}\n\nfunction toTimestamp(value: string | null | undefined): number {\n if (!value) return 0;\n const parsed = Date.parse(value);\n return Number.isFinite(parsed) ? parsed : 0;\n}\n","/**\n * Core Context Types\n * Infrastructure and context provider types\n */\n\nimport type { ChatMessage, GraphCommand, MessagePart } from \"./domain/chat\";\nimport type { ProjectInfo, ThreadSummary } from \"./api/runs\";\nimport type { PendingInterrupt } from \"./domain/persistence\";\nimport type { ActiveRunContext, StreamEvent } from \"./domain/streaming\";\n\n// ============================================================================\n// Infrastructure Types\n// ============================================================================\n\nexport interface Envelope<T = unknown> {\n data: T;\n}\n\nexport type TokenListener = (token: string | null) => void;\n\n// Helper function\nexport function isEnvelope(x: unknown): x is Envelope<unknown> {\n return (\n !!x &&\n typeof x === \"object\" &&\n \"data\" in x\n );\n}\n\nexport interface ApiContextValue {\n token: string | null;\n setToken: (token: string | null) => void;\n chatApi: any; \n authApi: any; \n fileApi: any; \n baseUrl: string;\n}\n\nexport interface ApiConfig {\n baseUrl?: string;\n authBaseUrl?: string;\n chatBaseUrl?: string;\n apiKey?: string;\n headers?: Record<string, string>;\n getToken?: () => string | null;\n uploadPath?: string;\n}\n\nexport interface StreamSubmitPayload {\n threadId?: string;\n content?: string | ChatMessage;\n attachments?: File[];\n text?: string;\n payload?: Record<string, unknown>;\n contentParts?: MessagePart[];\n // Consolidated fields\n edit?: boolean;\n editingMessageId?: string | null;\n originalMessageId?: string;\n checkpointId?: string;\n checkpointNs?: string | null;\n config?: Record<string, unknown>;\n project?: ProjectInfo | null;\n command?: GraphCommand;\n}\n\nexport interface StreamCallbacks {\n onEvent?: (event: StreamEvent) => void;\n}\n\nexport type PushUserOptions = {\n attachments?: File[];\n editingMessageId?: string | null;\n};\n\nexport interface StreamContextValue {\n submit: (input: StreamSubmitPayload, callbacks?: StreamCallbacks) => Promise<void>;\n interrupt: ((value: unknown) => Promise<void>) | PendingInterrupt;\n resume: (value?: unknown) => Promise<void>;\n goto: (node: string, value?: unknown) => Promise<void>;\n stop: () => void;\n isStreaming: boolean;\n error: string | null;\n messages: ChatMessage[];\n activeMessageId: string | null;\n connectionState?: \"idle\" | \"connecting\" | \"connected\" | \"reconnecting\" | \"error\";\n clearError: () => void;\n}\n\nexport interface ThreadsContextValue {\n threads: ThreadSummary[];\n loading: boolean;\n error: string | null;\n createThread: (title?: string) => Promise<ThreadSummary>;\n deleteThread: (threadId: string) => Promise<void>;\n updateThread: (threadId: string, updates: Partial<ThreadSummary>) => Promise<void>;\n refreshThreads: () => Promise<void>;\n refreshSharedThreads: () => Promise<void>;\n shareThread: (threadId: string, sharedWithUserId: string) => Promise<void>;\n unshareThread: (threadId: string, shareId: string) => Promise<void>;\n shareInFlight: boolean;\n shareStatus: string | null;\n clearShareStatus: () => void;\n}\n\nexport interface ThreadStateContextValue {\n threadId: string | null;\n messages: ChatMessage[];\n loading: boolean;\n error: string | null;\n metadata: ThreadStateMetadata;\n pushUser: (content: string | ChatMessage) => ChatMessage;\n reset: () => void;\n clearError: () => void;\n}\n\nexport interface ThreadStateMetadata {\n assemblingMessageId: string | null;\n checkpointId: string | null;\n pendingInterrupts: PendingInterrupt[];\n activeRun: ActiveRunContext | null;\n}\n","import { chatApiClient } from \"@/shared/core/api/clients/chatClient\";\nimport { hydrateHistorySnapshots } from \"@/features/persistence/checkpoints/utils/historyUtils\";\nimport type { ChatMessage, ChatRequest, StreamSubmitPayload } from '@/types';\nimport { HistoryPayload } from \"@/types\";\nimport { Envelope, isEnvelope } from \"@/types/core\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { STORAGE_KEYS } from \"@/shared/core/constants/storage\";\nimport { normalizeStreamEvent, normalizeChatMessage } from \"@/shared/core/utils/normalizationUtils\";\n\n// Removed unused imports: mergePartsWithMeta, nameFromModel\nimport type {\n UseChatStreamOptions,\n UseStreamApi,\n ActiveRunContext,\n StreamFinishInfo,\n StreamEvent,\n ThreadInfoEvent,\n StateHistoryEvent,\n ToolEndEvent,\n ToolStartEvent,\n HeartbeatEvent,\n} from \"@/types/domain/streaming\";\n\nexport function useStream(hookOptions: UseChatStreamOptions = {}): UseStreamApi {\n const baseUrl = hookOptions.baseUrl || '';\n const streamPath = hookOptions.streamPath ?? \"/stream\";\n const [token, setTokenState] = useState<string | null>(hookOptions.token ?? null);\n const extraHeadersRef = useRef<Record<string, string>>(hookOptions.headers ?? {});\n const credentials = hookOptions.credentials ?? \"include\";\n\n const handlersRef = useRef<UseChatStreamOptions>(hookOptions);\n useEffect(() => {\n handlersRef.current = hookOptions;\n }, [hookOptions]);\n\n const dispatchStreamEvent = useCallback((event: StreamEvent) => {\n const handlers = handlersRef.current;\n if (!handlers) return;\n\n if (event.type === \"thread_info\") {\n handlers.onThreadInfo?.(event as ThreadInfoEvent);\n return;\n }\n\n if (event.type === \"state_history\") {\n handlers.handleStateHistoryEvent?.(event as StateHistoryEvent);\n return;\n }\n\n if (event.type === \"metadata\") {\n handlers.onMetadataEvent?.(event as Extract<StreamEvent, { type: \"metadata\" }>);\n return;\n }\n\n const isCustom =\n typeof event.type === \"string\" &&\n (event.type === \"custom\" || event.type.startsWith(\"custom.\"));\n if (isCustom) {\n handlers.onCustomEvent?.(event);\n return;\n }\n\n handlers.onEvent?.(event);\n if (event.type === \"updates\") {\n handlers.onUpdateEvent?.(event as Extract<StreamEvent, { type: \"updates\" }>);\n }\n if (event.type === \"tool.end\") {\n handlers.onToolEnd?.(event as ToolEndEvent);\n } else if (event.type === \"tool.start\") {\n handlers.onToolStart?.(event as ToolStartEvent);\n }\n if (event.type === \"heartbeat\") {\n handlers.onHeartbeat?.(event as HeartbeatEvent);\n }\n if (event.type === \"token\") {\n handlers.onToken?.((event as any).token);\n }\n }, []);\n\n const [isStreaming, setStreaming] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [assistantText, setAssistantText] = useState(\"\");\n const [lastCheckpointId, setLastCheckpointId] = useState<string | null>(null);\n const [lastSeq, setLastSeq] = useState(0);\n const [connected, setConnected] = useState(false);\n // Replaces single assistantMessage with a map of ALL streamed messages in this session\n const [streamedMessages, setStreamedMessages] = useState<Record<string, ChatMessage>>({});\n const [activeMessageId, setActiveMessageId] = useState<string | null>(null);\n const [values, setValues] = useState<Record<string, unknown>>({});\n\n const ctrlRef = useRef<AbortController | null>(null);\n const aliveRef = useRef(true);\n const lastSeqRef = useRef(0);\n const lastRunRef = useRef<ActiveRunContext | null>(null);\n const lastCheckpointIdRef = useRef<string | null>(null);\n const lastCheckpointNsRef = useRef<string | null>(null);\n const lastStateHistoryRef = useRef<HistoryPayload | null>(null);\n // Track meta for the currently active message ID only\n const assistantMessageMetaRef = useRef<{ messageId: string | null; lastSeq?: number | null; lastText: string }>({\n messageId: null,\n lastSeq: null,\n lastText: \"\",\n });\n\n const setToken = useCallback((t: string | null) => {\n setTokenState(t);\n }, []);\n\n const clear = useCallback(() => {\n setAssistantText(\"\");\n setLastCheckpointId(null);\n setError(null);\n lastCheckpointIdRef.current = null;\n lastCheckpointNsRef.current = null;\n lastStateHistoryRef.current = null;\n setStreamedMessages({});\n setActiveMessageId(null);\n setValues({});\n assistantMessageMetaRef.current = {\n messageId: null,\n lastSeq: null,\n lastText: \"\",\n };\n }, []);\n\n const stop = useCallback(() => {\n console.debug('[use-chat] stop() invoked - aborting stream');\n const threadId = lastRunRef.current?.threadId;\n const finalizeStop = () => {\n // The AbortController signal will be caught by the stream handler\n // which will then trigger any backend cancellation logic.\n ctrlRef.current?.abort();\n ctrlRef.current = null;\n lastRunRef.current = null;\n setStreaming(false);\n setConnected(false);\n lastSeqRef.current = 0;\n setLastSeq(0);\n };\n const cancelPromise = threadId\n ? chatApiClient.cancelRun(threadId).catch((err) => {\n console.warn(\"[use-chat] cancel run failed:\", err);\n })\n : Promise.resolve();\n cancelPromise.finally(finalizeStop);\n }, []);\n\n const stream = useCallback(\n (\n input: StreamSubmitPayload\n ): Promise<void> => {\n if (ctrlRef.current) {\n ctrlRef.current.abort();\n ctrlRef.current = null;\n }\n\n // Convert StreamSubmitPayload to ChatRequest\n const req: ChatRequest = {\n text: typeof input.content === 'string' ? input.content : input.text,\n threadId: input.threadId,\n attachments: input.attachments,\n payload: input.payload,\n config: input.config,\n checkpointId: input.checkpointId,\n checkpointNs: input.checkpointNs || undefined,\n edit: input.edit,\n command: input.command,\n };\n\n setStreaming(true);\n setError(null);\n // Default autoAppendAssistant to true\n setAssistantText(\"\");\n setLastCheckpointId(null);\n lastCheckpointIdRef.current = null;\n lastCheckpointNsRef.current = null;\n lastStateHistoryRef.current = null;\n // Start fresh for new stream\n setStreamedMessages({});\n setActiveMessageId(null);\n setValues({});\n assistantMessageMetaRef.current = {\n messageId: null,\n lastSeq: null,\n lastText: \"\",\n };\n\n const ac = new AbortController();\n ctrlRef.current = ac;\n let closeReason: \"complete\" | \"aborted\" | \"error\" | null = null;\n let connectionErrorNotified = false;\n\n // ✅ Set threadId immediately so cancel can work even before response arrives\n lastRunRef.current = {\n threadId: req.threadId ?? null,\n headers: {},\n isStreaming: true,\n };\n\n (async () => {\n\n\n try {\n // Authorization resolution...\n let authHeader: Record<string, string> = {};\n try {\n if (token) {\n authHeader = { Authorization: `Bearer ${token}` };\n } else if (typeof window !== \"undefined\") {\n const w: any = window as any;\n const injected = w.__AUTH_TOKEN__ as string | undefined;\n const stored = window.localStorage?.getItem(STORAGE_KEYS.authToken) || null;\n let settingsToken: string | null = null;\n try {\n const blob = window.localStorage?.getItem(STORAGE_KEYS.chatSettings);\n if (blob)\n settingsToken = (JSON.parse(blob)?.apiKey as string) || null;\n } catch { }\n const t = injected || stored || settingsToken || null;\n if (t) authHeader = { Authorization: `Bearer ${t}` };\n }\n } catch { }\n\n console.debug(\"[use-chat] POST\", baseUrl + streamPath);\n\n let sessionHeader: Record<string, string> = {};\n if (typeof window !== \"undefined\") {\n try {\n const sessionId = window.localStorage?.getItem(STORAGE_KEYS.authSessionId);\n if (sessionId) {\n sessionHeader = { \"X-Session-Id\": sessionId };\n }\n } catch { }\n }\n\n const authSessionHeaders = {\n ...authHeader,\n ...sessionHeader,\n ...extraHeadersRef.current,\n } as Record<string, string>;\n\n const requestHeaders: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n ...authSessionHeaders,\n };\n\n const res = await fetch(baseUrl + streamPath, {\n method: \"POST\",\n headers: requestHeaders,\n body: JSON.stringify(req),\n signal: ac.signal,\n credentials,\n });\n\n // ✅ Update headers in lastRunRef (threadId already set above)\n if (lastRunRef.current) {\n lastRunRef.current.headers = authSessionHeaders;\n }\n\n if (!res.ok || !res.body) {\n const txt = await res.text().catch(() => \"\");\n console.debug(\n \"[use-chat] non-OK response\",\n res.status,\n txt?.slice(0, 500)\n );\n const errMsg = `stream ${res.status}${txt ? \": \" + txt : \"\"}`;\n if (errMsg) {\n setError(errMsg);\n closeReason = \"error\";\n }\n throw new Error(errMsg);\n }\n\n setConnected(true);\n\n // SSE loop variables\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n let pendingChunks: string[] = [];\n lastSeqRef.current = 0;\n setLastSeq(0);\n let lastProcessedSeq = 0;\n\n // rAF flusher\n let rafId: number | null = null;\n const flushNow = () => {\n if (pendingChunks.length) {\n const joined = pendingChunks.join(\"\");\n pendingChunks = [];\n if (aliveRef.current) {\n setAssistantText((t) => t + joined);\n }\n }\n rafId = null;\n };\n const scheduleFlush = () => {\n if (typeof window !== \"undefined\" && rafId == null) {\n rafId = requestAnimationFrame(flushNow);\n }\n };\n\n // Heartbeat watchdog - 30 minutes to allow long-running tasks with backend heartbeats\n let lastEventTs = Date.now();\n const watchdog = setInterval(() => {\n if (Date.now() - lastEventTs > 1800000) { // 30 minutes\n const msg = \"Stream idle timeout\";\n setError(msg);\n closeReason = \"error\";\n ac.abort();\n // Error handling is now in StreamingProvider\n }\n }, 5000);\n\n // Buffer guard\n const MAX_BUFFER_LENGTH = 1024 * 1024;\n\n try {\n // onOpen\n const threadIdHeader =\n res.headers.get(\"X-Thread-Id\") || res.headers.get(\"x-thread-id\");\n const threadId = threadIdHeader ?? null;\n if (lastRunRef.current && !lastRunRef.current.threadId) {\n lastRunRef.current = {\n ...lastRunRef.current,\n threadId,\n };\n }\n // onOpen handling is now in StreamingProvider\n\n // Read loop\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n\n buffer += decoder.decode(value, { stream: true });\n if (buffer.length > MAX_BUFFER_LENGTH) {\n buffer = \"\";\n console.warn(\"Stream buffer reset: exceeded 1MB\");\n }\n\n let idx: number;\n while ((idx = buffer.indexOf(\"\\n\\n\")) >= 0) {\n const raw = buffer.slice(0, idx);\n buffer = buffer.slice(idx + 2);\n const payloadLines = raw.split(/\\r?\\n/);\n const dataLines: string[] = [];\n let sseEventType: string | null = null;\n \n for (const line of payloadLines) {\n // SSE comment (heartbeat) - just keep connection alive\n if (line.startsWith(\":\")) {\n if (line.startsWith(\": heartbeat\")) {\n console.debug(\"[use-chat] SSE heartbeat comment received\");\n }\n continue;\n }\n if (!line) continue;\n // Extract SSE event type\n if (line.startsWith(\"event:\")) {\n const evType = line.slice(6).trim();\n if (evType) sseEventType = evType;\n continue;\n }\n if (line.startsWith(\"data:\")) {\n const part = line.slice(5);\n dataLines.push(part.startsWith(\" \") ? part.slice(1) : part);\n }\n }\n const data = dataLines.join(\"\\n\");\n if (!data) continue;\n\n let payload: Envelope<StreamEvent> | StreamEvent;\n try {\n payload = JSON.parse(data);\n } catch {\n console.debug(\"[use-chat] malformed SSE:\", data.slice(0, 200));\n continue;\n }\n \n // If we got an SSE event type, inject it as 'type' for routing\n if (sseEventType && typeof payload === 'object' && payload !== null && !('type' in payload)) {\n (payload as any).type = sseEventType;\n }\n\n const evCandidate = isEnvelope(payload)\n ? (payload as Envelope<StreamEvent>).data\n : (payload as StreamEvent);\n if (!evCandidate) {\n console.warn(\"[use-chat] dropped envelope event without payload\", payload);\n continue;\n }\n const ev: StreamEvent = normalizeStreamEvent(evCandidate as any);\n lastEventTs = Date.now();\n\n // Seq tracking & gap (drop duplicates before downstream handlers)\n const seq = (ev as any).seq;\n if (seq !== undefined) {\n if (seq <= lastProcessedSeq) {\n console.debug(\"[use-chat] drop duplicate/out-of-order event\", { seq, lastProcessedSeq, type: ev.type });\n continue;\n }\n if (lastProcessedSeq > 0 && seq > lastProcessedSeq + 1) {\n // onGap handling is now in StreamingProvider\n }\n lastProcessedSeq = seq;\n lastSeqRef.current = seq;\n setLastSeq(seq);\n }\n\n const knownTypes = [\"messages/partial\", \"metadata\", \"checkpoint\", \"state_history\", \"heartbeat\", \"token\", \"status\", \"error\", \"interrupt\", \"tool.start\", \"tool.progress\", \"tool.end\"];\n let evType = ev.type || \"unknown\";\n \n // If it's not a known specific event type, check if it's a message-like payload (likely a headerless partial)\n if (!knownTypes.includes(evType)) {\n if ((ev as any).messages || ((ev as any).content !== undefined && (ev as any).id)) {\n evType = \"messages/partial\";\n }\n }\n\n if (evType === \"checkpoint\") {\n const checkpointEv = ev as any;\n lastCheckpointIdRef.current = checkpointEv.checkpointId ?? null;\n lastCheckpointNsRef.current = checkpointEv.checkpointNs ?? null;\n setLastCheckpointId(checkpointEv.checkpointId ?? null);\n } else if (evType === \"state_history\") {\n lastStateHistoryRef.current = ev as any;\n try {\n const hydrated = hydrateHistorySnapshots(ev as any);\n const latest = hydrated.latest;\n if (latest) {\n lastCheckpointIdRef.current = latest.checkpointId ?? null;\n lastCheckpointNsRef.current = latest.checkpointNs ?? null;\n setLastCheckpointId(latest.checkpointId ?? null);\n setValues(latest.values ?? {});\n }\n // Clear streamed messages since state_history contains the complete final state\n setStreamedMessages({});\n setActiveMessageId(null);\n } catch (historyErr) {\n console.warn(\"[use-chat] Failed to hydrate state_history payload\", historyErr);\n }\n }\n\n // Event handling is now done in StreamingProvider\n\n // LangChain-style messages/partial handling (accumulated content)\n if (evType === \"tool.start\" || evType === \"tool.progress\" || evType === \"tool.end\") {\n const toolEv = ev as any;\n const callId = toolEv.id || toolEv.callId;\n if (callId) {\n setStreamedMessages(prev => {\n let targetId = activeMessageId;\n if (!targetId) {\n const assistantMsgs = Object.values(prev).filter(m => m.role === 'assistant');\n if (assistantMsgs.length > 0) {\n targetId = assistantMsgs[assistantMsgs.length - 1].id;\n }\n }\n \n if (targetId && prev[targetId]) {\n const msg = prev[targetId];\n const toolCalls = [...(msg.toolCalls || [])];\n const callIdx = toolCalls.findIndex(c => c.id === callId);\n \n let entryContent = (toolEv.content || toolEv.status || \"Processing...\");\n if (ev.type === \"tool.start\") {\n entryContent = `Starting ${toolEv.name || toolEv.tool || \"tool\"}...`;\n } else if (ev.type === \"tool.end\" && toolEv.error) {\n entryContent = `Error: ${toolEv.error}`;\n }\n\n if (callIdx >= 0) {\n toolCalls[callIdx] = { \n ...toolCalls[callIdx], \n content: entryContent,\n status: ev.type === \"tool.start\" ? \"running\" : \n ev.type === \"tool.end\" ? (toolEv.error ? \"failed\" : \"completed\") : \n toolCalls[callIdx].status,\n artifact: toolEv.artifact || toolCalls[callIdx].artifact\n };\n } else {\n toolCalls.push({\n id: callId,\n name: toolEv.name || toolEv.tool || \"tool\",\n args: toolEv.args || {},\n status: ev.type === \"tool.end\" ? (toolEv.error ? \"failed\" : \"completed\") : \"running\",\n content: entryContent,\n artifact: toolEv.artifact\n });\n }\n return { ...prev, [targetId]: { ...msg, toolCalls } };\n }\n return prev;\n });\n }\n } else if (evType === \"messages/partial\") {\n const evAny = ev as any;\n // Handle both wrapped {messages: [...]} and flat {content: ..., id: ..., type: ...}\n const messages = evAny.messages || [evAny];\n \n if (Array.isArray(messages) && messages.length > 0) {\n const aiMsg = messages.find((m: any) => m.type === \"ai\");\n const toolMsg = messages.find((m: any) => m.type === \"tool\");\n \n if (aiMsg) {\n const msgId = aiMsg.id;\n const content = aiMsg.content ?? \"\";\n \n // Initialize assistant message if not already done\n if (assistantMessageMetaRef.current.messageId !== msgId) {\n const modelName = aiMsg.name ?? aiMsg.agentName ?? \"assistant\";\n assistantMessageMetaRef.current = {\n messageId: msgId,\n lastSeq: null,\n lastText: \"\",\n };\n const newAssistantMsg = normalizeChatMessage({\n id: msgId,\n role: \"assistant\",\n name: modelName,\n model: modelName,\n createdAt: new Date().toISOString(),\n content: [{ type: \"text\", text: content }],\n })!;\n setStreamedMessages(prev => ({ ...prev, [msgId]: newAssistantMsg }));\n setActiveMessageId(msgId);\n } else {\n // Update with accumulated content\n setStreamedMessages((prev) => {\n const existing = prev[msgId];\n if (!existing) return prev; \n return { \n ...prev, \n [msgId]: { \n ...existing, \n content: [{ type: \"text\", text: content }],\n // Preserve existing metadata if the chunk doesn't have it\n responseMetadata: aiMsg.responseMetadata ?? existing.responseMetadata,\n }\n };\n });\n }\n \n // Update assistantText with new content\n const prevText = assistantMessageMetaRef.current.lastText || \"\";\n if (content.length > prevText.length) {\n const newChunk = content.slice(prevText.length);\n assistantMessageMetaRef.current.lastText = content;\n // Default autoAppendAssistant to true\n pendingChunks.push(newChunk);\n scheduleFlush();\n }\n }\n \n if (toolMsg) {\n const msgId = toolMsg.id || `tool-${Date.now()}`;\n const normalizedTool = normalizeChatMessage({\n ...toolMsg,\n id: msgId,\n role: \"tool\",\n createdAt: new Date().toISOString(),\n })!;\n setStreamedMessages(prev => ({ ...prev, [msgId]: normalizedTool }));\n // We don't set tool messages as 'active' (typing), \n // as we want them to just appear as bubbles/artifacts.\n }\n }\n } else if (evType === \"heartbeat\") {\n // Heartbeat event - just keep connection alive, no action needed\n console.debug(\"[use-chat] heartbeat received\");\n try {\n // onHeartbeat handling is now in StreamingProvider\n } catch (heartbeatErr) {\n console.warn(\"[use-chat] heartbeat callback failed\", heartbeatErr);\n }\n } else {\n // flush before non-text\n if (rafId !== null) cancelAnimationFrame(rafId);\n flushNow();\n if (evType === \"checkpoint\") {\n const checkpointEv = ev as any;\n setLastCheckpointId(checkpointEv.checkpointId ?? null);\n } else if (evType === \"error\") {\n const errorEvent = ev as any;\n setError(errorEvent.message);\n closeReason = \"error\";\n // Auth error handling is now in StreamingProvider\n const isAuthError = errorEvent.error_type === \"auth_error\" ||\n errorEvent.code === \"TOKEN_EXPIRED\" ||\n errorEvent.message?.includes(\"token\") ||\n errorEvent.message?.includes(\"401\") ||\n errorEvent.message?.includes(\"unauthorized\") ||\n errorEvent.message?.includes(\"Unauthorized\");\n\n if (isAuthError) {\n console.error(\"[use-chat] Auth error detected:\", errorEvent.message);\n try {\n hookOptions.onAuthError?.(errorEvent.message);\n } catch (authErr) {\n console.warn(\"[use-chat] onAuthError handler failed\", authErr);\n }\n ac.abort();\n }\n }\n }\n dispatchStreamEvent(ev);\n }\n }\n\n // final flush\n flushNow();\n if (closeReason === null && !ac.signal.aborted) {\n closeReason = \"complete\";\n }\n } catch (e: any) {\n if (e.name === \"AbortError\") {\n closeReason = closeReason ?? \"aborted\";\n } else {\n const msg = e.message || String(e);\n closeReason = \"error\";\n setError(msg);\n // Error handling is now in StreamingProvider\n }\n } finally {\n try {\n await reader.cancel();\n } catch { }\n finally {\n reader.releaseLock?.();\n }\n if (rafId !== null && typeof window !== \"undefined\") {\n window.cancelAnimationFrame(rafId);\n }\n clearInterval(watchdog);\n }\n } catch (e: any) {\n if (e.name === \"AbortError\") {\n closeReason = closeReason ?? \"aborted\";\n } else {\n const msg = e.message || String(e);\n closeReason = \"error\";\n setError(msg);\n // Error handling is now in StreamingProvider\n if (!connectionErrorNotified) {\n connectionErrorNotified = true;\n hookOptions.onConnectionError?.(msg);\n }\n }\n } finally {\n const finalSeq = lastSeqRef.current;\n const finalCheckpointId = lastCheckpointIdRef.current;\n const finalCheckpointNs = lastCheckpointNsRef.current;\n const finalStateHistory = lastStateHistoryRef.current;\n try {\n // onClosed handling is now in StreamingProvider\n if (hookOptions.onFinish) {\n const finishInfo: StreamFinishInfo = {\n lastSeq: finalSeq,\n lastCheckpointId: finalCheckpointId,\n lastCheckpointNs: finalCheckpointNs,\n lastStateHistory: finalStateHistory,\n };\n hookOptions.onFinish(finishInfo);\n }\n } catch (closeErr) {\n console.warn(\"[use-chat] onClosed callback failed\", closeErr);\n }\n setStreaming(false);\n setConnected(false);\n ctrlRef.current = null;\n lastSeqRef.current = 0;\n setLastSeq(0);\n lastRunRef.current = null;\n }\n })();\n \n return Promise.resolve();\n },\n [baseUrl, streamPath, token, hookOptions]\n );\n\n useEffect(() => {\n return () => {\n aliveRef.current = false;\n ctrlRef.current?.abort();\n };\n }, []);\n return {\n isStreaming,\n error,\n assistantText,\n activeMessageId,\n streamedMessages,\n lastCheckpointId,\n lastSeq,\n connected,\n stream,\n stop,\n clear,\n setToken,\n values,\n interrupt: () => Promise.resolve(),\n resume: () => Promise.resolve(),\n goto: () => Promise.resolve(),\n connectionState: error ? \"error\" : isStreaming ? (connected ? \"connected\" : \"connecting\") : \"idle\",\n messages: [], // useStream doesn't maintain messages, use useChatSession instead\n submit: stream,\n };\n}\n","import { useCallback, useEffect, useMemo, useRef, useState, type MutableRefObject } from 'react';\n\nimport type { ChatApi } from \"@/shared/core\";\nimport type { ThreadInfoEvent } from '@/features/streaming';\nimport type { ProjectInfo, SharedThreadSummary, ThreadSummary } from '@/types';\n\nconst DETAIL_FIELDS = ['detail', 'message', 'error', 'description', 'title'] as const;\n\nfunction readErrorDetail(value: unknown): string | null {\n if (!value) return null;\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return trimmed.length ? trimmed : null;\n }\n if (Array.isArray(value)) {\n for (const item of value) {\n const candidate = readErrorDetail(item);\n if (candidate) {\n return candidate;\n }\n }\n return null;\n }\n if (typeof value === 'object') {\n const record = value as Record<string, unknown>;\n for (const field of DETAIL_FIELDS) {\n const candidate = readErrorDetail(record[field]);\n if (candidate) {\n return candidate;\n }\n }\n if ('errors' in record) {\n const nested = readErrorDetail(record.errors);\n if (nested) return nested;\n }\n }\n return null;\n}\n\nfunction getApiErrorMessage(error: unknown): string {\n if (!error) return 'Request failed';\n\n const response = (error as { response?: { data?: unknown; status?: number; statusText?: string } }).response;\n const detail = readErrorDetail(response?.data);\n if (detail) return detail;\n\n if (response?.statusText) {\n return response.statusText;\n }\n\n if (error instanceof Error && error.message) {\n return error.message;\n }\n\n if (typeof error === 'string') {\n const trimmed = error.trim();\n if (trimmed.length) return trimmed;\n }\n\n if (response?.status) {\n return `Request failed with status code ${response.status}`;\n }\n\n return 'Request failed';\n}\n\ninterface ThreadActions {\n createThread: (title?: string, project?: { id: string; name?: string } | ProjectInfo | null) => Promise<string | null>;\n deleteThread: (threadId: string) => Promise<void>;\n renameThread: (threadId: string, title: string) => Promise<void>;\n refreshThreads: () => Promise<void>;\n refreshSharedThreads: () => Promise<void>;\n shareThread: (threadId: string, sharedWithUserId: string) => Promise<void>;\n unshareThread: (threadId: string, shareId: string) => Promise<void>;\n}\n\ninterface UseThreadsStateOptions {\n api: ChatApi;\n initialThreadId?: string | null;\n onError?: (error: string) => void;\n onThreadChange?: (threadId: string | null) => void;\n onCurrentThreadDeleted?: () => void;\n}\n\nexport interface UseThreadsStateResult {\n threads: ThreadSummary[];\n currentThreadId: string | null;\n currentThreadIdRef: MutableRefObject<string | null>;\n setCurrentThreadId: (id: string | null) => void;\n isLoadingThreads: boolean;\n threadsError: string | null;\n sharedThreads: SharedThreadSummary[];\n isLoadingSharedThreads: boolean;\n actions: ThreadActions;\n addThreadFromEvent: (threadInfo: ThreadInfoEvent) => void;\n shareInFlight: boolean;\n shareStatus: string | null;\n clearShareStatus: () => void;\n}\n\nexport function useThreadsState({\n api,\n initialThreadId = null,\n onError,\n onThreadChange,\n onCurrentThreadDeleted,\n}: UseThreadsStateOptions): UseThreadsStateResult {\n const [threads, setThreads] = useState<ThreadSummary[]>([]);\n const [currentThreadId, setCurrentThreadId] = useState<string | null>(initialThreadId);\n const [isLoadingThreads, setIsLoadingThreads] = useState(false);\n const [threadsError, setThreadsError] = useState<string | null>(null);\n const [sharedThreads, setSharedThreads] = useState<SharedThreadSummary[]>([]);\n const [isLoadingSharedThreads, setIsLoadingSharedThreads] = useState(false);\n const [, setSharedThreadsError] = useState<string | null>(null);\n const [shareStatus, setShareStatus] = useState<string | null>(null);\n const [shareInFlight, setShareInFlight] = useState(false);\n\n const currentThreadIdRef = useRef<string | null>(currentThreadId);\n const deletionQueueRef = useRef<Map<string, AbortController>>(new Map());\n\n useEffect(() => {\n currentThreadIdRef.current = currentThreadId;\n }, [currentThreadId]);\n\n useEffect(() => {\n if (initialThreadId !== undefined && initialThreadId !== currentThreadIdRef.current) {\n setCurrentThreadId(initialThreadId);\n }\n }, [initialThreadId]);\n\n const refreshThreads = useCallback(async () => {\n setIsLoadingThreads(true);\n setThreadsError(null);\n try {\n const list = await api.listThreads();\n setThreads(list ?? []);\n } catch (error) {\n const msg = String(error);\n setThreadsError(msg);\n onError?.(msg);\n } finally {\n setIsLoadingThreads(false);\n }\n }, [api, onError]);\n\n const refreshSharedThreads = useCallback(async () => {\n setIsLoadingSharedThreads(true);\n setSharedThreadsError(null);\n try {\n const shared = await api.listSharedThreads();\n setSharedThreads(shared ?? []);\n } catch (error) {\n const msg = String(error);\n setSharedThreadsError(msg);\n onError?.(msg);\n } finally {\n setIsLoadingSharedThreads(false);\n }\n }, [api, onError]);\n\n useEffect(() => {\n refreshThreads();\n }, [refreshThreads]);\n\n useEffect(() => {\n refreshSharedThreads();\n }, [refreshSharedThreads]);\n\n useEffect(() => {\n onThreadChange?.(currentThreadId);\n }, [currentThreadId, onThreadChange]);\n\n const createThread = useCallback(\n async (title?: string, project?: { id: string; name?: string } | ProjectInfo | null) => {\n try {\n const normalizedProject = project && typeof project === \"object\"\n ? { id: project.id, name: project.name ?? \"\" }\n : undefined;\n const thread = await api.createThread(title, normalizedProject);\n setCurrentThreadId(thread.threadId);\n await refreshThreads();\n return thread.threadId;\n } catch (error) {\n const msg = String(error);\n onError?.(msg);\n return null;\n }\n },\n [api, onError, refreshThreads]\n );\n\n const deleteThread = useCallback(\n async (threadId: string) => {\n const previousThreads = threads;\n setThreads(prev => prev.filter(t => t.threadId !== threadId));\n\n const controller = new AbortController();\n deletionQueueRef.current.set(threadId, controller);\n\n try {\n await api.deleteThread(threadId);\n\n if (currentThreadIdRef.current === threadId) {\n setCurrentThreadId(null);\n onCurrentThreadDeleted?.();\n }\n } catch (error) {\n setThreads(previousThreads);\n const msg = String(error);\n onError?.(msg);\n } finally {\n deletionQueueRef.current.delete(threadId);\n }\n },\n [api, onCurrentThreadDeleted, onError, threads]\n );\n\n const renameThread = useCallback(\n async (threadId: string, title: string) => {\n try {\n await api.updateThread(threadId, title);\n await refreshThreads();\n } catch (error) {\n onError?.(String(error));\n }\n },\n [api, onError, refreshThreads]\n );\n\n const shareThread = useCallback(\n async (threadId: string, sharedWithUserId: string) => {\n setShareInFlight(true);\n setShareStatus('Sharing thread…');\n try {\n await api.shareThread(threadId, sharedWithUserId);\n await refreshSharedThreads();\n setShareStatus('Shared successfully');\n } catch (error) {\n const msg = getApiErrorMessage(error);\n onError?.(msg);\n setShareStatus(`Failed to share: ${msg}`);\n throw new Error(msg);\n } finally {\n setShareInFlight(false);\n }\n },\n [api, onError, refreshSharedThreads]\n );\n\n const unshareThread = useCallback(\n async (threadId: string, shareId: string) => {\n try {\n await api.unshareThread(threadId, shareId);\n await refreshSharedThreads();\n } catch (error) {\n const msg = String(error);\n onError?.(msg);\n throw error;\n }\n },\n [api, onError, refreshSharedThreads]\n );\n\n const actions: ThreadActions = useMemo(\n () => ({\n createThread,\n deleteThread,\n renameThread,\n refreshThreads,\n refreshSharedThreads,\n shareThread,\n unshareThread,\n }),\n [createThread, deleteThread, renameThread, refreshThreads, refreshSharedThreads, shareThread, unshareThread]\n );\n\n const addThreadFromEvent = useCallback((threadInfo: ThreadInfoEvent) => {\n if (!threadInfo?.threadId) return;\n\n const newThread: ThreadSummary = {\n threadId: threadInfo.threadId,\n title: threadInfo.title || `Thread ${threadInfo.threadId.slice(0, 8)}`,\n project: threadInfo.project,\n createdAt: threadInfo.createdAt || new Date().toISOString(),\n updatedAt: threadInfo.updatedAt || new Date().toISOString(),\n messageCount: threadInfo.messageCount ?? 1,\n };\n\n setThreads(prevThreads => {\n let updated = false;\n const nextThreads = prevThreads.map(t => {\n if (t.threadId === newThread.threadId) {\n updated = true;\n console.debug('[useThreadsState] thread_info: updating existing thread', newThread.threadId);\n return {\n ...t,\n title: newThread.title ?? t.title,\n project: newThread.project ?? t.project,\n updatedAt: newThread.updatedAt ?? t.updatedAt,\n messageCount: newThread.messageCount ?? t.messageCount,\n };\n }\n return t;\n });\n\n if (updated) {\n return nextThreads;\n }\n\n console.debug('[useThreadsState] thread_info: adding thread to list', newThread.threadId);\n return [newThread, ...prevThreads];\n });\n }, []);\n\n const clearShareStatus = useCallback(() => setShareStatus(null), []);\n\n return {\n threads,\n currentThreadId,\n currentThreadIdRef,\n setCurrentThreadId,\n isLoadingThreads,\n threadsError,\n sharedThreads,\n isLoadingSharedThreads,\n actions,\n addThreadFromEvent,\n shareInFlight,\n shareStatus,\n clearShareStatus,\n };\n}\n","import { type ReactNode, createContext, useContext, useMemo } from 'react';\nimport { useApi } from '@/shared/core/hooks/useApi';\nimport { useThreadsState } from '@/features/thread/hooks/useThreadsState';\nimport type { ThreadsContextValue } from '@/features/streaming/contexts/types';\n\nconst ThreadContext = createContext<ThreadsContextValue | null>(null);\n\nexport interface ThreadsProviderProps {\n children: ReactNode;\n initialThreadId?: string | null;\n onError?: (error: string) => void;\n onThreadChange?: (threadId: string | null) => void;\n}\n\nexport function ThreadsProvider({\n children,\n initialThreadId = null,\n onError,\n onThreadChange,\n}: ThreadsProviderProps) {\n const { chatApi: api } = useApi();\n const {\n threads,\n currentThreadId,\n setCurrentThreadId,\n currentThreadIdRef,\n isLoadingThreads,\n threadsError,\n sharedThreads,\n isLoadingSharedThreads,\n actions,\n addThreadFromEvent,\n shareInFlight,\n shareStatus,\n clearShareStatus,\n } = useThreadsState({\n api,\n initialThreadId,\n onError,\n onThreadChange,\n });\n\n const value = useMemo<ThreadsContextValue>(\n () => ({\n threads,\n currentThreadId,\n setCurrentThreadId,\n currentThreadIdRef,\n isLoading: isLoadingThreads,\n error: threadsError,\n sharedThreads,\n isLoadingSharedThreads,\n actions,\n shareInFlight,\n shareStatus,\n clearShareStatus,\n addThreadFromEvent,\n }),\n [\n threads,\n currentThreadId,\n setCurrentThreadId,\n currentThreadIdRef,\n isLoadingThreads,\n threadsError,\n sharedThreads,\n isLoadingSharedThreads,\n actions,\n shareInFlight,\n shareStatus,\n clearShareStatus,\n addThreadFromEvent,\n ]\n );\n\n return <ThreadContext.Provider value={value}>{children}</ThreadContext.Provider>;\n}\n\nexport function useThreads(): ThreadsContextValue {\n const ctx = useContext(ThreadContext);\n if (!ctx) throw new Error('useThreads must be used within a ThreadsProvider');\n return ctx;\n}\n","/**\n * Artifact Utilities\n * \n * Helper functions for working with artifacts, including metadata handling\n * and streaming updates.\n */\n\nimport type { MessageArtifact, ChatMessage, ArtifactMetadata } from \"@/types\";\n/**\n * Extract artifact metadata from a message\n */\nexport function getArtifactMetadata(message: ChatMessage): ArtifactMetadata | null {\n const artifact = message.artifact;\n if (!artifact || typeof artifact !== \"object\") return null;\n \n // If artifact already has metadata, return it\n if (\"metadata\" in artifact && artifact.metadata) {\n return artifact.metadata as ArtifactMetadata;\n }\n \n // Create metadata from artifact properties\n return {\n id: (artifact as any).id ?? message.id ?? `artifact-${Date.now()}`,\n type: (artifact as any).type ?? \"unknown\",\n createdAt: message.createdAt ?? new Date().toISOString(),\n status: (artifact as any).status ?? \"completed\",\n progress: (artifact as any).progress ?? undefined,\n };\n}\n\n/**\n * Check if an artifact is streaming (has progress < 100)\n */\nexport function isArtifactStreaming(artifact: MessageArtifact | undefined): boolean {\n if (!artifact || typeof artifact !== \"object\") return false;\n \n const metadata = getArtifactMetadata({ artifact } as ChatMessage);\n return Boolean(metadata && metadata.status === \"in_progress\" && (metadata.progress ?? 0) < 100);\n}\n\n/**\n * Update artifact metadata during streaming\n */\nexport function updateArtifactMetadata(\n message: ChatMessage,\n updates: Partial<ArtifactMetadata>\n): ChatMessage {\n const currentMetadata = getArtifactMetadata(message);\n if (!currentMetadata) return message;\n \n const updatedMetadata: ArtifactMetadata = {\n ...currentMetadata,\n ...updates,\n updatedAt: new Date().toISOString(),\n };\n \n return {\n ...message,\n artifact: {\n ...(typeof message.artifact === \"object\" && message.artifact ? (message.artifact as Record<string, unknown>) : {}),\n metadata: updatedMetadata,\n },\n };\n}\n\n/**\n * Find a message by artifact ID or associated tool call ID\n */\nexport function findMessageByArtifactId(\n messages: ChatMessage[],\n artifactId: string,\n toolCallId?: string\n): ChatMessage | null {\n return messages.find((msg) => {\n const metadata = getArtifactMetadata(msg);\n if (metadata?.id === artifactId) return true;\n if (toolCallId && msg.toolCallId === toolCallId) return true;\n return false;\n }) ?? null;\n}\n\nimport type { PlotData, ArtifactPreview } from \"@/types\";\n\n/**\n * Normalize MIME type from format hints\n */\nexport function normalizeMimeType(formatHint?: string): string {\n if (!formatHint) return \"image/png\";\n const trimmed = formatHint.trim();\n if (!trimmed) return \"image/png\";\n return trimmed.includes(\"/\") ? trimmed : `image/${trimmed}`;\n}\n\n/**\n * Build label parts for artifact display\n */\nexport function buildLabelParts(extras?: { plotId?: string; artifactId?: string }): string[] {\n const labelParts: string[] = [];\n const push = (value?: string) => {\n if (value && value.trim()) {\n labelParts.push(value.trim());\n }\n };\n if (extras) {\n push(extras.plotId);\n push(extras.artifactId);\n }\n return labelParts;\n}\n\n/**\n * Create artifact preview object from source data\n */\nexport function createArtifactPreviewFromSource({\n base64,\n url,\n formatHint,\n extras,\n}: {\n base64?: string;\n url?: string;\n formatHint?: string;\n extras?: { plotId?: string; artifactId?: string };\n}): ArtifactPreview | null {\n const hasBase64 = typeof base64 === \"string\" && base64.length > 0;\n const mimeType = normalizeMimeType(formatHint);\n const src = hasBase64 ? `data:${mimeType};base64,${base64}` : url!;\n\n const labelParts = buildLabelParts(extras);\n const label = labelParts.length ? labelParts.join(\" / \") : undefined;\n const alt = label ? `${label} artifact` : \"artifact image\";\n\n return { src, alt, label };\n}\n\n/**\n * Create artifact preview object from Plot data\n */\nexport function createArtifactPreviewFromPlot(plot: PlotData): ArtifactPreview | null {\n // Use camelCase as primary, fallback to snake_case for backward compatibility\n const base64 = plot.contentBase64?.trim() || (plot as any).content_base64?.trim() || undefined;\n const url = plot.url?.trim() || undefined;\n \n const formatHint = plot.format || plot.mimeType || (plot as any).mime_type;\n\n return createArtifactPreviewFromSource({\n base64,\n url,\n formatHint: formatHint || undefined,\n extras: {\n plotId: plot.plotId,\n artifactId: plot.artifactId,\n },\n });\n}\n","import type { ChatMessage, MessagePart, TextPart } from \"@/types\";\nimport { normalizeChatMessage } from \"@/shared/core/utils/normalizationUtils\";\n\nexport function sanitizeHistory(messages: ChatMessage[]): ChatMessage[] {\n return messages\n .map((message) => normalizeChatMessage(message))\n .filter((message): message is ChatMessage => Boolean(message));\n}\n\nexport function findMessageById(messages: ChatMessage[], id: string): ChatMessage | null {\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i].id === id) return messages[i];\n }\n return null;\n}\n\nexport function insertOrReplaceMessage(\n messages: ChatMessage[],\n message: ChatMessage\n): ChatMessage[] {\n const index = messages.findIndex((m) => m.id === message.id);\n if (index < 0) return [...messages, message];\n return replaceMessageAtIndex(messages, index, message);\n}\n\nexport function replaceMessageAtIndex(\n messages: ChatMessage[],\n index: number,\n message: ChatMessage\n): ChatMessage[] {\n if (index < 0 || index >= messages.length) return messages;\n return [...messages.slice(0, index), message, ...messages.slice(index + 1)];\n}\n\nexport function findLastAssistantId(messages: ChatMessage[]): string | null {\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i].role === \"assistant\") return messages[i].id;\n }\n return null;\n}\n\nexport function getFullTextFromParts(parts: MessagePart[]): string {\n if (!parts || !parts.length) return \"\";\n return parts\n .filter((p) => p.type === \"text\")\n .map((p) => (p as TextPart).text ?? \"\")\n .join(\"\");\n}\n\nexport function mergePartsWithMeta(\n baseParts: MessagePart[],\n deltaParts: MessagePart[],\n metaIn: { lastSeq?: number | null; lastText?: string },\n seq: number | null\n): { newParts: MessagePart[]; newMeta: { lastSeq?: number | null; lastText?: string }; changed: boolean } {\n const meta = { ...metaIn };\n if (seq !== null && typeof seq === \"number\") {\n if (typeof meta.lastSeq === \"number\" && seq <= meta.lastSeq) {\n return { newParts: baseParts, newMeta: meta, changed: false };\n }\n meta.lastSeq = seq;\n }\n\n const incomingText = deltaParts\n .filter((p) => p.type === \"text\")\n .map((p) => (p as TextPart).text ?? \"\")\n .join(\"\");\n const nonText = deltaParts.filter((p) => p.type !== \"text\");\n const existingText = meta.lastText ?? getFullTextFromParts(baseParts);\n let appendedText = \"\";\n let newParts = baseParts.slice();\n\n if (incomingText) {\n const suffix = computeSuffix(existingText, incomingText);\n if (suffix === \"\") {\n appendedText = \"\";\n } else if (suffix === incomingText) {\n appendedText = incomingText;\n } else {\n appendedText = suffix;\n }\n if (shouldAutoSpace(existingText, appendedText)) {\n appendedText = ` ${appendedText}`;\n }\n\n if (appendedText) {\n const last = newParts[newParts.length - 1] as MessagePart | undefined;\n if (last?.type === \"text\") {\n const lastText = (last as TextPart).text ?? \"\";\n const replacedLast: TextPart = { ...(last as TextPart), text: lastText + appendedText };\n newParts = [...newParts.slice(0, newParts.length - 1), replacedLast];\n } else {\n newParts = [...newParts, { type: \"text\", text: appendedText } as TextPart];\n }\n meta.lastText = existingText + appendedText;\n } else {\n meta.lastText = existingText;\n }\n }\n\n if (nonText.length) {\n newParts = [...newParts, ...nonText];\n }\n\n const changed = !!(appendedText || nonText.length);\n return { newParts, newMeta: meta, changed };\n}\n\nexport function computeSuffix(existing: string, incoming: string): string {\n if (!incoming) return \"\";\n if (!existing) return incoming;\n if (existing === incoming) return \"\";\n\n const maxOverlap = Math.min(existing.length, incoming.length);\n for (let overlap = maxOverlap; overlap > 0; overlap--) {\n if (existing.slice(-overlap) === incoming.slice(0, overlap)) {\n return incoming.slice(overlap);\n }\n }\n return incoming;\n}\n\nfunction shouldAutoSpace(existing: string, appended: string): boolean {\n if (!existing || !appended) return false;\n const lastChar = existing.slice(-1);\n const firstChar = appended[0];\n if (!lastChar || !firstChar) return false;\n\n // Don't add space if either side already has whitespace\n if (/\\s/.test(lastChar) || /\\s/.test(firstChar)) return false;\n\n // Check if chars are alphanumeric\n const isAlnum = (char: string) => /[A-Za-z0-9]/.test(char);\n const isLetter = (char: string) => /[A-Za-z]/.test(char);\n const isPunctuation = (char: string) => /[.,;:!?]/.test(char);\n\n // Add space after punctuation when followed by letter or number\n if (isPunctuation(lastChar) && isAlnum(firstChar)) {\n return true;\n }\n\n // Add space when appending starts with uppercase letter (new sentence/word)\n // and existing doesn't end with space or opening punctuation\n if (/[A-Z]/.test(firstChar) && !/[\\s\\(\\[\\{]/.test(lastChar)) {\n return true;\n }\n\n // Add space between alphanumeric characters (word boundaries)\n return isAlnum(lastChar) && isLetter(firstChar);\n}\n\nexport function stampLastAssistantCheckpoint(\n messages: ChatMessage[],\n checkpointId: string,\n checkpointNs?: string | null\n): ChatMessage[] {\n for (let i = messages.length - 1; i >= 0; i--) {\n if (messages[i].role === \"assistant\") {\n const m = messages[i];\n const updated: ChatMessage = { ...m, checkpointId, checkpointNs: checkpointNs ?? undefined };\n return replaceMessageAtIndex(messages, i, updated);\n }\n }\n return messages;\n}\n\nexport function nameFromModel(model?: string): string | null {\n if (!model) return null;\n const parts = model.split(\"/\");\n return parts[parts.length - 1] || null;\n}\n","// ============================ messagesReducer.ts ============================\nimport { extractToolContent } from \"@/shared/core/utils\";\nimport { hydrateHistorySnapshots } from \"@/features/persistence/checkpoints/utils/historyUtils\";\nimport type {\n ToolCall,\n ChatMessage,\n TextPart\n} from \"@/types\";\nimport type { HydratedCheckpointSnapshot } from \"@/types/domain/persistence\";\nimport type { StreamEvent, ToolEndEvent, ToolProgressEvent, ToolStartEvent, ArtifactUpdateEvent, ToolEventIdentity } from \"@/types/domain/streaming\";\nimport type { MessagesState, MessagesAction } from \"@/types/domain/messages\";\nimport { findMessageByArtifactId, updateArtifactMetadata } from \"../../messages/utils\";\nimport { useCallback, useEffect, useMemo, useReducer, useRef } from \"react\";\nimport {\n replaceMessageAtIndex,\n sanitizeHistory,\n stampLastAssistantCheckpoint,\n} from \"./utils/reducerUtils\";\n\nfunction mergeCheckpointMessages(checkpoints: HydratedCheckpointSnapshot[]): ChatMessage[] {\n const byId = new Map<string, ChatMessage>();\n const ordered: ChatMessage[] = [];\n\n checkpoints\n .slice()\n .sort((a, b) => {\n const tsA = a.createdAt ? Date.parse(a.createdAt) : 0;\n const tsB = b.createdAt ? Date.parse(b.createdAt) : 0;\n return tsA - tsB;\n })\n .forEach((checkpoint) => {\n const messages = Array.isArray(checkpoint.messages) ? checkpoint.messages : [];\n for (const message of messages) {\n if (!message?.id || byId.has(message.id)) {\n continue;\n }\n byId.set(message.id, message);\n ordered.push(message);\n }\n });\n\n\n return ordered;\n}\n\nexport const initialMessagesState: MessagesState = {\n messages: [],\n assemblingId: null,\n lastCheckpointId: null,\n lastCheckpointNs: null,\n messagesStreamMeta: {},\n pendingInterrupt: null,\n values: {},\n};\n\nexport function messagesReducer(state: MessagesState, action: MessagesAction): MessagesState {\n switch (action.type) {\n case \"reset\": {\n const newState: MessagesState = {\n messages: sanitizeHistory(action.payload?.messages ?? []),\n assemblingId: null,\n lastCheckpointId: null,\n lastCheckpointNs: null,\n pendingInterrupt: null,\n messagesStreamMeta: {},\n values: {},\n };\n return newState;\n }\n\n case \"user_message\": {\n const { message, editingMessageId } = action.payload;\n\n // If editing a message, remove the original message and all messages after it\n // This mimics going back to the previous checkpoint (before the message was sent)\n if (editingMessageId) {\n const editIdx = state.messages.findIndex((m: ChatMessage) => m.id === editingMessageId);\n if (editIdx >= 0) {\n // Remove the edited message and everything after it\n const beforeEdit = state.messages.slice(0, editIdx);\n // Clear assemblingId to reset streaming state when editing\n return { ...state, messages: [...beforeEdit, message], assemblingId: null };\n }\n }\n\n // Normal case: append the user message and clear assemblingId\n // This ensures any previous streaming state is cleared when a new message is sent\n return { ...state, messages: [...state.messages, message], assemblingId: null };\n }\n\n case \"seed\": {\n const incoming = sanitizeHistory(action.payload.messages);\n\n // CRITICAL FIX: When seeding (typically after loadThread), REPLACE all messages\n // to prevent duplicates. The old logic of prepending caused issues where:\n // 1. Messages from previous thread remained visible\n // 2. Duplicate messages appeared when thread was reloaded\n // 3. Message order was incorrect (older messages appeared after newer ones)\n\n // Always create new state object to ensure React detects the change\n const nextState: MessagesState = {\n ...state,\n messages: incoming, // REPLACE with incoming messages (don't merge with existing)\n assemblingId: null, // Clear any streaming state on seed\n pendingInterrupt: action.payload.pendingInterrupt ?? null,\n };\n if (Object.prototype.hasOwnProperty.call(action.payload, \"checkpointId\")) {\n nextState.lastCheckpointId = action.payload.checkpointId ?? null;\n }\n if (Object.prototype.hasOwnProperty.call(action.payload, \"checkpointNs\")) {\n nextState.lastCheckpointNs = action.payload.checkpointNs ?? null;\n }\n if (Object.prototype.hasOwnProperty.call(action.payload, \"values\")) {\n nextState.values = action.payload.values ?? {};\n }\n return nextState;\n }\n\n case \"prepend\": {\n const incoming = sanitizeHistory(action.payload.messages);\n if (!incoming.length) {\n return state;\n }\n const existingIds = new Set(state.messages.map((m: ChatMessage) => m.id));\n const unique = incoming.filter((m: ChatMessage) => !existingIds.has(m.id));\n if (!unique.length) {\n return state;\n }\n const combined = [...unique, ...state.messages];\n return { ...state, messages: combined };\n }\n\n\n case \"event\": {\n return applyEvent(state, action.payload.ev);\n }\n\n case \"batch\": {\n const { events } = action.payload;\n if (!events.length) return state;\n return events.reduce((acc, ev) => applyEvent(acc, ev), state);\n }\n\n default:\n return state;\n }\n}\n\n// ---- Hook wrapper (handy with useStream) ----\nexport function useMessagesReducer(initial: ChatMessage[] = []) {\n const [state, dispatch] = useReducer(messagesReducer, { ...initialMessagesState, messages: initial });\n\n const queueRef = useRef<StreamEvent[]>([]);\n const rafRef = useRef<number | null>(null);\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const flushQueue = useCallback(() => {\n if (rafRef.current !== null && typeof window !== \"undefined\") {\n window.cancelAnimationFrame(rafRef.current);\n }\n if (timeoutRef.current !== null) {\n clearTimeout(timeoutRef.current);\n }\n rafRef.current = null;\n timeoutRef.current = null;\n\n const events = queueRef.current;\n if (!events.length) {\n return;\n }\n queueRef.current = [];\n dispatch({ type: \"batch\", payload: { events } });\n }, []);\n\n const scheduleFlush = useCallback(() => {\n if (typeof window !== \"undefined\" && typeof window.requestAnimationFrame === \"function\") {\n if (rafRef.current === null) {\n rafRef.current = window.requestAnimationFrame(() => flushQueue());\n }\n } else if (timeoutRef.current === null) {\n // Reduced from 16ms to 8ms for more responsive updates\n timeoutRef.current = setTimeout(flushQueue, 8);\n }\n }, [flushQueue]);\n\n const onEvent = useCallback((ev: StreamEvent) => {\n queueRef.current.push(ev);\n scheduleFlush();\n }, [scheduleFlush]);\n\n useEffect(() => {\n return () => {\n if (rafRef.current !== null && typeof window !== \"undefined\") {\n window.cancelAnimationFrame(rafRef.current);\n }\n if (timeoutRef.current !== null) {\n clearTimeout(timeoutRef.current);\n }\n queueRef.current = [];\n };\n }, []);\n\n const api = useMemo(() => ({\n reset: (messages?: ChatMessage[]) => dispatch({ type: \"reset\", payload: { messages } }),\n seed: (\n messages: ChatMessage[],\n opts?: { \n checkpointId?: string | null; \n checkpointNs?: string | null; \n pendingInterrupt?: { id: string; value: any } | null;\n values?: Record<string, any>;\n }\n ) =>\n dispatch({ type: \"seed\", payload: { messages, ...(opts ?? {}) } }),\n prepend: (messages: ChatMessage[]) => dispatch({ type: \"prepend\", payload: { messages } }),\n pushUser: (message: ChatMessage, editingMessageId?: string | null) =>\n dispatch({ type: \"user_message\", payload: { message, editingMessageId } }),\n onEvent,\n }), [onEvent]);\n\n return { state, dispatch, ...api } as const;\n}\n\nfunction applyEvent(state: MessagesState, ev: StreamEvent): MessagesState {\n if (ev.type === \"tool.start\") {\n return handleToolStart(state, ev as ToolStartEvent);\n }\n\n if (ev.type === \"tool.progress\") {\n return handleToolProgress(state, ev as ToolProgressEvent);\n }\n\n if (ev.type === \"tool.end\") {\n return handleToolEnd(state, ev as ToolEndEvent);\n }\n\n if (ev.type === \"artifact.update\") {\n return handleArtifactUpdate(state, ev as ArtifactUpdateEvent);\n }\n\n // message.start/delta/end logic removed - handled by useStream local state and final history persistence\n\n if (ev.type === \"checkpoint\") {\n // Only stamp checkpoint metadata on the last assistant message\n // DON'T reload all messages - streaming events already contain everything\n const checkpointNs = ev.checkpointNs ?? state.lastCheckpointNs ?? null;\n const messages = stampLastAssistantCheckpoint(state.messages, ev.checkpointId, checkpointNs);\n return { ...state, lastCheckpointId: ev.checkpointId, lastCheckpointNs: checkpointNs, messages };\n }\n\n if (ev.type === \"error\") {\n const errMsg: ChatMessage = {\n id: `err-${Date.now()}`,\n role: \"system\",\n content: [{ type: \"text\", text: `Error: ${ev.message}` } as TextPart],\n createdAt: new Date().toISOString(),\n };\n // Use optimized insertion for appending\n return { ...state, messages: [...state.messages, errMsg] };\n }\n\n if (ev.type === \"state_history\") {\n const hydrated = hydrateHistorySnapshots(ev);\n const nextPending = hydrated.interrupt;\n const latest = hydrated.latest;\n const mergedMessages = mergeCheckpointMessages(hydrated.checkpoints);\n let messages = mergedMessages.length ? mergedMessages : latest?.messages ?? [];\n if (messages) {\n if (state.assemblingId && !messages.some((m: ChatMessage) => m.id === state.assemblingId)) {\n const assemblingMsg = state.messages.find((m: ChatMessage) => m.id === state.assemblingId);\n if (assemblingMsg) {\n messages = [...messages, assemblingMsg];\n }\n }\n messages = sanitizeHistory(messages);\n } else {\n messages = [];\n }\n\n return {\n ...state,\n messages,\n pendingInterrupt: nextPending,\n lastCheckpointId: latest?.checkpointId ?? state.lastCheckpointId,\n lastCheckpointNs: latest?.checkpointNs ?? state.lastCheckpointNs,\n values: latest?.values ?? state.values,\n };\n }\n\n if (ev.type === \"thread_info\") {\n // thread_info events are handled directly by StreamingProvider\n // no need to store them in reducer state\n return state;\n }\n\n return state;\n}\n\nfunction getToolEventKey(event: StreamEvent & ToolEventIdentity): string | undefined {\n return event.id ?? undefined;\n}\n\nfunction findAssistantMessageIndexForToolCall(messages: ChatMessage[], callId: string | null): number {\n if (!callId) return -1;\n // Look backwards from the end to find the most recent assistant message that has this callId\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i];\n if (msg.role === \"assistant\" && msg.toolCalls?.some(c => c.id === callId)) {\n return i;\n }\n }\n return -1;\n}\n\nfunction updateAssistantToolCall(\n messages: ChatMessage[],\n callId: string,\n updates: Partial<ToolCall>\n): ChatMessage[] {\n const index = findAssistantMessageIndexForToolCall(messages, callId);\n if (index === -1) return messages;\n\n const assistant = messages[index];\n const nextCalls = (assistant.toolCalls ?? []).map(c => \n c.id === callId ? { ...c, ...updates } : c\n );\n\n return replaceMessageAtIndex(messages, index, { ...assistant, toolCalls: nextCalls });\n}\n\n\nfunction handleToolStart(state: MessagesState, event: ToolStartEvent): MessagesState {\n const toolEv = event as any;\n const callId = toolEv.id || toolEv.callId;\n const toolName = toolEv.name ?? undefined;\n\n const entryContent = `Starting ${toolName ?? \"tool\"}...`;\n let nextMessages = state.messages;\n\n if (callId) {\n let assistantIdx = findAssistantMessageIndexForToolCall(nextMessages, callId);\n \n // If not found, attach to the last assistant message\n if (assistantIdx === -1) {\n for (let i = nextMessages.length - 1; i >= 0; i--) {\n if (nextMessages[i].role === \"assistant\") {\n assistantIdx = i;\n break;\n }\n }\n }\n\n if (assistantIdx !== -1) {\n const assistant = nextMessages[assistantIdx];\n const toolCalls = [...(assistant.toolCalls ?? [])];\n const callIdx = toolCalls.findIndex(c => c.id === callId);\n\n if (callIdx >= 0) {\n toolCalls[callIdx] = { ...toolCalls[callIdx], status: \"running\", content: entryContent };\n } else {\n toolCalls.push({\n id: callId,\n name: toolName || \"tool\",\n args: toolEv.args || {},\n status: \"running\",\n content: entryContent,\n });\n }\n nextMessages = replaceMessageAtIndex(nextMessages, assistantIdx, { ...assistant, toolCalls });\n } else {\n // Create a new assistant message if none exists\n const agentName = toolEv.agentName ?? \"assistant\";\n const newAssistant: ChatMessage = {\n id: `ai-${Date.now()}`,\n role: \"assistant\",\n name: agentName,\n content: [],\n toolCalls: [{\n id: callId,\n name: toolName || \"tool\",\n args: toolEv.args || {},\n status: \"running\",\n content: entryContent,\n }],\n createdAt: new Date().toISOString(),\n };\n nextMessages = [...nextMessages, newAssistant];\n }\n }\n\n return { ...state, messages: nextMessages };\n}\n\nfunction handleToolProgress(state: MessagesState, event: ToolProgressEvent): MessagesState {\n const callId = event.id ?? getToolEventKey(event);\n if (!callId) return state;\n\n const content = event.content ?? undefined;\n let nextMessages = state.messages;\n\n const assistantIdx = findAssistantMessageIndexForToolCall(nextMessages, callId);\n if (assistantIdx !== -1) {\n const assistant = nextMessages[assistantIdx];\n const outputSource = content ?? null;\n const rawContent = typeof outputSource === 'string' ? outputSource : JSON.stringify(outputSource);\n const extracted = extractToolContent(outputSource);\n const finalContent = typeof extracted === 'string' ? extracted : rawContent;\n\n const toolCalls = (assistant.toolCalls ?? []).map(c => \n c.id === callId ? { ...c, content: finalContent } : c\n );\n nextMessages = replaceMessageAtIndex(nextMessages, assistantIdx, { ...assistant, toolCalls });\n }\n \n return { ...state, messages: nextMessages };\n}\n\nfunction handleToolEnd(state: MessagesState, event: ToolEndEvent): MessagesState {\n const callId = getToolEventKey(event);\n let nextMessages = state.messages;\n\n const outputSource = event.content ?? event.error ?? null;\n const content = typeof outputSource === 'string' ? outputSource : JSON.stringify(outputSource);\n const extracted = extractToolContent(outputSource);\n const finalContent = typeof extracted === 'string' ? extracted : content;\n\n // 1. Sync Assistant Message\n if (callId) {\n const assistantIdx = findAssistantMessageIndexForToolCall(nextMessages, callId);\n if (assistantIdx !== -1) {\n nextMessages = updateAssistantToolCall(nextMessages, callId, {\n status: \"completed\",\n content: finalContent,\n artifact: event.artifact,\n });\n }\n }\n\n // 2. Append independent tool message (for artifact rendering)\n const toolMsg: ChatMessage = {\n id: `tool-${callId || Date.now()}`,\n role: \"tool\",\n name: event.name ?? undefined,\n content: [{ type: \"text\", text: finalContent }],\n artifact: event.artifact,\n toolCallId: callId ?? undefined,\n createdAt: new Date().toISOString(),\n };\n\n return { ...state, messages: [...nextMessages, toolMsg] };\n}\n\nfunction handleArtifactUpdate(state: MessagesState, event: ArtifactUpdateEvent): MessagesState {\n const artifactId = (event as any).artifactId;\n const toolCallId = (event as any).callId as string | undefined;\n\n // Find the message containing this artifact\n const message = findMessageByArtifactId(state.messages, artifactId, toolCallId);\n \n if (!message) {\n // If message not found, create a temporary one for the artifact\n // This allows artifacts to be created before their tool message\n const tempMessage: ChatMessage = {\n id: `artifact-${artifactId}`,\n role: \"tool\",\n name: \"artifact_updater\",\n content: [],\n createdAt: new Date().toISOString(),\n artifact: {\n type: \"unknown\",\n metadata: {\n id: artifactId,\n type: \"unknown\",\n createdAt: new Date().toISOString(),\n status: event.status,\n progress: event.progress,\n },\n ...event.partial_data,\n },\n };\n \n return {\n ...state,\n messages: [...state.messages, tempMessage],\n };\n }\n \n // Update the existing message's artifact metadata\n const messageIndex = state.messages.indexOf(message);\n const updatedMessage = updateArtifactMetadata(message, {\n status: event.status,\n progress: event.progress,\n error: event.error,\n });\n \n // Also merge partial data into the artifact\n if (event.partial_data && updatedMessage.artifact) {\n updatedMessage.artifact = {\n ...updatedMessage.artifact,\n ...event.partial_data,\n };\n }\n \n return {\n ...state,\n messages: replaceMessageAtIndex(state.messages, messageIndex, updatedMessage),\n };\n}\n","import type { HydratedCheckpointSnapshot, ChatMessage, TextPart } from '@/types';\n\nconst PREVIEW_LIMIT = 120;\n\nfunction buildTextPreview(parts: ChatMessage['content']): string {\n if (!Array.isArray(parts)) {\n return '';\n }\n\n const textChunks = parts\n .filter((part): part is TextPart => Boolean(part && part.type === 'text'))\n .map((part) => (part.text ?? '').trim())\n .filter(Boolean);\n\n if (!textChunks.length) {\n return '';\n }\n\n const joined = textChunks.join(' ').replace(/\\s+/g, ' ').trim();\n if (!joined) {\n return '';\n }\n\n return joined.length > PREVIEW_LIMIT ? `${joined.slice(0, PREVIEW_LIMIT - 3)}…` : joined;\n}\n\nexport function getPreviewForMessage(message: ChatMessage): string {\n const textPreview = buildTextPreview(message.content);\n return textPreview || '';\n}\n\n/**\n * Builds a map of checkpoint ID -> preview text.\n * Each checkpoint gets its own preview based on the latest user message in that checkpoint.\n * This ensures all checkpoints display accurate previews even if they reference the same message ID.\n */\nexport function buildCheckpointPreviewMap(checkpoints: HydratedCheckpointSnapshot[]): Map<string, string> {\n const previews = new Map<string, string>();\n\n for (const checkpoint of checkpoints) {\n if (!checkpoint.checkpointId) continue;\n\n // Find the latest user message in this checkpoint\n const lastUserMessage = checkpoint.messages?.find(\n (msg: ChatMessage) => msg.role === 'user'\n );\n\n if (lastUserMessage) {\n const preview = getPreviewForMessage(lastUserMessage);\n if (preview) {\n previews.set(checkpoint.checkpointId, preview);\n }\n }\n }\n\n return previews;\n}\n","import { getPreviewForMessage } from \"./messagePreviews\";\nimport type { ChatMessage, HydratedCheckpointSnapshot } from \"@/types\";\nimport type { CheckpointMeta, TimelineCheckpoint } from \"../types\";\n\nexport interface CheckpointIndex {\n checkpoints: HydratedCheckpointSnapshot[];\n checkpointMetaByCheckpointId: Map<string, CheckpointMeta>;\n timeline: TimelineCheckpoint[];\n messagePreviews: Map<string, string>;\n getLatest: () => CheckpointMeta | undefined;\n getCheckpoint: (id: string) => CheckpointMeta | undefined;\n getMessageAttempts: (userMessageId: string) => CheckpointMeta[];\n}\n\nexport function buildCheckpointIndex(\n checkpoints: HydratedCheckpointSnapshot[]\n): CheckpointIndex {\n const checkpointMetaByCheckpointId = new Map<string, CheckpointMeta>();\n const timeline: TimelineCheckpoint[] = [];\n const messagePreviews = new Map<string, string>();\n const checkpointMetaList: CheckpointMeta[] = [];\n\n for (let idx = 0; idx < checkpoints.length; idx++) {\n const checkpoint = checkpoints[idx];\n const checkpointId = checkpoint.checkpointId;\n const canonicalId = checkpointId ?? `cp-${idx}`;\n const metadata = checkpoint.metadata ?? {};\n const step = typeof metadata.step === \"number\" ? metadata.step : null;\n const source = typeof metadata.source === \"string\" ? metadata.source : null;\n\n let latestUserMessageId: string | null = null;\n let previewMessage: ChatMessage | null = null;\n const messages = Array.isArray(checkpoint.messages) ? checkpoint.messages : [];\n for (const msg of messages) {\n if (msg.role !== \"user\") continue;\n if (!previewMessage) {\n previewMessage = msg;\n }\n if (msg.id) {\n latestUserMessageId = msg.id;\n }\n }\n\n const nextCheckpoint =\n checkpoint.next && checkpoint.next.length > 0 ? String(checkpoint.next[0]) : null;\n const parentConfig = checkpoint.parentConfig ?? null;\n\n const meta: CheckpointMeta = {\n id: canonicalId,\n step,\n source,\n createdAt: checkpoint.createdAt ?? null,\n namespace: checkpoint.checkpointNs ?? null,\n parentId: checkpoint.parentId ?? null,\n next: nextCheckpoint,\n parentConfig,\n userMessageId: latestUserMessageId,\n };\n\n checkpointMetaList.push(meta);\n\n if (checkpointId) {\n checkpointMetaByCheckpointId.set(checkpointId, meta);\n }\n\n if (checkpointId && previewMessage) {\n const previewText = getPreviewForMessage(previewMessage);\n if (previewText) {\n messagePreviews.set(checkpointId, previewText);\n }\n }\n\n timeline.push({\n id: canonicalId,\n messageId: latestUserMessageId,\n step,\n source,\n createdAt: checkpoint.createdAt ?? null,\n next: nextCheckpoint,\n parentConfig,\n });\n }\n\n const attemptsByUserMsg = new Map<string, CheckpointMeta[]>();\n for (const meta of checkpointMetaList) {\n if (!meta.userMessageId) continue;\n const group = attemptsByUserMsg.get(meta.userMessageId) ?? [];\n group.push(meta);\n attemptsByUserMsg.set(meta.userMessageId, group);\n }\n\n for (const attempts of attemptsByUserMsg.values()) {\n if (!attempts.length) continue;\n attempts.sort((a, b) => {\n const tsA = a.createdAt ? Date.parse(a.createdAt) : 0;\n const tsB = b.createdAt ? Date.parse(b.createdAt) : 0;\n return tsB - tsA;\n });\n\n const totalAttempts = attempts.length;\n for (let attemptIndex = 0; attemptIndex < attempts.length; attemptIndex++) {\n const attemptMeta = attempts[attemptIndex];\n attemptMeta.attemptCount = totalAttempts;\n attemptMeta.attemptIndex = attemptIndex;\n attemptMeta.isLatestAttempt = attemptIndex === 0;\n }\n }\n\n const getLatest = () => {\n const latestEntry = timeline[0];\n if (!latestEntry) return undefined;\n return checkpointMetaByCheckpointId.get(latestEntry.id);\n };\n\n const getCheckpoint = (id: string) => checkpointMetaByCheckpointId.get(id);\n\n const getMessageAttempts = (userMessageId: string) => {\n const attempts: CheckpointMeta[] = [];\n for (const meta of checkpointMetaByCheckpointId.values()) {\n if (meta.userMessageId === userMessageId) {\n attempts.push(meta);\n }\n }\n if (!attempts.length) {\n return [];\n }\n attempts.sort((a, b) => {\n const indexA =\n typeof a.attemptIndex === \"number\" ? a.attemptIndex : Number.MAX_SAFE_INTEGER;\n const indexB =\n typeof b.attemptIndex === \"number\" ? b.attemptIndex : Number.MAX_SAFE_INTEGER;\n return indexA - indexB;\n });\n return attempts;\n };\n\n return {\n checkpoints,\n checkpointMetaByCheckpointId,\n timeline,\n messagePreviews,\n getLatest,\n getCheckpoint,\n getMessageAttempts,\n };\n}\n\nexport function getMessageAttemptInfo(\n messageId: string | undefined,\n checkpointId: string | null | undefined,\n index: CheckpointIndex\n): { attemptCount: number; attemptIndex: number; attempts: CheckpointMeta[] } {\n if (!messageId) {\n return { attemptCount: 1, attemptIndex: 0, attempts: [] };\n }\n\n const metaAttempts = index.getMessageAttempts(messageId);\n if (!metaAttempts.length) {\n return { attemptCount: 1, attemptIndex: 0, attempts: [] };\n }\n\n let currentIndex = 0;\n if (checkpointId) {\n const matchingIndex = metaAttempts.findIndex((cp) => cp.id === checkpointId);\n if (matchingIndex >= 0) {\n currentIndex = matchingIndex;\n }\n }\n\n return {\n attemptCount: metaAttempts.length,\n attemptIndex: currentIndex,\n attempts: metaAttempts,\n };\n}\n\nexport function getCheckpointForMessage(\n checkpointId: string | null | undefined,\n index: CheckpointIndex\n): CheckpointMeta | null {\n if (!checkpointId) {\n return null;\n }\n return index.getCheckpoint(checkpointId) ?? null;\n}\n","import { useMemo } from \"react\";\nimport { buildCheckpointIndex } from \"../utils/checkpointIndex\";\nimport type { HydratedCheckpointSnapshot } from \"@/types\";\n\nexport function useCheckpointIndex(\n checkpoints: HydratedCheckpointSnapshot[]\n) {\n return useMemo(() => buildCheckpointIndex(checkpoints), [checkpoints]);\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { isCancel } from \"axios\";\n\nimport type { ChatApi } from \"@/shared/core\";\nimport type { StateHistoryEvent } from \"@/features/streaming\";\nimport {\n hydrateHistorySnapshots,\n} from \"@/features/persistence/checkpoints/utils/historyUtils\";\nimport type { ChatMessage, HistoryPayload, HydratedCheckpointSnapshot } from \"@/types\";\nimport type { TimelineCheckpoint } from \"@/features/persistence/checkpoints/types\";\nimport { useCheckpointIndex } from \"@/features/persistence/checkpoints/hooks\";\nimport type { PendingInterrupt } from \"@/types\";\nimport type { CheckpointIndex } from \"@/features/persistence/checkpoints/utils/checkpointIndex\";\n\ninterface UseThreadHistoryStateOptions {\n api: ChatApi;\n seed: (\n messages: ChatMessage[],\n opts?: { checkpointId?: string | null; checkpointNs?: string | null; pendingInterrupt?: PendingInterrupt; values?: Record<string, unknown> }\n ) => void;\n onError?: (msg: string) => void;\n currentThreadId: string | null;\n initialThreadId?: string | null;\n initialCheckpointId?: string | null;\n initialCheckpointNs?: string | null;\n autoLoadInitial?: boolean;\n isStreaming: boolean;\n getMessages: () => ChatMessage[];\n}\n\ninterface ThreadHistoryResult {\n threadCheckpoints: HydratedCheckpointSnapshot[];\n threadTimeline: TimelineCheckpoint[];\n checkpointIndex: CheckpointIndex;\n isLoadingThread: boolean;\n isLoadingCheckpoint: boolean;\n threadStateError: string | null;\n loadThread: (\n threadId: string,\n checkpointId?: string | null,\n options?: { clearProgress?: boolean }\n ) => Promise<void>;\n navigateToCheckpoint: (checkpointId: string, checkpointNs?: string | null) => Promise<void>;\n setCurrentCheckpointId: (checkpointId: string | null, checkpointNs?: string | null) => void;\n returnToLatest: () => Promise<void>;\n handleStateHistoryEvent: (event: StateHistoryEvent) => void;\n markSkipNextLoad: (threadId: string | null) => void;\n markStreamPendingThread: (threadId: string | null) => void;\n resetHistoryState: () => void;\n clearState: () => void;\n}\n\nexport function useThreadHistoryState({\n api,\n seed,\n onError,\n currentThreadId,\n initialThreadId = null,\n initialCheckpointId = null,\n initialCheckpointNs = null,\n autoLoadInitial = true,\n isStreaming,\n getMessages,\n}: UseThreadHistoryStateOptions): ThreadHistoryResult {\n const [threadHistoryPayload, setThreadHistoryPayload] = useState<HistoryPayload | null>(null);\n const hydratedHistory = useMemo(\n () => hydrateHistorySnapshots(threadHistoryPayload),\n [threadHistoryPayload]\n );\n const threadCheckpoints = hydratedHistory.checkpoints;\n const checkpointIndex = useCheckpointIndex(threadCheckpoints);\n const threadTimeline = checkpointIndex.timeline;\n const [isLoadingThread, setIsLoadingThread] = useState(false);\n const [isLoadingCheckpoint, setIsLoadingCheckpoint] = useState(false);\n const [threadStateError, setThreadStateError] = useState<string | null>(null);\n\n const currentThreadIdRef = useRef<string | null>(currentThreadId);\n const previousThreadIdRef = useRef<string | null>(null);\n const skipNextLoadRef = useRef<string | null>(null);\n const streamPendingThreadRef = useRef<string | null>(null);\n const manualLoadThreadRef = useRef<string | null>(null);\n const lastLoadedKeyRef = useRef<string | null>(null);\n const inFlightLoadsRef = useRef<Map<string, Promise<void>>>(new Map());\n const threadHistoryAbortControllerRef = useRef<AbortController | null>(null);\n useEffect(() => {\n currentThreadIdRef.current = currentThreadId;\n }, [currentThreadId]);\n\n const runThreadOperation = useCallback(\n async (opts: {\n threadId: string | null;\n setLoading: (value: boolean) => void;\n action: (operationThreadId: string) => Promise<void>;\n onStart?: () => void;\n handleError?: (msg: string) => void;\n }) => {\n if (!opts.threadId) return;\n const operationThreadId = opts.threadId;\n opts.onStart?.();\n opts.setLoading(true);\n try {\n await opts.action(operationThreadId);\n } catch (error) {\n const isCanceled = isCancel(error);\n if (!isCanceled && currentThreadIdRef.current === operationThreadId) {\n const msg = String(error);\n opts.handleError?.(msg);\n onError?.(msg);\n }\n throw error;\n } finally {\n opts.setLoading(false);\n }\n },\n [onError]\n );\n\n const loadThreadInternal = useCallback(\n async (threadId: string, checkpointId?: string | null) => {\n if (!threadId) return;\n\n const key = `${threadId}:${checkpointId ?? \"latest\"}`;\n const cached = inFlightLoadsRef.current.get(key);\n if (cached) {\n return cached;\n }\n\n threadHistoryAbortControllerRef.current?.abort();\n const controller = new AbortController();\n threadHistoryAbortControllerRef.current = controller;\n\n const loadPromise = runThreadOperation({\n threadId,\n setLoading: setIsLoadingThread,\n onStart: () => setThreadStateError(null),\n handleError: (msg) => setThreadStateError(msg),\n action: async (operationThreadId) => {\n const history = await api.getStateHistory({\n threadId: operationThreadId,\n checkpointId: checkpointId ?? undefined,\n signal: controller.signal,\n });\n\n if (currentThreadIdRef.current !== operationThreadId) {\n console.log(\n `[useThreadHistoryState] Thread changed during load (was ${operationThreadId}, now ${currentThreadIdRef.current}), discarding stale data`\n );\n return;\n }\n\n const { checkpoints, latest } = hydrateHistorySnapshots(history);\n \n // Use the latest checkpoint which contains the full accumulated message history\n // Only use a specific checkpoint if navigating to a particular checkpoint ID\n const dataCheckpoint = checkpointId\n ? checkpoints.find((cp: HydratedCheckpointSnapshot) => cp.checkpointId === checkpointId) ?? latest\n : latest;\n\n seed(dataCheckpoint?.messages ?? [], {\n checkpointId: dataCheckpoint?.checkpointId ?? null,\n checkpointNs: dataCheckpoint?.checkpointNs ?? null,\n pendingInterrupt: dataCheckpoint?.interrupt ?? null,\n });\n\n setThreadHistoryPayload(history);\n },\n });\n\n inFlightLoadsRef.current.set(key, loadPromise);\n\n try {\n await loadPromise;\n } finally {\n inFlightLoadsRef.current.delete(key);\n if (threadHistoryAbortControllerRef.current === controller) {\n threadHistoryAbortControllerRef.current = null;\n }\n }\n\n if (currentThreadIdRef.current === threadId) {\n lastLoadedKeyRef.current = key;\n }\n\n return loadPromise;\n },\n [api, seed, runThreadOperation]\n );\n\n const loadThread = useCallback(\n async (\n threadId: string,\n checkpointId?: string | null\n ) => {\n manualLoadThreadRef.current = threadId;\n try {\n await loadThreadInternal(threadId, checkpointId);\n } catch (error) {\n if (!isCancel(error)) {\n throw error;\n }\n } finally {\n if (manualLoadThreadRef.current === threadId) {\n manualLoadThreadRef.current = null;\n }\n }\n },\n [loadThreadInternal]\n );\n\n const markSkipNextLoad = useCallback((threadId: string | null) => {\n skipNextLoadRef.current = threadId;\n }, []);\n\n const markStreamPendingThread = useCallback((threadId: string | null) => {\n streamPendingThreadRef.current = threadId;\n }, []);\n\n const handleStateHistoryEvent = useCallback(\n (event: StateHistoryEvent) => {\n const threadId = event.threadId ?? currentThreadIdRef.current;\n if (!threadId) return;\n if (currentThreadIdRef.current && currentThreadIdRef.current !== threadId) {\n // Allow proceeding if this is the pending stream thread, even if currentThreadIdRef hasn't updated yet\n if (streamPendingThreadRef.current !== threadId) {\n return;\n }\n }\n\n const { checkpoints, latest } = hydrateHistorySnapshots(event);\n if (!checkpoints.length) {\n return;\n }\n\n // Use the latest checkpoint which contains the full accumulated message history\n const dataCheckpoint = latest;\n\n // ✅ Always seed messages from StateHistoryEvent:\n // StateHistoryEvent contains the complete final state and should replace partial stream messages\n // This ensures that the full message history (including profile reviews, summaries) is displayed\n seed(dataCheckpoint?.messages ?? [], {\n checkpointId: dataCheckpoint?.checkpointId ?? null,\n checkpointNs: dataCheckpoint?.checkpointNs ?? null,\n pendingInterrupt: dataCheckpoint?.interrupt ?? null,\n values: dataCheckpoint?.values,\n });\n\n // Always update the history payload and checkpoint metadata for timeline/navigation purposes\n setThreadHistoryPayload(event);\n\n lastLoadedKeyRef.current = `${threadId}:latest`;\n skipNextLoadRef.current = null;\n // Only clear streamPendingThreadRef if this event is for the same thread\n if (streamPendingThreadRef.current === threadId) {\n streamPendingThreadRef.current = null;\n }\n },\n [seed, isStreaming]\n );\n\n const navigateToCheckpoint = useCallback(\n async (checkpointId: string, checkpointNs?: string | null) => {\n const threadId = currentThreadIdRef.current;\n await runThreadOperation({\n threadId,\n setLoading: setIsLoadingCheckpoint,\n action: async (operationThreadId) => {\n const history = await api.getStateHistory({\n threadId: operationThreadId,\n checkpointId,\n checkpointNs: checkpointNs ?? undefined,\n });\n\n if (currentThreadIdRef.current !== operationThreadId) {\n return;\n }\n\n const { checkpoints } = hydrateHistorySnapshots(history);\n const requestedCheckpoint = checkpoints.find(\n (cp: HydratedCheckpointSnapshot) => cp.checkpointId === checkpointId && (checkpointNs ? cp.checkpointNs === checkpointNs : true)\n );\n\n if (!requestedCheckpoint) {\n console.warn(\"[useThreadHistoryState] Requested checkpoint not found:\", { checkpointId, checkpointNs });\n return;\n }\n\n setThreadHistoryPayload(history);\n seed(requestedCheckpoint.messages ?? [], {\n checkpointId: requestedCheckpoint.checkpointId ?? null,\n checkpointNs: requestedCheckpoint.checkpointNs ?? null,\n });\n },\n }).catch(() => {});\n },\n [api, seed, runThreadOperation]\n );\n\n const setCurrentCheckpointId = useCallback(\n (checkpointId: string | null, checkpointNs?: string | null) => {\n seed(getMessages(), {\n checkpointId: checkpointId ?? null,\n checkpointNs: checkpointNs ?? null,\n });\n },\n [getMessages, seed]\n );\n\n const returnToLatest = useCallback(async () => {\n if (currentThreadIdRef.current) {\n await loadThread(currentThreadIdRef.current);\n }\n }, [loadThread]);\n\n useEffect(() => {\n if (!autoLoadInitial || !currentThreadId || isLoadingThread) {\n return;\n }\n\n if (isStreaming) {\n return;\n }\n\n if (skipNextLoadRef.current === currentThreadId) {\n skipNextLoadRef.current = null;\n previousThreadIdRef.current = currentThreadId;\n return;\n }\n\n if (streamPendingThreadRef.current === currentThreadId) {\n previousThreadIdRef.current = currentThreadId;\n return;\n }\n\n if (manualLoadThreadRef.current === currentThreadId) {\n manualLoadThreadRef.current = null;\n previousThreadIdRef.current = currentThreadId;\n return;\n }\n\n if (previousThreadIdRef.current === currentThreadId) {\n return;\n }\n\n previousThreadIdRef.current = currentThreadId;\n // Always load with latest checkpoint on initial load, ignore initialCheckpointId\n // This prevents bugs from stale checkpoint data at app startup\n let checkpointIdToLoad: string | undefined;\n const keyToLoad = `${currentThreadId}:${checkpointIdToLoad ?? \"latest\"}`;\n if (lastLoadedKeyRef.current === keyToLoad) {\n return;\n }\n\n void loadThread(currentThreadId, checkpointIdToLoad);\n }, [\n autoLoadInitial,\n currentThreadId,\n initialCheckpointId,\n initialCheckpointNs,\n initialThreadId,\n isLoadingThread,\n isStreaming,\n loadThread,\n ]);\n\n const resetHistoryState = useCallback(() => {\n setThreadHistoryPayload(null);\n setIsLoadingThread(false);\n setIsLoadingCheckpoint(false);\n setThreadStateError(null);\n skipNextLoadRef.current = null;\n streamPendingThreadRef.current = null;\n previousThreadIdRef.current = null;\n lastLoadedKeyRef.current = null;\n manualLoadThreadRef.current = null;\n }, []);\n\n return {\n threadCheckpoints,\n threadTimeline,\n checkpointIndex,\n isLoadingThread,\n isLoadingCheckpoint,\n threadStateError,\n loadThread,\n navigateToCheckpoint,\n setCurrentCheckpointId,\n returnToLatest,\n handleStateHistoryEvent,\n markSkipNextLoad,\n markStreamPendingThread,\n resetHistoryState,\n clearState: resetHistoryState,\n };\n}\n","import { createContext, useCallback, useContext, useEffect, useMemo, useRef, type ReactNode } from 'react';\nimport { useApi } from '@/shared/core/hooks/useApi';\nimport { useMessagesReducer } from '@/features/thread/contexts/reducers/MessageReducer';\nimport { useThreadHistoryState } from '@/features/thread/hooks/useThreadHistoryState';\nimport type { ThreadStateContextValue } from '@/features/streaming/contexts/types';\nimport type { ChatMessage, PendingInterrupt } from '@/types';\nimport type { RespondToInterruptOptions } from '@/types/domain/persistence';\nimport { normalizeMessage } from '@/shared/core/utils/messageFactory';\nimport { useThreads } from './ThreadsProvider';\nimport { extractAllArtifacts } from \"@/shared/core/utils\";\n\ninterface ThreadStateProviderProps {\n children: ReactNode;\n initialThreadId?: string | null;\n initialCheckpointId?: string | null;\n initialCheckpointNs?: string | null;\n autoLoadInitial?: boolean;\n isStreaming: boolean;\n onError?: (error: string) => void;\n}\n\ninterface ThreadStateUpdater {\n registerClearThread: (fn: ThreadStateContextValue['clearThread']) => void;\n registerRespondToInterrupt: (fn: ThreadStateContextValue['respondToInterrupt']) => void;\n}\n\nconst ThreadStateContext = createContext<ThreadStateContextValue | null>(null);\nconst ThreadStateUpdaterContext = createContext<ThreadStateUpdater | null>(null);\n\n\nexport function useThreadState(options: { optional: true }): ThreadStateContextValue | null;\nexport function useThreadState(options?: { optional?: false }): ThreadStateContextValue;\nexport function useThreadState(options?: { optional?: boolean }) {\n const ctx = useContext(ThreadStateContext);\n if (!ctx && !options?.optional) throw new Error('useThreadState must be used within a ThreadStateProvider');\n return ctx;\n}\n\nexport function useThreadStateUpdater() {\n const ctx = useContext(ThreadStateUpdaterContext);\n if (!ctx) {\n throw new Error('useThreadStateUpdater must be used within a ThreadStateProvider');\n }\n return ctx;\n}\n\nexport function ThreadStateProvider({\n children,\n initialThreadId = null,\n initialCheckpointId = null,\n initialCheckpointNs = null,\n autoLoadInitial = true,\n isStreaming,\n onError,\n}: ThreadStateProviderProps) {\n const { chatApi: api } = useApi();\n const { currentThreadId } = useThreads();\n const { state, seed, onEvent, dispatch } = useMessagesReducer();\n\n const {\n threadCheckpoints,\n threadTimeline,\n checkpointIndex,\n isLoadingThread,\n isLoadingCheckpoint,\n threadStateError,\n loadThread,\n navigateToCheckpoint,\n setCurrentCheckpointId,\n returnToLatest,\n handleStateHistoryEvent,\n markSkipNextLoad,\n markStreamPendingThread,\n resetHistoryState,\n } = useThreadHistoryState({\n api,\n seed,\n onError,\n currentThreadId,\n initialThreadId,\n initialCheckpointId,\n initialCheckpointNs,\n autoLoadInitial,\n isStreaming,\n getMessages: useCallback(() => state.messages, [state.messages]),\n });\n\n useEffect(() => {\n if (!currentThreadId) {\n seed([], {});\n resetHistoryState();\n }\n }, [currentThreadId, seed, resetHistoryState]);\n\n const clearThreadRef = useRef<ThreadStateContextValue['clearThread'] | null>(null);\n const registerClearThread = useCallback(\n (fn: ThreadStateContextValue['clearThread']) => {\n clearThreadRef.current = fn;\n },\n []\n );\n\n const respondToInterruptRef = useRef<ThreadStateContextValue['respondToInterrupt'] | null>(null);\n const registerRespondToInterrupt = useCallback(\n (fn: ThreadStateContextValue['respondToInterrupt']) => {\n respondToInterruptRef.current = fn;\n },\n []\n );\n\n const metadataValue = useMemo(() => {\n const assemblingId = state.assemblingId ?? null;\n return { assemblingMessageId: assemblingId };\n }, [state.assemblingId]);\n\n const pushUser = useCallback(\n (content: string | ChatMessage, options?: import(\"@/types/core\").PushUserOptions) => {\n const userMsg = normalizeMessage(content, 'user');\n \n dispatch({ \n type: 'user_message', \n payload: { \n message: userMsg, \n editingMessageId: options?.editingMessageId \n } \n });\n return userMsg;\n },\n [dispatch]\n );\n\n const handleClearState = useCallback(async () => {\n if (clearThreadRef.current) {\n await clearThreadRef.current();\n } else {\n seed([], {});\n resetHistoryState();\n }\n }, [seed, resetHistoryState]);\n\n const artifacts = useMemo(() => extractAllArtifacts(state.messages), [state.messages]);\n\n const threadStateValue = useMemo<ThreadStateContextValue>(\n () => ({\n threadId: currentThreadId,\n messages: state.messages,\n interrupt: state.pendingInterrupt,\n checkpoint: {\n id: state.lastCheckpointId ?? null,\n namespace: state.lastCheckpointNs ?? null,\n },\n checkpoints: threadCheckpoints,\n checkpointIndex,\n timelineCheckpoints: threadTimeline,\n metadata: metadataValue,\n values: state.values ?? {},\n isLoading: isLoadingThread,\n isLoadingCheckpoint,\n error: threadStateError,\n loadOlder: async () => {}, // Placeholder\n seedFromSnapshot: (snapshot: { messages: ChatMessage[]; checkpointId?: string | null; checkpointNs?: string | null; interrupt?: PendingInterrupt }) => {\n seed(snapshot.messages, {\n checkpointId: snapshot.checkpointId,\n checkpointNs: snapshot.checkpointNs,\n pendingInterrupt: snapshot.interrupt,\n });\n },\n clearState: handleClearState,\n navigateToCheckpoint,\n setCurrentCheckpointId,\n returnToLatest,\n loadThread: async (threadId: string, cpId?: string | null, _cpNs?: string | null) => {\n await loadThread(threadId, cpId, { clearProgress: false });\n },\n clearThread: handleClearState,\n respondToInterrupt: async (approved: boolean, value?: unknown, options?: RespondToInterruptOptions) => {\n if (respondToInterruptRef.current) {\n await respondToInterruptRef.current(approved, value, options);\n }\n },\n messagePreviews: checkpointIndex.messagePreviews,\n handleStateHistoryEvent,\n markSkipNextLoad,\n markStreamPendingThread,\n resetHistoryState,\n pushUser,\n onEvent,\n artifacts,\n }),\n [\n currentThreadId,\n state.messages,\n state.pendingInterrupt,\n state.lastCheckpointId,\n state.lastCheckpointNs,\n state.values,\n threadCheckpoints,\n threadTimeline,\n checkpointIndex,\n metadataValue,\n isLoadingThread,\n isLoadingCheckpoint,\n threadStateError,\n seed,\n handleClearState,\n navigateToCheckpoint,\n setCurrentCheckpointId,\n returnToLatest,\n loadThread,\n handleStateHistoryEvent,\n markSkipNextLoad,\n markStreamPendingThread,\n pushUser,\n onEvent,\n artifacts,\n ]\n );\n\n const updaterValue = useMemo(\n () => ({\n registerClearThread,\n registerRespondToInterrupt,\n }),\n [registerClearThread, registerRespondToInterrupt]\n );\n\n return (\n <ThreadStateUpdaterContext.Provider value={updaterValue}>\n <ThreadStateContext.Provider value={threadStateValue}>{children}</ThreadStateContext.Provider>\n </ThreadStateUpdaterContext.Provider>\n );\n}\n","import { processAttachments } from '@/shared/core/utils';\nimport { useApi } from '@/shared/core/hooks/useApi';\nimport type { \n ChatRequest, \n RespondToInterruptOptions,\n ChatMessage,\n MessagePart\n} from \"@/types\";\nimport { normalizeMessage } from '@/shared/core/utils/messageFactory';\nimport type { StreamCallbacks, StreamContextValue, StreamSubmitPayload } from '@/types/core';\nimport type { ToolEndEvent, StreamEvent, StreamFinishInfo, ThreadInfoEvent } from \"@/types/domain/streaming\";\nimport { createContext, useCallback, useContext, useEffect, useMemo, useRef, type ReactNode } from 'react';\nimport { useStream as useStreamApi } from '../hooks/use-stream';\nimport {\n useThreads,\n useThreadState,\n useThreadStateUpdater,\n} from '@/features/conversation/contexts';\nimport { findParentCheckpointForEdit } from '@/features/persistence/checkpoints/utils/editUtils';\n\nconst StreamContext = createContext<StreamContextValue | null>(null);\nconst SessionBoundaryContext = createContext(false);\n\ninterface StreamingProviderProps {\n children: ReactNode;\n onError?: (error: string) => void;\n onAuthError?: (error: string) => void;\n onConnectionError?: (error: string) => void;\n onToolEnd?: (event: ToolEndEvent) => void;\n onUpdateEvent?: (event: StreamEvent) => void;\n onCustomEvent?: (event: StreamEvent) => void;\n onMetadataEvent?: (event: StreamEvent) => void;\n onFinish?: (info: StreamFinishInfo) => void;\n onStreamingChange?: (isStreaming: boolean) => void;\n}\n\nexport function StreamingProvider({\n children,\n onError,\n onAuthError,\n onConnectionError,\n onToolEnd,\n onUpdateEvent,\n onCustomEvent,\n onMetadataEvent,\n onFinish,\n onStreamingChange,\n}: StreamingProviderProps) {\n const { chatApi: api, baseUrl } = useApi();\n const streamBaseUrl = baseUrl;\n\n const stableOnError = useStableHandler(onError);\n const stableOnAuthError = useStableHandler(onAuthError);\n const stableOnConnectionError = useStableHandler(onConnectionError);\n const stableOnToolEnd = useStableHandler(onToolEnd);\n const stableOnUpdateEvent = useStableHandler(onUpdateEvent);\n const stableOnCustomEvent = useStableHandler(onCustomEvent);\n const stableOnMetadataEvent = useStableHandler(onMetadataEvent);\n const stableOnFinish = useStableHandler(onFinish);\n const stableOnStreamingChange = useStableHandler(onStreamingChange);\n\n const streamHandlers = useMemo(\n () => ({\n onError: stableOnError,\n onAuthError: stableOnAuthError,\n onConnectionError: stableOnConnectionError,\n onMetadataEvent: stableOnMetadataEvent,\n onCustomEvent: stableOnCustomEvent,\n onUpdateEvent: stableOnUpdateEvent,\n onToolEnd: stableOnToolEnd,\n onFinish: stableOnFinish,\n }),\n [\n stableOnError,\n stableOnAuthError,\n stableOnConnectionError,\n stableOnMetadataEvent,\n stableOnCustomEvent,\n stableOnUpdateEvent,\n stableOnToolEnd,\n stableOnFinish,\n ]\n );\n\n return (\n <SessionBoundaryContext.Provider value={true}>\n <StreamLayer\n api={api}\n streamBaseUrl={streamBaseUrl}\n handlers={streamHandlers}\n onStreamingChange={stableOnStreamingChange}\n >\n {children}\n </StreamLayer>\n </SessionBoundaryContext.Provider>\n );\n}\n\ninterface StreamLayerHandlers {\n onError?: (error: string) => void;\n onAuthError?: (error: string) => void;\n onConnectionError?: (error: string) => void;\n onMetadataEvent?: (event: StreamEvent) => void;\n onCustomEvent?: (event: StreamEvent) => void;\n onUpdateEvent?: (event: StreamEvent) => void;\n onToolEnd?: (event: ToolEndEvent) => void;\n onFinish?: (info: StreamFinishInfo) => void;\n}\n\ninterface StreamLayerProps {\n children: ReactNode;\n api: ReturnType<typeof useApi>['chatApi'];\n streamBaseUrl: string;\n handlers: StreamLayerHandlers;\n onStreamingChange?: (value: boolean) => void;\n}\n\nfunction StreamLayer({\n children,\n api: _api,\n streamBaseUrl,\n handlers,\n onStreamingChange,\n}: StreamLayerProps) {\n const { setCurrentThreadId, currentThreadIdRef, addThreadFromEvent, currentThreadId } = useThreads();\n\n const {\n interrupt: historyInterrupt,\n checkpoint,\n timelineCheckpoints,\n handleStateHistoryEvent,\n markSkipNextLoad,\n markStreamPendingThread,\n resetHistoryState,\n pushUser,\n onEvent,\n messages: threadMessages,\n } = useThreadState();\n const { registerClearThread, registerRespondToInterrupt } = useThreadStateUpdater();\n\n const handleThreadInfoEvent = useCallback(\n (event: ThreadInfoEvent) => {\n addThreadFromEvent(event);\n markStreamPendingThread(event.threadId);\n\n if (currentThreadIdRef.current !== event.threadId) {\n const isNewThread = Boolean(event.created ?? !currentThreadIdRef.current);\n if (isNewThread) {\n markSkipNextLoad(event.threadId);\n }\n setCurrentThreadId(event.threadId);\n }\n },\n [addThreadFromEvent, markSkipNextLoad, markStreamPendingThread, setCurrentThreadId, currentThreadIdRef]\n );\n\n const streamApi = useStreamApi({\n baseUrl: streamBaseUrl,\n onEvent,\n onError: (error) => {\n handlers.onError?.(error?.message ?? String(error));\n },\n onAuthError: handlers.onAuthError,\n onConnectionError: handlers.onConnectionError,\n onFinish: handlers.onFinish,\n onThreadInfo: handleThreadInfoEvent,\n onMetadataEvent: handlers.onMetadataEvent,\n onCustomEvent: handlers.onCustomEvent,\n onUpdateEvent: handlers.onUpdateEvent,\n onToolEnd: handlers.onToolEnd,\n handleStateHistoryEvent,\n });\n\n useEffect(() => {\n onStreamingChange?.(streamApi.isStreaming);\n }, [streamApi.isStreaming, onStreamingChange]);\n\n const { stream, stop, clear, isStreaming, error, connected, streamedMessages, activeMessageId } = streamApi;\n\n // Clear stream state (including optimistic messages) when the active thread changes\n useEffect(() => {\n if (currentThreadId !== undefined) {\n clear();\n }\n }, [currentThreadId, clear]);\n\n const startStream = useCallback(\n async (input: StreamSubmitPayload, callbacks?: StreamCallbacks) => {\n await stream(input, callbacks);\n },\n [stream]\n );\n\n const checkpointRef = useRef(checkpoint);\n\n useEffect(() => {\n checkpointRef.current = checkpoint;\n }, [checkpoint]);\n\n const respondToInterrupt = useCallback(\n async (\n approved: boolean,\n value?: unknown,\n options?: RespondToInterruptOptions\n ) => {\n const activeThread = currentThreadIdRef.current;\n if (!activeThread) {\n throw new Error(\"No active thread to handle interrupt\");\n }\n const responseValue = approved ? value ?? true : false;\n const currentCheckpoint = checkpointRef.current;\n const request: ChatRequest = {\n threadId: activeThread,\n checkpointId: currentCheckpoint.id ?? undefined,\n checkpointNs: currentCheckpoint.namespace ?? undefined,\n command: { kind: \"resume\", value: responseValue },\n payload: options?.payload,\n };\n startStream(request);\n },\n [currentThreadIdRef, startStream]\n );\n\n useEffect(() => {\n registerRespondToInterrupt(respondToInterrupt);\n }, [respondToInterrupt, registerRespondToInterrupt]);\n\n const clearThread = useCallback(async () => {\n stop();\n clear();\n resetHistoryState();\n setCurrentThreadId(null);\n }, [clear, resetHistoryState, setCurrentThreadId, stop]);\n\n useEffect(() => {\n registerClearThread(clearThread);\n }, [clearThread, registerClearThread]);\n\n const submit = useCallback(\n async (input: StreamSubmitPayload, callbacks?: StreamCallbacks) => {\n if (isStreaming) {\n stop();\n }\n\n let threadId = currentThreadIdRef.current;\n const text = input?.text ?? '';\n const attachments = input?.attachments ?? [];\n const trimmedText = text?.trim() ?? '';\n const payloadExtras = { ...(input?.payload ?? {}) };\n const overrideMessages = Array.isArray(payloadExtras.messages)\n ? (payloadExtras.messages as ChatMessage[])\n : undefined;\n if (overrideMessages) {\n delete payloadExtras.messages;\n }\n const hasOverrideMessages = Boolean(overrideMessages && overrideMessages.length);\n\n const hasContentParts = Boolean(input.contentParts && input.contentParts.length > 0);\n if (!threadId && !trimmedText && attachments.length === 0 && !hasOverrideMessages && !hasContentParts) return;\n if (!threadId) {\n const timestamp = Math.floor(Date.now() / 1000).toString(16).padStart(8, '0');\n const random = Array.from({ length: 4 }, () => Math.floor(Math.random() * 0xFFFFFFFF).toString(16).padStart(8, '0')).join('').slice(0, 16);\n threadId = `${timestamp}${random}`;\n markSkipNextLoad(threadId);\n setCurrentThreadId(threadId);\n }\n\n let preProcessedParts: MessagePart[] | null = null;\n if (input.contentParts && input.contentParts.length > 0) {\n preProcessedParts = input.contentParts;\n }\n\n const { contentParts: attachmentParts, filesInfo } = preProcessedParts\n ? { contentParts: preProcessedParts, filesInfo: [] }\n : await processAttachments(attachments);\n\n const messageContent: MessagePart[] = [...attachmentParts];\n if (trimmedText) {\n messageContent.push({ type: 'text', text });\n }\n\n const originalMessageId = input?.originalMessageId;\n const isEditing = Boolean(input?.edit && originalMessageId);\n const shouldUseComposerMessage = !hasOverrideMessages && messageContent.length > 0;\n\n let composerMessage: ChatMessage | null = null;\n if (shouldUseComposerMessage) {\n const userMsgId = isEditing ? originalMessageId! : `msg-${Date.now()}`;\n composerMessage = normalizeMessage({\n id: userMsgId,\n role: 'user',\n content: messageContent,\n createdAt: new Date().toISOString(),\n }, 'user');\n if (!isEditing) {\n pushUser(composerMessage);\n } else {\n pushUser(composerMessage, { editingMessageId: originalMessageId });\n }\n }\n\n const payloadMessages: ChatMessage[] = hasOverrideMessages\n ? overrideMessages!\n : composerMessage\n ? [composerMessage]\n : [];\n\n const requestPayload: Record<string, unknown> = {\n ...payloadExtras,\n ...(filesInfo.length ? { files_info: filesInfo } : {}),\n };\n if (payloadMessages.length) {\n requestPayload.messages = payloadMessages;\n } else if (!('messages' in requestPayload)) {\n requestPayload.messages = [];\n }\n\n const requestCheckpointId = input?.checkpointId ?? checkpoint.id ?? undefined;\n if (input?.edit && !requestCheckpointId) {\n throw new Error(\n \"[streaming] Missing checkpointId for edit submit. \" +\n `threadId=${threadId ?? \"null\"}`\n );\n }\n\n const streamInput: StreamSubmitPayload = {\n threadId,\n content: input?.text,\n payload: requestPayload,\n config: input?.config,\n checkpointId: requestCheckpointId,\n command: input?.command,\n edit: input?.edit,\n };\n\n return startStream(streamInput, callbacks);\n },\n [checkpoint, currentThreadIdRef, isStreaming, markSkipNextLoad, pushUser, startStream, stop, timelineCheckpoints]\n );\n\n const mergedMessages = useMemo(() => {\n const hasStreamed = Object.keys(streamedMessages).length > 0;\n if (!isStreaming && !hasStreamed) {\n return threadMessages;\n }\n\n const merged = new Map<string, ChatMessage>();\n threadMessages.forEach((msg) => merged.set(msg.id, msg));\n Object.values(streamedMessages).forEach((streamed) => {\n merged.set(streamed.id, streamed);\n });\n\n return Array.from(merged.values());\n }, [isStreaming, streamedMessages, threadMessages]);\n\n const streamValue = useMemo<StreamContextValue>(\n () => ({\n isStreaming,\n error,\n connectionState: error ? \"error\" : isStreaming ? (connected ? \"connected\" : \"connecting\") : \"idle\",\n messages: mergedMessages,\n activeMessageId,\n submit,\n stop,\n interrupt: historyInterrupt,\n resume: () => Promise.resolve(),\n goto: (_node: string, _value?: unknown) => Promise.resolve(),\n clearError: () => {}, // TODO: Implement error clearing\n }),\n [isStreaming, error, submit, stop, historyInterrupt, connected, mergedMessages]\n );\n\n return <StreamContext.Provider value={streamValue}>{children}</StreamContext.Provider>;\n}\n\nfunction useStableHandler<T extends (...args: any[]) => unknown>(callback?: T) {\n const handlerRef = useRef<T | undefined>(callback);\n useEffect(() => {\n handlerRef.current = callback;\n }, [callback]);\n\n return useCallback((...args: Parameters<T>) => {\n const handler = handlerRef.current;\n if (!handler) {\n return undefined;\n }\n return handler(...args);\n }, []);\n}\n\nexport function useStream(): StreamContextValue {\n const ctx = useContext(StreamContext);\n if (!ctx) throw new Error('useStream must be used within StreamingProvider');\n return ctx;\n}\n\nexport function useHasChatSession(): boolean {\n return useContext(SessionBoundaryContext);\n}\n","import { useRef } from 'react';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction shallowEqual(left: unknown, right: unknown): boolean {\n if (Object.is(left, right)) return true;\n if (!isRecord(left) || !isRecord(right)) return false;\n\n const leftKeys = Object.keys(left);\n const rightKeys = Object.keys(right);\n\n if (leftKeys.length !== rightKeys.length) {\n return false;\n }\n\n for (const key of leftKeys) {\n if (!Object.prototype.hasOwnProperty.call(right, key)) {\n return false;\n }\n if (!Object.is(left[key], right[key])) {\n return false;\n }\n }\n\n return true;\n}\n\nexport function useShallowStableValue<T>(value: T): T {\n const previousValueRef = useRef(value);\n const stableValueRef = useRef(value);\n\n if (!shallowEqual(previousValueRef.current, value)) {\n previousValueRef.current = value;\n stableValueRef.current = value;\n }\n\n return stableValueRef.current;\n}\n","import type { ToolEndEvent } from \"@/types\";\n\n/**\n * Extracts a task ID from a tool end event payload.\n * Supports both snake_case (task_id) and camelCase (taskId) keys on artifact or content payloads.\n */\nexport function extractTaskIdFromToolEnd(event: ToolEndEvent): string | null {\n const artifactCandidate =\n event.artifact && typeof event.artifact === \"object\" ? (event.artifact as Record<string, unknown>) : null;\n\n const fallbackPayload =\n !artifactCandidate && event.content && typeof event.content === \"object\"\n ? (event.content as Record<string, unknown>)\n : null;\n\n const payload = artifactCandidate ?? fallbackPayload;\n\n const candidate =\n (payload?.task_id as string | undefined) ??\n (payload?.taskId as string | undefined) ??\n null;\n\n return typeof candidate === \"string\" ? candidate : null;\n}\n\n/**\n * Builds an onToolEnd handler that syncs task context and delegates to an optional user handler.\n */\nexport function createTaskSyncToolEndHandler(params: {\n setCurrentTaskId: (taskId: string) => void;\n getCurrentTaskId?: () => string | null;\n onToolEnd?: (event: ToolEndEvent) => void;\n}) {\n const { setCurrentTaskId, getCurrentTaskId, onToolEnd } = params;\n\n return (event: ToolEndEvent) => {\n const taskId = extractTaskIdFromToolEnd(event);\n const currentTaskId = getCurrentTaskId?.() ?? null;\n\n if (taskId && taskId !== currentTaskId) {\n setCurrentTaskId(taskId);\n }\n\n onToolEnd?.(event);\n };\n}\n","/**\n * ChatProviders - Root provider that composes all chat contexts\n * \n * Context hierarchy:\n * ApiProvider (auth token & API client)\n * └─ StreamingProvider (threads, messages, and streaming state)\n */\nimport { useState } from 'react';\nimport type { ApiConfig } from '@/types/core';\nimport type { ToolEndEvent } from '@/features/streaming';\nimport type { StreamEvent, StreamFinishInfo } from '@/types/domain/streaming';\nimport { type ReactNode, useCallback, useMemo, useRef } from 'react';\nimport { ApiProvider } from '@/shared/core/contexts/providers';\nimport { StreamingProvider } from '@/features/streaming/contexts';\nimport { useShallowStableValue } from '@/shared/core/hooks';\n\nexport interface ChatProvidersProps {\n children: ReactNode;\n apiConfig?: ApiConfig;\n initialThreadId?: string | null;\n initialCheckpointId?: string | null;\n initialCheckpointNs?: string | null;\n autoLoadInitial?: boolean;\n onConnectionError?: (error: string) => void;\n onError?: (error: string) => void;\n onAuthError?: (error: string) => void;\n onThreadChange?: (threadId: string | null) => void;\n onToolEnd?: (event: ToolEndEvent) => void;\n onUpdateEvent?: (event: StreamEvent) => void;\n onCustomEvent?: (event: StreamEvent) => void;\n onMetadataEvent?: (event: StreamEvent) => void;\n onFinish?: (info: StreamFinishInfo) => void;\n}\n\nimport { ThreadsProvider, ThreadStateProvider } from '@/features/conversation/contexts';\n\nexport function ChatProviders({\n children,\n apiConfig,\n initialThreadId = null,\n initialCheckpointId = null,\n initialCheckpointNs = null,\n autoLoadInitial = true,\n onConnectionError,\n onError,\n onAuthError,\n onThreadChange,\n onToolEnd,\n onUpdateEvent,\n onCustomEvent,\n onMetadataEvent,\n onFinish,\n}: ChatProvidersProps) {\n const stableApiConfig = useShallowStableValue(apiConfig);\n const [isStreaming, setIsStreaming] = useState(false);\n\n const handleError = useStableCallback(onError);\n const handleAuthError = useStableCallback(onAuthError);\n const handleConnectionError = useStableCallback(onConnectionError);\n const handleThreadChange = useStableCallback(onThreadChange);\n const handleToolEnd = useStableCallback(onToolEnd);\n const handleUpdateEvent = useStableCallback(onUpdateEvent);\n const handleCustomEvent = useStableCallback(onCustomEvent);\n const handleMetadataEvent = useStableCallback(onMetadataEvent);\n const handleFinish = useStableCallback(onFinish);\n\n const streamingProviderProps = useMemo(\n () => ({\n onError: handleError,\n onAuthError: handleAuthError,\n onConnectionError: handleConnectionError,\n onToolEnd: handleToolEnd,\n onUpdateEvent: handleUpdateEvent,\n onCustomEvent: handleCustomEvent,\n onMetadataEvent: handleMetadataEvent,\n onFinish: handleFinish,\n }),\n [\n handleError,\n handleAuthError,\n handleConnectionError,\n handleToolEnd,\n handleUpdateEvent,\n handleCustomEvent,\n handleMetadataEvent,\n handleFinish,\n ]\n );\n\n return (\n <ApiProvider apiConfig={stableApiConfig}>\n <ThreadsProvider\n initialThreadId={initialThreadId}\n onError={handleError}\n onThreadChange={handleThreadChange}\n >\n <ThreadStateProvider\n initialThreadId={initialThreadId}\n initialCheckpointId={initialCheckpointId}\n initialCheckpointNs={initialCheckpointNs}\n autoLoadInitial={autoLoadInitial}\n onError={handleError}\n isStreaming={isStreaming}\n >\n <StreamingProvider \n {...streamingProviderProps}\n onStreamingChange={setIsStreaming}\n >\n {children}\n </StreamingProvider>\n </ThreadStateProvider>\n </ThreadsProvider>\n </ApiProvider>\n );\n}\n\nfunction useStableCallback<T extends (...args: any[]) => unknown>(callback?: T) {\n const handlerRef = useRef<T | undefined>(callback);\n handlerRef.current = callback;\n\n return useCallback((...args: Parameters<T>) => {\n const handler = handlerRef.current;\n if (!handler) {\n return undefined;\n }\n return handler(...args);\n }, []) as T;\n}\n\n// Re-export all hooks for convenience\nexport { useApi } from '@/shared/core/hooks';\nexport { useStream, useHasChatSession } from '@/features/streaming';\nexport { useThreads, useThreadState } from '@/features/conversation/contexts';\n","import * as React from \"react\";\n\nimport { type ToastActionElement, type ToastProps } from \"../components/toast\";\n\nconst TOAST_LIMIT = 1;\nconst TOAST_REMOVE_DELAY = 1000000;\n\ntype ToasterToast = ToastProps & {\n id: string;\n title?: React.ReactNode;\n description?: React.ReactNode;\n action?: ToastActionElement;\n};\n\nconst actionTypes = {\n ADD_TOAST: \"ADD_TOAST\",\n UPDATE_TOAST: \"UPDATE_TOAST\",\n DISMISS_TOAST: \"DISMISS_TOAST\",\n REMOVE_TOAST: \"REMOVE_TOAST\",\n} as const;\n\nlet count = 0;\n\nfunction genId() {\n count = (count + 1) % Number.MAX_SAFE_INTEGER;\n return count.toString();\n}\n\ntype ActionType = typeof actionTypes;\n\ntype Action =\n | {\n type: ActionType[\"ADD_TOAST\"];\n toast: ToasterToast;\n }\n | {\n type: ActionType[\"UPDATE_TOAST\"];\n toast: Partial<ToasterToast>;\n }\n | {\n type: ActionType[\"DISMISS_TOAST\"];\n toastId?: ToasterToast[\"id\"];\n }\n | {\n type: ActionType[\"REMOVE_TOAST\"];\n toastId?: ToasterToast[\"id\"];\n };\n\ninterface State {\n toasts: ToasterToast[];\n}\n\nconst toastTimeouts = new Map<string, ReturnType<typeof setTimeout>>();\n\nconst addToRemoveQueue = (toastId: string) => {\n if (toastTimeouts.has(toastId)) {\n return;\n }\n\n const timeout = setTimeout(() => {\n toastTimeouts.delete(toastId);\n dispatch({\n type: \"REMOVE_TOAST\",\n toastId: toastId,\n });\n }, TOAST_REMOVE_DELAY);\n\n toastTimeouts.set(toastId, timeout);\n};\n\nexport const reducer = (state: State, action: Action): State => {\n switch (action.type) {\n case \"ADD_TOAST\":\n return {\n ...state,\n toasts: [action.toast, ...state.toasts].slice(0, TOAST_LIMIT),\n };\n\n case \"UPDATE_TOAST\":\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === action.toast.id ? { ...t, ...action.toast } : t\n ),\n };\n\n case \"DISMISS_TOAST\": {\n const { toastId } = action;\n\n if (toastId) {\n addToRemoveQueue(toastId);\n } else {\n state.toasts.forEach((toast) => {\n addToRemoveQueue(toast.id);\n });\n }\n\n return {\n ...state,\n toasts: state.toasts.map((t) =>\n t.id === toastId || toastId === undefined\n ? {\n ...t,\n open: false,\n }\n : t\n ),\n };\n }\n\n case \"REMOVE_TOAST\":\n if (action.toastId === undefined) {\n return {\n ...state,\n toasts: [],\n };\n }\n return {\n ...state,\n toasts: state.toasts.filter((t) => t.id !== action.toastId),\n };\n }\n};\n\nconst listeners: Array<(state: State) => void> = [];\n\nlet memoryState: State = { toasts: [] };\n\nfunction dispatch(action: Action) {\n memoryState = reducer(memoryState, action);\n listeners.forEach((listener) => {\n listener(memoryState);\n });\n}\n\ntype Toast = Omit<ToasterToast, \"id\">;\n\nexport function toast({ ...props }: Toast) {\n const id = genId();\n\n const update = (props: ToasterToast) =>\n dispatch({\n type: \"UPDATE_TOAST\",\n toast: { ...props, id },\n });\n const dismiss = () => dispatch({ type: \"DISMISS_TOAST\", toastId: id });\n\n dispatch({\n type: \"ADD_TOAST\",\n toast: {\n ...props,\n id,\n open: true,\n onOpenChange: (open) => {\n if (!open) dismiss();\n },\n },\n });\n\n return {\n id: id,\n dismiss,\n update,\n };\n}\n\nexport function useToast() {\n const [state, setState] = React.useState<State>(memoryState);\n\n React.useEffect(() => {\n listeners.push(setState);\n return () => {\n const index = listeners.indexOf(setState);\n if (index > -1) {\n listeners.splice(index, 1);\n }\n };\n }, [state]);\n\n return {\n ...state,\n toast,\n dismiss: (toastId?: string) => dispatch({ type: \"DISMISS_TOAST\", toastId }),\n };\n}\n","import { useCallback, useState } from \"react\";\nimport type { MouseEvent as ReactMouseEvent } from \"react\";\n\nimport { useApi } from \"@/shared/core\";\nimport { useToast } from \"@/shared/ui/hooks/use-toast\";\n\nexport function useFilePreview(options: { allowFileOpen: boolean; currentThreadId?: string | null }) {\n const { allowFileOpen, currentThreadId } = options;\n const { fileApi } = useApi();\n const { toast } = useToast();\n const [uploadingFiles, setUploadingFiles] = useState<Record<number, boolean>>({});\n const [viewerInfo, setViewerInfo] = useState<{ id: string; name: string; mimeType: string } | null>(null);\n const [viewerOpen, setViewerOpen] = useState(false);\n\n const closeViewer = useCallback(() => {\n setViewerOpen(false);\n setViewerInfo(null);\n }, []);\n\n const openViewer = useCallback((info: { id: string; name: string; mimeType: string }) => {\n setViewerInfo(info);\n setViewerOpen(true);\n }, []);\n\n const handleFileClick = useCallback(\n async (e: ReactMouseEvent<HTMLAnchorElement>, fp: any, idx: number) => {\n if (!allowFileOpen) {\n e.preventDefault();\n return;\n }\n\n if (uploadingFiles[idx]) {\n e.preventDefault();\n return;\n }\n\n try {\n const url: string = String(fp.url ?? \"\");\n const serverMatch = url.match(/\\/chat\\/files\\/([^/]+)(?:\\/(view|download))?/);\n\n if (serverMatch) {\n e.preventDefault();\n const id = serverMatch[1];\n const fileName = fp.name || `file_${id}`;\n const mimeType = fp.mimeType || \"application/octet-stream\";\n openViewer({ id, name: fileName, mimeType });\n return;\n }\n\n if (url.startsWith(\"data:\")) {\n e.preventDefault();\n setUploadingFiles((s) => ({ ...s, [idx]: true }));\n\n const toastHandle = toast({ title: \"Fetching file...\", description: \"\", open: true });\n\n try {\n const files = await fileApi.listFiles(currentThreadId ?? undefined);\n if (!files || !Array.isArray(files)) {\n throw new Error(\"Invalid file list response\");\n }\n\n const match = files.find((f: any) => {\n if (!f || typeof f !== \"object\") return false;\n const sameName = (f.filename ?? \"\") === (fp.name ?? \"\");\n if (!sameName) return false;\n if (typeof fp.size === \"number\" && typeof f.size === \"number\") {\n return f.size === fp.size;\n }\n return true;\n });\n\n if (!match?.id) {\n throw new Error(`File \"${fp.name}\" is not yet available on the server`);\n }\n\n if (!match.id || !match.filename) {\n throw new Error(\"Invalid file data received from server\");\n }\n\n openViewer({\n id: match.id,\n name: fp.name || match.filename || `file_${match.id}`,\n mimeType: fp.mimeType || match.mime_type || \"application/octet-stream\",\n });\n\n toastHandle.update?.({\n id: toastHandle.id,\n title: \"Success\",\n description: `Opened ${fp.name}`,\n open: true,\n } as any);\n } catch (err) {\n console.error(\"Failed to fetch server file:\", err);\n const errorMessage = err instanceof Error ? err.message : \"Unknown error occurred\";\n toastHandle.update?.({ id: toastHandle.id, title: \"Failed\", description: errorMessage } as any);\n toast({\n title: \"Failed to fetch file\",\n description: errorMessage,\n open: true,\n });\n } finally {\n setUploadingFiles((s) => ({ ...s, [idx]: false }));\n }\n }\n } catch (err) {\n console.error(\"File click error:\", err);\n setUploadingFiles((s) => ({ ...s, [idx]: false }));\n }\n },\n [allowFileOpen, uploadingFiles, toast, currentThreadId, openViewer]\n );\n\n return {\n uploadingFiles,\n handleFileClick,\n fileViewerOpen: viewerOpen,\n currentFileInfo: viewerInfo,\n closeFileViewer: closeViewer,\n };\n}\n","import { useMemo } from \"react\";\n\nimport type { ChatMessage, MessagePart } from \"@/types\";\nimport { collectText, extractToolMeta, stringifyTool } from \"../messages/utils\";\nimport type { ToolMeta } from \"@/types\";\n\nexport interface ParsedMessageContent {\n contentParts: MessagePart[];\n textContent: string;\n toolMeta: ToolMeta;\n imageParts: MessagePart[];\n fileParts: MessagePart[];\n toolRaw: string;\n isToolStreaming: boolean;\n}\n\nexport function useParsedMessageContent(\n message: ChatMessage\n): ParsedMessageContent {\n return useMemo(() => {\n const chatMessage = message;\n let content = Array.isArray(chatMessage.content) ? chatMessage.content : [];\n if (typeof chatMessage.content === \"string\") {\n content = [{ type: \"text\", text: chatMessage.content }];\n }\n return {\n contentParts: content,\n textContent: collectText(content),\n toolMeta: extractToolMeta(chatMessage),\n imageParts: content.filter((p) => p.type === \"image_url\") as MessagePart[],\n fileParts: content.filter((p) => p.type === \"file\") as MessagePart[],\n toolRaw: stringifyTool(content),\n isToolStreaming: Boolean(chatMessage.toolStreaming),\n };\n }, [message]);\n}\n","import { useMemo } from \"react\";\nimport type { ChatMessage, TextPart } from \"@/types\";\nimport { parseJsonSafe } from \"@/shared/utils/jsonUtils\";\nimport { extractToolContent } from \"@/shared/core/utils\";\n\nconst SSE_DATA_PREFIX = \"data:\";\n\nfunction parseSseSegmentsFromText(text: string): Record<string, unknown>[] {\n if (!text) return [];\n const segments: Record<string, unknown>[] = [];\n const lines = text.split(/\\r?\\n/);\n for (const line of lines) {\n const trimmed = line.trim();\n if (!trimmed || !trimmed.startsWith(SSE_DATA_PREFIX)) {\n continue;\n }\n const payload = trimmed.slice(SSE_DATA_PREFIX.length).trim();\n if (!payload || payload.toLowerCase() === \"[done]\") {\n continue;\n }\n const parsed = parseJsonSafe(payload);\n if (parsed && typeof parsed === \"object\") {\n segments.push(parsed as Record<string, unknown>);\n }\n }\n return segments;\n}\n\nfunction findToolEndEvent(events: Record<string, unknown>[]): Record<string, unknown> | null {\n for (let idx = events.length - 1; idx >= 0; idx -= 1) {\n const event = events[idx];\n if (event && typeof event === \"object\" && event.type === \"tool.end\") {\n return event;\n }\n }\n return null;\n}\n\nexport type ToolPayloadEvent = Record<string, unknown>;\n\nexport interface ToolPayloadBase {\n value: unknown;\n event: ToolPayloadEvent | null;\n}\n\n\nexport interface ToolDictPayload extends ToolPayloadBase {\n kind: \"dict\";\n data: Record<string, unknown>;\n}\n\nexport interface ToolGenericPayload extends ToolPayloadBase {\n kind: \"generic\";\n}\n\nexport type ToolPayloadResult = ToolDictPayload | ToolGenericPayload;\n\nexport function useToolPayload(message: ChatMessage): ToolPayloadResult | null {\n return useMemo(() => {\n const textParts = message.content.filter(\n (part): part is TextPart => part.type === \"text\"\n );\n if (!textParts.length) {\n return null;\n }\n\n const sseEvents = textParts.flatMap((part) =>\n parseSseSegmentsFromText(part.text ?? \"\")\n );\n let events = sseEvents;\n\n if (!events.length) {\n const aggregatedText = textParts.map((part) => part.text ?? \"\").join(\"\\n\");\n const fallback = parseJsonSafe(aggregatedText);\n if (fallback && typeof fallback === \"object\") {\n events = [fallback as Record<string, unknown>];\n }\n }\n\n if (!events.length) {\n return null;\n }\n\n const toolEndEvent = findToolEndEvent(events);\n const candidateEvent = toolEndEvent ?? events[events.length - 1];\n if (!candidateEvent) {\n return null;\n }\n\n const payload = candidateEvent.output ?? candidateEvent.payload ?? candidateEvent;\n const outputValue = extractToolContent(payload);\n if (outputValue && typeof outputValue === \"object\" && !Array.isArray(outputValue)) {\n return {\n kind: \"dict\",\n value: outputValue,\n data: outputValue as Record<string, unknown>,\n event: candidateEvent,\n };\n }\n\n return {\n kind: \"generic\",\n value: outputValue,\n event: candidateEvent,\n };\n }, [message]);\n}\n","\nimport { useState, useCallback, useMemo } from \"react\";\nimport { useApi } from \"@/shared/core/hooks/useApi\";\nimport { useStream } from \"../../streaming/contexts\";\nimport { useThreadState, useThreads } from \"../../thread/contexts\";\nimport { useThreadHistoryState } from \"../../thread/hooks/useThreadHistoryState\";\n\n// Unified options: can be just a string (threadId) or an object\ntype UseChatSessionOptions = string | { threadId?: string } | undefined;\n\nexport function useChatSession(options?: UseChatSessionOptions) {\n // Normalize input options to get requested thread ID\n const requestedThreadId = typeof options === 'string' ? options : options?.threadId;\n\n // Global state from context\n const { currentThreadId, setCurrentThreadId, actions: threadActions } = useThreads();\n const threadState = useThreadState({ optional: true });\n const streamState = useStream();\n\n // \"Standalone Mode\": A specific threadId is requested specifically, and it differs from the global currentThreadId\n // In this mode, we fetch independent state without relying on the global context providers.\n const isStandaloneMode = !!requestedThreadId && requestedThreadId !== currentThreadId;\n \n // -- Standalone Mode Implementation -- \n const [standaloneMessages, setStandaloneMessages] = useState<any[]>([]);\n \n // Local seed function for standalone mode to capture messages\n const standaloneSeed = useCallback((messages: any[]) => {\n setStandaloneMessages(messages);\n }, []);\n\n const {\n isLoadingThread: isStandaloneLoading,\n threadStateError: standaloneError,\n threadCheckpoints: standaloneCheckpoints,\n } = useThreadHistoryState({\n api: useApi().chatApi,\n seed: standaloneSeed,\n currentThreadId: isStandaloneMode ? requestedThreadId : null,\n initialThreadId: isStandaloneMode ? requestedThreadId : null,\n isStreaming: false, \n getMessages: () => standaloneMessages,\n autoLoadInitial: true\n });\n \n // Derive values from the latest checkpoint in standalone mode\n const standaloneValues = useMemo(() => {\n return standaloneCheckpoints[0]?.values || {};\n }, [standaloneCheckpoints]);\n\n // -- Unified Outputs --\n const threadId = requestedThreadId || currentThreadId;\n const messages = isStandaloneMode ? standaloneMessages : (streamState?.messages || []);\n const isLoading = isStandaloneMode ? isStandaloneLoading : (threadState?.isLoading || false);\n const values = isStandaloneMode ? standaloneValues : (threadState?.values || {});\n const error = isStandaloneMode ? standaloneError : (streamState?.error || threadState?.error || null);\n\n return {\n // UNIFIED: Single thread ID concept\n threadId,\n messages,\n isLoading,\n isHistoryLoading: isLoading,\n error,\n \n // Values & Metadata\n values,\n metadata: threadState?.metadata,\n \n // Actions & State relating to Global/Active Thread only\n navigateToCheckpoint: threadState?.navigateToCheckpoint || (async () => {}),\n returnToLatest: threadState?.returnToLatest || (async () => {}),\n checkpoint: threadState?.checkpoint || null,\n checkpoints: threadState?.checkpoints || [],\n checkpointIndex: threadState?.checkpointIndex || { timeline: [], messagePreviews: {} },\n \n interrupt: threadState?.interrupt || null,\n respondToInterrupt: threadState?.respondToInterrupt || (async () => {}),\n \n // Streaming Status (Active Thread Only)\n isStreaming: isStandaloneMode ? false : (streamState?.isStreaming || false),\n activeMessageId: streamState?.activeMessageId || null,\n connectionState: streamState?.connectionState || 'disconnected',\n streamingAssistantId: (streamState?.isStreaming && threadState?.metadata?.assemblingMessageId) ? threadState.metadata.assemblingMessageId : null,\n \n // Actions\n submit: streamState?.submit || (async () => {}),\n stop: streamState?.stop || (() => {}),\n clearThread: threadState?.clearThread || (async () => {}),\n setCurrentThreadId,\n \n // Thread Management\n createThread: threadActions.createThread,\n deleteThread: threadActions.deleteThread,\n renameThread: threadActions.renameThread,\n shareThread: threadActions.shareThread,\n threads: useThreads().threads,\n isThreadsLoading: useThreads().isLoading,\n };\n}\n","import { useState, useRef, useCallback, useEffect } from \"react\";\nimport { \n type ChatRequest, \n type ProjectInfo, \n type ChatMessage, \n type StreamSubmitPayload, \n type StreamCallbacks,\n type MessagePart, \n type TextPart, \n type StreamEvent,\n} from \"@/types\";\nimport { useChatSession } from \"./useChatSession\";\nimport { fileApiClient } from \"../../../shared/core/api/clients/fileClient\";\nimport { draftKey } from \"@/shared/core/constants/storage\";\n \nexport type EditContextMeta = { checkpointId?: string | null; checkpointNs?: string | null };\n\n/**\n * Options for sending a message via handleSendMessage.\n */\nexport interface SendMessageOptions {\n /** Files to upload (will be converted to contentParts after upload) */\n files?: File[];\n /** Pre-built content parts (e.g., already-uploaded documents with URLs) */\n contentParts?: MessagePart[];\n}\n\nexport interface UseChatControllerProps {\n submit: (payload: StreamSubmitPayload, callbacks?: StreamCallbacks) => Promise<void>;\n chatRequest: ChatRequest;\n lastCheckpointId: string | null;\n lastCheckpointNs: string | null;\n onMessageSent?: (message: string) => void;\n onExcelUploadSuccess?: (payload: { file: File }) => void;\n onError?: (error: string) => void;\n enableMessageEditing?: boolean;\n messages: ChatMessage[];\n setPendingAssistantResponse: (pending: boolean) => void;\n project?: ProjectInfo | null;\n /** Optional callback for stream events */\n onEvent?: (event: StreamEvent) => void;\n \n /** The active thread ID for draft isolation */\n threadId?: string | null;\n}\n\nexport function useChatController({\n submit,\n chatRequest,\n lastCheckpointId,\n lastCheckpointNs,\n onMessageSent,\n onExcelUploadSuccess,\n onError,\n enableMessageEditing,\n messages,\n setPendingAssistantResponse,\n project,\n onEvent,\n threadId,\n}: UseChatControllerProps) {\n const { messages: unifiedMessages } = useChatSession();\n const [editingMessageId, setEditingMessageId] = useState<string | null>(null);\n const [editingInitialValue, setEditingInitialValue] = useState<string>(\"\");\n const [editingMessageMeta, setEditingMessageMeta] = useState<EditContextMeta | null>(null);\n const [inputError, setInputError] = useState<string | null>(null);\n const [dismissError, setDismissError] = useState(false);\n\n // Initialize from localStorage for the current thread if available\n const [composerValue, _setComposerValue] = useState<string>(\"\");\n \n const composerValueRef = useRef(composerValue);\n const composerBeforeEditRef = useRef<string | null>(null);\n\n // 1. Thread Switching / Initialization Logic\n useEffect(() => {\n // If we are editing, do NOT switch out the text\n if (editingMessageId) return;\n\n if (threadId) {\n const savedDraft = localStorage.getItem(draftKey(threadId));\n _setComposerValue(savedDraft || \"\");\n } else {\n // New/Empty thread - start fresh\n _setComposerValue(\"\");\n }\n }, [threadId, editingMessageId]);\n\n const setComposerValue = useCallback((next: string) => {\n _setComposerValue(next);\n\n // 2. Persist to localStorage if NOT editing and we have a thread\n if (!editingMessageId && threadId) {\n localStorage.setItem(draftKey(threadId), next);\n }\n }, [threadId, editingMessageId]);\n\n useEffect(() => {\n composerValueRef.current = composerValue;\n }, [composerValue]);\n\n useEffect(() => {\n if (!editingMessageId) {\n composerBeforeEditRef.current = null;\n return;\n }\n\n if (composerBeforeEditRef.current === null) {\n composerBeforeEditRef.current = composerValueRef.current;\n }\n setComposerValue(editingInitialValue ?? \"\");\n }, [editingInitialValue, editingMessageId, setComposerValue]);\n\n const handleComposerChange = useCallback(\n (text: string) => {\n setComposerValue(text);\n },\n [setComposerValue]\n );\n\n const handleSendMessage = async (text: string, optionsOrFiles?: SendMessageOptions | File[]) => {\n // Support both new API (options object) and legacy API (File[])\n const options: SendMessageOptions = Array.isArray(optionsOrFiles) \n ? { files: optionsOrFiles } \n : optionsOrFiles ?? {};\n \n const files = options.files ?? [];\n const existingParts = options.contentParts ?? [];\n \n const messageText = text.trim();\n if (!messageText && files.length === 0 && existingParts.length === 0) return;\n\n try {\n // 1. Upload files first\n const uploadPromises = files.map(async (file) => {\n try {\n const record = await fileApiClient.uploadFile(file);\n return { file, record };\n } catch (e) {\n console.error(\"Failed to upload file\", file.name, e);\n throw new Error(`Failed to upload ${file.name}`);\n }\n });\n\n const uploadedFiles = await Promise.all(uploadPromises);\n\n // 2. Construct Message Parts from uploaded files\n const uploadedParts: MessagePart[] = uploadedFiles.map(({ record }) => {\n const mimeType = record.mime_type;\n if (mimeType.startsWith(\"image/\")) {\n return {\n type: \"image_url\",\n image_url: { url: record.content_url },\n };\n } else {\n return {\n type: \"file\",\n url: record.content_url,\n mimeType: mimeType,\n name: record.filename,\n size: record.size,\n };\n }\n });\n\n // 3. Combine uploaded parts with existing parts (from host app)\n const allContentParts = [...existingParts, ...uploadedParts];\n\n const editingCheckpointId = editingMessageId\n ? editingMessageMeta?.checkpointId ?? lastCheckpointId ?? undefined\n : lastCheckpointId ?? undefined;\n const editingCheckpointNs = editingMessageId\n ? editingMessageMeta?.checkpointNs ?? lastCheckpointNs ?? undefined\n : lastCheckpointNs ?? undefined;\n\n // 4. Submit with all parts\n await submit(\n {\n text: messageText || \"\",\n contentParts: allContentParts,\n attachments: files,\n payload: chatRequest.payload as Record<string, unknown>,\n edit: Boolean(editingMessageId),\n checkpointId: editingCheckpointId,\n checkpointNs: editingCheckpointNs,\n project: project ?? undefined,\n originalMessageId: editingMessageId ?? undefined,\n config: chatRequest.config,\n },\n onEvent ? { onEvent } : undefined\n );\n onMessageSent?.(messageText);\n setPendingAssistantResponse(true);\n \n // Clear composer-local state after successful send\n if (threadId) {\n localStorage.removeItem(draftKey(threadId));\n }\n \n setComposerValue(\"\");\n setInputError(null);\n setEditingMessageId(null);\n setEditingInitialValue(\"\");\n setEditingMessageMeta(null);\n } catch (e: any) {\n const msg = e?.message || \"Failed to send message\";\n setInputError(msg);\n onError?.(msg);\n setPendingAssistantResponse(false);\n }\n };\n\n const handleQuickPrompt = (prompt: string, isComposerDisabled: boolean) => {\n if (isComposerDisabled) {\n return;\n }\n void handleSendMessage(prompt, { files: [] });\n };\n\n const handleExcelUpload = useCallback(\n async (file: File) => {\n await submit(\n {\n attachments: [file],\n payload: chatRequest.payload as Record<string, unknown>,\n checkpointId: lastCheckpointId ?? undefined,\n checkpointNs: lastCheckpointNs ?? undefined,\n project: project ?? undefined,\n config: chatRequest.config,\n },\n onEvent ? { onEvent } : undefined\n );\n onExcelUploadSuccess?.({ file });\n },\n [lastCheckpointId, lastCheckpointNs, chatRequest, onExcelUploadSuccess, submit]\n );\n\n const startEditing = useCallback(\n (messageId: string, content: string, meta?: EditContextMeta) => {\n if (!enableMessageEditing) return;\n composerBeforeEditRef.current = composerValue;\n setEditingMessageId(messageId);\n setEditingInitialValue(content);\n setEditingMessageMeta({\n checkpointId: meta?.checkpointId ?? null,\n checkpointNs: meta?.checkpointNs ?? null,\n });\n setInputError(null);\n },\n [composerValue, enableMessageEditing]\n );\n\n const cancelEditing = useCallback(() => {\n setEditingMessageId(null);\n setEditingInitialValue(\"\");\n setEditingMessageMeta(null);\n setInputError(null);\n \n // Restore the draft that was there before editing\n const originalDraft = composerBeforeEditRef.current;\n if (originalDraft !== null) {\n _setComposerValue(originalDraft);\n }\n \n composerBeforeEditRef.current = null;\n }, []);\n\n const handleRegenerateCb = useCallback((messageIndex: number) => {\n let userMessage: (typeof messages)[0] | null = null;\n\n for (let i = messageIndex - 1; i >= 0; i--) {\n if (messages[i].role === \"user\") {\n userMessage = messages[i];\n break;\n }\n }\n\n if (!userMessage) return;\n\n const parts: MessagePart[] = Array.isArray(userMessage.content) ? userMessage.content : [];\n const textOnly = parts\n .filter((p) => p?.type === \"text\")\n .map((p) => (p as TextPart).text)\n .join(\"\");\n const payloadText =\n textOnly || (() => {\n try {\n return JSON.stringify(parts, null, 2);\n } catch {\n return String(parts);\n }\n })();\n\n if (!payloadText) return;\n\n void submit(\n { \n text: payloadText, \n payload: chatRequest.payload as Record<string, unknown>,\n checkpointId: lastCheckpointId ?? undefined,\n checkpointNs: lastCheckpointNs ?? undefined,\n edit: true,\n originalMessageId: userMessage.id,\n config: chatRequest.config,\n },\n onEvent ? { onEvent } : undefined\n );\n }, [messages, submit, lastCheckpointId, lastCheckpointNs, chatRequest]);\n\n /**\n * Unified list of messages (history + stream).\n */\n const displayMessages = unifiedMessages;\n\n return {\n editingMessageId,\n editingInitialValue,\n inputError,\n setInputError,\n dismissError,\n setDismissError,\n composerValue,\n handleComposerChange,\n handleSendMessage,\n handleQuickPrompt,\n handleExcelUpload,\n startEditing,\n cancelEditing,\n handleRegenerateCb,\n displayMessages,\n };\n}\n","import { useMemo } from \"react\";\nimport type { ChatMessage, ImagePart, FilePart, ToolCall, MessagePart } from \"@/types\";\nimport { \n extractTextContent, \n extractImageParts, \n extractFileParts, \n extractToolCalls\n} from \"@/shared/core/utils\";\n\nexport interface MessageContentResult {\n textContent: string;\n imageParts: ImagePart[];\n fileParts: FilePart[];\n toolCalls: ToolCall[];\n contentParts: MessagePart[];\n}\n\n/**\n * useMessageContent - Hook to extract content blocks from a ChatMessage.\n * This is the \"brain\" for any message component.\n */\nexport function useMessageContent(message: ChatMessage | null | undefined): MessageContentResult {\n return useMemo(() => {\n if (!message) {\n return {\n textContent: \"\",\n imageParts: [],\n fileParts: [],\n toolCalls: [],\n contentParts: [],\n };\n }\n \n return {\n textContent: extractTextContent(message),\n imageParts: extractImageParts(message),\n fileParts: extractFileParts(message),\n toolCalls: extractToolCalls(message),\n contentParts: message.content as MessagePart[],\n };\n }, [message]);\n}\n","import { useEffect, useRef, useState } from \"react\";\n\nimport type { MessagePart } from \"@/types\";\n\nexport function useStreamingMarkdownBuffer(\n parts: MessagePart[],\n enabled: boolean,\n debounceMs: number\n): MessagePart[] {\n const [bufferedParts, setBufferedParts] = useState(parts);\n const latestPartsRef = useRef(parts);\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(() => {\n latestPartsRef.current = parts;\n\n const flush = () => {\n setBufferedParts(latestPartsRef.current);\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n };\n\n if (!enabled || debounceMs <= 0) {\n flush();\n return;\n }\n\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n\n timerRef.current = setTimeout(() => {\n flush();\n }, debounceMs);\n\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n timerRef.current = null;\n }\n };\n }, [parts, enabled, debounceMs]);\n\n return bufferedParts;\n}\n\nexport default useStreamingMarkdownBuffer;\n"],"names":["r","f","n","clsx","CLASS_PART_SEPARATOR","createClassGroupUtils","config","classMap","createClassMap","conflictingClassGroups","conflictingClassGroupModifiers","className","classParts","getGroupRecursive","getGroupIdForArbitraryProperty","classGroupId","hasPostfixModifier","conflicts","classPartObject","currentClassPart","nextClassPartObject","classGroupFromNextClassPart","classRest","_a","validator","arbitraryPropertyRegex","arbitraryPropertyClassName","property","theme","prefix","getPrefixedClassGroupEntries","classGroup","processClassesRecursively","classDefinition","classPartObjectToEdit","getPart","isThemeGetter","key","path","currentClassPartObject","pathPart","func","classGroupEntries","prefixedClassGroup","value","createLruCache","maxCacheSize","cacheSize","cache","previousCache","update","IMPORTANT_MODIFIER","createParseClassName","separator","experimentalParseClassName","isSeparatorSingleCharacter","firstSeparatorCharacter","separatorLength","parseClassName","modifiers","bracketDepth","modifierStart","postfixModifierPosition","index","currentCharacter","baseClassNameWithImportantModifier","hasImportantModifier","baseClassName","maybePostfixModifierPosition","sortModifiers","sortedModifiers","unsortedModifiers","modifier","createConfigUtils","SPLIT_CLASSES_REGEX","mergeClassList","classList","configUtils","getClassGroupId","getConflictingClassGroupIds","classGroupsInConflict","classNames","result","originalClassName","variantModifier","modifierId","classId","conflictGroups","i","group","twJoin","argument","resolvedValue","string","toValue","mix","k","createTailwindMerge","createConfigFirst","createConfigRest","cacheGet","cacheSet","functionToCall","initTailwindMerge","previousConfig","createConfigCurrent","tailwindMerge","cachedResult","fromTheme","themeGetter","arbitraryValueRegex","fractionRegex","stringLengths","tshirtUnitRegex","lengthUnitRegex","colorFunctionRegex","shadowRegex","imageRegex","isLength","isNumber","isArbitraryLength","getIsArbitraryValue","isLengthOnly","isArbitraryNumber","isInteger","isPercent","isArbitraryValue","isTshirtSize","sizeLabels","isArbitrarySize","isNever","isArbitraryPosition","imageLabels","isArbitraryImage","isImage","isArbitraryShadow","isShadow","isAny","label","testValue","getDefaultConfig","colors","spacing","blur","brightness","borderColor","borderRadius","borderSpacing","borderWidth","contrast","grayscale","hueRotate","invert","gap","gradientColorStops","gradientColorStopPositions","inset","margin","opacity","padding","saturate","scale","sepia","skew","space","translate","getOverscroll","getOverflow","getSpacingWithAutoAndArbitrary","getSpacingWithArbitrary","getLengthWithEmptyAndArbitrary","getNumberWithAutoAndArbitrary","getPositions","getLineStyles","getBlendModes","getAlign","getZeroAndEmpty","getBreaks","getNumberAndArbitrary","twMerge","cn","inputs","normalizePythonLikeJson","text","escape","normalized","char","parseJsonSafe","looksLikeMarkdown","isImagePart","part","isFilePart","extractTextContent","message","p","extractImageParts","extractFileParts","extractToolCalls","extractAllArtifacts","messages","results","m","call","isFileLike","x","sanitizeForDisplay","arr","v","e","out","sv","pretty","sanitized","formatToolOutput","pretty_str","stringifyTool","parts","sanitizeAndStringify","obj","textParts","hasContent","extractToolContent","trimmed","parsed","toCamel","_","c","normalizeKeysRecursive","normalizeChatMessage","entry","norm","role","resolveRole","toolCalls","normalizeToolCall","content","normalizeContent","id","createdAt","name","_b","_c","model","_d","toolCallId","additionalKwargs","responseMetadata","checkpointId","_e","_f","checkpointNs","_g","_h","toolStreaming","_i","normalizeStreamEvent","ev","art","hasToolCalls","item","maybeRole","type","normalizeToolCallState","status","getAssistantToolCalls","findToolResultMessage","callId","msg","buildSyntheticResult","response","getToolCalls","input","allMessages","turnCalls","uniqueCalls","progress","artifact","resolvedState","extracted","calls","getToolCallArtifacts","STORAGE_KEYS","draftKey","threadId","inMemoryToken","tokenListeners","getChatToken","setChatToken","token","listener","onChatTokenChanged","callback","DEFAULT_TIMEOUT_MS","HISTORY_TIMEOUT_MS","httpClient","axios","res","data","nestedData","expiresAt","error","get","url","post","body","put","del","unwrap","ChatApi","base","title","project","payload","sharedWithUserId","agentId","params","shareId","chatApiClient","FileApi","onProgress","fileId","blob","filename","info","limit","offset","file","formData","fileApiClient","AuthApi","__publicField","authApiClient","ApiContext","createContext","ApiProvider","children","apiConfig","api","authApi","currentBaseUrl","currentAuthBaseUrl","currentToken","t","jsx","fileToBase64","resolve","reject","reader","buf","bytes","binary","len","processAttachments","files","contentParts","filesInfo","b64","mimeType","collectText","normalizeInterruptId","extractToolMeta","getAgentNameFromMessage","kwargsName","messageSignature","stamp","partsSig","checkpointIdSegment","checkpointNsSegment","extras","useApi","ctx","useContext","createMessage","options","normalizedContent","normalizeMessage","toPlainObject","readString","source","keys","readNumber","extractConfigFields","hydrateHistorySnapshots","history","ordered","snapshot","normalizeSnapshot","a","b","toTimestamp","latest","activeAgent","potentialMessages","normalizeMessageEntry","metadata","configFields","parentConfig","parentFields","parentId","configRecord","normalizedTasks","task","normalizedNext","normalizedMetadata","messagesWithCheckpointId","snapshotValues","rawInterruptEntries","deriveInterruptFromSnapshot","rawInterrupts","fallbackIndex","rawCount","interruptEntry","isEnvelope","useStream","hookOptions","baseUrl","streamPath","setTokenState","useState","extraHeadersRef","useRef","credentials","handlersRef","useEffect","dispatchStreamEvent","useCallback","event","handlers","_j","isStreaming","setStreaming","setError","assistantText","setAssistantText","lastCheckpointId","setLastCheckpointId","lastSeq","setLastSeq","connected","setConnected","streamedMessages","setStreamedMessages","activeMessageId","setActiveMessageId","values","setValues","ctrlRef","aliveRef","lastSeqRef","lastRunRef","lastCheckpointIdRef","lastCheckpointNsRef","lastStateHistoryRef","assistantMessageMetaRef","setToken","clear","stop","finalizeStop","err","stream","req","ac","closeReason","connectionErrorNotified","authHeader","injected","stored","settingsToken","sessionHeader","sessionId","authSessionHeaders","requestHeaders","txt","errMsg","decoder","buffer","pendingChunks","lastProcessedSeq","rafId","flushNow","joined","scheduleFlush","lastEventTs","watchdog","MAX_BUFFER_LENGTH","done","idx","raw","payloadLines","dataLines","sseEventType","line","evType","evCandidate","seq","knownTypes","checkpointEv","historyErr","toolEv","prev","targetId","assistantMsgs","callIdx","entryContent","evAny","aiMsg","toolMsg","msgId","modelName","newAssistantMsg","existing","prevText","newChunk","normalizedTool","heartbeatErr","errorEvent","authErr","_k","finalSeq","finalCheckpointId","finalCheckpointNs","finalStateHistory","finishInfo","closeErr","DETAIL_FIELDS","readErrorDetail","candidate","record","field","nested","getApiErrorMessage","detail","useThreadsState","initialThreadId","onError","onThreadChange","onCurrentThreadDeleted","threads","setThreads","currentThreadId","setCurrentThreadId","isLoadingThreads","setIsLoadingThreads","threadsError","setThreadsError","sharedThreads","setSharedThreads","isLoadingSharedThreads","setIsLoadingSharedThreads","setSharedThreadsError","shareStatus","setShareStatus","shareInFlight","setShareInFlight","currentThreadIdRef","deletionQueueRef","refreshThreads","list","refreshSharedThreads","shared","createThread","normalizedProject","thread","deleteThread","previousThreads","controller","renameThread","shareThread","unshareThread","actions","useMemo","addThreadFromEvent","threadInfo","newThread","prevThreads","updated","nextThreads","clearShareStatus","ThreadContext","ThreadsProvider","useThreads","getArtifactMetadata","updateArtifactMetadata","updates","currentMetadata","updatedMetadata","findMessageByArtifactId","artifactId","sanitizeHistory","replaceMessageAtIndex","stampLastAssistantCheckpoint","mergeCheckpointMessages","checkpoints","byId","tsA","tsB","checkpoint","initialMessagesState","messagesReducer","state","action","editingMessageId","editIdx","beforeEdit","incoming","nextState","existingIds","unique","combined","applyEvent","events","acc","useMessagesReducer","initial","dispatch","useReducer","queueRef","rafRef","timeoutRef","flushQueue","onEvent","opts","handleToolStart","handleToolProgress","handleToolEnd","handleArtifactUpdate","hydrated","nextPending","mergedMessages","assemblingMsg","getToolEventKey","findAssistantMessageIndexForToolCall","updateAssistantToolCall","assistant","nextCalls","toolName","nextMessages","assistantIdx","agentName","newAssistant","outputSource","rawContent","finalContent","tempMessage","messageIndex","updatedMessage","PREVIEW_LIMIT","buildTextPreview","textChunks","getPreviewForMessage","buildCheckpointIndex","checkpointMetaByCheckpointId","timeline","messagePreviews","checkpointMetaList","canonicalId","step","latestUserMessageId","previewMessage","nextCheckpoint","meta","previewText","attemptsByUserMsg","attempts","totalAttempts","attemptIndex","attemptMeta","latestEntry","userMessageId","indexA","indexB","getMessageAttemptInfo","messageId","metaAttempts","currentIndex","matchingIndex","cp","useCheckpointIndex","useThreadHistoryState","seed","initialCheckpointId","initialCheckpointNs","autoLoadInitial","getMessages","threadHistoryPayload","setThreadHistoryPayload","threadCheckpoints","checkpointIndex","threadTimeline","isLoadingThread","setIsLoadingThread","isLoadingCheckpoint","setIsLoadingCheckpoint","threadStateError","setThreadStateError","previousThreadIdRef","skipNextLoadRef","streamPendingThreadRef","manualLoadThreadRef","lastLoadedKeyRef","inFlightLoadsRef","threadHistoryAbortControllerRef","runThreadOperation","operationThreadId","isCancel","loadThreadInternal","cached","loadPromise","dataCheckpoint","loadThread","markSkipNextLoad","markStreamPendingThread","handleStateHistoryEvent","navigateToCheckpoint","requestedCheckpoint","setCurrentCheckpointId","returnToLatest","checkpointIdToLoad","keyToLoad","resetHistoryState","ThreadStateContext","ThreadStateUpdaterContext","useThreadState","useThreadStateUpdater","ThreadStateProvider","clearThreadRef","registerClearThread","fn","respondToInterruptRef","registerRespondToInterrupt","metadataValue","pushUser","userMsg","handleClearState","artifacts","threadStateValue","cpId","_cpNs","approved","updaterValue","StreamContext","SessionBoundaryContext","StreamingProvider","onAuthError","onConnectionError","onToolEnd","onUpdateEvent","onCustomEvent","onMetadataEvent","onFinish","onStreamingChange","streamBaseUrl","stableOnError","useStableHandler","stableOnAuthError","stableOnConnectionError","stableOnToolEnd","stableOnUpdateEvent","stableOnCustomEvent","stableOnMetadataEvent","stableOnFinish","stableOnStreamingChange","streamHandlers","StreamLayer","_api","historyInterrupt","timelineCheckpoints","threadMessages","handleThreadInfoEvent","streamApi","useStreamApi","startStream","callbacks","checkpointRef","respondToInterrupt","activeThread","responseValue","currentCheckpoint","request","clearThread","submit","attachments","trimmedText","payloadExtras","overrideMessages","hasOverrideMessages","hasContentParts","timestamp","random","preProcessedParts","attachmentParts","messageContent","originalMessageId","isEditing","shouldUseComposerMessage","composerMessage","userMsgId","payloadMessages","requestPayload","requestCheckpointId","streamInput","hasStreamed","merged","streamed","streamValue","_node","_value","handlerRef","args","handler","isRecord","shallowEqual","left","right","leftKeys","rightKeys","useShallowStableValue","previousValueRef","stableValueRef","extractTaskIdFromToolEnd","artifactCandidate","fallbackPayload","createTaskSyncToolEndHandler","setCurrentTaskId","getCurrentTaskId","taskId","currentTaskId","ChatProviders","stableApiConfig","setIsStreaming","handleError","useStableCallback","handleAuthError","handleConnectionError","handleThreadChange","handleUpdateEvent","handleCustomEvent","handleMetadataEvent","handleFinish","streamingProviderProps","TOAST_LIMIT","TOAST_REMOVE_DELAY","count","genId","toastTimeouts","addToRemoveQueue","toastId","timeout","reducer","toast","listeners","memoryState","props","dismiss","open","useToast","setState","React","useFilePreview","allowFileOpen","fileApi","uploadingFiles","setUploadingFiles","viewerInfo","setViewerInfo","viewerOpen","setViewerOpen","closeViewer","openViewer","handleFileClick","fp","serverMatch","fileName","s","toastHandle","match","errorMessage","useParsedMessageContent","chatMessage","SSE_DATA_PREFIX","parseSseSegmentsFromText","segments","lines","findToolEndEvent","useToolPayload","aggregatedText","fallback","candidateEvent","outputValue","useChatSession","requestedThreadId","threadActions","threadState","streamState","isStandaloneMode","standaloneMessages","setStandaloneMessages","standaloneSeed","isStandaloneLoading","standaloneError","standaloneCheckpoints","standaloneValues","isLoading","useChatController","chatRequest","lastCheckpointNs","onMessageSent","onExcelUploadSuccess","enableMessageEditing","setPendingAssistantResponse","unifiedMessages","setEditingMessageId","editingInitialValue","setEditingInitialValue","editingMessageMeta","setEditingMessageMeta","inputError","setInputError","dismissError","setDismissError","composerValue","_setComposerValue","composerValueRef","composerBeforeEditRef","savedDraft","setComposerValue","next","handleComposerChange","handleSendMessage","optionsOrFiles","existingParts","messageText","uploadPromises","uploadedParts","allContentParts","editingCheckpointId","editingCheckpointNs","handleQuickPrompt","prompt","isComposerDisabled","handleExcelUpload","startEditing","cancelEditing","originalDraft","handleRegenerateCb","userMessage","payloadText","useMessageContent","useStreamingMarkdownBuffer","enabled","debounceMs","bufferedParts","setBufferedParts","latestPartsRef","timerRef","flush"],"mappings":"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","x_google_ignoreList":[0,1]}
|