@open-mercato/ai-assistant 0.5.1-develop.2856.35de414092 → 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.
Files changed (34) hide show
  1. package/dist/frontend/components/AiDot/AiDot.js +2 -2
  2. package/dist/frontend/components/AiDot/AiDot.js.map +1 -1
  3. package/dist/frontend/components/CommandPalette/CommandFooter.js +2 -2
  4. package/dist/frontend/components/CommandPalette/CommandFooter.js.map +1 -1
  5. package/dist/frontend/components/CommandPalette/CommandPalette.js +4 -4
  6. package/dist/frontend/components/CommandPalette/CommandPalette.js.map +2 -2
  7. package/dist/frontend/components/CommandPalette/DebugPanel.js +1 -1
  8. package/dist/frontend/components/CommandPalette/DebugPanel.js.map +1 -1
  9. package/dist/frontend/components/CommandPalette/MessageBubble.js +2 -2
  10. package/dist/frontend/components/CommandPalette/MessageBubble.js.map +1 -1
  11. package/dist/frontend/components/CommandPalette/ToolCallConfirmation.js +3 -3
  12. package/dist/frontend/components/CommandPalette/ToolCallConfirmation.js.map +2 -2
  13. package/dist/frontend/components/CommandPalette/ToolChatPage.js +1 -1
  14. package/dist/frontend/components/CommandPalette/ToolChatPage.js.map +1 -1
  15. package/dist/frontend/components/DockableChat/DockableChat.js +4 -4
  16. package/dist/frontend/components/DockableChat/DockableChat.js.map +1 -1
  17. package/dist/modules/ai_assistant/components/AiAssistantSettingsPageClient.js +14 -14
  18. package/dist/modules/ai_assistant/components/AiAssistantSettingsPageClient.js.map +2 -2
  19. package/dist/modules/ai_assistant/components/McpConfigDialog.js +3 -3
  20. package/dist/modules/ai_assistant/components/McpConfigDialog.js.map +2 -2
  21. package/dist/modules/ai_assistant/frontend/components/AiAssistantSettingsPageClient.js +14 -14
  22. package/dist/modules/ai_assistant/frontend/components/AiAssistantSettingsPageClient.js.map +2 -2
  23. package/package.json +4 -4
  24. package/src/frontend/components/AiDot/AiDot.tsx +2 -2
  25. package/src/frontend/components/CommandPalette/CommandFooter.tsx +2 -2
  26. package/src/frontend/components/CommandPalette/CommandPalette.tsx +4 -4
  27. package/src/frontend/components/CommandPalette/DebugPanel.tsx +1 -1
  28. package/src/frontend/components/CommandPalette/MessageBubble.tsx +2 -2
  29. package/src/frontend/components/CommandPalette/ToolCallConfirmation.tsx +3 -3
  30. package/src/frontend/components/CommandPalette/ToolChatPage.tsx +1 -1
  31. package/src/frontend/components/DockableChat/DockableChat.tsx +4 -4
  32. package/src/modules/ai_assistant/components/AiAssistantSettingsPageClient.tsx +15 -15
  33. package/src/modules/ai_assistant/components/McpConfigDialog.tsx +3 -3
  34. 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.2856.35de414092",
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.2856.35de414092",
102
- "@open-mercato/ui": "0.5.1-develop.2856.35de414092",
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.2856.35de414092",
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-50 group',
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-[10px] font-medium text-muted-foreground'
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/20 text-xs">
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-40 bg-black/50 backdrop-blur-sm pointer-events-none" />
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-50 -translate-x-1/2',
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-[9999] bg-gray-900 rounded-xl border border-gray-700 shadow-2xl flex flex-col overflow-hidden"
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-[11px] leading-relaxed font-mono',
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/50 [&_pre]:rounded [&_pre]:p-2 [&_pre]:my-2 [&_pre]:overflow-x-auto',
59
- '[&_code]:bg-background/50 [&_code]:px-1 [&_code]:py-0.5 [&_code]:rounded [&_code]:text-xs',
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-emerald-50 dark:bg-emerald-900/20 rounded-lg p-3 border border-emerald-200 dark:border-emerald-800">
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-emerald-600 dark:text-emerald-400" />
45
- <span className="text-sm text-emerald-800 dark:text-emerald-200">
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/20">
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-50',
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-[9999] bg-gray-900 rounded-xl border border-gray-700 shadow-2xl flex flex-col overflow-hidden"
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-emerald-500/50 bg-emerald-50/50 dark:bg-emerald-900/10'
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-emerald-600 dark:text-emerald-400">
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-emerald-100 text-emerald-600 dark:bg-emerald-900/40 dark:text-emerald-400 shrink-0">
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-emerald-500/50 bg-emerald-50/50 dark:bg-emerald-900/10'
242
+ ? 'border-status-success-border bg-status-success-bg'
243
243
  : mcpConnecting
244
- ? 'border-amber-500/50 bg-amber-50/50 dark:bg-amber-900/10'
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-emerald-600 dark:text-emerald-400">
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-amber-600 dark:text-amber-400">
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-emerald-100 text-emerald-600 dark:bg-emerald-900/40 dark:text-emerald-400 shrink-0">
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-emerald-500/50 bg-emerald-50/50 dark:bg-emerald-900/10'
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-emerald-600 dark:text-emerald-400">
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-emerald-100 text-emerald-600 dark:bg-emerald-900/40 dark:text-emerald-400 shrink-0">
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-emerald-600 dark:text-emerald-400 text-xs">
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-amber-600 dark:text-amber-400 text-xs">
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-emerald-600 dark:text-emerald-400 text-xs">
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-amber-600 dark:text-amber-400 text-xs">
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-amber-50 dark:bg-amber-900/20 rounded-lg border border-amber-200 dark:border-amber-800">
166
- <AlertTriangle className="h-4 w-4 text-amber-600 dark:text-amber-400 mt-0.5 shrink-0" />
167
- <p className="text-sm text-amber-700 dark:text-amber-300">
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-emerald-600 dark:text-emerald-400 text-xs">
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-amber-600 dark:text-amber-400 text-xs">
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-emerald-100 text-emerald-800 dark:bg-emerald-900/30 dark:text-emerald-400'
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-[10px] bg-muted px-1 rounded">OPENCODE_PROVIDER</code> in .env to change provider (anthropic, openai, google).
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-emerald-600 dark:text-emerald-400">
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-amber-600 dark:text-amber-400">
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-emerald-500/50 bg-emerald-50/50 dark:bg-emerald-900/10'
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-emerald-600 dark:text-emerald-400">
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-emerald-100 text-emerald-600 dark:bg-emerald-900/40 dark:text-emerald-400">
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-emerald-500/50 bg-emerald-50/50 dark:bg-emerald-900/10'
309
+ ? 'border-status-success-border bg-status-success-bg'
310
310
  : mcpStatus.status === 'connecting'
311
- ? 'border-amber-500/50 bg-amber-50/50 dark:bg-amber-900/10'
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-emerald-600 dark:text-emerald-400">
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-amber-600 dark:text-amber-400">
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-emerald-100 text-emerald-600 dark:bg-emerald-900/40 dark:text-emerald-400">
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/20">
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">