@hanzo/browser-extension 1.7.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 (134) hide show
  1. package/.github/workflows/docs.yml +44 -0
  2. package/.github/workflows/release.yml +55 -0
  3. package/LICENSE +21 -0
  4. package/README.md +126 -0
  5. package/dist/browser-extension/README.md +43 -0
  6. package/dist/browser-extension/ai-worker.js +30 -0
  7. package/dist/browser-extension/background-firefox.js +617 -0
  8. package/dist/browser-extension/background.js +2737 -0
  9. package/dist/browser-extension/browser-control.js +683 -0
  10. package/dist/browser-extension/cdp-bridge-server.js +444 -0
  11. package/dist/browser-extension/chrome/ai-worker.js +571 -0
  12. package/dist/browser-extension/chrome/background.js +2737 -0
  13. package/dist/browser-extension/chrome/callback.html +17 -0
  14. package/dist/browser-extension/chrome/content-script.js +1270 -0
  15. package/dist/browser-extension/chrome/icon128.png +0 -0
  16. package/dist/browser-extension/chrome/icon16.png +0 -0
  17. package/dist/browser-extension/chrome/icon32.png +0 -0
  18. package/dist/browser-extension/chrome/icon48.png +0 -0
  19. package/dist/browser-extension/chrome/manifest.json +57 -0
  20. package/dist/browser-extension/chrome/popup.css +519 -0
  21. package/dist/browser-extension/chrome/popup.html +242 -0
  22. package/dist/browser-extension/chrome/popup.js +267 -0
  23. package/dist/browser-extension/chrome/sidebar.css +1176 -0
  24. package/dist/browser-extension/chrome/sidebar.html +280 -0
  25. package/dist/browser-extension/chrome/sidebar.js +778 -0
  26. package/dist/browser-extension/cli.js +233 -0
  27. package/dist/browser-extension/content-script.js +1270 -0
  28. package/dist/browser-extension/firefox/ai-worker.js +571 -0
  29. package/dist/browser-extension/firefox/background.js +617 -0
  30. package/dist/browser-extension/firefox/callback.html +17 -0
  31. package/dist/browser-extension/firefox/content-script.js +1270 -0
  32. package/dist/browser-extension/firefox/icon128.png +0 -0
  33. package/dist/browser-extension/firefox/icon16.png +0 -0
  34. package/dist/browser-extension/firefox/icon32.png +0 -0
  35. package/dist/browser-extension/firefox/icon48.png +0 -0
  36. package/dist/browser-extension/firefox/manifest.json +66 -0
  37. package/dist/browser-extension/firefox/popup.css +519 -0
  38. package/dist/browser-extension/firefox/popup.html +242 -0
  39. package/dist/browser-extension/firefox/popup.js +267 -0
  40. package/dist/browser-extension/firefox/sidebar.css +1176 -0
  41. package/dist/browser-extension/firefox/sidebar.html +280 -0
  42. package/dist/browser-extension/firefox/sidebar.js +778 -0
  43. package/dist/browser-extension/hanzo-browser-extension-firefox-1.1.0.zip +0 -0
  44. package/dist/browser-extension/icon128.png +0 -0
  45. package/dist/browser-extension/icon16.png +0 -0
  46. package/dist/browser-extension/icon32.png +0 -0
  47. package/dist/browser-extension/icon48.png +0 -0
  48. package/dist/browser-extension/manifest.json +57 -0
  49. package/dist/browser-extension/package.json +41 -0
  50. package/dist/browser-extension/popup.css +468 -0
  51. package/dist/browser-extension/popup.html +191 -0
  52. package/dist/browser-extension/popup.js +267 -0
  53. package/dist/browser-extension/safari/Info.plist +21 -0
  54. package/dist/browser-extension/safari/ai-worker.js +571 -0
  55. package/dist/browser-extension/safari/background.js +2737 -0
  56. package/dist/browser-extension/safari/callback.html +17 -0
  57. package/dist/browser-extension/safari/content-script.js +1270 -0
  58. package/dist/browser-extension/safari/icon128.png +0 -0
  59. package/dist/browser-extension/safari/icon16.png +0 -0
  60. package/dist/browser-extension/safari/icon32.png +0 -0
  61. package/dist/browser-extension/safari/icon48.png +0 -0
  62. package/dist/browser-extension/safari/popup.css +519 -0
  63. package/dist/browser-extension/safari/popup.html +242 -0
  64. package/dist/browser-extension/safari/popup.js +267 -0
  65. package/dist/browser-extension/safari/sidebar.css +1176 -0
  66. package/dist/browser-extension/safari/sidebar.html +280 -0
  67. package/dist/browser-extension/safari/sidebar.js +778 -0
  68. package/dist/browser-extension/sidebar.css +718 -0
  69. package/dist/browser-extension/sidebar.html +184 -0
  70. package/dist/browser-extension/sidebar.js +778 -0
  71. package/dist/browser-extension/webgpu-ai.js +495 -0
  72. package/dist/cdp-bridge-server.js +411 -0
  73. package/dist/safari/Hanzo AI/Hanzo AI.xcodeproj/project.pbxproj +1047 -0
  74. package/dist/safari/Hanzo AI/Hanzo AI.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
  75. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AccentColor.colorset/Contents.json +11 -0
  76. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/Contents.json +98 -0
  77. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-128@1x.png +0 -0
  78. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-128@2x.png +0 -0
  79. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-16@1x.png +0 -0
  80. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-16@2x.png +0 -0
  81. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-256@1x.png +0 -0
  82. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-256@2x.png +0 -0
  83. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-32@1x.png +0 -0
  84. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-32@2x.png +0 -0
  85. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-512@1x.png +0 -0
  86. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-512@2x.png +0 -0
  87. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/universal-icon-1024@1x.png +0 -0
  88. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/Contents.json +6 -0
  89. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/LargeIcon.imageset/Contents.json +21 -0
  90. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/LargeIcon.imageset/icon128.png +0 -0
  91. package/dist/safari/Hanzo AI/Shared (App)/Resources/Base.lproj/Main.html +20 -0
  92. package/dist/safari/Hanzo AI/Shared (App)/Resources/Icon.png +0 -0
  93. package/dist/safari/Hanzo AI/Shared (App)/Resources/Script.js +24 -0
  94. package/dist/safari/Hanzo AI/Shared (App)/Resources/Style.css +61 -0
  95. package/dist/safari/Hanzo AI/Shared (App)/ViewController.swift +81 -0
  96. package/dist/safari/Hanzo AI/Shared (Extension)/SafariWebExtensionHandler.swift +42 -0
  97. package/dist/safari/Hanzo AI/iOS (App)/AppDelegate.swift +24 -0
  98. package/dist/safari/Hanzo AI/iOS (App)/Base.lproj/LaunchScreen.storyboard +36 -0
  99. package/dist/safari/Hanzo AI/iOS (App)/Base.lproj/Main.storyboard +38 -0
  100. package/dist/safari/Hanzo AI/iOS (App)/Info.plist +27 -0
  101. package/dist/safari/Hanzo AI/iOS (App)/SceneDelegate.swift +18 -0
  102. package/dist/safari/Hanzo AI/iOS (Extension)/Info.plist +13 -0
  103. package/dist/safari/Hanzo AI/macOS (App)/AppDelegate.swift +21 -0
  104. package/dist/safari/Hanzo AI/macOS (App)/Base.lproj/Main.storyboard +124 -0
  105. package/dist/safari/Hanzo AI/macOS (App)/Info.plist +8 -0
  106. package/dist/safari/Hanzo AI/macOS (Extension)/Info.plist +13 -0
  107. package/docs/_config.yml +13 -0
  108. package/docs/_layouts/default.html +435 -0
  109. package/docs/index.md +54 -0
  110. package/install-extension.sh +75 -0
  111. package/manifest.json +29 -0
  112. package/package.json +32 -0
  113. package/src/ai-worker.js +571 -0
  114. package/src/callback.html +17 -0
  115. package/src/chat-widget.tsx +93 -0
  116. package/src/icon128.png +0 -0
  117. package/src/icon16.png +0 -0
  118. package/src/icon32.png +0 -0
  119. package/src/icon48.png +0 -0
  120. package/src/manifest-firefox.json +66 -0
  121. package/src/manifest.json +57 -0
  122. package/src/package.json +41 -0
  123. package/src/popup.css +519 -0
  124. package/src/popup.html +242 -0
  125. package/src/popup.js +192 -0
  126. package/src/sidebar.css +1176 -0
  127. package/src/sidebar.html +280 -0
  128. package/src/sidebar.js +884 -0
  129. package/src/webgpu.d.ts +131 -0
  130. package/test/claude-integration.test.ts +251 -0
  131. package/test/server-frameworks-edge-cases.test.ts +145 -0
  132. package/test/server-frameworks.test.ts +395 -0
  133. package/test-cdp-connection.js +140 -0
  134. package/tsconfig.json +19 -0
