├── CNAME ├── README.md ├── backend ├── .gitignore ├── index.js ├── package-lock.json ├── package.json └── yarn.lock ├── images ├── dev-mode.png ├── logo1.png ├── logo2.png ├── umix-banner.png └── unpacked.png ├── index.html ├── index.js ├── js-confetti.min.js ├── lib.js ├── lib ├── library.js └── package.json ├── manifest.json └── package-lock.json /CNAME: -------------------------------------------------------------------------------- 1 | umix.dev -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | > ⚠️ **Security Disclaimer**: Do not use in production. This is experimental software. Here be dragons 🐉 2 | 3 | Banner 4 | 5 | # [umix.dev](https://umix.dev) 6 | 7 | Umix is a browser extension and developer tool for remixing websites. Let's make the web fun. 8 | 9 | If you're just interested in just trying it out, go to our [Repl.it playground](https://replit.com/@aidenbai05/QuestionableRedForm#script.js). Or, [watch our video](https://youtu.be/8rdGUPiv2O0). 10 | 11 | Continue if you want to use it in real world websites. 12 | 13 | ## Umix as a Browser Extension 14 | 15 | > **Note:** Umix is pending approval on the Chrome Extension Store. For now, you can manually integrate it via Developer Mode. We currently only support Chrome and Chromium Browsers (Edge, Arc, Brave, Opera, etc.) 16 | 17 | 1. [Click to download the project ZIP](https://github.com/pranavnt/umix/archive/refs/heads/master.zip) 18 | 2. Unzip `umix-master.zip`. 19 | 3. Type `chrome://extensions` in your URL address bar 20 | 4. Activate Developer Mode 21 | image 22 | 23 | 5. Click Load Unpacked 24 | image 25 | 26 | 6. Select the `umix-master` folder 27 | 7. Profit. 28 | 29 | ## Umix as a Developer Tool 30 | 31 | Just drop a ` 35 | ``` 36 | 37 | ## Inspiration 38 | 39 | **The Web is boring.** 40 | 41 | Monotonous dashboards. Identical interfaces. All apps look the same. 42 | 43 | **The Web should be fun.** 44 | 45 | Our earliest memories, friends, and identities were made on the web. Deep in IRC chats and custom MySpace CSS and random Wikipedia docs, we found a home–a home in a community of folks who also found the Web fun. 46 | 47 | While the Web has matured over the past couple years, there’s an undeniable charm to it’s more hackable and playful past. 48 | 49 | 50 | ## What it does 51 | 52 | **Remix the web.** Umix is a browser extension and developer tool that allows internet users to easily remix, reimagine, and reshare web interfaces. 53 | 54 | Imagine being able to hover on any part of the page, ask an AI to change it to your desires, and see your creation live – that’s Umix. 55 | 56 | 57 | 58 | ## How we built it 59 | 60 | On the frontend, we built a chrome extension that traverses the in-memory DOM and updates the HTML based on our backend’s response. 61 | 62 | On the backend, we have a Node.js server that handles requests from the frontend. We equipped GPT-4 with a web browser, so it can browse websites and fetch content when it is unsure what to do. This happens multiple times, allowing us to get live information from the web. 63 | 64 | Finally, we built a developer tool that allows any web developer to integrate Umix as a JavaScript library. This allows developers to enable native remixing experiences on their own websites. 65 | 66 | 67 | ## Challenges we ran into 68 | 69 | 70 | - **Unreliability of LLMs** — GPT-4 hallucinated (made stuff up) multiple times or didn’t know the answer to various questions when testing — we couldn’t build directly on top of OpenAI and needed to connect GPT-4 to other tools. We connected it to a web browser using langchain.js and had it fetch factual information/documentation for tools from websites if it was unsure about the answer. 71 | - **DOM structure is hard** – we had to deal with ways to handle wrapper elements, excessive attributes, and overriding classes 72 | - **Designing the UI** – creating a very intuitive UI, especially for remixing use, is extremely difficult. We eventually landed on a very similar approach to v0.dev’s select tool 73 | - **CSR/CORS + Devtool fun** – creating a secure, safe, and robust developer tool and chrome extension, while ensuring security requirements are met took many arduous hours of crying 74 | 75 | ## What's next for Umix 76 | 77 | We made small demo post on Twitter (X) 12 hours ago and has been **viewed 25,000+ times**. 78 | 79 | We already have **80** people on our waitlist (as of 4 am) 80 | 81 | **It’s time to make the Web fun. Together, we can remix the web.** 82 | -------------------------------------------------------------------------------- /backend/.gitignore: -------------------------------------------------------------------------------- 1 | .env 2 | node_modules/ -------------------------------------------------------------------------------- /backend/index.js: -------------------------------------------------------------------------------- 1 | const oai = require("openai"); 2 | const express = require('express'); 3 | const cors = require('cors'); // Import cors middleware 4 | const { OpenAI } = require("langchain/llms/openai"); 5 | const { ChatOpenAI } = require("langchain/chat_models/openai"); 6 | const { WebBrowser } = require("langchain/tools/webbrowser"); 7 | const { OpenAIEmbeddings } = require("langchain/embeddings/openai"); 8 | const { initializeAgentExecutorWithOptions } = require("langchain/agents"); 9 | const app = express(); 10 | 11 | // load dotenv 12 | require("dotenv").config(); 13 | 14 | 15 | const port = process.env.PORT; 16 | 17 | const embeddings = new OpenAIEmbeddings(); 18 | const model = new OpenAI({ modelName: "gpt-4", temperature: 0}); 19 | const tools = [ 20 | new WebBrowser({ model, embeddings }), 21 | ]; 22 | 23 | 24 | app.use(express.json()); 25 | app.use(cors({ origin: "*" })); 26 | 27 | app.post('/edit', async (req, res) => { 28 | const { html, edit } = req.body; 29 | console.log({html, edit}); 30 | const executor = await initializeAgentExecutorWithOptions(tools, model, { 31 | agentType: "zero-shot-react-description", 32 | verbose: true, 33 | }); 34 | console.log("Loaded agent."); 35 | 36 | console.log(executor); 37 | 38 | const input = `You are a HTML processer. You are given raw HTML, and a task. 39 | You must output the raw HTML and its original content and nothing else. 40 | // 1. Try to be additive, keep as much of the original structure and styles unless otherwise specified. 41 | // 2. In the final output, only include the raw HTML — NOTHING else. 42 | // 3. When image URLs are asked for, find an actual image URL on the internet to use. 43 | // 4. Do NOT use the web browser unless the user asks for information on the internet (such as a summary or image). 44 | 45 | ## Input 46 | HTML: ${html} 47 | Task: ${edit} 48 | // The output MUST be HTML and HTML only — no text`; 49 | 50 | const result = await executor.call({ input }); 51 | 52 | console.log(result); 53 | res.json({output: result}); 54 | }); 55 | 56 | app.listen(port, () => { 57 | console.log(`Server listening at http://localhost:${port}`); 58 | }); 59 | -------------------------------------------------------------------------------- /backend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "backend", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "Pranav Teegavarapu", 11 | "license": "ISC", 12 | "dependencies": { 13 | "axios": "^1.5.1", 14 | "cheerio": "^1.0.0-rc.12", 15 | "cors": "^2.8.5", 16 | "dotenv": "^16.3.1", 17 | "express": "^4.18.2", 18 | "langchain": "^0.0.167", 19 | "openai": "^4.12.1" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /backend/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@anthropic-ai/sdk@^0.6.2": 6 | version "0.6.2" 7 | resolved "https://registry.npmjs.org/@anthropic-ai/sdk/-/sdk-0.6.2.tgz" 8 | integrity sha512-fB9PUj9RFT+XjkL+E9Ol864ZIJi+1P8WnbHspN3N3/GK2uSzjd0cbVIKTGgf4v3N8MwaQu+UWnU7C4BG/fap/g== 9 | dependencies: 10 | "@types/node" "^18.11.18" 11 | "@types/node-fetch" "^2.6.4" 12 | abort-controller "^3.0.0" 13 | agentkeepalive "^4.2.1" 14 | digest-fetch "^1.3.0" 15 | form-data-encoder "1.7.2" 16 | formdata-node "^4.3.2" 17 | node-fetch "^2.6.7" 18 | 19 | "@types/node-fetch@^2.6.4": 20 | version "2.6.6" 21 | resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.6.tgz" 22 | integrity sha512-95X8guJYhfqiuVVhRFxVQcf4hW/2bCuoPwDasMf/531STFoNoWTT7YDnWdXHEZKqAGUigmpG31r2FE70LwnzJw== 23 | dependencies: 24 | "@types/node" "*" 25 | form-data "^4.0.0" 26 | 27 | "@types/node@*": 28 | version "20.8.6" 29 | resolved "https://registry.npmjs.org/@types/node/-/node-20.8.6.tgz" 30 | integrity sha512-eWO4K2Ji70QzKUqRy6oyJWUeB7+g2cRagT3T/nxYibYcT4y2BDL8lqolRXjTHmkZCdJfIPaY73KbJAZmcryxTQ== 31 | dependencies: 32 | undici-types "~5.25.1" 33 | 34 | "@types/node@^18.11.18": 35 | version "18.18.5" 36 | resolved "https://registry.npmjs.org/@types/node/-/node-18.18.5.tgz" 37 | integrity sha512-4slmbtwV59ZxitY4ixUZdy1uRLf9eSIvBWPQxNjhHYWEtn0FryfKpyS2cvADYXTayWdKEIsJengncrVvkI4I6A== 38 | 39 | "@types/retry@0.12.0": 40 | version "0.12.0" 41 | resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz" 42 | integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== 43 | 44 | "@types/uuid@^9.0.1": 45 | version "9.0.5" 46 | resolved "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.5.tgz" 47 | integrity sha512-xfHdwa1FMJ082prjSJpoEI57GZITiQz10r3vEJCHa2khEFQjKy91aWKz6+zybzssCvXUwE1LQWgWVwZ4nYUvHQ== 48 | 49 | abort-controller@^3.0.0: 50 | version "3.0.0" 51 | resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz" 52 | integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== 53 | dependencies: 54 | event-target-shim "^5.0.0" 55 | 56 | accepts@~1.3.8: 57 | version "1.3.8" 58 | resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" 59 | integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== 60 | dependencies: 61 | mime-types "~2.1.34" 62 | negotiator "0.6.3" 63 | 64 | agentkeepalive@^4.2.1: 65 | version "4.5.0" 66 | resolved "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz" 67 | integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== 68 | dependencies: 69 | humanize-ms "^1.2.1" 70 | 71 | ansi-styles@^5.0.0: 72 | version "5.2.0" 73 | resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" 74 | integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== 75 | 76 | argparse@^2.0.1: 77 | version "2.0.1" 78 | resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" 79 | integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== 80 | 81 | array-flatten@1.1.1: 82 | version "1.1.1" 83 | resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" 84 | integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== 85 | 86 | asynckit@^0.4.0: 87 | version "0.4.0" 88 | resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" 89 | integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== 90 | 91 | axios@^1.5.1: 92 | version "1.5.1" 93 | resolved "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz" 94 | integrity sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A== 95 | dependencies: 96 | follow-redirects "^1.15.0" 97 | form-data "^4.0.0" 98 | proxy-from-env "^1.1.0" 99 | 100 | base-64@^0.1.0: 101 | version "0.1.0" 102 | resolved "https://registry.npmjs.org/base-64/-/base-64-0.1.0.tgz" 103 | integrity sha512-Y5gU45svrR5tI2Vt/X9GPd3L0HNIKzGu202EjxrXMpuc2V2CiKgemAbUUsqYmZJvPtCXoUKjNZwBJzsNScUbXA== 104 | 105 | base64-js@^1.5.1: 106 | version "1.5.1" 107 | resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" 108 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== 109 | 110 | binary-extensions@^2.2.0: 111 | version "2.2.0" 112 | resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" 113 | integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== 114 | 115 | binary-search@^1.3.5: 116 | version "1.3.6" 117 | resolved "https://registry.npmjs.org/binary-search/-/binary-search-1.3.6.tgz" 118 | integrity sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA== 119 | 120 | body-parser@1.20.1: 121 | version "1.20.1" 122 | resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz" 123 | integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== 124 | dependencies: 125 | bytes "3.1.2" 126 | content-type "~1.0.4" 127 | debug "2.6.9" 128 | depd "2.0.0" 129 | destroy "1.2.0" 130 | http-errors "2.0.0" 131 | iconv-lite "0.4.24" 132 | on-finished "2.4.1" 133 | qs "6.11.0" 134 | raw-body "2.5.1" 135 | type-is "~1.6.18" 136 | unpipe "1.0.0" 137 | 138 | boolbase@^1.0.0: 139 | version "1.0.0" 140 | resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" 141 | integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== 142 | 143 | bytes@3.1.2: 144 | version "3.1.2" 145 | resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" 146 | integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== 147 | 148 | call-bind@^1.0.0: 149 | version "1.0.2" 150 | resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" 151 | integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== 152 | dependencies: 153 | function-bind "^1.1.1" 154 | get-intrinsic "^1.0.2" 155 | 156 | camelcase@6: 157 | version "6.3.0" 158 | resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" 159 | integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== 160 | 161 | charenc@0.0.2: 162 | version "0.0.2" 163 | resolved "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz" 164 | integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== 165 | 166 | cheerio-select@^2.1.0: 167 | version "2.1.0" 168 | resolved "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz" 169 | integrity sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g== 170 | dependencies: 171 | boolbase "^1.0.0" 172 | css-select "^5.1.0" 173 | css-what "^6.1.0" 174 | domelementtype "^2.3.0" 175 | domhandler "^5.0.3" 176 | domutils "^3.0.1" 177 | 178 | cheerio@^1.0.0-rc.12: 179 | version "1.0.0-rc.12" 180 | resolved "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz" 181 | integrity sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q== 182 | dependencies: 183 | cheerio-select "^2.1.0" 184 | dom-serializer "^2.0.0" 185 | domhandler "^5.0.3" 186 | domutils "^3.0.1" 187 | htmlparser2 "^8.0.1" 188 | parse5 "^7.0.0" 189 | parse5-htmlparser2-tree-adapter "^7.0.0" 190 | 191 | combined-stream@^1.0.8: 192 | version "1.0.8" 193 | resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" 194 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 195 | dependencies: 196 | delayed-stream "~1.0.0" 197 | 198 | commander@^10.0.1: 199 | version "10.0.1" 200 | resolved "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz" 201 | integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== 202 | 203 | content-disposition@0.5.4: 204 | version "0.5.4" 205 | resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" 206 | integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== 207 | dependencies: 208 | safe-buffer "5.2.1" 209 | 210 | content-type@~1.0.4: 211 | version "1.0.5" 212 | resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" 213 | integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== 214 | 215 | cookie-signature@1.0.6: 216 | version "1.0.6" 217 | resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" 218 | integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== 219 | 220 | cookie@0.5.0: 221 | version "0.5.0" 222 | resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz" 223 | integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== 224 | 225 | cors@^2.8.5: 226 | version "2.8.5" 227 | resolved "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz" 228 | integrity sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g== 229 | dependencies: 230 | object-assign "^4" 231 | vary "^1" 232 | 233 | crypt@0.0.2: 234 | version "0.0.2" 235 | resolved "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz" 236 | integrity sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow== 237 | 238 | css-select@^5.1.0: 239 | version "5.1.0" 240 | resolved "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz" 241 | integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== 242 | dependencies: 243 | boolbase "^1.0.0" 244 | css-what "^6.1.0" 245 | domhandler "^5.0.2" 246 | domutils "^3.0.1" 247 | nth-check "^2.0.1" 248 | 249 | css-what@^6.1.0: 250 | version "6.1.0" 251 | resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" 252 | integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== 253 | 254 | debug@2.6.9: 255 | version "2.6.9" 256 | resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" 257 | integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== 258 | dependencies: 259 | ms "2.0.0" 260 | 261 | decamelize@^1.2.0: 262 | version "1.2.0" 263 | resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" 264 | integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== 265 | 266 | delayed-stream@~1.0.0: 267 | version "1.0.0" 268 | resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" 269 | integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== 270 | 271 | depd@2.0.0: 272 | version "2.0.0" 273 | resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" 274 | integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== 275 | 276 | destroy@1.2.0: 277 | version "1.2.0" 278 | resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" 279 | integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== 280 | 281 | digest-fetch@^1.3.0: 282 | version "1.3.0" 283 | resolved "https://registry.npmjs.org/digest-fetch/-/digest-fetch-1.3.0.tgz" 284 | integrity sha512-CGJuv6iKNM7QyZlM2T3sPAdZWd/p9zQiRNS9G+9COUCwzWFTs0Xp8NF5iePx7wtvhDykReiRRrSeNb4oMmB8lA== 285 | dependencies: 286 | base-64 "^0.1.0" 287 | md5 "^2.3.0" 288 | 289 | dom-serializer@^2.0.0: 290 | version "2.0.0" 291 | resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz" 292 | integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== 293 | dependencies: 294 | domelementtype "^2.3.0" 295 | domhandler "^5.0.2" 296 | entities "^4.2.0" 297 | 298 | domelementtype@^2.3.0: 299 | version "2.3.0" 300 | resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" 301 | integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== 302 | 303 | domhandler@^5.0.2, domhandler@^5.0.3: 304 | version "5.0.3" 305 | resolved "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz" 306 | integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== 307 | dependencies: 308 | domelementtype "^2.3.0" 309 | 310 | domutils@^3.0.1: 311 | version "3.1.0" 312 | resolved "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz" 313 | integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== 314 | dependencies: 315 | dom-serializer "^2.0.0" 316 | domelementtype "^2.3.0" 317 | domhandler "^5.0.3" 318 | 319 | dotenv@^16.3.1: 320 | version "16.3.1" 321 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" 322 | integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== 323 | 324 | ee-first@1.1.1: 325 | version "1.1.1" 326 | resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" 327 | integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== 328 | 329 | encodeurl@~1.0.2: 330 | version "1.0.2" 331 | resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" 332 | integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== 333 | 334 | entities@^4.2.0, entities@^4.4.0: 335 | version "4.5.0" 336 | resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" 337 | integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== 338 | 339 | escape-html@~1.0.3: 340 | version "1.0.3" 341 | resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" 342 | integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== 343 | 344 | etag@~1.8.1: 345 | version "1.8.1" 346 | resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" 347 | integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== 348 | 349 | event-target-shim@^5.0.0: 350 | version "5.0.1" 351 | resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" 352 | integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== 353 | 354 | eventemitter3@^4.0.4: 355 | version "4.0.7" 356 | resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" 357 | integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== 358 | 359 | expr-eval@^2.0.2: 360 | version "2.0.2" 361 | resolved "https://registry.npmjs.org/expr-eval/-/expr-eval-2.0.2.tgz" 362 | integrity sha512-4EMSHGOPSwAfBiibw3ndnP0AvjDWLsMvGOvWEZ2F96IGk0bIVdjQisOHxReSkE13mHcfbuCiXw+G4y0zv6N8Eg== 363 | 364 | express@^4.18.2: 365 | version "4.18.2" 366 | resolved "https://registry.npmjs.org/express/-/express-4.18.2.tgz" 367 | integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== 368 | dependencies: 369 | accepts "~1.3.8" 370 | array-flatten "1.1.1" 371 | body-parser "1.20.1" 372 | content-disposition "0.5.4" 373 | content-type "~1.0.4" 374 | cookie "0.5.0" 375 | cookie-signature "1.0.6" 376 | debug "2.6.9" 377 | depd "2.0.0" 378 | encodeurl "~1.0.2" 379 | escape-html "~1.0.3" 380 | etag "~1.8.1" 381 | finalhandler "1.2.0" 382 | fresh "0.5.2" 383 | http-errors "2.0.0" 384 | merge-descriptors "1.0.1" 385 | methods "~1.1.2" 386 | on-finished "2.4.1" 387 | parseurl "~1.3.3" 388 | path-to-regexp "0.1.7" 389 | proxy-addr "~2.0.7" 390 | qs "6.11.0" 391 | range-parser "~1.2.1" 392 | safe-buffer "5.2.1" 393 | send "0.18.0" 394 | serve-static "1.15.0" 395 | setprototypeof "1.2.0" 396 | statuses "2.0.1" 397 | type-is "~1.6.18" 398 | utils-merge "1.0.1" 399 | vary "~1.1.2" 400 | 401 | finalhandler@1.2.0: 402 | version "1.2.0" 403 | resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz" 404 | integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== 405 | dependencies: 406 | debug "2.6.9" 407 | encodeurl "~1.0.2" 408 | escape-html "~1.0.3" 409 | on-finished "2.4.1" 410 | parseurl "~1.3.3" 411 | statuses "2.0.1" 412 | unpipe "~1.0.0" 413 | 414 | flat@^5.0.2: 415 | version "5.0.2" 416 | resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" 417 | integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== 418 | 419 | follow-redirects@^1.15.0: 420 | version "1.15.3" 421 | resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz" 422 | integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== 423 | 424 | form-data-encoder@1.7.2: 425 | version "1.7.2" 426 | resolved "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.7.2.tgz" 427 | integrity sha512-qfqtYan3rxrnCk1VYaA4H+Ms9xdpPqvLZa6xmMgFvhO32x7/3J/ExcTd6qpxM0vH2GdMI+poehyBZvqfMTto8A== 428 | 429 | form-data@^4.0.0: 430 | version "4.0.0" 431 | resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" 432 | integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== 433 | dependencies: 434 | asynckit "^0.4.0" 435 | combined-stream "^1.0.8" 436 | mime-types "^2.1.12" 437 | 438 | formdata-node@^4.3.2: 439 | version "4.4.1" 440 | resolved "https://registry.npmjs.org/formdata-node/-/formdata-node-4.4.1.tgz" 441 | integrity sha512-0iirZp3uVDjVGt9p49aTaqjk84TrglENEDuqfdlZQ1roC9CWlPk6Avf8EEnZNcAqPonwkG35x4n3ww/1THYAeQ== 442 | dependencies: 443 | node-domexception "1.0.0" 444 | web-streams-polyfill "4.0.0-beta.3" 445 | 446 | forwarded@0.2.0: 447 | version "0.2.0" 448 | resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" 449 | integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== 450 | 451 | fresh@0.5.2: 452 | version "0.5.2" 453 | resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" 454 | integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== 455 | 456 | function-bind@^1.1.1: 457 | version "1.1.2" 458 | resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz" 459 | integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== 460 | 461 | get-intrinsic@^1.0.2: 462 | version "1.2.1" 463 | resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz" 464 | integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== 465 | dependencies: 466 | function-bind "^1.1.1" 467 | has "^1.0.3" 468 | has-proto "^1.0.1" 469 | has-symbols "^1.0.3" 470 | 471 | has-proto@^1.0.1: 472 | version "1.0.1" 473 | resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz" 474 | integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== 475 | 476 | has-symbols@^1.0.3: 477 | version "1.0.3" 478 | resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" 479 | integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== 480 | 481 | has@^1.0.3: 482 | version "1.0.4" 483 | resolved "https://registry.npmjs.org/has/-/has-1.0.4.tgz" 484 | integrity sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ== 485 | 486 | htmlparser2@^8.0.1: 487 | version "8.0.2" 488 | resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz" 489 | integrity sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA== 490 | dependencies: 491 | domelementtype "^2.3.0" 492 | domhandler "^5.0.3" 493 | domutils "^3.0.1" 494 | entities "^4.4.0" 495 | 496 | http-errors@2.0.0: 497 | version "2.0.0" 498 | resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" 499 | integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== 500 | dependencies: 501 | depd "2.0.0" 502 | inherits "2.0.4" 503 | setprototypeof "1.2.0" 504 | statuses "2.0.1" 505 | toidentifier "1.0.1" 506 | 507 | humanize-ms@^1.2.1: 508 | version "1.2.1" 509 | resolved "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz" 510 | integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== 511 | dependencies: 512 | ms "^2.0.0" 513 | 514 | iconv-lite@0.4.24: 515 | version "0.4.24" 516 | resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" 517 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 518 | dependencies: 519 | safer-buffer ">= 2.1.2 < 3" 520 | 521 | inherits@2.0.4: 522 | version "2.0.4" 523 | resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" 524 | integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== 525 | 526 | ipaddr.js@1.9.1: 527 | version "1.9.1" 528 | resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" 529 | integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== 530 | 531 | is-any-array@^2.0.0: 532 | version "2.0.1" 533 | resolved "https://registry.npmjs.org/is-any-array/-/is-any-array-2.0.1.tgz" 534 | integrity sha512-UtilS7hLRu++wb/WBAw9bNuP1Eg04Ivn1vERJck8zJthEvXCBEBpGR/33u/xLKWEQf95803oalHrVDptcAvFdQ== 535 | 536 | is-buffer@~1.1.6: 537 | version "1.1.6" 538 | resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" 539 | integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== 540 | 541 | js-tiktoken@^1.0.7: 542 | version "1.0.7" 543 | resolved "https://registry.npmjs.org/js-tiktoken/-/js-tiktoken-1.0.7.tgz" 544 | integrity sha512-biba8u/clw7iesNEWLOLwrNGoBP2lA+hTaBLs/D45pJdUPFXyxD6nhcDVtADChghv4GgyAiMKYMiRx7x6h7Biw== 545 | dependencies: 546 | base64-js "^1.5.1" 547 | 548 | js-yaml@^4.1.0: 549 | version "4.1.0" 550 | resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" 551 | integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== 552 | dependencies: 553 | argparse "^2.0.1" 554 | 555 | jsonpointer@^5.0.1: 556 | version "5.0.1" 557 | resolved "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz" 558 | integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== 559 | 560 | langchain@^0.0.167: 561 | version "0.0.167" 562 | resolved "https://registry.npmjs.org/langchain/-/langchain-0.0.167.tgz" 563 | integrity sha512-3unZvKe4HJ7kiP/G4zGivz3B1deHVhl5RqkBHAMlHbKGQ01ZukATUr9ITmbB28y3q+z1CwA5JRy+vgJv3qsETw== 564 | dependencies: 565 | "@anthropic-ai/sdk" "^0.6.2" 566 | ansi-styles "^5.0.0" 567 | binary-extensions "^2.2.0" 568 | camelcase "6" 569 | decamelize "^1.2.0" 570 | expr-eval "^2.0.2" 571 | flat "^5.0.2" 572 | js-tiktoken "^1.0.7" 573 | js-yaml "^4.1.0" 574 | jsonpointer "^5.0.1" 575 | langchainhub "~0.0.6" 576 | langsmith "~0.0.31" 577 | ml-distance "^4.0.0" 578 | object-hash "^3.0.0" 579 | openai "~4.4.0" 580 | openapi-types "^12.1.3" 581 | p-queue "^6.6.2" 582 | p-retry "4" 583 | uuid "^9.0.0" 584 | yaml "^2.2.1" 585 | zod "^3.22.3" 586 | zod-to-json-schema "^3.20.4" 587 | 588 | langchainhub@~0.0.6: 589 | version "0.0.6" 590 | resolved "https://registry.npmjs.org/langchainhub/-/langchainhub-0.0.6.tgz" 591 | integrity sha512-SW6105T+YP1cTe0yMf//7kyshCgvCTyFBMTgH2H3s9rTAR4e+78DA/BBrUL/Mt4Q5eMWui7iGuAYb3pgGsdQ9w== 592 | 593 | langsmith@~0.0.31: 594 | version "0.0.42" 595 | resolved "https://registry.npmjs.org/langsmith/-/langsmith-0.0.42.tgz" 596 | integrity sha512-sFuN+e7E+pPBIRaRgFqZh/BRBWNHTZNAwi6uj4kydQawooCZYoJmM5snOkiQrhVSvAhgu6xFhLvmfvkPcKzD7w== 597 | dependencies: 598 | "@types/uuid" "^9.0.1" 599 | commander "^10.0.1" 600 | p-queue "^6.6.2" 601 | p-retry "4" 602 | uuid "^9.0.0" 603 | 604 | md5@^2.3.0: 605 | version "2.3.0" 606 | resolved "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz" 607 | integrity sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g== 608 | dependencies: 609 | charenc "0.0.2" 610 | crypt "0.0.2" 611 | is-buffer "~1.1.6" 612 | 613 | media-typer@0.3.0: 614 | version "0.3.0" 615 | resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" 616 | integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== 617 | 618 | merge-descriptors@1.0.1: 619 | version "1.0.1" 620 | resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" 621 | integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== 622 | 623 | methods@~1.1.2: 624 | version "1.1.2" 625 | resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" 626 | integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== 627 | 628 | mime-db@1.52.0: 629 | version "1.52.0" 630 | resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" 631 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 632 | 633 | mime-types@^2.1.12, mime-types@~2.1.24, mime-types@~2.1.34: 634 | version "2.1.35" 635 | resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" 636 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 637 | dependencies: 638 | mime-db "1.52.0" 639 | 640 | mime@1.6.0: 641 | version "1.6.0" 642 | resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" 643 | integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== 644 | 645 | ml-array-mean@^1.1.6: 646 | version "1.1.6" 647 | resolved "https://registry.npmjs.org/ml-array-mean/-/ml-array-mean-1.1.6.tgz" 648 | integrity sha512-MIdf7Zc8HznwIisyiJGRH9tRigg3Yf4FldW8DxKxpCCv/g5CafTw0RRu51nojVEOXuCQC7DRVVu5c7XXO/5joQ== 649 | dependencies: 650 | ml-array-sum "^1.1.6" 651 | 652 | ml-array-sum@^1.1.6: 653 | version "1.1.6" 654 | resolved "https://registry.npmjs.org/ml-array-sum/-/ml-array-sum-1.1.6.tgz" 655 | integrity sha512-29mAh2GwH7ZmiRnup4UyibQZB9+ZLyMShvt4cH4eTK+cL2oEMIZFnSyB3SS8MlsTh6q/w/yh48KmqLxmovN4Dw== 656 | dependencies: 657 | is-any-array "^2.0.0" 658 | 659 | ml-distance-euclidean@^2.0.0: 660 | version "2.0.0" 661 | resolved "https://registry.npmjs.org/ml-distance-euclidean/-/ml-distance-euclidean-2.0.0.tgz" 662 | integrity sha512-yC9/2o8QF0A3m/0IXqCTXCzz2pNEzvmcE/9HFKOZGnTjatvBbsn4lWYJkxENkA4Ug2fnYl7PXQxnPi21sgMy/Q== 663 | 664 | ml-distance@^4.0.0: 665 | version "4.0.1" 666 | resolved "https://registry.npmjs.org/ml-distance/-/ml-distance-4.0.1.tgz" 667 | integrity sha512-feZ5ziXs01zhyFUUUeZV5hwc0f5JW0Sh0ckU1koZe/wdVkJdGxcP06KNQuF0WBTj8FttQUzcvQcpcrOp/XrlEw== 668 | dependencies: 669 | ml-array-mean "^1.1.6" 670 | ml-distance-euclidean "^2.0.0" 671 | ml-tree-similarity "^1.0.0" 672 | 673 | ml-tree-similarity@^1.0.0: 674 | version "1.0.0" 675 | resolved "https://registry.npmjs.org/ml-tree-similarity/-/ml-tree-similarity-1.0.0.tgz" 676 | integrity sha512-XJUyYqjSuUQkNQHMscr6tcjldsOoAekxADTplt40QKfwW6nd++1wHWV9AArl0Zvw/TIHgNaZZNvr8QGvE8wLRg== 677 | dependencies: 678 | binary-search "^1.3.5" 679 | num-sort "^2.0.0" 680 | 681 | ms@2.0.0: 682 | version "2.0.0" 683 | resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" 684 | integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== 685 | 686 | ms@2.1.3, ms@^2.0.0: 687 | version "2.1.3" 688 | resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" 689 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 690 | 691 | negotiator@0.6.3: 692 | version "0.6.3" 693 | resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" 694 | integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== 695 | 696 | node-domexception@1.0.0: 697 | version "1.0.0" 698 | resolved "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz" 699 | integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== 700 | 701 | node-fetch@^2.6.7: 702 | version "2.7.0" 703 | resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" 704 | integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== 705 | dependencies: 706 | whatwg-url "^5.0.0" 707 | 708 | nth-check@^2.0.1: 709 | version "2.1.1" 710 | resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz" 711 | integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== 712 | dependencies: 713 | boolbase "^1.0.0" 714 | 715 | num-sort@^2.0.0: 716 | version "2.1.0" 717 | resolved "https://registry.npmjs.org/num-sort/-/num-sort-2.1.0.tgz" 718 | integrity sha512-1MQz1Ed8z2yckoBeSfkQHHO9K1yDRxxtotKSJ9yvcTUUxSvfvzEq5GwBrjjHEpMlq/k5gvXdmJ1SbYxWtpNoVg== 719 | 720 | object-assign@^4: 721 | version "4.1.1" 722 | resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" 723 | integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== 724 | 725 | object-hash@^3.0.0: 726 | version "3.0.0" 727 | resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" 728 | integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== 729 | 730 | object-inspect@^1.9.0: 731 | version "1.12.3" 732 | resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" 733 | integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== 734 | 735 | on-finished@2.4.1: 736 | version "2.4.1" 737 | resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" 738 | integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== 739 | dependencies: 740 | ee-first "1.1.1" 741 | 742 | openai@^4.12.1: 743 | version "4.12.1" 744 | resolved "https://registry.npmjs.org/openai/-/openai-4.12.1.tgz" 745 | integrity sha512-EAoUwm4dtiWvFwBhOCK/VfF8sj1ZU8+aAIJnfT4NyeTfrt1DM/6Gdd6fOZWTjBYryTAqu9Vpb5+9Wu6JMtm/gA== 746 | dependencies: 747 | "@types/node" "^18.11.18" 748 | "@types/node-fetch" "^2.6.4" 749 | abort-controller "^3.0.0" 750 | agentkeepalive "^4.2.1" 751 | digest-fetch "^1.3.0" 752 | form-data-encoder "1.7.2" 753 | formdata-node "^4.3.2" 754 | node-fetch "^2.6.7" 755 | 756 | openai@~4.4.0: 757 | version "4.4.0" 758 | resolved "https://registry.npmjs.org/openai/-/openai-4.4.0.tgz" 759 | integrity sha512-JN0t628Kh95T0IrXl0HdBqnlJg+4Vq0Bnh55tio+dfCnyzHvMLiWyCM9m726MAJD2YkDU4/8RQB6rNbEq9ct2w== 760 | dependencies: 761 | "@types/node" "^18.11.18" 762 | "@types/node-fetch" "^2.6.4" 763 | abort-controller "^3.0.0" 764 | agentkeepalive "^4.2.1" 765 | digest-fetch "^1.3.0" 766 | form-data-encoder "1.7.2" 767 | formdata-node "^4.3.2" 768 | node-fetch "^2.6.7" 769 | 770 | openapi-types@^12.1.3: 771 | version "12.1.3" 772 | resolved "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz" 773 | integrity sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw== 774 | 775 | p-finally@^1.0.0: 776 | version "1.0.0" 777 | resolved "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz" 778 | integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== 779 | 780 | p-queue@^6.6.2: 781 | version "6.6.2" 782 | resolved "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz" 783 | integrity sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ== 784 | dependencies: 785 | eventemitter3 "^4.0.4" 786 | p-timeout "^3.2.0" 787 | 788 | p-retry@4: 789 | version "4.6.2" 790 | resolved "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz" 791 | integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== 792 | dependencies: 793 | "@types/retry" "0.12.0" 794 | retry "^0.13.1" 795 | 796 | p-timeout@^3.2.0: 797 | version "3.2.0" 798 | resolved "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz" 799 | integrity sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg== 800 | dependencies: 801 | p-finally "^1.0.0" 802 | 803 | parse5-htmlparser2-tree-adapter@^7.0.0: 804 | version "7.0.0" 805 | resolved "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz" 806 | integrity sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g== 807 | dependencies: 808 | domhandler "^5.0.2" 809 | parse5 "^7.0.0" 810 | 811 | parse5@^7.0.0: 812 | version "7.1.2" 813 | resolved "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz" 814 | integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== 815 | dependencies: 816 | entities "^4.4.0" 817 | 818 | parseurl@~1.3.3: 819 | version "1.3.3" 820 | resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" 821 | integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== 822 | 823 | path-to-regexp@0.1.7: 824 | version "0.1.7" 825 | resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" 826 | integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== 827 | 828 | proxy-addr@~2.0.7: 829 | version "2.0.7" 830 | resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" 831 | integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== 832 | dependencies: 833 | forwarded "0.2.0" 834 | ipaddr.js "1.9.1" 835 | 836 | proxy-from-env@^1.1.0: 837 | version "1.1.0" 838 | resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" 839 | integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== 840 | 841 | qs@6.11.0: 842 | version "6.11.0" 843 | resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" 844 | integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== 845 | dependencies: 846 | side-channel "^1.0.4" 847 | 848 | range-parser@~1.2.1: 849 | version "1.2.1" 850 | resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" 851 | integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== 852 | 853 | raw-body@2.5.1: 854 | version "2.5.1" 855 | resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz" 856 | integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== 857 | dependencies: 858 | bytes "3.1.2" 859 | http-errors "2.0.0" 860 | iconv-lite "0.4.24" 861 | unpipe "1.0.0" 862 | 863 | retry@^0.13.1: 864 | version "0.13.1" 865 | resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" 866 | integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== 867 | 868 | safe-buffer@5.2.1: 869 | version "5.2.1" 870 | resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" 871 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 872 | 873 | "safer-buffer@>= 2.1.2 < 3": 874 | version "2.1.2" 875 | resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" 876 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 877 | 878 | send@0.18.0: 879 | version "0.18.0" 880 | resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" 881 | integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== 882 | dependencies: 883 | debug "2.6.9" 884 | depd "2.0.0" 885 | destroy "1.2.0" 886 | encodeurl "~1.0.2" 887 | escape-html "~1.0.3" 888 | etag "~1.8.1" 889 | fresh "0.5.2" 890 | http-errors "2.0.0" 891 | mime "1.6.0" 892 | ms "2.1.3" 893 | on-finished "2.4.1" 894 | range-parser "~1.2.1" 895 | statuses "2.0.1" 896 | 897 | serve-static@1.15.0: 898 | version "1.15.0" 899 | resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" 900 | integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== 901 | dependencies: 902 | encodeurl "~1.0.2" 903 | escape-html "~1.0.3" 904 | parseurl "~1.3.3" 905 | send "0.18.0" 906 | 907 | setprototypeof@1.2.0: 908 | version "1.2.0" 909 | resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" 910 | integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== 911 | 912 | side-channel@^1.0.4: 913 | version "1.0.4" 914 | resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" 915 | integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== 916 | dependencies: 917 | call-bind "^1.0.0" 918 | get-intrinsic "^1.0.2" 919 | object-inspect "^1.9.0" 920 | 921 | statuses@2.0.1: 922 | version "2.0.1" 923 | resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" 924 | integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== 925 | 926 | toidentifier@1.0.1: 927 | version "1.0.1" 928 | resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" 929 | integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== 930 | 931 | tr46@~0.0.3: 932 | version "0.0.3" 933 | resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" 934 | integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== 935 | 936 | type-is@~1.6.18: 937 | version "1.6.18" 938 | resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" 939 | integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== 940 | dependencies: 941 | media-typer "0.3.0" 942 | mime-types "~2.1.24" 943 | 944 | undici-types@~5.25.1: 945 | version "5.25.3" 946 | resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz" 947 | integrity sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA== 948 | 949 | unpipe@1.0.0, unpipe@~1.0.0: 950 | version "1.0.0" 951 | resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" 952 | integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== 953 | 954 | utils-merge@1.0.1: 955 | version "1.0.1" 956 | resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" 957 | integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== 958 | 959 | uuid@^9.0.0: 960 | version "9.0.1" 961 | resolved "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz" 962 | integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA== 963 | 964 | vary@^1, vary@~1.1.2: 965 | version "1.1.2" 966 | resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" 967 | integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== 968 | 969 | web-streams-polyfill@4.0.0-beta.3: 970 | version "4.0.0-beta.3" 971 | resolved "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.3.tgz" 972 | integrity sha512-QW95TCTaHmsYfHDybGMwO5IJIM93I/6vTRk+daHTWFPhwh+C8Cg7j7XyKrwrj8Ib6vYXe0ocYNrmzY4xAAN6ug== 973 | 974 | webidl-conversions@^3.0.0: 975 | version "3.0.1" 976 | resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" 977 | integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== 978 | 979 | whatwg-url@^5.0.0: 980 | version "5.0.0" 981 | resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" 982 | integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== 983 | dependencies: 984 | tr46 "~0.0.3" 985 | webidl-conversions "^3.0.0" 986 | 987 | yaml@^2.2.1: 988 | version "2.3.3" 989 | resolved "https://registry.npmjs.org/yaml/-/yaml-2.3.3.tgz" 990 | integrity sha512-zw0VAJxgeZ6+++/su5AFoqBbZbrEakwu+X0M5HmcwUiBL7AzcuPKjj5we4xfQLp78LkEMpD0cOnUhmgOVy3KdQ== 991 | 992 | zod-to-json-schema@^3.20.4: 993 | version "3.21.4" 994 | resolved "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.21.4.tgz" 995 | integrity sha512-fjUZh4nQ1s6HMccgIeE0VP4QG/YRGPmyjO9sAh890aQKPEk3nqbfUXhMFaC+Dr5KvYBm8BCyvfpZf2jY9aGSsw== 996 | 997 | zod@^3.22.3: 998 | version "3.22.4" 999 | resolved "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz" 1000 | integrity sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg== 1001 | -------------------------------------------------------------------------------- /images/dev-mode.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranavnt/umix/4413b6fae24383e6904f970961609c546cfd604a/images/dev-mode.png -------------------------------------------------------------------------------- /images/logo1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranavnt/umix/4413b6fae24383e6904f970961609c546cfd604a/images/logo1.png -------------------------------------------------------------------------------- /images/logo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranavnt/umix/4413b6fae24383e6904f970961609c546cfd604a/images/logo2.png -------------------------------------------------------------------------------- /images/umix-banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranavnt/umix/4413b6fae24383e6904f970961609c546cfd604a/images/umix-banner.png -------------------------------------------------------------------------------- /images/unpacked.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pranavnt/umix/4413b6fae24383e6904f970961609c546cfd604a/images/unpacked.png -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Umix 7 | 8 | 9 | 10 |
11 |
12 |
29 | 59 |
67 |

