@turingfocus/chat-ui-antd 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/LICENSE +21 -0
  2. package/dist/ask-user-interaction.d.ts +23 -0
  3. package/dist/ask-user-interaction.d.ts.map +1 -0
  4. package/dist/ask-user-interaction.js +116 -0
  5. package/dist/ask-user-interaction.js.map +1 -0
  6. package/dist/chat-composer.d.ts +13 -0
  7. package/dist/chat-composer.d.ts.map +1 -0
  8. package/dist/chat-composer.js +58 -0
  9. package/dist/chat-composer.js.map +1 -0
  10. package/dist/chat-conversation-view.d.ts +19 -0
  11. package/dist/chat-conversation-view.d.ts.map +1 -0
  12. package/dist/chat-conversation-view.js +71 -0
  13. package/dist/chat-conversation-view.js.map +1 -0
  14. package/dist/chat-run-status.d.ts +13 -0
  15. package/dist/chat-run-status.d.ts.map +1 -0
  16. package/dist/chat-run-status.js +59 -0
  17. package/dist/chat-run-status.js.map +1 -0
  18. package/dist/chat-state-view.d.ts +14 -0
  19. package/dist/chat-state-view.d.ts.map +1 -0
  20. package/dist/chat-state-view.js +59 -0
  21. package/dist/chat-state-view.js.map +1 -0
  22. package/dist/chat-timeline.d.ts +17 -0
  23. package/dist/chat-timeline.d.ts.map +1 -0
  24. package/dist/chat-timeline.js +79 -0
  25. package/dist/chat-timeline.js.map +1 -0
  26. package/dist/chat-ui-shell.d.ts +22 -0
  27. package/dist/chat-ui-shell.d.ts.map +1 -0
  28. package/dist/chat-ui-shell.js +41 -0
  29. package/dist/chat-ui-shell.js.map +1 -0
  30. package/dist/conversation-list.d.ts +21 -0
  31. package/dist/conversation-list.d.ts.map +1 -0
  32. package/dist/conversation-list.js +75 -0
  33. package/dist/conversation-list.js.map +1 -0
  34. package/dist/index.d.ts +13 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +12 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/labels.d.ts +4 -0
  39. package/dist/labels.d.ts.map +1 -0
  40. package/dist/labels.js +37 -0
  41. package/dist/labels.js.map +1 -0
  42. package/dist/markdown-content.d.ts +10 -0
  43. package/dist/markdown-content.d.ts.map +1 -0
  44. package/dist/markdown-content.js +20 -0
  45. package/dist/markdown-content.js.map +1 -0
  46. package/dist/renderer-registry.d.ts +33 -0
  47. package/dist/renderer-registry.d.ts.map +1 -0
  48. package/dist/renderer-registry.js +191 -0
  49. package/dist/renderer-registry.js.map +1 -0
  50. package/dist/timeline-tail-tracker.d.ts +21 -0
  51. package/dist/timeline-tail-tracker.d.ts.map +1 -0
  52. package/dist/timeline-tail-tracker.js +36 -0
  53. package/dist/timeline-tail-tracker.js.map +1 -0
  54. package/dist/types.d.ts +78 -0
  55. package/dist/types.d.ts.map +1 -0
  56. package/dist/types.js +2 -0
  57. package/dist/types.js.map +1 -0
  58. package/dist/use-chat-command-coordinator.d.ts +31 -0
  59. package/dist/use-chat-command-coordinator.d.ts.map +1 -0
  60. package/dist/use-chat-command-coordinator.js +303 -0
  61. package/dist/use-chat-command-coordinator.js.map +1 -0
  62. package/package.json +47 -0
