@open-mercato/ai-assistant 0.5.1-develop.2860.07af3a6a9d → 0.5.1-develop.2874.77704bccbd
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/frontend/components/AiDot/AiDot.js +2 -2
- package/dist/frontend/components/AiDot/AiDot.js.map +1 -1
- package/dist/frontend/components/CommandPalette/CommandFooter.js +2 -2
- package/dist/frontend/components/CommandPalette/CommandFooter.js.map +1 -1
- package/dist/frontend/components/CommandPalette/CommandPalette.js +4 -4
- package/dist/frontend/components/CommandPalette/CommandPalette.js.map +2 -2
- package/dist/frontend/components/CommandPalette/DebugPanel.js +1 -1
- package/dist/frontend/components/CommandPalette/DebugPanel.js.map +1 -1
- package/dist/frontend/components/CommandPalette/MessageBubble.js +2 -2
- package/dist/frontend/components/CommandPalette/MessageBubble.js.map +1 -1
- package/dist/frontend/components/CommandPalette/ToolCallConfirmation.js +3 -3
- package/dist/frontend/components/CommandPalette/ToolCallConfirmation.js.map +2 -2
- package/dist/frontend/components/CommandPalette/ToolChatPage.js +1 -1
- package/dist/frontend/components/CommandPalette/ToolChatPage.js.map +1 -1
- package/dist/frontend/components/DockableChat/DockableChat.js +4 -4
- package/dist/frontend/components/DockableChat/DockableChat.js.map +1 -1
- package/dist/modules/ai_assistant/components/AiAssistantSettingsPageClient.js +14 -14
- package/dist/modules/ai_assistant/components/AiAssistantSettingsPageClient.js.map +2 -2
- package/dist/modules/ai_assistant/components/McpConfigDialog.js +3 -3
- package/dist/modules/ai_assistant/components/McpConfigDialog.js.map +2 -2
- package/dist/modules/ai_assistant/frontend/components/AiAssistantSettingsPageClient.js +14 -14
- package/dist/modules/ai_assistant/frontend/components/AiAssistantSettingsPageClient.js.map +2 -2
- package/package.json +4 -4
- package/src/frontend/components/AiDot/AiDot.tsx +2 -2
- package/src/frontend/components/CommandPalette/CommandFooter.tsx +2 -2
- package/src/frontend/components/CommandPalette/CommandPalette.tsx +4 -4
- package/src/frontend/components/CommandPalette/DebugPanel.tsx +1 -1
- package/src/frontend/components/CommandPalette/MessageBubble.tsx +2 -2
- package/src/frontend/components/CommandPalette/ToolCallConfirmation.tsx +3 -3
- package/src/frontend/components/CommandPalette/ToolChatPage.tsx +1 -1
- package/src/frontend/components/DockableChat/DockableChat.tsx +4 -4
- package/src/modules/ai_assistant/components/AiAssistantSettingsPageClient.tsx +15 -15
- package/src/modules/ai_assistant/components/McpConfigDialog.tsx +3 -3
- package/src/modules/ai_assistant/frontend/components/AiAssistantSettingsPageClient.tsx +15 -15
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@open-mercato/ai-assistant",
|
|
3
|
-
"version": "0.5.1-develop.
|
|
3
|
+
"version": "0.5.1-develop.2874.77704bccbd",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=22.0.0"
|
|
@@ -98,12 +98,12 @@
|
|
|
98
98
|
"zod-to-json-schema": "^3.25.2"
|
|
99
99
|
},
|
|
100
100
|
"peerDependencies": {
|
|
101
|
-
"@open-mercato/shared": "0.5.1-develop.
|
|
102
|
-
"@open-mercato/ui": "0.5.1-develop.
|
|
101
|
+
"@open-mercato/shared": "0.5.1-develop.2874.77704bccbd",
|
|
102
|
+
"@open-mercato/ui": "0.5.1-develop.2874.77704bccbd",
|
|
103
103
|
"zod": ">=3.23.0"
|
|
104
104
|
},
|
|
105
105
|
"devDependencies": {
|
|
106
|
-
"@open-mercato/cli": "0.5.1-develop.
|
|
106
|
+
"@open-mercato/cli": "0.5.1-develop.2874.77704bccbd",
|
|
107
107
|
"tsx": "^4.21.0"
|
|
108
108
|
},
|
|
109
109
|
"publishConfig": {
|
|
@@ -25,13 +25,13 @@ export function AiDot({ onClick, isActive, hasMessages, position, className }: A
|
|
|
25
25
|
type="button"
|
|
26
26
|
onClick={onClick}
|
|
27
27
|
className={cn(
|
|
28
|
-
'fixed z-
|
|
28
|
+
'fixed z-sticky group',
|
|
29
29
|
'w-14 h-14 rounded-full',
|
|
30
30
|
'flex items-center justify-center',
|
|
31
31
|
'cursor-pointer',
|
|
32
32
|
'transition-transform duration-200 ease-out',
|
|
33
33
|
'hover:scale-110 active:scale-95',
|
|
34
|
-
'focus:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',
|
|
34
|
+
'focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2',
|
|
35
35
|
className
|
|
36
36
|
)}
|
|
37
37
|
style={floatingPositionStyles[position]}
|
|
@@ -39,7 +39,7 @@ function KeyboardShortcut({ keys }: { keys: string[] }) {
|
|
|
39
39
|
key={i}
|
|
40
40
|
className={cn(
|
|
41
41
|
'inline-flex h-5 min-w-[20px] items-center justify-center rounded',
|
|
42
|
-
'bg-muted px-1.5 text-
|
|
42
|
+
'bg-muted px-1.5 text-overline font-medium text-muted-foreground'
|
|
43
43
|
)}
|
|
44
44
|
>
|
|
45
45
|
{key}
|
|
@@ -69,7 +69,7 @@ export function CommandFooter({
|
|
|
69
69
|
const shortcuts = phase === 'idle' ? idleShortcuts : chatShortcuts
|
|
70
70
|
|
|
71
71
|
return (
|
|
72
|
-
<div className="relative flex items-center justify-between px-3 py-2 border-t bg-muted/
|
|
72
|
+
<div className="relative flex items-center justify-between px-3 py-2 border-t bg-muted/30 text-xs">
|
|
73
73
|
<div className="flex items-center gap-3">
|
|
74
74
|
<ConnectionIndicator status={connectionStatus} />
|
|
75
75
|
|
|
@@ -143,12 +143,12 @@ export function CommandPalette() {
|
|
|
143
143
|
<>
|
|
144
144
|
{/* Custom blur overlay when debug mode is on (since modal=false removes it) */}
|
|
145
145
|
{isOpen && showDebug && (
|
|
146
|
-
<div className="fixed inset-0 z-
|
|
146
|
+
<div className="fixed inset-0 z-overlay bg-black/50 backdrop-blur-sm pointer-events-none" />
|
|
147
147
|
)}
|
|
148
148
|
<Dialog open={isOpen} onOpenChange={handleOpenChange} modal={!showDebug}>
|
|
149
149
|
<DialogContent
|
|
150
150
|
className={cn(
|
|
151
|
-
'fixed left-1/2 top-[10vh] z-
|
|
151
|
+
'fixed left-1/2 top-[10vh] z-modal -translate-x-1/2',
|
|
152
152
|
'w-full max-w-2xl p-0',
|
|
153
153
|
'rounded-xl border bg-background shadow-2xl',
|
|
154
154
|
'flex flex-col'
|
|
@@ -226,7 +226,7 @@ export function CommandPalette() {
|
|
|
226
226
|
placeholder="Describe what you want to do..."
|
|
227
227
|
className={cn(
|
|
228
228
|
'flex-1 bg-muted rounded-lg px-4 py-2 text-sm outline-none',
|
|
229
|
-
'focus:ring-2 focus:ring-ring',
|
|
229
|
+
'focus-visible:ring-2 focus-visible:ring-ring',
|
|
230
230
|
'disabled:opacity-50'
|
|
231
231
|
)}
|
|
232
232
|
disabled={isStreaming}
|
|
@@ -264,7 +264,7 @@ export function CommandPalette() {
|
|
|
264
264
|
{isOpen && showDebug && typeof document !== 'undefined' && createPortal(
|
|
265
265
|
<div
|
|
266
266
|
data-debug-panel
|
|
267
|
-
className="fixed z-
|
|
267
|
+
className="fixed z-top bg-gray-900 rounded-xl border border-gray-700 shadow-2xl flex flex-col overflow-hidden"
|
|
268
268
|
style={{ top: '80px', right: '20px', width: '400px', minWidth: '400px', maxWidth: '400px', maxHeight: 'calc(100vh - 100px)' }}
|
|
269
269
|
>
|
|
270
270
|
<DebugPanel
|
|
@@ -96,7 +96,7 @@ function parseNestedJson(data: unknown): unknown {
|
|
|
96
96
|
|
|
97
97
|
// Custom dark styles for better readability (no external CSS needed)
|
|
98
98
|
const customDarkStyles: Record<string, string> = {
|
|
99
|
-
container: 'bg-transparent text-
|
|
99
|
+
container: 'bg-transparent text-overline leading-relaxed font-mono',
|
|
100
100
|
basicChildStyle: 'pl-4 ml-0',
|
|
101
101
|
label: 'text-purple-400 mr-1',
|
|
102
102
|
nullValue: 'text-gray-500 italic',
|
|
@@ -55,8 +55,8 @@ export function MessageBubble({ message }: MessageBubbleProps) {
|
|
|
55
55
|
'[&_h2]:text-sm [&_h2]:font-semibold [&_h2]:mt-3 [&_h2]:mb-1',
|
|
56
56
|
'[&_h3]:text-sm [&_h3]:font-medium [&_h3]:mt-2 [&_h3]:mb-1',
|
|
57
57
|
// Code blocks
|
|
58
|
-
'[&_pre]:bg-background/
|
|
59
|
-
'[&_code]:bg-background/
|
|
58
|
+
'[&_pre]:bg-background/80 [&_pre]:rounded [&_pre]:p-2 [&_pre]:my-2 [&_pre]:overflow-x-auto',
|
|
59
|
+
'[&_code]:bg-background/80 [&_code]:px-1 [&_code]:py-0.5 [&_code]:rounded [&_code]:text-xs',
|
|
60
60
|
// Strong/emphasis
|
|
61
61
|
'[&_strong]:font-semibold [&_em]:italic',
|
|
62
62
|
// Blockquotes
|
|
@@ -39,10 +39,10 @@ export function ToolCallConfirmation({
|
|
|
39
39
|
|
|
40
40
|
if (toolCall.status === 'completed') {
|
|
41
41
|
return (
|
|
42
|
-
<div className="bg-
|
|
42
|
+
<div className="bg-status-success-bg rounded-lg p-3 border border-status-success-border">
|
|
43
43
|
<div className="flex items-center gap-2">
|
|
44
|
-
<Check className="h-4 w-4 text-
|
|
45
|
-
<span className="text-sm text-
|
|
44
|
+
<Check className="h-4 w-4 text-status-success-icon" />
|
|
45
|
+
<span className="text-sm text-status-success-text">
|
|
46
46
|
{toolCall.toolName} completed successfully
|
|
47
47
|
</span>
|
|
48
48
|
</div>
|
|
@@ -51,7 +51,7 @@ export function ToolChatPage({
|
|
|
51
51
|
<div className="p-3 space-y-3">
|
|
52
52
|
{/* Tool description header - only shown if tool is selected */}
|
|
53
53
|
{tool && (
|
|
54
|
-
<div className="-mx-3 -mt-3 mb-3 px-3 py-2 border-b bg-muted/
|
|
54
|
+
<div className="-mx-3 -mt-3 mb-3 px-3 py-2 border-b bg-muted/30">
|
|
55
55
|
<p className="text-xs text-muted-foreground line-clamp-2">{tool.description}</p>
|
|
56
56
|
</div>
|
|
57
57
|
)}
|
|
@@ -244,7 +244,7 @@ export function DockableChat() {
|
|
|
244
244
|
<>
|
|
245
245
|
<div
|
|
246
246
|
className={cn(
|
|
247
|
-
'fixed z-
|
|
247
|
+
'fixed z-modal',
|
|
248
248
|
'rounded-xl border bg-background shadow-2xl',
|
|
249
249
|
'flex flex-col',
|
|
250
250
|
'transition-all duration-200 ease-out'
|
|
@@ -315,7 +315,7 @@ export function DockableChat() {
|
|
|
315
315
|
placeholder={t('ai_assistant.chat.describePlaceholder')}
|
|
316
316
|
className={cn(
|
|
317
317
|
'flex-1 bg-muted rounded-lg px-4 py-2 text-sm outline-none',
|
|
318
|
-
'focus:ring-2 focus:ring-ring',
|
|
318
|
+
'focus-visible:ring-2 focus-visible:ring-ring',
|
|
319
319
|
'disabled:opacity-50'
|
|
320
320
|
)}
|
|
321
321
|
disabled={isStreaming}
|
|
@@ -350,7 +350,7 @@ export function DockableChat() {
|
|
|
350
350
|
{showDebug && (
|
|
351
351
|
<div
|
|
352
352
|
data-debug-panel
|
|
353
|
-
className="fixed z-
|
|
353
|
+
className="fixed z-top bg-gray-900 rounded-xl border border-gray-700 shadow-2xl flex flex-col overflow-hidden"
|
|
354
354
|
style={{
|
|
355
355
|
top: '24px',
|
|
356
356
|
left: '24px',
|
|
@@ -474,7 +474,7 @@ export function DockableChat() {
|
|
|
474
474
|
placeholder={t('ai_assistant.chat.describePlaceholder')}
|
|
475
475
|
className={cn(
|
|
476
476
|
'flex-1 bg-muted rounded-lg px-4 py-2 text-sm outline-none',
|
|
477
|
-
'focus:ring-2 focus:ring-ring',
|
|
477
|
+
'focus-visible:ring-2 focus-visible:ring-ring',
|
|
478
478
|
'disabled:opacity-50'
|
|
479
479
|
)}
|
|
480
480
|
disabled={isStreaming}
|
|
@@ -189,7 +189,7 @@ function AiAssistantSettingsContent() {
|
|
|
189
189
|
{/* OpenCode Server Status */}
|
|
190
190
|
<div className={`p-4 rounded-lg border-2 ${
|
|
191
191
|
health?.status === 'ok' && health.opencode?.healthy
|
|
192
|
-
? 'border-
|
|
192
|
+
? 'border-status-success-border bg-status-success-bg'
|
|
193
193
|
: 'border-destructive/50 bg-destructive/5'
|
|
194
194
|
}`}>
|
|
195
195
|
<div className="flex items-start justify-between">
|
|
@@ -200,7 +200,7 @@ function AiAssistantSettingsContent() {
|
|
|
200
200
|
</div>
|
|
201
201
|
<p className="text-xs text-muted-foreground mt-1">
|
|
202
202
|
{health?.status === 'ok' && health.opencode?.healthy ? (
|
|
203
|
-
<span className="flex items-center gap-1 text-
|
|
203
|
+
<span className="flex items-center gap-1 text-status-success-text">
|
|
204
204
|
<CheckCircle2 className="h-3 w-3" />
|
|
205
205
|
Connected
|
|
206
206
|
</span>
|
|
@@ -221,7 +221,7 @@ function AiAssistantSettingsContent() {
|
|
|
221
221
|
</p>
|
|
222
222
|
</div>
|
|
223
223
|
{health?.status === 'ok' && health.opencode?.healthy && (
|
|
224
|
-
<div className="flex h-5 w-5 items-center justify-center rounded-full bg-
|
|
224
|
+
<div className="flex h-5 w-5 items-center justify-center rounded-full bg-status-success-bg text-status-success-icon shrink-0">
|
|
225
225
|
<svg className="h-3 w-3" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={3}>
|
|
226
226
|
<path strokeLinecap="round" strokeLinejoin="round" d="M5 13l4 4L19 7" />
|
|
227
227
|
</svg>
|
|
@@ -239,9 +239,9 @@ function AiAssistantSettingsContent() {
|
|
|
239
239
|
return (
|
|
240
240
|
<div className={`p-4 rounded-lg border-2 ${
|
|
241
241
|
mcpConnected
|
|
242
|
-
? 'border-
|
|
242
|
+
? 'border-status-success-border bg-status-success-bg'
|
|
243
243
|
: mcpConnecting
|
|
244
|
-
? 'border-
|
|
244
|
+
? 'border-status-warning-border bg-status-warning-bg'
|
|
245
245
|
: 'border-destructive/50 bg-destructive/5'
|
|
246
246
|
}`}>
|
|
247
247
|
<div className="flex items-start justify-between">
|
|
@@ -252,12 +252,12 @@ function AiAssistantSettingsContent() {
|
|
|
252
252
|
</div>
|
|
253
253
|
<p className="text-xs text-muted-foreground mt-1">
|
|
254
254
|
{mcpConnected ? (
|
|
255
|
-
<span className="flex items-center gap-1 text-
|
|
255
|
+
<span className="flex items-center gap-1 text-status-success-text">
|
|
256
256
|
<CheckCircle2 className="h-3 w-3" />
|
|
257
257
|
Connected
|
|
258
258
|
</span>
|
|
259
259
|
) : mcpConnecting ? (
|
|
260
|
-
<span className="flex items-center gap-1 text-
|
|
260
|
+
<span className="flex items-center gap-1 text-status-warning-text">
|
|
261
261
|
<Loader2 className="h-3 w-3 animate-spin" />
|
|
262
262
|
Connecting...
|
|
263
263
|
</span>
|
|
@@ -273,7 +273,7 @@ function AiAssistantSettingsContent() {
|
|
|
273
273
|
</p>
|
|
274
274
|
</div>
|
|
275
275
|
{mcpConnected && (
|
|
276
|
-
<div className="flex h-5 w-5 items-center justify-center rounded-full bg-
|
|
276
|
+
<div className="flex h-5 w-5 items-center justify-center rounded-full bg-status-success-bg text-status-success-icon shrink-0">
|
|
277
277
|
<svg className="h-3 w-3" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={3}>
|
|
278
278
|
<path strokeLinecap="round" strokeLinejoin="round" d="M5 13l4 4L19 7" />
|
|
279
279
|
</svg>
|
|
@@ -287,7 +287,7 @@ function AiAssistantSettingsContent() {
|
|
|
287
287
|
{/* Meilisearch Status */}
|
|
288
288
|
<div className={`p-4 rounded-lg border-2 ${
|
|
289
289
|
health?.search?.available
|
|
290
|
-
? 'border-
|
|
290
|
+
? 'border-status-success-border bg-status-success-bg'
|
|
291
291
|
: 'border-destructive/50 bg-destructive/5'
|
|
292
292
|
}`}>
|
|
293
293
|
<div className="flex items-start justify-between">
|
|
@@ -298,7 +298,7 @@ function AiAssistantSettingsContent() {
|
|
|
298
298
|
</div>
|
|
299
299
|
<p className="text-xs text-muted-foreground mt-1">
|
|
300
300
|
{health?.search?.available ? (
|
|
301
|
-
<span className="flex items-center gap-1 text-
|
|
301
|
+
<span className="flex items-center gap-1 text-status-success-text">
|
|
302
302
|
<CheckCircle2 className="h-3 w-3" />
|
|
303
303
|
Connected
|
|
304
304
|
</span>
|
|
@@ -314,7 +314,7 @@ function AiAssistantSettingsContent() {
|
|
|
314
314
|
</p>
|
|
315
315
|
</div>
|
|
316
316
|
{health?.search?.available && (
|
|
317
|
-
<div className="flex h-5 w-5 items-center justify-center rounded-full bg-
|
|
317
|
+
<div className="flex h-5 w-5 items-center justify-center rounded-full bg-status-success-bg text-status-success-icon shrink-0">
|
|
318
318
|
<svg className="h-3 w-3" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={3}>
|
|
319
319
|
<path strokeLinecap="round" strokeLinejoin="round" d="M5 13l4 4L19 7" />
|
|
320
320
|
</svg>
|
|
@@ -330,12 +330,12 @@ function AiAssistantSettingsContent() {
|
|
|
330
330
|
<Key className="h-4 w-4 text-muted-foreground" />
|
|
331
331
|
<span className="font-medium">MCP Authentication:</span>
|
|
332
332
|
{settings?.mcpKeyConfigured ? (
|
|
333
|
-
<span className="flex items-center gap-1 text-
|
|
333
|
+
<span className="flex items-center gap-1 text-status-success-text text-xs">
|
|
334
334
|
<CheckCircle2 className="h-3 w-3" />
|
|
335
335
|
MCP_SERVER_API_KEY configured
|
|
336
336
|
</span>
|
|
337
337
|
) : (
|
|
338
|
-
<span className="flex items-center gap-1 text-
|
|
338
|
+
<span className="flex items-center gap-1 text-status-warning-text text-xs">
|
|
339
339
|
<XCircle className="h-3 w-3" />
|
|
340
340
|
MCP_SERVER_API_KEY not set
|
|
341
341
|
</span>
|
|
@@ -353,12 +353,12 @@ function AiAssistantSettingsContent() {
|
|
|
353
353
|
<span className="font-medium">LLM Provider:</span>
|
|
354
354
|
<span className="font-medium">{provider?.name || 'Anthropic'}</span>
|
|
355
355
|
{provider?.configured ? (
|
|
356
|
-
<span className="flex items-center gap-1 text-
|
|
356
|
+
<span className="flex items-center gap-1 text-status-success-text text-xs">
|
|
357
357
|
<CheckCircle2 className="h-3 w-3" />
|
|
358
358
|
{provider?.envKey} configured
|
|
359
359
|
</span>
|
|
360
360
|
) : (
|
|
361
|
-
<span className="flex items-center gap-1 text-
|
|
361
|
+
<span className="flex items-center gap-1 text-status-warning-text text-xs">
|
|
362
362
|
<XCircle className="h-3 w-3" />
|
|
363
363
|
{provider?.envKey || 'ANTHROPIC_API_KEY'} not set
|
|
364
364
|
</span>
|
|
@@ -162,9 +162,9 @@ export default function McpConfigDialog({ open, onOpenChange, mcpUrl }: Props) {
|
|
|
162
162
|
)}
|
|
163
163
|
|
|
164
164
|
{apiKey && (
|
|
165
|
-
<div className="flex items-start gap-2 p-3 bg-
|
|
166
|
-
<AlertTriangle className="h-4 w-4 text-
|
|
167
|
-
<p className="text-sm text-
|
|
165
|
+
<div className="flex items-start gap-2 p-3 bg-status-warning-bg rounded-lg border border-status-warning-border">
|
|
166
|
+
<AlertTriangle className="h-4 w-4 text-status-warning-icon mt-0.5 shrink-0" />
|
|
167
|
+
<p className="text-sm text-status-warning-text">
|
|
168
168
|
{t('ai_assistant.mcp.saveKeyWarning')}
|
|
169
169
|
</p>
|
|
170
170
|
</div>
|
|
@@ -168,12 +168,12 @@ function AiAssistantSettingsContent() {
|
|
|
168
168
|
<span className="text-muted-foreground">Provider:</span>
|
|
169
169
|
<span className="font-medium">{provider?.name || 'Anthropic'}</span>
|
|
170
170
|
{provider?.configured ? (
|
|
171
|
-
<span className="flex items-center gap-1 text-
|
|
171
|
+
<span className="flex items-center gap-1 text-status-success-text text-xs">
|
|
172
172
|
<CheckCircle2 className="h-3 w-3" />
|
|
173
173
|
Configured
|
|
174
174
|
</span>
|
|
175
175
|
) : (
|
|
176
|
-
<span className="flex items-center gap-1 text-
|
|
176
|
+
<span className="flex items-center gap-1 text-status-warning-text text-xs">
|
|
177
177
|
<XCircle className="h-3 w-3" />
|
|
178
178
|
Not configured
|
|
179
179
|
</span>
|
|
@@ -201,7 +201,7 @@ function AiAssistantSettingsContent() {
|
|
|
201
201
|
p.id === provider?.id
|
|
202
202
|
? 'bg-primary text-primary-foreground'
|
|
203
203
|
: p.configured
|
|
204
|
-
? 'bg-
|
|
204
|
+
? 'bg-status-success-bg text-status-success-text'
|
|
205
205
|
: 'bg-muted text-muted-foreground'
|
|
206
206
|
}`}
|
|
207
207
|
>
|
|
@@ -215,7 +215,7 @@ function AiAssistantSettingsContent() {
|
|
|
215
215
|
)}
|
|
216
216
|
|
|
217
217
|
<p className="text-xs text-muted-foreground mt-3">
|
|
218
|
-
Set <code className="font-mono text-
|
|
218
|
+
Set <code className="font-mono text-overline bg-muted px-1 rounded">OPENCODE_PROVIDER</code> in .env to change provider (anthropic, openai, google).
|
|
219
219
|
</p>
|
|
220
220
|
</div>
|
|
221
221
|
|
|
@@ -229,12 +229,12 @@ function AiAssistantSettingsContent() {
|
|
|
229
229
|
<div className="flex items-center gap-2 text-sm">
|
|
230
230
|
<span className="text-muted-foreground">Full-Text Search:</span>
|
|
231
231
|
{health?.search?.available ? (
|
|
232
|
-
<span className="flex items-center gap-1 text-
|
|
232
|
+
<span className="flex items-center gap-1 text-status-success-text">
|
|
233
233
|
<CheckCircle2 className="h-3 w-3" />
|
|
234
234
|
Meilisearch connected
|
|
235
235
|
</span>
|
|
236
236
|
) : (
|
|
237
|
-
<span className="flex items-center gap-1 text-
|
|
237
|
+
<span className="flex items-center gap-1 text-status-warning-text">
|
|
238
238
|
<XCircle className="h-3 w-3" />
|
|
239
239
|
Not available
|
|
240
240
|
</span>
|
|
@@ -262,7 +262,7 @@ function AiAssistantSettingsContent() {
|
|
|
262
262
|
{/* OpenCode Server Status */}
|
|
263
263
|
<div className={`p-4 rounded-lg border-2 ${
|
|
264
264
|
health?.status === 'ok' && health.opencode?.healthy
|
|
265
|
-
? 'border-
|
|
265
|
+
? 'border-status-success-border bg-status-success-bg'
|
|
266
266
|
: 'border-destructive/50 bg-destructive/5'
|
|
267
267
|
}`}>
|
|
268
268
|
<div className="flex items-start justify-between">
|
|
@@ -270,7 +270,7 @@ function AiAssistantSettingsContent() {
|
|
|
270
270
|
<p className="text-sm font-medium">OpenCode Server</p>
|
|
271
271
|
<p className="text-xs text-muted-foreground mt-1">
|
|
272
272
|
{health?.status === 'ok' && health.opencode?.healthy ? (
|
|
273
|
-
<span className="flex items-center gap-1 text-
|
|
273
|
+
<span className="flex items-center gap-1 text-status-success-text">
|
|
274
274
|
<CheckCircle2 className="h-3 w-3" />
|
|
275
275
|
Connected
|
|
276
276
|
</span>
|
|
@@ -291,7 +291,7 @@ function AiAssistantSettingsContent() {
|
|
|
291
291
|
</p>
|
|
292
292
|
</div>
|
|
293
293
|
{health?.status === 'ok' && health.opencode?.healthy && (
|
|
294
|
-
<div className="flex h-5 w-5 items-center justify-center rounded-full bg-
|
|
294
|
+
<div className="flex h-5 w-5 items-center justify-center rounded-full bg-status-success-bg text-status-success-icon">
|
|
295
295
|
<svg className="h-3 w-3" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={3}>
|
|
296
296
|
<path strokeLinecap="round" strokeLinejoin="round" d="M5 13l4 4L19 7" />
|
|
297
297
|
</svg>
|
|
@@ -306,9 +306,9 @@ function AiAssistantSettingsContent() {
|
|
|
306
306
|
key={name}
|
|
307
307
|
className={`p-4 rounded-lg border-2 ${
|
|
308
308
|
mcpStatus.status === 'connected'
|
|
309
|
-
? 'border-
|
|
309
|
+
? 'border-status-success-border bg-status-success-bg'
|
|
310
310
|
: mcpStatus.status === 'connecting'
|
|
311
|
-
? 'border-
|
|
311
|
+
? 'border-status-warning-border bg-status-warning-bg'
|
|
312
312
|
: 'border-destructive/50 bg-destructive/5'
|
|
313
313
|
}`}
|
|
314
314
|
>
|
|
@@ -317,12 +317,12 @@ function AiAssistantSettingsContent() {
|
|
|
317
317
|
<p className="text-sm font-medium">MCP Server</p>
|
|
318
318
|
<p className="text-xs text-muted-foreground mt-1">
|
|
319
319
|
{mcpStatus.status === 'connected' ? (
|
|
320
|
-
<span className="flex items-center gap-1 text-
|
|
320
|
+
<span className="flex items-center gap-1 text-status-success-text">
|
|
321
321
|
<CheckCircle2 className="h-3 w-3" />
|
|
322
322
|
Connected
|
|
323
323
|
</span>
|
|
324
324
|
) : mcpStatus.status === 'connecting' ? (
|
|
325
|
-
<span className="flex items-center gap-1 text-
|
|
325
|
+
<span className="flex items-center gap-1 text-status-warning-text">
|
|
326
326
|
<Loader2 className="h-3 w-3 animate-spin" />
|
|
327
327
|
Connecting...
|
|
328
328
|
</span>
|
|
@@ -337,7 +337,7 @@ function AiAssistantSettingsContent() {
|
|
|
337
337
|
<p className="text-xs text-muted-foreground mt-1">localhost:3001</p>
|
|
338
338
|
</div>
|
|
339
339
|
{mcpStatus.status === 'connected' && (
|
|
340
|
-
<div className="flex h-5 w-5 items-center justify-center rounded-full bg-
|
|
340
|
+
<div className="flex h-5 w-5 items-center justify-center rounded-full bg-status-success-bg text-status-success-icon">
|
|
341
341
|
<svg className="h-3 w-3" fill="none" viewBox="0 0 24 24" stroke="currentColor" strokeWidth={3}>
|
|
342
342
|
<path strokeLinecap="round" strokeLinejoin="round" d="M5 13l4 4L19 7" />
|
|
343
343
|
</svg>
|
|
@@ -349,7 +349,7 @@ function AiAssistantSettingsContent() {
|
|
|
349
349
|
|
|
350
350
|
{/* Show placeholder if no MCP info */}
|
|
351
351
|
{(!health?.mcp || Object.keys(health.mcp).length === 0) && (
|
|
352
|
-
<div className="p-4 rounded-lg border-2 border-border bg-muted/
|
|
352
|
+
<div className="p-4 rounded-lg border-2 border-border bg-muted/30">
|
|
353
353
|
<div>
|
|
354
354
|
<p className="text-sm font-medium">MCP Server</p>
|
|
355
355
|
<p className="text-xs text-muted-foreground mt-1">
|