@personai/agent-ui-chat-react 0.0.0-stage → 1.0.0-preview.2
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/LICENSE +177 -0
- package/README.md +113 -2
- package/dist/index.js +3523 -0
- package/dist/src/ChatA2UI.d.ts +7 -0
- package/dist/src/ChatGoalIndicator.d.ts +20 -0
- package/dist/src/ChatHistoryRail.d.ts +9 -0
- package/dist/src/ChatPanel.d.ts +100 -0
- package/dist/src/ChatRuntimeWindow.d.ts +71 -0
- package/dist/src/ChatUserInputCard.d.ts +7 -0
- package/dist/src/ChatUserInputGroup.d.ts +11 -0
- package/dist/src/ChatWindow.d.ts +13 -0
- package/dist/src/InteractionReceipt.d.ts +7 -0
- package/dist/src/MermaidBlock.d.ts +6 -0
- package/dist/src/ToolResultView.d.ts +5 -0
- package/dist/src/chatAttachments.d.ts +4 -0
- package/dist/src/chatHistory.d.ts +11 -0
- package/dist/src/index.d.ts +8 -0
- package/dist/styles.css +2 -0
- package/package.json +50 -4
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ChatA2uiActionHandler, ChatA2uiSession, ChatMessage } from '@personai/agent-ui-chat-core';
|
|
2
|
+
export declare function ChatA2UI({ message, onAction, runtime, disabled }: {
|
|
3
|
+
message: ChatMessage;
|
|
4
|
+
onAction?: ChatA2uiActionHandler;
|
|
5
|
+
runtime?: ChatA2uiSession;
|
|
6
|
+
disabled?: boolean;
|
|
7
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/** Display data and actions are supplied by the host; no goal backend is assumed. */
|
|
2
|
+
export interface ChatGoalIndicatorProps {
|
|
3
|
+
objective: string;
|
|
4
|
+
status: string;
|
|
5
|
+
label: string;
|
|
6
|
+
progress?: string;
|
|
7
|
+
busy?: boolean;
|
|
8
|
+
onPause?: () => void;
|
|
9
|
+
resumeDisabled?: boolean;
|
|
10
|
+
onResume?: () => void;
|
|
11
|
+
onRestart?: () => void;
|
|
12
|
+
onDelete?: () => void;
|
|
13
|
+
labels: {
|
|
14
|
+
pause: string;
|
|
15
|
+
resume: string;
|
|
16
|
+
restart: string;
|
|
17
|
+
delete: string;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export declare function ChatGoalIndicator({ objective, status, label, progress, busy, resumeDisabled, onPause, onResume, onRestart, onDelete, labels }: ChatGoalIndicatorProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { TranscriptPresentation, ChatMessage } from '@personai/agent-ui-chat-core';
|
|
2
|
+
import { RefObject } from 'react';
|
|
3
|
+
interface ChatHistoryRailProps {
|
|
4
|
+
messages: ChatMessage[];
|
|
5
|
+
transcriptRef: RefObject<HTMLElement | null>;
|
|
6
|
+
presentation: TranscriptPresentation;
|
|
7
|
+
}
|
|
8
|
+
export declare function ChatHistoryRail({ messages, transcriptRef, presentation, }: ChatHistoryRailProps): import("react").JSX.Element | null;
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { ChatGoalIndicatorProps } from './ChatGoalIndicator';
|
|
2
|
+
import { ChatAnnotationLabels, ChatAnnotation, ChatA2uiActionHandler as ActionHandler, ChatA2uiSession, ChatHistoryLabels, ChatInputSuggestion, ChatInputSuggestionLabels, ChatAguiStreamEvent, ChatAttachmentLabels, ChatDebugOptions, ChatMessage, ChatMessageAttachment, ChatQueuedSubmission, ChatRunningSubmitMode, ChatSession, ChatUserInputAnswer, ChatUserInputLabels, ChatUserInputRequest, ChatWorkRailLabels, ChatSubmitMode } from '@personai/agent-ui-chat-core';
|
|
3
|
+
import { ComposerReactProps } from '@personai/agent-ui-composer-react';
|
|
4
|
+
import { Ref, ReactNode } from 'react';
|
|
5
|
+
export interface ChatMarkdownLinkProps {
|
|
6
|
+
children?: ReactNode;
|
|
7
|
+
href?: string;
|
|
8
|
+
}
|
|
9
|
+
export type ChatMarkdownLinkRenderer = (props: ChatMarkdownLinkProps) => ReactNode;
|
|
10
|
+
export interface ChatPanelProps extends Pick<ComposerReactProps, "renderAttachmentControl" | "pendingAttachments" | "showAttachmentControl" | "attachmentUploadPending" | "onAttachFile" | "onRemoveAttachment" | "attachLabel" | "uploadingLabel" | "removeAttachmentLabel" | "editQueuedLabel" | "removeQueuedLabel" | "reorderQueuedLabel" | "steerQueuedLabel"> {
|
|
11
|
+
pendingAnnotations?: ChatAnnotation[];
|
|
12
|
+
onPendingAnnotationsChange?: (annotations: ChatAnnotation[]) => void;
|
|
13
|
+
annotationLabels?: ChatAnnotationLabels;
|
|
14
|
+
/** Show the composer before a persisted session exists. */
|
|
15
|
+
allowDraftSession?: boolean;
|
|
16
|
+
attachmentDownloader?: (attachment: ChatMessageAttachment) => Promise<Blob>;
|
|
17
|
+
attachmentLabels?: ChatAttachmentLabels;
|
|
18
|
+
autoFocusComposer?: boolean;
|
|
19
|
+
createSessionLabel?: string;
|
|
20
|
+
currentUserDisplayName?: string;
|
|
21
|
+
hideMessageIdentity?: boolean;
|
|
22
|
+
composerRef?: Ref<HTMLTextAreaElement>;
|
|
23
|
+
debugOptions?: ChatDebugOptions;
|
|
24
|
+
disabledInput?: boolean;
|
|
25
|
+
draft: string;
|
|
26
|
+
composerHeader?: ReactNode;
|
|
27
|
+
/** Host controls displayed above, outside the input surface. */
|
|
28
|
+
composerTop?: ReactNode;
|
|
29
|
+
emptyDescription?: string;
|
|
30
|
+
emptyTitle?: string;
|
|
31
|
+
footerAddon?: ReactNode;
|
|
32
|
+
goal?: ChatGoalIndicatorProps | null;
|
|
33
|
+
formatAnnotationCount?: (count: number) => string;
|
|
34
|
+
headerContent?: ReactNode;
|
|
35
|
+
inputPlaceholder?: string;
|
|
36
|
+
inputSuggestions?: ChatInputSuggestion[];
|
|
37
|
+
skillSuggestionTriggers?: Array<"$" | "/">;
|
|
38
|
+
inputSuggestionLabels?: ChatInputSuggestionLabels;
|
|
39
|
+
queuedInputPlaceholder?: string;
|
|
40
|
+
steeringInputPlaceholder?: string;
|
|
41
|
+
liveAguiAnchorMessageCodes?: Record<string, string>;
|
|
42
|
+
liveAguiEvents?: ChatAguiStreamEvent[];
|
|
43
|
+
liveAguiPendingAnchorMessageCode?: string;
|
|
44
|
+
liveAguiPending?: boolean;
|
|
45
|
+
/** Host language for tool card titles ('zh-CN' | 'en-US' | anything). */
|
|
46
|
+
locale?: string;
|
|
47
|
+
messages: ChatMessage[];
|
|
48
|
+
historyLoading?: boolean;
|
|
49
|
+
historyLoadingOlder?: boolean;
|
|
50
|
+
historyLabels?: ChatHistoryLabels;
|
|
51
|
+
onLoadOlderHistory?: () => void;
|
|
52
|
+
onCreateSession?: () => void;
|
|
53
|
+
onNewSession?: () => void;
|
|
54
|
+
onDraftChange: (value: string) => void;
|
|
55
|
+
onPasteAttachment?: (file: File) => void | Promise<void>;
|
|
56
|
+
a2uiSession?: ChatA2uiSession;
|
|
57
|
+
a2uiDisabled?: boolean;
|
|
58
|
+
onA2UIAction?: ActionHandler;
|
|
59
|
+
onEditMessage?: (content: string, message?: ChatMessage) => void;
|
|
60
|
+
onDeleteTurn?: (message: ChatMessage) => void;
|
|
61
|
+
deleteTurnLabel?: string;
|
|
62
|
+
onEditQueuedMessage?: (id: string, content: string) => void;
|
|
63
|
+
onRemoveQueuedMessage?: (id: string) => void;
|
|
64
|
+
onSteerQueuedMessage?: (id: string) => void;
|
|
65
|
+
onReorderQueuedMessage?: (sourceId: string, targetId: string) => void;
|
|
66
|
+
onSend: (mode?: ChatSubmitMode) => void;
|
|
67
|
+
onStop?: () => void;
|
|
68
|
+
protocolEvents?: ChatAguiStreamEvent[];
|
|
69
|
+
queueDisabled?: boolean;
|
|
70
|
+
queuedLabel?: string;
|
|
71
|
+
queuedMessages?: ChatQueuedSubmission[];
|
|
72
|
+
runningSubmitModes?: ChatRunningSubmitMode[];
|
|
73
|
+
runningEnterSubmitMode?: ChatRunningSubmitMode;
|
|
74
|
+
sendDisabled?: boolean;
|
|
75
|
+
sendLabel?: string;
|
|
76
|
+
sending?: boolean;
|
|
77
|
+
streamingAssistantMessageCode?: string | null;
|
|
78
|
+
session?: ChatSession | null;
|
|
79
|
+
showAgui?: boolean;
|
|
80
|
+
showReasoningCards?: boolean;
|
|
81
|
+
showHeader?: boolean;
|
|
82
|
+
/** Read-only transcripts reuse the same work rail without an input composer. */
|
|
83
|
+
showComposer?: boolean;
|
|
84
|
+
showHistoryRail?: boolean;
|
|
85
|
+
showStop?: boolean;
|
|
86
|
+
sidebarContent?: ReactNode;
|
|
87
|
+
steerDisabled?: boolean;
|
|
88
|
+
queuedSteerDisabled?: boolean;
|
|
89
|
+
stopLabel?: string;
|
|
90
|
+
title?: string;
|
|
91
|
+
userInputLabels?: ChatUserInputLabels;
|
|
92
|
+
workRailLabels?: ChatWorkRailLabels;
|
|
93
|
+
userInputRequests?: ChatUserInputRequest[];
|
|
94
|
+
userInputRequest?: ChatUserInputRequest | null;
|
|
95
|
+
userInputAnswerPending?: boolean;
|
|
96
|
+
userInputAnswerFailed?: boolean;
|
|
97
|
+
onAnswerUserInput?: (answers: ChatUserInputAnswer[]) => void;
|
|
98
|
+
renderMarkdownLink?: ChatMarkdownLinkRenderer;
|
|
99
|
+
}
|
|
100
|
+
export declare function ChatPanel({ renderAttachmentControl, pendingAttachments, showAttachmentControl, attachmentUploadPending, onAttachFile, onRemoveAttachment, attachLabel, uploadingLabel, removeAttachmentLabel, editQueuedLabel, removeQueuedLabel, reorderQueuedLabel, steerQueuedLabel, pendingAnnotations: controlledPendingAnnotations, onPendingAnnotationsChange, annotationLabels, allowDraftSession, attachmentDownloader, attachmentLabels, autoFocusComposer, createSessionLabel, currentUserDisplayName, hideMessageIdentity, composerRef, debugOptions, disabledInput, draft, composerHeader, composerTop, emptyDescription, emptyTitle, footerAddon, goal, formatAnnotationCount, headerContent, inputPlaceholder, inputSuggestions, skillSuggestionTriggers, inputSuggestionLabels, queuedInputPlaceholder, steeringInputPlaceholder, liveAguiAnchorMessageCodes, liveAguiEvents, liveAguiPendingAnchorMessageCode, liveAguiPending, locale, messages, historyLoading, historyLoadingOlder, historyLabels, onLoadOlderHistory, onCreateSession, onNewSession, onDraftChange, onPasteAttachment, a2uiSession, a2uiDisabled, onA2UIAction, onEditMessage, onDeleteTurn, deleteTurnLabel, onEditQueuedMessage, onRemoveQueuedMessage, onSteerQueuedMessage, onReorderQueuedMessage, onSend, onStop, protocolEvents, queueDisabled, queuedLabel, queuedMessages, runningSubmitModes, runningEnterSubmitMode, sendDisabled, sendLabel, sending, streamingAssistantMessageCode: activeStreamingAssistantMessageCode, session, showAgui, showReasoningCards, showHeader, showComposer, showHistoryRail, showStop, sidebarContent, steerDisabled, queuedSteerDisabled, stopLabel, title, userInputLabels, workRailLabels, userInputRequests, userInputRequest, userInputAnswerPending, userInputAnswerFailed, onAnswerUserInput, renderMarkdownLink, }: ChatPanelProps): import("react").JSX.Element;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { ComposerReactProps } from '@personai/agent-ui-composer-react';
|
|
2
|
+
import { ChatGoalIndicatorProps } from './ChatGoalIndicator';
|
|
3
|
+
import { ChatAnnotation, ChatA2uiActionHandler as ActionHandler, MessageSender, ChatFloatingState, ChatAdapter, AssistantReplyEffect, ChatAttachmentLabels, ChatMessageAttachment, ChatClientConfig, ChatDebugOptions, ChatMessage, ChatRuntimeRunState, ChatSession, SendChatMessageInput } from '@personai/agent-ui-chat-core';
|
|
4
|
+
import { Ref, ReactNode } from 'react';
|
|
5
|
+
import { ChatMarkdownLinkRenderer } from './ChatPanel';
|
|
6
|
+
interface ToastLikeCallback {
|
|
7
|
+
(message: string, title?: string): void;
|
|
8
|
+
}
|
|
9
|
+
export interface ChatRuntimeSubmitter {
|
|
10
|
+
/** Submit host-generated content through the same admission and queue as the composer. */
|
|
11
|
+
submit(input: Pick<SendChatMessageInput, "content" | "attachments">): Promise<boolean>;
|
|
12
|
+
}
|
|
13
|
+
export interface ChatRuntimeWindowProps {
|
|
14
|
+
/** Forward A2UI actions to the host transport. */
|
|
15
|
+
onA2UIAction?: ActionHandler;
|
|
16
|
+
/** Open a local composer and create its session on the first submission. */
|
|
17
|
+
allowDraftSession?: boolean;
|
|
18
|
+
agentReplyEffect?: AssistantReplyEffect;
|
|
19
|
+
agentReplySpeed?: number;
|
|
20
|
+
adapter?: ChatAdapter;
|
|
21
|
+
/** Load host-staged attachments before a session exists; also used for history. */
|
|
22
|
+
attachmentDownloader?: (attachment: ChatMessageAttachment) => Promise<Blob>;
|
|
23
|
+
attachmentLabels?: ChatAttachmentLabels;
|
|
24
|
+
autoFocusComposer?: boolean;
|
|
25
|
+
config: ChatClientConfig;
|
|
26
|
+
composerRef?: Ref<HTMLTextAreaElement>;
|
|
27
|
+
submitterRef?: Ref<ChatRuntimeSubmitter>;
|
|
28
|
+
composerHeader?: ReactNode;
|
|
29
|
+
/** Host controls displayed above, outside the input surface. */
|
|
30
|
+
composerTop?: ReactNode;
|
|
31
|
+
createSessionLabel?: string;
|
|
32
|
+
currentUserDisplayName?: string;
|
|
33
|
+
currentSender?: MessageSender;
|
|
34
|
+
draft?: string;
|
|
35
|
+
debugOptions?: ChatDebugOptions;
|
|
36
|
+
emptyDescription?: string;
|
|
37
|
+
emptyTitle?: string;
|
|
38
|
+
/** Use external feedback when the host reports admission errors through onError. */
|
|
39
|
+
errorDisplay?: "inline" | "external";
|
|
40
|
+
floatingTitle?: string;
|
|
41
|
+
floatingSubtitle?: string;
|
|
42
|
+
formatAnnotationCount?: (count: number) => string;
|
|
43
|
+
footerAddon?: ReactNode;
|
|
44
|
+
goal?: ChatGoalIndicatorProps | null;
|
|
45
|
+
headerContent?: ReactNode;
|
|
46
|
+
initialSession?: ChatSession | null;
|
|
47
|
+
onCreateSession?: () => void;
|
|
48
|
+
onDraftChange?: (draft: string) => void;
|
|
49
|
+
onError?: ToastLikeCallback;
|
|
50
|
+
confirmDeleteTurn?: (message: ChatMessage) => boolean | Promise<boolean>;
|
|
51
|
+
onInfo?: ToastLikeCallback;
|
|
52
|
+
onPendingAttachmentsChange?: (attachments: ChatMessageAttachment[]) => void;
|
|
53
|
+
/** Hosts can stage pasted files locally until the first submission. */
|
|
54
|
+
onPasteAttachment?: (file: File) => void | Promise<void>;
|
|
55
|
+
onRunStateChange?: (state: ChatRuntimeRunState) => void;
|
|
56
|
+
onSessionChange?: (session: ChatSession | null) => void;
|
|
57
|
+
pendingAnnotations?: ChatAnnotation[];
|
|
58
|
+
onPendingAnnotationsChange?: (annotations: ChatAnnotation[]) => void;
|
|
59
|
+
pendingAttachments?: ChatMessageAttachment[];
|
|
60
|
+
createSendInput?: (session: ChatSession, content: string, attachments: ChatMessageAttachment[]) => SendChatMessageInput | null;
|
|
61
|
+
renderAttachmentControl?: ComposerReactProps["renderAttachmentControl"];
|
|
62
|
+
showAttachmentControl?: boolean;
|
|
63
|
+
showHeader?: boolean;
|
|
64
|
+
showHistoryRail?: boolean;
|
|
65
|
+
sidebarContent?: ReactNode;
|
|
66
|
+
windowState?: ChatFloatingState;
|
|
67
|
+
onWindowStateChange?: (state: ChatFloatingState) => void;
|
|
68
|
+
renderMarkdownLink?: ChatMarkdownLinkRenderer;
|
|
69
|
+
}
|
|
70
|
+
export declare function ChatRuntimeWindow({ allowDraftSession, agentReplyEffect, agentReplySpeed, adapter, attachmentDownloader: hostAttachmentDownloader, attachmentLabels, autoFocusComposer, composerHeader, composerTop, config, composerRef, submitterRef, createSessionLabel, currentUserDisplayName, currentSender, draft: controlledDraft, debugOptions, emptyDescription, emptyTitle, errorDisplay, floatingSubtitle, floatingTitle, formatAnnotationCount, footerAddon, goal, headerContent, initialSession, onCreateSession, onDraftChange, onError, confirmDeleteTurn, onInfo, onPendingAttachmentsChange, onPasteAttachment, onRunStateChange, onSessionChange, pendingAnnotations: controlledPendingAnnotations, onPendingAnnotationsChange, pendingAttachments: controlledPendingAttachments, createSendInput: createSendInputOverride, renderAttachmentControl, showAttachmentControl, showHeader, showHistoryRail, sidebarContent, windowState, onWindowStateChange, onA2UIAction, renderMarkdownLink, }: ChatRuntimeWindowProps): import("react").JSX.Element;
|
|
71
|
+
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ChatUserInputAnswer, ChatUserInputLabels, ChatUserInputRequest } from '@personai/agent-ui-chat-core';
|
|
2
|
+
export declare function ChatUserInputCard({ disabled, labels, onSubmit, request }: {
|
|
3
|
+
disabled?: boolean;
|
|
4
|
+
labels?: ChatUserInputLabels;
|
|
5
|
+
onSubmit: (answers: ChatUserInputAnswer[]) => void;
|
|
6
|
+
request: ChatUserInputRequest;
|
|
7
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ChatUserInputAnswer, ChatUserInputLabels, ChatUserInputRequest } from '@personai/agent-ui-chat-core';
|
|
2
|
+
type Props = {
|
|
3
|
+
request: ChatUserInputRequest;
|
|
4
|
+
requests: ChatUserInputRequest[];
|
|
5
|
+
labels?: ChatUserInputLabels;
|
|
6
|
+
disabled?: boolean;
|
|
7
|
+
submitFailed?: boolean;
|
|
8
|
+
onSubmit: (answers: ChatUserInputAnswer[]) => void;
|
|
9
|
+
};
|
|
10
|
+
export declare function ChatUserInputGroup(props: Props): import("react").JSX.Element;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ChatFloatingState } from '@personai/agent-ui-chat-core';
|
|
2
|
+
import { ChatPanelProps } from './ChatPanel';
|
|
3
|
+
interface ChatWindowProps extends Omit<ChatPanelProps, "headerContent" | "showHeader"> {
|
|
4
|
+
state?: ChatFloatingState;
|
|
5
|
+
showNewSession?: boolean;
|
|
6
|
+
storageKey?: string;
|
|
7
|
+
title?: string;
|
|
8
|
+
titleSubtitle?: string;
|
|
9
|
+
resizeHint?: string;
|
|
10
|
+
onStateChange?: (state: ChatFloatingState) => void;
|
|
11
|
+
}
|
|
12
|
+
export declare function ChatWindow({ onStateChange, showNewSession, state, storageKey, title, titleSubtitle, resizeHint, ...panelProps }: ChatWindowProps): import("react").JSX.Element;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ChatMessage } from '@personai/agent-ui-chat-core';
|
|
2
|
+
/** A display-only receipt. The original interaction and timeline stay unchanged. */
|
|
3
|
+
export declare function InteractionReceipt({ message, actorName, hideMessageIdentity }: {
|
|
4
|
+
message: ChatMessage;
|
|
5
|
+
actorName: string;
|
|
6
|
+
hideMessageIdentity?: boolean;
|
|
7
|
+
}): import("react").JSX.Element;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { ChatMessageAttachment } from '@personai/agent-ui-chat-core';
|
|
2
|
+
export declare function matchesSupportedImageContentType(contentType: string | undefined): contentType is "image/png" | "image/jpeg" | "image/webp" | "image/gif";
|
|
3
|
+
export declare function isImageAttachment(attachment: ChatMessageAttachment): boolean;
|
|
4
|
+
export declare function useAttachmentImageSource(attachment: ChatMessageAttachment, downloadAttachment?: (attachment: ChatMessageAttachment) => Promise<Blob>): string | null;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ChatMessage, TranscriptPresentation } from '@personai/agent-ui-chat-core';
|
|
2
|
+
export interface ChatHistoryTurn {
|
|
3
|
+
assistantPreview: string;
|
|
4
|
+
hasAssistantReply: boolean;
|
|
5
|
+
hasWorkActivity: boolean;
|
|
6
|
+
id: string;
|
|
7
|
+
messageCodes: string[];
|
|
8
|
+
userMessageCode: string;
|
|
9
|
+
userPreview: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function buildChatHistoryTurns(messages: ChatMessage[], presentation: TranscriptPresentation): ChatHistoryTurn[];
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from './ChatPanel';
|
|
2
|
+
export * from './ChatGoalIndicator';
|
|
3
|
+
export * from './ChatRuntimeWindow';
|
|
4
|
+
export * from './ChatWindow';
|
|
5
|
+
export { ChatA2UI } from './ChatA2UI';
|
|
6
|
+
export { MotionProvider, AgentMotion, useMotion } from '@personai/agent-ui-motion-react';
|
|
7
|
+
export type { MotionConfig, MotionEffects, MotionPreset, ResolvedMotion } from '@personai/agent-ui-motion-react';
|
|
8
|
+
export { useComposerDisabled } from '@personai/agent-ui-composer-react';
|