@hanzo/browser-extension 1.7.6 → 1.9.33

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 (144) hide show
  1. package/LICENSE +9 -18
  2. package/dist/browser-extension/content-script.js +1642 -123
  3. package/images/icon128.png +0 -0
  4. package/images/icon16.png +0 -0
  5. package/images/icon48.png +0 -0
  6. package/manifest.json +7 -2
  7. package/package.json +28 -10
  8. package/src/answer/AnswerEngine.tsx +553 -0
  9. package/src/chat-widget.tsx +96 -0
  10. package/src/gui-primitives.tsx +116 -0
  11. package/src/icon128.png +0 -0
  12. package/src/icon16.png +0 -0
  13. package/src/icon32.png +0 -0
  14. package/src/icon48.png +0 -0
  15. package/src/manifest-firefox.json +32 -13
  16. package/src/manifest.json +35 -11
  17. package/src/newtab.css +277 -0
  18. package/src/newtab.html +13 -0
  19. package/src/package.json +1 -1
  20. package/src/popup.css +352 -110
  21. package/src/popup.html +186 -47
  22. package/src/popup.js +196 -0
  23. package/src/sidebar.css +772 -156
  24. package/src/sidebar.html +268 -85
  25. package/src/sidebar.js +885 -0
  26. package/.github/workflows/docs.yml +0 -44
  27. package/.github/workflows/release.yml +0 -55
  28. package/README.md +0 -126
  29. package/dist/browser-extension/README.md +0 -43
  30. package/dist/browser-extension/ai-worker.js +0 -30
  31. package/dist/browser-extension/background-firefox.js +0 -875
  32. package/dist/browser-extension/background.js +0 -2732
  33. package/dist/browser-extension/browser-control.js +0 -683
  34. package/dist/browser-extension/cdp-bridge-server.js +0 -444
  35. package/dist/browser-extension/chrome/ai-worker.js +0 -571
  36. package/dist/browser-extension/chrome/background.js +0 -2732
  37. package/dist/browser-extension/chrome/callback.html +0 -17
  38. package/dist/browser-extension/chrome/content-script.js +0 -1270
  39. package/dist/browser-extension/chrome/icon128.png +0 -0
  40. package/dist/browser-extension/chrome/icon16.png +0 -0
  41. package/dist/browser-extension/chrome/icon32.png +0 -0
  42. package/dist/browser-extension/chrome/icon48.png +0 -0
  43. package/dist/browser-extension/chrome/manifest.json +0 -57
  44. package/dist/browser-extension/chrome/popup.css +0 -519
  45. package/dist/browser-extension/chrome/popup.html +0 -242
  46. package/dist/browser-extension/chrome/popup.js +0 -278
  47. package/dist/browser-extension/chrome/sidebar.css +0 -1176
  48. package/dist/browser-extension/chrome/sidebar.html +0 -280
  49. package/dist/browser-extension/chrome/sidebar.js +0 -779
  50. package/dist/browser-extension/cli.js +0 -233
  51. package/dist/browser-extension/firefox/ai-worker.js +0 -571
  52. package/dist/browser-extension/firefox/background.js +0 -875
  53. package/dist/browser-extension/firefox/callback.html +0 -17
  54. package/dist/browser-extension/firefox/content-script.js +0 -1270
  55. package/dist/browser-extension/firefox/icon128.png +0 -0
  56. package/dist/browser-extension/firefox/icon16.png +0 -0
  57. package/dist/browser-extension/firefox/icon32.png +0 -0
  58. package/dist/browser-extension/firefox/icon48.png +0 -0
  59. package/dist/browser-extension/firefox/manifest.json +0 -66
  60. package/dist/browser-extension/firefox/popup.css +0 -519
  61. package/dist/browser-extension/firefox/popup.html +0 -242
  62. package/dist/browser-extension/firefox/popup.js +0 -278
  63. package/dist/browser-extension/firefox/sidebar.css +0 -1176
  64. package/dist/browser-extension/firefox/sidebar.html +0 -280
  65. package/dist/browser-extension/firefox/sidebar.js +0 -779
  66. package/dist/browser-extension/hanzo-browser-extension-firefox-1.1.0.zip +0 -0
  67. package/dist/browser-extension/icon128.png +0 -0
  68. package/dist/browser-extension/icon16.png +0 -0
  69. package/dist/browser-extension/icon32.png +0 -0
  70. package/dist/browser-extension/icon48.png +0 -0
  71. package/dist/browser-extension/manifest.json +0 -57
  72. package/dist/browser-extension/package.json +0 -41
  73. package/dist/browser-extension/popup.css +0 -468
  74. package/dist/browser-extension/popup.html +0 -191
  75. package/dist/browser-extension/popup.js +0 -278
  76. package/dist/browser-extension/safari/Info.plist +0 -21
  77. package/dist/browser-extension/safari/ai-worker.js +0 -571
  78. package/dist/browser-extension/safari/background.js +0 -2732
  79. package/dist/browser-extension/safari/callback.html +0 -17
  80. package/dist/browser-extension/safari/content-script.js +0 -1270
  81. package/dist/browser-extension/safari/icon128.png +0 -0
  82. package/dist/browser-extension/safari/icon16.png +0 -0
  83. package/dist/browser-extension/safari/icon32.png +0 -0
  84. package/dist/browser-extension/safari/icon48.png +0 -0
  85. package/dist/browser-extension/safari/popup.css +0 -519
  86. package/dist/browser-extension/safari/popup.html +0 -242
  87. package/dist/browser-extension/safari/popup.js +0 -278
  88. package/dist/browser-extension/safari/sidebar.css +0 -1176
  89. package/dist/browser-extension/safari/sidebar.html +0 -280
  90. package/dist/browser-extension/safari/sidebar.js +0 -779
  91. package/dist/browser-extension/sidebar.css +0 -718
  92. package/dist/browser-extension/sidebar.html +0 -184
  93. package/dist/browser-extension/sidebar.js +0 -779
  94. package/dist/browser-extension/webgpu-ai.js +0 -495
  95. package/dist/cdp-bridge-server.js +0 -411
  96. package/dist/hanzo-ai-chrome-1.7.2.zip +0 -0
  97. package/dist/hanzo-ai-chrome-1.7.3.zip +0 -0
  98. package/dist/hanzo-ai-firefox-1.7.2.zip +0 -0
  99. package/dist/hanzo-ai-firefox-1.7.3.zip +0 -0
  100. package/dist/safari/Hanzo AI/Hanzo AI.xcodeproj/project.pbxproj +0 -1047
  101. package/dist/safari/Hanzo AI/Hanzo AI.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  102. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AccentColor.colorset/Contents.json +0 -11
  103. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -98
  104. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-128@1x.png +0 -0
  105. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-128@2x.png +0 -0
  106. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-16@1x.png +0 -0
  107. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-16@2x.png +0 -0
  108. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-256@1x.png +0 -0
  109. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-256@2x.png +0 -0
  110. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-32@1x.png +0 -0
  111. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-32@2x.png +0 -0
  112. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-512@1x.png +0 -0
  113. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-512@2x.png +0 -0
  114. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/universal-icon-1024@1x.png +0 -0
  115. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/Contents.json +0 -6
  116. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/LargeIcon.imageset/Contents.json +0 -21
  117. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/LargeIcon.imageset/icon128.png +0 -0
  118. package/dist/safari/Hanzo AI/Shared (App)/Resources/Base.lproj/Main.html +0 -20
  119. package/dist/safari/Hanzo AI/Shared (App)/Resources/Icon.png +0 -0
  120. package/dist/safari/Hanzo AI/Shared (App)/Resources/Script.js +0 -24
  121. package/dist/safari/Hanzo AI/Shared (App)/Resources/Style.css +0 -61
  122. package/dist/safari/Hanzo AI/Shared (App)/ViewController.swift +0 -81
  123. package/dist/safari/Hanzo AI/Shared (Extension)/SafariWebExtensionHandler.swift +0 -42
  124. package/dist/safari/Hanzo AI/iOS (App)/AppDelegate.swift +0 -24
  125. package/dist/safari/Hanzo AI/iOS (App)/Base.lproj/LaunchScreen.storyboard +0 -36
  126. package/dist/safari/Hanzo AI/iOS (App)/Base.lproj/Main.storyboard +0 -38
  127. package/dist/safari/Hanzo AI/iOS (App)/Info.plist +0 -27
  128. package/dist/safari/Hanzo AI/iOS (App)/SceneDelegate.swift +0 -18
  129. package/dist/safari/Hanzo AI/iOS (Extension)/Info.plist +0 -13
  130. package/dist/safari/Hanzo AI/macOS (App)/AppDelegate.swift +0 -21
  131. package/dist/safari/Hanzo AI/macOS (App)/Base.lproj/Main.storyboard +0 -124
  132. package/dist/safari/Hanzo AI/macOS (App)/Info.plist +0 -8
  133. package/dist/safari/Hanzo AI/macOS (Extension)/Info.plist +0 -13
  134. package/docs/_config.yml +0 -13
  135. package/docs/_layouts/default.html +0 -435
  136. package/docs/index.md +0 -54
  137. package/hanzo-ai-chrome-v1.7.6.zip +0 -0
  138. package/hanzo-ai-firefox-v1.7.6.zip +0 -0
  139. package/install-extension.sh +0 -75
  140. package/test/claude-integration.test.ts +0 -251
  141. package/test/server-frameworks-edge-cases.test.ts +0 -145
  142. package/test/server-frameworks.test.ts +0 -395
  143. package/test-cdp-connection.js +0 -140
  144. package/tsconfig.json +0 -19
@@ -1,1176 +0,0 @@
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
- }