@agi-cli/web-sdk 0.1.61

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 (266) hide show
  1. package/README.md +187 -0
  2. package/dist/components/chat/ChatInput.d.ts +10 -0
  3. package/dist/components/chat/ChatInput.d.ts.map +1 -0
  4. package/dist/components/chat/ChatInput.js +53 -0
  5. package/dist/components/chat/ChatInput.js.map +1 -0
  6. package/dist/components/chat/ChatInputContainer.d.ts +9 -0
  7. package/dist/components/chat/ChatInputContainer.d.ts.map +1 -0
  8. package/dist/components/chat/ChatInputContainer.js +52 -0
  9. package/dist/components/chat/ChatInputContainer.js.map +1 -0
  10. package/dist/components/chat/ConfigModal.d.ts +13 -0
  11. package/dist/components/chat/ConfigModal.d.ts.map +1 -0
  12. package/dist/components/chat/ConfigModal.js +51 -0
  13. package/dist/components/chat/ConfigModal.js.map +1 -0
  14. package/dist/components/chat/ConfigSelector.d.ts +11 -0
  15. package/dist/components/chat/ConfigSelector.d.ts.map +1 -0
  16. package/dist/components/chat/ConfigSelector.js +47 -0
  17. package/dist/components/chat/ConfigSelector.js.map +1 -0
  18. package/dist/components/chat/StopButton.d.ts +8 -0
  19. package/dist/components/chat/StopButton.d.ts.map +1 -0
  20. package/dist/components/chat/StopButton.js +25 -0
  21. package/dist/components/chat/StopButton.js.map +1 -0
  22. package/dist/components/git/GitCommitModal.d.ts +2 -0
  23. package/dist/components/git/GitCommitModal.d.ts.map +1 -0
  24. package/dist/components/git/GitCommitModal.js +44 -0
  25. package/dist/components/git/GitCommitModal.js.map +1 -0
  26. package/dist/components/git/GitDiffPanel.d.ts +2 -0
  27. package/dist/components/git/GitDiffPanel.d.ts.map +1 -0
  28. package/dist/components/git/GitDiffPanel.js +69 -0
  29. package/dist/components/git/GitDiffPanel.js.map +1 -0
  30. package/dist/components/git/GitDiffViewer.d.ts +7 -0
  31. package/dist/components/git/GitDiffViewer.d.ts.map +1 -0
  32. package/dist/components/git/GitDiffViewer.js +136 -0
  33. package/dist/components/git/GitDiffViewer.js.map +1 -0
  34. package/dist/components/git/GitFileItem.d.ts +9 -0
  35. package/dist/components/git/GitFileItem.d.ts.map +1 -0
  36. package/dist/components/git/GitFileItem.js +90 -0
  37. package/dist/components/git/GitFileItem.js.map +1 -0
  38. package/dist/components/git/GitFileList.d.ts +7 -0
  39. package/dist/components/git/GitFileList.d.ts.map +1 -0
  40. package/dist/components/git/GitFileList.js +24 -0
  41. package/dist/components/git/GitFileList.js.map +1 -0
  42. package/dist/components/git/GitSidebar.d.ts +2 -0
  43. package/dist/components/git/GitSidebar.d.ts.map +1 -0
  44. package/dist/components/git/GitSidebar.js +38 -0
  45. package/dist/components/git/GitSidebar.js.map +1 -0
  46. package/dist/components/git/GitSidebarToggle.d.ts +2 -0
  47. package/dist/components/git/GitSidebarToggle.d.ts.map +1 -0
  48. package/dist/components/git/GitSidebarToggle.js +18 -0
  49. package/dist/components/git/GitSidebarToggle.js.map +1 -0
  50. package/dist/components/index.d.ts +28 -0
  51. package/dist/components/index.d.ts.map +1 -0
  52. package/dist/components/index.js +34 -0
  53. package/dist/components/index.js.map +1 -0
  54. package/dist/components/messages/AssistantMessageGroup.d.ts +10 -0
  55. package/dist/components/messages/AssistantMessageGroup.d.ts.map +1 -0
  56. package/dist/components/messages/AssistantMessageGroup.js +85 -0
  57. package/dist/components/messages/AssistantMessageGroup.js.map +1 -0
  58. package/dist/components/messages/MessagePartItem.d.ts +11 -0
  59. package/dist/components/messages/MessagePartItem.d.ts.map +1 -0
  60. package/dist/components/messages/MessagePartItem.js +290 -0
  61. package/dist/components/messages/MessagePartItem.js.map +1 -0
  62. package/dist/components/messages/MessageThread.d.ts +9 -0
  63. package/dist/components/messages/MessageThread.d.ts.map +1 -0
  64. package/dist/components/messages/MessageThread.js +88 -0
  65. package/dist/components/messages/MessageThread.js.map +1 -0
  66. package/dist/components/messages/MessageThreadContainer.d.ts +6 -0
  67. package/dist/components/messages/MessageThreadContainer.d.ts.map +1 -0
  68. package/dist/components/messages/MessageThreadContainer.js +18 -0
  69. package/dist/components/messages/MessageThreadContainer.js.map +1 -0
  70. package/dist/components/messages/UserMessageGroup.d.ts +8 -0
  71. package/dist/components/messages/UserMessageGroup.d.ts.map +1 -0
  72. package/dist/components/messages/UserMessageGroup.js +43 -0
  73. package/dist/components/messages/UserMessageGroup.js.map +1 -0
  74. package/dist/components/messages/renderers/ApplyPatchRenderer.d.ts +3 -0
  75. package/dist/components/messages/renderers/ApplyPatchRenderer.d.ts.map +1 -0
  76. package/dist/components/messages/renderers/ApplyPatchRenderer.js +36 -0
  77. package/dist/components/messages/renderers/ApplyPatchRenderer.js.map +1 -0
  78. package/dist/components/messages/renderers/BashRenderer.d.ts +3 -0
  79. package/dist/components/messages/renderers/BashRenderer.d.ts.map +1 -0
  80. package/dist/components/messages/renderers/BashRenderer.js +48 -0
  81. package/dist/components/messages/renderers/BashRenderer.js.map +1 -0
  82. package/dist/components/messages/renderers/DebugRenderer.d.ts +5 -0
  83. package/dist/components/messages/renderers/DebugRenderer.d.ts.map +1 -0
  84. package/dist/components/messages/renderers/DebugRenderer.js +5 -0
  85. package/dist/components/messages/renderers/DebugRenderer.js.map +1 -0
  86. package/dist/components/messages/renderers/DiffView.d.ts +6 -0
  87. package/dist/components/messages/renderers/DiffView.d.ts.map +1 -0
  88. package/dist/components/messages/renderers/DiffView.js +186 -0
  89. package/dist/components/messages/renderers/DiffView.js.map +1 -0
  90. package/dist/components/messages/renderers/EditRenderer.d.ts +3 -0
  91. package/dist/components/messages/renderers/EditRenderer.d.ts.map +1 -0
  92. package/dist/components/messages/renderers/EditRenderer.js +15 -0
  93. package/dist/components/messages/renderers/EditRenderer.js.map +1 -0
  94. package/dist/components/messages/renderers/ErrorRenderer.d.ts +8 -0
  95. package/dist/components/messages/renderers/ErrorRenderer.d.ts.map +1 -0
  96. package/dist/components/messages/renderers/ErrorRenderer.js +118 -0
  97. package/dist/components/messages/renderers/ErrorRenderer.js.map +1 -0
  98. package/dist/components/messages/renderers/FinishRenderer.d.ts +3 -0
  99. package/dist/components/messages/renderers/FinishRenderer.d.ts.map +1 -0
  100. package/dist/components/messages/renderers/FinishRenderer.js +7 -0
  101. package/dist/components/messages/renderers/FinishRenderer.js.map +1 -0
  102. package/dist/components/messages/renderers/GenericRenderer.d.ts +3 -0
  103. package/dist/components/messages/renderers/GenericRenderer.d.ts.map +1 -0
  104. package/dist/components/messages/renderers/GenericRenderer.js +42 -0
  105. package/dist/components/messages/renderers/GenericRenderer.js.map +1 -0
  106. package/dist/components/messages/renderers/GitCommitRenderer.d.ts +3 -0
  107. package/dist/components/messages/renderers/GitCommitRenderer.d.ts.map +1 -0
  108. package/dist/components/messages/renderers/GitCommitRenderer.js +18 -0
  109. package/dist/components/messages/renderers/GitCommitRenderer.js.map +1 -0
  110. package/dist/components/messages/renderers/GitDiffRenderer.d.ts +3 -0
  111. package/dist/components/messages/renderers/GitDiffRenderer.d.ts.map +1 -0
  112. package/dist/components/messages/renderers/GitDiffRenderer.js +25 -0
  113. package/dist/components/messages/renderers/GitDiffRenderer.js.map +1 -0
  114. package/dist/components/messages/renderers/GitStatusRenderer.d.ts +3 -0
  115. package/dist/components/messages/renderers/GitStatusRenderer.d.ts.map +1 -0
  116. package/dist/components/messages/renderers/GitStatusRenderer.js +56 -0
  117. package/dist/components/messages/renderers/GitStatusRenderer.js.map +1 -0
  118. package/dist/components/messages/renderers/ListRenderer.d.ts +3 -0
  119. package/dist/components/messages/renderers/ListRenderer.d.ts.map +1 -0
  120. package/dist/components/messages/renderers/ListRenderer.js +14 -0
  121. package/dist/components/messages/renderers/ListRenderer.js.map +1 -0
  122. package/dist/components/messages/renderers/ProgressUpdateRenderer.d.ts +3 -0
  123. package/dist/components/messages/renderers/ProgressUpdateRenderer.d.ts.map +1 -0
  124. package/dist/components/messages/renderers/ProgressUpdateRenderer.js +9 -0
  125. package/dist/components/messages/renderers/ProgressUpdateRenderer.js.map +1 -0
  126. package/dist/components/messages/renderers/ReadRenderer.d.ts +3 -0
  127. package/dist/components/messages/renderers/ReadRenderer.d.ts.map +1 -0
  128. package/dist/components/messages/renderers/ReadRenderer.js +59 -0
  129. package/dist/components/messages/renderers/ReadRenderer.js.map +1 -0
  130. package/dist/components/messages/renderers/SearchRenderer.d.ts +3 -0
  131. package/dist/components/messages/renderers/SearchRenderer.d.ts.map +1 -0
  132. package/dist/components/messages/renderers/SearchRenderer.js +62 -0
  133. package/dist/components/messages/renderers/SearchRenderer.js.map +1 -0
  134. package/dist/components/messages/renderers/ToolErrorDisplay.d.ts +12 -0
  135. package/dist/components/messages/renderers/ToolErrorDisplay.d.ts.map +1 -0
  136. package/dist/components/messages/renderers/ToolErrorDisplay.js +10 -0
  137. package/dist/components/messages/renderers/ToolErrorDisplay.js.map +1 -0
  138. package/dist/components/messages/renderers/TreeRenderer.d.ts +3 -0
  139. package/dist/components/messages/renderers/TreeRenderer.d.ts.map +1 -0
  140. package/dist/components/messages/renderers/TreeRenderer.js +20 -0
  141. package/dist/components/messages/renderers/TreeRenderer.js.map +1 -0
  142. package/dist/components/messages/renderers/UpdatePlanRenderer.d.ts +3 -0
  143. package/dist/components/messages/renderers/UpdatePlanRenderer.d.ts.map +1 -0
  144. package/dist/components/messages/renderers/UpdatePlanRenderer.js +13 -0
  145. package/dist/components/messages/renderers/UpdatePlanRenderer.js.map +1 -0
  146. package/dist/components/messages/renderers/WebSearchRenderer.d.ts +3 -0
  147. package/dist/components/messages/renderers/WebSearchRenderer.d.ts.map +1 -0
  148. package/dist/components/messages/renderers/WebSearchRenderer.js +35 -0
  149. package/dist/components/messages/renderers/WebSearchRenderer.js.map +1 -0
  150. package/dist/components/messages/renderers/WriteRenderer.d.ts +3 -0
  151. package/dist/components/messages/renderers/WriteRenderer.d.ts.map +1 -0
  152. package/dist/components/messages/renderers/WriteRenderer.js +18 -0
  153. package/dist/components/messages/renderers/WriteRenderer.js.map +1 -0
  154. package/dist/components/messages/renderers/index.d.ts +10 -0
  155. package/dist/components/messages/renderers/index.d.ts.map +1 -0
  156. package/dist/components/messages/renderers/index.js +72 -0
  157. package/dist/components/messages/renderers/index.js.map +1 -0
  158. package/dist/components/messages/renderers/types.d.ts +77 -0
  159. package/dist/components/messages/renderers/types.d.ts.map +1 -0
  160. package/dist/components/messages/renderers/types.js +2 -0
  161. package/dist/components/messages/renderers/types.js.map +1 -0
  162. package/dist/components/messages/renderers/utils.d.ts +11 -0
  163. package/dist/components/messages/renderers/utils.d.ts.map +1 -0
  164. package/dist/components/messages/renderers/utils.js +18 -0
  165. package/dist/components/messages/renderers/utils.js.map +1 -0
  166. package/dist/components/sessions/LeanHeader.d.ts +9 -0
  167. package/dist/components/sessions/LeanHeader.d.ts.map +1 -0
  168. package/dist/components/sessions/LeanHeader.js +28 -0
  169. package/dist/components/sessions/LeanHeader.js.map +1 -0
  170. package/dist/components/sessions/SessionHeader.d.ts +7 -0
  171. package/dist/components/sessions/SessionHeader.d.ts.map +1 -0
  172. package/dist/components/sessions/SessionHeader.js +49 -0
  173. package/dist/components/sessions/SessionHeader.js.map +1 -0
  174. package/dist/components/sessions/SessionItem.d.ts +9 -0
  175. package/dist/components/sessions/SessionItem.d.ts.map +1 -0
  176. package/dist/components/sessions/SessionItem.js +27 -0
  177. package/dist/components/sessions/SessionItem.js.map +1 -0
  178. package/dist/components/sessions/SessionListContainer.d.ts +7 -0
  179. package/dist/components/sessions/SessionListContainer.d.ts.map +1 -0
  180. package/dist/components/sessions/SessionListContainer.js +32 -0
  181. package/dist/components/sessions/SessionListContainer.js.map +1 -0
  182. package/dist/components/ui/Button.d.ts +8 -0
  183. package/dist/components/ui/Button.d.ts.map +1 -0
  184. package/dist/components/ui/Button.js +19 -0
  185. package/dist/components/ui/Button.js.map +1 -0
  186. package/dist/components/ui/Card.d.ts +6 -0
  187. package/dist/components/ui/Card.d.ts.map +1 -0
  188. package/dist/components/ui/Card.js +7 -0
  189. package/dist/components/ui/Card.js.map +1 -0
  190. package/dist/components/ui/Input.d.ts +6 -0
  191. package/dist/components/ui/Input.d.ts.map +1 -0
  192. package/dist/components/ui/Input.js +7 -0
  193. package/dist/components/ui/Input.js.map +1 -0
  194. package/dist/components/ui/Textarea.d.ts +6 -0
  195. package/dist/components/ui/Textarea.d.ts.map +1 -0
  196. package/dist/components/ui/Textarea.js +7 -0
  197. package/dist/components/ui/Textarea.js.map +1 -0
  198. package/dist/hooks/index.d.ts +8 -0
  199. package/dist/hooks/index.d.ts.map +1 -0
  200. package/dist/hooks/index.js +9 -0
  201. package/dist/hooks/index.js.map +1 -0
  202. package/dist/hooks/useConfig.d.ts +18 -0
  203. package/dist/hooks/useConfig.d.ts.map +1 -0
  204. package/dist/hooks/useConfig.js +16 -0
  205. package/dist/hooks/useConfig.js.map +1 -0
  206. package/dist/hooks/useGit.d.ts +8 -0
  207. package/dist/hooks/useGit.d.ts.map +1 -0
  208. package/dist/hooks/useGit.js +71 -0
  209. package/dist/hooks/useGit.js.map +1 -0
  210. package/dist/hooks/useMessages.d.ts +4 -0
  211. package/dist/hooks/useMessages.d.ts.map +1 -0
  212. package/dist/hooks/useMessages.js +25 -0
  213. package/dist/hooks/useMessages.js.map +1 -0
  214. package/dist/hooks/useSessionStream.d.ts +2 -0
  215. package/dist/hooks/useSessionStream.d.ts.map +1 -0
  216. package/dist/hooks/useSessionStream.js +332 -0
  217. package/dist/hooks/useSessionStream.js.map +1 -0
  218. package/dist/hooks/useSessions.d.ts +4 -0
  219. package/dist/hooks/useSessions.d.ts.map +1 -0
  220. package/dist/hooks/useSessions.js +19 -0
  221. package/dist/hooks/useSessions.js.map +1 -0
  222. package/dist/hooks/useTheme.d.ts +8 -0
  223. package/dist/hooks/useTheme.d.ts.map +1 -0
  224. package/dist/hooks/useTheme.js +40 -0
  225. package/dist/hooks/useTheme.js.map +1 -0
  226. package/dist/hooks/useWorkingDirectory.d.ts +2 -0
  227. package/dist/hooks/useWorkingDirectory.d.ts.map +1 -0
  228. package/dist/hooks/useWorkingDirectory.js +34 -0
  229. package/dist/hooks/useWorkingDirectory.js.map +1 -0
  230. package/dist/index.d.ts +6 -0
  231. package/dist/index.d.ts.map +1 -0
  232. package/dist/index.js +7 -0
  233. package/dist/index.js.map +1 -0
  234. package/dist/lib/api-client.d.ts +44 -0
  235. package/dist/lib/api-client.d.ts.map +1 -0
  236. package/dist/lib/api-client.js +195 -0
  237. package/dist/lib/api-client.js.map +1 -0
  238. package/dist/lib/config.d.ts +5 -0
  239. package/dist/lib/config.d.ts.map +1 -0
  240. package/dist/lib/config.js +22 -0
  241. package/dist/lib/config.js.map +1 -0
  242. package/dist/lib/index.d.ts +4 -0
  243. package/dist/lib/index.d.ts.map +1 -0
  244. package/dist/lib/index.js +5 -0
  245. package/dist/lib/index.js.map +1 -0
  246. package/dist/lib/sse-client.d.ts +13 -0
  247. package/dist/lib/sse-client.d.ts.map +1 -0
  248. package/dist/lib/sse-client.js +111 -0
  249. package/dist/lib/sse-client.js.map +1 -0
  250. package/dist/stores/gitStore.d.ts +20 -0
  251. package/dist/stores/gitStore.d.ts.map +1 -0
  252. package/dist/stores/gitStore.js +35 -0
  253. package/dist/stores/gitStore.js.map +1 -0
  254. package/dist/stores/index.d.ts +3 -0
  255. package/dist/stores/index.d.ts.map +1 -0
  256. package/dist/stores/index.js +3 -0
  257. package/dist/stores/index.js.map +1 -0
  258. package/dist/stores/sidebarStore.d.ts +26 -0
  259. package/dist/stores/sidebarStore.d.ts.map +1 -0
  260. package/dist/stores/sidebarStore.js +16 -0
  261. package/dist/stores/sidebarStore.js.map +1 -0
  262. package/dist/types/api.d.ts +128 -0
  263. package/dist/types/api.d.ts.map +1 -0
  264. package/dist/types/api.js +2 -0
  265. package/dist/types/api.js.map +1 -0
  266. package/package.json +90 -0
