├── web
├── .editorconfig
├── .python-version
├── .tool-versions
├── .yarnrc.yml
├── src
│ ├── components
│ │ ├── common
│ │ │ ├── yaml.worker.js
│ │ │ ├── ChatContent.css
│ │ │ ├── setupScript.ts
│ │ │ ├── SettingsBlock.tsx
│ │ │ ├── AbortTaskButton.tsx
│ │ │ ├── RunTaskButton.tsx
│ │ │ ├── PlannerConfig.tsx
│ │ │ ├── QuickActionButton.tsx
│ │ │ ├── ModelDropdown.tsx
│ │ │ ├── VoiceInputButton.tsx
│ │ │ ├── Thumbnails.tsx
│ │ │ ├── SemanticLayer.tsx
│ │ │ ├── CreditsPill.tsx
│ │ │ ├── AutosizeTextarea.tsx
│ │ │ ├── Subscription.tsx
│ │ │ ├── Suggestions.tsx
│ │ │ └── UIElements.ts
│ │ └── devtools
│ │ │ ├── CustomInstructions.tsx
│ │ │ └── DataCatalog.tsx
│ ├── assets
│ │ └── img
│ │ │ ├── logo.png
│ │ │ ├── icon-128.png
│ │ │ ├── icon-34.png
│ │ │ ├── logo_x.svg
│ │ │ └── logo.svg
│ ├── declarations.d.ts
│ ├── globals.d.ts
│ ├── helpers
│ │ ├── extensionId.ts
│ │ ├── platformCustomization.ts
│ │ ├── recordings.ts
│ │ ├── templatize.ts
│ │ ├── countTokens.ts
│ │ ├── app.ts
│ │ ├── slugg.d.ts
│ │ ├── sqlProcessor.ts
│ │ ├── tests
│ │ │ └── script.js
│ │ ├── templatize.test.ts
│ │ ├── nativeEvents.ts
│ │ ├── documentSubscription.ts
│ │ ├── LLM
│ │ │ ├── index.ts
│ │ │ └── types.ts
│ │ ├── origin.ts
│ │ ├── screenCapture
│ │ │ └── extensionCapture.ts
│ │ └── rpcCalls.ts
│ ├── app
│ │ ├── api
│ │ │ ├── billing.ts
│ │ │ ├── index.ts
│ │ │ ├── notifications.ts
│ │ │ ├── concurrency.ts
│ │ │ └── planner.ts
│ │ ├── toast.ts
│ │ ├── index.html
│ │ ├── clarification.ts
│ │ ├── sidechat.ts
│ │ ├── userConfirmation.ts
│ │ └── appSettings.ts
│ ├── planner
│ │ ├── cotPlan.ts
│ │ └── metaPlan.ts
│ ├── env.defaults.json
│ ├── state
│ │ ├── dispatch.ts
│ │ ├── configs
│ │ │ └── reducer.ts
│ │ ├── cache
│ │ │ └── reducer.ts
│ │ ├── chat
│ │ │ └── types.ts
│ │ ├── auth
│ │ │ └── reducer.ts
│ │ ├── billing
│ │ │ └── reducer.ts
│ │ ├── semantic-layer
│ │ │ └── reducer.ts
│ │ └── notifications
│ │ │ └── reducer.ts
│ ├── types.d.ts
│ ├── types
│ │ └── notifications.ts
│ ├── chat
│ │ └── chat.test.ts
│ ├── package.ts
│ ├── cache
│ │ ├── events.ts
│ │ ├── cache.test.ts
│ │ └── indexedDb.ts
│ ├── hooks
│ │ └── useCustomCSS.ts
│ └── tracking
│ │ ├── init.ts
│ │ └── custom
│ │ └── index.ts
├── public
│ ├── screenshots
│ │ ├── addons-menu.png
│ │ ├── addons-install.png
│ │ ├── addons-search.png
│ │ ├── addons-activate.png
│ │ └── addons-unavailable.png
│ ├── popup.html
│ ├── logo_x.svg
│ ├── logo_x_light.svg
│ ├── extension.css
│ └── extension.json
├── .vscode
│ └── settings.json
├── jest.env.js
├── licenses
│ ├── FOSS.md
│ └── TaxyAI-license.md
├── .prettierrc
├── setupJest.js
├── docker-compose.yaml
├── babel.config.js
├── README.md
├── .gitignore
├── tsconfig.json
├── .eslintrc
├── Dockerfile
└── vite.config.ts
├── .python-version
├── .vscode
└── settings.json
├── extension
├── .python-version
├── .tool-versions
├── .yarnrc.yml
├── src
│ ├── content
│ │ ├── RPCs
│ │ │ ├── log.ts
│ │ │ ├── copyToClipboard.ts
│ │ │ ├── sendIFrameMessage.ts
│ │ │ ├── ripple.ts
│ │ │ ├── microphone.ts
│ │ │ ├── elementScreenCapture.ts
│ │ │ ├── crossInstanceComms.ts
│ │ │ ├── fetchData.ts
│ │ │ └── domActions.ts
│ │ ├── apps.ts
│ │ ├── debug.ts
│ │ ├── types.d.ts
│ │ ├── dragAndToggle.ts
│ │ └── polyfill.ts
│ ├── assets
│ │ └── img
│ │ │ ├── logo.png
│ │ │ ├── icon-34.png
│ │ │ ├── icon-128.png
│ │ │ ├── logo_x.svg
│ │ │ └── logo.svg
│ ├── globals.d.ts
│ ├── helpers
│ │ ├── utils.ts
│ │ ├── setupScript.ts
│ │ ├── setupStyles.ts
│ │ ├── pageParse
│ │ │ ├── getElements.ts
│ │ │ ├── querySelectorTypes.d.ts
│ │ │ └── resolveSelectors.ts
│ │ └── components
│ │ │ └── RecursiveComponent.tsx
│ ├── package.ts
│ ├── popup
│ │ ├── index.tsx
│ │ ├── index.html
│ │ └── Popup.tsx
│ ├── background
│ │ ├── RPCs
│ │ │ ├── captureVisibleTab.ts
│ │ │ └── chromeDebugger.ts
│ │ ├── identifier.ts
│ │ └── index.ts
│ ├── env.defaults.json
│ ├── apps-script
│ │ ├── README.md
│ │ └── gsheets
│ │ │ └── appsscript.json
│ ├── manifest.json
│ ├── posthog
│ │ └── index.ts
│ ├── types.d.ts
│ └── constants.ts
├── .vscode
│ └── settings.json
├── licenses
│ ├── FOSS.md
│ └── TaxyAI-license.md
├── .prettierrc
├── utils
│ ├── env.js
│ ├── build.js
│ └── webserver.js
├── babel.config.js
├── .gitignore
├── tsconfig.json
├── README.md
├── .eslintrc
└── package.json
├── simulator
├── src
│ ├── data
│ │ └── authState.json
│ ├── env.defaults.json
│ ├── mods
│ │ ├── types.ts
│ │ └── runAllCells.ts
│ ├── utils
│ │ ├── constants.ts
│ │ ├── login.ts
│ │ ├── teardown.ts
│ │ ├── appState.ts
│ │ ├── setup.ts
│ │ ├── minusxState.ts
│ │ └── testRunner.ts
│ ├── constants.ts
│ ├── checks
│ │ ├── types.ts
│ │ ├── checkAppState.ts
│ │ └── checkRespondToUser.ts
│ ├── specs
│ │ └── jupyter
│ │ │ ├── test_01.spec.ts
│ │ │ └── test_02.spec.ts
│ └── fixtures
│ │ ├── frame.ts
│ │ ├── base.ts
│ │ └── jupyter.ts
├── .gitignore
├── docker
│ └── jupyter.Dockerfile
├── docker-compose.yaml
├── package.json
├── .github
│ └── workflows
│ │ └── playwright.yml
└── README.md
├── .yarnrc.yml
├── apps
├── src
│ ├── globals.d.ts
│ ├── package.extension.ts
│ ├── declarations.d.ts
│ ├── google
│ │ ├── appSetup.ts
│ │ ├── fingerprint.ts
│ │ ├── sampleCode.js
│ │ └── googleSheetInternalState.ts
│ ├── base
│ │ ├── appSetup.ts
│ │ ├── appHook.ts
│ │ ├── prompts.ts
│ │ └── appState.ts
│ ├── posthog
│ │ ├── appSetup.ts
│ │ ├── fingerprint.ts
│ │ ├── stateSchema.ts
│ │ ├── posthogObserver.ts
│ │ ├── defaultState.ts
│ │ ├── types.ts
│ │ ├── inject.ts
│ │ └── querySelectorMap.ts
│ ├── jupyter
│ │ ├── nb-to-md-report
│ │ │ ├── llmConfig.ts
│ │ │ └── prompts.ts
│ │ ├── appSetup.ts
│ │ ├── fingerprint.ts
│ │ └── defaultState.ts
│ ├── metabase
│ │ ├── helpers
│ │ │ ├── slugg.d.ts
│ │ │ ├── stateSubscriptions.ts
│ │ │ ├── dashboard
│ │ │ │ ├── util.ts
│ │ │ │ └── runSqlQueryFromDashboard.ts
│ │ │ ├── parseTables.ts
│ │ │ └── parseSql.ts
│ │ ├── appSetup.ts
│ │ └── fingerprint.ts
│ ├── appStateConfigs.ts
│ ├── types.d.ts
│ ├── appSetupConfigs.ts
│ └── package.ts
├── jest.config.js
├── tsconfig.json
└── package.json
├── .gitignore
├── package.json
├── CONTRIBUTING.md
├── .github
└── workflows
│ └── deploy.yml
├── LICENSE.txt
└── setup.md
/web/.editorconfig:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.python-version:
--------------------------------------------------------------------------------
1 | 3.11.4
2 |
--------------------------------------------------------------------------------
/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | }
--------------------------------------------------------------------------------
/web/.python-version:
--------------------------------------------------------------------------------
1 | 3.11.4
2 |
--------------------------------------------------------------------------------
/web/.tool-versions:
--------------------------------------------------------------------------------
1 | nodejs 19.7.0
--------------------------------------------------------------------------------
/extension/.python-version:
--------------------------------------------------------------------------------
1 | 3.11.4
2 |
--------------------------------------------------------------------------------
/extension/.tool-versions:
--------------------------------------------------------------------------------
1 | nodejs 19.7.0
--------------------------------------------------------------------------------
/simulator/src/data/authState.json:
--------------------------------------------------------------------------------
1 | {}
--------------------------------------------------------------------------------
/.yarnrc.yml:
--------------------------------------------------------------------------------
1 | nodeLinker: node-modules
2 |
--------------------------------------------------------------------------------
/apps/src/globals.d.ts:
--------------------------------------------------------------------------------
1 | declare module '*.md';
2 |
--------------------------------------------------------------------------------
/web/.yarnrc.yml:
--------------------------------------------------------------------------------
1 | nodeLinker: node-modules
2 |
--------------------------------------------------------------------------------
/extension/.yarnrc.yml:
--------------------------------------------------------------------------------
1 | nodeLinker: node-modules
2 |
--------------------------------------------------------------------------------
/web/src/components/common/yaml.worker.js:
--------------------------------------------------------------------------------
1 | import "monaco-yaml/yaml.worker.js";
--------------------------------------------------------------------------------
/apps/src/package.extension.ts:
--------------------------------------------------------------------------------
1 | export { getAppSetupConfigs } from "./appSetupConfigs";
--------------------------------------------------------------------------------
/simulator/src/env.defaults.json:
--------------------------------------------------------------------------------
1 | {
2 | "TEST_EMAIL": "",
3 | "TEST_OTP": ""
4 | }
--------------------------------------------------------------------------------
/web/src/assets/img/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/minusxai/minusx/HEAD/web/src/assets/img/logo.png
--------------------------------------------------------------------------------
/extension/src/content/RPCs/log.ts:
--------------------------------------------------------------------------------
1 | export async function log(...args: any[]) {
2 | console.log(...args)
3 | }
--------------------------------------------------------------------------------
/web/src/assets/img/icon-128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/minusxai/minusx/HEAD/web/src/assets/img/icon-128.png
--------------------------------------------------------------------------------
/web/src/assets/img/icon-34.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/minusxai/minusx/HEAD/web/src/assets/img/icon-34.png
--------------------------------------------------------------------------------
/extension/src/assets/img/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/minusxai/minusx/HEAD/extension/src/assets/img/logo.png
--------------------------------------------------------------------------------
/apps/src/declarations.d.ts:
--------------------------------------------------------------------------------
1 | declare module "*?raw"
2 | {
3 | const content: string;
4 | export default content;
5 | }
--------------------------------------------------------------------------------
/extension/src/assets/img/icon-34.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/minusxai/minusx/HEAD/extension/src/assets/img/icon-34.png
--------------------------------------------------------------------------------
/web/src/declarations.d.ts:
--------------------------------------------------------------------------------
1 | declare module "*?raw"
2 | {
3 | const content: string;
4 | export default content;
5 | }
--------------------------------------------------------------------------------
/extension/src/assets/img/icon-128.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/minusxai/minusx/HEAD/extension/src/assets/img/icon-128.png
--------------------------------------------------------------------------------
/web/public/screenshots/addons-menu.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/minusxai/minusx/HEAD/web/public/screenshots/addons-menu.png
--------------------------------------------------------------------------------
/web/src/globals.d.ts:
--------------------------------------------------------------------------------
1 | // allow .png imports
2 | declare module '*.png' {
3 | const value: any;
4 | export = value;
5 | }
6 |
--------------------------------------------------------------------------------
/extension/src/globals.d.ts:
--------------------------------------------------------------------------------
1 | // allow .png imports
2 | declare module '*.png' {
3 | const value: any;
4 | export = value;
5 | }
6 |
--------------------------------------------------------------------------------
/web/public/screenshots/addons-install.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/minusxai/minusx/HEAD/web/public/screenshots/addons-install.png
--------------------------------------------------------------------------------
/web/public/screenshots/addons-search.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/minusxai/minusx/HEAD/web/public/screenshots/addons-search.png
--------------------------------------------------------------------------------
/simulator/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | /test-results/
3 | /playwright-report/
4 | /blob-report/
5 | /playwright/.cache/
6 | .playwright/*
--------------------------------------------------------------------------------
/web/public/screenshots/addons-activate.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/minusxai/minusx/HEAD/web/public/screenshots/addons-activate.png
--------------------------------------------------------------------------------
/extension/src/content/apps.ts:
--------------------------------------------------------------------------------
1 | import { getAppSetupConfigs } from "apps/extension";
2 |
3 | export const appSetupConfigs = getAppSetupConfigs();
--------------------------------------------------------------------------------
/web/public/screenshots/addons-unavailable.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/minusxai/minusx/HEAD/web/public/screenshots/addons-unavailable.png
--------------------------------------------------------------------------------
/web/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "typescript.enablePromptUseWorkspaceTsdk": true,
3 | "typescript.tsdk": "node_modules/typescript/lib"
4 | }
--------------------------------------------------------------------------------
/extension/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "typescript.enablePromptUseWorkspaceTsdk": true,
3 | "typescript.tsdk": "node_modules/typescript/lib"
4 | }
--------------------------------------------------------------------------------
/web/public/popup.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Hello world
6 |
7 |
--------------------------------------------------------------------------------
/web/src/components/common/ChatContent.css:
--------------------------------------------------------------------------------
1 | .markdown > * {
2 | all: revert;
3 | }
4 |
5 | .markdown {
6 | width: 100%;
7 | overflow: auto;
8 | }
--------------------------------------------------------------------------------
/web/jest.env.js:
--------------------------------------------------------------------------------
1 | // global.setImmediate = jest.useRealTimers;
2 | global.setImmediate = global.setImmediate || ((fn, ...args) => global.setTimeout(fn, 0, ...args));
--------------------------------------------------------------------------------
/web/licenses/FOSS.md:
--------------------------------------------------------------------------------
1 | Credit to the following FOSS tools which were used when building MinusX
2 |
3 | TaxyAI Browser Extension: https://github.com/TaxyAI/browser-extension
--------------------------------------------------------------------------------
/extension/licenses/FOSS.md:
--------------------------------------------------------------------------------
1 | Credit to the following FOSS tools which were used when building MinusX
2 |
3 | TaxyAI Browser Extension: https://github.com/TaxyAI/browser-extension
--------------------------------------------------------------------------------
/web/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "semi": false,
3 | "singleQuote": true,
4 | "tabWidth": 2,
5 | "trailingComma": "es5",
6 | "requirePragma": false,
7 | "arrowParens": "always"
8 | }
--------------------------------------------------------------------------------
/extension/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "semi": false,
3 | "singleQuote": true,
4 | "tabWidth": 2,
5 | "trailingComma": "es5",
6 | "requirePragma": false,
7 | "arrowParens": "always"
8 | }
--------------------------------------------------------------------------------
/extension/utils/env.js:
--------------------------------------------------------------------------------
1 | // tiny wrapper with default env vars
2 | module.exports = {
3 | NODE_ENV: process.env.NODE_ENV || 'development',
4 | PORT: process.env.PORT || 3001,
5 | };
6 |
--------------------------------------------------------------------------------
/apps/jest.config.js:
--------------------------------------------------------------------------------
1 | /** @type {import('ts-jest').JestConfigWithTsJest} **/
2 | export default {
3 | testEnvironment: "node",
4 | transform: {
5 | "^.+.tsx?$": ["ts-jest",{}],
6 | },
7 | };
--------------------------------------------------------------------------------
/extension/src/content/RPCs/copyToClipboard.ts:
--------------------------------------------------------------------------------
1 | // copy provided text to clipboard
2 | export async function copyToClipboard(text: string) {
3 | await navigator.clipboard.writeText(text);
4 | }
5 |
--------------------------------------------------------------------------------
/extension/src/helpers/utils.ts:
--------------------------------------------------------------------------------
1 | export async function sleep(ms: number = 0) {
2 | return new Promise((resolve) => setTimeout(resolve, ms));
3 | }
4 |
5 | export type Subset = K;
--------------------------------------------------------------------------------
/web/src/helpers/extensionId.ts:
--------------------------------------------------------------------------------
1 | import { getParsedIframeInfo } from './origin';
2 |
3 | export const getExtensionID = () => {
4 | const parsed = getParsedIframeInfo()
5 | return parsed.r
6 | }
--------------------------------------------------------------------------------
/web/src/helpers/platformCustomization.ts:
--------------------------------------------------------------------------------
1 | export function getPlatformShortcut() {
2 | const isMac = navigator.platform.toUpperCase().indexOf('MAC') >= 0;
3 | return isMac ? '⌘ + k' : 'Ctrl + k';
4 | }
5 |
--------------------------------------------------------------------------------
/web/setupJest.js:
--------------------------------------------------------------------------------
1 | import 'whatwg-fetch';
2 | import dotenv from 'dotenv';
3 | import path from 'path';
4 |
5 | const envPath = path.resolve(__dirname, '.env.development');
6 | dotenv.config({ path: envPath });
7 |
--------------------------------------------------------------------------------
/simulator/docker/jupyter.Dockerfile:
--------------------------------------------------------------------------------
1 | FROM jupyter/base-notebook
2 | RUN mkdir -p /home/jovyan/data
3 | RUN pip install --upgrade pip
4 | RUN pip install pandas numpy plotly
5 | COPY ./data /home/jovyan/data
6 | EXPOSE 8888
--------------------------------------------------------------------------------
/simulator/src/mods/types.ts:
--------------------------------------------------------------------------------
1 | import { Frame, Page } from "playwright/test";
2 |
3 | interface TestModArg {
4 | frame: Frame;
5 | page: Page
6 | }
7 |
8 | export type TestMod = (modArg: TestModArg) => Promise
9 |
--------------------------------------------------------------------------------
/extension/src/content/debug.ts:
--------------------------------------------------------------------------------
1 | import userEvent, { PointerEventsCheckLevel } from '@testing-library/user-event';
2 | import { fireEvent } from '@testing-library/dom';
3 | window.userEvent = userEvent
4 | window.fireEvent = fireEvent
5 |
--------------------------------------------------------------------------------
/web/docker-compose.yaml:
--------------------------------------------------------------------------------
1 | version: '3.8'
2 |
3 | services:
4 | web-server:
5 | build:
6 | context: ..
7 | dockerfile: ./web/Dockerfile
8 | restart: unless-stopped
9 | ports:
10 | - "3005:3005"
11 |
--------------------------------------------------------------------------------
/extension/src/package.ts:
--------------------------------------------------------------------------------
1 | export { resolveSelector } from './helpers/pageParse/resolveSelectors'
2 | export { initWindowListener } from './content/RPCs/initListeners'
3 | export { sendIFrameMessage } from './content/RPCs/sendIFrameMessage'
4 |
--------------------------------------------------------------------------------
/apps/src/google/appSetup.ts:
--------------------------------------------------------------------------------
1 | import { AppSetup } from "../base/appSetup";
2 | import { googleDocFingerprintMatcher } from "./fingerprint"
3 |
4 | export class GoogleSetup extends AppSetup {
5 | fingerprintMatcher = googleDocFingerprintMatcher;
6 | }
--------------------------------------------------------------------------------
/web/src/app/api/billing.ts:
--------------------------------------------------------------------------------
1 | import { configs } from '../../constants'
2 | import axios, { AxiosError } from 'axios';
3 |
4 | export const getBillingInfo = async () => {
5 | const response = await axios.get(`${configs.SERVER_BASE_URL}/billing/info`)
6 | return response.data
7 | }
--------------------------------------------------------------------------------
/simulator/docker-compose.yaml:
--------------------------------------------------------------------------------
1 | version: '3'
2 |
3 | services:
4 | jupyter:
5 | build:
6 | context: ./src
7 | dockerfile: ../docker/jupyter.Dockerfile
8 | ports:
9 | - "8888:8888"
10 | environment:
11 | JUPYTER_TOKEN: "jupyter_test_token"
12 |
--------------------------------------------------------------------------------
/apps/src/base/appSetup.ts:
--------------------------------------------------------------------------------
1 | import { ToolMatcher } from 'extension/types'
2 |
3 | // runs in content script context
4 | export abstract class AppSetup {
5 | abstract fingerprintMatcher: ToolMatcher;
6 |
7 | // 1. Handles setup
8 | async setup(extensionConfigs: Promise