codex-linux 1.0.0 → 1.0.2
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/.github/workflows/ci.yml +0 -27
- package/README.md +40 -39
- package/abyss-teal-design-system.html +1449 -0
- package/dist/renderer/assets/main-AJwWHWV7.js +304 -0
- package/dist/renderer/assets/main-ua9RiJ9-.css +1 -0
- package/dist/renderer/index.html +2 -2
- package/package.json +4 -3
- package/scripts/install.sh +1 -1
- package/src/renderer/App.tsx +45 -15
- package/src/renderer/components/AgentPanel.tsx +94 -125
- package/src/renderer/components/AutomationPanel.tsx +39 -34
- package/src/renderer/components/ChatInterface.tsx +81 -123
- package/src/renderer/components/Header.tsx +24 -38
- package/src/renderer/components/SettingsPanel.tsx +89 -96
- package/src/renderer/components/Sidebar.tsx +33 -51
- package/src/renderer/components/SkillsPanel.tsx +54 -56
- package/src/renderer/components/WelcomeChat.tsx +199 -0
- package/src/renderer/components/WorktreePanel.tsx +32 -27
- package/src/renderer/components/ui/Button.tsx +17 -19
- package/src/renderer/components/ui/Card.tsx +14 -15
- package/src/renderer/components/ui/Input.tsx +12 -13
- package/src/renderer/index.css +37 -59
- package/src/renderer/styles/abyss-teal.css +405 -0
- package/dist/renderer/assets/main-DJlZQBCA.js +0 -304
- package/dist/renderer/assets/main-N33ZXEr8.css +0 -1
|
@@ -3,12 +3,8 @@ import { Agent, AIProvider, Skill, CodeChange, ChangeStatus } from '../../shared
|
|
|
3
3
|
import {
|
|
4
4
|
Bot,
|
|
5
5
|
Plus,
|
|
6
|
-
Play,
|
|
7
|
-
Pause,
|
|
8
|
-
Square,
|
|
9
|
-
Trash2,
|
|
10
6
|
MessageSquare,
|
|
11
|
-
|
|
7
|
+
Trash2
|
|
12
8
|
} from 'lucide-react';
|
|
13
9
|
import DiffViewer from './DiffViewer';
|
|
14
10
|
|
|
@@ -164,7 +160,6 @@ export const AgentPanel: React.FC<AgentPanelProps> = ({
|
|
|
164
160
|
setInFlightByAgent(prev => ({ ...prev, [agentId]: false }));
|
|
165
161
|
} else {
|
|
166
162
|
await window.electronAPI.agent.executeTask(agentId, claimed.content);
|
|
167
|
-
// keep inFlight until taskCompleted/taskFailed
|
|
168
163
|
}
|
|
169
164
|
} catch (error) {
|
|
170
165
|
console.error('Failed to dispatch queued item:', error);
|
|
@@ -173,7 +168,6 @@ export const AgentPanel: React.FC<AgentPanelProps> = ({
|
|
|
173
168
|
try {
|
|
174
169
|
await window.electronAPI.queue.complete(agentId, claimed.id, 'failed', error instanceof Error ? error.message : String(error));
|
|
175
170
|
} catch {
|
|
176
|
-
// ignore
|
|
177
171
|
}
|
|
178
172
|
setClaimedByAgent(prev => ({ ...prev, [agentId]: null }));
|
|
179
173
|
}
|
|
@@ -224,14 +218,6 @@ export const AgentPanel: React.FC<AgentPanelProps> = ({
|
|
|
224
218
|
}
|
|
225
219
|
};
|
|
226
220
|
|
|
227
|
-
const handleExecuteTask = async (agentId: string, task: string) => {
|
|
228
|
-
try {
|
|
229
|
-
await window.electronAPI.agent.executeTask(agentId, task);
|
|
230
|
-
} catch (error) {
|
|
231
|
-
console.error('Failed to execute task:', error);
|
|
232
|
-
}
|
|
233
|
-
};
|
|
234
|
-
|
|
235
221
|
const handleApproveChange = async (changeId: string) => {
|
|
236
222
|
if (!selectedAgent) return;
|
|
237
223
|
try {
|
|
@@ -294,49 +280,48 @@ export const AgentPanel: React.FC<AgentPanelProps> = ({
|
|
|
294
280
|
const getStatusIcon = (status: string) => {
|
|
295
281
|
switch (status) {
|
|
296
282
|
case 'running':
|
|
297
|
-
return <div className="w-2 h-2 bg-
|
|
283
|
+
return <div className="w-2 h-2 bg-[var(--success)] rounded-full animate-pulse" />;
|
|
298
284
|
case 'paused':
|
|
299
|
-
return <div className="w-2 h-2 bg-
|
|
285
|
+
return <div className="w-2 h-2 bg-[var(--warning)] rounded-full" />;
|
|
300
286
|
case 'error':
|
|
301
|
-
return <div className="w-2 h-2 bg-
|
|
287
|
+
return <div className="w-2 h-2 bg-[var(--error)] rounded-full" />;
|
|
302
288
|
default:
|
|
303
|
-
return <div className="w-2 h-2 bg-
|
|
289
|
+
return <div className="w-2 h-2 bg-[var(--text-muted)] rounded-full" />;
|
|
304
290
|
}
|
|
305
291
|
};
|
|
306
292
|
|
|
307
293
|
return (
|
|
308
294
|
<div className="h-full flex">
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
<h2 className="font-semibold">Active Agents</h2>
|
|
295
|
+
<div className="w-80 border-r border-[var(--border-subtle)] bg-[var(--bg-surface)] flex flex-col">
|
|
296
|
+
<div className="p-4 border-b border-[var(--border-faint)] flex items-center justify-between">
|
|
297
|
+
<h2 className="font-medium text-[13px] text-[var(--text-primary)]">Active Agents</h2>
|
|
313
298
|
<button
|
|
314
299
|
onClick={() => setShowCreateModal(true)}
|
|
315
|
-
className="p-2 bg-
|
|
300
|
+
className="p-2 bg-[var(--teal-500)] text-[var(--bg-void)] rounded-[var(--radius-sm)] hover:bg-[var(--teal-400)] transition-colors"
|
|
316
301
|
>
|
|
317
302
|
<Plus className="w-4 h-4" />
|
|
318
303
|
</button>
|
|
319
304
|
</div>
|
|
320
305
|
|
|
321
|
-
<div className="flex-1 overflow-auto p-2 space-y-
|
|
306
|
+
<div className="flex-1 overflow-auto p-2 space-y-1">
|
|
322
307
|
{agents.map(agent => (
|
|
323
308
|
<div
|
|
324
309
|
key={agent.id}
|
|
325
310
|
onClick={() => setSelectedAgent(agent)}
|
|
326
|
-
className={`p-3 rounded-
|
|
311
|
+
className={`p-3 rounded-[var(--radius-md)] cursor-pointer transition-all ${
|
|
327
312
|
selectedAgent?.id === agent.id
|
|
328
|
-
? 'bg-
|
|
329
|
-
: 'hover:bg-
|
|
313
|
+
? 'bg-[rgba(0,200,168,0.08)] border border-[var(--border-accent)]'
|
|
314
|
+
: 'hover:bg-[var(--bg-hover)] border border-transparent'
|
|
330
315
|
}`}
|
|
331
316
|
>
|
|
332
317
|
<div className="flex items-start justify-between">
|
|
333
318
|
<div className="flex items-center gap-2">
|
|
334
|
-
<Bot className="w-4 h-4 text-muted
|
|
335
|
-
<span className="font-medium text-
|
|
319
|
+
<Bot className="w-4 h-4 text-[var(--text-muted)]" />
|
|
320
|
+
<span className="font-medium text-[13px] text-[var(--text-primary)]">{agent.name}</span>
|
|
336
321
|
</div>
|
|
337
322
|
{getStatusIcon(agent.status)}
|
|
338
323
|
</div>
|
|
339
|
-
<div className="mt-2 text-
|
|
324
|
+
<div className="mt-2 text-[11px] text-[var(--text-muted)]">
|
|
340
325
|
<div className="truncate">{agent.projectPath}</div>
|
|
341
326
|
<div className="mt-1">{agent.model}</div>
|
|
342
327
|
</div>
|
|
@@ -344,37 +329,36 @@ export const AgentPanel: React.FC<AgentPanelProps> = ({
|
|
|
344
329
|
))}
|
|
345
330
|
|
|
346
331
|
{agents.length === 0 && (
|
|
347
|
-
<div className="text-center py-8 text-muted
|
|
348
|
-
<Bot className="w-12 h-12 mx-auto mb-2 opacity-
|
|
349
|
-
<p className="text-
|
|
350
|
-
<p className="text-
|
|
332
|
+
<div className="text-center py-8 text-[var(--text-muted)]">
|
|
333
|
+
<Bot className="w-12 h-12 mx-auto mb-2 opacity-30" />
|
|
334
|
+
<p className="text-[13px]">No agents yet</p>
|
|
335
|
+
<p className="text-[11px] mt-1">Create your first agent to get started</p>
|
|
351
336
|
</div>
|
|
352
337
|
)}
|
|
353
338
|
</div>
|
|
354
339
|
</div>
|
|
355
340
|
|
|
356
|
-
{/* Agent Detail View */}
|
|
357
341
|
<div className="flex-1 flex flex-col">
|
|
358
342
|
{selectedAgent ? (
|
|
359
343
|
<>
|
|
360
|
-
<div className="p-4 border-b border-border flex items-center justify-between">
|
|
344
|
+
<div className="p-4 border-b border-[var(--border-subtle)] flex items-center justify-between">
|
|
361
345
|
<div>
|
|
362
|
-
<h2 className="text-
|
|
363
|
-
<p className="text-
|
|
364
|
-
{selectedAgent.projectPath}
|
|
346
|
+
<h2 className="text-[16px] font-medium text-[var(--text-primary)]">{selectedAgent.name}</h2>
|
|
347
|
+
<p className="text-[12px] text-[var(--text-muted)]">
|
|
348
|
+
{selectedAgent.projectPath} · {selectedAgent.model}
|
|
365
349
|
</p>
|
|
366
350
|
</div>
|
|
367
351
|
<div className="flex items-center gap-2">
|
|
368
352
|
<button
|
|
369
353
|
onClick={() => handleSendMessage(selectedAgent.id, 'Hello!')}
|
|
370
|
-
className="px-3 py-1.5 text-
|
|
354
|
+
className="px-3 py-1.5 text-[12px] bg-[var(--teal-500)] text-[var(--bg-void)] rounded-[var(--radius-sm)] hover:bg-[var(--teal-400)] transition-colors flex items-center gap-1"
|
|
371
355
|
>
|
|
372
|
-
<MessageSquare className="w-
|
|
356
|
+
<MessageSquare className="w-3.5 h-3.5" />
|
|
373
357
|
Chat
|
|
374
358
|
</button>
|
|
375
359
|
<button
|
|
376
360
|
onClick={() => onDeleteAgent(selectedAgent.id)}
|
|
377
|
-
className="p-2 text-
|
|
361
|
+
className="p-2 text-[var(--error)] hover:bg-[rgba(232,90,106,0.1)] rounded-[var(--radius-sm)] transition-colors"
|
|
378
362
|
>
|
|
379
363
|
<Trash2 className="w-4 h-4" />
|
|
380
364
|
</button>
|
|
@@ -384,15 +368,15 @@ export const AgentPanel: React.FC<AgentPanelProps> = ({
|
|
|
384
368
|
<div className="flex-1 overflow-auto p-4">
|
|
385
369
|
<div className="grid grid-cols-1 lg:grid-cols-2 gap-4">
|
|
386
370
|
<div className="space-y-4">
|
|
387
|
-
<div className="bg-card border border-border rounded-lg p-
|
|
371
|
+
<div className="bg-[var(--bg-card)] border border-[var(--border-subtle)] rounded-[var(--radius-lg)] p-4">
|
|
388
372
|
<div className="flex items-center justify-between">
|
|
389
373
|
<div>
|
|
390
|
-
<h3 className="text-
|
|
391
|
-
<p className="text-
|
|
374
|
+
<h3 className="text-[13px] font-medium text-[var(--text-primary)]">Queue</h3>
|
|
375
|
+
<p className="text-[11px] text-[var(--text-muted)]">Stack work while the agent is busy</p>
|
|
392
376
|
</div>
|
|
393
|
-
<span className="text-
|
|
377
|
+
<span className="text-[11px] text-[var(--text-muted)]">
|
|
394
378
|
{queueItems.length} queued
|
|
395
|
-
{inFlightByAgent[selectedAgent.id] ? '
|
|
379
|
+
{inFlightByAgent[selectedAgent.id] ? ' · running' : ''}
|
|
396
380
|
</span>
|
|
397
381
|
</div>
|
|
398
382
|
|
|
@@ -400,7 +384,7 @@ export const AgentPanel: React.FC<AgentPanelProps> = ({
|
|
|
400
384
|
<select
|
|
401
385
|
value={newQueueType}
|
|
402
386
|
onChange={e => setNewQueueType(e.target.value as any)}
|
|
403
|
-
className="px-2 py-2 bg-
|
|
387
|
+
className="px-2 py-2 bg-[var(--bg-elevated)] border border-[var(--border-subtle)] rounded-[var(--radius-md)] text-[12px] text-[var(--text-primary)]"
|
|
404
388
|
>
|
|
405
389
|
<option value="task">Task</option>
|
|
406
390
|
<option value="message">Message</option>
|
|
@@ -409,7 +393,7 @@ export const AgentPanel: React.FC<AgentPanelProps> = ({
|
|
|
409
393
|
value={newQueueContent}
|
|
410
394
|
onChange={e => setNewQueueContent(e.target.value)}
|
|
411
395
|
placeholder={newQueueType === 'task' ? 'Describe the task...' : 'Type a message...'}
|
|
412
|
-
className="flex-1 px-3 py-2 bg-
|
|
396
|
+
className="flex-1 px-3 py-2 bg-[var(--bg-elevated)] border border-[var(--border-subtle)] rounded-[var(--radius-md)] text-[12px] text-[var(--text-primary)] placeholder:text-[var(--text-disabled)] focus:outline-none focus:border-[var(--teal-500)]"
|
|
413
397
|
/>
|
|
414
398
|
<button
|
|
415
399
|
onClick={() => {
|
|
@@ -428,7 +412,7 @@ export const AgentPanel: React.FC<AgentPanelProps> = ({
|
|
|
428
412
|
}
|
|
429
413
|
})();
|
|
430
414
|
}}
|
|
431
|
-
className="px-3 py-2 bg-
|
|
415
|
+
className="px-3 py-2 bg-[var(--teal-500)] text-[var(--bg-void)] rounded-[var(--radius-md)] hover:bg-[var(--teal-400)] text-[12px] font-medium transition-colors"
|
|
432
416
|
>
|
|
433
417
|
Add
|
|
434
418
|
</button>
|
|
@@ -436,11 +420,11 @@ export const AgentPanel: React.FC<AgentPanelProps> = ({
|
|
|
436
420
|
|
|
437
421
|
<div className="mt-3 space-y-2 max-h-40 overflow-auto">
|
|
438
422
|
{queueItems.map((item, idx) => (
|
|
439
|
-
<div key={item.id} className="flex items-center gap-2 p-2 bg-
|
|
440
|
-
<span className="text-
|
|
423
|
+
<div key={item.id} className="flex items-center gap-2 p-2 bg-[var(--bg-elevated)] rounded-[var(--radius-md)]">
|
|
424
|
+
<span className="text-[10px] px-2 py-0.5 rounded-full bg-[var(--bg-hover)] border border-[var(--border-subtle)] text-[var(--text-secondary)]">
|
|
441
425
|
{item.type}
|
|
442
426
|
</span>
|
|
443
|
-
<span className="text-
|
|
427
|
+
<span className="text-[12px] flex-1 truncate text-[var(--text-primary)]">{item.content}</span>
|
|
444
428
|
<button
|
|
445
429
|
onClick={() => {
|
|
446
430
|
const agentId = selectedAgent.id;
|
|
@@ -449,56 +433,42 @@ export const AgentPanel: React.FC<AgentPanelProps> = ({
|
|
|
449
433
|
await refreshQueue(agentId);
|
|
450
434
|
})();
|
|
451
435
|
}}
|
|
452
|
-
className="text-
|
|
436
|
+
className="text-[11px] text-[var(--error)] hover:underline"
|
|
453
437
|
>
|
|
454
438
|
Remove
|
|
455
439
|
</button>
|
|
456
|
-
<button
|
|
457
|
-
disabled={idx === 0}
|
|
458
|
-
onClick={() => {
|
|
459
|
-
const agentId = selectedAgent.id;
|
|
460
|
-
(async () => {
|
|
461
|
-
await window.electronAPI.queue.moveUp(agentId, item.id);
|
|
462
|
-
await refreshQueue(agentId);
|
|
463
|
-
})();
|
|
464
|
-
}}
|
|
465
|
-
className="text-xs text-muted-foreground disabled:opacity-50"
|
|
466
|
-
>
|
|
467
|
-
Up
|
|
468
|
-
</button>
|
|
469
440
|
</div>
|
|
470
441
|
))}
|
|
471
442
|
{queueItems.length === 0 && (
|
|
472
|
-
<div className="text-
|
|
443
|
+
<div className="text-[11px] text-[var(--text-muted)]">No queued items</div>
|
|
473
444
|
)}
|
|
474
445
|
</div>
|
|
475
446
|
|
|
476
|
-
{/* Queue History */}
|
|
477
447
|
<div className="mt-3">
|
|
478
448
|
<button
|
|
479
449
|
onClick={() => setShowQueueHistory(!showQueueHistory)}
|
|
480
|
-
className="text-
|
|
450
|
+
className="text-[11px] text-[var(--text-muted)] hover:text-[var(--text-secondary)]"
|
|
481
451
|
>
|
|
482
452
|
{showQueueHistory ? 'Hide' : 'Show'} history ({queueHistory.length})
|
|
483
453
|
</button>
|
|
484
454
|
{showQueueHistory && (
|
|
485
455
|
<div className="mt-2 space-y-1 max-h-32 overflow-auto">
|
|
486
456
|
{queueHistory.map(item => (
|
|
487
|
-
<div key={item.id} className="flex items-center gap-2 p-2 bg-
|
|
457
|
+
<div key={item.id} className="flex items-center gap-2 p-2 bg-[var(--bg-elevated)] rounded-[var(--radius-md)] text-[11px]">
|
|
488
458
|
<span className={`px-1.5 py-0.5 rounded-full ${
|
|
489
|
-
item.status === 'completed' ? 'bg-
|
|
459
|
+
item.status === 'completed' ? 'bg-[rgba(60,200,120,0.1)] text-[var(--success)]' : 'bg-[rgba(232,90,106,0.1)] text-[var(--error)]'
|
|
490
460
|
}`}>
|
|
491
461
|
{item.status}
|
|
492
462
|
</span>
|
|
493
|
-
<span className="text-muted
|
|
494
|
-
<span className="flex-1 truncate">{item.content}</span>
|
|
463
|
+
<span className="text-[var(--text-muted)]">{item.type}</span>
|
|
464
|
+
<span className="flex-1 truncate text-[var(--text-primary)]">{item.content}</span>
|
|
495
465
|
{item.error && (
|
|
496
|
-
<span className="text-
|
|
466
|
+
<span className="text-[var(--error)] truncate" title={item.error}>⚠️</span>
|
|
497
467
|
)}
|
|
498
468
|
</div>
|
|
499
469
|
))}
|
|
500
470
|
{queueHistory.length === 0 && (
|
|
501
|
-
<div className="text-
|
|
471
|
+
<div className="text-[11px] text-[var(--text-muted)]">No completed items yet</div>
|
|
502
472
|
)}
|
|
503
473
|
</div>
|
|
504
474
|
)}
|
|
@@ -506,13 +476,13 @@ export const AgentPanel: React.FC<AgentPanelProps> = ({
|
|
|
506
476
|
</div>
|
|
507
477
|
|
|
508
478
|
<div>
|
|
509
|
-
<h3 className="text-
|
|
479
|
+
<h3 className="text-[12px] font-medium text-[var(--text-secondary)] mb-2">Status</h3>
|
|
510
480
|
<div className="flex items-center gap-2">
|
|
511
|
-
<span className={`px-2 py-1 rounded-full text-
|
|
512
|
-
selectedAgent.status === 'running' ? 'bg-
|
|
513
|
-
selectedAgent.status === 'paused' ? 'bg-
|
|
514
|
-
selectedAgent.status === 'error' ? 'bg-
|
|
515
|
-
'bg-
|
|
481
|
+
<span className={`px-2 py-1 rounded-full text-[11px] font-medium ${
|
|
482
|
+
selectedAgent.status === 'running' ? 'bg-[rgba(60,200,120,0.1)] text-[var(--success)]' :
|
|
483
|
+
selectedAgent.status === 'paused' ? 'bg-[rgba(230,185,74,0.1)] text-[var(--warning)]' :
|
|
484
|
+
selectedAgent.status === 'error' ? 'bg-[rgba(232,90,106,0.1)] text-[var(--error)]' :
|
|
485
|
+
'bg-[var(--bg-hover)] text-[var(--text-muted)]'
|
|
516
486
|
}`}>
|
|
517
487
|
{selectedAgent.status}
|
|
518
488
|
</span>
|
|
@@ -520,48 +490,48 @@ export const AgentPanel: React.FC<AgentPanelProps> = ({
|
|
|
520
490
|
</div>
|
|
521
491
|
|
|
522
492
|
<div>
|
|
523
|
-
<h3 className="text-
|
|
493
|
+
<h3 className="text-[12px] font-medium text-[var(--text-secondary)] mb-2">Skills</h3>
|
|
524
494
|
<div className="flex flex-wrap gap-2">
|
|
525
495
|
{selectedAgent.skills.map(skillId => {
|
|
526
496
|
const skill = skills.find(s => s.id === skillId);
|
|
527
497
|
return (
|
|
528
498
|
<span
|
|
529
499
|
key={skillId}
|
|
530
|
-
className="px-2 py-1 bg-
|
|
500
|
+
className="px-2 py-1 bg-[var(--bg-hover)] rounded-[var(--radius-sm)] text-[11px] text-[var(--text-secondary)]"
|
|
531
501
|
>
|
|
532
502
|
{skill?.name || skillId}
|
|
533
503
|
</span>
|
|
534
504
|
);
|
|
535
505
|
})}
|
|
536
506
|
{selectedAgent.skills.length === 0 && (
|
|
537
|
-
<span className="text-
|
|
507
|
+
<span className="text-[12px] text-[var(--text-muted)]">No skills applied</span>
|
|
538
508
|
)}
|
|
539
509
|
</div>
|
|
540
510
|
</div>
|
|
541
511
|
|
|
542
512
|
<div>
|
|
543
|
-
<h3 className="text-
|
|
513
|
+
<h3 className="text-[12px] font-medium text-[var(--text-secondary)] mb-2">Recent Tasks</h3>
|
|
544
514
|
<div className="space-y-2">
|
|
545
515
|
{selectedAgent.tasks.slice(-5).map(task => (
|
|
546
516
|
<div
|
|
547
517
|
key={task.id}
|
|
548
|
-
className="p-3 bg-
|
|
518
|
+
className="p-3 bg-[var(--bg-card)] border border-[var(--border-subtle)] rounded-[var(--radius-md)]"
|
|
549
519
|
>
|
|
550
520
|
<div className="flex items-center justify-between">
|
|
551
|
-
<span className="text-
|
|
552
|
-
<span className={`text-
|
|
553
|
-
task.status === 'completed' ? 'text-
|
|
554
|
-
task.status === 'failed' ? 'text-
|
|
555
|
-
task.status === 'running' ? 'text-
|
|
556
|
-
'text-muted
|
|
521
|
+
<span className="text-[12px] font-medium text-[var(--text-primary)]">{task.description}</span>
|
|
522
|
+
<span className={`text-[11px] ${
|
|
523
|
+
task.status === 'completed' ? 'text-[var(--success)]' :
|
|
524
|
+
task.status === 'failed' ? 'text-[var(--error)]' :
|
|
525
|
+
task.status === 'running' ? 'text-[var(--info)]' :
|
|
526
|
+
'text-[var(--text-muted)]'
|
|
557
527
|
}`}>
|
|
558
528
|
{task.status}
|
|
559
529
|
</span>
|
|
560
530
|
</div>
|
|
561
531
|
{task.status === 'running' && (
|
|
562
|
-
<div className="mt-2 h-1 bg-
|
|
532
|
+
<div className="mt-2 h-1 bg-[var(--bg-hover)] rounded-full overflow-hidden">
|
|
563
533
|
<div
|
|
564
|
-
className="h-full bg-
|
|
534
|
+
className="h-full bg-[var(--teal-500)] transition-all"
|
|
565
535
|
style={{ width: `${task.progress}%` }}
|
|
566
536
|
/>
|
|
567
537
|
</div>
|
|
@@ -569,17 +539,17 @@ export const AgentPanel: React.FC<AgentPanelProps> = ({
|
|
|
569
539
|
</div>
|
|
570
540
|
))}
|
|
571
541
|
{selectedAgent.tasks.length === 0 && (
|
|
572
|
-
<span className="text-
|
|
542
|
+
<span className="text-[12px] text-[var(--text-muted)]">No tasks yet</span>
|
|
573
543
|
)}
|
|
574
544
|
</div>
|
|
575
545
|
</div>
|
|
576
546
|
</div>
|
|
577
547
|
|
|
578
|
-
<div className="bg-card border border-border rounded-lg overflow-hidden min-h-[420px]">
|
|
579
|
-
<div className="p-3 border-b border-border flex items-center justify-between">
|
|
548
|
+
<div className="bg-[var(--bg-card)] border border-[var(--border-subtle)] rounded-[var(--radius-lg)] overflow-hidden min-h-[420px]">
|
|
549
|
+
<div className="p-3 border-b border-[var(--border-subtle)] flex items-center justify-between">
|
|
580
550
|
<div>
|
|
581
|
-
<h3 className="text-
|
|
582
|
-
<p className="text-
|
|
551
|
+
<h3 className="text-[13px] font-medium text-[var(--text-primary)]">Changes</h3>
|
|
552
|
+
<p className="text-[11px] text-[var(--text-muted)]">
|
|
583
553
|
Review and apply changes generated by the agent
|
|
584
554
|
</p>
|
|
585
555
|
</div>
|
|
@@ -606,12 +576,12 @@ export const AgentPanel: React.FC<AgentPanelProps> = ({
|
|
|
606
576
|
});
|
|
607
577
|
}
|
|
608
578
|
}}
|
|
609
|
-
className="px-3 py-1.5 text-
|
|
579
|
+
className="px-3 py-1.5 text-[11px] bg-[var(--bg-hover)] hover:bg-[var(--bg-active)] rounded-[var(--radius-sm)] text-[var(--text-secondary)] transition-colors"
|
|
610
580
|
>
|
|
611
581
|
Undo last apply
|
|
612
582
|
</button>
|
|
613
583
|
{changesLoading && (
|
|
614
|
-
<span className="text-
|
|
584
|
+
<span className="text-[11px] text-[var(--text-muted)]">Loading...</span>
|
|
615
585
|
)}
|
|
616
586
|
</div>
|
|
617
587
|
|
|
@@ -628,41 +598,40 @@ export const AgentPanel: React.FC<AgentPanelProps> = ({
|
|
|
628
598
|
</div>
|
|
629
599
|
</>
|
|
630
600
|
) : (
|
|
631
|
-
<div className="flex-1 flex items-center justify-center text-muted
|
|
601
|
+
<div className="flex-1 flex items-center justify-center text-[var(--text-muted)]">
|
|
632
602
|
<div className="text-center">
|
|
633
603
|
<Bot className="w-16 h-16 mx-auto mb-4 opacity-30" />
|
|
634
|
-
<p>Select an agent to view details</p>
|
|
604
|
+
<p className="text-[14px]">Select an agent to view details</p>
|
|
635
605
|
</div>
|
|
636
606
|
</div>
|
|
637
607
|
)}
|
|
638
608
|
</div>
|
|
639
609
|
|
|
640
|
-
{/* Create Agent Modal */}
|
|
641
610
|
{showCreateModal && (
|
|
642
|
-
<div className="fixed inset-0 bg-
|
|
643
|
-
<div className="bg-card border border-border rounded-lg p-6 w-[500px] max-w-[90vw]">
|
|
644
|
-
<h2 className="text-
|
|
611
|
+
<div className="fixed inset-0 bg-[rgba(3,7,9,0.8)] flex items-center justify-center z-50">
|
|
612
|
+
<div className="bg-[var(--bg-card)] border border-[var(--border-subtle)] rounded-[var(--radius-lg)] p-6 w-[500px] max-w-[90vw]">
|
|
613
|
+
<h2 className="text-[16px] font-medium text-[var(--text-primary)] mb-4">Create New Agent</h2>
|
|
645
614
|
|
|
646
615
|
<div className="space-y-4">
|
|
647
616
|
<div>
|
|
648
|
-
<label className="block text-
|
|
617
|
+
<label className="block text-[11px] font-medium text-[var(--text-secondary)] mb-1">Name</label>
|
|
649
618
|
<input
|
|
650
619
|
type="text"
|
|
651
620
|
value={newAgentConfig.name}
|
|
652
621
|
onChange={e => setNewAgentConfig({ ...newAgentConfig, name: e.target.value })}
|
|
653
|
-
className="w-full px-3 py-2 bg-
|
|
622
|
+
className="w-full px-3 py-2 bg-[var(--bg-elevated)] border border-[var(--border-subtle)] rounded-[var(--radius-md)] text-[13px] text-[var(--text-primary)] placeholder:text-[var(--text-disabled)] focus:outline-none focus:border-[var(--teal-500)]"
|
|
654
623
|
placeholder="My Coding Agent"
|
|
655
624
|
/>
|
|
656
625
|
</div>
|
|
657
626
|
|
|
658
627
|
<div>
|
|
659
|
-
<label className="block text-
|
|
628
|
+
<label className="block text-[11px] font-medium text-[var(--text-secondary)] mb-1">Project Path</label>
|
|
660
629
|
<div className="flex gap-2">
|
|
661
630
|
<input
|
|
662
631
|
type="text"
|
|
663
632
|
value={newAgentConfig.projectPath}
|
|
664
633
|
onChange={e => setNewAgentConfig({ ...newAgentConfig, projectPath: e.target.value })}
|
|
665
|
-
className="flex-1 px-3 py-2 bg-
|
|
634
|
+
className="flex-1 px-3 py-2 bg-[var(--bg-elevated)] border border-[var(--border-subtle)] rounded-[var(--radius-md)] text-[13px] text-[var(--text-primary)] placeholder:text-[var(--text-disabled)] focus:outline-none focus:border-[var(--teal-500)]"
|
|
666
635
|
placeholder="/path/to/project"
|
|
667
636
|
/>
|
|
668
637
|
<button
|
|
@@ -670,7 +639,7 @@ export const AgentPanel: React.FC<AgentPanelProps> = ({
|
|
|
670
639
|
const path = await window.electronAPI.dialog.selectFolder();
|
|
671
640
|
if (path) setNewAgentConfig({ ...newAgentConfig, projectPath: path });
|
|
672
641
|
}}
|
|
673
|
-
className="px-3 py-2 bg-
|
|
642
|
+
className="px-3 py-2 bg-[var(--bg-hover)] rounded-[var(--radius-md)] hover:bg-[var(--bg-active)] text-[13px] text-[var(--text-secondary)] transition-colors"
|
|
674
643
|
>
|
|
675
644
|
Browse
|
|
676
645
|
</button>
|
|
@@ -678,7 +647,7 @@ export const AgentPanel: React.FC<AgentPanelProps> = ({
|
|
|
678
647
|
</div>
|
|
679
648
|
|
|
680
649
|
<div>
|
|
681
|
-
<label className="block text-
|
|
650
|
+
<label className="block text-[11px] font-medium text-[var(--text-secondary)] mb-1">Provider</label>
|
|
682
651
|
<select
|
|
683
652
|
value={newAgentConfig.providerId}
|
|
684
653
|
onChange={e => {
|
|
@@ -689,7 +658,7 @@ export const AgentPanel: React.FC<AgentPanelProps> = ({
|
|
|
689
658
|
model: provider?.models[0]?.id || ''
|
|
690
659
|
});
|
|
691
660
|
}}
|
|
692
|
-
className="w-full px-3 py-2 bg-
|
|
661
|
+
className="w-full px-3 py-2 bg-[var(--bg-elevated)] border border-[var(--border-subtle)] rounded-[var(--radius-md)] text-[13px] text-[var(--text-primary)]"
|
|
693
662
|
>
|
|
694
663
|
{providers.map(provider => (
|
|
695
664
|
<option key={provider.id} value={provider.id}>{provider.name}</option>
|
|
@@ -698,11 +667,11 @@ export const AgentPanel: React.FC<AgentPanelProps> = ({
|
|
|
698
667
|
</div>
|
|
699
668
|
|
|
700
669
|
<div>
|
|
701
|
-
<label className="block text-
|
|
670
|
+
<label className="block text-[11px] font-medium text-[var(--text-secondary)] mb-1">Model</label>
|
|
702
671
|
<select
|
|
703
672
|
value={newAgentConfig.model}
|
|
704
673
|
onChange={e => setNewAgentConfig({ ...newAgentConfig, model: e.target.value })}
|
|
705
|
-
className="w-full px-3 py-2 bg-
|
|
674
|
+
className="w-full px-3 py-2 bg-[var(--bg-elevated)] border border-[var(--border-subtle)] rounded-[var(--radius-md)] text-[13px] text-[var(--text-primary)]"
|
|
706
675
|
>
|
|
707
676
|
{providers
|
|
708
677
|
.find(p => p.id === newAgentConfig.providerId)
|
|
@@ -713,7 +682,7 @@ export const AgentPanel: React.FC<AgentPanelProps> = ({
|
|
|
713
682
|
</div>
|
|
714
683
|
|
|
715
684
|
<div>
|
|
716
|
-
<label className="block text-
|
|
685
|
+
<label className="block text-[11px] font-medium text-[var(--text-secondary)] mb-1">Skills</label>
|
|
717
686
|
<div className="flex flex-wrap gap-2">
|
|
718
687
|
{skills.map(skill => (
|
|
719
688
|
<button
|
|
@@ -724,10 +693,10 @@ export const AgentPanel: React.FC<AgentPanelProps> = ({
|
|
|
724
693
|
: [...newAgentConfig.skills, skill.id];
|
|
725
694
|
setNewAgentConfig({ ...newAgentConfig, skills: newSkills });
|
|
726
695
|
}}
|
|
727
|
-
className={`px-3 py-1.5 rounded-
|
|
696
|
+
className={`px-3 py-1.5 rounded-[var(--radius-sm)] text-[12px] transition-colors ${
|
|
728
697
|
newAgentConfig.skills.includes(skill.id)
|
|
729
|
-
? 'bg-
|
|
730
|
-
: 'bg-
|
|
698
|
+
? 'bg-[var(--teal-500)] text-[var(--bg-void)]'
|
|
699
|
+
: 'bg-[var(--bg-hover)] text-[var(--text-secondary)] hover:bg-[var(--bg-active)]'
|
|
731
700
|
}`}
|
|
732
701
|
>
|
|
733
702
|
{skill.name}
|
|
@@ -740,14 +709,14 @@ export const AgentPanel: React.FC<AgentPanelProps> = ({
|
|
|
740
709
|
<div className="flex justify-end gap-2 mt-6">
|
|
741
710
|
<button
|
|
742
711
|
onClick={() => setShowCreateModal(false)}
|
|
743
|
-
className="px-4 py-2 text-muted
|
|
712
|
+
className="px-4 py-2 text-[var(--text-muted)] hover:text-[var(--text-primary)] text-[13px] transition-colors"
|
|
744
713
|
>
|
|
745
714
|
Cancel
|
|
746
715
|
</button>
|
|
747
716
|
<button
|
|
748
717
|
onClick={handleCreateAgent}
|
|
749
718
|
disabled={!newAgentConfig.name || !newAgentConfig.projectPath}
|
|
750
|
-
className="px-4 py-2 bg-
|
|
719
|
+
className="px-4 py-2 bg-[var(--teal-500)] text-[var(--bg-void)] rounded-[var(--radius-sm)] hover:bg-[var(--teal-400)] disabled:opacity-50 text-[13px] font-medium transition-colors"
|
|
751
720
|
>
|
|
752
721
|
Create Agent
|
|
753
722
|
</button>
|
|
@@ -757,4 +726,4 @@ export const AgentPanel: React.FC<AgentPanelProps> = ({
|
|
|
757
726
|
)}
|
|
758
727
|
</div>
|
|
759
728
|
);
|
|
760
|
-
};
|
|
729
|
+
};
|