@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.
- package/README.md +187 -0
- package/dist/components/chat/ChatInput.d.ts +10 -0
- package/dist/components/chat/ChatInput.d.ts.map +1 -0
- package/dist/components/chat/ChatInput.js +53 -0
- package/dist/components/chat/ChatInput.js.map +1 -0
- package/dist/components/chat/ChatInputContainer.d.ts +9 -0
- package/dist/components/chat/ChatInputContainer.d.ts.map +1 -0
- package/dist/components/chat/ChatInputContainer.js +52 -0
- package/dist/components/chat/ChatInputContainer.js.map +1 -0
- package/dist/components/chat/ConfigModal.d.ts +13 -0
- package/dist/components/chat/ConfigModal.d.ts.map +1 -0
- package/dist/components/chat/ConfigModal.js +51 -0
- package/dist/components/chat/ConfigModal.js.map +1 -0
- package/dist/components/chat/ConfigSelector.d.ts +11 -0
- package/dist/components/chat/ConfigSelector.d.ts.map +1 -0
- package/dist/components/chat/ConfigSelector.js +47 -0
- package/dist/components/chat/ConfigSelector.js.map +1 -0
- package/dist/components/chat/StopButton.d.ts +8 -0
- package/dist/components/chat/StopButton.d.ts.map +1 -0
- package/dist/components/chat/StopButton.js +25 -0
- package/dist/components/chat/StopButton.js.map +1 -0
- package/dist/components/git/GitCommitModal.d.ts +2 -0
- package/dist/components/git/GitCommitModal.d.ts.map +1 -0
- package/dist/components/git/GitCommitModal.js +44 -0
- package/dist/components/git/GitCommitModal.js.map +1 -0
- package/dist/components/git/GitDiffPanel.d.ts +2 -0
- package/dist/components/git/GitDiffPanel.d.ts.map +1 -0
- package/dist/components/git/GitDiffPanel.js +69 -0
- package/dist/components/git/GitDiffPanel.js.map +1 -0
- package/dist/components/git/GitDiffViewer.d.ts +7 -0
- package/dist/components/git/GitDiffViewer.d.ts.map +1 -0
- package/dist/components/git/GitDiffViewer.js +136 -0
- package/dist/components/git/GitDiffViewer.js.map +1 -0
- package/dist/components/git/GitFileItem.d.ts +9 -0
- package/dist/components/git/GitFileItem.d.ts.map +1 -0
- package/dist/components/git/GitFileItem.js +90 -0
- package/dist/components/git/GitFileItem.js.map +1 -0
- package/dist/components/git/GitFileList.d.ts +7 -0
- package/dist/components/git/GitFileList.d.ts.map +1 -0
- package/dist/components/git/GitFileList.js +24 -0
- package/dist/components/git/GitFileList.js.map +1 -0
- package/dist/components/git/GitSidebar.d.ts +2 -0
- package/dist/components/git/GitSidebar.d.ts.map +1 -0
- package/dist/components/git/GitSidebar.js +38 -0
- package/dist/components/git/GitSidebar.js.map +1 -0
- package/dist/components/git/GitSidebarToggle.d.ts +2 -0
- package/dist/components/git/GitSidebarToggle.d.ts.map +1 -0
- package/dist/components/git/GitSidebarToggle.js +18 -0
- package/dist/components/git/GitSidebarToggle.js.map +1 -0
- package/dist/components/index.d.ts +28 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +34 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/messages/AssistantMessageGroup.d.ts +10 -0
- package/dist/components/messages/AssistantMessageGroup.d.ts.map +1 -0
- package/dist/components/messages/AssistantMessageGroup.js +85 -0
- package/dist/components/messages/AssistantMessageGroup.js.map +1 -0
- package/dist/components/messages/MessagePartItem.d.ts +11 -0
- package/dist/components/messages/MessagePartItem.d.ts.map +1 -0
- package/dist/components/messages/MessagePartItem.js +290 -0
- package/dist/components/messages/MessagePartItem.js.map +1 -0
- package/dist/components/messages/MessageThread.d.ts +9 -0
- package/dist/components/messages/MessageThread.d.ts.map +1 -0
- package/dist/components/messages/MessageThread.js +88 -0
- package/dist/components/messages/MessageThread.js.map +1 -0
- package/dist/components/messages/MessageThreadContainer.d.ts +6 -0
- package/dist/components/messages/MessageThreadContainer.d.ts.map +1 -0
- package/dist/components/messages/MessageThreadContainer.js +18 -0
- package/dist/components/messages/MessageThreadContainer.js.map +1 -0
- package/dist/components/messages/UserMessageGroup.d.ts +8 -0
- package/dist/components/messages/UserMessageGroup.d.ts.map +1 -0
- package/dist/components/messages/UserMessageGroup.js +43 -0
- package/dist/components/messages/UserMessageGroup.js.map +1 -0
- package/dist/components/messages/renderers/ApplyPatchRenderer.d.ts +3 -0
- package/dist/components/messages/renderers/ApplyPatchRenderer.d.ts.map +1 -0
- package/dist/components/messages/renderers/ApplyPatchRenderer.js +36 -0
- package/dist/components/messages/renderers/ApplyPatchRenderer.js.map +1 -0
- package/dist/components/messages/renderers/BashRenderer.d.ts +3 -0
- package/dist/components/messages/renderers/BashRenderer.d.ts.map +1 -0
- package/dist/components/messages/renderers/BashRenderer.js +48 -0
- package/dist/components/messages/renderers/BashRenderer.js.map +1 -0
- package/dist/components/messages/renderers/DebugRenderer.d.ts +5 -0
- package/dist/components/messages/renderers/DebugRenderer.d.ts.map +1 -0
- package/dist/components/messages/renderers/DebugRenderer.js +5 -0
- package/dist/components/messages/renderers/DebugRenderer.js.map +1 -0
- package/dist/components/messages/renderers/DiffView.d.ts +6 -0
- package/dist/components/messages/renderers/DiffView.d.ts.map +1 -0
- package/dist/components/messages/renderers/DiffView.js +186 -0
- package/dist/components/messages/renderers/DiffView.js.map +1 -0
- package/dist/components/messages/renderers/EditRenderer.d.ts +3 -0
- package/dist/components/messages/renderers/EditRenderer.d.ts.map +1 -0
- package/dist/components/messages/renderers/EditRenderer.js +15 -0
- package/dist/components/messages/renderers/EditRenderer.js.map +1 -0
- package/dist/components/messages/renderers/ErrorRenderer.d.ts +8 -0
- package/dist/components/messages/renderers/ErrorRenderer.d.ts.map +1 -0
- package/dist/components/messages/renderers/ErrorRenderer.js +118 -0
- package/dist/components/messages/renderers/ErrorRenderer.js.map +1 -0
- package/dist/components/messages/renderers/FinishRenderer.d.ts +3 -0
- package/dist/components/messages/renderers/FinishRenderer.d.ts.map +1 -0
- package/dist/components/messages/renderers/FinishRenderer.js +7 -0
- package/dist/components/messages/renderers/FinishRenderer.js.map +1 -0
- package/dist/components/messages/renderers/GenericRenderer.d.ts +3 -0
- package/dist/components/messages/renderers/GenericRenderer.d.ts.map +1 -0
- package/dist/components/messages/renderers/GenericRenderer.js +42 -0
- package/dist/components/messages/renderers/GenericRenderer.js.map +1 -0
- package/dist/components/messages/renderers/GitCommitRenderer.d.ts +3 -0
- package/dist/components/messages/renderers/GitCommitRenderer.d.ts.map +1 -0
- package/dist/components/messages/renderers/GitCommitRenderer.js +18 -0
- package/dist/components/messages/renderers/GitCommitRenderer.js.map +1 -0
- package/dist/components/messages/renderers/GitDiffRenderer.d.ts +3 -0
- package/dist/components/messages/renderers/GitDiffRenderer.d.ts.map +1 -0
- package/dist/components/messages/renderers/GitDiffRenderer.js +25 -0
- package/dist/components/messages/renderers/GitDiffRenderer.js.map +1 -0
- package/dist/components/messages/renderers/GitStatusRenderer.d.ts +3 -0
- package/dist/components/messages/renderers/GitStatusRenderer.d.ts.map +1 -0
- package/dist/components/messages/renderers/GitStatusRenderer.js +56 -0
- package/dist/components/messages/renderers/GitStatusRenderer.js.map +1 -0
- package/dist/components/messages/renderers/ListRenderer.d.ts +3 -0
- package/dist/components/messages/renderers/ListRenderer.d.ts.map +1 -0
- package/dist/components/messages/renderers/ListRenderer.js +14 -0
- package/dist/components/messages/renderers/ListRenderer.js.map +1 -0
- package/dist/components/messages/renderers/ProgressUpdateRenderer.d.ts +3 -0
- package/dist/components/messages/renderers/ProgressUpdateRenderer.d.ts.map +1 -0
- package/dist/components/messages/renderers/ProgressUpdateRenderer.js +9 -0
- package/dist/components/messages/renderers/ProgressUpdateRenderer.js.map +1 -0
- package/dist/components/messages/renderers/ReadRenderer.d.ts +3 -0
- package/dist/components/messages/renderers/ReadRenderer.d.ts.map +1 -0
- package/dist/components/messages/renderers/ReadRenderer.js +59 -0
- package/dist/components/messages/renderers/ReadRenderer.js.map +1 -0
- package/dist/components/messages/renderers/SearchRenderer.d.ts +3 -0
- package/dist/components/messages/renderers/SearchRenderer.d.ts.map +1 -0
- package/dist/components/messages/renderers/SearchRenderer.js +62 -0
- package/dist/components/messages/renderers/SearchRenderer.js.map +1 -0
- package/dist/components/messages/renderers/ToolErrorDisplay.d.ts +12 -0
- package/dist/components/messages/renderers/ToolErrorDisplay.d.ts.map +1 -0
- package/dist/components/messages/renderers/ToolErrorDisplay.js +10 -0
- package/dist/components/messages/renderers/ToolErrorDisplay.js.map +1 -0
- package/dist/components/messages/renderers/TreeRenderer.d.ts +3 -0
- package/dist/components/messages/renderers/TreeRenderer.d.ts.map +1 -0
- package/dist/components/messages/renderers/TreeRenderer.js +20 -0
- package/dist/components/messages/renderers/TreeRenderer.js.map +1 -0
- package/dist/components/messages/renderers/UpdatePlanRenderer.d.ts +3 -0
- package/dist/components/messages/renderers/UpdatePlanRenderer.d.ts.map +1 -0
- package/dist/components/messages/renderers/UpdatePlanRenderer.js +13 -0
- package/dist/components/messages/renderers/UpdatePlanRenderer.js.map +1 -0
- package/dist/components/messages/renderers/WebSearchRenderer.d.ts +3 -0
- package/dist/components/messages/renderers/WebSearchRenderer.d.ts.map +1 -0
- package/dist/components/messages/renderers/WebSearchRenderer.js +35 -0
- package/dist/components/messages/renderers/WebSearchRenderer.js.map +1 -0
- package/dist/components/messages/renderers/WriteRenderer.d.ts +3 -0
- package/dist/components/messages/renderers/WriteRenderer.d.ts.map +1 -0
- package/dist/components/messages/renderers/WriteRenderer.js +18 -0
- package/dist/components/messages/renderers/WriteRenderer.js.map +1 -0
- package/dist/components/messages/renderers/index.d.ts +10 -0
- package/dist/components/messages/renderers/index.d.ts.map +1 -0
- package/dist/components/messages/renderers/index.js +72 -0
- package/dist/components/messages/renderers/index.js.map +1 -0
- package/dist/components/messages/renderers/types.d.ts +77 -0
- package/dist/components/messages/renderers/types.d.ts.map +1 -0
- package/dist/components/messages/renderers/types.js +2 -0
- package/dist/components/messages/renderers/types.js.map +1 -0
- package/dist/components/messages/renderers/utils.d.ts +11 -0
- package/dist/components/messages/renderers/utils.d.ts.map +1 -0
- package/dist/components/messages/renderers/utils.js +18 -0
- package/dist/components/messages/renderers/utils.js.map +1 -0
- package/dist/components/sessions/LeanHeader.d.ts +9 -0
- package/dist/components/sessions/LeanHeader.d.ts.map +1 -0
- package/dist/components/sessions/LeanHeader.js +28 -0
- package/dist/components/sessions/LeanHeader.js.map +1 -0
- package/dist/components/sessions/SessionHeader.d.ts +7 -0
- package/dist/components/sessions/SessionHeader.d.ts.map +1 -0
- package/dist/components/sessions/SessionHeader.js +49 -0
- package/dist/components/sessions/SessionHeader.js.map +1 -0
- package/dist/components/sessions/SessionItem.d.ts +9 -0
- package/dist/components/sessions/SessionItem.d.ts.map +1 -0
- package/dist/components/sessions/SessionItem.js +27 -0
- package/dist/components/sessions/SessionItem.js.map +1 -0
- package/dist/components/sessions/SessionListContainer.d.ts +7 -0
- package/dist/components/sessions/SessionListContainer.d.ts.map +1 -0
- package/dist/components/sessions/SessionListContainer.js +32 -0
- package/dist/components/sessions/SessionListContainer.js.map +1 -0
- package/dist/components/ui/Button.d.ts +8 -0
- package/dist/components/ui/Button.d.ts.map +1 -0
- package/dist/components/ui/Button.js +19 -0
- package/dist/components/ui/Button.js.map +1 -0
- package/dist/components/ui/Card.d.ts +6 -0
- package/dist/components/ui/Card.d.ts.map +1 -0
- package/dist/components/ui/Card.js +7 -0
- package/dist/components/ui/Card.js.map +1 -0
- package/dist/components/ui/Input.d.ts +6 -0
- package/dist/components/ui/Input.d.ts.map +1 -0
- package/dist/components/ui/Input.js +7 -0
- package/dist/components/ui/Input.js.map +1 -0
- package/dist/components/ui/Textarea.d.ts +6 -0
- package/dist/components/ui/Textarea.d.ts.map +1 -0
- package/dist/components/ui/Textarea.js +7 -0
- package/dist/components/ui/Textarea.js.map +1 -0
- package/dist/hooks/index.d.ts +8 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +9 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/useConfig.d.ts +18 -0
- package/dist/hooks/useConfig.d.ts.map +1 -0
- package/dist/hooks/useConfig.js +16 -0
- package/dist/hooks/useConfig.js.map +1 -0
- package/dist/hooks/useGit.d.ts +8 -0
- package/dist/hooks/useGit.d.ts.map +1 -0
- package/dist/hooks/useGit.js +71 -0
- package/dist/hooks/useGit.js.map +1 -0
- package/dist/hooks/useMessages.d.ts +4 -0
- package/dist/hooks/useMessages.d.ts.map +1 -0
- package/dist/hooks/useMessages.js +25 -0
- package/dist/hooks/useMessages.js.map +1 -0
- package/dist/hooks/useSessionStream.d.ts +2 -0
- package/dist/hooks/useSessionStream.d.ts.map +1 -0
- package/dist/hooks/useSessionStream.js +332 -0
- package/dist/hooks/useSessionStream.js.map +1 -0
- package/dist/hooks/useSessions.d.ts +4 -0
- package/dist/hooks/useSessions.d.ts.map +1 -0
- package/dist/hooks/useSessions.js +19 -0
- package/dist/hooks/useSessions.js.map +1 -0
- package/dist/hooks/useTheme.d.ts +8 -0
- package/dist/hooks/useTheme.d.ts.map +1 -0
- package/dist/hooks/useTheme.js +40 -0
- package/dist/hooks/useTheme.js.map +1 -0
- package/dist/hooks/useWorkingDirectory.d.ts +2 -0
- package/dist/hooks/useWorkingDirectory.d.ts.map +1 -0
- package/dist/hooks/useWorkingDirectory.js +34 -0
- package/dist/hooks/useWorkingDirectory.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api-client.d.ts +44 -0
- package/dist/lib/api-client.d.ts.map +1 -0
- package/dist/lib/api-client.js +195 -0
- package/dist/lib/api-client.js.map +1 -0
- package/dist/lib/config.d.ts +5 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +22 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/index.d.ts +4 -0
- package/dist/lib/index.d.ts.map +1 -0
- package/dist/lib/index.js +5 -0
- package/dist/lib/index.js.map +1 -0
- package/dist/lib/sse-client.d.ts +13 -0
- package/dist/lib/sse-client.d.ts.map +1 -0
- package/dist/lib/sse-client.js +111 -0
- package/dist/lib/sse-client.js.map +1 -0
- package/dist/stores/gitStore.d.ts +20 -0
- package/dist/stores/gitStore.d.ts.map +1 -0
- package/dist/stores/gitStore.js +35 -0
- package/dist/stores/gitStore.js.map +1 -0
- package/dist/stores/index.d.ts +3 -0
- package/dist/stores/index.d.ts.map +1 -0
- package/dist/stores/index.js +3 -0
- package/dist/stores/index.js.map +1 -0
- package/dist/stores/sidebarStore.d.ts +26 -0
- package/dist/stores/sidebarStore.d.ts.map +1 -0
- package/dist/stores/sidebarStore.js +16 -0
- package/dist/stores/sidebarStore.js.map +1 -0
- package/dist/types/api.d.ts +128 -0
- package/dist/types/api.d.ts.map +1 -0
- package/dist/types/api.js +2 -0
- package/dist/types/api.js.map +1 -0
- 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":"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"}
|
|
@@ -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":"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"}
|
|
@@ -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":";AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAW7D,MAAM,UAAU,cAAc,CAAC,EAC9B,KAAK,EACL,QAAQ,EACR,KAAK,EACL,aAAa,EACb,gBAAgB,EAChB,aAAa,GACQ;IACrB,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,OAAO,CAAC,GAAG,CAAC,yBAAyB,EAAE;QACtC,MAAM;QACN,aAAa;QACb,KAAK;QACL,QAAQ;QACR,KAAK;KACL,CAAC,CAAC;IAEH,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,aAAa,EAAE,CAAC;QACnB,OAAO,CACN,eAAK,SAAS,EAAC,2EAA2E,aACzF,KAAC,QAAQ,IAAC,SAAS,EAAC,4CAA4C,GAAG,EACnE,eAAM,SAAS,EAAC,+BAA+B,kCAAyB,IACnE,CACN,CAAC;IACH,CAAC;IAED,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,OAAO,CACN,cAAK,SAAS,EAAC,sEAAsE,YACpF,cAAK,SAAS,EAAC,uCAAuC,YACrD,eAAK,SAAS,EAAC,qGAAqG,aACnH,KAAC,QAAQ,IAAC,SAAS,EAAC,+BAA+B,GAAG,EAEtD,iBACC,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC9C,SAAS,EAAC,2EAA2E,YAEpF,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACzB,iBAAgB,KAAK,EAAE,CAAC,YACtB,CAAC,IADU,CAAC,CAEL,CACT,CAAC,GACM,EAET,iBACC,KAAK,EAAE,QAAQ,EACf,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EACjD,SAAS,EAAC,2EAA2E,YAEpF,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAC5B,iBAAgB,KAAK,EAAE,CAAC,YACtB,CAAC,IADU,CAAC,CAEL,CACT,CAAC,GACM,EAET,iBACC,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,+FAA+F,YAExG,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,GACD,GACD,CACN,CAAC;AACH,CAAC"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"GitDiffPanel.d.ts","sourceRoot":"","sources":["../../../src/components/git/GitDiffPanel.tsx"],"names":[],"mappings":"AAQA,eAAO,MAAM,YAAY,8CAuHvB,CAAC"}
|