@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.
- package/build/cjs/components/organisms/AssistantMessage/AssistantMessage.d.ts +1 -14
- package/build/cjs/components/organisms/AssistantMessage/AssistantMessage.js +3 -43
- package/build/cjs/components/organisms/AssistantMessage/AssistantMessage.js.map +1 -1
- package/build/cjs/components/organisms/MessageList/MessageList.d.ts +1 -13
- package/build/cjs/components/organisms/MessageList/MessageList.js +2 -2
- package/build/cjs/components/organisms/MessageList/MessageList.js.map +1 -1
- package/build/cjs/index.d.ts +0 -1
- package/build/cjs/index.js +0 -2
- package/build/cjs/index.js.map +1 -1
- package/build/cjs/package.json +1 -1
- package/build/cjs/types/messages.d.ts +1 -29
- package/build/cjs/types/messages.js.map +1 -1
- package/build/esm/components/organisms/AssistantMessage/AssistantMessage.d.ts +1 -14
- package/build/esm/components/organisms/AssistantMessage/AssistantMessage.js +5 -45
- package/build/esm/components/organisms/AssistantMessage/AssistantMessage.js.map +1 -1
- package/build/esm/components/organisms/MessageList/MessageList.d.ts +1 -13
- package/build/esm/components/organisms/MessageList/MessageList.js +2 -2
- package/build/esm/components/organisms/MessageList/MessageList.js.map +1 -1
- package/build/esm/index.d.ts +0 -1
- package/build/esm/index.js +0 -2
- package/build/esm/index.js.map +1 -1
- package/build/esm/package.json +1 -1
- package/build/esm/types/messages.d.ts +1 -29
- package/build/esm/types/messages.js.map +1 -1
- package/docs/ARCHITECTURE.md +0 -34
- package/package.json +2 -20
- package/build/cjs/genui/describeRegistry.d.ts +0 -20
- package/build/cjs/genui/describeRegistry.js +0 -21
- package/build/cjs/genui/describeRegistry.js.map +0 -1
- package/build/cjs/genui/index.d.ts +0 -10
- package/build/cjs/genui/index.js +0 -30
- package/build/cjs/genui/index.js.map +0 -1
- package/build/cjs/genui/registry.d.ts +0 -43
- package/build/cjs/genui/registry.js +0 -41
- package/build/cjs/genui/registry.js.map +0 -1
- package/build/cjs/genui/renderers/DefaultErrorSlot.d.ts +0 -7
- package/build/cjs/genui/renderers/DefaultErrorSlot.js +0 -15
- package/build/cjs/genui/renderers/DefaultErrorSlot.js.map +0 -1
- package/build/cjs/genui/renderers/DefaultLoadingSkeleton.d.ts +0 -7
- package/build/cjs/genui/renderers/DefaultLoadingSkeleton.js +0 -16
- package/build/cjs/genui/renderers/DefaultLoadingSkeleton.js.map +0 -1
- package/build/cjs/genui/renderers/ToolCallRenderer.d.ts +0 -29
- package/build/cjs/genui/renderers/ToolCallRenderer.js +0 -88
- package/build/cjs/genui/renderers/ToolCallRenderer.js.map +0 -1
- package/build/cjs/genui/renderers/ToolPartErrorBoundary.d.ts +0 -22
- package/build/cjs/genui/renderers/ToolPartErrorBoundary.js +0 -44
- package/build/cjs/genui/renderers/ToolPartErrorBoundary.js.map +0 -1
- package/build/cjs/genui/renderers/ToolResultRenderer.d.ts +0 -11
- package/build/cjs/genui/renderers/ToolResultRenderer.js +0 -20
- package/build/cjs/genui/renderers/ToolResultRenderer.js.map +0 -1
- package/build/cjs/genui/renderers/UnknownToolFallback.d.ts +0 -12
- package/build/cjs/genui/renderers/UnknownToolFallback.js +0 -19
- package/build/cjs/genui/renderers/UnknownToolFallback.js.map +0 -1
- package/build/cjs/genui/schema.d.ts +0 -36
- package/build/cjs/genui/schema.js +0 -118
- package/build/cjs/genui/schema.js.map +0 -1
- package/build/cjs/genui/types.d.ts +0 -116
- package/build/cjs/genui/types.js +0 -3
- package/build/cjs/genui/types.js.map +0 -1
- package/build/esm/genui/describeRegistry.d.ts +0 -20
- package/build/esm/genui/describeRegistry.js +0 -18
- package/build/esm/genui/describeRegistry.js.map +0 -1
- package/build/esm/genui/index.d.ts +0 -10
- package/build/esm/genui/index.js +0 -14
- package/build/esm/genui/index.js.map +0 -1
- package/build/esm/genui/registry.d.ts +0 -43
- package/build/esm/genui/registry.js +0 -35
- package/build/esm/genui/registry.js.map +0 -1
- package/build/esm/genui/renderers/DefaultErrorSlot.d.ts +0 -7
- package/build/esm/genui/renderers/DefaultErrorSlot.js +0 -12
- package/build/esm/genui/renderers/DefaultErrorSlot.js.map +0 -1
- package/build/esm/genui/renderers/DefaultLoadingSkeleton.d.ts +0 -7
- package/build/esm/genui/renderers/DefaultLoadingSkeleton.js +0 -13
- package/build/esm/genui/renderers/DefaultLoadingSkeleton.js.map +0 -1
- package/build/esm/genui/renderers/ToolCallRenderer.d.ts +0 -29
- package/build/esm/genui/renderers/ToolCallRenderer.js +0 -85
- package/build/esm/genui/renderers/ToolCallRenderer.js.map +0 -1
- package/build/esm/genui/renderers/ToolPartErrorBoundary.d.ts +0 -22
- package/build/esm/genui/renderers/ToolPartErrorBoundary.js +0 -40
- package/build/esm/genui/renderers/ToolPartErrorBoundary.js.map +0 -1
- package/build/esm/genui/renderers/ToolResultRenderer.d.ts +0 -11
- package/build/esm/genui/renderers/ToolResultRenderer.js +0 -17
- package/build/esm/genui/renderers/ToolResultRenderer.js.map +0 -1
- package/build/esm/genui/renderers/UnknownToolFallback.d.ts +0 -12
- package/build/esm/genui/renderers/UnknownToolFallback.js +0 -16
- package/build/esm/genui/renderers/UnknownToolFallback.js.map +0 -1
- package/build/esm/genui/schema.d.ts +0 -36
- package/build/esm/genui/schema.js +0 -113
- package/build/esm/genui/schema.js.map +0 -1
- package/build/esm/genui/types.d.ts +0 -116
- package/build/esm/genui/types.js +0 -2
- package/build/esm/genui/types.js.map +0 -1
- package/docs/GENERATIVE_UI.md +0 -213
- package/docs/genui/GENERATIVE_UI_LANDSCAPE.md +0 -938
- package/docs/genui/GENERATIVE_UI_REQUIREMENTS.md +0 -509
- package/docs/genui/IMPLEMENTATION_PLAN.md +0 -319
- package/docs/genui/IMPLEMENTATION_REPORT.md +0 -143
- package/docs/genui/links.md +0 -38
- 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
- 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
- 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
- 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,
|
|
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,
|
|
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
|
-
|
|
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":";;
|
|
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,
|
|
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,
|
|
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)
|
|
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":"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","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":"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","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"]}
|
package/build/cjs/index.d.ts
CHANGED
|
@@ -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";
|
package/build/cjs/index.js
CHANGED
|
@@ -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 ===
|
package/build/cjs/index.js.map
CHANGED
|
@@ -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,
|
|
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"]}
|
package/build/cjs/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":"2.0.4
|
|
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\
|
|
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,
|
|
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 {
|
|
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,
|
|
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,
|
|
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
|
-
|
|
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":";AAAA,OAAO,EAAC,
|
|
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,
|
|
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,
|
|
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)
|
|
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
|
};
|