acdev 1.2.0 → 1.3.1

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "acdev",
3
- "version": "1.2.0",
3
+ "version": "1.3.1",
4
4
  "description": "Local CLI + web UI for running AI agents on GitHub issues via git worktrees",
5
5
  "type": "module",
6
6
  "bin": {
package/public/styles.css CHANGED
@@ -2,13 +2,13 @@
2
2
 
3
3
  :root,
4
4
  [data-theme="light"] {
5
- --bg: #f5f5f6;
6
- --surface: #ffffff;
7
- --surface-2: #f0f0f1;
5
+ --bg: #eef0f3;
6
+ --surface: var(--bg);
7
+ --surface-2: #e4e7ec;
8
8
  --text: #18181b;
9
9
  --text-muted: rgba(24, 24, 27, 0.55);
10
- --border: rgba(24, 24, 27, 0.1);
11
- --border-soft: rgba(24, 24, 27, 0.06);
10
+ --border: rgba(24, 24, 27, 0.07);
11
+ --border-soft: rgba(24, 24, 27, 0.045);
12
12
  --primary: #5b4fe8;
13
13
  --primary-hover: #4c3fd9;
14
14
  --primary-100: #ece9fd;
@@ -26,7 +26,12 @@
26
26
  --slate-800: #3a4149;
27
27
  --nav-badge-bg: #e9e9eb;
28
28
  --nav-badge-text: #55565c;
29
- --shadow-sm: 0 1px 2px rgba(20, 20, 30, 0.05), 0 1px 1px rgba(20, 20, 30, 0.04);
29
+ --neu-light: #ffffff;
30
+ --neu-dark: #c7cbd3;
31
+ --shadow-sm: 7px 7px 15px var(--neu-dark), -7px -7px 15px var(--neu-light);
32
+ --shadow-neu-sm: 4px 4px 9px var(--neu-dark), -4px -4px 9px var(--neu-light);
33
+ --shadow-neu-inset: inset 4px 4px 9px var(--neu-dark), inset -4px -4px 9px var(--neu-light);
34
+ --shadow-neu-inset-sm: inset 2px 2px 5px var(--neu-dark), inset -2px -2px 5px var(--neu-light);
30
35
  --diff-del-bg: oklch(0.93 0.05 25);
31
36
  --diff-del-fg: oklch(0.36 0.13 25);
32
37
  --diff-add-bg: oklch(0.93 0.05 145);
@@ -36,12 +41,12 @@
36
41
 
37
42
  [data-theme="dark"] {
38
43
  --bg: #141316;
39
- --surface: #1d1c20;
40
- --surface-2: #242327;
44
+ --surface: var(--bg);
45
+ --surface-2: #101013;
41
46
  --text: #f1f0f3;
42
47
  --text-muted: rgba(241, 240, 243, 0.55);
43
- --border: rgba(255, 255, 255, 0.1);
44
- --border-soft: rgba(255, 255, 255, 0.06);
48
+ --border: rgba(255, 255, 255, 0.07);
49
+ --border-soft: rgba(255, 255, 255, 0.045);
45
50
  --primary: #8c80f5;
46
51
  --primary-hover: #a196f7;
47
52
  --primary-100: #2a2560;
@@ -59,7 +64,12 @@
59
64
  --slate-800: #ccd1d6;
60
65
  --nav-badge-bg: #2c2b30;
61
66
  --nav-badge-text: #c7c6cc;
62
- --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.4);
67
+ --neu-light: rgba(255, 255, 255, 0.05);
68
+ --neu-dark: rgba(0, 0, 0, 0.6);
69
+ --shadow-sm: 7px 7px 15px var(--neu-dark), -7px -7px 15px var(--neu-light);
70
+ --shadow-neu-sm: 4px 4px 9px var(--neu-dark), -4px -4px 9px var(--neu-light);
71
+ --shadow-neu-inset: inset 4px 4px 9px var(--neu-dark), inset -4px -4px 9px var(--neu-light);
72
+ --shadow-neu-inset-sm: inset 2px 2px 5px var(--neu-dark), inset -2px -2px 5px var(--neu-light);
63
73
  --diff-del-bg: oklch(0.28 0.06 25);
64
74
  --diff-del-fg: oklch(0.82 0.08 25);
65
75
  --diff-add-bg: oklch(0.28 0.05 145);
@@ -173,23 +183,25 @@ a { color: var(--primary); text-underline-offset: 3px; }
173
183
  width: 100%;
174
184
  padding: 8px 10px;
175
185
  border: none;
176
- border-radius: 8px;
186
+ border-radius: 10px;
177
187
  background: transparent;
178
188
  color: var(--text);
179
189
  font-size: 14px;
180
190
  font-weight: 500;
181
191
  text-align: left;
182
- transition: background 0.12s ease, color 0.12s ease;
192
+ transition: background 0.12s ease, color 0.12s ease, box-shadow 0.12s ease;
183
193
  }
184
194
 
185
195
  .nav-item:hover {
186
196
  background: var(--surface-2);
197
+ box-shadow: var(--shadow-neu-sm);
187
198
  }
188
199
 
189
200
  .nav-item.active {
190
201
  background: var(--primary-100);
191
202
  color: var(--primary);
192
203
  font-weight: 600;
204
+ box-shadow: var(--shadow-neu-inset-sm);
193
205
  }
194
206
 
195
207
  .nav-icon {
@@ -333,16 +345,22 @@ a { color: var(--primary); text-underline-offset: 3px; }
333
345
  display: flex;
334
346
  align-items: center;
335
347
  justify-content: center;
336
- border: 1px solid var(--border);
348
+ border: none;
337
349
  background: var(--surface);
338
350
  color: var(--text);
339
351
  padding: 0;
352
+ box-shadow: var(--shadow-neu-sm);
353
+ transition: box-shadow 0.12s ease, background 0.12s ease;
340
354
  }
341
355
 
342
356
  .theme-toggle:hover {
343
357
  background: var(--surface-2);
344
358
  }
345
359
 
360
+ .theme-toggle:active {
361
+ box-shadow: var(--shadow-neu-inset-sm);
362
+ }
363
+
346
364
  .main-scroll {
347
365
  flex: 1;
348
366
  overflow: auto;
@@ -375,8 +393,8 @@ a { color: var(--primary); text-underline-offset: 3px; }
375
393
  /* —— Cards / surfaces —— */
376
394
  .card {
377
395
  background: var(--surface);
378
- border: 1px solid var(--border);
379
- border-radius: 12px;
396
+ border: none;
397
+ border-radius: 18px;
380
398
  padding: 16px;
381
399
  box-shadow: var(--shadow-sm);
382
400
  }
@@ -500,9 +518,9 @@ a { color: var(--primary); text-underline-offset: 3px; }
500
518
  line-height: 1.4;
501
519
  color: var(--text);
502
520
  background: var(--surface-2);
503
- border: 1px solid var(--border);
504
- border-radius: 5px;
505
- box-shadow: 0 1px 0 color-mix(in srgb, var(--text) 8%, transparent);
521
+ border: none;
522
+ border-radius: 6px;
523
+ box-shadow: var(--shadow-neu-sm);
506
524
  }
507
525
 
508
526
  .enqueue-info-banner {
@@ -511,8 +529,9 @@ a { color: var(--primary); text-underline-offset: 3px; }
511
529
  gap: 10px;
512
530
  padding: 11px 13px;
513
531
  background: var(--surface-2);
514
- border: 1px solid var(--border-soft);
515
- border-radius: 10px;
532
+ border: none;
533
+ border-radius: 12px;
534
+ box-shadow: var(--shadow-neu-inset-sm);
516
535
  }
517
536
 
518
537
  .enqueue-info-icon {
@@ -562,13 +581,14 @@ a { color: var(--primary); text-underline-offset: 3px; }
562
581
  text-align: left;
563
582
  cursor: pointer;
564
583
  background: var(--surface);
565
- border: 1px solid var(--border);
566
- border-radius: 10px;
567
- transition: border-color 0.12s ease, box-shadow 0.12s ease;
584
+ border: none;
585
+ border-radius: 12px;
586
+ box-shadow: var(--shadow-neu-sm);
587
+ transition: box-shadow 0.12s ease;
568
588
  }
569
589
 
570
590
  .agent-pill:hover {
571
- border-color: color-mix(in srgb, var(--text) 18%, var(--border));
591
+ box-shadow: var(--shadow-sm);
572
592
  }
573
593
 
574
594
  .agent-pill:focus-visible {
@@ -735,6 +755,7 @@ a { color: var(--primary); text-underline-offset: 3px; }
735
755
  border: none;
736
756
  border-bottom: 1px solid var(--border-soft);
737
757
  border-radius: 0;
758
+ box-shadow: none;
738
759
  }
739
760
 
740
761
  .agent-picker-search:focus-visible {
@@ -850,8 +871,8 @@ a { color: var(--primary); text-underline-offset: 3px; }
850
871
 
851
872
  .stat-card {
852
873
  background: var(--surface);
853
- border: 1px solid var(--border);
854
- border-radius: 12px;
874
+ border: none;
875
+ border-radius: 18px;
855
876
  padding: 16px;
856
877
  box-shadow: var(--shadow-sm);
857
878
  }
@@ -903,8 +924,8 @@ a { color: var(--primary); text-underline-offset: 3px; }
903
924
  align-items: center;
904
925
  gap: 16px;
905
926
  background: var(--surface);
906
- border: 1px solid var(--border);
907
- border-radius: 12px;
927
+ border: none;
928
+ border-radius: 18px;
908
929
  padding: 14px 16px;
909
930
  box-shadow: var(--shadow-sm);
910
931
  }
@@ -1097,12 +1118,13 @@ a { color: var(--primary); text-underline-offset: 3px; }
1097
1118
  }
