@steerable/agent-ui 0.2.0 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cards/ActionSegmentCard.d.ts +18 -0
- package/dist/cards/ActionSegmentCard.d.ts.map +1 -0
- package/dist/cards/ActionSegmentCard.js +26 -0
- package/dist/cards/ActionSegmentCard.js.map +1 -0
- package/dist/cards/AnalysisDocumentCard.d.ts +33 -0
- package/dist/cards/AnalysisDocumentCard.d.ts.map +1 -0
- package/dist/cards/AnalysisDocumentCard.js +11 -0
- package/dist/cards/AnalysisDocumentCard.js.map +1 -0
- package/dist/cards/AskUserQuestionsCard.d.ts +43 -0
- package/dist/cards/AskUserQuestionsCard.d.ts.map +1 -0
- package/dist/cards/AskUserQuestionsCard.js +171 -0
- package/dist/cards/AskUserQuestionsCard.js.map +1 -0
- package/dist/cards/CoverageReportCard.d.ts +41 -0
- package/dist/cards/CoverageReportCard.d.ts.map +1 -0
- package/dist/cards/CoverageReportCard.js +55 -0
- package/dist/cards/CoverageReportCard.js.map +1 -0
- package/dist/cards/OrchestrationPlanCard.d.ts +60 -0
- package/dist/cards/OrchestrationPlanCard.d.ts.map +1 -0
- package/dist/cards/OrchestrationPlanCard.js +103 -0
- package/dist/cards/OrchestrationPlanCard.js.map +1 -0
- package/dist/cards/PlanSelectorCard.d.ts +40 -0
- package/dist/cards/PlanSelectorCard.d.ts.map +1 -0
- package/dist/cards/PlanSelectorCard.js +106 -0
- package/dist/cards/PlanSelectorCard.js.map +1 -0
- package/dist/cards/PlanStepsCard.d.ts +18 -0
- package/dist/cards/PlanStepsCard.d.ts.map +1 -0
- package/dist/cards/PlanStepsCard.js +25 -0
- package/dist/cards/PlanStepsCard.js.map +1 -0
- package/dist/cards/QuizCard.d.ts +44 -0
- package/dist/cards/QuizCard.d.ts.map +1 -0
- package/dist/cards/QuizCard.js +113 -0
- package/dist/cards/QuizCard.js.map +1 -0
- package/dist/cards/ResearchPlanCard.d.ts +23 -0
- package/dist/cards/ResearchPlanCard.d.ts.map +1 -0
- package/dist/cards/ResearchPlanCard.js +50 -0
- package/dist/cards/ResearchPlanCard.js.map +1 -0
- package/dist/cards/SearchSourcesCard.d.ts +29 -0
- package/dist/cards/SearchSourcesCard.d.ts.map +1 -0
- package/dist/cards/SearchSourcesCard.js +83 -0
- package/dist/cards/SearchSourcesCard.js.map +1 -0
- package/dist/cards/SuggestedRepliesCard.d.ts +18 -0
- package/dist/cards/SuggestedRepliesCard.d.ts.map +1 -0
- package/dist/cards/SuggestedRepliesCard.js +14 -0
- package/dist/cards/SuggestedRepliesCard.js.map +1 -0
- package/dist/cards/SummaryMessageCard.d.ts +40 -0
- package/dist/cards/SummaryMessageCard.d.ts.map +1 -0
- package/dist/cards/SummaryMessageCard.js +56 -0
- package/dist/cards/SummaryMessageCard.js.map +1 -0
- package/dist/cards/ThinkingProcessCard.d.ts +46 -0
- package/dist/cards/ThinkingProcessCard.d.ts.map +1 -0
- package/dist/cards/ThinkingProcessCard.js +79 -0
- package/dist/cards/ThinkingProcessCard.js.map +1 -0
- package/dist/cards/ToolExecutionCard.d.ts +21 -0
- package/dist/cards/ToolExecutionCard.d.ts.map +1 -0
- package/dist/cards/ToolExecutionCard.js +65 -0
- package/dist/cards/ToolExecutionCard.js.map +1 -0
- package/dist/cards/icons.d.ts +38 -0
- package/dist/cards/icons.d.ts.map +1 -0
- package/dist/cards/icons.js +87 -0
- package/dist/cards/icons.js.map +1 -0
- package/dist/cards/index.d.ts +38 -0
- package/dist/cards/index.d.ts.map +1 -0
- package/dist/cards/index.js +24 -0
- package/dist/cards/index.js.map +1 -0
- package/dist/cards/types.d.ts +24 -0
- package/dist/cards/types.d.ts.map +1 -0
- package/dist/cards/types.js +7 -0
- package/dist/cards/types.js.map +1 -0
- package/dist/components/AgentSelector.d.ts +23 -0
- package/dist/components/AgentSelector.d.ts.map +1 -0
- package/dist/components/AgentSelector.js +63 -0
- package/dist/components/AgentSelector.js.map +1 -0
- package/dist/components/AgentSelector.stories.d.ts +12 -0
- package/dist/components/AgentSelector.stories.d.ts.map +1 -0
- package/dist/components/AgentSelector.stories.js +95 -0
- package/dist/components/AgentSelector.stories.js.map +1 -0
- package/dist/components/ChatPanel.d.ts +138 -21
- package/dist/components/ChatPanel.d.ts.map +1 -1
- package/dist/components/ChatPanel.js +181 -26
- package/dist/components/ChatPanel.js.map +1 -1
- package/dist/components/index.d.ts +3 -1
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +1 -0
- package/dist/components/index.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -1
- package/dist/state/ChatSessionProvider.d.ts +59 -0
- package/dist/state/ChatSessionProvider.d.ts.map +1 -0
- package/dist/state/ChatSessionProvider.js +71 -0
- package/dist/state/ChatSessionProvider.js.map +1 -0
- package/dist/state/MockChatStreamTransport.d.ts +54 -0
- package/dist/state/MockChatStreamTransport.d.ts.map +1 -0
- package/dist/state/MockChatStreamTransport.js +86 -0
- package/dist/state/MockChatStreamTransport.js.map +1 -0
- package/dist/state/MockChatStreamTransport.stories.d.ts +13 -0
- package/dist/state/MockChatStreamTransport.stories.d.ts.map +1 -0
- package/dist/state/MockChatStreamTransport.stories.js +60 -0
- package/dist/state/MockChatStreamTransport.stories.js.map +1 -0
- package/dist/state/bridgeLegacySSE.d.ts +42 -0
- package/dist/state/bridgeLegacySSE.d.ts.map +1 -0
- package/dist/state/bridgeLegacySSE.js +102 -0
- package/dist/state/bridgeLegacySSE.js.map +1 -0
- package/dist/state/index.d.ts +32 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +24 -0
- package/dist/state/index.js.map +1 -0
- package/dist/state/parseSSE.d.ts +50 -0
- package/dist/state/parseSSE.d.ts.map +1 -0
- package/dist/state/parseSSE.js +112 -0
- package/dist/state/parseSSE.js.map +1 -0
- package/dist/state/useChatComposer.d.ts +51 -0
- package/dist/state/useChatComposer.d.ts.map +1 -0
- package/dist/state/useChatComposer.js +82 -0
- package/dist/state/useChatComposer.js.map +1 -0
- package/dist/state/useChatList.d.ts +71 -0
- package/dist/state/useChatList.d.ts.map +1 -0
- package/dist/state/useChatList.js +158 -0
- package/dist/state/useChatList.js.map +1 -0
- package/dist/state/useChatSession.d.ts +29 -0
- package/dist/state/useChatSession.d.ts.map +1 -0
- package/dist/state/useChatSession.js +37 -0
- package/dist/state/useChatSession.js.map +1 -0
- package/dist/state/useScrollLock.d.ts +35 -0
- package/dist/state/useScrollLock.d.ts.map +1 -0
- package/dist/state/useScrollLock.js +74 -0
- package/dist/state/useScrollLock.js.map +1 -0
- package/dist/state/useToolCallStream.d.ts +38 -0
- package/dist/state/useToolCallStream.d.ts.map +1 -0
- package/dist/state/useToolCallStream.js +74 -0
- package/dist/state/useToolCallStream.js.map +1 -0
- package/package.json +10 -2
- package/src/cards/ActionSegmentCard.tsx +60 -0
- package/src/cards/AnalysisDocumentCard.tsx +81 -0
- package/src/cards/AskUserQuestionsCard.tsx +354 -0
- package/src/cards/CoverageReportCard.tsx +215 -0
- package/src/cards/OrchestrationPlanCard.tsx +328 -0
- package/src/cards/PlanSelectorCard.tsx +312 -0
- package/src/cards/PlanStepsCard.tsx +52 -0
- package/src/cards/QuizCard.tsx +309 -0
- package/src/cards/ResearchPlanCard.tsx +169 -0
- package/src/cards/SearchSourcesCard.tsx +244 -0
- package/src/cards/SuggestedRepliesCard.tsx +48 -0
- package/src/cards/SummaryMessageCard.tsx +145 -0
- package/src/cards/ThinkingProcessCard.tsx +155 -0
- package/src/cards/ToolExecutionCard.tsx +152 -0
- package/src/cards/cards.test.tsx +492 -0
- package/src/cards/icons.tsx +249 -0
- package/src/cards/index.ts +53 -0
- package/src/cards/types.ts +27 -0
- package/src/components/AgentSelector.stories.tsx +113 -0
- package/src/components/AgentSelector.test.tsx +70 -0
- package/src/components/AgentSelector.tsx +147 -0
- package/src/components/ChatPanel.test.tsx +130 -0
- package/src/components/ChatPanel.tsx +612 -138
- package/src/components/index.ts +13 -1
- package/src/index.ts +43 -0
- package/src/state/ChatSessionProvider.test.tsx +85 -0
- package/src/state/ChatSessionProvider.tsx +98 -0
- package/src/state/MockChatStreamTransport.stories.tsx +95 -0
- package/src/state/MockChatStreamTransport.test.ts +163 -0
- package/src/state/MockChatStreamTransport.ts +123 -0
- package/src/state/bridgeLegacySSE.test.ts +134 -0
- package/src/state/bridgeLegacySSE.ts +134 -0
- package/src/state/index.ts +82 -0
- package/src/state/parseSSE.test.ts +123 -0
- package/src/state/parseSSE.ts +123 -0
- package/src/state/useChatComposer.test.ts +145 -0
- package/src/state/useChatComposer.ts +117 -0
- package/src/state/useChatList.test.ts +135 -0
- package/src/state/useChatList.ts +217 -0
- package/src/state/useChatSession.test.ts +61 -0
- package/src/state/useChatSession.ts +64 -0
- package/src/state/useScrollLock.test.ts +99 -0
- package/src/state/useScrollLock.ts +105 -0
- package/src/state/useToolCallStream.test.ts +86 -0
- package/src/state/useToolCallStream.ts +110 -0
|
@@ -1,42 +1,159 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `ChatPanel` — the
|
|
2
|
+
* `ChatPanel` — the orchestration shell, now exposed as a Radix-style
|
|
3
|
+
* compound: `ChatPanel.Root / .Header / .Messages / .Input / .Empty /
|
|
4
|
+
* .StreamingStatus`.
|
|
3
5
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
6
|
+
* Compound API
|
|
7
|
+
* ------------
|
|
8
|
+
* <ChatPanel.Root className="…">
|
|
9
|
+
* <ChatPanel.Header>{customHeader}</ChatPanel.Header>
|
|
10
|
+
* <ChatPanel.Messages
|
|
11
|
+
* messages={messages}
|
|
12
|
+
* isStreaming={isStreaming}
|
|
13
|
+
* renderMessage={renderRichBubble}
|
|
14
|
+
* emptyState={<ChatPanel.Empty onSelectPrompt={…} />}
|
|
15
|
+
* />
|
|
16
|
+
* <ChatPanel.Input
|
|
17
|
+
* value={draft}
|
|
18
|
+
* onChange={setDraft}
|
|
19
|
+
* onSubmit={send}
|
|
20
|
+
* onCancel={cancel}
|
|
21
|
+
* isStreaming={isStreaming}
|
|
22
|
+
* />
|
|
23
|
+
* </ChatPanel.Root>
|
|
9
24
|
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
25
|
+
* Each sub-component owns one slot of the chat. The .Messages and .Input
|
|
26
|
+
* subs accept `as` / `slots` escape hatches so consumers can replace any one
|
|
27
|
+
* leaf without re-implementing the rest.
|
|
28
|
+
*
|
|
29
|
+
* Monolithic alias
|
|
30
|
+
* ----------------
|
|
31
|
+
* <ChatPanel messages={messages} onSubmit={onSubmit} … />
|
|
32
|
+
*
|
|
33
|
+
* The 0.2.x props remain valid — they internally render the compound. New
|
|
34
|
+
* consumers should reach for the compound; the alias exists to make the
|
|
35
|
+
* 0.2 -> 0.3 cutover non-breaking for in-flight integrations.
|
|
13
36
|
*/
|
|
14
37
|
import type { ChatMessage, ToolCall, ToolResult } from '@steerable/agent-protocol';
|
|
15
|
-
|
|
38
|
+
import { type MessageRendererProps } from './MessageList.js';
|
|
39
|
+
export interface ChatPanelRootProps {
|
|
40
|
+
children: React.ReactNode;
|
|
41
|
+
className?: string;
|
|
42
|
+
/**
|
|
43
|
+
* Opt out of the default `bg-agent-canvas text-agent-foreground` styling
|
|
44
|
+
* — handy when the consumer's host container already paints the
|
|
45
|
+
* background (e.g. deeppath's `bg-card` rounded shell) and you don't want
|
|
46
|
+
* two layers fighting over which wins in the cascade.
|
|
47
|
+
*/
|
|
48
|
+
unstyled?: boolean;
|
|
49
|
+
/** Render as a different host element (e.g. 'section', 'main'). */
|
|
50
|
+
as?: keyof React.JSX.IntrinsicElements;
|
|
51
|
+
}
|
|
52
|
+
declare function ChatPanelRoot({ children, className, unstyled, as: As, }: ChatPanelRootProps): import("react/jsx-runtime").JSX.Element;
|
|
53
|
+
export interface ChatPanelHeaderProps {
|
|
54
|
+
children?: React.ReactNode;
|
|
55
|
+
className?: string;
|
|
56
|
+
}
|
|
57
|
+
declare function ChatPanelHeader({ children, className }: ChatPanelHeaderProps): import("react/jsx-runtime").JSX.Element | null;
|
|
58
|
+
export interface ChatPanelMessagesProps {
|
|
16
59
|
messages: ChatMessage[];
|
|
17
60
|
isStreaming?: boolean;
|
|
61
|
+
renderMessage?: (props: MessageRendererProps) => React.ReactNode;
|
|
62
|
+
renderToolCall?: (call: ToolCall, result?: ToolResult) => React.ReactNode;
|
|
63
|
+
emptyState?: React.ReactNode;
|
|
64
|
+
className?: string;
|
|
65
|
+
}
|
|
66
|
+
declare function ChatPanelMessages(props: ChatPanelMessagesProps): import("react/jsx-runtime").JSX.Element;
|
|
67
|
+
export interface ChatPanelInputHandle {
|
|
68
|
+
focus: () => void;
|
|
69
|
+
focusAtEnd: () => void;
|
|
70
|
+
}
|
|
71
|
+
export interface ChatPanelInputProps {
|
|
72
|
+
value: string;
|
|
73
|
+
onChange: (next: string) => void;
|
|
74
|
+
onSubmit: () => void | Promise<void>;
|
|
75
|
+
onCancel?: () => void;
|
|
76
|
+
isStreaming?: boolean;
|
|
77
|
+
disabled?: boolean;
|
|
78
|
+
placeholder?: string;
|
|
18
79
|
/**
|
|
19
|
-
*
|
|
20
|
-
*
|
|
80
|
+
* Keyboard mode:
|
|
81
|
+
* - 'cmd-enter' (default for the rich Input): Enter = newline,
|
|
82
|
+
* Cmd/Ctrl+Enter = send. IME-safe.
|
|
83
|
+
* - 'enter': Enter = send, Shift+Enter = newline. Matches the cloud
|
|
84
|
+
* chat product.
|
|
21
85
|
*/
|
|
86
|
+
keyMode?: 'cmd-enter' | 'enter';
|
|
87
|
+
/** Optional content slot rendered to the left of the send button. */
|
|
88
|
+
toolbarLeft?: React.ReactNode;
|
|
89
|
+
/** Optional content slot rendered to the right of the textarea. */
|
|
90
|
+
toolbarRight?: React.ReactNode;
|
|
91
|
+
className?: string;
|
|
92
|
+
}
|
|
93
|
+
export declare const ChatPanelInput: import("react").ForwardRefExoticComponent<ChatPanelInputProps & import("react").RefAttributes<ChatPanelInputHandle>>;
|
|
94
|
+
export interface ChatPanelEmptyProps {
|
|
95
|
+
/** Suggested prompts to chip-render. When omitted, the slot is a centred message. */
|
|
96
|
+
prompts?: string[];
|
|
97
|
+
/** Called when the user picks a chip. */
|
|
98
|
+
onSelectPrompt?: (prompt: string) => void;
|
|
99
|
+
title?: string;
|
|
100
|
+
description?: string;
|
|
101
|
+
className?: string;
|
|
102
|
+
}
|
|
103
|
+
declare function ChatPanelEmpty(props: ChatPanelEmptyProps): import("react/jsx-runtime").JSX.Element;
|
|
104
|
+
export interface ChatPanelStreamingStatusProps {
|
|
105
|
+
/** Current round number (1-based). */
|
|
106
|
+
round?: number;
|
|
107
|
+
/** Number of tool calls executed so far in this turn. */
|
|
108
|
+
actionCount?: number;
|
|
109
|
+
/**
|
|
110
|
+
* Suppress the status when the bubble has already received content tokens —
|
|
111
|
+
* the cursor blink in the bubble is enough.
|
|
112
|
+
*/
|
|
113
|
+
hasContent?: boolean;
|
|
114
|
+
/** Override the auto-derived label. */
|
|
115
|
+
label?: string;
|
|
116
|
+
className?: string;
|
|
117
|
+
}
|
|
118
|
+
declare function ChatPanelStreamingStatus(props: ChatPanelStreamingStatusProps): import("react/jsx-runtime").JSX.Element | null;
|
|
119
|
+
export interface ChatPanelProps {
|
|
120
|
+
messages: ChatMessage[];
|
|
121
|
+
isStreaming?: boolean;
|
|
22
122
|
onSubmit: (input: {
|
|
23
123
|
content: string;
|
|
24
124
|
}) => void | Promise<void>;
|
|
25
125
|
onCancel?: () => void;
|
|
26
126
|
className?: string;
|
|
27
127
|
inputPlaceholder?: string;
|
|
28
|
-
/** Slot rendered above the message list (header, agent picker, …). */
|
|
29
128
|
header?: React.ReactNode;
|
|
30
|
-
/**
|
|
31
|
-
* Tool-call renderer. Default uses the framework's `ToolCallRenderer`;
|
|
32
|
-
* pass `() => null` to suppress, or your own component to inject a
|
|
33
|
-
* domain-specific renderer (CIFLog cards, SQL query previews, …).
|
|
34
|
-
*/
|
|
35
129
|
renderToolCall?: (call: ToolCall, result?: ToolResult) => React.ReactNode;
|
|
36
|
-
|
|
130
|
+
renderMessage?: (props: MessageRendererProps) => React.ReactNode;
|
|
37
131
|
emptyState?: React.ReactNode;
|
|
38
|
-
/** Disable the input (e.g. during initial chat load). */
|
|
39
132
|
disabled?: boolean;
|
|
40
133
|
}
|
|
41
|
-
|
|
134
|
+
declare function ChatPanelMonolith(props: ChatPanelProps): import("react/jsx-runtime").JSX.Element;
|
|
135
|
+
export interface ChatPanelConnectedProps {
|
|
136
|
+
className?: string;
|
|
137
|
+
header?: React.ReactNode;
|
|
138
|
+
emptyPrompts?: string[];
|
|
139
|
+
emptyTitle?: string;
|
|
140
|
+
emptyDescription?: string;
|
|
141
|
+
inputPlaceholder?: string;
|
|
142
|
+
renderMessage?: (props: MessageRendererProps) => React.ReactNode;
|
|
143
|
+
renderToolCall?: (call: ToolCall, result?: ToolResult) => React.ReactNode;
|
|
144
|
+
/** Apply the panel's own background/foreground tokens (default). */
|
|
145
|
+
styled?: boolean;
|
|
146
|
+
}
|
|
147
|
+
declare function ChatPanelConnected(props: ChatPanelConnectedProps): import("react/jsx-runtime").JSX.Element;
|
|
148
|
+
declare const ChatPanelCompound: typeof ChatPanelMonolith & {
|
|
149
|
+
Root: typeof ChatPanelRoot;
|
|
150
|
+
Header: typeof ChatPanelHeader;
|
|
151
|
+
Messages: typeof ChatPanelMessages;
|
|
152
|
+
Input: import("react").ForwardRefExoticComponent<ChatPanelInputProps & import("react").RefAttributes<ChatPanelInputHandle>>;
|
|
153
|
+
Empty: typeof ChatPanelEmpty;
|
|
154
|
+
StreamingStatus: typeof ChatPanelStreamingStatus;
|
|
155
|
+
Connected: typeof ChatPanelConnected;
|
|
156
|
+
};
|
|
157
|
+
export { ChatPanelCompound as ChatPanel };
|
|
158
|
+
export type { MessageRendererProps };
|
|
42
159
|
//# sourceMappingURL=ChatPanel.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatPanel.d.ts","sourceRoot":"","sources":["../../src/components/ChatPanel.tsx"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"ChatPanel.d.ts","sourceRoot":"","sources":["../../src/components/ChatPanel.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmCG;AAWH,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACnF,OAAO,EAAe,KAAK,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAS1E,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,mEAAmE;IACnE,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC;CACxC;AAED,iBAAS,aAAa,CAAC,EACrB,QAAQ,EACR,SAAS,EACT,QAAgB,EAChB,EAAE,EAAE,EAAU,GACf,EAAE,kBAAkB,2CAepB;AAMD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,iBAAS,eAAe,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,oBAAoB,kDAYrE;AAMD,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,KAAK,CAAC,SAAS,CAAC;IACjE,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,UAAU,KAAK,KAAK,CAAC,SAAS,CAAC;IAC1E,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAMD,iBAAS,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,2CAiCvD;AAsED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,UAAU,EAAE,MAAM,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,QAAQ,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC;IAChC,qEAAqE;IACrE,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B,mEAAmE;IACnE,YAAY,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAO,MAAM,cAAc,sHAkI1B,CAAC;AAMF,MAAM,WAAW,mBAAmB;IAClC,qFAAqF;IACrF,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,yCAAyC;IACzC,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,iBAAS,cAAc,CAAC,KAAK,EAAE,mBAAmB,2CA6BjD;AAMD,MAAM,WAAW,6BAA6B;IAC5C,sCAAsC;IACtC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,uCAAuC;IACvC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAQD,iBAAS,wBAAwB,CAAC,KAAK,EAAE,6BAA6B,kDAiCrE;AAWD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/D,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,UAAU,KAAK,KAAK,CAAC,SAAS,CAAC;IAC1E,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,KAAK,CAAC,SAAS,CAAC;IACjE,UAAU,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,iBAAS,iBAAiB,CAAC,KAAK,EAAE,cAAc,2CA4C/C;AAgBD,MAAM,WAAW,uBAAuB;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,KAAK,CAAC,SAAS,CAAC;IACjE,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,UAAU,KAAK,KAAK,CAAC,SAAS,CAAC;IAC1E,oEAAoE;IACpE,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,iBAAS,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,2CAgDzD;AAMD,QAAA,MAAM,iBAAiB;;;;;;;;CAQrB,CAAC;AAEH,OAAO,EAAE,iBAAiB,IAAI,SAAS,EAAE,CAAC;AAC1C,YAAY,EAAE,oBAAoB,EAAE,CAAC"}
|
|
@@ -1,46 +1,201 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
/**
|
|
3
|
-
* `ChatPanel` — the
|
|
3
|
+
* `ChatPanel` — the orchestration shell, now exposed as a Radix-style
|
|
4
|
+
* compound: `ChatPanel.Root / .Header / .Messages / .Input / .Empty /
|
|
5
|
+
* .StreamingStatus`.
|
|
4
6
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
7
|
+
* Compound API
|
|
8
|
+
* ------------
|
|
9
|
+
* <ChatPanel.Root className="…">
|
|
10
|
+
* <ChatPanel.Header>{customHeader}</ChatPanel.Header>
|
|
11
|
+
* <ChatPanel.Messages
|
|
12
|
+
* messages={messages}
|
|
13
|
+
* isStreaming={isStreaming}
|
|
14
|
+
* renderMessage={renderRichBubble}
|
|
15
|
+
* emptyState={<ChatPanel.Empty onSelectPrompt={…} />}
|
|
16
|
+
* />
|
|
17
|
+
* <ChatPanel.Input
|
|
18
|
+
* value={draft}
|
|
19
|
+
* onChange={setDraft}
|
|
20
|
+
* onSubmit={send}
|
|
21
|
+
* onCancel={cancel}
|
|
22
|
+
* isStreaming={isStreaming}
|
|
23
|
+
* />
|
|
24
|
+
* </ChatPanel.Root>
|
|
10
25
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
26
|
+
* Each sub-component owns one slot of the chat. The .Messages and .Input
|
|
27
|
+
* subs accept `as` / `slots` escape hatches so consumers can replace any one
|
|
28
|
+
* leaf without re-implementing the rest.
|
|
29
|
+
*
|
|
30
|
+
* Monolithic alias
|
|
31
|
+
* ----------------
|
|
32
|
+
* <ChatPanel messages={messages} onSubmit={onSubmit} … />
|
|
33
|
+
*
|
|
34
|
+
* The 0.2.x props remain valid — they internally render the compound. New
|
|
35
|
+
* consumers should reach for the compound; the alias exists to make the
|
|
36
|
+
* 0.2 -> 0.3 cutover non-breaking for in-flight integrations.
|
|
14
37
|
*/
|
|
15
|
-
import { useCallback, useState } from 'react';
|
|
38
|
+
import { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState, } from 'react';
|
|
16
39
|
import { MessageList } from './MessageList.js';
|
|
17
40
|
import { ToolCallRenderer } from './ToolCallRenderer.js';
|
|
18
41
|
import { cn } from './cn.js';
|
|
42
|
+
import { useChatSessionContext } from '../state/ChatSessionProvider.js';
|
|
43
|
+
function ChatPanelRoot({ children, className, unstyled = false, as: As = 'div', }) {
|
|
44
|
+
// The `as any` keeps the JSX surface flexible without forcing every host
|
|
45
|
+
// element's prop variance through the inference machinery.
|
|
46
|
+
const Component = As;
|
|
47
|
+
return (_jsx(Component, { className: cn('flex h-full w-full flex-col', unstyled ? null : 'bg-agent-canvas text-agent-foreground', className), children: children }));
|
|
48
|
+
}
|
|
49
|
+
function ChatPanelHeader({ children, className }) {
|
|
50
|
+
if (!children)
|
|
51
|
+
return null;
|
|
52
|
+
return (_jsx("div", { className: cn('flex items-center gap-2 border-b border-agent-border bg-agent-canvas px-3 py-2', className), children: children }));
|
|
53
|
+
}
|
|
19
54
|
function defaultRenderToolCall(call, result) {
|
|
20
55
|
return _jsx(ToolCallRenderer, { call: call, result: result }, call.id);
|
|
21
56
|
}
|
|
22
|
-
|
|
23
|
-
const { messages, isStreaming = false,
|
|
57
|
+
function ChatPanelMessages(props) {
|
|
58
|
+
const { messages, isStreaming = false, renderMessage, renderToolCall = defaultRenderToolCall, emptyState, className, } = props;
|
|
59
|
+
const renderBubble = useCallback((rendererProps) => {
|
|
60
|
+
if (renderMessage)
|
|
61
|
+
return renderMessage(rendererProps);
|
|
62
|
+
return (_jsx(DefaultRichBubble, { ...rendererProps, renderToolCall: renderToolCall }));
|
|
63
|
+
}, [renderMessage, renderToolCall]);
|
|
64
|
+
return (_jsx("div", { className: cn('flex-1 overflow-hidden', className), children: _jsx(MessageList, { messages: messages, isStreaming: isStreaming, renderMessage: renderBubble, emptyState: emptyState }) }));
|
|
65
|
+
}
|
|
66
|
+
function DefaultRichBubble({ message, isLastAssistant, isStreaming, index, renderToolCall, }) {
|
|
67
|
+
const isAssistant = message.role === 'assistant';
|
|
68
|
+
return (_jsx("div", { "data-role": message.role, className: cn('flex w-full', isAssistant ? 'justify-start' : 'justify-end'), children: _jsxs("div", { className: cn('flex max-w-[80%] flex-col gap-2', isAssistant ? 'items-start' : 'items-end'), children: [_jsxs("div", { className: cn('rounded-agent-md border px-3 py-2 text-sm leading-relaxed', isAssistant
|
|
69
|
+
? 'border-agent-border bg-agent-muted text-agent-foreground'
|
|
70
|
+
: 'border-transparent bg-agent-accent text-agent-accent-foreground'), children: [_jsx("div", { className: "whitespace-pre-wrap", children: message.content || (isLastAssistant && isStreaming ? '…' : '') }), isLastAssistant && isStreaming ? (_jsx("span", { "aria-hidden": true, className: "ml-0.5 inline-block h-3 w-1.5 align-baseline bg-agent-foreground animate-agent-cursor-blink" })) : null] }), Array.isArray(message.toolCalls) && message.toolCalls.length > 0 ? (_jsx("div", { className: "flex w-full flex-col gap-1.5", children: message.toolCalls.map((call) => renderToolCall(call, message.toolResult)) })) : null] }) }, message.id ?? index));
|
|
71
|
+
}
|
|
72
|
+
// ---------------------------------------------------------------------------
|
|
73
|
+
// Input
|
|
74
|
+
//
|
|
75
|
+
// Multi-line textarea with auto-grow, IME-safe keyboard handling, and a
|
|
76
|
+
// send/stop affordance. This is the rich default lifted from
|
|
77
|
+
// deeppath-agent/apps/web/src/components/chat/ChatInput.tsx — minus the
|
|
78
|
+
// agent-pill and settings gear, which live in agent-specific slots the apps
|
|
79
|
+
// can drop into the toolbar via `toolbarLeft`/`toolbarRight` props.
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
const MIN_TEXTAREA_PX = 44;
|
|
82
|
+
const MAX_TEXTAREA_PX = 220;
|
|
83
|
+
const IS_MAC = typeof navigator !== 'undefined' &&
|
|
84
|
+
/Mac|iPod|iPhone|iPad/.test(navigator.platform || '');
|
|
85
|
+
const MOD_LABEL = IS_MAC ? '⌘' : 'Ctrl';
|
|
86
|
+
export const ChatPanelInput = forwardRef(function ChatPanelInput({ value, onChange, onSubmit, onCancel, isStreaming = false, disabled = false, placeholder = 'Send a message…', keyMode = 'cmd-enter', toolbarLeft, toolbarRight, className, }, ref) {
|
|
87
|
+
const textareaRef = useRef(null);
|
|
88
|
+
useImperativeHandle(ref, () => ({
|
|
89
|
+
focus: () => textareaRef.current?.focus(),
|
|
90
|
+
focusAtEnd: () => {
|
|
91
|
+
const ta = textareaRef.current;
|
|
92
|
+
if (!ta)
|
|
93
|
+
return;
|
|
94
|
+
ta.focus();
|
|
95
|
+
const len = ta.value.length;
|
|
96
|
+
ta.setSelectionRange(len, len);
|
|
97
|
+
},
|
|
98
|
+
}), []);
|
|
99
|
+
// Auto-grow: reset height first so shrink works when user deletes text.
|
|
100
|
+
useEffect(() => {
|
|
101
|
+
const ta = textareaRef.current;
|
|
102
|
+
if (!ta)
|
|
103
|
+
return;
|
|
104
|
+
ta.style.height = 'auto';
|
|
105
|
+
const next = Math.min(Math.max(ta.scrollHeight, MIN_TEXTAREA_PX), MAX_TEXTAREA_PX);
|
|
106
|
+
ta.style.height = `${next}px`;
|
|
107
|
+
}, [value]);
|
|
108
|
+
const trimmed = value.trim();
|
|
109
|
+
const canSend = trimmed.length > 0 && !disabled && !isStreaming;
|
|
110
|
+
const handleKeyDown = (event) => {
|
|
111
|
+
if (event.nativeEvent.isComposing)
|
|
112
|
+
return;
|
|
113
|
+
if (keyMode === 'cmd-enter') {
|
|
114
|
+
const isSendCombo = event.key === 'Enter' && (event.metaKey || event.ctrlKey);
|
|
115
|
+
if (isSendCombo) {
|
|
116
|
+
event.preventDefault();
|
|
117
|
+
if (canSend)
|
|
118
|
+
void onSubmit();
|
|
119
|
+
}
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
// keyMode === 'enter'
|
|
123
|
+
if (event.key === 'Enter' && !event.shiftKey) {
|
|
124
|
+
event.preventDefault();
|
|
125
|
+
if (isStreaming)
|
|
126
|
+
onCancel?.();
|
|
127
|
+
else if (canSend)
|
|
128
|
+
void onSubmit();
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
const handleSendClick = () => {
|
|
132
|
+
if (isStreaming) {
|
|
133
|
+
onCancel?.();
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
if (canSend)
|
|
137
|
+
void onSubmit();
|
|
138
|
+
};
|
|
139
|
+
return (_jsx("div", { className: cn('chat-input-container px-3 pb-3 pt-1', className), children: _jsxs("div", { className: "chat-input-box flex flex-col rounded-agent-lg border border-agent-border bg-agent-canvas shadow-sm", children: [_jsx("textarea", { ref: textareaRef, value: value, onChange: (event) => onChange(event.target.value), onKeyDown: handleKeyDown, placeholder: placeholder, disabled: disabled, rows: 1, className: "block w-full resize-none border-0 bg-transparent px-3 pt-3 text-sm text-agent-foreground outline-none placeholder:text-agent-muted-foreground disabled:opacity-50", style: { minHeight: MIN_TEXTAREA_PX, maxHeight: MAX_TEXTAREA_PX } }), _jsxs("div", { className: "flex items-center justify-between gap-2 px-2 pb-2 pt-1", children: [_jsx("div", { className: "flex items-center gap-1", children: toolbarLeft }), _jsxs("div", { className: "flex items-center gap-3", children: [toolbarRight, _jsxs("div", { className: "hidden text-[11px] text-agent-muted-foreground/80 sm:block", children: [_jsx("kbd", { className: "rounded border border-agent-border bg-agent-muted px-1 font-sans text-[10px]", children: MOD_LABEL }), _jsx("span", { className: "mx-0.5", children: "+" }), _jsx("kbd", { className: "rounded border border-agent-border bg-agent-muted px-1 font-sans text-[10px]", children: isStreaming ? '.' : 'Enter' })] }), _jsx("button", { type: "button", onClick: handleSendClick, disabled: !isStreaming && !canSend, className: isStreaming
|
|
140
|
+
? 'flex h-8 w-8 items-center justify-center rounded-full bg-agent-destructive text-white transition hover:opacity-90'
|
|
141
|
+
: canSend
|
|
142
|
+
? 'flex h-8 w-8 items-center justify-center rounded-full bg-agent-foreground text-agent-canvas transition hover:opacity-90'
|
|
143
|
+
: 'flex h-8 w-8 cursor-not-allowed items-center justify-center rounded-full bg-agent-muted text-agent-muted-foreground', "aria-label": isStreaming ? 'Stop generating' : 'Send message', title: isStreaming
|
|
144
|
+
? `Stop (${MOD_LABEL}+.)`
|
|
145
|
+
: `Send (${MOD_LABEL}+Enter)`, children: isStreaming ? (_jsx("span", { className: "block h-3.5 w-3.5 bg-white" })) : (_jsx("span", { "aria-hidden": true, className: "leading-none", children: "\u2191" })) })] })] })] }) }));
|
|
146
|
+
});
|
|
147
|
+
function ChatPanelEmpty(props) {
|
|
148
|
+
const { prompts, onSelectPrompt, title, description, className } = props;
|
|
149
|
+
return (_jsxs("div", { className: cn('flex h-full flex-col justify-end gap-3 p-3', className), children: [(title || description) && (_jsxs("div", { className: "text-center text-sm text-agent-muted-foreground", children: [title ? (_jsx("p", { className: "font-medium text-agent-foreground", children: title })) : null, description ? _jsx("p", { className: "mt-1", children: description }) : null] })), Array.isArray(prompts) && prompts.length > 0 ? (_jsx("div", { className: "flex flex-col items-start gap-2", children: prompts.map((p) => (_jsx("button", { type: "button", onClick: () => onSelectPrompt?.(p), title: p, className: "max-w-full cursor-pointer truncate rounded-full border border-agent-border bg-agent-muted px-3 py-1.5 text-xs text-agent-muted-foreground transition-all duration-200 hover:bg-agent-accent hover:text-agent-foreground", children: p }, p))) })) : null] }));
|
|
150
|
+
}
|
|
151
|
+
function selectStatusLabel(round, actionCount) {
|
|
152
|
+
if (round >= 2 && actionCount === 0)
|
|
153
|
+
return `Round ${round} · continuing…`;
|
|
154
|
+
if (actionCount > 0)
|
|
155
|
+
return `Called ${actionCount} tools, analysing…`;
|
|
156
|
+
return 'Thinking…';
|
|
157
|
+
}
|
|
158
|
+
function ChatPanelStreamingStatus(props) {
|
|
159
|
+
const { round = 1, actionCount = 0, hasContent = false, label, className, } = props;
|
|
160
|
+
if (hasContent)
|
|
161
|
+
return null;
|
|
162
|
+
const text = label ?? selectStatusLabel(round, actionCount);
|
|
163
|
+
return (_jsxs("div", { role: "status", "aria-live": "polite", "aria-atomic": "true", className: cn('my-2 inline-flex items-center gap-2 text-xs text-agent-muted-foreground', className), children: [_jsxs("span", { className: "inline-flex items-center gap-1", children: [_jsx("span", { className: "h-1 w-1 animate-pulse rounded-full bg-agent-foreground/40 [animation-delay:0ms]" }), _jsx("span", { className: "h-1 w-1 animate-pulse rounded-full bg-agent-foreground/40 [animation-delay:150ms]" }), _jsx("span", { className: "h-1 w-1 animate-pulse rounded-full bg-agent-foreground/40 [animation-delay:300ms]" })] }), _jsx("span", { children: text }), round > 1 ? (_jsxs("span", { className: "rounded-full border border-agent-border bg-agent-muted/40 px-1.5 py-[1px] font-mono text-[10px] text-agent-muted-foreground", children: ["round ", round] })) : null] }));
|
|
164
|
+
}
|
|
165
|
+
function ChatPanelMonolith(props) {
|
|
166
|
+
const { messages, isStreaming = false, onSubmit, onCancel, className, inputPlaceholder, header, renderToolCall, renderMessage, emptyState, disabled = false, } = props;
|
|
24
167
|
const [draft, setDraft] = useState('');
|
|
25
|
-
const handleSubmit = useCallback(async (
|
|
26
|
-
e?.preventDefault();
|
|
168
|
+
const handleSubmit = useCallback(async () => {
|
|
27
169
|
const trimmed = draft.trim();
|
|
28
170
|
if (!trimmed || disabled)
|
|
29
171
|
return;
|
|
30
172
|
setDraft('');
|
|
31
173
|
await onSubmit({ content: trimmed });
|
|
32
174
|
}, [draft, disabled, onSubmit]);
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
},
|
|
44
|
-
return (_jsxs("div", { className: cn('flex h-full w-full flex-col bg-agent-canvas text-agent-foreground', className), children: [header, _jsx("div", { className: "flex-1 overflow-hidden", children: _jsx(MessageList, { messages: messages, isStreaming: isStreaming, renderMessage: renderMessage, emptyState: emptyState }) }), _jsxs("form", { className: "flex items-center gap-2 border-t border-agent-border bg-agent-canvas px-3 py-2", onSubmit: handleSubmit, children: [_jsx("input", { type: "text", value: draft, onChange: (e) => setDraft(e.target.value), placeholder: inputPlaceholder, disabled: disabled, className: cn('flex-1 rounded-agent-md border border-agent-border bg-agent-canvas px-3 py-2 text-sm text-agent-foreground placeholder:text-agent-muted-foreground', 'focus:border-agent-accent focus:outline-none focus:ring-1 focus:ring-agent-accent', disabled && 'opacity-50') }), isStreaming && onCancel ? (_jsx("button", { type: "button", onClick: onCancel, className: "rounded-agent-md border border-agent-border px-3 py-2 text-sm text-agent-foreground hover:bg-agent-muted", children: "Stop" })) : (_jsx("button", { type: "submit", disabled: disabled || !draft.trim(), className: cn('rounded-agent-md bg-agent-accent px-3 py-2 text-sm font-medium text-agent-accent-foreground', (disabled || !draft.trim()) && 'opacity-50'), children: "Send" }))] })] }));
|
|
175
|
+
return (_jsxs(ChatPanelRoot, { className: className, children: [header ? _jsx(ChatPanelHeader, { children: header }) : null, _jsx(ChatPanelMessages, { messages: messages, isStreaming: isStreaming, renderMessage: renderMessage, renderToolCall: renderToolCall, emptyState: emptyState }), _jsx(ChatPanelInput, { value: draft, onChange: setDraft, onSubmit: handleSubmit, onCancel: onCancel, isStreaming: isStreaming, disabled: disabled, placeholder: inputPlaceholder, keyMode: "enter" })] }));
|
|
176
|
+
}
|
|
177
|
+
function ChatPanelConnected(props) {
|
|
178
|
+
const { className, header, emptyPrompts, emptyTitle, emptyDescription, inputPlaceholder, renderMessage, renderToolCall, styled = true, } = props;
|
|
179
|
+
const session = useChatSessionContext();
|
|
180
|
+
const { composer } = session;
|
|
181
|
+
const emptyState = emptyPrompts || emptyTitle || emptyDescription ? (_jsx(ChatPanelEmpty, { prompts: emptyPrompts, title: emptyTitle, description: emptyDescription, onSelectPrompt: (text) => {
|
|
182
|
+
composer.setValue(text);
|
|
183
|
+
void composer.submit();
|
|
184
|
+
} })) : undefined;
|
|
185
|
+
return (_jsxs(ChatPanelRoot, { className: className, unstyled: !styled, children: [header ? _jsx(ChatPanelHeader, { children: header }) : null, _jsx(ChatPanelMessages, { messages: session.messages, isStreaming: session.isStreaming, renderMessage: renderMessage, renderToolCall: renderToolCall, emptyState: emptyState }), _jsx(ChatPanelInput, { value: composer.value, onChange: composer.setValue, onSubmit: composer.submit, onCancel: composer.cancel, isStreaming: session.isStreaming, placeholder: inputPlaceholder })] }));
|
|
45
186
|
}
|
|
187
|
+
// `ChatPanel` is the monolith (backwards-compat); the compound parts hang
|
|
188
|
+
// off it as named attributes. This mirrors Radix's pattern so consumers can
|
|
189
|
+
// keep `<ChatPanel ...>` working OR migrate to `<ChatPanel.Root>…</ChatPanel.Root>`
|
|
190
|
+
// in their own time.
|
|
191
|
+
const ChatPanelCompound = Object.assign(ChatPanelMonolith, {
|
|
192
|
+
Root: ChatPanelRoot,
|
|
193
|
+
Header: ChatPanelHeader,
|
|
194
|
+
Messages: ChatPanelMessages,
|
|
195
|
+
Input: ChatPanelInput,
|
|
196
|
+
Empty: ChatPanelEmpty,
|
|
197
|
+
StreamingStatus: ChatPanelStreamingStatus,
|
|
198
|
+
Connected: ChatPanelConnected,
|
|
199
|
+
});
|
|
200
|
+
export { ChatPanelCompound as ChatPanel };
|
|
46
201
|
//# sourceMappingURL=ChatPanel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatPanel.js","sourceRoot":"","sources":["../../src/components/ChatPanel.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE9C,OAAO,EAAE,WAAW,EAA6B,MAAM,kBAAkB,CAAC;AAC1E,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AA2B7B,SAAS,qBAAqB,CAAC,IAAc,EAAE,MAAmB;IAChE,OAAO,KAAC,gBAAgB,IAAe,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,IAAnC,IAAI,CAAC,EAAE,CAAgC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,KAAqB;IAC7C,MAAM,EACJ,QAAQ,EACR,WAAW,GAAG,KAAK,EACnB,QAAQ,EACR,QAAQ,EACR,SAAS,EACT,gBAAgB,GAAG,iBAAiB,EACpC,MAAM,EACN,cAAc,GAAG,qBAAqB,EACtC,UAAU,EACV,QAAQ,GAAG,KAAK,GACjB,GAAG,KAAK,CAAC;IACV,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAEvC,MAAM,YAAY,GAAG,WAAW,CAC9B,KAAK,EAAE,CAAmB,EAAE,EAAE;QAC5B,CAAC,EAAE,cAAc,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,OAAO,IAAI,QAAQ;YAAE,OAAO;QACjC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACb,MAAM,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;IACvC,CAAC,EACD,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAC5B,CAAC;IAEF,MAAM,aAAa,GAAG,WAAW,CAC/B,CAAC,aAAmC,EAAE,EAAE;QACtC,MAAM,EAAE,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,aAAa,CAAC;QAC3E,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,KAAK,WAAW,CAAC;QACjD,OAAO,CACL,2BAEa,OAAO,CAAC,IAAI,EACvB,SAAS,EAAE,EAAE,CACX,aAAa,EACb,WAAW,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,aAAa,CAC9C,YAED,eACE,SAAS,EAAE,EAAE,CACX,iCAAiC,EACjC,WAAW,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CAC1C,aAED,eACE,SAAS,EAAE,EAAE,CACX,2DAA2D,EAC3D,WAAW;4BACT,CAAC,CAAC,0DAA0D;4BAC5D,CAAC,CAAC,iEAAiE,CACtE,aAED,cAAK,SAAS,EAAC,qBAAqB,YACjC,OAAO,CAAC,OAAO,IAAI,CAAC,eAAe,IAAI,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GACzD,EACL,eAAe,IAAI,SAAS,CAAC,CAAC,CAAC,CAC9B,oCAEE,SAAS,EAAC,6FAA6F,GACvG,CACH,CAAC,CAAC,CAAC,IAAI,IACJ,EACL,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAClE,cAAK,SAAS,EAAC,8BAA8B,YAC1C,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAC9B,cAAc,CACZ,IAAI;wBACJ,0DAA0D;wBAC1D,uDAAuD;wBACvD,yDAAyD;wBACzD,OAAO,CAAC,UAAU,CACnB,CACF,GACG,CACP,CAAC,CAAC,CAAC,IAAI,IACJ,IA5CD,OAAO,CAAC,EAAE,IAAI,aAAa,CAAC,KAAK,CA6ClC,CACP,CAAC;IACJ,CAAC,EACD,CAAC,cAAc,CAAC,CACjB,CAAC;IAEF,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CACX,mEAAmE,EACnE,SAAS,CACV,aAEA,MAAM,EACP,cAAK,SAAS,EAAC,wBAAwB,YACrC,KAAC,WAAW,IACV,QAAQ,EAAE,QAAQ,EAClB,WAAW,EAAE,WAAW,EACxB,aAAa,EAAE,aAAa,EAC5B,UAAU,EAAE,UAAU,GACtB,GACE,EACN,gBACE,SAAS,EAAC,gFAAgF,EAC1F,QAAQ,EAAE,YAAY,aAEtB,gBACE,IAAI,EAAC,MAAM,EACX,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACzC,WAAW,EAAE,gBAAgB,EAC7B,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,EAAE,CACX,oJAAoJ,EACpJ,mFAAmF,EACnF,QAAQ,IAAI,YAAY,CACzB,GACD,EACD,WAAW,IAAI,QAAQ,CAAC,CAAC,CAAC,CACzB,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,QAAQ,EACjB,SAAS,EAAC,0GAA0G,qBAG7G,CACV,CAAC,CAAC,CAAC,CACF,iBACE,IAAI,EAAC,QAAQ,EACb,QAAQ,EAAE,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EACnC,SAAS,EAAE,EAAE,CACX,6FAA6F,EAC7F,CAAC,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,YAAY,CAC5C,qBAGM,CACV,IACI,IACH,CACP,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"ChatPanel.js","sourceRoot":"","sources":["../../src/components/ChatPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
export { MessageList } from './MessageList.js';
|
|
2
2
|
export type { MessageListProps, MessageRendererProps } from './MessageList.js';
|
|
3
3
|
export { ChatPanel } from './ChatPanel.js';
|
|
4
|
-
export type { ChatPanelProps } from './ChatPanel.js';
|
|
4
|
+
export type { ChatPanelProps, ChatPanelRootProps, ChatPanelHeaderProps, ChatPanelMessagesProps, ChatPanelInputProps, ChatPanelInputHandle, ChatPanelEmptyProps, ChatPanelStreamingStatusProps, } from './ChatPanel.js';
|
|
5
|
+
export { AgentSelector } from './AgentSelector.js';
|
|
6
|
+
export type { AgentSelectorProps } from './AgentSelector.js';
|
|
5
7
|
export { OrchestrationPlanCard } from './OrchestrationPlanCard.js';
|
|
6
8
|
export type { OrchestrationPlanCardProps, OrchestrationStep, OrchestrationStepStatus, } from './OrchestrationPlanCard.js';
|
|
7
9
|
export { ToolCallRenderer } from './ToolCallRenderer.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAE/E,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,YAAY,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAE/E,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,EACV,cAAc,EACd,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACpB,mBAAmB,EACnB,6BAA6B,GAC9B,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAE7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,YAAY,EACV,0BAA0B,EAC1B,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,YAAY,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAEnE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,YAAY,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/components/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { MessageList } from './MessageList.js';
|
|
2
2
|
export { ChatPanel } from './ChatPanel.js';
|
|
3
|
+
export { AgentSelector } from './AgentSelector.js';
|
|
3
4
|
export { OrchestrationPlanCard } from './OrchestrationPlanCard.js';
|
|
4
5
|
export { ToolCallRenderer } from './ToolCallRenderer.js';
|
|
5
6
|
export { SSEStreamView } from './SSEStreamView.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/components/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAY3C,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAOnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -9,4 +9,6 @@
|
|
|
9
9
|
*/
|
|
10
10
|
export * from './hooks/index.js';
|
|
11
11
|
export * from './components/index.js';
|
|
12
|
+
export { SSEParser, parseSSEData, bridgeLegacySSE, MockChatStreamTransport, useChatComposer, useChatList, useChatSession, useToolCallStream, useScrollLock, ChatSessionProvider, useChatSessionContext, useOptionalChatSession, useChatSessionSlice, } from './state/index.js';
|
|
13
|
+
export type { SSEFrame, SSEParserOptions, EnvelopeProfile, BridgeLegacySSEOptions, MockScript, MockScriptStep, MockChatStreamTransportOptions, UseChatComposerOptions, UseChatComposerReturn, ChatListTransport, UseChatListOptions, UseChatListReturn, UseChatSessionOptions, UseChatSessionReturn, ToolCallEntry, UseToolCallStreamOptions, UseToolCallStreamReturn, UseScrollLockOptions, UseScrollLockReturn, ChatSessionContextValue, ChatSessionProviderProps, } from './state/index.js';
|
|
12
14
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AAMtC,OAAO,EACL,SAAS,EACT,YAAY,EACZ,eAAe,EACf,uBAAuB,EACvB,eAAe,EACf,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EACV,QAAQ,EACR,gBAAgB,EAChB,eAAe,EACf,sBAAsB,EACtB,UAAU,EACV,cAAc,EACd,8BAA8B,EAC9B,sBAAsB,EACtB,qBAAqB,EACrB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,aAAa,EACb,wBAAwB,EACxB,uBAAuB,EACvB,oBAAoB,EACpB,mBAAmB,EACnB,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,kBAAkB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -9,4 +9,9 @@
|
|
|
9
9
|
*/
|
|
10
10
|
export * from './hooks/index.js';
|
|
11
11
|
export * from './components/index.js';
|
|
12
|
+
// `state/` is the home for chat-session primitives (hooks + transports +
|
|
13
|
+
// SSE parsing) lifted out of deeppath / deeppath-agent. The package root
|
|
14
|
+
// re-exports the public surface for convenience; the `./state` subpath is the
|
|
15
|
+
// canonical entrypoint for tree-shaking.
|
|
16
|
+
export { SSEParser, parseSSEData, bridgeLegacySSE, MockChatStreamTransport, useChatComposer, useChatList, useChatSession, useToolCallStream, useScrollLock, ChatSessionProvider, useChatSessionContext, useOptionalChatSession, useChatSessionSlice, } from './state/index.js';
|
|
12
17
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,cAAc,kBAAkB,CAAC;AACjC,cAAc,uBAAuB,CAAC;AAEtC,yEAAyE;AACzE,yEAAyE;AACzE,8EAA8E;AAC9E,yCAAyC;AACzC,OAAO,EACL,SAAS,EACT,YAAY,EACZ,eAAe,EACf,uBAAuB,EACvB,eAAe,EACf,WAAW,EACX,cAAc,EACd,iBAAiB,EACjB,aAAa,EACb,mBAAmB,EACnB,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,GACpB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `ChatSessionProvider` + `useChatSessionContext`
|
|
3
|
+
*
|
|
4
|
+
* Lifts the chat-session primitives out of the host app's god-context (e.g.
|
|
5
|
+
* deeppath's `ChatUIContext`, deeppath-agent's hooks) into a framework-owned
|
|
6
|
+
* provider. Concretely it owns:
|
|
7
|
+
*
|
|
8
|
+
* - the streaming transcript: `messages`, `isStreaming`, `streamingMessageId`
|
|
9
|
+
* - send / cancel / clear actions
|
|
10
|
+
* - the composer (draft, send, cancel, key handlers)
|
|
11
|
+
*
|
|
12
|
+
* App-specific concerns that don't belong here (file uploads, geolocation,
|
|
13
|
+
* suggestion banners, chat tool toggles, chat list / agent selector) stay in
|
|
14
|
+
* the host app's own context. The `extras` slot lets apps thread custom
|
|
15
|
+
* values through the same provider so chat cards can call host actions
|
|
16
|
+
* without prop-drilling.
|
|
17
|
+
*
|
|
18
|
+
* Usage in a host app:
|
|
19
|
+
*
|
|
20
|
+
* <ChatSessionProvider
|
|
21
|
+
* value={{ ...useChatSession({ transport }), extras: { ...appHooks } }}
|
|
22
|
+
* >
|
|
23
|
+
* <ChatPanel.Root>...</ChatPanel.Root>
|
|
24
|
+
* </ChatSessionProvider>
|
|
25
|
+
*
|
|
26
|
+
* Cards / shell pieces consume via `useChatSessionContext()` so they don't
|
|
27
|
+
* import the host's context directly. This is the seam that lets the same
|
|
28
|
+
* compound `ChatPanel` work in deeppath, deeppath-agent, and the framework
|
|
29
|
+
* `examples/web-shell`.
|
|
30
|
+
*/
|
|
31
|
+
import * as React from 'react';
|
|
32
|
+
import type { ChatMessage } from '@steerable/agent-protocol';
|
|
33
|
+
import type { UseChatSessionReturn } from './useChatSession.js';
|
|
34
|
+
export interface ChatSessionContextValue<TExtras = unknown> extends UseChatSessionReturn {
|
|
35
|
+
/** Host-specific values threaded through the same provider (geo, files, ...). */
|
|
36
|
+
extras?: TExtras;
|
|
37
|
+
}
|
|
38
|
+
export interface ChatSessionProviderProps<TExtras = unknown> {
|
|
39
|
+
value: ChatSessionContextValue<TExtras>;
|
|
40
|
+
children: React.ReactNode;
|
|
41
|
+
}
|
|
42
|
+
export declare function ChatSessionProvider<TExtras = unknown>({ value, children, }: ChatSessionProviderProps<TExtras>): import("react/jsx-runtime").JSX.Element;
|
|
43
|
+
/**
|
|
44
|
+
* Read the active chat session. Throws if no `ChatSessionProvider` is
|
|
45
|
+
* mounted above -- this is intentional: cards / shell pieces should be
|
|
46
|
+
* usable both inside the provider (typical) and via direct props for
|
|
47
|
+
* apps that haven't migrated yet (use `useOptionalChatSession()` for that).
|
|
48
|
+
*/
|
|
49
|
+
export declare function useChatSessionContext<TExtras = unknown>(): ChatSessionContextValue<TExtras>;
|
|
50
|
+
/** Non-throwing variant for components that want to fall back to props. */
|
|
51
|
+
export declare function useOptionalChatSession<TExtras = unknown>(): ChatSessionContextValue<TExtras> | null;
|
|
52
|
+
/**
|
|
53
|
+
* Convenience selector for the most-used slice in cards (`{ messages,
|
|
54
|
+
* isStreaming, sendUserMessage, cancel }`). Returns null when there's no
|
|
55
|
+
* provider so cards can opt into context-driven mode incrementally.
|
|
56
|
+
*/
|
|
57
|
+
export declare function useChatSessionSlice(): Pick<ChatSessionContextValue, 'messages' | 'isStreaming' | 'sendUserMessage' | 'cancel'> | null;
|
|
58
|
+
export type { ChatMessage };
|
|
59
|
+
//# sourceMappingURL=ChatSessionProvider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ChatSessionProvider.d.ts","sourceRoot":"","sources":["../../src/state/ChatSessionProvider.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAEhE,MAAM,WAAW,uBAAuB,CAAC,OAAO,GAAG,OAAO,CAAE,SAAQ,oBAAoB;IACtF,iFAAiF;IACjF,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAID,MAAM,WAAW,wBAAwB,CAAC,OAAO,GAAG,OAAO;IACzD,KAAK,EAAE,uBAAuB,CAAC,OAAO,CAAC,CAAC;IACxC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,wBAAgB,mBAAmB,CAAC,OAAO,GAAG,OAAO,EAAE,EACrD,KAAK,EACL,QAAQ,GACT,EAAE,wBAAwB,CAAC,OAAO,CAAC,2CAMnC;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,GAAG,OAAO,KAAK,uBAAuB,CAAC,OAAO,CAAC,CAM3F;AAED,2EAA2E;AAC3E,wBAAgB,sBAAsB,CAAC,OAAO,GAAG,OAAO,KACpD,uBAAuB,CAAC,OAAO,CAAC,GAChC,IAAI,CAGP;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,IAC/B,IAAI,CAAC,uBAAuB,EAAE,UAAU,GAAG,aAAa,GAAG,iBAAiB,GAAG,QAAQ,CAAC,GACxF,IAAI,CASP;AAED,YAAY,EAAE,WAAW,EAAE,CAAC"}
|