@gravity-ui/aikit 2.0.4-beta.a18804fe8bd73bcab60e8a968e6bd6164f9de9ef.0 → 2.0.4

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 (102) hide show
  1. package/build/cjs/components/organisms/AssistantMessage/AssistantMessage.d.ts +1 -14
  2. package/build/cjs/components/organisms/AssistantMessage/AssistantMessage.js +3 -43
  3. package/build/cjs/components/organisms/AssistantMessage/AssistantMessage.js.map +1 -1
  4. package/build/cjs/components/organisms/MessageList/MessageList.d.ts +1 -13
  5. package/build/cjs/components/organisms/MessageList/MessageList.js +2 -2
  6. package/build/cjs/components/organisms/MessageList/MessageList.js.map +1 -1
  7. package/build/cjs/index.d.ts +0 -1
  8. package/build/cjs/index.js +0 -2
  9. package/build/cjs/index.js.map +1 -1
  10. package/build/cjs/package.json +1 -1
  11. package/build/cjs/types/messages.d.ts +1 -29
  12. package/build/cjs/types/messages.js.map +1 -1
  13. package/build/esm/components/organisms/AssistantMessage/AssistantMessage.d.ts +1 -14
  14. package/build/esm/components/organisms/AssistantMessage/AssistantMessage.js +5 -45
  15. package/build/esm/components/organisms/AssistantMessage/AssistantMessage.js.map +1 -1
  16. package/build/esm/components/organisms/MessageList/MessageList.d.ts +1 -13
  17. package/build/esm/components/organisms/MessageList/MessageList.js +2 -2
  18. package/build/esm/components/organisms/MessageList/MessageList.js.map +1 -1
  19. package/build/esm/index.d.ts +0 -1
  20. package/build/esm/index.js +0 -2
  21. package/build/esm/index.js.map +1 -1
  22. package/build/esm/package.json +1 -1
  23. package/build/esm/types/messages.d.ts +1 -29
  24. package/build/esm/types/messages.js.map +1 -1
  25. package/docs/ARCHITECTURE.md +0 -34
  26. package/package.json +2 -20
  27. package/build/cjs/genui/describeRegistry.d.ts +0 -20
  28. package/build/cjs/genui/describeRegistry.js +0 -21
  29. package/build/cjs/genui/describeRegistry.js.map +0 -1
  30. package/build/cjs/genui/index.d.ts +0 -10
  31. package/build/cjs/genui/index.js +0 -30
  32. package/build/cjs/genui/index.js.map +0 -1
  33. package/build/cjs/genui/registry.d.ts +0 -43
  34. package/build/cjs/genui/registry.js +0 -41
  35. package/build/cjs/genui/registry.js.map +0 -1
  36. package/build/cjs/genui/renderers/DefaultErrorSlot.d.ts +0 -7
  37. package/build/cjs/genui/renderers/DefaultErrorSlot.js +0 -15
  38. package/build/cjs/genui/renderers/DefaultErrorSlot.js.map +0 -1
  39. package/build/cjs/genui/renderers/DefaultLoadingSkeleton.d.ts +0 -7
  40. package/build/cjs/genui/renderers/DefaultLoadingSkeleton.js +0 -16
  41. package/build/cjs/genui/renderers/DefaultLoadingSkeleton.js.map +0 -1
  42. package/build/cjs/genui/renderers/ToolCallRenderer.d.ts +0 -29
  43. package/build/cjs/genui/renderers/ToolCallRenderer.js +0 -88
  44. package/build/cjs/genui/renderers/ToolCallRenderer.js.map +0 -1
  45. package/build/cjs/genui/renderers/ToolPartErrorBoundary.d.ts +0 -22
  46. package/build/cjs/genui/renderers/ToolPartErrorBoundary.js +0 -44
  47. package/build/cjs/genui/renderers/ToolPartErrorBoundary.js.map +0 -1
  48. package/build/cjs/genui/renderers/ToolResultRenderer.d.ts +0 -11
  49. package/build/cjs/genui/renderers/ToolResultRenderer.js +0 -20
  50. package/build/cjs/genui/renderers/ToolResultRenderer.js.map +0 -1
  51. package/build/cjs/genui/renderers/UnknownToolFallback.d.ts +0 -12
  52. package/build/cjs/genui/renderers/UnknownToolFallback.js +0 -19
  53. package/build/cjs/genui/renderers/UnknownToolFallback.js.map +0 -1
  54. package/build/cjs/genui/schema.d.ts +0 -36
  55. package/build/cjs/genui/schema.js +0 -118
  56. package/build/cjs/genui/schema.js.map +0 -1
  57. package/build/cjs/genui/types.d.ts +0 -116
  58. package/build/cjs/genui/types.js +0 -3
  59. package/build/cjs/genui/types.js.map +0 -1
  60. package/build/esm/genui/describeRegistry.d.ts +0 -20
  61. package/build/esm/genui/describeRegistry.js +0 -18
  62. package/build/esm/genui/describeRegistry.js.map +0 -1
  63. package/build/esm/genui/index.d.ts +0 -10
  64. package/build/esm/genui/index.js +0 -14
  65. package/build/esm/genui/index.js.map +0 -1
  66. package/build/esm/genui/registry.d.ts +0 -43
  67. package/build/esm/genui/registry.js +0 -35
  68. package/build/esm/genui/registry.js.map +0 -1
  69. package/build/esm/genui/renderers/DefaultErrorSlot.d.ts +0 -7
  70. package/build/esm/genui/renderers/DefaultErrorSlot.js +0 -12
  71. package/build/esm/genui/renderers/DefaultErrorSlot.js.map +0 -1
  72. package/build/esm/genui/renderers/DefaultLoadingSkeleton.d.ts +0 -7
  73. package/build/esm/genui/renderers/DefaultLoadingSkeleton.js +0 -13
  74. package/build/esm/genui/renderers/DefaultLoadingSkeleton.js.map +0 -1
  75. package/build/esm/genui/renderers/ToolCallRenderer.d.ts +0 -29
  76. package/build/esm/genui/renderers/ToolCallRenderer.js +0 -85
  77. package/build/esm/genui/renderers/ToolCallRenderer.js.map +0 -1
  78. package/build/esm/genui/renderers/ToolPartErrorBoundary.d.ts +0 -22
  79. package/build/esm/genui/renderers/ToolPartErrorBoundary.js +0 -40
  80. package/build/esm/genui/renderers/ToolPartErrorBoundary.js.map +0 -1
  81. package/build/esm/genui/renderers/ToolResultRenderer.d.ts +0 -11
  82. package/build/esm/genui/renderers/ToolResultRenderer.js +0 -17
  83. package/build/esm/genui/renderers/ToolResultRenderer.js.map +0 -1
  84. package/build/esm/genui/renderers/UnknownToolFallback.d.ts +0 -12
  85. package/build/esm/genui/renderers/UnknownToolFallback.js +0 -16
  86. package/build/esm/genui/renderers/UnknownToolFallback.js.map +0 -1
  87. package/build/esm/genui/schema.d.ts +0 -36
  88. package/build/esm/genui/schema.js +0 -113
  89. package/build/esm/genui/schema.js.map +0 -1
  90. package/build/esm/genui/types.d.ts +0 -116
  91. package/build/esm/genui/types.js +0 -2
  92. package/build/esm/genui/types.js.map +0 -1
  93. package/docs/GENERATIVE_UI.md +0 -213
  94. package/docs/genui/GENERATIVE_UI_LANDSCAPE.md +0 -938
  95. package/docs/genui/GENERATIVE_UI_REQUIREMENTS.md +0 -509
  96. package/docs/genui/IMPLEMENTATION_PLAN.md +0 -319
  97. package/docs/genui/IMPLEMENTATION_REPORT.md +0 -143
  98. package/docs/genui/links.md +0 -38
  99. package/docs/genui//320/220/321/200/321/205/320/270/321/202/320/265/320/272/321/202/321/203/321/200/320/260 Generative UI: /320/237/320/265/321/200/320/265/321/205/320/276/320/264 /320/272 /321/203/320/277/321/200/320/260/320/262/320/273/320/265/320/275/320/270/321/216 /320/272/320/276/320/274/320/277/320/276/320/275/320/265/320/275/321/202/320/260/320/274/320/270 /321/207/320/265/321/200/320/265/320/267 LLM.md" +0 -29
  100. package/docs/genui//320/220/321/200/321/205/320/270/321/202/320/265/320/272/321/202/321/203/321/200/320/260 /320/270 /321/201/321/202/320/260/320/275/320/264/320/260/321/200/321/202/321/213 Generative UI.md" +0 -27
  101. package/docs/genui//320/220/321/200/321/205/320/270/321/202/320/265/320/272/321/202/321/203/321/200/320/260 /320/270/320/275/321/202/320/265/321/200/320/260/320/272/321/202/320/270/320/262/320/275/321/213/321/205 GenUI-/320/272/320/276/320/274/320/277/320/276/320/275/320/265/320/275/321/202/320/276/320/262 /320/262 /321/207/320/260/321/202-/320/270/320/275/321/202/320/265/321/200/321/204/320/265/320/271/321/201/320/260/321/205.md" +0 -33
  102. package/docs/genui//320/223/320/265/320/275/320/265/321/200/320/260/321/202/320/270/320/262/320/275/321/213/320/271 /320/270/320/275/321/202/320/265/321/200/321/204/320/265/320/271/321/201: /320/260/321/200/321/205/320/270/321/202/320/265/320/272/321/202/321/203/321/200/320/260 /320/270/320/275/321/202/320/265/321/200/320/260/320/272/321/202/320/270/320/262/320/275/321/213/321/205 LLM-/321/207/320/260/321/202/320/276/320/262 /320/275/320/260 React.md" +0 -42
@@ -1,5 +1,4 @@
1
1
  import type { OptionsType } from '@diplodoc/transform/lib/typings';
2
- import { type GenUIErrorEvent, type GenUIToolRegistry, type ToolResultEvent } from "../../../genui/index.js";
3
2
  import type { BaseMessageProps, TAssistantMessage, TMessageContent, TMessageMetadata } from "../../../types/messages.js";
4
3
  import { type MessageRendererRegistry } from "../../../utils/messageTypeRegistry.js";
5
4
  import "./AssistantMessage.css";
@@ -11,18 +10,6 @@ export type AssistantMessageProps<TContent extends TMessageContent = never> = Ba
11
10
  shouldParseIncompleteMarkdown?: boolean;
12
11
  className?: string;
13
12
  qa?: string;
14
- /**
15
- * Generative-UI tool registry. When provided, `tool-call` parts are
16
- * routed through the registered components and `tool-result` parts are
17
- * collapsed by default. Opt-in: zero overhead when omitted.
18
- */
19
- genUIRegistry?: GenUIToolRegistry;
20
- /** Called when a GenUI component invokes `submitResult(...)`. */
21
- onToolResult?: (event: ToolResultEvent) => void;
22
- /** Called on unknown tools, validation failures, render crashes and model-reported errors. */
23
- onGenUIError?: (event: GenUIErrorEvent) => void;
24
- /** Opaque payload forwarded to every GenUI component via `context.consumerContext`. */
25
- genUIConsumerContext?: unknown;
26
13
  };
27
- export declare function AssistantMessage<TContent extends TMessageContent = never>({ content, actions, extraInfo, timestamp, id, messageRendererRegistry, transformOptions, shouldParseIncompleteMarkdown, showActionsOnHover, showTimestamp, userRating, className, qa, onActionPopup, genUIRegistry, onToolResult, onGenUIError, genUIConsumerContext, }: AssistantMessageProps<TContent>): import("react/jsx-runtime").JSX.Element | null;
14
+ export declare function AssistantMessage<TContent extends TMessageContent = never>({ content, actions, extraInfo, timestamp, id, messageRendererRegistry, transformOptions, shouldParseIncompleteMarkdown, showActionsOnHover, showTimestamp, userRating, className, qa, onActionPopup, }: AssistantMessageProps<TContent>): import("react/jsx-runtime").JSX.Element | null;
28
15
  export {};
@@ -3,7 +3,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AssistantMessage = AssistantMessage;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
- const genui_1 = require("../../../genui/index.js");
7
6
  const cn_1 = require("../../../utils/cn.js");
8
7
  const messageTypeRegistry_1 = require("../../../utils/messageTypeRegistry.js");
9
8
  const messageUtils_1 = require("../../../utils/messageUtils.js");
@@ -11,54 +10,15 @@ const BaseMessage_1 = require("../../molecules/BaseMessage/index.js");
11
10
  const defaultMessageTypeRegistry_1 = require("./defaultMessageTypeRegistry.js");
12
11
  require("./AssistantMessage.css");
13
12
  const b = (0, cn_1.block)('assistant-message');