1098
1119
 
1099
1120
  .empty-dashed {
1100
- border: 1px dashed var(--border);
1101
- border-radius: 12px;
1121
+ border: none;
1122
+ border-radius: 16px;
1102
1123
  padding: 28px;
1103
1124
  text-align: center;
1104
1125
  font-size: 13px;
1105
1126
  color: var(--text-muted);
1127
+ box-shadow: var(--shadow-neu-inset);
1106
1128
  }
1107
1129
 
1108
1130
  .empty-inline {
@@ -1121,12 +1143,13 @@ a { color: var(--primary); text-underline-offset: 3px; }
1121
1143
  font-size: 14px;
1122
1144
  color: var(--text);
1123
1145
  background: var(--surface);
1124
- border: 1px solid var(--border);
1125
- border-radius: 8px;
1126
- transition: border-color 0.12s ease;
1146
+ border: none;
1147
+ border-radius: 10px;
1148
+ box-shadow: var(--shadow-neu-inset-sm);
1149
+ transition: box-shadow 0.12s ease;
1127
1150
  }
1128
1151
 
1129
- .input:hover { border-color: color-mix(in srgb, var(--text) 20%, var(--border)); }
1152
+ .input:hover { box-shadow: var(--shadow-neu-inset); }
1130
1153
 
