@hanzo/browser-extension 1.7.5 → 1.9.31

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 (133) hide show
  1. package/LICENSE +9 -18
  2. package/dist/browser-extension/README.md +1 -1
  3. package/dist/browser-extension/background-firefox.js +4184 -491
  4. package/dist/browser-extension/background.js +6938 -2413
  5. package/dist/browser-extension/browser-control.js +652 -18
  6. package/dist/browser-extension/chrome/background.js +6938 -2413
  7. package/dist/browser-extension/chrome/content-script.js +1642 -123
  8. package/dist/browser-extension/chrome/icon128.png +0 -0
  9. package/dist/browser-extension/chrome/icon16.png +0 -0
  10. package/dist/browser-extension/chrome/icon48.png +0 -0
  11. package/dist/browser-extension/chrome/manifest.json +20 -11
  12. package/dist/browser-extension/chrome/popup.css +352 -110
  13. package/dist/browser-extension/chrome/popup.html +159 -48
  14. package/dist/browser-extension/chrome/popup.js +1418 -46
  15. package/dist/browser-extension/chrome/sidebar.css +772 -156
  16. package/dist/browser-extension/chrome/sidebar.html +268 -85
  17. package/dist/browser-extension/chrome/sidebar.js +25846 -84
  18. package/dist/browser-extension/cli.js +2 -2
  19. package/dist/browser-extension/content-script.js +1642 -123
  20. package/dist/browser-extension/firefox/background.js +4184 -491
  21. package/dist/browser-extension/firefox/content-script.js +1642 -123
  22. package/dist/browser-extension/firefox/icon128.png +0 -0
  23. package/dist/browser-extension/firefox/icon16.png +0 -0
  24. package/dist/browser-extension/firefox/icon48.png +0 -0
  25. package/dist/browser-extension/firefox/manifest.json +24 -13
  26. package/dist/browser-extension/firefox/popup.css +352 -110
  27. package/dist/browser-extension/firefox/popup.html +159 -48
  28. package/dist/browser-extension/firefox/popup.js +1418 -46
  29. package/dist/browser-extension/firefox/sidebar.css +772 -156
  30. package/dist/browser-extension/firefox/sidebar.html +268 -85
  31. package/dist/browser-extension/firefox/sidebar.js +25846 -84
  32. package/dist/browser-extension/icon128.png +0 -0
  33. package/dist/browser-extension/icon16.png +0 -0
  34. package/dist/browser-extension/icon48.png +0 -0
  35. package/dist/browser-extension/manifest.json +20 -11
  36. package/dist/browser-extension/package.json +1 -1
  37. package/dist/browser-extension/popup.js +1418 -46
  38. package/dist/browser-extension/safari/Info.plist +3 -3
  39. package/dist/browser-extension/safari/background.js +6938 -2413
  40. package/dist/browser-extension/safari/content-script.js +1642 -123
  41. package/dist/browser-extension/safari/icon128.png +0 -0
  42. package/dist/browser-extension/safari/icon16.png +0 -0
  43. package/dist/browser-extension/safari/icon48.png +0 -0
  44. package/dist/browser-extension/safari/popup.css +352 -110
  45. package/dist/browser-extension/safari/popup.html +159 -48
  46. package/dist/browser-extension/safari/popup.js +1418 -46
  47. package/dist/browser-extension/safari/sidebar.css +772 -156
  48. package/dist/browser-extension/safari/sidebar.html +268 -85
  49. package/dist/browser-extension/safari/sidebar.js +25846 -84
  50. package/dist/browser-extension/sidebar.js +25846 -84
  51. package/dist/browser-extension/webgpu-ai.js +78 -5
  52. package/images/icon128.png +0 -0
  53. package/images/icon16.png +0 -0
  54. package/images/icon48.png +0 -0
  55. package/manifest.json +7 -2
  56. package/package.json +27 -10
  57. package/src/chat-widget.tsx +96 -0
  58. package/src/gui-primitives.tsx +116 -0
  59. package/src/icon128.png +0 -0
  60. package/src/icon16.png +0 -0
  61. package/src/icon32.png +0 -0
  62. package/src/icon48.png +0 -0
  63. package/src/manifest-firefox.json +23 -12
  64. package/src/manifest.json +19 -10
  65. package/src/package.json +1 -1
  66. package/src/popup.css +352 -110
  67. package/src/popup.html +159 -48
  68. package/src/popup.js +196 -0
  69. package/src/sidebar.css +772 -156
  70. package/src/sidebar.html +268 -85
  71. package/src/sidebar.js +885 -0
  72. package/.github/workflows/docs.yml +0 -44
  73. package/.github/workflows/release.yml +0 -55
  74. package/README.md +0 -126
  75. package/dist/browser-extension/ai-worker.js +0 -30
  76. package/dist/browser-extension/cdp-bridge-server.js +0 -444
  77. package/dist/browser-extension/chrome/icon32.png +0 -0
  78. package/dist/browser-extension/firefox/icon32.png +0 -0
  79. package/dist/browser-extension/hanzo-browser-extension-firefox-1.1.0.zip +0 -0
  80. package/dist/browser-extension/icon32.png +0 -0
  81. package/dist/browser-extension/popup.css +0 -468
  82. package/dist/browser-extension/popup.html +0 -191
  83. package/dist/browser-extension/safari/icon32.png +0 -0
  84. package/dist/browser-extension/sidebar.css +0 -718
  85. package/dist/browser-extension/sidebar.html +0 -184
  86. package/dist/cdp-bridge-server.js +0 -411
  87. package/dist/hanzo-ai-chrome-1.7.2.zip +0 -0
  88. package/dist/hanzo-ai-chrome-1.7.3.zip +0 -0
  89. package/dist/hanzo-ai-firefox-1.7.2.zip +0 -0
  90. package/dist/hanzo-ai-firefox-1.7.3.zip +0 -0
  91. package/dist/safari/Hanzo AI/Hanzo AI.xcodeproj/project.pbxproj +0 -1047
  92. package/dist/safari/Hanzo AI/Hanzo AI.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  93. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AccentColor.colorset/Contents.json +0 -11
  94. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/Contents.json +0 -98
  95. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-128@1x.png +0 -0
  96. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-128@2x.png +0 -0
  97. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-16@1x.png +0 -0
  98. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-16@2x.png +0 -0
  99. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-256@1x.png +0 -0
  100. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-256@2x.png +0 -0
  101. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-32@1x.png +0 -0
  102. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-32@2x.png +0 -0
  103. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-512@1x.png +0 -0
  104. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/mac-icon-512@2x.png +0 -0
  105. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/AppIcon.appiconset/universal-icon-1024@1x.png +0 -0
  106. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/Contents.json +0 -6
  107. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/LargeIcon.imageset/Contents.json +0 -21
  108. package/dist/safari/Hanzo AI/Shared (App)/Assets.xcassets/LargeIcon.imageset/icon128.png +0 -0
  109. package/dist/safari/Hanzo AI/Shared (App)/Resources/Base.lproj/Main.html +0 -20
  110. package/dist/safari/Hanzo AI/Shared (App)/Resources/Icon.png +0 -0
  111. package/dist/safari/Hanzo AI/Shared (App)/Resources/Script.js +0 -24
  112. package/dist/safari/Hanzo AI/Shared (App)/Resources/Style.css +0 -61
  113. package/dist/safari/Hanzo AI/Shared (App)/ViewController.swift +0 -81
  114. package/dist/safari/Hanzo AI/Shared (Extension)/SafariWebExtensionHandler.swift +0 -42
  115. package/dist/safari/Hanzo AI/iOS (App)/AppDelegate.swift +0 -24
  116. package/dist/safari/Hanzo AI/iOS (App)/Base.lproj/LaunchScreen.storyboard +0 -36
  117. package/dist/safari/Hanzo AI/iOS (App)/Base.lproj/Main.storyboard +0 -38
  118. package/dist/safari/Hanzo AI/iOS (App)/Info.plist +0 -27
  119. package/dist/safari/Hanzo AI/iOS (App)/SceneDelegate.swift +0 -18
  120. package/dist/safari/Hanzo AI/iOS (Extension)/Info.plist +0 -13
  121. package/dist/safari/Hanzo AI/macOS (App)/AppDelegate.swift +0 -21
  122. package/dist/safari/Hanzo AI/macOS (App)/Base.lproj/Main.storyboard +0 -124
  123. package/dist/safari/Hanzo AI/macOS (App)/Info.plist +0 -8
  124. package/dist/safari/Hanzo AI/macOS (Extension)/Info.plist +0 -13
  125. package/docs/_config.yml +0 -13
  126. package/docs/_layouts/default.html +0 -435
  127. package/docs/index.md +0 -54
  128. package/install-extension.sh +0 -75
  129. package/test/claude-integration.test.ts +0 -251
  130. package/test/server-frameworks-edge-cases.test.ts +0 -145
  131. package/test/server-frameworks.test.ts +0 -395
  132. package/test-cdp-connection.js +0 -140
  133. package/tsconfig.json +0 -19
