@hanzo/browser-extension 1.9.34 → 1.9.36

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 (71) hide show
  1. package/package.json +1 -1
  2. package/src/answer/AnswerEngine.tsx +8 -0
  3. package/src/onboarding.css +78 -0
  4. package/src/onboarding.html +45 -0
  5. package/src/popup.html +28 -0
  6. package/dist/browser-extension/README.md +0 -43
  7. package/dist/browser-extension/background-firefox.js +0 -5983
  8. package/dist/browser-extension/background.js +0 -8670
  9. package/dist/browser-extension/browser-control.js +0 -1317
  10. package/dist/browser-extension/chrome/ai-worker.js +0 -571
  11. package/dist/browser-extension/chrome/background.js +0 -8670
  12. package/dist/browser-extension/chrome/callback.html +0 -17
  13. package/dist/browser-extension/chrome/content-script.js +0 -2789
  14. package/dist/browser-extension/chrome/icon128.png +0 -0
  15. package/dist/browser-extension/chrome/icon16.png +0 -0
  16. package/dist/browser-extension/chrome/icon48.png +0 -0
  17. package/dist/browser-extension/chrome/manifest.json +0 -81
  18. package/dist/browser-extension/chrome/newtab.css +0 -277
  19. package/dist/browser-extension/chrome/newtab.html +0 -13
  20. package/dist/browser-extension/chrome/newtab.js +0 -64
  21. package/dist/browser-extension/chrome/popup.css +0 -761
  22. package/dist/browser-extension/chrome/popup.html +0 -381
  23. package/dist/browser-extension/chrome/popup.js +0 -1716
  24. package/dist/browser-extension/chrome/sidebar.css +0 -1792
  25. package/dist/browser-extension/chrome/sidebar.html +0 -463
  26. package/dist/browser-extension/chrome/sidebar.js +0 -26541
  27. package/dist/browser-extension/cli.js +0 -233
  28. package/dist/browser-extension/content-script.js +0 -2789
  29. package/dist/browser-extension/firefox/ai-worker.js +0 -571
  30. package/dist/browser-extension/firefox/background.js +0 -5983
  31. package/dist/browser-extension/firefox/callback.html +0 -17
  32. package/dist/browser-extension/firefox/content-script.js +0 -2789
  33. package/dist/browser-extension/firefox/icon128.png +0 -0
  34. package/dist/browser-extension/firefox/icon16.png +0 -0
  35. package/dist/browser-extension/firefox/icon48.png +0 -0
  36. package/dist/browser-extension/firefox/manifest.json +0 -85
  37. package/dist/browser-extension/firefox/newtab.css +0 -277
  38. package/dist/browser-extension/firefox/newtab.html +0 -13
  39. package/dist/browser-extension/firefox/newtab.js +0 -64
  40. package/dist/browser-extension/firefox/popup.css +0 -761
  41. package/dist/browser-extension/firefox/popup.html +0 -381
  42. package/dist/browser-extension/firefox/popup.js +0 -1716
  43. package/dist/browser-extension/firefox/sidebar.css +0 -1792
  44. package/dist/browser-extension/firefox/sidebar.html +0 -463
  45. package/dist/browser-extension/firefox/sidebar.js +0 -26541
  46. package/dist/browser-extension/icon128.png +0 -0
  47. package/dist/browser-extension/icon16.png +0 -0
  48. package/dist/browser-extension/icon48.png +0 -0
  49. package/dist/browser-extension/manifest.json +0 -81
  50. package/dist/browser-extension/newtab.js +0 -64
  51. package/dist/browser-extension/package.json +0 -41
  52. package/dist/browser-extension/popup.js +0 -1716
  53. package/dist/browser-extension/safari/Info.plist +0 -21
  54. package/dist/browser-extension/safari/ai-worker.js +0 -571
  55. package/dist/browser-extension/safari/background.js +0 -8670
  56. package/dist/browser-extension/safari/callback.html +0 -17
  57. package/dist/browser-extension/safari/content-script.js +0 -2789
  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/icon48.png +0 -0
  61. package/dist/browser-extension/safari/newtab.css +0 -277
  62. package/dist/browser-extension/safari/newtab.html +0 -13
  63. package/dist/browser-extension/safari/newtab.js +0 -64
  64. package/dist/browser-extension/safari/popup.css +0 -761
  65. package/dist/browser-extension/safari/popup.html +0 -381
  66. package/dist/browser-extension/safari/popup.js +0 -1716
  67. package/dist/browser-extension/safari/sidebar.css +0 -1792
  68. package/dist/browser-extension/safari/sidebar.html +0 -463
  69. package/dist/browser-extension/safari/sidebar.js +0 -26541
  70. package/dist/browser-extension/sidebar.js +0 -26541
  71. package/dist/browser-extension/webgpu-ai.js +0 -568
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hanzo/browser-extension",
3
- "version": "1.9.34",
3
+ "version": "1.9.36",
4
4
  "description": "Hanzo AI Browser Extension",