1131
1154
  .input:focus-visible {
1132
1155
  border-color: var(--primary);
@@ -1191,7 +1214,7 @@ a { color: var(--primary); text-underline-offset: 3px; }
1191
1214
  font-size: 14px;
1192
1215
  line-height: 1.2;
1193
1216
  border: none;
1194
- border-radius: 8px;
1217
+ border-radius: 10px;
1195
1218
  padding: 9px 16px;
1196
1219
  min-height: 36px;
1197
1220
  cursor: pointer;
@@ -1212,25 +1235,38 @@ a { color: var(--primary); text-underline-offset: 3px; }
1212
1235
  .btn-primary {
1213
1236
  background: var(--primary);
1214
1237
  color: var(--btn-on-primary);
1238
+ box-shadow: var(--shadow-neu-sm);
1239
+ transition: background 0.12s ease, box-shadow 0.12s ease;
1215
1240
  }
1216
1241
 
1217
1242
  .btn-primary:hover:not(:disabled) {
1218
1243
  background: var(--primary-hover);
1219
1244
  }
1220
1245
 
1246
+ .btn-primary:active:not(:disabled) {
1247
+ box-shadow: var(--shadow-neu-inset-sm);
1248
+ }
1249
+
1221
1250
  .btn-secondary {
1222
1251
  background: var(--surface);
1223
- border: 1px solid var(--border);
1252
+ border: none;
1224
1253
  color: var(--text);
1254
+ box-shadow: var(--shadow-neu-sm);
1255
+ transition: background 0.12s ease, box-shadow 0.12s ease;
1225
1256
  }
1226
1257
 
1227
1258
  .btn-secondary:hover:not(:disabled) {
1228
1259
  background: var(--surface-2);
1229
1260
  }
1230
1261
 
1262
+ .btn-secondary:active:not(:disabled) {
1263
+ box-shadow: var(--shadow-neu-inset-sm);
1264
+ }
1265
+
1231
1266
  .btn-warn {
1232
1267
  background: var(--amber-100);
1233
1268
  color: var(--amber-800);
1269
+ box-shadow: var(--shadow-neu-sm);
1234
1270
  }
1235
1271
 
1236
1272
  .btn-danger-text {
@@ -1275,8 +1311,8 @@ a { color: var(--primary); text-underline-offset: 3px; }
1275
1311
  /* —— Runs cards —— */
1276
1312
  .run-card {
1277
1313
  background: var(--surface);
1278
- border: 1px solid var(--border);
1279
- border-radius: 12px;
1314
+ border: none;
1315
+ border-radius: 18px;
1280
1316
  padding: 18px 20px;
1281
1317
  box-shadow: var(--shadow-sm);
1282
1318
  display: flex;
@@ -1287,15 +1323,15 @@ a { color: var(--primary); text-underline-offset: 3px; }
1287
1323
  width: 100%;
1288
1324
  color: inherit;
1289
1325
  font: inherit;
1326
+ transition: box-shadow 0.12s ease;
1290
1327
  }
1291
1328
 
1292
1329
  .run-card:hover {
1293
- border-color: color-mix(in srgb, var(--primary) 35%, var(--border));
1330
+ box-shadow: 0 0 0 1px color-mix(in srgb, var(--primary) 35%, transparent), var(--shadow-sm);
1294
1331
  }
1295
1332
 
1296
1333
  .run-card.selected {
1297
- border-color: var(--primary);
1298
- box-shadow: 0 0 0 1px var(--primary), var(--shadow-sm);
1334
+ box-shadow: var(--shadow-neu-inset), 0 0 0 2px var(--primary);
1299
1335
  }
1300
1336
 
1301
1337
  .run-card-top {
@@ -1351,10 +1387,14 @@ a { color: var(--primary); text-underline-offset: 3px; }
1351
1387
  }
1352
1388
 
1353
1389
  .log-pane-wrap {
1354
- position: relative;
1390
+ display: flex;
1391
+ flex-direction: column;
1392
+ align-items: flex-end;
1393
+ gap: 6px;
1355
1394
  }
1356
1395
 
1357
1396
  .log-pane {
1397
+ width: 100%;
1358
1398
  background: var(--surface-2);
1359
1399
  border-radius: 8px;
1360
1400
  padding: 8px 10px;
@@ -1365,12 +1405,8 @@ a { color: var(--primary); text-underline-offset: 3px; }
1365
1405
  }
1366
1406
 
1367
1407
  .log-jump-latest {
1368
- position: absolute;
1369
- right: 12px;
1370
- bottom: 10px;
1371
- z-index: 1;
1372
1408
  background: var(--surface);
1373
- border: 1px solid var(--border);
1409
+ border: none;
1374
1410
  color: var(--text);
1375
1411
  border-radius: 8px;
1376
1412
  padding: 6px 12px;
@@ -1492,9 +1528,10 @@ a { color: var(--primary); text-underline-offset: 3px; }
1492
1528
  .log-raw-pre {
1493
1529
  margin: 6px 0 4px;
1494
1530
  padding: 10px 12px;
1495
- background: var(--bg);
1496
- border: 1px solid var(--border);
1497
- border-radius: 6px;
1531
+ background: var(--surface-2);
1532
+ border: none;
1533
+ border-radius: 8px;
1534
+ box-shadow: var(--shadow-neu-inset-sm);
1498
1535
  font-family: "JetBrains Mono", ui-monospace, monospace;
1499
1536
  font-size: 11px;
1500
1537
  line-height: 1.5;
@@ -1524,7 +1561,7 @@ a { color: var(--primary); text-underline-offset: 3px; }
1524
1561
  display: inline-flex;
1525
1562
  align-items: center;
1526
1563
  gap: 6px;
1527
- border: 1px solid var(--border);
1564
+ border: none;
1528
1565
  background: var(--surface);
1529
1566
  color: var(--text-muted);
1530
1567
  font-family: inherit;
@@ -1533,7 +1570,8 @@ a { color: var(--primary); text-underline-offset: 3px; }
1533
1570
  padding: 6px 11px;
1534
1571
  border-radius: 999px;
1535
1572
  cursor: pointer;
1536
- transition: background 0.12s ease, border-color 0.12s ease, color 0.12s ease;
1573
+ box-shadow: var(--shadow-neu-sm);
1574
+ transition: background 0.12s ease, box-shadow 0.12s ease, color 0.12s ease;
1537
1575
  }
1538
1576
 
1539
1577
  .filter-chip:hover {
@@ -1543,8 +1581,8 @@ a { color: var(--primary); text-underline-offset: 3px; }
1543
1581
 
1544
1582
  .filter-chip[aria-selected="true"] {
1545
1583
  background: var(--primary-100);
1546
- border-color: transparent;
1547
1584
  color: var(--primary);
1585
+ box-shadow: var(--shadow-neu-inset-sm);
1548
1586
  }
1549
1587
 
1550
1588
  .filter-chip-count {
@@ -1595,7 +1633,7 @@ a { color: var(--primary); text-underline-offset: 3px; }
1595
1633
 
1596
1634
  .review-pick:hover { background: var(--surface-2); }
1597
1635
 
1598
- .review-pick.selected { background: var(--surface-2); }
1636
+ .review-pick.selected { background: var(--surface-2); box-shadow: var(--shadow-neu-inset-sm); }
1599
1637
 
1600
1638
  .review-pick-title {
1601
1639
  font-size: 13px;
@@ -1641,9 +1679,10 @@ a { color: var(--primary); text-underline-offset: 3px; }
1641
1679
 
1642
1680
  .pr-status-note {
1643
1681
  padding: 10px 12px;
1644
- border: 1px solid var(--border-soft);
1645
- border-radius: 10px;
1682
+ border: none;
1683
+ border-radius: 12px;
1646
1684
  background: var(--surface-2);
1685
+ box-shadow: var(--shadow-neu-inset-sm);
1647
1686
  }
1648
1687
 
1649
1688
  .markdown-view {
@@ -1747,14 +1786,15 @@ a { color: var(--primary); text-underline-offset: 3px; }
1747
1786
  align-items: flex-start;
1748
1787
  gap: 10px;
1749
1788
  padding: 8px 10px;
1750
- border: 1px solid var(--border);
1751
- border-radius: 8px;
1789
+ border: none;
1790
+ border-radius: 10px;
1752
1791
  background: var(--surface-2);
1753
1792
  font-size: 12.5px;
1754
1793
  font-family: "JetBrains Mono", ui-monospace, monospace;
1755
1794
  cursor: pointer;
1756
1795
  user-select: none;
1757
1796
  word-break: break-all;
1797
+ box-shadow: var(--shadow-neu-inset-sm);
1758
1798
  }
1759
1799
 
1760
1800
  .review-file-check:has(input:not(:checked)) {
@@ -1762,7 +1802,7 @@ a { color: var(--primary); text-underline-offset: 3px; }
1762
1802
  }
1763
1803
 
1764
1804
  .review-file-check:has(input:checked) {
1765
- border-color: color-mix(in srgb, var(--primary) 40%, var(--border));
1805
+ box-shadow: var(--shadow-neu-inset-sm), 0 0 0 1.5px var(--primary);
1766
1806
  }
1767
1807
 
1768
1808
  .review-file-check input {
@@ -1799,14 +1839,15 @@ a { color: var(--primary); text-underline-offset: 3px; }
1799
1839
  }
1800
1840
 
1801
1841
  .diff-viewer {
1802
- border: 1px solid var(--border);
1803
- border-radius: 10px;
1842
+ border: none;
1843
+ border-radius: 14px;
1804
1844
  font-family: "JetBrains Mono", ui-monospace, monospace;
1805
1845
  font-size: 12.5px;
1806
1846
  overflow: hidden;
1807
1847
  max-height: min(48vh, 520px);
1808
1848
  overflow-y: auto;
1809
1849
  background: var(--surface);
1850
+ box-shadow: var(--shadow-sm);
1810
1851
  }
1811
1852
 
1812
1853
  .diff-section.diff-fullscreen {
@@ -2005,12 +2046,13 @@ body.diff-fs-open {
2005
2046
  }
2006
2047
 
2007
2048
  .diff-pending-chip {
2008
- border: 1px solid color-mix(in srgb, var(--primary) 30%, var(--border));
2049
+ border: 1px solid color-mix(in srgb, var(--primary) 30%, transparent);
2009
2050
  background: var(--surface);
2010
- border-radius: 8px;
2051
+ border-radius: 10px;
2011
2052
  padding: 8px 10px;
2012
2053
  font-family: "DM Sans", system-ui, sans-serif;
2013
2054
  font-size: 12px;
2055
+ box-shadow: var(--shadow-neu-sm);
2014
2056
  }
2015
2057
 
2016
2058
  .diff-pending-chip-path {
@@ -2052,10 +2094,11 @@ body.diff-fs-open {
2052
2094
  gap: 10px;
2053
2095
  align-items: flex-start;
2054
2096
  justify-content: space-between;
2055
- border: 1px solid var(--border);
2056
- border-radius: 8px;
2097
+ border: none;
2098
+ border-radius: 10px;
2057
2099
  padding: 8px 10px;
2058
2100
  background: var(--surface-2);
2101
+ box-shadow: var(--shadow-neu-inset-sm);
2059
2102
  }
2060
2103
 
2061
2104
  .review-pending-item-main {
@@ -2134,8 +2177,8 @@ body.diff-fs-open {
2134
2177
  /* —— Alerts —— */
2135
2178
  .alert-card {
2136
2179
  background: var(--surface);
2137
- border: 1px solid var(--border);
2138
- border-radius: 12px;
2180
+ border: none;
2181
+ border-radius: 18px;
2139
2182
  padding: 16px 18px;
2140
2183
  box-shadow: var(--shadow-sm);
2141
2184
  display: flex;
@@ -2184,8 +2227,9 @@ body.diff-fs-open {
2184
2227
  padding: 10px 12px;
2185
2228
  background: var(--accent-100);
2186
2229
  color: var(--accent-800);
2187
- border-radius: 8px;
2230
+ border-radius: 10px;
2188
2231
  font-size: 13px;
2232
+ box-shadow: var(--shadow-neu-sm);
2189
2233
  }
2190
2234
 
2191
2235
  .pr-banner {
@@ -2197,8 +2241,9 @@ body.diff-fs-open {
2197
2241
  padding: 10px 12px;
2198
2242
  background: var(--green-100);
2199
2243
  color: var(--green-800);
2200
- border-radius: 8px;
2244
+ border-radius: 10px;
2201
2245
  font-size: 13px;
2246
+ box-shadow: var(--shadow-neu-sm);
2202
2247
  }
2203
2248
 
2204
2249
  .permission-card {
@@ -2208,8 +2253,9 @@ body.diff-fs-open {
2208
2253
  padding: 12px 14px;
2209
2254
  background: var(--amber-100);
2210
2255
  color: var(--amber-800);
2211
- border-radius: 8px;
2256
+ border-radius: 10px;
2212
2257
  font-size: 13px;
2258
+ box-shadow: var(--shadow-neu-sm);
2213
2259
  }
2214
2260
 
2215
2261
  .permission-card-header {
@@ -2237,14 +2283,15 @@ body.diff-fs-open {
2237
2283
  padding: 8px 10px;
2238
2284
  background: var(--bg);
2239
2285
  color: var(--text);
2240
- border: 1px solid var(--border-soft);
2241
- border-radius: 6px;
2286
+ border: none;
2287
+ border-radius: 8px;
2242
2288
  font-family: "JetBrains Mono", ui-monospace, monospace;
2243
2289
  font-size: 12px;
2244
2290
  white-space: pre-wrap;
2245
2291
  word-break: break-word;
2246
2292
  max-height: 160px;
2247
2293
  overflow: auto;
2294
+ box-shadow: var(--shadow-neu-inset-sm);
2248
2295
  }
2249
2296
 
2250
2297
  /* —— Scrollbars —— */
@@ -2326,16 +2373,17 @@ body.diff-fs-open {
2326
2373
  }
2327
2374
 
2328
2375
  .settings-tab {
2329
- border: 1px solid var(--border);
2376
+ border: none;
2330
2377
  background: var(--surface);
2331
2378
  color: var(--text-muted);
2332
2379
  font-family: inherit;
2333
2380
  font-size: 12px;
2334
2381
  font-weight: 600;
2335
2382
  padding: 7px 12px;
2336
- border-radius: 8px;
2383
+ border-radius: 10px;
2337
2384
  cursor: pointer;
2338
- transition: background 0.12s ease, border-color 0.12s ease, color 0.12s ease;
2385
+ box-shadow: var(--shadow-neu-sm);
2386
+ transition: background 0.12s ease, box-shadow 0.12s ease, color 0.12s ease;
2339
2387
  }
2340
2388
 
2341
2389
  .settings-tab:hover {
@@ -2345,8 +2393,8 @@ body.diff-fs-open {
2345
2393
 
2346
2394
  .settings-tab[aria-selected="true"] {
2347
2395
  background: var(--primary-100);
2348
- border-color: transparent;
2349
2396
  color: var(--primary);
2397
+ box-shadow: var(--shadow-neu-inset-sm);
2350
2398
  }
2351
2399
 
2352
2400
  .settings-panel {
@@ -2477,6 +2525,7 @@ body.diff-fs-open {
2477
2525
  border: none;
2478
2526
  border-bottom: 1px solid var(--border);
2479
2527
  border-radius: 0;
2528
+ box-shadow: none;
2480
2529
  }
2481
2530
 
2482
2531
  .model-picker-search:focus-visible {
@@ -2562,19 +2611,20 @@ body.diff-fs-open {
2562
2611
  align-items: center;
2563
2612
  gap: 8px;
2564
2613
  padding: 8px 12px;
2565
- border: 1px solid var(--border);
2566
- border-radius: 8px;
2614
+ border: none;
2615
+ border-radius: 10px;
2567
2616
  background: var(--surface-2);
2568
2617
  font-size: 13px;
2569
2618
  font-weight: 500;
2570
2619
  cursor: pointer;
2571
2620
  user-select: none;
2621
+ box-shadow: var(--shadow-neu-sm);
2572
2622
  }
2573
2623
 
2574
2624
  .tool-check:has(input:checked) {
2575
- border-color: color-mix(in srgb, var(--primary) 45%, var(--border));
2576
2625
  background: var(--primary-100);
2577
2626
  color: var(--primary);
2627
+ box-shadow: var(--shadow-neu-inset-sm);
2578
2628
  }
2579
2629
 
2580
2630
  .tool-check input {
@@ -2609,9 +2659,10 @@ body.diff-fs-open {
2609
2659
  gap: 4px;
2610
2660
  max-width: 360px;
2611
2661
  padding: 3px;
2612
- border: 1px solid var(--border);
2662
+ border: none;
2613
2663
  border-radius: 999px;
2614
2664
  background: var(--surface-2);
2665
+ box-shadow: var(--shadow-neu-inset-sm);
2615
2666
  }
2616
2667
 
2617
2668
  .source-toggle--compact {
@@ -2648,8 +2699,8 @@ body.diff-fs-open {
2648
2699
  .source-btn.active {
2649
2700
  background: var(--surface);
2650
2701
  color: var(--text);
2651
- border-color: var(--border-soft);
2652
- box-shadow: var(--shadow-sm);
2702
+ border-color: transparent;
2703
+ box-shadow: var(--shadow-neu-sm);
2653
2704
  }
2654
2705
 
2655
2706
  /* Agent permission mode: selected button uses the theme's primary color. */
@@ -2657,13 +2708,14 @@ body.diff-fs-open {
2657
2708
  #overview-permission-mode .source-btn.active {
2658
2709
  background: var(--primary);
2659
2710
  color: var(--btn-on-primary);
2660
- border-color: var(--primary);
2711
+ border-color: transparent;
2712
+ box-shadow: var(--shadow-neu-sm);
2661
2713
  }
2662
2714
 
2663
2715
  #settings-permission-mode .source-btn.active:hover:not(:disabled),
2664
2716
  #overview-permission-mode .source-btn.active:hover:not(:disabled) {
2665
2717
  background: var(--primary-hover);
2666
- border-color: var(--primary-hover);
2718
+ border-color: transparent;
2667
2719
  }
2668
2720
 
2669
2721
  .source-btn:disabled {
@@ -2796,7 +2848,7 @@ body.diff-fs-open {
2796
2848
  border-radius: 6px;
2797
2849
  background: var(--surface-2);
2798
2850
  color: var(--text-muted);
2799
- border: 1px solid var(--border);
2851
+ border: none;
2800
2852
  white-space: nowrap;
2801
2853
  }
2802
2854
 
package/src/agent.js CHANGED
@@ -468,7 +468,12 @@ async function runAgentQuery({
468
468
  prompt,
469
469
  options: {
470
470
  cwd: worktreePath,
471
- allowedTools: config.allowedTools,
471
+ // `allowedTools` auto-approves those tools without ever calling
472
+ // `canUseTool` (SDK semantics) — fine for full_auto (no gate), but
473
+ // it would silently bypass manual/auto_edit gating. When a gate is
474
+ // active, restrict availability via `tools` instead so every call
475
+ // actually reaches `canUseTool`.
476
+ ...(canUseTool ? { tools: config.allowedTools } : { allowedTools: config.allowedTools }),
472
477
  disallowedTools: DISALLOWED_AGENT_TOOLS,
473
478
  permissionMode: canUseTool ? 'default' : 'acceptEdits',
474
479
  maxTurns: config.maxAgentTurns,