Binary file
@@ -1,468 +0,0 @@
1
- /* Hanzo AI Browser Extension Popup — macOS Vibrancy Theme */
2
-
3
- :root {
4
- --bg: #0D0D0D;
5
- --surface: rgba(18, 18, 18, 0.85);
6
- --surface-light: rgba(30, 30, 30, 0.6);
7
- --glass: rgba(24, 24, 24, 0.65);
8
- --text: rgba(255, 255, 255, 0.92);
9
- --text-dim: rgba(255, 255, 255, 0.45);
10
- --text-faint: rgba(255, 255, 255, 0.25);
11
- --border: rgba(255, 255, 255, 0.07);
12
- --success: rgba(120, 200, 130, 0.9);
13
- --warning: rgba(240, 200, 80, 0.9);
14
- --error: rgba(220, 80, 80, 0.9);
15
- --shimmer: linear-gradient(
16
- 105deg,
17
- transparent 40%,
18
- rgba(255, 255, 255, 0.03) 45%,
19
- rgba(255, 255, 255, 0.06) 50%,
20
- rgba(255, 255, 255, 0.03) 55%,
21
- transparent 60%
22
- );
23
- }
24
-
25
- * {
26
- margin: 0;
27
- padding: 0;
28
- box-sizing: border-box;
29
- }
30
-
31
- body {
32
- width: 380px;
33
- font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'Inter', 'Segoe UI', sans-serif;
34
- background: var(--bg);
35
- color: var(--text);
36
- font-size: 13px;
37
- line-height: 1.5;
38
- -webkit-font-smoothing: antialiased;
39
- }
40
-
41
- .container {
42
- background: var(--surface);
43
- backdrop-filter: blur(40px) saturate(1.2);
44
- min-height: 500px;
45
- }
46
-
47
- /* Header */
48
- header {
49
- display: flex;
50
- align-items: center;
51
- gap: 12px;
52
- padding: 16px;
53
- border-bottom: 1px solid var(--border);
54
- }
55
-
56
- .logo {
57
- width: 28px;
58
- height: 28px;
59
- opacity: 0.7;
60
- transition: opacity 0.3s ease;
61
- }
62
-
63
- header:hover .logo { opacity: 0.9; }
64
-
65
- h1 {
66
- font-size: 16px;
67
- font-weight: 500;
68
- letter-spacing: -0.01em;
69
- }
70
-
71
- h2 {
72
- font-size: 15px;
73
- font-weight: 500;
74
- margin-bottom: 8px;
75
- }
76
-
77
- h3 {
78
- font-size: 11px;
79
- font-weight: 600;
80
- letter-spacing: 0.06em;
81
- text-transform: uppercase;
82
- color: var(--text-faint);
83
- margin-bottom: 12px;
84
- }
85
-
86
- /* Sections */
87
- .section {
88
- padding: 20px;
89
- animation: fadeIn 0.4s ease;
90
- }
91
-
92
- .section.hidden {
93
- display: none;
94
- }
95
-
96
- @keyframes fadeIn {
97
- from { opacity: 0; transform: translateY(4px); }
98
- to { opacity: 1; transform: translateY(0); }
99
- }
100
-
101
- .subtitle {
102
- color: var(--text-dim);
103
- margin-bottom: 20px;
104
- font-size: 13px;
105
- }
106
-
107
- /* Buttons */
108
- .btn {
109
- display: flex;
110
- align-items: center;
111
- justify-content: center;
112
- gap: 8px;
113
- width: 100%;
114
- padding: 11px 16px;
115
- border: none;
116
- border-radius: 10px;
117
- font-size: 13px;
118
- font-weight: 500;
119
- cursor: pointer;
120
- transition: all 0.3s ease;
121
- position: relative;
122
- overflow: hidden;
123
- }
124
-
125
- .btn-primary {
126
- background: rgba(255, 255, 255, 0.08);
127
- color: var(--text);
128
- border: 1px solid rgba(255, 255, 255, 0.12);
129
- }
130
-
131
- .btn-primary::after {
132
- content: '';
133
- position: absolute;
134
- inset: 0;
135
- background: var(--shimmer);
136
- background-size: 300% 100%;
137
- animation: shimmer 3s ease infinite;
138
- pointer-events: none;
139
- }
140
-
141
- @keyframes shimmer {
142
- 0% { background-position: 200% center; }
143
- 100% { background-position: -100% center; }
144
- }
145
-
146
- .btn-primary:hover {
147
- background: rgba(255, 255, 255, 0.12);
148
- border-color: rgba(255, 255, 255, 0.18);
149
- box-shadow: 0 2px 20px rgba(255, 255, 255, 0.04);
150
- }
151
-
152
- .btn-secondary {
153
- background: rgba(255, 255, 255, 0.03);
154
- color: var(--text-dim);
155
- border: 1px solid var(--border);
156
- }
157
-
158
- .btn-secondary:hover {
159
- background: rgba(255, 255, 255, 0.06);
160
- color: var(--text);
161
- }
162
-
163
- .btn-icon {
164
- width: 32px;
165
- height: 32px;
166
- padding: 0;
167
- display: flex;
168
- align-items: center;
169
- justify-content: center;
170
- background: transparent;
171
- border: none;
172
- border-radius: 8px;
173
- color: var(--text-dim);
174
- cursor: pointer;
175
- transition: all 0.3s ease;
176
- }
177
-
178
- .btn-icon:hover {
179
- background: rgba(255, 255, 255, 0.06);
180
- color: var(--text);
181
- }
182
-
183
- .icon {
184
- width: 18px;
185
- height: 18px;
186
- }
187
-
188
- /* User Info */
189
- .user-info {
190
- display: flex;
191
- align-items: center;
192
- gap: 12px;
193
- padding: 14px;
194
- background: var(--glass);
195
- backdrop-filter: blur(12px);
196
- border: 1px solid rgba(255, 255, 255, 0.04);
197
- border-radius: 10px;
198
- }
199
-
200
- .avatar {
201
- width: 36px;
202
- height: 36px;
203
- border-radius: 50%;
204
- background: rgba(255, 255, 255, 0.06);
205
- border: 1px solid var(--border);
206
- }
207
-
208
- .user-info > div {
209
- flex: 1;
210
- }
211
-
212
- .user-name {
213
- font-weight: 500;
214
- font-size: 13px;
215
- }
216
-
217
- .user-email {
218
- font-size: 11px;
219
- color: var(--text-dim);
220
- }
221
-
222
- /* Features */
223
- .features {
224
- display: flex;
225
- flex-direction: column;
226
- gap: 8px;
227
- }
228
-
229
- .feature-toggle label {
230
- display: flex;
231
- align-items: center;
232
- gap: 12px;
233
- padding: 12px;
234
- background: var(--glass);
235
- backdrop-filter: blur(8px);
236
- border: 1px solid rgba(255, 255, 255, 0.04);
237
- border-radius: 10px;
238
- cursor: pointer;
239
- transition: all 0.3s ease;
240
- }
241
-
242
- .feature-toggle label:hover {
243
- background: rgba(255, 255, 255, 0.05);
244
- border-color: var(--border);
245
- }
246
-
247
- .feature-toggle input {
248
- display: none;
249
- }
250
-
251
- .toggle {
252
- position: relative;
253
- width: 40px;
254
- height: 22px;
255
- background: rgba(255, 255, 255, 0.08);
256
- border-radius: 11px;
257
- transition: background 0.3s ease;
258
- flex-shrink: 0;
259
- }
260
-
261
- .toggle::after {
262
- content: '';
263
- position: absolute;
264
- top: 2px;
265
- left: 2px;
266
- width: 18px;
267
- height: 18px;
268
- background: rgba(255, 255, 255, 0.4);
269
- border-radius: 50%;
270
- transition: all 0.3s ease;
271
- }
272
-
273
- input:checked + .toggle {
274
- background: rgba(255, 255, 255, 0.18);
275
- }
276
-
277
- input:checked + .toggle::after {
278
- transform: translateX(18px);
279
- background: rgba(255, 255, 255, 0.85);
280
- box-shadow: 0 0 8px rgba(255, 255, 255, 0.2);
281
- }
282
-
283
- .feature-info {
284
- flex: 1;
285
- }
286
-
287
- .feature-info strong {
288
- font-weight: 500;
289
- font-size: 13px;
290
- }
291
-
292
- .feature-info small {
293
- display: block;
294
- color: var(--text-dim);
295
- font-size: 11px;
296
- }
297
-
298
- /* Status */
299
- .status {
300
- display: flex;
301
- flex-direction: column;
302
- gap: 10px;
303
- }
304
-
305
- .status-item {
306
- display: flex;
307
- align-items: center;
308
- gap: 8px;
309
- font-size: 12px;
310
- }
311
-
312
- .status-dot {
313
- width: 6px;
314
- height: 6px;
315
- border-radius: 50%;
316
- background: rgba(255, 255, 255, 0.15);
317
- transition: all 0.3s ease;
318
- }
319
-
320
- .status-dot.connected {
321
- background: var(--success);
322
- box-shadow: 0 0 8px rgba(120, 200, 130, 0.3);
323
- }
324
-
325
- .status-dot.warning {
326
- background: var(--warning);
327
- box-shadow: 0 0 8px rgba(240, 200, 80, 0.3);
328
- }
329
-
330
- .status-dot.error {
331
- background: var(--error);
332
- box-shadow: 0 0 8px rgba(220, 80, 80, 0.3);
333
- }
334
-
335
- .status-detail {
336
- margin-left: auto;
337
- font-size: 11px;
338
- color: var(--text-dim);
339
- }
340
-
341
- /* Actions */
342
- .actions {
343
- display: flex;
344
- gap: 10px;
345
- }
346
-
347
- .actions .btn {
348
- flex: 1;
349
- }
350
-
351
- /* Guide */
352
- .guide {
353
- background: var(--glass);
354
- backdrop-filter: blur(8px);
355
- border: 1px solid rgba(255, 255, 255, 0.04);
356
- padding: 14px;
357
- border-radius: 10px;
358
- }
359
-
360
- .guide h3 {
361
- margin-bottom: 8px;
362
- }
363
-
364
- .guide p {
365
- font-size: 11px;
366
- color: var(--text-dim);
367
- margin-bottom: 4px;
368
- }
369
-
370
- kbd {
371
- display: inline-block;
372
- padding: 2px 6px;
373
- background: rgba(255, 255, 255, 0.05);
374
- border: 1px solid var(--border);
375
- border-radius: 4px;
376
- font-family: 'SF Mono', monospace;
377
- font-size: 10px;
378
- color: var(--text-dim);
379
- }
380
-
381
- /* Settings */
382
- .settings-header {
383
- display: flex;
384
- align-items: center;
385
- gap: 12px;
386
- margin-bottom: 20px;
387
- }
388
-
389
- .settings-header h2 {
390
- margin: 0;
391
- }
392
-
393
- .setting-group {
394
- margin-bottom: 20px;
395
- }
396
-
397
- .setting-group label {
398
- display: block;
399
- margin-bottom: 10px;
400
- color: var(--text-dim);
401
- font-size: 12px;
402
- }
403
-
404
- .setting-group input[type="text"],
405
- .setting-group input[type="number"],
406
- .setting-group select {
407
- width: 100%;
408
- padding: 8px 12px;
409
- background: rgba(255, 255, 255, 0.03);
410
- border: 1px solid var(--border);
411
- border-radius: 8px;
412
- color: var(--text);
413
- font-size: 13px;
414
- margin-top: 4px;
415
- transition: border-color 0.3s ease;
416
- }
417
-
418
- .setting-group input:focus,
419
- .setting-group select:focus {
420
- outline: none;
421
- border-color: rgba(255, 255, 255, 0.15);
422
- }
423
-
424
- .setting-group input[type="checkbox"] {
425
- margin-right: 8px;
426
- accent-color: rgba(255, 255, 255, 0.5);
427
- }
428
-
429
- /* Utilities */
430
- .divider {
431
- height: 1px;
432
- background: var(--border);
433
- margin: 16px 0;
434
- }
435
-
436
- .help-text {
437
- text-align: center;
438
- font-size: 11px;
439
- color: var(--text-dim);
440
- margin-top: 16px;
441
- }
442
-
443
- .help-text a {
444
- color: rgba(255, 255, 255, 0.55);
445
- text-decoration: none;
446
- transition: color 0.3s ease;
447
- }
448
-
449
- .help-text a:hover {
450
- color: var(--text);
451
- }
452
-
453
- /* Animations */
454
- @keyframes pulse {
455
- 0% { opacity: 1; }
456
- 50% { opacity: 0.4; }
457
- 100% { opacity: 1; }
458
- }
459
-
460
- .status-dot.connecting {
461
- animation: pulse 1.8s ease-in-out infinite;
462
- }
463
-
464
- /* Scrollbar */
465
- ::-webkit-scrollbar { width: 4px; }
466
- ::-webkit-scrollbar-track { background: transparent; }
467
- ::-webkit-scrollbar-thumb { background: rgba(255, 255, 255, 0.08); border-radius: 2px; }
468
- ::-webkit-scrollbar-thumb:hover { background: rgba(255, 255, 255, 0.14); }
@@ -1,191 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta charset="UTF-8">
5
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>Hanzo AI Dev Assistant</title>
7
- <link rel="stylesheet" href="popup.css">
8
- </head>
9
- <body>
10
- <div class="container">
11
- <header>
12
- <img src="icon48.png" alt="Hanzo AI" class="logo">
13
- <h1>Hanzo AI</h1>
14
- </header>
15
-
16
- <!-- Login Section -->
17
- <div id="login-section" class="section">
18
- <h2>Sign In</h2>
19
- <p class="subtitle">Connect to your Hanzo AI account</p>
20
- <button id="login-btn" class="btn btn-primary">
21
- <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor">
22
- <path d="M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4M10 17l5-5-5-5M15 12H3"/>
23
- </svg>
24
- Sign in with Hanzo ID
25
- </button>
26
- <p class="help-text">
27
- <a href="https://hanzo.id/register" target="_blank">Create account</a> •
28
- <a href="https://hanzo.id/forgot" target="_blank">Forgot password?</a>
29
- </p>
30
- </div>
31
-
32
- <!-- Main Section (shown after login) -->
33
- <div id="main-section" class="section hidden">
34
- <div class="user-info">
35
- <img id="user-avatar" class="avatar" src="" alt="">
36
- <div>
37
- <div id="user-name" class="user-name"></div>
38
- <div id="user-email" class="user-email"></div>
39
- </div>
40
- <button id="logout-btn" class="btn-icon" title="Sign out">
41
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor">
42
- <path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4M16 17l5-5-5-5M21 12H9"/>
43
- </svg>
44
- </button>
45
- </div>
46
-
47
- <div class="divider"></div>
48
-
49
- <!-- Features -->
50
- <div class="features">
51
- <div class="feature-toggle">
52
- <label>
53
- <input type="checkbox" id="source-maps" checked>
54
- <span class="toggle"></span>
55
- <div class="feature-info">
56
- <strong>Source Maps</strong>
57
- <small>Click-to-code navigation</small>
58
- </div>
59
- </label>
60
- </div>
61
-
62
- <div class="feature-toggle">
63
- <label>
64
- <input type="checkbox" id="webgpu-ai" checked>
65
- <span class="toggle"></span>
66
- <div class="feature-info">
67
- <strong>WebGPU AI</strong>
68
- <small>Local AI inference</small>
69
- </div>
70
- </label>
71
- </div>
72
-
73
- <div class="feature-toggle">
74
- <label>
75
- <input type="checkbox" id="browser-control">
76
- <span class="toggle"></span>
77
- <div class="feature-info">
78
- <strong>Browser Control</strong>
79
- <small>AI browser automation</small>
80
- </div>
81
- </label>
82
- </div>
83
-
84
- <div class="feature-toggle">
85
- <label>
86
- <input type="checkbox" id="tab-filesystem">
87
- <span class="toggle"></span>
88
- <div class="feature-info">
89
- <strong>Tab Filesystem</strong>
90
- <small>Mount tabs as files</small>
91
- </div>
92
- </label>
93
- </div>
94
- </div>
95
-
96
- <div class="divider"></div>
97
-
98
- <!-- Connection Status -->
99
- <div class="status">
100
- <div class="status-item">
101
- <span class="status-dot" id="mcp-status"></span>
102
- <span>MCP Server</span>
103
- <span id="mcp-port" class="status-detail">Port 3001</span>
104
- </div>
105
- <div class="status-item">
106
- <span class="status-dot" id="gpu-status"></span>
107
- <span>WebGPU</span>
108
- <span id="gpu-detail" class="status-detail">Checking...</span>
109
- </div>
110
- </div>
111
-
112
- <div class="divider"></div>
113
-
114
- <!-- Open Chat Panel -->
115
- <button id="open-panel-btn" class="btn btn-primary" style="margin-bottom: 12px;">
116
- <svg class="icon" viewBox="0 0 24 24" fill="none" stroke="currentColor">
117
- <path d="M21 15a2 2 0 01-2 2H7l-4 4V5a2 2 0 012-2h14a2 2 0 012 2z"/>
118
- </svg>
119
- Open Chat Panel
120
- </button>
121
-
122
- <!-- Actions -->
123
- <div class="actions">
124
- <button id="test-connection" class="btn btn-secondary">Test Connection</button>
125
- <button id="open-settings" class="btn btn-secondary">Settings</button>
126
- </div>
127
-
128
- <!-- Quick Guide -->
129
- <div class="guide">
130
- <h3>Quick Guide</h3>
131
- <p><kbd>Alt</kbd> + <kbd>Click</kbd> any element to navigate to source</p>
132
- <p><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>H</kbd> to open Hanzo AI panel</p>
133
- </div>
134
- </div>
135
-
136
- <!-- Settings Section -->
137
- <div id="settings-section" class="section hidden">
138
- <div class="settings-header">
139
- <button id="back-btn" class="btn-icon">
140
- <svg viewBox="0 0 24 24" fill="none" stroke="currentColor">
141
- <path d="M19 12H5M12 19l-7-7 7-7"/>
142
- </svg>
143
- </button>
144
- <h2>Settings</h2>
145
- </div>
146
-
147
- <div class="settings-content">
148
- <div class="setting-group">
149
- <h3>Connection</h3>
150
- <label>
151
- MCP Server URL
152
- <input type="text" id="mcp-url" value="ws://localhost:3001/browser-extension">
153
- </label>
154
- </div>
155
-
156
- <div class="setting-group">
157
- <h3>AI Models</h3>
158
- <label>
159
- Local Model Path
160
- <input type="text" id="model-path" placeholder="/models/browser-control-4bit.bin">
161
- </label>
162
- <label>
163
- Model Quantization
164
- <select id="model-quant">
165
- <option value="4bit">4-bit (Fastest)</option>
166
- <option value="8bit">8-bit (Balanced)</option>
167
- <option value="fp16">FP16 (Best Quality)</option>
168
- </select>
169
- </label>
170
- </div>
171
-
172
- <div class="setting-group">
173
- <h3>Browser Control</h3>
174
- <label>
175
- <input type="checkbox" id="safe-mode" checked>
176
- Safe Mode (require confirmation for actions)
177
- </label>
178
- <label>
179
- Max Workers
180
- <input type="number" id="max-workers" value="3" min="1" max="10">
181
- </label>
182
- </div>
183
-
184
- <button id="save-settings" class="btn btn-primary">Save Settings</button>
185
- </div>
186
- </div>
187
- </div>
188
-
189
- <script src="popup.js"></script>
190
- </body>
191
- </html>