package/README.md ADDED
@@ -0,0 +1,187 @@
1
+ # @agi-cli/web-sdk
2
+
3
+ Reusable React components, hooks, and utilities for building AGI CLI web interfaces.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @agi-cli/web-sdk
9
+ # or
10
+ bun add @agi-cli/web-sdk
11
+ ```
12
+
13
+ ## Setup
14
+
15
+ ### Tailwind CSS Configuration
16
+
17
+ The components in this package use Tailwind CSS classes. You **must** configure Tailwind to scan the web-sdk package for class names.
18
+
19
+ In your `tailwind.config.js` (or `tailwind.config.ts`):
20
+
21
+ ```js
22
+ export default {
23
+ content: [
24
+ './index.html',
25
+ './src/**/*.{js,ts,jsx,tsx}',
26
+ // ⚠️ IMPORTANT: Include web-sdk package
27
+ './node_modules/@agi-cli/web-sdk/dist/**/*.{js,jsx}',
28
+ // Or if using a monorepo with workspace:*
29
+ '../../packages/web-sdk/src/**/*.{js,ts,jsx,tsx}',
30
+ ],
31
+ // ... rest of your config
32
+ };
33
+ ```
34
+
35
+ ### CSS Variables
36
+
37
+ The components use CSS custom properties for theming. Add these to your global CSS:
38
+
39
+ ```css
40
+ @layer base {
41
+ :root {
42
+ --background: 220 25% 95%;
43
+ --foreground: 220 10% 15%;
44
+ --card: 220 25% 98%;
45
+ --card-foreground: 220 10% 15%;
46
+ --primary: 222.2 47.4% 11.2%;
47
+ --primary-foreground: 210 40% 98%;
48
+ --border: 220 15% 89%;
49
+ --input: 220 15% 89%;
50
+ --ring: 222.2 84% 4.9%;
51
+ /* ... other variables */
52
+ }
53
+
54
+ .dark {
55
+ --background: 240 10% 8%;
56
+ --foreground: 0 0% 98%;
57
+ /* ... dark theme variables */
58
+ }
59
+ }
60
+ ```
61
+
62
+ See the [apps/web/src/index.css](../../apps/web/src/index.css) file for the complete set of CSS variables.
63
+
64
+ ## Usage
65
+
66
+ ### Components
67
+
68
+ ```tsx
69
+ import {
70
+ ChatInput,
71
+ ChatInputContainer,
72
+ MessageThread,
73
+ SessionListContainer
74
+ } from '@agi-cli/web-sdk/components';
75
+
76
+ function MyApp() {
77
+ return (
78
+ <div>
79
+ <SessionListContainer
80
+ activeSessionId={sessionId}
81
+ onSelectSession={handleSelect}
82
+ />
83
+ <MessageThread messages={messages} />
84
+ <ChatInputContainer sessionId={sessionId} />
85
+ </div>
86
+ );
87
+ }
88
+ ```
89
+
90
+ ### Hooks
91
+
92
+ ```tsx
93
+ import {
94
+ useSessions,
95
+ useMessages,
96
+ useSessionStream,
97
+ useTheme
98
+ } from '@agi-cli/web-sdk/hooks';
99
+
100
+ function MyComponent() {
101
+ const { data: sessions } = useSessions();
102
+ const { data: messages } = useMessages(sessionId);
103
+ const { theme, toggleTheme } = useTheme();
104
+
105
+ // ...
106
+ }
107
+ ```
108
+
109
+ ### Stores
110
+
111
+ ```tsx
112
+ import { useGitStore, useSidebarStore } from '@agi-cli/web-sdk/stores';
113
+
114
+ function MyComponent() {
115
+ const gitFiles = useGitStore((state) => state.files);
116
+ const isSidebarCollapsed = useSidebarStore((state) => state.collapsed);
117
+
118
+ // ...
119
+ }
120
+ ```
121
+
122
+ ### Utilities
123
+
124
+ ```tsx
125
+ import { apiClient, SSEClient } from '@agi-cli/web-sdk/lib';
126
+
127
+ // Use the API client
128
+ const sessions = await apiClient.getSessions();
129
+
130
+ // Use the SSE client for streaming
131
+ const sseClient = new SSEClient('/api/sessions/123/stream');
132
+ sseClient.onMessage((data) => console.log(data));
133
+ ```
134
+
135
+ ## Features
136
+
137
+ - 🎨 **Pre-built Components** - Chat interface, message threads, session management
138
+ - 🪝 **Custom Hooks** - React Query hooks for sessions, messages, and real-time streaming
139
+ - 🗄️ **State Management** - Zustand stores for git and sidebar state
140
+ - 🛠️ **Utilities** - API client and SSE client for backend communication
141
+ - 📘 **TypeScript** - Full type definitions included
142
+ - 🎨 **Tailwind CSS** - Styled with Tailwind utility classes
143
+
144
+ ## Package Structure
145
+
146
+ ```
147
+ @agi-cli/web-sdk/
148
+ ├── components/ # React components
149
+ ├── hooks/ # React hooks
150
+ ├── lib/ # Utilities (API client, SSE client, config)
151
+ ├── stores/ # Zustand stores
152
+ └── types/ # TypeScript type definitions
153
+ ```
154
+
155
+ ## Troubleshooting
156
+
157
+ ### Styles not working
158
+
159
+ If the components appear unstyled:
160
+
161
+ 1. **Check Tailwind content paths**: Make sure your `tailwind.config.js` includes the web-sdk package
162
+ 2. **Verify CSS variables**: Ensure you've added the required CSS custom properties
163
+ 3. **Import global styles**: Make sure you're importing your global CSS file with Tailwind directives
164
+ 4. **Restart dev server**: After config changes, restart your development server
165
+
166
+ ### Component not found
167
+
168
+ Make sure you're importing from the correct path:
169
+
170
+ ```tsx
171
+ // ✅ Correct
172
+ import { Button } from '@agi-cli/web-sdk/components';
173
+
174
+ // ❌ Wrong
175
+ import { Button } from '@agi-cli/web-sdk';
176
+ ```
177
+
178
+ ## Related Packages
179
+
180
+ - `@agi-cli/web-ui` - Pre-built static web app
181
+ - `@agi-cli/sdk` - Node.js SDK for AGI CLI
182
+ - `@agi-cli/api` - API client types
183
+ - `@agi-cli/server` - Backend server
184
+
185
+ ## License
186
+
187
+ MIT
@@ -0,0 +1,10 @@
1
+ interface ChatInputProps {
2
+ onSend: (message: string) => void;
3
+ disabled?: boolean;
4
+ onConfigClick?: () => void;
5
+ }
6
+ export declare const ChatInput: import("react").NamedExoticComponent<ChatInputProps & import("react").RefAttributes<{
7
+ focus: () => void;
8
+ }>>;
9
+ export {};
10
+ //# sourceMappingURL=ChatInput.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatInput.d.ts","sourceRoot":"","sources":["../../../src/components/chat/ChatInput.tsx"],"names":[],"mappings":"AAaA,UAAU,cAAc;IACvB,MAAM,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED,eAAO,MAAM,SAAS;WACD,MAAM,IAAI;GAmG9B,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useRef, useEffect, useCallback, memo, forwardRef, useImperativeHandle, } from 'react';
3
+ import { ArrowUp, MoreVertical } from 'lucide-react';
4
+ import { Textarea } from '../ui/Textarea';
5
+ export const ChatInput = memo(forwardRef(function ChatInput({ onSend, disabled, onConfigClick }, ref) {
6
+ const [message, setMessage] = useState('');
7
+ const textareaRef = useRef(null);
8
+ useEffect(() => {
9
+ textareaRef.current?.focus();
10
+ }, []);
11
+ useImperativeHandle(ref, () => ({
12
+ focus: () => {
13
+ textareaRef.current?.focus();
14
+ },
15
+ }));
16
+ // Auto-resize textarea based on content
17
+ const adjustTextareaHeight = useCallback(() => {
18
+ const textarea = textareaRef.current;
19
+ if (textarea) {
20
+ // Reset height to auto to get the correct scrollHeight
21
+ textarea.style.height = 'auto';
22
+ // Set height to scrollHeight (content height)
23
+ textarea.style.height = `${textarea.scrollHeight}px`;
24
+ }
25
+ }, []);
26
+ useEffect(() => {
27
+ adjustTextareaHeight();
28
+ }, [adjustTextareaHeight]);
29
+ const handleSend = useCallback(() => {
30
+ if (message.trim() && !disabled) {
31
+ onSend(message);
32
+ setMessage('');
33
+ // Reset textarea height after sending
34
+ if (textareaRef.current) {
35
+ textareaRef.current.style.height = 'auto';
36
+ }
37
+ textareaRef.current?.focus();
38
+ }
39
+ }, [message, disabled, onSend]);
40
+ const handleChange = useCallback((e) => {
41
+ setMessage(e.target.value);
42
+ }, []);
43
+ const handleKeyDown = useCallback((e) => {
44
+ if (e.key === 'Enter' && !e.shiftKey) {
45
+ e.preventDefault();
46
+ handleSend();
47
+ }
48
+ }, [handleSend]);
49
+ return (_jsx("div", { className: "absolute bottom-0 left-0 right-0 pt-16 pb-6 md:pb-8 px-2 md:px-4 bg-gradient-to-t from-background via-background to-transparent pointer-events-none z-20 safe-area-inset-bottom", children: _jsx("div", { className: "max-w-3xl mx-auto pointer-events-auto mb-2 md:mb-0", children: _jsxs("div", { className: "flex items-end gap-1 bg-card rounded-3xl border border-border p-1 focus-within:border-primary/60 focus-within:ring-1 focus-within:ring-primary/40 transition-colors touch-manipulation", children: [onConfigClick && (_jsx("button", { type: "button", onClick: onConfigClick, className: "flex items-center justify-center w-10 h-10 rounded-full hover:bg-background/50 active:bg-background/70 transition-colors text-muted-foreground hover:text-foreground flex-shrink-0 touch-manipulation", children: _jsx(MoreVertical, { className: "w-4 h-4" }) })), _jsx(Textarea, { ref: textareaRef, value: message, onChange: handleChange, onKeyDown: handleKeyDown, placeholder: "Type a message...", disabled: disabled, rows: 1, className: "border-0 bg-transparent pl-1 pr-2 py-2 max-h-[200px] overflow-y-auto leading-normal resize-none scrollbar-hide text-base", style: { height: '2.5rem' } }), _jsx("button", { type: "button", onClick: handleSend, disabled: disabled || !message.trim(), className: `flex items-center justify-center w-10 h-10 rounded-full transition-colors flex-shrink-0 touch-manipulation ${message.trim()
50
+ ? 'bg-primary hover:bg-primary/90 active:bg-primary/80 text-primary-foreground'
51
+ : 'bg-transparent text-muted-foreground'}`, children: _jsx(ArrowUp, { className: "w-4 h-4" }) })] }) }) }));
52
+ }));
53
+ //# sourceMappingURL=ChatInput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatInput.js","sourceRoot":"","sources":["../../../src/components/chat/ChatInput.tsx"],"names":[],"mappings":";AAAA,OAAO,EACN,QAAQ,EACR,MAAM,EACN,SAAS,EACT,WAAW,EACX,IAAI,EACJ,UAAU,EACV,mBAAmB,GACnB,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAQ1C,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAC5B,UAAU,CAAwC,SAAS,SAAS,CACnE,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,EACnC,GAAG;IAEH,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC3C,MAAM,WAAW,GAAG,MAAM,CAAsB,IAAI,CAAC,CAAC;IAEtD,SAAS,CAAC,GAAG,EAAE;QACd,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;IAC9B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QAC/B,KAAK,EAAE,GAAG,EAAE;YACX,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QAC9B,CAAC;KACD,CAAC,CAAC,CAAC;IAEJ,wCAAwC;IACxC,MAAM,oBAAoB,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7C,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC;QACrC,IAAI,QAAQ,EAAE,CAAC;YACd,uDAAuD;YACvD,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;YAC/B,8CAA8C;YAC9C,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,QAAQ,CAAC,YAAY,IAAI,CAAC;QACtD,CAAC;IACF,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,SAAS,CAAC,GAAG,EAAE;QACd,oBAAoB,EAAE,CAAC;IACxB,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAE3B,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,EAAE;QACnC,IAAI,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACjC,MAAM,CAAC,OAAO,CAAC,CAAC;YAChB,UAAU,CAAC,EAAE,CAAC,CAAC;YACf,sCAAsC;YACtC,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;gBACzB,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;YAC3C,CAAC;YACD,WAAW,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QAC9B,CAAC;IACF,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC;IAEhC,MAAM,YAAY,GAAG,WAAW,CAAC,CAAC,CAAmC,EAAE,EAAE;QACxE,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,aAAa,GAAG,WAAW,CAChC,CAAC,CAAqC,EAAE,EAAE;QACzC,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YACtC,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,UAAU,EAAE,CAAC;QACd,CAAC;IACF,CAAC,EACD,CAAC,UAAU,CAAC,CACZ,CAAC;IAEF,OAAO,CACN,cAAK,SAAS,EAAC,iLAAiL,YAC/L,cAAK,SAAS,EAAC,oDAAoD,YAClE,eAAK,SAAS,EAAC,wLAAwL,aACrM,aAAa,IAAI,CACjB,iBACC,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,aAAa,EACtB,SAAS,EAAC,uMAAuM,YAEjN,KAAC,YAAY,IAAC,SAAS,EAAC,SAAS,GAAG,GAC5B,CACT,EACD,KAAC,QAAQ,IACR,GAAG,EAAE,WAAW,EAChB,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,YAAY,EACtB,SAAS,EAAE,aAAa,EACxB,WAAW,EAAC,mBAAmB,EAC/B,QAAQ,EAAE,QAAQ,EAClB,IAAI,EAAE,CAAC,EACP,SAAS,EAAC,0HAA0H,EACpI,KAAK,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,GAC1B,EACF,iBACC,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,UAAU,EACnB,QAAQ,EAAE,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EACrC,SAAS,EAAE,8GACV,OAAO,CAAC,IAAI,EAAE;4BACb,CAAC,CAAC,6EAA6E;4BAC/E,CAAC,CAAC,sCACJ,EAAE,YAEF,KAAC,OAAO,IAAC,SAAS,EAAC,SAAS,GAAG,GACvB,IACJ,GACD,GACD,CACN,CAAC;AACH,CAAC,CAAC,CACF,CAAC"}
@@ -0,0 +1,9 @@
1
+ interface ChatInputContainerProps {
2
+ sessionId: string;
3
+ }
4
+ export interface ChatInputContainerRef {
5
+ focus: () => void;
6
+ }
7
+ export declare const ChatInputContainer: import("react").NamedExoticComponent<ChatInputContainerProps & import("react").RefAttributes<ChatInputContainerRef>>;
8
+ export {};
9
+ //# sourceMappingURL=ChatInputContainer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatInputContainer.d.ts","sourceRoot":"","sources":["../../../src/components/chat/ChatInputContainer.tsx"],"names":[],"mappings":"AAaA,UAAU,uBAAuB;IAChC,SAAS,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACrC,KAAK,EAAE,MAAM,IAAI,CAAC;CAClB;AAED,eAAO,MAAM,kBAAkB,sHAkF9B,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { memo, useState, useCallback, useEffect, useRef, forwardRef, useImperativeHandle, } from 'react';
3
+ import { useSendMessage } from '../../hooks/useMessages';
4
+ import { ChatInput } from './ChatInput';
5
+ import { ConfigModal } from './ConfigModal';
6
+ export const ChatInputContainer = memo(forwardRef(function ChatInputContainer({ sessionId }, ref) {
7
+ const [agent, setAgent] = useState('');
8
+ const [provider, setProvider] = useState('');
9
+ const [model, setModel] = useState('');
10
+ const [isConfigOpen, setIsConfigOpen] = useState(false);
11
+ const [inputKey, setInputKey] = useState(0);
12
+ const chatInputRef = useRef(null);
13
+ const sendMessage = useSendMessage(sessionId);
14
+ useEffect(() => {
15
+ setInputKey((prev) => prev + 1);
16
+ }, []);
17
+ useImperativeHandle(ref, () => ({
18
+ focus: () => {
19
+ chatInputRef.current?.focus();
20
+ },
21
+ }));
22
+ const handleSendMessage = useCallback(async (content) => {
23
+ try {
24
+ await sendMessage.mutateAsync({
25
+ content,
26
+ agent: agent || undefined,
27
+ provider: provider || undefined,
28
+ model: model || undefined,
29
+ });
30
+ }
31
+ catch (error) {
32
+ console.error('Failed to send message:', error);
33
+ }
34
+ }, [sendMessage, agent, provider, model]);
35
+ const handleToggleConfig = useCallback(() => {
36
+ setIsConfigOpen((prev) => !prev);
37
+ }, []);
38
+ const handleCloseConfig = useCallback(() => {
39
+ setIsConfigOpen(false);
40
+ }, []);
41
+ const handleAgentChange = useCallback((value) => {
42
+ setAgent(value);
43
+ }, []);
44
+ const handleProviderChange = useCallback((value) => {
45
+ setProvider(value);
46
+ }, []);
47
+ const handleModelChange = useCallback((value) => {
48
+ setModel(value);
49
+ }, []);
50
+ return (_jsxs(_Fragment, { children: [_jsx(ConfigModal, { isOpen: isConfigOpen, onClose: handleCloseConfig, agent: agent, provider: provider, model: model, onAgentChange: handleAgentChange, onProviderChange: handleProviderChange, onModelChange: handleModelChange }), _jsx(ChatInput, { ref: chatInputRef, onSend: handleSendMessage, disabled: sendMessage.isPending, onConfigClick: handleToggleConfig }, inputKey)] }));
51
+ }));
52
+ //# sourceMappingURL=ChatInputContainer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatInputContainer.js","sourceRoot":"","sources":["../../../src/components/chat/ChatInputContainer.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ interface ConfigModalProps {
2
+ isOpen: boolean;
3
+ onClose: () => void;
4
+ agent: string;
5
+ provider: string;
6
+ model: string;
7
+ onAgentChange: (agent: string) => void;
8
+ onProviderChange: (provider: string) => void;
9
+ onModelChange: (model: string) => void;
10
+ }
11
+ export declare function ConfigModal({ isOpen, onClose, agent, provider, model, onAgentChange, onProviderChange, onModelChange, }: ConfigModalProps): import("react/jsx-runtime").JSX.Element;
12
+ export {};
13
+ //# sourceMappingURL=ConfigModal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigModal.d.ts","sourceRoot":"","sources":["../../../src/components/chat/ConfigModal.tsx"],"names":[],"mappings":"AAIA,UAAU,gBAAgB;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAED,wBAAgB,WAAW,CAAC,EAC3B,MAAM,EACN,OAAO,EACP,KAAK,EACL,QAAQ,EACR,KAAK,EACL,aAAa,EACb,gBAAgB,EAChB,aAAa,GACb,EAAE,gBAAgB,2CAuJlB"}
@@ -0,0 +1,51 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useEffect, useId } from 'react';
3
+ import { X } from 'lucide-react';
4
+ import { useConfig, useModels } from '../../hooks/useConfig';
5
+ export function ConfigModal({ isOpen, onClose, agent, provider, model, onAgentChange, onProviderChange, onModelChange, }) {
6
+ const { data: config, isLoading: configLoading } = useConfig();
7
+ const { data: modelsData, isLoading: modelsLoading } = useModels(provider);
8
+ // Generate unique IDs for form elements
9
+ const agentId = useId();
10
+ const providerId = useId();
11
+ const modelId = useId();
12
+ // Set defaults when config loads
13
+ useEffect(() => {
14
+ if (config && !agent && !provider && !model) {
15
+ onAgentChange(config.defaults.agent);
16
+ onProviderChange(config.defaults.provider);
17
+ onModelChange(config.defaults.model);
18
+ }
19
+ }, [
20
+ config,
21
+ agent,
22
+ provider,
23
+ model,
24
+ onAgentChange,
25
+ onProviderChange,
26
+ onModelChange,
27
+ ]);
28
+ // Update model when provider changes
29
+ useEffect(() => {
30
+ if (modelsData && modelsData.models.length > 0) {
31
+ const currentModelExists = modelsData.models.some((m) => m.id === model);
32
+ if (!currentModelExists) {
33
+ onModelChange(modelsData.default || modelsData.models[0].id);
34
+ }
35
+ }
36
+ }, [modelsData, model, onModelChange]);
37
+ if (!isOpen)
38
+ return null;
39
+ const handleBackdropClick = (e) => {
40
+ if (e.target === e.currentTarget) {
41
+ onClose();
42
+ }
43
+ };
44
+ const handleBackdropKeyDown = (e) => {
45
+ if (e.key === 'Escape') {
46
+ onClose();
47
+ }
48
+ };
49
+ return (_jsxs(_Fragment, { children: [_jsx("button", { type: "button", className: "fixed inset-0 bg-black/50 backdrop-blur-sm z-50 cursor-default", onClick: handleBackdropClick, onKeyDown: handleBackdropKeyDown, "aria-label": "Close modal" }), _jsx("div", { className: "fixed top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 z-50 w-full max-w-md", children: _jsxs("div", { className: "bg-background border border-border rounded-lg shadow-lg", children: [_jsxs("div", { className: "flex items-center justify-between p-4 border-b border-border", children: [_jsx("h2", { className: "text-lg font-semibold text-foreground", children: "Configuration" }), _jsx("button", { type: "button", onClick: onClose, className: "text-muted-foreground hover:text-foreground transition-colors", children: _jsx(X, { className: "h-5 w-5" }) })] }), _jsx("div", { className: "p-4 space-y-4", children: configLoading ? (_jsx("div", { className: "text-center text-muted-foreground py-8", children: "Loading configuration..." })) : config ? (_jsxs(_Fragment, { children: [_jsxs("div", { children: [_jsx("label", { htmlFor: agentId, className: "block text-sm font-medium text-foreground mb-2", children: "Agent" }), _jsx("select", { id: agentId, value: agent, onChange: (e) => onAgentChange(e.target.value), className: "w-full bg-background border border-border rounded px-3 py-2 text-foreground outline-none focus:border-violet-500 transition-colors", children: config.agents.map((a) => (_jsx("option", { value: a, children: a }, a))) })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: providerId, className: "block text-sm font-medium text-foreground mb-2", children: "Provider" }), _jsx("select", { id: providerId, value: provider, onChange: (e) => onProviderChange(e.target.value), className: "w-full bg-background border border-border rounded px-3 py-2 text-foreground outline-none focus:border-violet-500 transition-colors", children: config.providers.map((p) => (_jsx("option", { value: p, children: p }, p))) })] }), _jsxs("div", { children: [_jsx("label", { htmlFor: modelId, className: "block text-sm font-medium text-foreground mb-2", children: "Model" }), _jsx("select", { id: modelId, value: model, onChange: (e) => onModelChange(e.target.value), disabled: modelsLoading || !modelsData, className: "w-full bg-background border border-border rounded px-3 py-2 text-foreground outline-none focus:border-violet-500 transition-colors disabled:opacity-50", children: modelsData?.models.map((m) => (_jsx("option", { value: m.id, children: m.label }, m.id))) })] })] })) : null })] }) })] }));
50
+ }
51
+ //# sourceMappingURL=ConfigModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigModal.js","sourceRoot":"","sources":["../../../src/components/chat/ConfigModal.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AACzC,OAAO,EAAE,CAAC,EAAE,MAAM,cAAc,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAa7D,MAAM,UAAU,WAAW,CAAC,EAC3B,MAAM,EACN,OAAO,EACP,KAAK,EACL,QAAQ,EACR,KAAK,EACL,aAAa,EACb,gBAAgB,EAChB,aAAa,GACK;IAClB,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,SAAS,EAAE,CAAC;IAC/D,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IAE3E,wCAAwC;IACxC,MAAM,OAAO,GAAG,KAAK,EAAE,CAAC;IACxB,MAAM,UAAU,GAAG,KAAK,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,KAAK,EAAE,CAAC;IAExB,iCAAiC;IACjC,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,MAAM,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,EAAE,CAAC;YAC7C,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACrC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC3C,aAAa,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;IACF,CAAC,EAAE;QACF,MAAM;QACN,KAAK;QACL,QAAQ;QACR,KAAK;QACL,aAAa;QACb,gBAAgB;QAChB,aAAa;KACb,CAAC,CAAC;IAEH,qCAAqC;IACrC,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,UAAU,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChD,MAAM,kBAAkB,GAAG,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC;YACzE,IAAI,CAAC,kBAAkB,EAAE,CAAC;gBACzB,aAAa,CAAC,UAAU,CAAC,OAAO,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC9D,CAAC;QACF,CAAC;IACF,CAAC,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC;IAEvC,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,MAAM,mBAAmB,GAAG,CAAC,CAAsC,EAAE,EAAE;QACtE,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,aAAa,EAAE,CAAC;YAClC,OAAO,EAAE,CAAC;QACX,CAAC;IACF,CAAC,CAAC;IAEF,MAAM,qBAAqB,GAAG,CAAC,CAAyC,EAAE,EAAE;QAC3E,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;YACxB,OAAO,EAAE,CAAC;QACX,CAAC;IACF,CAAC,CAAC;IAEF,OAAO,CACN,8BACC,iBACC,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,gEAAgE,EAC1E,OAAO,EAAE,mBAAmB,EAC5B,SAAS,EAAE,qBAAqB,gBACrB,aAAa,GACvB,EACF,cAAK,SAAS,EAAC,+EAA+E,YAC7F,eAAK,SAAS,EAAC,yDAAyD,aACvE,eAAK,SAAS,EAAC,8DAA8D,aAC5E,aAAI,SAAS,EAAC,uCAAuC,8BAEhD,EACL,iBACC,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,OAAO,EAChB,SAAS,EAAC,+DAA+D,YAEzE,KAAC,CAAC,IAAC,SAAS,EAAC,SAAS,GAAG,GACjB,IACJ,EAEN,cAAK,SAAS,EAAC,eAAe,YAC5B,aAAa,CAAC,CAAC,CAAC,CAChB,cAAK,SAAS,EAAC,wCAAwC,yCAEjD,CACN,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CACZ,8BACC,0BACC,gBACC,OAAO,EAAE,OAAO,EAChB,SAAS,EAAC,gDAAgD,sBAGnD,EACR,iBACC,EAAE,EAAE,OAAO,EACX,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC9C,SAAS,EAAC,oIAAoI,YAE7I,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACzB,iBAAgB,KAAK,EAAE,CAAC,YACtB,CAAC,IADU,CAAC,CAEL,CACT,CAAC,GACM,IACJ,EAEN,0BACC,gBACC,OAAO,EAAE,UAAU,EACnB,SAAS,EAAC,gDAAgD,yBAGnD,EACR,iBACC,EAAE,EAAE,UAAU,EACd,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACjD,SAAS,EAAC,oIAAoI,YAE7I,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAC5B,iBAAgB,KAAK,EAAE,CAAC,YACtB,CAAC,IADU,CAAC,CAEL,CACT,CAAC,GACM,IACJ,EAEN,0BACC,gBACC,OAAO,EAAE,OAAO,EAChB,SAAS,EAAC,gDAAgD,sBAGnD,EACR,iBACC,EAAE,EAAE,OAAO,EACX,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC9C,QAAQ,EAAE,aAAa,IAAI,CAAC,UAAU,EACtC,SAAS,EAAC,wJAAwJ,YAEjK,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAC9B,iBAAmB,KAAK,EAAE,CAAC,CAAC,EAAE,YAC5B,CAAC,CAAC,KAAK,IADI,CAAC,CAAC,EAAE,CAER,CACT,CAAC,GACM,IACJ,IACJ,CACH,CAAC,CAAC,CAAC,IAAI,GACH,IACD,GACD,IACJ,CACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ interface ConfigSelectorProps {
2
+ agent: string;
3
+ provider: string;
4
+ model: string;
5
+ onAgentChange: (agent: string) => void;
6
+ onProviderChange: (provider: string) => void;
7
+ onModelChange: (model: string) => void;
8
+ }
9
+ export declare function ConfigSelector({ agent, provider, model, onAgentChange, onProviderChange, onModelChange, }: ConfigSelectorProps): import("react/jsx-runtime").JSX.Element;
10
+ export {};
11
+ //# sourceMappingURL=ConfigSelector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigSelector.d.ts","sourceRoot":"","sources":["../../../src/components/chat/ConfigSelector.tsx"],"names":[],"mappings":"AAIA,UAAU,mBAAmB;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACvC,gBAAgB,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAED,wBAAgB,cAAc,CAAC,EAC9B,KAAK,EACL,QAAQ,EACR,KAAK,EACL,aAAa,EACb,gBAAgB,EAChB,aAAa,GACb,EAAE,mBAAmB,2CAgGrB"}
@@ -0,0 +1,47 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect } from 'react';
3
+ import { Settings } from 'lucide-react';
4
+ import { useConfig, useModels } from '../../hooks/useConfig';
5
+ export function ConfigSelector({ agent, provider, model, onAgentChange, onProviderChange, onModelChange, }) {
6
+ const { data: config, isLoading: configLoading } = useConfig();
7
+ const { data: modelsData, isLoading: modelsLoading } = useModels(provider);
8
+ console.log('ConfigSelector rendered', {
9
+ config,
10
+ configLoading,
11
+ agent,
12
+ provider,
13
+ model,
14
+ });
15
+ // Set defaults when config loads
16
+ useEffect(() => {
17
+ if (config && !agent && !provider && !model) {
18
+ onAgentChange(config.defaults.agent);
19
+ onProviderChange(config.defaults.provider);
20
+ onModelChange(config.defaults.model);
21
+ }
22
+ }, [
23
+ config,
24
+ agent,
25
+ provider,
26
+ model,
27
+ onAgentChange,
28
+ onProviderChange,
29
+ onModelChange,
30
+ ]);
31
+ // Update model when provider changes
32
+ useEffect(() => {
33
+ if (modelsData && modelsData.models.length > 0) {
34
+ const currentModelExists = modelsData.models.some((m) => m.id === model);
35
+ if (!currentModelExists) {
36
+ onModelChange(modelsData.default || modelsData.models[0].id);
37
+ }
38
+ }
39
+ }, [modelsData, model, onModelChange]);
40
+ if (configLoading) {
41
+ return (_jsxs("div", { className: "flex items-center gap-2 px-4 py-2 border-t border-border bg-background/50", children: [_jsx(Settings, { className: "h-4 w-4 text-muted-foreground animate-spin" }), _jsx("span", { className: "text-xs text-muted-foreground", children: "Loading config..." })] }));
42
+ }
43
+ if (!config)
44
+ return null;
45
+ return (_jsx("div", { className: "absolute bottom-24 left-0 right-0 pb-2 px-4 pointer-events-none z-40", children: _jsx("div", { className: "max-w-3xl mx-auto pointer-events-auto", children: _jsxs("div", { className: "flex items-center gap-2 px-4 py-2 border border-border bg-background/95 backdrop-blur-sm rounded-lg", children: [_jsx(Settings, { className: "h-4 w-4 text-muted-foreground" }), _jsx("select", { value: agent, onChange: (e) => onAgentChange(e.target.value), className: "text-xs bg-background border border-border rounded px-2 py-1 outline-none", children: config.agents.map((a) => (_jsx("option", { value: a, children: a }, a))) }), _jsx("select", { value: provider, onChange: (e) => onProviderChange(e.target.value), className: "text-xs bg-background border border-border rounded px-2 py-1 outline-none", children: config.providers.map((p) => (_jsx("option", { value: p, children: p }, p))) }), _jsx("select", { value: model, onChange: (e) => onModelChange(e.target.value), disabled: modelsLoading || !modelsData, className: "text-xs bg-background border border-border rounded px-2 py-1 outline-none disabled:opacity-50", children: modelsData?.models.map((m) => (_jsx("option", { value: m.id, children: m.label }, m.id))) })] }) }) }));
46
+ }
47
+ //# sourceMappingURL=ConfigSelector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConfigSelector.js","sourceRoot":"","sources":["../../../src/components/chat/ConfigSelector.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ interface StopButtonProps {
2
+ sessionId: string;
3
+ onStop?: () => void;
4
+ disabled?: boolean;
5
+ }
6
+ export declare function StopButton({ sessionId, onStop, disabled }: StopButtonProps): import("react/jsx-runtime").JSX.Element;
7
+ export {};
8
+ //# sourceMappingURL=StopButton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StopButton.d.ts","sourceRoot":"","sources":["../../../src/components/chat/StopButton.tsx"],"names":[],"mappings":"AAIA,UAAU,eAAe;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,UAAU,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,eAAe,2CA8B1E"}
@@ -0,0 +1,25 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { StopCircle } from 'lucide-react';
3
+ import { useState } from 'react';
4
+ import { apiClient } from '../../lib/api-client';
5
+ export function StopButton({ sessionId, onStop, disabled }) {
6
+ const [isAborting, setIsAborting] = useState(false);
7
+ const handleStop = async () => {
8
+ if (isAborting)
9
+ return;
10
+ setIsAborting(true);
11
+ try {
12
+ await apiClient.abortSession(sessionId);
13
+ onStop?.();
14
+ }
15
+ catch (error) {
16
+ console.error('Failed to abort stream:', error);
17
+ }
18
+ finally {
19
+ // Keep button disabled for a bit to prevent double-clicks
20
+ setTimeout(() => setIsAborting(false), 1000);
21
+ }
22
+ };
23
+ return (_jsxs("button", { type: "button", onClick: handleStop, disabled: disabled || isAborting, className: "flex items-center gap-1.5 text-sm text-destructive hover:text-destructive/80 disabled:opacity-50 disabled:cursor-not-allowed transition-colors", title: "Stop generation", children: [_jsx(StopCircle, { className: "w-4 h-4" }), _jsx("span", { className: "font-medium", children: isAborting ? 'Stopping...' : 'Stop' })] }));
24
+ }
25
+ //# sourceMappingURL=StopButton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StopButton.js","sourceRoot":"","sources":["../../../src/components/chat/StopButton.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAQjD,MAAM,UAAU,UAAU,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAmB;IAC1E,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEpD,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;QAC7B,IAAI,UAAU;YAAE,OAAO;QACvB,aAAa,CAAC,IAAI,CAAC,CAAC;QAEpB,IAAI,CAAC;YACJ,MAAM,SAAS,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YACxC,MAAM,EAAE,EAAE,CAAC;QACZ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;QACjD,CAAC;gBAAS,CAAC;YACV,0DAA0D;YAC1D,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;QAC9C,CAAC;IACF,CAAC,CAAC;IAEF,OAAO,CACN,kBACC,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,UAAU,EACnB,QAAQ,EAAE,QAAQ,IAAI,UAAU,EAChC,SAAS,EAAC,gJAAgJ,EAC1J,KAAK,EAAC,iBAAiB,aAEvB,KAAC,UAAU,IAAC,SAAS,EAAC,SAAS,GAAG,EAClC,eAAM,SAAS,EAAC,aAAa,YAAE,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,GAAQ,IAClE,CACT,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function GitCommitModal(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=GitCommitModal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitCommitModal.d.ts","sourceRoot":"","sources":["../../../src/components/git/GitCommitModal.tsx"],"names":[],"mappings":"AAOA,wBAAgB,cAAc,4CAmI7B"}
@@ -0,0 +1,44 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useState, useId } from 'react';
3
+ import { X, GitCommit, Sparkles, Loader2 } from 'lucide-react';
4
+ import { useGitStore } from '../../stores/gitStore';
5
+ import { useCommitChanges, useGenerateCommitMessage } from '../../hooks/useGit';
6
+ import { Button } from '../ui/Button';
7
+ import { Textarea } from '../ui/Textarea';
8
+ export function GitCommitModal() {
9
+ const { isCommitModalOpen, closeCommitModal } = useGitStore();
10
+ const commitChanges = useCommitChanges();
11
+ const generateMessage = useGenerateCommitMessage();
12
+ const [message, setMessage] = useState('');
13
+ const messageId = useId();
14
+ if (!isCommitModalOpen)
15
+ return null;
16
+ const handleCommit = async () => {
17
+ if (!message.trim())
18
+ return;
19
+ try {
20
+ await commitChanges.mutateAsync(message);
21
+ setMessage('');
22
+ closeCommitModal();
23
+ }
24
+ catch (error) {
25
+ console.error('Failed to commit:', error);
26
+ }
27
+ };
28
+ const handleClose = () => {
29
+ setMessage('');
30
+ closeCommitModal();
31
+ };
32
+ const handleGenerateMessage = async () => {
33
+ try {
34
+ const result = await generateMessage.mutateAsync();
35
+ setMessage(result.message);
36
+ }
37
+ catch (error) {
38
+ console.error('Failed to generate commit message:', error);
39
+ }
40
+ };
41
+ return (_jsx("div", { className: "fixed inset-0 bg-background/80 backdrop-blur-sm z-50 flex items-center justify-center p-4", children: _jsxs("div", { className: "bg-background border border-border rounded-lg shadow-lg w-full max-w-2xl", children: [_jsxs("div", { className: "flex items-center justify-between px-6 py-4 border-b border-border", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(GitCommit, { className: "w-5 h-5 text-foreground" }), _jsx("h2", { className: "text-lg font-semibold text-foreground", children: "Commit Changes" })] }), _jsx(Button, { variant: "ghost", size: "icon", onClick: handleClose, children: _jsx(X, { className: "w-4 h-4" }) })] }), _jsxs("div", { className: "p-6 space-y-4", children: [_jsxs("div", { className: "space-y-2", children: [_jsx("label", { htmlFor: messageId, className: "text-sm font-medium text-foreground", children: "Commit Message" }), _jsx(Textarea, { id: messageId, value: message, onChange: (e) => setMessage(e.target.value), placeholder: "Enter commit message...", rows: 6, className: "w-full resize-none", autoFocus: true, disabled: generateMessage.isPending })] }), _jsx(Button, { variant: "secondary", size: "sm", onClick: handleGenerateMessage, className: "w-full", disabled: generateMessage.isPending, children: generateMessage.isPending ? (_jsxs(_Fragment, { children: [_jsx(Loader2, { className: "w-4 h-4 mr-2 animate-spin" }), "Generating..."] })) : (_jsxs(_Fragment, { children: [_jsx(Sparkles, { className: "w-4 h-4 mr-2" }), "Generate commit message with AI"] })) }), generateMessage.isError && (_jsx("div", { className: "text-sm text-red-600 dark:text-red-400 bg-red-500/10 border border-red-500/20 rounded px-3 py-2", children: generateMessage.error?.message ||
42
+ 'Failed to generate commit message' }))] }), _jsxs("div", { className: "flex items-center justify-end gap-2 px-6 py-4 border-t border-border", children: [_jsx(Button, { variant: "ghost", onClick: handleClose, children: "Cancel" }), _jsx(Button, { variant: "primary", onClick: handleCommit, disabled: !message.trim() || commitChanges.isPending, children: commitChanges.isPending ? (_jsx("span", { children: "Committing..." })) : (_jsxs(_Fragment, { children: [_jsx(GitCommit, { className: "w-4 h-4 mr-2" }), "Commit"] })) })] }), commitChanges.isError && (_jsx("div", { className: "px-6 pb-4", children: _jsx("div", { className: "text-sm text-red-600 dark:text-red-400 bg-red-500/10 border border-red-500/20 rounded px-3 py-2", children: commitChanges.error?.message || 'Failed to commit changes' }) }))] }) }));
43
+ }
44
+ //# sourceMappingURL=GitCommitModal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitCommitModal.js","sourceRoot":"","sources":["../../../src/components/git/GitCommitModal.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const GitDiffPanel: import("react").NamedExoticComponent<object>;
2
+ //# sourceMappingURL=GitDiffPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GitDiffPanel.d.ts","sourceRoot":"","sources":["../../../src/components/git/GitDiffPanel.tsx"],"names":[],"mappings":"AAQA,eAAO,MAAM,YAAY,8CAuHvB,CAAC"}