palmier 0.6.0 → 0.6.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.
Files changed (110) hide show
  1. package/.github/workflows/publish.yml +15 -2
  2. package/CLAUDE.md +2 -2
  3. package/DISCLAIMER.md +36 -0
  4. package/README.md +76 -87
  5. package/dist/agents/agent-instructions.md +1 -1
  6. package/dist/agents/agent.d.ts +2 -0
  7. package/dist/agents/agent.js +21 -0
  8. package/dist/agents/aider.d.ts +9 -0
  9. package/dist/agents/aider.js +32 -0
  10. package/dist/agents/cursor.d.ts +9 -0
  11. package/dist/agents/cursor.js +35 -0
  12. package/dist/agents/deepagents.d.ts +9 -0
  13. package/dist/agents/deepagents.js +35 -0
  14. package/dist/agents/droid.d.ts +9 -0
  15. package/dist/agents/droid.js +32 -0
  16. package/dist/agents/goose.d.ts +9 -0
  17. package/dist/agents/goose.js +32 -0
  18. package/dist/agents/opencode.d.ts +9 -0
  19. package/dist/agents/opencode.js +35 -0
  20. package/dist/agents/openhands.d.ts +9 -0
  21. package/dist/agents/openhands.js +35 -0
  22. package/dist/commands/pair.d.ts +1 -1
  23. package/dist/commands/pair.js +1 -1
  24. package/dist/commands/run.js +2 -2
  25. package/dist/pwa/apple-touch-icon.png +0 -0
  26. package/dist/pwa/assets/index-ByhOhTz1.js +118 -0
  27. package/dist/pwa/assets/index-_AmC1Rkn.css +1 -0
  28. package/dist/pwa/assets/plus-jakarta-sans-latin-ext-wght-normal-DmpS2jIq.woff2 +0 -0
  29. package/dist/pwa/assets/plus-jakarta-sans-latin-wght-normal-eXO_dkmS.woff2 +0 -0
  30. package/dist/pwa/assets/plus-jakarta-sans-vietnamese-wght-normal-qRpaaN48.woff2 +0 -0
  31. package/dist/pwa/favicon.ico +0 -0
  32. package/dist/pwa/index.html +17 -0
  33. package/dist/pwa/manifest.webmanifest +1 -0
  34. package/dist/pwa/pwa-192x192.png +0 -0
  35. package/dist/pwa/pwa-512x512.png +0 -0
  36. package/dist/pwa/registerSW.js +1 -0
  37. package/dist/pwa/service-worker.js +2 -0
  38. package/dist/rpc-handler.d.ts +4 -0
  39. package/dist/rpc-handler.js +5 -4
  40. package/dist/transports/http-transport.js +29 -41
  41. package/package.json +2 -2
  42. package/palmier-server/.github/workflows/ci.yml +21 -0
  43. package/palmier-server/.github/workflows/deploy.yml +38 -0
  44. package/palmier-server/CLAUDE.md +13 -0
  45. package/palmier-server/PRODUCTION.md +355 -0
  46. package/palmier-server/README.md +187 -0
  47. package/palmier-server/nats.conf +15 -0
  48. package/palmier-server/package.json +8 -0
  49. package/palmier-server/pnpm-lock.yaml +6597 -0
  50. package/palmier-server/pnpm-workspace.yaml +3 -0
  51. package/palmier-server/pwa/index.html +16 -0
  52. package/palmier-server/pwa/logo/logo-prompt.md +28 -0
  53. package/palmier-server/pwa/logo/logo_20260330.png +0 -0
  54. package/palmier-server/pwa/package.json +30 -0
  55. package/palmier-server/pwa/public/apple-touch-icon.png +0 -0
  56. package/palmier-server/pwa/public/favicon.ico +0 -0
  57. package/palmier-server/pwa/public/pwa-192x192.png +0 -0
  58. package/palmier-server/pwa/public/pwa-512x512.png +0 -0
  59. package/palmier-server/pwa/src/App.css +2387 -0
  60. package/palmier-server/pwa/src/App.tsx +21 -0
  61. package/palmier-server/pwa/src/agentLabels.ts +11 -0
  62. package/palmier-server/pwa/src/api.ts +61 -0
  63. package/palmier-server/pwa/src/components/HostMenu.tsx +289 -0
  64. package/palmier-server/pwa/src/components/PlanDialog.tsx +41 -0
  65. package/palmier-server/pwa/src/components/RunDetailView.tsx +293 -0
  66. package/palmier-server/pwa/src/components/RunsView.tsx +254 -0
  67. package/palmier-server/pwa/src/components/TabBar.tsx +31 -0
  68. package/palmier-server/pwa/src/components/TaskCard.tsx +213 -0
  69. package/palmier-server/pwa/src/components/TaskForm.tsx +580 -0
  70. package/palmier-server/pwa/src/components/TaskListView.tsx +415 -0
  71. package/palmier-server/pwa/src/constants.ts +2 -0
  72. package/palmier-server/pwa/src/contexts/HostConnectionContext.tsx +313 -0
  73. package/palmier-server/pwa/src/contexts/HostStoreContext.tsx +135 -0
  74. package/palmier-server/pwa/src/formatTime.ts +10 -0
  75. package/palmier-server/pwa/src/hooks/useBackClose.ts +75 -0
  76. package/palmier-server/pwa/src/hooks/useMediaQuery.ts +17 -0
  77. package/palmier-server/pwa/src/hooks/usePushSubscription.ts +75 -0
  78. package/palmier-server/pwa/src/main.tsx +14 -0
  79. package/palmier-server/pwa/src/pages/Dashboard.tsx +223 -0
  80. package/palmier-server/pwa/src/pages/PairHost.tsx +178 -0
  81. package/palmier-server/pwa/src/service-worker.ts +139 -0
  82. package/palmier-server/pwa/src/types.ts +79 -0
  83. package/palmier-server/pwa/src/vite-env.d.ts +11 -0
  84. package/palmier-server/pwa/tsconfig.json +21 -0
  85. package/palmier-server/pwa/tsconfig.node.json +19 -0
  86. package/palmier-server/pwa/vite.config.ts +47 -0
  87. package/palmier-server/server/.env.example +16 -0
  88. package/palmier-server/server/package.json +33 -0
  89. package/palmier-server/server/src/db.ts +34 -0
  90. package/palmier-server/server/src/index.ts +219 -0
  91. package/palmier-server/server/src/nats.ts +25 -0
  92. package/palmier-server/server/src/push.ts +68 -0
  93. package/palmier-server/server/src/routes/hosts.ts +45 -0
  94. package/palmier-server/server/src/routes/push.ts +100 -0
  95. package/palmier-server/server/tsconfig.json +20 -0
  96. package/palmier-server/spec.md +415 -0
  97. package/src/agents/agent-instructions.md +1 -1
  98. package/src/agents/agent.ts +23 -0
  99. package/src/agents/aider.ts +37 -0
  100. package/src/agents/cursor.ts +38 -0
  101. package/src/agents/deepagents.ts +38 -0
  102. package/src/agents/droid.ts +37 -0
  103. package/src/agents/goose.ts +35 -0
  104. package/src/agents/opencode.ts +38 -0
  105. package/src/agents/openhands.ts +38 -0
  106. package/src/commands/pair.ts +1 -1
  107. package/src/commands/run.ts +2 -2
  108. package/src/rpc-handler.ts +5 -4
  109. package/src/transports/http-transport.ts +31 -43
  110. package/test/result-state.test.ts +110 -0
