@hanzo/browser-extension 1.9.31 → 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 (62) hide show
  1. package/package.json +2 -1
  2. package/src/answer/AnswerEngine.tsx +553 -0
  3. package/src/manifest-firefox.json +10 -2
  4. package/src/manifest.json +17 -2
  5. package/src/newtab.css +277 -0
  6. package/src/newtab.html +13 -0
  7. package/src/popup.html +28 -0
  8. package/dist/browser-extension/README.md +0 -43
  9. package/dist/browser-extension/background-firefox.js +0 -4556
  10. package/dist/browser-extension/background.js +0 -7245
  11. package/dist/browser-extension/browser-control.js +0 -1317
  12. package/dist/browser-extension/chrome/ai-worker.js +0 -571
  13. package/dist/browser-extension/chrome/background.js +0 -7245
  14. package/dist/browser-extension/chrome/callback.html +0 -17
  15. package/dist/browser-extension/chrome/content-script.js +0 -2789
  16. package/dist/browser-extension/chrome/icon128.png +0 -0
  17. package/dist/browser-extension/chrome/icon16.png +0 -0
  18. package/dist/browser-extension/chrome/icon48.png +0 -0
  19. package/dist/browser-extension/chrome/manifest.json +0 -66
  20. package/dist/browser-extension/chrome/popup.css +0 -761
  21. package/dist/browser-extension/chrome/popup.html +0 -353
  22. package/dist/browser-extension/chrome/popup.js +0 -1650
  23. package/dist/browser-extension/chrome/sidebar.css +0 -1792
  24. package/dist/browser-extension/chrome/sidebar.html +0 -463
  25. package/dist/browser-extension/chrome/sidebar.js +0 -26541
  26. package/dist/browser-extension/cli.js +0 -233
  27. package/dist/browser-extension/firefox/ai-worker.js +0 -571
  28. package/dist/browser-extension/firefox/background.js +0 -4556
  29. package/dist/browser-extension/firefox/callback.html +0 -17
  30. package/dist/browser-extension/firefox/content-script.js +0 -2789
  31. package/dist/browser-extension/firefox/icon128.png +0 -0
  32. package/dist/browser-extension/firefox/icon16.png +0 -0
  33. package/dist/browser-extension/firefox/icon48.png +0 -0
  34. package/dist/browser-extension/firefox/manifest.json +0 -77
  35. package/dist/browser-extension/firefox/popup.css +0 -761
  36. package/dist/browser-extension/firefox/popup.html +0 -353
  37. package/dist/browser-extension/firefox/popup.js +0 -1650
  38. package/dist/browser-extension/firefox/sidebar.css +0 -1792
  39. package/dist/browser-extension/firefox/sidebar.html +0 -463
  40. package/dist/browser-extension/firefox/sidebar.js +0 -26541
  41. package/dist/browser-extension/icon128.png +0 -0
  42. package/dist/browser-extension/icon16.png +0 -0
  43. package/dist/browser-extension/icon48.png +0 -0
  44. package/dist/browser-extension/manifest.json +0 -66
  45. package/dist/browser-extension/package.json +0 -41
  46. package/dist/browser-extension/popup.js +0 -1650
  47. package/dist/browser-extension/safari/Info.plist +0 -21
  48. package/dist/browser-extension/safari/ai-worker.js +0 -571
  49. package/dist/browser-extension/safari/background.js +0 -7245
  50. package/dist/browser-extension/safari/callback.html +0 -17
  51. package/dist/browser-extension/safari/content-script.js +0 -2789
  52. package/dist/browser-extension/safari/icon128.png +0 -0
  53. package/dist/browser-extension/safari/icon16.png +0 -0
  54. package/dist/browser-extension/safari/icon48.png +0 -0
  55. package/dist/browser-extension/safari/popup.css +0 -761
  56. package/dist/browser-extension/safari/popup.html +0 -353
  57. package/dist/browser-extension/safari/popup.js +0 -1650
  58. package/dist/browser-extension/safari/sidebar.css +0 -1792
  59. package/dist/browser-extension/safari/sidebar.html +0 -463
  60. package/dist/browser-extension/safari/sidebar.js +0 -26541
  61. package/dist/browser-extension/sidebar.js +0 -26541
  62. package/dist/browser-extension/webgpu-ai.js +0 -568