14
- function AssistantMessage({ content, actions, extraInfo, timestamp, id, messageRendererRegistry, transformOptions, shouldParseIncompleteMarkdown, showActionsOnHover, showTimestamp, userRating, className, qa, onActionPopup, genUIRegistry, onToolResult, onGenUIError, genUIConsumerContext, }) {
15
- const parts = (0, messageUtils_1.normalizeContent)(content);
16
- // Accessor over sibling parts for Phase-2 result re-hydration (ST6, T6).
17
- // Closure captures the current parts array; stable inside this render pass.
18
- const findSiblingResult = (0, react_1.useCallback)((toolCallId) => {
19
- for (const candidate of parts) {
20
- if (candidate &&
21
- typeof candidate === 'object' &&
22
- 'type' in candidate &&
23
- candidate.type === 'tool-result') {
24
- const data = candidate.data;
25
- if (data && data.toolCallId === toolCallId) {
26
- return candidate;
27
- }
28
- }
29
- }
30
- return undefined;
31
- }, [parts]);
13
+ function AssistantMessage({ content, actions, extraInfo, timestamp, id, messageRendererRegistry, transformOptions, shouldParseIncompleteMarkdown, showActionsOnHover, showTimestamp, userRating, className, qa, onActionPopup, }) {
32
14
  const registry = (0, react_1.useMemo)(() => {
33
15
  const defaultRegistry = (0, defaultMessageTypeRegistry_1.createDefaultMessageRegistry)(transformOptions, shouldParseIncompleteMarkdown);
34
- // Register GenUI defaults before applying consumer overrides so
35
- // consumers can still replace the `tool-call` renderer wholesale.
36
- if (genUIRegistry) {
37
- (0, messageTypeRegistry_1.registerMessageRenderer)(defaultRegistry, 'tool-call', (0, genui_1.createToolCallRenderer)({
38
- genUIRegistry,
39
- onToolResult,
40
- onGenUIError,
41
- consumerContext: genUIConsumerContext,
42
- messageId: id,
43
- findSiblingResult,
44
- }));
45
- (0, messageTypeRegistry_1.registerMessageRenderer)(defaultRegistry, 'tool-result', (0, genui_1.createToolResultRenderer)());
46
- }
47
16
  if (messageRendererRegistry) {
48
17
  return (0, messageTypeRegistry_1.mergeMessageRendererRegistries)(defaultRegistry, messageRendererRegistry);
49
18
  }
50
19
  return defaultRegistry;
51
- }, [
52
- messageRendererRegistry,
53
- transformOptions,
54
- shouldParseIncompleteMarkdown,
55
- genUIRegistry,
56
- onToolResult,
57
- onGenUIError,
58
- genUIConsumerContext,
59
- id,
60
- findSiblingResult,
61
- ]);
20
+ }, [messageRendererRegistry, transformOptions, shouldParseIncompleteMarkdown]);
21
+ const parts = (0, messageUtils_1.normalizeContent)(content);
62
22
  if (parts.length === 0) {
63
23
  return null;
64
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantMessage.js","sourceRoot":"../../../../../src","sources":["components/organisms/AssistantMessage/AssistantMessage.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useCallback, useMemo} from 'react';\n\nimport type {OptionsType} from '@diplodoc/transform/lib/typings';\n\nimport {\n type GenUIErrorEvent,\n type GenUIToolRegistry,\n type ToolResultEvent,\n createToolCallRenderer,\n createToolResultRenderer,\n} from '../../../genui';\nimport type {\n BaseMessageProps,\n TAssistantMessage,\n TMessageContent,\n TMessageContentUnion,\n TMessageMetadata,\n ToolCallMessageContent,\n ToolResultMessageContent,\n} from '../../../types/messages';\nimport {block} from '../../../utils/cn';\nimport {\n type MessageRendererRegistry,\n getMessageRenderer,\n mergeMessageRendererRegistries,\n registerMessageRenderer,\n} from '../../../utils/messageTypeRegistry';\nimport {normalizeContent} from '../../../utils/messageUtils';\nimport {BaseMessage} from '../../molecules/BaseMessage';\n\nimport {createDefaultMessageRegistry} from './defaultMessageTypeRegistry';\n\nimport './AssistantMessage.scss';\n\ntype BaseMessagePick = Pick<\n BaseMessageProps,\n 'actions' | 'extraInfo' | 'timestamp' | 'showActionsOnHover' | 'showTimestamp' | 'onActionPopup'\n>;\ntype AssistantMessagePick<TContent extends TMessageContent> = Pick<\n TAssistantMessage<TContent, TMessageMetadata>,\n 'id' | 'content' | 'userRating'\n>;\n\nexport type AssistantMessageProps<TContent extends TMessageContent = never> = BaseMessagePick &\n AssistantMessagePick<TContent> & {\n messageRendererRegistry?: MessageRendererRegistry;\n transformOptions?: OptionsType;\n shouldParseIncompleteMarkdown?: boolean;\n className?: string;\n qa?: string;\n /**\n * Generative-UI tool registry. When provided, `tool-call` parts are\n * routed through the registered components and `tool-result` parts are\n * collapsed by default. Opt-in: zero overhead when omitted.\n */\n genUIRegistry?: GenUIToolRegistry;\n /** Called when a GenUI component invokes `submitResult(...)`. */\n onToolResult?: (event: ToolResultEvent) => void;\n /** Called on unknown tools, validation failures, render crashes and model-reported errors. */\n onGenUIError?: (event: GenUIErrorEvent) => void;\n /** Opaque payload forwarded to every GenUI component via `context.consumerContext`. */\n genUIConsumerContext?: unknown;\n };\n\nconst b = block('assistant-message');\n\nexport function AssistantMessage<TContent extends TMessageContent = never>({\n content,\n actions,\n extraInfo,\n timestamp,\n id,\n messageRendererRegistry,\n transformOptions,\n shouldParseIncompleteMarkdown,\n showActionsOnHover,\n showTimestamp,\n userRating,\n className,\n qa,\n onActionPopup,\n genUIRegistry,\n onToolResult,\n onGenUIError,\n genUIConsumerContext,\n}: AssistantMessageProps<TContent>) {\n const parts = normalizeContent<TContent>(content);\n\n // Accessor over sibling parts for Phase-2 result re-hydration (ST6, T6).\n // Closure captures the current parts array; stable inside this render pass.\n const findSiblingResult = useCallback(\n (toolCallId: string): ToolResultMessageContent | undefined => {\n for (const candidate of parts) {\n if (\n candidate &&\n typeof candidate === 'object' &&\n 'type' in candidate &&\n candidate.type === 'tool-result'\n ) {\n const data = (candidate as ToolResultMessageContent).data;\n if (data && data.toolCallId === toolCallId) {\n return candidate as ToolResultMessageContent;\n }\n }\n }\n return undefined;\n },\n [parts],\n );\n\n const registry = useMemo<MessageRendererRegistry>(() => {\n const defaultRegistry = createDefaultMessageRegistry(\n transformOptions,\n shouldParseIncompleteMarkdown,\n );\n\n // Register GenUI defaults before applying consumer overrides so\n // consumers can still replace the `tool-call` renderer wholesale.\n if (genUIRegistry) {\n registerMessageRenderer<ToolCallMessageContent>(\n defaultRegistry,\n 'tool-call',\n createToolCallRenderer({\n genUIRegistry,\n onToolResult,\n onGenUIError,\n consumerContext: genUIConsumerContext,\n messageId: id,\n findSiblingResult,\n }),\n );\n registerMessageRenderer<ToolResultMessageContent>(\n defaultRegistry,\n 'tool-result',\n createToolResultRenderer(),\n );\n }\n\n if (messageRendererRegistry) {\n return mergeMessageRendererRegistries(defaultRegistry, messageRendererRegistry);\n }\n\n return defaultRegistry;\n }, [\n messageRendererRegistry,\n transformOptions,\n shouldParseIncompleteMarkdown,\n genUIRegistry,\n onToolResult,\n onGenUIError,\n genUIConsumerContext,\n id,\n findSiblingResult,\n ]);\n\n if (parts.length === 0) {\n return null;\n }\n\n const renderPart = (part: TMessageContentUnion<TContent>, partIndex: number) => {\n const PartComponent = getMessageRenderer(registry, part.type);\n\n if (!PartComponent) {\n return null;\n }\n\n const key = part.id || `${id || 'message'}-part-${partIndex}`;\n\n return <PartComponent key={key} part={part} />;\n };\n\n return (\n <BaseMessage\n role=\"assistant\"\n actions={actions}\n extraInfo={extraInfo}\n showActionsOnHover={showActionsOnHover}\n showTimestamp={showTimestamp}\n timestamp={timestamp}\n userRating={userRating}\n className={b(null, className)}\n qa={qa}\n onActionPopup={onActionPopup}\n >\n <div className={b('content')}>\n {parts.map((part, index) => renderPart(part, index))}\n </div>\n </BaseMessage>\n );\n}\n"]}
1
+ {"version":3,"file":"AssistantMessage.js","sourceRoot":"../../../../../src","sources":["components/organisms/AssistantMessage/AssistantMessage.tsx"],"names":[],"mappings":";;AA4CA,4CAgEC;;AA5GD,iCAA8B;AAW9B,6CAAwC;AACxC,+EAI4C;AAC5C,iEAA6D;AAC7D,sEAAwD;AAExD,gFAA0E;AAE1E,kCAAiC;AAoBjC,MAAM,CAAC,GAAG,IAAA,UAAK,EAAC,mBAAmB,CAAC,CAAC;AAErC,SAAgB,gBAAgB,CAA2C,EACvE,OAAO,EACP,OAAO,EACP,SAAS,EACT,SAAS,EACT,EAAE,EACF,uBAAuB,EACvB,gBAAgB,EAChB,6BAA6B,EAC7B,kBAAkB,EAClB,aAAa,EACb,UAAU,EACV,SAAS,EACT,EAAE,EACF,aAAa,GACiB;IAC9B,MAAM,QAAQ,GAAG,IAAA,eAAO,EAA0B,GAAG,EAAE;QACnD,MAAM,eAAe,GAAG,IAAA,yDAA4B,EAChD,gBAAgB,EAChB,6BAA6B,CAChC,CAAC;QACF,IAAI,uBAAuB,EAAE,CAAC;YAC1B,OAAO,IAAA,oDAA8B,EAAC,eAAe,EAAE,uBAAuB,CAAC,CAAC;QACpF,CAAC;QAED,OAAO,eAAe,CAAC;IAC3B,CAAC,EAAE,CAAC,uBAAuB,EAAE,gBAAgB,EAAE,6BAA6B,CAAC,CAAC,CAAC;IAE/E,MAAM,KAAK,GAAG,IAAA,+BAAgB,EAAW,OAAO,CAAC,CAAC;IAElD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,IAAoC,EAAE,SAAiB,EAAE,EAAE;QAC3E,MAAM,aAAa,GAAG,IAAA,wCAAkB,EAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAE9D,IAAI,CAAC,aAAa,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,SAAS,SAAS,SAAS,EAAE,CAAC;QAE9D,OAAO,uBAAC,aAAa,IAAW,IAAI,EAAE,IAAI,IAAf,GAAG,CAAgB,CAAC;IACnD,CAAC,CAAC;IAEF,OAAO,CACH,uBAAC,yBAAW,IACR,IAAI,EAAC,WAAW,EAChB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,kBAAkB,EAAE,kBAAkB,EACtC,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,EAC7B,EAAE,EAAE,EAAE,EACN,aAAa,EAAE,aAAa,YAE5B,gCAAK,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,YACvB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,GAClD,GACI,CACjB,CAAC;AACN,CAAC","sourcesContent":["import {useMemo} from 'react';\n\nimport type {OptionsType} from '@diplodoc/transform/lib/typings';\n\nimport type {\n BaseMessageProps,\n TAssistantMessage,\n TMessageContent,\n TMessageContentUnion,\n TMessageMetadata,\n} from '../../../types/messages';\nimport {block} from '../../../utils/cn';\nimport {\n type MessageRendererRegistry,\n getMessageRenderer,\n mergeMessageRendererRegistries,\n} from '../../../utils/messageTypeRegistry';\nimport {normalizeContent} from '../../../utils/messageUtils';\nimport {BaseMessage} from '../../molecules/BaseMessage';\n\nimport {createDefaultMessageRegistry} from './defaultMessageTypeRegistry';\n\nimport './AssistantMessage.scss';\n\ntype BaseMessagePick = Pick<\n BaseMessageProps,\n 'actions' | 'extraInfo' | 'timestamp' | 'showActionsOnHover' | 'showTimestamp' | 'onActionPopup'\n>;\ntype AssistantMessagePick<TContent extends TMessageContent> = Pick<\n TAssistantMessage<TContent, TMessageMetadata>,\n 'id' | 'content' | 'userRating'\n>;\n\nexport type AssistantMessageProps<TContent extends TMessageContent = never> = BaseMessagePick &\n AssistantMessagePick<TContent> & {\n messageRendererRegistry?: MessageRendererRegistry;\n transformOptions?: OptionsType;\n shouldParseIncompleteMarkdown?: boolean;\n className?: string;\n qa?: string;\n };\n\nconst b = block('assistant-message');\n\nexport function AssistantMessage<TContent extends TMessageContent = never>({\n content,\n actions,\n extraInfo,\n timestamp,\n id,\n messageRendererRegistry,\n transformOptions,\n shouldParseIncompleteMarkdown,\n showActionsOnHover,\n showTimestamp,\n userRating,\n className,\n qa,\n onActionPopup,\n}: AssistantMessageProps<TContent>) {\n const registry = useMemo<MessageRendererRegistry>(() => {\n const defaultRegistry = createDefaultMessageRegistry(\n transformOptions,\n shouldParseIncompleteMarkdown,\n );\n if (messageRendererRegistry) {\n return mergeMessageRendererRegistries(defaultRegistry, messageRendererRegistry);\n }\n\n return defaultRegistry;\n }, [messageRendererRegistry, transformOptions, shouldParseIncompleteMarkdown]);\n\n const parts = normalizeContent<TContent>(content);\n\n if (parts.length === 0) {\n return null;\n }\n\n const renderPart = (part: TMessageContentUnion<TContent>, partIndex: number) => {\n const PartComponent = getMessageRenderer(registry, part.type);\n\n if (!PartComponent) {\n return null;\n }\n\n const key = part.id || `${id || 'message'}-part-${partIndex}`;\n\n return <PartComponent key={key} part={part} />;\n };\n\n return (\n <BaseMessage\n role=\"assistant\"\n actions={actions}\n extraInfo={extraInfo}\n showActionsOnHover={showActionsOnHover}\n showTimestamp={showTimestamp}\n timestamp={timestamp}\n userRating={userRating}\n className={b(null, className)}\n qa={qa}\n onActionPopup={onActionPopup}\n >\n <div className={b('content')}>\n {parts.map((part, index) => renderPart(part, index))}\n </div>\n </BaseMessage>\n );\n}\n"]}
@@ -1,6 +1,5 @@
1
1
  import type { OptionsType } from '@diplodoc/transform/lib/typings';
2
2
  import type { PopupPlacement } from '@gravity-ui/uikit';
3
- import type { GenUIErrorEvent, GenUIToolRegistry, ToolResultEvent } from "../../../genui/index.js";
4
3
  import { ChatStatus } from "../../../types/index.js";
5
4
  import type { DefaultMessageAction, MessageExtraInfoComponent, TAssistantMessage, TChatMessage, TMessageContent, TMessageMetadata, TUserMessage } from "../../../types/messages.js";
6
5
  import { type MessageRendererRegistry } from "../../../utils/messageTypeRegistry.js";
@@ -51,16 +50,5 @@ export type MessageListProps<TContent extends TMessageContent = never> = {
51
50
  ratingBlockProps?: RatingBlockProps;
52
51
  /** Action popup configuration - applies to all action popups */
53
52
  actionPopupProps?: MessageListActionPopupConfig;
54
- /**
55
- * Generative-UI tool registry. Forwarded to each {@link AssistantMessage}
56
- * so registered components can render `tool-call` parts.
57
- */
58
- genUIRegistry?: GenUIToolRegistry;
59
- /** Called when a GenUI component invokes `submitResult(...)`. */
60
- onToolResult?: (event: ToolResultEvent) => void;
61
- /** Called on unknown tools, validation failures, render crashes and model-reported errors. */
62
- onGenUIError?: (event: GenUIErrorEvent) => void;
63
- /** Opaque payload forwarded to every GenUI component via `context.consumerContext`. */
64
- genUIConsumerContext?: unknown;
65
53
  };
66
- export declare function MessageList<TContent extends TMessageContent = never>({ messages, messageRendererRegistry, transformOptions, shouldParseIncompleteMarkdown, showActionsOnHover, showTimestamp, showAvatar, userActions, assistantActions, userExtraInfo: UserExtraInfo, assistantExtraInfo: AssistantExtraInfo, loaderStatuses, className, qa, status, errorMessage, onRetry, hasPreviousMessages, onLoadPreviousMessages, ratingBlockProps, actionPopupProps, genUIRegistry, onToolResult, onGenUIError, genUIConsumerContext, }: MessageListProps<TContent>): import("react/jsx-runtime").JSX.Element;
54
+ export declare function MessageList<TContent extends TMessageContent = never>({ messages, messageRendererRegistry, transformOptions, shouldParseIncompleteMarkdown, showActionsOnHover, showTimestamp, showAvatar, userActions, assistantActions, userExtraInfo: UserExtraInfo, assistantExtraInfo: AssistantExtraInfo, loaderStatuses, className, qa, status, errorMessage, onRetry, hasPreviousMessages, onLoadPreviousMessages, ratingBlockProps, actionPopupProps, }: MessageListProps<TContent>): import("react/jsx-runtime").JSX.Element;
@@ -21,7 +21,7 @@ var MessageListQa;
21
21
  MessageListQa["Root"] = "message-list";
22
22
  MessageListQa["Messages"] = "message-list-messages";
23
23
  })(MessageListQa || (exports.MessageListQa = MessageListQa = {}));
