@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,1176 @@
1
+ /* Hanzo AI Browser Extension Sidebar — Monochrome Vibrancy */
2
+
3
+ :root {
4
+ --bg-primary: #000000;
5
+ --bg-secondary: #0A0A0A;
6
+ --bg-tertiary: #141414;
7
+ --bg-hover: #1F1F1F;
8
+
9
+ --text-primary: #FFFFFF;
10
+ --text-secondary: #A0A0A0;
11
+ --text-tertiary: #6B6B6B;
12
+
13
+ --accent: #FFFFFF;
14
+ --accent-hover: #D4D4D4;
15
+ --accent-dim: rgba(255,255,255,0.06);
16
+ --accent-glow: rgba(255,255,255,0.03);
17
+
18
+ --success: #4CAF50;
19
+ --warning: #FFC107;
20
+ --error: #F44336;
21
+
22
+ --border: rgba(255,255,255,0.08);
23
+ --border-strong: rgba(255,255,255,0.14);
24
+ --glass: rgba(255,255,255,0.04);
25
+ --glass-strong: rgba(255,255,255,0.07);
26
+ --shadow: 0 4px 12px rgba(0,0,0,0.6);
27
+ --shadow-lg: 0 8px 32px rgba(0,0,0,0.5);
28
+ }
29
+
30
+ * {
31
+ margin: 0;
32
+ padding: 0;
33
+ box-sizing: border-box;
34
+ }
35
+
36
+ body {
37
+ font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Inter', 'Segoe UI', sans-serif;
38
+ background: var(--bg-primary);
39
+ color: var(--text-primary);
40
+ font-size: 13px;
41
+ line-height: 1.6;
42
+ overflow-x: hidden;
43
+ -webkit-font-smoothing: antialiased;
44
+ -moz-osx-font-smoothing: grayscale;
45
+ }
46
+
47
+ .hidden { display: none !important; }
48
+
49
+ /* ==================== Shimmer Keyframes ==================== */
50
+
51
+ @keyframes shimmer {
52
+ 0% { background-position: -200% 0; }
53
+ 100% { background-position: 200% 0; }
54
+ }
55
+
56
+ @keyframes breathe {
57
+ 0%, 100% { opacity: 0.5; }
58
+ 50% { opacity: 1; }
59
+ }
60
+
61
+ @keyframes fadeIn {
62
+ from { opacity: 0; transform: translateY(4px); }
63
+ to { opacity: 1; transform: translateY(0); }
64
+ }
65
+
66
+ @keyframes slideUp {
67
+ from { transform: translateY(20px); opacity: 0; }
68
+ to { transform: translateY(0); opacity: 1; }
69
+ }
70
+
71
+ @keyframes typingBounce {
72
+ 0%, 60%, 100% { transform: translateY(0); }
73
+ 30% { transform: translateY(-4px); }
74
+ }
75
+
76
+ @keyframes glowPulse {
77
+ 0%, 100% { box-shadow: 0 0 0 0 rgba(255,255,255,0); }
78
+ 50% { box-shadow: 0 0 12px 2px rgba(255,255,255,0.06); }
79
+ }
80
+
81
+ @keyframes pulse {
82
+ 0%, 100% { opacity: 1; }
83
+ 50% { opacity: 0.5; }
84
+ }
85
+
86
+ /* ==================== Layout ==================== */
87
+
88
+ .sidebar-container {
89
+ width: 320px;
90
+ height: 100vh;
91
+ display: flex;
92
+ flex-direction: column;
93
+ background: var(--bg-secondary);
94
+ border-left: 1px solid var(--border);
95
+ position: relative;
96
+ }
97
+
98
+ /* Ambient glow behind sidebar */
99
+ .sidebar-container::before {
100
+ content: '';
101
+ position: absolute;
102
+ top: 0;
103
+ left: 0;
104
+ right: 0;
105
+ height: 200px;
106
+ background: radial-gradient(ellipse at 50% 0%, rgba(255,255,255,0.03) 0%, transparent 70%);
107
+ pointer-events: none;
108
+ z-index: 0;
109
+ }
110
+
111
+ /* ==================== Header ==================== */
112
+
113
+ .sidebar-header {
114
+ display: flex;
115
+ align-items: center;
116
+ justify-content: space-between;
117
+ padding: 12px 16px;
118
+ border-bottom: 1px solid var(--border);
119
+ background: rgba(0,0,0,0.6);
120
+ backdrop-filter: blur(20px) saturate(180%);
121
+ -webkit-backdrop-filter: blur(20px) saturate(180%);
122
+ flex-shrink: 0;
123
+ position: relative;
124
+ z-index: 10;
125
+ }
126
+
127
+ .brand {
128
+ display: flex;
129
+ align-items: center;
130
+ gap: 10px;
131
+ font-weight: 600;
132
+ font-size: 15px;
133
+ letter-spacing: -0.01em;
134
+ }
135
+
136
+ .logo {
137
+ width: 22px;
138
+ height: 22px;
139
+ color: var(--accent);
140
+ filter: drop-shadow(0 0 6px rgba(255,255,255,0.15));
141
+ transition: filter 0.3s ease;
142
+ }
143
+
144
+ .logo:hover {
145
+ filter: drop-shadow(0 0 10px rgba(255,255,255,0.3));
146
+ }
147
+
148
+ .header-right {
149
+ display: flex;
150
+ align-items: center;
151
+ gap: 8px;
152
+ }
153
+
154
+ .user-badge {
155
+ width: 28px;
156
+ height: 28px;
157
+ border-radius: 50%;
158
+ overflow: hidden;
159
+ cursor: pointer;
160
+ border: 1px solid var(--border);
161
+ transition: border-color 0.2s, box-shadow 0.2s;
162
+ }
163
+
164
+ .user-badge:hover {
165
+ border-color: var(--border-strong);
166
+ box-shadow: 0 0 8px rgba(255,255,255,0.08);
167
+ }
168
+
169
+ .header-avatar {
170
+ width: 100%;
171
+ height: 100%;
172
+ object-fit: cover;
173
+ }
174
+
175
+ /* ==================== Auth ==================== */
176
+
177
+ .auth-section {
178
+ flex: 1;
179
+ display: flex;
180
+ align-items: center;
181
+ justify-content: center;
182
+ padding: 32px 20px;
183
+ }
184
+
185
+ .auth-card {
186
+ text-align: center;
187
+ }
188
+
189
+ .auth-logo {
190
+ width: 56px;
191
+ height: 56px;
192
+ color: var(--text-primary);
193
+ margin-bottom: 20px;
194
+ }
195
+
196
+ .auth-card h2 {
197
+ font-size: 18px;
198
+ font-weight: 600;
199
+ margin-bottom: 8px;
200
+ }
201
+
202
+ .auth-card p {
203
+ color: var(--text-secondary);
204
+ font-size: 13px;
205
+ margin-bottom: 24px;
206
+ line-height: 1.5;
207
+ }
208
+
209
+ /* In-chat login prompt */
210
+ .chat-login-prompt {
211
+ display: flex;
212
+ align-items: center;
213
+ justify-content: center;
214
+ padding: 40px 20px;
215
+ flex: 1;
216
+ animation: fadeIn 0.4s ease;
217
+ }
218
+
219
+ .auth-card.compact {
220
+ text-align: center;
221
+ max-width: 260px;
222
+ }
223
+
224
+ .auth-card.compact .auth-headline {
225
+ font-size: 16px;
226
+ font-weight: 600;
227
+ color: var(--text-primary);
228
+ margin-bottom: 4px;
229
+ }
230
+
231
+ .auth-card.compact .auth-sub {
232
+ font-size: 12px;
233
+ color: var(--text-tertiary);
234
+ margin-bottom: 20px;
235
+ }
236
+
237
+ .auth-card.compact .primary-btn {
238
+ width: 100%;
239
+ margin-bottom: 16px;
240
+ }
241
+
242
+ .auth-card.compact .auth-note {
243
+ font-size: 11px;
244
+ color: var(--text-tertiary);
245
+ margin-bottom: 0;
246
+ }
247
+
248
+ .auth-card.compact .auth-note a {
249
+ color: var(--text-secondary);
250
+ text-decoration: underline;
251
+ text-underline-offset: 2px;
252
+ }
253
+
254
+ .auth-card.compact .auth-note a:hover {
255
+ color: var(--text-primary);
256
+ }
257
+
258
+ /* Glass login card */
259
+ .chat-modern-login-card {
260
+ width: min(320px, 100%);
261
+ border: 1px solid var(--border-strong);
262
+ border-radius: 14px;
263
+ background: var(--glass-strong);
264
+ backdrop-filter: blur(24px) saturate(180%);
265
+ -webkit-backdrop-filter: blur(24px) saturate(180%);
266
+ color: var(--text-primary);
267
+ box-shadow: var(--shadow-lg), inset 0 1px 0 rgba(255,255,255,0.05);
268
+ padding: 28px 24px;
269
+ animation: fadeIn 0.5s ease;
270
+ }
271
+
272
+ .chat-modern-login-card .chat-modern-auth-btn {
273
+ width: 100%;
274
+ margin-bottom: 14px;
275
+ }
276
+
277
+ .chat-modern-login-card .auth-note {
278
+ font-size: 11px;
279
+ color: var(--text-tertiary);
280
+ margin: 0;
281
+ }
282
+
283
+ .chat-modern-login-card .auth-note a {
284
+ color: var(--text-secondary);
285
+ text-decoration: underline;
286
+ text-underline-offset: 2px;
287
+ }
288
+
289
+ .chat-modern-login-card .auth-note a:hover {
290
+ color: var(--text-primary);
291
+ }
292
+
293
+ /* ==================== Tab Bar ==================== */
294
+
295
+ .tab-bar {
296
+ display: flex;
297
+ border-bottom: 1px solid var(--border);
298
+ background: rgba(0,0,0,0.5);
299
+ backdrop-filter: blur(16px) saturate(180%);
300
+ -webkit-backdrop-filter: blur(16px) saturate(180%);
301
+ flex-shrink: 0;
302
+ position: relative;
303
+ z-index: 10;
304
+ }
305
+
306
+ .tab {
307
+ flex: 1;
308
+ padding: 10px 8px;
309
+ background: none;
310
+ border: none;
311
+ border-bottom: 2px solid transparent;
312
+ color: var(--text-secondary);
313
+ font-size: 13px;
314
+ font-weight: 500;
315
+ cursor: pointer;
316
+ display: flex;
317
+ align-items: center;
318
+ justify-content: center;
319
+ gap: 4px;
320
+ transition: all 0.25s ease;
321
+ position: relative;
322
+ }
323
+
324
+ .tab:hover {
325
+ color: var(--text-primary);
326
+ background: var(--glass);
327
+ }
328
+
329
+ .tab.active {
330
+ color: var(--accent);
331
+ border-bottom-color: var(--accent);
332
+ }
333
+
334
+ /* Shimmer on active tab */
335
+ .tab.active::after {
336
+ content: '';
337
+ position: absolute;
338
+ bottom: -1px;
339
+ left: 20%;
340
+ right: 20%;
341
+ height: 1px;
342
+ background: linear-gradient(90deg, transparent, rgba(255,255,255,0.4), transparent);
343
+ animation: shimmer 3s infinite linear;
344
+ background-size: 200% 100%;
345
+ }
346
+
347
+ /* ==================== Tab Content ==================== */
348
+
349
+ .tab-content {
350
+ flex: 1;
351
+ display: flex;
352
+ flex-direction: column;
353
+ overflow: hidden;
354
+ animation: fadeIn 0.2s ease;
355
+ }
356
+
357
+ .tools-scroll,
358
+ .settings-scroll {
359
+ flex: 1;
360
+ overflow-y: auto;
361
+ padding: 16px;
362
+ display: flex;
363
+ flex-direction: column;
364
+ gap: 16px;
365
+ }
366
+
367
+ /* ==================== Chat ==================== */
368
+
369
+ .chat-messages {
370
+ flex: 1;
371
+ overflow-y: auto;
372
+ padding: 16px;
373
+ display: flex;
374
+ flex-direction: column;
375
+ gap: 12px;
376
+ }
377
+
378
+ .chat-welcome {
379
+ text-align: center;
380
+ color: var(--text-tertiary);
381
+ padding: 40px 20px;
382
+ font-size: 13px;
383
+ animation: breathe 4s infinite ease-in-out;
384
+ }
385
+
386
+ .msg {
387
+ max-width: 90%;
388
+ padding: 10px 14px;
389
+ border-radius: 12px;
390
+ font-size: 13px;
391
+ line-height: 1.5;
392
+ word-wrap: break-word;
393
+ animation: fadeIn 0.3s ease;
394
+ }
395
+
396
+ .msg-user {
397
+ align-self: flex-end;
398
+ background: var(--glass-strong);
399
+ backdrop-filter: blur(12px);
400
+ -webkit-backdrop-filter: blur(12px);
401
+ color: var(--text-primary);
402
+ border: 1px solid var(--border);
403
+ border-bottom-right-radius: 4px;
404
+ }
405
+
406
+ .msg-assistant {
407
+ align-self: flex-start;
408
+ background: var(--bg-tertiary);
409
+ color: var(--text-primary);
410
+ border-bottom-left-radius: 4px;
411
+ border: 1px solid var(--border);
412
+ }
413
+
414
+ .msg-assistant pre {
415
+ background: var(--bg-primary);
416
+ border: 1px solid var(--border);
417
+ border-radius: 6px;
418
+ padding: 10px 12px;
419
+ margin: 8px 0;
420
+ overflow-x: auto;
421
+ font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;
422
+ font-size: 12px;
423
+ line-height: 1.4;
424
+ }
425
+
426
+ .msg-assistant code {
427
+ font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;
428
+ font-size: 12px;
429
+ background: rgba(255,255,255,0.06);
430
+ padding: 2px 5px;
431
+ border-radius: 3px;
432
+ }
433
+
434
+ .msg-assistant pre code {
435
+ background: none;
436
+ padding: 0;
437
+ }
438
+
439
+ .msg-error {
440
+ align-self: center;
441
+ background: var(--error);
442
+ color: white;
443
+ font-size: 12px;
444
+ padding: 6px 12px;
445
+ border-radius: 6px;
446
+ }
447
+
448
+ .typing-indicator {
449
+ align-self: flex-start;
450
+ color: var(--text-tertiary);
451
+ font-size: 12px;
452
+ padding: 6px 0;
453
+ display: flex;
454
+ align-items: center;
455
+ gap: 4px;
456
+ }
457
+
458
+ .typing-indicator span {
459
+ display: inline-block;
460
+ width: 6px;
461
+ height: 6px;
462
+ background: var(--text-tertiary);
463
+ border-radius: 50%;
464
+ animation: typingBounce 1.4s infinite;
465
+ }
466
+
467
+ .typing-indicator span:nth-child(2) { animation-delay: 0.2s; }
468
+ .typing-indicator span:nth-child(3) { animation-delay: 0.4s; }
469
+
470
+ /* Chat Input */
471
+
472
+ .chat-input-area {
473
+ border-top: 1px solid var(--border);
474
+ padding: 12px 16px;
475
+ background: rgba(0,0,0,0.5);
476
+ backdrop-filter: blur(20px) saturate(180%);
477
+ -webkit-backdrop-filter: blur(20px) saturate(180%);
478
+ flex-shrink: 0;
479
+ position: relative;
480
+ z-index: 10;
481
+ }
482
+
483
+ .chat-modern-composer {
484
+ display: flex;
485
+ flex-direction: column;
486
+ gap: 8px;
487
+ }
488
+
489
+ .model-selector {
490
+ margin-bottom: 8px;
491
+ }
492
+
493
+ .model-selector select {
494
+ width: 100%;
495
+ padding: 6px 10px;
496
+ background: var(--glass-strong);
497
+ border: 1px solid var(--border);
498
+ border-radius: 6px;
499
+ color: var(--text-primary);
500
+ font-size: 12px;
501
+ cursor: pointer;
502
+ backdrop-filter: blur(8px);
503
+ -webkit-backdrop-filter: blur(8px);
504
+ transition: border-color 0.2s;
505
+ }
506
+
507
+ .model-selector select:focus {
508
+ border-color: var(--border-strong);
509
+ outline: none;
510
+ }
511
+
512
+ .chat-flags {
513
+ display: flex;
514
+ align-items: center;
515
+ gap: 10px;
516
+ margin-bottom: 8px;
517
+ }
518
+
519
+ .flag-toggle {
520
+ display: inline-flex;
521
+ align-items: center;
522
+ gap: 4px;
523
+ font-size: 11px;
524
+ color: var(--text-secondary);
525
+ user-select: none;
526
+ }
527
+
528
+ .flag-toggle input[type="checkbox"] {
529
+ width: 14px;
530
+ height: 14px;
531
+ accent-color: var(--accent);
532
+ }
533
+
534
+ .rag-status {
535
+ margin-left: auto;
536
+ font-size: 11px;
537
+ color: var(--text-tertiary);
538
+ }
539
+
540
+ .input-row {
541
+ display: flex;
542
+ gap: 8px;
543
+ align-items: flex-end;
544
+ }
545
+
546
+ .input-row textarea {
547
+ flex: 1;
548
+ padding: 10px 14px;
549
+ background: var(--glass-strong);
550
+ border: 1px solid var(--border);
551
+ border-radius: 10px;
552
+ color: var(--text-primary);
553
+ font-size: 13px;
554
+ font-family: inherit;
555
+ line-height: 1.4;
556
+ resize: none;
557
+ outline: none;
558
+ max-height: 120px;
559
+ transition: border-color 0.2s, box-shadow 0.2s;
560
+ backdrop-filter: blur(8px);
561
+ -webkit-backdrop-filter: blur(8px);
562
+ }
563
+
564
+ .input-row textarea:focus {
565
+ border-color: var(--border-strong);
566
+ box-shadow: 0 0 0 1px rgba(255,255,255,0.08);
567
+ }
568
+
569
+ .chat-modern-input {
570
+ min-height: 40px;
571
+ }
572
+
573
+ .send-btn {
574
+ width: 36px;
575
+ height: 36px;
576
+ display: flex;
577
+ align-items: center;
578
+ justify-content: center;
579
+ background: var(--accent);
580
+ border: none;
581
+ border-radius: 10px;
582
+ color: #000000;
583
+ cursor: pointer;
584
+ flex-shrink: 0;
585
+ transition: all 0.2s;
586
+ }
587
+
588
+ .send-btn:hover {
589
+ background: var(--accent-hover);
590
+ box-shadow: 0 0 12px rgba(255,255,255,0.15);
591
+ }
592
+
593
+ .send-btn:disabled {
594
+ opacity: 0.3;
595
+ cursor: not-allowed;
596
+ box-shadow: none;
597
+ }
598
+
599
+ .send-btn svg {
600
+ width: 16px;
601
+ height: 16px;
602
+ }
603
+
604
+ /* ==================== Buttons ==================== */
605
+
606
+ .icon-btn {
607
+ width: 32px;
608
+ height: 32px;
609
+ display: flex;
610
+ align-items: center;
611
+ justify-content: center;
612
+ background: transparent;
613
+ border: none;
614
+ border-radius: 6px;
615
+ color: var(--text-secondary);
616
+ cursor: pointer;
617
+ transition: all 0.2s;
618
+ }
619
+
620
+ .icon-btn:hover {
621
+ background: var(--glass-strong);
622
+ color: var(--text-primary);
623
+ }
624
+
625
+ .icon-btn.small {
626
+ width: 24px;
627
+ height: 24px;
628
+ }
629
+
630
+ .icon-btn svg {
631
+ width: 18px;
632
+ height: 18px;
633
+ }
634
+
635
+ .primary-btn {
636
+ width: 100%;
637
+ padding: 10px 16px;
638
+ background: var(--accent);
639
+ color: #000000;
640
+ border: none;
641
+ border-radius: 8px;
642
+ font-weight: 600;
643
+ font-size: 13px;
644
+ cursor: pointer;
645
+ transition: all 0.25s ease;
646
+ position: relative;
647
+ overflow: hidden;
648
+ }
649
+
650
+ /* Shimmer sweep on primary buttons */
651
+ .primary-btn::after {
652
+ content: '';
653
+ position: absolute;
654
+ top: 0;
655
+ left: -100%;
656
+ width: 100%;
657
+ height: 100%;
658
+ background: linear-gradient(90deg, transparent, rgba(255,255,255,0.2), transparent);
659
+ transition: left 0.5s ease;
660
+ }
661
+
662
+ .primary-btn:hover {
663
+ background: var(--accent-hover);
664
+ box-shadow: 0 0 16px rgba(255,255,255,0.12);
665
+ }
666
+
667
+ .primary-btn:hover::after {
668
+ left: 100%;
669
+ }
670
+
671
+ .primary-btn:disabled {
672
+ opacity: 0.4;
673
+ cursor: not-allowed;
674
+ }
675
+
676
+ .secondary-btn {
677
+ width: 100%;
678
+ padding: 8px 16px;
679
+ background: var(--glass-strong);
680
+ color: var(--text-primary);
681
+ border: 1px solid var(--border);
682
+ border-radius: 8px;
683
+ font-size: 12px;
684
+ cursor: pointer;
685
+ transition: all 0.2s;
686
+ backdrop-filter: blur(8px);
687
+ -webkit-backdrop-filter: blur(8px);
688
+ }
689
+
690
+ .secondary-btn:hover {
691
+ background: var(--glass);
692
+ border-color: var(--border-strong);
693
+ box-shadow: 0 0 8px rgba(255,255,255,0.05);
694
+ }
695
+
696
+ .action-btn {
697
+ flex: 1;
698
+ display: flex;
699
+ align-items: center;
700
+ justify-content: center;
701
+ gap: 8px;
702
+ padding: 10px;
703
+ background: var(--glass-strong);
704
+ border: 1px solid var(--border);
705
+ border-radius: 8px;
706
+ color: var(--text-primary);
707
+ font-size: 12px;
708
+ font-weight: 500;
709
+ cursor: pointer;
710
+ transition: all 0.25s ease;
711
+ backdrop-filter: blur(8px);
712
+ -webkit-backdrop-filter: blur(8px);
713
+ }
714
+
715
+ .action-btn:hover {
716
+ background: var(--glass);
717
+ border-color: var(--border-strong);
718
+ box-shadow: 0 0 12px rgba(255,255,255,0.06);
719
+ }
720
+
721
+ .action-btn svg {
722
+ width: 16px;
723
+ height: 16px;
724
+ }
725
+
726
+ /* ==================== Glass Panels ==================== */
727
+
728
+ .panel {
729
+ background: var(--glass-strong);
730
+ backdrop-filter: blur(16px) saturate(150%);
731
+ -webkit-backdrop-filter: blur(16px) saturate(150%);
732
+ border: 1px solid var(--border);
733
+ border-radius: 10px;
734
+ padding: 16px;
735
+ transition: border-color 0.3s, box-shadow 0.3s;
736
+ position: relative;
737
+ overflow: hidden;
738
+ }
739
+
740
+ /* Subtle top highlight on glass panels */
741
+ .panel::before {
742
+ content: '';
743
+ position: absolute;
744
+ top: 0;
745
+ left: 0;
746
+ right: 0;
747
+ height: 1px;
748
+ background: linear-gradient(90deg, transparent 10%, rgba(255,255,255,0.08) 50%, transparent 90%);
749
+ }
750
+
751
+ .panel:hover {
752
+ border-color: var(--border-strong);
753
+ }
754
+
755
+ .panel h3 {
756
+ font-size: 11px;
757
+ font-weight: 600;
758
+ color: var(--text-secondary);
759
+ margin-bottom: 12px;
760
+ text-transform: uppercase;
761
+ letter-spacing: 0.5px;
762
+ }
763
+
764
+ .panel-header {
765
+ display: flex;
766
+ align-items: center;
767
+ justify-content: space-between;
768
+ margin-bottom: 12px;
769
+ }
770
+
771
+ .badge {
772
+ background: var(--accent-dim);
773
+ color: var(--accent);
774
+ padding: 2px 8px;
775
+ border-radius: 12px;
776
+ font-size: 11px;
777
+ font-weight: 600;
778
+ }
779
+
780
+ /* Status Rows */
781
+ .status-row {
782
+ display: flex;
783
+ justify-content: space-between;
784
+ align-items: center;
785
+ padding: 8px 0;
786
+ border-bottom: 1px solid var(--border);
787
+ }
788
+
789
+ .status-row:last-child { border-bottom: none; }
790
+
791
+ .status-row span:first-child {
792
+ color: var(--text-secondary);
793
+ font-size: 12px;
794
+ }
795
+
796
+ .status-value {
797
+ display: flex;
798
+ align-items: center;
799
+ gap: 6px;
800
+ font-size: 12px;
801
+ font-weight: 500;
802
+ }
803
+
804
+ .status-indicator {
805
+ width: 8px;
806
+ height: 8px;
807
+ border-radius: 50%;
808
+ background: var(--text-tertiary);
809
+ transition: all 0.3s;
810
+ }
811
+
812
+ .status-indicator.connected {
813
+ background: var(--success);
814
+ box-shadow: 0 0 8px rgba(76, 175, 80, 0.3);
815
+ animation: glowPulse 3s infinite;
816
+ }
817
+
818
+ .status-indicator.warning {
819
+ background: var(--warning);
820
+ box-shadow: 0 0 8px rgba(255, 193, 7, 0.2);
821
+ }
822
+
823
+ .status-indicator.disconnected {
824
+ background: var(--error);
825
+ box-shadow: 0 0 8px rgba(244, 67, 54, 0.2);
826
+ }
827
+
828
+ .mono {
829
+ font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;
830
+ font-size: 11px;
831
+ }
832
+
833
+ .tool-list-wrap {
834
+ margin-top: 10px;
835
+ padding-top: 10px;
836
+ border-top: 1px solid var(--border);
837
+ }
838
+
839
+ .tool-list-header {
840
+ color: var(--text-secondary);
841
+ font-size: 11px;
842
+ margin-bottom: 6px;
843
+ }
844
+
845
+ .tool-list {
846
+ max-height: 90px;
847
+ overflow-y: auto;
848
+ font-size: 11px;
849
+ line-height: 1.4;
850
+ color: var(--text-tertiary);
851
+ font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;
852
+ }
853
+
854
+ /* ==================== User Profile ==================== */
855
+
856
+ .user-profile {
857
+ display: flex;
858
+ align-items: center;
859
+ gap: 12px;
860
+ }
861
+
862
+ .user-avatar {
863
+ width: 36px;
864
+ height: 36px;
865
+ border-radius: 50%;
866
+ background: var(--accent-dim);
867
+ border: 1px solid var(--border);
868
+ }
869
+
870
+ .user-details { flex: 1; }
871
+
872
+ .user-name {
873
+ font-weight: 600;
874
+ font-size: 13px;
875
+ }
876
+
877
+ .user-email {
878
+ color: var(--text-secondary);
879
+ font-size: 11px;
880
+ }
881
+
882
+ /* ==================== Agent List ==================== */
883
+
884
+ .agent-list {
885
+ display: flex;
886
+ flex-direction: column;
887
+ gap: 8px;
888
+ }
889
+
890
+ .agent-item {
891
+ display: flex;
892
+ align-items: center;
893
+ gap: 10px;
894
+ padding: 10px;
895
+ background: var(--glass);
896
+ border: 1px solid var(--border);
897
+ border-radius: 6px;
898
+ transition: all 0.2s;
899
+ }
900
+
901
+ .agent-item:hover {
902
+ background: var(--glass-strong);
903
+ border-color: var(--border-strong);
904
+ }
905
+
906
+ .agent-icon {
907
+ width: 32px;
908
+ height: 32px;
909
+ background: var(--accent-dim);
910
+ border-radius: 6px;
911
+ display: flex;
912
+ align-items: center;
913
+ justify-content: center;
914
+ color: var(--accent);
915
+ }
916
+
917
+ .agent-info { flex: 1; }
918
+ .agent-name { font-weight: 500; font-size: 13px; }
919
+ .agent-status { color: var(--text-secondary); font-size: 11px; }
920
+ .agent-actions { display: flex; gap: 4px; }
921
+
922
+ /* ==================== Tab Filesystem ==================== */
923
+
924
+ .tab-filesystem {
925
+ max-height: 200px;
926
+ overflow-y: auto;
927
+ font-family: 'SF Mono', 'Monaco', 'Consolas', monospace;
928
+ font-size: 12px;
929
+ }
930
+
931
+ .tab-item {
932
+ display: flex;
933
+ align-items: center;
934
+ gap: 6px;
935
+ padding: 6px 8px;
936
+ border-radius: 4px;
937
+ cursor: pointer;
938
+ transition: all 0.2s;
939
+ }
940
+
941
+ .tab-item:hover { background: var(--glass-strong); }
942
+
943
+ .tab-item.active {
944
+ background: var(--accent-dim);
945
+ color: var(--accent);
946
+ }
947
+
948
+ /* ==================== Settings ==================== */
949
+
950
+ .setting-item {
951
+ display: flex;
952
+ align-items: center;
953
+ justify-content: space-between;
954
+ padding: 8px 0;
955
+ }
956
+
957
+ .setting-item span {
958
+ font-size: 12px;
959
+ color: var(--text-secondary);
960
+ }
961
+
962
+ .setting-item input[type="text"],
963
+ .setting-item input[type="password"],
964
+ .setting-item select {
965
+ width: 140px;
966
+ padding: 6px 10px;
967
+ background: var(--glass-strong);
968
+ border: 1px solid var(--border);
969
+ border-radius: 6px;
970
+ color: var(--text-primary);
971
+ font-size: 12px;
972
+ transition: border-color 0.2s;
973
+ }
974
+
975
+ .setting-item input:focus,
976
+ .setting-item select:focus {
977
+ border-color: var(--border-strong);
978
+ outline: none;
979
+ }
980
+
981
+ .setting-item-column {
982
+ flex-direction: column;
983
+ align-items: flex-start;
984
+ gap: 6px;
985
+ }
986
+
987
+ .setting-item-column input[type="text"],
988
+ .setting-item-column input[type="password"] {
989
+ width: 100%;
990
+ }
991
+
992
+ .setting-item input[type="number"] {
993
+ width: 70px;
994
+ padding: 6px 10px;
995
+ background: var(--glass-strong);
996
+ border: 1px solid var(--border);
997
+ border-radius: 6px;
998
+ color: var(--text-primary);
999
+ font-size: 12px;
1000
+ transition: border-color 0.2s;
1001
+ }
1002
+
1003
+ .setting-item input[type="number"]:focus {
1004
+ border-color: var(--border-strong);
1005
+ outline: none;
1006
+ }
1007
+
1008
+ .setting-item input[type="checkbox"] {
1009
+ width: 16px;
1010
+ height: 16px;
1011
+ cursor: pointer;
1012
+ accent-color: var(--accent);
1013
+ }
1014
+
1015
+ .settings-links {
1016
+ display: flex;
1017
+ justify-content: center;
1018
+ gap: 16px;
1019
+ padding: 8px 0;
1020
+ }
1021
+
1022
+ .settings-links a {
1023
+ color: var(--text-secondary);
1024
+ font-size: 12px;
1025
+ text-decoration: none;
1026
+ transition: color 0.2s;
1027
+ }
1028
+
1029
+ .settings-links a:hover {
1030
+ color: var(--accent);
1031
+ }
1032
+
1033
+ /* ==================== Actions ==================== */
1034
+
1035
+ .actions {
1036
+ display: flex;
1037
+ gap: 8px;
1038
+ }
1039
+
1040
+ /* ==================== Empty State ==================== */
1041
+
1042
+ .empty-state {
1043
+ text-align: center;
1044
+ padding: 20px;
1045
+ color: var(--text-tertiary);
1046
+ font-size: 12px;
1047
+ }
1048
+
1049
+ /* ==================== Notification ==================== */
1050
+
1051
+ .notification {
1052
+ position: fixed;
1053
+ bottom: 16px;
1054
+ left: 16px;
1055
+ right: 16px;
1056
+ padding: 10px 16px;
1057
+ background: var(--glass-strong);
1058
+ backdrop-filter: blur(20px);
1059
+ -webkit-backdrop-filter: blur(20px);
1060
+ border: 1px solid var(--border);
1061
+ border-radius: 8px;
1062
+ color: var(--text-primary);
1063
+ font-size: 12px;
1064
+ text-align: center;
1065
+ z-index: 200;
1066
+ animation: slideUp 0.3s ease;
1067
+ }
1068
+
1069
+ .notification.error {
1070
+ background: var(--error);
1071
+ border-color: var(--error);
1072
+ }
1073
+
1074
+ /* ==================== Scrollbar ==================== */
1075
+
1076
+ ::-webkit-scrollbar { width: 5px; height: 5px; }
1077
+ ::-webkit-scrollbar-track { background: transparent; }
1078
+ ::-webkit-scrollbar-thumb { background: rgba(255,255,255,0.08); border-radius: 3px; }
1079
+ ::-webkit-scrollbar-thumb:hover { background: rgba(255,255,255,0.14); }
1080
+
1081
+ /* ==================== Loading ==================== */
1082
+
1083
+ .loading { animation: pulse 1.5s infinite; }
1084
+
1085
+ /* ==================== Agent Launcher Modal ==================== */
1086
+
1087
+ .modal-overlay {
1088
+ position: fixed;
1089
+ top: 0;
1090
+ left: 0;
1091
+ right: 0;
1092
+ bottom: 0;
1093
+ background: rgba(0, 0, 0, 0.7);
1094
+ backdrop-filter: blur(8px);
1095
+ -webkit-backdrop-filter: blur(8px);
1096
+ display: flex;
1097
+ align-items: center;
1098
+ justify-content: center;
1099
+ z-index: 1000;
1100
+ animation: fadeIn 0.15s ease;
1101
+ }
1102
+
1103
+ .modal-content {
1104
+ background: var(--bg-secondary);
1105
+ border: 1px solid var(--border-strong);
1106
+ border-radius: 12px;
1107
+ width: calc(100% - 32px);
1108
+ max-width: 320px;
1109
+ overflow: hidden;
1110
+ box-shadow: var(--shadow-lg);
1111
+ backdrop-filter: blur(24px);
1112
+ -webkit-backdrop-filter: blur(24px);
1113
+ }
1114
+
1115
+ .modal-header {
1116
+ display: flex;
1117
+ align-items: center;
1118
+ justify-content: space-between;
1119
+ padding: 12px 16px;
1120
+ border-bottom: 1px solid var(--border);
1121
+ }
1122
+
1123
+ .modal-header h3 {
1124
+ margin: 0;
1125
+ font-size: 14px;
1126
+ font-weight: 600;
1127
+ color: var(--text-primary);
1128
+ }
1129
+
1130
+ .close-modal {
1131
+ background: none;
1132
+ border: none;
1133
+ color: var(--text-secondary);
1134
+ font-size: 20px;
1135
+ cursor: pointer;
1136
+ padding: 0 4px;
1137
+ line-height: 1;
1138
+ }
1139
+
1140
+ .close-modal:hover {
1141
+ color: var(--text-primary);
1142
+ }
1143
+
1144
+ .modal-body {
1145
+ padding: 16px;
1146
+ }
1147
+
1148
+ .modal-body textarea {
1149
+ width: 100%;
1150
+ background: var(--glass-strong);
1151
+ border: 1px solid var(--border);
1152
+ border-radius: 6px;
1153
+ color: var(--text-primary);
1154
+ padding: 8px;
1155
+ font-family: inherit;
1156
+ font-size: 12px;
1157
+ resize: vertical;
1158
+ }
1159
+
1160
+ .modal-footer {
1161
+ display: flex;
1162
+ gap: 8px;
1163
+ padding: 12px 16px;
1164
+ border-top: 1px solid var(--border);
1165
+ justify-content: flex-end;
1166
+ }
1167
+
1168
+ .cancel-modal {
1169
+ padding: 6px 16px;
1170
+ font-size: 12px;
1171
+ }
1172
+
1173
+ .launch-modal {
1174
+ padding: 6px 16px;
1175
+ font-size: 12px;
1176
+ }