@talk2view/sdk 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 (87) hide show
  1. package/LICENSE +7 -0
  2. package/README.md +594 -0
  3. package/dist/auth.d.ts +39 -0
  4. package/dist/auth.d.ts.map +1 -0
  5. package/dist/auth.js +102 -0
  6. package/dist/auth.js.map +1 -0
  7. package/dist/client.d.ts +27 -0
  8. package/dist/client.d.ts.map +1 -0
  9. package/dist/client.js +195 -0
  10. package/dist/client.js.map +1 -0
  11. package/dist/errors.d.ts +21 -0
  12. package/dist/errors.d.ts.map +1 -0
  13. package/dist/errors.js +38 -0
  14. package/dist/errors.js.map +1 -0
  15. package/dist/index.d.ts +80 -0
  16. package/dist/index.d.ts.map +1 -0
  17. package/dist/index.js +115 -0
  18. package/dist/index.js.map +1 -0
  19. package/dist/react/ChatInput.d.ts +13 -0
  20. package/dist/react/ChatInput.d.ts.map +1 -0
  21. package/dist/react/ChatInput.js +163 -0
  22. package/dist/react/ChatInput.js.map +1 -0
  23. package/dist/react/ChatMessage.d.ts +10 -0
  24. package/dist/react/ChatMessage.d.ts.map +1 -0
  25. package/dist/react/ChatMessage.js +53 -0
  26. package/dist/react/ChatMessage.js.map +1 -0
  27. package/dist/react/ChatPanel.d.ts +17 -0
  28. package/dist/react/ChatPanel.d.ts.map +1 -0
  29. package/dist/react/ChatPanel.js +385 -0
  30. package/dist/react/ChatPanel.js.map +1 -0
  31. package/dist/react/LoginModal.d.ts +10 -0
  32. package/dist/react/LoginModal.d.ts.map +1 -0
  33. package/dist/react/LoginModal.js +135 -0
  34. package/dist/react/LoginModal.js.map +1 -0
  35. package/dist/react/SettingsView.d.ts +9 -0
  36. package/dist/react/SettingsView.d.ts.map +1 -0
  37. package/dist/react/SettingsView.js +190 -0
  38. package/dist/react/SettingsView.js.map +1 -0
  39. package/dist/react/T2VProvider.d.ts +25 -0
  40. package/dist/react/T2VProvider.d.ts.map +1 -0
  41. package/dist/react/T2VProvider.js +38 -0
  42. package/dist/react/T2VProvider.js.map +1 -0
  43. package/dist/react/index.d.ts +38 -0
  44. package/dist/react/index.d.ts.map +1 -0
  45. package/dist/react/index.js +28 -0
  46. package/dist/react/index.js.map +1 -0
  47. package/dist/react/theme.d.ts +32 -0
  48. package/dist/react/theme.d.ts.map +1 -0
  49. package/dist/react/theme.js +131 -0
  50. package/dist/react/theme.js.map +1 -0
  51. package/dist/react/useT2VAuth.d.ts +16 -0
  52. package/dist/react/useT2VAuth.d.ts.map +1 -0
  53. package/dist/react/useT2VAuth.js +52 -0
  54. package/dist/react/useT2VAuth.js.map +1 -0
  55. package/dist/react/useT2VChat.d.ts +28 -0
  56. package/dist/react/useT2VChat.d.ts.map +1 -0
  57. package/dist/react/useT2VChat.js +103 -0
  58. package/dist/react/useT2VChat.js.map +1 -0
  59. package/dist/react/useT2VTools.d.ts +11 -0
  60. package/dist/react/useT2VTools.d.ts.map +1 -0
  61. package/dist/react/useT2VTools.js +29 -0
  62. package/dist/react/useT2VTools.js.map +1 -0
  63. package/dist/react/useUserPreferences.d.ts +13 -0
  64. package/dist/react/useUserPreferences.d.ts.map +1 -0
  65. package/dist/react/useUserPreferences.js +40 -0
  66. package/dist/react/useUserPreferences.js.map +1 -0
  67. package/dist/sessions.d.ts +34 -0
  68. package/dist/sessions.d.ts.map +1 -0
  69. package/dist/sessions.js +95 -0
  70. package/dist/sessions.js.map +1 -0
  71. package/dist/storage.d.ts +16 -0
  72. package/dist/storage.d.ts.map +1 -0
  73. package/dist/storage.js +84 -0
  74. package/dist/storage.js.map +1 -0
  75. package/dist/streaming.d.ts +9 -0
  76. package/dist/streaming.d.ts.map +1 -0
  77. package/dist/streaming.js +45 -0
  78. package/dist/streaming.js.map +1 -0
  79. package/dist/tools.d.ts +40 -0
  80. package/dist/tools.d.ts.map +1 -0
  81. package/dist/tools.js +83 -0
  82. package/dist/tools.js.map +1 -0
  83. package/dist/types.d.ts +153 -0
  84. package/dist/types.d.ts.map +1 -0
  85. package/dist/types.js +3 -0
  86. package/dist/types.js.map +1 -0
  87. package/package.json +74 -0
