@gravity-ui/aikit 2.0.3 → 2.0.4-beta.a18804fe8bd73bcab60e8a968e6bd6164f9de9ef.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/adapters/openai/helpers/consumeOpenAIStream.js +17 -12
- package/build/cjs/adapters/openai/helpers/consumeOpenAIStream.js.map +1 -1
- package/build/cjs/adapters/openai/helpers/getStreamEndResult.d.ts +7 -0
- package/build/cjs/adapters/openai/helpers/getStreamEndResult.js +12 -0
- package/build/cjs/adapters/openai/helpers/getStreamEndResult.js.map +1 -0
- package/build/cjs/components/organisms/AssistantMessage/AssistantMessage.d.ts +14 -1
- package/build/cjs/components/organisms/AssistantMessage/AssistantMessage.js +43 -3
- package/build/cjs/components/organisms/AssistantMessage/AssistantMessage.js.map +1 -1
- package/build/cjs/components/organisms/MessageList/MessageList.d.ts +13 -1
- package/build/cjs/components/organisms/MessageList/MessageList.js +2 -2
- package/build/cjs/components/organisms/MessageList/MessageList.js.map +1 -1
- package/build/cjs/genui/describeRegistry.d.ts +20 -0
- package/build/cjs/genui/describeRegistry.js +21 -0
- package/build/cjs/genui/describeRegistry.js.map +1 -0
- package/build/cjs/genui/index.d.ts +10 -0
- package/build/cjs/genui/index.js +30 -0
- package/build/cjs/genui/index.js.map +1 -0
- package/build/cjs/genui/registry.d.ts +43 -0
- package/build/cjs/genui/registry.js +41 -0
- package/build/cjs/genui/registry.js.map +1 -0
- package/build/cjs/genui/renderers/DefaultErrorSlot.d.ts +7 -0
- package/build/cjs/genui/renderers/DefaultErrorSlot.js +15 -0
- package/build/cjs/genui/renderers/DefaultErrorSlot.js.map +1 -0
- package/build/cjs/genui/renderers/DefaultLoadingSkeleton.d.ts +7 -0
- package/build/cjs/genui/renderers/DefaultLoadingSkeleton.js +16 -0
- package/build/cjs/genui/renderers/DefaultLoadingSkeleton.js.map +1 -0
- package/build/cjs/genui/renderers/ToolCallRenderer.d.ts +29 -0
- package/build/cjs/genui/renderers/ToolCallRenderer.js +88 -0
- package/build/cjs/genui/renderers/ToolCallRenderer.js.map +1 -0
- package/build/cjs/genui/renderers/ToolPartErrorBoundary.d.ts +22 -0
- package/build/cjs/genui/renderers/ToolPartErrorBoundary.js +44 -0
- package/build/cjs/genui/renderers/ToolPartErrorBoundary.js.map +1 -0
- package/build/cjs/genui/renderers/ToolResultRenderer.d.ts +11 -0
- package/build/cjs/genui/renderers/ToolResultRenderer.js +20 -0
- package/build/cjs/genui/renderers/ToolResultRenderer.js.map +1 -0
- package/build/cjs/genui/renderers/UnknownToolFallback.d.ts +12 -0
- package/build/cjs/genui/renderers/UnknownToolFallback.js +19 -0
- package/build/cjs/genui/renderers/UnknownToolFallback.js.map +1 -0
- package/build/cjs/genui/schema.d.ts +36 -0
- package/build/cjs/genui/schema.js +118 -0
- package/build/cjs/genui/schema.js.map +1 -0
- package/build/cjs/genui/types.d.ts +116 -0
- package/build/cjs/genui/types.js +3 -0
- package/build/cjs/genui/types.js.map +1 -0
- package/build/cjs/index.d.ts +1 -0
- package/build/cjs/index.js +2 -0
- package/build/cjs/index.js.map +1 -1
- package/build/cjs/package.json +1 -1
- package/build/cjs/types/messages.d.ts +29 -1
- package/build/cjs/types/messages.js.map +1 -1
- package/build/esm/adapters/openai/helpers/consumeOpenAIStream.js +17 -12
- package/build/esm/adapters/openai/helpers/consumeOpenAIStream.js.map +1 -1
- package/build/esm/adapters/openai/helpers/getStreamEndResult.d.ts +7 -0
- package/build/esm/adapters/openai/helpers/getStreamEndResult.js +9 -0
- package/build/esm/adapters/openai/helpers/getStreamEndResult.js.map +1 -0
- package/build/esm/components/organisms/AssistantMessage/AssistantMessage.d.ts +14 -1
- package/build/esm/components/organisms/AssistantMessage/AssistantMessage.js +45 -5
- package/build/esm/components/organisms/AssistantMessage/AssistantMessage.js.map +1 -1
- package/build/esm/components/organisms/MessageList/MessageList.d.ts +13 -1
- package/build/esm/components/organisms/MessageList/MessageList.js +2 -2
- package/build/esm/components/organisms/MessageList/MessageList.js.map +1 -1
- package/build/esm/genui/describeRegistry.d.ts +20 -0
- package/build/esm/genui/describeRegistry.js +18 -0
- package/build/esm/genui/describeRegistry.js.map +1 -0
- package/build/esm/genui/index.d.ts +10 -0
- package/build/esm/genui/index.js +14 -0
- package/build/esm/genui/index.js.map +1 -0
- package/build/esm/genui/registry.d.ts +43 -0
- package/build/esm/genui/registry.js +35 -0
- package/build/esm/genui/registry.js.map +1 -0
- package/build/esm/genui/renderers/DefaultErrorSlot.d.ts +7 -0
- package/build/esm/genui/renderers/DefaultErrorSlot.js +12 -0
- package/build/esm/genui/renderers/DefaultErrorSlot.js.map +1 -0
- package/build/esm/genui/renderers/DefaultLoadingSkeleton.d.ts +7 -0
- package/build/esm/genui/renderers/DefaultLoadingSkeleton.js +13 -0
- package/build/esm/genui/renderers/DefaultLoadingSkeleton.js.map +1 -0
- package/build/esm/genui/renderers/ToolCallRenderer.d.ts +29 -0
- package/build/esm/genui/renderers/ToolCallRenderer.js +85 -0
- package/build/esm/genui/renderers/ToolCallRenderer.js.map +1 -0
- package/build/esm/genui/renderers/ToolPartErrorBoundary.d.ts +22 -0
- package/build/esm/genui/renderers/ToolPartErrorBoundary.js +40 -0
- package/build/esm/genui/renderers/ToolPartErrorBoundary.js.map +1 -0
- package/build/esm/genui/renderers/ToolResultRenderer.d.ts +11 -0
- package/build/esm/genui/renderers/ToolResultRenderer.js +17 -0
- package/build/esm/genui/renderers/ToolResultRenderer.js.map +1 -0
- package/build/esm/genui/renderers/UnknownToolFallback.d.ts +12 -0
- package/build/esm/genui/renderers/UnknownToolFallback.js +16 -0
- package/build/esm/genui/renderers/UnknownToolFallback.js.map +1 -0
- package/build/esm/genui/schema.d.ts +36 -0
- package/build/esm/genui/schema.js +113 -0
- package/build/esm/genui/schema.js.map +1 -0
- package/build/esm/genui/types.d.ts +116 -0
- package/build/esm/genui/types.js +2 -0
- package/build/esm/genui/types.js.map +1 -0
- package/build/esm/index.d.ts +1 -0
- package/build/esm/index.js +2 -0
- package/build/esm/index.js.map +1 -1
- package/build/esm/package.json +1 -1
- package/build/esm/types/messages.d.ts +29 -1
- package/build/esm/types/messages.js.map +1 -1
- package/docs/ARCHITECTURE.md +34 -0
- package/docs/GENERATIVE_UI.md +213 -0
- package/docs/genui/GENERATIVE_UI_LANDSCAPE.md +938 -0
- package/docs/genui/GENERATIVE_UI_REQUIREMENTS.md +509 -0
- package/docs/genui/IMPLEMENTATION_PLAN.md +319 -0
- package/docs/genui/IMPLEMENTATION_REPORT.md +143 -0
- package/docs/genui/links.md +38 -0
- 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" +29 -0
- 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" +27 -0
- 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" +33 -0
- 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" +42 -0
- package/package.json +20 -2
|
@@ -6,10 +6,17 @@ const applyContentUpdate_1 = require("./applyContentUpdate.js");
|
|
|
6
6
|
const buildFinalMessages_1 = require("./buildFinalMessages.js");
|
|
7
7
|
const contentPartsToMessageContent_1 = require("./contentPartsToMessageContent.js");
|
|
8
8
|
const getOpenAIMessageItemIdFromOutputItemAdded_1 = require("./getOpenAIMessageItemIdFromOutputItemAdded.js");
|
|
9
|
-
const
|
|
9
|
+
const getStreamEndResult_1 = require("./getStreamEndResult.js");
|
|
10
10
|
const getStreamEventContentUpdate_1 = require("./getStreamEventContentUpdate.js");
|
|
11
11
|
const isMessageOutputItemDoneEvent_1 = require("./isMessageOutputItemDoneEvent.js");
|
|
12
12
|
const isStreamEndOrErrorEvent_1 = require("./isStreamEndOrErrorEvent.js");
|
|
13
|
+
function waitForNextTask() {
|
|
14
|
+
return new Promise((resolve) => setTimeout(resolve, 0));
|
|
15
|
+
}
|
|
16
|
+
function shouldYieldAfterUpdate(update) {
|
|
17
|
+
var _a;
|
|
18
|
+
return (update === null || update === void 0 ? void 0 : update.kind) === 'tool_add' && ((_a = update.status) !== null && _a !== void 0 ? _a : 'loading') === 'loading';
|
|
19
|
+
}
|
|
13
20
|
/** Consumes stream, invokes callbacks. State/setters live in caller. */
|
|
14
21
|
async function consumeOpenAIStream(stream, callbacks) {
|
|
15
22
|
var _a, e_1, _b, _c;
|
|
@@ -41,23 +48,16 @@ async function consumeOpenAIStream(stream, callbacks) {
|
|
|
41
48
|
continue;
|
|
42
49
|
}
|
|
43
50
|
if ((0, isStreamEndOrErrorEvent_1.isStreamEndOrErrorEvent)(event)) {
|
|
44
|
-
const e = event;
|
|
45
51
|
const finalMessages = (0, buildFinalMessages_1.buildFinalMessages)({
|
|
46
52
|
baseMessages,
|
|
47
53
|
completedAssistantMessages,
|
|
48
54
|
currentAssistantMessageId,
|
|
49
55
|
contentParts,
|
|
50
56
|
});
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
-
else {
|
|
57
|
-
if (getIsCancelled())
|
|
58
|
-
return;
|
|
59
|
-
onEnd(finalMessages, 'done');
|
|
60
|
-
}
|
|
57
|
+
const endResult = (0, getStreamEndResult_1.getStreamEndResult)(event);
|
|
58
|
+
if (getIsCancelled())
|
|
59
|
+
return;
|
|
60
|
+
onEnd(finalMessages, endResult.status, endResult.status === 'error' ? endResult.error : undefined);
|
|
61
61
|
return;
|
|
62
62
|
}
|
|
63
63
|
if ((0, isMessageOutputItemDoneEvent_1.isMessageOutputItemDoneEvent)(event)) {
|
|
@@ -80,6 +80,11 @@ async function consumeOpenAIStream(stream, callbacks) {
|
|
|
80
80
|
if (nextParts !== null) {
|
|
81
81
|
contentParts = nextParts;
|
|
82
82
|
applyContentToCurrentMessage(contentParts);
|
|
83
|
+
if (shouldYieldAfterUpdate(update)) {
|
|
84
|
+
await waitForNextTask();
|
|
85
|
+
if (getIsCancelled())
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
83
88
|
}
|
|
84
89
|
}
|
|
85
90
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consumeOpenAIStream.js","sourceRoot":"../../../../../src","sources":["adapters/openai/helpers/consumeOpenAIStream.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"consumeOpenAIStream.js","sourceRoot":"../../../../../src","sources":["adapters/openai/helpers/consumeOpenAIStream.ts"],"names":[],"mappings":"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","sourcesContent":["import type {TAssistantMessage, TChatMessage, TMessageContentUnion} from '../../../types';\nimport type {OpenAIStreamEventLike} from '../types';\n\nimport {applyContentUpdate} from './applyContentUpdate';\nimport {buildFinalMessages} from './buildFinalMessages';\nimport {contentPartsToMessageContent} from './contentPartsToMessageContent';\nimport {getOpenAIMessageItemIdFromOutputItemAdded} from './getOpenAIMessageItemIdFromOutputItemAdded';\nimport {getStreamEndResult} from './getStreamEndResult';\nimport {getStreamEventContentUpdate} from './getStreamEventContentUpdate';\nimport {isMessageOutputItemDoneEvent} from './isMessageOutputItemDoneEvent';\nimport {isStreamEndOrErrorEvent} from './isStreamEndOrErrorEvent';\n\nfunction waitForNextTask(): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, 0));\n}\n\nfunction shouldYieldAfterUpdate(update: ReturnType<typeof getStreamEventContentUpdate>): boolean {\n return update?.kind === 'tool_add' && (update.status ?? 'loading') === 'loading';\n}\n\nexport type ConsumeStreamCallbacks = {\n baseMessages: TChatMessage[];\n getAssistantMessageId: (index: number) => string;\n /** When the API sends `response.output_item.added` for a message, exposes OpenAI item id (e.g. msg-cc-…) for reactions. */\n onAssistantMessageIdResolved?: (previousId: string, openaiItemId: string) => void;\n onContentUpdate: (messageId: string, content: TAssistantMessage['content']) => void;\n onNewMessage: (messageId: string) => void;\n onEnd: (finalMessages: TChatMessage[], status: 'done' | 'error', error?: Error) => void;\n getIsCancelled: () => boolean;\n};\n\n/** Consumes stream, invokes callbacks. State/setters live in caller. */\n\nexport async function consumeOpenAIStream(\n stream: AsyncIterable<OpenAIStreamEventLike>,\n callbacks: ConsumeStreamCallbacks,\n): Promise<void> {\n const {\n baseMessages,\n getAssistantMessageId,\n onAssistantMessageIdResolved,\n onContentUpdate,\n onNewMessage,\n onEnd,\n getIsCancelled,\n } = callbacks;\n\n const completedAssistantMessages: {id: string; content: TAssistantMessage['content']}[] = [];\n let messageIndex = 0;\n let currentAssistantMessageId = getAssistantMessageId(0);\n let contentParts: TMessageContentUnion[] = [];\n\n const applyContentToCurrentMessage = (parts: TMessageContentUnion[]) => {\n if (getIsCancelled()) return;\n onContentUpdate(currentAssistantMessageId, contentPartsToMessageContent(parts));\n };\n\n try {\n for await (const event of stream) {\n if (getIsCancelled()) return;\n\n const openaiMessageItemId = getOpenAIMessageItemIdFromOutputItemAdded(event);\n if (openaiMessageItemId && openaiMessageItemId !== currentAssistantMessageId) {\n const previousId = currentAssistantMessageId;\n currentAssistantMessageId = openaiMessageItemId;\n if (!getIsCancelled()) {\n onAssistantMessageIdResolved?.(previousId, openaiMessageItemId);\n }\n continue;\n }\n\n if (isStreamEndOrErrorEvent(event)) {\n const finalMessages = buildFinalMessages({\n baseMessages,\n completedAssistantMessages,\n currentAssistantMessageId,\n contentParts,\n });\n const endResult = getStreamEndResult(event);\n if (getIsCancelled()) return;\n onEnd(\n finalMessages,\n endResult.status,\n endResult.status === 'error' ? endResult.error : undefined,\n );\n return;\n }\n\n if (isMessageOutputItemDoneEvent(event)) {\n completedAssistantMessages.push({\n id: currentAssistantMessageId,\n content: contentPartsToMessageContent(contentParts),\n });\n messageIndex += 1;\n currentAssistantMessageId = getAssistantMessageId(messageIndex);\n contentParts = [];\n if (getIsCancelled()) return;\n onNewMessage(currentAssistantMessageId);\n continue;\n }\n\n const update = getStreamEventContentUpdate(event);\n if (!update) continue;\n\n const nextParts = applyContentUpdate(contentParts, update);\n if (nextParts !== null) {\n contentParts = nextParts;\n applyContentToCurrentMessage(contentParts);\n if (shouldYieldAfterUpdate(update)) {\n await waitForNextTask();\n if (getIsCancelled()) return;\n }\n }\n }\n\n if (!getIsCancelled()) {\n const finalMessages = buildFinalMessages({\n baseMessages,\n completedAssistantMessages,\n currentAssistantMessageId,\n contentParts,\n });\n onEnd(finalMessages, 'done');\n }\n } catch (err) {\n if (!getIsCancelled()) {\n const finalMessages = buildFinalMessages({\n baseMessages,\n completedAssistantMessages,\n currentAssistantMessageId,\n contentParts,\n });\n onEnd(finalMessages, 'error', err instanceof Error ? err : new Error(String(err)));\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getStreamEndResult = getStreamEndResult;
|
|
4
|
+
const getStreamErrorMessage_1 = require("./getStreamErrorMessage.js");
|
|
5
|
+
function getStreamEndResult(event) {
|
|
6
|
+
const e = event;
|
|
7
|
+
if (e.type === 'error' || e.event === 'error' || e.error) {
|
|
8
|
+
return { status: 'error', error: new Error((0, getStreamErrorMessage_1.getStreamErrorMessage)(e)) };
|
|
9
|
+
}
|
|
10
|
+
return { status: 'done' };
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=getStreamEndResult.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getStreamEndResult.js","sourceRoot":"../../../../../src","sources":["adapters/openai/helpers/getStreamEndResult.ts"],"names":[],"mappings":";;AAIA,gDAQC;AAVD,sEAA8D;AAE9D,SAAgB,kBAAkB,CAC9B,KAA4B;IAE5B,MAAM,CAAC,GAAG,KAAgC,CAAC;IAC3C,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,KAAK,KAAK,OAAO,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;QACvD,OAAO,EAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,IAAA,6CAAqB,EAAC,CAAC,CAAC,CAAC,EAAC,CAAC;IACzE,CAAC;IACD,OAAO,EAAC,MAAM,EAAE,MAAM,EAAC,CAAC;AAC5B,CAAC","sourcesContent":["import type {OpenAIStreamEventLike} from '../types';\n\nimport {getStreamErrorMessage} from './getStreamErrorMessage';\n\nexport function getStreamEndResult(\n event: OpenAIStreamEventLike,\n): {status: 'done'} | {status: 'error'; error: Error} {\n const e = event as Record<string, unknown>;\n if (e.type === 'error' || e.event === 'error' || e.error) {\n return {status: 'error', error: new Error(getStreamErrorMessage(e))};\n }\n return {status: 'done'};\n}\n"]}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { OptionsType } from '@diplodoc/transform/lib/typings';
|
|
2
|
+
import { type GenUIErrorEvent, type GenUIToolRegistry, type ToolResultEvent } from "../../../genui/index.js";
|
|
2
3
|
import type { BaseMessageProps, TAssistantMessage, TMessageContent, TMessageMetadata } from "../../../types/messages.js";
|
|
3
4
|
import { type MessageRendererRegistry } from "../../../utils/messageTypeRegistry.js";
|
|
4
5
|
import "./AssistantMessage.css";
|
|
@@ -10,6 +11,18 @@ export type AssistantMessageProps<TContent extends TMessageContent = never> = Ba
|
|
|
10
11
|
shouldParseIncompleteMarkdown?: boolean;
|
|
11
12
|
className?: string;
|
|
12
13
|
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;
|
|
13
26
|
};
|
|
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;
|
|
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;
|
|
15
28
|
export {};
|
|
@@ -3,6 +3,7 @@ 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");
|
|
6
7
|
const cn_1 = require("../../../utils/cn.js");
|
|
7
8
|
const messageTypeRegistry_1 = require("../../../utils/messageTypeRegistry.js");
|
|
8
9
|
const messageUtils_1 = require("../../../utils/messageUtils.js");
|
|
@@ -10,15 +11,54 @@ const BaseMessage_1 = require("../../molecules/BaseMessage/index.js");
|
|
|
10
11
|
const defaultMessageTypeRegistry_1 = require("./defaultMessageTypeRegistry.js");
|
|
11
12
|
require("./AssistantMessage.css");
|
|
12
13
|
const b = (0, cn_1.block)('assistant-message');
|
|
13
|
-
function AssistantMessage({ content, actions, extraInfo, timestamp, id, messageRendererRegistry, transformOptions, shouldParseIncompleteMarkdown, showActionsOnHover, showTimestamp, userRating, className, qa, onActionPopup, }) {
|
|
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]);
|
|
14
32
|
const registry = (0, react_1.useMemo)(() => {
|
|
15
33
|
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
|
+
}
|
|
16
47
|
if (messageRendererRegistry) {
|
|
17
48
|
return (0, messageTypeRegistry_1.mergeMessageRendererRegistries)(defaultRegistry, messageRendererRegistry);
|
|
18
49
|
}
|
|
19
50
|
return defaultRegistry;
|
|
20
|
-
}, [
|
|
21
|
-
|
|
51
|
+
}, [
|
|
52
|
+
messageRendererRegistry,
|
|
53
|
+
transformOptions,
|
|
54
|
+
shouldParseIncompleteMarkdown,
|
|
55
|
+
genUIRegistry,
|
|
56
|
+
onToolResult,
|
|
57
|
+
onGenUIError,
|
|
58
|
+
genUIConsumerContext,
|
|
59
|
+
id,
|
|
60
|
+
findSiblingResult,
|
|
61
|
+
]);
|
|
22
62
|
if (parts.length === 0) {
|
|
23
63
|
return null;
|
|
24
64
|
}
|
|
@@ -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":"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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,5 +1,6 @@
|
|
|
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";
|
|
3
4
|
import { ChatStatus } from "../../../types/index.js";
|
|
4
5
|
import type { DefaultMessageAction, MessageExtraInfoComponent, TAssistantMessage, TChatMessage, TMessageContent, TMessageMetadata, TUserMessage } from "../../../types/messages.js";
|
|
5
6
|
import { type MessageRendererRegistry } from "../../../utils/messageTypeRegistry.js";
|
|
@@ -50,5 +51,16 @@ export type MessageListProps<TContent extends TMessageContent = never> = {
|
|
|
50
51
|
ratingBlockProps?: RatingBlockProps;
|
|
51
52
|
/** Action popup configuration - applies to all action popups */
|
|
52
53
|
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;
|
|
53
65
|
};
|
|
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;
|
|
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;
|
|
@@ -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, genUIRegistry, onToolResult, onGenUIError, genUIConsumerContext, }) {
|
|
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) }, 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), genUIRegistry: genUIRegistry, onToolResult: onToolResult, onGenUIError: onGenUIError, genUIConsumerContext: genUIConsumerContext }, 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 {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"]}
|
|
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"]}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { JSONSchema7 } from 'json-schema';
|
|
2
|
+
import type { GenUIToolRegistry } from "./types.js";
|
|
3
|
+
export type GenUIToolCatalogEntry = {
|
|
4
|
+
name: string;
|
|
5
|
+
description?: string;
|
|
6
|
+
/** May be `undefined` when a Zod schema lacks a JSON Schema converter. */
|
|
7
|
+
parameters?: JSONSchema7;
|
|
8
|
+
};
|
|
9
|
+
export type GenUIToolCatalog = {
|
|
10
|
+
tools: GenUIToolCatalogEntry[];
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Produce a JSON-Schema catalog of the registered tools, suitable for sending
|
|
14
|
+
* to a model's tools API or rendering a debug panel.
|
|
15
|
+
*
|
|
16
|
+
* Zod schemas without a JSON Schema converter (older Zod) emit an entry with
|
|
17
|
+
* no `parameters` field — consumers can provide a JSON Schema override at
|
|
18
|
+
* registration time if they need full fidelity.
|
|
19
|
+
*/
|
|
20
|
+
export declare function describeGenUIRegistry(registry: GenUIToolRegistry): GenUIToolCatalog;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.describeGenUIRegistry = describeGenUIRegistry;
|
|
4
|
+
/**
|
|
5
|
+
* Produce a JSON-Schema catalog of the registered tools, suitable for sending
|
|
6
|
+
* to a model's tools API or rendering a debug panel.
|
|
7
|
+
*
|
|
8
|
+
* Zod schemas without a JSON Schema converter (older Zod) emit an entry with
|
|
9
|
+
* no `parameters` field — consumers can provide a JSON Schema override at
|
|
10
|
+
* registration time if they need full fidelity.
|
|
11
|
+
*/
|
|
12
|
+
function describeGenUIRegistry(registry) {
|
|
13
|
+
return {
|
|
14
|
+
tools: Object.values(registry).map((tool) => ({
|
|
15
|
+
name: tool.name,
|
|
16
|
+
description: tool.description,
|
|
17
|
+
parameters: tool.schema.toJSONSchema(),
|
|
18
|
+
})),
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=describeRegistry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"describeRegistry.js","sourceRoot":"../../../src","sources":["genui/describeRegistry.ts"],"names":[],"mappings":";;AAuBA,sDAQC;AAhBD;;;;;;;GAOG;AACH,SAAgB,qBAAqB,CAAC,QAA2B;IAC7D,OAAO;QACH,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC1C,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;SACzC,CAAC,CAAC;KACN,CAAC;AACN,CAAC","sourcesContent":["import type {JSONSchema7} from 'json-schema';\n\nimport type {GenUIToolRegistry} from './types';\n\nexport type GenUIToolCatalogEntry = {\n name: string;\n description?: string;\n /** May be `undefined` when a Zod schema lacks a JSON Schema converter. */\n parameters?: JSONSchema7;\n};\n\nexport type GenUIToolCatalog = {\n tools: GenUIToolCatalogEntry[];\n};\n\n/**\n * Produce a JSON-Schema catalog of the registered tools, suitable for sending\n * to a model's tools API or rendering a debug panel.\n *\n * Zod schemas without a JSON Schema converter (older Zod) emit an entry with\n * no `parameters` field — consumers can provide a JSON Schema override at\n * registration time if they need full fidelity.\n */\nexport function describeGenUIRegistry(registry: GenUIToolRegistry): GenUIToolCatalog {\n return {\n tools: Object.values(registry).map((tool) => ({\n name: tool.name,\n description: tool.description,\n parameters: tool.schema.toJSONSchema(),\n })),\n };\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type { GenUIComponentProps, GenUIContext, GenUIError, GenUIErrorEvent, GenUIErrorProps, GenUILoadingProps, GenUITool, GenUIToolRegistry, ToolResultEvent, } from "./types.js";
|
|
2
|
+
export { createGenUIToolRegistry, getGenUITool, mergeGenUIToolRegistries, registerGenUITool, type GenUIToolDefinition, } from "./registry.js";
|
|
3
|
+
export { normalizeSchema, validateArgs, type ArgsSchema, type SchemaResult, type SchemaSuccess, type SchemaFailure, } from "./schema.js";
|
|
4
|
+
export { describeGenUIRegistry, type GenUIToolCatalog, type GenUIToolCatalogEntry, } from "./describeRegistry.js";
|
|
5
|
+
export { createToolCallRenderer, type ToolCallRendererOptions } from "./renderers/ToolCallRenderer.js";
|
|
6
|
+
export { createToolResultRenderer } from "./renderers/ToolResultRenderer.js";
|
|
7
|
+
export { DefaultErrorSlot } from "./renderers/DefaultErrorSlot.js";
|
|
8
|
+
export { DefaultLoadingSkeleton } from "./renderers/DefaultLoadingSkeleton.js";
|
|
9
|
+
export { ToolPartErrorBoundary } from "./renderers/ToolPartErrorBoundary.js";
|
|
10
|
+
export { UnknownToolFallback } from "./renderers/UnknownToolFallback.js";
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UnknownToolFallback = exports.ToolPartErrorBoundary = exports.DefaultLoadingSkeleton = exports.DefaultErrorSlot = exports.createToolResultRenderer = exports.createToolCallRenderer = exports.describeGenUIRegistry = exports.validateArgs = exports.normalizeSchema = exports.registerGenUITool = exports.mergeGenUIToolRegistries = exports.getGenUITool = exports.createGenUIToolRegistry = void 0;
|
|
4
|
+
// Registry
|
|
5
|
+
var registry_1 = require("./registry.js");
|
|
6
|
+
Object.defineProperty(exports, "createGenUIToolRegistry", { enumerable: true, get: function () { return registry_1.createGenUIToolRegistry; } });
|
|
7
|
+
Object.defineProperty(exports, "getGenUITool", { enumerable: true, get: function () { return registry_1.getGenUITool; } });
|
|
8
|
+
Object.defineProperty(exports, "mergeGenUIToolRegistries", { enumerable: true, get: function () { return registry_1.mergeGenUIToolRegistries; } });
|
|
9
|
+
Object.defineProperty(exports, "registerGenUITool", { enumerable: true, get: function () { return registry_1.registerGenUITool; } });
|
|
10
|
+
// Schema
|
|
11
|
+
var schema_1 = require("./schema.js");
|
|
12
|
+
Object.defineProperty(exports, "normalizeSchema", { enumerable: true, get: function () { return schema_1.normalizeSchema; } });
|
|
13
|
+
Object.defineProperty(exports, "validateArgs", { enumerable: true, get: function () { return schema_1.validateArgs; } });
|
|
14
|
+
// Catalog
|
|
15
|
+
var describeRegistry_1 = require("./describeRegistry.js");
|
|
16
|
+
Object.defineProperty(exports, "describeGenUIRegistry", { enumerable: true, get: function () { return describeRegistry_1.describeGenUIRegistry; } });
|
|
17
|
+
// Renderers
|
|
18
|
+
var ToolCallRenderer_1 = require("./renderers/ToolCallRenderer.js");
|
|
19
|
+
Object.defineProperty(exports, "createToolCallRenderer", { enumerable: true, get: function () { return ToolCallRenderer_1.createToolCallRenderer; } });
|
|
20
|
+
var ToolResultRenderer_1 = require("./renderers/ToolResultRenderer.js");
|
|
21
|
+
Object.defineProperty(exports, "createToolResultRenderer", { enumerable: true, get: function () { return ToolResultRenderer_1.createToolResultRenderer; } });
|
|
22
|
+
var DefaultErrorSlot_1 = require("./renderers/DefaultErrorSlot.js");
|
|
23
|
+
Object.defineProperty(exports, "DefaultErrorSlot", { enumerable: true, get: function () { return DefaultErrorSlot_1.DefaultErrorSlot; } });
|
|
24
|
+
var DefaultLoadingSkeleton_1 = require("./renderers/DefaultLoadingSkeleton.js");
|
|
25
|
+
Object.defineProperty(exports, "DefaultLoadingSkeleton", { enumerable: true, get: function () { return DefaultLoadingSkeleton_1.DefaultLoadingSkeleton; } });
|
|
26
|
+
var ToolPartErrorBoundary_1 = require("./renderers/ToolPartErrorBoundary.js");
|
|
27
|
+
Object.defineProperty(exports, "ToolPartErrorBoundary", { enumerable: true, get: function () { return ToolPartErrorBoundary_1.ToolPartErrorBoundary; } });
|
|
28
|
+
var UnknownToolFallback_1 = require("./renderers/UnknownToolFallback.js");
|
|
29
|
+
Object.defineProperty(exports, "UnknownToolFallback", { enumerable: true, get: function () { return UnknownToolFallback_1.UnknownToolFallback; } });
|
|
30
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"../../../src","sources":["genui/index.ts"],"names":[],"mappings":";;;AAaA,WAAW;AACX,0CAMoB;AALhB,mHAAA,uBAAuB,OAAA;AACvB,wGAAA,YAAY,OAAA;AACZ,oHAAA,wBAAwB,OAAA;AACxB,6GAAA,iBAAiB,OAAA;AAIrB,SAAS;AACT,sCAOkB;AANd,yGAAA,eAAe,OAAA;AACf,sGAAA,YAAY,OAAA;AAOhB,UAAU;AACV,0DAI4B;AAHxB,yHAAA,qBAAqB,OAAA;AAKzB,YAAY;AACZ,oEAAkG;AAA1F,0HAAA,sBAAsB,OAAA;AAC9B,wEAAwE;AAAhE,8HAAA,wBAAwB,OAAA;AAChC,oEAA8D;AAAtD,oHAAA,gBAAgB,OAAA;AACxB,gFAA0E;AAAlE,gIAAA,sBAAsB,OAAA;AAC9B,8EAAwE;AAAhE,8HAAA,qBAAqB,OAAA;AAC7B,0EAAoE;AAA5D,0HAAA,mBAAmB,OAAA","sourcesContent":["// Types\nexport type {\n GenUIComponentProps,\n GenUIContext,\n GenUIError,\n GenUIErrorEvent,\n GenUIErrorProps,\n GenUILoadingProps,\n GenUITool,\n GenUIToolRegistry,\n ToolResultEvent,\n} from './types';\n\n// Registry\nexport {\n createGenUIToolRegistry,\n getGenUITool,\n mergeGenUIToolRegistries,\n registerGenUITool,\n type GenUIToolDefinition,\n} from './registry';\n\n// Schema\nexport {\n normalizeSchema,\n validateArgs,\n type ArgsSchema,\n type SchemaResult,\n type SchemaSuccess,\n type SchemaFailure,\n} from './schema';\n\n// Catalog\nexport {\n describeGenUIRegistry,\n type GenUIToolCatalog,\n type GenUIToolCatalogEntry,\n} from './describeRegistry';\n\n// Renderers\nexport {createToolCallRenderer, type ToolCallRendererOptions} from './renderers/ToolCallRenderer';\nexport {createToolResultRenderer} from './renderers/ToolResultRenderer';\nexport {DefaultErrorSlot} from './renderers/DefaultErrorSlot';\nexport {DefaultLoadingSkeleton} from './renderers/DefaultLoadingSkeleton';\nexport {ToolPartErrorBoundary} from './renderers/ToolPartErrorBoundary';\nexport {UnknownToolFallback} from './renderers/UnknownToolFallback';\n"]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type React from 'react';
|
|
2
|
+
import type { JSONSchema7 } from 'json-schema';
|
|
3
|
+
import { type ArgsSchema } from "./schema.js";
|
|
4
|
+
import type { GenUIComponentProps, GenUIErrorProps, GenUILoadingProps, GenUITool, GenUIToolRegistry } from "./types.js";
|
|
5
|
+
type ZodLike<T = any> = {
|
|
6
|
+
readonly _def?: unknown;
|
|
7
|
+
safeParse: (input: unknown) => {
|
|
8
|
+
success: true;
|
|
9
|
+
data: T;
|
|
10
|
+
} | {
|
|
11
|
+
success: false;
|
|
12
|
+
error: {
|
|
13
|
+
issues: unknown[];
|
|
14
|
+
message: string;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
/** Shape accepted by {@link registerGenUITool}. Schema is denormalized on entry. */
|
|
19
|
+
export type GenUIToolDefinition<TArgs, TResult> = {
|
|
20
|
+
name: string;
|
|
21
|
+
description?: string;
|
|
22
|
+
schema: ArgsSchema<TArgs> | ZodLike<TArgs> | JSONSchema7;
|
|
23
|
+
component: React.ComponentType<GenUIComponentProps<TArgs, TResult>>;
|
|
24
|
+
loading?: React.ComponentType<GenUILoadingProps>;
|
|
25
|
+
error?: React.ComponentType<GenUIErrorProps>;
|
|
26
|
+
};
|
|
27
|
+
/** Create an empty registry. Mirrors `createMessageRendererRegistry`. */
|
|
28
|
+
export declare function createGenUIToolRegistry(): GenUIToolRegistry;
|
|
29
|
+
/**
|
|
30
|
+
* Register a single tool. Returns the same registry instance for chaining.
|
|
31
|
+
*
|
|
32
|
+
* The schema is normalized once at registration so per-render validation is cheap.
|
|
33
|
+
* Re-registering the same `name` overwrites the previous entry.
|
|
34
|
+
*/
|
|
35
|
+
export declare function registerGenUITool<TArgs, TResult>(registry: GenUIToolRegistry, definition: GenUIToolDefinition<TArgs, TResult>): GenUIToolRegistry;
|
|
36
|
+
/**
|
|
37
|
+
* Shallow-merge any number of registries into a new registry. Later entries
|
|
38
|
+
* take precedence — same conflict policy as `mergeMessageRendererRegistries`.
|
|
39
|
+
*/
|
|
40
|
+
export declare function mergeGenUIToolRegistries(...registries: GenUIToolRegistry[]): GenUIToolRegistry;
|
|
41
|
+
/** Lookup a tool by name. Returns `undefined` for unknown names (F3). */
|
|
42
|
+
export declare function getGenUITool(registry: GenUIToolRegistry, name: string): GenUITool | undefined;
|
|
43
|
+
export {};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createGenUIToolRegistry = createGenUIToolRegistry;
|
|
4
|
+
exports.registerGenUITool = registerGenUITool;
|
|
5
|
+
exports.mergeGenUIToolRegistries = mergeGenUIToolRegistries;
|
|
6
|
+
exports.getGenUITool = getGenUITool;
|
|
7
|
+
const schema_1 = require("./schema.js");
|
|
8
|
+
/** Create an empty registry. Mirrors `createMessageRendererRegistry`. */
|
|
9
|
+
function createGenUIToolRegistry() {
|
|
10
|
+
return {};
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Register a single tool. Returns the same registry instance for chaining.
|
|
14
|
+
*
|
|
15
|
+
* The schema is normalized once at registration so per-render validation is cheap.
|
|
16
|
+
* Re-registering the same `name` overwrites the previous entry.
|
|
17
|
+
*/
|
|
18
|
+
function registerGenUITool(registry, definition) {
|
|
19
|
+
const normalized = {
|
|
20
|
+
name: definition.name,
|
|
21
|
+
description: definition.description,
|
|
22
|
+
schema: (0, schema_1.normalizeSchema)(definition.schema),
|
|
23
|
+
component: definition.component,
|
|
24
|
+
loading: definition.loading,
|
|
25
|
+
error: definition.error,
|
|
26
|
+
};
|
|
27
|
+
Object.assign(registry, { [definition.name]: normalized });
|
|
28
|
+
return registry;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Shallow-merge any number of registries into a new registry. Later entries
|
|
32
|
+
* take precedence — same conflict policy as `mergeMessageRendererRegistries`.
|
|
33
|
+
*/
|
|
34
|
+
function mergeGenUIToolRegistries(...registries) {
|
|
35
|
+
return Object.assign({}, ...registries);
|
|
36
|
+
}
|
|
37
|
+
/** Lookup a tool by name. Returns `undefined` for unknown names (F3). */
|
|
38
|
+
function getGenUITool(registry, name) {
|
|
39
|
+
return registry[name];
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"../../../src","sources":["genui/registry.ts"],"names":[],"mappings":";;AAgCA,0DAEC;AAQD,8CAcC;AAMD,4DAEC;AAGD,oCAEC;AAjED,wCAA0D;AA2B1D,yEAAyE;AACzE,SAAgB,uBAAuB;IACnC,OAAO,EAAE,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,SAAgB,iBAAiB,CAC7B,QAA2B,EAC3B,UAA+C;IAE/C,MAAM,UAAU,GAA8B;QAC1C,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,MAAM,EAAE,IAAA,wBAAe,EAAQ,UAAU,CAAC,MAA2B,CAAC;QACtE,SAAS,EAAE,UAAU,CAAC,SAAS;QAC/B,OAAO,EAAE,UAAU,CAAC,OAAO;QAC3B,KAAK,EAAE,UAAU,CAAC,KAAK;KAC1B,CAAC;IACF,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,UAAU,EAAC,CAAC,CAAC;IACzD,OAAO,QAAQ,CAAC;AACpB,CAAC;AAED;;;GAGG;AACH,SAAgB,wBAAwB,CAAC,GAAG,UAA+B;IACvE,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,UAAU,CAAC,CAAC;AAC5C,CAAC;AAED,yEAAyE;AACzE,SAAgB,YAAY,CAAC,QAA2B,EAAE,IAAY;IAClE,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC","sourcesContent":["import type React from 'react';\n\nimport type {JSONSchema7} from 'json-schema';\n\nimport {type ArgsSchema, normalizeSchema} from './schema';\nimport type {\n GenUIComponentProps,\n GenUIErrorProps,\n GenUILoadingProps,\n GenUITool,\n GenUIToolRegistry,\n} from './types';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ZodLike<T = any> = {\n readonly _def?: unknown;\n safeParse: (\n input: unknown,\n ) => {success: true; data: T} | {success: false; error: {issues: unknown[]; message: string}};\n};\n\n/** Shape accepted by {@link registerGenUITool}. Schema is denormalized on entry. */\nexport type GenUIToolDefinition<TArgs, TResult> = {\n name: string;\n description?: string;\n schema: ArgsSchema<TArgs> | ZodLike<TArgs> | JSONSchema7;\n component: React.ComponentType<GenUIComponentProps<TArgs, TResult>>;\n loading?: React.ComponentType<GenUILoadingProps>;\n error?: React.ComponentType<GenUIErrorProps>;\n};\n\n/** Create an empty registry. Mirrors `createMessageRendererRegistry`. */\nexport function createGenUIToolRegistry(): GenUIToolRegistry {\n return {};\n}\n\n/**\n * Register a single tool. Returns the same registry instance for chaining.\n *\n * The schema is normalized once at registration so per-render validation is cheap.\n * Re-registering the same `name` overwrites the previous entry.\n */\nexport function registerGenUITool<TArgs, TResult>(\n registry: GenUIToolRegistry,\n definition: GenUIToolDefinition<TArgs, TResult>,\n): GenUIToolRegistry {\n const normalized: GenUITool<TArgs, TResult> = {\n name: definition.name,\n description: definition.description,\n schema: normalizeSchema<TArgs>(definition.schema as ArgsSchema<TArgs>),\n component: definition.component,\n loading: definition.loading,\n error: definition.error,\n };\n Object.assign(registry, {[definition.name]: normalized});\n return registry;\n}\n\n/**\n * Shallow-merge any number of registries into a new registry. Later entries\n * take precedence — same conflict policy as `mergeMessageRendererRegistries`.\n */\nexport function mergeGenUIToolRegistries(...registries: GenUIToolRegistry[]): GenUIToolRegistry {\n return Object.assign({}, ...registries);\n}\n\n/** Lookup a tool by name. Returns `undefined` for unknown names (F3). */\nexport function getGenUITool(registry: GenUIToolRegistry, name: string): GenUITool | undefined {\n return registry[name];\n}\n"]}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { GenUIErrorProps } from "../types.js";
|
|
2
|
+
import "./DefaultErrorSlot.css";
|
|
3
|
+
/**
|
|
4
|
+
* Default error rendering used when a tool does not supply its own `error` slot.
|
|
5
|
+
* Renders a compact inline block — components keep ownership of richer error UIs.
|
|
6
|
+
*/
|
|
7
|
+
export declare function DefaultErrorSlot({ error, context }: GenUIErrorProps): import("react/jsx-runtime").JSX.Element;
|