@@ -1,233 +0,0 @@
1
- #!/usr/bin/env node
2
- "use strict";
3
- var __create = Object.create;
4
- var __defProp = Object.defineProperty;
5
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
- var __getOwnPropNames = Object.getOwnPropertyNames;
7
- var __getProtoOf = Object.getPrototypeOf;
8
- var __hasOwnProp = Object.prototype.hasOwnProperty;
9
- var __copyProps = (to, from, except, desc) => {
10
- if (from && typeof from === "object" || typeof from === "function") {
11
- for (let key of __getOwnPropNames(from))
12
- if (!__hasOwnProp.call(to, key) && key !== except)
13
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
- }
15
- return to;
16
- };
17
- var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
18
- // If the importer is in node compatibility mode or this is not an ESM
19
- // file that has been converted to a CommonJS file using a Babel-
20
- // compatible transform (i.e. "__esModule" has not been set), then set
21
- // "default" to the CommonJS "module.exports" for node compatibility.
22
- isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
23
- mod
24
- ));
25
-
26
- // src/cli.ts
27
- var import_commander = require("commander");
28
-
29
- // src/browser-extension-server.ts
30
- var import_ws = require("ws");
31
- var import_events = require("events");
32
- var path = __toESM(require("path"));
33
- var fs = __toESM(require("fs"));
34
- var BrowserExtensionServer = class extends import_events.EventEmitter {
35
- constructor(port = 3001, projectRoot = process.cwd()) {
36
- super();
37
- this.projectRoot = projectRoot;
38
- this.wss = new import_ws.WebSocketServer({
39
- port,
40
- path: "/browser-extension"
41
- });
42
- this.setupWebSocket();
43
- console.log(`[Hanzo] Browser extension server listening on ws://localhost:${port}/browser-extension`);
44
- }
45
- setupWebSocket() {
46
- this.wss.on("connection", (ws) => {
47
- console.log("[Hanzo] Browser extension connected");
48
- ws.on("message", async (data) => {
49
- try {
50
- const payload = JSON.parse(data.toString());
51
- if (payload.event === "elementSelected") {
52
- const fileInfo = await this.resolveFileLocation(payload);
53
- if (fileInfo) {
54
- this.emit("elementSelected", {
55
- file: fileInfo.file,
56
- line: fileInfo.line,
57
- column: fileInfo.column,
58
- framework: payload.framework,
59
- domPath: payload.domPath
60
- });
61
- }
62
- }
63
- } catch (error) {
64
- console.error("[Hanzo] Error processing browser message:", error);
65
- }
66
- });
67
- ws.on("close", () => {
68
- console.log("[Hanzo] Browser extension disconnected");
69
- });
70
- });
71
- }
72
- async resolveFileLocation(payload) {
73
- if (payload.source) {
74
- const resolvedPath = this.resolveSourcePath(payload.source.file);
75
- return {
76
- file: resolvedPath || payload.source.file,
77
- line: payload.source.line,
78
- column: payload.source.column
79
- };
80
- }
81
- if (payload.fallbackId) {
82
- const location = await this.lookupByHanzoId(payload.fallbackId);
83
- if (location) return location;
84
- }
85
- console.warn("[Hanzo] Could not resolve file location for element");
86
- return null;
87
- }
88
- resolveSourcePath(sourcePath) {
89
- if (sourcePath.startsWith("webpack://")) {
90
- sourcePath = sourcePath.replace(/^webpack:\/\/[^\/]+\//, "");
91
- }
92
- const candidates = [
93
- path.join(this.projectRoot, sourcePath),
94
- path.join(this.projectRoot, "src", sourcePath),
95
- path.join(this.projectRoot, sourcePath.replace(/^\.\//, "")),
96
- sourcePath
97
- // absolute path
98
- ];
99
- for (const candidate of candidates) {
100
- if (fs.existsSync(candidate)) {
101
- return candidate;
102
- }
103
- }
104
- return null;
105
- }
106
- async lookupByHanzoId(hanzoId) {
107
- try {
108
- const mapFile = path.join(this.projectRoot, ".hanzo", "id-map.json");
109
- if (fs.existsSync(mapFile)) {
110
- const idMap = JSON.parse(fs.readFileSync(mapFile, "utf-8"));
111
- return idMap[hanzoId] || null;
112
- }
113
- } catch (error) {
114
- console.error("[Hanzo] Error reading ID map:", error);
115
- }
116
- return null;
117
- }
118
- close() {
119
- this.wss.close();
120
- }
121
- };
122
-
123
- // src/cli.ts
124
- var import_chalk = __toESM(require("chalk"));
125
- var path2 = __toESM(require("path"));
126
- var import_child_process = require("child_process");
127
- var program = new import_commander.Command();
128
- program.name("hanzo-browser-server").description("Start the Hanzo browser extension server for click-to-code navigation").version("1.0.0");
129
- program.command("start").description("Start the browser extension WebSocket server").option("-p, --port <port>", "Port to run the server on", "3001").option("-r, --root <path>", "Project root directory", process.cwd()).option("--install-extension", "Build and show instructions for installing the browser extension").action(async (options) => {
130
- const port = parseInt(options.port);
131
- const projectRoot = path2.resolve(options.root);
132
- console.log(import_chalk.default.blue("\u{1F680} Starting Hanzo Browser Extension Server"));
133
- console.log(import_chalk.default.gray(` Port: ${port}`));
134
- console.log(import_chalk.default.gray(` Project root: ${projectRoot}`));
135
- const server = new BrowserExtensionServer(port, projectRoot);
136
- server.on("elementSelected", (data) => {
137
- console.log(import_chalk.default.green("\u2713 Element selected:"));
138
- console.log(import_chalk.default.gray(` File: ${data.file}`));
139
- console.log(import_chalk.default.gray(` Line: ${data.line}`));
140
- if (data.column) console.log(import_chalk.default.gray(` Column: ${data.column}`));
141
- console.log(import_chalk.default.gray(` Framework: ${data.framework || "unknown"}`));
142
- });
143
- console.log(import_chalk.default.green(`\u2713 Server running at ws://localhost:${port}/browser-extension`));
144
- console.log(import_chalk.default.yellow("\n\u{1F4DD} Instructions:"));
145
- console.log("1. Install the browser extension (run with --install-extension flag)");
146
- console.log("2. Ctrl+Click any element in your browser to navigate to its source code");
147
- console.log("3. The server will output the file location for your editor/MCP to handle\n");
148
- if (options.installExtension) {
149
- await installExtension();
150
- }
151
- process.on("SIGINT", () => {
152
- console.log(import_chalk.default.red("\n\u23F9 Shutting down server..."));
153
- server.close();
154
- process.exit(0);
155
- });
156
- });
157
- program.command("install-extension").description("Build and install the browser extension").action(async () => {
158
- await installExtension();
159
- });
160
- program.command("test").description("Run integration tests with mock browser events").action(async () => {
161
- console.log(import_chalk.default.blue("\u{1F9EA} Running integration tests..."));
162
- const server = new BrowserExtensionServer(3001);
163
- const testEvents = [
164
- {
165
- event: "elementSelected",
166
- framework: "react",
167
- domPath: "div#root > div.App > header > h1",
168
- source: {
169
- file: "src/components/Header.tsx",
170
- line: 15,
171
- column: 8
172
- }
173
- },
174
- {
175
- event: "elementSelected",
176
- framework: "vue",
177
- domPath: "div#app > main > button.primary",
178
- source: {
179
- file: "src/components/Button.vue",
180
- line: 23
181
- }
182
- },
183
- {
184
- event: "elementSelected",
185
- framework: null,
186
- domPath: "body > div > p",
187
- fallbackId: "hanzo-id-12345"
188
- }
189
- ];
190
- console.log(import_chalk.default.gray("Sending test events...\n"));
191
- await new Promise((resolve2) => setTimeout(resolve2, 1e3));
192
- const WebSocket = require("ws");
193
- const ws = new WebSocket("ws://localhost:3001/browser-extension");
194
- ws.on("open", () => {
195
- testEvents.forEach((event, index) => {
196
- setTimeout(() => {
197
- console.log(import_chalk.default.blue(`\u2192 Sending test event ${index + 1}:`));
198
- console.log(import_chalk.default.gray(JSON.stringify(event, null, 2)));
199
- ws.send(JSON.stringify(event));
200
- }, index * 1e3);
201
- });
202
- setTimeout(() => {
203
- ws.close();
204
- server.close();
205
- console.log(import_chalk.default.green("\n\u2713 Integration tests completed"));
206
- process.exit(0);
207
- }, testEvents.length * 1e3 + 500);
208
- });
209
- });
210
- async function installExtension() {
211
- console.log(import_chalk.default.blue("\u{1F4E6} Building browser extension..."));
212
- const buildScript = path2.join(__dirname, "..", "browser-extension", "build.js");
213
- return new Promise((resolve2, reject) => {
214
- const build = (0, import_child_process.spawn)("node", [buildScript], {
215
- stdio: "inherit"
216
- });
217
- build.on("close", (code) => {
218
- if (code === 0) {
219
- console.log(import_chalk.default.green("\n\u2713 Extension built successfully!"));
220
- console.log(import_chalk.default.yellow("\n\u{1F4DD} Installation instructions:"));
221
- console.log("1. Open Chrome and navigate to chrome://extensions/");
222
- console.log('2. Enable "Developer mode" (toggle in top right)');
223
- console.log('3. Click "Load unpacked"');
224
- console.log(`4. Select the folder: ${path2.join(__dirname, "..", "..", "dist", "browser-extension")}`);
225
- console.log("5. The extension is now installed! Ctrl+Click elements to navigate to source.\n");
226
- resolve2();
227
- } else {
228
- reject(new Error(`Build failed with code ${code}`));
229
- }
230
- });
231
- });
232
- }
233
- program.parse();