5
5
  "main": "dist/background.js",
6
6
  "dependencies": {
@@ -3,6 +3,7 @@ import { createAiClient, type SearchEvent, type SearchMode, type SearchSource }
3
3
  import { fetchNews, type NewsItem } from './news.js';
4
4
  import { AUTO_MODEL, fetchModelCatalog, type ChatModel, type ModelGroup } from './model-catalog.js';
5
5
  import { renderMarkdown } from './markdown.js';
6
+ import { capture, contributeTrainingSample } from '../shared/consent.js';
6
7
 
7
8
  /**
8
9
  * Hanzo Answer Engine — the shared AI-answer surface (query → streamed answer +
@@ -321,6 +322,8 @@ export function AnswerEngine({ apiBase, getToken, signIn, initialQuery }: Answer
321
322
  setFollowUps([]);
322
323
  setError('');
323
324
  setNeedAuth(false);
325
+ void capture('answer_search', { mode, model: model.id });
326
+ let fullAnswer = '';
324
327
 
325
328
  const opts = {
326
329
  mode,
@@ -346,6 +349,7 @@ export function AnswerEngine({ apiBase, getToken, signIn, initialQuery }: Answer
346
349
  setAnswerSources(ev.sources);
347
350
  break;
348
351
  case 'text':
352
+ fullAnswer += ev.delta;
349
353
  setAnswer((a) => a + ev.delta);
350
354
  break;
351
355
  case 'follow_ups':
@@ -353,6 +357,10 @@ export function AnswerEngine({ apiBase, getToken, signIn, initialQuery }: Answer
353
357
  break;
354
358
  case 'done':
355
359
  setPhase('done');
360
+ void capture('answer_shown', { mode, model: model.id });
361
+ // Opt-in only: no-ops unless the user turned on training
362
+ // contribution (the consent module gates the send).
363
+ void contributeTrainingSample({ query: question, answer: fullAnswer, model: model.id });
356
364
  break;
357
365
  case 'error':
358
366
  if (ev.error.includes('__NO_TOKEN__') || /401|invalid api key/i.test(ev.error)) {
@@ -0,0 +1,78 @@
1
+ :root {
2
+ --bg: #0b0b0c;
3
+ --card: #131315;
4
+ --line: #26262a;
5
+ --text: #f4f4f5;
6
+ --muted: #9a9aa2;
7
+ --accent: #f4f4f5;
8
+ }
9
+ * { box-sizing: border-box; }
10
+ html, body {
11
+ margin: 0;
12
+ height: 100%;
13
+ background: var(--bg);
14
+ color: var(--text);
15
+ font: 14px/1.5 -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
16
+ }
17
+ body { display: grid; place-items: center; padding: 32px; }
18
+ .card {
19
+ width: 100%;
20
+ max-width: 520px;
21
+ background: var(--card);
22
+ border: 1px solid var(--line);
23
+ border-radius: 16px;
24
+ padding: 32px;
25
+ }
26
+ .brand { font-weight: 700; letter-spacing: 0.02em; opacity: 0.7; margin-bottom: 20px; }
27
+ h1 { font-size: 24px; margin: 0 0 8px; }
28
+ .lede { color: var(--muted); margin: 0 0 24px; }
29
+ .row {
30
+ display: flex;
31
+ align-items: flex-start;
32
+ gap: 12px;
33
+ padding: 14px 0;
34
+ border-top: 1px solid var(--line);
35
+ cursor: pointer;
36
+ }
37
+ .row input { position: absolute; opacity: 0; width: 0; height: 0; }
38
+ .switch {
39
+ flex: 0 0 auto;
40
+ width: 38px;
41
+ height: 22px;
42
+ border-radius: 999px;
43
+ background: #3a3a40;
44
+ position: relative;
45
+ transition: background 0.15s;
46
+ margin-top: 2px;
47
+ }
48
+ .switch::after {
49
+ content: "";
50
+ position: absolute;
51
+ top: 2px;
52
+ left: 2px;
53
+ width: 18px;
54
+ height: 18px;
55
+ border-radius: 50%;
56
+ background: #fff;
57
+ transition: transform 0.15s;
58
+ }
59
+ .row input:checked + .switch { background: var(--accent); }
60
+ .row input:checked + .switch::after { transform: translateX(16px); background: #0b0b0c; }
61
+ .text { display: flex; flex-direction: column; gap: 2px; }
62
+ .text strong { font-weight: 600; }
63
+ .text small { color: var(--muted); }
64
+ .cta {
65
+ width: 100%;
66
+ margin-top: 24px;
67
+ padding: 12px;
68
+ border: 0;
69
+ border-radius: 10px;
70
+ background: var(--accent);
71
+ color: #0b0b0c;
72
+ font-weight: 600;
73
+ font-size: 15px;
74
+ cursor: pointer;
75
+ }
76
+ .cta:active { transform: translateY(1px); }
77
+ .fine { color: var(--muted); font-size: 12px; text-align: center; margin: 16px 0 0; }
78
+ .fine a { color: var(--text); }
@@ -0,0 +1,45 @@
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" />
6
+ <title>Welcome to Hanzo</title>
7
+ <link rel="stylesheet" href="onboarding.css" />
8
+ </head>
9
+ <body>
10
+ <main class="card">
11
+ <div class="brand">Hanzo</div>
12
+ <h1>Welcome to Hanzo AI</h1>
13
+ <p class="lede">
14
+ Search, research and browse with Hanzo's own models. Before you start,
15
+ choose what you'd like to share — you can change this anytime in settings
16
+ or on your Hanzo account.
17
+ </p>
18
+
19
+ <label class="row">
20
+ <input type="checkbox" id="ob-insights" checked />
21
+ <span class="switch"></span>
22
+ <span class="text">
23
+ <strong>Anonymous usage insights</strong>
24
+ <small>Helps us improve Hanzo. No search text, no personal data — just a random per-install id.</small>
25
+ </span>
26
+ </label>
27
+
28
+ <label class="row">
29
+ <input type="checkbox" id="ob-training" />
30
+ <span class="switch"></span>
31
+ <span class="text">
32
+ <strong>Contribute to training Hanzo's open models</strong>
33
+ <small>Share your own searches &amp; answers so Hanzo's open models get better. Opt in — off unless you turn it on.</small>
34
+ </span>
35
+ </label>
36
+
37
+ <button id="ob-continue" class="cta">Get started</button>
38
+ <p class="fine">
39
+ Signed in? These choices save to your Hanzo account and stay in sync
40
+ everywhere. <a href="https://hanzo.ai/privacy" target="_blank" rel="noopener">Privacy</a>
41
+ </p>
42
+ </main>
43
+ <script src="onboarding.js"></script>
44
+ </body>
45
+ </html>
package/src/popup.html CHANGED
@@ -222,6 +222,34 @@
222
222
 
223
223
  <div class="divider"></div>
224
224
 
225
+ <!-- Privacy & data -->
226
+ <h3>Privacy &amp; data</h3>
227
+ <div class="features">
228
+ <div class="feature-toggle">
229
+ <label>
230
+ <input type="checkbox" id="insights-enabled" checked>
231
+ <span class="toggle"></span>
232
+ <div class="feature-info">
233
+ <strong>Usage insights</strong>
234
+ <small>Anonymous, helps improve Hanzo. Never your search text.</small>
235
+ </div>
236
+ </label>
237
+ </div>
238
+
239
+ <div class="feature-toggle">
240
+ <label>
241
+ <input type="checkbox" id="share-training">
242
+ <span class="toggle"></span>
243
+ <div class="feature-info">
244
+ <strong>Contribute to training</strong>
245
+ <small>Opt in to share your searches &amp; answers to train Hanzo's open models. Off by default.</small>
246
+ </div>
247
+ </label>
248
+ </div>
249
+ </div>
250
+
251
+ <div class="divider"></div>
252
+
225
253
  <!-- Browser Backend -->
226
254
  <div class="setting-group backend-picker">
227
255
  <h3>Backend</h3>
@@ -1,43 +0,0 @@
1
- # Hanzo Browser DevTools
2
-
3
- Click-to-code navigation for web developers with MCP integration.
4
-
5
- ## Installation
6
-
7
- ```bash
8
- npm install -g @hanzoai/browser-devtools
9
- ```
10
-
11
- ## Usage
12
-
13
- 1. Start the server:
14
- ```bash
15
- hanzo-browser-server start
16
- ```
17
-
18
- 2. Install the browser extension:
19
- ```bash
20
- hanzo-browser-server install-extension
21
- ```
22
-
23
- 3. Ctrl+Click any element in your browser to navigate to its source code!
24
-
25
- ## Features
26
-
27
- - 🎯 **Source-map support** for React, Vue, Svelte
28
- - 🔍 **Fallback tagging** for legacy code
29
- - 🚀 **MCP integration** for Claude Code
30
- - ⚡ **Lightning fast** WebSocket communication
31
-
32
- ## Integration with Claude Code
33
-
34
- The server exposes element selection events that can be consumed by MCP tools:
35
-
36
- ```javascript
37
- server.on('elementSelected', (data) => {
38
- // data.file - Source file path
39
- // data.line - Line number
40
- // data.column - Column number (if available)
41
- // data.framework - Detected framework
42
- });
43
- ```