@@ -0,0 +1,163 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * ChatInput — text input with mic and send buttons.
4
+ *
5
+ * Voice input uses MediaRecorder + Talk2View's /v1/audio/transcriptions endpoint.
6
+ */
7
+ import { useCallback, useRef, useState } from 'react';
8
+ import { T2V_COLORS, T2V_FONTS } from './theme';
9
+ import { useT2V } from './T2VProvider';
10
+ import { useUserPreferences } from './useUserPreferences';
11
+ export function ChatInput({ onSend, disabled = false, placeholder = 'Type a message...', className = '', }) {
12
+ const { t2v } = useT2V();
13
+ const { preferences } = useUserPreferences();
14
+ const [value, setValue] = useState('');
15
+ const [inputFocused, setInputFocused] = useState(false);
16
+ const [btnHover, setBtnHover] = useState(false);
17
+ const [micHover, setMicHover] = useState(false);
18
+ const [isRecording, setIsRecording] = useState(false);
19
+ const [isTranscribing, setIsTranscribing] = useState(false);
20
+ const mediaRecorderRef = useRef(null);
21
+ const chunksRef = useRef([]);
22
+ const canSend = value.trim().length > 0 && !disabled;
23
+ const micDisabled = disabled || isTranscribing || !preferences.sttModel;
24
+ const handleSubmit = useCallback((e) => {
25
+ e.preventDefault();
26
+ const trimmed = value.trim();
27
+ if (!trimmed || disabled)
28
+ return;
29
+ onSend(trimmed);
30
+ setValue('');
31
+ }, [value, disabled, onSend]);
32
+ const handleKeyDown = useCallback((e) => {
33
+ if (e.key === 'Enter' && !e.shiftKey) {
34
+ e.preventDefault();
35
+ handleSubmit(e);
36
+ }
37
+ }, [handleSubmit]);
38
+ const transcribeAudio = useCallback(async (audioBlob) => {
39
+ setIsTranscribing(true);
40
+ try {
41
+ const ext = audioBlob.type.includes('mp4') ? 'mp4' : 'webm';
42
+ const formData = new FormData();
43
+ formData.append('file', audioBlob, `recording.${ext}`);
44
+ if (preferences.sttModel) {
45
+ formData.append('model', preferences.sttModel);
46
+ }
47
+ if (preferences.sttLanguage) {
48
+ formData.append('language', preferences.sttLanguage);
49
+ }
50
+ const data = await t2v.transcribe(formData);
51
+ const text = data.text?.trim();
52
+ if (text) {
53
+ onSend(text);
54
+ }
55
+ }
56
+ catch (err) {
57
+ console.error('Transcription error:', err);
58
+ }
59
+ finally {
60
+ setIsTranscribing(false);
61
+ }
62
+ }, [t2v, onSend, preferences.sttModel, preferences.sttLanguage]);
63
+ const toggleRecording = useCallback(async () => {
64
+ if (isRecording && mediaRecorderRef.current) {
65
+ mediaRecorderRef.current.stop();
66
+ return;
67
+ }
68
+ let stream = null;
69
+ try {
70
+ stream = await navigator.mediaDevices.getUserMedia({ audio: true });
71
+ const mediaRecorder = new MediaRecorder(stream);
72
+ chunksRef.current = [];
73
+ mediaRecorder.ondataavailable = (e) => {
74
+ if (e.data.size > 0)
75
+ chunksRef.current.push(e.data);
76
+ };
77
+ mediaRecorder.onstop = () => {
78
+ const mimeType = mediaRecorder.mimeType || 'audio/webm';
79
+ const audioBlob = new Blob(chunksRef.current, { type: mimeType });
80
+ stream.getTracks().forEach((track) => track.stop());
81
+ chunksRef.current = [];
82
+ mediaRecorderRef.current = null;
83
+ setIsRecording(false);
84
+ if (audioBlob.size > 0) {
85
+ transcribeAudio(audioBlob);
86
+ }
87
+ };
88
+ mediaRecorderRef.current = mediaRecorder;
89
+ mediaRecorder.start(1000); // flush chunks every 1s — fixes Safari dropping early audio
90
+ setIsRecording(true);
91
+ }
92
+ catch (err) {
93
+ stream?.getTracks().forEach((track) => track.stop());
94
+ console.error('Voice recording error:', err);
95
+ }
96
+ }, [isRecording, transcribeAudio]);
97
+ return (_jsxs("form", { onSubmit: handleSubmit, className: `t2v-chat-input ${className}`, style: {
98
+ display: 'flex',
99
+ gap: '8px',
100
+ padding: '12px',
101
+ borderTop: `1px solid ${T2V_COLORS.lightGray}`,
102
+ backgroundColor: T2V_COLORS.light,
103
+ }, children: [_jsx("input", { type: "text", value: value, onChange: (e) => setValue(e.target.value), onKeyDown: handleKeyDown, onFocus: () => setInputFocused(true), onBlur: () => setInputFocused(false), placeholder: isRecording ? 'Recording...' : isTranscribing ? 'Transcribing...' : placeholder, disabled: disabled, style: {
104
+ flex: 1,
105
+ padding: '10px 14px',
106
+ borderRadius: '8px',
107
+ border: `1.5px solid ${inputFocused ? T2V_COLORS.turquoise : T2V_COLORS.lightGray}`,
108
+ fontSize: '14px',
109
+ fontFamily: T2V_FONTS.body,
110
+ outline: 'none',
111
+ backgroundColor: disabled ? T2V_COLORS.lightGray : '#ffffff',
112
+ color: T2V_COLORS.dark,
113
+ boxShadow: inputFocused ? `0 0 0 3px rgba(64, 212, 182, 0.15)` : 'none',
114
+ transition: 'border-color 0.15s ease, box-shadow 0.15s ease',
115
+ } }), _jsx("button", { type: "button", onClick: toggleRecording, disabled: micDisabled, onMouseEnter: () => setMicHover(true), onMouseLeave: () => setMicHover(false), style: {
116
+ display: 'flex',
117
+ alignItems: 'center',
118
+ justifyContent: 'center',
119
+ width: '42px',
120
+ height: '42px',
121
+ borderRadius: '8px',
122
+ border: 'none',
123
+ backgroundColor: isRecording
124
+ ? T2V_COLORS.errorRed
125
+ : isTranscribing
126
+ ? T2V_COLORS.turquoise
127
+ : micHover
128
+ ? T2V_COLORS.stormyTeal
129
+ : T2V_COLORS.lightGray,
130
+ color: isRecording || isTranscribing || micHover ? T2V_COLORS.light : T2V_COLORS.midGray,
131
+ cursor: micDisabled ? 'not-allowed' : 'pointer',
132
+ transition: 'background-color 0.15s ease, transform 0.15s ease',
133
+ transform: micHover && !micDisabled ? 'translateY(-1px)' : 'none',
134
+ flexShrink: 0,
135
+ }, title: !preferences.sttModel ? 'Select a Speech-to-Text model in Settings to enable voice input' : undefined, "aria-label": isRecording ? 'Stop recording' : isTranscribing ? 'Transcribing...' : !preferences.sttModel ? 'Voice input unavailable' : 'Start voice input', children: isTranscribing ? (_jsx("span", { style: {
136
+ display: 'inline-block',
137
+ width: '16px',
138
+ height: '16px',
139
+ border: `2px solid ${T2V_COLORS.light}`,
140
+ borderTopColor: 'transparent',
141
+ borderRadius: '50%',
142
+ animation: 't2v-spin 0.6s linear infinite',
143
+ } })) : (_jsxs("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("path", { d: "M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z" }), _jsx("path", { d: "M19 10v2a7 7 0 0 1-14 0v-2" }), _jsx("line", { x1: "12", y1: "19", x2: "12", y2: "23" }), _jsx("line", { x1: "8", y1: "23", x2: "16", y2: "23" })] })) }), _jsx("button", { type: "submit", disabled: !canSend, onMouseEnter: () => setBtnHover(true), onMouseLeave: () => setBtnHover(false), style: {
144
+ display: 'flex',
145
+ alignItems: 'center',
146
+ justifyContent: 'center',
147
+ width: '42px',
148
+ height: '42px',
149
+ borderRadius: '8px',
150
+ border: 'none',
151
+ backgroundColor: canSend
152
+ ? btnHover
153
+ ? T2V_COLORS.stormyTeal
154
+ : T2V_COLORS.accent
155
+ : T2V_COLORS.lightGray,
156
+ color: canSend ? T2V_COLORS.dark : T2V_COLORS.midGray,
157
+ cursor: canSend ? 'pointer' : 'not-allowed',
158
+ transition: 'background-color 0.15s ease, transform 0.15s ease',
159
+ transform: canSend && btnHover ? 'translateY(-1px)' : 'none',
160
+ flexShrink: 0,
161
+ }, "aria-label": "Send message", children: _jsxs("svg", { width: "18", height: "18", viewBox: "0 0 24 24", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: [_jsx("line", { x1: "22", y1: "2", x2: "11", y2: "13" }), _jsx("polygon", { points: "22 2 15 22 11 13 2 9 22 2" })] }) })] }));
162
+ }
163
+ //# sourceMappingURL=ChatInput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatInput.js","sourceRoot":"","sources":["../../src/react/ChatInput.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * ChatMessage — renders a single chat message bubble with markdown support.
3
+ */
4
+ import type { DisplayMessage } from './useT2VChat';
5
+ export interface ChatMessageProps {
6
+ message: DisplayMessage;
7
+ className?: string;
8
+ }
9
+ export declare function ChatMessage({ message, className }: ChatMessageProps): import("react/jsx-runtime").JSX.Element;
10
+ //# sourceMappingURL=ChatMessage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatMessage.d.ts","sourceRoot":"","sources":["../../src/react/ChatMessage.tsx"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAMnD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,cAAc,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,WAAW,CAAC,EAAE,OAAO,EAAE,SAAc,EAAE,EAAE,gBAAgB,2CAqExE"}
@@ -0,0 +1,53 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ /**
3
+ * ChatMessage — renders a single chat message bubble with markdown support.
4
+ */
5
+ import DOMPurify from 'dompurify';
6
+ import { marked } from 'marked';
7
+ import { useMemo } from 'react';
8
+ import { T2V_COLORS, T2V_FONTS } from './theme';
9
+ // Configure marked for inline-friendly output
10
+ marked.setOptions({ breaks: true, gfm: true });
11
+ export function ChatMessage({ message, className = '' }) {
12
+ const isUser = message.role === 'user';
13
+ const time = message.timestamp.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
14
+ const htmlContent = useMemo(() => {
15
+ if (isUser || !message.content)
16
+ return '';
17
+ const raw = marked.parse(message.content);
18
+ if (typeof raw !== 'string')
19
+ return '';
20
+ return DOMPurify.sanitize(raw);
21
+ }, [isUser, message.content]);
22
+ return (_jsx("div", { className: `t2v-message t2v-message--${message.role} ${className}`, style: {
23
+ display: 'flex',
24
+ justifyContent: isUser ? 'flex-end' : 'flex-start',
25
+ marginBottom: '12px',
26
+ animation: 't2v-fade-in 0.25s ease-out',
27
+ }, children: _jsxs("div", { style: {
28
+ maxWidth: '80%',
29
+ padding: '10px 14px',
30
+ borderRadius: isUser ? '14px 14px 4px 14px' : '14px 14px 14px 4px',
31
+ backgroundColor: isUser ? T2V_COLORS.dark : 'rgba(64, 212, 182, 0.08)',
32
+ color: isUser ? T2V_COLORS.light : T2V_COLORS.dark,
33
+ fontSize: '14px',
34
+ fontFamily: T2V_FONTS.body,
35
+ lineHeight: '1.55',
36
+ wordBreak: 'break-word',
37
+ ...(isUser ? { whiteSpace: 'pre-wrap' } : {}),
38
+ }, children: [isUser ? (_jsx("div", { children: message.content })) : (_jsx("div", { className: "t2v-markdown", dangerouslySetInnerHTML: { __html: htmlContent } })), message.isStreaming && (_jsx("span", { style: {
39
+ display: 'inline-block',
40
+ width: '2px',
41
+ height: '14px',
42
+ backgroundColor: isUser ? T2V_COLORS.light : T2V_COLORS.turquoise,
43
+ marginLeft: '2px',
44
+ animation: 't2v-blink 1s infinite',
45
+ } })), _jsx("div", { style: {
46
+ fontSize: '10px',
47
+ fontFamily: T2V_FONTS.heading,
48
+ color: isUser ? 'rgba(248, 250, 252, 0.5)' : T2V_COLORS.midGray,
49
+ marginTop: '4px',
50
+ textAlign: 'right',
51
+ }, children: time })] }) }));
52
+ }
53
+ //# sourceMappingURL=ChatMessage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatMessage.js","sourceRoot":"","sources":["../../src/react/ChatMessage.tsx"],"names":[],"mappings":";AAAA;;GAEG;AAEH,OAAO,SAAS,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAc,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEhD,8CAA8C;AAC9C,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;AAO/C,MAAM,UAAU,WAAW,CAAC,EAAE,OAAO,EAAE,SAAS,GAAG,EAAE,EAAoB;IACvE,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,KAAK,MAAM,CAAC;IACvC,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,kBAAkB,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAE9F,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE;QAC/B,IAAI,MAAM,IAAI,CAAC,OAAO,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QAC1C,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,OAAO,GAAG,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC;QACvC,OAAO,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACjC,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAE9B,OAAO,CACL,cACE,SAAS,EAAE,4BAA4B,OAAO,CAAC,IAAI,IAAI,SAAS,EAAE,EAClE,KAAK,EAAE;YACL,OAAO,EAAE,MAAM;YACf,cAAc,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY;YAClD,YAAY,EAAE,MAAM;YACpB,SAAS,EAAE,4BAA4B;SACxC,YAED,eACE,KAAK,EAAE;gBACL,QAAQ,EAAE,KAAK;gBACf,OAAO,EAAE,WAAW;gBACpB,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC,CAAC,oBAAoB;gBAClE,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,0BAA0B;gBACtE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,IAAI;gBAClD,QAAQ,EAAE,MAAM;gBAChB,UAAU,EAAE,SAAS,CAAC,IAAI;gBAC1B,UAAU,EAAE,MAAM;gBAClB,SAAS,EAAE,YAAY;gBACvB,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,UAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACvD,aAEA,MAAM,CAAC,CAAC,CAAC,CACR,wBAAM,OAAO,CAAC,OAAO,GAAO,CAC7B,CAAC,CAAC,CAAC,CACF,cACE,SAAS,EAAC,cAAc,EACxB,uBAAuB,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,GAChD,CACH,EACA,OAAO,CAAC,WAAW,IAAI,CACtB,eACE,KAAK,EAAE;wBACL,OAAO,EAAE,cAAc;wBACvB,KAAK,EAAE,KAAK;wBACZ,MAAM,EAAE,MAAM;wBACd,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS;wBACjE,UAAU,EAAE,KAAK;wBACjB,SAAS,EAAE,uBAAuB;qBACnC,GACD,CACH,EACD,cACE,KAAK,EAAE;wBACL,QAAQ,EAAE,MAAM;wBAChB,UAAU,EAAE,SAAS,CAAC,OAAO;wBAC7B,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO;wBAC/D,SAAS,EAAE,KAAK;wBAChB,SAAS,EAAE,OAAO;qBACnB,YAEA,IAAI,GACD,IACF,GACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * ChatPanel — self-contained, embeddable chat panel with tool support.
3
+ *
4
+ * Drop-in chat UI that handles authentication, tool registration,
5
+ * streaming, and the full interrupt/resume cycle.
6
+ */
7
+ import React from 'react';
8
+ import type { ClientTool } from '../types';
9
+ export interface ChatPanelProps {
10
+ tools?: ClientTool[];
11
+ systemPrompt?: string;
12
+ signupUrl?: string;
13
+ className?: string;
14
+ style?: React.CSSProperties;
15
+ }
16
+ export declare function ChatPanel({ tools, systemPrompt, signupUrl, className, style, }: ChatPanelProps): import("react/jsx-runtime").JSX.Element;
17
+ //# sourceMappingURL=ChatPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatPanel.d.ts","sourceRoot":"","sources":["../../src/react/ChatPanel.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAmD,MAAM,OAAO,CAAC;AACxE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AA0B3C,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED,wBAAgB,SAAS,CAAC,EACxB,KAAU,EACV,YAAY,EACZ,SAAS,EACT,SAAc,EACd,KAAK,GACN,EAAE,cAAc,2CA+lBhB"}