24
- function MessageList({ messages, messageRendererRegistry, transformOptions, shouldParseIncompleteMarkdown, showActionsOnHover, showTimestamp, showAvatar, userActions, assistantActions, userExtraInfo: UserExtraInfo, assistantExtraInfo: AssistantExtraInfo, loaderStatuses = ['submitted', 'streaming_loading'], className, qa, status, errorMessage, onRetry, hasPreviousMessages = false, onLoadPreviousMessages, ratingBlockProps, actionPopupProps, genUIRegistry, onToolResult, onGenUIError, genUIConsumerContext, }) {
24
+ function MessageList({ messages, messageRendererRegistry, transformOptions, shouldParseIncompleteMarkdown, showActionsOnHover, showTimestamp, showAvatar, userActions, assistantActions, userExtraInfo: UserExtraInfo, assistantExtraInfo: AssistantExtraInfo, loaderStatuses = ['submitted', 'streaming_loading'], className, qa, status, errorMessage, onRetry, hasPreviousMessages = false, onLoadPreviousMessages, ratingBlockProps, actionPopupProps, }) {
25
25
  var _a, _b;
26
26
  const isStreaming = status === 'streaming' || status === 'streaming_loading';
27
27
  const isSubmitted = status === 'submitted';
@@ -49,7 +49,7 @@ function MessageList({ messages, messageRendererRegistry, transformOptions, shou
49
49
  const actions = showActions && !(0, utils_1.hasOnlyThinkingContent)(message.content)
50
50
  ? (0, utils_1.resolveMessageActions)(message, assistantActions)
51
51
  : undefined;
52
- return ((0, jsx_runtime_1.jsx)(AssistantMessage_1.AssistantMessage, { content: message.content, actions: actions, extraInfo: AssistantExtraInfo ? (0, jsx_runtime_1.jsx)(AssistantExtraInfo, { message: message }) : undefined, timestamp: message.timestamp, id: message.id, messageRendererRegistry: messageRendererRegistry, transformOptions: transformOptions, shouldParseIncompleteMarkdown: shouldParseIncompleteMarkdown, showActionsOnHover: showActionsOnHover, showTimestamp: showTimestamp, userRating: message.userRating, onActionPopup: (action, anchor) => handleActionPopup(message, action, anchor), genUIRegistry: genUIRegistry, onToolResult: onToolResult, onGenUIError: onGenUIError, genUIConsumerContext: genUIConsumerContext }, message.id || `message-${index}`));
52
+ return ((0, jsx_runtime_1.jsx)(AssistantMessage_1.AssistantMessage, { content: message.content, actions: actions, extraInfo: AssistantExtraInfo ? (0, jsx_runtime_1.jsx)(AssistantExtraInfo, { message: message }) : undefined, timestamp: message.timestamp, id: message.id, messageRendererRegistry: messageRendererRegistry, transformOptions: transformOptions, shouldParseIncompleteMarkdown: shouldParseIncompleteMarkdown, showActionsOnHover: showActionsOnHover, showTimestamp: showTimestamp, userRating: message.userRating, onActionPopup: (action, anchor) => handleActionPopup(message, action, anchor) }, message.id || `message-${index}`));
53
53
  }
54
54
  return null;
55
55
  };
@@ -1 +1 @@
1
- {"version":3,"file":"MessageList.js","sourceRoot":"../../../../../src","sources":["components/organisms/MessageList/MessageList.tsx"],"names":[],"mappings":";;;AAiGA,kCA4JC;;AAzPD,mDAAqE;AAWrE,mDAKwB;AACxB,6CAAwC;AAGxC,sFAAwE;AACxE,wDAA0C;AAC1C,sEAAwD;AACxD,4EAA2F;AAC3F,mEAAqD;AACrD,yDAA2C;AAE3C,gDAAwC;AACxC,4CAAoC;AAEpC,6BAA4B;AAE5B,MAAM,CAAC,GAAG,IAAA,UAAK,EAAC,cAAc,CAAC,CAAC;AAEhC,IAAY,aAGX;AAHD,WAAY,aAAa;IACrB,sCAAqB,CAAA;IACrB,mDAAkC,CAAA;AACtC,CAAC,EAHW,aAAa,6BAAb,aAAa,QAGxB;AAwDD,SAAgB,WAAW,CAA2C,EAClE,QAAQ,EACR,uBAAuB,EACvB,gBAAgB,EAChB,6BAA6B,EAC7B,kBAAkB,EAClB,aAAa,EACb,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,aAAa,EAAE,aAAa,EAC5B,kBAAkB,EAAE,kBAAkB,EACtC,cAAc,GAAG,CAAC,WAAW,EAAE,mBAAmB,CAAC,EACnD,SAAS,EACT,EAAE,EACF,MAAM,EACN,YAAY,EACZ,OAAO,EACP,mBAAmB,GAAG,KAAK,EAC3B,sBAAsB,EACtB,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,oBAAoB,GACK;;IACzB,MAAM,WAAW,GAAG,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,mBAAmB,CAAC;IAC7E,MAAM,WAAW,GAAG,MAAM,KAAK,WAAW,CAAC;IAC3C,MAAM,UAAU,GAAG,MAAM,IAAI,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAE7D,0CAA0C;IAC1C,MAAM,EAAC,UAAU,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,eAAe,EAAC,GAAG,IAAA,mBAAQ,GAGrF,CAAC;IAEJ,MAAM,EAAC,YAAY,EAAC,GAAG,IAAA,sBAAc,EAAiB;QAClD,WAAW,EAAE,WAAW,IAAI,WAAW;QACvC,aAAa,EAAE,QAAQ,CAAC,MAAM;QAC9B,MAAM;KACT,CAAC,CAAC;IAEH,0DAA0D;IAC1D,IAAA,6BAAqB,EAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAErD,MAAM,aAAa,GAAG,CAAC,OAAiD,EAAE,KAAa,EAAE,EAAE;QACvF,IAAI,IAAA,qBAAa,EAA6B,OAAO,CAAC,EAAE,CAAC;YACrD,MAAM,OAAO,GAAG,IAAA,6BAAqB,EAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YAE5D,OAAO,CACH,uBAAC,yBAAW,IAER,OAAO,EAAE,OAAO,CAAC,OAAO,EACxB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,uBAAC,aAAa,IAAC,OAAO,EAAE,OAAO,GAAI,CAAC,CAAC,CAAC,SAAS,EAC1E,SAAS,EAAE,OAAO,CAAC,SAAS,EAC5B,MAAM,EAAE,OAAO,CAAC,MAAM,EACtB,SAAS,EAAE,OAAO,CAAC,SAAS,EAC5B,MAAM,EAAE,OAAO,CAAC,MAAM,EACtB,eAAe,EAAE,OAAO,CAAC,eAAe,EACxC,gBAAgB,EAAE,gBAAgB,EAClC,6BAA6B,EAAE,6BAA6B,EAC5D,kBAAkB,EAAE,kBAAkB,EACtC,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,IAdxE,OAAO,CAAC,EAAE,IAAI,WAAW,KAAK,EAAE,CAevC,CACL,CAAC;QACN,CAAC;QAED,IAAI,IAAA,0BAAkB,EAA6B,OAAO,CAAC,EAAE,CAAC;YAC1D,MAAM,aAAa,GAAG,KAAK,KAAK,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;YACpD,MAAM,cAAc,GAAG,WAAW,IAAI,WAAW,CAAC;YAClD,MAAM,WAAW,GAAG,CAAC,CAAC,aAAa,IAAI,cAAc,CAAC,CAAC;YACvD,sEAAsE;YACtE,iFAAiF;YACjF,MAAM,OAAO,GACT,WAAW,IAAI,CAAC,IAAA,8BAAsB,EAAC,OAAO,CAAC,OAAO,CAAC;gBACnD,CAAC,CAAC,IAAA,6BAAqB,EAAC,OAAO,EAAE,gBAAgB,CAAC;gBAClD,CAAC,CAAC,SAAS,CAAC;YAEpB,OAAO,CACH,uBAAC,mCAAgB,IAEb,OAAO,EAAE,OAAO,CAAC,OAAO,EACxB,OAAO,EAAE,OAAO,EAChB,SAAS,EACL,kBAAkB,CAAC,CAAC,CAAC,uBAAC,kBAAkB,IAAC,OAAO,EAAE,OAAO,GAAI,CAAC,CAAC,CAAC,SAAS,EAE7E,SAAS,EAAE,OAAO,CAAC,SAAS,EAC5B,EAAE,EAAE,OAAO,CAAC,EAAE,EACd,uBAAuB,EAAE,uBAAuB,EAChD,gBAAgB,EAAE,gBAAgB,EAClC,6BAA6B,EAAE,6BAA6B,EAC5D,kBAAkB,EAAE,kBAAkB,EACtC,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,OAAO,CAAC,UAAU,EAC9B,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAC7E,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,YAAY,EAC1B,YAAY,EAAE,YAAY,EAC1B,oBAAoB,EAAE,oBAAoB,IAlBrC,OAAO,CAAC,EAAE,IAAI,WAAW,KAAK,EAAE,CAmBvC,CACL,CAAC;QACN,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC;IAEF,OAAO,CACH,iCAAK,GAAG,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,aAAW,EAAE,aAAF,EAAE,cAAF,EAAE,GAAI,aAAa,CAAC,IAAI,aACnF,mBAAmB,IAAI,CACpB,uBAAC,6CAAqB,IAClB,WAAW,EAAE,sBAAsB,EACnC,SAAS,EAAE,CAAC,CAAC,cAAc,CAAC,YAE5B,uBAAC,eAAM,IAAC,IAAI,EAAC,SAAS,GAAG,GACL,CAC3B,EACD,gCAAK,SAAS,EAAE,CAAC,CAAC,UAAU,CAAC,aAAW,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,YACjF,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,GAC1B,EACL,UAAU,IAAI,uBAAC,eAAM,IAAC,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAI,EAChD,MAAM,KAAK,OAAO,IAAI,CACnB,uBAAC,uBAAU,IACP,SAAS,EAAE,CAAC,CAAC,aAAa,CAAC,EAC3B,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,YAAY,GAC5B,CACL,EACA,gBAAgB,IAAI,gBAAgB,CAAC,OAAO,KAAK,KAAK,IAAI,CACvD,uBAAC,yBAAW,oBACJ,gBAAgB,IACpB,SAAS,EAAE,CAAC,CAAC,cAAc,EAAE,gBAAgB,CAAC,SAAS,CAAC,IAC1D,CACL,EAEA,eAAe,KAAI,MAAA,UAAU,CAAC,YAAY,0CAAE,KAAK,CAAA,IAAI,CAClD,uBAAC,yBAAW,IACR,IAAI,EAAE,UAAU,CAAC,IAAI,EACrB,YAAY,EAAE,qBAAqB,EACnC,aAAa,EAAE,UAAU,CAAC,aAAa,EACvC,KAAK,EAAE,CAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,KAAK,KAAI,UAAU,CAAC,KAAK,IAAI,SAAS,EAC/D,QAAQ,EAAE,CAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,QAAQ,KAAI,UAAU,CAAC,QAAQ,IAAI,SAAS,EACxE,SAAS,EACL,CAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,SAAS,KAAI,UAAU,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,EAE1E,SAAS,EAAE,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,SAAS,EACtC,EAAE,EAAE,MAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,EAAE,mCAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,CAAC,cAAc,CAAC,YAEvE,UAAU,CAAC,OAAO,GACT,CACjB,IACC,CACT,CAAC;AACN,CAAC","sourcesContent":["import type {OptionsType} from '@diplodoc/transform/lib/typings';\nimport type {PopupPlacement} from '@gravity-ui/uikit';\n\nimport type {GenUIErrorEvent, GenUIToolRegistry, ToolResultEvent} from '../../../genui';\nimport {useScrollPreservation, useSmartScroll} from '../../../hooks';\nimport {ChatStatus} from '../../../types';\nimport type {\n DefaultMessageAction,\n MessageExtraInfoComponent,\n TAssistantMessage,\n TChatMessage,\n TMessageContent,\n TMessageMetadata,\n TUserMessage,\n} from '../../../types/messages';\nimport {\n hasOnlyThinkingContent,\n isAssistantMessage,\n isUserMessage,\n resolveMessageActions,\n} from '../../../utils';\nimport {block} from '../../../utils/cn';\nimport {type MessageRendererRegistry} from '../../../utils/messageTypeRegistry';\nimport {AlertProps} from '../../atoms/Alert';\nimport {IntersectionContainer} from '../../atoms/IntersectionContainer';\nimport {Loader} from '../../atoms/Loader';\nimport {ActionPopup} from '../../molecules/ActionPopup';\nimport {RatingBlock, type RatingBlockProps} from '../../molecules/RatingBlock/RatingBlock';\nimport {AssistantMessage} from '../AssistantMessage';\nimport {UserMessage} from '../UserMessage';\n\nimport {ErrorAlert} from './ErrorAlert';\nimport {usePopup} from './usePopup';\n\nimport './MessageList.scss';\n\nconst b = block('message-list');\n\nexport enum MessageListQa {\n Root = 'message-list',\n Messages = 'message-list-messages',\n}\n\n/** Configuration for action popup behavior */\nexport interface MessageListActionPopupConfig {\n /** Override title for all popups (overrides action-specific title) */\n title?: string;\n /** Override subtitle for all popups (overrides action-specific subtitle) */\n subtitle?: string;\n /** Override placement for all popups (overrides action-specific placement) */\n placement?: PopupPlacement;\n /** Additional CSS class for popup */\n className?: string;\n /** QA/test identifier for popup */\n qa?: string;\n}\n\nexport type MessageListProps<TContent extends TMessageContent = never> = {\n messages: TChatMessage<TContent, TMessageMetadata>[];\n status?: ChatStatus;\n errorMessage?: AlertProps;\n onRetry?: () => void;\n messageRendererRegistry?: MessageRendererRegistry;\n transformOptions?: OptionsType;\n shouldParseIncompleteMarkdown?: boolean;\n showActionsOnHover?: boolean;\n showTimestamp?: boolean;\n showAvatar?: boolean;\n userActions?: DefaultMessageAction<TUserMessage<TMessageMetadata>>[];\n assistantActions?: DefaultMessageAction<TAssistantMessage<TContent, TMessageMetadata>>[];\n /** Component rendered alongside action buttons for each user message. Receives message as prop. */\n userExtraInfo?: MessageExtraInfoComponent<TUserMessage<TMessageMetadata>>;\n /** Component rendered alongside action buttons for each assistant message. Receives message as prop. */\n assistantExtraInfo?: MessageExtraInfoComponent<TAssistantMessage<TContent, TMessageMetadata>>;\n /** Array of chat statuses that should display the loader */\n loaderStatuses?: ChatStatus[];\n className?: string;\n qa?: string;\n hasPreviousMessages?: boolean;\n onLoadPreviousMessages?: () => void;\n /** Rating block configuration (for CSAT or other feedback use cases) - renders after messages list */\n ratingBlockProps?: RatingBlockProps;\n /** Action popup configuration - applies to all action popups */\n actionPopupProps?: MessageListActionPopupConfig;\n /**\n * Generative-UI tool registry. Forwarded to each {@link AssistantMessage}\n * so registered components can render `tool-call` parts.\n */\n genUIRegistry?: GenUIToolRegistry;\n /** Called when a GenUI component invokes `submitResult(...)`. */\n onToolResult?: (event: ToolResultEvent) => void;\n /** Called on unknown tools, validation failures, render crashes and model-reported errors. */\n onGenUIError?: (event: GenUIErrorEvent) => void;\n /** Opaque payload forwarded to every GenUI component via `context.consumerContext`. */\n genUIConsumerContext?: unknown;\n};\n\nexport function MessageList<TContent extends TMessageContent = never>({\n messages,\n messageRendererRegistry,\n transformOptions,\n shouldParseIncompleteMarkdown,\n showActionsOnHover,\n showTimestamp,\n showAvatar,\n userActions,\n assistantActions,\n userExtraInfo: UserExtraInfo,\n assistantExtraInfo: AssistantExtraInfo,\n loaderStatuses = ['submitted', 'streaming_loading'],\n className,\n qa,\n status,\n errorMessage,\n onRetry,\n hasPreviousMessages = false,\n onLoadPreviousMessages,\n ratingBlockProps,\n actionPopupProps,\n genUIRegistry,\n onToolResult,\n onGenUIError,\n genUIConsumerContext,\n}: MessageListProps<TContent>) {\n const isStreaming = status === 'streaming' || status === 'streaming_loading';\n const isSubmitted = status === 'submitted';\n const showLoader = status && loaderStatuses.includes(status);\n\n // Use popup hook for managing popup state\n const {popupState, handleActionPopup, handlePopupOpenChange, showActionPopup} = usePopup<\n TContent,\n TMessageMetadata\n >();\n\n const {containerRef} = useSmartScroll<HTMLDivElement>({\n isStreaming: isStreaming || isSubmitted,\n messagesCount: messages.length,\n status,\n });\n\n // Preserve scroll position when older messages are loaded\n useScrollPreservation(containerRef, messages.length);\n\n const renderMessage = (message: TChatMessage<TContent, TMessageMetadata>, index: number) => {\n if (isUserMessage<TMessageMetadata, TContent>(message)) {\n const actions = resolveMessageActions(message, userActions);\n\n return (\n <UserMessage\n key={message.id || `message-${index}`}\n content={message.content}\n actions={actions}\n extraInfo={UserExtraInfo ? <UserExtraInfo message={message} /> : undefined}\n timestamp={message.timestamp}\n format={message.format}\n avatarUrl={message.avatarUrl}\n images={message.images}\n fileAttachments={message.fileAttachments}\n transformOptions={transformOptions}\n shouldParseIncompleteMarkdown={shouldParseIncompleteMarkdown}\n showActionsOnHover={showActionsOnHover}\n showTimestamp={showTimestamp}\n showAvatar={showAvatar}\n onActionPopup={(action, anchor) => handleActionPopup(message, action, anchor)}\n />\n );\n }\n\n if (isAssistantMessage<TMessageMetadata, TContent>(message)) {\n const isLastMessage = index === messages.length - 1;\n const isNotCompleted = isSubmitted || isStreaming;\n const showActions = !(isLastMessage && isNotCompleted);\n // Don't show assistantActions for messages with ONLY thinking content\n // For mixed content (thinking + text), actions are shown and copy entire message\n const actions =\n showActions && !hasOnlyThinkingContent(message.content)\n ? resolveMessageActions(message, assistantActions)\n : undefined;\n\n return (\n <AssistantMessage<TContent>\n key={message.id || `message-${index}`}\n content={message.content}\n actions={actions}\n extraInfo={\n AssistantExtraInfo ? <AssistantExtraInfo message={message} /> : undefined\n }\n timestamp={message.timestamp}\n id={message.id}\n messageRendererRegistry={messageRendererRegistry}\n transformOptions={transformOptions}\n shouldParseIncompleteMarkdown={shouldParseIncompleteMarkdown}\n showActionsOnHover={showActionsOnHover}\n showTimestamp={showTimestamp}\n userRating={message.userRating}\n onActionPopup={(action, anchor) => handleActionPopup(message, action, anchor)}\n genUIRegistry={genUIRegistry}\n onToolResult={onToolResult}\n onGenUIError={onGenUIError}\n genUIConsumerContext={genUIConsumerContext}\n />\n );\n }\n\n return null;\n };\n\n return (\n <div ref={containerRef} className={b(null, className)} data-qa={qa ?? MessageListQa.Root}>\n {hasPreviousMessages && (\n <IntersectionContainer\n onIntersect={onLoadPreviousMessages}\n className={b('load-trigger')}\n >\n <Loader view=\"loading\" />\n </IntersectionContainer>\n )}\n <div className={b('messages')} data-qa={qa ? `${qa}-messages` : MessageListQa.Messages}>\n {messages.map(renderMessage)}\n </div>\n {showLoader && <Loader className={b('loader')} />}\n {status === 'error' && (\n <ErrorAlert\n className={b('error-alert')}\n onRetry={onRetry}\n errorMessage={errorMessage}\n />\n )}\n {ratingBlockProps && ratingBlockProps.visible !== false && (\n <RatingBlock\n {...ratingBlockProps}\n className={b('rating-block', ratingBlockProps.className)}\n />\n )}\n {/* Action Popup - renders when an action with popup config is triggered */}\n {showActionPopup && popupState.actionConfig?.popup && (\n <ActionPopup\n open={popupState.open}\n onOpenChange={handlePopupOpenChange}\n anchorElement={popupState.anchorElement}\n title={actionPopupProps?.title || popupState.title || undefined}\n subtitle={actionPopupProps?.subtitle || popupState.subtitle || undefined}\n placement={\n actionPopupProps?.placement || popupState.actionConfig.popup.placement\n }\n className={actionPopupProps?.className}\n qa={actionPopupProps?.qa ?? (qa ? `${qa}-action-popup` : 'action-popup')}\n >\n {popupState.content}\n </ActionPopup>\n )}\n </div>\n );\n}\n"]}
1
+ {"version":3,"file":"MessageList.js","sourceRoot":"../../../../../src","sources":["components/organisms/MessageList/MessageList.tsx"],"names":[],"mappings":";;;AAqFA,kCAoJC;;AAtOD,mDAAqE;AAWrE,mDAKwB;AACxB,6CAAwC;AAGxC,sFAAwE;AACxE,wDAA0C;AAC1C,sEAAwD;AACxD,4EAA2F;AAC3F,mEAAqD;AACrD,yDAA2C;AAE3C,gDAAwC;AACxC,4CAAoC;AAEpC,6BAA4B;AAE5B,MAAM,CAAC,GAAG,IAAA,UAAK,EAAC,cAAc,CAAC,CAAC;AAEhC,IAAY,aAGX;AAHD,WAAY,aAAa;IACrB,sCAAqB,CAAA;IACrB,mDAAkC,CAAA;AACtC,CAAC,EAHW,aAAa,6BAAb,aAAa,QAGxB;AA6CD,SAAgB,WAAW,CAA2C,EAClE,QAAQ,EACR,uBAAuB,EACvB,gBAAgB,EAChB,6BAA6B,EAC7B,kBAAkB,EAClB,aAAa,EACb,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,aAAa,EAAE,aAAa,EAC5B,kBAAkB,EAAE,kBAAkB,EACtC,cAAc,GAAG,CAAC,WAAW,EAAE,mBAAmB,CAAC,EACnD,SAAS,EACT,EAAE,EACF,MAAM,EACN,YAAY,EACZ,OAAO,EACP,mBAAmB,GAAG,KAAK,EAC3B,sBAAsB,EACtB,gBAAgB,EAChB,gBAAgB,GACS;;IACzB,MAAM,WAAW,GAAG,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,mBAAmB,CAAC;IAC7E,MAAM,WAAW,GAAG,MAAM,KAAK,WAAW,CAAC;IAC3C,MAAM,UAAU,GAAG,MAAM,IAAI,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAE7D,0CAA0C;IAC1C,MAAM,EAAC,UAAU,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,eAAe,EAAC,GAAG,IAAA,mBAAQ,GAGrF,CAAC;IAEJ,MAAM,EAAC,YAAY,EAAC,GAAG,IAAA,sBAAc,EAAiB;QAClD,WAAW,EAAE,WAAW,IAAI,WAAW;QACvC,aAAa,EAAE,QAAQ,CAAC,MAAM;QAC9B,MAAM;KACT,CAAC,CAAC;IAEH,0DAA0D;IAC1D,IAAA,6BAAqB,EAAC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAErD,MAAM,aAAa,GAAG,CAAC,OAAiD,EAAE,KAAa,EAAE,EAAE;QACvF,IAAI,IAAA,qBAAa,EAA6B,OAAO,CAAC,EAAE,CAAC;YACrD,MAAM,OAAO,GAAG,IAAA,6BAAqB,EAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YAE5D,OAAO,CACH,uBAAC,yBAAW,IAER,OAAO,EAAE,OAAO,CAAC,OAAO,EACxB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC,uBAAC,aAAa,IAAC,OAAO,EAAE,OAAO,GAAI,CAAC,CAAC,CAAC,SAAS,EAC1E,SAAS,EAAE,OAAO,CAAC,SAAS,EAC5B,MAAM,EAAE,OAAO,CAAC,MAAM,EACtB,SAAS,EAAE,OAAO,CAAC,SAAS,EAC5B,MAAM,EAAE,OAAO,CAAC,MAAM,EACtB,eAAe,EAAE,OAAO,CAAC,eAAe,EACxC,gBAAgB,EAAE,gBAAgB,EAClC,6BAA6B,EAAE,6BAA6B,EAC5D,kBAAkB,EAAE,kBAAkB,EACtC,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,UAAU,EACtB,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,IAdxE,OAAO,CAAC,EAAE,IAAI,WAAW,KAAK,EAAE,CAevC,CACL,CAAC;QACN,CAAC;QAED,IAAI,IAAA,0BAAkB,EAA6B,OAAO,CAAC,EAAE,CAAC;YAC1D,MAAM,aAAa,GAAG,KAAK,KAAK,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;YACpD,MAAM,cAAc,GAAG,WAAW,IAAI,WAAW,CAAC;YAClD,MAAM,WAAW,GAAG,CAAC,CAAC,aAAa,IAAI,cAAc,CAAC,CAAC;YACvD,sEAAsE;YACtE,iFAAiF;YACjF,MAAM,OAAO,GACT,WAAW,IAAI,CAAC,IAAA,8BAAsB,EAAC,OAAO,CAAC,OAAO,CAAC;gBACnD,CAAC,CAAC,IAAA,6BAAqB,EAAC,OAAO,EAAE,gBAAgB,CAAC;gBAClD,CAAC,CAAC,SAAS,CAAC;YAEpB,OAAO,CACH,uBAAC,mCAAgB,IAEb,OAAO,EAAE,OAAO,CAAC,OAAO,EACxB,OAAO,EAAE,OAAO,EAChB,SAAS,EACL,kBAAkB,CAAC,CAAC,CAAC,uBAAC,kBAAkB,IAAC,OAAO,EAAE,OAAO,GAAI,CAAC,CAAC,CAAC,SAAS,EAE7E,SAAS,EAAE,OAAO,CAAC,SAAS,EAC5B,EAAE,EAAE,OAAO,CAAC,EAAE,EACd,uBAAuB,EAAE,uBAAuB,EAChD,gBAAgB,EAAE,gBAAgB,EAClC,6BAA6B,EAAE,6BAA6B,EAC5D,kBAAkB,EAAE,kBAAkB,EACtC,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,OAAO,CAAC,UAAU,EAC9B,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,IAdxE,OAAO,CAAC,EAAE,IAAI,WAAW,KAAK,EAAE,CAevC,CACL,CAAC;QACN,CAAC;QAED,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC;IAEF,OAAO,CACH,iCAAK,GAAG,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,aAAW,EAAE,aAAF,EAAE,cAAF,EAAE,GAAI,aAAa,CAAC,IAAI,aACnF,mBAAmB,IAAI,CACpB,uBAAC,6CAAqB,IAClB,WAAW,EAAE,sBAAsB,EACnC,SAAS,EAAE,CAAC,CAAC,cAAc,CAAC,YAE5B,uBAAC,eAAM,IAAC,IAAI,EAAC,SAAS,GAAG,GACL,CAC3B,EACD,gCAAK,SAAS,EAAE,CAAC,CAAC,UAAU,CAAC,aAAW,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,YACjF,QAAQ,CAAC,GAAG,CAAC,aAAa,CAAC,GAC1B,EACL,UAAU,IAAI,uBAAC,eAAM,IAAC,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAI,EAChD,MAAM,KAAK,OAAO,IAAI,CACnB,uBAAC,uBAAU,IACP,SAAS,EAAE,CAAC,CAAC,aAAa,CAAC,EAC3B,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,YAAY,GAC5B,CACL,EACA,gBAAgB,IAAI,gBAAgB,CAAC,OAAO,KAAK,KAAK,IAAI,CACvD,uBAAC,yBAAW,oBACJ,gBAAgB,IACpB,SAAS,EAAE,CAAC,CAAC,cAAc,EAAE,gBAAgB,CAAC,SAAS,CAAC,IAC1D,CACL,EAEA,eAAe,KAAI,MAAA,UAAU,CAAC,YAAY,0CAAE,KAAK,CAAA,IAAI,CAClD,uBAAC,yBAAW,IACR,IAAI,EAAE,UAAU,CAAC,IAAI,EACrB,YAAY,EAAE,qBAAqB,EACnC,aAAa,EAAE,UAAU,CAAC,aAAa,EACvC,KAAK,EAAE,CAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,KAAK,KAAI,UAAU,CAAC,KAAK,IAAI,SAAS,EAC/D,QAAQ,EAAE,CAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,QAAQ,KAAI,UAAU,CAAC,QAAQ,IAAI,SAAS,EACxE,SAAS,EACL,CAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,SAAS,KAAI,UAAU,CAAC,YAAY,CAAC,KAAK,CAAC,SAAS,EAE1E,SAAS,EAAE,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,SAAS,EACtC,EAAE,EAAE,MAAA,gBAAgB,aAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,EAAE,mCAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC,CAAC,cAAc,CAAC,YAEvE,UAAU,CAAC,OAAO,GACT,CACjB,IACC,CACT,CAAC;AACN,CAAC","sourcesContent":["import type {OptionsType} from '@diplodoc/transform/lib/typings';\nimport type {PopupPlacement} from '@gravity-ui/uikit';\n\nimport {useScrollPreservation, useSmartScroll} from '../../../hooks';\nimport {ChatStatus} from '../../../types';\nimport type {\n DefaultMessageAction,\n MessageExtraInfoComponent,\n TAssistantMessage,\n TChatMessage,\n TMessageContent,\n TMessageMetadata,\n TUserMessage,\n} from '../../../types/messages';\nimport {\n hasOnlyThinkingContent,\n isAssistantMessage,\n isUserMessage,\n resolveMessageActions,\n} from '../../../utils';\nimport {block} from '../../../utils/cn';\nimport {type MessageRendererRegistry} from '../../../utils/messageTypeRegistry';\nimport {AlertProps} from '../../atoms/Alert';\nimport {IntersectionContainer} from '../../atoms/IntersectionContainer';\nimport {Loader} from '../../atoms/Loader';\nimport {ActionPopup} from '../../molecules/ActionPopup';\nimport {RatingBlock, type RatingBlockProps} from '../../molecules/RatingBlock/RatingBlock';\nimport {AssistantMessage} from '../AssistantMessage';\nimport {UserMessage} from '../UserMessage';\n\nimport {ErrorAlert} from './ErrorAlert';\nimport {usePopup} from './usePopup';\n\nimport './MessageList.scss';\n\nconst b = block('message-list');\n\nexport enum MessageListQa {\n Root = 'message-list',\n Messages = 'message-list-messages',\n}\n\n/** Configuration for action popup behavior */\nexport interface MessageListActionPopupConfig {\n /** Override title for all popups (overrides action-specific title) */\n title?: string;\n /** Override subtitle for all popups (overrides action-specific subtitle) */\n subtitle?: string;\n /** Override placement for all popups (overrides action-specific placement) */\n placement?: PopupPlacement;\n /** Additional CSS class for popup */\n className?: string;\n /** QA/test identifier for popup */\n qa?: string;\n}\n\nexport type MessageListProps<TContent extends TMessageContent = never> = {\n messages: TChatMessage<TContent, TMessageMetadata>[];\n status?: ChatStatus;\n errorMessage?: AlertProps;\n onRetry?: () => void;\n messageRendererRegistry?: MessageRendererRegistry;\n transformOptions?: OptionsType;\n shouldParseIncompleteMarkdown?: boolean;\n showActionsOnHover?: boolean;\n showTimestamp?: boolean;\n showAvatar?: boolean;\n userActions?: DefaultMessageAction<TUserMessage<TMessageMetadata>>[];\n assistantActions?: DefaultMessageAction<TAssistantMessage<TContent, TMessageMetadata>>[];\n /** Component rendered alongside action buttons for each user message. Receives message as prop. */\n userExtraInfo?: MessageExtraInfoComponent<TUserMessage<TMessageMetadata>>;\n /** Component rendered alongside action buttons for each assistant message. Receives message as prop. */\n assistantExtraInfo?: MessageExtraInfoComponent<TAssistantMessage<TContent, TMessageMetadata>>;\n /** Array of chat statuses that should display the loader */\n loaderStatuses?: ChatStatus[];\n className?: string;\n qa?: string;\n hasPreviousMessages?: boolean;\n onLoadPreviousMessages?: () => void;\n /** Rating block configuration (for CSAT or other feedback use cases) - renders after messages list */\n ratingBlockProps?: RatingBlockProps;\n /** Action popup configuration - applies to all action popups */\n actionPopupProps?: MessageListActionPopupConfig;\n};\n\nexport function MessageList<TContent extends TMessageContent = never>({\n messages,\n messageRendererRegistry,\n transformOptions,\n shouldParseIncompleteMarkdown,\n showActionsOnHover,\n showTimestamp,\n showAvatar,\n userActions,\n assistantActions,\n userExtraInfo: UserExtraInfo,\n assistantExtraInfo: AssistantExtraInfo,\n loaderStatuses = ['submitted', 'streaming_loading'],\n className,\n qa,\n status,\n errorMessage,\n onRetry,\n hasPreviousMessages = false,\n onLoadPreviousMessages,\n ratingBlockProps,\n actionPopupProps,\n}: MessageListProps<TContent>) {\n const isStreaming = status === 'streaming' || status === 'streaming_loading';\n const isSubmitted = status === 'submitted';\n const showLoader = status && loaderStatuses.includes(status);\n\n // Use popup hook for managing popup state\n const {popupState, handleActionPopup, handlePopupOpenChange, showActionPopup} = usePopup<\n TContent,\n TMessageMetadata\n >();\n\n const {containerRef} = useSmartScroll<HTMLDivElement>({\n isStreaming: isStreaming || isSubmitted,\n messagesCount: messages.length,\n status,\n });\n\n // Preserve scroll position when older messages are loaded\n useScrollPreservation(containerRef, messages.length);\n\n const renderMessage = (message: TChatMessage<TContent, TMessageMetadata>, index: number) => {\n if (isUserMessage<TMessageMetadata, TContent>(message)) {\n const actions = resolveMessageActions(message, userActions);\n\n return (\n <UserMessage\n key={message.id || `message-${index}`}\n content={message.content}\n actions={actions}\n extraInfo={UserExtraInfo ? <UserExtraInfo message={message} /> : undefined}\n timestamp={message.timestamp}\n format={message.format}\n avatarUrl={message.avatarUrl}\n images={message.images}\n fileAttachments={message.fileAttachments}\n transformOptions={transformOptions}\n shouldParseIncompleteMarkdown={shouldParseIncompleteMarkdown}\n showActionsOnHover={showActionsOnHover}\n showTimestamp={showTimestamp}\n showAvatar={showAvatar}\n onActionPopup={(action, anchor) => handleActionPopup(message, action, anchor)}\n />\n );\n }\n\n if (isAssistantMessage<TMessageMetadata, TContent>(message)) {\n const isLastMessage = index === messages.length - 1;\n const isNotCompleted = isSubmitted || isStreaming;\n const showActions = !(isLastMessage && isNotCompleted);\n // Don't show assistantActions for messages with ONLY thinking content\n // For mixed content (thinking + text), actions are shown and copy entire message\n const actions =\n showActions && !hasOnlyThinkingContent(message.content)\n ? resolveMessageActions(message, assistantActions)\n : undefined;\n\n return (\n <AssistantMessage<TContent>\n key={message.id || `message-${index}`}\n content={message.content}\n actions={actions}\n extraInfo={\n AssistantExtraInfo ? <AssistantExtraInfo message={message} /> : undefined\n }\n timestamp={message.timestamp}\n id={message.id}\n messageRendererRegistry={messageRendererRegistry}\n transformOptions={transformOptions}\n shouldParseIncompleteMarkdown={shouldParseIncompleteMarkdown}\n showActionsOnHover={showActionsOnHover}\n showTimestamp={showTimestamp}\n userRating={message.userRating}\n onActionPopup={(action, anchor) => handleActionPopup(message, action, anchor)}\n />\n );\n }\n\n return null;\n };\n\n return (\n <div ref={containerRef} className={b(null, className)} data-qa={qa ?? MessageListQa.Root}>\n {hasPreviousMessages && (\n <IntersectionContainer\n onIntersect={onLoadPreviousMessages}\n className={b('load-trigger')}\n >\n <Loader view=\"loading\" />\n </IntersectionContainer>\n )}\n <div className={b('messages')} data-qa={qa ? `${qa}-messages` : MessageListQa.Messages}>\n {messages.map(renderMessage)}\n </div>\n {showLoader && <Loader className={b('loader')} />}\n {status === 'error' && (\n <ErrorAlert\n className={b('error-alert')}\n onRetry={onRetry}\n errorMessage={errorMessage}\n />\n )}\n {ratingBlockProps && ratingBlockProps.visible !== false && (\n <RatingBlock\n {...ratingBlockProps}\n className={b('rating-block', ratingBlockProps.className)}\n />\n )}\n {/* Action Popup - renders when an action with popup config is triggered */}\n {showActionPopup && popupState.actionConfig?.popup && (\n <ActionPopup\n open={popupState.open}\n onOpenChange={handlePopupOpenChange}\n anchorElement={popupState.anchorElement}\n title={actionPopupProps?.title || popupState.title || undefined}\n subtitle={actionPopupProps?.subtitle || popupState.subtitle || undefined}\n placement={\n actionPopupProps?.placement || popupState.actionConfig.popup.placement\n }\n className={actionPopupProps?.className}\n qa={actionPopupProps?.qa ?? (qa ? `${qa}-action-popup` : 'action-popup')}\n >\n {popupState.content}\n </ActionPopup>\n )}\n </div>\n );\n}\n"]}
@@ -8,6 +8,5 @@ export * from "./components/organisms/index.js";
8
8
  export * from "./components/templates/index.js";
9
9
  export * from "./components/pages/index.js";
10
10
  export * from "./adapters/index.js";
11
- export * from "./genui/index.js";
12
11
  export * from "./hooks/index.js";
13
12
  export * from "./utils/index.js";
@@ -18,8 +18,6 @@ tslib_1.__exportStar(require("./components/templates/index.js"), exports);
18
18
  tslib_1.__exportStar(require("./components/pages/index.js"), exports);
19
19
  // === Adapters ===
20
20
  tslib_1.__exportStar(require("./adapters/index.js"), exports);
21
- // === Generative UI ===
22
- tslib_1.__exportStar(require("./genui/index.js"), exports);
23
21
  // === Hooks ===
24
22
  tslib_1.__exportStar(require("./hooks/index.js"), exports);
25
23
  // === Utilities ===
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"../../src","sources":["index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,gBAAgB;AAChB,2DAAwB;AAExB,gBAAgB;AAChB,sEAAmC;AAEnC,oBAAoB;AACpB,0EAAuC;AAEvC,oBAAoB;AACpB,0EAAuC;AAEvC,oBAAoB;AACpB,0EAAuC;AAEvC,gBAAgB;AAChB,sEAAmC;AAEnC,mBAAmB;AACnB,8DAA2B;AAE3B,wBAAwB;AACxB,2DAAwB;AAExB,gBAAgB;AAChB,2DAAwB;AAExB,oBAAoB;AACpB,2DAAwB","sourcesContent":["/**\n * Main export file for AI Chat library\n */\n\n// === Types ===\nexport * from './types';\n\n// === Atoms ===\nexport * from './components/atoms';\n\n// === Molecules ===\nexport * from './components/molecules';\n\n// === Organisms ===\nexport * from './components/organisms';\n\n// === Templates ===\nexport * from './components/templates';\n\n// === Pages ===\nexport * from './components/pages';\n\n// === Adapters ===\nexport * from './adapters';\n\n// === Generative UI ===\nexport * from './genui';\n\n// === Hooks ===\nexport * from './hooks';\n\n// === Utilities ===\nexport * from './utils';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"../../src","sources":["index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,gBAAgB;AAChB,2DAAwB;AAExB,gBAAgB;AAChB,sEAAmC;AAEnC,oBAAoB;AACpB,0EAAuC;AAEvC,oBAAoB;AACpB,0EAAuC;AAEvC,oBAAoB;AACpB,0EAAuC;AAEvC,gBAAgB;AAChB,sEAAmC;AAEnC,mBAAmB;AACnB,8DAA2B;AAE3B,gBAAgB;AAChB,2DAAwB;AAExB,oBAAoB;AACpB,2DAAwB","sourcesContent":["/**\n * Main export file for AI Chat library\n */\n\n// === Types ===\nexport * from './types';\n\n// === Atoms ===\nexport * from './components/atoms';\n\n// === Molecules ===\nexport * from './components/molecules';\n\n// === Organisms ===\nexport * from './components/organisms';\n\n// === Templates ===\nexport * from './components/templates';\n\n// === Pages ===\nexport * from './components/pages';\n\n// === Adapters ===\nexport * from './adapters';\n\n// === Hooks ===\nexport * from './hooks';\n\n// === Utilities ===\nexport * from './utils';\n"]}
@@ -1 +1 @@
1
- {"version":"2.0.4-beta.a18804fe8bd73bcab60e8a968e6bd6164f9de9ef.0","type":"commonjs","sideEffects":["*.css","*.scss"]}
1
+ {"version":"2.0.4","type":"commonjs","sideEffects":["*.css","*.scss"]}
@@ -119,35 +119,7 @@ export type ThinkingMessageContentData = {
119
119
  export type ThinkingMessageContent = TMessageContent<'thinking', ThinkingMessageContentData>;
120
120
  export type ToolMessageContentData = ToolMessageProps;
121
121
  export type ToolMessageContent = TMessageContent<'tool', ToolMessageContentData>;
122
- /**
123
- * Generative UI tool-call lifecycle status.
124
- *
125
- * - `input-streaming` — the model is still emitting argument tokens
126
- * - `input-available` — args fully parsed, component may render
127
- * - `output-available` — a matching `tool-result` is present in the message
128
- * - `output-error` — execution / validation failed
129
- */
130
- export type ToolCallStatus = 'input-streaming' | 'input-available' | 'output-available' | 'output-error';
131
- export type ToolCallErrorData = {
132
- message: string;
133
- cause?: unknown;
134
- };
135
- export type ToolCallMessageContentData<TArgs = unknown> = {
136
- toolCallId: string;
137
- toolName: string;
138
- args?: TArgs;
139
- partialArgsText?: string;
140
- status: ToolCallStatus;
141
- error?: ToolCallErrorData;
142
- };
143
- export type ToolCallMessageContent<TArgs = unknown> = TMessageContent<'tool-call', ToolCallMessageContentData<TArgs>>;
144
- export type ToolResultMessageContentData<TResult = unknown> = {
145
- toolCallId: string;
146
- toolName: string;
147
- result: TResult;
148
- };
149
- export type ToolResultMessageContent<TResult = unknown> = TMessageContent<'tool-result', ToolResultMessageContentData<TResult>>;
150
- export type TDefaultMessageContent = TextMessageContent | ThinkingMessageContent | ToolMessageContent | ToolCallMessageContent | ToolResultMessageContent;
122
+ export type TDefaultMessageContent = TextMessageContent | ThinkingMessageContent | ToolMessageContent;
151
123
  export type TMessageContentUnion<TCustomMessageContent extends TMessageContent = never> = TDefaultMessageContent | TCustomMessageContent;
152
124
  export type TAssistantMessageContent<TCustomMessageContent extends TMessageContent = never> = string | TMessageContentUnion<TCustomMessageContent> | TMessageContentUnion<TCustomMessageContent>[];
153
125
  export type TBaseMessage<Metadata = TMessageMetadata> = Pick<BaseMessageProps, 'actions' | 'timestamp'> & {
@@ -1 +1 @@
1
- {"version":3,"file":"messages.js","sourceRoot":"../../../src","sources":["types/messages.ts"],"names":[],"mappings":";;;AAmDA,IAAY,qBAOX;AAPD,WAAY,qBAAqB;IAC7B,sCAAa,CAAA;IACb,sCAAa,CAAA;IACb,wCAAe,CAAA;IACf,sCAAa,CAAA;IACb,4CAAmB,CAAA;IACnB,0CAAiB,CAAA;AACrB,CAAC,EAPW,qBAAqB,qCAArB,qBAAqB,QAOhC","sourcesContent":["import type React from 'react';\n\nimport type {ButtonView, PopupPlacement} from '@gravity-ui/uikit';\n\nimport {ActionConfig} from './common';\nimport {ToolMessageProps} from './tool';\n\n/**\n * Context object passed to popup content generator function\n */\nexport interface ActionPopupContext {\n /** Update popup content without closing it */\n setContent: (content: React.ReactNode) => void;\n /** Update popup title dynamically */\n setTitle: (title: string | undefined) => void;\n /** Update popup subtitle dynamically */\n setSubtitle: (subtitle: string | undefined) => void;\n /** Programmatically close the popup */\n closePopup: () => void;\n}\n\n/**\n * Configuration for action popup\n */\nexport interface ActionPopupConfig<TMessage> {\n /** Function that generates popup content */\n getContent: (message: TMessage, context: ActionPopupContext) => React.ReactNode;\n /** Optional popup title (can be overridden by actionPopupProps) */\n title?: string;\n /** Optional popup subtitle (can be overridden by actionPopupProps) */\n subtitle?: string;\n /** Optional popup placement (can be overridden by actionPopupProps) */\n placement?: PopupPlacement;\n}\n\nexport type BaseMessageActionConfig<TMessage = unknown> = ActionConfig & {\n /** Optional popup configuration for this action */\n popup?: ActionPopupConfig<TMessage>;\n};\n\n/**\n * BaseMessage action can be either:\n * - BaseMessageActionConfig object with properties (including type for default icons)\n * - React.ReactNode for fully custom content\n */\nexport type BaseMessageAction<TMessage = unknown> =\n | BaseMessageActionConfig<TMessage>\n | React.ReactNode;\n\nexport type UserRating = 'like' | 'dislike';\n\nexport enum BaseMessageActionType {\n Copy = 'copy',\n Edit = 'edit',\n Retry = 'retry',\n Like = 'like',\n Dislike = 'dislike',\n Delete = 'delete',\n}\n\n/**\n * Default action descriptor for message action buttons.\n * Generic over the message type to provide typed onClick handler.\n */\nexport type DefaultMessageAction<TMessage> = {\n type?: string;\n onClick: (message: TMessage) => void;\n icon?: React.ReactNode;\n /**\n * Arbitrary button content (text, badges, or any ReactNode).\n * Takes precedence over `icon` when both are provided.\n * Can be a static ReactNode or a render function that receives the message,\n * allowing dynamic content based on message data (e.g. token count from metadata).\n */\n children?: React.ReactNode | ((message: TMessage) => React.ReactNode);\n label?: string;\n view?: ButtonView;\n /** Optional popup configuration for this action */\n popup?: ActionPopupConfig<TMessage>;\n};\n\n/**\n * React component used to render extra contextual info for a message\n * (e.g. token count, latency). Receives the message as a `message` prop.\n */\nexport type MessageExtraInfoComponent<TMessage> = React.ComponentType<{message: TMessage}>;\n\nexport type BaseMessageProps<TMessage = unknown> = {\n children: React.ReactNode;\n role: TMessageRole;\n actions?: BaseMessageAction<TMessage>[];\n /** Extra info node rendered alongside the action buttons (e.g. token count). */\n extraInfo?: React.ReactNode;\n userRating?: UserRating;\n timestamp?: string;\n showTimestamp?: boolean;\n showActionsOnHover?: boolean;\n className?: string;\n qa?: string;\n /** Callback when action with popup config is clicked */\n onActionPopup?: (action: BaseMessageActionConfig<TMessage>, anchorElement: HTMLElement) => void;\n};\n\nexport type TMessageMetadata = Record<string, unknown>;\n\nexport type TSubmitData = {\n content: string;\n attachments?: File[];\n metadata?: TMessageMetadata;\n};\n\nexport type TMessageRole = 'user' | 'assistant' | 'system';\n\nexport type TMessageContent<Type extends string = string, Data = unknown> = {\n id?: string;\n type: Type;\n data: Data;\n};\n\nexport type TextMessageContentData = {\n text: string;\n};\n\nexport type TextMessageContent = TMessageContent<'text', TextMessageContentData>;\n\nexport type ThinkingMessageContentData = {\n title?: string;\n content: string | string[];\n status: 'thinking' | 'thought';\n defaultExpanded?: boolean;\n showStatusIndicator?: boolean;\n onCopyClick?: () => void;\n enabledCopy?: boolean;\n className?: string;\n qa?: string;\n};\n\nexport type ThinkingMessageContent = TMessageContent<'thinking', ThinkingMessageContentData>;\n\nexport type ToolMessageContentData = ToolMessageProps;\n\nexport type ToolMessageContent = TMessageContent<'tool', ToolMessageContentData>;\n\n/**\n * Generative UI tool-call lifecycle status.\n *\n * - `input-streaming` — the model is still emitting argument tokens\n * - `input-available` — args fully parsed, component may render\n * - `output-available` — a matching `tool-result` is present in the message\n * - `output-error` — execution / validation failed\n */\nexport type ToolCallStatus =\n | 'input-streaming'\n | 'input-available'\n | 'output-available'\n | 'output-error';\n\nexport type ToolCallErrorData = {\n message: string;\n cause?: unknown;\n};\n\nexport type ToolCallMessageContentData<TArgs = unknown> = {\n toolCallId: string;\n toolName: string;\n args?: TArgs;\n partialArgsText?: string;\n status: ToolCallStatus;\n error?: ToolCallErrorData;\n};\n\nexport type ToolCallMessageContent<TArgs = unknown> = TMessageContent<\n 'tool-call',\n ToolCallMessageContentData<TArgs>\n>;\n\nexport type ToolResultMessageContentData<TResult = unknown> = {\n toolCallId: string;\n toolName: string;\n result: TResult;\n};\n\nexport type ToolResultMessageContent<TResult = unknown> = TMessageContent<\n 'tool-result',\n ToolResultMessageContentData<TResult>\n>;\n\nexport type TDefaultMessageContent =\n | TextMessageContent\n | ThinkingMessageContent\n | ToolMessageContent\n | ToolCallMessageContent\n | ToolResultMessageContent;\n\nexport type TMessageContentUnion<TCustomMessageContent extends TMessageContent = never> =\n | TDefaultMessageContent\n | TCustomMessageContent;\n\nexport type TAssistantMessageContent<TCustomMessageContent extends TMessageContent = never> =\n | string\n | TMessageContentUnion<TCustomMessageContent>\n | TMessageContentUnion<TCustomMessageContent>[];\n\nexport type TBaseMessage<Metadata = TMessageMetadata> = Pick<\n BaseMessageProps,\n 'actions' | 'timestamp'\n> & {\n id?: string;\n error?: unknown;\n metadata?: Metadata;\n};\n\nexport type FileAttachment = {\n id: string;\n name: string;\n mimeType?: string;\n};\n\nexport type TUserMessage<Metadata = TMessageMetadata> = TBaseMessage<Metadata> & {\n role: 'user';\n content: string;\n format?: 'plain' | 'markdown';\n avatarUrl?: string;\n /** Base64 data URLs or regular image URLs attached to the message */\n images?: string[];\n /** File attachments sent with this message */\n fileAttachments?: FileAttachment[];\n};\n\nexport type TAssistantMessage<\n TCustomMessageContent extends TMessageContent = never,\n Metadata = TMessageMetadata,\n> = TBaseMessage<Metadata> & {\n role: 'assistant';\n content: TAssistantMessageContent<TCustomMessageContent>;\n userRating?: UserRating;\n};\n\nexport type TChatMessage<\n TCustomMessageContent extends TMessageContent = never,\n Metadata = TMessageMetadata,\n> = TUserMessage<Metadata> | TAssistantMessage<TCustomMessageContent, Metadata>;\n"]}
1
+ {"version":3,"file":"messages.js","sourceRoot":"../../../src","sources":["types/messages.ts"],"names":[],"mappings":";;;AAmDA,IAAY,qBAOX;AAPD,WAAY,qBAAqB;IAC7B,sCAAa,CAAA;IACb,sCAAa,CAAA;IACb,wCAAe,CAAA;IACf,sCAAa,CAAA;IACb,4CAAmB,CAAA;IACnB,0CAAiB,CAAA;AACrB,CAAC,EAPW,qBAAqB,qCAArB,qBAAqB,QAOhC","sourcesContent":["import type React from 'react';\n\nimport type {ButtonView, PopupPlacement} from '@gravity-ui/uikit';\n\nimport {ActionConfig} from './common';\nimport {ToolMessageProps} from './tool';\n\n/**\n * Context object passed to popup content generator function\n */\nexport interface ActionPopupContext {\n /** Update popup content without closing it */\n setContent: (content: React.ReactNode) => void;\n /** Update popup title dynamically */\n setTitle: (title: string | undefined) => void;\n /** Update popup subtitle dynamically */\n setSubtitle: (subtitle: string | undefined) => void;\n /** Programmatically close the popup */\n closePopup: () => void;\n}\n\n/**\n * Configuration for action popup\n */\nexport interface ActionPopupConfig<TMessage> {\n /** Function that generates popup content */\n getContent: (message: TMessage, context: ActionPopupContext) => React.ReactNode;\n /** Optional popup title (can be overridden by actionPopupProps) */\n title?: string;\n /** Optional popup subtitle (can be overridden by actionPopupProps) */\n subtitle?: string;\n /** Optional popup placement (can be overridden by actionPopupProps) */\n placement?: PopupPlacement;\n}\n\nexport type BaseMessageActionConfig<TMessage = unknown> = ActionConfig & {\n /** Optional popup configuration for this action */\n popup?: ActionPopupConfig<TMessage>;\n};\n\n/**\n * BaseMessage action can be either:\n * - BaseMessageActionConfig object with properties (including type for default icons)\n * - React.ReactNode for fully custom content\n */\nexport type BaseMessageAction<TMessage = unknown> =\n | BaseMessageActionConfig<TMessage>\n | React.ReactNode;\n\nexport type UserRating = 'like' | 'dislike';\n\nexport enum BaseMessageActionType {\n Copy = 'copy',\n Edit = 'edit',\n Retry = 'retry',\n Like = 'like',\n Dislike = 'dislike',\n Delete = 'delete',\n}\n\n/**\n * Default action descriptor for message action buttons.\n * Generic over the message type to provide typed onClick handler.\n */\nexport type DefaultMessageAction<TMessage> = {\n type?: string;\n onClick: (message: TMessage) => void;\n icon?: React.ReactNode;\n /**\n * Arbitrary button content (text, badges, or any ReactNode).\n * Takes precedence over `icon` when both are provided.\n * Can be a static ReactNode or a render function that receives the message,\n * allowing dynamic content based on message data (e.g. token count from metadata).\n */\n children?: React.ReactNode | ((message: TMessage) => React.ReactNode);\n label?: string;\n view?: ButtonView;\n /** Optional popup configuration for this action */\n popup?: ActionPopupConfig<TMessage>;\n};\n\n/**\n * React component used to render extra contextual info for a message\n * (e.g. token count, latency). Receives the message as a `message` prop.\n */\nexport type MessageExtraInfoComponent<TMessage> = React.ComponentType<{message: TMessage}>;\n\nexport type BaseMessageProps<TMessage = unknown> = {\n children: React.ReactNode;\n role: TMessageRole;\n actions?: BaseMessageAction<TMessage>[];\n /** Extra info node rendered alongside the action buttons (e.g. token count). */\n extraInfo?: React.ReactNode;\n userRating?: UserRating;\n timestamp?: string;\n showTimestamp?: boolean;\n showActionsOnHover?: boolean;\n className?: string;\n qa?: string;\n /** Callback when action with popup config is clicked */\n onActionPopup?: (action: BaseMessageActionConfig<TMessage>, anchorElement: HTMLElement) => void;\n};\n\nexport type TMessageMetadata = Record<string, unknown>;\n\nexport type TSubmitData = {\n content: string;\n attachments?: File[];\n metadata?: TMessageMetadata;\n};\n\nexport type TMessageRole = 'user' | 'assistant' | 'system';\n\nexport type TMessageContent<Type extends string = string, Data = unknown> = {\n id?: string;\n type: Type;\n data: Data;\n};\n\nexport type TextMessageContentData = {\n text: string;\n};\n\nexport type TextMessageContent = TMessageContent<'text', TextMessageContentData>;\n\nexport type ThinkingMessageContentData = {\n title?: string;\n content: string | string[];\n status: 'thinking' | 'thought';\n defaultExpanded?: boolean;\n showStatusIndicator?: boolean;\n onCopyClick?: () => void;\n enabledCopy?: boolean;\n className?: string;\n qa?: string;\n};\n\nexport type ThinkingMessageContent = TMessageContent<'thinking', ThinkingMessageContentData>;\n\nexport type ToolMessageContentData = ToolMessageProps;\n\nexport type ToolMessageContent = TMessageContent<'tool', ToolMessageContentData>;\n\nexport type TDefaultMessageContent =\n | TextMessageContent\n | ThinkingMessageContent\n | ToolMessageContent;\n\nexport type TMessageContentUnion<TCustomMessageContent extends TMessageContent = never> =\n | TDefaultMessageContent\n | TCustomMessageContent;\n\nexport type TAssistantMessageContent<TCustomMessageContent extends TMessageContent = never> =\n | string\n | TMessageContentUnion<TCustomMessageContent>\n | TMessageContentUnion<TCustomMessageContent>[];\n\nexport type TBaseMessage<Metadata = TMessageMetadata> = Pick<\n BaseMessageProps,\n 'actions' | 'timestamp'\n> & {\n id?: string;\n error?: unknown;\n metadata?: Metadata;\n};\n\nexport type FileAttachment = {\n id: string;\n name: string;\n mimeType?: string;\n};\n\nexport type TUserMessage<Metadata = TMessageMetadata> = TBaseMessage<Metadata> & {\n role: 'user';\n content: string;\n format?: 'plain' | 'markdown';\n avatarUrl?: string;\n /** Base64 data URLs or regular image URLs attached to the message */\n images?: string[];\n /** File attachments sent with this message */\n fileAttachments?: FileAttachment[];\n};\n\nexport type TAssistantMessage<\n TCustomMessageContent extends TMessageContent = never,\n Metadata = TMessageMetadata,\n> = TBaseMessage<Metadata> & {\n role: 'assistant';\n content: TAssistantMessageContent<TCustomMessageContent>;\n userRating?: UserRating;\n};\n\nexport type TChatMessage<\n TCustomMessageContent extends TMessageContent = never,\n Metadata = TMessageMetadata,\n> = TUserMessage<Metadata> | TAssistantMessage<TCustomMessageContent, Metadata>;\n"]}
@@ -1,5 +1,4 @@
1
1
  import type { OptionsType } from '@diplodoc/transform/lib/typings';
2
- import { type GenUIErrorEvent, type GenUIToolRegistry, type ToolResultEvent } from "../../../genui/index.js";
3
2
  import type { BaseMessageProps, TAssistantMessage, TMessageContent, TMessageMetadata } from "../../../types/messages.js";
4
3
  import { type MessageRendererRegistry } from "../../../utils/messageTypeRegistry.js";
5
4
  import "./AssistantMessage.css";
@@ -11,18 +10,6 @@ export type AssistantMessageProps<TContent extends TMessageContent = never> = Ba
11
10
  shouldParseIncompleteMarkdown?: boolean;
12
11
  className?: string;
13
12
  qa?: string;
14
- /**
15
- * Generative-UI tool registry. When provided, `tool-call` parts are
16
- * routed through the registered components and `tool-result` parts are
17
- * collapsed by default. Opt-in: zero overhead when omitted.
18
- */
19
- genUIRegistry?: GenUIToolRegistry;
20
- /** Called when a GenUI component invokes `submitResult(...)`. */
21
- onToolResult?: (event: ToolResultEvent) => void;
22
- /** Called on unknown tools, validation failures, render crashes and model-reported errors. */
23
- onGenUIError?: (event: GenUIErrorEvent) => void;
24
- /** Opaque payload forwarded to every GenUI component via `context.consumerContext`. */
25
- genUIConsumerContext?: unknown;
26
13
  };
27
- export declare function AssistantMessage<TContent extends TMessageContent = never>({ content, actions, extraInfo, timestamp, id, messageRendererRegistry, transformOptions, shouldParseIncompleteMarkdown, showActionsOnHover, showTimestamp, userRating, className, qa, onActionPopup, genUIRegistry, onToolResult, onGenUIError, genUIConsumerContext, }: AssistantMessageProps<TContent>): import("react/jsx-runtime").JSX.Element | null;
14
+ export declare function AssistantMessage<TContent extends TMessageContent = never>({ content, actions, extraInfo, timestamp, id, messageRendererRegistry, transformOptions, shouldParseIncompleteMarkdown, showActionsOnHover, showTimestamp, userRating, className, qa, onActionPopup, }: AssistantMessageProps<TContent>): import("react/jsx-runtime").JSX.Element | null;
28
15
  export {};
@@ -1,61 +1,21 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { useCallback, useMemo } from 'react';
3
- import { createToolCallRenderer, createToolResultRenderer, } from "../../../genui/index.js";
2
+ import { useMemo } from 'react';
4
3
  import { block } from "../../../utils/cn.js";
5
- import { getMessageRenderer, mergeMessageRendererRegistries, registerMessageRenderer, } from "../../../utils/messageTypeRegistry.js";
4
+ import { getMessageRenderer, mergeMessageRendererRegistries, } from "../../../utils/messageTypeRegistry.js";
6
5
  import { normalizeContent } from "../../../utils/messageUtils.js";
7
6
  import { BaseMessage } from "../../molecules/BaseMessage/index.js";
8
7
  import { createDefaultMessageRegistry } from "./defaultMessageTypeRegistry.js";
9
8
  import "./AssistantMessage.css";
10
9
  const b = block('assistant-message');
11
- export function AssistantMessage({ content, actions, extraInfo, timestamp, id, messageRendererRegistry, transformOptions, shouldParseIncompleteMarkdown, showActionsOnHover, showTimestamp, userRating, className, qa, onActionPopup, genUIRegistry, onToolResult, onGenUIError, genUIConsumerContext, }) {
12
- const parts = normalizeContent(content);
13
- // Accessor over sibling parts for Phase-2 result re-hydration (ST6, T6).
14
- // Closure captures the current parts array; stable inside this render pass.
15
- const findSiblingResult = useCallback((toolCallId) => {
16
- for (const candidate of parts) {
17
- if (candidate &&
18
- typeof candidate === 'object' &&
19
- 'type' in candidate &&
20
- candidate.type === 'tool-result') {
21
- const data = candidate.data;
22
- if (data && data.toolCallId === toolCallId) {
23
- return candidate;
24
- }
25
- }
26
- }
27
- return undefined;
28
- }, [parts]);
10
+ export function AssistantMessage({ content, actions, extraInfo, timestamp, id, messageRendererRegistry, transformOptions, shouldParseIncompleteMarkdown, showActionsOnHover, showTimestamp, userRating, className, qa, onActionPopup, }) {
29
11
  const registry = useMemo(() => {
30
12
  const defaultRegistry = createDefaultMessageRegistry(transformOptions, shouldParseIncompleteMarkdown);
31
- // Register GenUI defaults before applying consumer overrides so
32
- // consumers can still replace the `tool-call` renderer wholesale.
33
- if (genUIRegistry) {
34
- registerMessageRenderer(defaultRegistry, 'tool-call', createToolCallRenderer({
35
- genUIRegistry,
36
- onToolResult,
37
- onGenUIError,
38
- consumerContext: genUIConsumerContext,
39
- messageId: id,
40
- findSiblingResult,
41
- }));
42
- registerMessageRenderer(defaultRegistry, 'tool-result', createToolResultRenderer());
43
- }
44
13
  if (messageRendererRegistry) {
45
14
  return mergeMessageRendererRegistries(defaultRegistry, messageRendererRegistry);
46
15
  }
47
16
  return defaultRegistry;
48
- }, [
49
- messageRendererRegistry,
50
- transformOptions,
51
- shouldParseIncompleteMarkdown,
52
- genUIRegistry,
53
- onToolResult,
54
- onGenUIError,
55
- genUIConsumerContext,
56
- id,
57
- findSiblingResult,
58
- ]);
17
+ }, [messageRendererRegistry, transformOptions, shouldParseIncompleteMarkdown]);
18
+ const parts = normalizeContent(content);
59
19
  if (parts.length === 0) {
60
20
  return null;
61
21
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AssistantMessage.js","sourceRoot":"../../../../../src","sources":["components/organisms/AssistantMessage/AssistantMessage.tsx"],"names":[],"mappings":"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","sourcesContent":["import {useCallback, useMemo} from 'react';\n\nimport type {OptionsType} from '@diplodoc/transform/lib/typings';\n\nimport {\n type GenUIErrorEvent,\n type GenUIToolRegistry,\n type ToolResultEvent,\n createToolCallRenderer,\n createToolResultRenderer,\n} from '../../../genui';\nimport type {\n BaseMessageProps,\n TAssistantMessage,\n TMessageContent,\n TMessageContentUnion,\n TMessageMetadata,\n ToolCallMessageContent,\n ToolResultMessageContent,\n} from '../../../types/messages';\nimport {block} from '../../../utils/cn';\nimport {\n type MessageRendererRegistry,\n getMessageRenderer,\n mergeMessageRendererRegistries,\n registerMessageRenderer,\n} from '../../../utils/messageTypeRegistry';\nimport {normalizeContent} from '../../../utils/messageUtils';\nimport {BaseMessage} from '../../molecules/BaseMessage';\n\nimport {createDefaultMessageRegistry} from './defaultMessageTypeRegistry';\n\nimport './AssistantMessage.scss';\n\ntype BaseMessagePick = Pick<\n BaseMessageProps,\n 'actions' | 'extraInfo' | 'timestamp' | 'showActionsOnHover' | 'showTimestamp' | 'onActionPopup'\n>;\ntype AssistantMessagePick<TContent extends TMessageContent> = Pick<\n TAssistantMessage<TContent, TMessageMetadata>,\n 'id' | 'content' | 'userRating'\n>;\n\nexport type AssistantMessageProps<TContent extends TMessageContent = never> = BaseMessagePick &\n AssistantMessagePick<TContent> & {\n messageRendererRegistry?: MessageRendererRegistry;\n transformOptions?: OptionsType;\n shouldParseIncompleteMarkdown?: boolean;\n className?: string;\n qa?: string;\n /**\n * Generative-UI tool registry. When provided, `tool-call` parts are\n * routed through the registered components and `tool-result` parts are\n * collapsed by default. Opt-in: zero overhead when omitted.\n */\n genUIRegistry?: GenUIToolRegistry;\n /** Called when a GenUI component invokes `submitResult(...)`. */\n onToolResult?: (event: ToolResultEvent) => void;\n /** Called on unknown tools, validation failures, render crashes and model-reported errors. */\n onGenUIError?: (event: GenUIErrorEvent) => void;\n /** Opaque payload forwarded to every GenUI component via `context.consumerContext`. */\n genUIConsumerContext?: unknown;\n };\n\nconst b = block('assistant-message');\n\nexport function AssistantMessage<TContent extends TMessageContent = never>({\n content,\n actions,\n extraInfo,\n timestamp,\n id,\n messageRendererRegistry,\n transformOptions,\n shouldParseIncompleteMarkdown,\n showActionsOnHover,\n showTimestamp,\n userRating,\n className,\n qa,\n onActionPopup,\n genUIRegistry,\n onToolResult,\n onGenUIError,\n genUIConsumerContext,\n}: AssistantMessageProps<TContent>) {\n const parts = normalizeContent<TContent>(content);\n\n // Accessor over sibling parts for Phase-2 result re-hydration (ST6, T6).\n // Closure captures the current parts array; stable inside this render pass.\n const findSiblingResult = useCallback(\n (toolCallId: string): ToolResultMessageContent | undefined => {\n for (const candidate of parts) {\n if (\n candidate &&\n typeof candidate === 'object' &&\n 'type' in candidate &&\n candidate.type === 'tool-result'\n ) {\n const data = (candidate as ToolResultMessageContent).data;\n if (data && data.toolCallId === toolCallId) {\n return candidate as ToolResultMessageContent;\n }\n }\n }\n return undefined;\n },\n [parts],\n );\n\n const registry = useMemo<MessageRendererRegistry>(() => {\n const defaultRegistry = createDefaultMessageRegistry(\n transformOptions,\n shouldParseIncompleteMarkdown,\n );\n\n // Register GenUI defaults before applying consumer overrides so\n // consumers can still replace the `tool-call` renderer wholesale.\n if (genUIRegistry) {\n registerMessageRenderer<ToolCallMessageContent>(\n defaultRegistry,\n 'tool-call',\n createToolCallRenderer({\n genUIRegistry,\n onToolResult,\n onGenUIError,\n consumerContext: genUIConsumerContext,\n messageId: id,\n findSiblingResult,\n }),\n );\n registerMessageRenderer<ToolResultMessageContent>(\n defaultRegistry,\n 'tool-result',\n createToolResultRenderer(),\n );\n }\n\n if (messageRendererRegistry) {\n return mergeMessageRendererRegistries(defaultRegistry, messageRendererRegistry);\n }\n\n return defaultRegistry;\n }, [\n messageRendererRegistry,\n transformOptions,\n shouldParseIncompleteMarkdown,\n genUIRegistry,\n onToolResult,\n onGenUIError,\n genUIConsumerContext,\n id,\n findSiblingResult,\n ]);\n\n if (parts.length === 0) {\n return null;\n }\n\n const renderPart = (part: TMessageContentUnion<TContent>, partIndex: number) => {\n const PartComponent = getMessageRenderer(registry, part.type);\n\n if (!PartComponent) {\n return null;\n }\n\n const key = part.id || `${id || 'message'}-part-${partIndex}`;\n\n return <PartComponent key={key} part={part} />;\n };\n\n return (\n <BaseMessage\n role=\"assistant\"\n actions={actions}\n extraInfo={extraInfo}\n showActionsOnHover={showActionsOnHover}\n showTimestamp={showTimestamp}\n timestamp={timestamp}\n userRating={userRating}\n className={b(null, className)}\n qa={qa}\n onActionPopup={onActionPopup}\n >\n <div className={b('content')}>\n {parts.map((part, index) => renderPart(part, index))}\n </div>\n </BaseMessage>\n );\n}\n"]}
1
+ {"version":3,"file":"AssistantMessage.js","sourceRoot":"../../../../../src","sources":["components/organisms/AssistantMessage/AssistantMessage.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,OAAO,CAAC;AAW9B,OAAO,EAAC,KAAK,EAAC,6BAA0B;AACxC,OAAO,EAEH,kBAAkB,EAClB,8BAA8B,GACjC,8CAA2C;AAC5C,OAAO,EAAC,gBAAgB,EAAC,uCAAoC;AAC7D,OAAO,EAAC,WAAW,EAAC,6CAAoC;AAExD,OAAO,EAAC,4BAA4B,EAAC,wCAAqC;AAE1E,gCAAiC;AAoBjC,MAAM,CAAC,GAAG,KAAK,CAAC,mBAAmB,CAAC,CAAC;AAErC,MAAM,UAAU,gBAAgB,CAA2C,EACvE,OAAO,EACP,OAAO,EACP,SAAS,EACT,SAAS,EACT,EAAE,EACF,uBAAuB,EACvB,gBAAgB,EAChB,6BAA6B,EAC7B,kBAAkB,EAClB,aAAa,EACb,UAAU,EACV,SAAS,EACT,EAAE,EACF,aAAa,GACiB;IAC9B,MAAM,QAAQ,GAAG,OAAO,CAA0B,GAAG,EAAE;QACnD,MAAM,eAAe,GAAG,4BAA4B,CAChD,gBAAgB,EAChB,6BAA6B,CAChC,CAAC;QACF,IAAI,uBAAuB,EAAE,CAAC;YAC1B,OAAO,8BAA8B,CAAC,eAAe,EAAE,uBAAuB,CAAC,CAAC;QACpF,CAAC;QAED,OAAO,eAAe,CAAC;IAC3B,CAAC,EAAE,CAAC,uBAAuB,EAAE,gBAAgB,EAAE,6BAA6B,CAAC,CAAC,CAAC;IAE/E,MAAM,KAAK,GAAG,gBAAgB,CAAW,OAAO,CAAC,CAAC;IAElD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,IAAoC,EAAE,SAAiB,EAAE,EAAE;QAC3E,MAAM,aAAa,GAAG,kBAAkB,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QAE9D,IAAI,CAAC,aAAa,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QAChB,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,IAAI,SAAS,SAAS,SAAS,EAAE,CAAC;QAE9D,OAAO,KAAC,aAAa,IAAW,IAAI,EAAE,IAAI,IAAf,GAAG,CAAgB,CAAC;IACnD,CAAC,CAAC;IAEF,OAAO,CACH,KAAC,WAAW,IACR,IAAI,EAAC,WAAW,EAChB,OAAO,EAAE,OAAO,EAChB,SAAS,EAAE,SAAS,EACpB,kBAAkB,EAAE,kBAAkB,EACtC,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,EACpB,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,SAAS,CAAC,EAC7B,EAAE,EAAE,EAAE,EACN,aAAa,EAAE,aAAa,YAE5B,cAAK,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,YACvB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,GAClD,GACI,CACjB,CAAC;AACN,CAAC","sourcesContent":["import {useMemo} from 'react';\n\nimport type {OptionsType} from '@diplodoc/transform/lib/typings';\n\nimport type {\n BaseMessageProps,\n TAssistantMessage,\n TMessageContent,\n TMessageContentUnion,\n TMessageMetadata,\n} from '../../../types/messages';\nimport {block} from '../../../utils/cn';\nimport {\n type MessageRendererRegistry,\n getMessageRenderer,\n mergeMessageRendererRegistries,\n} from '../../../utils/messageTypeRegistry';\nimport {normalizeContent} from '../../../utils/messageUtils';\nimport {BaseMessage} from '../../molecules/BaseMessage';\n\nimport {createDefaultMessageRegistry} from './defaultMessageTypeRegistry';\n\nimport './AssistantMessage.scss';\n\ntype BaseMessagePick = Pick<\n BaseMessageProps,\n 'actions' | 'extraInfo' | 'timestamp' | 'showActionsOnHover' | 'showTimestamp' | 'onActionPopup'\n>;\ntype AssistantMessagePick<TContent extends TMessageContent> = Pick<\n TAssistantMessage<TContent, TMessageMetadata>,\n 'id' | 'content' | 'userRating'\n>;\n\nexport type AssistantMessageProps<TContent extends TMessageContent = never> = BaseMessagePick &\n AssistantMessagePick<TContent> & {\n messageRendererRegistry?: MessageRendererRegistry;\n transformOptions?: OptionsType;\n shouldParseIncompleteMarkdown?: boolean;\n className?: string;\n qa?: string;\n };\n\nconst b = block('assistant-message');\n\nexport function AssistantMessage<TContent extends TMessageContent = never>({\n content,\n actions,\n extraInfo,\n timestamp,\n id,\n messageRendererRegistry,\n transformOptions,\n shouldParseIncompleteMarkdown,\n showActionsOnHover,\n showTimestamp,\n userRating,\n className,\n qa,\n onActionPopup,\n}: AssistantMessageProps<TContent>) {\n const registry = useMemo<MessageRendererRegistry>(() => {\n const defaultRegistry = createDefaultMessageRegistry(\n transformOptions,\n shouldParseIncompleteMarkdown,\n );\n if (messageRendererRegistry) {\n return mergeMessageRendererRegistries(defaultRegistry, messageRendererRegistry);\n }\n\n return defaultRegistry;\n }, [messageRendererRegistry, transformOptions, shouldParseIncompleteMarkdown]);\n\n const parts = normalizeContent<TContent>(content);\n\n if (parts.length === 0) {\n return null;\n }\n\n const renderPart = (part: TMessageContentUnion<TContent>, partIndex: number) => {\n const PartComponent = getMessageRenderer(registry, part.type);\n\n if (!PartComponent) {\n return null;\n }\n\n const key = part.id || `${id || 'message'}-part-${partIndex}`;\n\n return <PartComponent key={key} part={part} />;\n };\n\n return (\n <BaseMessage\n role=\"assistant\"\n actions={actions}\n extraInfo={extraInfo}\n showActionsOnHover={showActionsOnHover}\n showTimestamp={showTimestamp}\n timestamp={timestamp}\n userRating={userRating}\n className={b(null, className)}\n qa={qa}\n onActionPopup={onActionPopup}\n >\n <div className={b('content')}>\n {parts.map((part, index) => renderPart(part, index))}\n </div>\n </BaseMessage>\n );\n}\n"]}
@@ -1,6 +1,5 @@
1
1
  import type { OptionsType } from '@diplodoc/transform/lib/typings';
2
2
  import type { PopupPlacement } from '@gravity-ui/uikit';
3
- import type { GenUIErrorEvent, GenUIToolRegistry, ToolResultEvent } from "../../../genui/index.js";
4
3
  import { ChatStatus } from "../../../types/index.js";
5
4
  import type { DefaultMessageAction, MessageExtraInfoComponent, TAssistantMessage, TChatMessage, TMessageContent, TMessageMetadata, TUserMessage } from "../../../types/messages.js";
6
5
  import { type MessageRendererRegistry } from "../../../utils/messageTypeRegistry.js";
@@ -51,16 +50,5 @@ export type MessageListProps<TContent extends TMessageContent = never> = {
51
50
  ratingBlockProps?: RatingBlockProps;
52
51
  /** Action popup configuration - applies to all action popups */
53
52
  actionPopupProps?: MessageListActionPopupConfig;
54
- /**
55
- * Generative-UI tool registry. Forwarded to each {@link AssistantMessage}
56
- * so registered components can render `tool-call` parts.
57
- */
58
- genUIRegistry?: GenUIToolRegistry;
59
- /** Called when a GenUI component invokes `submitResult(...)`. */
60
- onToolResult?: (event: ToolResultEvent) => void;
61
- /** Called on unknown tools, validation failures, render crashes and model-reported errors. */
62
- onGenUIError?: (event: GenUIErrorEvent) => void;
63
- /** Opaque payload forwarded to every GenUI component via `context.consumerContext`. */
64
- genUIConsumerContext?: unknown;
65
53
  };
66
- export declare function MessageList<TContent extends TMessageContent = never>({ messages, messageRendererRegistry, transformOptions, shouldParseIncompleteMarkdown, showActionsOnHover, showTimestamp, showAvatar, userActions, assistantActions, userExtraInfo: UserExtraInfo, assistantExtraInfo: AssistantExtraInfo, loaderStatuses, className, qa, status, errorMessage, onRetry, hasPreviousMessages, onLoadPreviousMessages, ratingBlockProps, actionPopupProps, genUIRegistry, onToolResult, onGenUIError, genUIConsumerContext, }: MessageListProps<TContent>): import("react/jsx-runtime").JSX.Element;
54
+ export declare function MessageList<TContent extends TMessageContent = never>({ messages, messageRendererRegistry, transformOptions, shouldParseIncompleteMarkdown, showActionsOnHover, showTimestamp, showAvatar, userActions, assistantActions, userExtraInfo: UserExtraInfo, assistantExtraInfo: AssistantExtraInfo, loaderStatuses, className, qa, status, errorMessage, onRetry, hasPreviousMessages, onLoadPreviousMessages, ratingBlockProps, actionPopupProps, }: MessageListProps<TContent>): import("react/jsx-runtime").JSX.Element;
@@ -17,7 +17,7 @@ export var MessageListQa;
17
17
  MessageListQa["Root"] = "message-list";
18
18
  MessageListQa["Messages"] = "message-list-messages";
19
19
  })(MessageListQa || (MessageListQa = {}));
20
- export function MessageList({ messages, messageRendererRegistry, transformOptions, shouldParseIncompleteMarkdown, showActionsOnHover, showTimestamp, showAvatar, userActions, assistantActions, userExtraInfo: UserExtraInfo, assistantExtraInfo: AssistantExtraInfo, loaderStatuses = ['submitted', 'streaming_loading'], className, qa, status, errorMessage, onRetry, hasPreviousMessages = false, onLoadPreviousMessages, ratingBlockProps, actionPopupProps, genUIRegistry, onToolResult, onGenUIError, genUIConsumerContext, }) {
20
+ export function MessageList({ messages, messageRendererRegistry, transformOptions, shouldParseIncompleteMarkdown, showActionsOnHover, showTimestamp, showAvatar, userActions, assistantActions, userExtraInfo: UserExtraInfo, assistantExtraInfo: AssistantExtraInfo, loaderStatuses = ['submitted', 'streaming_loading'], className, qa, status, errorMessage, onRetry, hasPreviousMessages = false, onLoadPreviousMessages, ratingBlockProps, actionPopupProps, }) {
21
21
  var _a, _b;
22
22
  const isStreaming = status === 'streaming' || status === 'streaming_loading';
23
23
  const isSubmitted = status === 'submitted';
@@ -45,7 +45,7 @@ export function MessageList({ messages, messageRendererRegistry, transformOption
45
45
  const actions = showActions && !hasOnlyThinkingContent(message.content)
46
46
  ? resolveMessageActions(message, assistantActions)
47
47
  : undefined;
48
- return (_jsx(AssistantMessage, { content: message.content, actions: actions, extraInfo: AssistantExtraInfo ? _jsx(AssistantExtraInfo, { message: message }) : undefined, timestamp: message.timestamp, id: message.id, messageRendererRegistry: messageRendererRegistry, transformOptions: transformOptions, shouldParseIncompleteMarkdown: shouldParseIncompleteMarkdown, showActionsOnHover: showActionsOnHover, showTimestamp: showTimestamp, userRating: message.userRating, onActionPopup: (action, anchor) => handleActionPopup(message, action, anchor), genUIRegistry: genUIRegistry, onToolResult: onToolResult, onGenUIError: onGenUIError, genUIConsumerContext: genUIConsumerContext }, message.id || `message-${index}`));
48
+ return (_jsx(AssistantMessage, { content: message.content, actions: actions, extraInfo: AssistantExtraInfo ? _jsx(AssistantExtraInfo, { message: message }) : undefined, timestamp: message.timestamp, id: message.id, messageRendererRegistry: messageRendererRegistry, transformOptions: transformOptions, shouldParseIncompleteMarkdown: shouldParseIncompleteMarkdown, showActionsOnHover: showActionsOnHover, showTimestamp: showTimestamp, userRating: message.userRating, onActionPopup: (action, anchor) => handleActionPopup(message, action, anchor) }, message.id || `message-${index}`));
49
49
  }
50
50
  return null;
51
51
  };