diff --git a/.github/workflows/agent_gui_build.yml b/.github/workflows/agent_gui_build.yml index d1361a13f..a055644ed 100644 --- a/.github/workflows/agent_gui_build.yml +++ b/.github/workflows/agent_gui_build.yml @@ -4,12 +4,12 @@ on: push: branches: [main, dev] paths: - - 'refact-agent/gui/**' - - '.github/workflows/agent_gui_*' + - "refact-agent/gui/**" + - ".github/workflows/agent_gui_*" pull_request: paths: - - 'refact-agent/gui/**' - - '.github/workflows/agent_gui_*' + - "refact-agent/gui/**" + - ".github/workflows/agent_gui_*" workflow_dispatch: defaults: @@ -31,16 +31,16 @@ jobs: uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - cache: 'npm' + cache: "npm" cache-dependency-path: refact-agent/gui/package-lock.json - # Disable Husky install during npm ci + # Disable Husky install during npm install --prefer-offline - name: Install dependencies run: | sudo apt update sudo apt install -y libcairo2-dev libjpeg-dev libpango1.0-dev libgif-dev librsvg2-dev npm pkg delete scripts.prepare - npm ci + npm install --prefer-offline - run: npm run test - run: npm run format:check diff --git a/docs/.astro/types.d.ts b/docs/.astro/types.d.ts index f4a7f4ee5..6db6e4f04 100644 --- a/docs/.astro/types.d.ts +++ b/docs/.astro/types.d.ts @@ -409,13 +409,6 @@ declare module 'astro:content' { collection: "docs"; data: InferEntrySchema<"docs"> } & { render(): Render[".md"] }; -"guides/usage-based-pricing.md": { - id: "guides/usage-based-pricing.md"; - slug: "guides/usage-based-pricing"; - body: string; - collection: "docs"; - data: InferEntrySchema<"docs"> -} & { render(): Render[".md"] }; "guides/version-specific/enterprise/getting-started.md": { id: "guides/version-specific/enterprise/getting-started.md"; slug: "guides/version-specific/enterprise/getting-started"; @@ -500,6 +493,13 @@ declare module 'astro:content' { collection: "docs"; data: InferEntrySchema<"docs"> } & { render(): Render[".md"] }; +"introduction/usage-based-pricing.md": { + id: "introduction/usage-based-pricing.md"; + slug: "introduction/usage-based-pricing"; + body: string; + collection: "docs"; + data: InferEntrySchema<"docs"> +} & { render(): Render[".md"] }; "privacy.md": { id: "privacy.md"; slug: "privacy"; diff --git a/docs/astro.config.mjs b/docs/astro.config.mjs index 9597d5aff..4016c39fc 100644 --- a/docs/astro.config.mjs +++ b/docs/astro.config.mjs @@ -351,10 +351,10 @@ export default defineConfig({ } }, { - label: 'BYOK', + label: 'Configure Providers (BYOK)', link: '/byok/', attrs: { - 'aria-label': 'Learn about Bring Your Own Key (BYOK)' + 'aria-label': 'Configure Providers (BYOK) documentation' } }, { diff --git a/docs/src/assets/byok.png b/docs/src/assets/byok.png deleted file mode 100644 index cdc35950e..000000000 Binary files a/docs/src/assets/byok.png and /dev/null differ diff --git a/docs/src/assets/byok_login_start.png b/docs/src/assets/byok_login_start.png deleted file mode 100644 index 6212a08f8..000000000 Binary files a/docs/src/assets/byok_login_start.png and /dev/null differ diff --git a/docs/src/assets/configure_providers/chat_model_configuration_dialog.png b/docs/src/assets/configure_providers/chat_model_configuration_dialog.png new file mode 100644 index 000000000..feabf84de Binary files /dev/null and b/docs/src/assets/configure_providers/chat_model_configuration_dialog.png differ diff --git a/docs/src/assets/byok_2.png b/docs/src/assets/configure_providers/choose_provider.png similarity index 100% rename from docs/src/assets/byok_2.png rename to docs/src/assets/configure_providers/choose_provider.png diff --git a/docs/src/assets/configure_providers/completion_model_configuration_dialog.png b/docs/src/assets/configure_providers/completion_model_configuration_dialog.png new file mode 100644 index 000000000..a30d7b8a0 Binary files /dev/null and b/docs/src/assets/configure_providers/completion_model_configuration_dialog.png differ diff --git a/docs/src/assets/byok_1.png b/docs/src/assets/configure_providers/configure_providers_menu.png similarity index 100% rename from docs/src/assets/byok_1.png rename to docs/src/assets/configure_providers/configure_providers_menu.png diff --git a/docs/src/assets/configure_providers/provider_configuration.png b/docs/src/assets/configure_providers/provider_configuration.png new file mode 100644 index 000000000..04abe638f Binary files /dev/null and b/docs/src/assets/configure_providers/provider_configuration.png differ diff --git a/docs/src/content/docs/byok.md b/docs/src/content/docs/byok.md index 7ccb15f5f..c1244a1c7 100644 --- a/docs/src/content/docs/byok.md +++ b/docs/src/content/docs/byok.md @@ -1,22 +1,115 @@ --- -title: "Bring Your Own Key (BYOK)" +title: "Configure Providers (BYOK)" +description: "How to use Bring Your Own Key (BYOK) to connect your own API keys and models in Refact." --- -## Introduction +# Introduction -Bring Your Own Key (BYOK) allows users to specify their API keys and select models for chat, completion, and embedding tasks across different AI platforms. This feature enables seamless integration with various services while maintaining control over API keys. +The **Configure Providers** feature (also known as BYOK – Bring Your Own Key) allows you to connect your own API keys for supported AI providers, giving you full control over which models you use and how you are billed. -## How to Switch Providers in the Plugin +--- + +## What is "Configure Providers" (BYOK)? + +- **Bring Your Own Key (BYOK)** lets you use your own API keys for services like OpenAI, Anthropic, DeepSeek, and others, instead of (or in addition to) Refact’s built-in cloud models. +- This is ideal if you have your own API access, want to use specific models, or need to keep billing and data usage under your own account. + +--- + +## Supported Providers + +You can connect API keys for: +- **OpenAI** (e.g., GPT-3.5, GPT-4, GPT-4o, etc.) +- **Anthropic** (e.g., Claude models) +- **DeepSeek** (e.g., deepseek-chat, deepseek-reasoner) +- **Local models** (if supported by your Refact instance) +- Other providers as they become available + +--- + +## How to Configure Providers (Step-by-Step) + +### 1. Open the Providers Menu + +- In the Refact plugin, click the menu button (three horizontal lines or "burger" icon) in the top right corner. +- Select **Configure Providers** from the dropdown menu. + + ![Configure Providers Menu](../../assets/configure_providers/configure_providers_menu.png) + +--- + +### 2. Add a New Provider + +- In the **Configure Providers** window, click **Add Provider** or the "+" button. +- Choose your provider from the list (e.g., OpenAI, Anthropic, DeepSeek). + + ![Choose Provider](../../assets/configure_providers/choose_provider.png) + +--- + +### 3. Enter Your API Key and Configure Provider Settings + +- Paste your API key into the field provided. +- (Optional) Give the provider a custom name for easy identification. +- Enable or disable the provider as needed. +- Click **Save**. + + ![Provider Configuration](../../assets/configure_providers/provider_configuration.png) -By default, your provider is Refact.ai Cloud. If you want to switch from it, follow these steps: +--- + +### 4. Configure Models for Each Provider + +- For each provider, you can add and configure models for the tasks that provider supports (such as **Chat**, **Completion**, or **Embeddings**). +- The available model types and settings will depend on the provider you select. +- Click **Add model** to open the model configuration dialog. + + ![Chat Model Configuration Dialog](../../assets/configure_providers/chat_model_configuration_dialog.png) + + ![Completion Model Configuration Dialog](../../assets/configure_providers/completion_model_configuration_dialog.png) + +#### Model Configuration Fields +- **Name**: The model’s name/ID (e.g., `gpt-4o`, `deepseek-chat`). +- **Context Window (n_ctx)**: Maximum context length (tokens) the model can handle. +- **Tokenizer**: The tokenizer to use (e.g., `hf://` for HuggingFace models). +- **Default Temperature**: Controls randomness/creativity of model outputs. +- **Reasoning Style**: (Dropdown) Choose a reasoning style, if supported. +- **Capabilities**: Select which features the model supports (Tools, Multimodality, Clicks, Agent, etc.). + +--- + +### 5. Switch Between Providers and Models + +- You can add multiple providers and models, and switch between them at any time. +- The currently active provider/model will be used for new requests. + +--- -1. Navigate to the "Burger" button in the right upper corner of the plugin interface and click it. -2. Go to the "Configure providers" tab and click it.
- Configure providers tab -3. Choose the provider you want to add from the list.
- Choose provider -4. You can enable or disable providers and delete them if needed. +## Billing and Usage -## Additional Resources +- **When using BYOK, your requests are billed directly by the provider (e.g., OpenAI, Anthropic, DeepSeek).** +- **Refact coins are NOT consumed** for BYOK requests. +- You are responsible for monitoring your API usage and costs with your provider. + +--- + +## Best Practices & Troubleshooting + +- **Keep your API keys secure.** Never share them publicly. +- If a provider or model is not working, double-check your API key, model name, and account status. +- Some providers may have usage limits or require specific permissions. +- For help, visit our [Discord Community](https://smallcloud.ai/discord) or check the FAQ. + +--- + +## FAQ + +**Q: Can I use multiple providers at once?** +A: Yes! You can add and switch between multiple providers as needed. + +**Q: What happens if my API key runs out of credit?** +A: Requests will fail until you add more credit or switch to another provider. + +--- -For more examples and configurations, please visit the [Refact GitHub repository](https://github.com/smallcloudai/refact-lsp/tree/main/bring_your_own_key). +For more help, see our [FAQ](/faq/) or contact support. diff --git a/docs/src/content/docs/introduction/usage-based-pricing.md b/docs/src/content/docs/introduction/usage-based-pricing.md index 723b5692b..78c2c0e23 100644 --- a/docs/src/content/docs/introduction/usage-based-pricing.md +++ b/docs/src/content/docs/introduction/usage-based-pricing.md @@ -120,10 +120,11 @@ showDollarsBtn.onclick = () => setTable('dollars'); | Self-hosting option available | | | Discord support | | -## Bring Your Own Key (BYOK) +## Configure Providers (BYOK) -If you prefer to use your own API key (for OpenAI, Anthropic, or local models), you can connect it to Refact.ai. When using BYOK, requests are billed by your provider and do not consume Refact.ai coins. +Refact.ai allows you to connect your own API keys for OpenAI, Anthropic, DeepSeek, and other providers using the **Configure Providers** feature (also known as BYOK – Bring Your Own Key). This gives you full control over which models you use and how you are billed. **No commission:** For now, Refact.ai does not take any commission or markup on API usage. You pay only for the actual API cost of the model you use. -For more information on how to use Bring Your Own Key (BYOK), see the [BYOK documentation](https://github.com/smallcloudai/refact/blob/main/docs/byok.md) in the repository. +For a step-by-step guide on setting up and using this feature, see the [Configure Providers (BYOK) documentation](/byok/). + diff --git a/refact-agent/gui/AGENTS.md b/refact-agent/gui/AGENTS.md new file mode 100644 index 000000000..5ce3a62a5 --- /dev/null +++ b/refact-agent/gui/AGENTS.md @@ -0,0 +1,3775 @@ +# Refact Agent GUI - Developer Guide + +**Last Updated**: December 2024 +**Version**: 2.0.10-alpha.3 +**Repository**: https://github.com/smallcloudai/refact/tree/main/refact-agent/gui + +--- + +## πŸ“‹ Table of Contents + +1. [Project Overview](#project-overview) +2. [Architecture](#architecture) +3. [Tech Stack](#tech-stack) +4. [Getting Started](#getting-started) +5. [Message Flow & Streaming](#message-flow--streaming) +6. [State Management](#state-management) +7. [UI & Styling](#ui--styling) +8. [API Services](#api-services) +9. [IDE Integration](#ide-integration) +10. [Tool Calling System](#tool-calling-system) +11. [Development Workflows](#development-workflows) +12. [Testing](#testing) +13. [Debugging](#debugging) +14. [Special Features](#special-features) +15. [Common Patterns](#common-patterns) + +--- + +## Project Overview + +### What is This? + +Refact Chat GUI is a **React-based AI coding assistant** that provides: + +- **Real-time streaming chat** with AI models +- **Tool calling** for file operations, shell commands, and IDE integration +- **Multi-host support**: Web, VSCode, JetBrains IDEs +- **Checkpoints system** for workspace rollback +- **Docker container management** +- **Integration configuration** UI + +### Key Characteristics + +- **Library-first**: Builds to `dist/chat/` (browser UMD) and `dist/events/` (Node.js types) +- **Dual consumption**: Used by IDE extensions AND standalone web UI +- **LSP-centric**: All AI operations go through local LSP server (http://127.0.0.1:8001) +- **Production-ready**: Redux persist, error boundaries, telemetry, compression hints + +### Build Outputs + +``` +dist/chat/index.umd.cjs # Browser bundle (consumed by IDEs) +dist/chat/index.js # ES module +dist/chat/style.css # Bundled styles +dist/events/index.js # TypeScript types for IDE integrations +``` + +**Usage in browser:** + +```html + + +``` + +--- + +## Architecture + +### High-Level Structure + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ React Application β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ Features β”‚ β”‚ Components β”‚ β”‚ Hooks β”‚ β”‚ +β”‚ β”‚ (Redux) β”‚ β”‚ (UI Layer) β”‚ β”‚ (Logic) β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ β”‚ β”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β”‚ β”‚ β”‚ +β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ +β”‚ β”‚ Services β”‚ β”‚ +β”‚ β”‚ RTK Query APIsβ”‚ β”‚ +β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” + β”‚ β”‚ β”‚ + β”Œβ”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β” + β”‚ Local LSP β”‚ β”‚ SmallCloudβ”‚ β”‚ IDE (via β”‚ + β”‚ Server β”‚ β”‚ Auth API β”‚ β”‚ postMessage)β”‚ + β”‚ :8001 β”‚ β”‚ β”‚ β”‚ β”‚ + β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +### Directory Structure + +``` +gui/ +β”œβ”€β”€ src/ +β”‚ β”œβ”€β”€ features/ # Redux slices + feature components +β”‚ β”‚ β”œβ”€β”€ Chat/ # Core chat logic (Thread/, actions, selectors) +β”‚ β”‚ β”œβ”€β”€ History/ # Chat history management +β”‚ β”‚ β”œβ”€β”€ Checkpoints/ # Workspace rollback system +β”‚ β”‚ β”œβ”€β”€ Config/ # Global configuration +β”‚ β”‚ β”œβ”€β”€ Integrations/ # Integration management UI +β”‚ β”‚ β”œβ”€β”€ Providers/ # LLM provider configuration +β”‚ β”‚ └── ... +β”‚ β”œβ”€β”€ components/ # Reusable UI components +β”‚ β”‚ β”œβ”€β”€ Chat/ # Chat container +β”‚ β”‚ β”œβ”€β”€ ChatContent/ # Message rendering +β”‚ β”‚ β”œβ”€β”€ ChatForm/ # Input form + controls +β”‚ β”‚ β”œβ”€β”€ Sidebar/ # Navigation +β”‚ β”‚ └── ... +β”‚ β”œβ”€β”€ hooks/ # Custom React hooks (60+) +β”‚ β”œβ”€β”€ services/ # API definitions +β”‚ β”‚ β”œβ”€β”€ refact/ # LSP server APIs (RTK Query) +β”‚ β”‚ └── smallcloud/ # Cloud auth APIs +β”‚ β”œβ”€β”€ app/ # Redux store setup +β”‚ β”œβ”€β”€ events/ # IDE integration types +β”‚ β”œβ”€β”€ lib/ # Library entry point +β”‚ β”‚ └── render/ # Render function + CSS +β”‚ └── utils/ # Utility functions +β”œβ”€β”€ generated/ # GraphQL codegen output +β”œβ”€β”€ public/ # Static assets +└── dist/ # Build output (git-ignored) +``` + +### Data Flow Patterns + +**1. User Action β†’ State Update β†’ UI Re-render** + +``` +User clicks "Send" + β†’ dispatch(chatAskQuestionThunk) + β†’ sendChat() API call + β†’ streaming chunks arrive + β†’ dispatch(chatResponse) per chunk + β†’ reducer updates state.chat.thread.messages + β†’ React re-renders ChatContent +``` + +**2. IDE Integration (postMessage)** + +``` +IDE Extension ⇄ window.postMessage ⇄ GUI (iframe) + β”‚ β”‚ + β”œβ”€ Context updates (active file) ────→│ + β”‚ β”‚ + │←──── Commands (open file, paste) ──── +``` + +**3. Tool Calling Flow** + +``` +AI suggests tool_call + β†’ Confirmation popup (if not automatic) + β†’ User approves + β†’ Tool executed (LSP or IDE) + β†’ Result message inserted + β†’ AI continues with result +``` + +--- + +## Tech Stack + +### Core Technologies + +| Layer | Technology | Purpose | +| -------------------- | ---------------------------------- | ----------------------------- | +| **UI Framework** | React 18.2 | Component-based UI | +| **Language** | TypeScript 5.8 (strict mode) | Type safety | +| **Build Tool** | Vite 5.0 + SWC | Fast dev server & bundling | +| **State Management** | Redux Toolkit 2.2 | Global state + caching | +| **Data Fetching** | RTK Query | API layer with auto-caching | +| **GraphQL** | urql 4.2 (SmallCloud only) | Auth/user/teams queries | +| **Styling** | CSS Modules + Radix Themes | Scoped styles + design system | +| **UI Components** | Radix UI | Accessible primitives | +| **Testing** | Vitest 3.1 + React Testing Library | Unit & integration tests | +| **Mocking** | MSW 2.3 | API mocking for tests/stories | +| **Storybook** | Storybook 7.6 | Component development | + +### Key Dependencies + +**State & Data** + +- `@reduxjs/toolkit` - Modern Redux with `combineSlices`, RTK Query, middleware +- `redux-persist` - Persist chat history to localStorage +- `urql` - GraphQL client (SmallCloud API only, not for chat) +- `uuid` - Generate chat/message IDs + +**UI Components** + +- `@radix-ui/react-*` - Accordion, Toolbar, Collapsible, Icons +- `@radix-ui/themes` - Design system (colors, spacing, typography) +- `framer-motion` - Animations +- `lottie-react` - Animated icons + +**Utilities** + +- `react-markdown` + `remark-gfm` + `rehype-katex` - Markdown rendering +- `react-syntax-highlighter` - Code highlighting +- `diff` - Generate diffs for file changes +- `echarts-for-react` - Usage statistics charts +- `react-dropzone` - File upload +- `textarea-caret` - Cursor position (autocomplete) + +### Build Configuration + +**Vite Config** (`vite.config.ts`) + +```typescript +{ + plugins: [react(), eslint(), dts()], + build: { + lib: { + entry: 'src/lib/index.ts', // Browser bundle + name: 'RefactChat', + fileName: 'index' + }, + outDir: 'dist/chat' + }, + server: { + proxy: { + '/v1': process.env.REFACT_LSP_URL ?? 'http://127.0.0.1:8001' + } + } +} +``` + +**Dual Build**: Separate config for Node.js types (`vite.node.config.ts` β†’ `dist/events/`) + +**TypeScript Config** + +```typescript +{ + compilerOptions: { + target: 'ES2020', + module: 'ESNext', + moduleResolution: 'bundler', + strict: true, // Full strict mode + jsx: 'react-jsx', + plugins: [ + { name: 'typescript-plugin-css-modules' }, // CSS typing + { name: '@0no-co/graphqlsp' } // GraphQL intellisense + ] + } +} +``` + +**ESLint**: `@typescript-eslint/strict-type-checked` (aggressive type checking) + +--- + +## Getting Started + +### Prerequisites + +1. **Node.js 18+** (uses ES2020 features) +2. **Refact LSP Server** running on `http://127.0.0.1:8001` + - Required for chat, tools, caps endpoints + - Get it: https://github.com/smallcloudai/refact-lsp + +### Initial Setup + +```bash +# Install dependencies +npm ci + +# Start dev server +npm run dev +# β†’ http://localhost:5173 + +# With custom LSP URL +REFACT_LSP_URL="http://localhost:8001" npm run dev +``` + +### Environment Variables + +| Variable | Purpose | Default | +| ----------------- | -------------------- | ----------------------- | +| `REFACT_LSP_URL` | Dev proxy target | `http://127.0.0.1:8001` | +| `DEBUG` | Enable debug logging | (unset) | +| `REFACT_LSP_PORT` | Runtime LSP port | `8001` | + +**Debug mode:** + +```bash +DEBUG=refact,app,integrations npm run dev +``` + +### Available Scripts + +```json +{ + "dev": "vite", // Dev server (5173) + "build": "tsc && vite build && vite build -c vite.node.config.ts", + "preview": "vite preview", // Preview production build + "test": "vitest", // Run tests (watch mode) + "test:no-watch": "vitest run", // CI tests + "test:ui": "vitest --ui", // Visual test runner + "coverage": "vitest run --coverage", // Coverage report + "storybook": "storybook dev -p 6006", // Component explorer + "build-storybook": "storybook build", // Static storybook + "lint": "eslint . --ext ts,tsx", // Type-aware linting + "types": "tsc --noEmit", // Type checking only + "format": "prettier . --write", // Auto-format + "generate:graphql": "graphql-codegen", // Generate GraphQL types + "alpha:publish": "npm publish --tag alpha" +} +``` + +### First Time Setup Checklist + +- [ ] `npm ci` completes successfully +- [ ] LSP server is running (check `http://127.0.0.1:8001/v1/ping`) +- [ ] Dev server starts: `npm run dev` +- [ ] Navigate to `http://localhost:5173` +- [ ] Chat interface loads without errors +- [ ] Can send a test message (requires API key or local model) +- [ ] Storybook works: `npm run storybook` +- [ ] Tests pass: `npm run test:no-watch` + +### Project Configuration Files + +``` +gui/ +β”œβ”€β”€ package.json # Dependencies & scripts +β”œβ”€β”€ tsconfig.json # TypeScript compiler options +β”œβ”€β”€ tsconfig.node.json # Node-specific TS config +β”œβ”€β”€ vite.config.ts # Main Vite config (browser) +β”œβ”€β”€ vite.node.config.ts # Node types build +β”œβ”€β”€ .eslintrc.cjs # ESLint rules +β”œβ”€β”€ .prettierrc # (if exists) Code formatting +β”œβ”€β”€ codegen.ts # GraphQL code generation +β”œβ”€β”€ .storybook/ # Storybook configuration +β”‚ β”œβ”€β”€ main.ts +β”‚ └── preview.tsx +└── .husky/ # Git hooks + └── pre-commit # Runs lint-staged +``` + +**Lint-staged** (pre-commit): + +```json +{ + "*.{ts,tsx}": ["prettier --write", "eslint --cache --fix"], + "*.{js,css,md}": "prettier --write" +} +``` + +--- + +## Message Flow & Streaming + +### Overview + +The chat system uses **Server-Sent Events (SSE)** over HTTP fetch streams for real-time AI responses. + +### Complete Flow Timeline + +``` +1. User types message & clicks Send + ↓ +2. dispatch(chatAskQuestionThunk({messages, chatId, mode})) + β†’ src/features/Chat/Thread/actions.ts:335 + ↓ +3. formatMessagesForLsp(messages) + β†’ Converts internal format to LSP format + β†’ Filters out UI-only fields + ↓ +4. sendChat({messages, model, stream: true, abortSignal, ...}) + β†’ src/services/refact/chat.ts:146 + β†’ POST http://127.0.0.1:8001/v1/chat + β†’ Body: {messages, model, stream: true, meta: {chat_id, chat_mode}} + ↓ +5. response.body.getReader() β†’ ReadableStream + ↓ +6. consumeStream(reader, signal, onAbort, onChunk) + β†’ src/features/Chat/Thread/utils.ts:886 + β†’ Decodes SSE format: "data: {json}\n\n" + ↓ +7. For each chunk: onChunk(json) + β†’ dispatch(chatResponse({...json, id: chatId})) + ↓ +8. Reducer: case chatResponse (reducer.ts:207) + β†’ formatChatResponse(state.thread.messages, payload) + β†’ Updates messages array immutably + β†’ Sets streaming: true, waiting_for_response: false + ↓ +9. ChatContent component re-renders with updated messages + β†’ Renders incrementally as content streams + ↓ +10. Stream ends: "data: [DONE]" or error + β†’ dispatch(doneStreaming({id: chatId})) + β†’ postProcessMessagesAfterStreaming() + β†’ streaming: false, read: true +``` + +### SSE Stream Format + +**Protocol**: Server-Sent Events via ReadableStream + +``` +data: {"choices":[{"delta":{"role":"assistant","content":"Hello"},"finish_reason":null}]}\n\n +data: {"choices":[{"delta":{"content":" world"},"finish_reason":null}]}\n\n +data: {"choices":[{"delta":{},"finish_reason":"stop"}],"usage":{"total_tokens":50}}\n\n +data: [DONE]\n\n +``` + +**Special markers:** + +- `data: [DONE]` - Stream complete +- `data: [ERROR]` - Generic error +- `data: {"detail":"..."}` - Structured error (LiteLLM format) +- `data: {"error":{"message":"..."}}` - LiteLLM streaming error + +### The `consumeStream` Function + +**Location**: `src/features/Chat/Thread/utils.ts:886` + +**Key features:** + +1. **Malformed chunk handling** - If buffer doesn't end with `\n\n`, combines with next chunk +2. **Error detection** - Checks for `{"detail":...}` at byte level before parsing +3. **Robust parsing** - Falls back to buffer combination on JSON parse errors +4. **Abort handling** - Respects AbortSignal for user cancellation + +```typescript +export function consumeStream( + reader: ReadableStreamDefaultReader, + signal: AbortSignal, + onAbort: () => void, + onChunk: (chunk: Record) => void, +) { + const decoder = new TextDecoder(); + + function pump({ + done, + value, + }: ReadableStreamReadResult): Promise { + if (done) return Promise.resolve(); + if (signal.aborted) { + onAbort(); + return Promise.resolve(); + } + + // Decode bytes to string + const streamAsString = decoder.decode(value); + + // Split by SSE delimiter + const deltas = streamAsString.split("\n\n").filter((str) => str.length > 0); + + for (const delta of deltas) { + if (!delta.startsWith("data: ")) continue; + + const maybeJsonString = delta.substring(6); // Remove "data: " + + if (maybeJsonString === "[DONE]") return Promise.resolve(); + if (maybeJsonString === "[ERROR]") + return Promise.reject(new Error("error from lsp")); + + // Parse JSON + const json = parseOrElse>(maybeJsonString, {}); + onChunk(json); + } + + return reader.read().then(pump); // Recursive read + } + + return reader.read().then(pump); +} +``` + +### The `formatChatResponse` Function + +**Location**: `src/features/Chat/Thread/utils.ts:331-650` (320 lines!) + +**Purpose**: Merge streaming delta into existing messages array + +**Response Types Handled:** + +| Type | Detection | Action | +| ---------------------- | ---------------------- | -------------------------------------------- | +| `UserResponse` | `role: "user"` | Replace last user message (compression hint) | +| `ContextFileResponse` | `role: "context_file"` | Append context files | +| `SubchatResponse` | Has `subchat_id` | Update tool call with subchat ID | +| `ToolResponse` | `role: "tool"` | Append tool result message | +| `DiffResponse` | `role: "diff"` | Append diff chunks | +| `PlainTextResponse` | `role: "plain_text"` | Append plain text message | +| `SystemResponse` | `role: "system"` | **Prepend** to messages (goes first) | +| **ChatResponseChoice** | Has `choices[]` | **Merge delta into assistant message** ⭐ | + +**Delta Types (in `choices[0].delta`):** + +```typescript +delta: { + role?: "assistant", + content?: string, // Main response text + reasoning_content?: string, // Separate reasoning field + tool_calls?: ToolCall[], // Function calls + thinking_blocks?: ThinkingBlock[], // COT blocks + provider_specific_fields?: { + citation?: WebSearchCitation // Web search results + } +} +``` + +**Merging Logic:** + +1. **Content delta** - Concatenate strings: `prevContent + delta.content` +2. **Tool calls delta** - `mergeToolCalls(prev, add)`: + - If new tool (has `function.name`), append + - If continuation (only `arguments`), concat to last tool's arguments + - Handle missing IDs (generate UUID) + - Handle broken indexes (Qwen3/sglang quirks) +3. **Thinking blocks** - `mergeThinkingBlocks(prev, add)`: + - Always merge into first block + - Concat `thinking` and `signature` strings +4. **Citations** - Append to array (web search links) +5. **Usage/Metering** - Take highest values (later chunks have final counts) + +**Post-processing** (`postProcessMessagesAfterStreaming`): + +- Deduplicate tool calls +- Filter out server-executed tools (`srvtoolu_*` prefix) +- Clean up incomplete tool calls + +### State Transitions + +```typescript +// Initial state +{ + streaming: false, + waiting_for_response: false, + prevent_send: false, + thread: { messages: [] } +} + +// After submit +dispatch(chatAskedQuestion) β†’ +{ + waiting_for_response: true, // Blocks duplicate sends + prevent_send: false +} + +// First chunk arrives +dispatch(chatResponse) β†’ +{ + streaming: true, // UI shows streaming indicator + waiting_for_response: false, + thread: { messages: [{role: "assistant", content: "H"}] } +} + +// More chunks +dispatch(chatResponse) x N β†’ +{ + streaming: true, + thread: { messages: [{role: "assistant", content: "Hello world..."}] } +} + +// Stream completes +dispatch(doneStreaming) β†’ +{ + streaming: false, + waiting_for_response: false, + prevent_send: false, // Allow next message + thread: { read: true, messages: [...] } // Mark as read +} + +// Error +dispatch(chatError) β†’ +{ + streaming: false, + waiting_for_response: false, + prevent_send: true, // Block sends until error cleared + error: "Error message" +} +``` + +### Tool Loop Detection + +**Problem**: AI might call same tool repeatedly with same args (infinite loop) + +**Solution**: `checkForToolLoop(messages)` (actions.ts:293) + +- Scans recent assistant+tool messages +- Detects duplicate tool calls with identical results +- Sets `only_deterministic_messages: true` to stop streaming + +### Queued Messages (Priority System) + +**Feature**: User can send multiple messages while streaming + +```typescript +type QueuedUserMessage = { + id: string; + message: UserMessage; + createdAt: number; + priority?: boolean; // Send immediately after current stream ends +}; + +// Regular queue: waits for tools to complete +// Priority queue: sends right after streaming (next turn) +``` + +**Hook**: `useAutoSend()` in `useSendChatRequest.ts:362-477` + +- Monitors `queuedMessages`, `streaming`, `hasUnsentTools` +- Auto-flushes when appropriate conditions met +- Priority messages bypass tool completion wait + +--- + +## State Management + +### Redux Architecture + +**Modern Redux Toolkit** with `combineSlices` (not legacy `combineReducers`) + +**Store Setup**: `src/app/store.ts` + +```typescript +import { combineSlices, configureStore } from "@reduxjs/toolkit"; +import { listenerMiddleware } from "./middleware"; + +// Feature slices +import { chatSlice } from "../features/Chat/Thread/reducer"; +import { historySlice } from "../features/History/historySlice"; +import { configSlice } from "../features/Config/configSlice"; +import { pagesSlice } from "../features/Pages/pagesSlice"; +// ... 20+ more slices + +// RTK Query APIs +import { capsApi } from "../services/refact/caps"; +import { commandsApi } from "../services/refact/commands"; +// ... 15+ more APIs + +const rootReducer = combineSlices( + chatSlice, + historySlice, + configSlice, + // Auto-registers RTK Query reducers + capsApi, + commandsApi, + // ... +); + +export const store = configureStore({ + reducer: rootReducer, + middleware: (getDefaultMiddleware) => + getDefaultMiddleware() + .prepend(listenerMiddleware.middleware) + .concat(capsApi.middleware, commandsApi.middleware /* ... */), +}); +``` + +### Key Slices + +| Slice | Purpose | Location | State Keys | +| ---------------- | ---------------------- | ------------------------------------------------ | ----------------------------------------------------------------------------------------- | +| **chat** | Active thread + cache | `features/Chat/Thread/reducer.ts` | `thread`, `streaming`, `waiting_for_response`, `prevent_send`, `cache`, `queued_messages` | +| **history** | Chat history (max 100) | `features/History/historySlice.ts` | `chats`, `selectedId` | +| **config** | Global settings | `features/Config/configSlice.ts` | `host`, `lspPort`, `apiKey`, `features`, `themeProps` | +| **pages** | Navigation stack | `features/Pages/pagesSlice.ts` | `pages` (array of page objects) | +| **activeFile** | IDE context | `features/Chat/activeFile.ts` | `file_name`, `can_paste`, `cursor` | +| **checkpoints** | Rollback UI state | `features/Checkpoints/checkpointsSlice.ts` | `previewData`, `restoreInProgress` | +| **confirmation** | Tool pause reasons | `features/ToolConfirmation/confirmationSlice.ts` | `pauseReasons`, `wasInteracted`, `confirmationStatus` | +| **errors** | Error messages | `features/Errors/errorsSlice.ts` | `errors` (array) | +| **teams** | Active team/group | `features/Teams/teamsSlice.ts` | `activeGroup` | + +### RTK Query APIs + +**All APIs** auto-generate hooks like `useGetCapsQuery`, `useUpdateModelMutation` + +| API | Base URL | Purpose | Key Endpoints | +| ------------------- | --------------------------- | ------------------ | ------------------------------------ | +| **capsApi** | `/v1/caps` | Model capabilities | `getCaps` | +| **commandsApi** | `/v1/at-command-completion` | Autocomplete | `getCompletion`, `getPreview` | +| **toolsApi** | `/v1/tools` | Tool system | `getTools`, `checkForConfirmation` | +| **dockerApi** | `/v1/docker-*` | Container mgmt | `getContainers`, `executeAction` | +| **integrationsApi** | `/v1/integrations` | Config files | `getData`, `saveData` | +| **modelsApi** | `/v1/customization` | Model config | `getModels`, `updateModel` | +| **providersApi** | `/v1/customization` | Provider config | `getProviders`, `updateProvider` | +| **checkpointsApi** | `/v1/*_checkpoints` | Workspace rollback | `preview`, `restore` | +| **pathApi** | `/v1/*_path` | File paths | `getFullPath`, `customizationPath` | +| **telemetryApi** | `/v1/telemetry` | Analytics | `sendChatEvent`, `sendNetEvent` | +| **linksApi** | `/v1/links` | Smart links | `getLinks` | +| **smallCloudApi** | `https://www.smallcloud.ai` | Auth/user | `getUser`, `getUserSurvey` (GraphQL) | + +**Note**: Chat is NOT an RTK Query API - uses manual `fetch` with custom streaming logic. + +### Selectors Pattern + +**Always use selectors** (don't access `state.chat.thread.messages` directly) + +```typescript +// src/features/Chat/Thread/selectors.ts + +export const selectThread = (state: RootState) => state.chat.thread; +export const selectMessages = (state: RootState) => state.chat.thread.messages; +export const selectIsStreaming = (state: RootState) => state.chat.streaming; +export const selectChatId = (state: RootState) => state.chat.thread.id; + +// Memoized selectors with Reselect +export const selectLastAssistantMessage = createSelector( + [selectMessages], + (messages) => { + for (let i = messages.length - 1; i >= 0; i--) { + if (isAssistantMessage(messages[i])) return messages[i]; + } + return null; + }, +); + +// Complex selectors +export const selectHasUncalledTools = createSelector( + [selectMessages], + (messages) => { + const lastMsg = messages[messages.length - 1]; + if (!isAssistantMessage(lastMsg)) return false; + if (!lastMsg.tool_calls) return false; + return lastMsg.tool_calls.some((tc) => !isServerExecutedTool(tc.id)); + }, +); +``` + +**30+ selectors** in `selectors.ts` - use them for consistency! + +### Redux Persist + +**Location**: `src/app/storage.ts` + +```typescript +import { persistReducer } from "redux-persist"; +import storage from "redux-persist/lib/storage"; // localStorage + +const persistConfig = { + key: "refact-chat", + storage, + whitelist: ["history", "config"], // Only persist these slices + transforms: [pruneHistoryTransform], // Limit to 100 chats +}; + +// Prune old chats on save +const pruneHistoryTransform = createTransform( + (inboundState: HistoryState) => { + if (inboundState.chats.length <= 100) return inboundState; + return { + ...inboundState, + chats: inboundState.chats.slice(-100), // Keep last 100 + }; + }, + null, + { whitelist: ["history"] }, +); +``` + +**Why only history + config?** + +- Active chat (`state.chat`) is ephemeral +- Cache is cleared on app restart +- Prevents localStorage quota issues + +### Middleware & Listeners + +**Location**: `src/app/middleware.ts` + +**Purpose**: Cross-cutting concerns that don't fit in reducers + +```typescript +export const listenerMiddleware = createListenerMiddleware() + +// 1. Error handling for RTK Query +listenerMiddleware.startListening({ + matcher: isAnyOf( + capsApi.endpoints.getCaps.matchRejected, + // ... other rejected matchers + ), + effect: (action, listenerApi) => { + listenerApi.dispatch(addError({ + message: action.error.message, + type: 'GLOBAL' + })) + } +}) + +// 2. IDE tool response handling +listenerMiddleware.startListening({ + actionCreator: ideToolCallResponse, + effect: (action, listenerApi) => { + const { toolCallId, chatId, accepted } = action.payload + + // Update history + listenerApi.dispatch(upsertToolCallIntoHistory({...})) + + // Update active thread + listenerApi.dispatch(upsertToolCall({...})) + + // Remove pause reason for this tool + listenerApi.dispatch(updateConfirmationAfterIdeToolUse({...})) + + // Continue chat if no more pause reasons + const state = listenerApi.getState() + if (state.confirmation.pauseReasons.length === 0 && accepted) { + listenerApi.dispatch(sendCurrentChatToLspAfterToolCallUpdate({ + chatId, toolCallId + })) + } + } +}) + +// 3. Theme class updates +listenerMiddleware.startListening({ + predicate: (action, currentState, previousState) => { + return currentState.config.themeProps?.appearance !== + previousState.config.themeProps?.appearance + }, + effect: (action, listenerApi) => { + const appearance = listenerApi.getState().config.themeProps?.appearance + document.body.className = appearance === 'light' ? 'vscode-light' : 'vscode-dark' + } +}) + +// 10+ more listeners for: +// - Telemetry events +// - History auto-save +// - File reload triggers +// - JetBrains-specific tree refresh +``` + +**Key Pattern**: Use listeners for: + +- Side effects (postMessage, telemetry) +- Cross-slice coordination +- Reacting to RTK Query lifecycle + +--- + +## Component Hierarchy & Rendering + +### Visual Component Tree + +``` +App (features/App.tsx) +β”œβ”€ Provider Stack +β”‚ β”œβ”€ Redux Provider +β”‚ β”œβ”€ urql Provider (GraphQL) +β”‚ β”œβ”€ PersistGate (redux-persist) +β”‚ β”œβ”€ Theme (Radix) +β”‚ β”œβ”€ TourProvider +β”‚ └─ AbortControllerProvider +β”‚ +└─ InnerApp + β”œβ”€ Sidebar (navigation) + β”œβ”€ Toolbar (tabs if tabbed mode) + β”‚ + └─ PageWrapper (current page) + β”œβ”€ Chat (main chat page) ⭐ + β”‚ β”œβ”€ ChatHistory + β”‚ β”œβ”€ ChatContent ⭐⭐ (message renderer) + β”‚ β”‚ β”œβ”€ UserInput (editable messages) + β”‚ β”‚ β”œβ”€ AssistantInput (AI responses) + β”‚ β”‚ β”‚ β”œβ”€ ReasoningContent (thinking blocks) + β”‚ β”‚ β”‚ β”œβ”€ Markdown (main content) + β”‚ β”‚ β”‚ β”œβ”€ ToolsContent ⭐⭐⭐ (most complex) + β”‚ β”‚ β”‚ └─ Citations (web search links) + β”‚ β”‚ β”œβ”€ DiffContent (file changes) + β”‚ β”‚ β”œβ”€ QueuedMessage (pending sends) + β”‚ β”‚ └─ SystemInput (system messages) + β”‚ β”‚ + β”‚ └─ ChatForm (input + controls) + β”‚ β”œβ”€ TextArea + β”‚ β”œβ”€ PromptSelect + β”‚ β”œβ”€ ToolConfirmation (pause popup) + β”‚ β”œβ”€ FilesPreview + β”‚ └─ AgentCapabilities + β”‚ + β”œβ”€ ThreadHistory (view old thread) + β”œβ”€ Statistics (usage charts) + β”œβ”€ Integrations (config UI) + β”œβ”€ Providers (LLM config) + └─ FIMDebug (debug panel) +``` + +### Critical Component: ChatContent + +**Location**: `src/components/ChatContent/ChatContent.tsx` (283 lines) + +**Purpose**: Dispatcher that routes message types to specialized renderers + +**Core Algorithm**: + +```typescript +function renderMessages( + messages: ChatMessages, + onRetry: (index, question) => void, + waiting: boolean, + memo: React.ReactNode[] = [], + index = 0 +): React.ReactNode[] { + if (messages.length === 0) return memo + + const [head, ...tail] = messages + + // Route by message type + if (head.role === 'tool') { + return renderMessages(tail, onRetry, waiting, memo, index + 1) // Skip tools + } + + if (head.role === 'user') { + return renderMessages(tail, onRetry, waiting, + memo.concat(), + index + 1 + ) + } + + if (head.role === 'assistant') { + // Group consecutive diffs + tools with this assistant message + const [diffMessages, toolMessages, rest] = groupRelatedMessages(tail) + + return renderMessages(rest, onRetry, waiting, + memo.concat( + + ), + index + diffMessages.length + toolMessages.length + 1 + ) + } + + // ... handle other types + return renderMessages(tail, onRetry, waiting, memo, index + 1) +} +``` + +**Key Behavior**: + +- **Recursive** processing (not `map`) +- **Groups** diffs + tools with assistant messages +- **Skips** tool messages (shown inline in AssistantInput) +- **Appends** memo (pure functional, no mutations) + +### UserInput Component + +**Props**: + +```typescript +interface UserInputProps { + message: UserMessage; + index: number; + onRetry?: (index: number, content: string) => void; +} +``` + +**Features**: + +- **Editable** via inline textarea (click to edit) +- **Checkpoints** badge (if message has checkpoints) +- **Image attachments** (multi-modal content parsing) +- **Compression hint** πŸ—œοΈ icon +- **Context files** πŸ—ƒοΈ icon (memories) + +**Content Types**: + +```typescript +type UserMessage = { + role: "user"; + content: string | UserMessageContent[]; // String or multi-modal + checkpoints?: Checkpoint[]; + compression_strength?: "absent" | "weak" | "strong"; +}; + +type UserMessageContent = + | { type: "text"; text: string } + | { type: "image_url"; image_url: { url: string } }; +``` + +### AssistantInput Component + +**Props**: + +```typescript +interface AssistantInputProps { + message: AssistantMessage; + diffMessages: DiffMessage[]; + toolMessages: ToolMessage[]; + waiting: boolean; + onRetry?: () => void; +} +``` + +**Rendering Order**: + +1. **ReasoningContent** (thinking blocks) - collapsible +2. **Main content** (Markdown) - with syntax highlighting +3. **ToolsContent** (for each tool_call) - complex nested tree +4. **DiffContent** (grouped diffs) - apply/reject UI +5. **Citations** (web search results) - clickable links +6. **Like/Resend buttons** (bottom actions) +7. **Usage info** (tokens, cost) - footer + +**Streaming Behavior**: + +- Shows streaming indicator while `waiting || content.endsWith('▍')` +- Markdown renders incrementally (no flicker) +- Tool calls appear as they arrive + +### ToolsContent Component ⭐ + +**Location**: `src/components/ChatContent/ToolsContent.tsx` (668 lines!) + +**Why so complex?** + +- Handles 10+ tool types +- Nested subchats (5 levels deep possible) +- Multi-modal results (text, images, files) +- Special cases: Knowledge, TextDoc browser + +**Visual Structure**: + +``` +ToolsContent (one per tool_call) +β”œβ”€ Header (tool name, status badge) +β”œβ”€ Arguments (collapsible JSON) +β”‚ +└─ Result (polymorphic by tool type) + β”œβ”€ TextResult (most tools) + β”œβ”€ KnowledgeResults (search results with scores) + β”‚ └─ FileList (clickable files) + β”œβ”€ TextDocContent (file browser) + β”‚ β”œβ”€ FileTree navigation + β”‚ β”œβ”€ File content viewer + β”‚ └─ SmartLinks (context actions) + └─ MultiModalResult (images + text) + └─ DialogImage (lightbox) +``` + +**Tool Status Badge**: + +- ⏳ `thinking` - Tool executing +- βœ… `success` - Completed +- ❌ `error` - Failed +- ☁️ `server` - Server-executed tool (display only) + +**Special Tool Types**: + +| Tool Type | Component | Notes | +| -------------------- | ------------------- | ------------------------------------------ | +| `knowledge` | KnowledgeResults | Shows search results with relevance scores | +| `textdoc` | TextDocContent | Interactive file browser with navigation | +| `subchat_*` | Nested ToolsContent | Recursive subchat rendering (max 5 deep) | +| `patch`, `text_edit` | DiffContent | Shows in DiffContent, not ToolsContent | +| Server tools | Badge only | `srvtoolu_*` prefix, no execution UI | + +### DiffContent Component + +**Location**: `src/components/ChatContent/DiffContent.tsx` (364 lines) + +**Purpose**: Group and display file changes with apply/reject controls + +**Grouping Logic**: + +```typescript +// Groups consecutive diffs by tool_call_id +const groupedDiffs = diffMessages.reduce((acc, msg) => { + const key = msg.tool_call_id || "ungrouped"; + if (!acc[key]) acc[key] = []; + acc[key].push(msg); + return acc; +}, {}); +``` + +**Each Group Renders**: + +- **Header**: Tool name, file count, timestamps +- **Diff Viewer**: Line-by-line changes with syntax highlighting +- **Actions**: Apply All, Reject All (per group) +- **IDE Link**: Clickable file paths (opens in IDE) + +**Diff Format**: + +```typescript +type DiffChunk = { + file_name: string; + file_action: "A" | "M" | "D"; // Added/Modified/Deleted + line1: number; + line2: number; + chunks: string; // Unified diff format +}; +``` + +### Message Type Routing Summary + +| Role | Component | Skip Render? | Group With? | +| -------------- | -------------------------- | ------------ | ------------- | +| `user` | UserInput | No | - | +| `assistant` | AssistantInput | No | diffs + tools | +| `tool` | (inline in AssistantInput) | Yes | - | +| `diff` | DiffContent | No (grouped) | assistant | +| `context_file` | ContextFiles | No | - | +| `system` | SystemInput | No | - | +| `plain_text` | PlainText | No | - | + +### Special Content Markers + +**In UI, look for these icons**: + +| Icon | Meaning | Location | +| ---- | ------------------------------------ | ---------------- | +| πŸ—œοΈ | Compression hint (context too large) | UserInput | +| πŸ—ƒοΈ | Memory/context files attached | UserInput | +| ⏳ | Tool thinking | ToolsContent | +| βœ… | Tool success | ToolsContent | +| ❌ | Tool failed | ToolsContent | +| ☁️ | Server-executed tool | ToolsContent | +| πŸ”„ | Checkpoint reset available | CheckpointButton | + +--- + +## UI & Styling + +### Styling Architecture + +**Two-layer system**: **Radix UI Themes** + **CSS Modules** + +``` +Radix Themes (design tokens) + ↓ provides +CSS Variables (--space-*, --color-*, --radius-*) + ↓ used by +CSS Modules (component-specific styles) +``` + +### Golden Rules + +1. βœ… **Use Radix primitives for layout**: `Flex`, `Box`, `Text`, `Card`, `Button` +2. βœ… **Use design tokens** (not magic numbers): `var(--space-3)`, `var(--color-accent-9)` +3. βœ… **CSS Modules** for component-specific styles: `styles.chatContent` +4. ❌ **Avoid global CSS** (exception: `src/lib/render/web.css` for body baseline) +5. ❌ **No inline styles** (use CSS Modules or Radix props) +6. ❌ **No magic numbers** (`padding: 8px` β†’ `padding: var(--space-2)`) + +### Radix Design Tokens + +**Spacing** (based on 4px grid): + +```css +--space-1: 4px --space-2: 8px --space-3: 12px --space-4: 16px --space-5: 20px + --space-6: 24px --space-7: 28px --space-8: 32px --space-9: 36px; +``` + +**Colors** (semantic tokens): + +```css +--accent-1 through --accent-12 /* Primary brand color scale */ +--gray-1 through --gray-12 /* Neutral grays */ +--color-background /* Page background */ +--color-surface /* Card background */ +--color-panel-solid /* Overlay background */ +``` + +**Radii**: + +```css +--radius-1: 4px --radius-2: 6px --radius-3: 8px --radius-4: 12px --radius-full: + 9999px; +``` + +**Typography**: + +```css +--font-size-1 through --font-size-9 +--line-height-1 through --line-height-9 +--font-weight-regular: 400 +--font-weight-medium: 500 +--font-weight-bold: 700 +``` + +### Theme Configuration + +**Component**: `src/components/Theme/Theme.tsx` + +```typescript +interface ThemeProps { + appearance?: 'light' | 'dark' | 'inherit' + accentColor?: 'indigo' | 'blue' | 'green' | /* ... */ + grayColor?: 'gray' | 'mauve' | 'slate' | 'auto' + radius?: 'none' | 'small' | 'medium' | 'large' | 'full' + scaling?: '90%' | '95%' | '100%' | '105%' | '110%' +} + +export function Theme({ children }: { children: React.ReactNode }) { + const config = useConfig() + const appearance = useAppearance() // Listens to OS/IDE theme + + return ( + + {children} + + ) +} +``` + +**Host-specific behavior**: + +- `host === 'web'`: Wrapper includes dev theme toggle +- `host === 'vscode' | 'jetbrains'`: No wrapper, IDE controls theme +- `document.body.className`: Set to `vscode-light` or `vscode-dark` by middleware + +### CSS Modules Pattern + +**File naming**: `Component.module.css` + +**Example** (`ChatContent.module.css`): + +```css +.scroll_area { + height: 100%; + padding: var(--space-2) var(--space-4); +} + +.message_group { + display: flex; + flex-direction: column; + gap: var(--space-3); +} + +.streaming_indicator { + color: var(--accent-9); + animation: pulse 1.5s ease-in-out infinite; +} + +@keyframes pulse { + 0%, + 100% { + opacity: 1; + } + 50% { + opacity: 0.5; + } +} +``` + +**Usage in component**: + +```typescript +import styles from './ChatContent.module.css' + +export function ChatContent() { + return ( +
+
+ {/* ... */} +
+
+ ) +} +``` + +**Conditional classes**: + +```typescript +import classNames from 'classnames' + +
+``` + +### Common Patterns + +**Layout with Radix**: + +```typescript + + Header + Content + Footer + +``` + +**Typography**: + +```typescript + + Label text + +``` + +**Cards**: + +```typescript + + + {/* content */} + + +``` + +**Buttons**: + +```typescript + +``` + +### Responsive Design + +**Minimal responsive styling** (app is designed for IDE sidebars) + +**Breakpoints** (when needed): + +```css +@media (max-width: 768px) { + .sidebar { + display: none; + } +} +``` + +**Flex-based layout** handles most responsive needs automatically. + +### Dark/Light Mode + +**How it works**: + +1. User/OS sets `appearance: 'light' | 'dark'` +2. Radix Theme applies appropriate color scales +3. All Radix tokens update automatically +4. Custom CSS uses tokens, so it updates too + +**Testing dark mode**: + +- Web: Use theme toggle in UI +- VSCode: Change VSCode theme +- JetBrains: Change IDE theme + +**Custom dark mode overrides** (rare): + +```css +.my_component { + background: var(--color-surface); +} + +/* Only if Radix token doesn't work */ +:is(.dark, .dark-theme) .my_component { + background: #1a1a1a; +} +``` + +### Icons + +**Radix Icons**: + +```typescript +import { ChevronDownIcon, CheckIcon, Cross2Icon } from '@radix-ui/react-icons' + + +``` + +**Custom icons** (rare): + +```typescript +// src/images/ +export function CustomIcon() { + return {/* ... */} +} +``` + +### Animations + +**Framer Motion** for complex animations: + +```typescript +import { motion } from 'framer-motion' + + + {content} + +``` + +**CSS animations** for simple effects: + +```css +@keyframes fadeIn { + from { + opacity: 0; + } + to { + opacity: 1; + } +} + +.fade_in { + animation: fadeIn 0.2s ease-in-out; +} +``` + +### Common Mistakes to Avoid + +❌ **Using px values directly**: + +```css +/* Bad */ +.button { + padding: 12px; +} + +/* Good */ +.button { + padding: var(--space-3); +} +``` + +❌ **Hardcoded colors**: + +```css +/* Bad */ +.text { + color: #3b82f6; +} + +/* Good */ +.text { + color: var(--accent-9); +} +``` + +❌ **Global styles without scoping**: + +```css +/* Bad - affects everything */ +button { + border-radius: 8px; +} + +/* Good - scoped to module */ +.my_button { + border-radius: var(--radius-3); +} +``` + +❌ **Ignoring Radix primitives**: + +```tsx +/* Bad - reinventing the wheel */ +
+ +/* Good - use Radix */ + +``` + +--- + +## API Services + +### Service Architecture + +**Two separate backends**: + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Frontend (React) β”‚ +β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ +β”‚ RTK Query APIs β”‚ +β”‚ - capsApi, toolsApi, dockerApi, etc. β”‚ +β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ β”‚ + β–Ό β–Ό +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ Local LSP β”‚ β”‚ SmallCloud.ai β”‚ +β”‚ 127.0.0.1:8001 β”‚ β”‚ (cloud) β”‚ +β”‚ β”‚ β”‚ β”‚ +β”‚ - Chat β”‚ β”‚ - Auth β”‚ +β”‚ - Tools β”‚ β”‚ - User mgmt β”‚ +β”‚ - Caps β”‚ β”‚ - Teams β”‚ +β”‚ - Models β”‚ β”‚ - Surveys β”‚ +β”‚ - Docker β”‚ β”‚ β”‚ +β”‚ - Integrations β”‚ β”‚ (GraphQL) β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +**Critical distinction**: + +- **Chat ALWAYS goes to LSP** (never SmallCloud) +- LSP handles all AI operations +- SmallCloud only for auth/user/team management + +### LSP Server Endpoints + +**Base URL**: `http://127.0.0.1:${lspPort}/v1/...` + +| Endpoint | Method | Purpose | RTK Query API | +| ------------------------------ | ------ | --------------------- | ------------------------------- | +| `/v1/chat` | POST | **Streaming chat** | ❌ Manual fetch | +| `/v1/caps` | GET | Model capabilities | `capsApi.getCaps` | +| `/v1/at-command-completion` | POST | Autocomplete | `commandsApi.getCompletion` | +| `/v1/at-command-preview` | POST | Preview command | `commandsApi.getPreview` | +| `/v1/tools` | POST | Get available tools | `toolsApi.getTools` | +| `/v1/tools/check_confirmation` | POST | Check tool approval | `toolsApi.checkForConfirmation` | +| `/v1/docker-container-list` | POST | List containers | `dockerApi.getContainers` | +| `/v1/docker-container-action` | POST | Execute action | `dockerApi.executeAction` | +| `/v1/integrations-list` | GET | List integrations | `integrationsApi.getList` | +| `/v1/integration-get` | POST | Get config | `integrationsApi.getData` | +| `/v1/integration-save` | POST | Save config | `integrationsApi.saveData` | +| `/v1/preview_checkpoints` | POST | Preview rollback | `checkpointsApi.preview` | +| `/v1/restore_checkpoints` | POST | Apply rollback | `checkpointsApi.restore` | +| `/v1/get_file_text` | POST | Read file | `pathApi.getFileText` | +| `/v1/*_path` | GET | Get config paths | `pathApi.*Path` | +| `/v1/customization` | POST | Model/provider config | `modelsApi`, `providersApi` | +| `/v1/telemetry/chat` | POST | Send telemetry | `telemetryApi.sendChatEvent` | +| `/v1/ping` | GET | Health check | `pingApi.getPing` | + +### RTK Query API Pattern + +**All APIs follow this structure**: + +```typescript +// src/services/refact/caps.ts +import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react"; + +export const capsApi = createApi({ + reducerPath: "caps", + baseQuery: fetchBaseQuery({ + baseUrl: (_, api) => { + const state = api.getState() as RootState; + return `http://127.0.0.1:${state.config.lspPort}`; + }, + prepareHeaders: (headers, { getState }) => { + const state = getState() as RootState; + if (state.config.apiKey) { + headers.set("Authorization", `Bearer ${state.config.apiKey}`); + } + return headers; + }, + }), + endpoints: (builder) => ({ + getCaps: builder.query({ + query: () => "/v1/caps", + }), + }), +}); + +export const { useGetCapsQuery, useLazyGetCapsQuery } = capsApi; +``` + +**Key features**: + +- **Dynamic base URL** from Redux state +- **Auto-injects auth** token if present +- **Auto-generates hooks**: `useGetCapsQuery`, `useLazyGetCapsQuery` +- **Caching** by default + +### Chat API (Special Case) + +**Why not RTK Query?** Streaming + custom chunking logic + +**Location**: `src/services/refact/chat.ts` + +```typescript +export async function sendChat({ + messages, + model, + stream: true, + abortSignal, + chatId, + port = 8001, + apiKey, + mode, + // ... +}: SendChatArgs): Promise { + const body = JSON.stringify({ + messages, + model, + stream: true, + meta: { + chat_id: chatId, + chat_mode: mode ?? 'EXPLORE', + // ... + } + }) + + const headers = { + 'Content-Type': 'application/json', + ...(apiKey ? { Authorization: `Bearer ${apiKey}` } : {}) + } + + const url = `http://127.0.0.1:${port}/v1/chat` + + return fetch(url, { + method: 'POST', + headers, + body, + signal: abortSignal, + credentials: 'same-origin' + }) +} +``` + +**Response format** (SSE): + +``` +data: {"choices":[{"delta":{"role":"assistant","content":"Hi"},...}]}\n\n +data: {"choices":[{"delta":{"content":" there"},...}]}\n\n +data: [DONE]\n\n +``` + +### SmallCloud API (GraphQL) + +**Base URL**: `https://www.smallcloud.ai/v1/graphql` + +**Used for**: + +- User authentication (OAuth) +- User profile +- Team management +- Usage surveys + +**Setup**: `urqlProvider.tsx` + +```typescript +const client = createClient({ + url: "https://www.smallcloud.ai/v1/graphql", + fetchOptions: () => { + const apiKey = store.getState().config.apiKey; + return { + headers: { + ...(apiKey ? { Authorization: `Bearer ${apiKey}` } : {}), + }, + }; + }, + exchanges: [cacheExchange, fetchExchange, subscriptionExchange], +}); +``` + +**Example queries** (generated from GraphQL schema): + +```typescript +// useGetUser hook +const [result] = useQuery({ + query: graphql(` + query GetUser { + user { + account + email + has_valid_subscription + } + } + `), +}); +``` + +**Note**: GraphQL codegen runs via `npm run generate:graphql` + +### Type Definitions + +**All API types** in `src/services/refact/types.ts` (787 lines!) + +**Key types**: + +```typescript +// Message types +export type UserMessage = { + role: 'user' + content: string | UserMessageContent[] + checkpoints?: Checkpoint[] + compression_strength?: 'absent' | 'weak' | 'strong' +} + +export type AssistantMessage = { + role: 'assistant' + content: string + reasoning_content?: string + tool_calls?: ToolCall[] + thinking_blocks?: ThinkingBlock[] + citations?: WebSearchCitation[] + finish_reason?: 'stop' | 'length' | 'tool_calls' | null + usage?: Usage + // Metering fields + metering_balance?: number + metering_*_tokens_n?: number + metering_coins_*?: number +} + +export type ToolCall = { + id: string + index: number + function: { + name: string + arguments: string // JSON string + } + subchat?: string // Subchat ID if nested + attached_files?: string[] // Files attached to subchat +} + +export type ToolMessage = { + role: 'tool' + content: ToolResult +} + +export type ToolResult = { + tool_call_id: string + content: string | { type: 'image_url', image_url: { url: string } }[] + finish_reason?: 'stop' | 'length' | null + compression_strength?: 'absent' | 'weak' | 'strong' + tool_failed?: boolean +} + +// Diff types +export type DiffMessage = { + role: 'diff' + content: DiffChunk[] + tool_call_id?: string +} + +export type DiffChunk = { + file_name: string + file_action: 'A' | 'M' | 'D' + line1: number + line2: number + chunks: string // Unified diff +} + +// Response types (streaming deltas) +export type ChatResponse = + | ChatResponseChoice + | UserResponse + | ContextFileResponse + | ToolResponse + | DiffResponse + | SubchatResponse + | SystemResponse + | PlainTextResponse +``` + +**Type guards** (critical for message routing): + +```typescript +export function isUserMessage(msg: unknown): msg is UserMessage { + return ( + typeof msg === "object" && + msg !== null && + "role" in msg && + msg.role === "user" + ); +} + +export function isAssistantMessage(msg: unknown): msg is AssistantMessage { + return ( + typeof msg === "object" && + msg !== null && + "role" in msg && + msg.role === "assistant" + ); +} + +// ... 20+ more type guards +``` + +### Error Handling + +**RTK Query errors** are caught by middleware: + +```typescript +listenerMiddleware.startListening({ + matcher: isAnyOf( + capsApi.endpoints.getCaps.matchRejected, + toolsApi.endpoints.getTools.matchRejected, + // ... + ), + effect: (action, listenerApi) => { + const error = action.error; + listenerApi.dispatch( + addError({ + message: error.message ?? "Unknown error", + type: "GLOBAL", + }), + ); + }, +}); +``` + +**Chat errors** handled in thunk: + +```typescript +.catch((err: unknown) => { + dispatch(doneStreaming({ id: chatId })) + dispatch(chatError({ + id: chatId, + message: err instanceof Error ? err.message : String(err) + })) +}) +``` + +--- + +## IDE Integration + +### postMessage Architecture + +**Communication protocol** between GUI (iframe) and IDE extension (host) + +``` +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ IDE Extension (VSCode/JetBrains) β”‚ +β”‚ β”‚ +β”‚ window.postMessage(event, '*') β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ + β”‚ + β”‚ postMessage API + β”‚ +β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β–Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” +β”‚ GUI (React in iframe/webview) β”‚ +β”‚ β”‚ +β”‚ window.addEventListener('message', ...) β”‚ +β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ +``` + +### Message Flow Directions + +**1. IDE β†’ GUI** (context updates, responses) + +Handled by: `src/hooks/useEventBusForApp.ts` + +```typescript +export function useEventBusForApp() { + const dispatch = useAppDispatch(); + + useEffect(() => { + const listener = (event: MessageEvent) => { + // File context update + if (setFileInfo.match(event.data)) { + dispatch(setFileInfo(event.data.payload)); + } + + // Selected code snippet + if (setSelectedSnippet.match(event.data)) { + dispatch(setSelectedSnippet(event.data.payload)); + } + + // New chat trigger + if (newChatAction.match(event.data)) { + if (!isPageInHistory({ pages }, "chat")) { + dispatch(push({ name: "chat" })); + } + dispatch(newChatAction(event.data.payload)); + } + + // Tool approval response + if (ideToolCallResponse.match(event.data)) { + dispatch(event.data); + } + + // ... more handlers + }; + + window.addEventListener("message", listener); + return () => window.removeEventListener("message", listener); + }, [dispatch]); +} +``` + +**2. GUI β†’ IDE** (commands, requests) + +Handled by: `src/hooks/useEventBusForIDE.ts` + +```typescript +export const useEventsBusForIDE = () => { + const postMessage = usePostMessage(); + + const openFile = useCallback( + (file: OpenFilePayload) => { + const action = ideOpenFile(file); + postMessage(action); + }, + [postMessage], + ); + + const diffPasteBack = useCallback( + (content: string, chatId?: string) => { + const action = ideDiffPasteBackAction({ content, chatId }); + postMessage(action); + }, + [postMessage], + ); + + const sendToolCallToIde = useCallback( + (toolCall, edit, chatId) => { + const action = ideToolCall({ toolCall, edit, chatId }); + postMessage(action); + }, + [postMessage], + ); + + // ... 20+ command functions + + return { + openFile, + diffPasteBack, + sendToolCallToIde, + // ... + }; +}; +``` + +### postMessage Transport + +**Location**: `src/hooks/usePostMessage.ts` + +**Auto-detects host**: + +```typescript +export function usePostMessage() { + const config = useConfig(); + + return useCallback( + (message: unknown) => { + if (config.host === "vscode") { + // VSCode uses acquireVsCodeApi + const vscode = window.acquireVsCodeApi?.(); + vscode?.postMessage(message); + } else if (config.host === "jetbrains") { + // JetBrains uses custom function + window.postIntellijMessage?.(message); + } else { + // Web/generic: use window.postMessage + window.postMessage(message, "*"); + } + }, + [config.host], + ); +} +``` + +### Event Types + +**Defined in**: `src/events/setup.ts`, IDE action creators + +**Common events IDE β†’ GUI**: + +| Event Type | Payload | Purpose | +| ----------------------- | -------------------------------- | -------------------- | +| `updateConfig` | `Partial` | Update global config | +| `setFileInfo` | `{file_name, can_paste}` | Active file changed | +| `setSelectedSnippet` | `{code, language}` | Code selection | +| `newChatAction` | `Partial` | Start new chat | +| `ideToolCallResponse` | `{toolCallId, chatId, accepted}` | Tool approval | +| `setCurrentProjectInfo` | `{name, path}` | Project context | + +**Common events GUI β†’ IDE**: + +| Event Type | Payload | Purpose | +| --------------------------- | -------------------------- | ----------------------- | +| `ideOpenFile` | `{file_path, line?}` | Open file in editor | +| `ideDiffPasteBack` | `{content, chatId}` | Apply code changes | +| `ideToolCall` | `{toolCall, edit, chatId}` | Request tool execution | +| `ideOpenSettings` | - | Open settings UI | +| `ideNewFile` | `{content}` | Create new file | +| `ideAnimateFileStart/Stop` | `{file_name}` | File activity indicator | +| `ideChatPageChange` | `{page}` | Navigation event | +| `ideSetCodeCompletionModel` | `{model}` | Update model | +| `ideSetActiveTeamsGroup` | `{group}` | Set active team | + +### Host Mode Differences + +**Config**: `state.config.host: 'web' | 'vscode' | 'jetbrains' | 'ide'` + +| Feature | web | vscode | jetbrains | ide | +| ------------------------ | -------------------- | -------------------- | ----------------------- | ---------- | +| **postMessage** | `window.postMessage` | `acquireVsCodeApi()` | `postIntellijMessage()` | Generic | +| **Theme** | Toggle in UI | VSCode controls | JB controls | Generic | +| **File links** | ❌ No-op | βœ… Opens in editor | βœ… Opens in IDE | βœ… Generic | +| **Copy buttons** | βœ… Visible | ❌ Hidden | ❌ Hidden | ❌ Hidden | +| **Tool execution** | LSP only | LSP + IDE | LSP + IDE | LSP + IDE | +| **Paste to file** | ❌ No-op | βœ… Works | βœ… Works | βœ… Works | +| **Project tree refresh** | N/A | N/A | βœ… Auto-refresh | N/A | + +**Host detection**: + +```typescript +const config = useConfig(); +const isIDE = config.host !== "web"; +const isVSCode = config.host === "vscode"; +const isJetBrains = config.host === "jetbrains"; +``` + +### Tool Approval Flow (IDE-specific) + +**For patch-like tools**, IDE shows preview before applying: + +``` +1. AI suggests patch tool_call + ↓ +2. GUI: Confirmation popup (if not automatic_patch) + ↓ +3. User confirms + ↓ +4. GUI β†’ IDE: ideToolCall({toolCall, edit, chatId}) + ↓ +5. IDE: Shows diff preview + ↓ +6. User: Applies or rejects + ↓ +7. IDE β†’ GUI: ideToolCallResponse({toolCallId, chatId, accepted}) + ↓ +8. GUI middleware: Updates tool status, continues chat +``` + +**Web mode**: All tools executed by LSP directly (no IDE approval step) + +--- + +## Tool Calling System + +### Overview + +The tool calling system allows AI to execute functions (file operations, shell commands, searches, etc.) with optional user confirmation. + +### Tool Call Lifecycle + +``` +1. AI Response with tool_calls + ↓ +2. [Confirmation Gate] ← configurable + ↓ +3. Tool Execution (LSP or IDE) + ↓ +4. Tool Result inserted as message + ↓ +5. AI continues with result + ↓ +6. Loop until finish_reason: "stop" +``` + +### Confirmation Logic + +**Location**: `src/hooks/useSendChatRequest.ts` (lines 138-201) + +**Decision tree**: + +```typescript +async function sendMessages(messages, maybeMode) { + dispatch(setIsWaitingForResponse(true)); + const lastMessage = messages.slice(-1)[0]; + + // Check if last message has tool_calls + if ( + !isWaiting && + !wasInteracted && + isAssistantMessage(lastMessage) && + lastMessage.tool_calls + ) { + const toolCalls = lastMessage.tool_calls; + + // Check for automatic bypass + if ( + toolCalls[0].function.name && + PATCH_LIKE_FUNCTIONS.includes(toolCalls[0].function.name) && + isPatchAutomatic // ← per-chat setting + ) { + // Skip confirmation for patch-like tools in automatic mode + } else { + // Ask backend if confirmation needed + const confirmationResponse = await triggerCheckForConfirmation({ + tool_calls: toolCalls, + messages: messages, + }).unwrap(); + + if (confirmationResponse.pause) { + dispatch(setPauseReasons(confirmationResponse.pause_reasons)); + return; // STOP - show confirmation UI + } + } + } + + // Proceed with LSP call + dispatch(backUpMessages({ id: chatId, messages })); + dispatch(chatAskedQuestion({ id: chatId })); + // ... sendChat() +} +``` + +### PATCH_LIKE_FUNCTIONS + +**These tools auto-approve when `automatic_patch === true`**: + +```typescript +export const PATCH_LIKE_FUNCTIONS = [ + "patch", + "text_edit", + "create_textdoc", + "update_textdoc", + "replace_textdoc", + "update_textdoc_regex", + "update_textdoc_by_lines", +]; +``` + +### Confirmation API + +**Endpoint**: `POST /v1/tools/check_confirmation` + +**Request**: + +```json +{ + "tool_calls": [ + { + "id": "call_123", + "function": { + "name": "patch", + "arguments": "{\"file_path\":\"src/app.ts\",...}" + } + } + ], + "messages": [ + /* full context */ + ] +} +``` + +**Response**: + +```json +{ + "pause": true, + "pause_reasons": [ + { + "type": "confirmation", + "rule": "*.py files require approval", + "tool_call_id": "call_123" + } + ] +} +``` + +**If `pause === false`**: Tool executes immediately +**If `pause === true`**: Show ToolConfirmation popup + +### ToolConfirmation Component + +**Location**: `src/components/ChatForm/ToolConfirmation.tsx` + +**UI shows**: + +- **Tool name** (e.g., "patch") +- **Arguments** (collapsible JSON) +- **Pause reason** (e.g., "requires approval") +- **Three buttons**: + - 🟒 **Allow Once** - Confirm this tool, continue + - 🟒 **Allow Chat** - Enable automatic mode for this chat + - πŸ”΄ **Stop** - Reject tool, end chat + +**User actions**: + +```typescript +// Allow Once +const confirmToolUsage = () => { + dispatch( + clearPauseReasonsAndHandleToolsStatus({ + wasInteracted: true, + confirmationStatus: true, + }), + ); + dispatch(setIsWaitingForResponse(false)); + // useAutoSend will detect clear and continue +}; + +// Allow Chat +const enableAutomaticPatch = () => { + dispatch(setAutomaticPatch({ chatId, value: true })); + confirmToolUsage(); +}; + +// Stop +const rejectToolUsage = (toolCallIds) => { + toolCallIds.forEach((id) => { + dispatch(upsertToolCall({ toolCallId: id, chatId, accepted: false })); + }); + dispatch(resetConfirmationInteractedState()); + dispatch(setIsWaitingForResponse(false)); + dispatch(doneStreaming({ id: chatId })); + dispatch(setPreventSend({ id: chatId })); +}; +``` + +### Tool Execution Paths + +**Two execution models**: + +#### 1. LSP-Executed Tools (Most tools) + +``` +GUI β†’ LSP /v1/chat with tool_calls β†’ LSP executes β†’ Returns tool result +``` + +**Examples**: `shell`, `read_file`, `search`, `web_search`, etc. + +**Result format**: + +```json +{ + "role": "tool", + "tool_call_id": "call_123", + "content": "Command output...", + "finish_reason": "stop" +} +``` + +#### 2. IDE-Executed Tools (Patch-like tools) + +``` +GUI β†’ LSP /v1/chat with tool_calls + ↓ +LSP returns tool instruction (not executed yet) + ↓ +GUI β†’ IDE: ideToolCall({toolCall, edit, chatId}) + ↓ +IDE: Shows diff preview, user applies/rejects + ↓ +IDE β†’ GUI: ideToolCallResponse({toolCallId, chatId, accepted}) + ↓ +GUI: Inserts tool result, continues chat +``` + +**Edit format** (`ToolEditResult`): + +```typescript +type ToolEditResult = { + file_name: string; + file_action: "A" | "M" | "D"; + line1: number; + line2: number; + chunks: string; // Unified diff +}; +``` + +### Server-Executed Tools + +**Special case**: Tools with `id.startsWith('srvtoolu_')` + +**Behavior**: + +- Already executed by LLM provider (e.g., Claude with computer use) +- GUI shows badge: ☁️ "Server tool" +- NOT sent to LSP for execution +- Display only (no confirmation needed) + +**Detection**: + +```typescript +export function isServerExecutedTool(toolCallId?: string): boolean { + return toolCallId?.startsWith("srvtoolu_") ?? false; +} +``` + +### Tool Result Insertion + +**Via IDE approval** (middleware listener): + +```typescript +listenerMiddleware.startListening({ + actionCreator: ideToolCallResponse, + effect: (action, listenerApi) => { + const { toolCallId, chatId, accepted } = action.payload; + + // 1. Update history + listenerApi.dispatch( + upsertToolCallIntoHistory({ + toolCallId, + chatId, + accepted, + }), + ); + + // 2. Insert/update tool result in messages + listenerApi.dispatch( + upsertToolCall({ + toolCallId, + chatId, + accepted, + }), + ); + + // 3. Remove pause reason + listenerApi.dispatch( + updateConfirmationAfterIdeToolUse({ + toolCallId, + }), + ); + + // 4. Continue chat if no more pauses + const state = listenerApi.getState(); + if (state.confirmation.pauseReasons.length === 0 && accepted) { + listenerApi.dispatch( + sendCurrentChatToLspAfterToolCallUpdate({ + chatId, + toolCallId, + }), + ); + } + }, +}); +``` + +**Via streaming** (LSP returns tool message): + +- Handled by `formatChatResponse` in reducer +- Tool message appended to `thread.messages` + +### Tool Loop Prevention + +**Problem**: AI might call same tool repeatedly (infinite loop) + +**Solution**: `checkForToolLoop(messages)` in actions + +```typescript +function checkForToolLoop(messages): boolean { + // Get recent assistant+tool messages + const recentMessages = takeFromEndWhile(messages, msg => + isToolMessage(msg) || isToolCallMessage(msg) + ) + + // Extract tool calls and results + const toolCalls = /* ... */ + const toolResults = /* ... */ + + // Check for duplicates (same tool, args, AND result) + return scanForDuplicatesWith(toolCalls, (a, b) => { + const aResult = toolResults.find(msg => msg.content.tool_call_id === a.id) + const bResult = toolResults.find(msg => msg.content.tool_call_id === b.id) + + return ( + a.function.name === b.function.name && + a.function.arguments === b.function.arguments && + aResult?.content === bResult?.content + ) + }) +} +``` + +**If loop detected**: + +- Sets `only_deterministic_messages: true` in LSP request +- Stops streaming to prevent infinite loop + +### Subchat System + +**Feature**: Tools can spawn nested chats + +**Use case**: Multi-step research, recursive search + +**Flow**: + +``` +Tool call β†’ LSP creates subchat β†’ Subchat executes β†’ Files attached to parent tool +``` + +**Message format**: + +```typescript +type SubchatResponse = { + subchat_id: string; + tool_call_id: string; + add_message: ContextFileResponse; +}; +``` + +**Rendering**: ToolsContent renders nested subchats recursively (max 5 deep) + +### Tool Status States + +```typescript +type ToolStatus = + | "thinking" // ⏳ Executing + | "success" // βœ… Completed + | "error" // ❌ Failed + | "server"; // ☁️ Server-executed (display only) +``` + +**Visual indicators** in ToolsContent component + +### Common Tool Types + +| Tool | Purpose | Execution | Confirmation? | +| --------------------------- | -------------- | --------- | ------------- | +| `patch` | Edit files | IDE | Optional | +| `text_edit` | Edit files | IDE | Optional | +| `shell` | Run commands | LSP | Optional | +| `read_file` | Read file | LSP | Rare | +| `search` | Code search | LSP | No | +| `web_search` | Search web | LSP | No | +| `knowledge` | Vec DB search | LSP | No | +| `textdoc` | Browse project | LSP | No | +| `remember_how_to_use_tools` | Save notes | LSP | No | + +--- + +## Development Workflows + +### How to Add a New Redux Slice + +**1. Create slice file**: + +```typescript +// src/features/MyFeature/myFeatureSlice.ts +import { createSlice } from "@reduxjs/toolkit"; + +export type MyFeatureState = { + data: string[]; + loading: boolean; +}; + +const initialState: MyFeatureState = { + data: [], + loading: false, +}; + +export const myFeatureSlice = createSlice({ + name: "myFeature", + initialState, + reducers: { + setData: (state, action: PayloadAction) => { + state.data = action.payload; + }, + setLoading: (state, action: PayloadAction) => { + state.loading = action.payload; + }, + }, + selectors: { + selectData: (state) => state.data, + selectLoading: (state) => state.loading, + }, +}); + +export const { setData, setLoading } = myFeatureSlice.actions; +export const { selectData, selectLoading } = myFeatureSlice.selectors; +``` + +**2. Register in store**: + +```typescript +// src/app/store.ts +import { myFeatureSlice } from "../features/MyFeature/myFeatureSlice"; + +const rootReducer = combineSlices( + chatSlice, + historySlice, + myFeatureSlice, // ← Add here + // ... +); +``` + +**3. Use in components**: + +```typescript +import { useAppSelector, useAppDispatch } from '@/hooks' +import { selectData, setData } from '@/features/MyFeature/myFeatureSlice' + +function MyComponent() { + const data = useAppSelector(selectData) + const dispatch = useAppDispatch() + + return ( + + ) +} +``` + +### How to Add a New API Endpoint + +**Using RTK Query**: + +**1. Create API file**: + +```typescript +// src/services/refact/myApi.ts +import { createApi } from "@reduxjs/toolkit/query/react"; +import { baseQueryWithAuth } from "./index"; + +export const myApi = createApi({ + reducerPath: "myApi", + baseQuery: baseQueryWithAuth, + endpoints: (builder) => ({ + getMyData: builder.query({ + query: ({ id }) => `/v1/my-endpoint/${id}`, + }), + updateMyData: builder.mutation({ + query: ({ id, data }) => ({ + url: `/v1/my-endpoint/${id}`, + method: "POST", + body: data, + }), + }), + }), +}); + +export const { useGetMyDataQuery, useUpdateMyDataMutation } = myApi; +``` + +**2. Register in store**: + +```typescript +// src/app/store.ts +import { myApi } from "../services/refact/myApi"; + +const rootReducer = combineSlices( + // ... other slices + myApi, // ← RTK Query auto-registers +); + +const store = configureStore({ + reducer: rootReducer, + middleware: (getDefaultMiddleware) => + getDefaultMiddleware() + .prepend(listenerMiddleware.middleware) + .concat(myApi.middleware), // ← Add middleware +}); +``` + +**3. Use in components**: + +```typescript +import { useGetMyDataQuery, useUpdateMyDataMutation } from '@/services/refact/myApi' + +function MyComponent() { + const { data, isLoading, error } = useGetMyDataQuery({ id: '123' }) + const [updateData] = useUpdateMyDataMutation() + + return ( +
+ {isLoading && } + {error && {error.message}} + {data &&
{data.value}
} +
+ ) +} +``` + +### How to Add a New Component + +**1. Create component directory**: + +``` +src/components/MyComponent/ +β”œβ”€β”€ MyComponent.tsx +β”œβ”€β”€ MyComponent.module.css +β”œβ”€β”€ MyComponent.stories.tsx +β”œβ”€β”€ MyComponent.test.tsx (optional) +└── index.ts +``` + +**2. Component file**: + +```typescript +// MyComponent.tsx +import React from 'react' +import { Flex, Text } from '@radix-ui/themes' +import styles from './MyComponent.module.css' + +export interface MyComponentProps { + title: string + onAction?: () => void +} + +export function MyComponent({ title, onAction }: MyComponentProps) { + return ( + + {title} + {onAction && ( + + )} + + ) +} +``` + +**3. CSS Module**: + +```css +/* MyComponent.module.css */ +.container { + padding: var(--space-3); + border-radius: var(--radius-2); + background: var(--color-surface); +} + +.button { + padding: var(--space-2) var(--space-3); + border: 1px solid var(--gray-6); + border-radius: var(--radius-2); + background: var(--accent-3); + color: var(--accent-11); + cursor: pointer; +} + +.button:hover { + background: var(--accent-4); +} +``` + +**4. Storybook story**: + +```typescript +// MyComponent.stories.tsx +import type { Meta, StoryObj } from "@storybook/react"; +import { MyComponent } from "./MyComponent"; + +const meta: Meta = { + title: "Components/MyComponent", + component: MyComponent, + tags: ["autodocs"], +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + args: { + title: "Example Title", + }, +}; + +export const WithAction: Story = { + args: { + title: "Clickable", + onAction: () => alert("Clicked!"), + }, +}; +``` + +**5. Index file**: + +```typescript +// index.ts +export { MyComponent } from "./MyComponent"; +export type { MyComponentProps } from "./MyComponent"; +``` + +### How to Add a New Hook + +**1. Create hook file**: + +```typescript +// src/hooks/useMyHook.ts +import { useState, useEffect } from "react"; +import { useAppSelector } from "./useAppSelector"; + +export function useMyHook(param: string) { + const [result, setResult] = useState(null); + const config = useAppSelector((state) => state.config); + + useEffect(() => { + // Hook logic here + const value = processParam(param, config); + setResult(value); + }, [param, config]); + + return result; +} +``` + +**2. Export from index**: + +```typescript +// src/hooks/index.ts +export * from "./useMyHook"; +``` + +**3. Use in components**: + +```typescript +import { useMyHook } from '@/hooks' + +function MyComponent() { + const result = useMyHook('input') + return
{result}
+} +``` + +### Project Conventions + +**File naming**: + +- Components: `PascalCase.tsx` +- Hooks: `useCamelCase.ts` +- Utilities: `camelCase.ts` +- Types: `PascalCase.ts` or `types.ts` +- CSS Modules: `PascalCase.module.css` + +**Import order**: + +1. React imports +2. Third-party imports +3. Internal imports (features, components, hooks) +4. Types +5. Styles + +**TypeScript**: + +- Always use types/interfaces (no `any`) +- Prefer `type` over `interface` (unless extending) +- Export types from same file as implementation + +**Testing**: + +- Test files next to implementation: `MyComponent.test.tsx` +- Use `describe` blocks for grouping +- Mock external dependencies with MSW + +--- + +## Testing + +### Testing Stack + +- **Framework**: Vitest 3.1 +- **React Testing**: React Testing Library 16.0 +- **Mocking**: MSW 2.3 (Mock Service Worker) +- **Environment**: happy-dom (lightweight DOM) +- **Coverage**: Vitest coverage-v8 + +### Test Setup + +**Global setup**: `src/utils/test-setup.ts` + +```typescript +import { beforeAll, afterEach, vi } from "vitest"; +import { cleanup } from "@testing-library/react"; + +beforeAll(() => { + // Stub browser APIs + stubResizeObserver(); + stubIntersectionObserver(); + Element.prototype.scrollIntoView = vi.fn(); + + // Mock localStorage + global.localStorage = { + getItem: vi.fn(() => null), + setItem: vi.fn(), + removeItem: vi.fn(), + clear: vi.fn(), + key: vi.fn(() => null), + length: 0, + }; +}); + +afterEach(() => { + cleanup(); // Clean up React components +}); + +// Mock lottie animations +vi.mock("lottie-react", () => ({ + default: vi.fn(), + useLottie: vi.fn(() => ({ + View: React.createElement("div"), + playSegments: vi.fn(), + })), +})); +``` + +### Custom Render Function + +**Location**: `src/utils/test-utils.tsx` + +```typescript +import { render as rtlRender } from '@testing-library/react' +import { Provider } from 'react-redux' +import { setUpStore } from '../app/store' + +function customRender( + ui: ReactElement, + { + preloadedState, + store = setUpStore(preloadedState), + ...renderOptions + }: ExtendedRenderOptions = {} +) { + const user = userEvent.setup() + + function Wrapper({ children }: PropsWithChildren) { + return ( + + + + + {children} + + + + + ) + } + + return { + ...rtlRender(ui, { wrapper: Wrapper, ...renderOptions }), + store, + user + } +} + +export { customRender as render } +export * from '@testing-library/react' +``` + +**Usage**: + +```typescript +import { render, screen, waitFor } from '@/utils/test-utils' + +test('renders chat', () => { + render(, { + preloadedState: { + chat: { thread: { messages: [] } } + } + }) + expect(screen.getByText('Chat')).toBeInTheDocument() +}) +``` + +### MSW Setup + +**Worker**: `public/mockServiceWorker.js` (generated by MSW) + +**Handlers**: `src/__fixtures__/msw.ts` + +```typescript +import { setupServer } from "msw/node"; +import { http, HttpResponse } from "msw"; + +export const handlers = [ + http.get("http://127.0.0.1:8001/v1/caps", () => { + return HttpResponse.json({ + chat_default_model: "gpt-4", + chat_models: { + "gpt-4": { n_ctx: 8192 }, + }, + }); + }), + + http.post("http://127.0.0.1:8001/v1/chat", async ({ request }) => { + const body = await request.json(); + // Return streaming response + const stream = new ReadableStream({ + start(controller) { + controller.enqueue( + new TextEncoder().encode('data: {"choices":[...]}\n\n'), + ); + controller.enqueue(new TextEncoder().encode("data: [DONE]\n\n")); + controller.close(); + }, + }); + return new HttpResponse(stream, { + headers: { "Content-Type": "text/event-stream" }, + }); + }), +]; + +export const server = setupServer(...handlers); + +// Start server before tests +beforeAll(() => server.listen()); +afterEach(() => server.resetHandlers()); +afterAll(() => server.close()); +``` + +### Fixtures + +**Location**: `src/__fixtures__/` + +**20+ fixture files** for test data: + +```typescript +// caps.ts +export const STUB_CAPS_RESPONSE = { + chat_default_model: "gpt-4", + chat_models: { + /* ... */ + }, +}; + +// chat.ts +export const STUB_CHAT_MESSAGES = [ + { role: "user", content: "Hello" }, + { role: "assistant", content: "Hi there!" }, +]; + +// tools_response.ts +export const STUB_TOOL_CALL = { + id: "call_123", + function: { name: "shell", arguments: '{"cmd":"ls"}' }, +}; +``` + +### Example Tests + +**Component test**: + +```typescript +// ChatForm.test.tsx +import { render, screen, waitFor } from '@/utils/test-utils' +import { ChatForm } from './ChatForm' + +describe('ChatForm', () => { + test('sends message on submit', async () => { + const { user } = render() + + const input = screen.getByRole('textbox') + await user.type(input, 'Hello AI') + + const button = screen.getByRole('button', { name: /send/i }) + await user.click(button) + + await waitFor(() => { + expect(screen.getByText('Sending...')).toBeInTheDocument() + }) + }) + + test('disables send when empty', () => { + render() + const button = screen.getByRole('button', { name: /send/i }) + expect(button).toBeDisabled() + }) +}) +``` + +**Hook test**: + +```typescript +// useSendChatRequest.test.ts +import { renderHook, waitFor } from "@testing-library/react"; +import { useSendChatRequest } from "./useSendChatRequest"; + +test("submit sends message", async () => { + const { result } = renderHook(() => useSendChatRequest()); + + act(() => { + result.current.submit({ question: "Test" }); + }); + + await waitFor(() => { + expect(result.current.isWaiting).toBe(true); + }); +}); +``` + +### Running Tests + +```bash +# Watch mode (default) +npm test + +# Run once (CI) +npm run test:no-watch + +# Coverage report +npm run coverage + +# UI mode (visual test runner) +npm run test:ui +``` + +### Storybook as Dev Tool + +**Storybook** serves as visual component documentation: + +```bash +npm run storybook # Start on :6006 +``` + +**30+ stories** across components, showcasing: + +- Different states (loading, error, success) +- Edge cases (empty, long text, special chars) +- Interactive controls (change props live) + +**Stories use MSW** for API mocking: + +```typescript +// ChatContent.stories.tsx +export const Streaming: Story = { + parameters: { + msw: { + handlers: [ + http.post('/v1/chat', () => /* streaming response */) + ] + } + } +} +``` + +--- + +## Debugging + +### Debug Mode + +**Enable logging**: + +```bash +DEBUG=refact,app,integrations npm run dev +``` + +**Debug namespaces**: + +- `refact` - Core chat logic +- `app` - Application lifecycle +- `integrations` - Integration system +- `*` - Everything + +**Location**: `src/debugConfig.ts` + +```typescript +import debug from "debug"; + +export const debugRefact = debug("refact"); +export const debugApp = debug("app"); +export const debugIntegrations = debug("integrations"); + +// Usage in code: +debugRefact("Sending message: %O", message); +``` + +### Redux DevTools + +**Auto-enabled in development**: + +```typescript +const store = configureStore({ + reducer: rootReducer, + middleware: /* ... */, + devTools: process.env.NODE_ENV !== 'production' // ← Auto-enabled +}) +``` + +**Features**: + +- Time-travel debugging +- Action replay +- State diff viewer +- Performance monitoring + +**Max actions**: 50 (configured in store) + +### Console Logging Patterns + +**Guarded logs** (most of codebase): + +```typescript +if (process.env.NODE_ENV === "development") { + console.log("Debug info:", data); +} +``` + +**Production logs** (errors only): + +```typescript +console.error("Critical error:", error); +``` + +**~5% of code has console.log** - minimal logging philosophy + +### Telemetry + +**Location**: `src/services/refact/telemetry.ts` + +**What's tracked**: + +```typescript +telemetryApi.useSendTelemetryChatEventMutation() + +// Events tracked: +{ + scope: 'replaceSelection' | 'ideOpenFile/customization.yaml' | 'copyToClipboard', + success: boolean, + error_message: string +} +``` + +**Telemetry is opt-in** (configured in LSP server) + +### Common Issues & Solutions + +#### Issue: Messages not sending + +**Triage**: + +```typescript +// Check these selectors in Redux DevTools: +state.chat.prevent_send; // Should be false +state.chat.waiting_for_response; // Should be false when idle +state.chat.streaming; // Should be false when idle +state.confirmation.pauseReasons; // Should be empty [] +``` + +**Fix**: + +- If `prevent_send: true` β†’ Click "Retry" or start new chat +- If paused β†’ Check ToolConfirmation popup, confirm or reject +- If streaming stuck β†’ Reload app + +#### Issue: Tool confirmation stuck + +**Triage**: + +```typescript +state.confirmation.pauseReasons; // What's blocking? +state.confirmation.wasInteracted; // Did user interact? +``` + +**Fix**: + +- Check if IDE sent `ideToolCallResponse` +- Check middleware listener is running +- Confirm/reject manually in UI + +#### Issue: Streaming stopped mid-response + +**Triage**: + +- Check browser console for errors +- Check Network tab for aborted requests +- Check if `doneStreaming` was called prematurely + +**Fix**: + +- LSP server issue (restart LSP) +- Network interruption (retry) +- Check abort controller logic + +#### Issue: Dark mode not working + +**Triage**: + +```typescript +state.config.themeProps.appearance; // What's set? +document.body.className; // Should be 'vscode-dark' or 'vscode-light' +``` + +**Fix**: + +- Check middleware listener for appearance changes +- Verify Radix Theme is wrapping app +- Check if host is controlling theme + +#### Issue: postMessage not working + +**Triage**: + +```typescript +state.config.host; // Should match actual host +window.acquireVsCodeApi; // Exists in VSCode? +window.postIntellijMessage; // Exists in JetBrains? +``` + +**Fix**: + +- Verify host type is correct +- Check IDE extension is sending messages +- Check event listeners are attached + +### Performance Debugging + +**React DevTools Profiler**: + +- Record chat interaction +- Look for long renders (>16ms) +- Check component re-render count + +**Common bottlenecks**: + +- Large message arrays (use selectors, not direct state) +- Markdown rendering (memoize with React.memo) +- Recursive renderMessages (optimize with useCallback) + +### Network Debugging + +**Check requests in Network tab**: + +| Endpoint | Expected Response | Check | +| ----------- | ----------------- | --------------------------- | +| `/v1/caps` | JSON | 200 OK | +| `/v1/chat` | SSE stream | 200 OK, `text/event-stream` | +| `/v1/tools` | JSON | 200 OK | + +**Common issues**: + +- CORS errors β†’ LSP server not running +- 401 Unauthorized β†’ Check `state.config.apiKey` +- Connection refused β†’ Wrong LSP port + +### Debug Checklist + +When investigating issues: + +- [ ] Check Redux state in DevTools +- [ ] Check browser console for errors +- [ ] Check Network tab for failed requests +- [ ] Enable DEBUG logging +- [ ] Check LSP server is running (`:8001/v1/ping`) +- [ ] Verify host type matches environment +- [ ] Check middleware listeners are registered +- [ ] Review recent actions in Redux timeline +- [ ] Check for pause reasons blocking flow +- [ ] Verify messages array structure + +--- + +## Special Features + +### Checkpoints System + +**Purpose**: Rollback workspace to previous state (undo AI code changes) + +**Location**: `src/features/Checkpoints/` + +**How it works**: + +``` +User message β†’ AI makes changes β†’ Checkpoint created + ↓ + {workspace_folder, commit_hash} + ↓ + Attached to user message + ↓ + User clicks πŸ”„ Reset button + ↓ + Preview changes (API call) + ↓ + Apply rollback (API call) + ↓ + Files reverted + chat truncated +``` + +**API Endpoints**: + +```typescript +// Preview what will change +POST /v1/preview_checkpoints +{ + "checkpoints": [ + { "workspace_folder": "/path", "commit_hash": "abc123" } + ] +} +// Returns: { files: [{file_name, status: 'A'|'M'|'D'}], error_log: string } + +// Apply rollback +POST /v1/restore_checkpoints +{ + "checkpoints": [/* same */] +} +// Returns: { success: boolean, error_log?: string } +``` + +**UI Components**: + +- `CheckpointButton` - Per-message reset button +- `Checkpoints` modal - Shows file changes before apply +- `CheckpointsStatusIndicator` - Visual feedback + +**State**: + +```typescript +state.checkpoints = { + previewData: { files: [...], error_log: '' } | null, + restoreInProgress: boolean +} +``` + +**After restore**: + +- Chat history truncates to checkpoint message +- OR starts new chat with context +- IDE reloads affected files (JetBrains auto-refresh) + +### Docker Integration + +**Purpose**: Manage Docker containers from chat UI + +**Location**: `src/components/IntegrationsView/IntegrationDocker/` + +**Features**: + +- List containers by image/label +- Start/Stop/Kill/Remove actions +- View environment variables +- SmartLinks for AI context + +**API**: + +```typescript +// List containers +POST /v1/docker-container-list +{ "docker_image_name": "postgres", "docker_container_labels": ["app=myapp"] } +// Returns: { containers: [{ id, name, status, ports, env, ... }] } + +// Execute action +POST /v1/docker-container-action +{ "container_id": "abc123", "action": "start" } +// Returns: { success: boolean, message: string } +``` + +**UI**: + +- `DockerContainerCard` - Shows container details +- Actions dropdown: Start, Stop, Kill, Remove +- Env vars collapsible +- SmartLinks feed container info to AI + +**Use case**: AI can reference containers in responses, user manages from UI + +### Compression Hints + +**Purpose**: Alert user when context is too large + +**Indicator**: πŸ—œοΈ icon on user messages + +**Detection**: LSP returns `compression_strength` in response: + +```typescript +type CompressionStrength = "absent" | "weak" | "strong"; +``` + +**When shown**: + +- `weak` - Context approaching limit +- `strong` - Context exceeds recommended size + +**Action**: + +- Show "Start New Chat" suggestion +- User can reject or accept suggestion + +**State**: + +```typescript +thread.new_chat_suggested = { + wasSuggested: boolean, + wasRejectedByUser?: boolean +} +``` + +### Memory System (Context Files) + +**Feature**: AI can remember information across chats + +**Indicator**: πŸ—ƒοΈ icon on messages + +**How it works**: + +1. AI calls `remember_how_to_use_tools()` +2. Notes saved to vector DB +3. Relevant notes attached to future messages +4. Shows as `context_file` messages + +**Message type**: + +```typescript +type ContextFileMessage = { + role: "context_file"; + content: ChatContextFile[]; +}; + +type ChatContextFile = { + file_name: string; + file_content: string; + line1: number; + line2: number; +}; +``` + +**Rendering**: ContextFiles component shows attached files + +### Queued Messages + +**Purpose**: Send multiple messages while AI is responding + +**How it works**: + +- User sends message while streaming β†’ Message queued +- Queue has priority levels: + - `priority: true` - Send immediately after current stream + - `priority: false` - Send after tools complete + +**State**: + +```typescript +type QueuedUserMessage = { + id: string + message: UserMessage + createdAt: number + priority?: boolean +} + +state.chat.queued_messages: QueuedUserMessage[] +``` + +**Auto-flush** handled by `useAutoSend()` hook + +**Visual**: QueuedMessage component shows pending messages + +### Multi-Modal Support + +**Images in user messages**: + +```typescript +{ + role: 'user', + content: [ + { type: 'text', text: 'What's in this image?' }, + { type: 'image_url', image_url: { url: 'data:image/png;base64,...' } } + ] +} +``` + +**Images in tool results**: + +```typescript +{ + role: 'tool', + content: [ + { type: 'image_url', image_url: { url: 'http://...' } } + ] +} +``` + +**UI**: `DialogImage` component for lightbox view + +### Smart Links + +**Purpose**: Context-aware actions in chat + +**Format**: Special markdown links + +```markdown +[πŸ”— Open file.py:42](smartlink://open?file=file.py&line=42) +``` + +**Rendered by**: `SmartLink` component + +**Actions**: + +- Open file at line +- Run command +- Navigate to integration +- Apply configuration + +### Usage Tracking + +**Shows in UI**: Token counts, cost estimates + +**Data sources**: + +```typescript +message.usage = { + prompt_tokens: number, + completion_tokens: number, + total_tokens: number, + cache_read_input_tokens?: number, + cache_creation_input_tokens?: number +} + +// Metering (coins for SmallCloud) +message.metering_balance?: number +message.metering_*_tokens_n?: number +message.metering_coins_*?: number +``` + +**Component**: `UsageCounter` - Shows breakdown of token usage + +### Reasoning Content + +**Feature**: Separate field for model's reasoning (Claude, o1, etc.) + +**Format**: + +```typescript +{ + role: 'assistant', + content: 'Here's my answer', // Main response + reasoning_content: 'First I thought...' // Reasoning (hidden by default) +} +``` + +**UI**: `ReasoningContent` component - Collapsible section + +### Thinking Blocks + +**Feature**: Structured reasoning blocks (different from reasoning_content) + +```typescript +type ThinkingBlock = { + thinking: string; // Reasoning text + signature?: string; // Model signature/metadata +}; + +message.thinking_blocks = [{ thinking: "...", signature: "..." }]; +``` + +**Rendered in**: AssistantInput (collapsible) + +--- + +## Quick Reference + +### File Structure Cheat Sheet + +``` +src/ +β”œβ”€β”€ app/ # Redux store, middleware, storage +β”œβ”€β”€ components/ # Reusable UI (40+ components) +β”œβ”€β”€ features/ # Redux slices + feature UIs (25+ features) +β”œβ”€β”€ hooks/ # Custom hooks (60+) +β”œβ”€β”€ services/ # API definitions (refact + smallcloud) +β”œβ”€β”€ events/ # IDE integration types +β”œβ”€β”€ lib/ # Library entry + render function +β”œβ”€β”€ utils/ # Utility functions +β”œβ”€β”€ __fixtures__/ # Test data (20+ files) +└── debugConfig.ts # Debug namespaces +``` + +### Key Commands + +```bash +# Development +npm ci # Install deps +npm run dev # Dev server +npm run build # Build library +npm test # Run tests +npm run storybook # Component explorer +npm run lint # Lint code +npm run types # Type check +DEBUG=* npm run dev # Debug mode + +# Publishing +npm run alpha:version # Bump alpha version +npm run alpha:publish # Publish to npm +``` + +### Important Patterns + +**Redux**: + +- Use selectors (don't access state directly) +- Use RTK Query for APIs +- Use listeners for cross-cutting concerns + +**Components**: + +- Use Radix primitives + CSS Modules +- Use design tokens (no magic numbers) +- Memoize expensive renders + +**Hooks**: + +- Export from `hooks/index.ts` +- Use `useAppSelector`/`useAppDispatch` wrappers +- Follow `use` prefix convention + +**Types**: + +- Use type guards for message routing +- Export types with implementation +- Strict TypeScript mode (no `any`) + +### Critical State Invariants + +```typescript +// Chat can send if ALL true: +!state.chat.prevent_send +!state.chat.waiting_for_response +!state.chat.streaming +!selectHasUncalledTools(state) +state.confirmation.pauseReasons.length === 0 + +// Tool confirmation needed if: +lastMessage.tool_calls exists +!wasInteracted +!(isPatchLike && automatic_patch) + +// Queue flushes when: +// Priority: base conditions (no streaming, no waiting) +// Regular: base + no tools + no pause reasons +``` + +### Common Gotchas + +1. **Don't mutate state** - Redux Toolkit allows in reducers, but not elsewhere +2. **Don't skip selectors** - Always use memoized selectors +3. **Don't bypass type guards** - Use `isAssistantMessage()` etc. +4. **Don't hardcode colors/spacing** - Use Radix tokens +5. **Don't forget to register** - New slices/APIs must be registered in store +6. **Don't block the UI** - Use abort controllers for cancellable requests +7. **Don't trust streaming order** - Handle out-of-order chunks +8. **Don't forget pause reasons** - Tool confirmation can block everything + +### Debugging Quick Wins + +```typescript +// Check state in console: +window.__REDUX_DEVTOOLS_EXTENSION__; + +// Force re-render: +dispatch(newChatAction()); + +// Clear pause: +dispatch( + clearPauseReasonsAndHandleToolsStatus({ + wasInteracted: false, + confirmationStatus: true, + }), +); + +// Reset prevent_send: +dispatch(enableSend({ id: chatId })); + +// Check LSP health: +fetch("http://127.0.0.1:8001/v1/ping").then((r) => r.json()); +``` + +--- + +## For AI Coding Agents + +### When Modifying Message Flow + +**MUST CHECK**: + +1. State transitions (`waiting_for_response`, `streaming`, `prevent_send`) +2. Tool confirmation logic (don't break pause system) +3. Queue flush conditions (priority vs regular) +4. Abort handling (cleanup state properly) +5. Message formatting (use `formatChatResponse`) +6. Type guards (don't assume message structure) + +### When Adding Message Types + +**MUST DO**: + +1. Add type definition in `services/refact/types.ts` +2. Add type guard (`isMyMessage`) +3. Update `formatChatResponse` to handle it +4. Update `renderMessages` to render it +5. Create component for rendering +6. Update `formatMessagesForLsp` if needed for sending + +### When Touching Redux + +**MUST DO**: + +1. Use selectors (create if missing) +2. Use immutable updates (even though Immer allows mutations) +3. Add to `combineSlices` if new slice +4. Add middleware if new RTK Query API +5. Test state transitions + +### When Modifying UI + +**MUST DO**: + +1. Use Radix primitives where possible +2. Use CSS Modules (not inline styles) +3. Use design tokens (not literals) +4. Test dark mode +5. Check responsive (at least 768px) +6. Add Storybook story + +### Red Flags + +🚨 **STOP if you see**: + +- Direct state mutation outside reducers +- Hardcoded colors (#hex) or spacing (px) +- `any` types (use proper typing) +- Synchronous network calls (use async) +- Missing type guards for message routing +- Global CSS without `:global()` wrapper +- Missing cleanup in `useEffect` returns + +--- + +## Version History + +**Current**: v2.0.10-alpha.3 + +**Recent changes** (inferred from codebase): + +- Queued messages with priority system +- Compression hints and new chat suggestions +- Reasoning content support +- Tool confirmation improvements +- Docker integration enhancements +- Checkpoints UI polish + +--- + +## Contributing + +### Before Submitting PR + +- [ ] Run `npm run lint` (no errors) +- [ ] Run `npm run types` (type check passes) +- [ ] Run `npm test` (all tests pass) +- [ ] Add tests for new features +- [ ] Add Storybook story for new components +- [ ] Update AGENTS.md if architecture changes +- [ ] Follow existing code style +- [ ] No console.log in production code + +### Commit Messages + +Follow conventional commits: + +``` +feat: add queued messages +fix: prevent double-send on tool confirmation +refactor: extract streaming logic +docs: update AGENTS.md +test: add tool loop prevention test +``` + +--- + +## Getting Help + +**Resources**: + +- README.md - Library API reference +- Storybook - Component documentation (`:6006`) +- Redux DevTools - State inspection +- GitHub Issues - Bug reports + +**Community**: + +- GitHub: https://github.com/smallcloudai/refact +- Discord: (check README) + +--- + +**Last Updated**: December 2024 +**Document Version**: 1.0 +**Maintained by**: SmallCloudAI Team + +--- + +_This document is a living guide. If you find errors or omissions, please update it._ diff --git a/refact-agent/gui/generated/documents.ts b/refact-agent/gui/generated/documents.ts index 259a05771..c8c3f3f83 100644 --- a/refact-agent/gui/generated/documents.ts +++ b/refact-agent/gui/generated/documents.ts @@ -20,35 +20,7 @@ export type Scalars = { export type BasicStuffResult = { __typename?: 'BasicStuffResult'; fuser_id: Scalars['String']['output']; - fuser_psystem?: Maybe; - invitations?: Maybe>; - my_own_ws_id?: Maybe; - workspaces: Array; -}; - -export type EmailConfirmResult = { - __typename?: 'EmailConfirmResult'; - fuser_id: Scalars['String']['output']; -}; - -export type FApiKeyOutput = { - __typename?: 'FApiKeyOutput'; - apikey_archived_ts: Scalars['Float']['output']; - apikey_created_ts: Scalars['Float']['output']; - apikey_id: Scalars['String']['output']; - apikey_last4digits: Scalars['String']['output']; - full_key_shown_once?: Maybe; -}; - -export type FCloudTool = { - __typename?: 'FCloudTool'; - ctool_confirmed_exists_ts?: Maybe; - ctool_description: Scalars['String']['output']; - ctool_id: Scalars['String']['output']; - ctool_name: Scalars['String']['output']; - ctool_parameters: Scalars['JSON']['output']; - located_fgroup_id?: Maybe; - owner_fuser_id?: Maybe; + workspaces: Array; }; export type FExpertInput = { @@ -66,7 +38,6 @@ export type FExpertOutput = { __typename?: 'FExpertOutput'; fexp_allow_tools: Scalars['String']['output']; fexp_block_tools: Scalars['String']['output']; - fexp_id: Scalars['String']['output']; fexp_name: Scalars['String']['output']; fexp_python_kernel: Scalars['String']['output']; fexp_system_prompt: Scalars['String']['output']; @@ -138,9 +109,6 @@ export type FKnowledgeItemInput = { export type FKnowledgeItemOutput = { __typename?: 'FKnowledgeItemOutput'; iknow_created_ts: Scalars['Float']['output']; - iknow_embedding_error: Scalars['String']['output']; - iknow_embedding_started_ts: Scalars['Float']['output']; - iknow_embedding_status: Scalars['String']['output']; iknow_id: Scalars['String']['output']; iknow_is_core: Scalars['Boolean']['output']; iknow_memory: Scalars['String']['output']; @@ -170,15 +138,10 @@ export type FKnowledgeItemSubs = { news_pubsub: Scalars['String']['output']; }; -export type FMassInvitationOutput = { - __typename?: 'FMassInvitationOutput'; - fuser_id: Scalars['String']['output']; - result: Scalars['String']['output']; -}; - -export type FModelItem = { - __typename?: 'FModelItem'; - provm_name: Scalars['String']['output']; +export type FPermissionInput = { + fgroup_id: Scalars['String']['input']; + fuser_id: Scalars['String']['input']; + perm_role: Scalars['String']['input']; }; export type FPermissionOutput = { @@ -192,14 +155,6 @@ export type FPermissionPatch = { perm_role?: InputMaybe; }; -export type FPermissionSubs = { - __typename?: 'FPermissionSubs'; - news_action: Scalars['String']['output']; - news_payload?: Maybe; - news_payload_id: Scalars['String']['output']; - news_pubsub: Scalars['String']['output']; -}; - export type FPluginOutput = { __typename?: 'FPluginOutput'; plugin_name: Scalars['String']['output']; @@ -207,27 +162,6 @@ export type FPluginOutput = { plugin_version: Scalars['String']['output']; }; -export type FStatsAddInput = { - fgroup_id?: Scalars['String']['input']; - st_chart: Scalars['Int']['input']; - st_how_many: Scalars['Int']['input']; - st_involved_fexp_id?: Scalars['String']['input']; - st_involved_fuser_id?: Scalars['String']['input']; - st_involved_model?: Scalars['String']['input']; - st_thing: Scalars['String']['input']; - ws_id: Scalars['String']['input']; -}; - -export type FStatsOutput = { - __typename?: 'FStatsOutput'; - st_how_many: Scalars['Int']['output']; - st_involved_fexp_id?: Maybe; - st_involved_fuser_id?: Maybe; - st_involved_model?: Maybe; - st_timekey: Scalars['String']['output']; - ws_id: Scalars['String']['output']; -}; - export type FThreadDelta = { __typename?: 'FThreadDelta'; ftm_content: Scalars['JSON']['output']; @@ -239,7 +173,7 @@ export type FThreadInput = { ft_app_searchable?: Scalars['String']['input']; ft_app_specific?: Scalars['String']['input']; ft_error?: Scalars['String']['input']; - ft_fexp_id: Scalars['String']['input']; + ft_fexp_name: Scalars['String']['input']; ft_title: Scalars['String']['input']; ft_toolset?: Scalars['String']['input']; located_fgroup_id: Scalars['String']['input']; @@ -308,11 +242,9 @@ export type FThreadOutput = { ft_app_searchable: Scalars['String']['output']; ft_app_specific?: Maybe; ft_archived_ts: Scalars['Float']['output']; - ft_confirmation_request?: Maybe; - ft_confirmation_response?: Maybe; ft_created_ts: Scalars['Float']['output']; ft_error?: Maybe; - ft_fexp_id: Scalars['String']['output']; + ft_fexp_name: Scalars['String']['output']; ft_id: Scalars['String']['output']; ft_locked_by: Scalars['String']['output']; ft_need_assistant: Scalars['Int']['output']; @@ -332,8 +264,6 @@ export type FThreadPatch = { ft_app_searchable?: InputMaybe; ft_app_specific?: InputMaybe; ft_archived_ts?: InputMaybe; - ft_confirmation_request?: InputMaybe; - ft_confirmation_response?: InputMaybe; ft_error?: InputMaybe; ft_need_user?: InputMaybe; ft_title?: InputMaybe; @@ -351,41 +281,35 @@ export type FThreadSubs = { news_pubsub: Scalars['String']['output']; }; -export type FUserProfileOutput = { - __typename?: 'FUserProfileOutput'; - fuser_fullname: Scalars['String']['output']; - fuser_id: Scalars['String']['output']; -}; - -export type FUserProfilePatch = { - fuser_fullname?: InputMaybe; +export type FWorkspace = { + __typename?: 'FWorkspace'; + root_group_name: Scalars['String']['output']; + ws_created_ts: Scalars['Float']['output']; + ws_id: Scalars['String']['output']; + ws_owner_fuser_id: Scalars['String']['output']; + ws_root_group_id: Scalars['String']['output']; + ws_status: Scalars['String']['output']; }; -export type FWorkspaceCreateInput = { - ws_name: Scalars['String']['input']; +export type FWorkspaceInvitationInput = { + ws_id: Scalars['String']['input']; + wsi_email: Scalars['String']['input']; + wsi_invited_by_fuser_id: Scalars['String']['input']; + wsi_role: Scalars['String']['input']; }; export type FWorkspaceInvitationOutput = { __typename?: 'FWorkspaceInvitationOutput'; - group_name: Scalars['String']['output']; - wsi_fgroup_id: Scalars['String']['output']; - wsi_id: Scalars['String']['output']; - wsi_invite_fuser_id: Scalars['String']['output']; + ws_id: Scalars['String']['output']; + wsi_created_ts: Scalars['Float']['output']; + wsi_email: Scalars['String']['output']; wsi_invited_by_fuser_id: Scalars['String']['output']; wsi_role: Scalars['String']['output']; + wsi_token: Scalars['String']['output']; }; -export type FWorkspaceOutput = { - __typename?: 'FWorkspaceOutput'; - have_admin: Scalars['Boolean']['output']; - have_coins_enough: Scalars['Boolean']['output']; - have_coins_exactly: Scalars['Int']['output']; - root_group_name: Scalars['String']['output']; - ws_archived_ts: Scalars['Float']['output']; - ws_created_ts: Scalars['Float']['output']; - ws_id: Scalars['String']['output']; - ws_owner_fuser_id: Scalars['String']['output']; - ws_root_group_id: Scalars['String']['output']; +export type FWorkspaceInvitationPatch = { + wsi_role?: InputMaybe; }; export type FlexusGroup = { @@ -394,7 +318,6 @@ export type FlexusGroup = { fgroup_id: Scalars['String']['output']; fgroup_name: Scalars['String']['output']; fgroup_parent_id?: Maybe; - my_role?: Maybe; ws_id: Scalars['String']['output']; }; @@ -410,9 +333,6 @@ export type FlexusGroupPatch = { export type Mutation = { __typename?: 'Mutation'; - api_key_delete: Scalars['Boolean']['output']; - api_key_generate: FApiKeyOutput; - email_confirm: EmailConfirmResult; expert_create: FExpertOutput; expert_delete: Scalars['Boolean']['output']; expert_patch: FExpertOutput; @@ -422,51 +342,28 @@ export type Mutation = { group_create: FlexusGroup; group_delete: Scalars['String']['output']; group_patch: FlexusGroup; - invitation_accept: Scalars['Boolean']['output']; - invitation_create_multiple: Array; - invitation_delete: Scalars['Boolean']['output']; - invitation_reject: Scalars['Boolean']['output']; knowledge_item_create: FKnowledgeItemOutput; knowledge_item_delete: Scalars['Boolean']['output']; knowledge_item_mass_group_patch: Scalars['Int']['output']; knowledge_item_patch: FKnowledgeItemOutput; - password_change: Scalars['Boolean']['output']; + permission_create: FPermissionOutput; permission_delete: Scalars['Boolean']['output']; permission_patch: FPermissionOutput; - reset_password_execute: Scalars['Boolean']['output']; - reset_password_start: Scalars['Boolean']['output']; - session_open: Scalars['String']['output']; - session_renew: Scalars['String']['output']; stats_add: Scalars['Boolean']['output']; tech_support_activate: Scalars['Boolean']['output']; tech_support_set_config: Scalars['Boolean']['output']; - thread_clear_confirmation: Scalars['Boolean']['output']; thread_create: FThreadOutput; thread_delete: Scalars['Boolean']['output']; thread_lock: Scalars['Boolean']['output']; thread_mass_group_patch: Scalars['Int']['output']; + thread_message_create: FThreadMessageOutput; thread_messages_create_multiple: FThreadMessagesCreateResult; thread_patch: FThreadOutput; thread_provide_toolset: Scalars['Boolean']['output']; - thread_reset_error: Scalars['Boolean']['output']; - thread_reset_title: Scalars['Boolean']['output']; - thread_set_confirmation_request: Scalars['Boolean']['output']; - thread_set_confirmation_response: Scalars['Boolean']['output']; thread_unlock: Scalars['Boolean']['output']; - user_profile_patch: FUserProfileOutput; - user_register: Scalars['Boolean']['output']; - workspace_create: Scalars['String']['output']; - workspace_delete: Scalars['String']['output']; -}; - - -export type MutationApi_Key_DeleteArgs = { - apikey_id: Scalars['String']['input']; -}; - - -export type MutationEmail_ConfirmArgs = { - token: Scalars['String']['input']; + workspace_invitation_create: FWorkspaceInvitationOutput; + workspace_invitation_delete: Scalars['Boolean']['output']; + workspace_invitation_patch: FWorkspaceInvitationOutput; }; @@ -518,29 +415,6 @@ export type MutationGroup_PatchArgs = { }; -export type MutationInvitation_AcceptArgs = { - wsi_id: Scalars['String']['input']; -}; - - -export type MutationInvitation_Create_MultipleArgs = { - emails: Array; - fgroup_id: Scalars['String']['input']; - role: Scalars['String']['input']; -}; - - -export type MutationInvitation_DeleteArgs = { - wsi_fgroup_id: Scalars['String']['input']; - wsi_invite_fuser_id: Scalars['String']['input']; -}; - - -export type MutationInvitation_RejectArgs = { - wsi_id: Scalars['String']['input']; -}; - - export type MutationKnowledge_Item_CreateArgs = { input: FKnowledgeItemInput; }; @@ -563,9 +437,8 @@ export type MutationKnowledge_Item_PatchArgs = { }; -export type MutationPassword_ChangeArgs = { - new_password: Scalars['String']['input']; - old_password: Scalars['String']['input']; +export type MutationPermission_CreateArgs = { + input: FPermissionInput; }; @@ -582,25 +455,14 @@ export type MutationPermission_PatchArgs = { }; -export type MutationReset_Password_ExecuteArgs = { - new_password: Scalars['String']['input']; - token: Scalars['String']['input']; -}; - - -export type MutationReset_Password_StartArgs = { - username: Scalars['String']['input']; -}; - - -export type MutationSession_OpenArgs = { - password: Scalars['String']['input']; - username: Scalars['String']['input']; -}; - - export type MutationStats_AddArgs = { - records: Array; + st_how_many: Scalars['Int']['input']; + st_involved_expert?: Scalars['String']['input']; + st_involved_fuser_id?: Scalars['String']['input']; + st_involved_model?: Scalars['String']['input']; + st_thing: Scalars['String']['input']; + ts: Scalars['Float']['input']; + ws_id: Scalars['String']['input']; }; @@ -615,11 +477,6 @@ export type MutationTech_Support_Set_ConfigArgs = { }; -export type MutationThread_Clear_ConfirmationArgs = { - ft_id: Scalars['String']['input']; -}; - - export type MutationThread_CreateArgs = { input: FThreadInput; }; @@ -642,6 +499,11 @@ export type MutationThread_Mass_Group_PatchArgs = { }; +export type MutationThread_Message_CreateArgs = { + input: FThreadMessageInput; +}; + + export type MutationThread_Messages_Create_MultipleArgs = { input: FThreadMultipleMessagesInput; }; @@ -659,113 +521,53 @@ export type MutationThread_Provide_ToolsetArgs = { }; -export type MutationThread_Reset_ErrorArgs = { - ft_error: Scalars['String']['input']; - ft_id: Scalars['String']['input']; -}; - - -export type MutationThread_Reset_TitleArgs = { - ft_id: Scalars['String']['input']; - ft_title: Scalars['String']['input']; -}; - - -export type MutationThread_Set_Confirmation_RequestArgs = { - confirmation_request: Scalars['String']['input']; - ft_id: Scalars['String']['input']; -}; - - -export type MutationThread_Set_Confirmation_ResponseArgs = { - confirmation_response: Scalars['String']['input']; - ft_id: Scalars['String']['input']; -}; - - export type MutationThread_UnlockArgs = { ft_id: Scalars['String']['input']; worker_name: Scalars['String']['input']; }; -export type MutationUser_Profile_PatchArgs = { - patch: FUserProfilePatch; +export type MutationWorkspace_Invitation_CreateArgs = { + input: FWorkspaceInvitationInput; }; -export type MutationUser_RegisterArgs = { - input: RegisterInput; -}; - - -export type MutationWorkspace_CreateArgs = { - input: FWorkspaceCreateInput; +export type MutationWorkspace_Invitation_DeleteArgs = { + ws_id: Scalars['String']['input']; + wsi_email: Scalars['String']['input']; }; -export type MutationWorkspace_DeleteArgs = { - dry_run?: Scalars['Boolean']['input']; +export type MutationWorkspace_Invitation_PatchArgs = { + patch: FWorkspaceInvitationPatch; ws_id: Scalars['String']['input']; -}; - -export type PasswordResetTokenInfo = { - __typename?: 'PasswordResetTokenInfo'; - freset_used: Scalars['Boolean']['output']; - fuser_id: Scalars['String']['output']; + wsi_email: Scalars['String']['input']; }; export type Query = { __typename?: 'Query'; - api_key_list: Array; - cloud_tools_list: Array; - coins_how_much_I_have: Scalars['Int']['output']; - expert_choice_consequences: Array; expert_get: FExpertOutput; expert_list: Array; experts_effective_list: Array; external_data_source_get: FExternalDataSourceOutput; external_data_source_list: Array; - group_get: FlexusGroup; - group_list_for_workspace: Array; - invitation_list: Array; - knowledge_get_cores: Array; knowledge_item_get: FKnowledgeItemOutput; knowledge_item_list: Array; - knowledge_vecdb_search: Array; + permission_get: FPermissionOutput; permission_list: Array; plugins_installed: Array; query_basic_stuff: BasicStuffResult; - reset_password_token_info: PasswordResetTokenInfo; - stats_query: Array; - stats_query_distinct: StatsDistinctOutput; tech_support_get_config?: Maybe; thread_get: FThreadOutput; thread_list: Array; thread_messages_list: Array; threads_app_captured: Array; - user_profile_get: FUserProfileOutput; + workspace_invitation_get: FWorkspaceInvitationOutput; + workspace_invitation_list: Array; workspace_permission_list: Array; }; -export type QueryCloud_Tools_ListArgs = { - include_offline?: Scalars['Boolean']['input']; - located_fgroup_id: Scalars['String']['input']; -}; - - -export type QueryCoins_How_Much_I_HaveArgs = { - ws_id: Scalars['String']['input']; -}; - - -export type QueryExpert_Choice_ConsequencesArgs = { - fexp_id: Scalars['String']['input']; - inside_fgroup_id: Scalars['String']['input']; -}; - - export type QueryExpert_GetArgs = { id: Scalars['String']['input']; }; @@ -797,26 +599,6 @@ export type QueryExternal_Data_Source_ListArgs = { }; -export type QueryGroup_GetArgs = { - fgroup_id: Scalars['String']['input']; -}; - - -export type QueryGroup_List_For_WorkspaceArgs = { - ws_id: Scalars['String']['input']; -}; - - -export type QueryInvitation_ListArgs = { - wsi_fgroup_id: Scalars['String']['input']; -}; - - -export type QueryKnowledge_Get_CoresArgs = { - fgroup_id: Scalars['String']['input']; -}; - - export type QueryKnowledge_Item_GetArgs = { id: Scalars['String']['input']; }; @@ -830,10 +612,9 @@ export type QueryKnowledge_Item_ListArgs = { }; -export type QueryKnowledge_Vecdb_SearchArgs = { +export type QueryPermission_GetArgs = { fgroup_id: Scalars['String']['input']; - q: Scalars['String']['input']; - top_n?: Scalars['Int']['input']; + fuser_id: Scalars['String']['input']; }; @@ -842,46 +623,6 @@ export type QueryPermission_ListArgs = { }; -export type QueryQuery_Basic_StuffArgs = { - want_invitations?: Scalars['Boolean']['input']; -}; - - -export type QueryReset_Password_Token_InfoArgs = { - token: Scalars['String']['input']; -}; - - -export type QueryStats_QueryArgs = { - breakdown_fexp_name: Scalars['Boolean']['input']; - breakdown_fuser_id: Scalars['Boolean']['input']; - breakdown_model: Scalars['Boolean']['input']; - fgroup_id?: Scalars['String']['input']; - filter_fexp_id?: Array; - filter_fuser_id?: Array; - filter_model?: Array; - filter_thing?: Array; - st_chart: Scalars['Int']['input']; - st_span: Scalars['String']['input']; - timekey_from: Scalars['String']['input']; - timekey_to: Scalars['String']['input']; - ws_id?: Scalars['String']['input']; -}; - - -export type QueryStats_Query_DistinctArgs = { - fgroup_id?: Scalars['String']['input']; - filter_fexp_id: Array; - filter_fuser_id: Array; - filter_model: Array; - st_chart: Scalars['Int']['input']; - st_span: Scalars['String']['input']; - timekey_from: Scalars['String']['input']; - timekey_to: Scalars['String']['input']; - ws_id: Scalars['String']['input']; -}; - - export type QueryTech_Support_Get_ConfigArgs = { ws_id: Scalars['String']['input']; }; @@ -913,23 +654,19 @@ export type QueryThreads_App_CapturedArgs = { }; -export type QueryWorkspace_Permission_ListArgs = { +export type QueryWorkspace_Invitation_GetArgs = { ws_id: Scalars['String']['input']; + wsi_email: Scalars['String']['input']; }; -export type RegisterInput = { - fullname: Scalars['String']['input']; - password: Scalars['String']['input']; - username: Scalars['String']['input']; + +export type QueryWorkspace_Invitation_ListArgs = { + ws_id: Scalars['String']['input']; }; -export type StatsDistinctOutput = { - __typename?: 'StatsDistinctOutput'; - st_chart: Scalars['Int']['output']; - st_involved_fexp_id: Array; - st_involved_fuser_id: Array; - st_involved_model: Array; - st_thing: Array; + +export type QueryWorkspace_Permission_ListArgs = { + ws_id: Scalars['String']['input']; }; export type Subscription = { @@ -938,7 +675,6 @@ export type Subscription = { experts_in_group: FExpertSubs; external_data_sources_in_group: FExternalDataSourceSubs; knowledge_items_in_group: FKnowledgeItemSubs; - permissions_in_group_subs: FPermissionSubs; threads_in_group: FThreadSubs; tree_subscription: TreeUpdateSubs; }; @@ -951,41 +687,30 @@ export type SubscriptionComprehensive_Thread_SubsArgs = { export type SubscriptionExperts_In_GroupArgs = { - filter?: Array; limit?: Scalars['Int']['input']; located_fgroup_id: Scalars['String']['input']; - sort_by?: Array; + sort_by?: Scalars['String']['input']; }; export type SubscriptionExternal_Data_Sources_In_GroupArgs = { - filter?: Array; limit?: Scalars['Int']['input']; located_fgroup_id: Scalars['String']['input']; - sort_by?: Array; + sort_by?: Scalars['String']['input']; }; export type SubscriptionKnowledge_Items_In_GroupArgs = { - filter?: Array; limit?: Scalars['Int']['input']; located_fgroup_id: Scalars['String']['input']; - sort_by?: Array; -}; - - -export type SubscriptionPermissions_In_Group_SubsArgs = { - fgroup_id: Scalars['String']['input']; - limit: Scalars['Int']['input']; - quicksearch: Scalars['String']['input']; + sort_by?: Scalars['String']['input']; }; export type SubscriptionThreads_In_GroupArgs = { - filter?: Array; limit?: Scalars['Int']['input']; located_fgroup_id: Scalars['String']['input']; - sort_by?: Array; + sort_by?: Scalars['String']['input']; }; @@ -1015,8 +740,6 @@ export type TreeUpdateSubs = { treeupd_action: Scalars['String']['output']; treeupd_id: Scalars['String']['output']; treeupd_path: Scalars['String']['output']; - treeupd_role?: Maybe; - treeupd_tag: Scalars['String']['output']; treeupd_title: Scalars['String']['output']; treeupd_type: Scalars['String']['output']; }; @@ -1039,12 +762,12 @@ export type NavTreeSubsSubscription = { __typename?: 'Subscription', tree_subscr export type NavTreeWantWorkspacesQueryVariables = Exact<{ [key: string]: never; }>; -export type NavTreeWantWorkspacesQuery = { __typename?: 'Query', query_basic_stuff: { __typename?: 'BasicStuffResult', fuser_id: string, my_own_ws_id?: string | null, workspaces: Array<{ __typename?: 'FWorkspaceOutput', ws_id: string, ws_owner_fuser_id: string, ws_root_group_id: string, root_group_name: string, have_coins_exactly: number, have_coins_enough: boolean, have_admin: boolean }> } }; +export type NavTreeWantWorkspacesQuery = { __typename?: 'Query', query_basic_stuff: { __typename?: 'BasicStuffResult', fuser_id: string, workspaces: Array<{ __typename?: 'FWorkspace', ws_id: string, ws_owner_fuser_id: string, ws_root_group_id: string, root_group_name: string }> } }; export const CreateGroupDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateGroup"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"fgroup_name"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"fgroup_parent_id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"group_create"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"fgroup_name"},"value":{"kind":"Variable","name":{"kind":"Name","value":"fgroup_name"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"fgroup_parent_id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"fgroup_parent_id"}}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"fgroup_id"}},{"kind":"Field","name":{"kind":"Name","value":"fgroup_name"}},{"kind":"Field","name":{"kind":"Name","value":"ws_id"}},{"kind":"Field","name":{"kind":"Name","value":"fgroup_parent_id"}},{"kind":"Field","name":{"kind":"Name","value":"fgroup_created_ts"}}]}}]}}]} as unknown as DocumentNode; export const NavTreeSubsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"NavTreeSubs"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"ws_id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"tree_subscription"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"ws_id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"ws_id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"treeupd_action"}},{"kind":"Field","name":{"kind":"Name","value":"treeupd_id"}},{"kind":"Field","name":{"kind":"Name","value":"treeupd_path"}},{"kind":"Field","name":{"kind":"Name","value":"treeupd_type"}},{"kind":"Field","name":{"kind":"Name","value":"treeupd_title"}}]}}]}}]} as unknown as DocumentNode; -export const NavTreeWantWorkspacesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"NavTreeWantWorkspaces"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"query_basic_stuff"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"fuser_id"}},{"kind":"Field","name":{"kind":"Name","value":"my_own_ws_id"}},{"kind":"Field","name":{"kind":"Name","value":"workspaces"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"ws_id"}},{"kind":"Field","name":{"kind":"Name","value":"ws_owner_fuser_id"}},{"kind":"Field","name":{"kind":"Name","value":"ws_root_group_id"}},{"kind":"Field","name":{"kind":"Name","value":"root_group_name"}},{"kind":"Field","name":{"kind":"Name","value":"have_coins_exactly"}},{"kind":"Field","name":{"kind":"Name","value":"have_coins_enough"}},{"kind":"Field","name":{"kind":"Name","value":"have_admin"}}]}}]}}]}}]} as unknown as DocumentNode; +export const NavTreeWantWorkspacesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"NavTreeWantWorkspaces"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"query_basic_stuff"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"fuser_id"}},{"kind":"Field","name":{"kind":"Name","value":"workspaces"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"ws_id"}},{"kind":"Field","name":{"kind":"Name","value":"ws_owner_fuser_id"}},{"kind":"Field","name":{"kind":"Name","value":"ws_root_group_id"}},{"kind":"Field","name":{"kind":"Name","value":"root_group_name"}}]}}]}}]}}]} as unknown as DocumentNode; type Properties = Required<{ [K in keyof T]: z.ZodType; @@ -1117,22 +840,17 @@ export function FKnowledgeItemPatchSchema(): z.ZodObject> { +export function FPermissionInputSchema(): z.ZodObject> { return z.object({ - perm_role: z.string().nullish() + fgroup_id: z.string(), + fuser_id: z.string(), + perm_role: z.string() }) } -export function FStatsAddInputSchema(): z.ZodObject> { +export function FPermissionPatchSchema(): z.ZodObject> { return z.object({ - fgroup_id: z.string().default(""), - st_chart: z.number(), - st_how_many: z.number(), - st_involved_fexp_id: z.string().default(""), - st_involved_fuser_id: z.string().default(""), - st_involved_model: z.string().default(""), - st_thing: z.string(), - ws_id: z.string() + perm_role: z.string().nullish() }) } @@ -1142,7 +860,7 @@ export function FThreadInputSchema(): z.ZodObject> { ft_app_searchable: z.string().default(""), ft_app_specific: z.string().default("null"), ft_error: z.string().default("null"), - ft_fexp_id: z.string(), + ft_fexp_name: z.string(), ft_title: z.string(), ft_toolset: z.string().default("null"), located_fgroup_id: z.string(), @@ -1180,8 +898,6 @@ export function FThreadPatchSchema(): z.ZodObject> { ft_app_searchable: z.string().nullish(), ft_app_specific: z.string().nullish(), ft_archived_ts: z.number().nullish(), - ft_confirmation_request: z.string().nullish(), - ft_confirmation_response: z.string().nullish(), ft_error: z.string().nullish(), ft_need_user: z.number().nullish(), ft_title: z.string().nullish(), @@ -1192,15 +908,18 @@ export function FThreadPatchSchema(): z.ZodObject> { }) } -export function FUserProfilePatchSchema(): z.ZodObject> { +export function FWorkspaceInvitationInputSchema(): z.ZodObject> { return z.object({ - fuser_fullname: z.string().nullish() + ws_id: z.string(), + wsi_email: z.string(), + wsi_invited_by_fuser_id: z.string(), + wsi_role: z.string() }) } -export function FWorkspaceCreateInputSchema(): z.ZodObject> { +export function FWorkspaceInvitationPatchSchema(): z.ZodObject> { return z.object({ - ws_name: z.string() + wsi_role: z.string().nullish() }) } @@ -1218,14 +937,6 @@ export function FlexusGroupPatchSchema(): z.ZodObject> { - return z.object({ - fullname: z.string(), - password: z.string(), - username: z.string() - }) -} - export function TechSupportSettingsInputSchema(): z.ZodObject> { return z.object({ support_api_key: z.string(), diff --git a/refact-agent/gui/generated/graphql/gql.ts b/refact-agent/gui/generated/graphql/gql.ts index 72881cea3..8bd921f99 100644 --- a/refact-agent/gui/generated/graphql/gql.ts +++ b/refact-agent/gui/generated/graphql/gql.ts @@ -16,12 +16,12 @@ import type { TypedDocumentNode as DocumentNode } from '@graphql-typed-document- type Documents = { "mutation CreateGroup($fgroup_name: String!, $fgroup_parent_id: String!) {\n group_create(\n input: {fgroup_name: $fgroup_name, fgroup_parent_id: $fgroup_parent_id}\n ) {\n fgroup_id\n fgroup_name\n ws_id\n fgroup_parent_id\n fgroup_created_ts\n }\n}": typeof types.CreateGroupDocument, "subscription NavTreeSubs($ws_id: String!) {\n tree_subscription(ws_id: $ws_id) {\n treeupd_action\n treeupd_id\n treeupd_path\n treeupd_type\n treeupd_title\n }\n}": typeof types.NavTreeSubsDocument, - "query NavTreeWantWorkspaces {\n query_basic_stuff {\n fuser_id\n my_own_ws_id\n workspaces {\n ws_id\n ws_owner_fuser_id\n ws_root_group_id\n root_group_name\n have_coins_exactly\n have_coins_enough\n have_admin\n }\n }\n}": typeof types.NavTreeWantWorkspacesDocument, + "query NavTreeWantWorkspaces {\n query_basic_stuff {\n fuser_id\n workspaces {\n ws_id\n ws_owner_fuser_id\n ws_root_group_id\n root_group_name\n }\n }\n}": typeof types.NavTreeWantWorkspacesDocument, }; const documents: Documents = { "mutation CreateGroup($fgroup_name: String!, $fgroup_parent_id: String!) {\n group_create(\n input: {fgroup_name: $fgroup_name, fgroup_parent_id: $fgroup_parent_id}\n ) {\n fgroup_id\n fgroup_name\n ws_id\n fgroup_parent_id\n fgroup_created_ts\n }\n}": types.CreateGroupDocument, "subscription NavTreeSubs($ws_id: String!) {\n tree_subscription(ws_id: $ws_id) {\n treeupd_action\n treeupd_id\n treeupd_path\n treeupd_type\n treeupd_title\n }\n}": types.NavTreeSubsDocument, - "query NavTreeWantWorkspaces {\n query_basic_stuff {\n fuser_id\n my_own_ws_id\n workspaces {\n ws_id\n ws_owner_fuser_id\n ws_root_group_id\n root_group_name\n have_coins_exactly\n have_coins_enough\n have_admin\n }\n }\n}": types.NavTreeWantWorkspacesDocument, + "query NavTreeWantWorkspaces {\n query_basic_stuff {\n fuser_id\n workspaces {\n ws_id\n ws_owner_fuser_id\n ws_root_group_id\n root_group_name\n }\n }\n}": types.NavTreeWantWorkspacesDocument, }; /** @@ -49,7 +49,7 @@ export function graphql(source: "subscription NavTreeSubs($ws_id: String!) {\n /** * The graphql function is used to parse GraphQL queries into a document that can be used by GraphQL clients. */ -export function graphql(source: "query NavTreeWantWorkspaces {\n query_basic_stuff {\n fuser_id\n my_own_ws_id\n workspaces {\n ws_id\n ws_owner_fuser_id\n ws_root_group_id\n root_group_name\n have_coins_exactly\n have_coins_enough\n have_admin\n }\n }\n}"): (typeof documents)["query NavTreeWantWorkspaces {\n query_basic_stuff {\n fuser_id\n my_own_ws_id\n workspaces {\n ws_id\n ws_owner_fuser_id\n ws_root_group_id\n root_group_name\n have_coins_exactly\n have_coins_enough\n have_admin\n }\n }\n}"]; +export function graphql(source: "query NavTreeWantWorkspaces {\n query_basic_stuff {\n fuser_id\n workspaces {\n ws_id\n ws_owner_fuser_id\n ws_root_group_id\n root_group_name\n }\n }\n}"): (typeof documents)["query NavTreeWantWorkspaces {\n query_basic_stuff {\n fuser_id\n workspaces {\n ws_id\n ws_owner_fuser_id\n ws_root_group_id\n root_group_name\n }\n }\n}"]; export function graphql(source: string) { return (documents as any)[source] ?? {}; diff --git a/refact-agent/gui/generated/graphql/graphql.ts b/refact-agent/gui/generated/graphql/graphql.ts index 3bccecc10..ce5ae1718 100644 --- a/refact-agent/gui/generated/graphql/graphql.ts +++ b/refact-agent/gui/generated/graphql/graphql.ts @@ -21,35 +21,7 @@ export type Scalars = { export type BasicStuffResult = { __typename?: 'BasicStuffResult'; fuser_id: Scalars['String']['output']; - fuser_psystem?: Maybe; - invitations?: Maybe>; - my_own_ws_id?: Maybe; - workspaces: Array; -}; - -export type EmailConfirmResult = { - __typename?: 'EmailConfirmResult'; - fuser_id: Scalars['String']['output']; -}; - -export type FApiKeyOutput = { - __typename?: 'FApiKeyOutput'; - apikey_archived_ts: Scalars['Float']['output']; - apikey_created_ts: Scalars['Float']['output']; - apikey_id: Scalars['String']['output']; - apikey_last4digits: Scalars['String']['output']; - full_key_shown_once?: Maybe; -}; - -export type FCloudTool = { - __typename?: 'FCloudTool'; - ctool_confirmed_exists_ts?: Maybe; - ctool_description: Scalars['String']['output']; - ctool_id: Scalars['String']['output']; - ctool_name: Scalars['String']['output']; - ctool_parameters: Scalars['JSON']['output']; - located_fgroup_id?: Maybe; - owner_fuser_id?: Maybe; + workspaces: Array; }; export type FExpertInput = { @@ -67,7 +39,6 @@ export type FExpertOutput = { __typename?: 'FExpertOutput'; fexp_allow_tools: Scalars['String']['output']; fexp_block_tools: Scalars['String']['output']; - fexp_id: Scalars['String']['output']; fexp_name: Scalars['String']['output']; fexp_python_kernel: Scalars['String']['output']; fexp_system_prompt: Scalars['String']['output']; @@ -139,9 +110,6 @@ export type FKnowledgeItemInput = { export type FKnowledgeItemOutput = { __typename?: 'FKnowledgeItemOutput'; iknow_created_ts: Scalars['Float']['output']; - iknow_embedding_error: Scalars['String']['output']; - iknow_embedding_started_ts: Scalars['Float']['output']; - iknow_embedding_status: Scalars['String']['output']; iknow_id: Scalars['String']['output']; iknow_is_core: Scalars['Boolean']['output']; iknow_memory: Scalars['String']['output']; @@ -171,15 +139,10 @@ export type FKnowledgeItemSubs = { news_pubsub: Scalars['String']['output']; }; -export type FMassInvitationOutput = { - __typename?: 'FMassInvitationOutput'; - fuser_id: Scalars['String']['output']; - result: Scalars['String']['output']; -}; - -export type FModelItem = { - __typename?: 'FModelItem'; - provm_name: Scalars['String']['output']; +export type FPermissionInput = { + fgroup_id: Scalars['String']['input']; + fuser_id: Scalars['String']['input']; + perm_role: Scalars['String']['input']; }; export type FPermissionOutput = { @@ -193,14 +156,6 @@ export type FPermissionPatch = { perm_role?: InputMaybe; }; -export type FPermissionSubs = { - __typename?: 'FPermissionSubs'; - news_action: Scalars['String']['output']; - news_payload?: Maybe; - news_payload_id: Scalars['String']['output']; - news_pubsub: Scalars['String']['output']; -}; - export type FPluginOutput = { __typename?: 'FPluginOutput'; plugin_name: Scalars['String']['output']; @@ -208,27 +163,6 @@ export type FPluginOutput = { plugin_version: Scalars['String']['output']; }; -export type FStatsAddInput = { - fgroup_id?: Scalars['String']['input']; - st_chart: Scalars['Int']['input']; - st_how_many: Scalars['Int']['input']; - st_involved_fexp_id?: Scalars['String']['input']; - st_involved_fuser_id?: Scalars['String']['input']; - st_involved_model?: Scalars['String']['input']; - st_thing: Scalars['String']['input']; - ws_id: Scalars['String']['input']; -}; - -export type FStatsOutput = { - __typename?: 'FStatsOutput'; - st_how_many: Scalars['Int']['output']; - st_involved_fexp_id?: Maybe; - st_involved_fuser_id?: Maybe; - st_involved_model?: Maybe; - st_timekey: Scalars['String']['output']; - ws_id: Scalars['String']['output']; -}; - export type FThreadDelta = { __typename?: 'FThreadDelta'; ftm_content: Scalars['JSON']['output']; @@ -240,7 +174,7 @@ export type FThreadInput = { ft_app_searchable?: Scalars['String']['input']; ft_app_specific?: Scalars['String']['input']; ft_error?: Scalars['String']['input']; - ft_fexp_id: Scalars['String']['input']; + ft_fexp_name: Scalars['String']['input']; ft_title: Scalars['String']['input']; ft_toolset?: Scalars['String']['input']; located_fgroup_id: Scalars['String']['input']; @@ -309,11 +243,9 @@ export type FThreadOutput = { ft_app_searchable: Scalars['String']['output']; ft_app_specific?: Maybe; ft_archived_ts: Scalars['Float']['output']; - ft_confirmation_request?: Maybe; - ft_confirmation_response?: Maybe; ft_created_ts: Scalars['Float']['output']; ft_error?: Maybe; - ft_fexp_id: Scalars['String']['output']; + ft_fexp_name: Scalars['String']['output']; ft_id: Scalars['String']['output']; ft_locked_by: Scalars['String']['output']; ft_need_assistant: Scalars['Int']['output']; @@ -333,8 +265,6 @@ export type FThreadPatch = { ft_app_searchable?: InputMaybe; ft_app_specific?: InputMaybe; ft_archived_ts?: InputMaybe; - ft_confirmation_request?: InputMaybe; - ft_confirmation_response?: InputMaybe; ft_error?: InputMaybe; ft_need_user?: InputMaybe; ft_title?: InputMaybe; @@ -352,41 +282,35 @@ export type FThreadSubs = { news_pubsub: Scalars['String']['output']; }; -export type FUserProfileOutput = { - __typename?: 'FUserProfileOutput'; - fuser_fullname: Scalars['String']['output']; - fuser_id: Scalars['String']['output']; -}; - -export type FUserProfilePatch = { - fuser_fullname?: InputMaybe; +export type FWorkspace = { + __typename?: 'FWorkspace'; + root_group_name: Scalars['String']['output']; + ws_created_ts: Scalars['Float']['output']; + ws_id: Scalars['String']['output']; + ws_owner_fuser_id: Scalars['String']['output']; + ws_root_group_id: Scalars['String']['output']; + ws_status: Scalars['String']['output']; }; -export type FWorkspaceCreateInput = { - ws_name: Scalars['String']['input']; +export type FWorkspaceInvitationInput = { + ws_id: Scalars['String']['input']; + wsi_email: Scalars['String']['input']; + wsi_invited_by_fuser_id: Scalars['String']['input']; + wsi_role: Scalars['String']['input']; }; export type FWorkspaceInvitationOutput = { __typename?: 'FWorkspaceInvitationOutput'; - group_name: Scalars['String']['output']; - wsi_fgroup_id: Scalars['String']['output']; - wsi_id: Scalars['String']['output']; - wsi_invite_fuser_id: Scalars['String']['output']; + ws_id: Scalars['String']['output']; + wsi_created_ts: Scalars['Float']['output']; + wsi_email: Scalars['String']['output']; wsi_invited_by_fuser_id: Scalars['String']['output']; wsi_role: Scalars['String']['output']; + wsi_token: Scalars['String']['output']; }; -export type FWorkspaceOutput = { - __typename?: 'FWorkspaceOutput'; - have_admin: Scalars['Boolean']['output']; - have_coins_enough: Scalars['Boolean']['output']; - have_coins_exactly: Scalars['Int']['output']; - root_group_name: Scalars['String']['output']; - ws_archived_ts: Scalars['Float']['output']; - ws_created_ts: Scalars['Float']['output']; - ws_id: Scalars['String']['output']; - ws_owner_fuser_id: Scalars['String']['output']; - ws_root_group_id: Scalars['String']['output']; +export type FWorkspaceInvitationPatch = { + wsi_role?: InputMaybe; }; export type FlexusGroup = { @@ -395,7 +319,6 @@ export type FlexusGroup = { fgroup_id: Scalars['String']['output']; fgroup_name: Scalars['String']['output']; fgroup_parent_id?: Maybe; - my_role?: Maybe; ws_id: Scalars['String']['output']; }; @@ -411,9 +334,6 @@ export type FlexusGroupPatch = { export type Mutation = { __typename?: 'Mutation'; - api_key_delete: Scalars['Boolean']['output']; - api_key_generate: FApiKeyOutput; - email_confirm: EmailConfirmResult; expert_create: FExpertOutput; expert_delete: Scalars['Boolean']['output']; expert_patch: FExpertOutput; @@ -423,51 +343,28 @@ export type Mutation = { group_create: FlexusGroup; group_delete: Scalars['String']['output']; group_patch: FlexusGroup; - invitation_accept: Scalars['Boolean']['output']; - invitation_create_multiple: Array; - invitation_delete: Scalars['Boolean']['output']; - invitation_reject: Scalars['Boolean']['output']; knowledge_item_create: FKnowledgeItemOutput; knowledge_item_delete: Scalars['Boolean']['output']; knowledge_item_mass_group_patch: Scalars['Int']['output']; knowledge_item_patch: FKnowledgeItemOutput; - password_change: Scalars['Boolean']['output']; + permission_create: FPermissionOutput; permission_delete: Scalars['Boolean']['output']; permission_patch: FPermissionOutput; - reset_password_execute: Scalars['Boolean']['output']; - reset_password_start: Scalars['Boolean']['output']; - session_open: Scalars['String']['output']; - session_renew: Scalars['String']['output']; stats_add: Scalars['Boolean']['output']; tech_support_activate: Scalars['Boolean']['output']; tech_support_set_config: Scalars['Boolean']['output']; - thread_clear_confirmation: Scalars['Boolean']['output']; thread_create: FThreadOutput; thread_delete: Scalars['Boolean']['output']; thread_lock: Scalars['Boolean']['output']; thread_mass_group_patch: Scalars['Int']['output']; + thread_message_create: FThreadMessageOutput; thread_messages_create_multiple: FThreadMessagesCreateResult; thread_patch: FThreadOutput; thread_provide_toolset: Scalars['Boolean']['output']; - thread_reset_error: Scalars['Boolean']['output']; - thread_reset_title: Scalars['Boolean']['output']; - thread_set_confirmation_request: Scalars['Boolean']['output']; - thread_set_confirmation_response: Scalars['Boolean']['output']; thread_unlock: Scalars['Boolean']['output']; - user_profile_patch: FUserProfileOutput; - user_register: Scalars['Boolean']['output']; - workspace_create: Scalars['String']['output']; - workspace_delete: Scalars['String']['output']; -}; - - -export type MutationApi_Key_DeleteArgs = { - apikey_id: Scalars['String']['input']; -}; - - -export type MutationEmail_ConfirmArgs = { - token: Scalars['String']['input']; + workspace_invitation_create: FWorkspaceInvitationOutput; + workspace_invitation_delete: Scalars['Boolean']['output']; + workspace_invitation_patch: FWorkspaceInvitationOutput; }; @@ -519,29 +416,6 @@ export type MutationGroup_PatchArgs = { }; -export type MutationInvitation_AcceptArgs = { - wsi_id: Scalars['String']['input']; -}; - - -export type MutationInvitation_Create_MultipleArgs = { - emails: Array; - fgroup_id: Scalars['String']['input']; - role: Scalars['String']['input']; -}; - - -export type MutationInvitation_DeleteArgs = { - wsi_fgroup_id: Scalars['String']['input']; - wsi_invite_fuser_id: Scalars['String']['input']; -}; - - -export type MutationInvitation_RejectArgs = { - wsi_id: Scalars['String']['input']; -}; - - export type MutationKnowledge_Item_CreateArgs = { input: FKnowledgeItemInput; }; @@ -564,9 +438,8 @@ export type MutationKnowledge_Item_PatchArgs = { }; -export type MutationPassword_ChangeArgs = { - new_password: Scalars['String']['input']; - old_password: Scalars['String']['input']; +export type MutationPermission_CreateArgs = { + input: FPermissionInput; }; @@ -583,25 +456,14 @@ export type MutationPermission_PatchArgs = { }; -export type MutationReset_Password_ExecuteArgs = { - new_password: Scalars['String']['input']; - token: Scalars['String']['input']; -}; - - -export type MutationReset_Password_StartArgs = { - username: Scalars['String']['input']; -}; - - -export type MutationSession_OpenArgs = { - password: Scalars['String']['input']; - username: Scalars['String']['input']; -}; - - export type MutationStats_AddArgs = { - records: Array; + st_how_many: Scalars['Int']['input']; + st_involved_expert?: Scalars['String']['input']; + st_involved_fuser_id?: Scalars['String']['input']; + st_involved_model?: Scalars['String']['input']; + st_thing: Scalars['String']['input']; + ts: Scalars['Float']['input']; + ws_id: Scalars['String']['input']; }; @@ -616,11 +478,6 @@ export type MutationTech_Support_Set_ConfigArgs = { }; -export type MutationThread_Clear_ConfirmationArgs = { - ft_id: Scalars['String']['input']; -}; - - export type MutationThread_CreateArgs = { input: FThreadInput; }; @@ -643,6 +500,11 @@ export type MutationThread_Mass_Group_PatchArgs = { }; +export type MutationThread_Message_CreateArgs = { + input: FThreadMessageInput; +}; + + export type MutationThread_Messages_Create_MultipleArgs = { input: FThreadMultipleMessagesInput; }; @@ -660,113 +522,53 @@ export type MutationThread_Provide_ToolsetArgs = { }; -export type MutationThread_Reset_ErrorArgs = { - ft_error: Scalars['String']['input']; - ft_id: Scalars['String']['input']; -}; - - -export type MutationThread_Reset_TitleArgs = { - ft_id: Scalars['String']['input']; - ft_title: Scalars['String']['input']; -}; - - -export type MutationThread_Set_Confirmation_RequestArgs = { - confirmation_request: Scalars['String']['input']; - ft_id: Scalars['String']['input']; -}; - - -export type MutationThread_Set_Confirmation_ResponseArgs = { - confirmation_response: Scalars['String']['input']; - ft_id: Scalars['String']['input']; -}; - - export type MutationThread_UnlockArgs = { ft_id: Scalars['String']['input']; worker_name: Scalars['String']['input']; }; -export type MutationUser_Profile_PatchArgs = { - patch: FUserProfilePatch; +export type MutationWorkspace_Invitation_CreateArgs = { + input: FWorkspaceInvitationInput; }; -export type MutationUser_RegisterArgs = { - input: RegisterInput; -}; - - -export type MutationWorkspace_CreateArgs = { - input: FWorkspaceCreateInput; +export type MutationWorkspace_Invitation_DeleteArgs = { + ws_id: Scalars['String']['input']; + wsi_email: Scalars['String']['input']; }; -export type MutationWorkspace_DeleteArgs = { - dry_run?: Scalars['Boolean']['input']; +export type MutationWorkspace_Invitation_PatchArgs = { + patch: FWorkspaceInvitationPatch; ws_id: Scalars['String']['input']; -}; - -export type PasswordResetTokenInfo = { - __typename?: 'PasswordResetTokenInfo'; - freset_used: Scalars['Boolean']['output']; - fuser_id: Scalars['String']['output']; + wsi_email: Scalars['String']['input']; }; export type Query = { __typename?: 'Query'; - api_key_list: Array; - cloud_tools_list: Array; - coins_how_much_I_have: Scalars['Int']['output']; - expert_choice_consequences: Array; expert_get: FExpertOutput; expert_list: Array; experts_effective_list: Array; external_data_source_get: FExternalDataSourceOutput; external_data_source_list: Array; - group_get: FlexusGroup; - group_list_for_workspace: Array; - invitation_list: Array; - knowledge_get_cores: Array; knowledge_item_get: FKnowledgeItemOutput; knowledge_item_list: Array; - knowledge_vecdb_search: Array; + permission_get: FPermissionOutput; permission_list: Array; plugins_installed: Array; query_basic_stuff: BasicStuffResult; - reset_password_token_info: PasswordResetTokenInfo; - stats_query: Array; - stats_query_distinct: StatsDistinctOutput; tech_support_get_config?: Maybe; thread_get: FThreadOutput; thread_list: Array; thread_messages_list: Array; threads_app_captured: Array; - user_profile_get: FUserProfileOutput; + workspace_invitation_get: FWorkspaceInvitationOutput; + workspace_invitation_list: Array; workspace_permission_list: Array; }; -export type QueryCloud_Tools_ListArgs = { - include_offline?: Scalars['Boolean']['input']; - located_fgroup_id: Scalars['String']['input']; -}; - - -export type QueryCoins_How_Much_I_HaveArgs = { - ws_id: Scalars['String']['input']; -}; - - -export type QueryExpert_Choice_ConsequencesArgs = { - fexp_id: Scalars['String']['input']; - inside_fgroup_id: Scalars['String']['input']; -}; - - export type QueryExpert_GetArgs = { id: Scalars['String']['input']; }; @@ -798,26 +600,6 @@ export type QueryExternal_Data_Source_ListArgs = { }; -export type QueryGroup_GetArgs = { - fgroup_id: Scalars['String']['input']; -}; - - -export type QueryGroup_List_For_WorkspaceArgs = { - ws_id: Scalars['String']['input']; -}; - - -export type QueryInvitation_ListArgs = { - wsi_fgroup_id: Scalars['String']['input']; -}; - - -export type QueryKnowledge_Get_CoresArgs = { - fgroup_id: Scalars['String']['input']; -}; - - export type QueryKnowledge_Item_GetArgs = { id: Scalars['String']['input']; }; @@ -831,10 +613,9 @@ export type QueryKnowledge_Item_ListArgs = { }; -export type QueryKnowledge_Vecdb_SearchArgs = { +export type QueryPermission_GetArgs = { fgroup_id: Scalars['String']['input']; - q: Scalars['String']['input']; - top_n?: Scalars['Int']['input']; + fuser_id: Scalars['String']['input']; }; @@ -843,46 +624,6 @@ export type QueryPermission_ListArgs = { }; -export type QueryQuery_Basic_StuffArgs = { - want_invitations?: Scalars['Boolean']['input']; -}; - - -export type QueryReset_Password_Token_InfoArgs = { - token: Scalars['String']['input']; -}; - - -export type QueryStats_QueryArgs = { - breakdown_fexp_name: Scalars['Boolean']['input']; - breakdown_fuser_id: Scalars['Boolean']['input']; - breakdown_model: Scalars['Boolean']['input']; - fgroup_id?: Scalars['String']['input']; - filter_fexp_id?: Array; - filter_fuser_id?: Array; - filter_model?: Array; - filter_thing?: Array; - st_chart: Scalars['Int']['input']; - st_span: Scalars['String']['input']; - timekey_from: Scalars['String']['input']; - timekey_to: Scalars['String']['input']; - ws_id?: Scalars['String']['input']; -}; - - -export type QueryStats_Query_DistinctArgs = { - fgroup_id?: Scalars['String']['input']; - filter_fexp_id: Array; - filter_fuser_id: Array; - filter_model: Array; - st_chart: Scalars['Int']['input']; - st_span: Scalars['String']['input']; - timekey_from: Scalars['String']['input']; - timekey_to: Scalars['String']['input']; - ws_id: Scalars['String']['input']; -}; - - export type QueryTech_Support_Get_ConfigArgs = { ws_id: Scalars['String']['input']; }; @@ -914,23 +655,19 @@ export type QueryThreads_App_CapturedArgs = { }; -export type QueryWorkspace_Permission_ListArgs = { +export type QueryWorkspace_Invitation_GetArgs = { ws_id: Scalars['String']['input']; + wsi_email: Scalars['String']['input']; }; -export type RegisterInput = { - fullname: Scalars['String']['input']; - password: Scalars['String']['input']; - username: Scalars['String']['input']; + +export type QueryWorkspace_Invitation_ListArgs = { + ws_id: Scalars['String']['input']; }; -export type StatsDistinctOutput = { - __typename?: 'StatsDistinctOutput'; - st_chart: Scalars['Int']['output']; - st_involved_fexp_id: Array; - st_involved_fuser_id: Array; - st_involved_model: Array; - st_thing: Array; + +export type QueryWorkspace_Permission_ListArgs = { + ws_id: Scalars['String']['input']; }; export type Subscription = { @@ -939,7 +676,6 @@ export type Subscription = { experts_in_group: FExpertSubs; external_data_sources_in_group: FExternalDataSourceSubs; knowledge_items_in_group: FKnowledgeItemSubs; - permissions_in_group_subs: FPermissionSubs; threads_in_group: FThreadSubs; tree_subscription: TreeUpdateSubs; }; @@ -952,41 +688,30 @@ export type SubscriptionComprehensive_Thread_SubsArgs = { export type SubscriptionExperts_In_GroupArgs = { - filter?: Array; limit?: Scalars['Int']['input']; located_fgroup_id: Scalars['String']['input']; - sort_by?: Array; + sort_by?: Scalars['String']['input']; }; export type SubscriptionExternal_Data_Sources_In_GroupArgs = { - filter?: Array; limit?: Scalars['Int']['input']; located_fgroup_id: Scalars['String']['input']; - sort_by?: Array; + sort_by?: Scalars['String']['input']; }; export type SubscriptionKnowledge_Items_In_GroupArgs = { - filter?: Array; limit?: Scalars['Int']['input']; located_fgroup_id: Scalars['String']['input']; - sort_by?: Array; -}; - - -export type SubscriptionPermissions_In_Group_SubsArgs = { - fgroup_id: Scalars['String']['input']; - limit: Scalars['Int']['input']; - quicksearch: Scalars['String']['input']; + sort_by?: Scalars['String']['input']; }; export type SubscriptionThreads_In_GroupArgs = { - filter?: Array; limit?: Scalars['Int']['input']; located_fgroup_id: Scalars['String']['input']; - sort_by?: Array; + sort_by?: Scalars['String']['input']; }; @@ -1016,8 +741,6 @@ export type TreeUpdateSubs = { treeupd_action: Scalars['String']['output']; treeupd_id: Scalars['String']['output']; treeupd_path: Scalars['String']['output']; - treeupd_role?: Maybe; - treeupd_tag: Scalars['String']['output']; treeupd_title: Scalars['String']['output']; treeupd_type: Scalars['String']['output']; }; @@ -1040,9 +763,9 @@ export type NavTreeSubsSubscription = { __typename?: 'Subscription', tree_subscr export type NavTreeWantWorkspacesQueryVariables = Exact<{ [key: string]: never; }>; -export type NavTreeWantWorkspacesQuery = { __typename?: 'Query', query_basic_stuff: { __typename?: 'BasicStuffResult', fuser_id: string, my_own_ws_id?: string | null, workspaces: Array<{ __typename?: 'FWorkspaceOutput', ws_id: string, ws_owner_fuser_id: string, ws_root_group_id: string, root_group_name: string, have_coins_exactly: number, have_coins_enough: boolean, have_admin: boolean }> } }; +export type NavTreeWantWorkspacesQuery = { __typename?: 'Query', query_basic_stuff: { __typename?: 'BasicStuffResult', fuser_id: string, workspaces: Array<{ __typename?: 'FWorkspace', ws_id: string, ws_owner_fuser_id: string, ws_root_group_id: string, root_group_name: string }> } }; export const CreateGroupDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"mutation","name":{"kind":"Name","value":"CreateGroup"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"fgroup_name"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}},{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"fgroup_parent_id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"group_create"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"input"},"value":{"kind":"ObjectValue","fields":[{"kind":"ObjectField","name":{"kind":"Name","value":"fgroup_name"},"value":{"kind":"Variable","name":{"kind":"Name","value":"fgroup_name"}}},{"kind":"ObjectField","name":{"kind":"Name","value":"fgroup_parent_id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"fgroup_parent_id"}}}]}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"fgroup_id"}},{"kind":"Field","name":{"kind":"Name","value":"fgroup_name"}},{"kind":"Field","name":{"kind":"Name","value":"ws_id"}},{"kind":"Field","name":{"kind":"Name","value":"fgroup_parent_id"}},{"kind":"Field","name":{"kind":"Name","value":"fgroup_created_ts"}}]}}]}}]} as unknown as DocumentNode; export const NavTreeSubsDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"subscription","name":{"kind":"Name","value":"NavTreeSubs"},"variableDefinitions":[{"kind":"VariableDefinition","variable":{"kind":"Variable","name":{"kind":"Name","value":"ws_id"}},"type":{"kind":"NonNullType","type":{"kind":"NamedType","name":{"kind":"Name","value":"String"}}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"tree_subscription"},"arguments":[{"kind":"Argument","name":{"kind":"Name","value":"ws_id"},"value":{"kind":"Variable","name":{"kind":"Name","value":"ws_id"}}}],"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"treeupd_action"}},{"kind":"Field","name":{"kind":"Name","value":"treeupd_id"}},{"kind":"Field","name":{"kind":"Name","value":"treeupd_path"}},{"kind":"Field","name":{"kind":"Name","value":"treeupd_type"}},{"kind":"Field","name":{"kind":"Name","value":"treeupd_title"}}]}}]}}]} as unknown as DocumentNode; -export const NavTreeWantWorkspacesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"NavTreeWantWorkspaces"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"query_basic_stuff"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"fuser_id"}},{"kind":"Field","name":{"kind":"Name","value":"my_own_ws_id"}},{"kind":"Field","name":{"kind":"Name","value":"workspaces"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"ws_id"}},{"kind":"Field","name":{"kind":"Name","value":"ws_owner_fuser_id"}},{"kind":"Field","name":{"kind":"Name","value":"ws_root_group_id"}},{"kind":"Field","name":{"kind":"Name","value":"root_group_name"}},{"kind":"Field","name":{"kind":"Name","value":"have_coins_exactly"}},{"kind":"Field","name":{"kind":"Name","value":"have_coins_enough"}},{"kind":"Field","name":{"kind":"Name","value":"have_admin"}}]}}]}}]}}]} as unknown as DocumentNode; \ No newline at end of file +export const NavTreeWantWorkspacesDocument = {"kind":"Document","definitions":[{"kind":"OperationDefinition","operation":"query","name":{"kind":"Name","value":"NavTreeWantWorkspaces"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"query_basic_stuff"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"fuser_id"}},{"kind":"Field","name":{"kind":"Name","value":"workspaces"},"selectionSet":{"kind":"SelectionSet","selections":[{"kind":"Field","name":{"kind":"Name","value":"ws_id"}},{"kind":"Field","name":{"kind":"Name","value":"ws_owner_fuser_id"}},{"kind":"Field","name":{"kind":"Name","value":"ws_root_group_id"}},{"kind":"Field","name":{"kind":"Name","value":"root_group_name"}}]}}]}}]}}]} as unknown as DocumentNode; \ No newline at end of file diff --git a/refact-agent/gui/generated/schema.graphql b/refact-agent/gui/generated/schema.graphql index 8bc240238..a7a1e36c4 100644 --- a/refact-agent/gui/generated/schema.graphql +++ b/refact-agent/gui/generated/schema.graphql @@ -6,32 +6,7 @@ schema { type BasicStuffResult { fuser_id: String! - fuser_psystem: JSON - invitations: [FWorkspaceInvitationOutput!] - my_own_ws_id: String - workspaces: [FWorkspaceOutput!]! -} - -type EmailConfirmResult { - fuser_id: String! -} - -type FApiKeyOutput { - apikey_archived_ts: Float! - apikey_created_ts: Float! - apikey_id: String! - apikey_last4digits: String! - full_key_shown_once: String -} - -type FCloudTool { - ctool_confirmed_exists_ts: Float - ctool_description: String! - ctool_id: String! - ctool_name: String! - ctool_parameters: JSON! - located_fgroup_id: String - owner_fuser_id: String + workspaces: [FWorkspace!]! } input FExpertInput { @@ -48,7 +23,6 @@ input FExpertInput { type FExpertOutput { fexp_allow_tools: String! fexp_block_tools: String! - fexp_id: String! fexp_name: String! fexp_python_kernel: String! fexp_system_prompt: String! @@ -116,9 +90,6 @@ input FKnowledgeItemInput { type FKnowledgeItemOutput { iknow_created_ts: Float! - iknow_embedding_error: String! - iknow_embedding_started_ts: Float! - iknow_embedding_status: String! iknow_id: String! iknow_is_core: Boolean! iknow_memory: String! @@ -147,13 +118,10 @@ type FKnowledgeItemSubs { news_pubsub: String! } -type FMassInvitationOutput { +input FPermissionInput { + fgroup_id: String! fuser_id: String! - result: String! -} - -type FModelItem { - provm_name: String! + perm_role: String! } type FPermissionOutput { @@ -166,39 +134,12 @@ input FPermissionPatch { perm_role: String = null } -type FPermissionSubs { - news_action: String! - news_payload: FPermissionOutput - news_payload_id: String! - news_pubsub: String! -} - type FPluginOutput { plugin_name: String! plugin_setup_page: String! plugin_version: String! } -input FStatsAddInput { - fgroup_id: String! = "" - st_chart: Int! - st_how_many: Int! - st_involved_fexp_id: String! = "" - st_involved_fuser_id: String! = "" - st_involved_model: String! = "" - st_thing: String! - ws_id: String! -} - -type FStatsOutput { - st_how_many: Int! - st_involved_fexp_id: String - st_involved_fuser_id: String - st_involved_model: String - st_timekey: String! - ws_id: String! -} - type FThreadDelta { ftm_content: JSON! ftm_role: String! @@ -209,7 +150,7 @@ input FThreadInput { ft_app_searchable: String! = "" ft_app_specific: String! = "null" ft_error: String! = "null" - ft_fexp_id: String! + ft_fexp_name: String! ft_title: String! ft_toolset: String! = "null" located_fgroup_id: String! @@ -274,17 +215,9 @@ type FThreadOutput { ft_app_searchable: String! ft_app_specific: JSON ft_archived_ts: Float! -<<<<<<< HEAD ft_created_ts: Float! ft_error: JSON ft_fexp_name: String! -======= - ft_confirmation_request: JSON - ft_confirmation_response: JSON - ft_created_ts: Float! - ft_error: JSON - ft_fexp_id: String! ->>>>>>> not_horrible ft_id: String! ft_locked_by: String! ft_need_assistant: Int! @@ -304,11 +237,6 @@ input FThreadPatch { ft_app_searchable: String = null ft_app_specific: String = null ft_archived_ts: Float = null -<<<<<<< HEAD -======= - ft_confirmation_request: String = null - ft_confirmation_response: String = null ->>>>>>> not_horrible ft_error: String = null ft_need_user: Int = null ft_title: String = null @@ -325,38 +253,13 @@ type FThreadSubs { news_pubsub: String! } -type FUserProfileOutput { - fuser_fullname: String! - fuser_id: String! -} - -input FUserProfilePatch { - fuser_fullname: String = null -} - -input FWorkspaceCreateInput { - ws_name: String! -} - -type FWorkspaceInvitationOutput { - group_name: String! - wsi_fgroup_id: String! - wsi_id: String! - wsi_invite_fuser_id: String! - wsi_invited_by_fuser_id: String! - wsi_role: String! -} - -type FWorkspaceOutput { - have_admin: Boolean! - have_coins_enough: Boolean! - have_coins_exactly: Int! +type FWorkspace { root_group_name: String! - ws_archived_ts: Float! ws_created_ts: Float! ws_id: String! ws_owner_fuser_id: String! ws_root_group_id: String! + ws_status: String! } input FWorkspaceInvitationInput { @@ -384,7 +287,6 @@ type FlexusGroup { fgroup_id: String! fgroup_name: String! fgroup_parent_id: String - my_role: String ws_id: String! } @@ -402,9 +304,6 @@ input FlexusGroupPatch { scalar JSON type Mutation { - api_key_delete(apikey_id: String!): Boolean! - api_key_generate: FApiKeyOutput! - email_confirm(token: String!): EmailConfirmResult! expert_create(input: FExpertInput!): FExpertOutput! expert_delete(id: String!): Boolean! expert_patch(id: String!, patch: FExpertPatch!): FExpertOutput! @@ -414,101 +313,58 @@ type Mutation { group_create(input: FlexusGroupInput!): FlexusGroup! group_delete(fgroup_id: String!): String! group_patch(fgroup_id: String!, patch: FlexusGroupPatch!): FlexusGroup! - invitation_accept(wsi_id: String!): Boolean! - invitation_create_multiple(emails: [String!]!, fgroup_id: String!, role: String!): [FMassInvitationOutput!]! - invitation_delete(wsi_fgroup_id: String!, wsi_invite_fuser_id: String!): Boolean! - invitation_reject(wsi_id: String!): Boolean! knowledge_item_create(input: FKnowledgeItemInput!): FKnowledgeItemOutput! knowledge_item_delete(id: String!): Boolean! knowledge_item_mass_group_patch(dst_group_id: String!, src_group_id: String!): Int! knowledge_item_patch(id: String!, patch: FKnowledgeItemPatch!): FKnowledgeItemOutput! - password_change(new_password: String!, old_password: String!): Boolean! + permission_create(input: FPermissionInput!): FPermissionOutput! permission_delete(fgroup_id: String!, fuser_id: String!): Boolean! permission_patch(fgroup_id: String!, fuser_id: String!, patch: FPermissionPatch!): FPermissionOutput! - reset_password_execute(new_password: String!, token: String!): Boolean! - reset_password_start(username: String!): Boolean! - session_open(password: String!, username: String!): String! - session_renew: String! - stats_add(records: [FStatsAddInput!]!): Boolean! + stats_add(st_how_many: Int!, st_involved_expert: String! = "", st_involved_fuser_id: String! = "", st_involved_model: String! = "", st_thing: String!, ts: Float!, ws_id: String!): Boolean! tech_support_activate(ws_id: String!): Boolean! tech_support_set_config(config: TechSupportSettingsInput!, ws_id: String!): Boolean! - thread_clear_confirmation(ft_id: String!): Boolean! thread_create(input: FThreadInput!): FThreadOutput! thread_delete(id: String!): Boolean! thread_lock(ft_id: String!, worker_name: String!): Boolean! thread_mass_group_patch(dst_group_id: String!, src_group_id: String!): Int! + thread_message_create(input: FThreadMessageInput!): FThreadMessageOutput! thread_messages_create_multiple(input: FThreadMultipleMessagesInput!): FThreadMessagesCreateResult! thread_patch(id: String!, patch: FThreadPatch!): FThreadOutput! thread_provide_toolset(ft_id: String!, toolset: String!): Boolean! - thread_reset_error(ft_error: String!, ft_id: String!): Boolean! - thread_reset_title(ft_id: String!, ft_title: String!): Boolean! - thread_set_confirmation_request(confirmation_request: String!, ft_id: String!): Boolean! - thread_set_confirmation_response(confirmation_response: String!, ft_id: String!): Boolean! thread_unlock(ft_id: String!, worker_name: String!): Boolean! - user_profile_patch(patch: FUserProfilePatch!): FUserProfileOutput! - user_register(input: RegisterInput!): Boolean! - workspace_create(input: FWorkspaceCreateInput!): String! - workspace_delete(dry_run: Boolean! = false, ws_id: String!): String! -} - -type PasswordResetTokenInfo { - freset_used: Boolean! - fuser_id: String! + workspace_invitation_create(input: FWorkspaceInvitationInput!): FWorkspaceInvitationOutput! + workspace_invitation_delete(ws_id: String!, wsi_email: String!): Boolean! + workspace_invitation_patch(patch: FWorkspaceInvitationPatch!, ws_id: String!, wsi_email: String!): FWorkspaceInvitationOutput! } type Query { - api_key_list: [FApiKeyOutput!]! - cloud_tools_list(include_offline: Boolean! = false, located_fgroup_id: String!): [FCloudTool!]! - coins_how_much_I_have(ws_id: String!): Int! - expert_choice_consequences(fexp_id: String!, inside_fgroup_id: String!): [FModelItem!]! expert_get(id: String!): FExpertOutput! expert_list(limit: Int!, located_fgroup_id: String!, skip: Int!, sort_by: String! = ""): [FExpertOutput!]! experts_effective_list(located_fgroup_id: String!): [FExpertOutput!]! external_data_source_get(id: String!): FExternalDataSourceOutput! external_data_source_list(limit: Int!, located_fgroup_id: String!, skip: Int!, sort_by: String! = ""): [FExternalDataSourceOutput!]! - group_get(fgroup_id: String!): FlexusGroup! - group_list_for_workspace(ws_id: String!): [FlexusGroup!]! - invitation_list(wsi_fgroup_id: String!): [FWorkspaceInvitationOutput!]! - knowledge_get_cores(fgroup_id: String!): [FKnowledgeItemOutput!]! knowledge_item_get(id: String!): FKnowledgeItemOutput! knowledge_item_list(limit: Int!, located_fgroup_id: String!, skip: Int!, sort_by: String! = ""): [FKnowledgeItemOutput!]! - knowledge_vecdb_search(fgroup_id: String!, q: String!, top_n: Int! = 5): [FKnowledgeItemOutput!]! + permission_get(fgroup_id: String!, fuser_id: String!): FPermissionOutput! permission_list(fgroup_id: String!): [FPermissionOutput!]! plugins_installed: [FPluginOutput!]! - query_basic_stuff(want_invitations: Boolean! = false): BasicStuffResult! - reset_password_token_info(token: String!): PasswordResetTokenInfo! - stats_query(breakdown_fexp_name: Boolean!, breakdown_fuser_id: Boolean!, breakdown_model: Boolean!, fgroup_id: String! = "", filter_fexp_id: [String!]! = [], filter_fuser_id: [String!]! = [], filter_model: [String!]! = [], filter_thing: [String!]! = [], st_chart: Int!, st_span: String!, timekey_from: String!, timekey_to: String!, ws_id: String! = ""): [FStatsOutput!]! - stats_query_distinct(fgroup_id: String! = "", filter_fexp_id: [String!]!, filter_fuser_id: [String!]!, filter_model: [String!]!, st_chart: Int!, st_span: String!, timekey_from: String!, timekey_to: String!, ws_id: String!): StatsDistinctOutput! + query_basic_stuff: BasicStuffResult! tech_support_get_config(ws_id: String!): TechSupportSettingsOutput thread_get(id: String!): FThreadOutput! thread_list(limit: Int!, located_fgroup_id: String!, skip: Int!, sort_by: String! = ""): [FThreadOutput!]! thread_messages_list(ft_id: String!, ftm_alt: Int = null): [FThreadMessageOutput!]! threads_app_captured(ft_app_capture: String!, ft_app_searchable: String!, located_fgroup_id: String!): [FThreadOutput!]! - user_profile_get: FUserProfileOutput! + workspace_invitation_get(ws_id: String!, wsi_email: String!): FWorkspaceInvitationOutput! + workspace_invitation_list(ws_id: String!): [FWorkspaceInvitationOutput!]! workspace_permission_list(ws_id: String!): [FPermissionOutput!]! } -input RegisterInput { - fullname: String! - password: String! - username: String! -} - -type StatsDistinctOutput { - st_chart: Int! - st_involved_fexp_id: [String!]! - st_involved_fuser_id: [String!]! - st_involved_model: [String!]! - st_thing: [String!]! -} - type Subscription { comprehensive_thread_subs(ft_id: String!, want_deltas: Boolean!): FThreadMessageSubs! - experts_in_group(filter: [String!]! = [], limit: Int! = 0, located_fgroup_id: String!, sort_by: [String!]! = []): FExpertSubs! - external_data_sources_in_group(filter: [String!]! = [], limit: Int! = 0, located_fgroup_id: String!, sort_by: [String!]! = []): FExternalDataSourceSubs! - knowledge_items_in_group(filter: [String!]! = [], limit: Int! = 0, located_fgroup_id: String!, sort_by: [String!]! = []): FKnowledgeItemSubs! - permissions_in_group_subs(fgroup_id: String!, limit: Int!, quicksearch: String!): FPermissionSubs! - threads_in_group(filter: [String!]! = [], limit: Int! = 0, located_fgroup_id: String!, sort_by: [String!]! = []): FThreadSubs! + experts_in_group(limit: Int! = 0, located_fgroup_id: String!, sort_by: String! = ""): FExpertSubs! + external_data_sources_in_group(limit: Int! = 0, located_fgroup_id: String!, sort_by: String! = ""): FExternalDataSourceSubs! + knowledge_items_in_group(limit: Int! = 0, located_fgroup_id: String!, sort_by: String! = ""): FKnowledgeItemSubs! + threads_in_group(limit: Int! = 0, located_fgroup_id: String!, sort_by: String! = ""): FThreadSubs! tree_subscription(ws_id: String!): TreeUpdateSubs! } @@ -532,8 +388,6 @@ type TreeUpdateSubs { treeupd_action: String! treeupd_id: String! treeupd_path: String! - treeupd_role: String - treeupd_tag: String! treeupd_title: String! treeupd_type: String! } \ No newline at end of file diff --git a/refact-agent/gui/package-lock.json b/refact-agent/gui/package-lock.json index d2fcf30c1..251cac3ab 100644 --- a/refact-agent/gui/package-lock.json +++ b/refact-agent/gui/package-lock.json @@ -42,7 +42,6 @@ "@storybook/react": "^7.6.4", "@storybook/react-vite": "^8.1.5", "@storybook/test": "^7.6.4", - "@swc/core": "^1.12.7", "@testing-library/dom": "^10.1.0", "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.5.1", @@ -104,24 +103,6 @@ "vite-plugin-eslint": "^1.8.1", "vitest": "^3.1.3", "vitest-matchmedia-mock": "^1.0.3" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "^4.44.1", - "@rollup/rollup-android-arm64": "^4.44.1", - "@rollup/rollup-darwin-arm64": "^4.44.1", - "@rollup/rollup-darwin-x64": "^4.44.1", - "@rollup/rollup-linux-arm-gnueabihf": "^4.44.1", - "@rollup/rollup-linux-arm-musleabihf": "^4.44.1", - "@rollup/rollup-linux-arm64-gnu": "^4.44.1", - "@rollup/rollup-linux-arm64-musl": "^4.44.1", - "@rollup/rollup-linux-powerpc64le-gnu": "^4.44.1", - "@rollup/rollup-linux-riscv64-gnu": "^4.44.1", - "@rollup/rollup-linux-s390x-gnu": "^4.44.1", - "@rollup/rollup-linux-x64-gnu": "^4.44.1", - "@rollup/rollup-linux-x64-musl": "^4.44.1", - "@rollup/rollup-win32-arm64-msvc": "^4.44.1", - "@rollup/rollup-win32-ia32-msvc": "^4.44.1", - "@rollup/rollup-win32-x64-msvc": "^4.44.1" } }, "node_modules/@0no-co/graphql.web": { @@ -2466,481 +2447,483 @@ "node": ">=18.0.0" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.18.20", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", - "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", "cpu": [ - "x64" + "ppc64" ], "dev": true, "optional": true, "os": [ - "win32" + "aix" ], "engines": { "node": ">=12" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "node": ">=12" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], "dev": true, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "node": ">=12" } }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, + "optional": true, + "os": [ + "android" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=12" } }, - "node_modules/@eslint/eslintrc/node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@eslint/eslintrc/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/@eslint/eslintrc/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@eslint/eslintrc/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], "dev": true, + "optional": true, + "os": [ + "freebsd" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/@eslint/js": { - "version": "8.55.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", - "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], "dev": true, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": ">=12" } }, - "node_modules/@fal-works/esbuild-plugin-global-externals": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@fal-works/esbuild-plugin-global-externals/-/esbuild-plugin-global-externals-2.1.2.tgz", - "integrity": "sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==", - "dev": true - }, - "node_modules/@fastify/busboy": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-3.1.1.tgz", - "integrity": "sha512-5DGmA8FTdB2XbDeEwc/5ZXBl6UbBAyBOOLlPuBnZ/N1SwdH9Ii+cOX3tBROlDgcTXxjOYnLMVoKk9+FXAw0CJw==", + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/@floating-ui/core": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.2.tgz", - "integrity": "sha512-Ii3MrfY/GAIN3OhXNzpCKaLxHQfJF9qvwq/kEJYdqDxeIHa01K8sldugal6TmeeXl+WMvhv9cnVzUTaFFJF09A==", + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], "dev": true, - "dependencies": { - "@floating-ui/utils": "^0.1.3" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@floating-ui/dom": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", - "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], "dev": true, - "dependencies": { - "@floating-ui/core": "^1.4.2", - "@floating-ui/utils": "^0.1.3" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@floating-ui/react-dom": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.4.tgz", - "integrity": "sha512-CF8k2rgKeh/49UrnIBs4BdxPUV6vize/Db1d/YbCLyp9GiVZ0BEwf5AiDSxJRCr6yOkGqTFHtmrULxkEfYZ7dQ==", + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], "dev": true, - "dependencies": { - "@floating-ui/dom": "^1.5.1" - }, - "peerDependencies": { - "react": ">=16.8.0", - "react-dom": ">=16.8.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@floating-ui/utils": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", - "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==", - "dev": true - }, - "node_modules/@gql.tada/internal": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@gql.tada/internal/-/internal-1.0.8.tgz", - "integrity": "sha512-XYdxJhtHC5WtZfdDqtKjcQ4d7R1s0d1rnlSs3OcBEUbYiPoJJfZU7tWsVXuv047Z6msvmr4ompJ7eLSK5Km57g==", + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@0no-co/graphql.web": "^1.0.5" - }, - "peerDependencies": { - "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0", - "typescript": "^5.0.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@graphql-codegen/add": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@graphql-codegen/add/-/add-5.0.3.tgz", - "integrity": "sha512-SxXPmramkth8XtBlAHu4H4jYcYXM/o3p01+psU+0NADQowA8jtYkK6MW5rV6T+CxkEaNZItfSmZRPgIuypcqnA==", + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@graphql-codegen/plugin-helpers": "^5.0.3", - "tslib": "~2.6.0" - }, - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" } }, - "node_modules/@graphql-codegen/cli": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@graphql-codegen/cli/-/cli-5.0.6.tgz", - "integrity": "sha512-1r5dtZ2l1jiCF/4qLMTcT7mEoWWWeqQlmn7HcPHgnV/OXIEodwox7XRGAmOKUygoabRjFF3S0jd0TWbkq5Otsw==", + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], "dev": true, - "license": "MIT", - "dependencies": { - "@babel/generator": "^7.18.13", - "@babel/template": "^7.18.10", - "@babel/types": "^7.18.13", - "@graphql-codegen/client-preset": "^4.8.1", - "@graphql-codegen/core": "^4.0.2", - "@graphql-codegen/plugin-helpers": "^5.0.3", - "@graphql-tools/apollo-engine-loader": "^8.0.0", - "@graphql-tools/code-file-loader": "^8.0.0", - "@graphql-tools/git-loader": "^8.0.0", - "@graphql-tools/github-loader": "^8.0.0", - "@graphql-tools/graphql-file-loader": "^8.0.0", - "@graphql-tools/json-file-loader": "^8.0.0", - "@graphql-tools/load": "^8.1.0", - "@graphql-tools/prisma-loader": "^8.0.0", - "@graphql-tools/url-loader": "^8.0.0", - "@graphql-tools/utils": "^10.0.0", - "@whatwg-node/fetch": "^0.10.0", - "chalk": "^4.1.0", - "cosmiconfig": "^8.1.3", - "debounce": "^1.2.0", - "detect-indent": "^6.0.0", - "graphql-config": "^5.1.1", - "inquirer": "^8.0.0", - "is-glob": "^4.0.1", - "jiti": "^1.17.1", - "json-to-pretty-yaml": "^1.2.2", - "listr2": "^4.0.5", - "log-symbols": "^4.0.0", - "micromatch": "^4.0.5", - "shell-quote": "^1.7.3", - "string-env-interpolation": "^1.0.1", - "ts-log": "^2.2.3", - "tslib": "^2.4.0", - "yaml": "^2.3.1", - "yargs": "^17.0.0" - }, - "bin": { - "gql-gen": "cjs/bin.js", - "graphql-code-generator": "cjs/bin.js", - "graphql-codegen": "cjs/bin.js", - "graphql-codegen-esm": "esm/bin.js" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=16" - }, - "peerDependencies": { - "@parcel/watcher": "^2.1.0", - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" - }, - "peerDependenciesMeta": { - "@parcel/watcher": { - "optional": true - } + "node": ">=12" } }, - "node_modules/@graphql-codegen/cli/node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, + "optional": true, + "os": [ + "linux" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/@graphql-codegen/cli/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "restore-cursor": "^3.1.0" - }, + "optional": true, + "os": [ + "netbsd" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/@graphql-codegen/cli/node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - }, + "optional": true, + "os": [ + "openbsd" + ], "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/@graphql-codegen/cli/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT" + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } }, - "node_modules/@graphql-codegen/cli/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=8" + "node": ">=12" } }, - "node_modules/@graphql-codegen/cli/node_modules/listr2": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-4.0.5.tgz", - "integrity": "sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==", + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], "dev": true, - "license": "MIT", - "dependencies": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.16", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rfdc": "^1.3.0", - "rxjs": "^7.5.5", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { "node": ">=12" - }, - "peerDependencies": { - "enquirer": ">= 2.3.0 < 3" - }, - "peerDependenciesMeta": { - "enquirer": { - "optional": true - } } }, - "node_modules/@graphql-codegen/cli/node_modules/log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], "dev": true, - "license": "MIT", - "dependencies": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, + "optional": true, + "os": [ + "win32" + ], "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=12" } }, - "node_modules/@graphql-codegen/cli/node_modules/log-update/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", "dev": true, - "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "eslint-visitor-keys": "^3.3.0" }, "engines": { - "node": ">=10" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@graphql-codegen/cli/node_modules/log-update/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, - "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" }, "engines": { - "node": ">=8" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@graphql-codegen/cli/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "node_modules/@eslint/eslintrc/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" }, - "engines": { - "node": ">=8" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@graphql-codegen/cli/node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, - "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "type-fest": "^0.20.2" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@graphql-codegen/cli/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "argparse": "^2.0.1" }, - "engines": { - "node": ">=8" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@graphql-codegen/cli/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "node_modules/@eslint/eslintrc/node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@eslint/eslintrc/node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -2948,552 +2931,591 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@graphql-codegen/cli/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "node_modules/@eslint/js": { + "version": "8.55.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.55.0.tgz", + "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@graphql-codegen/client-preset": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/@graphql-codegen/client-preset/-/client-preset-4.8.1.tgz", - "integrity": "sha512-XLF2V7WKLnepvrGE44JP+AvjS+Oz9AT0oYgTl/6d9btQ+2VYFcmwQPjNAuMVHipqE9I6h8hSEfH9hUrzUptB1g==", + "node_modules/@fal-works/esbuild-plugin-global-externals": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@fal-works/esbuild-plugin-global-externals/-/esbuild-plugin-global-externals-2.1.2.tgz", + "integrity": "sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==", + "dev": true + }, + "node_modules/@fastify/busboy": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-3.1.1.tgz", + "integrity": "sha512-5DGmA8FTdB2XbDeEwc/5ZXBl6UbBAyBOOLlPuBnZ/N1SwdH9Ii+cOX3tBROlDgcTXxjOYnLMVoKk9+FXAw0CJw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@floating-ui/core": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.2.tgz", + "integrity": "sha512-Ii3MrfY/GAIN3OhXNzpCKaLxHQfJF9qvwq/kEJYdqDxeIHa01K8sldugal6TmeeXl+WMvhv9cnVzUTaFFJF09A==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/template": "^7.20.7", - "@graphql-codegen/add": "^5.0.3", - "@graphql-codegen/gql-tag-operations": "4.0.17", - "@graphql-codegen/plugin-helpers": "^5.1.0", - "@graphql-codegen/typed-document-node": "^5.1.1", - "@graphql-codegen/typescript": "^4.1.6", - "@graphql-codegen/typescript-operations": "^4.6.1", - "@graphql-codegen/visitor-plugin-common": "^5.8.0", - "@graphql-tools/documents": "^1.0.0", - "@graphql-tools/utils": "^10.0.0", - "@graphql-typed-document-node/core": "3.2.0", - "tslib": "~2.6.0" - }, - "engines": { - "node": ">=16" + "@floating-ui/utils": "^0.1.3" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", + "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", + "dev": true, + "dependencies": { + "@floating-ui/core": "^1.4.2", + "@floating-ui/utils": "^0.1.3" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.4.tgz", + "integrity": "sha512-CF8k2rgKeh/49UrnIBs4BdxPUV6vize/Db1d/YbCLyp9GiVZ0BEwf5AiDSxJRCr6yOkGqTFHtmrULxkEfYZ7dQ==", + "dev": true, + "dependencies": { + "@floating-ui/dom": "^1.5.1" }, "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", - "graphql-sock": "^1.0.0" - }, - "peerDependenciesMeta": { - "graphql-sock": { - "optional": true - } + "react": ">=16.8.0", + "react-dom": ">=16.8.0" } }, - "node_modules/@graphql-codegen/core": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/@graphql-codegen/core/-/core-4.0.2.tgz", - "integrity": "sha512-IZbpkhwVqgizcjNiaVzNAzm/xbWT6YnGgeOLwVjm4KbJn3V2jchVtuzHH09G5/WkkLSk2wgbXNdwjM41JxO6Eg==", + "node_modules/@floating-ui/utils": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz", + "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==", + "dev": true + }, + "node_modules/@gql.tada/internal": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@gql.tada/internal/-/internal-1.0.8.tgz", + "integrity": "sha512-XYdxJhtHC5WtZfdDqtKjcQ4d7R1s0d1rnlSs3OcBEUbYiPoJJfZU7tWsVXuv047Z6msvmr4ompJ7eLSK5Km57g==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-codegen/plugin-helpers": "^5.0.3", - "@graphql-tools/schema": "^10.0.0", - "@graphql-tools/utils": "^10.0.0", - "tslib": "~2.6.0" + "@0no-co/graphql.web": "^1.0.5" }, "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + "graphql": "^15.5.0 || ^16.0.0 || ^17.0.0", + "typescript": "^5.0.0" } }, - "node_modules/@graphql-codegen/gql-tag-operations": { - "version": "4.0.17", - "resolved": "https://registry.npmjs.org/@graphql-codegen/gql-tag-operations/-/gql-tag-operations-4.0.17.tgz", - "integrity": "sha512-2pnvPdIG6W9OuxkrEZ6hvZd142+O3B13lvhrZ48yyEBh2ujtmKokw0eTwDHtlXUqjVS0I3q7+HB2y12G/m69CA==", + "node_modules/@graphql-codegen/add": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@graphql-codegen/add/-/add-5.0.3.tgz", + "integrity": "sha512-SxXPmramkth8XtBlAHu4H4jYcYXM/o3p01+psU+0NADQowA8jtYkK6MW5rV6T+CxkEaNZItfSmZRPgIuypcqnA==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-codegen/plugin-helpers": "^5.1.0", - "@graphql-codegen/visitor-plugin-common": "5.8.0", - "@graphql-tools/utils": "^10.0.0", - "auto-bind": "~4.0.0", + "@graphql-codegen/plugin-helpers": "^5.0.3", "tslib": "~2.6.0" }, - "engines": { - "node": ">=16" - }, "peerDependencies": { "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, - "node_modules/@graphql-codegen/plugin-helpers": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-5.1.0.tgz", - "integrity": "sha512-Y7cwEAkprbTKzVIe436TIw4w03jorsMruvCvu0HJkavaKMQbWY+lQ1RIuROgszDbxAyM35twB5/sUvYG5oW+yg==", + "node_modules/@graphql-codegen/cli": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/@graphql-codegen/cli/-/cli-5.0.6.tgz", + "integrity": "sha512-1r5dtZ2l1jiCF/4qLMTcT7mEoWWWeqQlmn7HcPHgnV/OXIEodwox7XRGAmOKUygoabRjFF3S0jd0TWbkq5Otsw==", "dev": true, "license": "MIT", "dependencies": { + "@babel/generator": "^7.18.13", + "@babel/template": "^7.18.10", + "@babel/types": "^7.18.13", + "@graphql-codegen/client-preset": "^4.8.1", + "@graphql-codegen/core": "^4.0.2", + "@graphql-codegen/plugin-helpers": "^5.0.3", + "@graphql-tools/apollo-engine-loader": "^8.0.0", + "@graphql-tools/code-file-loader": "^8.0.0", + "@graphql-tools/git-loader": "^8.0.0", + "@graphql-tools/github-loader": "^8.0.0", + "@graphql-tools/graphql-file-loader": "^8.0.0", + "@graphql-tools/json-file-loader": "^8.0.0", + "@graphql-tools/load": "^8.1.0", + "@graphql-tools/prisma-loader": "^8.0.0", + "@graphql-tools/url-loader": "^8.0.0", "@graphql-tools/utils": "^10.0.0", - "change-case-all": "1.0.15", - "common-tags": "1.8.2", - "import-from": "4.0.0", - "lodash": "~4.17.0", - "tslib": "~2.6.0" + "@whatwg-node/fetch": "^0.10.0", + "chalk": "^4.1.0", + "cosmiconfig": "^8.1.3", + "debounce": "^1.2.0", + "detect-indent": "^6.0.0", + "graphql-config": "^5.1.1", + "inquirer": "^8.0.0", + "is-glob": "^4.0.1", + "jiti": "^1.17.1", + "json-to-pretty-yaml": "^1.2.2", + "listr2": "^4.0.5", + "log-symbols": "^4.0.0", + "micromatch": "^4.0.5", + "shell-quote": "^1.7.3", + "string-env-interpolation": "^1.0.1", + "ts-log": "^2.2.3", + "tslib": "^2.4.0", + "yaml": "^2.3.1", + "yargs": "^17.0.0" + }, + "bin": { + "gql-gen": "cjs/bin.js", + "graphql-code-generator": "cjs/bin.js", + "graphql-codegen": "cjs/bin.js", + "graphql-codegen-esm": "esm/bin.js" }, "engines": { "node": ">=16" }, "peerDependencies": { + "@parcel/watcher": "^2.1.0", "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + }, + "peerDependenciesMeta": { + "@parcel/watcher": { + "optional": true + } } }, - "node_modules/@graphql-codegen/schema-ast": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@graphql-codegen/schema-ast/-/schema-ast-4.1.0.tgz", - "integrity": "sha512-kZVn0z+th9SvqxfKYgztA6PM7mhnSZaj4fiuBWvMTqA+QqQ9BBed6Pz41KuD/jr0gJtnlr2A4++/0VlpVbCTmQ==", + "node_modules/@graphql-codegen/cli/node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-codegen/plugin-helpers": "^5.0.3", - "@graphql-tools/utils": "^10.0.0", - "tslib": "~2.6.0" + "type-fest": "^0.21.3" }, - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@graphql-codegen/typed-document-node": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@graphql-codegen/typed-document-node/-/typed-document-node-5.1.1.tgz", - "integrity": "sha512-Bp/BrMZDKRwzuVeLv+pSljneqONM7gqu57ZaV34Jbncu2hZWMRDMfizTKghoEwwZbRCYYfJO9tA0sYVVIfI1kg==", + "node_modules/@graphql-codegen/cli/node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-codegen/plugin-helpers": "^5.1.0", - "@graphql-codegen/visitor-plugin-common": "5.8.0", - "auto-bind": "~4.0.0", - "change-case-all": "1.0.15", - "tslib": "~2.6.0" + "restore-cursor": "^3.1.0" }, "engines": { - "node": ">=16" - }, - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + "node": ">=8" } }, - "node_modules/@graphql-codegen/typescript": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript/-/typescript-4.1.6.tgz", - "integrity": "sha512-vpw3sfwf9A7S+kIUjyFxuvrywGxd4lmwmyYnnDVjVE4kSQ6Td3DpqaPTy8aNQ6O96vFoi/bxbZS2BW49PwSUUA==", + "node_modules/@graphql-codegen/cli/node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-codegen/plugin-helpers": "^5.1.0", - "@graphql-codegen/schema-ast": "^4.0.2", - "@graphql-codegen/visitor-plugin-common": "5.8.0", - "auto-bind": "~4.0.0", - "tslib": "~2.6.0" + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" }, "engines": { - "node": ">=16" + "node": ">=8" }, - "peerDependencies": { - "graphql": "^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@graphql-codegen/typescript-operations": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript-operations/-/typescript-operations-4.6.1.tgz", - "integrity": "sha512-k92laxhih7s0WZ8j5WMIbgKwhe64C0As6x+PdcvgZFMudDJ7rPJ/hFqJ9DCRxNjXoHmSjnr6VUuQZq4lT1RzCA==", + "node_modules/@graphql-codegen/cli/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@graphql-codegen/cli/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@graphql-codegen/cli/node_modules/listr2": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-4.0.5.tgz", + "integrity": "sha512-juGHV1doQdpNT3GSTs9IUN43QJb7KHdF9uqg7Vufs/tG9VTzpFphqF4pm/ICdAABGQxsyNn9CiYA3StkI6jpwA==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-codegen/plugin-helpers": "^5.1.0", - "@graphql-codegen/typescript": "^4.1.6", - "@graphql-codegen/visitor-plugin-common": "5.8.0", - "auto-bind": "~4.0.0", - "tslib": "~2.6.0" + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.5", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" }, "engines": { - "node": ">=16" + "node": ">=12" }, "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", - "graphql-sock": "^1.0.0" + "enquirer": ">= 2.3.0 < 3" }, "peerDependenciesMeta": { - "graphql-sock": { + "enquirer": { "optional": true } } }, - "node_modules/@graphql-codegen/visitor-plugin-common": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-5.8.0.tgz", - "integrity": "sha512-lC1E1Kmuzi3WZUlYlqB4fP6+CvbKH9J+haU1iWmgsBx5/sO2ROeXJG4Dmt8gP03bI2BwjiwV5WxCEMlyeuzLnA==", + "node_modules/@graphql-codegen/cli/node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-codegen/plugin-helpers": "^5.1.0", - "@graphql-tools/optimize": "^2.0.0", - "@graphql-tools/relay-operation-optimizer": "^7.0.0", - "@graphql-tools/utils": "^10.0.0", - "auto-bind": "~4.0.0", - "change-case-all": "1.0.15", - "dependency-graph": "^0.11.0", - "graphql-tag": "^2.11.0", - "parse-filepath": "^1.0.2", - "tslib": "~2.6.0" + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" }, "engines": { - "node": ">=16" + "node": ">=10" }, - "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@graphql-hive/signal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@graphql-hive/signal/-/signal-1.0.0.tgz", - "integrity": "sha512-RiwLMc89lTjvyLEivZ/qxAC5nBHoS2CtsWFSOsN35sxG9zoo5Z+JsFHM8MlvmO9yt+MJNIyC5MLE1rsbOphlag==", + "node_modules/@graphql-codegen/cli/node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, "engines": { - "node": ">=18.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/@graphql-tools/apollo-engine-loader": { - "version": "8.0.20", - "resolved": "https://registry.npmjs.org/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-8.0.20.tgz", - "integrity": "sha512-m5k9nXSyjq31yNsEqDXLyykEjjn3K3Mo73oOKI+Xjy8cpnsgbT4myeUJIYYQdLrp7fr9Y9p7ZgwT5YcnwmnAbA==", + "node_modules/@graphql-codegen/cli/node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/utils": "^10.8.6", - "@whatwg-node/fetch": "^0.10.0", - "sync-fetch": "0.6.0-2", - "tslib": "^2.4.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "node": ">=8" } }, - "node_modules/@graphql-tools/batch-execute": { - "version": "9.0.16", - "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-9.0.16.tgz", - "integrity": "sha512-sLAzEPrmrMTJrlNqmmsc34DtMA//FsoTsGC3V5bHA+EnNlwbwhsSQBSNXvIwsPLRSRwSjGKOpDG7KSxldDe2Rg==", + "node_modules/@graphql-codegen/cli/node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/utils": "^10.8.1", - "@whatwg-node/promise-helpers": "^1.3.0", - "dataloader": "^2.2.3", - "tslib": "^2.8.1" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "node": ">=8" } }, - "node_modules/@graphql-tools/batch-execute/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/@graphql-tools/code-file-loader": { - "version": "8.1.20", - "resolved": "https://registry.npmjs.org/@graphql-tools/code-file-loader/-/code-file-loader-8.1.20.tgz", - "integrity": "sha512-GzIbjjWJIc04KWnEr8VKuPe0FA2vDTlkaeub5p4lLimljnJ6C0QSkOyCUnFmsB9jetQcHm0Wfmn/akMnFUG+wA==", + "node_modules/@graphql-codegen/cli/node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/graphql-tag-pluck": "8.3.19", - "@graphql-tools/utils": "^10.8.6", - "globby": "^11.0.3", - "tslib": "^2.4.0", - "unixify": "^1.0.0" + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" }, "engines": { - "node": ">=16.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "node": ">=8" } }, - "node_modules/@graphql-tools/delegate": { - "version": "10.2.18", - "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-10.2.18.tgz", - "integrity": "sha512-UynhjLwBZUapjNSHJ7FhGMd7/sRjqB7nk6EcYDZFWQkACTaQKa14Vkv2y2O6rEu61xQxP3/E1+fr/mLn46Zf9A==", + "node_modules/@graphql-codegen/cli/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/batch-execute": "^9.0.16", - "@graphql-tools/executor": "^1.4.7", - "@graphql-tools/schema": "^10.0.11", - "@graphql-tools/utils": "^10.8.1", - "@repeaterjs/repeater": "^3.0.6", - "@whatwg-node/promise-helpers": "^1.3.0", - "dataloader": "^2.2.3", - "dset": "^3.1.2", - "tslib": "^2.8.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" }, "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "node": ">=8" } }, - "node_modules/@graphql-tools/delegate/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "node_modules/@graphql-codegen/cli/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, - "license": "0BSD" + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/@graphql-tools/documents": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@graphql-tools/documents/-/documents-1.0.1.tgz", - "integrity": "sha512-aweoMH15wNJ8g7b2r4C4WRuJxZ0ca8HtNO54rkye/3duxTkW4fGBEutCx03jCIr5+a1l+4vFJNP859QnAVBVCA==", + "node_modules/@graphql-codegen/cli/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", "dependencies": { - "lodash.sortby": "^4.7.0", - "tslib": "^2.4.0" + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=10" }, - "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@graphql-tools/executor": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor/-/executor-1.4.7.tgz", - "integrity": "sha512-U0nK9jzJRP9/9Izf1+0Gggd6K6RNRsheFo1gC/VWzfnsr0qjcOSS9qTjY0OTC5iTPt4tQ+W5Zpw/uc7mebI6aA==", + "node_modules/@graphql-codegen/client-preset": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/@graphql-codegen/client-preset/-/client-preset-4.8.1.tgz", + "integrity": "sha512-XLF2V7WKLnepvrGE44JP+AvjS+Oz9AT0oYgTl/6d9btQ+2VYFcmwQPjNAuMVHipqE9I6h8hSEfH9hUrzUptB1g==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/utils": "^10.8.6", - "@graphql-typed-document-node/core": "^3.2.0", - "@repeaterjs/repeater": "^3.0.4", - "@whatwg-node/disposablestack": "^0.0.6", - "@whatwg-node/promise-helpers": "^1.0.0", - "tslib": "^2.4.0" + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/template": "^7.20.7", + "@graphql-codegen/add": "^5.0.3", + "@graphql-codegen/gql-tag-operations": "4.0.17", + "@graphql-codegen/plugin-helpers": "^5.1.0", + "@graphql-codegen/typed-document-node": "^5.1.1", + "@graphql-codegen/typescript": "^4.1.6", + "@graphql-codegen/typescript-operations": "^4.6.1", + "@graphql-codegen/visitor-plugin-common": "^5.8.0", + "@graphql-tools/documents": "^1.0.0", + "@graphql-tools/utils": "^10.0.0", + "@graphql-typed-document-node/core": "3.2.0", + "tslib": "~2.6.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=16" }, "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", + "graphql-sock": "^1.0.0" + }, + "peerDependenciesMeta": { + "graphql-sock": { + "optional": true + } } }, - "node_modules/@graphql-tools/executor-common": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor-common/-/executor-common-0.0.4.tgz", - "integrity": "sha512-SEH/OWR+sHbknqZyROCFHcRrbZeUAyjCsgpVWCRjqjqRbiJiXq6TxNIIOmpXgkrXWW/2Ev4Wms6YSGJXjdCs6Q==", + "node_modules/@graphql-codegen/core": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@graphql-codegen/core/-/core-4.0.2.tgz", + "integrity": "sha512-IZbpkhwVqgizcjNiaVzNAzm/xbWT6YnGgeOLwVjm4KbJn3V2jchVtuzHH09G5/WkkLSk2wgbXNdwjM41JxO6Eg==", "dev": true, "license": "MIT", "dependencies": { - "@envelop/core": "^5.2.3", - "@graphql-tools/utils": "^10.8.1" - }, - "engines": { - "node": ">=18.0.0" + "@graphql-codegen/plugin-helpers": "^5.0.3", + "@graphql-tools/schema": "^10.0.0", + "@graphql-tools/utils": "^10.0.0", + "tslib": "~2.6.0" }, "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, - "node_modules/@graphql-tools/executor-graphql-ws": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-2.0.5.tgz", - "integrity": "sha512-gI/D9VUzI1Jt1G28GYpvm5ckupgJ5O8mi5Y657UyuUozX34ErfVdZ81g6oVcKFQZ60LhCzk7jJeykK48gaLhDw==", + "node_modules/@graphql-codegen/gql-tag-operations": { + "version": "4.0.17", + "resolved": "https://registry.npmjs.org/@graphql-codegen/gql-tag-operations/-/gql-tag-operations-4.0.17.tgz", + "integrity": "sha512-2pnvPdIG6W9OuxkrEZ6hvZd142+O3B13lvhrZ48yyEBh2ujtmKokw0eTwDHtlXUqjVS0I3q7+HB2y12G/m69CA==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/executor-common": "^0.0.4", - "@graphql-tools/utils": "^10.8.1", - "@whatwg-node/disposablestack": "^0.0.6", - "graphql-ws": "^6.0.3", - "isomorphic-ws": "^5.0.0", - "tslib": "^2.8.1", - "ws": "^8.17.1" + "@graphql-codegen/plugin-helpers": "^5.1.0", + "@graphql-codegen/visitor-plugin-common": "5.8.0", + "@graphql-tools/utils": "^10.0.0", + "auto-bind": "~4.0.0", + "tslib": "~2.6.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=16" }, "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, - "node_modules/@graphql-tools/executor-graphql-ws/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/@graphql-tools/executor-http": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor-http/-/executor-http-1.3.3.tgz", - "integrity": "sha512-LIy+l08/Ivl8f8sMiHW2ebyck59JzyzO/yF9SFS4NH6MJZUezA1xThUXCDIKhHiD56h/gPojbkpcFvM2CbNE7A==", + "node_modules/@graphql-codegen/plugin-helpers": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/plugin-helpers/-/plugin-helpers-5.1.0.tgz", + "integrity": "sha512-Y7cwEAkprbTKzVIe436TIw4w03jorsMruvCvu0HJkavaKMQbWY+lQ1RIuROgszDbxAyM35twB5/sUvYG5oW+yg==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-hive/signal": "^1.0.0", - "@graphql-tools/executor-common": "^0.0.4", - "@graphql-tools/utils": "^10.8.1", - "@repeaterjs/repeater": "^3.0.4", - "@whatwg-node/disposablestack": "^0.0.6", - "@whatwg-node/fetch": "^0.10.4", - "@whatwg-node/promise-helpers": "^1.3.0", - "meros": "^1.2.1", - "tslib": "^2.8.1" + "@graphql-tools/utils": "^10.0.0", + "change-case-all": "1.0.15", + "common-tags": "1.8.2", + "import-from": "4.0.0", + "lodash": "~4.17.0", + "tslib": "~2.6.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=16" }, "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, - "node_modules/@graphql-tools/executor-http/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/@graphql-tools/executor-legacy-ws": { - "version": "1.1.17", - "resolved": "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-1.1.17.tgz", - "integrity": "sha512-TvltY6eL4DY1Vt66Z8kt9jVmNcI+WkvVPQZrPbMCM3rv2Jw/sWvSwzUBezRuWX0sIckMifYVh23VPcGBUKX/wg==", + "node_modules/@graphql-codegen/schema-ast": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/schema-ast/-/schema-ast-4.1.0.tgz", + "integrity": "sha512-kZVn0z+th9SvqxfKYgztA6PM7mhnSZaj4fiuBWvMTqA+QqQ9BBed6Pz41KuD/jr0gJtnlr2A4++/0VlpVbCTmQ==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/utils": "^10.8.6", - "@types/ws": "^8.0.0", - "isomorphic-ws": "^5.0.0", - "tslib": "^2.4.0", - "ws": "^8.17.1" - }, - "engines": { - "node": ">=16.0.0" + "@graphql-codegen/plugin-helpers": "^5.0.3", + "@graphql-tools/utils": "^10.0.0", + "tslib": "~2.6.0" }, "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, - "node_modules/@graphql-tools/git-loader": { - "version": "8.0.24", - "resolved": "https://registry.npmjs.org/@graphql-tools/git-loader/-/git-loader-8.0.24.tgz", - "integrity": "sha512-ypLC9N2bKNC0QNbrEBTbWKwbV607f7vK2rSGi9uFeGr8E29tWplo6or9V/+TM0ZfIkUsNp/4QX/zKTgo8SbwQg==", + "node_modules/@graphql-codegen/typed-document-node": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typed-document-node/-/typed-document-node-5.1.1.tgz", + "integrity": "sha512-Bp/BrMZDKRwzuVeLv+pSljneqONM7gqu57ZaV34Jbncu2hZWMRDMfizTKghoEwwZbRCYYfJO9tA0sYVVIfI1kg==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/graphql-tag-pluck": "8.3.19", - "@graphql-tools/utils": "^10.8.6", - "is-glob": "4.0.3", - "micromatch": "^4.0.8", - "tslib": "^2.4.0", - "unixify": "^1.0.0" + "@graphql-codegen/plugin-helpers": "^5.1.0", + "@graphql-codegen/visitor-plugin-common": "5.8.0", + "auto-bind": "~4.0.0", + "change-case-all": "1.0.15", + "tslib": "~2.6.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=16" }, "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, - "node_modules/@graphql-tools/git-loader/node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "node_modules/@graphql-codegen/typescript": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript/-/typescript-4.1.6.tgz", + "integrity": "sha512-vpw3sfwf9A7S+kIUjyFxuvrywGxd4lmwmyYnnDVjVE4kSQ6Td3DpqaPTy8aNQ6O96vFoi/bxbZS2BW49PwSUUA==", "dev": true, "license": "MIT", "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" + "@graphql-codegen/plugin-helpers": "^5.1.0", + "@graphql-codegen/schema-ast": "^4.0.2", + "@graphql-codegen/visitor-plugin-common": "5.8.0", + "auto-bind": "~4.0.0", + "tslib": "~2.6.0" }, "engines": { - "node": ">=8.6" + "node": ">=16" + }, + "peerDependencies": { + "graphql": "^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, - "node_modules/@graphql-tools/github-loader": { - "version": "8.0.20", - "resolved": "https://registry.npmjs.org/@graphql-tools/github-loader/-/github-loader-8.0.20.tgz", - "integrity": "sha512-Icch8bKZ1iP3zXCB9I0ded1hda9NPskSSalw7ZM21kXvLiOR5nZhdqPF65gCFkIKo+O4NR4Bp51MkKj+wl+vpg==", + "node_modules/@graphql-codegen/typescript-operations": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/@graphql-codegen/typescript-operations/-/typescript-operations-4.6.1.tgz", + "integrity": "sha512-k92laxhih7s0WZ8j5WMIbgKwhe64C0As6x+PdcvgZFMudDJ7rPJ/hFqJ9DCRxNjXoHmSjnr6VUuQZq4lT1RzCA==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/executor-http": "^1.1.9", - "@graphql-tools/graphql-tag-pluck": "^8.3.19", - "@graphql-tools/utils": "^10.8.6", - "@whatwg-node/fetch": "^0.10.0", - "@whatwg-node/promise-helpers": "^1.0.0", - "sync-fetch": "0.6.0-2", - "tslib": "^2.4.0" + "@graphql-codegen/plugin-helpers": "^5.1.0", + "@graphql-codegen/typescript": "^4.1.6", + "@graphql-codegen/visitor-plugin-common": "5.8.0", + "auto-bind": "~4.0.0", + "tslib": "~2.6.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=16" }, "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", + "graphql-sock": "^1.0.0" + }, + "peerDependenciesMeta": { + "graphql-sock": { + "optional": true + } } }, - "node_modules/@graphql-tools/graphql-file-loader": { - "version": "8.0.19", - "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-8.0.19.tgz", - "integrity": "sha512-kyEZL4rRJ5LelfCXL3GLgbMiu5Zd7memZaL8ZxPXGI7DA8On1e5IVBH3zZJwf7LzhjSVnPaHM7O/bRzGvTbXzQ==", + "node_modules/@graphql-codegen/visitor-plugin-common": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@graphql-codegen/visitor-plugin-common/-/visitor-plugin-common-5.8.0.tgz", + "integrity": "sha512-lC1E1Kmuzi3WZUlYlqB4fP6+CvbKH9J+haU1iWmgsBx5/sO2ROeXJG4Dmt8gP03bI2BwjiwV5WxCEMlyeuzLnA==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/import": "7.0.18", - "@graphql-tools/utils": "^10.8.6", - "globby": "^11.0.3", - "tslib": "^2.4.0", - "unixify": "^1.0.0" + "@graphql-codegen/plugin-helpers": "^5.1.0", + "@graphql-tools/optimize": "^2.0.0", + "@graphql-tools/relay-operation-optimizer": "^7.0.0", + "@graphql-tools/utils": "^10.0.0", + "auto-bind": "~4.0.0", + "change-case-all": "1.0.15", + "dependency-graph": "^0.11.0", + "graphql-tag": "^2.11.0", + "parse-filepath": "^1.0.2", + "tslib": "~2.6.0" }, "engines": { - "node": ">=16.0.0" + "node": ">=16" }, "peerDependencies": { - "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0" } }, - "node_modules/@graphql-tools/graphql-tag-pluck": { - "version": "8.3.19", - "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-8.3.19.tgz", - "integrity": "sha512-LEw/6IYOUz48HjbWntZXDCzSXsOIM1AyWZrlLoJOrA8QAlhFd8h5Tny7opCypj8FO9VvpPFugWoNDh5InPOEQA==", + "node_modules/@graphql-hive/signal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@graphql-hive/signal/-/signal-1.0.0.tgz", + "integrity": "sha512-RiwLMc89lTjvyLEivZ/qxAC5nBHoS2CtsWFSOsN35sxG9zoo5Z+JsFHM8MlvmO9yt+MJNIyC5MLE1rsbOphlag==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@graphql-tools/apollo-engine-loader": { + "version": "8.0.20", + "resolved": "https://registry.npmjs.org/@graphql-tools/apollo-engine-loader/-/apollo-engine-loader-8.0.20.tgz", + "integrity": "sha512-m5k9nXSyjq31yNsEqDXLyykEjjn3K3Mo73oOKI+Xjy8cpnsgbT4myeUJIYYQdLrp7fr9Y9p7ZgwT5YcnwmnAbA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/core": "^7.26.10", - "@babel/parser": "^7.26.10", - "@babel/plugin-syntax-import-assertions": "^7.26.0", - "@babel/traverse": "^7.26.10", - "@babel/types": "^7.26.10", "@graphql-tools/utils": "^10.8.6", + "@whatwg-node/fetch": "^0.10.0", + "sync-fetch": "0.6.0-2", "tslib": "^2.4.0" }, "engines": { @@ -3503,31 +3525,40 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@graphql-tools/import": { - "version": "7.0.18", - "resolved": "https://registry.npmjs.org/@graphql-tools/import/-/import-7.0.18.tgz", - "integrity": "sha512-1tw1/1QLB0n5bPWfIrhCRnrHIlbMvbwuifDc98g4FPhJ7OXD+iUQe+IpmD5KHVwYWXWhZOuJuq45DfV/WLNq3A==", + "node_modules/@graphql-tools/batch-execute": { + "version": "9.0.16", + "resolved": "https://registry.npmjs.org/@graphql-tools/batch-execute/-/batch-execute-9.0.16.tgz", + "integrity": "sha512-sLAzEPrmrMTJrlNqmmsc34DtMA//FsoTsGC3V5bHA+EnNlwbwhsSQBSNXvIwsPLRSRwSjGKOpDG7KSxldDe2Rg==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/utils": "^10.8.6", - "resolve-from": "5.0.0", - "tslib": "^2.4.0" + "@graphql-tools/utils": "^10.8.1", + "@whatwg-node/promise-helpers": "^1.3.0", + "dataloader": "^2.2.3", + "tslib": "^2.8.1" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@graphql-tools/json-file-loader": { - "version": "8.0.18", - "resolved": "https://registry.npmjs.org/@graphql-tools/json-file-loader/-/json-file-loader-8.0.18.tgz", - "integrity": "sha512-JjjIxxewgk8HeMR3npR3YbOkB7fxmdgmqB9kZLWdkRKBxrRXVzhryyq+mhmI0Evzt6pNoHIc3vqwmSctG2sddg==", + "node_modules/@graphql-tools/batch-execute/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@graphql-tools/code-file-loader": { + "version": "8.1.20", + "resolved": "https://registry.npmjs.org/@graphql-tools/code-file-loader/-/code-file-loader-8.1.20.tgz", + "integrity": "sha512-GzIbjjWJIc04KWnEr8VKuPe0FA2vDTlkaeub5p4lLimljnJ6C0QSkOyCUnFmsB9jetQcHm0Wfmn/akMnFUG+wA==", "dev": true, "license": "MIT", "dependencies": { + "@graphql-tools/graphql-tag-pluck": "8.3.19", "@graphql-tools/utils": "^10.8.6", "globby": "^11.0.3", "tslib": "^2.4.0", @@ -3540,33 +3571,45 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@graphql-tools/load": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/load/-/load-8.1.0.tgz", - "integrity": "sha512-OGfOm09VyXdNGJS/rLqZ6ztCiG2g6AMxhwtET8GZXTbnjptFc17GtKwJ3Jv5w7mjJ8dn0BHydvIuEKEUK4ciYw==", + "node_modules/@graphql-tools/delegate": { + "version": "10.2.18", + "resolved": "https://registry.npmjs.org/@graphql-tools/delegate/-/delegate-10.2.18.tgz", + "integrity": "sha512-UynhjLwBZUapjNSHJ7FhGMd7/sRjqB7nk6EcYDZFWQkACTaQKa14Vkv2y2O6rEu61xQxP3/E1+fr/mLn46Zf9A==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/schema": "^10.0.23", - "@graphql-tools/utils": "^10.8.6", - "p-limit": "3.1.0", - "tslib": "^2.4.0" + "@graphql-tools/batch-execute": "^9.0.16", + "@graphql-tools/executor": "^1.4.7", + "@graphql-tools/schema": "^10.0.11", + "@graphql-tools/utils": "^10.8.1", + "@repeaterjs/repeater": "^3.0.6", + "@whatwg-node/promise-helpers": "^1.3.0", + "dataloader": "^2.2.3", + "dset": "^3.1.2", + "tslib": "^2.8.1" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@graphql-tools/merge": { - "version": "9.0.24", - "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.0.24.tgz", - "integrity": "sha512-NzWx/Afl/1qHT3Nm1bghGG2l4jub28AdvtG11PoUlmjcIjnFBJMv4vqL0qnxWe8A82peWo4/TkVdjJRLXwgGEw==", + "node_modules/@graphql-tools/delegate/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@graphql-tools/documents": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@graphql-tools/documents/-/documents-1.0.1.tgz", + "integrity": "sha512-aweoMH15wNJ8g7b2r4C4WRuJxZ0ca8HtNO54rkye/3duxTkW4fGBEutCx03jCIr5+a1l+4vFJNP859QnAVBVCA==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/utils": "^10.8.6", + "lodash.sortby": "^4.7.0", "tslib": "^2.4.0" }, "engines": { @@ -3576,13 +3619,18 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@graphql-tools/optimize": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@graphql-tools/optimize/-/optimize-2.0.0.tgz", - "integrity": "sha512-nhdT+CRGDZ+bk68ic+Jw1OZ99YCDIKYA5AlVAnBHJvMawSx9YQqQAIj4refNc1/LRieGiuWvhbG3jvPVYho0Dg==", + "node_modules/@graphql-tools/executor": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor/-/executor-1.4.7.tgz", + "integrity": "sha512-U0nK9jzJRP9/9Izf1+0Gggd6K6RNRsheFo1gC/VWzfnsr0qjcOSS9qTjY0OTC5iTPt4tQ+W5Zpw/uc7mebI6aA==", "dev": true, "license": "MIT", "dependencies": { + "@graphql-tools/utils": "^10.8.6", + "@graphql-typed-document-node/core": "^3.2.0", + "@repeaterjs/repeater": "^3.0.4", + "@whatwg-node/disposablestack": "^0.0.6", + "@whatwg-node/promise-helpers": "^1.0.0", "tslib": "^2.4.0" }, "engines": { @@ -3592,110 +3640,93 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@graphql-tools/prisma-loader": { - "version": "8.0.17", - "resolved": "https://registry.npmjs.org/@graphql-tools/prisma-loader/-/prisma-loader-8.0.17.tgz", - "integrity": "sha512-fnuTLeQhqRbA156pAyzJYN0KxCjKYRU5bz1q/SKOwElSnAU4k7/G1kyVsWLh7fneY78LoMNH5n+KlFV8iQlnyg==", + "node_modules/@graphql-tools/executor-common": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-common/-/executor-common-0.0.4.tgz", + "integrity": "sha512-SEH/OWR+sHbknqZyROCFHcRrbZeUAyjCsgpVWCRjqjqRbiJiXq6TxNIIOmpXgkrXWW/2Ev4Wms6YSGJXjdCs6Q==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/url-loader": "^8.0.15", - "@graphql-tools/utils": "^10.5.6", - "@types/js-yaml": "^4.0.0", - "@whatwg-node/fetch": "^0.10.0", - "chalk": "^4.1.0", - "debug": "^4.3.1", - "dotenv": "^16.0.0", - "graphql-request": "^6.0.0", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "jose": "^5.0.0", - "js-yaml": "^4.0.0", - "lodash": "^4.17.20", - "scuid": "^1.1.0", - "tslib": "^2.4.0", - "yaml-ast-parser": "^0.0.43" + "@envelop/core": "^5.2.3", + "@graphql-tools/utils": "^10.8.1" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@graphql-tools/prisma-loader/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/@graphql-tools/prisma-loader/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@graphql-tools/relay-operation-optimizer": { - "version": "7.0.19", - "resolved": "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-7.0.19.tgz", - "integrity": "sha512-xnjLpfzw63yIX1bo+BVh4j1attSwqEkUbpJ+HAhdiSUa3FOQFfpWgijRju+3i87CwhjBANqdTZbcsqLT1hEXig==", + "node_modules/@graphql-tools/executor-graphql-ws": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-graphql-ws/-/executor-graphql-ws-2.0.5.tgz", + "integrity": "sha512-gI/D9VUzI1Jt1G28GYpvm5ckupgJ5O8mi5Y657UyuUozX34ErfVdZ81g6oVcKFQZ60LhCzk7jJeykK48gaLhDw==", "dev": true, "license": "MIT", "dependencies": { - "@ardatan/relay-compiler": "^12.0.3", - "@graphql-tools/utils": "^10.8.6", - "tslib": "^2.4.0" + "@graphql-tools/executor-common": "^0.0.4", + "@graphql-tools/utils": "^10.8.1", + "@whatwg-node/disposablestack": "^0.0.6", + "graphql-ws": "^6.0.3", + "isomorphic-ws": "^5.0.0", + "tslib": "^2.8.1", + "ws": "^8.17.1" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@graphql-tools/schema": { - "version": "10.0.23", - "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.23.tgz", - "integrity": "sha512-aEGVpd1PCuGEwqTXCStpEkmheTHNdMayiIKH1xDWqYp9i8yKv9FRDgkGrY4RD8TNxnf7iII+6KOBGaJ3ygH95A==", + "node_modules/@graphql-tools/executor-graphql-ws/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@graphql-tools/executor-http": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-http/-/executor-http-1.3.3.tgz", + "integrity": "sha512-LIy+l08/Ivl8f8sMiHW2ebyck59JzyzO/yF9SFS4NH6MJZUezA1xThUXCDIKhHiD56h/gPojbkpcFvM2CbNE7A==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/merge": "^9.0.24", - "@graphql-tools/utils": "^10.8.6", - "tslib": "^2.4.0" + "@graphql-hive/signal": "^1.0.0", + "@graphql-tools/executor-common": "^0.0.4", + "@graphql-tools/utils": "^10.8.1", + "@repeaterjs/repeater": "^3.0.4", + "@whatwg-node/disposablestack": "^0.0.6", + "@whatwg-node/fetch": "^0.10.4", + "@whatwg-node/promise-helpers": "^1.3.0", + "meros": "^1.2.1", + "tslib": "^2.8.1" }, "engines": { - "node": ">=16.0.0" + "node": ">=18.0.0" }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@graphql-tools/url-loader": { - "version": "8.0.31", - "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-8.0.31.tgz", - "integrity": "sha512-QGP3py6DAdKERHO5D38Oi+6j+v0O3rkBbnLpyOo87rmIRbwE6sOkL5JeHegHs7EEJ279fBX6lMt8ry0wBMGtyA==", + "node_modules/@graphql-tools/executor-http/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@graphql-tools/executor-legacy-ws": { + "version": "1.1.17", + "resolved": "https://registry.npmjs.org/@graphql-tools/executor-legacy-ws/-/executor-legacy-ws-1.1.17.tgz", + "integrity": "sha512-TvltY6eL4DY1Vt66Z8kt9jVmNcI+WkvVPQZrPbMCM3rv2Jw/sWvSwzUBezRuWX0sIckMifYVh23VPcGBUKX/wg==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/executor-graphql-ws": "^2.0.1", - "@graphql-tools/executor-http": "^1.1.9", - "@graphql-tools/executor-legacy-ws": "^1.1.17", "@graphql-tools/utils": "^10.8.6", - "@graphql-tools/wrap": "^10.0.16", "@types/ws": "^8.0.0", - "@whatwg-node/fetch": "^0.10.0", - "@whatwg-node/promise-helpers": "^1.0.0", "isomorphic-ws": "^5.0.0", - "sync-fetch": "0.6.0-2", "tslib": "^2.4.0", "ws": "^8.17.1" }, @@ -3706,18 +3737,19 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@graphql-tools/utils": { - "version": "10.8.6", - "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.6.tgz", - "integrity": "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==", + "node_modules/@graphql-tools/git-loader": { + "version": "8.0.24", + "resolved": "https://registry.npmjs.org/@graphql-tools/git-loader/-/git-loader-8.0.24.tgz", + "integrity": "sha512-ypLC9N2bKNC0QNbrEBTbWKwbV607f7vK2rSGi9uFeGr8E29tWplo6or9V/+TM0ZfIkUsNp/4QX/zKTgo8SbwQg==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-typed-document-node/core": "^3.1.1", - "@whatwg-node/promise-helpers": "^1.0.0", - "cross-inspect": "1.0.1", - "dset": "^3.1.4", - "tslib": "^2.4.0" + "@graphql-tools/graphql-tag-pluck": "8.3.19", + "@graphql-tools/utils": "^10.8.6", + "is-glob": "4.0.3", + "micromatch": "^4.0.8", + "tslib": "^2.4.0", + "unixify": "^1.0.0" }, "engines": { "node": ">=16.0.0" @@ -3726,283 +3758,584 @@ "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@graphql-tools/wrap": { - "version": "10.0.36", - "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-10.0.36.tgz", - "integrity": "sha512-sLm9j/T6mlKklSMOCDjrGMi39MRAUzRXsc8tTugZZl0yJEtfU7tX1UaYJQNVsar7vkjLofaWtS7Jf6vcWgGYgQ==", + "node_modules/@graphql-tools/git-loader/node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", "dependencies": { - "@graphql-tools/delegate": "^10.2.18", - "@graphql-tools/schema": "^10.0.11", - "@graphql-tools/utils": "^10.8.1", - "@whatwg-node/promise-helpers": "^1.3.0", - "tslib": "^2.8.1" + "braces": "^3.0.3", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=8.6" + } + }, + "node_modules/@graphql-tools/github-loader": { + "version": "8.0.20", + "resolved": "https://registry.npmjs.org/@graphql-tools/github-loader/-/github-loader-8.0.20.tgz", + "integrity": "sha512-Icch8bKZ1iP3zXCB9I0ded1hda9NPskSSalw7ZM21kXvLiOR5nZhdqPF65gCFkIKo+O4NR4Bp51MkKj+wl+vpg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/executor-http": "^1.1.9", + "@graphql-tools/graphql-tag-pluck": "^8.3.19", + "@graphql-tools/utils": "^10.8.6", + "@whatwg-node/fetch": "^0.10.0", + "@whatwg-node/promise-helpers": "^1.0.0", + "sync-fetch": "0.6.0-2", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" }, "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@graphql-tools/wrap/node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "node_modules/@graphql-tools/graphql-file-loader": { + "version": "8.0.19", + "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-file-loader/-/graphql-file-loader-8.0.19.tgz", + "integrity": "sha512-kyEZL4rRJ5LelfCXL3GLgbMiu5Zd7memZaL8ZxPXGI7DA8On1e5IVBH3zZJwf7LzhjSVnPaHM7O/bRzGvTbXzQ==", "dev": true, - "license": "0BSD" + "license": "MIT", + "dependencies": { + "@graphql-tools/import": "7.0.18", + "@graphql-tools/utils": "^10.8.6", + "globby": "^11.0.3", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } }, - "node_modules/@graphql-typed-document-node/core": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", - "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", + "node_modules/@graphql-tools/graphql-tag-pluck": { + "version": "8.3.19", + "resolved": "https://registry.npmjs.org/@graphql-tools/graphql-tag-pluck/-/graphql-tag-pluck-8.3.19.tgz", + "integrity": "sha512-LEw/6IYOUz48HjbWntZXDCzSXsOIM1AyWZrlLoJOrA8QAlhFd8h5Tny7opCypj8FO9VvpPFugWoNDh5InPOEQA==", "dev": true, "license": "MIT", + "dependencies": { + "@babel/core": "^7.26.10", + "@babel/parser": "^7.26.10", + "@babel/plugin-syntax-import-assertions": "^7.26.0", + "@babel/traverse": "^7.26.10", + "@babel/types": "^7.26.10", + "@graphql-tools/utils": "^10.8.6", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=16.0.0" + }, "peerDependencies": { - "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.13", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", - "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "node_modules/@graphql-tools/import": { + "version": "7.0.18", + "resolved": "https://registry.npmjs.org/@graphql-tools/import/-/import-7.0.18.tgz", + "integrity": "sha512-1tw1/1QLB0n5bPWfIrhCRnrHIlbMvbwuifDc98g4FPhJ7OXD+iUQe+IpmD5KHVwYWXWhZOuJuq45DfV/WLNq3A==", "dev": true, + "license": "MIT", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" + "@graphql-tools/utils": "^10.8.6", + "resolve-from": "5.0.0", + "tslib": "^2.4.0" }, "engines": { - "node": ">=10.10.0" + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "node_modules/@graphql-tools/json-file-loader": { + "version": "8.0.18", + "resolved": "https://registry.npmjs.org/@graphql-tools/json-file-loader/-/json-file-loader-8.0.18.tgz", + "integrity": "sha512-JjjIxxewgk8HeMR3npR3YbOkB7fxmdgmqB9kZLWdkRKBxrRXVzhryyq+mhmI0Evzt6pNoHIc3vqwmSctG2sddg==", "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/utils": "^10.8.6", + "globby": "^11.0.3", + "tslib": "^2.4.0", + "unixify": "^1.0.0" + }, "engines": { - "node": ">=12.22" + "node": ">=16.0.0" }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", - "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", - "dev": true - }, - "node_modules/@inquirer/confirm": { - "version": "5.1.9", - "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.9.tgz", - "integrity": "sha512-NgQCnHqFTjF7Ys2fsqK2WtnA8X1kHyInyG+nMIuHowVTIgIuS10T4AznI/PvbqSpJqjCUqNBlKGh1v3bwLFL4w==", + "node_modules/@graphql-tools/load": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/load/-/load-8.1.0.tgz", + "integrity": "sha512-OGfOm09VyXdNGJS/rLqZ6ztCiG2g6AMxhwtET8GZXTbnjptFc17GtKwJ3Jv5w7mjJ8dn0BHydvIuEKEUK4ciYw==", "dev": true, + "license": "MIT", "dependencies": { - "@inquirer/core": "^10.1.10", - "@inquirer/type": "^3.0.6" + "@graphql-tools/schema": "^10.0.23", + "@graphql-tools/utils": "^10.8.6", + "p-limit": "3.1.0", + "tslib": "^2.4.0" }, "engines": { - "node": ">=18" + "node": ">=16.0.0" }, "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@inquirer/core": { - "version": "10.1.10", - "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.10.tgz", - "integrity": "sha512-roDaKeY1PYY0aCqhRmXihrHjoSW2A00pV3Ke5fTpMCkzcGF64R8e0lw3dK+eLEHwS4vB5RnW1wuQmvzoRul8Mw==", + "node_modules/@graphql-tools/merge": { + "version": "9.0.24", + "resolved": "https://registry.npmjs.org/@graphql-tools/merge/-/merge-9.0.24.tgz", + "integrity": "sha512-NzWx/Afl/1qHT3Nm1bghGG2l4jub28AdvtG11PoUlmjcIjnFBJMv4vqL0qnxWe8A82peWo4/TkVdjJRLXwgGEw==", "dev": true, + "license": "MIT", "dependencies": { - "@inquirer/figures": "^1.0.11", - "@inquirer/type": "^3.0.6", - "ansi-escapes": "^4.3.2", - "cli-width": "^4.1.0", - "mute-stream": "^2.0.0", - "signal-exit": "^4.1.0", - "wrap-ansi": "^6.2.0", - "yoctocolors-cjs": "^2.1.2" + "@graphql-tools/utils": "^10.8.6", + "tslib": "^2.4.0" }, "engines": { - "node": ">=18" + "node": ">=16.0.0" }, "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@inquirer/core/node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "node_modules/@graphql-tools/optimize": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@graphql-tools/optimize/-/optimize-2.0.0.tgz", + "integrity": "sha512-nhdT+CRGDZ+bk68ic+Jw1OZ99YCDIKYA5AlVAnBHJvMawSx9YQqQAIj4refNc1/LRieGiuWvhbG3jvPVYho0Dg==", "dev": true, + "license": "MIT", "dependencies": { - "type-fest": "^0.21.3" + "tslib": "^2.4.0" }, "engines": { - "node": ">=8" + "node": ">=16.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@inquirer/core/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/@inquirer/core/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/@graphql-tools/prisma-loader": { + "version": "8.0.17", + "resolved": "https://registry.npmjs.org/@graphql-tools/prisma-loader/-/prisma-loader-8.0.17.tgz", + "integrity": "sha512-fnuTLeQhqRbA156pAyzJYN0KxCjKYRU5bz1q/SKOwElSnAU4k7/G1kyVsWLh7fneY78LoMNH5n+KlFV8iQlnyg==", "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/url-loader": "^8.0.15", + "@graphql-tools/utils": "^10.5.6", + "@types/js-yaml": "^4.0.0", + "@whatwg-node/fetch": "^0.10.0", + "chalk": "^4.1.0", + "debug": "^4.3.1", + "dotenv": "^16.0.0", + "graphql-request": "^6.0.0", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", + "jose": "^5.0.0", + "js-yaml": "^4.0.0", + "lodash": "^4.17.20", + "scuid": "^1.1.0", + "tslib": "^2.4.0", + "yaml-ast-parser": "^0.0.43" + }, "engines": { - "node": ">=8" + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@inquirer/core/node_modules/signal-exit": { + "node_modules/@graphql-tools/prisma-loader/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/@graphql-tools/prisma-loader/node_modules/js-yaml": { "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "engines": { - "node": ">=14" + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" + "bin": { + "js-yaml": "bin/js-yaml.js" } }, - "node_modules/@inquirer/core/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/@graphql-tools/relay-operation-optimizer": { + "version": "7.0.19", + "resolved": "https://registry.npmjs.org/@graphql-tools/relay-operation-optimizer/-/relay-operation-optimizer-7.0.19.tgz", + "integrity": "sha512-xnjLpfzw63yIX1bo+BVh4j1attSwqEkUbpJ+HAhdiSUa3FOQFfpWgijRju+3i87CwhjBANqdTZbcsqLT1hEXig==", "dev": true, + "license": "MIT", "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "@ardatan/relay-compiler": "^12.0.3", + "@graphql-tools/utils": "^10.8.6", + "tslib": "^2.4.0" }, "engines": { - "node": ">=8" + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@inquirer/core/node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "node_modules/@graphql-tools/schema": { + "version": "10.0.23", + "resolved": "https://registry.npmjs.org/@graphql-tools/schema/-/schema-10.0.23.tgz", + "integrity": "sha512-aEGVpd1PCuGEwqTXCStpEkmheTHNdMayiIKH1xDWqYp9i8yKv9FRDgkGrY4RD8TNxnf7iII+6KOBGaJ3ygH95A==", "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/merge": "^9.0.24", + "@graphql-tools/utils": "^10.8.6", + "tslib": "^2.4.0" + }, "engines": { - "node": ">=10" + "node": ">=16.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@inquirer/core/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "node_modules/@graphql-tools/url-loader": { + "version": "8.0.31", + "resolved": "https://registry.npmjs.org/@graphql-tools/url-loader/-/url-loader-8.0.31.tgz", + "integrity": "sha512-QGP3py6DAdKERHO5D38Oi+6j+v0O3rkBbnLpyOo87rmIRbwE6sOkL5JeHegHs7EEJ279fBX6lMt8ry0wBMGtyA==", "dev": true, + "license": "MIT", "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "@graphql-tools/executor-graphql-ws": "^2.0.1", + "@graphql-tools/executor-http": "^1.1.9", + "@graphql-tools/executor-legacy-ws": "^1.1.17", + "@graphql-tools/utils": "^10.8.6", + "@graphql-tools/wrap": "^10.0.16", + "@types/ws": "^8.0.0", + "@whatwg-node/fetch": "^0.10.0", + "@whatwg-node/promise-helpers": "^1.0.0", + "isomorphic-ws": "^5.0.0", + "sync-fetch": "0.6.0-2", + "tslib": "^2.4.0", + "ws": "^8.17.1" }, "engines": { - "node": ">=8" + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@inquirer/figures": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.11.tgz", - "integrity": "sha512-eOg92lvrn/aRUqbxRyvpEWnrvRuTYRifixHkYVpJiygTgVSBIHDqLh0SrMQXkafvULg3ck11V7xvR+zcgvpHFw==", + "node_modules/@graphql-tools/utils": { + "version": "10.8.6", + "resolved": "https://registry.npmjs.org/@graphql-tools/utils/-/utils-10.8.6.tgz", + "integrity": "sha512-Alc9Vyg0oOsGhRapfL3xvqh1zV8nKoFUdtLhXX7Ki4nClaIJXckrA86j+uxEuG3ic6j4jlM1nvcWXRn/71AVLQ==", "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-typed-document-node/core": "^3.1.1", + "@whatwg-node/promise-helpers": "^1.0.0", + "cross-inspect": "1.0.1", + "dset": "^3.1.4", + "tslib": "^2.4.0" + }, "engines": { - "node": ">=18" + "node": ">=16.0.0" + }, + "peerDependencies": { + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@inquirer/type": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.6.tgz", - "integrity": "sha512-/mKVCtVpyBu3IDarv0G+59KC4stsD5mDsGpYh+GKs1NZT88Jh52+cuoA1AtLk2Q0r/quNl+1cSUyLRHBFeD0XA==", + "node_modules/@graphql-tools/wrap": { + "version": "10.0.36", + "resolved": "https://registry.npmjs.org/@graphql-tools/wrap/-/wrap-10.0.36.tgz", + "integrity": "sha512-sLm9j/T6mlKklSMOCDjrGMi39MRAUzRXsc8tTugZZl0yJEtfU7tX1UaYJQNVsar7vkjLofaWtS7Jf6vcWgGYgQ==", "dev": true, + "license": "MIT", + "dependencies": { + "@graphql-tools/delegate": "^10.2.18", + "@graphql-tools/schema": "^10.0.11", + "@graphql-tools/utils": "^10.8.1", + "@whatwg-node/promise-helpers": "^1.3.0", + "tslib": "^2.8.1" + }, "engines": { - "node": ">=18" + "node": ">=18.0.0" }, "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } + "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" } }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "node_modules/@graphql-tools/wrap/node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, + "node_modules/@graphql-typed-document-node/core": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz", + "integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + "@humanwhocodes/object-schema": "^2.0.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" }, "engines": { - "node": ">=12" + "node": ">=10.10.0" } }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "engines": { - "node": ">=12" + "node": ">=12.22" }, "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "dev": true + }, + "node_modules/@inquirer/confirm": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.9.tgz", + "integrity": "sha512-NgQCnHqFTjF7Ys2fsqK2WtnA8X1kHyInyG+nMIuHowVTIgIuS10T4AznI/PvbqSpJqjCUqNBlKGh1v3bwLFL4w==", "dev": true, "dependencies": { - "ansi-regex": "^6.0.1" + "@inquirer/core": "^10.1.10", + "@inquirer/type": "^3.0.6" }, "engines": { - "node": ">=12" + "node": ">=18" }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", + "node_modules/@inquirer/core": { + "version": "10.1.10", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.10.tgz", + "integrity": "sha512-roDaKeY1PYY0aCqhRmXihrHjoSW2A00pV3Ke5fTpMCkzcGF64R8e0lw3dK+eLEHwS4vB5RnW1wuQmvzoRul8Mw==", + "dev": true, + "dependencies": { + "@inquirer/figures": "^1.0.11", + "@inquirer/type": "^3.0.6", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@inquirer/core/node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@inquirer/core/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/@inquirer/core/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/core/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@inquirer/core/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/core/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@inquirer/core/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@inquirer/figures": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.11.tgz", + "integrity": "sha512-eOg92lvrn/aRUqbxRyvpEWnrvRuTYRifixHkYVpJiygTgVSBIHDqLh0SrMQXkafvULg3ck11V7xvR+zcgvpHFw==", + "dev": true, + "engines": { + "node": ">=18" + } + }, + "node_modules/@inquirer/type": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.6.tgz", + "integrity": "sha512-/mKVCtVpyBu3IDarv0G+59KC4stsD5mDsGpYh+GKs1NZT88Jh52+cuoA1AtLk2Q0r/quNl+1cSUyLRHBFeD0XA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", "find-up": "^4.1.0", "get-package-type": "^0.1.0", "js-yaml": "^3.13.1", @@ -4545,17 +4878,17 @@ "@parcel/watcher-win32-x64": "2.5.1" } }, - "node_modules/@parcel/watcher-win32-x64": { + "node_modules/@parcel/watcher-android-arm64": { "version": "2.5.1", - "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", - "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", "cpu": [ - "x64" + "arm64" ], "license": "MIT", "optional": true, "os": [ - "win32" + "android" ], "engines": { "node": ">= 10.0.0" @@ -4565,35 +4898,275 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/@parcel/watcher/node_modules/detect-libc": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", - "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", - "license": "Apache-2.0", - "bin": { - "detect-libc": "bin/detect-libc.js" - }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=0.10" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "dev": true, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "license": "MIT", "optional": true, + "os": [ + "darwin" + ], "engines": { - "node": ">=14" + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" } }, - "node_modules/@polka/url": { - "version": "1.0.0-next.29", - "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", - "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", - "dev": true + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } }, - "node_modules/@radix-ui/colors": { + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher/node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "license": "Apache-2.0", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.29", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz", + "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==", + "dev": true + }, + "node_modules/@radix-ui/colors": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@radix-ui/colors/-/colors-3.0.0.tgz", "integrity": "sha512-FUOsGBkHrYJwCSEtWRCIfQbZG7q1e6DgxCIOe1SUQzDe/7rXXeA47s8yCn6fuTNQAj1Zq4oTFi9Yjp3wzElcxg==", @@ -7148,208 +7721,208 @@ "dev": true }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.44.1.tgz", - "integrity": "sha512-JAcBr1+fgqx20m7Fwe1DxPUl/hPkee6jA6Pl7n1v2EFiktAHenTaXl5aIFjUIEsfn9w3HE4gK1lEgNGMzBDs1w==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", + "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==", "cpu": [ "arm" ], - "license": "MIT", + "dev": true, "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.44.1.tgz", - "integrity": "sha512-RurZetXqTu4p+G0ChbnkwBuAtwAbIwJkycw1n6GvlGlBuS4u5qlr5opix8cBAYFJgaY05TWtM+LaoFggUmbZEQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz", + "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==", "cpu": [ "arm64" ], - "license": "MIT", + "dev": true, "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.44.1.tgz", - "integrity": "sha512-fM/xPesi7g2M7chk37LOnmnSTHLG/v2ggWqKj3CCA1rMA4mm5KVBT1fNoswbo1JhPuNNZrVwpTvlCVggv8A2zg==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz", + "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==", "cpu": [ "arm64" ], - "license": "MIT", + "dev": true, "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.44.1.tgz", - "integrity": "sha512-gDnWk57urJrkrHQ2WVx9TSVTH7lSlU7E3AFqiko+bgjlh78aJ88/3nycMax52VIVjIm3ObXnDL2H00e/xzoipw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz", + "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==", "cpu": [ "x64" ], - "license": "MIT", + "dev": true, "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.44.1.tgz", - "integrity": "sha512-n0edDmSHlXFhrlmTK7XBuwKlG5MbS7yleS1cQ9nn4kIeW+dJH+ExqNgQ0RrFRew8Y+0V/x6C5IjsHrJmiHtkxQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz", + "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==", "cpu": [ "arm" ], - "license": "MIT", + "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.44.1.tgz", - "integrity": "sha512-8WVUPy3FtAsKSpyk21kV52HCxB+me6YkbkFHATzC2Yd3yuqHwy2lbFL4alJOLXKljoRw08Zk8/xEj89cLQ/4Nw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz", + "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==", "cpu": [ "arm" ], - "license": "MIT", + "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.44.1.tgz", - "integrity": "sha512-yuktAOaeOgorWDeFJggjuCkMGeITfqvPgkIXhDqsfKX8J3jGyxdDZgBV/2kj/2DyPaLiX6bPdjJDTu9RB8lUPQ==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz", + "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==", "cpu": [ "arm64" ], - "license": "MIT", + "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.44.1.tgz", - "integrity": "sha512-W+GBM4ifET1Plw8pdVaecwUgxmiH23CfAUj32u8knq0JPFyK4weRy6H7ooxYFD19YxBulL0Ktsflg5XS7+7u9g==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz", + "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==", "cpu": [ "arm64" ], - "license": "MIT", + "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.44.1.tgz", - "integrity": "sha512-Rl3JKaRu0LHIx7ExBAAnf0JcOQetQffaw34T8vLlg9b1IhzcBgaIdnvEbbsZq9uZp3uAH+JkHd20Nwn0h9zPjA==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz", + "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==", "cpu": [ "ppc64" ], - "license": "MIT", + "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.44.1.tgz", - "integrity": "sha512-j5akelU3snyL6K3N/iX7otLBIl347fGwmd95U5gS/7z6T4ftK288jKq3A5lcFKcx7wwzb5rgNvAg3ZbV4BqUSw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz", + "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==", "cpu": [ "riscv64" ], - "license": "MIT", + "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.44.1.tgz", - "integrity": "sha512-Hu6hEdix0oxtUma99jSP7xbvjkUM/ycke/AQQ4EC5g7jNRLLIwjcNwaUy95ZKBJJwg1ZowsclNnjYqzN4zwkAw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz", + "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==", "cpu": [ "s390x" ], - "license": "MIT", + "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.44.1.tgz", - "integrity": "sha512-EtnsrmZGomz9WxK1bR5079zee3+7a+AdFlghyd6VbAjgRJDbTANJ9dcPIPAi76uG05micpEL+gPGmAKYTschQw==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz", + "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==", "cpu": [ "x64" ], - "license": "MIT", + "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.44.1.tgz", - "integrity": "sha512-iAS4p+J1az6Usn0f8xhgL4PaU878KEtutP4hqw52I4IO6AGoyOkHCxcc4bqufv1tQLdDWFx8lR9YlwxKuv3/3g==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz", + "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==", "cpu": [ "x64" ], - "license": "MIT", + "dev": true, "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.44.1.tgz", - "integrity": "sha512-NtSJVKcXwcqozOl+FwI41OH3OApDyLk3kqTJgx8+gp6On9ZEt5mYhIsKNPGuaZr3p9T6NWPKGU/03Vw4CNU9qg==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz", + "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==", "cpu": [ "arm64" ], - "license": "MIT", + "dev": true, "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.44.1.tgz", - "integrity": "sha512-JYA3qvCOLXSsnTR3oiyGws1Dm0YTuxAAeaYGVlGpUsHqloPcFjPg+X0Fj2qODGLNwQOAcCiQmHub/V007kiH5A==", - "cpu": [ + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz", + "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==", + "cpu": [ "ia32" ], - "license": "MIT", + "dev": true, "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.44.1", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.44.1.tgz", - "integrity": "sha512-J8o22LuF0kTe7m+8PvW9wk3/bRq5+mRo5Dqo6+vXb7otCm3TPhYOJqOaQtGU9YMWQSL3krMnoOxMr0+9E6F3Ug==", + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz", + "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==", "cpu": [ "x64" ], - "license": "MIT", + "dev": true, "optional": true, "os": [ "win32" @@ -9900,15 +10473,14 @@ } }, "node_modules/@swc/core": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.12.7.tgz", - "integrity": "sha512-bcpllEihyUSnqp0UtXTvXc19CT4wp3tGWLENhWnjr4B5iEOkzqMu+xHGz1FI5IBatjfqOQb29tgIfv6IL05QaA==", + "version": "1.3.100", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.100.tgz", + "integrity": "sha512-7dKgTyxJjlrMwFZYb1auj3Xq0D8ZBe+5oeIgfMlRU05doXZypYJe0LAk0yjj3WdbwYzpF+T1PLxwTWizI0pckw==", "dev": true, "hasInstallScript": true, - "license": "Apache-2.0", "dependencies": { - "@swc/counter": "^0.1.3", - "@swc/types": "^0.1.23" + "@swc/counter": "^0.1.1", + "@swc/types": "^0.1.5" }, "engines": { "node": ">=10" @@ -9918,19 +10490,18 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.12.7", - "@swc/core-darwin-x64": "1.12.7", - "@swc/core-linux-arm-gnueabihf": "1.12.7", - "@swc/core-linux-arm64-gnu": "1.12.7", - "@swc/core-linux-arm64-musl": "1.12.7", - "@swc/core-linux-x64-gnu": "1.12.7", - "@swc/core-linux-x64-musl": "1.12.7", - "@swc/core-win32-arm64-msvc": "1.12.7", - "@swc/core-win32-ia32-msvc": "1.12.7", - "@swc/core-win32-x64-msvc": "1.12.7" + "@swc/core-darwin-arm64": "1.3.100", + "@swc/core-darwin-x64": "1.3.100", + "@swc/core-linux-arm64-gnu": "1.3.100", + "@swc/core-linux-arm64-musl": "1.3.100", + "@swc/core-linux-x64-gnu": "1.3.100", + "@swc/core-linux-x64-musl": "1.3.100", + "@swc/core-win32-arm64-msvc": "1.3.100", + "@swc/core-win32-ia32-msvc": "1.3.100", + "@swc/core-win32-x64-msvc": "1.3.100" }, "peerDependencies": { - "@swc/helpers": ">=0.5.17" + "@swc/helpers": "^0.5.0" }, "peerDependenciesMeta": { "@swc/helpers": { @@ -9939,14 +10510,13 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.12.7.tgz", - "integrity": "sha512-w6BBT0hBRS56yS+LbReVym0h+iB7/PpCddqrn1ha94ra4rZ4R/A91A/rkv+LnQlPqU/+fhqdlXtCJU9mrhCBtA==", + "version": "1.3.100", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.100.tgz", + "integrity": "sha512-XVWFsKe6ei+SsDbwmsuRkYck1SXRpO60Hioa4hoLwR8fxbA9eVp6enZtMxzVVMBi8ej5seZ4HZQeAWepbukiBw==", "cpu": [ "arm64" ], "dev": true, - "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "darwin" @@ -9956,14 +10526,13 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.12.7.tgz", - "integrity": "sha512-jN6LhFfGOpm4DY2mXPgwH4aa9GLOwublwMVFFZ/bGnHYYCRitLZs9+JWBbyWs7MyGcA246Ew+EREx36KVEAxjA==", + "version": "1.3.100", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.100.tgz", + "integrity": "sha512-KF/MXrnH1nakm1wbt4XV8FS7kvqD9TGmVxeJ0U4bbvxXMvzeYUurzg3AJUTXYmXDhH/VXOYJE5N5RkwZZPs5iA==", "cpu": [ "x64" ], "dev": true, - "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "darwin" @@ -9972,32 +10541,14 @@ "node": ">=10" } }, - "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.12.7.tgz", - "integrity": "sha512-rHn8XXi7G2StEtZRAeJ6c7nhJPDnqsHXmeNrAaYwk8Tvpa6ZYG2nT9E1OQNXj1/dfbSFTjdiA8M8ZvGYBlpBoA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "Apache-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=10" - } - }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.12.7.tgz", - "integrity": "sha512-N15hKizSSh+hkZ2x3TDVrxq0TDcbvDbkQJi2ZrLb9fK+NdFUV/x+XF16ZDPlbxtrGXl1CT7VD439SNaMN9F7qw==", + "version": "1.3.100", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.100.tgz", + "integrity": "sha512-p8hikNnAEJrw5vHCtKiFT4hdlQxk1V7vqPmvUDgL/qe2menQDK/i12tbz7/3BEQ4UqUPnvwpmVn2d19RdEMNxw==", "cpu": [ "arm64" ], "dev": true, - "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "linux" @@ -10007,14 +10558,13 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.12.7.tgz", - "integrity": "sha512-jxyINtBezpxd3eIUDiDXv7UQ87YWlPsM9KumOwJk09FkFSO4oYxV2RT+Wu+Nt5tVWue4N0MdXT/p7SQsDEk4YA==", + "version": "1.3.100", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.100.tgz", + "integrity": "sha512-BWx/0EeY89WC4q3AaIaBSGfQxkYxIlS3mX19dwy2FWJs/O+fMvF9oLk/CyJPOZzbp+1DjGeeoGFuDYpiNO91JA==", "cpu": [ "arm64" ], "dev": true, - "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "linux" @@ -10024,14 +10574,13 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.12.7.tgz", - "integrity": "sha512-PR4tPVwU1BQBfFDk2XfzXxsEIjF3x/bOV1BzZpYvrlkU0TKUDbR4t2wzvsYwD/coW7/yoQmlL70/qnuPtTp1Zw==", + "version": "1.3.100", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.100.tgz", + "integrity": "sha512-XUdGu3dxAkjsahLYnm8WijPfKebo+jHgHphDxaW0ovI6sTdmEGFDew7QzKZRlbYL2jRkUuuKuDGvD6lO5frmhA==", "cpu": [ "x64" ], "dev": true, - "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "linux" @@ -10041,14 +10590,13 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.12.7.tgz", - "integrity": "sha512-zy7JWfQtQItgMfUjSbbcS3DZqQUn2d9VuV0LSGpJxtTXwgzhRpF1S2Sj7cU9hGpbM27Y8RJ4DeFb3qbAufjbrw==", + "version": "1.3.100", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.100.tgz", + "integrity": "sha512-PhoXKf+f0OaNW/GCuXjJ0/KfK9EJX7z2gko+7nVnEA0p3aaPtbP6cq1Ubbl6CMoPL+Ci3gZ7nYumDqXNc3CtLQ==", "cpu": [ "x64" ], "dev": true, - "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "linux" @@ -10058,14 +10606,13 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.12.7.tgz", - "integrity": "sha512-52PeF0tyX04ZFD8nibNhy/GjMFOZWTEWPmIB3wpD1vIJ1po+smtBnEdRRll5WIXITKoiND8AeHlBNBPqcsdcwA==", + "version": "1.3.100", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.100.tgz", + "integrity": "sha512-PwLADZN6F9cXn4Jw52FeP/MCLVHm8vwouZZSOoOScDtihjY495SSjdPnlosMaRSR4wJQssGwiD/4MbpgQPqbAw==", "cpu": [ "arm64" ], "dev": true, - "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "win32" @@ -10075,14 +10622,13 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.12.7.tgz", - "integrity": "sha512-WzQwkNMuhB1qQShT9uUgz/mX2j7NIEPExEtzvGsBT7TlZ9j1kGZ8NJcZH/fwOFcSJL4W7DnkL7nAhx6DBlSPaA==", + "version": "1.3.100", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.100.tgz", + "integrity": "sha512-0f6nicKSLlDKlyPRl2JEmkpBV4aeDfRQg6n8mPqgL7bliZIcDahG0ej+HxgNjZfS3e0yjDxsNRa6sAqWU2Z60A==", "cpu": [ "ia32" ], "dev": true, - "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "win32" @@ -10092,14 +10638,13 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.12.7", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.12.7.tgz", - "integrity": "sha512-R52ivBi2lgjl+Bd3XCPum0YfgbZq/W1AUExITysddP9ErsNSwnreYyNB3exEijiazWGcqHEas2ChiuMOP7NYrA==", + "version": "1.3.100", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.100.tgz", + "integrity": "sha512-b7J0rPoMkRTa3XyUGt8PwCaIBuYWsL2DqbirrQKRESzgCvif5iNpqaM6kjIjI/5y5q1Ycv564CB51YDpiS8EtQ==", "cpu": [ "x64" ], "dev": true, - "license": "Apache-2.0 AND MIT", "optional": true, "os": [ "win32" @@ -10109,21 +10654,16 @@ } }, "node_modules/@swc/counter": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", - "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", - "dev": true, - "license": "Apache-2.0" + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.2.tgz", + "integrity": "sha512-9F4ys4C74eSTEUNndnER3VJ15oru2NumfQxS8geE+f3eB5xvfxpWyqE5XlVnxb/R14uoXi6SLbBwwiDSkv+XEw==", + "dev": true }, "node_modules/@swc/types": { - "version": "0.1.23", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.23.tgz", - "integrity": "sha512-u1iIVZV9Q0jxY+yM2vw/hZGDNudsN85bBpTqzAQ9rzkxW9D+e3aEM4Han+ow518gSewkXgjmEK0BD79ZcNVgPw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@swc/counter": "^0.1.3" - } + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.5.tgz", + "integrity": "sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==", + "dev": true }, "node_modules/@tanstack/react-table": { "version": "8.20.6", @@ -15792,21 +16332,6 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -23881,230 +24406,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/rollup/node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.18.0.tgz", - "integrity": "sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-android-arm64": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.18.0.tgz", - "integrity": "sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.18.0.tgz", - "integrity": "sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-darwin-x64": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.18.0.tgz", - "integrity": "sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.18.0.tgz", - "integrity": "sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.18.0.tgz", - "integrity": "sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.18.0.tgz", - "integrity": "sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.18.0.tgz", - "integrity": "sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.18.0.tgz", - "integrity": "sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.18.0.tgz", - "integrity": "sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.18.0.tgz", - "integrity": "sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.18.0.tgz", - "integrity": "sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.18.0.tgz", - "integrity": "sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.18.0.tgz", - "integrity": "sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.18.0.tgz", - "integrity": "sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/rollup/node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.18.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.18.0.tgz", - "integrity": "sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, "node_modules/rollup/node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", @@ -26773,6 +27074,342 @@ "fsevents": "~2.3.2" } }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/vite/node_modules/@esbuild/win32-x64": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", diff --git a/refact-agent/gui/package.json b/refact-agent/gui/package.json index f0a8a6cde..a3c72f707 100644 --- a/refact-agent/gui/package.json +++ b/refact-agent/gui/package.json @@ -83,7 +83,6 @@ "@storybook/react": "^7.6.4", "@storybook/react-vite": "^8.1.5", "@storybook/test": "^7.6.4", - "@swc/core": "^1.12.7", "@testing-library/dom": "^10.1.0", "@testing-library/react": "^16.0.0", "@testing-library/user-event": "^14.5.1", @@ -157,23 +156,5 @@ "workerDirectory": [ "public" ] - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "^4.44.1", - "@rollup/rollup-android-arm64": "^4.44.1", - "@rollup/rollup-darwin-arm64": "^4.44.1", - "@rollup/rollup-darwin-x64": "^4.44.1", - "@rollup/rollup-linux-arm-gnueabihf": "^4.44.1", - "@rollup/rollup-linux-arm-musleabihf": "^4.44.1", - "@rollup/rollup-linux-arm64-gnu": "^4.44.1", - "@rollup/rollup-linux-arm64-musl": "^4.44.1", - "@rollup/rollup-linux-powerpc64le-gnu": "^4.44.1", - "@rollup/rollup-linux-riscv64-gnu": "^4.44.1", - "@rollup/rollup-linux-s390x-gnu": "^4.44.1", - "@rollup/rollup-linux-x64-gnu": "^4.44.1", - "@rollup/rollup-linux-x64-musl": "^4.44.1", - "@rollup/rollup-win32-arm64-msvc": "^4.44.1", - "@rollup/rollup-win32-ia32-msvc": "^4.44.1", - "@rollup/rollup-win32-x64-msvc": "^4.44.1" } } diff --git a/refact-agent/gui/src/__fixtures__/chat_config_thread.ts b/refact-agent/gui/src/__fixtures__/chat_config_thread.ts index f5adbf6fc..39e59fbb7 100644 --- a/refact-agent/gui/src/__fixtures__/chat_config_thread.ts +++ b/refact-agent/gui/src/__fixtures__/chat_config_thread.ts @@ -493,4 +493,5 @@ export const CHAT_CONFIG_THREAD: Chat = { system_prompt: {}, tool_use: "agent", send_immediately: false, + queued_messages: [], }; diff --git a/refact-agent/gui/src/__fixtures__/msw.ts b/refact-agent/gui/src/__fixtures__/msw.ts index f773b9362..7d8a1449c 100644 --- a/refact-agent/gui/src/__fixtures__/msw.ts +++ b/refact-agent/gui/src/__fixtures__/msw.ts @@ -27,6 +27,16 @@ export const goodCaps: HttpHandler = http.get( }, ); +export const goodCapsWithKnowledgeFeature: HttpHandler = http.get( + "http://127.0.0.1:8001/v1/caps", + () => { + return HttpResponse.json({ + ...STUB_CAPS_RESPONSE, + metadata: { features: ["knowledge"] }, + }); + }, +); + export const emptyCaps: HttpHandler = http.get( `http://127.0.0.1:8001/v1/caps`, () => { diff --git a/refact-agent/gui/src/__tests__/DeleteChat.test.tsx b/refact-agent/gui/src/__tests__/DeleteChat.test.tsx index 277042f02..7887b6292 100644 --- a/refact-agent/gui/src/__tests__/DeleteChat.test.tsx +++ b/refact-agent/gui/src/__tests__/DeleteChat.test.tsx @@ -44,8 +44,6 @@ describe("Delete a Chat form history", () => { history, teams: { group: { id: "123", name: "test" }, - workspace: { ws_id: "123", root_group_name: "test" }, - skipped: false, }, pages: [{ name: "history" }], config: { diff --git a/refact-agent/gui/src/__tests__/RestoreChat.test.tsx b/refact-agent/gui/src/__tests__/RestoreChat.test.tsx index 351718578..144b2bf58 100644 --- a/refact-agent/gui/src/__tests__/RestoreChat.test.tsx +++ b/refact-agent/gui/src/__tests__/RestoreChat.test.tsx @@ -35,8 +35,6 @@ describe("Restore Chat from history", () => { pages: [{ name: "login page" }, { name: "history" }], teams: { group: { id: "123", name: "test" }, - workspace: { ws_id: "123", root_group_name: "test" }, - skipped: false, }, history: { id: { diff --git a/refact-agent/gui/src/__tests__/StartNewChat.test.tsx b/refact-agent/gui/src/__tests__/StartNewChat.test.tsx index d0b298815..62a464abe 100644 --- a/refact-agent/gui/src/__tests__/StartNewChat.test.tsx +++ b/refact-agent/gui/src/__tests__/StartNewChat.test.tsx @@ -12,6 +12,7 @@ import { chatLinks, telemetryChat, telemetryNetwork, + goodCapsWithKnowledgeFeature, } from "../utils/mockServer"; import { InnerApp } from "../features/App"; import { stubResizeObserver } from "../utils/test-utils"; @@ -47,8 +48,6 @@ describe("Start a new chat", () => { pages: [{ name: "history" }], teams: { group: { id: "123", name: "test" }, - workspace: { ws_id: "123", root_group_name: "test" }, - skipped: false, }, config: { apiKey: "test", @@ -65,14 +64,36 @@ describe("Start a new chat", () => { const textarea = app.container.querySelector("textarea"); expect(textarea).not.toBeNull(); }); - test("open chat with New Chat Button when workspace selection is skipped", async () => { + test("open chat with New Chat Button when knowledge feature is available", async () => { + server.use(goodCapsWithKnowledgeFeature); + + const { user, ...app } = render(, { + preloadedState: { + pages: [{ name: "history" }], + teams: { + group: { id: "123", name: "test" }, + }, + config: { + apiKey: "test", + lspPort: 8001, + themeProps: {}, + host: "vscode", + addressURL: "Refact", + }, + }, + }); + const btn = app.getByText("New chat"); + await user.click(btn); + + const textarea = app.container.querySelector("textarea"); + expect(textarea).not.toBeNull(); + }); + test("open chat with New Chat Button when knowledge feature is NOT available", async () => { const { user, ...app } = render(, { preloadedState: { pages: [{ name: "history" }], teams: { group: null, - workspace: null, - skipped: true, }, config: { apiKey: "test", diff --git a/refact-agent/gui/src/__tests__/UserSurvey.test.tsx b/refact-agent/gui/src/__tests__/UserSurvey.test.tsx index 892aefd1b..86f48f919 100644 --- a/refact-agent/gui/src/__tests__/UserSurvey.test.tsx +++ b/refact-agent/gui/src/__tests__/UserSurvey.test.tsx @@ -51,7 +51,7 @@ const saveQuestionnaireMock = http.post( ); describe("Start a new chat", () => { - test.skip("User survey should open when 'questionnaire` is false", async () => { + test("User survey should open when 'questionnaire` is false", async () => { server.use( goodPing, goodCaps, @@ -73,8 +73,6 @@ describe("Start a new chat", () => { pages: [{ name: "history" }], teams: { group: { id: "123", name: "test" }, - workspace: { ws_id: "123", root_group_name: "test" }, - skipped: false, }, config: { apiKey: "test", diff --git a/refact-agent/gui/src/app/storage.ts b/refact-agent/gui/src/app/storage.ts index 05a2515eb..3e4d18558 100644 --- a/refact-agent/gui/src/app/storage.ts +++ b/refact-agent/gui/src/app/storage.ts @@ -52,12 +52,17 @@ function pruneHistory(key: string, item: string) { } function removeOldEntry(key: string) { - if (localStorage.getItem(key)) { + if ( + typeof localStorage !== "undefined" && + typeof localStorage.getItem === "function" && + localStorage.getItem(key) + ) { localStorage.removeItem(key); } } function cleanOldEntries() { + if (typeof localStorage === "undefined") return; removeOldEntry("tour"); removeOldEntry("tipOfTheDay"); removeOldEntry("chatHistory"); diff --git a/refact-agent/gui/src/components/Buttons/Buttons.tsx b/refact-agent/gui/src/components/Buttons/Buttons.tsx index 59f2b3e10..2cbaa4681 100644 --- a/refact-agent/gui/src/components/Buttons/Buttons.tsx +++ b/refact-agent/gui/src/components/Buttons/Buttons.tsx @@ -89,11 +89,9 @@ type AgentUsageLinkButtonProps = ButtonProps & { }; const SUBSCRIPTION_URL = - // "https://refact.smallcloud.ai/refact/update-subscription"; - "https://app.refact.ai/my-workspace"; + "https://refact.smallcloud.ai/refact/update-subscription"; -// const SUBSCRIPTION_FALLBACK_URL = "https://refact.smallcloud.ai/"; -const SUBSCRIPTION_FALLBACK_URL = "https://app.refact.ai/"; +const SUBSCRIPTION_FALLBACK_URL = "https://refact.smallcloud.ai/"; export const AgentUsageLinkButton: React.FC = ({ href, diff --git a/refact-agent/gui/src/components/Buttons/ContextCapButton.tsx b/refact-agent/gui/src/components/Buttons/ContextCapButton.tsx new file mode 100644 index 000000000..f832a28a1 --- /dev/null +++ b/refact-agent/gui/src/components/Buttons/ContextCapButton.tsx @@ -0,0 +1,143 @@ +import React, { useCallback, useMemo } from "react"; +import { useAppDispatch, useAppSelector, useGetCapsQuery } from "../../hooks"; +import { + selectChatId, + selectContextTokensCap, + selectModel, + setContextTokensCap, +} from "../../features/Chat/Thread"; + +import { Select, type SelectProps } from "../Select"; +import { Skeleton } from "@radix-ui/themes"; + +const formatContextSize = (tokens: number): string => { + if (tokens >= 1000000) { + const m = tokens / 1000000; + return Number.isInteger(m) ? `${m}M` : `${Math.round(m)}M`; + } + if (tokens >= 1000) { + const k = tokens / 1000; + return Number.isInteger(k) ? `${k}K` : `${Math.round(k)}K`; + } + return String(tokens); +}; + +const FIXED_OPTIONS = [ + 256 * 1024, // 256K + 200 * 1024, // 200K + 128 * 1024, // 128K + 64 * 1024, // 64K + 32 * 1024, // 32K + 16 * 1024, // 16K (minimum) +]; + +const MIN_CONTEXT_CAP = 16 * 1024; // 16K minimum + +export const ContextCapButton: React.FC = () => { + const dispatch = useAppDispatch(); + const chatId = useAppSelector(selectChatId); + const contextCap = useAppSelector(selectContextTokensCap); + const threadModel = useAppSelector(selectModel); + const capsQuery = useGetCapsQuery(); + + // Derive maxTokens directly from caps data and current model + // This avoids timing issues with threadMaxTokens state updates + const maxTokens = useMemo(() => { + if (!capsQuery.data) return undefined; + + // Use thread model if available in caps + const modelToUse = + threadModel && threadModel in capsQuery.data.chat_models + ? threadModel + : capsQuery.data.chat_default_model; + + if (modelToUse in capsQuery.data.chat_models) { + return capsQuery.data.chat_models[modelToUse].n_ctx; + } + + return undefined; + }, [capsQuery.data, threadModel]); + + const capOptions: SelectProps["options"] = useMemo(() => { + if (!maxTokens) return []; + const options: SelectProps["options"] = []; + + const maxLabel = `${formatContextSize(maxTokens)} (max)`; + options.push({ + value: String(maxTokens), + textValue: maxLabel, + children: maxLabel, + }); + + for (const fixedValue of FIXED_OPTIONS) { + if (fixedValue < maxTokens && fixedValue >= MIN_CONTEXT_CAP) { + const isMin = fixedValue === MIN_CONTEXT_CAP; + const label = isMin + ? `${formatContextSize(fixedValue)} (min)` + : formatContextSize(fixedValue); + options.push({ + value: String(fixedValue), + textValue: label, + children: label, + }); + } + } + + return options; + }, [maxTokens]); + + const handleCapChange = useCallback( + (value: string) => { + dispatch( + setContextTokensCap({ + chatId, + value: parseInt(value, 10), + }), + ); + }, + [dispatch, chatId], + ); + + // Compute a safe default value that's guaranteed to exist in options + const safeDefaultValue = useMemo(() => { + if (!maxTokens || capOptions.length === 0) return undefined; + + // Get all valid option values as numbers + const optionValues = capOptions + .filter( + (opt): opt is SelectProps["options"][number] & { value: string } => + typeof opt === "object" && "value" in opt, + ) + .map((opt) => Number(opt.value)); + + const desiredValue = contextCap ?? maxTokens; + + // If desired value exists in options, use it + if (optionValues.includes(desiredValue)) { + return String(desiredValue); + } + + // Otherwise fall back to maxTokens (always the first option) + return String(maxTokens); + }, [capOptions, contextCap, maxTokens]); + + // Show skeleton while loading caps + if (capsQuery.isLoading || capsQuery.isFetching) { + return ; + } + + if (!maxTokens || capOptions.length === 0 || !safeDefaultValue) return null; + + // Use model + maxTokens as key to force remount when either changes + const selectKey = `${threadModel}-${maxTokens}`; + + return ( +