├── .commitlintrc.js ├── .eslintignore ├── .eslintrc.js ├── .github └── workflows │ └── webpilot-vue3.yml ├── .gitignore ├── .husky ├── commit-msg └── pre-commit ├── .prettierrc.js ├── .stylelintrc.js ├── .vscode └── settings.json ├── LICENSE ├── README.md ├── assets ├── icon.png ├── icon │ ├── close.svg │ └── sendActive.svg ├── locales │ ├── en │ │ └── messages.json │ └── zh_CN │ │ └── messages.json └── styles │ ├── csui-reset.scss │ ├── csui-theme.scss │ ├── reset.scss │ ├── solarized_dark.scss │ └── solarized_light.scss ├── doc └── WebPilot Chrome Extension Privacy Policy.md ├── gettext.config.js ├── package.json ├── pnpm-lock.yaml ├── scripts └── i18n │ ├── gettextOutput │ ├── messages.pot │ └── translations.json │ └── postGettext.js ├── src ├── apiConfig.ts ├── apiService.ts ├── background │ ├── index.js │ └── messages │ │ ├── openSetting.ts │ │ ├── popupCheck.ts │ │ └── signInSuccess.ts ├── components │ ├── DisplayMode.vue │ ├── FloatControlButtons.vue │ ├── HeaderPanel.vue │ ├── HeaderSwitch.vue │ ├── HelpTips.vue │ ├── InteractiveIcon │ │ ├── InteractiveIcon.vue │ │ └── image │ │ │ ├── CloseDarkClick.svg │ │ │ ├── CloseDarkDefault.svg │ │ │ ├── CloseDarkDisable.svg │ │ │ ├── CloseDarkHover.svg │ │ │ ├── CloseLightClick.svg │ │ │ ├── CloseLightDefault.svg │ │ │ ├── CloseLightDisable.svg │ │ │ ├── CloseLightHover.svg │ │ │ ├── CollectDarkClick.svg │ │ │ ├── CollectDarkDefault.svg │ │ │ ├── CollectDarkDisable.svg │ │ │ ├── CollectDarkHover.svg │ │ │ ├── CollectLightClick.svg │ │ │ ├── CollectLightDefault.svg │ │ │ ├── CollectLightDisable.svg │ │ │ ├── CollectLightHover.svg │ │ │ ├── CopyDarkClick.svg │ │ │ ├── CopyDarkDefault.svg │ │ │ ├── CopyDarkDisable.svg │ │ │ ├── CopyDarkHover.svg │ │ │ ├── CopyLightClick.svg │ │ │ ├── CopyLightDefault.svg │ │ │ ├── CopyLightDisable.svg │ │ │ ├── CopyLightHover.svg │ │ │ ├── DeleteDarkClick.svg │ │ │ ├── DeleteDarkDefault.svg │ │ │ ├── DeleteDarkHover.svg │ │ │ ├── DeleteLightClick.svg │ │ │ ├── DeleteLightDefault.svg │ │ │ ├── DeleteLightHover.svg │ │ │ ├── PencilDarkClick.svg │ │ │ ├── PencilDarkDefault.svg │ │ │ ├── PencilDarkHover.svg │ │ │ ├── PencilLightClick.svg │ │ │ ├── PencilLightDefault.svg │ │ │ ├── PencilLightHover.svg │ │ │ ├── PreviousDarkClick.svg │ │ │ ├── PreviousDarkDefault.svg │ │ │ ├── PreviousDarkDisable.svg │ │ │ ├── PreviousDarkHover.svg │ │ │ ├── PreviousLightClick.svg │ │ │ ├── PreviousLightDefault.svg │ │ │ ├── PreviousLightDisable.svg │ │ │ ├── PreviousLightHover.svg │ │ │ ├── SaveDarkClick.svg │ │ │ ├── SaveDarkDefault.svg │ │ │ ├── SaveDarkDisable.svg │ │ │ ├── SaveDarkHover.svg │ │ │ ├── SaveLightClick.svg │ │ │ ├── SaveLightDefault.svg │ │ │ ├── SaveLightDisable.svg │ │ │ ├── SaveLightHover.svg │ │ │ ├── SendDarkClick.svg │ │ │ ├── SendDarkDefault.svg │ │ │ ├── SendDarkHover.svg │ │ │ ├── SendLightClick.svg │ │ │ ├── SendLightDefault.svg │ │ │ ├── SendLightHover.svg │ │ │ ├── SettingDarkClick.svg │ │ │ ├── SettingDarkDefault.svg │ │ │ ├── SettingDarkDisable.svg │ │ │ ├── SettingDarkHover.svg │ │ │ ├── SettingLightClick.svg │ │ │ ├── SettingLightDefault.svg │ │ │ ├── SettingLightDisable.svg │ │ │ └── SettingLightHover.svg │ ├── PromptAreaSelector.vue │ ├── PromptEditor.vue │ ├── PromptInput.vue │ ├── PromptList.vue │ ├── PromptListItem.vue │ ├── PromptMenu.vue │ ├── PromptResult.vue │ ├── SendButton │ │ └── Index.vue │ ├── ShortcutInput.vue │ ├── ShortcutTips.vue │ ├── SuperButton │ │ ├── SuperButton.vue │ │ ├── SuperButtonPromptEditor.vue │ │ ├── SuperButtonTooltip.vue │ │ └── icon │ │ │ ├── edit.svg │ │ │ ├── editActive.svg │ │ │ ├── editHover.svg │ │ │ ├── generating.svg │ │ │ ├── generatingActive.svg │ │ │ ├── generatingHover.svg │ │ │ ├── triangle.png │ │ │ ├── undo.svg │ │ │ ├── undoActive.svg │ │ │ ├── undoHover.svg │ │ │ ├── webpilot.svg │ │ │ ├── webpilotActive.svg │ │ │ └── webpilotHover.svg │ ├── TipsShortcut.vue │ ├── WebpilotAlert.vue │ ├── WebpilotAttribution.vue │ ├── WebpilotButton.vue │ ├── WebpilotCheckbox.vue │ ├── icon │ │ ├── IconAlertError.vue │ │ ├── IconAlertInfo.vue │ │ ├── IconAlertSuccess.vue │ │ ├── IconBackArrow.vue │ │ ├── IconCheckmark.vue │ │ ├── IconEnter.vue │ │ ├── IconHelp.vue │ │ ├── IconJigsaw.vue │ │ ├── IconLoading.vue │ │ ├── IconLogoAndText.vue │ │ ├── IllustrationPopup.vue │ │ └── IllustrationSidebar.vue │ └── image │ │ ├── IconDraggingDark.svg │ │ ├── IconDraggingLight.svg │ │ ├── ImageFreePlan.vue │ │ ├── ImagePinGuide.vue │ │ ├── ImageSelectTextWithIcon.vue │ │ └── ImageSelectTextWithoutIcon.vue ├── config.ts ├── contents │ ├── DiscordMessages.vue │ ├── GithubIssues.vue │ ├── GithubIssues.vue.bak │ ├── Index.vue │ ├── SlackMessages.vue │ ├── SlackMessages.vue.bak │ ├── TwitterInput.vue │ ├── TwitterMessages.vue │ └── signInListener.ts ├── csui │ ├── DiscordMessages │ │ ├── TheEntry.bak.vue │ │ └── TheEntry.vue │ ├── GithubIssues │ │ └── TheEntry.vue │ ├── Index │ │ ├── TheEntry.vue │ │ ├── ThePopupBox │ │ │ └── ThePopupBox.vue │ │ └── TheSidebar │ │ │ └── TheSidebar.vue │ ├── SlackMessages │ │ ├── TheEntry.bak.vue │ │ └── TheEntry.vue │ ├── TwitterInput │ │ └── TheEntry.vue │ └── TwitterMessages │ │ └── TheEntry.vue ├── featureFlagsConfig.ts ├── hooks │ ├── useAskAi.ts │ ├── useClickoutside.ts │ ├── useDraggable.ts │ ├── useMessage.ts │ ├── useScroll.ts │ ├── useSelectedText.ts │ ├── useStopKeyboardEvent.ts │ └── useSuperButtonPrompt.ts ├── io.ts ├── options │ ├── AboutView.vue │ ├── AccountView.vue │ ├── AdvancedView.vue │ ├── TheEntry.vue │ ├── components │ │ ├── ContributorView.vue │ │ ├── CreditOpenAI.vue │ │ ├── CreditRadioGroup.vue │ │ ├── CreditWebpilotStatus.vue │ │ ├── LinkedAccount.vue │ │ ├── NavItem.vue │ │ ├── ServerTypeSelector.vue │ │ ├── SettingAlert.vue │ │ ├── SwitchButton.vue │ │ └── WebpilotInput.vue │ ├── images │ │ ├── Pop_up.svg │ │ ├── Side_bar.svg │ │ ├── Text+Logo.svg │ │ ├── bg-signin.png │ │ ├── default.png │ │ ├── dropdown.png │ │ ├── edit.png │ │ ├── edit.svg │ │ ├── g-logo.png │ │ ├── help.png │ │ ├── icon-about-filled.vue │ │ ├── icon-about-outline.vue │ │ ├── icon-addon-filled.vue │ │ ├── icon-addon-outline.vue │ │ ├── icon-caret.vue │ │ ├── icon-confirmation.vue │ │ ├── icon-infor-filled.vue │ │ ├── icon-logo-email.vue │ │ ├── icon-logo-github.vue │ │ ├── icon-logo-google.vue │ │ ├── icon-logo-microsoft.vue │ │ ├── icon-logo-openai-proxy.vue │ │ ├── icon-logo-openai.vue │ │ ├── icon-logo-twitter.vue │ │ ├── icon-logo-with-text-dark.vue │ │ ├── icon-logo-with-text.vue │ │ ├── icon-logo.vue │ │ ├── icon-nav-about-filled.vue │ │ ├── icon-nav-about-outline.vue │ │ ├── icon-nav-extension-filled.vue │ │ ├── icon-nav-extension-outline.vue │ │ ├── icon-person-filled.vue │ │ ├── icon-person-outline.vue │ │ ├── icon-question-outline.vue │ │ ├── question_mark.svg │ │ └── sign-in-with-google.png │ ├── index.css │ ├── index.html │ ├── index.vue │ └── views │ │ ├── AboutView.vue │ │ ├── AccountView.vue │ │ └── ExtensionView.vue ├── popup │ ├── componetns │ │ └── WebpilotPopup.vue │ ├── index.html │ └── index.vue ├── stores │ ├── api.ts │ ├── store.ts │ └── user.ts ├── tabs │ ├── components │ │ ├── StepFour.vue │ │ ├── StepOne.vue │ │ ├── StepThree.vue │ │ ├── StepTwo.vue │ │ ├── WelcomePage.vue │ │ └── WelcomeTitle.vue │ ├── images │ │ ├── icon-gift.png │ │ ├── key-cap-big.png │ │ ├── key-cap-small.png │ │ ├── logo.png │ │ └── signin-google.png │ ├── index.html │ └── index.vue └── utils │ ├── i18n.js │ └── index.ts └── tsconfig.json /.commitlintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: ['@commitlint/config-conventional'], 3 | } 4 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | .plasmo/ 2 | build/ 3 | -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: {webextensions: true}, 4 | extends: ['standard-one/vue', 'standard-one'], 5 | parserOptions: { 6 | tsconfigRootDir: __dirname, 7 | project: ['./tsconfig.json'], 8 | }, 9 | rules: { 10 | 'import/no-unresolved': [2, {ignore: ['data-url:', 'data-base64:']}], 11 | }, 12 | } 13 | -------------------------------------------------------------------------------- /.github/workflows/webpilot-vue3.yml: -------------------------------------------------------------------------------- 1 | # This workflow will do a clean installation of node dependencies, cache/restore them, build the source code and run tests across different versions of node 2 | # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nodejs 3 | 4 | name: Vue3 Webpilot 5 | 6 | on: 7 | push: 8 | branches: 9 | - 'main' 10 | - 'vue3' 11 | - 'dev' 12 | pull_request: 13 | branches: 14 | - 'main' 15 | - 'vue3' 16 | - 'dev' 17 | 18 | jobs: 19 | build: 20 | runs-on: ubuntu-latest 21 | 22 | strategy: 23 | matrix: 24 | node-version: [18.x] 25 | 26 | steps: 27 | - uses: actions/checkout@v3 28 | 29 | - name: Use Node.js ${{ matrix.node-version }} 30 | uses: actions/setup-node@v3 31 | with: 32 | node-version: ${{ matrix.node-version }} 33 | 34 | - uses: pnpm/action-setup@v2 35 | name: Install pnpm 36 | id: pnpm-install 37 | with: 38 | version: 8 39 | run_install: false 40 | 41 | - name: Get pnpm store directory 42 | id: pnpm-cache 43 | shell: bash 44 | run: | 45 | echo "STORE_PATH=$(pnpm store path)" >> $GITHUB_OUTPUT 46 | 47 | - uses: actions/cache@v3 48 | name: Setup pnpm cache 49 | with: 50 | path: ${{ steps.pnpm-cache.outputs.STORE_PATH }} 51 | key: ${{ runner.os }}-pnpm-store-${{ hashFiles('**/pnpm-lock.yaml') }} 52 | restore-keys: | 53 | ${{ runner.os }}-pnpm-store- 54 | 55 | - name: Install dependencies 56 | run: pnpm install 57 | 58 | - name: Building extension 59 | run: pnpm run build 60 | 61 | - name: Pack Extension 62 | uses: actions/upload-artifact@v3 63 | with: 64 | name: webpilot 65 | path: build 66 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 3 | 4 | # dependencies 5 | node_modules/ 6 | .pnp 7 | .pnp.js 8 | package-lock.json 9 | yarn.lock 10 | 11 | # testing 12 | /coverage 13 | 14 | #cache 15 | .turbo 16 | .*cache 17 | 18 | # misc 19 | .DS_Store 20 | *.pem 21 | *.po 22 | 23 | # debug 24 | npm-debug.log* 25 | yarn-debug.log* 26 | yarn-error.log* 27 | .pnpm-debug.log* 28 | 29 | # local env files 30 | .env* 31 | 32 | out/ 33 | build/ 34 | dist/ 35 | 36 | # plasmo - https://www.plasmo.com 37 | .plasmo 38 | 39 | # bpp - http://bpp.browser.market/ 40 | keys.json 41 | 42 | # typescript 43 | .tsbuildinfo 44 | -------------------------------------------------------------------------------- /.husky/commit-msg: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | . "$(dirname -- "$0")/_/husky.sh" 3 | 4 | pnpm commitlint --edit $1 5 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | . "$(dirname -- "$0")/_/husky.sh" 3 | 4 | pnpm lint-staged 5 | -------------------------------------------------------------------------------- /.prettierrc.js: -------------------------------------------------------------------------------- 1 | module.exports = require('prettier-config-standard-one') 2 | -------------------------------------------------------------------------------- /.stylelintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: [ 3 | 'stylelint-config-standard-one', 4 | 'stylelint-config-standard-one/scss', 5 | 'stylelint-config-standard-one/vue', 6 | ], 7 | } 8 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "prettier.endOfLine": "cr", 3 | "files.eol": "\n", 4 | "cSpell.words": ["csui", "gettext", "openai", "Webpilot"] 5 | } 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Webpilot 2 | 3 | ![en_1](https://github.com/webpilot-ai/Webpilot/assets/6043666/03248355-bf09-4477-ba79-33fc0dba799c) 4 | 5 | ![en_2](https://github.com/webpilot-ai/Webpilot/assets/6043666/2b15641a-6060-4e52-8962-a4bc2e5983b8) 6 | 7 | ![en_3](https://github.com/webpilot-ai/Webpilot/assets/6043666/29d43c63-c295-473a-a857-6960971f86e8) 8 | 9 | ![en_4](https://github.com/webpilot-ai/Webpilot/assets/6043666/d1df490c-f7f5-4d0d-895f-8dcbdba59955) 10 | 11 | Webpilot is a free, open-source "Copilot for web" that allows you to have free-form conversations with web pages or engage in automatic arguments with other users. Unlike ChatGPT, there is no need to chat or switch web pages, and no need to constantly copy and paste back and forth. 12 | 13 | Chrome Extension: [Add to Chrome](https://chrome.google.com/webstore/detail/Webpilot/biaggnjibplcfekllonekbonhfgchopo?utm_source=link&utm_medium=git&) 14 | 15 | Official Website: [HomePage](https://www.Webpilot.ai/) 16 | 17 | Dev Team: dev@webpilot.ai 18 | 19 | 20 | ## Getting Started 21 | 22 | First, run the development server: 23 | 24 | ```bash 25 | pnpm dev 26 | # or 27 | npm run dev 28 | # or 29 | yarn dev 30 | ``` 31 | 32 | Open your Chrome browser and load the appropriate development build: 33 | 34 | 1. Go to [chrome://extensions](chrome://extensions). 35 | 2. At the top right, turn on Developer mode. 36 | 3. Click Load unpacked. 37 | 4. Find and select the `build/chrome-mv3-dev` folder. 38 | 5. Pin this extension to your Chrome toolbar. 39 | 6. After installation, please refresh the page where you want to select text before using this extension. 40 | 41 | 42 | ## Star History 43 | 44 | [![Star History Chart](https://api.star-history.com/svg?repos=webpilot-ai/Webpilot&type=Date)](https://star-history.com/#webpilot-ai/Webpilot&Date) 45 | -------------------------------------------------------------------------------- /assets/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/webpilot-ai/Webpilot/3f86cb274884658be48d230ac6b6b02f225e546c/assets/icon.png -------------------------------------------------------------------------------- /assets/icon/close.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /assets/icon/sendActive.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /assets/styles/csui-reset.scss: -------------------------------------------------------------------------------- 1 | /* stylelint-disable */ 2 | #webpilot-template { 3 | @import './reset.scss'; 4 | @import './solarized_light.scss'; 5 | } 6 | #webpilot-content { 7 | p { 8 | margin: 0; 9 | line-height: 1.6; 10 | } 11 | pre { 12 | padding: 0; 13 | } 14 | code { 15 | font-size: 14px; 16 | padding: 1 5px; 17 | background: #fdf6e3; 18 | color: #657b83; 19 | border-radius: 6px; 20 | box-shadow: none; 21 | } 22 | } 23 | 24 | @media (prefers-color-scheme: dark) { 25 | #webpilot-template { 26 | @import './solarized_dark.scss'; 27 | } 28 | #webpilot-content { 29 | p { 30 | color: #dcdcdc; 31 | } 32 | li { 33 | color: #dcdcdc; 34 | } 35 | code { 36 | background: #002b36; 37 | color: #839496; 38 | } 39 | } 40 | } -------------------------------------------------------------------------------- /assets/styles/csui-theme.scss: -------------------------------------------------------------------------------- 1 | /* Theme Color */ 2 | 3 | :root { 4 | --webpilot-theme-main-text-color: #929497; 5 | --webpilot-theme-icon-default-and-secondary-text: #585b58; 6 | --webpilot-theme-main-background-color: #fff; 7 | --webpilot-theme-content-background-color: #fff; 8 | --webpilot-theme-baseline-text: #292929; 9 | --webpilot-theme-main-background-shadow: rgb(149 157 165 / 20%); 10 | 11 | /* only text link or title need to change */ 12 | --webpilot-theme-brand-primary: #4f5aff; 13 | --webpilot-theme-stoke-and-hover-status: #dbdeff; 14 | --webpilot-theme-brightness-number: 1; 15 | --webpilot-theme-invert-number: 0; 16 | } 17 | 18 | @media (prefers-color-scheme: dark) { 19 | :root { 20 | --webpilot-theme-main-text-color: #fff; 21 | --webpilot-theme-icon-default-and-secondary-text: #4f5aff33; 22 | --webpilot-theme-main-background-color: #292d3f; 23 | --webpilot-theme-content-background-color: #323558; 24 | --webpilot-theme-baseline-text: #fff; 25 | --webpilot-theme-main-background-shadow: rgb(84 132 181 / 20%); 26 | 27 | // --webpilot-theme-brand-primary: #5e80ff; 28 | --webpilot-theme-brand-primary: #fff; 29 | --webpilot-theme-stoke-and-hover-status: #585c8a; 30 | --webpilot-theme-brightness-number: 3; 31 | --webpilot-theme-invert-number: 1; 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /assets/styles/reset.scss: -------------------------------------------------------------------------------- 1 | /* Box sizing rules */ 2 | *, 3 | *::before, 4 | *::after { 5 | box-sizing: border-box; 6 | font-family: 'PingFang SC', system, -apple-system, BlinkMacSystemFont, 'Helvetica Neue', STHeiti, 7 | 'Microsoft Yahei', Tahoma, Simsun, sans-serif; 8 | } 9 | 10 | /* Remove list styles on ul, ol elements with a list role, which suggests default styling will be removed */ 11 | ul[role='list'], 12 | ol[role='list'] { 13 | list-style: none; 14 | } 15 | 16 | /* Set core root defaults */ 17 | html:focus-within { 18 | scroll-behavior: smooth; 19 | } 20 | 21 | /* Set core body defaults */ 22 | body { 23 | margin: 0; 24 | text-rendering: optimizespeed; 25 | line-height: 1.5; 26 | } 27 | 28 | /* A elements that don"t have a class get default styles */ 29 | a:not([class]) { 30 | text-decoration-skip-ink: auto; 31 | } 32 | 33 | /* Make images easier to work with */ 34 | img, 35 | picture { 36 | display: block; 37 | max-width: 100%; 38 | } 39 | 40 | /* Inherit fonts for inputs and buttons */ 41 | input, 42 | button, 43 | textarea, 44 | select { 45 | font: inherit; 46 | } 47 | 48 | /* Textarea default style */ 49 | textarea { 50 | // background-color: #fff; 51 | cursor: text; 52 | } 53 | -------------------------------------------------------------------------------- /assets/styles/solarized_dark.scss: -------------------------------------------------------------------------------- 1 | /* stylelint-disable */ 2 | // https://unpkg.com/highlightjs@9.16.2/styles/solarized_dark.css 3 | .hljs { 4 | display: block; 5 | overflow-x: auto; 6 | padding: 0.5em; 7 | background: #002b36; 8 | color: #839496 !important; 9 | -webkit-text-size-adjust: none; 10 | } 11 | 12 | .hljs-comment, 13 | .diff .hljs-header, 14 | .hljs-doctype, 15 | .hljs-pi, 16 | .lisp .hljs-string { 17 | color: #586e75 !important; 18 | } 19 | 20 | /* Solarized Green */ 21 | .hljs-keyword, 22 | .hljs-winutils, 23 | .method, 24 | .hljs-addition, 25 | .css .hljs-tag, 26 | .hljs-request, 27 | .hljs-status, 28 | .nginx .hljs-title { 29 | color: #859900 !important; 30 | } 31 | 32 | /* Solarized Cyan */ 33 | .hljs-number, 34 | .hljs-command, 35 | .hljs-string, 36 | .hljs-tag .hljs-value, 37 | .hljs-rule .hljs-value, 38 | .hljs-doctag, 39 | .tex .hljs-formula, 40 | .hljs-regexp, 41 | .hljs-hexcolor, 42 | .hljs-link_url { 43 | color: #2aa198 !important; 44 | } 45 | 46 | /* Solarized Blue */ 47 | .hljs-title, 48 | .hljs-localvars, 49 | .hljs-chunk, 50 | .hljs-decorator, 51 | .hljs-built_in, 52 | .hljs-identifier, 53 | .vhdl .hljs-literal, 54 | .hljs-id, 55 | .css .hljs-function, 56 | .hljs-name { 57 | color: #268bd2 !important; 58 | } 59 | 60 | /* Solarized Yellow */ 61 | .hljs-attribute, 62 | .hljs-variable, 63 | .lisp .hljs-body, 64 | .smalltalk .hljs-number, 65 | .hljs-constant, 66 | .hljs-class .hljs-title, 67 | .hljs-parent, 68 | .hljs-type, 69 | .hljs-link_reference { 70 | color: #b58900 !important; 71 | } 72 | 73 | /* Solarized Orange */ 74 | .hljs-preprocessor, 75 | .hljs-preprocessor .hljs-keyword, 76 | .hljs-pragma, 77 | .hljs-shebang, 78 | .hljs-symbol, 79 | .hljs-symbol .hljs-string, 80 | .diff .hljs-change, 81 | .hljs-special, 82 | .hljs-attr_selector, 83 | .hljs-subst, 84 | .hljs-cdata, 85 | .css .hljs-pseudo, 86 | .hljs-header { 87 | color: #cb4b16 !important; 88 | } 89 | 90 | /* Solarized Red */ 91 | .hljs-deletion, 92 | .hljs-important { 93 | color: #dc322f !important; 94 | } 95 | 96 | /* Solarized Violet */ 97 | .hljs-link_label { 98 | color: #6c71c4 !important; 99 | } 100 | 101 | .tex .hljs-formula { 102 | background: #073642; 103 | } -------------------------------------------------------------------------------- /assets/styles/solarized_light.scss: -------------------------------------------------------------------------------- 1 | /* stylelint-disable */ 2 | // https://unpkg.com/highlightjs@9.16.2/styles/solarized_light.css 3 | .hljs { 4 | display: block; 5 | overflow-x: auto; 6 | padding: 0.5em; 7 | background: #fdf6e3; 8 | color: #657b83 !important; 9 | -webkit-text-size-adjust: none; 10 | } 11 | 12 | .hljs-comment, 13 | .diff .hljs-header, 14 | .hljs-doctype, 15 | .hljs-pi, 16 | .lisp .hljs-string { 17 | color: #93a1a1 !important; 18 | } 19 | 20 | /* Solarized Green */ 21 | .hljs-keyword, 22 | .hljs-winutils, 23 | .method, 24 | .hljs-addition, 25 | .css .hljs-tag, 26 | .hljs-request, 27 | .hljs-status, 28 | .nginx .hljs-title { 29 | color: #859900 !important; 30 | } 31 | 32 | /* Solarized Cyan */ 33 | .hljs-number, 34 | .hljs-command, 35 | .hljs-string, 36 | .hljs-tag .hljs-value, 37 | .hljs-rule .hljs-value, 38 | .hljs-doctag, 39 | .tex .hljs-formula, 40 | .hljs-regexp, 41 | .hljs-hexcolor, 42 | .hljs-link_url { 43 | color: #2aa198 !important; 44 | } 45 | 46 | /* Solarized Blue */ 47 | .hljs-title, 48 | .hljs-localvars, 49 | .hljs-chunk, 50 | .hljs-decorator, 51 | .hljs-built_in, 52 | .hljs-identifier, 53 | .vhdl .hljs-literal, 54 | .hljs-id, 55 | .css .hljs-function, 56 | .hljs-name { 57 | color: #268bd2 !important; 58 | } 59 | 60 | /* Solarized Yellow */ 61 | .hljs-attribute, 62 | .hljs-variable, 63 | .lisp .hljs-body, 64 | .smalltalk .hljs-number, 65 | .hljs-constant, 66 | .hljs-class .hljs-title, 67 | .hljs-parent, 68 | .hljs-type, 69 | .hljs-link_reference { 70 | color: #b58900 !important; 71 | } 72 | 73 | /* Solarized Orange */ 74 | .hljs-preprocessor, 75 | .hljs-preprocessor .hljs-keyword, 76 | .hljs-pragma, 77 | .hljs-shebang, 78 | .hljs-symbol, 79 | .hljs-symbol .hljs-string, 80 | .diff .hljs-change, 81 | .hljs-special, 82 | .hljs-attr_selector, 83 | .hljs-subst, 84 | .hljs-cdata, 85 | .css .hljs-pseudo, 86 | .hljs-header { 87 | color: #cb4b16 !important; 88 | } 89 | 90 | /* Solarized Red */ 91 | .hljs-deletion, 92 | .hljs-important { 93 | color: #dc322f !important; 94 | } 95 | 96 | /* Solarized Violet */ 97 | .hljs-link_label { 98 | color: #6c71c4 !important; 99 | } 100 | 101 | .tex .hljs-formula { 102 | background: #eee8d5; 103 | } -------------------------------------------------------------------------------- /doc/WebPilot Chrome Extension Privacy Policy.md: -------------------------------------------------------------------------------- 1 | # WebPilot Chrome Extension Privacy Policy 2 | Last Updated: October 26, 2023 3 | 4 | ## 1. Introduction 5 | Welcome to WebPilot! This privacy policy is designed to help you understand how we, WebPilot Inc. located at 2435 N CENTRAL EXPY STE 1200, RICHARDSON, TX 75080, collect, use, and share your data when you use our WebPilot Chrome Extension. 6 | 7 | ## 2. Data Collection, Use, and Storage 8 | Login Information: Before users can fully utilize the WebPilot Chrome Extension, they are required to log in using their Google account. We use this information only for authentication purposes and do not store any personal data related to your Google account. 9 | 10 | User Interactions: We do not actively collect personal information from users. However, if users engage in a Q&A session with selected content or an entire page, we collect the chosen text and the user's questions. This information is used solely to respond to user requests, as this is an AI application, and to optimize our product. 11 | 12 | Data Storage: All collected data is stored in the United States. We prioritize the safety and security of your data. 13 | 14 | API Requests: Users have the option to make requests to WebPilot servers using their WebPilot account quota or invoke their own OpenAI API Key to communicate with OpenAI, Microsoft, or other custom proxies. 15 | 16 | ## 3. Data Sharing 17 | When users make requests to WebPilot servers, we may relay these requests to OpenAI, Microsoft, or future AI service providers. This is a standard request mechanism, and the data shared is limited to the user-selected content and the accompanying questions. 18 | 19 | ## 4. Open Source and Licensing 20 | WebPilot Chrome Extension is an open-source application and can be found at https://github.com/webpilot-ai/Webpilot. It adheres to the GPL-3.0 license. 21 | 22 | ## 5. Updates to This Privacy Policy 23 | We may update our privacy policy in the future to reflect changes in our practices or for other operational, legal, or regulatory reasons. Such updates may be made without additional notice. 24 | 25 | ## 6. Contact Us 26 | For more information about our privacy practices, if you have questions, or if you would like to make a complaint, please contact us at: 27 | 28 | WebPilot Inc. 29 | 2435 N CENTRAL EXPY STE 1200 30 | RICHARDSON, TX 75080 31 | -------------------------------------------------------------------------------- /gettext.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | input: { 3 | path: './src', // only files in this directory are considered for extraction 4 | include: ['**/*.vue', '**/*.ts', '**/*.js'], 5 | exclude: [], 6 | compileTemplate: true, // do not compile