diff --git a/README.md b/README.md index 907af36..78b3b55 100644 --- a/README.md +++ b/README.md @@ -14,3 +14,4 @@ This is currently a WIP, but in active development (as of Nov 2025). - Add option to keep model loaded vs load each time - model load progress monitoring in popup +- Fix webpacked web-llm as it's 0.73MB over Mozilla's signing limit diff --git a/addon/assets/icon-32.png b/addon/assets/icon-32.png new file mode 100644 index 0000000..ddf8419 Binary files /dev/null and b/addon/assets/icon-32.png differ diff --git a/addon/assets/icon-400.png b/addon/assets/icon-400.png new file mode 100644 index 0000000..173d1f0 Binary files /dev/null and b/addon/assets/icon-400.png differ diff --git a/addon/assets/icon-48.png b/addon/assets/icon-48.png new file mode 100644 index 0000000..bab727e Binary files /dev/null and b/addon/assets/icon-48.png differ diff --git a/addon/assets/icon.svg b/addon/assets/icon.svg new file mode 100644 index 0000000..ae95cd8 --- /dev/null +++ b/addon/assets/icon.svg @@ -0,0 +1,125 @@ + + + + + + + + + + + + + + + + + + + + + + + + nms + + diff --git a/addon/manifest.json b/addon/manifest.json index 47e2d45..ed30fae 100644 --- a/addon/manifest.json +++ b/addon/manifest.json @@ -5,10 +5,10 @@ "description": "AI Job Application Assistant", "homepage_url": "https://git.corrupt.link/liz/nms", "icons": { - "32": "assets/logo-32.png" + "32": "assets/icon-32.png" }, "browser_action": { - "default_icon": "assets/logo-32.png", + "default_icon": "assets/icon-32.png", "default_title": "Notice Me Senpai", "default_popup": "popup/popup.html", "browser_style": true @@ -34,7 +34,10 @@ "browser_specific_settings": { "gecko": { "id": "nms@cray.software", - "strict_min_version": "58.0" + "strict_min_version": "79.0", + "data_collection_permissions": { + "required": ["none"] + } } } } diff --git a/addon/metadata.json b/addon/metadata.json new file mode 100644 index 0000000..dcd0d1e --- /dev/null +++ b/addon/metadata.json @@ -0,0 +1,19 @@ +{ + "summary": { + "en-US": "Job application ML assistant tool with local LLM support" + }, + "name": { + "en-US": "Notice Me Senpai" + }, + "homepage": "https://git.corrupt.link/liz/nms", + "is_experimental": true, + "categories": [ + "other" + ], + "version": { + "license": "MPL-2.0", + "compatibility": [ + "firefox" + ] + } +} diff --git a/background/background.js b/background/background.js index ca04719..c194c3e 100644 --- a/background/background.js +++ b/background/background.js @@ -1,4 +1,4 @@ -import { CreateMLCEngine } from "@mlc-ai/web-llm"; +import { CreateMLCEngine } from "@mlc-ai/web-llm" var engine = null var resume = "" @@ -12,7 +12,7 @@ const loadProgress = (progress) => { const loadResources = async () => { let modelName = (await browser.storage.local.get("model")).model || "Llama-3.2-1B-Instruct-q4f32_1-MLC" console.log(`Loading model: ${modelName}`) - engine = await CreateMLCEngine(modelName, { initProgressCallback: loadProgress }); + engine = await CreateMLCEngine(modelName, { initProgressCallback: loadProgress }) console.log("Model loaded") resume = (await browser.storage.local.get("resume")).resume || "No resume, halt and ask for resume." resourcesLoaded = true @@ -44,7 +44,7 @@ browser.contextMenus.create({ browser.contextMenus.onClicked.addListener((info, tab) => { if (info.menuItemId === "nms-cmenu" && info.selectionText) { // Handle context menu click with selected text - console.log("Context menu clicked with selection:", info.selectionText); + console.log("Context menu clicked with selection:", info.selectionText) runMatch(info.selectionText) } }) diff --git a/package-lock.json b/package-lock.json index 1246a97..17a7f66 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,9 @@ "style-loader": "^4.0.0", "webpack": "^5.102.1", "webpack-cli": "^6.0.1" + }, + "devDependencies": { + "webpack-bundle-analyzer": "^4.10.2" } }, "node_modules/@discoveryjs/json-ext": { @@ -379,6 +382,13 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true, + "license": "MIT" + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -657,6 +667,19 @@ "acorn": "^8.14.0" } }, + "node_modules/acorn-walk": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", + "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/ajv": { "version": "8.17.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", @@ -913,6 +936,13 @@ "node": ">=4" } }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "dev": true, + "license": "MIT" + }, "node_modules/detect-libc": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", @@ -926,6 +956,13 @@ "node": ">=0.10" } }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true, + "license": "MIT" + }, "node_modules/electron-to-chromium": { "version": "1.5.249", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.249.tgz", @@ -972,6 +1009,19 @@ "node": ">=6" } }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -1111,6 +1161,22 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -1132,6 +1198,13 @@ "node": ">= 0.4" } }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, "node_modules/icss-utils": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", @@ -1367,6 +1440,16 @@ "node": ">= 0.6" } }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -1410,6 +1493,16 @@ "integrity": "sha512-/AD7JGJbcp1pB5XwYkJyivqdeXofUP5u2lkif6vLGLc+SsV9OCC0JFNpVwM5pqHuFqbyojRt6xILuidJOwwJDQ==", "license": "(Apache-2.0 AND CC-BY-SA-4.0)" }, + "node_modules/opener": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz", + "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==", + "dev": true, + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -1844,6 +1937,21 @@ "node": ">=8" } }, + "node_modules/sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -1993,6 +2101,16 @@ "node": ">=8.0" } }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/undici-types": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", @@ -2096,6 +2214,53 @@ } } }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz", + "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, "node_modules/webpack-cli": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-6.0.1.tgz", @@ -2190,6 +2355,28 @@ "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "license": "MIT" + }, + "node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } } } } diff --git a/package.json b/package.json index 6b89234..6fac05b 100644 --- a/package.json +++ b/package.json @@ -21,5 +21,8 @@ "style-loader": "^4.0.0", "webpack": "^5.102.1", "webpack-cli": "^6.0.1" + }, + "devDependencies": { + "webpack-bundle-analyzer": "^4.10.2" } } diff --git a/webpack.config.js b/webpack.config.js index 7736ef4..ac61aa8 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -1,4 +1,6 @@ -const path = require("path") +const path = require("path"); +const { optimize } = require("webpack"); +const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin; module.exports = { entry: { @@ -13,8 +15,11 @@ module.exports = { mode: "none", watch: false, watchOptions: { - ignored: '**/node_modules', - }, + ignored: '**/node_modules', + }, + optimization: { + minimize: false + }, module: { rules: [ { @@ -29,5 +34,8 @@ module.exports = { ], }, ], - } + }, + plugins: [ + new BundleAnalyzerPlugin() + ] }