@@ -0,0 +1,718 @@
1
+ /* Hanzo AI Browser Extension Sidebar — macOS Vibrancy Theme */
2
+
3
+ :root {
4
+ --bg-primary: #0D0D0D;
5
+ --bg-secondary: rgba(18, 18, 18, 0.85);
6
+ --bg-tertiary: rgba(30, 30, 30, 0.7);
7
+ --bg-hover: rgba(45, 45, 45, 0.6);
8
+ --bg-glass: rgba(24, 24, 24, 0.65);
9
+
10
+ --text-primary: rgba(255, 255, 255, 0.92);
11
+ --text-secondary: rgba(255, 255, 255, 0.5);
12
+ --text-tertiary: rgba(255, 255, 255, 0.28);
13
+
14
+ --accent: rgba(255, 255, 255, 0.88);
15
+ --accent-hover: rgba(255, 255, 255, 1);
16
+ --accent-dim: rgba(255, 255, 255, 0.06);
17
+ --accent-glow: rgba(255, 255, 255, 0.04);
18
+
19
+ --success: rgba(120, 200, 130, 0.9);
20
+ --warning: rgba(240, 200, 80, 0.9);
21
+ --error: rgba(220, 80, 80, 0.9);
22
+
23
+ --border: rgba(255, 255, 255, 0.07);
24
+ --border-light: rgba(255, 255, 255, 0.04);
25
+
26
+ --shimmer: linear-gradient(
27
+ 105deg,
28
+ transparent 40%,
29
+ rgba(255, 255, 255, 0.03) 45%,
30
+ rgba(255, 255, 255, 0.06) 50%,
31
+ rgba(255, 255, 255, 0.03) 55%,
32
+ transparent 60%
33
+ );
34
+ }
35
+
36
+ * {
37
+ margin: 0;
38
+ padding: 0;
39
+ box-sizing: border-box;
40
+ }
41
+
42
+ body {
43
+ font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Inter', 'Segoe UI', sans-serif;
44
+ background: var(--bg-primary);
45
+ color: var(--text-primary);
46
+ font-size: 13px;
47
+ line-height: 1.6;
48
+ overflow-x: hidden;
49
+ -webkit-font-smoothing: antialiased;
50
+ }
51
+
52
+ .hidden { display: none !important; }
53
+
54
+ .sidebar-container {
55
+ width: 320px;
56
+ height: 100vh;
57
+ display: flex;
58
+ flex-direction: column;
59
+ background: var(--bg-secondary);
60
+ backdrop-filter: blur(40px) saturate(1.2);
61
+ -webkit-backdrop-filter: blur(40px) saturate(1.2);
62
+ border-left: 1px solid var(--border);
63
+ position: relative;
64
+ }
65
+
66
+ /* Subtle ambient glow at top */
67
+ .sidebar-container::before {
68
+ content: '';
69
+ position: absolute;
70
+ top: -80px;
71
+ left: 50%;
72
+ transform: translateX(-50%);
73
+ width: 200px;
74
+ height: 200px;
75
+ background: radial-gradient(circle, rgba(255,255,255,0.03) 0%, transparent 70%);
76
+ pointer-events: none;
77
+ z-index: 0;
78
+ }
79
+
80
+ /* Header */
81
+ .sidebar-header {
82
+ display: flex;
83
+ align-items: center;
84
+ justify-content: space-between;
85
+ padding: 14px 16px;
86
+ border-bottom: 1px solid var(--border);
87
+ background: rgba(10, 10, 10, 0.6);
88
+ backdrop-filter: blur(30px);
89
+ flex-shrink: 0;
90
+ position: relative;
91
+ z-index: 1;
92
+ }
93
+
94
+ .brand {
95
+ display: flex;
96
+ align-items: center;
97
+ gap: 10px;
98
+ font-weight: 500;
99
+ font-size: 14px;
100
+ letter-spacing: 0.02em;
101
+ color: var(--text-primary);
102
+ }
103
+
104
+ .logo {
105
+ width: 20px;
106
+ height: 20px;
107
+ color: var(--text-secondary);
108
+ opacity: 0.8;
109
+ transition: opacity 0.4s ease;
110
+ }
111
+
112
+ .brand:hover .logo { opacity: 1; }
113
+
114
+ .header-user { display: flex; align-items: center; }
115
+ .header-avatar {
116
+ width: 22px;
117
+ height: 22px;
118
+ border-radius: 50%;
119
+ background: var(--accent-dim);
120
+ border: 1px solid var(--border);
121
+ transition: transform 0.3s ease, box-shadow 0.3s ease;
122
+ }
123
+ .header-avatar:hover {
124
+ transform: scale(1.1);
125
+ box-shadow: 0 0 12px rgba(255,255,255,0.08);
126
+ }
127
+
128
+ /* Auth Gate */
129
+ .auth-gate {
130
+ flex: 1;
131
+ display: flex;
132
+ align-items: center;
133
+ justify-content: center;
134
+ padding: 20px;
135
+ position: relative;
136
+ z-index: 1;
137
+ }
138
+
139
+ .auth-gate-inner {
140
+ text-align: center;
141
+ max-width: 240px;
142
+ animation: fadeIn 0.8s ease;
143
+ }
144
+
145
+ .auth-logo {
146
+ width: 44px;
147
+ height: 44px;
148
+ color: var(--text-secondary);
149
+ margin-bottom: 20px;
150
+ opacity: 0.6;
151
+ animation: breathe 4s ease-in-out infinite;
152
+ }
153
+
154
+ @keyframes breathe {
155
+ 0%, 100% { opacity: 0.4; transform: scale(1); }
156
+ 50% { opacity: 0.7; transform: scale(1.04); }
157
+ }
158
+
159
+ .auth-gate h2 {
160
+ font-size: 17px;
161
+ font-weight: 500;
162
+ margin-bottom: 8px;
163
+ letter-spacing: -0.01em;
164
+ }
165
+
166
+ .auth-subtitle {
167
+ color: var(--text-tertiary);
168
+ margin-bottom: 28px;
169
+ font-size: 13px;
170
+ }
171
+
172
+ /* Tab Bar */
173
+ .tab-bar {
174
+ display: flex;
175
+ border-bottom: 1px solid var(--border);
176
+ background: rgba(10, 10, 10, 0.4);
177
+ backdrop-filter: blur(20px);
178
+ flex-shrink: 0;
179
+ position: relative;
180
+ z-index: 1;
181
+ }
182
+
183
+ .tab {
184
+ flex: 1;
185
+ padding: 10px 0;
186
+ background: none;
187
+ border: none;
188
+ border-bottom: 1.5px solid transparent;
189
+ color: var(--text-tertiary);
190
+ font-size: 11px;
191
+ font-weight: 500;
192
+ letter-spacing: 0.03em;
193
+ text-transform: uppercase;
194
+ cursor: pointer;
195
+ transition: all 0.3s ease;
196
+ display: flex;
197
+ align-items: center;
198
+ justify-content: center;
199
+ gap: 4px;
200
+ }
201
+
202
+ .tab:hover { color: var(--text-secondary); }
203
+ .tab.active {
204
+ color: var(--text-primary);
205
+ border-bottom-color: rgba(255, 255, 255, 0.4);
206
+ }
207
+
208
+ /* Tab Content */
209
+ .tab-content {
210
+ flex: 1;
211
+ display: none;
212
+ flex-direction: column;
213
+ overflow: hidden;
214
+ position: relative;
215
+ z-index: 1;
216
+ }
217
+
218
+ .tab-content.active {
219
+ display: flex;
220
+ animation: fadeIn 0.3s ease;
221
+ }
222
+
223
+ @keyframes fadeIn {
224
+ from { opacity: 0; transform: translateY(4px); }
225
+ to { opacity: 1; transform: translateY(0); }
226
+ }
227
+
228
+ /* Chat Messages */
229
+ .chat-messages {
230
+ flex: 1;
231
+ overflow-y: auto;
232
+ padding: 16px;
233
+ display: flex;
234
+ flex-direction: column;
235
+ gap: 10px;
236
+ }
237
+
238
+ .chat-welcome {
239
+ text-align: center;
240
+ color: var(--text-tertiary);
241
+ padding: 48px 20px;
242
+ font-size: 13px;
243
+ animation: fadeIn 1s ease;
244
+ }
245
+
246
+ .chat-msg {
247
+ max-width: 88%;
248
+ padding: 10px 14px;
249
+ border-radius: 14px;
250
+ font-size: 13px;
251
+ line-height: 1.55;
252
+ word-break: break-word;
253
+ animation: msgIn 0.3s ease;
254
+ position: relative;
255
+ }
256
+
257
+ @keyframes msgIn {
258
+ from { opacity: 0; transform: translateY(8px) scale(0.98); }
259
+ to { opacity: 1; transform: translateY(0) scale(1); }
260
+ }
261
+
262
+ .chat-msg.user {
263
+ align-self: flex-end;
264
+ background: rgba(255, 255, 255, 0.1);
265
+ color: var(--text-primary);
266
+ border-bottom-right-radius: 4px;
267
+ backdrop-filter: blur(8px);
268
+ }
269
+
270
+ .chat-msg.assistant {
271
+ align-self: flex-start;
272
+ background: var(--bg-glass);
273
+ color: var(--text-primary);
274
+ border-bottom-left-radius: 4px;
275
+ backdrop-filter: blur(8px);
276
+ border: 1px solid var(--border-light);
277
+ }
278
+
279
+ /* Shimmer effect on new assistant messages */
280
+ .chat-msg.assistant::after {
281
+ content: '';
282
+ position: absolute;
283
+ inset: 0;
284
+ border-radius: inherit;
285
+ background: var(--shimmer);
286
+ background-size: 300% 100%;
287
+ animation: shimmer 2s ease forwards;
288
+ pointer-events: none;
289
+ opacity: 0;
290
+ }
291
+
292
+ @keyframes shimmer {
293
+ 0% { opacity: 1; background-position: 200% center; }
294
+ 100% { opacity: 0; background-position: -100% center; }
295
+ }
296
+
297
+ .chat-msg.error {
298
+ align-self: center;
299
+ background: rgba(220, 80, 80, 0.15);
300
+ color: var(--error);
301
+ font-size: 12px;
302
+ padding: 8px 14px;
303
+ border: 1px solid rgba(220, 80, 80, 0.2);
304
+ }
305
+
306
+ /* Markdown in assistant messages */
307
+ .chat-msg code {
308
+ background: rgba(255,255,255,0.06);
309
+ padding: 1px 6px;
310
+ border-radius: 4px;
311
+ font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;
312
+ font-size: 12px;
313
+ }
314
+
315
+ .chat-msg pre {
316
+ background: rgba(0, 0, 0, 0.4);
317
+ padding: 12px 14px;
318
+ border-radius: 8px;
319
+ overflow-x: auto;
320
+ margin: 8px 0;
321
+ border: 1px solid var(--border-light);
322
+ }
323
+
324
+ .chat-msg pre code {
325
+ background: none;
326
+ padding: 0;
327
+ font-size: 11px;
328
+ line-height: 1.6;
329
+ }
330
+
331
+ /* Typing indicator */
332
+ .typing-indicator {
333
+ display: flex;
334
+ gap: 5px;
335
+ padding: 12px 16px;
336
+ align-self: flex-start;
337
+ }
338
+
339
+ .typing-indicator span {
340
+ width: 5px;
341
+ height: 5px;
342
+ border-radius: 50%;
343
+ background: var(--text-tertiary);
344
+ animation: typePulse 1.4s ease-in-out infinite;
345
+ }
346
+
347
+ .typing-indicator span:nth-child(2) { animation-delay: 0.15s; }
348
+ .typing-indicator span:nth-child(3) { animation-delay: 0.3s; }
349
+
350
+ @keyframes typePulse {
351
+ 0%, 60%, 100% { opacity: 0.2; transform: scale(0.8); }
352
+ 30% { opacity: 0.8; transform: scale(1.2); }
353
+ }
354
+
355
+ /* Chat Input */
356
+ .chat-input-area {
357
+ border-top: 1px solid var(--border);
358
+ background: rgba(10, 10, 10, 0.5);
359
+ backdrop-filter: blur(20px);
360
+ padding: 10px 12px;
361
+ flex-shrink: 0;
362
+ }
363
+
364
+ .model-selector {
365
+ margin-bottom: 8px;
366
+ }
367
+
368
+ .model-selector select {
369
+ width: 100%;
370
+ padding: 5px 10px;
371
+ background: rgba(255, 255, 255, 0.04);
372
+ border: 1px solid var(--border);
373
+ border-radius: 6px;
374
+ color: var(--text-secondary);
375
+ font-size: 11px;
376
+ cursor: pointer;
377
+ transition: border-color 0.3s ease;
378
+ -webkit-appearance: none;
379
+ }
380
+
381
+ .model-selector select:focus {
382
+ outline: none;
383
+ border-color: rgba(255, 255, 255, 0.15);
384
+ }
385
+
386
+ .chat-input-row {
387
+ display: flex;
388
+ gap: 8px;
389
+ align-items: flex-end;
390
+ }
391
+
392
+ .chat-input-row textarea {
393
+ flex: 1;
394
+ padding: 9px 12px;
395
+ background: rgba(255, 255, 255, 0.04);
396
+ border: 1px solid var(--border);
397
+ border-radius: 10px;
398
+ color: var(--text-primary);
399
+ font-size: 13px;
400
+ font-family: inherit;
401
+ resize: none;
402
+ max-height: 120px;
403
+ line-height: 1.4;
404
+ transition: border-color 0.3s ease, box-shadow 0.3s ease;
405
+ }
406
+
407
+ .chat-input-row textarea:focus {
408
+ outline: none;
409
+ border-color: rgba(255, 255, 255, 0.15);
410
+ box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.03);
411
+ }
412
+
413
+ .chat-input-row textarea::placeholder {
414
+ color: var(--text-tertiary);
415
+ }
416
+
417
+ .send-btn {
418
+ width: 34px;
419
+ height: 34px;
420
+ display: flex;
421
+ align-items: center;
422
+ justify-content: center;
423
+ background: rgba(255, 255, 255, 0.1);
424
+ border: 1px solid var(--border);
425
+ border-radius: 10px;
426
+ color: var(--text-secondary);
427
+ cursor: pointer;
428
+ transition: all 0.3s ease;
429
+ flex-shrink: 0;
430
+ }
431
+
432
+ .send-btn:hover:not(:disabled) {
433
+ background: rgba(255, 255, 255, 0.15);
434
+ color: var(--text-primary);
435
+ box-shadow: 0 0 16px rgba(255, 255, 255, 0.05);
436
+ }
437
+ .send-btn:disabled { opacity: 0.2; cursor: not-allowed; }
438
+
439
+ /* Buttons */
440
+ .primary-btn {
441
+ width: 100%;
442
+ padding: 11px 16px;
443
+ background: rgba(255, 255, 255, 0.08);
444
+ color: var(--text-primary);
445
+ border: 1px solid rgba(255, 255, 255, 0.12);
446
+ border-radius: 10px;
447
+ font-weight: 500;
448
+ font-size: 13px;
449
+ letter-spacing: 0.01em;
450
+ cursor: pointer;
451
+ transition: all 0.3s ease;
452
+ position: relative;
453
+ overflow: hidden;
454
+ }
455
+
456
+ .primary-btn::after {
457
+ content: '';
458
+ position: absolute;
459
+ inset: 0;
460
+ background: var(--shimmer);
461
+ background-size: 300% 100%;
462
+ animation: btnShimmer 3s ease infinite;
463
+ pointer-events: none;
464
+ }
465
+
466
+ @keyframes btnShimmer {
467
+ 0% { background-position: 200% center; }
468
+ 100% { background-position: -100% center; }
469
+ }
470
+
471
+ .primary-btn:hover {
472
+ background: rgba(255, 255, 255, 0.12);
473
+ border-color: rgba(255, 255, 255, 0.18);
474
+ box-shadow: 0 2px 20px rgba(255, 255, 255, 0.04);
475
+ }
476
+
477
+ .secondary-btn {
478
+ width: 100%;
479
+ padding: 8px 12px;
480
+ background: rgba(255, 255, 255, 0.03);
481
+ color: var(--text-secondary);
482
+ border: 1px solid var(--border);
483
+ border-radius: 8px;
484
+ font-size: 12px;
485
+ cursor: pointer;
486
+ transition: all 0.3s ease;
487
+ }
488
+ .secondary-btn:hover {
489
+ background: rgba(255, 255, 255, 0.06);
490
+ color: var(--text-primary);
491
+ }
492
+
493
+ .danger-btn {
494
+ width: 100%;
495
+ padding: 8px 12px;
496
+ background: transparent;
497
+ color: var(--error);
498
+ border: 1px solid rgba(220, 80, 80, 0.25);
499
+ border-radius: 8px;
500
+ font-size: 12px;
501
+ cursor: pointer;
502
+ transition: all 0.3s ease;
503
+ margin-top: 12px;
504
+ }
505
+ .danger-btn:hover {
506
+ background: rgba(220, 80, 80, 0.1);
507
+ }
508
+
509
+ .icon-btn {
510
+ width: 28px;
511
+ height: 28px;
512
+ display: flex;
513
+ align-items: center;
514
+ justify-content: center;
515
+ background: transparent;
516
+ border: none;
517
+ border-radius: 6px;
518
+ color: var(--text-tertiary);
519
+ cursor: pointer;
520
+ transition: all 0.3s ease;
521
+ }
522
+ .icon-btn:hover {
523
+ background: rgba(255, 255, 255, 0.06);
524
+ color: var(--text-secondary);
525
+ }
526
+ .icon-btn.small { width: 24px; height: 24px; }
527
+ .icon-btn svg { width: 14px; height: 14px; }
528
+
529
+ /* Panels (Tools & Settings) */
530
+ .tab-content:not(#tab-chat) {
531
+ overflow-y: auto;
532
+ padding: 14px;
533
+ gap: 12px;
534
+ }
535
+
536
+ .panel {
537
+ background: var(--bg-glass);
538
+ backdrop-filter: blur(12px);
539
+ border: 1px solid var(--border-light);
540
+ border-radius: 12px;
541
+ padding: 14px;
542
+ margin-bottom: 10px;
543
+ transition: border-color 0.3s ease;
544
+ }
545
+
546
+ .panel:hover {
547
+ border-color: var(--border);
548
+ }
549
+
550
+ .panel h3 {
551
+ font-size: 11px;
552
+ font-weight: 600;
553
+ letter-spacing: 0.06em;
554
+ text-transform: uppercase;
555
+ color: var(--text-tertiary);
556
+ margin-bottom: 10px;
557
+ }
558
+
559
+ .panel-header {
560
+ display: flex;
561
+ align-items: center;
562
+ justify-content: space-between;
563
+ margin-bottom: 10px;
564
+ }
565
+
566
+ .badge {
567
+ background: rgba(255, 255, 255, 0.06);
568
+ color: var(--text-secondary);
569
+ padding: 2px 8px;
570
+ border-radius: 10px;
571
+ font-size: 10px;
572
+ font-weight: 600;
573
+ letter-spacing: 0.03em;
574
+ }
575
+
576
+ /* Status Rows */
577
+ .status-row {
578
+ display: flex;
579
+ justify-content: space-between;
580
+ align-items: center;
581
+ padding: 6px 0;
582
+ border-bottom: 1px solid var(--border-light);
583
+ }
584
+ .status-row:last-child { border-bottom: none; }
585
+ .status-row span:first-child { color: var(--text-tertiary); font-size: 12px; }
586
+
587
+ .status-value {
588
+ display: flex;
589
+ align-items: center;
590
+ gap: 6px;
591
+ font-size: 12px;
592
+ font-weight: 500;
593
+ color: var(--text-secondary);
594
+ }
595
+
596
+ .status-indicator {
597
+ width: 6px;
598
+ height: 6px;
599
+ border-radius: 50%;
600
+ background: var(--text-tertiary);
601
+ transition: all 0.3s ease;
602
+ }
603
+ .status-indicator.connected {
604
+ background: var(--success);
605
+ box-shadow: 0 0 8px rgba(120, 200, 130, 0.3);
606
+ }
607
+ .status-indicator.warning {
608
+ background: var(--warning);
609
+ box-shadow: 0 0 8px rgba(240, 200, 80, 0.3);
610
+ }
611
+ .status-indicator.disconnected {
612
+ background: var(--error);
613
+ box-shadow: 0 0 8px rgba(220, 80, 80, 0.3);
614
+ }
615
+
616
+ /* Settings user */
617
+ .settings-user {
618
+ display: flex;
619
+ align-items: center;
620
+ gap: 12px;
621
+ margin-bottom: 12px;
622
+ }
623
+
624
+ .user-avatar {
625
+ width: 34px;
626
+ height: 34px;
627
+ border-radius: 50%;
628
+ background: var(--accent-dim);
629
+ border: 1px solid var(--border);
630
+ }
631
+
632
+ .user-name { font-weight: 500; font-size: 13px; }
633
+ .user-email { color: var(--text-tertiary); font-size: 11px; }
634
+
635
+ /* Settings items */
636
+ .setting-item {
637
+ display: flex;
638
+ align-items: center;
639
+ justify-content: space-between;
640
+ padding: 8px 0;
641
+ }
642
+ .setting-item span { font-size: 12px; color: var(--text-secondary); }
643
+
644
+ .setting-item input[type="number"],
645
+ .setting-item select {
646
+ width: 100px;
647
+ padding: 4px 8px;
648
+ background: rgba(255, 255, 255, 0.03);
649
+ border: 1px solid var(--border);
650
+ border-radius: 6px;
651
+ color: var(--text-primary);
652
+ font-size: 12px;
653
+ transition: border-color 0.3s ease;
654
+ }
655
+
656
+ .setting-item input[type="number"]:focus,
657
+ .setting-item select:focus {
658
+ outline: none;
659
+ border-color: rgba(255, 255, 255, 0.15);
660
+ }
661
+
662
+ .setting-item input[type="checkbox"] {
663
+ width: 16px;
664
+ height: 16px;
665
+ cursor: pointer;
666
+ accent-color: rgba(255, 255, 255, 0.5);
667
+ }
668
+
669
+ /* Agent & Tab lists */
670
+ .agent-list, .tab-filesystem {
671
+ display: flex;
672
+ flex-direction: column;
673
+ gap: 3px;
674
+ }
675
+
676
+ .tab-filesystem {
677
+ max-height: 200px;
678
+ overflow-y: auto;
679
+ font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;
680
+ font-size: 11px;
681
+ }
682
+
683
+ .tab-item {
684
+ display: flex;
685
+ align-items: center;
686
+ gap: 6px;
687
+ padding: 5px 8px;
688
+ border-radius: 6px;
689
+ cursor: pointer;
690
+ transition: all 0.25s ease;
691
+ color: var(--text-secondary);
692
+ }
693
+ .tab-item:hover {
694
+ background: rgba(255, 255, 255, 0.04);
695
+ color: var(--text-primary);
696
+ }
697
+ .tab-item.active {
698
+ background: rgba(255, 255, 255, 0.06);
699
+ color: var(--text-primary);
700
+ }
701
+
702
+ .empty-state {
703
+ text-align: center;
704
+ padding: 16px;
705
+ color: var(--text-tertiary);
706
+ font-size: 12px;
707
+ }
708
+
709
+ /* Scrollbar — ultra minimal */
710
+ ::-webkit-scrollbar { width: 4px; }
711
+ ::-webkit-scrollbar-track { background: transparent; }
712
+ ::-webkit-scrollbar-thumb {
713
+ background: rgba(255, 255, 255, 0.08);
714
+ border-radius: 2px;
715
+ }
716
+ ::-webkit-scrollbar-thumb:hover {
717
+ background: rgba(255, 255, 255, 0.14);
718
+ }