@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,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>
@@ -1,278 +0,0 @@
1
- "use strict";
2
- (() => {
3
- // src/popup.ts
4
- document.addEventListener("DOMContentLoaded", () => {
5
- const loginSection = document.getElementById("login-section");
6
- const mainSection = document.getElementById("main-section");
7
- const settingsSection = document.getElementById("settings-section");
8
- const loginBtn = document.getElementById("login-btn");
9
- const logoutBtn = document.getElementById("logout-btn");
10
- const openPanel = document.getElementById("open-panel");
11
- const openPageOverlay = document.getElementById("open-page-overlay");
12
- const zapStatus = document.getElementById("zap-status");
13
- const zapDetail = document.getElementById("zap-detail");
14
- const mcpStatus = document.getElementById("mcp-status");
15
- const mcpPort = document.getElementById("mcp-port");
16
- const cdpStatus = document.getElementById("cdp-status");
17
- const cdpDetail = document.getElementById("cdp-detail");
18
- const gpuStatus = document.getElementById("gpu-status");
19
- const gpuDetail = document.getElementById("gpu-detail");
20
- const openSettings = document.getElementById("open-settings");
21
- const backBtn = document.getElementById("back-btn");
22
- const saveSettings = document.getElementById("save-settings");
23
- const testConnection = document.getElementById("test-connection");
24
- function checkAuth() {
25
- mainSection.classList.remove("hidden");
26
- refreshStatus();
27
- chrome.runtime.sendMessage({ action: "auth.status" }, (response) => {
28
- if (chrome.runtime.lastError) return;
29
- if ((response == null ? void 0 : response.success) && response.authenticated) {
30
- loginSection.classList.add("hidden");
31
- if (response.user) {
32
- const avatar = document.getElementById("user-avatar");
33
- const name = document.getElementById("user-name");
34
- const email = document.getElementById("user-email");
35
- avatar.src = response.user.picture || response.user.avatar || "icon48.png";
36
- name.textContent = response.user.name || response.user.displayName || "Hanzo User";
37
- email.textContent = response.user.email || "";
38
- }
39
- } else {
40
- loginSection.classList.remove("hidden");
41
- }
42
- });
43
- }
44
- loginBtn == null ? void 0 : loginBtn.addEventListener("click", () => {
45
- loginBtn.disabled = true;
46
- loginBtn.textContent = "Signing in...";
47
- chrome.runtime.sendMessage({ action: "auth.login" }, (response) => {
48
- loginBtn.disabled = false;
49
- loginBtn.textContent = "Sign in with Hanzo";
50
- if (response == null ? void 0 : response.success) {
51
- checkAuth();
52
- } else {
53
- const msg = (response == null ? void 0 : response.error) || "Unable to sign in. Please try again.";
54
- loginBtn.textContent = msg;
55
- setTimeout(() => {
56
- loginBtn.textContent = "Sign in with Hanzo";
57
- }, 3e3);
58
- }
59
- });
60
- });
61
- logoutBtn == null ? void 0 : logoutBtn.addEventListener("click", () => {
62
- chrome.runtime.sendMessage({ action: "auth.logout" }, () => {
63
- loginSection.classList.remove("hidden");
64
- const avatar = document.getElementById("user-avatar");
65
- const name = document.getElementById("user-name");
66
- const email = document.getElementById("user-email");
67
- if (avatar) avatar.src = "";
68
- if (name) name.textContent = "";
69
- if (email) email.textContent = "";
70
- });
71
- });
72
- openPanel == null ? void 0 : openPanel.addEventListener("click", () => {
73
- if (chrome.sidePanel) {
74
- chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => {
75
- var _a;
76
- if ((_a = tabs[0]) == null ? void 0 : _a.id) {
77
- chrome.sidePanel.open({ tabId: tabs[0].id });
78
- }
79
- });
80
- } else {
81
- window.close();
82
- }
83
- });
84
- function isInjectableTab(tab) {
85
- if (!tab || !tab.id) return false;
86
- const url = tab.url || "";
87
- if (!url) return false;
88
- if (url.startsWith("chrome://")) return false;
89
- if (url.startsWith("chrome-extension://")) return false;
90
- if (url.startsWith("devtools://")) return false;
91
- if (url.startsWith("edge://")) return false;
92
- if (url.startsWith("about:")) return false;
93
- if (url.startsWith("view-source:")) return false;
94
- if (url.startsWith("moz-extension://")) return false;
95
- return true;
96
- }
97
- openPageOverlay == null ? void 0 : openPageOverlay.addEventListener("click", () => {
98
- openPageOverlay.textContent = "Opening...";
99
- openPageOverlay.setAttribute("disabled", "true");
100
- chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => {
101
- const activeTab = tabs[0];
102
- let targetTab = isInjectableTab(activeTab) ? activeTab : null;
103
- if (!targetTab) {
104
- chrome.tabs.query({ currentWindow: true }, (allTabs) => {
105
- targetTab = allTabs.find((tab) => isInjectableTab(tab)) || null;
106
- if (!(targetTab == null ? void 0 : targetTab.id)) {
107
- openPageOverlay.textContent = "No valid page tab";
108
- setTimeout(() => {
109
- openPageOverlay.textContent = "Toggle On-Page Overlay";
110
- openPageOverlay.removeAttribute("disabled");
111
- }, 1200);
112
- return;
113
- }
114
- chrome.runtime.sendMessage({ action: "page.overlay.toggle", tabId: targetTab.id }, (response) => {
115
- if (chrome.runtime.lastError || !(response == null ? void 0 : response.success)) {
116
- openPageOverlay.textContent = "Unavailable on this page";
117
- } else {
118
- const opened = !!(response == null ? void 0 : response.open);
119
- openPageOverlay.textContent = opened ? "Overlay Opened" : "Overlay Hidden";
120
- }
121
- setTimeout(() => {
122
- openPageOverlay.textContent = "Toggle On-Page Overlay";
123
- openPageOverlay.removeAttribute("disabled");
124
- }, 900);
125
- });
126
- });
127
- return;
128
- }
129
- if (!(targetTab == null ? void 0 : targetTab.id)) {
130
- openPageOverlay.textContent = "No Active Tab";
131
- setTimeout(() => {
132
- openPageOverlay.textContent = "Toggle On-Page Overlay";
133
- openPageOverlay.removeAttribute("disabled");
134
- }, 1200);
135
- return;
136
- }
137
- chrome.runtime.sendMessage({ action: "page.overlay.toggle", tabId: targetTab.id }, (response) => {
138
- if (chrome.runtime.lastError || !(response == null ? void 0 : response.success)) {
139
- openPageOverlay.textContent = "Unavailable on this page";
140
- } else {
141
- const opened = !!(response == null ? void 0 : response.open);
142
- openPageOverlay.textContent = opened ? "Overlay Opened" : "Overlay Hidden";
143
- }
144
- setTimeout(() => {
145
- openPageOverlay.textContent = "Toggle On-Page Overlay";
146
- openPageOverlay.removeAttribute("disabled");
147
- }, 900);
148
- });
149
- });
150
- });
151
- function refreshStatus() {
152
- chrome.runtime.sendMessage({ action: "zap.status" }, (response) => {
153
- var _a, _b;
154
- if (chrome.runtime.lastError) return;
155
- if (response == null ? void 0 : response.success) {
156
- const zap = response.zap;
157
- if (zap.connected) {
158
- zapStatus.classList.add("connected");
159
- zapStatus.classList.remove("disconnected");
160
- const mcpCount = ((_a = zap.mcps) == null ? void 0 : _a.length) || 0;
161
- const toolCount = ((_b = zap.mcps) == null ? void 0 : _b.reduce((sum, m) => {
162
- var _a2;
163
- return sum + (((_a2 = m.tools) == null ? void 0 : _a2.length) || 0);
164
- }, 0)) || 0;
165
- zapDetail.textContent = `${mcpCount} MCP(s), ${toolCount} tools`;
166
- } else {
167
- zapStatus.classList.remove("connected");
168
- zapStatus.classList.add("disconnected");
169
- zapDetail.textContent = "Not connected";
170
- }
171
- }
172
- });
173
- chrome.runtime.sendMessage({ action: "checkWebGPU" }, (response) => {
174
- if (chrome.runtime.lastError) return;
175
- gpuStatus.classList.add((response == null ? void 0 : response.available) ? "connected" : "disconnected");
176
- gpuStatus.classList.remove((response == null ? void 0 : response.available) ? "disconnected" : "connected");
177
- gpuDetail.textContent = (response == null ? void 0 : response.available) ? response.adapter || "Available" : "Not available";
178
- });
179
- mcpStatus.classList.add("connected");
180
- mcpPort.textContent = "Fallback";
181
- cdpStatus.classList.add("connected");
182
- cdpDetail.textContent = "Active";
183
- }
184
- openSettings == null ? void 0 : openSettings.addEventListener("click", () => {
185
- mainSection.classList.add("hidden");
186
- settingsSection.classList.remove("hidden");
187
- loadSettings();
188
- });
189
- backBtn == null ? void 0 : backBtn.addEventListener("click", () => {
190
- settingsSection.classList.add("hidden");
191
- mainSection.classList.remove("hidden");
192
- });
193
- function loadSettings() {
194
- chrome.storage.local.get(["mcpPort", "cdpPort", "zapPorts"], (result) => {
195
- const mcpPortInput = document.getElementById("mcp-port-setting");
196
- const cdpPortInput = document.getElementById("cdp-port-setting");
197
- const zapPortsInput = document.getElementById("zap-ports-setting");
198
- if (mcpPortInput) mcpPortInput.value = result.mcpPort || 3001;
199
- if (cdpPortInput) cdpPortInput.value = result.cdpPort || 9223;
200
- if (zapPortsInput) zapPortsInput.value = (result.zapPorts || [9999, 9998, 9997, 9996, 9995]).join(",");
201
- });
202
- }
203
- saveSettings == null ? void 0 : saveSettings.addEventListener("click", () => {
204
- var _a, _b, _c;
205
- const mcpPortVal = parseInt((_a = document.getElementById("mcp-port-setting")) == null ? void 0 : _a.value) || 3001;
206
- const cdpPortVal = parseInt((_b = document.getElementById("cdp-port-setting")) == null ? void 0 : _b.value) || 9223;
207
- const zapPortsVal = (((_c = document.getElementById("zap-ports-setting")) == null ? void 0 : _c.value) || "").split(",").map((p) => parseInt(p.trim())).filter((p) => p > 0 && p < 65536);
208
- chrome.storage.local.set({
209
- mcpPort: mcpPortVal,
210
- cdpPort: cdpPortVal,
211
- zapPorts: zapPortsVal.length ? zapPortsVal : [9999, 9998, 9997, 9996, 9995]
212
- }, () => {
213
- saveSettings.textContent = "Saved!";
214
- setTimeout(() => {
215
- saveSettings.textContent = "Save Settings";
216
- }, 1500);
217
- });
218
- });
219
- testConnection == null ? void 0 : testConnection.addEventListener("click", () => {
220
- testConnection.textContent = "Testing...";
221
- testConnection.disabled = true;
222
- chrome.runtime.sendMessage({ action: "zap.discover" }, () => {
223
- refreshStatus();
224
- testConnection.textContent = "Test Connection";
225
- testConnection.disabled = false;
226
- });
227
- });
228
- ["source-maps", "webgpu-ai", "browser-control", "tab-filesystem"].forEach((id) => {
229
- const checkbox = document.getElementById(id);
230
- if (checkbox) {
231
- chrome.storage.local.get([id], (result) => {
232
- checkbox.checked = result[id] !== false;
233
- });
234
- checkbox.addEventListener("change", () => {
235
- chrome.storage.local.set({ [id]: checkbox.checked });
236
- });
237
- }
238
- });
239
- const backendSelect = document.getElementById("browser-backend");
240
- const bridgeStatus = document.getElementById("bridge-status");
241
- const bridgeDetail = document.getElementById("bridge-detail");
242
- function loadBackendPreference() {
243
- chrome.storage.sync.get(["browserBackend"], (result) => {
244
- if (backendSelect && result.browserBackend) {
245
- backendSelect.value = result.browserBackend;
246
- }
247
- });
248
- }
249
- function refreshBridgeStatus() {
250
- chrome.runtime.sendMessage({ action: "bridge.status" }, (response) => {
251
- if (chrome.runtime.lastError) return;
252
- if ((response == null ? void 0 : response.success) && response.connected) {
253
- bridgeStatus == null ? void 0 : bridgeStatus.classList.add("connected");
254
- bridgeStatus == null ? void 0 : bridgeStatus.classList.remove("disconnected");
255
- const browsers = response.browsers || [];
256
- bridgeDetail.textContent = browsers.length ? `Connected: ${browsers.join(", ")}` : "Connected";
257
- } else {
258
- bridgeStatus == null ? void 0 : bridgeStatus.classList.remove("connected");
259
- bridgeStatus == null ? void 0 : bridgeStatus.classList.add("disconnected");
260
- bridgeDetail.textContent = "Not connected";
261
- }
262
- });
263
- }
264
- backendSelect == null ? void 0 : backendSelect.addEventListener("change", () => {
265
- const value = backendSelect.value;
266
- chrome.storage.sync.set({ browserBackend: value });
267
- chrome.runtime.sendMessage({
268
- action: "config.save",
269
- key: "browserBackend",
270
- value
271
- });
272
- });
273
- loadBackendPreference();
274
- refreshBridgeStatus();
275
- checkAuth();
276
- });
277
- })();
278
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL3BvcHVwLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyIvLyBIYW56byBBSSBcdTIwMTQgUG9wdXAgU2NyaXB0XG4vLyBVc2VzIGJhY2tncm91bmQgbWVzc2FnZSBwYXNzaW5nIGZvciBhdXRoIChub3QgZGlyZWN0IHN0b3JhZ2UgYWNjZXNzKS5cblxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsICgpID0+IHtcbiAgY29uc3QgbG9naW5TZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ2luLXNlY3Rpb24nKTtcbiAgY29uc3QgbWFpblNlY3Rpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFpbi1zZWN0aW9uJyk7XG4gIGNvbnN0IHNldHRpbmdzU2VjdGlvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXR0aW5ncy1zZWN0aW9uJyk7XG5cbiAgLy8gQXV0aFxuICBjb25zdCBsb2dpbkJ0biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdsb2dpbi1idG4nKTtcbiAgY29uc3QgbG9nb3V0QnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2xvZ291dC1idG4nKTtcblxuICAvLyBPcGVuIHBhbmVsXG4gIGNvbnN0IG9wZW5QYW5lbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcGVuLXBhbmVsJyk7XG4gIGNvbnN0IG9wZW5QYWdlT3ZlcmxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvcGVuLXBhZ2Utb3ZlcmxheScpO1xuXG4gIC8vIFN0YXR1cyBkb3RzXG4gIGNvbnN0IHphcFN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6YXAtc3RhdHVzJyk7XG4gIGNvbnN0IHphcERldGFpbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6YXAtZGV0YWlsJyk7XG4gIGNvbnN0IG1jcFN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtY3Atc3RhdHVzJyk7XG4gIGNvbnN0IG1jcFBvcnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWNwLXBvcnQnKTtcbiAgY29uc3QgY2RwU3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NkcC1zdGF0dXMnKTtcbiAgY29uc3QgY2RwRGV0YWlsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NkcC1kZXRhaWwnKTtcbiAgY29uc3QgZ3B1U3RhdHVzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dwdS1zdGF0dXMnKTtcbiAgY29uc3QgZ3B1RGV0YWlsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2dwdS1kZXRhaWwnKTtcblxuICAvLyBTZXR0aW5nc1xuICBjb25zdCBvcGVuU2V0dGluZ3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb3Blbi1zZXR0aW5ncycpO1xuICBjb25zdCBiYWNrQnRuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhY2stYnRuJyk7XG4gIGNvbnN0IHNhdmVTZXR0aW5ncyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzYXZlLXNldHRpbmdzJyk7XG4gIGNvbnN0IHRlc3RDb25uZWN0aW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3QtY29ubmVjdGlvbicpO1xuXG4gIC8vIC0tLSBBdXRoIHZpYSBiYWNrZ3JvdW5kIC0tLVxuICBmdW5jdGlvbiBjaGVja0F1dGgoKSB7XG4gICAgLy8gQWx3YXlzIHNob3cgbWFpbiBzZWN0aW9uIGFuZCBzdGF0dXMgKHRvb2xzIHdvcmsgd2l0aG91dCBsb2dpbilcbiAgICBtYWluU2VjdGlvbi5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtcbiAgICByZWZyZXNoU3RhdHVzKCk7XG5cbiAgICBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7IGFjdGlvbjogJ2F1dGguc3RhdHVzJyB9LCAocmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChjaHJvbWUucnVudGltZS5sYXN0RXJyb3IpIHJldHVybjtcbiAgICAgIGlmIChyZXNwb25zZT8uc3VjY2VzcyAmJiByZXNwb25zZS5hdXRoZW50aWNhdGVkKSB7XG4gICAgICAgIGxvZ2luU2VjdGlvbi5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTtcbiAgICAgICAgaWYgKHJlc3BvbnNlLnVzZXIpIHtcbiAgICAgICAgICBjb25zdCBhdmF0YXIgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXNlci1hdmF0YXInKTtcbiAgICAgICAgICBjb25zdCBuYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VzZXItbmFtZScpO1xuICAgICAgICAgIGNvbnN0IGVtYWlsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VzZXItZW1haWwnKTtcbiAgICAgICAgICBhdmF0YXIuc3JjID0gcmVzcG9uc2UudXNlci5waWN0dXJlIHx8IHJlc3BvbnNlLnVzZXIuYXZhdGFyIHx8ICdpY29uNDgucG5nJztcbiAgICAgICAgICBuYW1lLnRleHRDb250ZW50ID0gcmVzcG9uc2UudXNlci5uYW1lIHx8IHJlc3BvbnNlLnVzZXIuZGlzcGxheU5hbWUgfHwgJ0hhbnpvIFVzZXInO1xuICAgICAgICAgIGVtYWlsLnRleHRDb250ZW50ID0gcmVzcG9uc2UudXNlci5lbWFpbCB8fCAnJztcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbG9naW5TZWN0aW9uLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgbG9naW5CdG4/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIGxvZ2luQnRuLmRpc2FibGVkID0gdHJ1ZTtcbiAgICBsb2dpbkJ0bi50ZXh0Q29udGVudCA9ICdTaWduaW5nIGluLi4uJztcbiAgICBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7IGFjdGlvbjogJ2F1dGgubG9naW4nIH0sIChyZXNwb25zZSkgPT4ge1xuICAgICAgbG9naW5CdG4uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIGxvZ2luQnRuLnRleHRDb250ZW50ID0gJ1NpZ24gaW4gd2l0aCBIYW56byc7XG4gICAgICBpZiAocmVzcG9uc2U/LnN1Y2Nlc3MpIHtcbiAgICAgICAgY2hlY2tBdXRoKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBtc2cgPSByZXNwb25zZT8uZXJyb3IgfHwgJ1VuYWJsZSB0byBzaWduIGluLiBQbGVhc2UgdHJ5IGFnYWluLic7XG4gICAgICAgIGxvZ2luQnRuLnRleHRDb250ZW50ID0gbXNnO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsgbG9naW5CdG4udGV4dENvbnRlbnQgPSAnU2lnbiBpbiB3aXRoIEhhbnpvJzsgfSwgMzAwMCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xuXG4gIGxvZ291dEJ0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBhY3Rpb246ICdhdXRoLmxvZ291dCcgfSwgKCkgPT4ge1xuICAgICAgbG9naW5TZWN0aW9uLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO1xuICAgICAgLy8gS2VlcCBtYWluIHNlY3Rpb24gdmlzaWJsZSBcdTIwMTQgdG9vbHMgd29yayB3aXRob3V0IGF1dGhcbiAgICAgIGNvbnN0IGF2YXRhciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1c2VyLWF2YXRhcicpIGFzIEhUTUxJbWFnZUVsZW1lbnQ7XG4gICAgICBjb25zdCBuYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3VzZXItbmFtZScpO1xuICAgICAgY29uc3QgZW1haWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXNlci1lbWFpbCcpO1xuICAgICAgaWYgKGF2YXRhcikgYXZhdGFyLnNyYyA9ICcnO1xuICAgICAgaWYgKG5hbWUpIG5hbWUudGV4dENvbnRlbnQgPSAnJztcbiAgICAgIGlmIChlbWFpbCkgZW1haWwudGV4dENvbnRlbnQgPSAnJztcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gLS0tIE9wZW4gc2lkZSBwYW5lbCAtLS1cbiAgb3BlblBhbmVsPy5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICBpZiAoY2hyb21lLnNpZGVQYW5lbCkge1xuICAgICAgY2hyb21lLnRhYnMucXVlcnkoeyBhY3RpdmU6IHRydWUsIGN1cnJlbnRXaW5kb3c6IHRydWUgfSwgKHRhYnMpID0+IHtcbiAgICAgICAgaWYgKHRhYnNbMF0/LmlkKSB7XG4gICAgICAgICAgY2hyb21lLnNpZGVQYW5lbC5vcGVuKHsgdGFiSWQ6IHRhYnNbMF0uaWQgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBGaXJlZm94OiBzaWRlYmFyX2FjdGlvbiBpcyBhdXRvbWF0aWNcbiAgICAgIHdpbmRvdy5jbG9zZSgpO1xuICAgIH1cbiAgfSk7XG5cbiAgZnVuY3Rpb24gaXNJbmplY3RhYmxlVGFiKHRhYjogY2hyb21lLnRhYnMuVGFiIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0YWIgfHwgIXRhYi5pZCkgcmV0dXJuIGZhbHNlO1xuICAgIGNvbnN0IHVybCA9IHRhYi51cmwgfHwgJyc7XG4gICAgaWYgKCF1cmwpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodXJsLnN0YXJ0c1dpdGgoJ2Nocm9tZTovLycpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHVybC5zdGFydHNXaXRoKCdjaHJvbWUtZXh0ZW5zaW9uOi8vJykpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodXJsLnN0YXJ0c1dpdGgoJ2RldnRvb2xzOi8vJykpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodXJsLnN0YXJ0c1dpdGgoJ2VkZ2U6Ly8nKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmICh1cmwuc3RhcnRzV2l0aCgnYWJvdXQ6JykpIHJldHVybiBmYWxzZTtcbiAgICBpZiAodXJsLnN0YXJ0c1dpdGgoJ3ZpZXctc291cmNlOicpKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHVybC5zdGFydHNXaXRoKCdtb3otZXh0ZW5zaW9uOi8vJykpIHJldHVybiBmYWxzZTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIG9wZW5QYWdlT3ZlcmxheT8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgb3BlblBhZ2VPdmVybGF5LnRleHRDb250ZW50ID0gJ09wZW5pbmcuLi4nO1xuICAgIG9wZW5QYWdlT3ZlcmxheS5zZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJywgJ3RydWUnKTtcblxuICAgIGNocm9tZS50YWJzLnF1ZXJ5KHsgYWN0aXZlOiB0cnVlLCBjdXJyZW50V2luZG93OiB0cnVlIH0sICh0YWJzKSA9PiB7XG4gICAgICBjb25zdCBhY3RpdmVUYWIgPSB0YWJzWzBdO1xuICAgICAgbGV0IHRhcmdldFRhYiA9IGlzSW5qZWN0YWJsZVRhYihhY3RpdmVUYWIpID8gYWN0aXZlVGFiIDogbnVsbDtcblxuICAgICAgaWYgKCF0YXJnZXRUYWIpIHtcbiAgICAgICAgY2hyb21lLnRhYnMucXVlcnkoeyBjdXJyZW50V2luZG93OiB0cnVlIH0sIChhbGxUYWJzKSA9PiB7XG4gICAgICAgICAgdGFyZ2V0VGFiID0gYWxsVGFicy5maW5kKCh0YWIpID0+IGlzSW5qZWN0YWJsZVRhYih0YWIpKSB8fCBudWxsO1xuICAgICAgICAgIGlmICghdGFyZ2V0VGFiPy5pZCkge1xuICAgICAgICAgICAgb3BlblBhZ2VPdmVybGF5LnRleHRDb250ZW50ID0gJ05vIHZhbGlkIHBhZ2UgdGFiJztcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICBvcGVuUGFnZU92ZXJsYXkudGV4dENvbnRlbnQgPSAnVG9nZ2xlIE9uLVBhZ2UgT3ZlcmxheSc7XG4gICAgICAgICAgICAgIG9wZW5QYWdlT3ZlcmxheS5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICB9LCAxMjAwKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7IGFjdGlvbjogJ3BhZ2Uub3ZlcmxheS50b2dnbGUnLCB0YWJJZDogdGFyZ2V0VGFiLmlkIH0sIChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGNocm9tZS5ydW50aW1lLmxhc3RFcnJvciB8fCAhcmVzcG9uc2U/LnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgb3BlblBhZ2VPdmVybGF5LnRleHRDb250ZW50ID0gJ1VuYXZhaWxhYmxlIG9uIHRoaXMgcGFnZSc7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBjb25zdCBvcGVuZWQgPSAhIXJlc3BvbnNlPy5vcGVuO1xuICAgICAgICAgICAgICBvcGVuUGFnZU92ZXJsYXkudGV4dENvbnRlbnQgPSBvcGVuZWQgPyAnT3ZlcmxheSBPcGVuZWQnIDogJ092ZXJsYXkgSGlkZGVuJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICBvcGVuUGFnZU92ZXJsYXkudGV4dENvbnRlbnQgPSAnVG9nZ2xlIE9uLVBhZ2UgT3ZlcmxheSc7XG4gICAgICAgICAgICAgIG9wZW5QYWdlT3ZlcmxheS5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJyk7XG4gICAgICAgICAgICB9LCA5MDApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXRhcmdldFRhYj8uaWQpIHtcbiAgICAgICAgb3BlblBhZ2VPdmVybGF5LnRleHRDb250ZW50ID0gJ05vIEFjdGl2ZSBUYWInO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBvcGVuUGFnZU92ZXJsYXkudGV4dENvbnRlbnQgPSAnVG9nZ2xlIE9uLVBhZ2UgT3ZlcmxheSc7XG4gICAgICAgICAgb3BlblBhZ2VPdmVybGF5LnJlbW92ZUF0dHJpYnV0ZSgnZGlzYWJsZWQnKTtcbiAgICAgICAgfSwgMTIwMCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY2hyb21lLnJ1bnRpbWUuc2VuZE1lc3NhZ2UoeyBhY3Rpb246ICdwYWdlLm92ZXJsYXkudG9nZ2xlJywgdGFiSWQ6IHRhcmdldFRhYi5pZCB9LCAocmVzcG9uc2UpID0+IHtcbiAgICAgICAgaWYgKGNocm9tZS5ydW50aW1lLmxhc3RFcnJvciB8fCAhcmVzcG9uc2U/LnN1Y2Nlc3MpIHtcbiAgICAgICAgICBvcGVuUGFnZU92ZXJsYXkudGV4dENvbnRlbnQgPSAnVW5hdmFpbGFibGUgb24gdGhpcyBwYWdlJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCBvcGVuZWQgPSAhIXJlc3BvbnNlPy5vcGVuO1xuICAgICAgICAgIG9wZW5QYWdlT3ZlcmxheS50ZXh0Q29udGVudCA9IG9wZW5lZCA/ICdPdmVybGF5IE9wZW5lZCcgOiAnT3ZlcmxheSBIaWRkZW4nO1xuICAgICAgICB9XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIG9wZW5QYWdlT3ZlcmxheS50ZXh0Q29udGVudCA9ICdUb2dnbGUgT24tUGFnZSBPdmVybGF5JztcbiAgICAgICAgICBvcGVuUGFnZU92ZXJsYXkucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpO1xuICAgICAgICB9LCA5MDApO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIC0tLSBTdGF0dXMgLS0tXG4gIGZ1bmN0aW9uIHJlZnJlc2hTdGF0dXMoKSB7XG4gICAgLy8gWkFQIHN0YXR1c1xuICAgIGNocm9tZS5ydW50aW1lLnNlbmRNZXNzYWdlKHsgYWN0aW9uOiAnemFwLnN0YXR1cycgfSwgKHJlc3BvbnNlKSA9PiB7XG4gICAgICBpZiAoY2hyb21lLnJ1bnRpbWUubGFzdEVycm9yKSByZXR1cm47XG4gICAgICBpZiAocmVzcG9uc2U/LnN1Y2Nlc3MpIHtcbiAgICAgICAgY29uc3QgemFwID0gcmVzcG9uc2UuemFwO1xuICAgICAgICBpZiAoemFwLmNvbm5lY3RlZCkge1xuICAgICAgICAgIHphcFN0YXR1cy5jbGFzc0xpc3QuYWRkKCdjb25uZWN0ZWQnKTtcbiAgICAgICAgICB6YXBTdGF0dXMuY2xhc3NMaXN0LnJlbW92ZSgnZGlzY29ubmVjdGVkJyk7XG4gICAgICAgICAgY29uc3QgbWNwQ291bnQgPSB6YXAubWNwcz8ubGVuZ3RoIHx8IDA7XG4gICAgICAgICAgY29uc3QgdG9vbENvdW50ID0gemFwLm1jcHM/LnJlZHVjZSgoc3VtLCBtKSA9PiBzdW0gKyAobS50b29scz8ubGVuZ3RoIHx8IDApLCAwKSB8fCAwO1xuICAgICAgICAgIHphcERldGFpbC50ZXh0Q29udGVudCA9IGAke21jcENvdW50fSBNQ1AocyksICR7dG9vbENvdW50fSB0b29sc2A7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgemFwU3RhdHVzLmNsYXNzTGlzdC5yZW1vdmUoJ2Nvbm5lY3RlZCcpO1xuICAgICAgICAgIHphcFN0YXR1cy5jbGFzc0xpc3QuYWRkKCdkaXNjb25uZWN0ZWQnKTtcbiAgICAgICAgICB6YXBEZXRhaWwudGV4dENvbnRlbnQgPSAnTm90IGNvbm5lY3RlZCc7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIEdQVSBzdGF0dXNcbiAgICBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7IGFjdGlvbjogJ2NoZWNrV2ViR1BVJyB9LCAocmVzcG9uc2UpID0+IHtcbiAgICAgIGlmIChjaHJvbWUucnVudGltZS5sYXN0RXJyb3IpIHJldHVybjtcbiAgICAgIGdwdVN0YXR1cy5jbGFzc0xpc3QuYWRkKHJlc3BvbnNlPy5hdmFpbGFibGUgPyAnY29ubmVjdGVkJyA6ICdkaXNjb25uZWN0ZWQnKTtcbiAgICAgIGdwdVN0YXR1cy5jbGFzc0xpc3QucmVtb3ZlKHJlc3BvbnNlPy5hdmFpbGFibGUgPyAnZGlzY29ubmVjdGVkJyA6ICdjb25uZWN0ZWQnKTtcbiAgICAgIGdwdURldGFpbC50ZXh0Q29udGVudCA9IHJlc3BvbnNlPy5hdmFpbGFibGUgPyAocmVzcG9uc2UuYWRhcHRlciB8fCAnQXZhaWxhYmxlJykgOiAnTm90IGF2YWlsYWJsZSc7XG4gICAgfSk7XG5cbiAgICAvLyBNQ1AvQ0RQIFx1MjAxNCBzZXQgYXMgYWN0aXZlIGZvciBub3cgKGNoZWNrZWQgdmlhIFpBUClcbiAgICBtY3BTdGF0dXMuY2xhc3NMaXN0LmFkZCgnY29ubmVjdGVkJyk7XG4gICAgbWNwUG9ydC50ZXh0Q29udGVudCA9ICdGYWxsYmFjayc7XG4gICAgY2RwU3RhdHVzLmNsYXNzTGlzdC5hZGQoJ2Nvbm5lY3RlZCcpO1xuICAgIGNkcERldGFpbC50ZXh0Q29udGVudCA9ICdBY3RpdmUnO1xuICB9XG5cbiAgLy8gLS0tIFNldHRpbmdzIC0tLVxuICBvcGVuU2V0dGluZ3M/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIG1haW5TZWN0aW9uLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICAgIHNldHRpbmdzU2VjdGlvbi5jbGFzc0xpc3QucmVtb3ZlKCdoaWRkZW4nKTtcbiAgICBsb2FkU2V0dGluZ3MoKTtcbiAgfSk7XG5cbiAgYmFja0J0bj8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgc2V0dGluZ3NTZWN0aW9uLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpO1xuICAgIG1haW5TZWN0aW9uLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpO1xuICB9KTtcblxuICBmdW5jdGlvbiBsb2FkU2V0dGluZ3MoKSB7XG4gICAgY2hyb21lLnN0b3JhZ2UubG9jYWwuZ2V0KFsnbWNwUG9ydCcsICdjZHBQb3J0JywgJ3phcFBvcnRzJ10sIChyZXN1bHQpID0+IHtcbiAgICAgIGNvbnN0IG1jcFBvcnRJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtY3AtcG9ydC1zZXR0aW5nJyk7XG4gICAgICBjb25zdCBjZHBQb3J0SW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2RwLXBvcnQtc2V0dGluZycpO1xuICAgICAgY29uc3QgemFwUG9ydHNJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd6YXAtcG9ydHMtc2V0dGluZycpO1xuXG4gICAgICBpZiAobWNwUG9ydElucHV0KSBtY3BQb3J0SW5wdXQudmFsdWUgPSByZXN1bHQubWNwUG9ydCB8fCAzMDAxO1xuICAgICAgaWYgKGNkcFBvcnRJbnB1dCkgY2RwUG9ydElucHV0LnZhbHVlID0gcmVzdWx0LmNkcFBvcnQgfHwgOTIyMztcbiAgICAgIGlmICh6YXBQb3J0c0lucHV0KSB6YXBQb3J0c0lucHV0LnZhbHVlID0gKHJlc3VsdC56YXBQb3J0cyB8fCBbOTk5OSwgOTk5OCwgOTk5NywgOTk5NiwgOTk5NV0pLmpvaW4oJywnKTtcbiAgICB9KTtcbiAgfVxuXG4gIHNhdmVTZXR0aW5ncz8uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7XG4gICAgY29uc3QgbWNwUG9ydFZhbCA9IHBhcnNlSW50KGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtY3AtcG9ydC1zZXR0aW5nJyk/LnZhbHVlKSB8fCAzMDAxO1xuICAgIGNvbnN0IGNkcFBvcnRWYWwgPSBwYXJzZUludChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY2RwLXBvcnQtc2V0dGluZycpPy52YWx1ZSkgfHwgOTIyMztcbiAgICBjb25zdCB6YXBQb3J0c1ZhbCA9IChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnemFwLXBvcnRzLXNldHRpbmcnKT8udmFsdWUgfHwgJycpXG4gICAgICAuc3BsaXQoJywnKS5tYXAocCA9PiBwYXJzZUludChwLnRyaW0oKSkpLmZpbHRlcihwID0+IHAgPiAwICYmIHAgPCA2NTUzNik7XG5cbiAgICBjaHJvbWUuc3RvcmFnZS5sb2NhbC5zZXQoe1xuICAgICAgbWNwUG9ydDogbWNwUG9ydFZhbCxcbiAgICAgIGNkcFBvcnQ6IGNkcFBvcnRWYWwsXG4gICAgICB6YXBQb3J0czogemFwUG9ydHNWYWwubGVuZ3RoID8gemFwUG9ydHNWYWwgOiBbOTk5OSwgOTk5OCwgOTk5NywgOTk5NiwgOTk5NV0sXG4gICAgfSwgKCkgPT4ge1xuICAgICAgc2F2ZVNldHRpbmdzLnRleHRDb250ZW50ID0gJ1NhdmVkISc7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHsgc2F2ZVNldHRpbmdzLnRleHRDb250ZW50ID0gJ1NhdmUgU2V0dGluZ3MnOyB9LCAxNTAwKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gLS0tIFRlc3QgQ29ubmVjdGlvbiAtLS1cbiAgdGVzdENvbm5lY3Rpb24/LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgIHRlc3RDb25uZWN0aW9uLnRleHRDb250ZW50ID0gJ1Rlc3RpbmcuLi4nO1xuICAgIHRlc3RDb25uZWN0aW9uLmRpc2FibGVkID0gdHJ1ZTtcblxuICAgIGNocm9tZS5ydW50aW1lLnNlbmRNZXNzYWdlKHsgYWN0aW9uOiAnemFwLmRpc2NvdmVyJyB9LCAoKSA9PiB7XG4gICAgICByZWZyZXNoU3RhdHVzKCk7XG4gICAgICB0ZXN0Q29ubmVjdGlvbi50ZXh0Q29udGVudCA9ICdUZXN0IENvbm5lY3Rpb24nO1xuICAgICAgdGVzdENvbm5lY3Rpb24uZGlzYWJsZWQgPSBmYWxzZTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gRmVhdHVyZSB0b2dnbGVzXG4gIFsnc291cmNlLW1hcHMnLCAnd2ViZ3B1LWFpJywgJ2Jyb3dzZXItY29udHJvbCcsICd0YWItZmlsZXN5c3RlbSddLmZvckVhY2goaWQgPT4ge1xuICAgIGNvbnN0IGNoZWNrYm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpO1xuICAgIGlmIChjaGVja2JveCkge1xuICAgICAgY2hyb21lLnN0b3JhZ2UubG9jYWwuZ2V0KFtpZF0sIChyZXN1bHQpID0+IHtcbiAgICAgICAgY2hlY2tib3guY2hlY2tlZCA9IHJlc3VsdFtpZF0gIT09IGZhbHNlOyAvLyBkZWZhdWx0IG9uXG4gICAgICB9KTtcbiAgICAgIGNoZWNrYm94LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICAgICAgY2hyb21lLnN0b3JhZ2UubG9jYWwuc2V0KHsgW2lkXTogY2hlY2tib3guY2hlY2tlZCB9KTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gLS0tIEJyb3dzZXIgQmFja2VuZCBQaWNrZXIgLS0tXG4gIGNvbnN0IGJhY2tlbmRTZWxlY3QgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnJvd3Nlci1iYWNrZW5kJykgYXMgSFRNTFNlbGVjdEVsZW1lbnQgfCBudWxsO1xuICBjb25zdCBicmlkZ2VTdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnJpZGdlLXN0YXR1cycpO1xuICBjb25zdCBicmlkZ2VEZXRhaWwgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYnJpZGdlLWRldGFpbCcpO1xuXG4gIGZ1bmN0aW9uIGxvYWRCYWNrZW5kUHJlZmVyZW5jZSgpIHtcbiAgICBjaHJvbWUuc3RvcmFnZS5zeW5jLmdldChbJ2Jyb3dzZXJCYWNrZW5kJ10sIChyZXN1bHQpID0+IHtcbiAgICAgIGlmIChiYWNrZW5kU2VsZWN0ICYmIHJlc3VsdC5icm93c2VyQmFja2VuZCkge1xuICAgICAgICBiYWNrZW5kU2VsZWN0LnZhbHVlID0gcmVzdWx0LmJyb3dzZXJCYWNrZW5kO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVmcmVzaEJyaWRnZVN0YXR1cygpIHtcbiAgICBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7IGFjdGlvbjogJ2JyaWRnZS5zdGF0dXMnIH0sIChyZXNwb25zZSkgPT4ge1xuICAgICAgaWYgKGNocm9tZS5ydW50aW1lLmxhc3RFcnJvcikgcmV0dXJuO1xuICAgICAgaWYgKHJlc3BvbnNlPy5zdWNjZXNzICYmIHJlc3BvbnNlLmNvbm5lY3RlZCkge1xuICAgICAgICBicmlkZ2VTdGF0dXM/LmNsYXNzTGlzdC5hZGQoJ2Nvbm5lY3RlZCcpO1xuICAgICAgICBicmlkZ2VTdGF0dXM/LmNsYXNzTGlzdC5yZW1vdmUoJ2Rpc2Nvbm5lY3RlZCcpO1xuICAgICAgICBjb25zdCBicm93c2VycyA9IHJlc3BvbnNlLmJyb3dzZXJzIHx8IFtdO1xuICAgICAgICBicmlkZ2VEZXRhaWwudGV4dENvbnRlbnQgPSBicm93c2Vycy5sZW5ndGhcbiAgICAgICAgICA/IGBDb25uZWN0ZWQ6ICR7YnJvd3NlcnMuam9pbignLCAnKX1gXG4gICAgICAgICAgOiAnQ29ubmVjdGVkJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyaWRnZVN0YXR1cz8uY2xhc3NMaXN0LnJlbW92ZSgnY29ubmVjdGVkJyk7XG4gICAgICAgIGJyaWRnZVN0YXR1cz8uY2xhc3NMaXN0LmFkZCgnZGlzY29ubmVjdGVkJyk7XG4gICAgICAgIGJyaWRnZURldGFpbC50ZXh0Q29udGVudCA9ICdOb3QgY29ubmVjdGVkJztcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGJhY2tlbmRTZWxlY3Q/LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsICgpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IGJhY2tlbmRTZWxlY3QudmFsdWU7XG5cbiAgICAvLyBTYXZlIHRvIGNocm9tZS5zdG9yYWdlLnN5bmMgKGNyb3NzLWRldmljZSlcbiAgICBjaHJvbWUuc3RvcmFnZS5zeW5jLnNldCh7IGJyb3dzZXJCYWNrZW5kOiB2YWx1ZSB9KTtcblxuICAgIC8vIEZvcndhcmQgdG8gYmFja2dyb3VuZCB0byBwZXJzaXN0IHZpYSBDRFAgYnJpZGdlICsgc3luYyB0byBJQU1cbiAgICBjaHJvbWUucnVudGltZS5zZW5kTWVzc2FnZSh7XG4gICAgICBhY3Rpb246ICdjb25maWcuc2F2ZScsXG4gICAgICBrZXk6ICdicm93c2VyQmFja2VuZCcsXG4gICAgICB2YWx1ZSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgbG9hZEJhY2tlbmRQcmVmZXJlbmNlKCk7XG4gIHJlZnJlc2hCcmlk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
@@ -1,21 +0,0 @@
1
- <?xml version="1.0" encoding="UTF-8"?>
2
- <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
- <plist version="1.0">
4
- <dict>
5
- <key>CFBundleDisplayName</key>
6
- <string>Hanzo AI</string>
7
- <key>CFBundleIdentifier</key>
8
- <string>ai.hanzo.browser-extension</string>
9
- <key>CFBundleVersion</key>
10
- <string>1.7.2</string>
11
- <key>CFBundleShortVersionString</key>
12
- <string>1.7.2</string>
13
- <key>NSExtension</key>
14
- <dict>
15
- <key>NSExtensionPointIdentifier</key>
16
- <string>com.apple.Safari.web-extension</string>
17
- <key>NSExtensionPrincipalClass</key>
18
- <string>SafariWebExtensionHandler</string>
19
- </dict>
20
- </dict>
21
- </plist>