@@ -0,0 +1,2387 @@
1
+ /* ===== CSS Variables / Theming ===== */
2
+ :root {
3
+ --color-bg: #F7F8FC;
4
+ --color-surface: #ffffff;
5
+ --color-primary: #2E5CE5;
6
+ --color-primary-hover: #1D4ED8;
7
+ --color-primary-subtle: #EEF2FF;
8
+ --color-secondary: #64748B;
9
+ --color-secondary-hover: #475569;
10
+ --color-text: #1A1F36;
11
+ --color-text-secondary: #697386;
12
+ --color-muted: #94A3B8;
13
+ --color-success: #22C55E;
14
+ --color-error: #EF4444;
15
+ --color-error-bg: #FEF2F2;
16
+ --color-warning: #F59E0B;
17
+ --color-border: #E2E8F0;
18
+ --color-border-subtle: #F1F5F9;
19
+ --color-hover: rgba(15, 23, 42, 0.06);
20
+ --color-overlay: rgba(15, 23, 42, 0.5);
21
+ --color-input-focus: rgba(46, 92, 229, 0.15);
22
+
23
+ --shadow-xs: 0 1px 2px rgba(15, 23, 42, 0.05);
24
+ --shadow-sm: 0 1px 3px rgba(15, 23, 42, 0.06), 0 1px 2px rgba(15, 23, 42, 0.04);
25
+ --shadow-md: 0 4px 6px -1px rgba(15, 23, 42, 0.07), 0 2px 4px -2px rgba(15, 23, 42, 0.05);
26
+ --shadow-lg: 0 10px 15px -3px rgba(15, 23, 42, 0.08), 0 4px 6px -4px rgba(15, 23, 42, 0.04);
27
+ --shadow-xl: 0 20px 25px -5px rgba(15, 23, 42, 0.1), 0 8px 10px -6px rgba(15, 23, 42, 0.06);
28
+
29
+ --radius-sm: 8px;
30
+ --radius-md: 12px;
31
+ --radius-lg: 16px;
32
+ --radius-full: 50%;
33
+
34
+ --font-sans: "Plus Jakarta Sans Variable", "Plus Jakarta Sans", -apple-system,
35
+ BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
36
+
37
+ --space-xs: 4px;
38
+ --space-sm: 8px;
39
+ --space-md: 16px;
40
+ --space-lg: 24px;
41
+ --space-xl: 32px;
42
+ --space-2xl: 48px;
43
+
44
+ --transition-fast: 0.12s ease;
45
+ --transition-base: 0.2s ease;
46
+ }
47
+
48
+ /* ===== Reset ===== */
49
+ *,
50
+ *::before,
51
+ *::after {
52
+ box-sizing: border-box;
53
+ margin: 0;
54
+ padding: 0;
55
+ }
56
+
57
+ html {
58
+ font-size: 16px;
59
+ -webkit-text-size-adjust: 100%;
60
+ }
61
+
62
+ body {
63
+ font-family: var(--font-sans);
64
+ background: var(--color-bg);
65
+ color: var(--color-text);
66
+ line-height: 1.6;
67
+ min-height: 100dvh;
68
+ -webkit-font-smoothing: antialiased;
69
+ -moz-osx-font-smoothing: grayscale;
70
+ }
71
+
72
+ #root {
73
+ min-height: 100dvh;
74
+ }
75
+
76
+ /* ===== Buttons ===== */
77
+ .btn {
78
+ display: inline-flex;
79
+ align-items: center;
80
+ justify-content: center;
81
+ gap: 6px;
82
+ border: 1px solid transparent;
83
+ border-radius: var(--radius-sm);
84
+ font-family: var(--font-sans);
85
+ font-size: 0.875rem;
86
+ font-weight: 600;
87
+ padding: 10px 18px;
88
+ cursor: pointer;
89
+ transition: all var(--transition-base);
90
+ -webkit-tap-highlight-color: transparent;
91
+ letter-spacing: -0.01em;
92
+ line-height: 1.25;
93
+ }
94
+
95
+ .btn:disabled {
96
+ opacity: 0.45;
97
+ cursor: not-allowed;
98
+ }
99
+
100
+ .btn:focus-visible {
101
+ outline: 2px solid var(--color-primary);
102
+ outline-offset: 2px;
103
+ }
104
+
105
+ .btn-primary {
106
+ background: var(--color-primary);
107
+ color: #fff;
108
+ box-shadow: 0 1px 2px rgba(46, 92, 229, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.1);
109
+ }
110
+ .btn-primary:hover:not(:disabled) {
111
+ background: var(--color-primary-hover);
112
+ box-shadow: 0 2px 4px rgba(46, 92, 229, 0.35), inset 0 1px 0 rgba(255, 255, 255, 0.1);
113
+ transform: translateY(-0.5px);
114
+ }
115
+ .btn-primary:active:not(:disabled) {
116
+ transform: translateY(0);
117
+ box-shadow: 0 1px 2px rgba(46, 92, 229, 0.3);
118
+ }
119
+
120
+ .btn-secondary {
121
+ background: var(--color-surface);
122
+ color: var(--color-text);
123
+ border-color: var(--color-border);
124
+ box-shadow: var(--shadow-xs);
125
+ }
126
+ .btn-secondary:hover:not(:disabled) {
127
+ background: var(--color-border-subtle);
128
+ border-color: #CBD5E1;
129
+ }
130
+
131
+ .btn-danger {
132
+ background: var(--color-error);
133
+ color: #fff;
134
+ box-shadow: 0 1px 2px rgba(239, 68, 68, 0.3);
135
+ }
136
+ .btn-danger:hover:not(:disabled) {
137
+ background: #DC2626;
138
+ box-shadow: 0 2px 4px rgba(239, 68, 68, 0.35);
139
+ }
140
+
141
+ .btn-link {
142
+ background: none;
143
+ border: none;
144
+ color: var(--color-primary);
145
+ padding: 0;
146
+ font-weight: 500;
147
+ box-shadow: none;
148
+ }
149
+ .btn-link:hover:not(:disabled) {
150
+ text-decoration: underline;
151
+ background: none;
152
+ box-shadow: none;
153
+ }
154
+
155
+ .btn-spinner {
156
+ display: inline-block;
157
+ width: 14px;
158
+ height: 14px;
159
+ border: 2px solid rgba(255, 255, 255, 0.3);
160
+ border-top-color: #fff;
161
+ border-radius: 50%;
162
+ animation: spin 0.6s linear infinite;
163
+ vertical-align: middle;
164
+ margin-right: 6px;
165
+ }
166
+
167
+ .btn-sm {
168
+ font-size: 0.8125rem;
169
+ padding: 6px 12px;
170
+ border-radius: 6px;
171
+ }
172
+
173
+
174
+ .btn-full {
175
+ width: 100%;
176
+ }
177
+
178
+ /* ===== Forms ===== */
179
+ .form-label {
180
+ display: flex;
181
+ flex-direction: column;
182
+ gap: 6px;
183
+ font-size: 0.8125rem;
184
+ font-weight: 600;
185
+ color: var(--color-text);
186
+ margin-bottom: var(--space-md);
187
+ letter-spacing: -0.01em;
188
+ }
189
+
190
+ .form-input,
191
+ .form-textarea,
192
+ .form-select {
193
+ font-family: var(--font-sans);
194
+ font-size: 0.9375rem;
195
+ padding: 10px 12px;
196
+ border: 1.5px solid var(--color-border);
197
+ border-radius: var(--radius-sm);
198
+ background: var(--color-surface);
199
+ color: var(--color-text);
200
+ transition: border-color var(--transition-fast), box-shadow var(--transition-fast);
201
+ width: 100%;
202
+ }
203
+
204
+ .form-input:focus,
205
+ .form-textarea:focus,
206
+ .form-select:focus {
207
+ outline: none;
208
+ border-color: var(--color-primary);
209
+ box-shadow: 0 0 0 3px var(--color-input-focus);
210
+ }
211
+
212
+ .form-input-mono {
213
+ font-family: "SF Mono", "Fira Code", "Cascadia Code", monospace;
214
+ font-size: 0.8125rem;
215
+ }
216
+
217
+ .agent-picker-label {
218
+ font-size: 0.8125rem;
219
+ color: var(--color-text-secondary);
220
+ white-space: nowrap;
221
+ }
222
+
223
+ .form-input::placeholder,
224
+ .form-textarea::placeholder {
225
+ color: var(--color-muted);
226
+ }
227
+
228
+ .form-textarea {
229
+ resize: vertical;
230
+ min-height: 80px;
231
+ line-height: 1.5;
232
+ }
233
+
234
+ .form-error {
235
+ background: var(--color-error-bg);
236
+ color: var(--color-error);
237
+ border: 1px solid #FECACA;
238
+ border-radius: var(--radius-sm);
239
+ padding: var(--space-sm) var(--space-md);
240
+ font-size: 0.8125rem;
241
+ font-weight: 500;
242
+ margin-bottom: var(--space-md);
243
+ }
244
+
245
+ .form-warning {
246
+ background: #FEF3C7;
247
+ color: #92400E;
248
+ border: 1px solid #FDE68A;
249
+ border-radius: var(--radius-sm);
250
+ padding: var(--space-sm) var(--space-md);
251
+ font-size: 0.8125rem;
252
+ font-weight: 500;
253
+ margin-bottom: var(--space-md);
254
+ }
255
+
256
+ /* ===== Auth Pages ===== */
257
+ /* ===== Dashboard ===== */
258
+ .dashboard {
259
+ min-height: 100dvh;
260
+ display: flex;
261
+ flex-direction: column;
262
+ padding-bottom: 0;
263
+ }
264
+
265
+
266
+ .dashboard-main {
267
+ flex: 1;
268
+ padding: var(--space-md);
269
+ width: 100%;
270
+ }
271
+
272
+ /* ===== Status Dot ===== */
273
+ .status-dot {
274
+ display: inline-block;
275
+ width: 8px;
276
+ height: 8px;
277
+ border-radius: var(--radius-full);
278
+ flex-shrink: 0;
279
+ box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.8);
280
+ }
281
+
282
+ .status-spinner {
283
+ display: inline-flex;
284
+ align-items: center;
285
+ gap: 2px;
286
+ flex-shrink: 0;
287
+ height: 8px;
288
+ }
289
+
290
+ .status-spinner::before,
291
+ .status-spinner > span,
292
+ .status-spinner::after {
293
+ content: "";
294
+ display: block;
295
+ width: 3px;
296
+ height: 3px;
297
+ border-radius: var(--radius-full);
298
+ background-color: var(--color-success);
299
+ animation: marching-dot 1.2s ease-in-out infinite;
300
+ }
301
+
302
+ .status-spinner::before {
303
+ animation-delay: 0s;
304
+ }
305
+
306
+ .status-spinner > span {
307
+ animation-delay: 0.2s;
308
+ }
309
+
310
+ .status-spinner::after {
311
+ animation-delay: 0.4s;
312
+ }
313
+
314
+ @keyframes marching-dot {
315
+ 0%, 60%, 100% { opacity: 0.25; transform: scale(0.8); }
316
+ 30% { opacity: 1; transform: scale(1); }
317
+ }
318
+
319
+ /* ===== Pair Host Page ===== */
320
+ .pair-page {
321
+ display: flex;
322
+ align-items: flex-start;
323
+ justify-content: center;
324
+ min-height: 100dvh;
325
+ padding: var(--space-xl) var(--space-md);
326
+ background: var(--color-bg);
327
+ }
328
+
329
+ .pair-card {
330
+ width: 100%;
331
+ max-width: 420px;
332
+ display: flex;
333
+ flex-direction: column;
334
+ gap: var(--space-lg);
335
+ }
336
+
337
+ .pair-header {
338
+ text-align: center;
339
+ }
340
+
341
+ .pair-title {
342
+ font-size: 1.5rem;
343
+ font-weight: 700;
344
+ color: var(--color-text);
345
+ letter-spacing: -0.02em;
346
+ }
347
+
348
+ .pair-subtitle {
349
+ margin-top: var(--space-xs);
350
+ font-size: 0.875rem;
351
+ color: var(--color-text-secondary);
352
+ }
353
+
354
+ .pair-instructions {
355
+ background: var(--color-surface);
356
+ border: 1px solid var(--color-border);
357
+ border-radius: var(--radius-md);
358
+ padding: var(--space-md);
359
+ display: flex;
360
+ flex-direction: column;
361
+ gap: var(--space-md);
362
+ }
363
+
364
+ .pair-instruction-block {
365
+ display: flex;
366
+ flex-direction: column;
367
+ gap: var(--space-sm);
368
+ }
369
+
370
+ .pair-instruction-heading {
371
+ font-size: 0.8125rem;
372
+ font-weight: 600;
373
+ color: var(--color-text);
374
+ letter-spacing: -0.01em;
375
+ }
376
+
377
+ .pair-steps {
378
+ list-style: none;
379
+ counter-reset: pair-step;
380
+ display: flex;
381
+ flex-direction: column;
382
+ gap: 6px;
383
+ padding: 0;
384
+ }
385
+
386
+ .pair-steps li {
387
+ counter-increment: pair-step;
388
+ font-size: 0.8125rem;
389
+ color: var(--color-text-secondary);
390
+ line-height: 1.5;
391
+ display: flex;
392
+ flex-wrap: wrap;
393
+ gap: 0 var(--space-sm);
394
+ }
395
+
396
+ .pair-steps li::before {
397
+ content: counter(pair-step) ".";
398
+ font-weight: 600;
399
+ color: var(--color-muted);
400
+ min-width: 16px;
401
+ flex-shrink: 0;
402
+ }
403
+
404
+ .pair-steps li .pair-command {
405
+ flex-basis: 100%;
406
+ }
407
+
408
+ .pair-steps code {
409
+ font-family: "SF Mono", "Fira Code", "Cascadia Code", monospace;
410
+ font-size: 0.75rem;
411
+ background: var(--color-bg);
412
+ border: 1px solid var(--color-border);
413
+ border-radius: 4px;
414
+ padding: 1px 5px;
415
+ color: var(--color-text);
416
+ white-space: nowrap;
417
+ }
418
+
419
+ .pair-command {
420
+ display: block;
421
+ margin-top: 4px;
422
+ padding: 6px 10px !important;
423
+ border-radius: var(--radius-sm) !important;
424
+ overflow-x: auto;
425
+ -webkit-overflow-scrolling: touch;
426
+ }
427
+
428
+ .pair-instruction-divider {
429
+ height: 1px;
430
+ background: var(--color-border);
431
+ }
432
+
433
+ .pair-form {
434
+ background: var(--color-surface);
435
+ border: 1px solid var(--color-border);
436
+ border-radius: var(--radius-md);
437
+ padding: var(--space-lg);
438
+ display: flex;
439
+ flex-direction: column;
440
+ gap: var(--space-md);
441
+ box-shadow: var(--shadow-sm);
442
+ }
443
+
444
+ .pair-code-input {
445
+ font-size: 1.5rem !important;
446
+ letter-spacing: 0.25em;
447
+ text-align: center;
448
+ padding: 14px 12px !important;
449
+ text-transform: uppercase;
450
+ }
451
+
452
+ .pair-code-input::placeholder {
453
+ letter-spacing: 0.25em;
454
+ opacity: 0.35;
455
+ }
456
+
457
+ .pair-label-hint {
458
+ font-weight: 400;
459
+ color: var(--color-muted);
460
+ font-size: 0.75rem;
461
+ }
462
+
463
+ .pair-error {
464
+ font-size: 0.8125rem;
465
+ color: var(--color-error);
466
+ background: var(--color-error-bg);
467
+ padding: var(--space-sm) var(--space-md);
468
+ border-radius: var(--radius-sm);
469
+ line-height: 1.4;
470
+ }
471
+
472
+ /* ===== Loading / Empty States ===== */
473
+ .loading-state,
474
+ .empty-state {
475
+ display: flex;
476
+ flex-direction: column;
477
+ align-items: center;
478
+ justify-content: center;
479
+ padding: var(--space-2xl) 0;
480
+ gap: var(--space-sm);
481
+ }
482
+
483
+ .empty-state-text {
484
+ font-size: 1rem;
485
+ font-weight: 600;
486
+ color: var(--color-text-secondary);
487
+ }
488
+
489
+ .empty-state-hint {
490
+ font-size: 0.8125rem;
491
+ color: var(--color-muted);
492
+ }
493
+
494
+ /* ===== Client Revoked State ===== */
495
+ .revoked-state {
496
+ display: flex;
497
+ flex-direction: column;
498
+ align-items: center;
499
+ text-align: center;
500
+ padding: var(--space-2xl) var(--space-lg);
501
+ margin: var(--space-md) 0;
502
+ background: var(--color-surface);
503
+ border: 1px solid var(--color-border);
504
+ border-radius: var(--radius-md);
505
+ animation: revokedFadeIn 0.35s ease;
506
+ }
507
+
508
+ @keyframes revokedFadeIn {
509
+ from { opacity: 0; transform: translateY(8px); }
510
+ to { opacity: 1; transform: translateY(0); }
511
+ }
512
+
513
+ .revoked-icon {
514
+ width: 56px;
515
+ height: 56px;
516
+ display: flex;
517
+ align-items: center;
518
+ justify-content: center;
519
+ border-radius: var(--radius-full);
520
+ background: var(--color-error-bg);
521
+ color: var(--color-error);
522
+ margin-bottom: var(--space-md);
523
+ }
524
+
525
+ .revoked-title {
526
+ font-size: 1.125rem;
527
+ font-weight: 700;
528
+ color: var(--color-text);
529
+ margin-bottom: var(--space-xs);
530
+ }
531
+
532
+ .revoked-description {
533
+ font-size: 0.875rem;
534
+ line-height: 1.6;
535
+ color: var(--color-text-secondary);
536
+ max-width: 320px;
537
+ margin-bottom: var(--space-lg);
538
+ }
539
+
540
+ .revoked-command {
541
+ padding: 8px 16px;
542
+ background: var(--color-bg);
543
+ border: 1px solid var(--color-border);
544
+ border-radius: var(--radius-sm);
545
+ margin-bottom: var(--space-lg);
546
+ }
547
+
548
+ .revoked-command code {
549
+ font-family: "SF Mono", "Fira Code", "Cascadia Code", monospace;
550
+ font-size: 0.8125rem;
551
+ color: var(--color-text);
552
+ letter-spacing: -0.01em;
553
+ }
554
+
555
+ .revoked-actions {
556
+ display: flex;
557
+ gap: var(--space-sm);
558
+ width: 100%;
559
+ max-width: 280px;
560
+ }
561
+
562
+ .revoked-actions .btn {
563
+ flex: 1;
564
+ }
565
+
566
+ .spinner {
567
+ width: 24px;
568
+ height: 24px;
569
+ border: 2.5px solid var(--color-border);
570
+ border-top-color: var(--color-primary);
571
+ border-radius: var(--radius-full);
572
+ animation: spin 0.7s linear infinite;
573
+ }
574
+
575
+ @keyframes spin {
576
+ to {
577
+ transform: rotate(360deg);
578
+ }
579
+ }
580
+
581
+ /* ===== Task List ===== */
582
+ .new-task-input-card {
583
+ background: var(--color-surface);
584
+ border-radius: var(--radius-md);
585
+ border: 1px solid var(--color-border);
586
+ box-shadow: var(--shadow-sm);
587
+ padding: var(--space-md);
588
+ margin-bottom: var(--space-sm);
589
+ cursor: pointer;
590
+ }
591
+
592
+ .new-task-input-card:hover {
593
+ border-color: var(--color-primary);
594
+ }
595
+
596
+ .new-task-placeholder {
597
+ font-size: 0.875rem;
598
+ color: var(--color-muted);
599
+ }
600
+
601
+ .section-label {
602
+ font-size: 0.6875rem;
603
+ font-weight: 600;
604
+ text-transform: uppercase;
605
+ letter-spacing: 0.05em;
606
+ color: var(--color-muted);
607
+ margin: var(--space-md) 0 var(--space-xs);
608
+ }
609
+
610
+ .agent-picker-section-inline {
611
+ display: flex;
612
+ align-items: center;
613
+ gap: var(--space-xs);
614
+ margin-left: auto;
615
+ }
616
+
617
+ .agent-picker-section-inline .agent-picker-label {
618
+ font-size: 0.8rem;
619
+ color: var(--color-text-secondary);
620
+ white-space: nowrap;
621
+ }
622
+
623
+ .agent-picker-section-inline .form-select {
624
+ width: auto;
625
+ min-width: 0;
626
+ font-size: 0.8rem;
627
+ padding: 4px 8px;
628
+ }
629
+
630
+ .task-list {
631
+ display: flex;
632
+ flex-direction: column;
633
+ gap: 10px;
634
+ }
635
+
636
+ /* ===== Task Card ===== */
637
+ .task-card {
638
+ background: var(--color-surface);
639
+ border-radius: var(--radius-md);
640
+ border: 1px solid var(--color-border);
641
+ box-shadow: var(--shadow-sm);
642
+ padding: var(--space-md);
643
+ display: flex;
644
+ flex-direction: column;
645
+ gap: var(--space-sm);
646
+ cursor: pointer;
647
+ transition: box-shadow var(--transition-base), border-color var(--transition-base);
648
+ -webkit-tap-highlight-color: transparent;
649
+ }
650
+
651
+ .task-card:hover {
652
+ box-shadow: var(--shadow-md);
653
+ border-color: #CBD5E1;
654
+ }
655
+
656
+ .task-card-header {
657
+ display: flex;
658
+ align-items: center;
659
+ justify-content: space-between;
660
+ gap: var(--space-sm);
661
+ }
662
+
663
+ .task-card-title-row {
664
+ display: flex;
665
+ align-items: center;
666
+ gap: 10px;
667
+ min-width: 0;
668
+ flex: 1;
669
+ }
670
+
671
+ .task-card-name {
672
+ font-size: 0.9375rem;
673
+ font-weight: 600;
674
+ letter-spacing: -0.01em;
675
+ color: var(--color-text);
676
+ display: -webkit-box;
677
+ -webkit-line-clamp: 2;
678
+ -webkit-box-orient: vertical;
679
+ overflow: hidden;
680
+ }
681
+
682
+ .task-card-meta {
683
+ display: flex;
684
+ flex-wrap: wrap;
685
+ gap: var(--space-sm);
686
+ font-size: 0.75rem;
687
+ color: var(--color-text-secondary);
688
+ }
689
+
690
+ .task-card-agent {
691
+ color: var(--color-text-tertiary);
692
+ }
693
+
694
+ .task-card-last-event-link {
695
+ color: var(--color-primary);
696
+ cursor: pointer;
697
+ text-decoration: underline;
698
+ }
699
+
700
+ /* ===== Task Card Menu (Desktop Dropdown) ===== */
701
+ .task-card-actions {
702
+ display: flex;
703
+ gap: var(--space-xs);
704
+ flex-shrink: 0;
705
+ }
706
+
707
+ .task-card-menu {
708
+ position: relative;
709
+ }
710
+
711
+ .task-card-menu-btn {
712
+ background: none;
713
+ border: none;
714
+ color: var(--color-text-secondary);
715
+ font-size: 1.5rem;
716
+ min-width: 44px;
717
+ min-height: 44px;
718
+ display: flex;
719
+ align-items: center;
720
+ justify-content: center;
721
+ border-radius: var(--radius-sm);
722
+ cursor: pointer;
723
+ line-height: 1;
724
+ }
725
+
726
+ .task-card-menu-btn:hover {
727
+ background: var(--color-hover);
728
+ color: var(--color-text);
729
+ }
730
+
731
+ .task-card-menu-dropdown {
732
+ position: absolute;
733
+ right: 0;
734
+ top: 100%;
735
+ margin-top: 4px;
736
+ background: var(--color-surface);
737
+ border: 1px solid var(--color-border);
738
+ border-radius: var(--radius-md);
739
+ box-shadow: var(--shadow-md);
740
+ min-width: 150px;
741
+ z-index: 10;
742
+ overflow: hidden;
743
+ }
744
+
745
+ .task-card-menu-dropdown button {
746
+ display: flex;
747
+ align-items: center;
748
+ gap: var(--space-sm);
749
+ width: 100%;
750
+ text-align: left;
751
+ padding: var(--space-sm) var(--space-md);
752
+ background: none;
753
+ border: none;
754
+ font-size: 0.9375rem;
755
+ color: var(--color-text);
756
+ cursor: pointer;
757
+ white-space: nowrap;
758
+ }
759
+
760
+ .task-card-menu-dropdown button:hover {
761
+ background: var(--color-hover);
762
+ }
763
+
764
+ .task-card-menu-dropdown .menu-item-danger {
765
+ color: var(--color-error);
766
+ }
767
+
768
+ .menu-icon {
769
+ display: inline-flex;
770
+ align-items: center;
771
+ justify-content: center;
772
+ width: 20px;
773
+ height: 20px;
774
+ font-size: 0.875rem;
775
+ flex-shrink: 0;
776
+ line-height: 1;
777
+ }
778
+
779
+ /* ===== Bottom Sheet (Mobile) ===== */
780
+ .bottom-sheet-overlay {
781
+ position: fixed;
782
+ inset: 0;
783
+ background: var(--color-overlay);
784
+ z-index: 1000;
785
+ display: flex;
786
+ align-items: flex-end;
787
+ justify-content: center;
788
+ backdrop-filter: blur(4px);
789
+ animation: fadeIn var(--transition-fast);
790
+ }
791
+
792
+ @keyframes fadeIn {
793
+ from { opacity: 0; }
794
+ to { opacity: 1; }
795
+ }
796
+
797
+ .bottom-sheet {
798
+ background: var(--color-surface);
799
+ border-radius: var(--radius-lg) var(--radius-lg) 0 0;
800
+ width: 100%;
801
+ max-width: 480px;
802
+ padding: var(--space-sm) var(--space-md) var(--space-xl);
803
+ box-shadow: var(--shadow-xl);
804
+ animation: sheetSlideUp 0.25s cubic-bezier(0.16, 1, 0.3, 1);
805
+ }
806
+
807
+ @keyframes sheetSlideUp {
808
+ from { transform: translateY(100%); }
809
+ to { transform: translateY(0); }
810
+ }
811
+
812
+ .bottom-sheet-handle {
813
+ width: 36px;
814
+ height: 4px;
815
+ background: var(--color-border);
816
+ border-radius: 2px;
817
+ margin: 0 auto var(--space-md);
818
+ }
819
+
820
+ .bottom-sheet-title {
821
+ font-size: 0.9375rem;
822
+ font-weight: 600;
823
+ color: var(--color-text);
824
+ padding: 0 var(--space-xs) var(--space-md);
825
+ white-space: nowrap;
826
+ overflow: hidden;
827
+ text-overflow: ellipsis;
828
+ }
829
+
830
+ .bottom-sheet-actions {
831
+ display: flex;
832
+ flex-direction: column;
833
+ }
834
+
835
+ .bottom-sheet-actions button {
836
+ display: flex;
837
+ align-items: center;
838
+ gap: var(--space-md);
839
+ width: 100%;
840
+ text-align: left;
841
+ padding: var(--space-md);
842
+ background: none;
843
+ border: none;
844
+ border-radius: var(--radius-sm);
845
+ font-size: 0.9375rem;
846
+ font-family: var(--font-sans);
847
+ color: var(--color-text);
848
+ cursor: pointer;
849
+ transition: background var(--transition-fast);
850
+ }
851
+
852
+ .bottom-sheet-actions button:active {
853
+ background: var(--color-hover);
854
+ }
855
+
856
+ .bottom-sheet-actions .menu-item-danger {
857
+ color: var(--color-error);
858
+ }
859
+
860
+ /* ===== Task Form Overlay ===== */
861
+ .task-form-overlay {
862
+ position: fixed;
863
+ inset: 0;
864
+ background: transparent;
865
+ display: flex;
866
+ align-items: stretch;
867
+ justify-content: center;
868
+ z-index: 100;
869
+ padding: 0;
870
+ overflow: hidden;
871
+ overscroll-behavior: contain;
872
+ }
873
+
874
+ .task-form {
875
+ background: var(--color-surface);
876
+ border-radius: 0;
877
+ padding: var(--space-lg) var(--space-md);
878
+ width: 100%;
879
+ max-width: none;
880
+ max-height: none;
881
+ overflow-y: auto;
882
+ animation: slideUp 0.25s cubic-bezier(0.16, 1, 0.3, 1);
883
+ display: flex;
884
+ flex-direction: column;
885
+ gap: var(--space-md);
886
+ }
887
+
888
+ @media (min-width: 600px) {
889
+ .task-form-overlay {
890
+ background: var(--color-overlay);
891
+ backdrop-filter: blur(4px);
892
+ align-items: center;
893
+ padding: var(--space-md);
894
+ }
895
+
896
+ .task-form {
897
+ border-radius: var(--radius-lg);
898
+ box-shadow: var(--shadow-xl);
899
+ max-width: 540px;
900
+ max-height: 90dvh;
901
+ padding: var(--space-lg);
902
+ }
903
+ }
904
+
905
+ @keyframes slideUp {
906
+ from {
907
+ transform: translateY(20px);
908
+ opacity: 0;
909
+ }
910
+ to {
911
+ transform: translateY(0);
912
+ opacity: 1;
913
+ }
914
+ }
915
+
916
+ .task-form-header {
917
+ display: flex;
918
+ align-items: center;
919
+ justify-content: space-between;
920
+ }
921
+
922
+ .task-form h2 {
923
+ font-size: 1.0625rem;
924
+ font-weight: 700;
925
+ letter-spacing: -0.02em;
926
+ margin-bottom: 0;
927
+ }
928
+
929
+ .plan-actions {
930
+ display: flex;
931
+ gap: var(--space-sm);
932
+ flex-wrap: wrap;
933
+ }
934
+
935
+ .plan-dialog {
936
+ display: flex;
937
+ flex-direction: column;
938
+ gap: var(--space-md);
939
+ overflow: hidden;
940
+ flex: 1;
941
+ min-height: 0;
942
+ }
943
+
944
+ .plan-dialog h2 {
945
+ margin: 0;
946
+ font-size: 1.125rem;
947
+ }
948
+
949
+ .plan-dialog-scroll {
950
+ flex: 1;
951
+ min-height: 0;
952
+ overflow-y: auto;
953
+ }
954
+
955
+ .plan-dialog .plan-preview {
956
+ max-height: none;
957
+ }
958
+
959
+ .plan-empty {
960
+ color: var(--color-text-secondary);
961
+ font-size: 0.875rem;
962
+ font-style: italic;
963
+ margin: var(--space-md) 0;
964
+ }
965
+
966
+ .permissions-section {
967
+ border-top: 1px solid var(--color-border);
968
+ padding-top: var(--space-md);
969
+ margin-top: var(--space-md);
970
+ }
971
+
972
+ .permissions-section h3 {
973
+ margin: 0 0 var(--space-xs) 0;
974
+ font-size: 0.95rem;
975
+ }
976
+
977
+ .permissions-list {
978
+ margin: 0;
979
+ padding-left: 1.25em;
980
+ }
981
+
982
+ .permission-item {
983
+ margin-bottom: var(--space-sm);
984
+ display: flex;
985
+ flex-direction: column;
986
+ }
987
+
988
+ .permission-tool {
989
+ font-weight: 600;
990
+ font-family: var(--font-mono, monospace);
991
+ }
992
+
993
+ .permission-desc {
994
+ color: var(--color-text-secondary);
995
+ font-size: 0.9em;
996
+ }
997
+
998
+ .plan-dialog-actions {
999
+ display: flex;
1000
+ gap: var(--space-sm);
1001
+ align-items: center;
1002
+ justify-content: flex-end;
1003
+ }
1004
+
1005
+ @media (min-width: 600px) {
1006
+ .plan-dialog {
1007
+ max-width: none;
1008
+ }
1009
+ }
1010
+
1011
+ .result-times {
1012
+ display: flex;
1013
+ flex-direction: column;
1014
+ gap: var(--space-xs);
1015
+ font-size: 0.8125rem;
1016
+ color: var(--color-text-secondary);
1017
+ margin-bottom: var(--space-sm);
1018
+ }
1019
+
1020
+ .skeleton-line {
1021
+ height: 0.875rem;
1022
+ border-radius: var(--radius-sm);
1023
+ background: var(--color-border);
1024
+ animation: skeleton-pulse 1.2s ease-in-out infinite;
1025
+ }
1026
+
1027
+ @keyframes skeleton-pulse {
1028
+ 0%, 100% { opacity: 0.4; }
1029
+ 50% { opacity: 1; }
1030
+ }
1031
+
1032
+ .plan-preview {
1033
+ font-size: 0.8125rem;
1034
+ line-height: 1.6;
1035
+ color: var(--color-text-secondary);
1036
+ }
1037
+
1038
+ .plan-preview h1,
1039
+ .plan-preview h2,
1040
+ .plan-preview h3,
1041
+ .plan-preview h4 {
1042
+ color: var(--color-text);
1043
+ margin: var(--space-sm) 0 var(--space-xs) 0;
1044
+ }
1045
+
1046
+ .plan-preview h1 { font-size: 1.1rem; }
1047
+ .plan-preview h2 { font-size: 1rem; }
1048
+ .plan-preview h3 { font-size: 0.9375rem; }
1049
+
1050
+ .plan-preview p {
1051
+ margin: var(--space-xs) 0;
1052
+ }
1053
+
1054
+ .plan-preview ul,
1055
+ .plan-preview ol {
1056
+ padding-left: var(--space-md);
1057
+ margin: var(--space-xs) 0;
1058
+ }
1059
+
1060
+ .plan-preview code {
1061
+ background: var(--color-border);
1062
+ border-radius: 3px;
1063
+ padding: 1px 4px;
1064
+ font-family: "SF Mono", "Fira Code", "Cascadia Code", monospace;
1065
+ font-size: 0.75rem;
1066
+ }
1067
+
1068
+ .plan-preview pre {
1069
+ background: var(--color-border);
1070
+ border-radius: var(--radius-sm);
1071
+ padding: var(--space-sm);
1072
+ overflow-x: auto;
1073
+ }
1074
+
1075
+ .plan-preview pre code {
1076
+ background: none;
1077
+ padding: 0;
1078
+ }
1079
+
1080
+ .plan-preview table {
1081
+ width: 100%;
1082
+ border-collapse: collapse;
1083
+ margin: var(--space-xs) 0;
1084
+ }
1085
+
1086
+ .plan-preview th,
1087
+ .plan-preview td {
1088
+ border: 1px solid var(--color-border);
1089
+ padding: var(--space-xs) var(--space-sm);
1090
+ text-align: left;
1091
+ }
1092
+
1093
+ .plan-preview th {
1094
+ background: var(--color-border);
1095
+ color: var(--color-text);
1096
+ font-weight: 600;
1097
+ }
1098
+
1099
+ .triggers-section-body {
1100
+ display: flex;
1101
+ flex-direction: column;
1102
+ gap: 2px;
1103
+ }
1104
+
1105
+ .triggers-section-body.disabled {
1106
+ opacity: 0.4;
1107
+ pointer-events: none;
1108
+ }
1109
+
1110
+ .trigger-row-card {
1111
+ display: flex;
1112
+ align-items: center;
1113
+ gap: 8px;
1114
+ padding: 4px 0;
1115
+ }
1116
+
1117
+ .trigger-row-content {
1118
+ display: flex;
1119
+ flex-direction: column;
1120
+ gap: 4px;
1121
+ flex: 1;
1122
+ min-width: 0;
1123
+ }
1124
+
1125
+ .trigger-row-top {
1126
+ display: flex;
1127
+ align-items: center;
1128
+ gap: 8px;
1129
+ }
1130
+
1131
+ .trigger-row-top .form-select {
1132
+ flex: 0 0 auto;
1133
+ width: auto;
1134
+ }
1135
+
1136
+ .trigger-row-top .form-input {
1137
+ flex: 1;
1138
+ }
1139
+
1140
+ .trigger-details {
1141
+ display: flex;
1142
+ gap: 6px;
1143
+ }
1144
+
1145
+ .trigger-details .form-input[type="date"] {
1146
+ flex: 1;
1147
+ min-width: 0;
1148
+ }
1149
+
1150
+ .trigger-details .form-input[type="time"] {
1151
+ flex: 0 0 auto;
1152
+ width: auto;
1153
+ }
1154
+
1155
+ .trigger-row-card .form-select,
1156
+ .trigger-row-card .form-input {
1157
+ margin-bottom: 0;
1158
+ font-size: 0.8125rem;
1159
+ padding: 6px 8px;
1160
+ height: 32px;
1161
+ box-sizing: border-box;
1162
+ min-width: 0;
1163
+ flex: 1;
1164
+ }
1165
+
1166
+ .trigger-remove-btn {
1167
+ display: inline-flex;
1168
+ align-items: center;
1169
+ justify-content: center;
1170
+ width: 26px;
1171
+ height: 26px;
1172
+ border: none;
1173
+ border-radius: var(--radius-full);
1174
+ background: transparent;
1175
+ color: var(--color-muted);
1176
+ font-size: 1.1rem;
1177
+ line-height: 1;
1178
+ cursor: pointer;
1179
+ transition: all var(--transition-fast);
1180
+ flex-shrink: 0;
1181
+ }
1182
+
1183
+ .trigger-remove-btn:hover {
1184
+ background: var(--color-error-bg);
1185
+ color: var(--color-error);
1186
+ }
1187
+
1188
+ .trigger-add-btn {
1189
+ display: inline-flex;
1190
+ align-items: center;
1191
+ gap: 4px;
1192
+ border: 1px dashed var(--color-border);
1193
+ border-radius: var(--radius-sm);
1194
+ background: transparent;
1195
+ color: var(--color-text-secondary);
1196
+ font-family: var(--font-sans);
1197
+ font-size: 0.8125rem;
1198
+ font-weight: 500;
1199
+ padding: 8px 14px;
1200
+ cursor: pointer;
1201
+ transition: all var(--transition-fast);
1202
+ width: 100%;
1203
+ justify-content: center;
1204
+ }
1205
+
1206
+ .trigger-add-btn:hover {
1207
+ border-color: var(--color-primary);
1208
+ color: var(--color-primary);
1209
+ background: var(--color-primary-subtle);
1210
+ }
1211
+
1212
+ .form-select {
1213
+ width: auto;
1214
+ min-width: 80px;
1215
+ }
1216
+
1217
+ .toggles-section {
1218
+ display: flex;
1219
+ flex-direction: column;
1220
+ gap: 10px;
1221
+ margin-bottom: var(--space-md);
1222
+ }
1223
+
1224
+ .toggle-label {
1225
+ display: flex;
1226
+ align-items: center;
1227
+ gap: 10px;
1228
+ font-size: 0.875rem;
1229
+ font-weight: 500;
1230
+ cursor: pointer;
1231
+ -webkit-tap-highlight-color: transparent;
1232
+ color: var(--color-text);
1233
+ }
1234
+
1235
+ .toggle-label input[type="checkbox"] {
1236
+ width: 16px;
1237
+ height: 16px;
1238
+ accent-color: var(--color-primary);
1239
+ border-radius: 4px;
1240
+ }
1241
+
1242
+ .toggles-group {
1243
+ display: flex;
1244
+ flex-direction: column;
1245
+ gap: var(--space-xs);
1246
+ }
1247
+
1248
+ .command-section {
1249
+ margin-bottom: 0;
1250
+ }
1251
+
1252
+ .command-section-active {
1253
+ }
1254
+
1255
+ .command-section-active .toggle-label {
1256
+ margin-bottom: 0;
1257
+ }
1258
+
1259
+ .command-help-text {
1260
+ font-size: 0.75rem;
1261
+ color: var(--color-text-secondary);
1262
+ line-height: 1.4;
1263
+ margin: 6px 0 10px 0;
1264
+ }
1265
+
1266
+ .command-section-active .form-input {
1267
+ font-size: 0.8125rem;
1268
+ padding: 6px 8px;
1269
+ height: 32px;
1270
+ box-sizing: border-box;
1271
+ }
1272
+
1273
+ .form-actions {
1274
+ display: flex;
1275
+ gap: var(--space-sm);
1276
+ position: sticky;
1277
+ bottom: 0;
1278
+ background: var(--color-surface);
1279
+ padding: var(--space-sm) 0;
1280
+ }
1281
+
1282
+ /* ===== Confirmation Modal ===== */
1283
+ .confirm-modal-overlay {
1284
+ position: fixed;
1285
+ inset: 0;
1286
+ background: var(--color-overlay);
1287
+ display: flex;
1288
+ align-items: center;
1289
+ justify-content: center;
1290
+ z-index: 1000;
1291
+ padding: var(--space-md);
1292
+ backdrop-filter: blur(4px);
1293
+ }
1294
+
1295
+ .confirm-modal {
1296
+ background: var(--color-surface);
1297
+ border-radius: var(--radius-lg);
1298
+ border: 1px solid var(--color-border);
1299
+ padding: var(--space-xl);
1300
+ width: 100%;
1301
+ max-width: 380px;
1302
+ text-align: center;
1303
+ box-shadow: var(--shadow-xl);
1304
+ animation: slideUp 0.25s cubic-bezier(0.16, 1, 0.3, 1);
1305
+ }
1306
+
1307
+ .confirm-modal-title {
1308
+ font-size: 1.125rem;
1309
+ font-weight: 700;
1310
+ letter-spacing: -0.02em;
1311
+ margin-bottom: var(--space-sm);
1312
+ }
1313
+
1314
+ .confirm-modal-message {
1315
+ font-size: 0.9375rem;
1316
+ color: var(--color-text-secondary);
1317
+ margin-bottom: var(--space-lg);
1318
+ line-height: 1.5;
1319
+ }
1320
+
1321
+ .confirm-modal-actions {
1322
+ display: flex;
1323
+ gap: var(--space-sm);
1324
+ justify-content: center;
1325
+ }
1326
+
1327
+ .confirm-modal-actions .btn {
1328
+ flex: 1;
1329
+ padding: 10px var(--space-lg);
1330
+ font-size: 0.875rem;
1331
+ }
1332
+
1333
+ .permission-modal {
1334
+ text-align: left;
1335
+ max-width: 400px;
1336
+ }
1337
+
1338
+ .permission-modal .confirm-modal-title {
1339
+ text-align: center;
1340
+ }
1341
+
1342
+ .permission-modal .confirm-modal-message {
1343
+ text-align: center;
1344
+ word-break: break-word;
1345
+ }
1346
+
1347
+ .permission-list {
1348
+ display: flex;
1349
+ flex-direction: column;
1350
+ gap: var(--space-xs);
1351
+ margin-bottom: var(--space-lg);
1352
+ }
1353
+
1354
+ .permission-item {
1355
+ display: flex;
1356
+ flex-direction: column;
1357
+ gap: 2px;
1358
+ padding: var(--space-sm);
1359
+ background: var(--color-hover);
1360
+ border-radius: var(--radius-sm);
1361
+ }
1362
+
1363
+ .permission-name {
1364
+ font-size: 0.8125rem;
1365
+ font-weight: 600;
1366
+ color: var(--color-text);
1367
+ }
1368
+
1369
+ .permission-desc {
1370
+ font-size: 0.75rem;
1371
+ color: var(--color-text-secondary);
1372
+ line-height: 1.4;
1373
+ }
1374
+
1375
+ .permission-actions {
1376
+ display: flex;
1377
+ gap: var(--space-sm);
1378
+ }
1379
+
1380
+ .permission-actions .btn {
1381
+ flex: 1;
1382
+ padding: 10px var(--space-md);
1383
+ font-size: 0.875rem;
1384
+ }
1385
+
1386
+ .permission-abort-link {
1387
+ display: block;
1388
+ width: 100%;
1389
+ margin-top: var(--space-sm);
1390
+ background: none;
1391
+ border: none;
1392
+ color: var(--color-error);
1393
+ font-size: 0.8125rem;
1394
+ cursor: pointer;
1395
+ text-align: center;
1396
+ padding: var(--space-xs) 0;
1397
+ opacity: 0.8;
1398
+ }
1399
+
1400
+ .permission-abort-link:hover {
1401
+ opacity: 1;
1402
+ text-decoration: underline;
1403
+ }
1404
+
1405
+ /* ===== Input Request Modal ===== */
1406
+ .input-modal {
1407
+ text-align: left;
1408
+ max-width: 400px;
1409
+ }
1410
+
1411
+ .input-modal .confirm-modal-title {
1412
+ text-align: center;
1413
+ }
1414
+
1415
+ .input-modal .confirm-modal-message {
1416
+ text-align: center;
1417
+ word-break: break-word;
1418
+ }
1419
+
1420
+ .input-list {
1421
+ display: flex;
1422
+ flex-direction: column;
1423
+ gap: var(--space-md);
1424
+ margin-bottom: var(--space-lg);
1425
+ }
1426
+
1427
+ .input-item {
1428
+ display: flex;
1429
+ flex-direction: column;
1430
+ gap: var(--space-xs);
1431
+ }
1432
+
1433
+ .input-label {
1434
+ font-size: 0.8125rem;
1435
+ font-weight: 600;
1436
+ color: var(--color-text);
1437
+ }
1438
+
1439
+ .input-field {
1440
+ width: 100%;
1441
+ padding: var(--space-sm) var(--space-md);
1442
+ font-size: 0.875rem;
1443
+ border: 1px solid var(--color-border);
1444
+ border-radius: var(--radius-sm);
1445
+ background: var(--color-surface);
1446
+ color: var(--color-text);
1447
+ box-sizing: border-box;
1448
+ }
1449
+
1450
+ .input-field:focus {
1451
+ outline: none;
1452
+ border-color: var(--color-primary);
1453
+ box-shadow: 0 0 0 2px rgba(var(--color-primary-rgb, 99, 102, 241), 0.2);
1454
+ }
1455
+
1456
+ .input-actions {
1457
+ display: flex;
1458
+ gap: var(--space-sm);
1459
+ }
1460
+
1461
+ .input-actions .btn {
1462
+ flex: 1;
1463
+ padding: 10px var(--space-md);
1464
+ font-size: 0.875rem;
1465
+ }
1466
+
1467
+ /* ===== Host Picker ===== */
1468
+ .host-picker-inline {
1469
+ border: 1px solid var(--color-border);
1470
+ border-radius: var(--radius-md);
1471
+ overflow: hidden;
1472
+ }
1473
+
1474
+ .host-picker-list {
1475
+ max-height: 240px;
1476
+ overflow-y: auto;
1477
+ padding: var(--space-xs) 0;
1478
+ }
1479
+
1480
+ .host-picker-item-wrapper {
1481
+ position: relative;
1482
+ }
1483
+
1484
+ .host-picker-item {
1485
+ display: flex;
1486
+ align-items: center;
1487
+ gap: 8px;
1488
+ width: 100%;
1489
+ padding: 8px 12px;
1490
+ border: none;
1491
+ background: none;
1492
+ cursor: pointer;
1493
+ font-family: var(--font-sans);
1494
+ font-size: 0.8125rem;
1495
+ color: var(--color-text);
1496
+ text-align: left;
1497
+ transition: background var(--transition-fast);
1498
+ -webkit-tap-highlight-color: transparent;
1499
+ }
1500
+
1501
+ .host-picker-item:hover {
1502
+ background: var(--color-border-subtle);
1503
+ }
1504
+
1505
+ .host-picker-item-active {
1506
+ background: var(--color-primary-subtle);
1507
+ }
1508
+
1509
+ .host-picker-item-active:hover {
1510
+ background: var(--color-primary-subtle);
1511
+ }
1512
+
1513
+ .host-picker-item-name {
1514
+ flex: 1;
1515
+ min-width: 0;
1516
+ overflow: hidden;
1517
+ text-overflow: ellipsis;
1518
+ white-space: nowrap;
1519
+ display: flex;
1520
+ align-items: center;
1521
+ gap: 6px;
1522
+ }
1523
+
1524
+ .host-picker-pending {
1525
+ font-size: 0.6875rem;
1526
+ font-weight: 500;
1527
+ color: var(--color-muted);
1528
+ background: var(--color-border-subtle);
1529
+ padding: 1px 6px;
1530
+ border-radius: 4px;
1531
+ flex-shrink: 0;
1532
+ }
1533
+
1534
+ .host-picker-item-actions {
1535
+ flex-shrink: 0;
1536
+ width: 24px;
1537
+ display: flex;
1538
+ align-items: center;
1539
+ justify-content: center;
1540
+ }
1541
+
1542
+ .host-picker-edit-btn {
1543
+ display: flex;
1544
+ align-items: center;
1545
+ justify-content: center;
1546
+ width: 24px;
1547
+ height: 24px;
1548
+ border: none;
1549
+ background: none;
1550
+ cursor: pointer;
1551
+ color: var(--color-muted);
1552
+ border-radius: 4px;
1553
+ flex-shrink: 0;
1554
+ transition: all var(--transition-fast);
1555
+ }
1556
+
1557
+ .host-picker-edit-btn:hover {
1558
+ color: var(--color-primary);
1559
+ background: var(--color-primary-subtle);
1560
+ }
1561
+
1562
+ .host-picker-rename-input {
1563
+ font-size: 0.8125rem !important;
1564
+ padding: 3px 6px !important;
1565
+ flex: 1;
1566
+ min-width: 0;
1567
+ }
1568
+
1569
+ .host-picker-delete-btn {
1570
+ display: flex;
1571
+ align-items: center;
1572
+ justify-content: center;
1573
+ width: 24px;
1574
+ height: 24px;
1575
+ border: none;
1576
+ background: none;
1577
+ cursor: pointer;
1578
+ color: var(--color-muted);
1579
+ border-radius: 4px;
1580
+ flex-shrink: 0;
1581
+ transition: all var(--transition-fast);
1582
+ }
1583
+
1584
+ .host-picker-delete-btn:hover {
1585
+ color: var(--color-error);
1586
+ background: var(--color-error-bg);
1587
+ }
1588
+
1589
+
1590
+ /* ===== Hamburger button ===== */
1591
+
1592
+ .hamburger-btn {
1593
+ display: flex;
1594
+ align-items: center;
1595
+ justify-content: center;
1596
+ width: 40px;
1597
+ height: 40px;
1598
+ padding: 0;
1599
+ border: none;
1600
+ background: none;
1601
+ color: var(--color-text);
1602
+ cursor: pointer;
1603
+ border-radius: var(--radius-sm);
1604
+ transition: background var(--transition-fast);
1605
+ }
1606
+
1607
+ .hamburger-btn:hover {
1608
+ background: var(--color-primary-subtle);
1609
+ }
1610
+
1611
+ /* ===== Drawer ===== */
1612
+
1613
+ .drawer-overlay {
1614
+ position: fixed;
1615
+ inset: 0;
1616
+ background: var(--color-overlay);
1617
+ z-index: 100;
1618
+ animation: drawerFadeIn 0.2s ease;
1619
+ }
1620
+
1621
+ .drawer-panel {
1622
+ position: fixed;
1623
+ top: 0;
1624
+ left: 0;
1625
+ bottom: 0;
1626
+ width: 280px;
1627
+ max-width: 80vw;
1628
+ background: var(--color-surface);
1629
+ box-shadow: var(--shadow-xl);
1630
+ z-index: 101;
1631
+ display: flex;
1632
+ flex-direction: column;
1633
+ animation: drawerSlideIn 0.25s ease;
1634
+ }
1635
+
1636
+ .drawer-header {
1637
+ display: flex;
1638
+ align-items: center;
1639
+ justify-content: space-between;
1640
+ padding: var(--space-md);
1641
+ border-bottom: 1px solid var(--color-border);
1642
+ }
1643
+
1644
+ .drawer-title {
1645
+ font-size: 1.125rem;
1646
+ font-weight: 800;
1647
+ color: var(--color-primary);
1648
+ letter-spacing: -0.04em;
1649
+ }
1650
+
1651
+ .drawer-close-btn {
1652
+ display: flex;
1653
+ align-items: center;
1654
+ justify-content: center;
1655
+ width: 32px;
1656
+ height: 32px;
1657
+ padding: 0;
1658
+ border: none;
1659
+ background: none;
1660
+ color: var(--color-text-secondary);
1661
+ cursor: pointer;
1662
+ border-radius: var(--radius-sm);
1663
+ transition: background var(--transition-fast);
1664
+ }
1665
+
1666
+ .drawer-close-btn:hover {
1667
+ background: var(--color-border-subtle);
1668
+ color: var(--color-text);
1669
+ }
1670
+
1671
+ .drawer-section {
1672
+ padding: var(--space-md);
1673
+ }
1674
+
1675
+ .drawer-section-label {
1676
+ font-size: 0.6875rem;
1677
+ font-weight: 600;
1678
+ text-transform: uppercase;
1679
+ letter-spacing: 0.05em;
1680
+ color: var(--color-muted);
1681
+ margin-bottom: var(--space-sm);
1682
+ }
1683
+
1684
+ .drawer-footer {
1685
+ margin-top: auto;
1686
+ padding: var(--space-md);
1687
+ }
1688
+
1689
+ .drawer-version {
1690
+ font-size: 0.75rem;
1691
+ color: var(--color-muted);
1692
+ }
1693
+
1694
+ .drawer-legal {
1695
+ font-size: 0.75rem;
1696
+ color: var(--color-muted);
1697
+ margin-top: var(--space-xs);
1698
+ }
1699
+
1700
+ .drawer-legal a {
1701
+ color: var(--color-muted);
1702
+ text-decoration: none;
1703
+ }
1704
+
1705
+ .drawer-legal a:hover {
1706
+ text-decoration: underline;
1707
+ }
1708
+
1709
+ .drawer-legal-sep {
1710
+ margin: 0 var(--space-xs);
1711
+ }
1712
+
1713
+ .drawer-divider {
1714
+ height: 1px;
1715
+ background: var(--color-border);
1716
+ margin: 0 var(--space-md);
1717
+ }
1718
+
1719
+ @keyframes drawerFadeIn {
1720
+ from { opacity: 0; }
1721
+ to { opacity: 1; }
1722
+ }
1723
+
1724
+ @keyframes drawerFadeOut {
1725
+ from { opacity: 1; }
1726
+ to { opacity: 0; }
1727
+ }
1728
+
1729
+ @keyframes drawerSlideIn {
1730
+ from { transform: translateX(-100%); }
1731
+ to { transform: translateX(0); }
1732
+ }
1733
+
1734
+ @keyframes drawerSlideOut {
1735
+ from { transform: translateX(0); }
1736
+ to { transform: translateX(-100%); }
1737
+ }
1738
+
1739
+ .drawer-overlay-closing {
1740
+ animation: drawerFadeOut 0.2s ease forwards;
1741
+ }
1742
+
1743
+ .drawer-panel-closing {
1744
+ animation: drawerSlideOut 0.2s ease forwards;
1745
+ }
1746
+
1747
+ /* ===== Tab bar ===== */
1748
+
1749
+ .tab-bar {
1750
+ display: flex;
1751
+ align-items: center;
1752
+ background: color-mix(in srgb, var(--color-surface) 92%, transparent);
1753
+ border-bottom: 1px solid var(--color-border);
1754
+ position: sticky;
1755
+ top: 0;
1756
+ z-index: 10;
1757
+ backdrop-filter: blur(8px);
1758
+ }
1759
+
1760
+ .tab-btn {
1761
+ flex: 1;
1762
+ display: flex;
1763
+ align-items: center;
1764
+ justify-content: center;
1765
+ gap: 6px;
1766
+ padding: 12px 0;
1767
+ border: none;
1768
+ background: none;
1769
+ font-family: var(--font-sans);
1770
+ font-size: 0.875rem;
1771
+ font-weight: 600;
1772
+ color: var(--color-text-secondary);
1773
+ cursor: pointer;
1774
+ border-bottom: 2px solid transparent;
1775
+ transition: color var(--transition-fast), border-color var(--transition-fast);
1776
+ }
1777
+
1778
+ .tab-icon {
1779
+ flex-shrink: 0;
1780
+ }
1781
+
1782
+ .tab-btn:hover {
1783
+ color: var(--color-text);
1784
+ }
1785
+
1786
+ .tab-btn-active {
1787
+ color: var(--color-primary);
1788
+ border-bottom-color: var(--color-primary);
1789
+ }
1790
+
1791
+ /* ===== Runs view ===== */
1792
+
1793
+ .runs-view {
1794
+ flex: 1;
1795
+ display: flex;
1796
+ flex-direction: column;
1797
+ align-items: center;
1798
+ justify-content: center;
1799
+ }
1800
+
1801
+ .runs-card {
1802
+ background: var(--color-surface);
1803
+ border-radius: var(--radius-md);
1804
+ border: 1px solid var(--color-border);
1805
+ box-shadow: var(--shadow-sm);
1806
+ padding: var(--space-md);
1807
+ display: flex;
1808
+ align-items: center;
1809
+ gap: var(--space-sm);
1810
+ cursor: pointer;
1811
+ transition: box-shadow var(--transition-base), border-color var(--transition-base);
1812
+ -webkit-tap-highlight-color: transparent;
1813
+ }
1814
+
1815
+ .runs-card:hover {
1816
+ box-shadow: var(--shadow-md);
1817
+ border-color: #CBD5E1;
1818
+ }
1819
+
1820
+ .runs-card-body {
1821
+ flex: 1;
1822
+ min-width: 0;
1823
+ display: flex;
1824
+ flex-direction: column;
1825
+ gap: var(--space-xs);
1826
+ }
1827
+
1828
+ .runs-card-name {
1829
+ font-size: 0.9375rem;
1830
+ font-weight: 600;
1831
+ letter-spacing: -0.01em;
1832
+ color: var(--color-text);
1833
+ white-space: nowrap;
1834
+ overflow: hidden;
1835
+ text-overflow: ellipsis;
1836
+ }
1837
+
1838
+ .runs-card-meta {
1839
+ display: flex;
1840
+ flex-wrap: wrap;
1841
+ gap: var(--space-sm);
1842
+ font-size: 0.75rem;
1843
+ color: var(--color-text-secondary);
1844
+ }
1845
+
1846
+ .runs-card-chevron {
1847
+ flex-shrink: 0;
1848
+ align-self: center;
1849
+ color: var(--color-text-secondary);
1850
+ font-size: 1.25rem;
1851
+ line-height: 1;
1852
+ opacity: 0.4;
1853
+ transition: opacity var(--transition-base);
1854
+ }
1855
+
1856
+ .runs-card:hover .runs-card-chevron {
1857
+ opacity: 0.8;
1858
+ }
1859
+
1860
+ .runs-filter-chip {
1861
+ display: inline-flex;
1862
+ align-items: center;
1863
+ gap: var(--space-xs);
1864
+ padding: 4px 10px;
1865
+ font-size: 0.8125rem;
1866
+ color: var(--color-text-secondary);
1867
+ background: var(--color-bg);
1868
+ border: 1px solid var(--color-border);
1869
+ border-radius: 999px;
1870
+ }
1871
+
1872
+ .runs-filter-chip button {
1873
+ display: inline-flex;
1874
+ align-items: center;
1875
+ justify-content: center;
1876
+ border: none;
1877
+ background: none;
1878
+ cursor: pointer;
1879
+ padding: 0;
1880
+ color: var(--color-text-secondary);
1881
+ font-size: 1rem;
1882
+ line-height: 1;
1883
+ }
1884
+
1885
+ .runs-filter-chip button:hover {
1886
+ color: var(--color-text);
1887
+ }
1888
+
1889
+ /* ===== Run Detail (inline drill-down) ===== */
1890
+
1891
+ .run-detail {
1892
+ display: flex;
1893
+ flex-direction: column;
1894
+ gap: var(--space-md);
1895
+ background: var(--color-surface);
1896
+ border-radius: var(--radius-md);
1897
+ border: 1px solid var(--color-border);
1898
+ box-shadow: var(--shadow-sm);
1899
+ padding: var(--space-md);
1900
+ }
1901
+
1902
+ .run-detail-back {
1903
+ display: inline-flex;
1904
+ align-items: center;
1905
+ gap: var(--space-xs);
1906
+ border: none;
1907
+ background: none;
1908
+ cursor: pointer;
1909
+ padding: 0;
1910
+ color: var(--color-text-secondary);
1911
+ font-size: 0.8125rem;
1912
+ }
1913
+
1914
+ .run-detail-back:hover {
1915
+ color: var(--color-text);
1916
+ }
1917
+
1918
+ /* ===== Chat Thread ===== */
1919
+ .chat-thread {
1920
+ display: flex;
1921
+ flex-direction: column;
1922
+ gap: var(--space-sm);
1923
+ overflow-y: auto;
1924
+ flex: 1;
1925
+ min-height: 0;
1926
+ }
1927
+
1928
+ .chat-message {
1929
+ display: flex;
1930
+ flex-direction: column;
1931
+ gap: var(--space-xs);
1932
+ max-width: 85%;
1933
+ min-width: 0;
1934
+ padding: var(--space-sm) var(--space-md);
1935
+ border-radius: var(--radius-md);
1936
+ font-size: 0.8125rem;
1937
+ line-height: 1.6;
1938
+ }
1939
+
1940
+ .chat-message--assistant {
1941
+ align-self: flex-start;
1942
+ background: var(--color-surface);
1943
+ border: 1px solid var(--color-border);
1944
+ }
1945
+
1946
+ .chat-message--user {
1947
+ align-self: flex-end;
1948
+ background: var(--color-primary-subtle);
1949
+ border: 1px solid var(--color-border-subtle);
1950
+ }
1951
+
1952
+ .chat-message-agent {
1953
+ font-size: 0.6875rem;
1954
+ font-weight: 500;
1955
+ color: var(--color-text-tertiary);
1956
+ margin-bottom: var(--space-xs);
1957
+ }
1958
+
1959
+ .chat-message-content {
1960
+ color: var(--color-text);
1961
+ overflow-wrap: break-word;
1962
+ }
1963
+
1964
+ .chat-message-content h1,
1965
+ .chat-message-content h2,
1966
+ .chat-message-content h3,
1967
+ .chat-message-content h4 {
1968
+ margin: 0.75em 0 0.25em;
1969
+ font-weight: 600;
1970
+ }
1971
+ .chat-message-content h1 { font-size: 1.1rem; }
1972
+ .chat-message-content h2 { font-size: 1rem; }
1973
+ .chat-message-content h3 { font-size: 0.9375rem; }
1974
+
1975
+ .chat-message-content p {
1976
+ margin: 0.5em 0;
1977
+ }
1978
+
1979
+ .chat-message-content ul,
1980
+ .chat-message-content ol {
1981
+ margin: 0.5em 0;
1982
+ padding-left: 1.5em;
1983
+ }
1984
+
1985
+ .chat-message-content code {
1986
+ font-size: 0.8em;
1987
+ background: var(--color-hover);
1988
+ padding: 0.15em 0.35em;
1989
+ border-radius: 4px;
1990
+ }
1991
+
1992
+ .chat-message-content pre {
1993
+ background: var(--color-bg);
1994
+ border-radius: var(--radius-sm);
1995
+ padding: var(--space-sm);
1996
+ overflow-x: auto;
1997
+ margin: 0.5em 0;
1998
+ }
1999
+
2000
+ .chat-message-content pre code {
2001
+ background: none;
2002
+ padding: 0;
2003
+ }
2004
+
2005
+ .chat-message-content table {
2006
+ border-collapse: collapse;
2007
+ width: 100%;
2008
+ margin: 0.5em 0;
2009
+ }
2010
+
2011
+ .chat-message-content th,
2012
+ .chat-message-content td {
2013
+ border: 1px solid var(--color-border);
2014
+ padding: 0.35em 0.6em;
2015
+ text-align: left;
2016
+ }
2017
+
2018
+ .chat-message-content th {
2019
+ background: var(--color-bg);
2020
+ font-weight: 600;
2021
+ }
2022
+
2023
+ .chat-message-meta {
2024
+ display: flex;
2025
+ align-items: center;
2026
+ gap: var(--space-xs);
2027
+ font-size: 0.6875rem;
2028
+ color: var(--color-muted);
2029
+ }
2030
+
2031
+ .chat-message-type {
2032
+ font-weight: 600;
2033
+ text-transform: uppercase;
2034
+ letter-spacing: 0.04em;
2035
+ font-size: 0.625rem;
2036
+ }
2037
+
2038
+ .chat-message-attachments {
2039
+ display: flex;
2040
+ flex-wrap: wrap;
2041
+ gap: var(--space-xs);
2042
+ }
2043
+
2044
+ .chat-attachment-chip {
2045
+ display: inline-flex;
2046
+ align-items: center;
2047
+ padding: 0.2em 0.6em;
2048
+ font-size: 0.75rem;
2049
+ background: var(--color-bg);
2050
+ border: 1px solid var(--color-border);
2051
+ border-radius: var(--radius-sm);
2052
+ cursor: pointer;
2053
+ color: var(--color-primary);
2054
+ font-weight: 500;
2055
+ }
2056
+
2057
+ .chat-attachment-chip:hover {
2058
+ background: var(--color-primary-subtle);
2059
+ }
2060
+
2061
+ .chat-message-report {
2062
+ margin-top: var(--space-xs);
2063
+ padding: var(--space-sm);
2064
+ background: var(--color-bg);
2065
+ border-radius: var(--radius-sm);
2066
+ border: 1px solid var(--color-border);
2067
+ font-size: 0.8125rem;
2068
+ line-height: 1.6;
2069
+ color: var(--color-text-secondary);
2070
+ }
2071
+
2072
+ .chat-status {
2073
+ display: flex;
2074
+ align-items: center;
2075
+ justify-content: center;
2076
+ gap: var(--space-xs);
2077
+ font-size: 0.6875rem;
2078
+ color: var(--color-muted);
2079
+ padding: var(--space-xs) 0;
2080
+ }
2081
+
2082
+ .chat-status-time {
2083
+ color: var(--color-muted);
2084
+ }
2085
+
2086
+ .chat-monitoring-indicator {
2087
+ display: flex;
2088
+ align-items: center;
2089
+ justify-content: center;
2090
+ gap: var(--space-xs);
2091
+ font-size: 0.6875rem;
2092
+ color: var(--color-muted);
2093
+ padding: var(--space-md) 0;
2094
+ }
2095
+
2096
+ .chat-monitoring-dot {
2097
+ width: 6px;
2098
+ height: 6px;
2099
+ border-radius: 50%;
2100
+ background: var(--color-muted);
2101
+ animation: monitoring-pulse 1.5s ease-in-out infinite;
2102
+ }
2103
+
2104
+ @keyframes monitoring-pulse {
2105
+ 0%, 100% { opacity: 0.3; }
2106
+ 50% { opacity: 1; }
2107
+ }
2108
+
2109
+ .chat-abort-bar {
2110
+ display: flex;
2111
+ justify-content: center;
2112
+ padding: var(--space-sm) 0;
2113
+ flex-shrink: 0;
2114
+ }
2115
+
2116
+ .chat-abort-btn {
2117
+ color: var(--color-error);
2118
+ border-color: var(--color-error);
2119
+ }
2120
+
2121
+ .chat-abort-btn:hover:not(:disabled) {
2122
+ background: var(--color-error-bg);
2123
+ }
2124
+
2125
+ .chat-stop-btn {
2126
+ display: flex;
2127
+ align-items: center;
2128
+ justify-content: center;
2129
+ width: 36px;
2130
+ height: 36px;
2131
+ padding: 0;
2132
+ border-radius: 50%;
2133
+ flex-shrink: 0;
2134
+ margin-left: auto;
2135
+ background: var(--color-error);
2136
+ color: white;
2137
+ border-color: var(--color-error);
2138
+ }
2139
+
2140
+ .chat-stop-btn:hover:not(:disabled) {
2141
+ background: #dc2626;
2142
+ border-color: #dc2626;
2143
+ }
2144
+
2145
+ .chat-input-bar {
2146
+ display: flex;
2147
+ gap: var(--space-xs);
2148
+ padding: var(--space-sm) 0;
2149
+ flex-shrink: 0;
2150
+ }
2151
+
2152
+ .chat-input {
2153
+ flex: 1;
2154
+ min-width: 0;
2155
+ padding: var(--space-sm) var(--space-md);
2156
+ border: 1px solid var(--color-border);
2157
+ border-radius: var(--radius-md);
2158
+ font-size: 0.8125rem;
2159
+ outline: none;
2160
+ background: var(--color-surface);
2161
+ color: var(--color-text);
2162
+ }
2163
+
2164
+ .chat-input:focus {
2165
+ border-color: var(--color-primary);
2166
+ box-shadow: 0 0 0 2px var(--color-primary-subtle);
2167
+ }
2168
+
2169
+ .chat-input:disabled {
2170
+ opacity: 0.6;
2171
+ }
2172
+
2173
+ .chat-send-btn {
2174
+ display: flex;
2175
+ align-items: center;
2176
+ justify-content: center;
2177
+ width: 36px;
2178
+ height: 36px;
2179
+ padding: 0;
2180
+ border-radius: 50%;
2181
+ flex-shrink: 0;
2182
+ }
2183
+
2184
+ /* ===== Report Fullscreen Dialog ===== */
2185
+ .report-dialog-overlay {
2186
+ position: fixed;
2187
+ inset: 0;
2188
+ z-index: 1000;
2189
+ background: var(--color-overlay);
2190
+ display: flex;
2191
+ align-items: stretch;
2192
+ justify-content: center;
2193
+ }
2194
+
2195
+ .report-dialog {
2196
+ display: flex;
2197
+ flex-direction: column;
2198
+ width: 100%;
2199
+ max-width: 800px;
2200
+ background: var(--color-surface);
2201
+ overflow: hidden;
2202
+ }
2203
+
2204
+ .report-dialog-header {
2205
+ display: flex;
2206
+ align-items: center;
2207
+ justify-content: space-between;
2208
+ padding: var(--space-sm) var(--space-md);
2209
+ border-bottom: 1px solid var(--color-border);
2210
+ flex-shrink: 0;
2211
+ }
2212
+
2213
+ .report-dialog-title {
2214
+ font-size: 0.875rem;
2215
+ font-weight: 600;
2216
+ color: var(--color-text);
2217
+ }
2218
+
2219
+ .report-dialog-close {
2220
+ display: flex;
2221
+ align-items: center;
2222
+ justify-content: center;
2223
+ border: none;
2224
+ background: none;
2225
+ cursor: pointer;
2226
+ color: var(--color-text-secondary);
2227
+ padding: 4px;
2228
+ border-radius: var(--radius-sm);
2229
+ }
2230
+
2231
+ .report-dialog-close:hover {
2232
+ background: var(--color-hover);
2233
+ color: var(--color-text);
2234
+ }
2235
+
2236
+ .report-dialog-body {
2237
+ flex: 1;
2238
+ overflow-y: auto;
2239
+ padding: var(--space-md);
2240
+ font-size: 0.8125rem;
2241
+ line-height: 1.6;
2242
+ color: var(--color-text);
2243
+ }
2244
+
2245
+ .report-dialog-body h1,
2246
+ .report-dialog-body h2,
2247
+ .report-dialog-body h3,
2248
+ .report-dialog-body h4 {
2249
+ margin: 0.75em 0 0.25em;
2250
+ font-weight: 600;
2251
+ }
2252
+ .report-dialog-body h1 { font-size: 1.1rem; }
2253
+ .report-dialog-body h2 { font-size: 1rem; }
2254
+ .report-dialog-body h3 { font-size: 0.9375rem; }
2255
+
2256
+ .report-dialog-body p { margin: 0.5em 0; }
2257
+
2258
+ .report-dialog-body img {
2259
+ max-width: 100%;
2260
+ height: auto;
2261
+ }
2262
+
2263
+ .report-dialog-body ul,
2264
+ .report-dialog-body ol {
2265
+ margin: 0.5em 0;
2266
+ padding-left: 1.5em;
2267
+ }
2268
+
2269
+ .report-dialog-body code {
2270
+ font-size: 0.8em;
2271
+ background: var(--color-hover);
2272
+ padding: 0.15em 0.35em;
2273
+ border-radius: 4px;
2274
+ }
2275
+
2276
+ .report-dialog-body pre {
2277
+ background: var(--color-bg);
2278
+ border-radius: var(--radius-sm);
2279
+ padding: var(--space-sm);
2280
+ overflow-x: auto;
2281
+ margin: 0.5em 0;
2282
+ }
2283
+
2284
+ .report-dialog-body pre code {
2285
+ background: none;
2286
+ padding: 0;
2287
+ }
2288
+
2289
+ .report-dialog-body table {
2290
+ border-collapse: collapse;
2291
+ width: 100%;
2292
+ margin: 0.5em 0;
2293
+ }
2294
+
2295
+ .report-dialog-body th,
2296
+ .report-dialog-body td {
2297
+ border: 1px solid var(--color-border);
2298
+ padding: 0.35em 0.6em;
2299
+ text-align: left;
2300
+ }
2301
+
2302
+ .report-dialog-body th {
2303
+ background: var(--color-bg);
2304
+ font-weight: 600;
2305
+ }
2306
+
2307
+ .chat-typing-indicator {
2308
+ display: flex;
2309
+ align-items: center;
2310
+ gap: 4px;
2311
+ padding: 4px 0;
2312
+ }
2313
+
2314
+ .chat-typing-indicator span {
2315
+ width: 6px;
2316
+ height: 6px;
2317
+ border-radius: 50%;
2318
+ background: var(--color-muted);
2319
+ animation: chat-typing 1.4s infinite;
2320
+ }
2321
+
2322
+ .chat-typing-indicator span:nth-child(2) {
2323
+ animation-delay: 0.2s;
2324
+ }
2325
+
2326
+ .chat-typing-indicator span:nth-child(3) {
2327
+ animation-delay: 0.4s;
2328
+ }
2329
+
2330
+ @keyframes chat-typing {
2331
+ 0%, 60%, 100% { opacity: 0.3; transform: scale(0.8); }
2332
+ 30% { opacity: 1; transform: scale(1); }
2333
+ }
2334
+
2335
+ /* ===== Pair consent ===== */
2336
+ .pair-consent {
2337
+ font-size: 0.75rem;
2338
+ color: var(--color-muted);
2339
+ text-align: center;
2340
+ line-height: 1.5;
2341
+ }
2342
+
2343
+ .pair-consent a {
2344
+ color: var(--color-muted);
2345
+ text-decoration: underline;
2346
+ }
2347
+
2348
+ .pair-consent a:hover {
2349
+ color: var(--color-text-secondary);
2350
+ }
2351
+
2352
+ /* ===== Dashboard content wrapper ===== */
2353
+ .dashboard-content {
2354
+ display: flex;
2355
+ flex-direction: column;
2356
+ flex: 1;
2357
+ min-height: 100dvh;
2358
+ max-width: 800px;
2359
+ margin: 0 auto;
2360
+ width: 100%;
2361
+ }
2362
+
2363
+ /* ===== Desktop persistent sidebar ===== */
2364
+ .drawer-panel-desktop {
2365
+ position: sticky;
2366
+ top: 0;
2367
+ height: 100dvh;
2368
+ width: 280px;
2369
+ min-width: 280px;
2370
+ background: var(--color-surface);
2371
+ border-right: 1px solid var(--color-border);
2372
+ display: flex;
2373
+ flex-direction: column;
2374
+ overflow-y: auto;
2375
+ animation: none;
2376
+ }
2377
+
2378
+ /* ===== Desktop adjustments ===== */
2379
+ @media (min-width: 768px) {
2380
+ .dashboard {
2381
+ flex-direction: row;
2382
+ }
2383
+
2384
+ .dashboard-main {
2385
+ padding: var(--space-lg);
2386
+ }
2387
+ }