+
+/* 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 (
+
+ );
+};
diff --git a/refact-agent/gui/src/components/Buttons/SendButton.tsx b/refact-agent/gui/src/components/Buttons/SendButton.tsx
new file mode 100644
index 000000000..3c3dc829a
--- /dev/null
+++ b/refact-agent/gui/src/components/Buttons/SendButton.tsx
@@ -0,0 +1,99 @@
+import React from "react";
+import { DropdownMenu, IconButton, Flex, Badge } from "@radix-ui/themes";
+import {
+ PaperPlaneIcon,
+ CaretDownIcon,
+ ClockIcon,
+ LightningBoltIcon,
+} from "@radix-ui/react-icons";
+
+type SendButtonProps = {
+ disabled?: boolean;
+ isStreaming?: boolean;
+ queuedCount?: number;
+ onSend: () => void;
+ onSendImmediately: () => void;
+};
+
+export const SendButtonWithDropdown: React.FC = ({
+ disabled,
+ isStreaming,
+ queuedCount = 0,
+ onSend,
+ onSendImmediately,
+}) => {
+ const showDropdown = isStreaming && !disabled;
+
+ if (!showDropdown) {
+ return (
+
+ {queuedCount > 0 && (
+
+
+ {queuedCount}
+
+ )}
+ {
+ e.preventDefault();
+ onSend();
+ }}
+ >
+
+
+
+ );
+ }
+
+ return (
+
+ {queuedCount > 0 && (
+
+
+ {queuedCount}
+
+ )}
+
+
+
+
+
+
+
+
+
+ onSend()}>
+
+ Queue message
+
+ onSendImmediately()}>
+
+ Send next
+
+
+
+
+ );
+};
+
+export default SendButtonWithDropdown;
diff --git a/refact-agent/gui/src/components/Buttons/index.tsx b/refact-agent/gui/src/components/Buttons/index.tsx
index 0e3267362..19e422296 100644
--- a/refact-agent/gui/src/components/Buttons/index.tsx
+++ b/refact-agent/gui/src/components/Buttons/index.tsx
@@ -9,4 +9,6 @@ export {
} from "./Buttons";
export { ThinkingButton } from "./ThinkingButton";
+export { ContextCapButton } from "./ContextCapButton";
export { FadedButton } from "./FadedButton";
+export { SendButtonWithDropdown } from "./SendButton";
diff --git a/refact-agent/gui/src/components/Callout/Callout.tsx b/refact-agent/gui/src/components/Callout/Callout.tsx
index 9d6f89d02..341a1fcd0 100644
--- a/refact-agent/gui/src/components/Callout/Callout.tsx
+++ b/refact-agent/gui/src/components/Callout/Callout.tsx
@@ -248,8 +248,7 @@ export const BallanceCallOut: React.FC<
Please{" "}
> = (
Please{" "}
= ({
const chatToolUse = useAppSelector(getSelectedToolUse);
const threadNewChatSuggested = useAppSelector(selectThreadNewChatSuggested);
const messages = useAppSelector(selectMessages);
- const capsForToolUse = useCapsForToolUse();
const { shouldCheckpointsPopupBeShown } = useCheckpoints();
@@ -61,9 +60,9 @@ export const Chat: React.FC = ({
const preventSend = useAppSelector(selectPreventSend);
const onEnableSend = () => dispatch(enableSend({ id: chatId }));
- const handleSummit = useCallback(
- (value: string) => {
- submit({ question: value });
+ const handleSubmit = useCallback(
+ (value: string, sendPolicy?: "immediate" | "after_flow") => {
+ submit({ question: value, sendPolicy });
if (isViewingRawJSON) {
setIsViewingRawJSON(false);
}
@@ -80,11 +79,10 @@ export const Chat: React.FC = ({
return (
@@ -115,7 +113,7 @@ export const Chat: React.FC = ({
@@ -124,13 +122,18 @@ export const Chat: React.FC = ({
{/* Two flexboxes are left for the future UI element on the right side */}
{messages.length > 0 && (
-
- model: {capsForToolUse.currentModel} β’{" "}
+
+
+
+ β’
+
setIsDebugChatHistoryVisible((prev) => !prev)}
+ style={{ cursor: "pointer" }}
>
- mode: {chatToolUse}{" "}
+ mode: {chatToolUse}
{messages.length !== 0 &&
diff --git a/refact-agent/gui/src/components/Chat/EnhancedModelSelector.tsx b/refact-agent/gui/src/components/Chat/EnhancedModelSelector.tsx
new file mode 100644
index 000000000..76fdf3660
--- /dev/null
+++ b/refact-agent/gui/src/components/Chat/EnhancedModelSelector.tsx
@@ -0,0 +1,357 @@
+import React, { useMemo } from "react";
+import {
+ Dialog,
+ Flex,
+ Text,
+ Button,
+ Badge,
+ ScrollArea,
+ Tooltip,
+} from "@radix-ui/themes";
+import { InfoCircledIcon } from "@radix-ui/react-icons";
+import { useCapsForToolUse } from "../../hooks";
+import { CapabilityIcons } from "../../features/Providers/ProviderForm/ProviderModelsList/components";
+import type { ModelCapabilities } from "../../features/Providers/ProviderForm/ProviderModelsList/utils/groupModelsWithPricing";
+import {
+ formatContextWindow,
+ formatPricing,
+} from "../../features/Providers/ProviderForm/ProviderModelsList/utils/groupModelsWithPricing";
+import type { CapCost } from "../../services/refact";
+import {
+ extractProvider,
+ getProviderDisplayName,
+} from "../../utils/modelProviders";
+
+export type EnhancedModelSelectorProps = {
+ disabled?: boolean;
+};
+
+type EnrichedModel = {
+ name: string;
+ displayName: string;
+ value: string;
+ disabled: boolean;
+ pricing?: CapCost;
+ nCtx?: number;
+ capabilities?: ModelCapabilities;
+ isDefault?: boolean;
+ isThinking?: boolean;
+ isLight?: boolean;
+};
+
+/**
+ * Extract capabilities from chat model
+ */
+function extractCapabilitiesFromCaps(
+ modelKey: string,
+ caps: ReturnType["data"],
+): ModelCapabilities | undefined {
+ if (!caps) return undefined;
+
+ const capsModel = caps.chat_models[modelKey];
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
+ if (!capsModel || typeof capsModel !== "object") return undefined;
+
+ return {
+ supportsTools: capsModel.supports_tools,
+ supportsMultimodality: capsModel.supports_multimodality,
+ supportsClicks: capsModel.supports_clicks,
+ supportsAgent: capsModel.supports_agent,
+ supportsReasoning: capsModel.supports_reasoning,
+ supportsBoostReasoning: capsModel.supports_boost_reasoning,
+ };
+}
+
+/**
+ * Get pricing for a model from caps
+ */
+function getPricing(
+ modelName: string,
+ caps: ReturnType["data"],
+): CapCost | undefined {
+ if (!caps?.metadata?.pricing) return undefined;
+
+ const pricing = caps.metadata.pricing;
+
+ // Try exact match
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
+ if (pricing[modelName]) return pricing[modelName];
+
+ // Try without "refact/" prefix
+ const nameWithoutProvider = modelName.replace(/^refact\//, "");
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
+ if (pricing[nameWithoutProvider]) return pricing[nameWithoutProvider];
+
+ return undefined;
+}
+
+export const EnhancedModelSelector: React.FC = ({
+ disabled,
+}) => {
+ const capsForToolUse = useCapsForToolUse();
+ const [open, setOpen] = React.useState(false);
+
+ const groupedModels = useMemo(() => {
+ const caps = capsForToolUse.data;
+ if (!caps) return [];
+
+ const enrichedModels: EnrichedModel[] =
+ capsForToolUse.usableModelsForPlan.map((model) => {
+ const modelKey = model.value;
+ const displayName = model.textValue.replace(/^refact\//, "");
+ const capsModel = caps.chat_models[modelKey];
+ const nCtx =
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
+ typeof capsModel === "object" && capsModel && "n_ctx" in capsModel
+ ? (capsModel.n_ctx as number | undefined)
+ : undefined;
+
+ return {
+ name: displayName,
+ displayName,
+ value: model.value,
+ disabled: model.disabled,
+ pricing: getPricing(displayName, caps),
+ nCtx,
+ capabilities: extractCapabilitiesFromCaps(modelKey, caps),
+ isDefault: caps.chat_default_model === modelKey,
+ isThinking: caps.chat_thinking_model === modelKey,
+ isLight: caps.chat_light_model === modelKey,
+ };
+ });
+
+ // Group by provider
+ const groups = enrichedModels.reduce>(
+ (acc, model) => {
+ const provider = extractProvider(model.value);
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
+ if (!acc[provider]) {
+ acc[provider] = [];
+ }
+ acc[provider].push(model);
+ return acc;
+ },
+ {},
+ );
+
+ // Convert to array and sort
+ return Object.entries(groups)
+ .map(([provider, models]) => ({
+ provider,
+ displayName: getProviderDisplayName(provider),
+ models: models.sort((a, b) => {
+ // Default first
+ if (a.isDefault) return -1;
+ if (b.isDefault) return 1;
+ // Thinking second
+ if (a.isThinking) return -1;
+ if (b.isThinking) return 1;
+ // Light third
+ if (a.isLight) return -1;
+ if (b.isLight) return 1;
+ // Otherwise alphabetical
+ return a.displayName.localeCompare(b.displayName);
+ }),
+ }))
+ .sort((a, b) => {
+ // Prioritize major providers
+ const priority: Record = {
+ openai: 1,
+ anthropic: 2,
+ google: 3,
+ "x.ai": 4,
+ meta: 5,
+ mistral: 6,
+ };
+ const aPri = priority[a.provider] || 999;
+ const bPri = priority[b.provider] || 999;
+ if (aPri !== bPri) return aPri - bPri;
+ return a.displayName.localeCompare(b.displayName);
+ });
+ }, [capsForToolUse.usableModelsForPlan, capsForToolUse.data]);
+
+ const currentModelName = capsForToolUse.currentModel.replace(/^refact\//, "");
+
+ if (!capsForToolUse.data || groupedModels.length === 0) {
+ return (
+
+ model: {currentModelName}
+
+ );
+ }
+
+ return (
+
+
+
+
+
+
+ Select Model
+
+
+
+ {groupedModels.map((group) => (
+
+
+ {group.displayName}
+
+
+
+ {group.models.map((model) => (
+ {
+ capsForToolUse.setCapModel(model.value);
+ setOpen(false);
+ }}
+ />
+ ))}
+
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+type ModelCardProps = {
+ model: EnrichedModel;
+ isSelected: boolean;
+ onSelect: () => void;
+};
+
+const ModelCard: React.FC = ({
+ model,
+ isSelected,
+ onSelect,
+}) => {
+ return (
+ {
+ if (!model.disabled && !isSelected) {
+ e.currentTarget.style.borderColor = "var(--gray-8)";
+ }
+ }}
+ onMouseLeave={(e) => {
+ if (!model.disabled && !isSelected) {
+ e.currentTarget.style.borderColor = "var(--gray-6)";
+ }
+ }}
+ >
+
+
+
+
+ {model.displayName}
+
+
+ {model.isDefault && (
+
+ Default
+
+ )}
+ {model.isThinking && (
+
+ Reasoning
+
+ )}
+ {model.isLight && (
+
+ Light
+
+ )}
+
+
+
+ {model.pricing && (
+
+
+
+ {formatPricing(model.pricing, true)}
+
+
+
+
+ )}
+
+ {model.nCtx && (
+
+
+
+ {formatContextWindow(model.nCtx)}
+
+
+
+
+ )}
+
+ {model.capabilities && (
+
+ )}
+
+
+
+ {isSelected && (
+
+ Selected
+
+ )}
+
+
+ );
+};
diff --git a/refact-agent/gui/src/components/Chat/ModelSelector.tsx b/refact-agent/gui/src/components/Chat/ModelSelector.tsx
new file mode 100644
index 000000000..7a67fdefa
--- /dev/null
+++ b/refact-agent/gui/src/components/Chat/ModelSelector.tsx
@@ -0,0 +1,93 @@
+import React, { useMemo } from "react";
+import { Select, Text, Flex } from "@radix-ui/themes";
+import { useCapsForToolUse } from "../../hooks";
+import { RichModelSelectItem } from "../Select/RichModelSelectItem";
+import { enrichAndGroupModels } from "../../utils/enrichModels";
+import styles from "../Select/select.module.css";
+
+export type ModelSelectorProps = {
+ disabled?: boolean;
+};
+
+export const ModelSelector: React.FC = ({ disabled }) => {
+ const capsForToolUse = useCapsForToolUse();
+
+ const groupedModels = useMemo(
+ () =>
+ enrichAndGroupModels(
+ capsForToolUse.usableModelsForPlan,
+ capsForToolUse.data,
+ ),
+ [capsForToolUse.usableModelsForPlan, capsForToolUse.data],
+ );
+
+ const currentModelName = capsForToolUse.currentModel.replace(/^refact\//, "");
+
+ if (!capsForToolUse.data || groupedModels.length === 0) {
+ return (
+
+ model: {currentModelName}
+
+ );
+ }
+
+ return (
+
+
+ model:
+
+
+
+
+ {groupedModels.map((group) => (
+
+ {group.displayName}
+ {group.models.map((model) => (
+
+
+ {model.displayName}
+
+
+
+
+
+ ))}
+
+ ))}
+
+
+
+ );
+};
diff --git a/refact-agent/gui/src/components/Chat/index.tsx b/refact-agent/gui/src/components/Chat/index.tsx
index 2d56b5039..a630c1f3e 100644
--- a/refact-agent/gui/src/components/Chat/index.tsx
+++ b/refact-agent/gui/src/components/Chat/index.tsx
@@ -1,2 +1,6 @@
export { Chat } from "./Chat";
export type { ChatProps } from "./Chat";
+export { ModelSelector } from "./ModelSelector";
+export type { ModelSelectorProps } from "./ModelSelector";
+export { EnhancedModelSelector } from "./EnhancedModelSelector";
+export type { EnhancedModelSelectorProps } from "./EnhancedModelSelector";
diff --git a/refact-agent/gui/src/components/ChatContent/AssistantInput.tsx b/refact-agent/gui/src/components/ChatContent/AssistantInput.tsx
index be161023f..aba0860ad 100644
--- a/refact-agent/gui/src/components/ChatContent/AssistantInput.tsx
+++ b/refact-agent/gui/src/components/ChatContent/AssistantInput.tsx
@@ -1,30 +1,55 @@
-import React, { useCallback } from "react";
+import React, { useCallback, useMemo } from "react";
import { Markdown } from "../Markdown";
-import { Container, Box } from "@radix-ui/themes";
-import { ToolCall } from "../../services/refact";
+import { Container, Box, Flex, Text, Link, Card } from "@radix-ui/themes";
+import { ToolCall, Usage, WebSearchCitation } from "../../services/refact";
import { ToolContent } from "./ToolsContent";
import { fallbackCopying } from "../../utils/fallbackCopying";
import { telemetryApi } from "../../services/refact/telemetry";
import { LikeButton } from "./LikeButton";
+import { ResendButton } from "./ResendButton";
import { ReasoningContent } from "./ReasoningContent";
+import { MessageUsageInfo } from "./MessageUsageInfo";
type ChatInputProps = {
message: string | null;
reasoningContent?: string | null;
toolCalls?: ToolCall[] | null;
+ serverExecutedTools?: ToolCall[] | null; // Tools that were executed by the provider (srvtoolu_*)
+ citations?: WebSearchCitation[] | null;
isLast?: boolean;
+ usage?: Usage | null;
+ metering_coins_prompt?: number;
+ metering_coins_generated?: number;
+ metering_coins_cache_creation?: number;
+ metering_coins_cache_read?: number;
};
export const AssistantInput: React.FC = ({
message,
reasoningContent,
toolCalls,
+ serverExecutedTools,
+ citations,
isLast,
+ usage,
+ metering_coins_prompt,
+ metering_coins_generated,
+ metering_coins_cache_creation,
+ metering_coins_cache_read,
}) => {
const [sendTelemetryEvent] =
telemetryApi.useLazySendTelemetryChatEventQuery();
+ // Get unique server-executed tool names for display
+ const serverToolNames = useMemo(() => {
+ if (!serverExecutedTools || serverExecutedTools.length === 0) return [];
+ const names = serverExecutedTools
+ .map((tool) => tool.function.name)
+ .filter((name): name is string => !!name);
+ return [...new Set(names)];
+ }, [serverExecutedTools]);
+
const handleCopy = useCallback(
(text: string) => {
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
@@ -60,8 +85,18 @@ export const AssistantInput: React.FC = ({
[sendTelemetryEvent],
);
+ const hasMessageFirst = !reasoningContent && message;
+
return (
+
{reasoningContent && (
= ({
/>
)}
{message && (
-
+
{message}
)}
+ {/* Server-executed tools indicator with citations */}
+ {(serverToolNames.length > 0 || (citations && citations.length > 0)) && (
+
+
+ {serverToolNames.length > 0 && (
+
+ βοΈ
+
+ {serverToolNames.join(", ")}
+
+
+ )}
+ {citations && citations.length > 0 && (
+
+
+ Sources:
+
+ {citations
+ .filter(
+ (citation, idx, arr) =>
+ arr.findIndex((c) => c.url === citation.url) === idx,
+ )
+ .map((citation, idx) => (
+
+ {citation.title}
+
+ ))}
+
+ )}
+
+
+ )}
{toolCalls && }
- {isLast && }
+ {isLast && (
+
+
+
+
+
+
+ )}
);
};
diff --git a/refact-agent/gui/src/components/ChatContent/ChatContent.module.css b/refact-agent/gui/src/components/ChatContent/ChatContent.module.css
index 2186892b1..8a0e328c5 100644
--- a/refact-agent/gui/src/components/ChatContent/ChatContent.module.css
+++ b/refact-agent/gui/src/components/ChatContent/ChatContent.module.css
@@ -124,3 +124,52 @@
margin-top: var(--space-1);
box-sizing: border-box;
}
+
+.tool_result_markdown {
+ width: 100%;
+ box-sizing: border-box;
+
+ /* keep the block feel (like the code block) */
+ border-radius: var(--radius-2);
+ padding: var(--space-2);
+
+ /* tool output can be wide */
+ overflow-x: auto;
+}
+
+/* Preserve indentation/line breaks for plain text paragraphs */
+.tool_result_markdown :global(p) {
+ white-space: pre-wrap;
+ margin: 0;
+}
+
+/* First element (likely a heading/paragraph) has no top margin */
+.tool_result_markdown > :first-child {
+ margin-top: 0 !important;
+}
+
+.queuedMessage {
+ --base-card-surface-box-shadow: 0 0 0 1px
+ color-mix(in oklab, var(--amber-a5), var(--amber-5) 25%);
+ background: var(--color-surface);
+ border-radius: var(--radius-2);
+ padding: var(--space-2) var(--space-3);
+ margin-left: auto;
+ max-width: 85%;
+ opacity: 0.8;
+}
+
+.queuedMessagePriority {
+ --base-card-surface-box-shadow: 0 0 0 1px
+ color-mix(in oklab, var(--blue-a5), var(--blue-5) 25%);
+}
+
+.queuedMessageText {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ display: -webkit-box;
+ -webkit-line-clamp: 3;
+ -webkit-box-orient: vertical;
+ white-space: pre-wrap;
+ word-break: break-word;
+}
diff --git a/refact-agent/gui/src/components/ChatContent/ChatContent.stories.tsx b/refact-agent/gui/src/components/ChatContent/ChatContent.stories.tsx
index 6f6134202..e37fb28c4 100644
--- a/refact-agent/gui/src/components/ChatContent/ChatContent.stories.tsx
+++ b/refact-agent/gui/src/components/ChatContent/ChatContent.stories.tsx
@@ -58,6 +58,7 @@ const MockedStore: React.FC<{
cache: {},
system_prompt: {},
thread: threadData,
+ queued_messages: [],
},
});
diff --git a/refact-agent/gui/src/components/ChatContent/ChatContent.tsx b/refact-agent/gui/src/components/ChatContent/ChatContent.tsx
index 3b66c3677..c77da7238 100644
--- a/refact-agent/gui/src/components/ChatContent/ChatContent.tsx
+++ b/refact-agent/gui/src/components/ChatContent/ChatContent.tsx
@@ -22,6 +22,7 @@ import {
selectIsStreaming,
selectIsWaiting,
selectMessages,
+ selectQueuedMessages,
selectThread,
} from "../../features/Chat/Thread/selectors";
import { takeWhile } from "../../utils";
@@ -31,6 +32,7 @@ import { ChatLinks, UncommittedChangesWarning } from "../ChatLinks";
import { telemetryApi } from "../../services/refact/telemetry";
import { PlaceHolderText } from "./PlaceHolderText";
import { UsageCounter } from "../UsageCounter";
+import { QueuedMessage } from "./QueuedMessage";
import {
getConfirmationPauseStatus,
getPauseReasonsWithPauseStatus,
@@ -50,6 +52,7 @@ export const ChatContent: React.FC = ({
const dispatch = useAppDispatch();
const pauseReasonsWithPause = useAppSelector(getPauseReasonsWithPauseStatus);
const messages = useAppSelector(selectMessages);
+ const queuedMessages = useAppSelector(selectQueuedMessages);
const isStreaming = useAppSelector(selectIsStreaming);
const thread = useAppSelector(selectThread);
const { shouldShow } = useUsageCounter();
@@ -121,6 +124,17 @@ export const ChatContent: React.FC = ({
)}
{renderMessages(messages, onRetryWrapper, isWaiting)}
+ {queuedMessages.length > 0 && (
+
+ {queuedMessages.map((queuedMsg, index) => (
+
+ ))}
+
+ )}
@@ -205,7 +219,14 @@ function renderMessages(
message={head.content}
reasoningContent={head.reasoning_content}
toolCalls={head.tool_calls}
+ serverExecutedTools={head.server_executed_tools}
+ citations={head.citations}
isLast={isLast}
+ usage={head.usage}
+ metering_coins_prompt={head.metering_coins_prompt}
+ metering_coins_generated={head.metering_coins_generated}
+ metering_coins_cache_creation={head.metering_coins_cache_creation}
+ metering_coins_cache_read={head.metering_coins_cache_read}
/>,
];
diff --git a/refact-agent/gui/src/components/ChatContent/ContextFiles.tsx b/refact-agent/gui/src/components/ChatContent/ContextFiles.tsx
index ac1f7a70e..8c348dfdd 100644
--- a/refact-agent/gui/src/components/ChatContent/ContextFiles.tsx
+++ b/refact-agent/gui/src/components/ChatContent/ContextFiles.tsx
@@ -26,7 +26,7 @@ export const Markdown: React.FC<{
return (
);
diff --git a/refact-agent/gui/src/components/ChatContent/LikeButton.tsx b/refact-agent/gui/src/components/ChatContent/LikeButton.tsx
index 4dd2d6016..3f17c9bbe 100644
--- a/refact-agent/gui/src/components/ChatContent/LikeButton.tsx
+++ b/refact-agent/gui/src/components/ChatContent/LikeButton.tsx
@@ -1,5 +1,5 @@
import React from "react";
-import { IconButton, Flex } from "@radix-ui/themes";
+import { IconButton, Tooltip } from "@radix-ui/themes";
import classnames from "classnames";
import { knowledgeApi } from "../../services/refact/knowledge";
import { useAppSelector } from "../../hooks";
@@ -17,13 +17,12 @@ function useCreateMemory() {
const isStreaming = useAppSelector(selectIsStreaming);
const isWaiting = useAppSelector(selectIsWaiting);
const currentProjectName = useSelector(selectThreadProjectOrCurrentProject);
- const [onLike, likeResponse] =
+ const [saveTrajectory, saveResponse] =
knowledgeApi.useCreateNewMemoryFromMessagesMutation();
- const submitLike = React.useCallback(() => {
- // TODO: how to get the project for the chat?
- void onLike({ project: currentProjectName, messages });
- }, [currentProjectName, messages, onLike]);
+ const submitSave = React.useCallback(() => {
+ void saveTrajectory({ project: currentProjectName, messages });
+ }, [currentProjectName, messages, saveTrajectory]);
const shouldShow = React.useMemo(() => {
if (messages.length === 0) return false;
@@ -32,32 +31,32 @@ function useCreateMemory() {
return true;
}, [messages.length, isStreaming, isWaiting]);
- return { submitLike, likeResponse, shouldShow };
+ return { submitSave, saveResponse, shouldShow };
}
export const LikeButton = () => {
- const { submitLike, likeResponse, shouldShow } = useCreateMemory();
+ const { submitSave, saveResponse, shouldShow } = useCreateMemory();
- if (!shouldShow) return false;
+ if (!shouldShow) return null;
return (
-
+
-
+
-
+
);
};
-const ThumbIcon: React.FC = () => {
+const SaveIcon: React.FC = () => {
return (
);
diff --git a/refact-agent/gui/src/components/ChatContent/MessageUsageInfo.tsx b/refact-agent/gui/src/components/ChatContent/MessageUsageInfo.tsx
new file mode 100644
index 000000000..960836741
--- /dev/null
+++ b/refact-agent/gui/src/components/ChatContent/MessageUsageInfo.tsx
@@ -0,0 +1,165 @@
+import React, { useMemo } from "react";
+import { Box, Card, Flex, Text, HoverCard } from "@radix-ui/themes";
+import { Usage } from "../../services/refact";
+import { formatNumberToFixed } from "../../utils/formatNumberToFixed";
+import { calculateUsageInputTokens } from "../../utils/calculateUsageInputTokens";
+import { Coin } from "../../images";
+
+type MessageUsageInfoProps = {
+ usage?: Usage | null;
+ metering_coins_prompt?: number;
+ metering_coins_generated?: number;
+ metering_coins_cache_creation?: number;
+ metering_coins_cache_read?: number;
+ topOffset?: string;
+};
+
+const TokenDisplay: React.FC<{ label: string; value: number }> = ({
+ label,
+ value,
+}) => (
+
+
+ {label}
+
+ {formatNumberToFixed(value)}
+
+);
+
+const CoinDisplay: React.FC<{ label: string; value: number }> = ({
+ label,
+ value,
+}) => (
+
+
+ {label}
+
+
+
+ {Math.round(value)}
+
+
+
+);
+
+export const MessageUsageInfo: React.FC = ({
+ usage,
+ metering_coins_prompt = 0,
+ metering_coins_generated = 0,
+ metering_coins_cache_creation = 0,
+ metering_coins_cache_read = 0,
+ topOffset = "0",
+}) => {
+ const outputTokens = useMemo(() => {
+ return calculateUsageInputTokens({
+ usage,
+ keys: ["completion_tokens"],
+ });
+ }, [usage]);
+
+ const totalCoins = useMemo(() => {
+ return (
+ metering_coins_prompt +
+ metering_coins_generated +
+ metering_coins_cache_creation +
+ metering_coins_cache_read
+ );
+ }, [
+ metering_coins_prompt,
+ metering_coins_generated,
+ metering_coins_cache_creation,
+ metering_coins_cache_read,
+ ]);
+
+ const contextTokens = usage?.prompt_tokens ?? 0;
+
+ if (!usage && totalCoins === 0) return null;
+
+ return (
+
+
+
+
+
+ {Math.round(totalCoins)}
+
+
+
+
+
+
+
+ This Message
+
+
+ {usage && (
+ <>
+
+
+ {usage.completion_tokens_details?.reasoning_tokens !== null &&
+ usage.completion_tokens_details?.reasoning_tokens !==
+ undefined &&
+ usage.completion_tokens_details.reasoning_tokens > 0 && (
+
+ )}
+ >
+ )}
+
+ {totalCoins > 0 && (
+ <>
+
+
+
+ Cost
+
+
+
+ {Math.round(totalCoins)}{" "}
+
+
+
+
+ {metering_coins_prompt > 0 && (
+
+ )}
+ {metering_coins_generated > 0 && (
+
+ )}
+ {metering_coins_cache_read > 0 && (
+
+ )}
+ {metering_coins_cache_creation > 0 && (
+
+ )}
+ >
+ )}
+
+
+
+
+ );
+};
diff --git a/refact-agent/gui/src/components/ChatContent/QueuedMessage.tsx b/refact-agent/gui/src/components/ChatContent/QueuedMessage.tsx
new file mode 100644
index 000000000..691d24c96
--- /dev/null
+++ b/refact-agent/gui/src/components/ChatContent/QueuedMessage.tsx
@@ -0,0 +1,84 @@
+import React, { useCallback } from "react";
+import { Flex, Text, IconButton, Card, Badge } from "@radix-ui/themes";
+import {
+ Cross1Icon,
+ ClockIcon,
+ LightningBoltIcon,
+} from "@radix-ui/react-icons";
+import { useAppDispatch } from "../../hooks";
+import { dequeueUserMessage, QueuedUserMessage } from "../../features/Chat";
+import styles from "./ChatContent.module.css";
+import classNames from "classnames";
+
+type QueuedMessageProps = {
+ queuedMessage: QueuedUserMessage;
+ position: number;
+};
+
+function getMessagePreview(message: QueuedUserMessage["message"]): string {
+ if (typeof message.content === "string") {
+ return message.content;
+ }
+ // Handle multimodal content
+ const textPart = message.content.find(
+ (part) => "type" in part && part.type === "text",
+ );
+ if (textPart && "text" in textPart) {
+ return textPart.text;
+ }
+ return "[Image attachment]";
+}
+
+export const QueuedMessage: React.FC = ({
+ queuedMessage,
+ position,
+}) => {
+ const dispatch = useAppDispatch();
+ const isPriority = queuedMessage.priority;
+
+ const handleCancel = useCallback(() => {
+ dispatch(dequeueUserMessage({ queuedId: queuedMessage.id }));
+ }, [dispatch, queuedMessage.id]);
+
+ const preview = getMessagePreview(queuedMessage.message);
+
+ return (
+
+
+
+
+ {isPriority ? (
+
+ ) : (
+
+ )}
+ {position}
+
+
+ {preview}
+
+
+
+
+
+
+
+ );
+};
+
+export default QueuedMessage;
diff --git a/refact-agent/gui/src/components/ChatContent/ReasoningContent/ReasoningContent.tsx b/refact-agent/gui/src/components/ChatContent/ReasoningContent/ReasoningContent.tsx
index 235c8275a..ee3590412 100644
--- a/refact-agent/gui/src/components/ChatContent/ReasoningContent/ReasoningContent.tsx
+++ b/refact-agent/gui/src/components/ChatContent/ReasoningContent/ReasoningContent.tsx
@@ -15,7 +15,7 @@ export const ReasoningContent: React.FC = ({
onCopyClick,
}) => {
return (
-
+
Model Reasoning
diff --git a/refact-agent/gui/src/components/ChatContent/ResendButton.tsx b/refact-agent/gui/src/components/ChatContent/ResendButton.tsx
new file mode 100644
index 000000000..c0f1407ed
--- /dev/null
+++ b/refact-agent/gui/src/components/ChatContent/ResendButton.tsx
@@ -0,0 +1,64 @@
+import React from "react";
+import { IconButton, Tooltip } from "@radix-ui/themes";
+import { useAppSelector } from "../../hooks";
+import {
+ selectIsStreaming,
+ selectIsWaiting,
+ selectMessages,
+} from "../../features/Chat";
+import { useSendChatRequest } from "../../hooks/useSendChatRequest";
+
+function useResendMessages() {
+ const messages = useAppSelector(selectMessages);
+ const isStreaming = useAppSelector(selectIsStreaming);
+ const isWaiting = useAppSelector(selectIsWaiting);
+ const { retry } = useSendChatRequest();
+
+ const handleResend = React.useCallback(() => {
+ if (messages.length > 0) {
+ retry(messages);
+ }
+ }, [messages, retry]);
+
+ const shouldShow = React.useMemo(() => {
+ if (messages.length === 0) return false;
+ if (isStreaming) return false;
+ if (isWaiting) return false;
+ return true;
+ }, [messages.length, isStreaming, isWaiting]);
+
+ return { handleResend, shouldShow };
+}
+
+export const ResendButton = () => {
+ const { handleResend, shouldShow } = useResendMessages();
+
+ if (!shouldShow) return null;
+
+ return (
+
+
+
+
+
+ );
+};
+
+const ResendIcon: React.FC = () => {
+ return (
+
+ );
+};
diff --git a/refact-agent/gui/src/components/ChatContent/ToolsContent.tsx b/refact-agent/gui/src/components/ChatContent/ToolsContent.tsx
index 7454745b7..c68e66b19 100644
--- a/refact-agent/gui/src/components/ChatContent/ToolsContent.tsx
+++ b/refact-agent/gui/src/components/ChatContent/ToolsContent.tsx
@@ -37,26 +37,63 @@ import { selectFeatures } from "../../features/Config/configSlice";
import { isRawTextDocToolCall } from "../Tools/types";
import { TextDocTool } from "../Tools/Textdoc";
import { MarkdownCodeBlock } from "../Markdown/CodeBlock";
+import { Markdown } from "../Markdown";
import classNames from "classnames";
import resultStyle from "react-syntax-highlighter/dist/esm/styles/hljs/arta";
import { FadedButton } from "../Buttons";
import { AnimatedText } from "../Text";
+
type ResultProps = {
children: string;
isInsideScrollArea?: boolean;
onClose?: () => void;
};
+function looksLikeMarkdown(text: string): boolean {
+ // Strong signals to avoid false positives on logs/stack traces
+ if (text.includes("```")) return true; // fenced code blocks
+ if (/\[[^\]]+\]\([^)]+\)/.test(text)) return true; // [text](url)
+ if (/^#{1,6}\s+\S/m.test(text)) return true; // headings
+ if (/^\s*([-*+])\s+\S/m.test(text)) return true; // unordered lists
+ if (/^\s*\d+\.\s+\S/m.test(text)) return true; // ordered lists
+
+ // Table detection: header row + separator row
+ const hasTableHeader = /^\s*\|.+\|\s*$/m.test(text);
+ const hasTableSep = /^\s*\|[\s:|-]+\|\s*$/m.test(text);
+ if (hasTableHeader && hasTableSep) return true;
+
+ return false;
+}
+
+const MAX_MD_RENDER_CHARS = 50_000;
+
const Result: React.FC = ({ children, onClose }) => {
const lines = children.split("\n");
+
+ const shouldRenderMarkdown =
+ children.length <= MAX_MD_RENDER_CHARS && looksLikeMarkdown(children);
+
return (
-
- {children}
-
+ {shouldRenderMarkdown ? (
+
+
+ {children}
+
+
+ ) : (
+
+ {children}
+
+ )}
);
};
diff --git a/refact-agent/gui/src/components/ChatForm/AgentCapabilities/AgentCapabilities.tsx b/refact-agent/gui/src/components/ChatForm/AgentCapabilities/AgentCapabilities.tsx
index 0df668506..23e391a7e 100644
--- a/refact-agent/gui/src/components/ChatForm/AgentCapabilities/AgentCapabilities.tsx
+++ b/refact-agent/gui/src/components/ChatForm/AgentCapabilities/AgentCapabilities.tsx
@@ -15,6 +15,8 @@ import {
ApplyPatchSwitch,
FollowUpsSwitch,
TitleGenerationSwitch,
+ UseCompressionSwitch,
+ ProjectInfoSwitch,
} from "../ChatControls";
import { useAppSelector } from "../../../hooks";
import {
@@ -22,6 +24,9 @@ import {
selectAutomaticPatch,
selectCheckpointsEnabled,
selectIsTitleGenerationEnabled,
+ selectUseCompression,
+ selectIncludeProjectInfo,
+ selectMessages,
} from "../../../features/Chat";
import { Fragment, useMemo } from "react";
import { ToolGroups } from "./ToolGroups";
@@ -33,6 +38,10 @@ export const AgentCapabilities = () => {
const isTitleGenerationEnabled = useAppSelector(
selectIsTitleGenerationEnabled,
);
+ const useCompression = useAppSelector(selectUseCompression);
+ const includeProjectInfo = useAppSelector(selectIncludeProjectInfo);
+ const messages = useAppSelector(selectMessages);
+ const isNewChat = messages.length === 0;
const agenticFeatures = useMemo(() => {
return [
@@ -56,18 +65,34 @@ export const AgentCapabilities = () => {
enabled: isTitleGenerationEnabled,
switcher: ,
},
+ {
+ name: "Compression",
+ enabled: useCompression,
+ switcher: ,
+ },
+ {
+ name: "Project info",
+ enabled: includeProjectInfo ?? true,
+ switcher: ,
+ hide: !isNewChat,
+ },
];
}, [
isPatchAutomatic,
isAgentRollbackEnabled,
areFollowUpsEnabled,
isTitleGenerationEnabled,
+ useCompression,
+ includeProjectInfo,
+ isNewChat,
]);
const enabledAgenticFeatures = useMemo(
() =>
agenticFeatures
- .filter((feature) => feature.enabled)
+ .filter(
+ (feature) => feature.enabled && !("hide" in feature && feature.hide),
+ )
.map((feature) => feature.name)
.join(", ") || "None",
[agenticFeatures],
@@ -84,6 +109,7 @@ export const AgentCapabilities = () => {
{agenticFeatures.map((feature) => {
+ if ("hide" in feature && feature.hide) return null;
return {feature.switcher};
})}
diff --git a/refact-agent/gui/src/components/ChatForm/ChatControls.tsx b/refact-agent/gui/src/components/ChatForm/ChatControls.tsx
index fe0a1dcf0..aa3678144 100644
--- a/refact-agent/gui/src/components/ChatForm/ChatControls.tsx
+++ b/refact-agent/gui/src/components/ChatForm/ChatControls.tsx
@@ -9,7 +9,6 @@ import {
Switch,
Badge,
Button,
- DataList,
} from "@radix-ui/themes";
import { Select, type SelectProps } from "../Select";
import { type Config } from "../../features/Config/configSlice";
@@ -37,17 +36,21 @@ import {
selectIsWaiting,
selectMessages,
selectToolUse,
+ selectUseCompression,
+ selectIncludeProjectInfo,
setAreFollowUpsEnabled,
setIsTitleGenerationEnabled,
setAutomaticPatch,
setEnabledCheckpoints,
setToolUse,
+ setUseCompression,
+ setIncludeProjectInfo,
} from "../../features/Chat/Thread";
import { useAppSelector, useAppDispatch, useCapsForToolUse } from "../../hooks";
import { useAttachedFiles } from "./useCheckBoxes";
-import { toPascalCase } from "../../utils/toPascalCase";
-import { Coin } from "../../images";
import { push } from "../../features/Pages/pagesSlice";
+import { RichModelSelectItem } from "../Select/RichModelSelectItem";
+import { enrichAndGroupModels } from "../../utils/enrichModels";
export const ApplyPatchSwitch: React.FC = () => {
const dispatch = useAppDispatch();
@@ -301,6 +304,142 @@ export const TitleGenerationSwitch: React.FC = () => {
);
};
+export const UseCompressionSwitch: React.FC = () => {
+ const dispatch = useAppDispatch();
+ const useCompression = useAppSelector(selectUseCompression);
+
+ const handleUseCompressionChange = (checked: boolean) => {
+ dispatch(setUseCompression(checked));
+ };
+
+ return (
+
+
+ Use compression
+
+
+
+
+
+
+
+
+
+
+ When enabled, Refact Agent will compress the context to reduce
+ token usage for long conversations
+
+
+
+
+
+ Warning: may increase coins spending because it breaks the
+ cache
+
+
+
+
+
+
+
+
+ );
+};
+
+export const ProjectInfoSwitch: React.FC = () => {
+ const dispatch = useAppDispatch();
+ const chatId = useAppSelector(selectChatId);
+ const messages = useAppSelector(selectMessages);
+ const includeProjectInfo = useAppSelector(selectIncludeProjectInfo);
+
+ const handleIncludeProjectInfoChange = (checked: boolean) => {
+ dispatch(setIncludeProjectInfo({ chatId, value: checked }));
+ };
+
+ const isNewChat = messages.length === 0;
+
+ return (
+
+
+ Include project info
+
+
+
+
+
+
+
+
+
+
+ When enabled, extra project context information will be included
+ at the start of the chat to help the AI understand your codebase
+ better
+
+
+
+
+
+ Note: This can consume a significant amount of tokens
+ initially. Only available when starting a new chat.
+
+
+
+
+
+
+
+
+ );
+};
+
export const CapsSelect: React.FC<{ disabled?: boolean }> = ({ disabled }) => {
const refs = useTourRefs();
const caps = useCapsForToolUse();
@@ -322,45 +461,49 @@ export const CapsSelect: React.FC<{ disabled?: boolean }> = ({ disabled }) => {
);
const optionsWithToolTips: SelectProps["options"] = useMemo(() => {
- // Map existing models with tooltips
- const modelOptions = caps.usableModelsForPlan.map((option) => {
- if (!caps.data) return option;
- if (!caps.data.metadata) return option;
- if (!caps.data.metadata.pricing) return option;
- if (!option.value.startsWith("refact/")) return option;
- const key = option.value.replace("refact/", "");
- if (!(key in caps.data.metadata.pricing)) return option;
- const pricingForModel = caps.data.metadata.pricing[key];
- const tooltip = (
-
- Cost per Million Tokens
-
- {Object.entries(pricingForModel).map(([key, value]) => {
- return (
-
-
- {toPascalCase(key)}
-
-
-
- {value * 1_000}
-
-
-
- );
- })}
-
-
- );
- return {
- ...option,
- tooltip,
- // title,
- };
+ const groupedModels = enrichAndGroupModels(
+ caps.usableModelsForPlan,
+ caps.data,
+ );
+
+ if (groupedModels.length === 0) {
+ return [
+ ...caps.usableModelsForPlan,
+ { type: "separator" },
+ {
+ value: "add-new-model",
+ textValue: "Add new model",
+ },
+ ];
+ }
+
+ const flatOptions: SelectProps["options"] = [];
+ groupedModels.forEach((group, index) => {
+ if (index > 0) {
+ flatOptions.push({ type: "separator" });
+ }
+ group.models.forEach((model) => {
+ flatOptions.push({
+ value: model.value,
+ textValue: model.displayName,
+ disabled: model.disabled,
+ children: (
+
+ ),
+ });
+ });
});
return [
- ...modelOptions,
+ ...flatOptions,
{ type: "separator" },
{
value: "add-new-model",
diff --git a/refact-agent/gui/src/components/ChatForm/ChatForm.test.tsx b/refact-agent/gui/src/components/ChatForm/ChatForm.test.tsx
index b4bf01a45..698979e8c 100644
--- a/refact-agent/gui/src/components/ChatForm/ChatForm.test.tsx
+++ b/refact-agent/gui/src/components/ChatForm/ChatForm.test.tsx
@@ -102,7 +102,7 @@ describe("ChatForm", () => {
await user.keyboard("{Enter}");
const markdown = "```python\nprint(1)\n```\n";
const expected = `${markdown}\n@file foo.txt:3\nfoo\n`;
- expect(fakeOnSubmit).toHaveBeenCalledWith(expected);
+ expect(fakeOnSubmit).toHaveBeenCalledWith(expected, "after_flow");
});
test.each([
diff --git a/refact-agent/gui/src/components/ChatForm/ChatForm.tsx b/refact-agent/gui/src/components/ChatForm/ChatForm.tsx
index 9d492ded0..5b7b02f0a 100644
--- a/refact-agent/gui/src/components/ChatForm/ChatForm.tsx
+++ b/refact-agent/gui/src/components/ChatForm/ChatForm.tsx
@@ -4,10 +4,11 @@ import { Flex, Card, Text, IconButton } from "@radix-ui/themes";
import styles from "./ChatForm.module.css";
import {
- PaperPlaneButton,
BackToSideBarButton,
AgentIntegrationsButton,
ThinkingButton,
+ ContextCapButton,
+ SendButtonWithDropdown,
} from "../Buttons";
import { TextArea } from "../TextArea";
import { Form } from "./Form";
@@ -55,6 +56,7 @@ import {
selectIsWaiting,
selectLastSentCompression,
selectMessages,
+ selectQueuedMessages,
selectThreadToolUse,
selectToolUse,
} from "../../features/Chat";
@@ -65,8 +67,10 @@ import { TokensPreview } from "./TokensPreview";
import classNames from "classnames";
import { ArchiveIcon } from "@radix-ui/react-icons";
+export type SendPolicy = "immediate" | "after_flow";
+
export type ChatFormProps = {
- onSubmit: (str: string) => void;
+ onSubmit: (str: string, sendPolicy?: SendPolicy) => void;
onClose?: () => void;
className?: string;
unCalledTools: boolean;
@@ -96,6 +100,7 @@ export const ChatForm: React.FC = ({
const threadToolUse = useAppSelector(selectThreadToolUse);
const messages = useAppSelector(selectMessages);
const lastSentCompression = useAppSelector(selectLastSentCompression);
+ const queuedMessages = useAppSelector(selectQueuedMessages);
const { compressChat, compressChatRequest, isCompressing } =
useCompressChat();
const autoFocus = useAutoFocusOnce();
@@ -182,33 +187,44 @@ export const ChatForm: React.FC = ({
const refs = useTourRefs();
- const handleSubmit = useCallback(() => {
- const trimmedValue = value.trim();
- if (!disableSend && trimmedValue.length > 0) {
- const valueWithFiles = attachedFiles.addFilesToInput(trimmedValue);
- const valueIncludingChecks = addCheckboxValuesToInput(
- valueWithFiles,
- checkboxes,
- );
- // TODO: add @files
- setLineSelectionInteracted(false);
- onSubmit(valueIncludingChecks);
- setValue(() => "");
- unCheckAll();
- attachedFiles.removeAll();
- }
- }, [
- value,
- disableSend,
- attachedFiles,
- checkboxes,
- setLineSelectionInteracted,
- onSubmit,
- setValue,
- unCheckAll,
- ]);
+ const handleSubmit = useCallback(
+ (sendPolicy: SendPolicy = "after_flow") => {
+ const trimmedValue = value.trim();
+ // Both options queue during streaming, so both should be allowed
+ const canSubmit = trimmedValue.length > 0 && isOnline && !allDisabled;
+
+ if (canSubmit) {
+ const valueWithFiles = attachedFiles.addFilesToInput(trimmedValue);
+ const valueIncludingChecks = addCheckboxValuesToInput(
+ valueWithFiles,
+ checkboxes,
+ );
+ // TODO: add @files
+ setLineSelectionInteracted(false);
+ onSubmit(valueIncludingChecks, sendPolicy);
+ setValue(() => "");
+ unCheckAll();
+ attachedFiles.removeAll();
+ }
+ },
+ [
+ value,
+ allDisabled,
+ isOnline,
+ attachedFiles,
+ checkboxes,
+ setLineSelectionInteracted,
+ onSubmit,
+ setValue,
+ unCheckAll,
+ ],
+ );
+
+ const handleSendImmediately = useCallback(() => {
+ handleSubmit("immediate");
+ }, [handleSubmit]);
- const handleEnter = useOnPressedEnter(handleSubmit);
+ const handleEnter = useOnPressedEnter(() => handleSubmit("after_flow"));
const handleHelpInfo = useCallback((info: React.ReactNode | null) => {
setHelpInfo(info);
@@ -282,9 +298,21 @@ export const ChatForm: React.FC = ({
if (globalError) {
return (
-
- {globalError}
-
+
+
+ {globalError}
+
+
+ );
+ }
+
+ if (chatError) {
+ return (
+
+
+ {chatError}
+
+
);
}
@@ -338,7 +366,7 @@ export const ChatForm: React.FC = ({
diff --git a/refact-agent/gui/src/components/Sidebar/GroupTree/GroupTree.tsx b/refact-agent/gui/src/components/Sidebar/GroupTree/GroupTree.tsx
index ed82a2860..604f38289 100644
--- a/refact-agent/gui/src/components/Sidebar/GroupTree/GroupTree.tsx
+++ b/refact-agent/gui/src/components/Sidebar/GroupTree/GroupTree.tsx
@@ -1,20 +1,13 @@
-import {
- Button,
- Card,
- Flex,
- Heading,
- Link,
- Select,
- Text,
-} from "@radix-ui/themes";
+import { Flex, Heading, Select, Separator, Text } from "@radix-ui/themes";
import React from "react";
import { Tree } from "react-arborist";
-
import { CustomTreeNode } from "./CustomTreeNode";
-import { ScrollArea } from "../../ScrollArea";
-import { useGroupTree } from "./useGroupTree";
import styles from "./GroupTree.module.css";
+import { ConfirmGroupSelection } from "./ConfirmGroupSelection";
+import { useGroupTree } from "./useGroupTree";
+import { ScrollArea } from "../../ScrollArea";
+import { AnimatePresence } from "framer-motion";
export interface FlexusTreeNode {
treenodePath: string;
@@ -34,47 +27,41 @@ export const GroupTree: React.FC = () => {
currentTeamsWorkspace,
filteredGroupTreeData,
onGroupSelect,
- handleSkipWorkspaceSelection,
+ onGroupSelectionConfirm,
+ setCurrentSelectedTeamsGroupNode,
setGroupTreeData,
- onWorkspaceSelectChange,
- handleConfirmSelectionClick,
- handleCreateWorkspaceClick,
- createFolderChecked,
- setCreateFolderChecked,
+ onWorkspaceSelection,
availableWorkspaces,
treeHeight,
+ hasError,
} = useGroupTree();
+ if (hasError) {
+ return null;
+ }
+
return (
-
- Welcome to Refact.ai
+
+ Refact Teams Wizard
+
+
+
+ Account selection
- Refact.ai Agent autonomously completes your dev tasks end to end β and
- gathers both individual and team experience into an evolving knowledge
- base.
+ Refact is even better connected to the cloud, you can share knowledge
+ database within your team.
-
- Select your Workspace
-
-
- Use your personal Workspace or ask admin for access to your
- team's shared one
+
+ Choose your team's account, or your personal account:
-
+
{availableWorkspaces.map((workspace) => (
@@ -84,85 +71,70 @@ export const GroupTree: React.FC = () => {
{availableWorkspaces.length === 0 && (
-
-
- Create a new one
- {" "}
- or contact your admin to access a team Workspace.
+
+ No accounts are currently associated with your team. Please contact
+ your Team Workspace administrator to request access. For further
+ assistance, please refer to the support or bug reporting channels.
)}
{currentTeamsWorkspace && filteredGroupTreeData.length > 0 && (
-
-
+
+
+ Group selection
+
+
+ If you have a lot of projects, you can organize them into groups:
+
+
+
-
-
- Select a Group
-
-
- If you have several projects, organize them into groups
-
-
-
-
- {(nodeProps) => (
-
- )}
-
-
-
-
+ {(nodeProps) => (
+
+ )}
+
+
+
+ {currentSelectedTeamsGroupNode !== null && (
+
+ )}
+
+
)}
-
-
-
-
);
};
diff --git a/refact-agent/gui/src/components/Sidebar/GroupTree/NavTreeWantWorkspaces.graphql b/refact-agent/gui/src/components/Sidebar/GroupTree/NavTreeWantWorkspaces.graphql
index ec55fc6ec..506182c24 100644
--- a/refact-agent/gui/src/components/Sidebar/GroupTree/NavTreeWantWorkspaces.graphql
+++ b/refact-agent/gui/src/components/Sidebar/GroupTree/NavTreeWantWorkspaces.graphql
@@ -1,15 +1,11 @@
query NavTreeWantWorkspaces {
query_basic_stuff {
fuser_id
- my_own_ws_id
workspaces {
ws_id
ws_owner_fuser_id
ws_root_group_id
root_group_name
- have_coins_exactly
- have_coins_enough
- have_admin
}
}
}
diff --git a/refact-agent/gui/src/components/Sidebar/GroupTree/useGroupTree.ts b/refact-agent/gui/src/components/Sidebar/GroupTree/useGroupTree.ts
index 56584b4a4..e12a0b363 100644
--- a/refact-agent/gui/src/components/Sidebar/GroupTree/useGroupTree.ts
+++ b/refact-agent/gui/src/components/Sidebar/GroupTree/useGroupTree.ts
@@ -1,22 +1,13 @@
-import React, {
- useCallback,
- useEffect,
- useMemo,
- useRef,
- useState,
-} from "react";
+import { useCallback, useEffect, useMemo, useRef, useState } from "react";
import { FlexusTreeNode } from "./GroupTree";
import {
- CreateGroupDocument,
- CreateGroupMutation,
- CreateGroupMutationVariables,
NavTreeSubsDocument,
NavTreeSubsSubscription,
NavTreeWantWorkspacesDocument,
NavTreeWantWorkspacesQuery,
NavTreeWantWorkspacesQueryVariables,
} from "../../../../generated/documents";
-import { useMutation, useQuery } from "urql";
+import { useQuery } from "urql";
import {
cleanupInsertedLater,
markForDelete,
@@ -26,35 +17,21 @@ import {
import { useSmartSubscription } from "../../../hooks/useSmartSubscription";
import {
useAppDispatch,
- useAppSelector,
useEventsBusForIDE,
- useOpenUrl,
useResizeObserver,
} from "../../../hooks";
import { isDetailMessage, teamsApi } from "../../../services/refact";
import { NodeApi } from "react-arborist";
-import {
- resetActiveGroup,
- resetActiveWorkspace,
- selectActiveWorkspace,
- setActiveGroup,
- setActiveWorkspace,
- setSkippedWorkspaceSelection,
-} from "../../../features/Teams";
+import { resetActiveGroup, setActiveGroup } from "../../../features/Teams";
import { setError } from "../../../features/Errors/errorsSlice";
-import { selectConfig } from "../../../features/Config/configSlice";
+
+export type TeamsWorkspace =
+ NavTreeWantWorkspacesQuery["query_basic_stuff"]["workspaces"][number];
export function useGroupTree() {
const [groupTreeData, setGroupTreeData] = useState([]);
- const [createFolderChecked, setCreateFolderChecked] = useState(false);
-
- const currentTeamsWorkspace = useAppSelector(selectActiveWorkspace);
- const openUrl = useOpenUrl();
-
- const [_, createGroup] = useMutation<
- CreateGroupMutation,
- CreateGroupMutationVariables
- >(CreateGroupDocument);
+ const [currentTeamsWorkspace, setCurrentTeamsWorkspace] =
+ useState(null);
const [teamsWorkspaces] = useQuery<
NavTreeWantWorkspacesQuery,
@@ -138,8 +115,7 @@ export function useGroupTree() {
});
const dispatch = useAppDispatch();
- const { setActiveTeamsGroupInIDE, setActiveTeamsWorkspaceInIDE } =
- useEventsBusForIDE();
+ const { setActiveTeamsGroupInIDE } = useEventsBusForIDE();
const [setActiveGroupIdTrigger] = teamsApi.useSetActiveGroupIdMutation();
const [currentSelectedTeamsGroupNode, setCurrentSelectedTeamsGroupNode] =
@@ -172,123 +148,51 @@ export function useGroupTree() {
}, []);
const onGroupSelectionConfirm = useCallback(
- async (group: FlexusTreeNode) => {
+ (group: FlexusTreeNode) => {
const newGroup = {
id: group.treenodeId,
name: group.treenodeTitle,
};
setActiveTeamsGroupInIDE(newGroup);
- try {
- const result = await setActiveGroupIdTrigger({
- group_id: group.treenodeId,
- });
- if (result.data) {
- dispatch(setActiveGroup(newGroup));
- return;
- } else {
- // TODO: rework error handling
- let errorMessage: string;
- if ("data" in result.error && isDetailMessage(result.error.data)) {
- errorMessage = result.error.data.detail;
+ void setActiveGroupIdTrigger({
+ group_id: group.treenodeId,
+ })
+ .then((result) => {
+ if (result.data) {
+ dispatch(setActiveGroup(newGroup));
+ return;
} else {
- errorMessage =
- "Error: Something went wrong while selecting a group. Try again.";
+ // TODO: rework error handling
+ let errorMessage: string;
+ if ("data" in result.error && isDetailMessage(result.error.data)) {
+ errorMessage = result.error.data.detail;
+ } else {
+ errorMessage =
+ "Error: Something went wrong while selecting a group. Try again.";
+ }
+ dispatch(setError(errorMessage));
}
- dispatch(setError(errorMessage));
- }
- } catch {
- dispatch(resetActiveGroup());
- }
+ })
+ .catch(() => {
+ dispatch(resetActiveGroup());
+ });
},
[dispatch, setActiveGroupIdTrigger, setActiveTeamsGroupInIDE],
);
- const onWorkspaceSelectChange = useCallback(
- (value: string) => {
- const maybeWorkspace =
+ const onWorkspaceSelection = useCallback(
+ (workspaceId: string) => {
+ setCurrentTeamsWorkspace(
teamsWorkspaces.data?.query_basic_stuff.workspaces.find(
- (w) => w.ws_id === value,
- );
- if (maybeWorkspace) {
- setActiveTeamsWorkspaceInIDE(maybeWorkspace);
- dispatch(setActiveWorkspace(maybeWorkspace));
- setCurrentSelectedTeamsGroupNode(null);
- }
- },
- [
- dispatch,
- setActiveTeamsWorkspaceInIDE,
- teamsWorkspaces.data?.query_basic_stuff.workspaces,
- ],
- );
-
- const handleCreateWorkspaceClick = useCallback(
- (event: React.MouseEvent) => {
- event.preventDefault();
- event.stopPropagation();
- openUrl("http://app.refact.ai/profile?action=create-workspace");
+ (w) => w.ws_id === workspaceId,
+ ) ?? null,
+ );
+ setCurrentSelectedTeamsGroupNode(null);
},
- [openUrl],
+ [teamsWorkspaces.data?.query_basic_stuff.workspaces],
);
- const currentWorkspaceName =
- useAppSelector(selectConfig).currentWorkspaceName ?? "New Project";
-
- const isMatchingGroupNameWithWorkspace = useMemo(() => {
- return (
- currentSelectedTeamsGroupNode?.treenodeTitle === currentWorkspaceName
- );
- }, [currentSelectedTeamsGroupNode?.treenodeTitle, currentWorkspaceName]);
-
- const handleConfirmSelectionClick = useCallback(async () => {
- if (!currentSelectedTeamsGroupNode) return;
- if (createFolderChecked && !isMatchingGroupNameWithWorkspace) {
- const result = await createGroup({
- fgroup_name: currentWorkspaceName,
- fgroup_parent_id: currentSelectedTeamsGroupNode.treenodeId,
- });
-
- if (result.error) {
- dispatch(setError(result.error.message));
- return;
- }
-
- const newGroup = result.data?.group_create;
- if (newGroup) {
- const newNode: FlexusTreeNode = {
- treenodeId: newGroup.fgroup_id,
- treenodeTitle: newGroup.fgroup_name,
- treenodeType: "group",
- treenodePath: `${currentSelectedTeamsGroupNode.treenodePath}/group:${newGroup.fgroup_id}`,
- treenode__DeleteMe: false,
- treenode__InsertedLater: false,
- treenodeChildren: [],
- treenodeExpanded: false,
- };
- setCurrentSelectedTeamsGroupNode(newNode);
- void onGroupSelectionConfirm(newNode);
- }
- } else {
- void onGroupSelectionConfirm(currentSelectedTeamsGroupNode);
- setCurrentSelectedTeamsGroupNode(null);
- }
- }, [
- dispatch,
- createGroup,
- currentSelectedTeamsGroupNode,
- setCurrentSelectedTeamsGroupNode,
- onGroupSelectionConfirm,
- currentWorkspaceName,
- createFolderChecked,
- isMatchingGroupNameWithWorkspace,
- ]);
-
- const handleSkipWorkspaceSelection = useCallback(() => {
- dispatch(setSkippedWorkspaceSelection(true));
- dispatch(resetActiveWorkspace());
- }, [dispatch]);
-
const availableWorkspaces = useMemo(() => {
if (teamsWorkspaces.data?.query_basic_stuff.workspaces) {
return teamsWorkspaces.data.query_basic_stuff.workspaces;
@@ -296,12 +200,8 @@ export function useGroupTree() {
return [];
}, [teamsWorkspaces.data?.query_basic_stuff.workspaces]);
- useEffect(() => {
- if (availableWorkspaces.length === 1) {
- dispatch(setActiveWorkspace(availableWorkspaces[0]));
- setActiveTeamsWorkspaceInIDE(availableWorkspaces[0]);
- }
- }, [dispatch, setActiveTeamsWorkspaceInIDE, availableWorkspaces]);
+ const hasError = teamsWorkspaces.error !== undefined;
+ const isLoading = teamsWorkspaces.fetching;
return {
// Refs
@@ -314,20 +214,19 @@ export function useGroupTree() {
// Current states
currentTeamsWorkspace,
currentSelectedTeamsGroupNode,
- createFolderChecked,
// Dimensions
treeHeight,
// Actions
onGroupSelect,
onGroupSelectionConfirm,
- onWorkspaceSelectChange,
+ onWorkspaceSelection,
touchNode,
- handleSkipWorkspaceSelection,
- handleConfirmSelectionClick,
- handleCreateWorkspaceClick,
// Setters
+ setCurrentTeamsWorkspace,
setGroupTreeData,
setCurrentSelectedTeamsGroupNode,
- setCreateFolderChecked,
+ // Status
+ hasError,
+ isLoading,
};
}
diff --git a/refact-agent/gui/src/components/Sidebar/Sidebar.tsx b/refact-agent/gui/src/components/Sidebar/Sidebar.tsx
index a7f25f5b0..94c9bcf49 100644
--- a/refact-agent/gui/src/components/Sidebar/Sidebar.tsx
+++ b/refact-agent/gui/src/components/Sidebar/Sidebar.tsx
@@ -9,13 +9,12 @@ import {
import { push } from "../../features/Pages/pagesSlice";
import { restoreChat } from "../../features/Chat/Thread";
import { FeatureMenu } from "../../features/Config/FeatureMenu";
-import { GroupTree } from "./GroupTree/";
+
import { ErrorCallout } from "../Callout";
import { getErrorMessage, clearError } from "../../features/Errors/errorsSlice";
import classNames from "classnames";
import { selectHost } from "../../features/Config/configSlice";
import styles from "./Sidebar.module.css";
-import { useActiveTeamsGroup } from "../../hooks/useActiveTeamsGroup";
export type SidebarProps = {
takingNotes: boolean;
@@ -40,8 +39,6 @@ export const Sidebar: React.FC = ({ takingNotes, style }) => {
devModeChecks: { stabilityCheck: "never" },
});
- const { groupSelectionEnabled } = useActiveTeamsGroup();
-
const onDeleteHistoryItem = useCallback(
(id: string) => dispatch(deleteChatById(id)),
[dispatch],
@@ -64,15 +61,11 @@ export const Sidebar: React.FC = ({ takingNotes, style }) => {
- {!groupSelectionEnabled ? (
-
- ) : (
-
- )}
+
{/* TODO: duplicated */}
{globalError && (
= ({
handleNavigation,
}: DropdownProps) => {
- const [isOpen, setIsOpen] = useState(false);
-
const refs = useTourRefs();
const user = useGetUser();
const host = useAppSelector(selectHost);
+ const activeGroup = useAppSelector(selectActiveGroup);
const dispatch = useAppDispatch();
// TODO: check how much of this is still used.
// const { maxAgentUsageAmount, currentAgentUsage } = useAgentUsage();
-
- const isWorkspaceSelectionSkipped = useAppSelector(
- selectIsSkippedWorkspaceSelection,
- );
- const activeWorkspace = useAppSelector(selectActiveWorkspace);
- const activeGroup = useAppSelector(selectActiveGroup);
-
- const coinBalance = useMemo(() => {
- const maybeWorkspaceWithCoins = user.data?.workspaces.find(
- (w) => w.ws_id === activeWorkspace?.ws_id,
- );
- if (!maybeWorkspaceWithCoins) return null;
- if (!maybeWorkspaceWithCoins.have_admin) return null;
- if (maybeWorkspaceWithCoins.have_coins_exactly === 0) return null;
- return Math.round(maybeWorkspaceWithCoins.have_coins_exactly / 1000);
- }, [user.data, activeWorkspace?.ws_id]);
-
- const isActiveRootGroup = useMemo(() => {
- if (!activeWorkspace || !activeGroup) return false;
- return activeWorkspace.root_group_name === activeGroup.name;
- }, [activeWorkspace, activeGroup]);
-
+ const coinBalance = useCoinBallance();
const logout = useLogout();
- // const { startPollingForUser } = useStartPollingForUser();
+ const { startPollingForUser } = useStartPollingForUser();
- // const { } = useActiveTeamsGroup();
+ const { isKnowledgeFeatureAvailable } = useActiveTeamsGroup();
const bugUrl = linkForBugReports(host);
const discordUrl = "https://www.smallcloud.ai/discord";
@@ -126,46 +96,22 @@ export const Dropdown: React.FC = ({
openPrivacyFile,
setLoginMessage,
clearActiveTeamsGroupInIDE,
- clearActiveTeamsWorkspaceInIDE,
} = useEventsBusForIDE();
- useEffect(() => {
- if (
- user.data &&
- !user.data.workspaces.some((w) => w.ws_id === activeWorkspace?.ws_id)
- ) {
- // current workspace is no longer in list of cloud ones, resetting state
- clearActiveTeamsGroupInIDE();
- clearActiveTeamsWorkspaceInIDE();
- const actions = [resetActiveGroup(), resetActiveWorkspace()];
- actions.forEach((action) => dispatch(action));
- }
- }, [
- dispatch,
- clearActiveTeamsGroupInIDE,
- clearActiveTeamsWorkspaceInIDE,
- activeWorkspace,
- user.data,
- ]);
-
const handleChatHistoryCleanUp = () => {
dispatch(clearHistory());
};
const handleActiveGroupCleanUp = () => {
clearActiveTeamsGroupInIDE();
- const actions = [
- resetActiveGroup(),
- resetActiveWorkspace(),
- popBackTo({ name: "history" }),
- ];
+ const actions = [resetActiveGroup(), popBackTo({ name: "history" })];
actions.forEach((action) => dispatch(action));
};
- // const handleProUpgradeClick = useCallback(() => {
- // startPollingForUser();
- // openUrl("https://refact.smallcloud.ai/pro");
- // }, [openUrl, startPollingForUser]);
+ const handleProUpgradeClick = useCallback(() => {
+ startPollingForUser();
+ openUrl("https://refact.smallcloud.ai/pro");
+ }, [openUrl, startPollingForUser]);
useEffect(() => {
if (isUserWithLoginMessage(user.data)) {
@@ -179,14 +125,14 @@ export const Dropdown: React.FC = ({
}, [host]);
return (
-
+
refs.setMore(x)}>
-
+
{user.data && (
{
@@ -194,11 +140,11 @@ export const Dropdown: React.FC = ({
openUrl(accountLink);
}}
>
- {user.data.fuser_id}
+ {user.data.account}
)}
- {user.data && activeWorkspace && coinBalance && (
+ {user.data && (
{/**TODO: there could be multiple source for this */}
@@ -210,8 +156,7 @@ export const Dropdown: React.FC = ({
- Current coins balance on '
- {activeWorkspace.root_group_name}' workspace
+ Current balance
@@ -219,65 +164,65 @@ export const Dropdown: React.FC = ({
)}
-
- {/* {user.data && (
+ {user.data && (
Active plan: {user.data.inference}
- )} */}
-
- {(activeWorkspace ?? activeGroup) && }
- {activeWorkspace && (
-
-
-
- Active Workspace:{" "}
- {activeWorkspace.root_group_name}
-
-
-
-
-
-
-
-
- Selected Workspace in Refact Cloud
-
-
-
-
-
-
)}
- {activeGroup && activeWorkspace && (
-
-
-
- Active Group:{" "}
-
- {activeGroup.name}
-
-
-
-
-
-
-
-
-
- Current selected group for knowledge
-
-
-
-
+ {/* {user.data && user.data.workspaces.length > 0 && (
+
+
+
+
+ Active workspace:
+
+
+
+
+
+
+
+
+ Selected workspace in Team Server
+
+
+
+
+
+ {
+ const workspace = user.data?.workspaces.find(
+ (w) => w.workspace_name === value,
+ );
+ if (workspace) {
+ handleSetActiveGroup(workspace);
+ }
+ }}
+ >
+
+
+ {user.data.workspaces.map((w) => (
+
+ {w.workspace_name}
+
+ ))}
+
+
- )}
+ )} */}
- {/* TODO: uncomment when plans are retrievable from flexus */}
- {/* {user.data && user.data.inference === "FREE" && (
+ {user.data && user.data.inference === "FREE" && (
- )} */}
+ )}