@gravity-ui/aikit 2.12.0 → 2.12.1-beta.2336481053e77df6ae08dc7848547d6a577cd2da.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/build/cjs/adapters/openai/helpers/getStreamEventContentUpdate.js +2 -8
  2. package/build/cjs/adapters/openai/helpers/getStreamEventContentUpdate.js.map +1 -1
  3. package/build/cjs/components/molecules/Suggestions/Suggestions.d.ts +2 -2
  4. package/build/cjs/components/molecules/Suggestions/Suggestions.js +2 -2
  5. package/build/cjs/components/molecules/Suggestions/Suggestions.js.map +1 -1
  6. package/build/cjs/components/organisms/PromptInput/PromptInput.js +3 -3
  7. package/build/cjs/components/organisms/PromptInput/PromptInput.js.map +1 -1
  8. package/build/cjs/components/organisms/PromptInput/types.d.ts +2 -2
  9. package/build/cjs/components/organisms/PromptInput/types.js.map +1 -1
  10. package/build/cjs/components/pages/ChatContainer/ChatContainer.js +9 -2
  11. package/build/cjs/components/pages/ChatContainer/ChatContainer.js.map +1 -1
  12. package/build/cjs/components/templates/EmptyContainer/EmptyContainer.d.ts +2 -2
  13. package/build/cjs/components/templates/EmptyContainer/EmptyContainer.js.map +1 -1
  14. package/build/cjs/components/templates/History/ChatItem.js +2 -1
  15. package/build/cjs/components/templates/History/ChatItem.js.map +1 -1
  16. package/build/cjs/package.json +1 -1
  17. package/build/cjs/types/common.d.ts +7 -1
  18. package/build/cjs/types/common.js.map +1 -1
  19. package/build/cjs/types/messages.d.ts +7 -0
  20. package/build/cjs/types/messages.js.map +1 -1
  21. package/build/cjs/utils/createMockOpenAIStream.d.ts +2 -1
  22. package/build/cjs/utils/createMockOpenAIStream.js +22 -6
  23. package/build/cjs/utils/createMockOpenAIStream.js.map +1 -1
  24. package/build/esm/adapters/openai/helpers/getStreamEventContentUpdate.js +2 -8
  25. package/build/esm/adapters/openai/helpers/getStreamEventContentUpdate.js.map +1 -1
  26. package/build/esm/components/molecules/Suggestions/Suggestions.d.ts +2 -2
  27. package/build/esm/components/molecules/Suggestions/Suggestions.js +2 -2
  28. package/build/esm/components/molecules/Suggestions/Suggestions.js.map +1 -1
  29. package/build/esm/components/organisms/PromptInput/PromptInput.js +3 -3
  30. package/build/esm/components/organisms/PromptInput/PromptInput.js.map +1 -1
  31. package/build/esm/components/organisms/PromptInput/types.d.ts +2 -2
  32. package/build/esm/components/organisms/PromptInput/types.js.map +1 -1
  33. package/build/esm/components/pages/ChatContainer/ChatContainer.js +9 -2
  34. package/build/esm/components/pages/ChatContainer/ChatContainer.js.map +1 -1
  35. package/build/esm/components/templates/EmptyContainer/EmptyContainer.d.ts +2 -2
  36. package/build/esm/components/templates/EmptyContainer/EmptyContainer.js.map +1 -1
  37. package/build/esm/components/templates/History/ChatItem.js +3 -2
  38. package/build/esm/components/templates/History/ChatItem.js.map +1 -1
  39. package/build/esm/package.json +1 -1
  40. package/build/esm/types/common.d.ts +7 -1
  41. package/build/esm/types/common.js.map +1 -1
  42. package/build/esm/types/messages.d.ts +7 -0
  43. package/build/esm/types/messages.js.map +1 -1
  44. package/build/esm/utils/createMockOpenAIStream.d.ts +2 -1
  45. package/build/esm/utils/createMockOpenAIStream.js +19 -4
  46. package/build/esm/utils/createMockOpenAIStream.js.map +1 -1
  47. package/package.json +1 -1
@@ -174,14 +174,8 @@ function getFunctionCallDoneUpdate(item) {
174
174
  else {
175
175
  output = undefined;
176
176
  }
177
- return {
178
- kind: 'tool_update',
179
- item_id: fnCallId,
180
- status: fnStatus,
181
- toolName: typeof fn.name === 'string' ? fn.name : undefined,
182
- output,
183
- error: typeof fn.error === 'string' ? fn.error : undefined,
184
- };
177
+ const mcpRequest = (0, prettyPrintJson_1.prettyPrintJson)(typeof fn.arguments === 'string' ? fn.arguments : undefined);
178
+ return Object.assign({ kind: 'tool_update', item_id: fnCallId, status: fnStatus, toolName: typeof fn.name === 'string' ? fn.name : undefined, output, error: typeof fn.error === 'string' ? fn.error : undefined }, (mcpRequest ? { mcpRequest } : {}));
185
179
  }