@@ -0,0 +1,79 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Button, Empty, Typography, theme } from "antd";
3
+ import { memo, useCallback, useEffect, useMemo, useRef, useState, } from "react";
4
+ import { Virtuoso } from "react-virtuoso";
5
+ import { getTimelineItemKey, } from "@turingfocus/chat-protocol";
6
+ import { resolveChatUiLabels } from "./labels.js";
7
+ import { ChatTimelineItem, createChatRendererRegistry, formatChatTimestampUtc, } from "./renderer-registry.js";
8
+ import { advanceTimelineTailState, createTimelineTailState, } from "./timeline-tail-tracker.js";
9
+ const MemoizedTimelineItem = memo(ChatTimelineItem);
10
+ const followNewOutput = (atBottom) => atBottom ? "auto" : false;
11
+ export const ChatTimeline = ({ "aria-label": ariaLabel, className, conversationId, formatTimestamp = formatChatTimestampUtc, items, labels: labelOverrides, onRendererError, renderers, style, }) => {
12
+ const { token } = theme.useToken();
13
+ const labels = resolveChatUiLabels(labelOverrides);
14
+ const registry = useMemo(() => createChatRendererRegistry(renderers), [renderers]);
15
+ const virtuosoRef = useRef(null);
16
+ const atBottomRef = useRef(true);
17
+ const tailStateRef = useRef(null);
18
+ tailStateRef.current ??= createTimelineTailState(conversationId, items);
19
+ const [newItemCount, setNewItemCount] = useState(0);
20
+ useEffect(() => {
21
+ const previous = tailStateRef.current;
22
+ const transition = advanceTimelineTailState(previous, conversationId, items);
23
+ if (previous.conversationId !== conversationId) {
24
+ atBottomRef.current = true;
25
+ setNewItemCount(0);
26
+ }
27
+ else if (!atBottomRef.current && transition.addedAfterTail > 0) {
28
+ setNewItemCount((current) => current + transition.addedAfterTail);
29
+ }
30
+ tailStateRef.current = transition.state;
31
+ }, [conversationId, items]);
32
+ const handleAtBottomChange = useCallback((atBottom) => {
33
+ atBottomRef.current = atBottom;
34
+ if (atBottom)
35
+ setNewItemCount(0);
36
+ }, []);
37
+ const jumpToLatest = useCallback(() => {
38
+ if (items.length === 0)
39
+ return;
40
+ virtuosoRef.current?.scrollToIndex({
41
+ align: "end",
42
+ behavior: "smooth",
43
+ index: items.length - 1,
44
+ });
45
+ setNewItemCount(0);
46
+ }, [items.length]);
47
+ const renderItem = useCallback((_index, item) => (_jsx("div", { role: "article", style: { padding: `${token.paddingXXS}px ${token.paddingSM}px` }, children: _jsx(MemoizedTimelineItem, { formatTimestamp: formatTimestamp, item: item, onRendererError: onRendererError, registry: registry }) })), [
48
+ formatTimestamp,
49
+ onRendererError,
50
+ registry,
51
+ token.paddingSM,
52
+ token.paddingXXS,
53
+ ]);
54
+ if (items.length === 0) {
55
+ return (_jsx("div", { "aria-label": ariaLabel ?? labels.timelineLabel, className: className, role: "log", style: {
56
+ alignItems: "center",
57
+ display: "flex",
58
+ height: "100%",
59
+ justifyContent: "center",
60
+ minHeight: 240,
61
+ ...style,
62
+ }, children: _jsx(Empty, { description: labels.emptyTimeline }) }));
63
+ }
64
+ return (_jsxs("div", { className: className, style: {
65
+ height: "100%",
66
+ minHeight: 240,
67
+ overflow: "hidden",
68
+ position: "relative",
69
+ ...style,
70
+ }, children: [_jsx(Virtuoso, { ref: virtuosoRef, "aria-label": ariaLabel ?? labels.timelineLabel, atBottomStateChange: handleAtBottomChange, atBottomThreshold: 150, computeItemKey: (_index, item) => getTimelineItemKey(item), data: items, followOutput: followNewOutput, increaseViewportBy: { bottom: 400, top: 200 }, initialItemCount: Math.min(items.length, 20), initialTopMostItemIndex: Math.max(0, items.length - Math.min(items.length, 20)), itemContent: renderItem, overscan: { main: 300, reverse: 200 }, role: "log", style: { height: "100%" } }, conversationId), newItemCount === 0 ? null : (_jsx(Button, { onClick: jumpToLatest, size: "small", style: {
71
+ bottom: token.marginSM,
72
+ boxShadow: token.boxShadowSecondary,
73
+ left: "50%",
74
+ position: "absolute",
75
+ transform: "translateX(-50%)",
76
+ zIndex: 1,
77
+ }, type: "primary", children: _jsxs(Typography.Text, { style: { color: "inherit" }, children: [newItemCount, " ", labels.newMessages, " \u00B7 ", labels.jumpToLatest] }) }))] }));
78
+ };
79
+ //# sourceMappingURL=chat-timeline.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-timeline.js","sourceRoot":"","sources":["../src/chat-timeline.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { CSSProperties, ReactNode } from "react";
2
+ import { type ConversationListError } from "./conversation-list.js";
3
+ import type { ChatContentState, ChatConversationListItem, ChatUiLabelOverrides, ChatUiSlotStyles } from "./types.js";
4
+ export interface ChatUiShellProps {
5
+ readonly children?: ReactNode;
6
+ readonly className?: string | undefined;
7
+ readonly contentState: ChatContentState;
8
+ readonly conversationListError?: ConversationListError | undefined;
9
+ readonly conversationListLoading?: boolean | undefined;
10
+ readonly conversations: readonly ChatConversationListItem[];
11
+ readonly formatConversationUpdatedAt?: ((updatedAt: number, item: ChatConversationListItem) => string) | undefined;
12
+ readonly header?: ReactNode;
13
+ readonly labels?: ChatUiLabelOverrides | undefined;
14
+ readonly onConversationSelect: (conversationId: string) => void;
15
+ readonly pendingConversationId?: string | undefined;
16
+ readonly selectedConversationId?: string | undefined;
17
+ readonly sidebarTitle?: ReactNode;
18
+ readonly sidebarWidth?: CSSProperties["width"] | undefined;
19
+ readonly styles?: ChatUiSlotStyles | undefined;
20
+ }
21
+ export declare const ChatUiShell: ({ children, className, contentState, conversationListError, conversationListLoading, conversations, formatConversationUpdatedAt, header, labels: labelOverrides, onConversationSelect, pendingConversationId, selectedConversationId, sidebarTitle, sidebarWidth, styles, }: ChatUiShellProps) => import("react").JSX.Element;
22
+ //# sourceMappingURL=chat-ui-shell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-ui-shell.d.ts","sourceRoot":"","sources":["../src/chat-ui-shell.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAEtD,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,wBAAwB,CAAC;AAGhC,OAAO,KAAK,EACV,gBAAgB,EAChB,wBAAwB,EACxB,oBAAoB,EACpB,gBAAgB,EACjB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,YAAY,EAAE,gBAAgB,CAAC;IACxC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;IACnE,QAAQ,CAAC,uBAAuB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACvD,QAAQ,CAAC,aAAa,EAAE,SAAS,wBAAwB,EAAE,CAAC;IAC5D,QAAQ,CAAC,2BAA2B,CAAC,EACnC,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,wBAAwB,KAAK,MAAM,CAAC,GAAG,SAAS,CAAC;IAC9E,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;IACnD,QAAQ,CAAC,oBAAoB,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,IAAI,CAAC;IAChE,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpD,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrD,QAAQ,CAAC,YAAY,CAAC,EAAE,SAAS,CAAC;IAClC,QAAQ,CAAC,YAAY,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC;IAC3D,QAAQ,CAAC,MAAM,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;CAChD;AAED,eAAO,MAAM,WAAW,GAAI,6QAgBzB,gBAAgB,gCAsFlB,CAAC"}
@@ -0,0 +1,41 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Typography, theme } from "antd";
3
+ import { ChatConversationList, } from "./conversation-list.js";
4
+ import { resolveChatUiLabels } from "./labels.js";
5
+ import { ChatStateView } from "./chat-state-view.js";
6
+ export const ChatUiShell = ({ children, className, contentState, conversationListError, conversationListLoading, conversations, formatConversationUpdatedAt, header, labels: labelOverrides, onConversationSelect, pendingConversationId, selectedConversationId, sidebarTitle, sidebarWidth = 280, styles, }) => {
7
+ const { token } = theme.useToken();
8
+ const labels = resolveChatUiLabels(labelOverrides);
9
+ return (_jsxs("section", { className: className, style: {
10
+ background: token.colorBgContainer,
11
+ border: `${token.lineWidth}px ${token.lineType} ${token.colorBorderSecondary}`,
12
+ borderRadius: token.borderRadiusLG,
13
+ display: "grid",
14
+ gridTemplateColumns: `minmax(13rem, ${typeof sidebarWidth === "number" ? `${sidebarWidth}px` : sidebarWidth}) minmax(0, 1fr)`,
15
+ height: "100%",
16
+ minHeight: 360,
17
+ minWidth: 0,
18
+ overflow: "hidden",
19
+ ...styles?.root,
20
+ }, children: [_jsxs("aside", { "aria-label": labels.conversationListLabel, style: {
21
+ borderInlineEnd: `${token.lineWidth}px ${token.lineType} ${token.colorBorderSecondary}`,
22
+ display: "flex",
23
+ flexDirection: "column",
24
+ minHeight: 0,
25
+ minWidth: 0,
26
+ ...styles?.sidebar,
27
+ }, children: [_jsx("header", { style: {
28
+ borderBlockEnd: `${token.lineWidth}px ${token.lineType} ${token.colorBorderSecondary}`,
29
+ padding: token.paddingSM,
30
+ }, children: sidebarTitle ?? (_jsx(Typography.Title, { level: 5, style: { margin: 0 }, children: labels.conversationListLabel })) }), _jsx("div", { style: { flex: 1, minHeight: 0 }, children: _jsx(ChatConversationList, { error: conversationListError, formatUpdatedAt: formatConversationUpdatedAt, items: conversations, labels: labels, loading: conversationListLoading, onSelect: onConversationSelect, pendingConversationId: pendingConversationId, selectedConversationId: selectedConversationId, style: styles?.conversationList }) })] }), _jsxs("main", { style: {
31
+ display: "flex",
32
+ flexDirection: "column",
33
+ minHeight: 0,
34
+ minWidth: 0,
35
+ ...styles?.content,
36
+ }, children: [header === undefined ? null : (_jsx("header", { style: {
37
+ borderBlockEnd: `${token.lineWidth}px ${token.lineType} ${token.colorBorderSecondary}`,
38
+ padding: token.paddingSM,
39
+ }, children: header })), _jsx("div", { style: { flex: 1, minHeight: 0 }, children: contentState.kind === "ready" ? (children) : (_jsx(ChatStateView, { labels: labels, state: contentState })) })] })] }));
40
+ };
41
+ //# sourceMappingURL=chat-ui-shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat-ui-shell.js","sourceRoot":"","sources":["../src/chat-ui-shell.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAGzC,OAAO,EACL,oBAAoB,GAErB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AA2BrD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAC1B,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,qBAAqB,EACrB,uBAAuB,EACvB,aAAa,EACb,2BAA2B,EAC3B,MAAM,EACN,MAAM,EAAE,cAAc,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,EACtB,YAAY,EACZ,YAAY,GAAG,GAAG,EAClB,MAAM,GACW,EAAE,EAAE;IACrB,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,mBAAmB,CAAC,cAAc,CAAC,CAAC;IAEnD,OAAO,CACL,mBACE,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE;YACL,UAAU,EAAE,KAAK,CAAC,gBAAgB;YAClC,MAAM,EAAE,GAAG,KAAK,CAAC,SAAS,MAAM,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,oBAAoB,EAAE;YAC9E,YAAY,EAAE,KAAK,CAAC,cAAc;YAClC,OAAO,EAAE,MAAM;YACf,mBAAmB,EAAE,iBAAiB,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,YAAY,IAAI,CAAC,CAAC,CAAC,YAAY,kBAAkB;YAC7H,MAAM,EAAE,MAAM;YACd,SAAS,EAAE,GAAG;YACd,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,QAAQ;YAClB,GAAG,MAAM,EAAE,IAAI;SAChB,aAED,+BACc,MAAM,CAAC,qBAAqB,EACxC,KAAK,EAAE;oBACL,eAAe,EAAE,GAAG,KAAK,CAAC,SAAS,MAAM,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,oBAAoB,EAAE;oBACvF,OAAO,EAAE,MAAM;oBACf,aAAa,EAAE,QAAQ;oBACvB,SAAS,EAAE,CAAC;oBACZ,QAAQ,EAAE,CAAC;oBACX,GAAG,MAAM,EAAE,OAAO;iBACnB,aAED,iBACE,KAAK,EAAE;4BACL,cAAc,EAAE,GAAG,KAAK,CAAC,SAAS,MAAM,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,oBAAoB,EAAE;4BACtF,OAAO,EAAE,KAAK,CAAC,SAAS;yBACzB,YAEA,YAAY,IAAI,CACf,KAAC,UAAU,CAAC,KAAK,IAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,YAC7C,MAAM,CAAC,qBAAqB,GACZ,CACpB,GACM,EACT,cAAK,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,YACnC,KAAC,oBAAoB,IACnB,KAAK,EAAE,qBAAqB,EAC5B,eAAe,EAAE,2BAA2B,EAC5C,KAAK,EAAE,aAAa,EACpB,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,uBAAuB,EAChC,QAAQ,EAAE,oBAAoB,EAC9B,qBAAqB,EAAE,qBAAqB,EAC5C,sBAAsB,EAAE,sBAAsB,EAC9C,KAAK,EAAE,MAAM,EAAE,gBAAgB,GAC/B,GACE,IACA,EACR,gBACE,KAAK,EAAE;oBACL,OAAO,EAAE,MAAM;oBACf,aAAa,EAAE,QAAQ;oBACvB,SAAS,EAAE,CAAC;oBACZ,QAAQ,EAAE,CAAC;oBACX,GAAG,MAAM,EAAE,OAAO;iBACnB,aAEA,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAC7B,iBACE,KAAK,EAAE;4BACL,cAAc,EAAE,GAAG,KAAK,CAAC,SAAS,MAAM,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,oBAAoB,EAAE;4BACtF,OAAO,EAAE,KAAK,CAAC,SAAS;yBACzB,YAEA,MAAM,GACA,CACV,EACD,cAAK,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,YAClC,YAAY,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,CAC/B,QAAQ,CACT,CAAC,CAAC,CAAC,CACF,KAAC,aAAa,IAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAI,CACvD,GACG,IACD,IACC,CACX,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,21 @@
1
+ import type { CSSProperties } from "react";
2
+ import type { ChatConversationListItem, ChatUiLabelOverrides } from "./types.js";
3
+ export interface ConversationListError {
4
+ readonly message: string;
5
+ readonly onRetry?: (() => void) | undefined;
6
+ }
7
+ export interface ChatConversationListProps {
8
+ readonly "aria-label"?: string | undefined;
9
+ readonly className?: string | undefined;
10
+ readonly error?: ConversationListError | undefined;
11
+ readonly formatUpdatedAt?: ((updatedAt: number, item: ChatConversationListItem) => string) | undefined;
12
+ readonly items: readonly ChatConversationListItem[];
13
+ readonly labels?: ChatUiLabelOverrides | undefined;
14
+ readonly loading?: boolean | undefined;
15
+ readonly onSelect: (conversationId: string) => void;
16
+ readonly pendingConversationId?: string | undefined;
17
+ readonly selectedConversationId?: string | undefined;
18
+ readonly style?: CSSProperties | undefined;
19
+ }
20
+ export declare const ChatConversationList: ({ "aria-label": ariaLabel, className, error, formatUpdatedAt, items, labels: labelOverrides, loading, onSelect, pendingConversationId, selectedConversationId, style, }: ChatConversationListProps) => import("react").JSX.Element;
21
+ //# sourceMappingURL=conversation-list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-list.d.ts","sourceRoot":"","sources":["../src/conversation-list.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAI3C,OAAO,KAAK,EACV,wBAAwB,EACxB,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;CAC7C;AAED,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3C,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,qBAAqB,GAAG,SAAS,CAAC;IACnD,QAAQ,CAAC,eAAe,CAAC,EACvB,CAAC,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,wBAAwB,KAAK,MAAM,CAAC,GAAG,SAAS,CAAC;IAC9E,QAAQ,CAAC,KAAK,EAAE,SAAS,wBAAwB,EAAE,CAAC;IACpD,QAAQ,CAAC,MAAM,CAAC,EAAE,oBAAoB,GAAG,SAAS,CAAC;IACnD,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,IAAI,CAAC;IACpD,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpD,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrD,QAAQ,CAAC,KAAK,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;CAC5C;AAYD,eAAO,MAAM,oBAAoB,GAAI,yKAYlC,yBAAyB,gCAiL3B,CAAC"}
@@ -0,0 +1,75 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Alert, Button, Empty, Spin, Typography, theme } from "antd";
3
+ import { Virtuoso } from "react-virtuoso";
4
+ import { resolveChatUiLabels } from "./labels.js";
5
+ const padDatePart = (value) => String(value).padStart(2, "0");
6
+ const defaultFormatUpdatedAt = (updatedAt) => {
7
+ const date = new Date(updatedAt);
8
+ return `${date.getUTCFullYear()}-${padDatePart(date.getUTCMonth() + 1)}-${padDatePart(date.getUTCDate())}`;
9
+ };
10
+ export const ChatConversationList = ({ "aria-label": ariaLabel, className, error, formatUpdatedAt = defaultFormatUpdatedAt, items, labels: labelOverrides, loading = false, onSelect, pendingConversationId, selectedConversationId, style, }) => {
11
+ const { token } = theme.useToken();
12
+ const labels = resolveChatUiLabels(labelOverrides);
13
+ if (error !== undefined) {
14
+ return (_jsx("div", { className: className, style: { padding: token.paddingSM, ...style }, children: _jsx(Alert, { action: error.onRetry === undefined ? undefined : (_jsx(Button, { onClick: error.onRetry, size: "small", children: labels.retry })), message: error.message, role: "alert", showIcon: true, type: "error" }) }));
15
+ }
16
+ if (!loading && items.length === 0) {
17
+ return (_jsx("div", { "aria-label": ariaLabel ?? labels.conversationListLabel, className: className, role: "list", style: {
18
+ alignItems: "center",
19
+ display: "flex",
20
+ height: "100%",
21
+ justifyContent: "center",
22
+ minHeight: 160,
23
+ padding: token.paddingSM,
24
+ ...style,
25
+ }, children: _jsx(Empty, { description: labels.noConversations, image: Empty.PRESENTED_IMAGE_SIMPLE }) }));
26
+ }
27
+ return (_jsxs("div", { className: className, style: {
28
+ height: "100%",
29
+ minHeight: 160,
30
+ overflow: "hidden",
31
+ position: "relative",
32
+ ...style,
33
+ }, children: [_jsx("div", { "aria-busy": loading, "aria-label": ariaLabel ?? labels.conversationListLabel, role: "list", style: { height: "100%", minHeight: 0 }, children: _jsx(Virtuoso, { computeItemKey: (_index, item) => item.id, data: items, increaseViewportBy: 200, initialItemCount: Math.min(items.length, 20), itemContent: (_index, item) => {
34
+ const selected = item.id === selectedConversationId;
35
+ const pending = item.id === pendingConversationId;
36
+ const updatedAt = item.updatedAt === undefined
37
+ ? undefined
38
+ : formatUpdatedAt(item.updatedAt, item);
39
+ return (_jsx("div", { role: "listitem", style: {
40
+ padding: `${token.paddingXXS}px ${token.paddingXS}px`,
41
+ }, children: _jsx(Button, { "aria-current": selected ? "true" : undefined, block: true, disabled: item.disabled === true || loading, loading: pending, onClick: () => {
42
+ onSelect(item.id);
43
+ }, style: {
44
+ background: selected ? token.colorPrimaryBg : undefined,
45
+ height: "auto",
46
+ minHeight: 48,
47
+ padding: `${token.paddingXS}px ${token.paddingSM}px`,
48
+ textAlign: "start",
49
+ }, type: "text", children: _jsxs("span", { style: {
50
+ alignItems: "center",
51
+ display: "flex",
52
+ gap: token.marginXS,
53
+ justifyContent: "space-between",
54
+ minWidth: 0,
55
+ width: "100%",
56
+ }, children: [_jsxs("span", { style: { minWidth: 0 }, children: [_jsx(Typography.Text, { ellipsis: true, strong: selected, style: { display: "block" }, children: item.title }), item.description === undefined ? null : (_jsx(Typography.Text, { ellipsis: true, style: {
57
+ display: "block",
58
+ fontSize: token.fontSizeSM,
59
+ }, type: "secondary", children: item.description }))] }), updatedAt === undefined ? null : (_jsx(Typography.Text, { style: {
60
+ flex: "0 0 auto",
61
+ fontSize: token.fontSizeSM,
62
+ }, type: "secondary", children: updatedAt }))] }) }) }));
63
+ }, overscan: 200, style: { height: "100%" } }) }), loading ? (_jsxs("div", { "aria-live": "polite", role: "status", style: {
64
+ alignItems: "center",
65
+ background: token.colorBgContainer,
66
+ display: "flex",
67
+ flexDirection: "column",
68
+ gap: token.marginXS,
69
+ inset: 0,
70
+ justifyContent: "center",
71
+ position: "absolute",
72
+ zIndex: 1,
73
+ }, children: [_jsx(Spin, { size: "small" }), _jsx(Typography.Text, { type: "secondary", children: labels.loadingTitle })] })) : null] }));
74
+ };
75
+ //# sourceMappingURL=conversation-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"conversation-list.js","sourceRoot":"","sources":["../src/conversation-list.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export { ChatComposer, type ChatComposerProps } from "./chat-composer.js";
2
+ export { AskUserInteractionCard, AskUserInteractionResultView, type AskUserChatAboutThisRequest, type AskUserInteractionCardProps, type AskUserInteractionResultViewProps, } from "./ask-user-interaction.js";
3
+ export { ChatConversationView, type ChatConversationViewProps, type ChatUiCommand, type ChatUiCommandFailure, } from "./chat-conversation-view.js";
4
+ export { ChatConversationList, type ChatConversationListProps, type ConversationListError, } from "./conversation-list.js";
5
+ export { ChatRunStatus, type ChatRunStatusProps } from "./chat-run-status.js";
6
+ export { ChatStateView, type ChatStateViewProps } from "./chat-state-view.js";
7
+ export { ChatTimeline, type ChatTimelineProps } from "./chat-timeline.js";
8
+ export { ChatUiShell, type ChatUiShellProps } from "./chat-ui-shell.js";
9
+ export { defaultChatUiLabels, resolveChatUiLabels } from "./labels.js";
10
+ export { ChatMessageContent, ChatTimelineItem, createChatRendererRegistry, defaultChatRendererRegistry, formatChatTimestampUtc, resolveChatRenderer, type ChatRenderer, type ChatRendererFailure, type ChatRendererKey, type ChatRendererProps, type ChatRendererRegistry, type ChatMessageContentProps, type ChatTimelineItemProps, } from "./renderer-registry.js";
11
+ export { ChatMarkdownContent, type ChatMarkdownContentProps, } from "./markdown-content.js";
12
+ export type { ChatContentState, ChatConversationListItem, ChatUiLabelOverrides, ChatUiLabels, ChatUiSlotStyles, } from "./types.js";
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EACL,sBAAsB,EACtB,4BAA4B,EAC5B,KAAK,2BAA2B,EAChC,KAAK,2BAA2B,EAChC,KAAK,iCAAiC,GACvC,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,oBAAoB,EACpB,KAAK,yBAAyB,EAC9B,KAAK,aAAa,EAClB,KAAK,oBAAoB,GAC1B,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,oBAAoB,EACpB,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,GAC3B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,0BAA0B,EAC1B,2BAA2B,EAC3B,sBAAsB,EACtB,mBAAmB,EACnB,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,uBAAuB,EAC5B,KAAK,qBAAqB,GAC3B,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,mBAAmB,EACnB,KAAK,wBAAwB,GAC9B,MAAM,uBAAuB,CAAC;AAC/B,YAAY,EACV,gBAAgB,EAChB,wBAAwB,EACxB,oBAAoB,EACpB,YAAY,EACZ,gBAAgB,GACjB,MAAM,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,12 @@
1
+ export { ChatComposer } from "./chat-composer.js";
2
+ export { AskUserInteractionCard, AskUserInteractionResultView, } from "./ask-user-interaction.js";
3
+ export { ChatConversationView, } from "./chat-conversation-view.js";
4
+ export { ChatConversationList, } from "./conversation-list.js";
5
+ export { ChatRunStatus } from "./chat-run-status.js";
6
+ export { ChatStateView } from "./chat-state-view.js";
7
+ export { ChatTimeline } from "./chat-timeline.js";
8
+ export { ChatUiShell } from "./chat-ui-shell.js";
9
+ export { defaultChatUiLabels, resolveChatUiLabels } from "./labels.js";
10
+ export { ChatMessageContent, ChatTimelineItem, createChatRendererRegistry, defaultChatRendererRegistry, formatChatTimestampUtc, resolveChatRenderer, } from "./renderer-registry.js";
11
+ export { ChatMarkdownContent, } from "./markdown-content.js";
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAA0B,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EACL,sBAAsB,EACtB,4BAA4B,GAI7B,MAAM,2BAA2B,CAAC;AACnC,OAAO,EACL,oBAAoB,GAIrB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,oBAAoB,GAGrB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,aAAa,EAA2B,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,aAAa,EAA2B,MAAM,sBAAsB,CAAC;AAC9E,OAAO,EAAE,YAAY,EAA0B,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAAE,WAAW,EAAyB,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AACvE,OAAO,EACL,kBAAkB,EAClB,gBAAgB,EAChB,0BAA0B,EAC1B,2BAA2B,EAC3B,sBAAsB,EACtB,mBAAmB,GAQpB,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,mBAAmB,GAEpB,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { ChatUiLabelOverrides, ChatUiLabels } from "./types.js";
2
+ export declare const defaultChatUiLabels: ChatUiLabels;
3
+ export declare const resolveChatUiLabels: (overrides: ChatUiLabelOverrides | undefined) => ChatUiLabels;
4
+ //# sourceMappingURL=labels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labels.d.ts","sourceRoot":"","sources":["../src/labels.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAErE,eAAO,MAAM,mBAAmB,EAAE,YAqChC,CAAC;AAEH,eAAO,MAAM,mBAAmB,GAC9B,WAAW,oBAAoB,GAAG,SAAS,KAC1C,YAA0D,CAAC"}
package/dist/labels.js ADDED
@@ -0,0 +1,37 @@
1
+ export const defaultChatUiLabels = Object.freeze({
2
+ askUserCancel: "Cancel",
3
+ askUserChatAboutThis: "Chat about this",
4
+ askUserLabel: "User input requested",
5
+ askUserRequired: "This answer is required.",
6
+ askUserSubmit: "Submit answers",
7
+ askUserSubmitting: "Submitting",
8
+ askUserUnavailable: "Interaction answers are unavailable in the current session.",
9
+ capabilityUnavailableDescription: "This chat capability is not available in the current session.",
10
+ capabilityUnavailableTitle: "Capability unavailable",
11
+ composerLabel: "Message",
12
+ composerPlaceholder: "Write a message",
13
+ conversationListLabel: "Conversations",
14
+ disconnectedDescription: "Live updates are unavailable. Check the connection and try again.",
15
+ disconnectedTitle: "Disconnected",
16
+ emptyDescription: "Select a conversation to start chatting.",
17
+ emptyTitle: "No conversation selected",
18
+ errorDescription: "The chat could not be displayed.",
19
+ errorTitle: "Something went wrong",
20
+ emptyTimeline: "No messages yet",
21
+ interrupt: "Stop",
22
+ interruptUnavailable: "Stop unavailable",
23
+ interrupting: "Stopping",
24
+ jumpToLatest: "Jump to latest",
25
+ loadingDescription: "The conversation is being prepared.",
26
+ loadingTitle: "Loading conversation",
27
+ newMessages: "new messages",
28
+ noConversations: "No conversations",
29
+ retry: "Try again",
30
+ runStatusLabel: "Run",
31
+ send: "Send",
32
+ sending: "Sending",
33
+ textSendingUnavailable: "Text sending is unavailable.",
34
+ timelineLabel: "Conversation timeline",
35
+ });
36
+ export const resolveChatUiLabels = (overrides) => ({ ...defaultChatUiLabels, ...overrides });
37
+ //# sourceMappingURL=labels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"labels.js","sourceRoot":"","sources":["../src/labels.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,mBAAmB,GAAiB,MAAM,CAAC,MAAM,CAAC;IAC7D,aAAa,EAAE,QAAQ;IACvB,oBAAoB,EAAE,iBAAiB;IACvC,YAAY,EAAE,sBAAsB;IACpC,eAAe,EAAE,0BAA0B;IAC3C,aAAa,EAAE,gBAAgB;IAC/B,iBAAiB,EAAE,YAAY;IAC/B,kBAAkB,EAChB,6DAA6D;IAC/D,gCAAgC,EAC9B,+DAA+D;IACjE,0BAA0B,EAAE,wBAAwB;IACpD,aAAa,EAAE,SAAS;IACxB,mBAAmB,EAAE,iBAAiB;IACtC,qBAAqB,EAAE,eAAe;IACtC,uBAAuB,EACrB,mEAAmE;IACrE,iBAAiB,EAAE,cAAc;IACjC,gBAAgB,EAAE,0CAA0C;IAC5D,UAAU,EAAE,0BAA0B;IACtC,gBAAgB,EAAE,kCAAkC;IACpD,UAAU,EAAE,sBAAsB;IAClC,aAAa,EAAE,iBAAiB;IAChC,SAAS,EAAE,MAAM;IACjB,oBAAoB,EAAE,kBAAkB;IACxC,YAAY,EAAE,UAAU;IACxB,YAAY,EAAE,gBAAgB;IAC9B,kBAAkB,EAAE,qCAAqC;IACzD,YAAY,EAAE,sBAAsB;IACpC,WAAW,EAAE,cAAc;IAC3B,eAAe,EAAE,kBAAkB;IACnC,KAAK,EAAE,WAAW;IAClB,cAAc,EAAE,KAAK;IACrB,IAAI,EAAE,MAAM;IACZ,OAAO,EAAE,SAAS;IAClB,sBAAsB,EAAE,8BAA8B;IACtD,aAAa,EAAE,uBAAuB;CACvC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CACjC,SAA2C,EAC7B,EAAE,CAAC,CAAC,EAAE,GAAG,mBAAmB,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC"}
@@ -0,0 +1,10 @@
1
+ import type { ReactNode } from "react";
2
+ export interface ChatMarkdownContentProps {
3
+ readonly children: string;
4
+ }
5
+ /**
6
+ * Safe Markdown content only. Message/event chrome belongs to the caller so
7
+ * content rendering can be reused without coupling author or status layout.
8
+ */
9
+ export declare const ChatMarkdownContent: ({ children, }: ChatMarkdownContentProps) => ReactNode;
10
+ //# sourceMappingURL=markdown-content.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-content.d.ts","sourceRoot":"","sources":["../src/markdown-content.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAI,eAEjC,wBAAwB,KAAG,SA8B7B,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { Typography, theme } from "antd";
3
+ import ReactMarkdown from "react-markdown";
4
+ import rehypeSanitize from "rehype-sanitize";
5
+ import remarkGfm from "remark-gfm";
6
+ /**
7
+ * Safe Markdown content only. Message/event chrome belongs to the caller so
8
+ * content rendering can be reused without coupling author or status layout.
9
+ */
10
+ export const ChatMarkdownContent = ({ children, }) => {
11
+ const { token } = theme.useToken();
12
+ return (_jsx(ReactMarkdown, { components: {
13
+ a: ({ children: linkChildren, href }) => (_jsx(Typography.Link, { href: href, rel: "noreferrer", target: "_blank", children: linkChildren })),
14
+ img: ({ alt }) => (_jsx(Typography.Text, { type: "secondary", children: alt === undefined || alt.length === 0
15
+ ? "[Image]"
16
+ : `[Image: ${alt}]` })),
17
+ p: ({ children: paragraphChildren }) => (_jsx(Typography.Paragraph, { style: { marginBottom: token.marginXS }, children: paragraphChildren })),
18
+ }, rehypePlugins: [rehypeSanitize], remarkPlugins: [remarkGfm], skipHtml: true, children: children }));
19
+ };
20
+ //# sourceMappingURL=markdown-content.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-content.js","sourceRoot":"","sources":["../src/markdown-content.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAEzC,OAAO,aAAa,MAAM,gBAAgB,CAAC;AAC3C,OAAO,cAAc,MAAM,iBAAiB,CAAC;AAC7C,OAAO,SAAS,MAAM,YAAY,CAAC;AAMnC;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,EAClC,QAAQ,GACiB,EAAa,EAAE;IACxC,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,QAAQ,EAAE,CAAC;IACnC,OAAO,CACL,KAAC,aAAa,IACZ,UAAU,EAAE;YACV,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CACvC,KAAC,UAAU,CAAC,IAAI,IAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAC,YAAY,EAAC,MAAM,EAAC,QAAQ,YAC1D,YAAY,GACG,CACnB;YACD,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,CAChB,KAAC,UAAU,CAAC,IAAI,IAAC,IAAI,EAAC,WAAW,YAC9B,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;oBACpC,CAAC,CAAC,SAAS;oBACX,CAAC,CAAC,WAAW,GAAG,GAAG,GACL,CACnB;YACD,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,iBAAiB,EAAE,EAAE,EAAE,CAAC,CACtC,KAAC,UAAU,CAAC,SAAS,IAAC,KAAK,EAAE,EAAE,YAAY,EAAE,KAAK,CAAC,QAAQ,EAAE,YAC1D,iBAAiB,GACG,CACxB;SACF,EACD,aAAa,EAAE,CAAC,cAAc,CAAC,EAC/B,aAAa,EAAE,CAAC,SAAS,CAAC,EAC1B,QAAQ,kBAEP,QAAQ,GACK,CACjB,CAAC;AACJ,CAAC,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { type ComponentType } from "react";
2
+ import type { Message, TimelineItem } from "@turingfocus/chat-protocol";
3
+ export type ChatRendererKey = "agent-event" | `agent-event:${string}` | "message" | `message:${Message["content"]["kind"]}` | "unknown-event" | `unknown-event:${string}`;
4
+ export interface ChatRendererProps {
5
+ readonly formatTimestamp: (timestamp: number) => string;
6
+ readonly item: TimelineItem;
7
+ }
8
+ export type ChatRenderer = ComponentType<ChatRendererProps>;
9
+ /**
10
+ * A `null` entry explicitly stops candidate resolution and selects the safe
11
+ * fallback. An absent entry continues to the next, more general key.
12
+ */
13
+ export type ChatRendererRegistry = Readonly<Partial<Record<ChatRendererKey, ChatRenderer | null>>>;
14
+ export interface ChatRendererFailure {
15
+ readonly error: unknown;
16
+ readonly item: TimelineItem;
17
+ }
18
+ export declare const formatChatTimestampUtc: (timestamp: number) => string;
19
+ export interface ChatMessageContentProps {
20
+ readonly message: Message;
21
+ }
22
+ export declare const ChatMessageContent: ({ message }: ChatMessageContentProps) => import("react").JSX.Element;
23
+ export declare const defaultChatRendererRegistry: ChatRendererRegistry;
24
+ export declare const createChatRendererRegistry: (overrides?: ChatRendererRegistry | undefined) => ChatRendererRegistry;
25
+ export declare const resolveChatRenderer: (registry: ChatRendererRegistry, item: TimelineItem) => ChatRenderer | undefined;
26
+ export interface ChatTimelineItemProps {
27
+ readonly formatTimestamp?: ((timestamp: number) => string) | undefined;
28
+ readonly item: TimelineItem;
29
+ readonly onRendererError?: ((failure: ChatRendererFailure) => void) | undefined;
30
+ readonly registry: ChatRendererRegistry;
31
+ }
32
+ export declare const ChatTimelineItem: ({ formatTimestamp, item, onRendererError, registry, }: ChatTimelineItemProps) => import("react").JSX.Element;
33
+ //# sourceMappingURL=renderer-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer-registry.d.ts","sourceRoot":"","sources":["../src/renderer-registry.tsx"],"names":[],"mappings":"AACA,OAAO,EAIL,KAAK,aAAa,EAEnB,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EACV,OAAO,EACP,YAAY,EAEb,MAAM,4BAA4B,CAAC;AAKpC,MAAM,MAAM,eAAe,GACvB,aAAa,GACb,eAAe,MAAM,EAAE,GACvB,SAAS,GACT,WAAW,OAAO,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,EAAE,GACvC,eAAe,GACf,iBAAiB,MAAM,EAAE,CAAC;AAE9B,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,eAAe,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC;IACxD,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;CAC7B;AAED,MAAM,MAAM,YAAY,GAAG,aAAa,CAAC,iBAAiB,CAAC,CAAC;AAC5D;;;GAGG;AACH,MAAM,MAAM,oBAAoB,GAAG,QAAQ,CACzC,OAAO,CAAC,MAAM,CAAC,eAAe,EAAE,YAAY,GAAG,IAAI,CAAC,CAAC,CACtD,CAAC;AAEF,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;CAC7B;AAED,eAAO,MAAM,sBAAsB,GAAI,WAAW,MAAM,KAAG,MAK1D,CAAC;AAgBF,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,eAAO,MAAM,kBAAkB,GAAI,aAAa,uBAAuB,gCAOpE,CAAC;AAsOJ,eAAO,MAAM,2BAA2B,EAAE,oBAKxC,CAAC;AAEH,eAAO,MAAM,0BAA0B,GACrC,YAAY,oBAAoB,GAAG,SAAS,KAC3C,oBAC8D,CAAC;AAoBlE,eAAO,MAAM,mBAAmB,GAC9B,UAAU,oBAAoB,EAC9B,MAAM,YAAY,KACjB,YAAY,GAAG,SAOjB,CAAC;AAoFF,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,CAAC,GAAG,SAAS,CAAC;IACvE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,QAAQ,CAAC,eAAe,CAAC,EACvB,CAAC,CAAC,OAAO,EAAE,mBAAmB,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACvD,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;CACzC;AAED,eAAO,MAAM,gBAAgB,GAAI,uDAK9B,qBAAqB,gCAwBvB,CAAC"}