70 | Let's make the web fun again. 71 |

72 |

73 | Umix is a browser extension and JavaScript library that allows you 74 | to remix the web effortlessly – together, we can make the web fun 75 | again :) 76 |

77 |
87 | Get started 106 | GitHub 111 |
112 |
113 |
114 | 123 |
124 |
125 |
126 |
127 | 128 | 129 | 130 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | localStorage.setItem("toggle", false); 2 | 3 | window.onload = function () { 4 | import(chrome.runtime.getURL("js-confetti.min.js")).then((module) => { 5 | document.jsConfetti = new module.default(); 6 | }); 7 | }; 8 | 9 | // Create a button element 10 | const button = document.createElement("button"); 11 | const img = document.createElement("img"); 12 | img.src = `data:image/png;base64,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AAAUQngHAIBCCO8AAFAI4R0AAAohvAMAQCGEdwAAKITwDgAAhRDeAQCgEMI7AAAUQngHAIBCCO8AAFAI4R0AAAohvAMAQCGEdwAAKITwDgAAhRDeAQCgEMI7AAAUQngHAIBCCO8AAFAI4R0AAAohvAMAQCGEdwAAKITwDgAAhRDeAQCgEMI7AAAUQngHAIBCCO8AAFAI4R0AAAohvAMAQCGEdwAAKITwDgAAhRDeAQCgEMI7AAAUQngHAIBCCO8AAFAI4R0AAAohvAMAQCGEdwAAKITwDgAAhRDeAQCgEMI7AAAUQngHAIBCCO8AAFAI4R0AAAohvAMAQCGEdwAAKITwDgAAhRDeAQCgEMI7AAAUQngHAIBCCO8AAFAI4R0AAAohvAMAQCGEdwAAKITwDgAAhRDeAQCgEMI7AAAUQngHAIBCCO8AAFAI4R0AAAohvAMAQCGEdwAAKITwDgAAhRDeAQCgEMI7AAAUQngHAIBCCO8AAFAI4R0AAAohvAMAQCGEdwAAKITwDgAAhRDeAQCgEMI7AAAUQngHAIBCCO8AAFAI4R0AAAohvAMAQCGEdwAAKITwDgAAhRDeAQCgEMI7AAAUQngHAIBCCO8AAFAI4R0AAAohvAMAQCGEdwAAKITwDgAAhRDeAQCgEMI7AAAUQngHAIBCCO8AAFAI4R0AAAohvAMAQCGEdwAAKITwDgAAhRDeAQCgEMI7AAAUQngHAIBCCO8AAFAI4R0AAAohvAMAQCGEdwAAKITwDgAAhRDeAQCgEMI7AAAUQngHAIBCCO8AAFAI4R0AAAohvAMAQCGEdwAAKITwDgAAhRDeAQCgEMI7AAAUQngHAIBCCO8AAFAI4R0AAAohvAMAQCGEdwAAKITwDgAAhRDeAQCgEMI7AAAUQngHAIBCCO8AAFAI4R0AAAohvAMAQCGEdwAAKITwDgAAhRDeAQCgEMdEeAcAgCII7wAAUAjhHQAACiG8AwBAIYR3AAAohPAOAACFEN4BAKAQwjsAABRCeAcAgEII7wAAUAjhHQAACiG8AwBAIYR3AAAohPAOAACFEN4BAKAQwjsAABRCeAcAgEII7wAAUAjhHQAACiG8AwBAIYR3AAAohPAOAACFEN4BAKAQwjsAABRCeAcAgEII7wAAUAjhHQAACiG8AwBAIYR3AAAohPAOAACFEN4BAKAQwjsAABRCeAcAgEII7wAAUAjhHQAACiG8AwBAIYR3AAAohPAOAACFEN4BAKAQwjsAABRCeAcAgEII7wAAUIjjkvwovUP0rX3+vY3w/qwmJw0AACUaFN4vSnJ4kp/1+bnwDgAALRoU3j+WZK/F113Y5zXCOwAAtGTQnvdPZDm8J8mr+7zOnncAAGjBsJX3Pde8/uAkd/V5vZV3AABo0Dgr7yv9lz7XWHkHAICGjLvyvtI9k1zf51or7wAAULONrryv9JhUgdvKOwAANGiSlfe1tqWe/fBW3gEAoIc6w/uSJyW5sU+fwjsAAGxQHdtm+tma5KwkO/r0b9sMAACMoYmV916OSnJmkn9OsrPPeFbeAQBggLbC+1r3SrK9z7jCOwAA9NBVeE+Sv+4zrvAOAAA9NLnnfZg39RnXnncAAOhBeAcAgEII7wAAUAjhHQAACiG8AwBAIYR3AAAohPAOAACFEN4BAKAQR6a7hzS9uc+4HtIEAAA97Jvkilh5BwCAIrw3Vt4BAKAID02yK+tD9NeS7NPguFbeAQBgAz6e9SH6riRHNzimlXcAANiAeyfZmfVB+t0Njim8AwDABr0kvcP0Uxoaz7YZAACYwDvTO1Dv18BYVt4BAGBC52d9oP55A+MI7wAAUIN/TO8vsG6ucQzhHQAAavKZ9A7X962pf+EdAABq9A/pHbBPq6Fv4R0AAGr2hvQO2Vdmsm00wjsAADTgIekdtCdZhRfeAQCgIZuSXJv+gfukMft6y4C+hHcAAKjBaem/Cv+LJL+dKpwPckCSc/r0IbwDAECNdk/y3fQP8Qupjpv8jSQHrrn2mCT/MckNfa4T3gEAoAGPThW2B4X4hSQ7k/wwybeS3DzktcI7AAA06MUZHuBHbXckeXa75QMAwPw5LcmdmSy8X5/k5LYLBwCAeXVSkuuysfD+5SRHtl8yAADMt72TvCb9v5y6tn0zyfMz2cOfAACKNOy4PmjTHkkem+TpSU5IckiqIyNvSPVl1i8n+WiSf0oV5AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADsRjlQAAAC/SURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJhf/w/HiQkpljkO6wAAAABJRU5ErkJggg==`; 13 | img.alt = "Image Button"; 14 | 15 | button.appendChild(img); 16 | 17 | // Style the button 18 | img.style.position = "fixed"; 19 | img.style.bottom = "10px"; 20 | img.style.right = "10px"; 21 | img.style.zIndex = "9999"; // Ensure the button is on top of other page elements 22 | img.style.width = "150px"; 23 | img.style.height = "150px"; 24 | 25 | let isOn = false; 26 | 27 | // Add an event listener to the button 28 | img.addEventListener("click", function () { 29 | console.log("click"); 30 | console.log(localStorage.getItem("toggle")); 31 | const currentToggle = localStorage.getItem("toggle"); 32 | localStorage.setItem("toggle", currentToggle === "true" ? "false" : "true"); 33 | isOn = !isOn; 34 | if (!isOn) { 35 | isClicked = false; 36 | if (currentPopup) { 37 | currentPopup.remove(); 38 | currentPopup = null; 39 | } 40 | if (selectedElement) { 41 | selectedElement.classList.remove("highlight-on-hover"); 42 | } 43 | selectedElement = null; 44 | } 45 | console.log(isOn); 46 | 47 | document.jsConfetti.addConfetti({}); 48 | document.jsConfetti.addConfetti({}); 49 | document.jsConfetti.addConfetti({}); 50 | }); 51 | 52 | img.addEventListener("mouseover", function () { 53 | console.log("mouseover"); 54 | img.style.width = "160px"; 55 | img.style.height = "160px"; 56 | img.style.bottom = "5px"; 57 | img.style.right = "5px"; 58 | }); 59 | 60 | img.addEventListener("mouseout", function () { 61 | console.log("mouseout"); 62 | img.style.width = "150px"; 63 | img.style.height = "150px"; 64 | img.style.bottom = "10px"; 65 | img.style.right = "10px"; 66 | }); 67 | 68 | img.addEventListener("contextmenu", function (event) { 69 | event.preventDefault(); 70 | window.location.href = "https://github.com/pranavnt/dubhacks22"; 71 | }); 72 | 73 | // Append the button to the document body 74 | document.body.appendChild(img); 75 | 76 | document.head.appendChild(document.createElement("style")).innerHTML = `body { 77 | margin: 0; 78 | padding: 0; 79 | } 80 | /* Highlight effect on hover */ 81 | .highlight-on-hover { 82 | outline: 2px dashed rgb(65, 134, 246) !important; 83 | background-color: rgba(65, 134, 246, 0.2) !important; 84 | } 85 | 86 | .umix-popup { 87 | } 88 | 89 | .umix-container { 90 | display: flex; 91 | align-items: center; 92 | justify-content: space-between; 93 | background-color: #fff; 94 | border-radius: 8px; 95 | padding: 10px 15px; 96 | box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1); 97 | width: 350px; /* Adjust to your desired width */ 98 | } 99 | 100 | .umix-input { 101 | flex: 1; 102 | border: none; 103 | outline: none; 104 | background-color: transparent; 105 | font-size: 1em; 106 | padding: 5px; 107 | } 108 | 109 | .umix-button { 110 | background: transparent; 111 | border: none; 112 | } 113 | 114 | .arrow-icon { 115 | display: flex; 116 | align-items: center; 117 | justify-content: center; 118 | width: 30px; 119 | height: 30px; 120 | background-color: #004B87; 121 | border-radius: 50%; 122 | } 123 | 124 | .arrow-icon svg { 125 | fill: none; 126 | stroke: #fff; 127 | stroke-width: 2; 128 | width: 15px; 129 | height: 15px; 130 | } 131 | 132 | .fade { 133 | animation: fade-in-out 3s infinite; 134 | } 135 | 136 | @keyframes fade-in-out { 137 | 0% { 138 | opacity: 0; 139 | } 140 | 50% { 141 | opacity: 1; 142 | } 143 | 100% { 144 | opacity: 0; 145 | } 146 | } 147 | 148 | .slide { 149 | animation: slide-in 3s infinite; 150 | } 151 | 152 | @keyframes slide-in { 153 | 0% { 154 | left: -100%; 155 | } 156 | 50% { 157 | left: 0; 158 | } 159 | 100% { 160 | left: -100%; 161 | } 162 | } 163 | 164 | .rotate { 165 | animation: rotate 3s infinite linear; 166 | } 167 | 168 | @keyframes rotate { 169 | 0% { 170 | transform: rotate(0deg); 171 | } 172 | 100% { 173 | transform: rotate(360deg); 174 | } 175 | }`; 176 | 177 | let selectedElement = null; 178 | let currentPopup = null; 179 | let isClicked = false; 180 | 181 | function extractHtmlContent(mixedString) { 182 | // Match all HTML tags and their content 183 | const matches = mixedString.match(/<[^>]*>[^<]*<\/[^>]*>|<[^/>]+\/>/g); 184 | 185 | // If matches are found, join them to form the pure HTML content; otherwise, return an empty string 186 | return matches ? matches.join("") : ""; 187 | } 188 | 189 | document.addEventListener("mouseover", (e) => { 190 | console.log(isOn, isClicked); 191 | if (!isOn) return; 192 | if (isClicked) return; 193 | if (e.target?.className.includes("umix-popup")) return; 194 | 195 | // check if the mouse is over the variable named img 196 | if (e.target === img) return; 197 | 198 | const x = e.clientX; 199 | const y = e.clientY; 200 | const element = document.elementFromPoint(x, y); 201 | 202 | if (selectedElement) { 203 | selectedElement.classList.remove("highlight-on-hover"); 204 | } 205 | 206 | selectedElement = element; 207 | 208 | // Add highlight effect to the selected element 209 | selectedElement.classList.add("highlight-on-hover"); 210 | console.log(selectedElement); 211 | }); 212 | 213 | document.addEventListener("keydown", function (event) { 214 | if (!isOn) return; 215 | if (event.key === "Escape") { 216 | isClicked = false; 217 | if (currentPopup) { 218 | currentPopup.remove(); 219 | currentPopup = null; 220 | } 221 | if (selectedElement) { 222 | selectedElement.classList.remove("highlight-on-hover"); 223 | } 224 | selectedElement = null; 225 | } 226 | }); 227 | 228 | document.addEventListener("click", (e) => { 229 | if (!isOn) return; 230 | if (e.target === img) return; 231 | 232 | if ( 233 | currentPopup && 234 | selectedElement && 235 | e.target !== selectedElement && 236 | !selectedElement.contains(e.target) && 237 | e.target !== currentPopup && 238 | !currentPopup.contains(e.target) 239 | ) { 240 | isClicked = false; 241 | if (currentPopup) { 242 | currentPopup.remove(); 243 | currentPopup = null; 244 | } 245 | if (selectedElement) { 246 | selectedElement.classList.remove("highlight-on-hover"); 247 | } 248 | selectedElement = null; 249 | return; 250 | } 251 | 252 | isClicked = true; 253 | 254 | if (!selectedElement) return; 255 | let currentEl = selectedElement; 256 | if ( 257 | e.target?.className.includes("umix-popup") || 258 | !selectedElement.className.includes("highlight-on-hover") 259 | ) 260 | return; 261 | if (currentPopup) { 262 | currentPopup.remove(); 263 | currentPopup = null; 264 | } 265 | 266 | // defines text area, button, and popup 267 | const input = document.createElement("textarea"); 268 | const button = document.createElement("button"); 269 | const popup = document.createElement("div"); 270 | 271 | popup.className = "umix-popup umix-container"; 272 | button.className = "umix-popup umix-button"; 273 | input.className = "umix-popup umix-input"; 274 | input.placeholder = 275 | "Make the text larger or change the colors of this element."; 276 | input.style.color = "black"; 277 | button.style.color = "black"; 278 | popup.style.position = "fixed"; 279 | const x = e.clientX; 280 | const y = e.clientY; 281 | popup.style.left = `${x}px`; 282 | popup.style.top = `${y}px`; 283 | popup.style.zIndex = "99999"; 284 | 285 | const buttonText = ` 286 | 287 | `; 288 | 289 | const callback = () => { 290 | if (!isOn) return; 291 | currentEl.classList.remove("highlight-on-hover"); 292 | button.textContent = "Loading..."; 293 | fetch("https://dubhacks23-production.up.railway.app/edit", { 294 | method: "POST", 295 | headers: { 296 | "Content-Type": "application/json", 297 | }, 298 | body: JSON.stringify({ 299 | html: currentEl.outerHTML, 300 | edit: input.value, 301 | }), 302 | }) 303 | .then((response) => response.json()) // Convert the response to JSON 304 | .then((data) => { 305 | try { 306 | console.log(data); 307 | const html = extractHtmlContent(data.output.output); 308 | 309 | const fragment = document.createElement("div"); 310 | fragment.innerHTML = html; 311 | button.innerHTML = buttonText; 312 | 313 | currentEl.replaceWith(fragment); 314 | currentEl = fragment; 315 | } catch (error) { 316 | console.error(error); 317 | } 318 | }) 319 | .catch((error) => { 320 | console.error(error); 321 | }); 322 | }; 323 | 324 | input.onkeypress = (event) => { 325 | if (!isOn) return; 326 | if (event.key === "Enter") { 327 | event.preventDefault(); // Enter no longer makes a new line 328 | callback(); 329 | } 330 | }; 331 | 332 | button.onclick = callback; 333 | button.innerHTML = buttonText; 334 | 335 | popup.appendChild(input); 336 | popup.appendChild(button); 337 | 338 | document.body.appendChild(popup); 339 | 340 | currentPopup = popup; 341 | currentEl.classList.add("highlight-on-hover"); 342 | }); 343 | -------------------------------------------------------------------------------- /js-confetti.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Bundled by jsDelivr using Rollup v2.79.1 and Terser v5.19.2. 3 | * Original file: /npm/js-confetti@0.11.0/dist/es/index.js 4 | * 5 | * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files 6 | */ 7 | function t(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function e(t,e){for(var i=0;i2&&void 0!==arguments[2]?arguments[2]:0,n=Math.random()*(e-t)+t;return Math.floor(n*Math.pow(10,i))/Math.pow(10,i)}function o(t){return t[s(0,t.length)]}var a=["#fcf403","#62fc03","#f4fc03","#03e7fc","#03fca5","#a503fc","#fc03ad","#fc03c2"];function r(t){return Math.log(t)/Math.log(1920)}var h=function(){function e(i){t(this,e);var n=i.initialPosition,a=i.direction,h=i.confettiRadius,c=i.confettiColors,u=i.emojis,l=i.emojiSize,d=i.canvasWidth,f=s(.9,1.7,3)*r(d);this.confettiSpeed={x:f,y:f},this.finalConfettiSpeedX=s(.2,.6,3),this.rotationSpeed=u.length?.01:s(.03,.07,3)*r(d),this.dragForceCoefficient=s(5e-4,9e-4,6),this.radius={x:h,y:h},this.initialRadius=h,this.rotationAngle="left"===a?s(0,.2,3):s(-.2,0,3),this.emojiSize=l,this.emojiRotationAngle=s(0,2*Math.PI),this.radiusYUpdateDirection="down";var m="left"===a?s(82,15)*Math.PI/180:s(-15,-82)*Math.PI/180;this.absCos=Math.abs(Math.cos(m)),this.absSin=Math.abs(Math.sin(m));var p=s(-150,0),v={x:n.x+("left"===a?-p:p)*this.absCos,y:n.y-p*this.absSin};this.currentPosition=Object.assign({},v),this.initialPosition=Object.assign({},v),this.color=u.length?null:o(c),this.emoji=u.length?o(u):null,this.createdAt=(new Date).getTime(),this.direction=a}return i(e,[{key:"draw",value:function(t){var e=this.currentPosition,i=this.radius,n=this.color,s=this.emoji,o=this.rotationAngle,a=this.emojiRotationAngle,r=this.emojiSize,h=window.devicePixelRatio;n?(t.fillStyle=n,t.beginPath(),t.ellipse(e.x*h,e.y*h,i.x*h,i.y*h,o,0,2*Math.PI),t.fill()):s&&(t.font="".concat(r,"px serif"),t.save(),t.translate(h*e.x,h*e.y),t.rotate(a),t.textAlign="center",t.fillText(s,0,0),t.restore())}},{key:"updatePosition",value:function(t,e){var i=this.confettiSpeed,n=this.dragForceCoefficient,s=this.finalConfettiSpeedX,o=this.radiusYUpdateDirection,a=this.rotationSpeed,r=this.createdAt,h=this.direction,c=e-r;i.x>s&&(this.confettiSpeed.x-=n*t),this.currentPosition.x+=i.x*("left"===h?-this.absCos:this.absCos)*t,this.currentPosition.y=this.initialPosition.y-i.y*this.absSin*c+.00125*Math.pow(c,2)/2,this.rotationSpeed-=this.emoji?1e-4:1e-5*t,this.rotationSpeed<0&&(this.rotationSpeed=0),this.emoji?this.emojiRotationAngle+=this.rotationSpeed*t%(2*Math.PI):"down"===o?(this.radius.y-=t*a,this.radius.y<=0&&(this.radius.y=0,this.radiusYUpdateDirection="up")):(this.radius.y+=t*a,this.radius.y>=this.initialRadius&&(this.radius.y=this.initialRadius,this.radiusYUpdateDirection="down"))}},{key:"getIsVisibleOnCanvas",value:function(t){return this.currentPosition.y0&&void 0!==arguments[0]?arguments[0]:{};t(this,e),this.activeConfettiBatches=[],this.canvas=n.canvas||((i=document.createElement("canvas")).style.position="fixed",i.style.width="100%",i.style.height="100%",i.style.top="0",i.style.left="0",i.style.zIndex="1000",i.style.pointerEvents="none",document.body.appendChild(i),i),this.canvasContext=this.canvas.getContext("2d"),this.requestAnimationFrameRequested=!1,this.lastUpdated=(new Date).getTime(),this.iterationIndex=0,this.loop=this.loop.bind(this),requestAnimationFrame(this.loop)}return i(e,[{key:"loop",value:function(){var t,e,i,s,o;this.requestAnimationFrameRequested=!1,t=this.canvas,e=window.devicePixelRatio,i=getComputedStyle(t),s=n(i.getPropertyValue("width")),o=n(i.getPropertyValue("height")),t.setAttribute("width",(s*e).toString()),t.setAttribute("height",(o*e).toString());var a=(new Date).getTime(),r=a-this.lastUpdated,h=this.canvas.offsetHeight,c=this.iterationIndex%10==0;this.activeConfettiBatches=this.activeConfettiBatches.filter((function(t){return t.processShapes({timeDelta:r,currentTime:a},h,c),!c||!t.complete()})),this.iterationIndex++,this.queueAnimationFrameIfNeeded(a)}},{key:"queueAnimationFrameIfNeeded",value:function(t){this.requestAnimationFrameRequested||this.activeConfettiBatches.length<1||(this.requestAnimationFrameRequested=!0,this.lastUpdated=t||(new Date).getTime(),requestAnimationFrame(this.loop))}},{key:"addConfetti",value:function(){for(var t=function(t){var e=t.confettiRadius,i=void 0===e?6:e,n=t.confettiNumber,s=void 0===n?t.confettiesNumber||(t.emojis?40:250):n,o=t.confettiColors,r=void 0===o?a:o,h=t.emojis,c=void 0===h?t.emojies||[]:h,u=t.emojiSize,l=void 0===u?80:u;return t.emojies&&console.error("emojies argument is deprecated, please use emojis instead"),t.confettiesNumber&&console.error("confettiesNumber argument is deprecated, please use confettiNumber instead"),{confettiRadius:i,confettiNumber:s,confettiColors:r,emojis:c,emojiSize:l}}(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),e=t.confettiRadius,i=t.confettiNumber,n=t.confettiColors,s=t.emojis,o=t.emojiSize,r=this.canvas.getBoundingClientRect(),u=r.width,l=5*r.height/7,d={x:0,y:l},f={x:u,y:l},m=new c(this.canvasContext),p=0;p]*>[^<]*<\/[^>]*>|<[^/>]+\/>/g); 180 | 181 | // If matches are found, join them to form the pure HTML content; otherwise, return an empty string 182 | return matches ? matches.join("") : ""; 183 | } 184 | 185 | document.addEventListener("mouseover", (e) => { 186 | console.log(isOn, isClicked); 187 | if (!isOn) return; 188 | if (isClicked) return; 189 | if (e.target?.className.includes("umix-popup")) return; 190 | 191 | // check if the mouse is over the variable named img 192 | if (e.target === img) return; 193 | 194 | const x = e.clientX; 195 | const y = e.clientY; 196 | const element = document.elementFromPoint(x, y); 197 | 198 | if (selectedElement) { 199 | selectedElement.classList.remove("highlight-on-hover"); 200 | } 201 | 202 | selectedElement = element; 203 | 204 | // Add highlight effect to the selected element 205 | selectedElement.classList.add("highlight-on-hover"); 206 | console.log(selectedElement); 207 | }); 208 | 209 | document.addEventListener("keydown", function(event) { 210 | if (!isOn) return; 211 | if (event.key === "Escape") { 212 | isClicked = false; 213 | if (currentPopup) { 214 | currentPopup.remove(); 215 | currentPopup = null; 216 | } 217 | if (selectedElement) { 218 | selectedElement.classList.remove("highlight-on-hover"); 219 | } 220 | selectedElement = null; 221 | } 222 | }); 223 | 224 | document.addEventListener("click", (e) => { 225 | if (!isOn) return; 226 | if (e.target === img) return; 227 | 228 | if ( 229 | currentPopup && 230 | selectedElement && 231 | e.target !== selectedElement && 232 | !selectedElement.contains(e.target) && 233 | e.target !== currentPopup && 234 | !currentPopup.contains(e.target) 235 | ) { 236 | isClicked = false; 237 | if (currentPopup) { 238 | currentPopup.remove(); 239 | currentPopup = null; 240 | } 241 | if (selectedElement) { 242 | selectedElement.classList.remove("highlight-on-hover"); 243 | } 244 | selectedElement = null; 245 | return; 246 | } 247 | 248 | isClicked = true; 249 | 250 | if (!selectedElement) return; 251 | let currentEl = selectedElement; 252 | if ( 253 | e.target?.className.includes("umix-popup") || 254 | !selectedElement.className.includes("highlight-on-hover") 255 | ) 256 | return; 257 | if (currentPopup) { 258 | currentPopup.remove(); 259 | currentPopup = null; 260 | } 261 | 262 | // defines text area, button, and popup 263 | const input = document.createElement("textarea"); 264 | const button = document.createElement("button"); 265 | const popup = document.createElement("div"); 266 | 267 | popup.className = "umix-popup umix-container"; 268 | button.className = "umix-popup umix-button"; 269 | input.className = "umix-popup umix-input"; 270 | input.placeholder = 271 | "Make the text larger or change the colors of this element."; 272 | input.style.color = "black"; 273 | button.style.color = "black"; 274 | popup.style.position = "fixed"; 275 | const x = e.clientX; 276 | const y = e.clientY; 277 | popup.style.left = `${x}px`; 278 | popup.style.top = `${y}px`; 279 | popup.style.zIndex = "99999"; 280 | 281 | const buttonText = ` 282 | 283 | `; 284 | 285 | const callback = () => { 286 | if (!isOn) return; 287 | currentEl.classList.remove("highlight-on-hover"); 288 | button.textContent = "Loading..."; 289 | fetch("https://dubhacks23-production.up.railway.app/edit", { 290 | method: "POST", 291 | headers: { 292 | "Content-Type": "application/json", 293 | }, 294 | body: JSON.stringify({ 295 | html: currentEl.outerHTML, 296 | edit: input.value, 297 | }), 298 | }) 299 | .then((response) => response.json()) // Convert the response to JSON 300 | .then((data) => { 301 | try { 302 | console.log(data); 303 | const html = extractHtmlContent(data.output.output); 304 | 305 | const fragment = document.createElement("div"); 306 | fragment.innerHTML = html; 307 | button.innerHTML = buttonText; 308 | 309 | currentEl.replaceWith(fragment); 310 | currentEl = fragment; 311 | } catch (error) { 312 | console.error(error); 313 | } 314 | }) 315 | .catch((error) => { 316 | console.error(error); 317 | }); 318 | }; 319 | 320 | input.onkeypress = (event) => { 321 | if (!isOn) return; 322 | if (event.key === "Enter") { 323 | event.preventDefault(); // Enter no longer makes a new line 324 | callback(); 325 | } 326 | }; 327 | 328 | button.onclick = callback; 329 | button.innerHTML = buttonText; 330 | 331 | popup.appendChild(input); 332 | popup.appendChild(button); 333 | 334 | document.body.appendChild(popup); 335 | 336 | currentPopup = popup; 337 | currentEl.classList.add("highlight-on-hover"); 338 | }); 339 | 340 | /** 341 | * Bundled by jsDelivr using Rollup v2.79.1 and Terser v5.19.2. 342 | * Original file: /npm/js-confetti@0.11.0/dist/es/index.js 343 | * 344 | * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files 345 | */ 346 | function t(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function e(t, e) { for (var i = 0; i < e.length; i++) { var n = e[i]; n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(t, n.key, n) } } function i(t, i, n) { return i && e(t.prototype, i), n && e(t, n), t } function n(t) { return +t.replace(/px/, "") } function s(t, e) { var i = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : 0, n = Math.random() * (e - t) + t; return Math.floor(n * Math.pow(10, i)) / Math.pow(10, i) } function o(t) { return t[s(0, t.length)] } var a = ["#fcf403", "#62fc03", "#f4fc03", "#03e7fc", "#03fca5", "#a503fc", "#fc03ad", "#fc03c2"]; function r(t) { return Math.log(t) / Math.log(1920) } var h = function() { function e(i) { t(this, e); var n = i.initialPosition, a = i.direction, h = i.confettiRadius, c = i.confettiColors, u = i.emojis, l = i.emojiSize, d = i.canvasWidth, f = s(.9, 1.7, 3) * r(d); this.confettiSpeed = { x: f, y: f }, this.finalConfettiSpeedX = s(.2, .6, 3), this.rotationSpeed = u.length ? .01 : s(.03, .07, 3) * r(d), this.dragForceCoefficient = s(5e-4, 9e-4, 6), this.radius = { x: h, y: h }, this.initialRadius = h, this.rotationAngle = "left" === a ? s(0, .2, 3) : s(-.2, 0, 3), this.emojiSize = l, this.emojiRotationAngle = s(0, 2 * Math.PI), this.radiusYUpdateDirection = "down"; var m = "left" === a ? s(82, 15) * Math.PI / 180 : s(-15, -82) * Math.PI / 180; this.absCos = Math.abs(Math.cos(m)), this.absSin = Math.abs(Math.sin(m)); var p = s(-150, 0), v = { x: n.x + ("left" === a ? -p : p) * this.absCos, y: n.y - p * this.absSin }; this.currentPosition = Object.assign({}, v), this.initialPosition = Object.assign({}, v), this.color = u.length ? null : o(c), this.emoji = u.length ? o(u) : null, this.createdAt = (new Date).getTime(), this.direction = a } return i(e, [{ key: "draw", value: function(t) { var e = this.currentPosition, i = this.radius, n = this.color, s = this.emoji, o = this.rotationAngle, a = this.emojiRotationAngle, r = this.emojiSize, h = window.devicePixelRatio; n ? (t.fillStyle = n, t.beginPath(), t.ellipse(e.x * h, e.y * h, i.x * h, i.y * h, o, 0, 2 * Math.PI), t.fill()) : s && (t.font = "".concat(r, "px serif"), t.save(), t.translate(h * e.x, h * e.y), t.rotate(a), t.textAlign = "center", t.fillText(s, 0, 0), t.restore()) } }, { key: "updatePosition", value: function(t, e) { var i = this.confettiSpeed, n = this.dragForceCoefficient, s = this.finalConfettiSpeedX, o = this.radiusYUpdateDirection, a = this.rotationSpeed, r = this.createdAt, h = this.direction, c = e - r; i.x > s && (this.confettiSpeed.x -= n * t), this.currentPosition.x += i.x * ("left" === h ? -this.absCos : this.absCos) * t, this.currentPosition.y = this.initialPosition.y - i.y * this.absSin * c + .00125 * Math.pow(c, 2) / 2, this.rotationSpeed -= this.emoji ? 1e-4 : 1e-5 * t, this.rotationSpeed < 0 && (this.rotationSpeed = 0), this.emoji ? this.emojiRotationAngle += this.rotationSpeed * t % (2 * Math.PI) : "down" === o ? (this.radius.y -= t * a, this.radius.y <= 0 && (this.radius.y = 0, this.radiusYUpdateDirection = "up")) : (this.radius.y += t * a, this.radius.y >= this.initialRadius && (this.radius.y = this.initialRadius, this.radiusYUpdateDirection = "down")) } }, { key: "getIsVisibleOnCanvas", value: function(t) { return this.currentPosition.y < t + 100 } }]), e }(); var c = function() { function e(i) { var n = this; t(this, e), this.canvasContext = i, this.shapes = [], this.promise = new Promise((function(t) { return n.resolvePromise = t })) } return i(e, [{ key: "getBatchCompletePromise", value: function() { return this.promise } }, { key: "addShapes", value: function() { var t; (t = this.shapes).push.apply(t, arguments) } }, { key: "complete", value: function() { var t; return !this.shapes.length && (null === (t = this.resolvePromise) || void 0 === t || t.call(this), !0) } }, { key: "processShapes", value: function(t, e, i) { var n = this, s = t.timeDelta, o = t.currentTime; this.shapes = this.shapes.filter((function(t) { return t.updatePosition(s, o), t.draw(n.canvasContext), !i || t.getIsVisibleOnCanvas(e) })) } }]), e }(), u = function() { function e() { var i, n = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}; t(this, e), this.activeConfettiBatches = [], this.canvas = n.canvas || ((i = document.createElement("canvas")).style.position = "fixed", i.style.width = "100%", i.style.height = "100%", i.style.top = "0", i.style.left = "0", i.style.zIndex = "1000", i.style.pointerEvents = "none", document.body.appendChild(i), i), this.canvasContext = this.canvas.getContext("2d"), this.requestAnimationFrameRequested = !1, this.lastUpdated = (new Date).getTime(), this.iterationIndex = 0, this.loop = this.loop.bind(this), requestAnimationFrame(this.loop) } return i(e, [{ key: "loop", value: function() { var t, e, i, s, o; this.requestAnimationFrameRequested = !1, t = this.canvas, e = window.devicePixelRatio, i = getComputedStyle(t), s = n(i.getPropertyValue("width")), o = n(i.getPropertyValue("height")), t.setAttribute("width", (s * e).toString()), t.setAttribute("height", (o * e).toString()); var a = (new Date).getTime(), r = a - this.lastUpdated, h = this.canvas.offsetHeight, c = this.iterationIndex % 10 == 0; this.activeConfettiBatches = this.activeConfettiBatches.filter((function(t) { return t.processShapes({ timeDelta: r, currentTime: a }, h, c), !c || !t.complete() })), this.iterationIndex++, this.queueAnimationFrameIfNeeded(a) } }, { key: "queueAnimationFrameIfNeeded", value: function(t) { this.requestAnimationFrameRequested || this.activeConfettiBatches.length < 1 || (this.requestAnimationFrameRequested = !0, this.lastUpdated = t || (new Date).getTime(), requestAnimationFrame(this.loop)) } }, { key: "addConfetti", value: function() { for (var t = function(t) { var e = t.confettiRadius, i = void 0 === e ? 6 : e, n = t.confettiNumber, s = void 0 === n ? t.confettiesNumber || (t.emojis ? 40 : 250) : n, o = t.confettiColors, r = void 0 === o ? a : o, h = t.emojis, c = void 0 === h ? t.emojies || [] : h, u = t.emojiSize, l = void 0 === u ? 80 : u; return t.emojies && console.error("emojies argument is deprecated, please use emojis instead"), t.confettiesNumber && console.error("confettiesNumber argument is deprecated, please use confettiNumber instead"), { confettiRadius: i, confettiNumber: s, confettiColors: r, emojis: c, emojiSize: l } }(arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}), e = t.confettiRadius, i = t.confettiNumber, n = t.confettiColors, s = t.emojis, o = t.emojiSize, r = this.canvas.getBoundingClientRect(), u = r.width, l = 5 * r.height / 7, d = { x: 0, y: l }, f = { x: u, y: l }, m = new c(this.canvasContext), p = 0; p < i / 2; p++) { var v = new h({ initialPosition: d, direction: "right", confettiRadius: e, confettiColors: n, confettiNumber: i, emojis: s, emojiSize: o, canvasWidth: u }), g = new h({ initialPosition: f, direction: "left", confettiRadius: e, confettiColors: n, confettiNumber: i, emojis: s, emojiSize: o, canvasWidth: u }); m.addShapes(v, g) } return this.activeConfettiBatches.push(m), this.queueAnimationFrameIfNeeded(), m.getBatchCompletePromise() } }, { key: "clearCanvas", value: function() { this.activeConfettiBatches = [] } }]), e }(); 347 | //# sourceMappingURL=/sm/c67b6ad0e5cbbbffac6d59f91cc56ec0ebbc7f312e8a10feab8f9160c2fdbfa7.map 348 | -------------------------------------------------------------------------------- /lib/library.js: -------------------------------------------------------------------------------- 1 | localStorage.setItem("toggle", false); 2 | 3 | // Create a button element 4 | const button = document.createElement("button"); 5 | const img = document.createElement("img"); 6 | img.src = `data:image/png;base64,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AAAUQngHAIBCCO8AAFAI4R0AAAohvAMAQCGEdwAAKITwDgAAhRDeAQCgEMI7AAAUQngHAIBCCO8AAFAI4R0AAAohvAMAQCGEdwAAKITwDgAAhRDeAQCgEMI7AAAUQngHAIBCCO8AAFAI4R0AAAohvAMAQCGEdwAAKITwDgAAhRDeAQCgEMI7AAAUQngHAIBCCO8AAFAI4R0AAAohvAMAQCGEdwAAKITwDgAAhRDeAQCgEMI7AAAUQngHAIBCCO8AAFAI4R0AAAohvAMAQCGEdwAAKITwDgAAhRDeAQCgEMI7AAAUQngHAIBCCO8AAFAI4R0AAAohvAMAQCGEdwAAKITwDgAAhRDeAQCgEMI7AAAUQngHAIBCCO8AAFAI4R0AAAohvAMAQCGEdwAAKITwDgAAhRDeAQCgEMI7AAAUQngHAIBCCO8AAFAI4R0AAAohvAMAQCGEdwAAKITwDgAAhRDeAQCgEMI7AAAUQngHAIBCCO8AAFAI4R0AAAohvAMAQCGEdwAAKITwDgAAhRDeAQCgEMI7AAAUQngHAIBCCO8AAFAI4R0AAAohvAMAQCGEdwAAKITwDgAAhRDeAQCgEMI7AAAUQngHAIBCCO8AAFAI4R0AAAohvAMAQCGEdwAAKITwDgAAhRDeAQCgEMI7AAAUQngHAIBCCO8AAFAI4R0AAAohvAMAQCGEdwAAKITwDgAAhRDeAQCgEMI7AAAUQngHAIBCCO8AAFAI4R0AAAohvAMAQCGEdwAAKITwDgAAhRDeAQCgEMI7AAAUQngHAIBCCO8AAFAI4R0AAAohvAMAQCGEdwAAKITwDgAAhRDeAQCgEMI7AAAUQngHAIBCCO8AAFAI4R0AAAohvAMAQCGEdwAAKITwDgAAhRDeAQCgEMI7AAAUQngHAIBCCO8AAFAI4R0AAAohvAMAQCGEdwAAKITwDgAAhRDeAQCgEMdEeAcAgCII7wAAUAjhHQAACiG8AwBAIYR3AAAohPAOAACFEN4BAKAQwjsAABRCeAcAgEII7wAAUAjhHQAACiG8AwBAIYR3AAAohPAOAACFEN4BAKAQwjsAABRCeAcAgEII7wAAUAjhHQAACiG8AwBAIYR3AAAohPAOAACFEN4BAKAQwjsAABRCeAcAgEII7wAAUAjhHQAACiG8AwBAIYR3AAAohPAOAACFEN4BAKAQwjsAABRCeAcAgEII7wAAUAjhHQAACiG8AwBAIYR3AAAohPAOAACFEN4BAKAQwjsAABRCeAcAgEII7wAAUIjjkvwovUP0rX3+vY3w/qwmJw0AACUaFN4vSnJ4kp/1+bnwDgAALRoU3j+WZK/F113Y5zXCOwAAtGTQnvdPZDm8J8mr+7zOnncAAGjBsJX3Pde8/uAkd/V5vZV3AABo0Dgr7yv9lz7XWHkHAICGjLvyvtI9k1zf51or7wAAULONrryv9JhUgdvKOwAANGiSlfe1tqWe/fBW3gEAoIc6w/uSJyW5sU+fwjsAAGxQHdtm+tma5KwkO/r0b9sMAACMoYmV916OSnJmkn9OsrPPeFbeAQBggLbC+1r3SrK9z7jCOwAA9NBVeE+Sv+4zrvAOAAA9NLnnfZg39RnXnncAAOhBeAcAgEII7wAAUAjhHQAACiG8AwBAIYR3AAAohPAOAACFEN4BAKAQR6a7hzS9uc+4HtIEAAA97Jvkilh5BwCAIrw3Vt4BAKAID02yK+tD9NeS7NPguFbeAQBgAz6e9SH6riRHNzimlXcAANiAeyfZmfVB+t0Njim8AwDABr0kvcP0Uxoaz7YZAACYwDvTO1Dv18BYVt4BAGBC52d9oP55A+MI7wAAUIN/TO8vsG6ucQzhHQAAavKZ9A7X962pf+EdAABq9A/pHbBPq6Fv4R0AAGr2hvQO2Vdmsm00wjsAADTgIekdtCdZhRfeAQCgIZuSXJv+gfukMft6y4C+hHcAAKjBaem/Cv+LJL+dKpwPckCSc/r0IbwDAECNdk/y3fQP8Qupjpv8jSQHrrn2mCT/MckNfa4T3gEAoAGPThW2B4X4hSQ7k/wwybeS3DzktcI7AAA06MUZHuBHbXckeXa75QMAwPw5LcmdmSy8X5/k5LYLBwCAeXVSkuuysfD+5SRHtl8yAADMt72TvCb9v5y6tn0zyfMz2cOfAACKNOy4PmjTHkkem+TpSU5IckiqIyNvSPVl1i8n+WiSf0oV5AEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADsRjlQAAAC/SURBVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJhf/w/HiQkpljkO6wAAAABJRU5ErkJggg==`; 7 | img.alt = "Image Button"; 8 | 9 | button.appendChild(img); 10 | 11 | // Style the button 12 | img.style.position = "fixed"; 13 | img.style.bottom = "10px"; 14 | img.style.right = "10px"; 15 | img.style.zIndex = "9999"; // Ensure the button is on top of other page elements 16 | img.style.width = "150px"; 17 | img.style.height = "150px"; 18 | 19 | let isOn = false; 20 | 21 | // Add an event listener to the button 22 | img.addEventListener("click", function() { 23 | console.log("click"); 24 | console.log(localStorage.getItem("toggle")); 25 | const currentToggle = localStorage.getItem("toggle"); 26 | localStorage.setItem("toggle", currentToggle === "true" ? "false" : "true"); 27 | isOn = !isOn; 28 | if (!isOn) { 29 | isClicked = false; 30 | if (currentPopup) { 31 | currentPopup.remove(); 32 | currentPopup = null; 33 | } 34 | if (selectedElement) { 35 | selectedElement.classList.remove("highlight-on-hover"); 36 | } 37 | selectedElement = null; 38 | } 39 | console.log(isOn); 40 | 41 | u.addConfetti({}); 42 | u.addConfetti({}); 43 | u.addConfetti({}); 44 | }); 45 | 46 | img.addEventListener("mouseover", function() { 47 | console.log("mouseover"); 48 | img.style.width = "160px"; 49 | img.style.height = "160px"; 50 | img.style.bottom = "5px"; 51 | img.style.right = "5px"; 52 | }); 53 | 54 | img.addEventListener("mouseout", function() { 55 | console.log("mouseout"); 56 | img.style.width = "150px"; 57 | img.style.height = "150px"; 58 | img.style.bottom = "10px"; 59 | img.style.right = "10px"; 60 | }); 61 | 62 | img.addEventListener("contextmenu", function(event) { 63 | event.preventDefault(); 64 | window.location.href = "https://github.com/pranavnt/dubhacks22"; 65 | }); 66 | 67 | // Append the button to the document body 68 | document.body.appendChild(img); 69 | 70 | document.head.appendChild(document.createElement("style")).innerHTML = `body { 71 | margin: 0; 72 | padding: 0; 73 | } 74 | /* Highlight effect on hover */ 75 | .highlight-on-hover { 76 | outline: 2px dashed rgb(65, 134, 246) !important; 77 | background-color: rgba(65, 134, 246, 0.2) !important; 78 | } 79 | 80 | .umix-popup { 81 | } 82 | 83 | .umix-container { 84 | display: flex; 85 | align-items: center; 86 | justify-content: space-between; 87 | background-color: #fff; 88 | border-radius: 8px; 89 | padding: 10px 15px; 90 | box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1); 91 | width: 350px; /* Adjust to your desired width */ 92 | } 93 | 94 | .umix-input { 95 | flex: 1; 96 | border: none; 97 | outline: none; 98 | background-color: transparent; 99 | font-size: 1em; 100 | padding: 5px; 101 | } 102 | 103 | .umix-button { 104 | background: transparent; 105 | border: none; 106 | } 107 | 108 | .arrow-icon { 109 | display: flex; 110 | align-items: center; 111 | justify-content: center; 112 | width: 30px; 113 | height: 30px; 114 | background-color: #004B87; 115 | border-radius: 50%; 116 | } 117 | 118 | .arrow-icon svg { 119 | fill: none; 120 | stroke: #fff; 121 | stroke-width: 2; 122 | width: 15px; 123 | height: 15px; 124 | } 125 | 126 | .fade { 127 | animation: fade-in-out 3s infinite; 128 | } 129 | 130 | @keyframes fade-in-out { 131 | 0% { 132 | opacity: 0; 133 | } 134 | 50% { 135 | opacity: 1; 136 | } 137 | 100% { 138 | opacity: 0; 139 | } 140 | } 141 | 142 | .slide { 143 | animation: slide-in 3s infinite; 144 | } 145 | 146 | @keyframes slide-in { 147 | 0% { 148 | left: -100%; 149 | } 150 | 50% { 151 | left: 0; 152 | } 153 | 100% { 154 | left: -100%; 155 | } 156 | } 157 | 158 | .rotate { 159 | animation: rotate 3s infinite linear; 160 | } 161 | 162 | @keyframes rotate { 163 | 0% { 164 | transform: rotate(0deg); 165 | } 166 | 100% { 167 | transform: rotate(360deg); 168 | } 169 | }`; 170 | 171 | let selectedElement = null; 172 | let currentPopup = null; 173 | let isClicked = false; 174 | 175 | function extractHtmlContent(mixedString) { 176 | // Match all HTML tags and their content 177 | const matches = mixedString.match(/<[^>]*>[^<]*<\/[^>]*>|<[^/>]+\/>/g); 178 | 179 | // If matches are found, join them to form the pure HTML content; otherwise, return an empty string 180 | return matches ? matches.join("") : ""; 181 | } 182 | 183 | document.addEventListener("mouseover", (e) => { 184 | console.log(isOn, isClicked); 185 | if (!isOn) return; 186 | if (isClicked) return; 187 | if (e.target?.className.includes("umix-popup")) return; 188 | 189 | // check if the mouse is over the variable named img 190 | if (e.target === img) return; 191 | 192 | const x = e.clientX; 193 | const y = e.clientY; 194 | const element = document.elementFromPoint(x, y); 195 | 196 | if (selectedElement) { 197 | selectedElement.classList.remove("highlight-on-hover"); 198 | } 199 | 200 | selectedElement = element; 201 | 202 | // Add highlight effect to the selected element 203 | selectedElement.classList.add("highlight-on-hover"); 204 | console.log(selectedElement); 205 | }); 206 | 207 | document.addEventListener("keydown", function(event) { 208 | if (!isOn) return; 209 | if (event.key === "Escape") { 210 | isClicked = false; 211 | if (currentPopup) { 212 | currentPopup.remove(); 213 | currentPopup = null; 214 | } 215 | if (selectedElement) { 216 | selectedElement.classList.remove("highlight-on-hover"); 217 | } 218 | selectedElement = null; 219 | } 220 | }); 221 | 222 | document.addEventListener("click", (e) => { 223 | if (!isOn) return; 224 | if (e.target === img) return; 225 | 226 | if ( 227 | currentPopup && 228 | selectedElement && 229 | e.target !== selectedElement && 230 | !selectedElement.contains(e.target) && 231 | e.target !== currentPopup && 232 | !currentPopup.contains(e.target) 233 | ) { 234 | isClicked = false; 235 | if (currentPopup) { 236 | currentPopup.remove(); 237 | currentPopup = null; 238 | } 239 | if (selectedElement) { 240 | selectedElement.classList.remove("highlight-on-hover"); 241 | } 242 | selectedElement = null; 243 | return; 244 | } 245 | 246 | isClicked = true; 247 | 248 | if (!selectedElement) return; 249 | let currentEl = selectedElement; 250 | if ( 251 | e.target?.className.includes("umix-popup") || 252 | !selectedElement.className.includes("highlight-on-hover") 253 | ) 254 | return; 255 | if (currentPopup) { 256 | currentPopup.remove(); 257 | currentPopup = null; 258 | } 259 | 260 | // defines text area, button, and popup 261 | const input = document.createElement("textarea"); 262 | const button = document.createElement("button"); 263 | const popup = document.createElement("div"); 264 | 265 | popup.className = "umix-popup umix-container"; 266 | button.className = "umix-popup umix-button"; 267 | input.className = "umix-popup umix-input"; 268 | input.placeholder = 269 | "Make the text larger or change the colors of this element."; 270 | input.style.color = "black"; 271 | button.style.color = "black"; 272 | popup.style.position = "fixed"; 273 | const x = e.clientX; 274 | const y = e.clientY; 275 | popup.style.left = `${x}px`; 276 | popup.style.top = `${y}px`; 277 | popup.style.zIndex = "99999"; 278 | 279 | const buttonText = ` 280 | 281 | `; 282 | 283 | const callback = () => { 284 | if (!isOn) return; 285 | currentEl.classList.remove("highlight-on-hover"); 286 | button.textContent = "Loading..."; 287 | fetch("https://dubhacks23-production.up.railway.app/edit", { 288 | method: "POST", 289 | headers: { 290 | "Content-Type": "application/json", 291 | }, 292 | body: JSON.stringify({ 293 | html: currentEl.outerHTML, 294 | edit: input.value, 295 | }), 296 | }) 297 | .then((response) => response.json()) // Convert the response to JSON 298 | .then((data) => { 299 | try { 300 | console.log(data); 301 | const html = extractHtmlContent(data.output.output); 302 | 303 | const fragment = document.createElement("div"); 304 | fragment.innerHTML = html; 305 | button.innerHTML = buttonText; 306 | 307 | currentEl.replaceWith(fragment); 308 | currentEl = fragment; 309 | } catch (error) { 310 | console.error(error); 311 | } 312 | }) 313 | .catch((error) => { 314 | console.error(error); 315 | }); 316 | }; 317 | 318 | input.onkeypress = (event) => { 319 | if (!isOn) return; 320 | if (event.key === "Enter") { 321 | event.preventDefault(); // Enter no longer makes a new line 322 | callback(); 323 | } 324 | }; 325 | 326 | button.onclick = callback; 327 | button.innerHTML = buttonText; 328 | 329 | popup.appendChild(input); 330 | popup.appendChild(button); 331 | 332 | document.body.appendChild(popup); 333 | 334 | currentPopup = popup; 335 | currentEl.classList.add("highlight-on-hover"); 336 | }); 337 | 338 | /** 339 | * Bundled by jsDelivr using Rollup v2.79.1 and Terser v5.19.2. 340 | * Original file: /npm/js-confetti@0.11.0/dist/es/index.js 341 | * 342 | * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files 343 | */ 344 | function t(t, e) { if (!(t instanceof e)) throw new TypeError("Cannot call a class as a function") } function e(t, e) { for (var i = 0; i < e.length; i++) { var n = e[i]; n.enumerable = n.enumerable || !1, n.configurable = !0, "value" in n && (n.writable = !0), Object.defineProperty(t, n.key, n) } } function i(t, i, n) { return i && e(t.prototype, i), n && e(t, n), t } function n(t) { return +t.replace(/px/, "") } function s(t, e) { var i = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : 0, n = Math.random() * (e - t) + t; return Math.floor(n * Math.pow(10, i)) / Math.pow(10, i) } function o(t) { return t[s(0, t.length)] } var a = ["#fcf403", "#62fc03", "#f4fc03", "#03e7fc", "#03fca5", "#a503fc", "#fc03ad", "#fc03c2"]; function r(t) { return Math.log(t) / Math.log(1920) } var h = function() { function e(i) { t(this, e); var n = i.initialPosition, a = i.direction, h = i.confettiRadius, c = i.confettiColors, u = i.emojis, l = i.emojiSize, d = i.canvasWidth, f = s(.9, 1.7, 3) * r(d); this.confettiSpeed = { x: f, y: f }, this.finalConfettiSpeedX = s(.2, .6, 3), this.rotationSpeed = u.length ? .01 : s(.03, .07, 3) * r(d), this.dragForceCoefficient = s(5e-4, 9e-4, 6), this.radius = { x: h, y: h }, this.initialRadius = h, this.rotationAngle = "left" === a ? s(0, .2, 3) : s(-.2, 0, 3), this.emojiSize = l, this.emojiRotationAngle = s(0, 2 * Math.PI), this.radiusYUpdateDirection = "down"; var m = "left" === a ? s(82, 15) * Math.PI / 180 : s(-15, -82) * Math.PI / 180; this.absCos = Math.abs(Math.cos(m)), this.absSin = Math.abs(Math.sin(m)); var p = s(-150, 0), v = { x: n.x + ("left" === a ? -p : p) * this.absCos, y: n.y - p * this.absSin }; this.currentPosition = Object.assign({}, v), this.initialPosition = Object.assign({}, v), this.color = u.length ? null : o(c), this.emoji = u.length ? o(u) : null, this.createdAt = (new Date).getTime(), this.direction = a } return i(e, [{ key: "draw", value: function(t) { var e = this.currentPosition, i = this.radius, n = this.color, s = this.emoji, o = this.rotationAngle, a = this.emojiRotationAngle, r = this.emojiSize, h = window.devicePixelRatio; n ? (t.fillStyle = n, t.beginPath(), t.ellipse(e.x * h, e.y * h, i.x * h, i.y * h, o, 0, 2 * Math.PI), t.fill()) : s && (t.font = "".concat(r, "px serif"), t.save(), t.translate(h * e.x, h * e.y), t.rotate(a), t.textAlign = "center", t.fillText(s, 0, 0), t.restore()) } }, { key: "updatePosition", value: function(t, e) { var i = this.confettiSpeed, n = this.dragForceCoefficient, s = this.finalConfettiSpeedX, o = this.radiusYUpdateDirection, a = this.rotationSpeed, r = this.createdAt, h = this.direction, c = e - r; i.x > s && (this.confettiSpeed.x -= n * t), this.currentPosition.x += i.x * ("left" === h ? -this.absCos : this.absCos) * t, this.currentPosition.y = this.initialPosition.y - i.y * this.absSin * c + .00125 * Math.pow(c, 2) / 2, this.rotationSpeed -= this.emoji ? 1e-4 : 1e-5 * t, this.rotationSpeed < 0 && (this.rotationSpeed = 0), this.emoji ? this.emojiRotationAngle += this.rotationSpeed * t % (2 * Math.PI) : "down" === o ? (this.radius.y -= t * a, this.radius.y <= 0 && (this.radius.y = 0, this.radiusYUpdateDirection = "up")) : (this.radius.y += t * a, this.radius.y >= this.initialRadius && (this.radius.y = this.initialRadius, this.radiusYUpdateDirection = "down")) } }, { key: "getIsVisibleOnCanvas", value: function(t) { return this.currentPosition.y < t + 100 } }]), e }(); var c = function() { function e(i) { var n = this; t(this, e), this.canvasContext = i, this.shapes = [], this.promise = new Promise((function(t) { return n.resolvePromise = t })) } return i(e, [{ key: "getBatchCompletePromise", value: function() { return this.promise } }, { key: "addShapes", value: function() { var t; (t = this.shapes).push.apply(t, arguments) } }, { key: "complete", value: function() { var t; return !this.shapes.length && (null === (t = this.resolvePromise) || void 0 === t || t.call(this), !0) } }, { key: "processShapes", value: function(t, e, i) { var n = this, s = t.timeDelta, o = t.currentTime; this.shapes = this.shapes.filter((function(t) { return t.updatePosition(s, o), t.draw(n.canvasContext), !i || t.getIsVisibleOnCanvas(e) })) } }]), e }(), u = function() { function e() { var i, n = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}; t(this, e), this.activeConfettiBatches = [], this.canvas = n.canvas || ((i = document.createElement("canvas")).style.position = "fixed", i.style.width = "100%", i.style.height = "100%", i.style.top = "0", i.style.left = "0", i.style.zIndex = "1000", i.style.pointerEvents = "none", document.body.appendChild(i), i), this.canvasContext = this.canvas.getContext("2d"), this.requestAnimationFrameRequested = !1, this.lastUpdated = (new Date).getTime(), this.iterationIndex = 0, this.loop = this.loop.bind(this), requestAnimationFrame(this.loop) } return i(e, [{ key: "loop", value: function() { var t, e, i, s, o; this.requestAnimationFrameRequested = !1, t = this.canvas, e = window.devicePixelRatio, i = getComputedStyle(t), s = n(i.getPropertyValue("width")), o = n(i.getPropertyValue("height")), t.setAttribute("width", (s * e).toString()), t.setAttribute("height", (o * e).toString()); var a = (new Date).getTime(), r = a - this.lastUpdated, h = this.canvas.offsetHeight, c = this.iterationIndex % 10 == 0; this.activeConfettiBatches = this.activeConfettiBatches.filter((function(t) { return t.processShapes({ timeDelta: r, currentTime: a }, h, c), !c || !t.complete() })), this.iterationIndex++, this.queueAnimationFrameIfNeeded(a) } }, { key: "queueAnimationFrameIfNeeded", value: function(t) { this.requestAnimationFrameRequested || this.activeConfettiBatches.length < 1 || (this.requestAnimationFrameRequested = !0, this.lastUpdated = t || (new Date).getTime(), requestAnimationFrame(this.loop)) } }, { key: "addConfetti", value: function() { for (var t = function(t) { var e = t.confettiRadius, i = void 0 === e ? 6 : e, n = t.confettiNumber, s = void 0 === n ? t.confettiesNumber || (t.emojis ? 40 : 250) : n, o = t.confettiColors, r = void 0 === o ? a : o, h = t.emojis, c = void 0 === h ? t.emojies || [] : h, u = t.emojiSize, l = void 0 === u ? 80 : u; return t.emojies && console.error("emojies argument is deprecated, please use emojis instead"), t.confettiesNumber && console.error("confettiesNumber argument is deprecated, please use confettiNumber instead"), { confettiRadius: i, confettiNumber: s, confettiColors: r, emojis: c, emojiSize: l } }(arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}), e = t.confettiRadius, i = t.confettiNumber, n = t.confettiColors, s = t.emojis, o = t.emojiSize, r = this.canvas.getBoundingClientRect(), u = r.width, l = 5 * r.height / 7, d = { x: 0, y: l }, f = { x: u, y: l }, m = new c(this.canvasContext), p = 0; p < i / 2; p++) { var v = new h({ initialPosition: d, direction: "right", confettiRadius: e, confettiColors: n, confettiNumber: i, emojis: s, emojiSize: o, canvasWidth: u }), g = new h({ initialPosition: f, direction: "left", confettiRadius: e, confettiColors: n, confettiNumber: i, emojis: s, emojiSize: o, canvasWidth: u }); m.addShapes(v, g) } return this.activeConfettiBatches.push(m), this.queueAnimationFrameIfNeeded(), m.getBatchCompletePromise() } }, { key: "clearCanvas", value: function() { this.activeConfettiBatches = [] } }]), e }(); 345 | //# sourceMappingURL=/sm/c67b6ad0e5cbbbffac6d59f91cc56ec0ebbc7f312e8a10feab8f9160c2fdbfa7.map 346 | -------------------------------------------------------------------------------- /lib/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "umix", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "library.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "Pranav Teegavarapu", 11 | "license": "ISC" 12 | } 13 | -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "manifest_version": 3, 3 | "name": "Umix", 4 | "description": "Lets you remix pages from all over the internet", 5 | "version": "1.0", 6 | "permissions": [ 7 | "activeTab" 8 | ], 9 | "icons": { 10 | "1080": "images/logo2.png" 11 | }, 12 | "content_scripts": [ 13 | { 14 | "matches": [""], 15 | "js": ["index.js"] 16 | } 17 | ], 18 | "web_accessible_resources": [ 19 | { 20 | "resources": ["logo.png", "js-confetti.min.js"], 21 | "matches": [""] 22 | } 23 | ] 24 | } -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "dubhacks22", 3 | "lockfileVersion": 3, 4 | "requires": true, 5 | "packages": {} 6 | } 7 | --------------------------------------------------------------------------------