186
180
  function getToolCallDoneUpdate(item, toolName) {
187
181
  if (typeof item.id !== 'string')
@@ -1 +1 @@
1
- {"version":3,"file":"getStreamEventContentUpdate.js","sourceRoot":"../../../../../src","sources":["adapters/openai/helpers/getStreamEventContentUpdate.ts"],"names":[],"mappings":"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","sourcesContent":["import type {TToolStatus} from '../../../types';\nimport {OpenAIStreamEventLike, OpenAIStreamOutputItemLike} from '../types/openAiTypes';\n\nimport {getTextDeltaFromStreamEvent} from './getTextDeltaFromStreamEvent';\nimport {prettyPrintJson} from './prettyPrintJson';\n\ntype EventRecord = Record<string, unknown>;\n\nexport type StreamEventTextDelta = {kind: 'text_delta'; delta: string};\nexport type StreamEventToolAdd = {\n kind: 'tool_add';\n id: string;\n toolName: string;\n serverLabel?: string;\n /** Initial status; use 'waitingConfirmation' for mcp_approval_request, 'waitingSubmission' if API defines such. Default 'loading'. */\n status?: TToolStatus;\n /** Optional payload to show in tool card (e.g. approval request arguments). */\n headerContent?: string;\n /** MCP request arguments, pretty-printed JSON. Surfaced for AIStudioChat's tool renderer. */\n mcpRequest?: string;\n};\nexport type StreamEventToolUpdate = {\n kind: 'tool_update';\n item_id: string;\n status: TToolStatus;\n toolName?: string;\n output?: string;\n error?: string;\n /** MCP request arguments, pretty-printed JSON. */\n mcpRequest?: string;\n /** MCP response or error, pretty-printed JSON. */\n mcpResponse?: string;\n};\nexport type StreamEventThinkingAdd = {kind: 'thinking_add'; item_id: string};\nexport type StreamEventThinkingDelta = {kind: 'thinking_delta'; item_id: string; delta: string};\nexport type StreamEventThinkingDone = {kind: 'thinking_done'; item_id: string; text: string};\nexport type StreamEventContentUpdate =\n | StreamEventTextDelta\n | StreamEventToolAdd\n | StreamEventToolUpdate\n | StreamEventThinkingAdd\n | StreamEventThinkingDelta\n | StreamEventThinkingDone;\n\nconst TOOL_PROGRESS_EVENTS: Array<[string, TToolStatus]> = [\n ['response.file_search_call.completed', 'success'],\n ['response.file_search_call.in_progress', 'loading'],\n ['response.file_search_call.searching', 'loading'],\n ['response.web_search_call.completed', 'success'],\n ['response.web_search_call.in_progress', 'loading'],\n ['response.web_search_call.searching', 'loading'],\n ['response.code_interpreter_call.completed', 'success'],\n ['response.code_interpreter_call.in_progress', 'loading'],\n ['response.code_interpreter_call.interpreting', 'loading'],\n ['response.image_generation_call.completed', 'success'],\n ['response.image_generation_call.in_progress', 'loading'],\n ['response.image_generation_call.generating', 'loading'],\n ['response.mcp_list_tools.completed', 'success'],\n ['response.mcp_list_tools.in_progress', 'loading'],\n];\n\nfunction getReasoningUpdate(\n e: EventRecord,\n data: EventRecord | undefined,\n type: unknown,\n itemId: string,\n): StreamEventContentUpdate | null {\n if (\n type === 'response.reasoning_text.delta' ||\n type === 'response.reasoning_summary_text.delta'\n ) {\n const d = (e.delta ?? data?.delta) as string | undefined;\n return typeof d === 'string' ? {kind: 'thinking_delta', item_id: itemId, delta: d} : null;\n }\n if (\n type === 'response.reasoning_text.done' ||\n type === 'response.reasoning_summary_text.done'\n ) {\n const text = (e.text ?? data?.text) as string | undefined;\n return typeof text === 'string' ? {kind: 'thinking_done', item_id: itemId, text} : null;\n }\n return null;\n}\n\nfunction addUpdateForReasoning(\n id: string,\n itemId: string | undefined,\n): StreamEventContentUpdate | null {\n const effectiveId = id || (itemId ?? '');\n return effectiveId ? {kind: 'thinking_add', item_id: effectiveId} : null;\n}\n\nfunction addUpdateForMcpCall(\n item: OpenAIStreamOutputItemLike,\n id: string,\n): StreamEventContentUpdate | null {\n const name = typeof item.name === 'string' ? item.name : undefined;\n const serverLabel = typeof item.server_label === 'string' ? item.server_label : undefined;\n const args = typeof item.arguments === 'string' ? item.arguments : undefined;\n const mcpRequest = prettyPrintJson(args);\n return {\n kind: 'tool_add',\n id,\n toolName: name ?? serverLabel ?? 'MCP',\n serverLabel,\n ...(mcpRequest ? {mcpRequest} : {}),\n };\n}\n\nfunction addUpdateForFunctionCall(\n item: OpenAIStreamOutputItemLike,\n): StreamEventContentUpdate | null {\n const callId = typeof item.call_id === 'string' ? item.call_id : ((item.id as string) ?? '');\n const name = typeof item.name === 'string' ? item.name : 'Tool';\n return {kind: 'tool_add', id: callId, toolName: name};\n}\n\nfunction addUpdateForMcpRequest(\n item: OpenAIStreamOutputItemLike,\n id: string,\n status: 'waitingConfirmation' | 'waitingSubmission',\n): StreamEventContentUpdate | null {\n const name = typeof item.name === 'string' ? item.name : undefined;\n const serverLabel = typeof item.server_label === 'string' ? item.server_label : undefined;\n const args = typeof item.arguments === 'string' ? item.arguments : undefined;\n return {\n kind: 'tool_add',\n id,\n toolName: name ?? serverLabel ?? 'MCP',\n serverLabel,\n status,\n headerContent: args,\n };\n}\n\nfunction addUpdateForSimpleTool(id: string, toolName: string): StreamEventContentUpdate | null {\n return id ? {kind: 'tool_add', id, toolName} : null;\n}\n\nconst OUTPUT_ITEM_TYPE_TO_TOOL_NAME: Record<string, string> = {\n file_search_call: 'File Search',\n web_search_call: 'Web Search',\n code_interpreter_call: 'Code Interpreter',\n image_generation_call: 'Image Generation',\n mcp_list_tools: 'MCP List Tools',\n};\n\nfunction getUpdateFromOutputItemAdded(\n e: EventRecord,\n data: EventRecord | undefined,\n itemId: string | undefined,\n): StreamEventContentUpdate | null {\n const item = (e.item ?? (data?.item as OpenAIStreamOutputItemLike)) as\n | OpenAIStreamOutputItemLike\n | undefined;\n if (!item) return null;\n const id = typeof item.id === 'string' ? item.id : '';\n\n if (item.type === 'reasoning') return addUpdateForReasoning(id, itemId);\n if (item.type === 'mcp_call') return addUpdateForMcpCall(item, id);\n if (item.type === 'function_call') return addUpdateForFunctionCall(item);\n if (item.type === 'mcp_approval_request')\n return addUpdateForMcpRequest(item, id, 'waitingConfirmation');\n if (item.type === 'mcp_submission_request')\n return addUpdateForMcpRequest(item, id, 'waitingSubmission');\n\n const toolName = item.type ? OUTPUT_ITEM_TYPE_TO_TOOL_NAME[item.type] : undefined;\n if (toolName) return addUpdateForSimpleTool(id, toolName);\n\n return null;\n}\n\nfunction getReasoningDoneUpdate(item: OpenAIStreamOutputItemLike): StreamEventContentUpdate | null {\n if (item.type !== 'reasoning' || typeof item.id !== 'string') return null;\n const reasoning = item as {\n id: string;\n content?: Array<{type: string; text?: string}>;\n summary?: Array<{type: string; text?: string}>;\n };\n const texts =\n reasoning.content?.map((c) => c.text).filter((t): t is string => typeof t === 'string') ??\n reasoning.summary?.map((s) => s.text).filter((t): t is string => typeof t === 'string') ??\n [];\n const text = texts.length <= 1 ? (texts[0] ?? '') : texts.join('\\n\\n');\n return {kind: 'thinking_done', item_id: reasoning.id, text};\n}\n\nfunction mcpOutputIndicatesApplicationError(output: string | undefined): boolean {\n if (!output) return false;\n return /\\berror\\s*=\\s*[\"']true[\"']/.test(output);\n}\n\nfunction mcpTerminalToolStatus(\n errStr: string | undefined,\n outputStr: string | undefined,\n): 'success' | 'error' {\n if (errStr || mcpOutputIndicatesApplicationError(outputStr)) {\n return 'error';\n }\n return 'success';\n}\n\nfunction getMcpCallDoneUpdate(item: OpenAIStreamOutputItemLike): StreamEventContentUpdate | null {\n if (item.type !== 'mcp_call' || typeof item.id !== 'string') return null;\n const mcp = item as {\n id: string;\n name?: string;\n server_label?: string;\n status?: string;\n arguments?: string;\n output?: string;\n error?: string;\n };\n const st = mcp.status ?? '';\n const outputStr = typeof mcp.output === 'string' ? mcp.output : undefined;\n const errStr = typeof mcp.error === 'string' ? mcp.error : undefined;\n const argsStr = typeof mcp.arguments === 'string' ? mcp.arguments : undefined;\n\n let status: TToolStatus = 'loading';\n if (st === 'failed' || st === 'incomplete') {\n status = 'error';\n } else if (st === 'completed' || st === 'complete') {\n status = mcpTerminalToolStatus(errStr, outputStr);\n } else if (errStr) {\n status = 'error';\n } else if (outputStr !== undefined) {\n status = mcpTerminalToolStatus(errStr, outputStr);\n }\n let toolName: string | undefined;\n if (typeof mcp.name === 'string') toolName = mcp.name;\n else if (typeof mcp.server_label === 'string') toolName = mcp.server_label;\n else toolName = undefined;\n\n const mcpRequest = prettyPrintJson(argsStr);\n const mcpResponse = prettyPrintJson(errStr ?? outputStr);\n\n return {\n kind: 'tool_update',\n item_id: mcp.id,\n status,\n toolName,\n output: outputStr,\n error: errStr,\n ...(mcpRequest ? {mcpRequest} : {}),\n ...(mcpResponse ? {mcpResponse} : {}),\n };\n}\n\nfunction getFunctionCallDoneUpdate(\n item: OpenAIStreamOutputItemLike,\n): StreamEventContentUpdate | null {\n if (item.type !== 'function_call') return null;\n const fn = item as {\n call_id: string;\n name?: string;\n output?: string;\n result?: string;\n status?: string;\n error?: string;\n };\n const fnCallId = fn.call_id ? fn.call_id : '';\n\n if (!fnCallId) return null;\n\n let fnStatus: TToolStatus = 'loading';\n if (fn.status === 'completed') {\n fnStatus = 'success';\n } else if (fn.status === 'failed') {\n fnStatus = 'error';\n }\n\n let output: string | undefined;\n if (typeof fn.output === 'string') {\n output = fn.output;\n } else if (typeof fn.result === 'string') {\n output = fn.result;\n } else {\n output = undefined;\n }\n\n return {\n kind: 'tool_update',\n item_id: fnCallId,\n status: fnStatus,\n toolName: typeof fn.name === 'string' ? fn.name : undefined,\n output,\n error: typeof fn.error === 'string' ? fn.error : undefined,\n };\n}\n\nfunction getToolCallDoneUpdate(\n item: OpenAIStreamOutputItemLike,\n toolName: string,\n): StreamEventContentUpdate | null {\n if (typeof item.id !== 'string') return null;\n const t = item as {\n id: string;\n status?: string;\n error?: string;\n output?: string;\n results?: unknown;\n };\n let status: TToolStatus = 'loading';\n if (t.status === 'completed') status = 'success';\n else if (t.status === 'failed' || t.status === 'incomplete') status = 'error';\n\n let output: string | undefined;\n if (typeof t.output === 'string') {\n output = t.output;\n } else if (typeof t.results === 'string') {\n output = t.results;\n } else if (Array.isArray(t.results)) {\n output = JSON.stringify(t.results);\n } else {\n output = undefined;\n }\n return {\n kind: 'tool_update',\n item_id: t.id,\n status,\n toolName,\n output,\n error: typeof t.error === 'string' ? t.error : undefined,\n };\n}\n\nfunction getUpdateFromOutputItemDone(\n e: EventRecord,\n data: EventRecord | undefined,\n): StreamEventContentUpdate | null {\n const item = (e.item ?? (data?.item as OpenAIStreamOutputItemLike)) as\n | OpenAIStreamOutputItemLike\n | undefined;\n if (!item) return null;\n return (\n getReasoningDoneUpdate(item) ??\n getMcpCallDoneUpdate(item) ??\n getFunctionCallDoneUpdate(item) ??\n (item.type === 'file_search_call' ? getToolCallDoneUpdate(item, 'File Search') : null) ??\n (item.type === 'web_search_call' ? getToolCallDoneUpdate(item, 'Web Search') : null) ??\n (item.type === 'code_interpreter_call'\n ? getToolCallDoneUpdate(item, 'Code Interpreter')\n : null) ??\n (item.type === 'image_generation_call'\n ? getToolCallDoneUpdate(item, 'Image Generation')\n : null) ??\n (item.type === 'mcp_list_tools' ? getToolCallDoneUpdate(item, 'MCP List Tools') : null)\n );\n}\n\n/** Stream event → content update (text delta, tool add/update, thinking add/delta/done) or null. */\n\nexport function getStreamEventContentUpdate(\n event: OpenAIStreamEventLike | null | undefined,\n): StreamEventContentUpdate | null {\n if (!event) return null;\n const e = event as EventRecord;\n const type = e.type ?? (e.data as {type?: string})?.type ?? e.event;\n const data = e.data as EventRecord | undefined;\n const itemId =\n typeof e.item_id === 'string' ? e.item_id : (data?.item_id as string | undefined);\n\n if (itemId) {\n const reasoningUpdate = getReasoningUpdate(e, data, type, itemId);\n if (reasoningUpdate) return reasoningUpdate;\n }\n\n const delta = getTextDeltaFromStreamEvent(event);\n if (delta) return {kind: 'text_delta', delta};\n\n if (type === 'response.output_item.added') {\n return getUpdateFromOutputItemAdded(e, data, itemId);\n }\n if (type === 'response.mcp_call.completed' && itemId) {\n return {kind: 'tool_update', item_id: itemId, status: 'success'};\n }\n if (type === 'response.mcp_call.failed' && itemId) {\n const err = typeof e.error === 'string' ? e.error : undefined;\n return {kind: 'tool_update', item_id: itemId, status: 'error', error: err};\n }\n\n const progressMatch = TOOL_PROGRESS_EVENTS.find(([t]) => t === type);\n if (progressMatch && itemId) {\n return {kind: 'tool_update', item_id: itemId, status: progressMatch[1]};\n }\n if (type === 'response.mcp_list_tools.failed' && itemId) {\n const err = typeof e.error === 'string' ? e.error : undefined;\n return {kind: 'tool_update', item_id: itemId, status: 'error', error: err};\n }\n\n if (type === 'response.output_item.done') {\n return getUpdateFromOutputItemDone(e, data);\n }\n return null;\n}\n"]}
1
+ {"version":3,"file":"getStreamEventContentUpdate.js","sourceRoot":"../../../../../src","sources":["adapters/openai/helpers/getStreamEventContentUpdate.ts"],"names":[],"mappings":";;AAoWA,kEAyCC;AA1YD,kFAA0E;AAC1E,0DAAkD;AAwClD,MAAM,oBAAoB,GAAiC;IACvD,CAAC,qCAAqC,EAAE,SAAS,CAAC;IAClD,CAAC,uCAAuC,EAAE,SAAS,CAAC;IACpD,CAAC,qCAAqC,EAAE,SAAS,CAAC;IAClD,CAAC,oCAAoC,EAAE,SAAS,CAAC;IACjD,CAAC,sCAAsC,EAAE,SAAS,CAAC;IACnD,CAAC,oCAAoC,EAAE,SAAS,CAAC;IACjD,CAAC,0CAA0C,EAAE,SAAS,CAAC;IACvD,CAAC,4CAA4C,EAAE,SAAS,CAAC;IACzD,CAAC,6CAA6C,EAAE,SAAS,CAAC;IAC1D,CAAC,0CAA0C,EAAE,SAAS,CAAC;IACvD,CAAC,4CAA4C,EAAE,SAAS,CAAC;IACzD,CAAC,2CAA2C,EAAE,SAAS,CAAC;IACxD,CAAC,mCAAmC,EAAE,SAAS,CAAC;IAChD,CAAC,qCAAqC,EAAE,SAAS,CAAC;CACrD,CAAC;AAEF,SAAS,kBAAkB,CACvB,CAAc,EACd,IAA6B,EAC7B,IAAa,EACb,MAAc;;IAEd,IACI,IAAI,KAAK,+BAA+B;QACxC,IAAI,KAAK,uCAAuC,EAClD,CAAC;QACC,MAAM,CAAC,GAAG,CAAC,MAAA,CAAC,CAAC,KAAK,mCAAI,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,CAAuB,CAAC;QACzD,OAAO,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAC,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC9F,CAAC;IACD,IACI,IAAI,KAAK,8BAA8B;QACvC,IAAI,KAAK,sCAAsC,EACjD,CAAC;QACC,MAAM,IAAI,GAAG,CAAC,MAAA,CAAC,CAAC,IAAI,mCAAI,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,CAAuB,CAAC;QAC1D,OAAO,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAC,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC5F,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,SAAS,qBAAqB,CAC1B,EAAU,EACV,MAA0B;IAE1B,MAAM,WAAW,GAAG,EAAE,IAAI,CAAC,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,EAAE,CAAC,CAAC;IACzC,OAAO,WAAW,CAAC,CAAC,CAAC,EAAC,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,WAAW,EAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7E,CAAC;AAED,SAAS,mBAAmB,CACxB,IAAgC,EAChC,EAAU;;IAEV,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACnE,MAAM,WAAW,GAAG,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1F,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7E,MAAM,UAAU,GAAG,IAAA,iCAAe,EAAC,IAAI,CAAC,CAAC;IACzC,uBACI,IAAI,EAAE,UAAU,EAChB,EAAE,EACF,QAAQ,EAAE,MAAA,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,WAAW,mCAAI,KAAK,EACtC,WAAW,IACR,CAAC,UAAU,CAAC,CAAC,CAAC,EAAC,UAAU,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EACrC;AACN,CAAC;AAED,SAAS,wBAAwB,CAC7B,IAAgC;;IAEhC,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAC,IAAI,CAAC,EAAa,mCAAI,EAAE,CAAC,CAAC;IAC7F,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;IAChE,OAAO,EAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAC,CAAC;AAC1D,CAAC;AAED,SAAS,sBAAsB,CAC3B,IAAgC,EAChC,EAAU,EACV,MAAmD;;IAEnD,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IACnE,MAAM,WAAW,GAAG,OAAO,IAAI,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1F,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7E,OAAO;QACH,IAAI,EAAE,UAAU;QAChB,EAAE;QACF,QAAQ,EAAE,MAAA,IAAI,aAAJ,IAAI,cAAJ,IAAI,GAAI,WAAW,mCAAI,KAAK;QACtC,WAAW;QACX,MAAM;QACN,aAAa,EAAE,IAAI;KACtB,CAAC;AACN,CAAC;AAED,SAAS,sBAAsB,CAAC,EAAU,EAAE,QAAgB;IACxD,OAAO,EAAE,CAAC,CAAC,CAAC,EAAC,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACxD,CAAC;AAED,MAAM,6BAA6B,GAA2B;IAC1D,gBAAgB,EAAE,aAAa;IAC/B,eAAe,EAAE,YAAY;IAC7B,qBAAqB,EAAE,kBAAkB;IACzC,qBAAqB,EAAE,kBAAkB;IACzC,cAAc,EAAE,gBAAgB;CACnC,CAAC;AAEF,SAAS,4BAA4B,CACjC,CAAc,EACd,IAA6B,EAC7B,MAA0B;;IAE1B,MAAM,IAAI,GAAG,CAAC,MAAA,CAAC,CAAC,IAAI,mCAAK,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAmC,CAEnD,CAAC;IAChB,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,MAAM,EAAE,GAAG,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAEtD,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;QAAE,OAAO,qBAAqB,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACxE,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU;QAAE,OAAO,mBAAmB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACnE,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe;QAAE,OAAO,wBAAwB,CAAC,IAAI,CAAC,CAAC;IACzE,IAAI,IAAI,CAAC,IAAI,KAAK,sBAAsB;QACpC,OAAO,sBAAsB,CAAC,IAAI,EAAE,EAAE,EAAE,qBAAqB,CAAC,CAAC;IACnE,IAAI,IAAI,CAAC,IAAI,KAAK,wBAAwB;QACtC,OAAO,sBAAsB,CAAC,IAAI,EAAE,EAAE,EAAE,mBAAmB,CAAC,CAAC;IAEjE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAClF,IAAI,QAAQ;QAAE,OAAO,sBAAsB,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IAE1D,OAAO,IAAI,CAAC;AAChB,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAgC;;IAC5D,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC1E,MAAM,SAAS,GAAG,IAIjB,CAAC;IACF,MAAM,KAAK,GACP,MAAA,MAAA,MAAA,SAAS,CAAC,OAAO,0CAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,mCACvF,MAAA,SAAS,CAAC,OAAO,0CAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,mCACvF,EAAE,CAAC;IACP,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAA,KAAK,CAAC,CAAC,CAAC,mCAAI,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvE,OAAO,EAAC,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,EAAE,IAAI,EAAC,CAAC;AAChE,CAAC;AAED,SAAS,kCAAkC,CAAC,MAA0B;IAClE,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,OAAO,4BAA4B,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACrD,CAAC;AAED,SAAS,qBAAqB,CAC1B,MAA0B,EAC1B,SAA6B;IAE7B,IAAI,MAAM,IAAI,kCAAkC,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1D,OAAO,OAAO,CAAC;IACnB,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAgC;;IAC1D,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IACzE,MAAM,GAAG,GAAG,IAQX,CAAC;IACF,MAAM,EAAE,GAAG,MAAA,GAAG,CAAC,MAAM,mCAAI,EAAE,CAAC;IAC5B,MAAM,SAAS,GAAG,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAC1E,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IACrE,MAAM,OAAO,GAAG,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAE9E,IAAI,MAAM,GAAgB,SAAS,CAAC;IACpC,IAAI,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,YAAY,EAAE,CAAC;QACzC,MAAM,GAAG,OAAO,CAAC;IACrB,CAAC;SAAM,IAAI,EAAE,KAAK,WAAW,IAAI,EAAE,KAAK,UAAU,EAAE,CAAC;QACjD,MAAM,GAAG,qBAAqB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACtD,CAAC;SAAM,IAAI,MAAM,EAAE,CAAC;QAChB,MAAM,GAAG,OAAO,CAAC;IACrB,CAAC;SAAM,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,GAAG,qBAAqB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,QAA4B,CAAC;IACjC,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ;QAAE,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC;SACjD,IAAI,OAAO,GAAG,CAAC,YAAY,KAAK,QAAQ;QAAE,QAAQ,GAAG,GAAG,CAAC,YAAY,CAAC;;QACtE,QAAQ,GAAG,SAAS,CAAC;IAE1B,MAAM,UAAU,GAAG,IAAA,iCAAe,EAAC,OAAO,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,IAAA,iCAAe,EAAC,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,SAAS,CAAC,CAAC;IAEzD,qCACI,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,GAAG,CAAC,EAAE,EACf,MAAM;QACN,QAAQ,EACR,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,MAAM,IACV,CAAC,UAAU,CAAC,CAAC,CAAC,EAAC,UAAU,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAChC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAC,WAAW,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EACvC;AACN,CAAC;AAED,SAAS,yBAAyB,CAC9B,IAAgC;IAEhC,IAAI,IAAI,CAAC,IAAI,KAAK,eAAe;QAAE,OAAO,IAAI,CAAC;IAC/C,MAAM,EAAE,GAAG,IAQV,CAAC;IACF,MAAM,QAAQ,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAE9C,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAE3B,IAAI,QAAQ,GAAgB,SAAS,CAAC;IACtC,IAAI,EAAE,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAC5B,QAAQ,GAAG,SAAS,CAAC;IACzB,CAAC;SAAM,IAAI,EAAE,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAChC,QAAQ,GAAG,OAAO,CAAC;IACvB,CAAC;IAED,IAAI,MAA0B,CAAC;IAC/B,IAAI,OAAO,EAAE,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAChC,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC;IACvB,CAAC;SAAM,IAAI,OAAO,EAAE,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC;IACvB,CAAC;SAAM,CAAC;QACJ,MAAM,GAAG,SAAS,CAAC;IACvB,CAAC;IAED,MAAM,UAAU,GAAG,IAAA,iCAAe,EAAC,OAAO,EAAE,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IAEhG,uBACI,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,QAAQ,EACjB,MAAM,EAAE,QAAQ,EAChB,QAAQ,EAAE,OAAO,EAAE,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAC3D,MAAM,EACN,KAAK,EAAE,OAAO,EAAE,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,IACvD,CAAC,UAAU,CAAC,CAAC,CAAC,EAAC,UAAU,EAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EACrC;AACN,CAAC;AAED,SAAS,qBAAqB,CAC1B,IAAgC,EAChC,QAAgB;IAEhB,IAAI,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC7C,MAAM,CAAC,GAAG,IAMT,CAAC;IACF,IAAI,MAAM,GAAgB,SAAS,CAAC;IACpC,IAAI,CAAC,CAAC,MAAM,KAAK,WAAW;QAAE,MAAM,GAAG,SAAS,CAAC;SAC5C,IAAI,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,YAAY;QAAE,MAAM,GAAG,OAAO,CAAC;IAE9E,IAAI,MAA0B,CAAC;IAC/B,IAAI,OAAO,CAAC,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;IACtB,CAAC;SAAM,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC;IACvB,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;SAAM,CAAC;QACJ,MAAM,GAAG,SAAS,CAAC;IACvB,CAAC;IACD,OAAO;QACH,IAAI,EAAE,aAAa;QACnB,OAAO,EAAE,CAAC,CAAC,EAAE;QACb,MAAM;QACN,QAAQ;QACR,MAAM;QACN,KAAK,EAAE,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;KAC3D,CAAC;AACN,CAAC;AAED,SAAS,2BAA2B,CAChC,CAAc,EACd,IAA6B;;IAE7B,MAAM,IAAI,GAAG,CAAC,MAAA,CAAC,CAAC,IAAI,mCAAK,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAmC,CAEnD,CAAC;IAChB,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,OAAO,CACH,MAAA,MAAA,MAAA,MAAA,MAAA,MAAA,MAAA,sBAAsB,CAAC,IAAI,CAAC,mCAC5B,oBAAoB,CAAC,IAAI,CAAC,mCAC1B,yBAAyB,CAAC,IAAI,CAAC,mCAC/B,CAAC,IAAI,CAAC,IAAI,KAAK,kBAAkB,CAAC,CAAC,CAAC,qBAAqB,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,mCACtF,CAAC,IAAI,CAAC,IAAI,KAAK,iBAAiB,CAAC,CAAC,CAAC,qBAAqB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,mCACpF,CAAC,IAAI,CAAC,IAAI,KAAK,uBAAuB;QAClC,CAAC,CAAC,qBAAqB,CAAC,IAAI,EAAE,kBAAkB,CAAC;QACjD,CAAC,CAAC,IAAI,CAAC,mCACX,CAAC,IAAI,CAAC,IAAI,KAAK,uBAAuB;QAClC,CAAC,CAAC,qBAAqB,CAAC,IAAI,EAAE,kBAAkB,CAAC;QACjD,CAAC,CAAC,IAAI,CAAC,mCACX,CAAC,IAAI,CAAC,IAAI,KAAK,gBAAgB,CAAC,CAAC,CAAC,qBAAqB,CAAC,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAC1F,CAAC;AACN,CAAC;AAED,oGAAoG;AAEpG,SAAgB,2BAA2B,CACvC,KAA+C;;IAE/C,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,CAAC,GAAG,KAAoB,CAAC;IAC/B,MAAM,IAAI,GAAG,MAAA,MAAA,CAAC,CAAC,IAAI,mCAAI,MAAC,CAAC,CAAC,IAAwB,0CAAE,IAAI,mCAAI,CAAC,CAAC,KAAK,CAAC;IACpE,MAAM,IAAI,GAAG,CAAC,CAAC,IAA+B,CAAC;IAC/C,MAAM,MAAM,GACR,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,OAA8B,CAAC;IAEtF,IAAI,MAAM,EAAE,CAAC;QACT,MAAM,eAAe,GAAG,kBAAkB,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAClE,IAAI,eAAe;YAAE,OAAO,eAAe,CAAC;IAChD,CAAC;IAED,MAAM,KAAK,GAAG,IAAA,yDAA2B,EAAC,KAAK,CAAC,CAAC;IACjD,IAAI,KAAK;QAAE,OAAO,EAAC,IAAI,EAAE,YAAY,EAAE,KAAK,EAAC,CAAC;IAE9C,IAAI,IAAI,KAAK,4BAA4B,EAAE,CAAC;QACxC,OAAO,4BAA4B,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;IACzD,CAAC;IACD,IAAI,IAAI,KAAK,6BAA6B,IAAI,MAAM,EAAE,CAAC;QACnD,OAAO,EAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAC,CAAC;IACrE,CAAC;IACD,IAAI,IAAI,KAAK,0BAA0B,IAAI,MAAM,EAAE,CAAC;QAChD,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9D,OAAO,EAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAC,CAAC;IAC/E,CAAC;IACD,MAAM,aAAa,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;IACrE,IAAI,aAAa,IAAI,MAAM,EAAE,CAAC;QAC1B,OAAO,EAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,EAAC,CAAC;IAC5E,CAAC;IACD,IAAI,IAAI,KAAK,gCAAgC,IAAI,MAAM,EAAE,CAAC;QACtD,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9D,OAAO,EAAC,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAC,CAAC;IAC/E,CAAC;IAED,IAAI,IAAI,KAAK,2BAA2B,EAAE,CAAC;QACvC,OAAO,2BAA2B,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC","sourcesContent":["import type {TToolStatus} from '../../../types';\nimport {OpenAIStreamEventLike, OpenAIStreamOutputItemLike} from '../types/openAiTypes';\n\nimport {getTextDeltaFromStreamEvent} from './getTextDeltaFromStreamEvent';\nimport {prettyPrintJson} from './prettyPrintJson';\n\ntype EventRecord = Record<string, unknown>;\n\nexport type StreamEventTextDelta = {kind: 'text_delta'; delta: string};\nexport type StreamEventToolAdd = {\n kind: 'tool_add';\n id: string;\n toolName: string;\n serverLabel?: string;\n /** Initial status; use 'waitingConfirmation' for mcp_approval_request, 'waitingSubmission' if API defines such. Default 'loading'. */\n status?: TToolStatus;\n /** Optional payload to show in tool card (e.g. approval request arguments). */\n headerContent?: string;\n /** MCP request arguments, pretty-printed JSON. Surfaced for AIStudioChat's tool renderer. */\n mcpRequest?: string;\n};\nexport type StreamEventToolUpdate = {\n kind: 'tool_update';\n item_id: string;\n status: TToolStatus;\n toolName?: string;\n output?: string;\n error?: string;\n /** MCP request arguments, pretty-printed JSON. */\n mcpRequest?: string;\n /** MCP response or error, pretty-printed JSON. */\n mcpResponse?: string;\n};\nexport type StreamEventThinkingAdd = {kind: 'thinking_add'; item_id: string};\nexport type StreamEventThinkingDelta = {kind: 'thinking_delta'; item_id: string; delta: string};\nexport type StreamEventThinkingDone = {kind: 'thinking_done'; item_id: string; text: string};\nexport type StreamEventContentUpdate =\n | StreamEventTextDelta\n | StreamEventToolAdd\n | StreamEventToolUpdate\n | StreamEventThinkingAdd\n | StreamEventThinkingDelta\n | StreamEventThinkingDone;\n\nconst TOOL_PROGRESS_EVENTS: Array<[string, TToolStatus]> = [\n ['response.file_search_call.completed', 'success'],\n ['response.file_search_call.in_progress', 'loading'],\n ['response.file_search_call.searching', 'loading'],\n ['response.web_search_call.completed', 'success'],\n ['response.web_search_call.in_progress', 'loading'],\n ['response.web_search_call.searching', 'loading'],\n ['response.code_interpreter_call.completed', 'success'],\n ['response.code_interpreter_call.in_progress', 'loading'],\n ['response.code_interpreter_call.interpreting', 'loading'],\n ['response.image_generation_call.completed', 'success'],\n ['response.image_generation_call.in_progress', 'loading'],\n ['response.image_generation_call.generating', 'loading'],\n ['response.mcp_list_tools.completed', 'success'],\n ['response.mcp_list_tools.in_progress', 'loading'],\n];\n\nfunction getReasoningUpdate(\n e: EventRecord,\n data: EventRecord | undefined,\n type: unknown,\n itemId: string,\n): StreamEventContentUpdate | null {\n if (\n type === 'response.reasoning_text.delta' ||\n type === 'response.reasoning_summary_text.delta'\n ) {\n const d = (e.delta ?? data?.delta) as string | undefined;\n return typeof d === 'string' ? {kind: 'thinking_delta', item_id: itemId, delta: d} : null;\n }\n if (\n type === 'response.reasoning_text.done' ||\n type === 'response.reasoning_summary_text.done'\n ) {\n const text = (e.text ?? data?.text) as string | undefined;\n return typeof text === 'string' ? {kind: 'thinking_done', item_id: itemId, text} : null;\n }\n return null;\n}\n\nfunction addUpdateForReasoning(\n id: string,\n itemId: string | undefined,\n): StreamEventContentUpdate | null {\n const effectiveId = id || (itemId ?? '');\n return effectiveId ? {kind: 'thinking_add', item_id: effectiveId} : null;\n}\n\nfunction addUpdateForMcpCall(\n item: OpenAIStreamOutputItemLike,\n id: string,\n): StreamEventContentUpdate | null {\n const name = typeof item.name === 'string' ? item.name : undefined;\n const serverLabel = typeof item.server_label === 'string' ? item.server_label : undefined;\n const args = typeof item.arguments === 'string' ? item.arguments : undefined;\n const mcpRequest = prettyPrintJson(args);\n return {\n kind: 'tool_add',\n id,\n toolName: name ?? serverLabel ?? 'MCP',\n serverLabel,\n ...(mcpRequest ? {mcpRequest} : {}),\n };\n}\n\nfunction addUpdateForFunctionCall(\n item: OpenAIStreamOutputItemLike,\n): StreamEventContentUpdate | null {\n const callId = typeof item.call_id === 'string' ? item.call_id : ((item.id as string) ?? '');\n const name = typeof item.name === 'string' ? item.name : 'Tool';\n return {kind: 'tool_add', id: callId, toolName: name};\n}\n\nfunction addUpdateForMcpRequest(\n item: OpenAIStreamOutputItemLike,\n id: string,\n status: 'waitingConfirmation' | 'waitingSubmission',\n): StreamEventContentUpdate | null {\n const name = typeof item.name === 'string' ? item.name : undefined;\n const serverLabel = typeof item.server_label === 'string' ? item.server_label : undefined;\n const args = typeof item.arguments === 'string' ? item.arguments : undefined;\n return {\n kind: 'tool_add',\n id,\n toolName: name ?? serverLabel ?? 'MCP',\n serverLabel,\n status,\n headerContent: args,\n };\n}\n\nfunction addUpdateForSimpleTool(id: string, toolName: string): StreamEventContentUpdate | null {\n return id ? {kind: 'tool_add', id, toolName} : null;\n}\n\nconst OUTPUT_ITEM_TYPE_TO_TOOL_NAME: Record<string, string> = {\n file_search_call: 'File Search',\n web_search_call: 'Web Search',\n code_interpreter_call: 'Code Interpreter',\n image_generation_call: 'Image Generation',\n mcp_list_tools: 'MCP List Tools',\n};\n\nfunction getUpdateFromOutputItemAdded(\n e: EventRecord,\n data: EventRecord | undefined,\n itemId: string | undefined,\n): StreamEventContentUpdate | null {\n const item = (e.item ?? (data?.item as OpenAIStreamOutputItemLike)) as\n | OpenAIStreamOutputItemLike\n | undefined;\n if (!item) return null;\n const id = typeof item.id === 'string' ? item.id : '';\n\n if (item.type === 'reasoning') return addUpdateForReasoning(id, itemId);\n if (item.type === 'mcp_call') return addUpdateForMcpCall(item, id);\n if (item.type === 'function_call') return addUpdateForFunctionCall(item);\n if (item.type === 'mcp_approval_request')\n return addUpdateForMcpRequest(item, id, 'waitingConfirmation');\n if (item.type === 'mcp_submission_request')\n return addUpdateForMcpRequest(item, id, 'waitingSubmission');\n\n const toolName = item.type ? OUTPUT_ITEM_TYPE_TO_TOOL_NAME[item.type] : undefined;\n if (toolName) return addUpdateForSimpleTool(id, toolName);\n\n return null;\n}\n\nfunction getReasoningDoneUpdate(item: OpenAIStreamOutputItemLike): StreamEventContentUpdate | null {\n if (item.type !== 'reasoning' || typeof item.id !== 'string') return null;\n const reasoning = item as {\n id: string;\n content?: Array<{type: string; text?: string}>;\n summary?: Array<{type: string; text?: string}>;\n };\n const texts =\n reasoning.content?.map((c) => c.text).filter((t): t is string => typeof t === 'string') ??\n reasoning.summary?.map((s) => s.text).filter((t): t is string => typeof t === 'string') ??\n [];\n const text = texts.length <= 1 ? (texts[0] ?? '') : texts.join('\\n\\n');\n return {kind: 'thinking_done', item_id: reasoning.id, text};\n}\n\nfunction mcpOutputIndicatesApplicationError(output: string | undefined): boolean {\n if (!output) return false;\n return /\\berror\\s*=\\s*[\"']true[\"']/.test(output);\n}\n\nfunction mcpTerminalToolStatus(\n errStr: string | undefined,\n outputStr: string | undefined,\n): 'success' | 'error' {\n if (errStr || mcpOutputIndicatesApplicationError(outputStr)) {\n return 'error';\n }\n return 'success';\n}\n\nfunction getMcpCallDoneUpdate(item: OpenAIStreamOutputItemLike): StreamEventContentUpdate | null {\n if (item.type !== 'mcp_call' || typeof item.id !== 'string') return null;\n const mcp = item as {\n id: string;\n name?: string;\n server_label?: string;\n status?: string;\n arguments?: string;\n output?: string;\n error?: string;\n };\n const st = mcp.status ?? '';\n const outputStr = typeof mcp.output === 'string' ? mcp.output : undefined;\n const errStr = typeof mcp.error === 'string' ? mcp.error : undefined;\n const argsStr = typeof mcp.arguments === 'string' ? mcp.arguments : undefined;\n\n let status: TToolStatus = 'loading';\n if (st === 'failed' || st === 'incomplete') {\n status = 'error';\n } else if (st === 'completed' || st === 'complete') {\n status = mcpTerminalToolStatus(errStr, outputStr);\n } else if (errStr) {\n status = 'error';\n } else if (outputStr !== undefined) {\n status = mcpTerminalToolStatus(errStr, outputStr);\n }\n let toolName: string | undefined;\n if (typeof mcp.name === 'string') toolName = mcp.name;\n else if (typeof mcp.server_label === 'string') toolName = mcp.server_label;\n else toolName = undefined;\n\n const mcpRequest = prettyPrintJson(argsStr);\n const mcpResponse = prettyPrintJson(errStr ?? outputStr);\n\n return {\n kind: 'tool_update',\n item_id: mcp.id,\n status,\n toolName,\n output: outputStr,\n error: errStr,\n ...(mcpRequest ? {mcpRequest} : {}),\n ...(mcpResponse ? {mcpResponse} : {}),\n };\n}\n\nfunction getFunctionCallDoneUpdate(\n item: OpenAIStreamOutputItemLike,\n): StreamEventContentUpdate | null {\n if (item.type !== 'function_call') return null;\n const fn = item as {\n call_id: string;\n name?: string;\n arguments?: string;\n output?: string;\n result?: string;\n status?: string;\n error?: string;\n };\n const fnCallId = fn.call_id ? fn.call_id : '';\n\n if (!fnCallId) return null;\n\n let fnStatus: TToolStatus = 'loading';\n if (fn.status === 'completed') {\n fnStatus = 'success';\n } else if (fn.status === 'failed') {\n fnStatus = 'error';\n }\n\n let output: string | undefined;\n if (typeof fn.output === 'string') {\n output = fn.output;\n } else if (typeof fn.result === 'string') {\n output = fn.result;\n } else {\n output = undefined;\n }\n\n const mcpRequest = prettyPrintJson(typeof fn.arguments === 'string' ? fn.arguments : undefined);\n\n return {\n kind: 'tool_update',\n item_id: fnCallId,\n status: fnStatus,\n toolName: typeof fn.name === 'string' ? fn.name : undefined,\n output,\n error: typeof fn.error === 'string' ? fn.error : undefined,\n ...(mcpRequest ? {mcpRequest} : {}),\n };\n}\n\nfunction getToolCallDoneUpdate(\n item: OpenAIStreamOutputItemLike,\n toolName: string,\n): StreamEventContentUpdate | null {\n if (typeof item.id !== 'string') return null;\n const t = item as {\n id: string;\n status?: string;\n error?: string;\n output?: string;\n results?: unknown;\n };\n let status: TToolStatus = 'loading';\n if (t.status === 'completed') status = 'success';\n else if (t.status === 'failed' || t.status === 'incomplete') status = 'error';\n\n let output: string | undefined;\n if (typeof t.output === 'string') {\n output = t.output;\n } else if (typeof t.results === 'string') {\n output = t.results;\n } else if (Array.isArray(t.results)) {\n output = JSON.stringify(t.results);\n } else {\n output = undefined;\n }\n return {\n kind: 'tool_update',\n item_id: t.id,\n status,\n toolName,\n output,\n error: typeof t.error === 'string' ? t.error : undefined,\n };\n}\n\nfunction getUpdateFromOutputItemDone(\n e: EventRecord,\n data: EventRecord | undefined,\n): StreamEventContentUpdate | null {\n const item = (e.item ?? (data?.item as OpenAIStreamOutputItemLike)) as\n | OpenAIStreamOutputItemLike\n | undefined;\n if (!item) return null;\n return (\n getReasoningDoneUpdate(item) ??\n getMcpCallDoneUpdate(item) ??\n getFunctionCallDoneUpdate(item) ??\n (item.type === 'file_search_call' ? getToolCallDoneUpdate(item, 'File Search') : null) ??\n (item.type === 'web_search_call' ? getToolCallDoneUpdate(item, 'Web Search') : null) ??\n (item.type === 'code_interpreter_call'\n ? getToolCallDoneUpdate(item, 'Code Interpreter')\n : null) ??\n (item.type === 'image_generation_call'\n ? getToolCallDoneUpdate(item, 'Image Generation')\n : null) ??\n (item.type === 'mcp_list_tools' ? getToolCallDoneUpdate(item, 'MCP List Tools') : null)\n );\n}\n\n/** Stream event → content update (text delta, tool add/update, thinking add/delta/done) or null. */\n\nexport function getStreamEventContentUpdate(\n event: OpenAIStreamEventLike | null | undefined,\n): StreamEventContentUpdate | null {\n if (!event) return null;\n const e = event as EventRecord;\n const type = e.type ?? (e.data as {type?: string})?.type ?? e.event;\n const data = e.data as EventRecord | undefined;\n const itemId =\n typeof e.item_id === 'string' ? e.item_id : (data?.item_id as string | undefined);\n\n if (itemId) {\n const reasoningUpdate = getReasoningUpdate(e, data, type, itemId);\n if (reasoningUpdate) return reasoningUpdate;\n }\n\n const delta = getTextDeltaFromStreamEvent(event);\n if (delta) return {kind: 'text_delta', delta};\n\n if (type === 'response.output_item.added') {\n return getUpdateFromOutputItemAdded(e, data, itemId);\n }\n if (type === 'response.mcp_call.completed' && itemId) {\n return {kind: 'tool_update', item_id: itemId, status: 'success'};\n }\n if (type === 'response.mcp_call.failed' && itemId) {\n const err = typeof e.error === 'string' ? e.error : undefined;\n return {kind: 'tool_update', item_id: itemId, status: 'error', error: err};\n }\n const progressMatch = TOOL_PROGRESS_EVENTS.find(([t]) => t === type);\n if (progressMatch && itemId) {\n return {kind: 'tool_update', item_id: itemId, status: progressMatch[1]};\n }\n if (type === 'response.mcp_list_tools.failed' && itemId) {\n const err = typeof e.error === 'string' ? e.error : undefined;\n return {kind: 'tool_update', item_id: itemId, status: 'error', error: err};\n }\n\n if (type === 'response.output_item.done') {\n return getUpdateFromOutputItemDone(e, data);\n }\n return null;\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import type { SuggestionsItem } from "../../../types/common.js";
2
+ import type { SuggestionClickHandler, SuggestionsItem } from "../../../types/common.js";
3
3
  import "./Suggestions.css";
4
4
  /**
5
5
  * Props for the Suggestions component
@@ -8,7 +8,7 @@ export type SuggestionsProps = {
8
8
  /** Array of suggestion items to display */
9
9
  items: SuggestionsItem[];
10
10
  /** Callback function called when a suggestion is clicked */
11
- onClick: (content: string, id?: string) => void | Promise<void>;
11
+ onClick: SuggestionClickHandler;
12
12
  /** Title to display above suggestions - can be string or custom React element */
13
13
  title?: React.ReactNode;
14
14
  /** Layout orientation: 'grid' for horizontal, 'list' for vertical */
@@ -19,8 +19,8 @@ function Suggestions(props) {
19
19
  const { items, onClick, title, layout = 'list', textAlign = 'left', wrapText = false, className, qa, } = props;
20
20
  const handleClick = async (item) => {
21
21
  var _a;
22
- await ((_a = item.onClick) === null || _a === void 0 ? void 0 : _a.call(item, item.title, item.id));
23
- await onClick(item.title, item.id);
22
+ await ((_a = item.onClick) === null || _a === void 0 ? void 0 : _a.call(item, item.title, item.id, item.data));
23
+ await onClick(item.title, item.id, item.data);
24
24
  };
25
25
  const renderButton = (item, index) => {
26
26
  return ((0, jsx_runtime_1.jsx)(ActionButton_1.ActionButton, { tooltipTitle: wrapText ? undefined : item.title, size: "m", view: item.view || 'outlined', onClick: () => handleClick(item), className: b('button', { layout }), width: "auto", children: (0, jsx_runtime_1.jsxs)("div", { className: b('button-content', {
@@ -1 +1 @@
1
- {"version":3,"file":"Suggestions.js","sourceRoot":"../../../../../src","sources":["components/molecules/Suggestions/Suggestions.tsx"],"names":[],"mappings":";;AA0CA,kCAsEC;;AA9GD,6CAA4D;AAC5D,6CAA6C;AAG7C,6CAAwC;AACxC,oEAAsD;AAEtD,6BAA4B;AAE5B,MAAM,CAAC,GAAG,IAAA,UAAK,EAAC,aAAa,CAAC,CAAC;AAwB/B;;;;;;GAMG;AACH,SAAgB,WAAW,CAAC,KAAuB;IAC/C,MAAM,EACF,KAAK,EACL,OAAO,EACP,KAAK,EACL,MAAM,GAAG,MAAM,EACf,SAAS,GAAG,MAAM,EAClB,QAAQ,GAAG,KAAK,EAChB,SAAS,EACT,EAAE,GACL,GAAG,KAAK,CAAC;IAEV,MAAM,WAAW,GAAG,KAAK,EAAE,IAAqB,EAAE,EAAE;;QAChD,MAAM,CAAA,MAAA,IAAI,CAAC,OAAO,qDAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAA,CAAC;QAC1C,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;IACvC,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,CAAC,IAAqB,EAAE,KAAa,EAAE,EAAE;QAC1D,OAAO,CACH,uBAAC,2BAAY,IAET,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAC/C,IAAI,EAAC,GAAG,EACR,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,UAAU,EAC7B,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EAChC,SAAS,EAAE,CAAC,CAAC,QAAQ,EAAE,EAAC,MAAM,EAAC,CAAC,EAChC,KAAK,EAAC,MAAM,YAEZ,iCACI,SAAS,EAAE,CAAC,CAAC,gBAAgB,EAAE;oBAC3B,MAAM;oBACN,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;iBAClD,CAAC,aAED,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,CACrB,gCAAK,SAAS,EAAE,CAAC,CAAC,aAAa,CAAC,YAC5B,uBAAC,YAAI,IAAC,IAAI,EAAE,mBAAW,EAAE,IAAI,EAAE,EAAE,GAAI,GACnC,CACT,EACD,uBAAC,YAAI,IAAC,EAAE,EAAC,KAAK,EAAC,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,aAAa,CAAC,YACrE,IAAI,CAAC,KAAK,GACR,EACN,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,CACtB,gCAAK,SAAS,EAAE,CAAC,CAAC,aAAa,CAAC,YAC5B,uBAAC,YAAI,IAAC,IAAI,EAAE,oBAAY,EAAE,IAAI,EAAE,EAAE,GAAI,GACpC,CACT,IACC,IA3BD,IAAI,CAAC,EAAE,IAAI,KAAK,CA4BV,CAClB,CAAC;IACN,CAAC,CAAC;IAEF,OAAO,CACH,iCAAK,SAAS,EAAE,CAAC,CAAC,WAAW,EAAE,SAAS,CAAC,aAAW,EAAE,aACjD,KAAK,IAAI,CACN,gCAAK,SAAS,EAAE,CAAC,CAAC,OAAO,CAAC,YACrB,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CACzB,uBAAC,YAAI,IAAC,OAAO,EAAC,QAAQ,EAAC,KAAK,EAAC,SAAS,YACjC,KAAK,GACH,CACV,CAAC,CAAC,CAAC,CACA,KAAK,CACR,GACC,CACT,EACD,gCAAK,SAAS,EAAE,CAAC,CAAC,EAAC,MAAM,EAAC,CAAC,YACtB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,GACpD,IACJ,CACT,CAAC;AACN,CAAC","sourcesContent":["import React from 'react';\n\nimport {ChevronLeft, ChevronRight} from '@gravity-ui/icons';\nimport {Icon, Text} from '@gravity-ui/uikit';\n\nimport type {SuggestionsItem} from '../../../types/common';\nimport {block} from '../../../utils/cn';\nimport {ActionButton} from '../../atoms/ActionButton';\n\nimport './Suggestions.scss';\n\nconst b = block('suggestions');\n\n/**\n * Props for the Suggestions component\n */\nexport type SuggestionsProps = {\n /** Array of suggestion items to display */\n items: SuggestionsItem[];\n /** Callback function called when a suggestion is clicked */\n onClick: (content: string, id?: string) => void | Promise<void>;\n /** Title to display above suggestions - can be string or custom React element */\n title?: React.ReactNode;\n /** Layout orientation: 'grid' for horizontal, 'list' for vertical */\n layout?: 'grid' | 'list';\n /** Text alignment inside buttons: 'left', 'center', or 'right' */\n textAlign?: 'left' | 'center' | 'right';\n /** Enable text wrapping inside buttons instead of ellipsis */\n wrapText?: boolean;\n /** Additional CSS class */\n className?: string;\n /** QA/test identifier */\n qa?: string;\n};\n\n/**\n * Suggestions component displays a group of clickable suggestion buttons\n * arranged in either horizontal (grid) or vertical (list) layout\n *\n * @param props - Component props\n * @returns React component\n */\nexport function Suggestions(props: SuggestionsProps) {\n const {\n items,\n onClick,\n title,\n layout = 'list',\n textAlign = 'left',\n wrapText = false,\n className,\n qa,\n } = props;\n\n const handleClick = async (item: SuggestionsItem) => {\n await item.onClick?.(item.title, item.id);\n await onClick(item.title, item.id);\n };\n\n const renderButton = (item: SuggestionsItem, index: number) => {\n return (\n <ActionButton\n key={item.id || index}\n tooltipTitle={wrapText ? undefined : item.title}\n size=\"m\"\n view={item.view || 'outlined'}\n onClick={() => handleClick(item)}\n className={b('button', {layout})}\n width=\"auto\"\n >\n <div\n className={b('button-content', {\n layout,\n 'text-align': item.icon ? undefined : textAlign,\n })}\n >\n {item.icon === 'left' && (\n <div className={b('button-icon')}>\n <Icon data={ChevronLeft} size={16} />\n </div>\n )}\n <Text as=\"div\" className={b(wrapText ? 'button-text-wrap' : 'button-text')}>\n {item.title}\n </Text>\n {item.icon === 'right' && (\n <div className={b('button-icon')}>\n <Icon data={ChevronRight} size={16} />\n </div>\n )}\n </div>\n </ActionButton>\n );\n };\n\n return (\n <div className={b('container', className)} data-qa={qa}>\n {title && (\n <div className={b('title')}>\n {typeof title === 'string' ? (\n <Text variant=\"body-1\" color=\"primary\">\n {title}\n </Text>\n ) : (\n title\n )}\n </div>\n )}\n <div className={b({layout})}>\n {items.map((item, index) => renderButton(item, index))}\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"Suggestions.js","sourceRoot":"../../../../../src","sources":["components/molecules/Suggestions/Suggestions.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\n\nimport {ChevronLeft, ChevronRight} from '@gravity-ui/icons';\nimport {Icon, Text} from '@gravity-ui/uikit';\n\nimport type {SuggestionClickHandler, SuggestionsItem} from '../../../types/common';\nimport {block} from '../../../utils/cn';\nimport {ActionButton} from '../../atoms/ActionButton';\n\nimport './Suggestions.scss';\n\nconst b = block('suggestions');\n\n/**\n * Props for the Suggestions component\n */\nexport type SuggestionsProps = {\n /** Array of suggestion items to display */\n items: SuggestionsItem[];\n /** Callback function called when a suggestion is clicked */\n onClick: SuggestionClickHandler;\n /** Title to display above suggestions - can be string or custom React element */\n title?: React.ReactNode;\n /** Layout orientation: 'grid' for horizontal, 'list' for vertical */\n layout?: 'grid' | 'list';\n /** Text alignment inside buttons: 'left', 'center', or 'right' */\n textAlign?: 'left' | 'center' | 'right';\n /** Enable text wrapping inside buttons instead of ellipsis */\n wrapText?: boolean;\n /** Additional CSS class */\n className?: string;\n /** QA/test identifier */\n qa?: string;\n};\n\n/**\n * Suggestions component displays a group of clickable suggestion buttons\n * arranged in either horizontal (grid) or vertical (list) layout\n *\n * @param props - Component props\n * @returns React component\n */\nexport function Suggestions(props: SuggestionsProps) {\n const {\n items,\n onClick,\n title,\n layout = 'list',\n textAlign = 'left',\n wrapText = false,\n className,\n qa,\n } = props;\n\n const handleClick = async (item: SuggestionsItem) => {\n await item.onClick?.(item.title, item.id, item.data);\n await onClick(item.title, item.id, item.data);\n };\n\n const renderButton = (item: SuggestionsItem, index: number) => {\n return (\n <ActionButton\n key={item.id || index}\n tooltipTitle={wrapText ? undefined : item.title}\n size=\"m\"\n view={item.view || 'outlined'}\n onClick={() => handleClick(item)}\n className={b('button', {layout})}\n width=\"auto\"\n >\n <div\n className={b('button-content', {\n layout,\n 'text-align': item.icon ? undefined : textAlign,\n })}\n >\n {item.icon === 'left' && (\n <div className={b('button-icon')}>\n <Icon data={ChevronLeft} size={16} />\n </div>\n )}\n <Text as=\"div\" className={b(wrapText ? 'button-text-wrap' : 'button-text')}>\n {item.title}\n </Text>\n {item.icon === 'right' && (\n <div className={b('button-icon')}>\n <Icon data={ChevronRight} size={16} />\n </div>\n )}\n </div>\n </ActionButton>\n );\n };\n\n return (\n <div className={b('container', className)} data-qa={qa}>\n {title && (\n <div className={b('title')}>\n {typeof title === 'string' ? (\n <Text variant=\"body-1\" color=\"primary\">\n {title}\n </Text>\n ) : (\n title\n )}\n </div>\n )}\n <div className={b({layout})}>\n {items.map((item, index) => renderButton(item, index))}\n </div>\n </div>\n );\n}\n"]}
@@ -26,12 +26,12 @@ function PromptInput(props) {
26
26
  maxLength,
27
27
  });
28
28
  // Handle suggestion click with custom handler or default to input change
29
- const handleSuggestionClick = (suggestion) => {
29
+ const handleSuggestionClick = (content, id, data) => {
30
30
  if (suggestionsProps === null || suggestionsProps === void 0 ? void 0 : suggestionsProps.onSuggestionClick) {
31
- suggestionsProps.onSuggestionClick(suggestion);
31
+ suggestionsProps.onSuggestionClick(content, id, data);
32
32
  }
33
33
  else {
34
- hookState.handleChange(suggestion);
34
+ hookState.handleChange(content);
35
35
  }
36
36
  };
37
37
  const isFullView = view === 'full';
@@ -1 +1 @@
1
- {"version":3,"file":"PromptInput.js","sourceRoot":"../../../../../src","sources":["components/organisms/PromptInput/PromptInput.tsx"],"names":[],"mappings":";;AA4DA,kCAuEC;;AAjID,0DAAkD;AAClD,8DAAsD;AACtD,sEAA8D;AAC9D,gFAAwE;AAQxE,wDAAgD;AAEhD,6BAA4B;AAsC5B;;;;;;GAMG;AACH,SAAgB,WAAW,CAAC,KAAuB;IAC/C,MAAM,EACF,IAAI,GAAG,QAAQ,EACf,MAAM,EACN,QAAQ,EACR,YAAY,EACZ,QAAQ,GAAG,KAAK,EAChB,MAAM,GAAG,OAAO,EAChB,SAAS,EACT,WAAW,EACX,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,QAAQ,EACR,WAAW,EACX,SAAS,EACT,EAAE,GACL,GAAG,KAAK,CAAC;IAEV,MAAM,SAAS,GAAG,IAAA,+BAAc,EAAC;QAC7B,MAAM;QACN,QAAQ;QACR,YAAY;QACZ,QAAQ;QACR,MAAM;QACN,SAAS;KACZ,CAAC,CAAC;IAEH,yEAAyE;IACzE,MAAM,qBAAqB,GAAG,CAAC,UAAkB,EAAE,EAAE;QACjD,IAAI,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,iBAAiB,EAAE,CAAC;YACtC,gBAAgB,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;QACnD,CAAC;aAAM,CAAC;YACJ,SAAS,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QACvC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,IAAI,KAAK,MAAM,CAAC;IAEnC,iDAAiD;IACjD,MAAM,uBAAuB,GAAG,gBAAgB;QAC5C,CAAC,iCACQ,gBAAgB,KACnB,iBAAiB,EAAE,qBAAqB,IAE9C,CAAC,CAAC,SAAS,CAAC;IAEhB,OAAO,CACH,uBAAC,uDAA0B,IAAC,gBAAgB,EAAE,uBAAuB,YACjE,uBAAC,6CAAqB,IAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,YAC9D,UAAU,CAAC,CAAC,CAAC,CACV,uBAAC,iCAAe,IACZ,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,SAAS,EACpB,EAAE,EAAE,EAAE,GACR,CACL,CAAC,CAAC,CAAC,CACA,uBAAC,qCAAiB,IACd,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,SAAS,EACpB,EAAE,EAAE,EAAE,GACR,CACL,GACmB,GACC,CAChC,CAAC;AACN,CAAC","sourcesContent":["import {ChatStatus, TSubmitData} from '../../../types';\n\nimport {PromptInputFull} from './PromptInputFull';\nimport {PromptInputSimple} from './PromptInputSimple';\nimport {PromptInputWithPanels} from './PromptInputWithPanels';\nimport {PromptInputWithSuggestions} from './PromptInputWithSuggestions';\nimport {\n PromptInputBodyConfig,\n PromptInputFooterConfig,\n PromptInputHeaderConfig,\n PromptInputPanelConfig,\n PromptInputSuggestionsConfig,\n} from './types';\nimport {usePromptInput} from './usePromptInput';\n\nimport './PromptInput.scss';\n\n/**\n * Props for the PromptInput component\n */\nexport type PromptInputProps = {\n /** View variant: 'full' with all features, 'simple' with minimal UI */\n view?: 'full' | 'simple';\n /** Callback when message is sent */\n onSend: (data: TSubmitData) => Promise<void>;\n /** Callback when sending is cancelled */\n onCancel?: () => Promise<void>;\n /** Initial value */\n initialValue?: string;\n /** Disabled state */\n disabled?: boolean;\n /** Chat status to determine input behavior */\n status?: ChatStatus;\n /** Maximum length of input */\n maxLength?: number;\n /** Header-related props */\n headerProps?: PromptInputHeaderConfig;\n /** Body/textarea-related props */\n bodyProps?: PromptInputBodyConfig;\n /** Footer-related props */\n footerProps?: PromptInputFooterConfig;\n /** Suggestions-related props */\n suggestionsProps?: PromptInputSuggestionsConfig;\n /** Top panel configuration */\n topPanel?: PromptInputPanelConfig;\n /** Bottom panel configuration */\n bottomPanel?: PromptInputPanelConfig;\n /** Additional CSS class */\n className?: string;\n /** QA/test identifier */\n qa?: string;\n};\n\n/**\n * PromptInput component - a flexible input component for chat interfaces\n * with support for simple and full views, attachments, suggestions, and expandable panels\n *\n * @param props - Component props\n * @returns React component\n */\nexport function PromptInput(props: PromptInputProps) {\n const {\n view = 'simple',\n onSend,\n onCancel,\n initialValue,\n disabled = false,\n status = 'ready',\n maxLength,\n headerProps,\n bodyProps,\n footerProps,\n suggestionsProps,\n topPanel,\n bottomPanel,\n className,\n qa,\n } = props;\n\n const hookState = usePromptInput({\n onSend,\n onCancel,\n initialValue,\n disabled,\n status,\n maxLength,\n });\n\n // Handle suggestion click with custom handler or default to input change\n const handleSuggestionClick = (suggestion: string) => {\n if (suggestionsProps?.onSuggestionClick) {\n suggestionsProps.onSuggestionClick(suggestion);\n } else {\n hookState.handleChange(suggestion);\n }\n };\n\n const isFullView = view === 'full';\n\n // Prepare suggestions props with wrapped handler\n const wrappedSuggestionsProps = suggestionsProps\n ? {\n ...suggestionsProps,\n onSuggestionClick: handleSuggestionClick,\n }\n : undefined;\n\n return (\n <PromptInputWithSuggestions suggestionsProps={wrappedSuggestionsProps}>\n <PromptInputWithPanels topPanel={topPanel} bottomPanel={bottomPanel}>\n {isFullView ? (\n <PromptInputFull\n hookState={hookState}\n headerProps={headerProps}\n bodyProps={bodyProps}\n footerProps={footerProps}\n className={className}\n qa={qa}\n />\n ) : (\n <PromptInputSimple\n hookState={hookState}\n bodyProps={bodyProps}\n footerProps={footerProps}\n className={className}\n qa={qa}\n />\n )}\n </PromptInputWithPanels>\n </PromptInputWithSuggestions>\n );\n}\n"]}
1
+ {"version":3,"file":"PromptInput.js","sourceRoot":"../../../../../src","sources":["components/organisms/PromptInput/PromptInput.tsx"],"names":[],"mappings":";;AA4DA,kCA2EC;;AArID,0DAAkD;AAClD,8DAAsD;AACtD,sEAA8D;AAC9D,gFAAwE;AAQxE,wDAAgD;AAEhD,6BAA4B;AAsC5B;;;;;;GAMG;AACH,SAAgB,WAAW,CAAC,KAAuB;IAC/C,MAAM,EACF,IAAI,GAAG,QAAQ,EACf,MAAM,EACN,QAAQ,EACR,YAAY,EACZ,QAAQ,GAAG,KAAK,EAChB,MAAM,GAAG,OAAO,EAChB,SAAS,EACT,WAAW,EACX,SAAS,EACT,WAAW,EACX,gBAAgB,EAChB,QAAQ,EACR,WAAW,EACX,SAAS,EACT,EAAE,GACL,GAAG,KAAK,CAAC;IAEV,MAAM,SAAS,GAAG,IAAA,+BAAc,EAAC;QAC7B,MAAM;QACN,QAAQ;QACR,YAAY;QACZ,QAAQ;QACR,MAAM;QACN,SAAS;KACZ,CAAC,CAAC;IAEH,yEAAyE;IACzE,MAAM,qBAAqB,GAAG,CAC1B,OAAe,EACf,EAAW,EACX,IAA8B,EAChC,EAAE;QACA,IAAI,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,iBAAiB,EAAE,CAAC;YACtC,gBAAgB,CAAC,iBAAiB,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAC1D,CAAC;aAAM,CAAC;YACJ,SAAS,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,IAAI,KAAK,MAAM,CAAC;IAEnC,iDAAiD;IACjD,MAAM,uBAAuB,GAAG,gBAAgB;QAC5C,CAAC,iCACQ,gBAAgB,KACnB,iBAAiB,EAAE,qBAAqB,IAE9C,CAAC,CAAC,SAAS,CAAC;IAEhB,OAAO,CACH,uBAAC,uDAA0B,IAAC,gBAAgB,EAAE,uBAAuB,YACjE,uBAAC,6CAAqB,IAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,WAAW,YAC9D,UAAU,CAAC,CAAC,CAAC,CACV,uBAAC,iCAAe,IACZ,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,SAAS,EACpB,EAAE,EAAE,EAAE,GACR,CACL,CAAC,CAAC,CAAC,CACA,uBAAC,qCAAiB,IACd,SAAS,EAAE,SAAS,EACpB,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,WAAW,EACxB,SAAS,EAAE,SAAS,EACpB,EAAE,EAAE,EAAE,GACR,CACL,GACmB,GACC,CAChC,CAAC;AACN,CAAC","sourcesContent":["import {ChatStatus, TSubmitData} from '../../../types';\n\nimport {PromptInputFull} from './PromptInputFull';\nimport {PromptInputSimple} from './PromptInputSimple';\nimport {PromptInputWithPanels} from './PromptInputWithPanels';\nimport {PromptInputWithSuggestions} from './PromptInputWithSuggestions';\nimport {\n PromptInputBodyConfig,\n PromptInputFooterConfig,\n PromptInputHeaderConfig,\n PromptInputPanelConfig,\n PromptInputSuggestionsConfig,\n} from './types';\nimport {usePromptInput} from './usePromptInput';\n\nimport './PromptInput.scss';\n\n/**\n * Props for the PromptInput component\n */\nexport type PromptInputProps = {\n /** View variant: 'full' with all features, 'simple' with minimal UI */\n view?: 'full' | 'simple';\n /** Callback when message is sent */\n onSend: (data: TSubmitData) => Promise<void>;\n /** Callback when sending is cancelled */\n onCancel?: () => Promise<void>;\n /** Initial value */\n initialValue?: string;\n /** Disabled state */\n disabled?: boolean;\n /** Chat status to determine input behavior */\n status?: ChatStatus;\n /** Maximum length of input */\n maxLength?: number;\n /** Header-related props */\n headerProps?: PromptInputHeaderConfig;\n /** Body/textarea-related props */\n bodyProps?: PromptInputBodyConfig;\n /** Footer-related props */\n footerProps?: PromptInputFooterConfig;\n /** Suggestions-related props */\n suggestionsProps?: PromptInputSuggestionsConfig;\n /** Top panel configuration */\n topPanel?: PromptInputPanelConfig;\n /** Bottom panel configuration */\n bottomPanel?: PromptInputPanelConfig;\n /** Additional CSS class */\n className?: string;\n /** QA/test identifier */\n qa?: string;\n};\n\n/**\n * PromptInput component - a flexible input component for chat interfaces\n * with support for simple and full views, attachments, suggestions, and expandable panels\n *\n * @param props - Component props\n * @returns React component\n */\nexport function PromptInput(props: PromptInputProps) {\n const {\n view = 'simple',\n onSend,\n onCancel,\n initialValue,\n disabled = false,\n status = 'ready',\n maxLength,\n headerProps,\n bodyProps,\n footerProps,\n suggestionsProps,\n topPanel,\n bottomPanel,\n className,\n qa,\n } = props;\n\n const hookState = usePromptInput({\n onSend,\n onCancel,\n initialValue,\n disabled,\n status,\n maxLength,\n });\n\n // Handle suggestion click with custom handler or default to input change\n const handleSuggestionClick = (\n content: string,\n id?: string,\n data?: Record<string, unknown>,\n ) => {\n if (suggestionsProps?.onSuggestionClick) {\n suggestionsProps.onSuggestionClick(content, id, data);\n } else {\n hookState.handleChange(content);\n }\n };\n\n const isFullView = view === 'full';\n\n // Prepare suggestions props with wrapped handler\n const wrappedSuggestionsProps = suggestionsProps\n ? {\n ...suggestionsProps,\n onSuggestionClick: handleSuggestionClick,\n }\n : undefined;\n\n return (\n <PromptInputWithSuggestions suggestionsProps={wrappedSuggestionsProps}>\n <PromptInputWithPanels topPanel={topPanel} bottomPanel={bottomPanel}>\n {isFullView ? (\n <PromptInputFull\n hookState={hookState}\n headerProps={headerProps}\n bodyProps={bodyProps}\n footerProps={footerProps}\n className={className}\n qa={qa}\n />\n ) : (\n <PromptInputSimple\n hookState={hookState}\n bodyProps={bodyProps}\n footerProps={footerProps}\n className={className}\n qa={qa}\n />\n )}\n </PromptInputWithPanels>\n </PromptInputWithSuggestions>\n );\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { ReactNode, type Ref } from 'react';
2
- import type { SuggestionsItem } from "../../../types/common.js";
2
+ import type { SuggestionClickHandler, SuggestionsItem } from "../../../types/common.js";
3
3
  import { PromptInputHeaderProps } from "../../molecules/PromptInputHeader/index.js";
4
4
  import type { SuggestionsProps } from "../../molecules/Suggestions/index.js";
5
5
  /**
@@ -102,5 +102,5 @@ export type PromptInputSuggestionsConfig = {
102
102
  /** Text alignment inside suggestion buttons */
103
103
  suggestionsTextAlign?: SuggestionsProps['textAlign'];
104
104
  /** Callback when suggestion is clicked */
105
- onSuggestionClick?: (content: string, id?: string) => void;
105
+ onSuggestionClick?: SuggestionClickHandler;
106
106
  };
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"../../../../../src","sources":["components/organisms/PromptInput/types.ts"],"names":[],"mappings":"","sourcesContent":["import {ReactNode, type Ref} from 'react';\n\nimport type {SuggestionsItem} from '../../../types/common';\nimport {PromptInputHeaderProps} from '../../molecules/PromptInputHeader';\nimport type {SuggestionsProps} from '../../molecules/Suggestions';\n\n/**\n * Props for a panel (top or bottom)\n */\nexport type PromptInputPanelConfig = {\n /** Is panel open */\n isOpen: boolean;\n /** Panel content */\n children?: ReactNode;\n};\n\n/**\n * Props for the header section of PromptInput\n */\nexport type PromptInputHeaderConfig = {\n /** QA/test identifier for header wrapper */\n qa?: string;\n /** Custom content for header area */\n topContent?: ReactNode;\n /** Array of context items to display on the left */\n contextItems?: PromptInputHeaderProps['contextItems'];\n /** Show context indicator in header */\n showContextIndicator?: boolean;\n /** Props for context indicator */\n contextIndicatorProps?: PromptInputHeaderProps['contextIndicatorProps'];\n};\n\n/**\n * Props for the body/textarea section of PromptInput\n */\nexport type PromptInputBodyConfig = {\n /** QA/test identifier for body wrapper */\n qa?: string;\n /** Ref to the textarea input */\n inputRef?: Ref<HTMLTextAreaElement>;\n /** Placeholder text for textarea */\n placeholder?: string;\n /** Minimum number of textarea rows */\n minRows?: number;\n /** Maximum number of textarea rows */\n maxRows?: number;\n /** Auto focus textarea on mount */\n autoFocus?: boolean;\n /**\n * Auto focus textarea when a new chat is opened via the plus icon.\n * Only applies inside ChatContainer. Defaults to false.\n */\n autoFocusOnNewChat?: boolean;\n /**\n * Auto focus textarea when a chat is selected from history.\n * Only applies inside ChatContainer. Defaults to false.\n */\n autoFocusOnChatSelect?: boolean;\n};\n\n/**\n * Props for the footer section of PromptInput\n */\nexport type PromptInputFooterConfig = {\n /** QA/test identifier for footer wrapper */\n qa?: string;\n /** Custom content for footer area (SubmitButton will still be shown) */\n bottomContent?: ReactNode;\n /** Show settings icon in footer */\n showSettings?: boolean;\n /** Settings icon click handler */\n onSettingsClick?: () => void;\n /** Show attachment icon in footer */\n showAttachment?: boolean;\n /** Attachment icon click handler */\n onAttachmentClick?: () => void;\n /**\n * Replaces the built-in attachment icon button with a custom node (e.g. AttachmentPicker).\n * When set, `showAttachment` and `onAttachmentClick` are ignored.\n */\n attachmentContent?: ReactNode;\n /** Show microphone icon in footer */\n showMicrophone?: boolean;\n /** Microphone icon click handler */\n onMicrophoneClick?: () => void;\n /** Custom tooltip for submit button in enabled state */\n submitButtonTooltipSend?: string;\n /** Custom tooltip for submit button in cancelable state */\n submitButtonTooltipCancel?: string;\n /** Custom cancelable text (if provided, will be shown in cancelable state) */\n submitButtonCancelableText?: string;\n /** QA/test identifier for submit button */\n submitButtonQa?: string;\n};\n\n/**\n * Props for the suggestions section of PromptInput\n */\nexport type PromptInputSuggestionsConfig = {\n /** Submit suggestions array */\n suggestions?: SuggestionsItem[];\n /** Show submit suggestions */\n showSuggestions?: boolean;\n /** Title for the suggestions section - can be string or custom React element */\n suggestTitle?: string | ReactNode;\n /** Layout orientation for suggestions: 'grid' for horizontal, 'list' for vertical */\n suggestionsLayout?: SuggestionsProps['layout'];\n /** Text alignment inside suggestion buttons */\n suggestionsTextAlign?: SuggestionsProps['textAlign'];\n /** Callback when suggestion is clicked */\n onSuggestionClick?: (content: string, id?: string) => void;\n};\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"../../../../../src","sources":["components/organisms/PromptInput/types.ts"],"names":[],"mappings":"","sourcesContent":["import {ReactNode, type Ref} from 'react';\n\nimport type {SuggestionClickHandler, SuggestionsItem} from '../../../types/common';\nimport {PromptInputHeaderProps} from '../../molecules/PromptInputHeader';\nimport type {SuggestionsProps} from '../../molecules/Suggestions';\n\n/**\n * Props for a panel (top or bottom)\n */\nexport type PromptInputPanelConfig = {\n /** Is panel open */\n isOpen: boolean;\n /** Panel content */\n children?: ReactNode;\n};\n\n/**\n * Props for the header section of PromptInput\n */\nexport type PromptInputHeaderConfig = {\n /** QA/test identifier for header wrapper */\n qa?: string;\n /** Custom content for header area */\n topContent?: ReactNode;\n /** Array of context items to display on the left */\n contextItems?: PromptInputHeaderProps['contextItems'];\n /** Show context indicator in header */\n showContextIndicator?: boolean;\n /** Props for context indicator */\n contextIndicatorProps?: PromptInputHeaderProps['contextIndicatorProps'];\n};\n\n/**\n * Props for the body/textarea section of PromptInput\n */\nexport type PromptInputBodyConfig = {\n /** QA/test identifier for body wrapper */\n qa?: string;\n /** Ref to the textarea input */\n inputRef?: Ref<HTMLTextAreaElement>;\n /** Placeholder text for textarea */\n placeholder?: string;\n /** Minimum number of textarea rows */\n minRows?: number;\n /** Maximum number of textarea rows */\n maxRows?: number;\n /** Auto focus textarea on mount */\n autoFocus?: boolean;\n /**\n * Auto focus textarea when a new chat is opened via the plus icon.\n * Only applies inside ChatContainer. Defaults to false.\n */\n autoFocusOnNewChat?: boolean;\n /**\n * Auto focus textarea when a chat is selected from history.\n * Only applies inside ChatContainer. Defaults to false.\n */\n autoFocusOnChatSelect?: boolean;\n};\n\n/**\n * Props for the footer section of PromptInput\n */\nexport type PromptInputFooterConfig = {\n /** QA/test identifier for footer wrapper */\n qa?: string;\n /** Custom content for footer area (SubmitButton will still be shown) */\n bottomContent?: ReactNode;\n /** Show settings icon in footer */\n showSettings?: boolean;\n /** Settings icon click handler */\n onSettingsClick?: () => void;\n /** Show attachment icon in footer */\n showAttachment?: boolean;\n /** Attachment icon click handler */\n onAttachmentClick?: () => void;\n /**\n * Replaces the built-in attachment icon button with a custom node (e.g. AttachmentPicker).\n * When set, `showAttachment` and `onAttachmentClick` are ignored.\n */\n attachmentContent?: ReactNode;\n /** Show microphone icon in footer */\n showMicrophone?: boolean;\n /** Microphone icon click handler */\n onMicrophoneClick?: () => void;\n /** Custom tooltip for submit button in enabled state */\n submitButtonTooltipSend?: string;\n /** Custom tooltip for submit button in cancelable state */\n submitButtonTooltipCancel?: string;\n /** Custom cancelable text (if provided, will be shown in cancelable state) */\n submitButtonCancelableText?: string;\n /** QA/test identifier for submit button */\n submitButtonQa?: string;\n};\n\n/**\n * Props for the suggestions section of PromptInput\n */\nexport type PromptInputSuggestionsConfig = {\n /** Submit suggestions array */\n suggestions?: SuggestionsItem[];\n /** Show submit suggestions */\n showSuggestions?: boolean;\n /** Title for the suggestions section - can be string or custom React element */\n suggestTitle?: string | ReactNode;\n /** Layout orientation for suggestions: 'grid' for horizontal, 'list' for vertical */\n suggestionsLayout?: SuggestionsProps['layout'];\n /** Text alignment inside suggestion buttons */\n suggestionsTextAlign?: SuggestionsProps['textAlign'];\n /** Callback when suggestion is clicked */\n onSuggestionClick?: SuggestionClickHandler;\n};\n"]}
@@ -15,6 +15,12 @@ const i18n_1 = require("./i18n/index.js");
15
15
  const useChatContainer_1 = require("./useChatContainer.js");
16
16
  require("./ChatContainer.css");
17
17
  const b = (0, cn_1.block)('chat-container');
18
+ function toSuggestionContext(id, data) {
19
+ if (!id && !data) {
20
+ return undefined;
21
+ }
22
+ return Object.assign(Object.assign({}, (id && { id })), (data && { data }));
23
+ }
18
24
  function mergePromptInputSuggestionsProps(fromProps, textsSuggestTitle) {
19
25
  const hasSuggestionsFromProps = Boolean(fromProps);
20
26
  const hasSuggestTitleFromTexts = textsSuggestTitle !== undefined;
@@ -113,8 +119,9 @@ function ChatContainer(props) {
113
119
  const finalEmptyContainerProps = (0, react_1.useMemo)(() => {
114
120
  var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m;
115
121
  const { showDefaultTitle = true, showDefaultDescription = true } = welcomeConfig || {};
116
- return Object.assign(Object.assign({}, emptyContainerProps), { qa: (_a = (0, chatContainerQa_1.resolveChatContainerQa)(qaMap, 'emptyState', 'empty-state')) !== null && _a !== void 0 ? _a : emptyContainerProps.qa, image: welcomeConfig === null || welcomeConfig === void 0 ? void 0 : welcomeConfig.image, title: (_d = (_c = (_b = texts.emptyStateTitle) !== null && _b !== void 0 ? _b : welcomeConfig === null || welcomeConfig === void 0 ? void 0 : welcomeConfig.title) !== null && _c !== void 0 ? _c : emptyContainerProps.title) !== null && _d !== void 0 ? _d : (showDefaultTitle ? (0, i18n_1.i18n)('empty-state-title') : undefined), description: (_g = (_f = (_e = texts.emptyStateDescription) !== null && _e !== void 0 ? _e : welcomeConfig === null || welcomeConfig === void 0 ? void 0 : welcomeConfig.description) !== null && _f !== void 0 ? _f : emptyContainerProps.description) !== null && _g !== void 0 ? _g : (showDefaultDescription ? (0, i18n_1.i18n)('empty-state-description') : undefined), suggestionTitle: (_j = (_h = texts.emptyStateSuggestionsTitle) !== null && _h !== void 0 ? _h : welcomeConfig === null || welcomeConfig === void 0 ? void 0 : welcomeConfig.suggestionTitle) !== null && _j !== void 0 ? _j : emptyContainerProps.suggestionTitle, suggestions: welcomeConfig === null || welcomeConfig === void 0 ? void 0 : welcomeConfig.suggestions, alignment: welcomeConfig === null || welcomeConfig === void 0 ? void 0 : welcomeConfig.alignment, layout: welcomeConfig === null || welcomeConfig === void 0 ? void 0 : welcomeConfig.layout, wrapText: welcomeConfig === null || welcomeConfig === void 0 ? void 0 : welcomeConfig.wrapText, showMore: welcomeConfig === null || welcomeConfig === void 0 ? void 0 : welcomeConfig.showMore, showMoreText: (_m = (_l = (_k = texts.emptyStateShowMoreText) !== null && _k !== void 0 ? _k : welcomeConfig === null || welcomeConfig === void 0 ? void 0 : welcomeConfig.showMoreText) !== null && _l !== void 0 ? _l : emptyContainerProps.showMoreText) !== null && _m !== void 0 ? _m : (0, i18n_1.i18n)('empty-state-show-more'), onSuggestionClick: async (clickedTitle) => {
117
- await onSendMessage({ content: clickedTitle });
122
+ return Object.assign(Object.assign({}, emptyContainerProps), { qa: (_a = (0, chatContainerQa_1.resolveChatContainerQa)(qaMap, 'emptyState', 'empty-state')) !== null && _a !== void 0 ? _a : emptyContainerProps.qa, image: welcomeConfig === null || welcomeConfig === void 0 ? void 0 : welcomeConfig.image, title: (_d = (_c = (_b = texts.emptyStateTitle) !== null && _b !== void 0 ? _b : welcomeConfig === null || welcomeConfig === void 0 ? void 0 : welcomeConfig.title) !== null && _c !== void 0 ? _c : emptyContainerProps.title) !== null && _d !== void 0 ? _d : (showDefaultTitle ? (0, i18n_1.i18n)('empty-state-title') : undefined), description: (_g = (_f = (_e = texts.emptyStateDescription) !== null && _e !== void 0 ? _e : welcomeConfig === null || welcomeConfig === void 0 ? void 0 : welcomeConfig.description) !== null && _f !== void 0 ? _f : emptyContainerProps.description) !== null && _g !== void 0 ? _g : (showDefaultDescription ? (0, i18n_1.i18n)('empty-state-description') : undefined), suggestionTitle: (_j = (_h = texts.emptyStateSuggestionsTitle) !== null && _h !== void 0 ? _h : welcomeConfig === null || welcomeConfig === void 0 ? void 0 : welcomeConfig.suggestionTitle) !== null && _j !== void 0 ? _j : emptyContainerProps.suggestionTitle, suggestions: welcomeConfig === null || welcomeConfig === void 0 ? void 0 : welcomeConfig.suggestions, alignment: welcomeConfig === null || welcomeConfig === void 0 ? void 0 : welcomeConfig.alignment, layout: welcomeConfig === null || welcomeConfig === void 0 ? void 0 : welcomeConfig.layout, wrapText: welcomeConfig === null || welcomeConfig === void 0 ? void 0 : welcomeConfig.wrapText, showMore: welcomeConfig === null || welcomeConfig === void 0 ? void 0 : welcomeConfig.showMore, showMoreText: (_m = (_l = (_k = texts.emptyStateShowMoreText) !== null && _k !== void 0 ? _k : welcomeConfig === null || welcomeConfig === void 0 ? void 0 : welcomeConfig.showMoreText) !== null && _l !== void 0 ? _l : emptyContainerProps.showMoreText) !== null && _m !== void 0 ? _m : (0, i18n_1.i18n)('empty-state-show-more'), onSuggestionClick: async (content, suggestionId, suggestionData) => {
123
+ const suggestion = toSuggestionContext(suggestionId, suggestionData);
124
+ await onSendMessage(Object.assign({ content }, (suggestion && { suggestion })));
118
125
  } });
119
126
  }, [
120
127
  welcomeConfig,
@@ -1 +1 @@
1
- {"version":3,"file":"ChatContainer.js","sourceRoot":"../../../../../src","sources":["components/pages/ChatContainer/ChatContainer.tsx"],"names":[],"mappings":"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","sourcesContent":["import {type ReactNode, useMemo} from 'react';\n\nimport {block} from '../../../utils/cn';\nimport {Disclaimer} from '../../atoms/Disclaimer';\nimport {Header, HeaderAction, type HeaderProps} from '../../organisms/Header';\nimport {PromptInput, type PromptInputProps} from '../../organisms/PromptInput';\nimport {ChatContent} from '../../templates/ChatContent';\nimport {History} from '../../templates/History';\n\nimport {\n normalizeChatContainerQa,\n resolveChatContainerQa,\n resolveChatContainerRootQa,\n} from './chatContainerQa';\nimport {i18n} from './i18n';\nimport type {ChatContainerProps, ChatContainerTexts} from './types';\nimport {useChatContainer} from './useChatContainer';\n\nimport './ChatContainer.scss';\n\nconst b = block('chat-container');\n\ntype NormalizedChatContainerQa = ReturnType<typeof normalizeChatContainerQa>;\n\nfunction mergePromptInputSuggestionsProps(\n fromProps: PromptInputProps['suggestionsProps'] | undefined,\n textsSuggestTitle: ReactNode | undefined,\n): PromptInputProps['suggestionsProps'] | undefined {\n const hasSuggestionsFromProps = Boolean(fromProps);\n const hasSuggestTitleFromTexts = textsSuggestTitle !== undefined;\n if (!hasSuggestionsFromProps && !hasSuggestTitleFromTexts) {\n return undefined;\n }\n return {\n ...fromProps,\n suggestTitle: textsSuggestTitle ?? fromProps?.suggestTitle,\n };\n}\n\nfunction buildFinalPromptInputProps(args: {\n promptInputProps: ChatContainerProps['promptInputProps'];\n onSendMessage: ChatContainerProps['onSendMessage'];\n onCancel: ChatContainerProps['onCancel'];\n status: ChatContainerProps['status'];\n contextItems: ChatContainerProps['contextItems'];\n showContextIndicator: ChatContainerProps['showContextIndicator'];\n contextIndicatorProps: ChatContainerProps['contextIndicatorProps'];\n texts: ChatContainerTexts;\n promptInputKey: number;\n qaMap: NormalizedChatContainerQa;\n}) {\n const {\n promptInputProps,\n onSendMessage,\n onCancel,\n status,\n contextItems,\n showContextIndicator,\n contextIndicatorProps,\n texts: textsArg,\n promptInputKey,\n qaMap,\n } = args;\n\n const texts = textsArg ?? {};\n\n const {\n autoFocusOnNewChat: _autoFocusOnNewChat,\n autoFocusOnChatSelect: _autoFocusOnChatSelect,\n ...restBodyProps\n } = promptInputProps?.bodyProps ?? {};\n\n const suggestionsProps = mergePromptInputSuggestionsProps(\n promptInputProps?.suggestionsProps,\n texts.promptSuggestTitle,\n );\n\n return {\n ...promptInputProps,\n qa: resolveChatContainerQa(qaMap, 'promptInput', 'prompt-input') ?? promptInputProps?.qa,\n onSend: onSendMessage,\n onCancel,\n status,\n suggestionsProps,\n headerProps: {\n ...promptInputProps?.headerProps,\n contextItems,\n showContextIndicator:\n showContextIndicator ?? promptInputProps?.headerProps?.showContextIndicator,\n contextIndicatorProps:\n contextIndicatorProps ?? promptInputProps?.headerProps?.contextIndicatorProps,\n qa:\n resolveChatContainerQa(qaMap, 'promptInputHeader', 'prompt-input-header') ??\n promptInputProps?.headerProps?.qa,\n },\n bodyProps: {\n ...restBodyProps,\n placeholder:\n texts.promptPlaceholder || restBodyProps?.placeholder || i18n('prompt-placeholder'),\n autoFocus: promptInputKey > 0 || restBodyProps?.autoFocus,\n qa:\n resolveChatContainerQa(qaMap, 'promptInputBody', 'prompt-input-body') ??\n restBodyProps?.qa,\n },\n footerProps: {\n ...promptInputProps?.footerProps,\n submitButtonTooltipSend:\n texts?.submitSendTooltip ?? promptInputProps?.footerProps?.submitButtonTooltipSend,\n submitButtonTooltipCancel:\n texts?.submitCancelTooltip ??\n promptInputProps?.footerProps?.submitButtonTooltipCancel,\n submitButtonCancelableText:\n texts?.submitButtonCancelableText ??\n promptInputProps?.footerProps?.submitButtonCancelableText,\n qa:\n resolveChatContainerQa(qaMap, 'promptInputFooter', 'prompt-input-footer') ??\n promptInputProps?.footerProps?.qa,\n submitButtonQa:\n resolveChatContainerQa(qaMap, 'submitButton', 'submit-button') ??\n promptInputProps?.footerProps?.submitButtonQa,\n },\n };\n}\n\n/**\n * ChatContainer - fully assembled chat component, the main exportable component of the library.\n * Integrates Header, ChatContent, History and manages their state.\n *\n * @param props - component props\n * @returns React component\n */\nexport function ChatContainer(props: ChatContainerProps) {\n const {\n chats = [],\n messages = [],\n onSendMessage,\n onDeleteChat,\n onCancel,\n onRetry,\n status = 'ready',\n error = null,\n showActionsOnHover = false,\n contextItems = [],\n showContextIndicator,\n contextIndicatorProps,\n transformOptions,\n shouldParseIncompleteMarkdown,\n openMarkdownLinksInNewTab,\n messageListConfig,\n headerProps = {},\n contentProps = {},\n emptyContainerProps = {},\n promptInputProps = {},\n disclaimerProps = {},\n historyProps = {},\n welcomeConfig,\n texts = {},\n hideTitleOnEmptyChat = false,\n className,\n headerClassName,\n contentClassName,\n footerClassName,\n qa,\n } = props;\n\n const hookState = useChatContainer(props);\n\n const qaMap = useMemo(() => normalizeChatContainerQa(qa), [qa]);\n\n // Collect i18n texts with overrides\n const headerTitle = useMemo(\n () =>\n texts.headerTitle ||\n headerProps.title ||\n hookState.activeChat?.name ||\n i18n('header-default-title'),\n [texts.headerTitle, headerProps.title, hookState.activeChat?.name],\n );\n\n // Determine if chat is empty\n const isChatEmpty = hookState.chatContentView === 'empty';\n\n // Calculate showTitle based on hideTitleOnEmptyChat option\n const showTitle = useMemo(() => {\n // If explicit showTitle is provided in headerProps, use it\n if (headerProps.showTitle !== undefined) {\n return headerProps.showTitle;\n }\n // If hideTitleOnEmptyChat is enabled, show title only when chat has messages\n if (hideTitleOnEmptyChat && isChatEmpty) {\n return false;\n }\n return true;\n }, [hideTitleOnEmptyChat, isChatEmpty, headerProps.showTitle]);\n\n // Build props for Header\n const finalHeaderProps = useMemo(() => {\n const actionQa: Partial<Record<HeaderAction, string>> = {\n ...headerProps.actionQa,\n };\n const setHeaderActionQa = (\n action: HeaderAction,\n key: 'headerNewChat' | 'headerHistory' | 'headerFolding' | 'headerClose',\n suffix: string,\n ) => {\n const resolved = resolveChatContainerQa(qaMap, key, suffix);\n if (resolved !== undefined) {\n actionQa[action] = resolved;\n }\n };\n setHeaderActionQa(HeaderAction.NewChat, 'headerNewChat', 'header-action-newChat');\n setHeaderActionQa(HeaderAction.History, 'headerHistory', 'header-action-history');\n setHeaderActionQa(HeaderAction.Folding, 'headerFolding', 'header-action-folding');\n setHeaderActionQa(HeaderAction.Close, 'headerClose', 'header-action-close');\n\n const actionTooltipTexts: NonNullable<HeaderProps['actionTooltipTexts']> = {\n [HeaderAction.NewChat]:\n texts.headerNewChatTooltip ??\n headerProps.actionTooltipTexts?.[HeaderAction.NewChat],\n [HeaderAction.History]:\n texts.headerHistoryTooltip ??\n headerProps.actionTooltipTexts?.[HeaderAction.History],\n [HeaderAction.Close]:\n texts.headerCloseTooltip ?? headerProps.actionTooltipTexts?.[HeaderAction.Close],\n [HeaderAction.Folding]: {\n collapsed:\n texts.headerFoldingCollapsedTooltip ??\n headerProps.actionTooltipTexts?.[HeaderAction.Folding]?.collapsed,\n opened:\n texts.headerFoldingOpenedTooltip ??\n headerProps.actionTooltipTexts?.[HeaderAction.Folding]?.opened,\n },\n };\n\n return {\n ...headerProps,\n title: headerTitle,\n showTitle,\n baseActions: hookState.baseActions,\n handleNewChat: hookState.handleNewChat,\n handleHistoryToggle: hookState.handleHistoryToggle,\n handleFolding: hookState.handleFolding,\n handleClose: hookState.handleClose,\n historyButtonRef: hookState.historyButtonRef,\n qa: resolveChatContainerQa(qaMap, 'header', 'header') ?? headerProps.qa,\n actionQa,\n actionTooltipTexts,\n };\n }, [\n headerTitle,\n showTitle,\n hookState.baseActions,\n hookState.handleNewChat,\n hookState.handleHistoryToggle,\n hookState.handleFolding,\n hookState.handleClose,\n hookState.historyButtonRef,\n headerProps,\n qaMap,\n texts.headerNewChatTooltip,\n texts.headerHistoryTooltip,\n texts.headerCloseTooltip,\n texts.headerFoldingCollapsedTooltip,\n texts.headerFoldingOpenedTooltip,\n ]);\n\n // Build props for EmptyContainer\n const finalEmptyContainerProps = useMemo(() => {\n const {showDefaultTitle = true, showDefaultDescription = true} = welcomeConfig || {};\n\n return {\n ...emptyContainerProps,\n qa:\n resolveChatContainerQa(qaMap, 'emptyState', 'empty-state') ??\n emptyContainerProps.qa,\n image: welcomeConfig?.image,\n title:\n texts.emptyStateTitle ??\n welcomeConfig?.title ??\n emptyContainerProps.title ??\n (showDefaultTitle ? i18n('empty-state-title') : undefined),\n description:\n texts.emptyStateDescription ??\n welcomeConfig?.description ??\n emptyContainerProps.description ??\n (showDefaultDescription ? i18n('empty-state-description') : undefined),\n suggestionTitle:\n texts.emptyStateSuggestionsTitle ??\n welcomeConfig?.suggestionTitle ??\n emptyContainerProps.suggestionTitle,\n suggestions: welcomeConfig?.suggestions,\n alignment: welcomeConfig?.alignment,\n layout: welcomeConfig?.layout,\n wrapText: welcomeConfig?.wrapText,\n showMore: welcomeConfig?.showMore,\n showMoreText:\n texts.emptyStateShowMoreText ??\n welcomeConfig?.showMoreText ??\n emptyContainerProps.showMoreText ??\n i18n('empty-state-show-more'),\n onSuggestionClick: async (clickedTitle: string) => {\n await onSendMessage({content: clickedTitle});\n },\n };\n }, [\n welcomeConfig,\n emptyContainerProps,\n onSendMessage,\n qaMap,\n texts.emptyStateTitle,\n texts.emptyStateDescription,\n texts.emptyStateSuggestionsTitle,\n texts.emptyStateShowMoreText,\n ]);\n\n // Build props for MessageList\n const messageListProps = useMemo(\n () => ({\n ...messageListConfig,\n messages,\n status,\n errorMessage: texts.errorText\n ? {...(messageListConfig?.errorMessage ?? {}), text: texts.errorText}\n : messageListConfig?.errorMessage || (error ? {text: error.message} : undefined),\n onRetry,\n showActionsOnHover,\n transformOptions,\n shouldParseIncompleteMarkdown,\n openMarkdownLinksInNewTab,\n qa:\n resolveChatContainerQa(qaMap, 'messageList', 'message-list') ??\n messageListConfig?.qa,\n actionPopupProps: {\n ...messageListConfig?.actionPopupProps,\n qa:\n resolveChatContainerQa(qaMap, 'actionPopup', 'action-popup') ??\n messageListConfig?.actionPopupProps?.qa,\n },\n }),\n [\n messages,\n status,\n error,\n onRetry,\n showActionsOnHover,\n transformOptions,\n shouldParseIncompleteMarkdown,\n openMarkdownLinksInNewTab,\n messageListConfig,\n qaMap,\n texts.errorText,\n ],\n );\n\n // Build props for PromptInput\n const finalPromptInputProps = useMemo(\n () =>\n buildFinalPromptInputProps({\n promptInputProps,\n onSendMessage,\n onCancel,\n status,\n contextItems,\n showContextIndicator,\n contextIndicatorProps,\n texts,\n promptInputKey: hookState.promptInputKey,\n qaMap,\n }),\n [\n onSendMessage,\n onCancel,\n status,\n contextItems,\n showContextIndicator,\n contextIndicatorProps,\n promptInputProps,\n hookState.promptInputKey,\n qaMap,\n texts.promptPlaceholder,\n texts.promptSuggestTitle,\n texts.submitSendTooltip,\n texts.submitCancelTooltip,\n texts.submitButtonCancelableText,\n ],\n );\n\n // Build props for Disclaimer\n const finalDisclaimerProps = useMemo(() => {\n const disclaimerText =\n texts.disclaimerText ?? disclaimerProps.text ?? i18n('disclaimer-text');\n\n return {\n ...disclaimerProps,\n text: disclaimerText,\n qa: resolveChatContainerQa(qaMap, 'disclaimer', 'disclaimer') ?? disclaimerProps.qa,\n };\n }, [disclaimerProps, qaMap, texts.disclaimerText]);\n\n // Build props for ChatContent\n const finalContentProps = useMemo(\n () => ({\n ...contentProps,\n qa: resolveChatContainerQa(qaMap, 'content', 'content') ?? contentProps.qa,\n view: hookState.chatContentView as 'empty' | 'chat',\n emptyContainerProps: finalEmptyContainerProps,\n messageListProps,\n }),\n [\n hookState.chatContentView,\n finalEmptyContainerProps,\n messageListProps,\n contentProps,\n qaMap,\n ],\n );\n\n // Build props for History\n const finalHistoryProps = useMemo(\n () => ({\n ...historyProps,\n qa: resolveChatContainerQa(qaMap, 'history', 'history') ?? historyProps.qa,\n chats,\n selectedChat: hookState.activeChat,\n onSelectChat: hookState.handleSelectChat,\n onDeleteChat,\n open: hookState.isHistoryOpen,\n onOpenChange: (open: boolean) => {\n historyProps.onOpenChange?.(open);\n hookState.handleHistoryOpenChange(open);\n },\n anchorElement: hookState.historyButtonRef.current,\n emptyPlaceholder:\n texts.historyEmptyPlaceholder ??\n historyProps.emptyPlaceholder ??\n i18n('history-empty'),\n emptyFilteredPlaceholder:\n texts.historyEmptyFilteredPlaceholder ??\n historyProps.emptyFilteredPlaceholder ??\n i18n('history-empty-filtered'),\n searchPlaceholder: texts.historySearchPlaceholder ?? historyProps.searchPlaceholder,\n }),\n [\n chats,\n hookState.activeChat,\n hookState.handleSelectChat,\n onDeleteChat,\n hookState.isHistoryOpen,\n hookState.handleHistoryOpenChange,\n hookState.historyButtonRef,\n historyProps,\n qaMap,\n texts.historyEmptyPlaceholder,\n texts.historyEmptyFilteredPlaceholder,\n texts.historySearchPlaceholder,\n ],\n );\n\n const showFooter = finalPromptInputProps || finalDisclaimerProps;\n\n return (\n <div className={b(null, className)} data-qa={resolveChatContainerRootQa(qaMap)}>\n <div className={b('header', headerClassName)}>\n <Header {...finalHeaderProps} />\n </div>\n <div className={b('content', {view: hookState.chatContentView}, contentClassName)}>\n <ChatContent {...finalContentProps} />\n </div>\n {showFooter && (\n <div className={b('footer', {view: hookState.chatContentView}, footerClassName)}>\n {finalPromptInputProps && (\n <PromptInput key={hookState.promptInputKey} {...finalPromptInputProps} />\n )}\n {finalDisclaimerProps && <Disclaimer {...finalDisclaimerProps} />}\n </div>\n )}\n {/* History is integrated via popup anchored to button in Header */}\n <History {...finalHistoryProps} />\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"ChatContainer.js","sourceRoot":"../../../../../src","sources":["components/pages/ChatContainer/ChatContainer.tsx"],"names":[],"mappings":"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","sourcesContent":["import {type ReactNode, useMemo} from 'react';\n\nimport type {TSuggestionContext} from '../../../types/messages';\nimport {block} from '../../../utils/cn';\nimport {Disclaimer} from '../../atoms/Disclaimer';\nimport {Header, HeaderAction, type HeaderProps} from '../../organisms/Header';\nimport {PromptInput, type PromptInputProps} from '../../organisms/PromptInput';\nimport {ChatContent} from '../../templates/ChatContent';\nimport {History} from '../../templates/History';\n\nimport {\n normalizeChatContainerQa,\n resolveChatContainerQa,\n resolveChatContainerRootQa,\n} from './chatContainerQa';\nimport {i18n} from './i18n';\nimport type {ChatContainerProps, ChatContainerTexts} from './types';\nimport {useChatContainer} from './useChatContainer';\n\nimport './ChatContainer.scss';\n\nconst b = block('chat-container');\n\ntype NormalizedChatContainerQa = ReturnType<typeof normalizeChatContainerQa>;\n\nfunction toSuggestionContext(\n id?: string,\n data?: Record<string, unknown>,\n): TSuggestionContext | undefined {\n if (!id && !data) {\n return undefined;\n }\n\n return {\n ...(id && {id}),\n ...(data && {data}),\n };\n}\n\nfunction mergePromptInputSuggestionsProps(\n fromProps: PromptInputProps['suggestionsProps'] | undefined,\n textsSuggestTitle: ReactNode | undefined,\n): PromptInputProps['suggestionsProps'] | undefined {\n const hasSuggestionsFromProps = Boolean(fromProps);\n const hasSuggestTitleFromTexts = textsSuggestTitle !== undefined;\n if (!hasSuggestionsFromProps && !hasSuggestTitleFromTexts) {\n return undefined;\n }\n return {\n ...fromProps,\n suggestTitle: textsSuggestTitle ?? fromProps?.suggestTitle,\n };\n}\n\nfunction buildFinalPromptInputProps(args: {\n promptInputProps: ChatContainerProps['promptInputProps'];\n onSendMessage: ChatContainerProps['onSendMessage'];\n onCancel: ChatContainerProps['onCancel'];\n status: ChatContainerProps['status'];\n contextItems: ChatContainerProps['contextItems'];\n showContextIndicator: ChatContainerProps['showContextIndicator'];\n contextIndicatorProps: ChatContainerProps['contextIndicatorProps'];\n texts: ChatContainerTexts;\n promptInputKey: number;\n qaMap: NormalizedChatContainerQa;\n}) {\n const {\n promptInputProps,\n onSendMessage,\n onCancel,\n status,\n contextItems,\n showContextIndicator,\n contextIndicatorProps,\n texts: textsArg,\n promptInputKey,\n qaMap,\n } = args;\n\n const texts = textsArg ?? {};\n\n const {\n autoFocusOnNewChat: _autoFocusOnNewChat,\n autoFocusOnChatSelect: _autoFocusOnChatSelect,\n ...restBodyProps\n } = promptInputProps?.bodyProps ?? {};\n\n const suggestionsProps = mergePromptInputSuggestionsProps(\n promptInputProps?.suggestionsProps,\n texts.promptSuggestTitle,\n );\n\n return {\n ...promptInputProps,\n qa: resolveChatContainerQa(qaMap, 'promptInput', 'prompt-input') ?? promptInputProps?.qa,\n onSend: onSendMessage,\n onCancel,\n status,\n suggestionsProps,\n headerProps: {\n ...promptInputProps?.headerProps,\n contextItems,\n showContextIndicator:\n showContextIndicator ?? promptInputProps?.headerProps?.showContextIndicator,\n contextIndicatorProps:\n contextIndicatorProps ?? promptInputProps?.headerProps?.contextIndicatorProps,\n qa:\n resolveChatContainerQa(qaMap, 'promptInputHeader', 'prompt-input-header') ??\n promptInputProps?.headerProps?.qa,\n },\n bodyProps: {\n ...restBodyProps,\n placeholder:\n texts.promptPlaceholder || restBodyProps?.placeholder || i18n('prompt-placeholder'),\n autoFocus: promptInputKey > 0 || restBodyProps?.autoFocus,\n qa:\n resolveChatContainerQa(qaMap, 'promptInputBody', 'prompt-input-body') ??\n restBodyProps?.qa,\n },\n footerProps: {\n ...promptInputProps?.footerProps,\n submitButtonTooltipSend:\n texts?.submitSendTooltip ?? promptInputProps?.footerProps?.submitButtonTooltipSend,\n submitButtonTooltipCancel:\n texts?.submitCancelTooltip ??\n promptInputProps?.footerProps?.submitButtonTooltipCancel,\n submitButtonCancelableText:\n texts?.submitButtonCancelableText ??\n promptInputProps?.footerProps?.submitButtonCancelableText,\n qa:\n resolveChatContainerQa(qaMap, 'promptInputFooter', 'prompt-input-footer') ??\n promptInputProps?.footerProps?.qa,\n submitButtonQa:\n resolveChatContainerQa(qaMap, 'submitButton', 'submit-button') ??\n promptInputProps?.footerProps?.submitButtonQa,\n },\n };\n}\n\n/**\n * ChatContainer - fully assembled chat component, the main exportable component of the library.\n * Integrates Header, ChatContent, History and manages their state.\n *\n * @param props - component props\n * @returns React component\n */\nexport function ChatContainer(props: ChatContainerProps) {\n const {\n chats = [],\n messages = [],\n onSendMessage,\n onDeleteChat,\n onCancel,\n onRetry,\n status = 'ready',\n error = null,\n showActionsOnHover = false,\n contextItems = [],\n showContextIndicator,\n contextIndicatorProps,\n transformOptions,\n shouldParseIncompleteMarkdown,\n openMarkdownLinksInNewTab,\n messageListConfig,\n headerProps = {},\n contentProps = {},\n emptyContainerProps = {},\n promptInputProps = {},\n disclaimerProps = {},\n historyProps = {},\n welcomeConfig,\n texts = {},\n hideTitleOnEmptyChat = false,\n className,\n headerClassName,\n contentClassName,\n footerClassName,\n qa,\n } = props;\n\n const hookState = useChatContainer(props);\n\n const qaMap = useMemo(() => normalizeChatContainerQa(qa), [qa]);\n\n // Collect i18n texts with overrides\n const headerTitle = useMemo(\n () =>\n texts.headerTitle ||\n headerProps.title ||\n hookState.activeChat?.name ||\n i18n('header-default-title'),\n [texts.headerTitle, headerProps.title, hookState.activeChat?.name],\n );\n\n // Determine if chat is empty\n const isChatEmpty = hookState.chatContentView === 'empty';\n\n // Calculate showTitle based on hideTitleOnEmptyChat option\n const showTitle = useMemo(() => {\n // If explicit showTitle is provided in headerProps, use it\n if (headerProps.showTitle !== undefined) {\n return headerProps.showTitle;\n }\n // If hideTitleOnEmptyChat is enabled, show title only when chat has messages\n if (hideTitleOnEmptyChat && isChatEmpty) {\n return false;\n }\n return true;\n }, [hideTitleOnEmptyChat, isChatEmpty, headerProps.showTitle]);\n\n // Build props for Header\n const finalHeaderProps = useMemo(() => {\n const actionQa: Partial<Record<HeaderAction, string>> = {\n ...headerProps.actionQa,\n };\n const setHeaderActionQa = (\n action: HeaderAction,\n key: 'headerNewChat' | 'headerHistory' | 'headerFolding' | 'headerClose',\n suffix: string,\n ) => {\n const resolved = resolveChatContainerQa(qaMap, key, suffix);\n if (resolved !== undefined) {\n actionQa[action] = resolved;\n }\n };\n setHeaderActionQa(HeaderAction.NewChat, 'headerNewChat', 'header-action-newChat');\n setHeaderActionQa(HeaderAction.History, 'headerHistory', 'header-action-history');\n setHeaderActionQa(HeaderAction.Folding, 'headerFolding', 'header-action-folding');\n setHeaderActionQa(HeaderAction.Close, 'headerClose', 'header-action-close');\n\n const actionTooltipTexts: NonNullable<HeaderProps['actionTooltipTexts']> = {\n [HeaderAction.NewChat]:\n texts.headerNewChatTooltip ??\n headerProps.actionTooltipTexts?.[HeaderAction.NewChat],\n [HeaderAction.History]:\n texts.headerHistoryTooltip ??\n headerProps.actionTooltipTexts?.[HeaderAction.History],\n [HeaderAction.Close]:\n texts.headerCloseTooltip ?? headerProps.actionTooltipTexts?.[HeaderAction.Close],\n [HeaderAction.Folding]: {\n collapsed:\n texts.headerFoldingCollapsedTooltip ??\n headerProps.actionTooltipTexts?.[HeaderAction.Folding]?.collapsed,\n opened:\n texts.headerFoldingOpenedTooltip ??\n headerProps.actionTooltipTexts?.[HeaderAction.Folding]?.opened,\n },\n };\n\n return {\n ...headerProps,\n title: headerTitle,\n showTitle,\n baseActions: hookState.baseActions,\n handleNewChat: hookState.handleNewChat,\n handleHistoryToggle: hookState.handleHistoryToggle,\n handleFolding: hookState.handleFolding,\n handleClose: hookState.handleClose,\n historyButtonRef: hookState.historyButtonRef,\n qa: resolveChatContainerQa(qaMap, 'header', 'header') ?? headerProps.qa,\n actionQa,\n actionTooltipTexts,\n };\n }, [\n headerTitle,\n showTitle,\n hookState.baseActions,\n hookState.handleNewChat,\n hookState.handleHistoryToggle,\n hookState.handleFolding,\n hookState.handleClose,\n hookState.historyButtonRef,\n headerProps,\n qaMap,\n texts.headerNewChatTooltip,\n texts.headerHistoryTooltip,\n texts.headerCloseTooltip,\n texts.headerFoldingCollapsedTooltip,\n texts.headerFoldingOpenedTooltip,\n ]);\n\n // Build props for EmptyContainer\n const finalEmptyContainerProps = useMemo(() => {\n const {showDefaultTitle = true, showDefaultDescription = true} = welcomeConfig || {};\n\n return {\n ...emptyContainerProps,\n qa:\n resolveChatContainerQa(qaMap, 'emptyState', 'empty-state') ??\n emptyContainerProps.qa,\n image: welcomeConfig?.image,\n title:\n texts.emptyStateTitle ??\n welcomeConfig?.title ??\n emptyContainerProps.title ??\n (showDefaultTitle ? i18n('empty-state-title') : undefined),\n description:\n texts.emptyStateDescription ??\n welcomeConfig?.description ??\n emptyContainerProps.description ??\n (showDefaultDescription ? i18n('empty-state-description') : undefined),\n suggestionTitle:\n texts.emptyStateSuggestionsTitle ??\n welcomeConfig?.suggestionTitle ??\n emptyContainerProps.suggestionTitle,\n suggestions: welcomeConfig?.suggestions,\n alignment: welcomeConfig?.alignment,\n layout: welcomeConfig?.layout,\n wrapText: welcomeConfig?.wrapText,\n showMore: welcomeConfig?.showMore,\n showMoreText:\n texts.emptyStateShowMoreText ??\n welcomeConfig?.showMoreText ??\n emptyContainerProps.showMoreText ??\n i18n('empty-state-show-more'),\n onSuggestionClick: async (\n content: string,\n suggestionId?: string,\n suggestionData?: Record<string, unknown>,\n ) => {\n const suggestion = toSuggestionContext(suggestionId, suggestionData);\n\n await onSendMessage({\n content,\n ...(suggestion && {suggestion}),\n });\n },\n };\n }, [\n welcomeConfig,\n emptyContainerProps,\n onSendMessage,\n qaMap,\n texts.emptyStateTitle,\n texts.emptyStateDescription,\n texts.emptyStateSuggestionsTitle,\n texts.emptyStateShowMoreText,\n ]);\n\n // Build props for MessageList\n const messageListProps = useMemo(\n () => ({\n ...messageListConfig,\n messages,\n status,\n errorMessage: texts.errorText\n ? {...(messageListConfig?.errorMessage ?? {}), text: texts.errorText}\n : messageListConfig?.errorMessage || (error ? {text: error.message} : undefined),\n onRetry,\n showActionsOnHover,\n transformOptions,\n shouldParseIncompleteMarkdown,\n openMarkdownLinksInNewTab,\n qa:\n resolveChatContainerQa(qaMap, 'messageList', 'message-list') ??\n messageListConfig?.qa,\n actionPopupProps: {\n ...messageListConfig?.actionPopupProps,\n qa:\n resolveChatContainerQa(qaMap, 'actionPopup', 'action-popup') ??\n messageListConfig?.actionPopupProps?.qa,\n },\n }),\n [\n messages,\n status,\n error,\n onRetry,\n showActionsOnHover,\n transformOptions,\n shouldParseIncompleteMarkdown,\n openMarkdownLinksInNewTab,\n messageListConfig,\n qaMap,\n texts.errorText,\n ],\n );\n\n // Build props for PromptInput\n const finalPromptInputProps = useMemo(\n () =>\n buildFinalPromptInputProps({\n promptInputProps,\n onSendMessage,\n onCancel,\n status,\n contextItems,\n showContextIndicator,\n contextIndicatorProps,\n texts,\n promptInputKey: hookState.promptInputKey,\n qaMap,\n }),\n [\n onSendMessage,\n onCancel,\n status,\n contextItems,\n showContextIndicator,\n contextIndicatorProps,\n promptInputProps,\n hookState.promptInputKey,\n qaMap,\n texts.promptPlaceholder,\n texts.promptSuggestTitle,\n texts.submitSendTooltip,\n texts.submitCancelTooltip,\n texts.submitButtonCancelableText,\n ],\n );\n\n // Build props for Disclaimer\n const finalDisclaimerProps = useMemo(() => {\n const disclaimerText =\n texts.disclaimerText ?? disclaimerProps.text ?? i18n('disclaimer-text');\n\n return {\n ...disclaimerProps,\n text: disclaimerText,\n qa: resolveChatContainerQa(qaMap, 'disclaimer', 'disclaimer') ?? disclaimerProps.qa,\n };\n }, [disclaimerProps, qaMap, texts.disclaimerText]);\n\n // Build props for ChatContent\n const finalContentProps = useMemo(\n () => ({\n ...contentProps,\n qa: resolveChatContainerQa(qaMap, 'content', 'content') ?? contentProps.qa,\n view: hookState.chatContentView as 'empty' | 'chat',\n emptyContainerProps: finalEmptyContainerProps,\n messageListProps,\n }),\n [\n hookState.chatContentView,\n finalEmptyContainerProps,\n messageListProps,\n contentProps,\n qaMap,\n ],\n );\n\n // Build props for History\n const finalHistoryProps = useMemo(\n () => ({\n ...historyProps,\n qa: resolveChatContainerQa(qaMap, 'history', 'history') ?? historyProps.qa,\n chats,\n selectedChat: hookState.activeChat,\n onSelectChat: hookState.handleSelectChat,\n onDeleteChat,\n open: hookState.isHistoryOpen,\n onOpenChange: (open: boolean) => {\n historyProps.onOpenChange?.(open);\n hookState.handleHistoryOpenChange(open);\n },\n anchorElement: hookState.historyButtonRef.current,\n emptyPlaceholder:\n texts.historyEmptyPlaceholder ??\n historyProps.emptyPlaceholder ??\n i18n('history-empty'),\n emptyFilteredPlaceholder:\n texts.historyEmptyFilteredPlaceholder ??\n historyProps.emptyFilteredPlaceholder ??\n i18n('history-empty-filtered'),\n searchPlaceholder: texts.historySearchPlaceholder ?? historyProps.searchPlaceholder,\n }),\n [\n chats,\n hookState.activeChat,\n hookState.handleSelectChat,\n onDeleteChat,\n hookState.isHistoryOpen,\n hookState.handleHistoryOpenChange,\n hookState.historyButtonRef,\n historyProps,\n qaMap,\n texts.historyEmptyPlaceholder,\n texts.historyEmptyFilteredPlaceholder,\n texts.historySearchPlaceholder,\n ],\n );\n\n const showFooter = finalPromptInputProps || finalDisclaimerProps;\n\n return (\n <div className={b(null, className)} data-qa={resolveChatContainerRootQa(qaMap)}>\n <div className={b('header', headerClassName)}>\n <Header {...finalHeaderProps} />\n </div>\n <div className={b('content', {view: hookState.chatContentView}, contentClassName)}>\n <ChatContent {...finalContentProps} />\n </div>\n {showFooter && (\n <div className={b('footer', {view: hookState.chatContentView}, footerClassName)}>\n {finalPromptInputProps && (\n <PromptInput key={hookState.promptInputKey} {...finalPromptInputProps} />\n )}\n {finalDisclaimerProps && <Disclaimer {...finalDisclaimerProps} />}\n </div>\n )}\n {/* History is integrated via popup anchored to button in Header */}\n <History {...finalHistoryProps} />\n </div>\n );\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import type { SuggestionsItem } from "../../../types/common.js";
2
+ import type { SuggestionClickHandler, SuggestionsItem } from "../../../types/common.js";
3
3
  import "./EmptyContainer.css";
4
4
  /**
5
5
  * Suggestion item for EmptyContainer
@@ -35,7 +35,7 @@ export interface EmptyContainerProps {
35
35
  /** Array of suggestion items */
36
36
  suggestions?: Suggestion[];
37
37
  /** Callback when a suggestion is clicked */
38
- onSuggestionClick?: (content: string, id?: string) => void;
38
+ onSuggestionClick?: SuggestionClickHandler;
39
39
  /** Alignment configuration for image, title, and description */
40
40
  alignment?: AlignmentConfig;
41
41
  /** Layout orientation for suggestions: 'grid' for horizontal, 'list' for vertical */
@@ -1 +1 @@
1
- {"version":3,"file":"EmptyContainer.js","sourceRoot":"../../../../../src","sources":["components/templates/EmptyContainer/EmptyContainer.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\n\nimport {ArrowRotateRight} from '@gravity-ui/icons';\nimport {Button, Text} from '@gravity-ui/uikit';\n\nimport type {SuggestionsItem} from '../../../types/common';\nimport {block} from '../../../utils/cn';\nimport {Suggestions} from '../../molecules/Suggestions';\n\nimport {i18n} from './i18n';\n\nimport './EmptyContainer.scss';\n\nconst b = block('empty-container');\n\n/**\n * Suggestion item for EmptyContainer\n */\nexport type Suggestion = SuggestionsItem;\n\n/**\n * Alignment options for content elements\n */\nexport type ContentAlignment = 'left' | 'center' | 'right';\n\n/**\n * Alignment configuration for different sections\n */\nexport interface AlignmentConfig {\n /** Alignment for the image */\n image?: ContentAlignment;\n /** Alignment for the title */\n title?: ContentAlignment;\n /** Alignment for the description */\n description?: ContentAlignment;\n}\n\n/**\n * Props for the EmptyContainer component\n */\nexport interface EmptyContainerProps {\n /** Image or icon to display at the top */\n image?: React.ReactNode;\n /** Title text or custom React element for the welcome screen */\n title?: React.ReactNode;\n /** Description text or custom React element explaining the functionality */\n description?: React.ReactNode;\n /** Title for the suggestions section - can be string or custom React element */\n suggestionTitle?: React.ReactNode;\n /** Array of suggestion items */\n suggestions?: Suggestion[];\n /** Callback when a suggestion is clicked */\n onSuggestionClick?: (content: string, id?: string) => void;\n /** Alignment configuration for image, title, and description */\n alignment?: AlignmentConfig;\n /** Layout orientation for suggestions: 'grid' for horizontal, 'list' for vertical */\n layout?: 'grid' | 'list';\n /** Enable text wrapping inside suggestion buttons instead of ellipsis */\n wrapText?: boolean;\n /** Callback for showing more suggestions */\n showMore?: () => void;\n /** Custom text for the show more button */\n showMoreText?: string;\n /** Additional CSS class */\n className?: string;\n /** QA/test identifier */\n qa?: string;\n}\n\n/**\n * EmptyContainer component - displays a welcome screen with image, title, description,\n * and suggestions\n *\n * @param props - Component props\n * @returns React component\n */\nexport function EmptyContainer(props: EmptyContainerProps) {\n const {\n image,\n title,\n description,\n suggestionTitle,\n suggestions = [],\n onSuggestionClick,\n alignment,\n layout = 'grid',\n wrapText = false,\n showMore,\n showMoreText,\n className,\n qa,\n } = props;\n\n const hasContent = title || description || (suggestions && suggestions.length > 0);\n\n // Define alignment for each element\n const imageAlignment = alignment?.image || 'left';\n const titleAlignment = alignment?.title || 'left';\n const descriptionAlignment = alignment?.description || 'left';\n\n // Define text for \"Show more\" button with localization support\n const showMoreButtonText = showMoreText || i18n('show-more-button');\n\n return (\n <div className={b(null, className)} data-qa={qa}>\n <div className={b('content')}>\n {hasContent && (\n <>\n <div className={b('welcome-section')}>\n {image && (\n <div className={b('image-container', {align: imageAlignment})}>\n {image}\n </div>\n )}\n\n <div className={b('text-container')}>\n {title && (\n <Text\n variant=\"header-2\"\n className={b('title', {align: titleAlignment})}\n >\n {title}\n </Text>\n )}\n\n {description && (\n <Text\n variant=\"body-2\"\n color=\"complementary\"\n className={b('description', {align: descriptionAlignment})}\n >\n {description}\n </Text>\n )}\n </div>\n </div>\n\n {suggestions && suggestions.length > 0 && onSuggestionClick && (\n <div className={b('suggestions-section')}>\n {suggestionTitle && (\n <div className={b('suggestions-title')}>\n {typeof suggestionTitle === 'string' ? (\n <Text variant=\"subheader-3\" color=\"primary\">\n {suggestionTitle}\n </Text>\n ) : (\n suggestionTitle\n )}\n </div>\n )}\n <div className={b('suggestions-list')}>\n <Suggestions\n items={suggestions}\n onClick={onSuggestionClick}\n layout={layout}\n wrapText={wrapText}\n />\n </div>\n {showMore && (\n <div className={b('show-more')}>\n <Button\n view=\"flat-secondary\"\n size=\"l\"\n onClick={showMore}\n className={b('show-more-button')}\n >\n <Button.Icon>\n <ArrowRotateRight />\n </Button.Icon>\n {showMoreButtonText}\n </Button>\n </div>\n )}\n </div>\n )}\n </>\n )}\n </div>\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"EmptyContainer.js","sourceRoot":"../../../../../src","sources":["components/templates/EmptyContainer/EmptyContainer.tsx"],"names":[],"mappings":"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","sourcesContent":["import React from 'react';\n\nimport {ArrowRotateRight} from '@gravity-ui/icons';\nimport {Button, Text} from '@gravity-ui/uikit';\n\nimport type {SuggestionClickHandler, SuggestionsItem} from '../../../types/common';\nimport {block} from '../../../utils/cn';\nimport {Suggestions} from '../../molecules/Suggestions';\n\nimport {i18n} from './i18n';\n\nimport './EmptyContainer.scss';\n\nconst b = block('empty-container');\n\n/**\n * Suggestion item for EmptyContainer\n */\nexport type Suggestion = SuggestionsItem;\n\n/**\n * Alignment options for content elements\n */\nexport type ContentAlignment = 'left' | 'center' | 'right';\n\n/**\n * Alignment configuration for different sections\n */\nexport interface AlignmentConfig {\n /** Alignment for the image */\n image?: ContentAlignment;\n /** Alignment for the title */\n title?: ContentAlignment;\n /** Alignment for the description */\n description?: ContentAlignment;\n}\n\n/**\n * Props for the EmptyContainer component\n */\nexport interface EmptyContainerProps {\n /** Image or icon to display at the top */\n image?: React.ReactNode;\n /** Title text or custom React element for the welcome screen */\n title?: React.ReactNode;\n /** Description text or custom React element explaining the functionality */\n description?: React.ReactNode;\n /** Title for the suggestions section - can be string or custom React element */\n suggestionTitle?: React.ReactNode;\n /** Array of suggestion items */\n suggestions?: Suggestion[];\n /** Callback when a suggestion is clicked */\n onSuggestionClick?: SuggestionClickHandler;\n /** Alignment configuration for image, title, and description */\n alignment?: AlignmentConfig;\n /** Layout orientation for suggestions: 'grid' for horizontal, 'list' for vertical */\n layout?: 'grid' | 'list';\n /** Enable text wrapping inside suggestion buttons instead of ellipsis */\n wrapText?: boolean;\n /** Callback for showing more suggestions */\n showMore?: () => void;\n /** Custom text for the show more button */\n showMoreText?: string;\n /** Additional CSS class */\n className?: string;\n /** QA/test identifier */\n qa?: string;\n}\n\n/**\n * EmptyContainer component - displays a welcome screen with image, title, description,\n * and suggestions\n *\n * @param props - Component props\n * @returns React component\n */\nexport function EmptyContainer(props: EmptyContainerProps) {\n const {\n image,\n title,\n description,\n suggestionTitle,\n suggestions = [],\n onSuggestionClick,\n alignment,\n layout = 'grid',\n wrapText = false,\n showMore,\n showMoreText,\n className,\n qa,\n } = props;\n\n const hasContent = title || description || (suggestions && suggestions.length > 0);\n\n // Define alignment for each element\n const imageAlignment = alignment?.image || 'left';\n const titleAlignment = alignment?.title || 'left';\n const descriptionAlignment = alignment?.description || 'left';\n\n // Define text for \"Show more\" button with localization support\n const showMoreButtonText = showMoreText || i18n('show-more-button');\n\n return (\n <div className={b(null, className)} data-qa={qa}>\n <div className={b('content')}>\n {hasContent && (\n <>\n <div className={b('welcome-section')}>\n {image && (\n <div className={b('image-container', {align: imageAlignment})}>\n {image}\n </div>\n )}\n\n <div className={b('text-container')}>\n {title && (\n <Text\n variant=\"header-2\"\n className={b('title', {align: titleAlignment})}\n >\n {title}\n </Text>\n )}\n\n {description && (\n <Text\n variant=\"body-2\"\n color=\"complementary\"\n className={b('description', {align: descriptionAlignment})}\n >\n {description}\n </Text>\n )}\n </div>\n </div>\n\n {suggestions && suggestions.length > 0 && onSuggestionClick && (\n <div className={b('suggestions-section')}>\n {suggestionTitle && (\n <div className={b('suggestions-title')}>\n {typeof suggestionTitle === 'string' ? (\n <Text variant=\"subheader-3\" color=\"primary\">\n {suggestionTitle}\n </Text>\n ) : (\n suggestionTitle\n )}\n </div>\n )}\n <div className={b('suggestions-list')}>\n <Suggestions\n items={suggestions}\n onClick={onSuggestionClick}\n layout={layout}\n wrapText={wrapText}\n />\n </div>\n {showMore && (\n <div className={b('show-more')}>\n <Button\n view=\"flat-secondary\"\n size=\"l\"\n onClick={showMore}\n className={b('show-more-button')}\n >\n <Button.Icon>\n <ArrowRotateRight />\n </Button.Icon>\n {showMoreButtonText}\n </Button>\n </div>\n )}\n </div>\n )}\n </>\n )}\n </div>\n </div>\n );\n}\n"]}
@@ -16,6 +16,7 @@ const b = (0, cn_1.block)('history');
16
16
  */
17
17
  function ChatItem({ chat, showActions, isActive, onDeleteClick }) {
18
18
  const [isDeleteProccesing, setIsDeleteProcessing] = (0, react_1.useState)(false);
19
+ const chatLabel = chat.lastMessage || chat.name;
19
20
  const handleClick = (e) => {
20
21
  if (isDeleteProccesing) {
21
22
  e.stopPropagation();
@@ -34,6 +35,6 @@ function ChatItem({ chat, showActions, isActive, onDeleteClick }) {
34
35
  return ((0, jsx_runtime_1.jsxs)("div", { className: b('chat-item', {
35
36
  active: isActive,
36
37
  ['is-delete-processing']: isDeleteProccesing,
37
- }), onClick: handleClick, children: [(0, jsx_runtime_1.jsx)("div", { className: b('chat-content'), children: (0, jsx_runtime_1.jsx)(uikit_1.Text, { variant: "body-1", children: chat.lastMessage || chat.name }) }), showDeleteAction ? ((0, jsx_runtime_1.jsx)(ActionButton_1.ActionButton, { view: "flat", size: "s", color: "secondary", loading: isDeleteProccesing, className: b('delete-button'), onClick: handleDeleteChat, tooltipTitle: (0, i18n_1.i18n)('tooltip-delete'), children: (0, jsx_runtime_1.jsx)(uikit_1.Icon, { className: b('icon-button'), data: icons_1.TrashBin, size: 16 }) })) : null] }));
38
+ }), onClick: handleClick, children: [(0, jsx_runtime_1.jsx)("div", { className: b('chat-content'), children: (0, jsx_runtime_1.jsx)(uikit_1.Tooltip, { content: chatLabel, openDelay: 300, children: (0, jsx_runtime_1.jsx)(uikit_1.Text, { variant: "body-1", children: chatLabel }) }) }), showDeleteAction ? ((0, jsx_runtime_1.jsx)(ActionButton_1.ActionButton, { view: "flat", size: "s", color: "secondary", loading: isDeleteProccesing, className: b('delete-button'), onClick: handleDeleteChat, tooltipTitle: (0, i18n_1.i18n)('tooltip-delete'), children: (0, jsx_runtime_1.jsx)(uikit_1.Icon, { className: b('icon-button'), data: icons_1.TrashBin, size: 16 }) })) : null] }));
38
39
  }
39
40
  //# sourceMappingURL=ChatItem.js.map